#include "c6x.h"

int my_sger_(int *m, int *n, float *alpha, float * restrict x,
			 int *incx, float * restrict y, int *incy, float * restrict a, int *lda)
{
	/* System generated locals */
	int n_, m_;

	/* Local variables */
	int i, j, jy;

	__x128_t alpha_v, yscaled_v, temp_vp, y_v, a_v, x_v;
	__float2_t temp_a_lower, temp_a_upper;

	float * ptr_a;
	float * ptr_x;

	float value_y;
	float value_alpha = *alpha;

	jy = 0;

	n_ = *n;
	m_ = *m;

	ptr_a = &a[0];

	alpha_v = _fto128( value_alpha, value_alpha, value_alpha, value_alpha );

	for (j = 0; j < n_; j++) {

		value_y   = y[jy++];
		y_v       = _fto128( value_y, value_y, value_y, value_y );
		yscaled_v = _qmpysp( alpha_v, y_v );

		ptr_x = &x[0];

		for (i = 0; i < m_; i += 4) {  // Vectorized (i__ += 4)

			// Load elements of a
			a_v    = _dto128( _memd8_const( (void*) ptr_a ),
					          _memd8_const( (void*) (ptr_a + 2)) );


			// Load elements of x
			x_v    = _dto128( _memd8_const((void*) ptr_x),
					          _memd8_const((void*) (ptr_x + 2) ) );

			// Multiply by yscaled and accumulate
			temp_vp = _qmpysp( x_v, yscaled_v );

			temp_a_upper = _daddsp( _hif2_128( temp_vp ), _hif2_128( a_v ) );
			temp_a_lower = _daddsp( _lof2_128( temp_vp ), _lof2_128( a_v ) );

			*ptr_a     = _lof2( temp_a_upper );
			*(ptr_a+1) = _hif2( temp_a_upper );
			*(ptr_a+2) = _lof2( temp_a_lower );
			*(ptr_a+3) = _hif2( temp_a_lower );

			ptr_a += 4;
			ptr_x += 4;

		}
	}

	return 0;

}
