float32x2_t test_vset_lane_f32(float32_t a, float32x2_t b) { // CHECK-LABEL: test_vset_lane_f32: // CHECK-NEXT: ins.s v1[1], v0[0] // CHECK-NEXT: mov.16b v0, v1 // CHECK-NEXT: ret return vset_lane_f32(a, b, 1); }
void test_vset_lanef32 (void) { float32x2_t out_float32x2_t; float32_t arg0_float32_t; float32x2_t arg1_float32x2_t; out_float32x2_t = vset_lane_f32 (arg0_float32_t, arg1_float32x2_t, 1); }
float32x2_t test_vset_lane_f32(float32_t v1, float32x2_t v2) { // CHECK: test_vset_lane_f32 return vset_lane_f32(v1, v2, 1); // CHECK: ins {{v[0-9]+}}.s[1], {{v[0-9]+}}.s[0] }
// CHECK-LABEL: define <2 x float> @test_vset_lane_f32(float %a, <2 x float> %b) #0 { // CHECK: [[TMP0:%.*]] = bitcast <2 x float> %b to <8 x i8> // CHECK: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x float> // CHECK: [[VSET_LANE:%.*]] = insertelement <2 x float> [[TMP1]], float %a, i32 1 // CHECK: ret <2 x float> [[VSET_LANE]] float32x2_t test_vset_lane_f32(float32_t a, float32x2_t b) { return vset_lane_f32(a, b, 1); }
/** * @brief vector_mul_matrix. * * @param src1[in] the input vector(1*k) * src2[in] the input matrix(k*n) * dst[out] the output vector(1*n) * kn[in] DIM_K & DIM_N * * @return void */ void neon_vectormulmatrix_float(float * dst, const float * src1, const float * src2, int *kn) { int j ,l; int k = kn[0]; int n = kn[1]; const float * src1_p = src1; const float * src2_p = src2; float * dst_p = dst; for (j = 0; j <= n - 4; j += 4) { float32x2_t d16 = {0}; float32x2_t d17 = {0}; float32x2_t d18 = {0}; float32x2_t d19 = {0}; float32x2_t d20; float32x2_t d21; float32x4_t q0; src1_p = src1; src2_p = src2 + j * k; for (l = 0; l <= k - 4; l += 4) { // Matrix A float32x4_t q8 = vld1q_f32(src1_p); float32x2_t d0 = vget_low_f32(q8); float32x2_t d1 = vget_high_f32(q8); // Matrix B float32x4_t q12 = vld1q_f32(src2_p); float32x4_t q13 = vld1q_f32(src2_p + k); float32x4_t q14 = vld1q_f32(src2_p + k * 2); float32x4_t q15 = vld1q_f32(src2_p + k * 3); float32x2_t d8 = vget_low_f32(q12); float32x2_t d9 = vget_high_f32(q12); float32x2_t d10 = vget_low_f32(q13); float32x2_t d11 = vget_high_f32(q13); float32x2_t d12 = vget_low_f32(q14); float32x2_t d13 = vget_high_f32(q14); float32x2_t d14 = vget_low_f32(q15); float32x2_t d15 = vget_high_f32(q15); d16 = vmla_f32(d16, d0, d8); d17 = vmla_f32(d17, d0, d10); d18 = vmla_f32(d18, d0, d12); d19 = vmla_f32(d19, d0, d14); d16 = vmla_f32(d16, d1, d9); d17 = vmla_f32(d17, d1, d11); d18 = vmla_f32(d18, d1, d13); d19 = vmla_f32(d19, d1, d15); src1_p += 4; src2_p += 4; }// end for l d16 = vpadd_f32(d16, d17); d18 = vpadd_f32(d18, d19); float sum0 = 0, sum1 = 0, sum2 = 0, sum3 = 0; for(; l < k; l ++) { float src1_d; src1_d = *src1_p; sum0 += src1_d * *src2_p; sum1 += src1_d * *(src2_p + k); sum2 += src1_d * *(src2_p + 2 * k); sum3 += src1_d * *(src2_p + 3 * k); src1_p++; src2_p++; } d20 = vset_lane_f32(sum0, d20, 0); d20 = vset_lane_f32(sum1, d20, 1); d21 = vset_lane_f32(sum2, d21, 0); d21 = vset_lane_f32(sum3, d21, 1); q0 = vaddq_f32(vcombine_f32(d16, d18), vcombine_f32(d20, d21)); vst1q_f32(dst_p, q0); dst_p += 4; }// end for j }