mirror of https://github.com/alibaba/MNN.git
[MNN:Bugfix] Fix compile bug for gnu of arm82 /bf16
This commit is contained in:
parent
d983b77ef2
commit
0bcc70922d
|
|
@ -122,163 +122,163 @@ struct Vec<FLOAT16, 8> {
|
|||
VecType& vec10, VecType& vec11) {
|
||||
|
||||
#ifdef __aarch64__
|
||||
auto tmp1 = vzipq_s16(vec0.value, vec1.value); // tmp1 would disappear after compile
|
||||
auto tmp1 = vzipq_s16(reinterpret_cast<int16x8_t>(vec0.value), reinterpret_cast<int16x8_t>(vec1.value)); // tmp1 would disappear after compile
|
||||
auto v21 = tmp1.val[0];
|
||||
auto v22 = tmp1.val[1];
|
||||
auto tmp2 = vzipq_s16(vec2.value, vec3.value);
|
||||
auto tmp2 = vzipq_s16(reinterpret_cast<int16x8_t>(vec2.value), reinterpret_cast<int16x8_t>(vec3.value));
|
||||
auto v24 = tmp2.val[0];
|
||||
auto v25 = tmp2.val[1];
|
||||
auto tmp3 = vzipq_s16(vec4.value, vec5.value);
|
||||
auto tmp3 = vzipq_s16(reinterpret_cast<int16x8_t>(vec4.value), reinterpret_cast<int16x8_t>(vec5.value));
|
||||
auto v27 = tmp3.val[0];
|
||||
auto v28 = tmp3.val[1];
|
||||
auto tmp4 = vzipq_s16(vec6.value, vec7.value);
|
||||
auto tmp4 = vzipq_s16(reinterpret_cast<int16x8_t>(vec6.value), reinterpret_cast<int16x8_t>(vec7.value));
|
||||
auto v30 = tmp4.val[0];
|
||||
auto v31 = tmp4.val[1];
|
||||
|
||||
auto tmp5 = vzipq_s32(v21, v24);
|
||||
vec0.value = tmp5.val[0];
|
||||
vec1.value = tmp5.val[1];
|
||||
auto tmp6 = vzipq_s32(v22, v25);
|
||||
vec2.value = tmp6.val[0];
|
||||
vec3.value = tmp6.val[1];
|
||||
auto tmp7 = vzipq_s32(v27, v30);
|
||||
vec4.value = tmp7.val[0];
|
||||
vec5.value = tmp7.val[1];
|
||||
auto tmp8 = vzipq_s32(v28, v31);
|
||||
vec6.value = tmp8.val[0];
|
||||
vec7.value = tmp8.val[1];
|
||||
auto v20 = vtrn1q_s64(vec0.value, vec4.value);
|
||||
auto v12 = vtrn2q_s64(vec0.value, vec4.value);
|
||||
auto v23 = vtrn1q_s64(vec1.value, vec5.value);
|
||||
auto v13 = vtrn2q_s64(vec1.value, vec5.value);
|
||||
auto v26 = vtrn1q_s64(vec2.value, vec6.value);
|
||||
auto v14 = vtrn2q_s64(vec2.value, vec6.value);
|
||||
auto v29 = vtrn1q_s64(vec3.value, vec7.value);
|
||||
auto v15 = vtrn2q_s64(vec3.value, vec7.value);
|
||||
auto tmp5 = vzipq_s32(reinterpret_cast<int32x4_t>(v21), reinterpret_cast<int32x4_t>(v24));
|
||||
vec0.value = reinterpret_cast<float16x8_t>(tmp5.val[0]);
|
||||
vec1.value = reinterpret_cast<float16x8_t>(tmp5.val[1]);
|
||||
auto tmp6 = vzipq_s32(reinterpret_cast<int32x4_t>(v22), reinterpret_cast<int32x4_t>(v25));
|
||||
vec2.value = reinterpret_cast<float16x8_t>(tmp6.val[0]);
|
||||
vec3.value = reinterpret_cast<float16x8_t>(tmp6.val[1]);
|
||||
auto tmp7 = vzipq_s32(reinterpret_cast<int32x4_t>(v27), reinterpret_cast<int32x4_t>(v30));
|
||||
vec4.value = reinterpret_cast<float16x8_t>(tmp7.val[0]);
|
||||
vec5.value = reinterpret_cast<float16x8_t>(tmp7.val[1]);
|
||||
auto tmp8 = vzipq_s32(reinterpret_cast<int32x4_t>(v28), reinterpret_cast<int32x4_t>(v31));
|
||||
vec6.value = reinterpret_cast<float16x8_t>(tmp8.val[0]);
|
||||
vec7.value = reinterpret_cast<float16x8_t>(tmp8.val[1]);
|
||||
auto v20 = vtrn1q_s64(reinterpret_cast<int64x2_t>(vec0.value), reinterpret_cast<int64x2_t>(vec4.value));
|
||||
auto v12 = vtrn2q_s64(reinterpret_cast<int64x2_t>(vec0.value), reinterpret_cast<int64x2_t>(vec4.value));
|
||||
auto v23 = vtrn1q_s64(reinterpret_cast<int64x2_t>(vec1.value), reinterpret_cast<int64x2_t>(vec5.value));
|
||||
auto v13 = vtrn2q_s64(reinterpret_cast<int64x2_t>(vec1.value), reinterpret_cast<int64x2_t>(vec5.value));
|
||||
auto v26 = vtrn1q_s64(reinterpret_cast<int64x2_t>(vec2.value), reinterpret_cast<int64x2_t>(vec6.value));
|
||||
auto v14 = vtrn2q_s64(reinterpret_cast<int64x2_t>(vec2.value), reinterpret_cast<int64x2_t>(vec6.value));
|
||||
auto v29 = vtrn1q_s64(reinterpret_cast<int64x2_t>(vec3.value), reinterpret_cast<int64x2_t>(vec7.value));
|
||||
auto v15 = vtrn2q_s64(reinterpret_cast<int64x2_t>(vec3.value), reinterpret_cast<int64x2_t>(vec7.value));
|
||||
|
||||
auto tmp9 = vzipq_s16(vec8.value, vec9.value); // tmp9 would disappear after compile
|
||||
vec0.value = tmp9.val[0];
|
||||
vec1.value = tmp9.val[1];
|
||||
auto tmp10 = vzipq_s16(vec10.value, vec11.value);
|
||||
vec2.value = tmp10.val[0];
|
||||
vec3.value = tmp10.val[1];
|
||||
auto tmp11 = vzipq_s32(vec0.value, vec2.value);
|
||||
auto tmp9 = vzipq_s16(reinterpret_cast<int16x8_t>(vec8.value), reinterpret_cast<int16x8_t>(vec9.value)); // tmp9 would disappear after compile
|
||||
vec0.value = reinterpret_cast<float16x8_t>(tmp9.val[0]);
|
||||
vec1.value = reinterpret_cast<float16x8_t>(tmp9.val[1]);
|
||||
auto tmp10 = vzipq_s16(reinterpret_cast<int16x8_t>(vec10.value), reinterpret_cast<int16x8_t>(vec11.value));
|
||||
vec2.value = reinterpret_cast<float16x8_t>(tmp10.val[0]);
|
||||
vec3.value = reinterpret_cast<float16x8_t>(tmp10.val[1]);
|
||||
auto tmp11 = vzipq_s32(reinterpret_cast<int32x4_t>(vec0.value), reinterpret_cast<int32x4_t>(vec2.value));
|
||||
auto v16 = tmp11.val[0];
|
||||
auto v17 = tmp11.val[1];
|
||||
auto tmp12 = vzipq_s32(vec1.value, vec3.value);
|
||||
auto tmp12 = vzipq_s32(reinterpret_cast<int32x4_t>(vec1.value), reinterpret_cast<int32x4_t>(vec3.value));
|
||||
auto v18 = tmp12.val[0];
|
||||
auto v19 = tmp12.val[1];
|
||||
|
||||
v21 = vtrn1q_s64(v16, v12);
|
||||
v22 = vtrn2q_s64(v12, v16);
|
||||
v24 = vtrn1q_s64(v17, v13);
|
||||
v25 = vtrn2q_s64(v13, v17);
|
||||
v27 = vtrn1q_s64(v18, v14);
|
||||
v28 = vtrn2q_s64(v14, v18);
|
||||
v30 = vtrn1q_s64(v19, v15);
|
||||
v31 = vtrn2q_s64(v15, v19);
|
||||
v21 = reinterpret_cast<int16x8_t>(vtrn1q_s64(reinterpret_cast<int64x2_t>(v16), reinterpret_cast<int64x2_t>(v12)));
|
||||
v22 = reinterpret_cast<int16x8_t>(vtrn2q_s64(reinterpret_cast<int64x2_t>(v12), reinterpret_cast<int64x2_t>(v16)));
|
||||
v24 = reinterpret_cast<int16x8_t>(vtrn1q_s64(reinterpret_cast<int64x2_t>(v17), reinterpret_cast<int64x2_t>(v13)));
|
||||
v25 = reinterpret_cast<int16x8_t>(vtrn2q_s64(reinterpret_cast<int64x2_t>(v13), reinterpret_cast<int64x2_t>(v17)));
|
||||
v27 = reinterpret_cast<int16x8_t>(vtrn1q_s64(reinterpret_cast<int64x2_t>(v18), reinterpret_cast<int64x2_t>(v14)));
|
||||
v28 = reinterpret_cast<int16x8_t>(vtrn2q_s64(reinterpret_cast<int64x2_t>(v14), reinterpret_cast<int64x2_t>(v18)));
|
||||
v30 = reinterpret_cast<int16x8_t>(vtrn1q_s64(reinterpret_cast<int64x2_t>(v19), reinterpret_cast<int64x2_t>(v15)));
|
||||
v31 = reinterpret_cast<int16x8_t>(vtrn2q_s64(reinterpret_cast<int64x2_t>(v15), reinterpret_cast<int64x2_t>(v19)));
|
||||
|
||||
vec0.value = v20;
|
||||
vec1.value = v21;
|
||||
vec2.value = v22;
|
||||
vec3.value = v23;
|
||||
vec4.value = v24;
|
||||
vec5.value = v25;
|
||||
vec6.value = v26;
|
||||
vec7.value = v27;
|
||||
vec8.value = v28;
|
||||
vec9.value = v29;
|
||||
vec10.value = v30;
|
||||
vec11.value = v31;
|
||||
vec0.value = reinterpret_cast<float16x8_t>(v20);
|
||||
vec1.value = reinterpret_cast<float16x8_t>(v21);
|
||||
vec2.value = reinterpret_cast<float16x8_t>(v22);
|
||||
vec3.value = reinterpret_cast<float16x8_t>(v23);
|
||||
vec4.value = reinterpret_cast<float16x8_t>(v24);
|
||||
vec5.value = reinterpret_cast<float16x8_t>(v25);
|
||||
vec6.value = reinterpret_cast<float16x8_t>(v26);
|
||||
vec7.value = reinterpret_cast<float16x8_t>(v27);
|
||||
vec8.value = reinterpret_cast<float16x8_t>(v28);
|
||||
vec9.value = reinterpret_cast<float16x8_t>(v29);
|
||||
vec10.value = reinterpret_cast<float16x8_t>(v30);
|
||||
vec11.value = reinterpret_cast<float16x8_t>(v31);
|
||||
#else
|
||||
|
||||
auto tmp1 = vzipq_s16(vec0.value, vec1.value); // tmp1 would disappear after compile
|
||||
auto tmp1 = vzipq_s16(reinterpret_cast<int16x8_t>(vec0.value), reinterpret_cast<int16x8_t>(vec1.value)); // tmp1 would disappear after compile
|
||||
auto v21 = tmp1.val[0];
|
||||
auto v22 = tmp1.val[1];
|
||||
auto tmp2 = vzipq_s16(vec2.value, vec3.value);
|
||||
auto tmp2 = vzipq_s16(reinterpret_cast<int16x8_t>(vec2.value), reinterpret_cast<int16x8_t>(vec3.value));
|
||||
auto v24 = tmp2.val[0];
|
||||
auto v25 = tmp2.val[1];
|
||||
auto tmp3 = vzipq_s16(vec4.value, vec5.value);
|
||||
auto tmp3 = vzipq_s16(reinterpret_cast<int16x8_t>(vec4.value), reinterpret_cast<int16x8_t>(vec5.value));
|
||||
auto v27 = tmp3.val[0];
|
||||
auto v28 = tmp3.val[1];
|
||||
auto tmp4 = vzipq_s16(vec6.value, vec7.value);
|
||||
auto tmp4 = vzipq_s16(reinterpret_cast<int16x8_t>(vec6.value), reinterpret_cast<int16x8_t>(vec7.value));
|
||||
auto v30 = tmp4.val[0];
|
||||
auto v31 = tmp4.val[1];
|
||||
|
||||
auto tmp5 = vzipq_s32(v21, v24);
|
||||
vec0.value = tmp5.val[0];
|
||||
vec1.value = tmp5.val[1];
|
||||
auto tmp6 = vzipq_s32(v22, v25);
|
||||
vec2.value = tmp6.val[0];
|
||||
vec3.value = tmp6.val[1];
|
||||
auto tmp7 = vzipq_s32(v27, v30);
|
||||
vec4.value = tmp7.val[0];
|
||||
vec5.value = tmp7.val[1];
|
||||
auto tmp8 = vzipq_s32(v28, v31);
|
||||
vec6.value = tmp8.val[0];
|
||||
vec7.value = tmp8.val[1];
|
||||
auto tmp5 = vzipq_s32(reinterpret_cast<int32x4_t>(v21), reinterpret_cast<int32x4_t>(v24));
|
||||
vec0.value = reinterpret_cast<float16x8_t>(tmp5.val[0]);
|
||||
vec1.value = reinterpret_cast<float16x8_t>(tmp5.val[1]);
|
||||
auto tmp6 = vzipq_s32(reinterpret_cast<int32x4_t>(v22), reinterpret_cast<int32x4_t>(v25));
|
||||
vec2.value = reinterpret_cast<float16x8_t>(tmp6.val[0]);
|
||||
vec3.value = reinterpret_cast<float16x8_t>(tmp6.val[1]);
|
||||
auto tmp7 = vzipq_s32(reinterpret_cast<int32x4_t>(v27), reinterpret_cast<int32x4_t>(v30));
|
||||
vec4.value = reinterpret_cast<float16x8_t>(tmp7.val[0]);
|
||||
vec5.value = reinterpret_cast<float16x8_t>(tmp7.val[1]);
|
||||
auto tmp8 = vzipq_s32(reinterpret_cast<int32x4_t>(v28), reinterpret_cast<int32x4_t>(v31));
|
||||
vec6.value = reinterpret_cast<float16x8_t>(tmp8.val[0]);
|
||||
vec7.value = reinterpret_cast<float16x8_t>(tmp8.val[1]);
|
||||
|
||||
|
||||
auto v20 = vec0.value;
|
||||
auto v12 = vec4.value;
|
||||
v20 = vsetq_lane_s64(vgetq_lane_s64(vec4.value, 0), v20, 1);
|
||||
v12 = vsetq_lane_s64(vgetq_lane_s64(vec0.value, 1), v12, 0);
|
||||
auto v23 = vec1.value;
|
||||
auto v13 = vec5.value;
|
||||
v23 = vsetq_lane_s64(vgetq_lane_s64(vec5.value, 0), v23, 1);
|
||||
v13 = vsetq_lane_s64(vgetq_lane_s64(vec1.value, 1), v13, 0);
|
||||
auto v26 = vec2.value;
|
||||
auto v14 = vec6.value;
|
||||
v26 = vsetq_lane_s64(vgetq_lane_s64(vec6.value, 0), v26, 1);
|
||||
v14 = vsetq_lane_s64(vgetq_lane_s64(vec2.value, 1), v14, 0);
|
||||
auto v29 = vec3.value;
|
||||
auto v15 = vec7.value;
|
||||
v29 = vsetq_lane_s64(vgetq_lane_s64(vec7.value, 0), v29, 1);
|
||||
v15 = vsetq_lane_s64(vgetq_lane_s64(vec3.value, 1), v15, 0);
|
||||
auto v20 = reinterpret_cast<int64x2_t>(vec0.value);
|
||||
auto v12 = reinterpret_cast<int64x2_t>(vec4.value);
|
||||
v20 = vsetq_lane_s64(vgetq_lane_s64(reinterpret_cast<int64x2_t>(vec4.value), 0), v20, 1);
|
||||
v12 = vsetq_lane_s64(vgetq_lane_s64(reinterpret_cast<int64x2_t>(vec0.value), 1), v12, 0);
|
||||
auto v23 = reinterpret_cast<int64x2_t>(vec1.value);
|
||||
auto v13 = reinterpret_cast<int64x2_t>(vec5.value);
|
||||
v23 = vsetq_lane_s64(vgetq_lane_s64(reinterpret_cast<int64x2_t>(vec5.value), 0), v23, 1);
|
||||
v13 = vsetq_lane_s64(vgetq_lane_s64(reinterpret_cast<int64x2_t>(vec1.value), 1), v13, 0);
|
||||
auto v26 = reinterpret_cast<int64x2_t>(vec2.value);
|
||||
auto v14 = reinterpret_cast<int64x2_t>(vec6.value);
|
||||
v26 = vsetq_lane_s64(vgetq_lane_s64(reinterpret_cast<int64x2_t>(vec6.value), 0), v26, 1);
|
||||
v14 = vsetq_lane_s64(vgetq_lane_s64(reinterpret_cast<int64x2_t>(vec2.value), 1), v14, 0);
|
||||
auto v29 = reinterpret_cast<int64x2_t>(vec3.value);
|
||||
auto v15 = reinterpret_cast<int64x2_t>(vec7.value);
|
||||
v29 = vsetq_lane_s64(vgetq_lane_s64(reinterpret_cast<int64x2_t>(vec7.value), 0), v29, 1);
|
||||
v15 = vsetq_lane_s64(vgetq_lane_s64(reinterpret_cast<int64x2_t>(vec3.value), 1), v15, 0);
|
||||
|
||||
|
||||
auto tmp9 = vzipq_s16(vec8.value, vec9.value); // tmp9 would disappear after compile
|
||||
vec0.value = tmp9.val[0];
|
||||
vec1.value = tmp9.val[1];
|
||||
auto tmp10 = vzipq_s16(vec10.value, vec11.value);
|
||||
vec2.value = tmp10.val[0];
|
||||
vec3.value = tmp10.val[1];
|
||||
auto tmp11 = vzipq_s32(vec0.value, vec2.value);
|
||||
auto tmp9 = vzipq_s16(reinterpret_cast<int16x8_t>(vec8.value), reinterpret_cast<int16x8_t>(vec9.value)); // tmp9 would disappear after compile
|
||||
vec0.value = reinterpret_cast<float16x8_t>(tmp9.val[0]);
|
||||
vec1.value = reinterpret_cast<float16x8_t>(tmp9.val[1]);
|
||||
auto tmp10 = vzipq_s16(reinterpret_cast<int16x8_t>(vec10.value), reinterpret_cast<int16x8_t>(vec11.value));
|
||||
vec2.value = reinterpret_cast<float16x8_t>(tmp10.val[0]);
|
||||
vec3.value = reinterpret_cast<float16x8_t>(tmp10.val[1]);
|
||||
auto tmp11 = vzipq_s32(reinterpret_cast<int16x8_t>(vec0.value), reinterpret_cast<int16x8_t>(vec2.value));
|
||||
auto v16 = tmp11.val[0];
|
||||
auto v17 = tmp11.val[1];
|
||||
auto tmp12 = vzipq_s32(vec1.value, vec3.value);
|
||||
auto tmp12 = vzipq_s32(reinterpret_cast<int16x8_t>(vec1.value), reinterpret_cast<int16x8_t>(vec3.value));
|
||||
auto v18 = tmp12.val[0];
|
||||
auto v19 = tmp12.val[1];
|
||||
|
||||
v21 = v16;
|
||||
v22 = v16;
|
||||
v21 = vsetq_lane_s64(vgetq_lane_s64(v12, 0), v21, 1);
|
||||
v22 = vsetq_lane_s64(vgetq_lane_s64(v12, 1), v22, 0);
|
||||
v24 = v17;
|
||||
v25 = v17;
|
||||
v24 = vsetq_lane_s64(vgetq_lane_s64(v13, 0), v24, 1);
|
||||
v25 = vsetq_lane_s64(vgetq_lane_s64(v13, 1), v25, 0);
|
||||
v27 = v18;
|
||||
v28 = v18;
|
||||
v27 = vsetq_lane_s64(vgetq_lane_s64(v14, 0), v27, 1);
|
||||
v28 = vsetq_lane_s64(vgetq_lane_s64(v14, 1), v28, 0);
|
||||
v30 = v19;
|
||||
v31 = v19;
|
||||
v30 = vsetq_lane_s64(vgetq_lane_s64(v15, 0), v30, 1);
|
||||
v31 = vsetq_lane_s64(vgetq_lane_s64(v15, 1), v31, 0);
|
||||
v21 = reinterpret_cast<int16x8_t>(v16);
|
||||
v22 = reinterpret_cast<int16x8_t>(v16);
|
||||
v21 = reinterpret_cast<int16x8_t>(vsetq_lane_s64(vgetq_lane_s64(v12, 0), reinterpret_cast<int64x2_t>(v21), 1));
|
||||
v22 = reinterpret_cast<int16x8_t>(vsetq_lane_s64(vgetq_lane_s64(v12, 1), reinterpret_cast<int64x2_t>(v22), 0));
|
||||
v24 = reinterpret_cast<int16x8_t>(v17);
|
||||
v25 = reinterpret_cast<int16x8_t>(v17);
|
||||
v24 = reinterpret_cast<int16x8_t>(vsetq_lane_s64(vgetq_lane_s64(v13, 0), reinterpret_cast<int64x2_t>(v24), 1));
|
||||
v25 = reinterpret_cast<int16x8_t>(vsetq_lane_s64(vgetq_lane_s64(v13, 1), reinterpret_cast<int64x2_t>(v25), 0));
|
||||
v27 = reinterpret_cast<int16x8_t>(v18);
|
||||
v28 = reinterpret_cast<int16x8_t>(v18);
|
||||
v27 = reinterpret_cast<int16x8_t>(vsetq_lane_s64(vgetq_lane_s64(v14, 0), reinterpret_cast<int64x2_t>(v27), 1));
|
||||
v28 = reinterpret_cast<int16x8_t>(vsetq_lane_s64(vgetq_lane_s64(v14, 1), reinterpret_cast<int64x2_t>(v28), 0));
|
||||
v30 = reinterpret_cast<int16x8_t>(v19);
|
||||
v31 = reinterpret_cast<int16x8_t>(v19);
|
||||
v30 = reinterpret_cast<int16x8_t>(vsetq_lane_s64(vgetq_lane_s64(v15, 0), reinterpret_cast<int64x2_t>(v30), 1));
|
||||
v31 = reinterpret_cast<int16x8_t>(vsetq_lane_s64(vgetq_lane_s64(v15, 1), reinterpret_cast<int64x2_t>(v31), 0));
|
||||
|
||||
vec0.value = v20;
|
||||
vec1.value = v21;
|
||||
vec2.value = v22;
|
||||
vec3.value = v23;
|
||||
vec4.value = v24;
|
||||
vec5.value = v25;
|
||||
vec6.value = v26;
|
||||
vec7.value = v27;
|
||||
vec8.value = v28;
|
||||
vec9.value = v29;
|
||||
vec10.value = v30;
|
||||
vec11.value = v31;
|
||||
vec0.value = reinterpret_cast<float16x8_t>(v20);
|
||||
vec1.value = reinterpret_cast<float16x8_t>(v21);
|
||||
vec2.value = reinterpret_cast<float16x8_t>(v22);
|
||||
vec3.value = reinterpret_cast<float16x8_t>(v23);
|
||||
vec4.value = reinterpret_cast<float16x8_t>(v24);
|
||||
vec5.value = reinterpret_cast<float16x8_t>(v25);
|
||||
vec6.value = reinterpret_cast<float16x8_t>(v26);
|
||||
vec7.value = reinterpret_cast<float16x8_t>(v27);
|
||||
vec8.value = reinterpret_cast<float16x8_t>(v28);
|
||||
vec9.value = reinterpret_cast<float16x8_t>(v29);
|
||||
vec10.value = reinterpret_cast<float16x8_t>(v30);
|
||||
vec11.value = reinterpret_cast<float16x8_t>(v31);
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -343,25 +343,26 @@ struct VecHalf<4> {
|
|||
}
|
||||
static inline void transpose4(VecType& vec0, VecType& vec1, VecType& vec2, VecType& vec3) {
|
||||
#ifdef __aarch64__
|
||||
auto m0 = vtrn1q_s32(vec0.value, vec1.value);
|
||||
auto m1 = vtrn2q_s32(vec0.value, vec1.value);
|
||||
auto m2 = vtrn1q_s32(vec2.value, vec3.value);
|
||||
auto m3 = vtrn2q_s32(vec2.value, vec3.value);
|
||||
vec0.value = vtrn1q_s64(m0, m2);
|
||||
vec1.value = vtrn1q_s64(m1, m3);
|
||||
vec2.value = vtrn2q_s64(m0, m2);
|
||||
vec3.value = vtrn2q_s64(m1, m3);
|
||||
auto m0 = vtrn1q_s32(reinterpret_cast<int32x4_t>(vec0.value), reinterpret_cast<int32x4_t>(vec1.value));
|
||||
auto m1 = vtrn2q_s32(reinterpret_cast<int32x4_t>(vec0.value), reinterpret_cast<int32x4_t>(vec1.value));
|
||||
auto m2 = vtrn1q_s32(reinterpret_cast<int32x4_t>(vec2.value), reinterpret_cast<int32x4_t>(vec3.value));
|
||||
auto m3 = vtrn2q_s32(reinterpret_cast<int32x4_t>(vec2.value), reinterpret_cast<int32x4_t>(vec3.value));
|
||||
vec0.value = reinterpret_cast<float32x4_t>(vtrn1q_s64(reinterpret_cast<int64x2_t>(m0), reinterpret_cast<int64x2_t>(m2)));
|
||||
vec1.value = reinterpret_cast<float32x4_t>(vtrn1q_s64(reinterpret_cast<int64x2_t>(m1), reinterpret_cast<int64x2_t>(m3)));
|
||||
vec2.value = reinterpret_cast<float32x4_t>(vtrn2q_s64(reinterpret_cast<int64x2_t>(m0), reinterpret_cast<int64x2_t>(m2)));
|
||||
vec3.value = reinterpret_cast<float32x4_t>(vtrn2q_s64(reinterpret_cast<int64x2_t>(m1), reinterpret_cast<int64x2_t>(m3)));
|
||||
#else
|
||||
auto m0m1 = vtrnq_s32(vec0.value, vec1.value);
|
||||
auto m2m3 = vtrnq_s32(vec2.value, vec3.value);
|
||||
vec0.value = m0m1.val[0];
|
||||
vec1.value = m0m1.val[1];
|
||||
vec2.value = m2m3.val[0];
|
||||
vec3.value = m2m3.val[1];
|
||||
vec0.value = vsetq_lane_s64(vgetq_lane_s64(m2m3.val[0], 0), vec0.value, 1);
|
||||
vec1.value = vsetq_lane_s64(vgetq_lane_s64(m2m3.val[1], 0), vec1.value, 1);
|
||||
vec2.value = vsetq_lane_s64(vgetq_lane_s64(m0m1.val[0], 1), vec2.value, 0);
|
||||
vec3.value = vsetq_lane_s64(vgetq_lane_s64(m0m1.val[1], 1), vec3.value, 0);
|
||||
|
||||
auto m0m1 = vtrnq_s32(reinterpret_cast<int32x4_t>(vec0.value), reinterpret_cast<int32x4_t>(vec1.value));
|
||||
auto m2m3 = vtrnq_s32(reinterpret_cast<int32x4_t>(vec2.value), reinterpret_cast<int32x4_t>(vec3.value));
|
||||
vec0.value = reinterpret_cast<float32x4_t>(m0m1.val[0]);
|
||||
vec1.value = reinterpret_cast<float32x4_t>(m0m1.val[1]);
|
||||
vec2.value = reinterpret_cast<float32x4_t>(m2m3.val[0]);
|
||||
vec3.value = reinterpret_cast<float32x4_t>(m2m3.val[1]);
|
||||
vec0.value = reinterpret_cast<float32x4_t>(vsetq_lane_s64(vgetq_lane_s64(reinterpret_cast<int64x2_t>(m2m3.val[0]), 0), reinterpret_cast<int64x2_t>(vec0.value), 1));
|
||||
vec1.value = reinterpret_cast<float32x4_t>(vsetq_lane_s64(vgetq_lane_s64(reinterpret_cast<int64x2_t>(m2m3.val[1]), 0), reinterpret_cast<int64x2_t>(vec1.value), 1));
|
||||
vec2.value = reinterpret_cast<float32x4_t>(vsetq_lane_s64(vgetq_lane_s64(reinterpret_cast<int64x2_t>(m0m1.val[0]), 1), reinterpret_cast<int64x2_t>(vec2.value), 0));
|
||||
vec3.value = reinterpret_cast<float32x4_t>(vsetq_lane_s64(vgetq_lane_s64(reinterpret_cast<int64x2_t>(m0m1.val[1]), 1), reinterpret_cast<int64x2_t>(vec3.value), 0));
|
||||
/*
|
||||
generated arm32 assembly code is almost the same as:
|
||||
vtrn.32 d0, d2
|
||||
|
|
@ -381,12 +382,12 @@ struct VecHalf<4> {
|
|||
auto trans1 = vtrn_s16(vec2, vec3);
|
||||
auto m2 = trans1.val[0];
|
||||
auto m3 = trans1.val[1];
|
||||
auto trans2 = vtrn_s32(m0, m2);
|
||||
vec0 = trans2.val[0];
|
||||
vec2 = trans2.val[1];
|
||||
auto trans3 = vtrn_s32(m1, m3);
|
||||
vec1 = trans3.val[0];
|
||||
vec3 = trans3.val[1];
|
||||
auto trans2 = vtrn_s32(reinterpret_cast<int32x2_t>(m0), reinterpret_cast<int32x2_t>(m2));
|
||||
vec0 = reinterpret_cast<int16x4_t>(trans2.val[0]);
|
||||
vec2 = reinterpret_cast<int16x4_t>(trans2.val[1]);
|
||||
auto trans3 = vtrn_s32(reinterpret_cast<int32x2_t>(m1), reinterpret_cast<int32x2_t>(m3));
|
||||
vec1 = reinterpret_cast<int16x4_t>(trans3.val[0]);
|
||||
vec3 = reinterpret_cast<int16x4_t>(trans3.val[1]);
|
||||
|
||||
}
|
||||
static inline void transpose12(int16_t* srcPtr, const size_t packCUnit) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue