@@ -2196,41 +2196,20 @@ void mvnw(Register Rd, Register Rm,
21962196
21972197#undef INSN
21982198
2199- enum sign_kind { SIGNED, UNSIGNED };
2200-
22012199private:
2202- void _xcvtf_scalar_integer (sign_kind sign, unsigned sz,
2203- FloatRegister Rd, FloatRegister Rn) {
2204- starti;
2205- f (0b01 , 31 , 30 ), f (sign == SIGNED ? 0 : 1 , 29 );
2206- f (0b111100 , 27 , 23 ), f ((sz >> 1 ) & 1 , 22 ), f (0b100001110110 , 21 , 10 );
2207- rf (Rn, 5 ), rf (Rd, 0 );
2208- }
2209-
2210- public:
2211- #define INSN (NAME, sign, sz ) \
2212- void NAME (FloatRegister Rd, FloatRegister Rn) { \
2213- _xcvtf_scalar_integer (sign, sz, Rd, Rn); \
2214- }
2215-
2216- INSN (scvtfs, SIGNED, 0 );
2217- INSN (scvtfd, SIGNED, 1 );
2218-
2219- #undef INSN
2220-
2221- private:
2222- void _xcvtf_vector_integer (sign_kind sign, SIMD_Arrangement T,
2200+ void _xcvtf_vector_integer (bool is_unsigned, SIMD_Arrangement T,
22232201 FloatRegister Rd, FloatRegister Rn) {
22242202 assert (T == T2S || T == T4S || T == T2D, " invalid arrangement" );
22252203 starti;
2226- f (0 , 31 ), f (T & 1 , 30 ), f (sign == SIGNED ? 0 : 1 , 29 );
2204+ f (0 , 31 ), f (T & 1 , 30 ), f (is_unsigned ? 1 : 0 , 29 );
22272205 f (0b011100 , 28 , 23 ), f ((T >> 1 ) & 1 , 22 ), f (0b100001110110 , 21 , 10 );
22282206 rf (Rn, 5 ), rf (Rd, 0 );
22292207 }
22302208
22312209public:
2210+
22322211 void scvtfv (SIMD_Arrangement T, FloatRegister Rd, FloatRegister Rn) {
2233- _xcvtf_vector_integer (SIGNED , T, Rd, Rn);
2212+ _xcvtf_vector_integer (/* is_unsigned */ false , T, Rd, Rn);
22342213 }
22352214
22362215 // Floating-point compare
@@ -2991,8 +2970,8 @@ template<typename R, typename... Rx>
29912970
29922971#undef INSN
29932972
2994- private :
2995- void _xshll (sign_kind sign , FloatRegister Vd, SIMD_Arrangement Ta, FloatRegister Vn, SIMD_Arrangement Tb, int shift) {
2973+ protected :
2974+ void _xshll (bool is_unsigned , FloatRegister Vd, SIMD_Arrangement Ta, FloatRegister Vn, SIMD_Arrangement Tb, int shift) {
29962975 starti;
29972976 /* The encodings for the immh:immb fields (bits 22:16) are
29982977 * 0001 xxx 8H, 8B/16B shift = xxx
@@ -3002,20 +2981,20 @@ template<typename R, typename... Rx>
30022981 */
30032982 assert ((Tb >> 1 ) + 1 == (Ta >> 1 ), " Incompatible arrangement" );
30042983 assert ((1 << ((Tb>>1 )+3 )) > shift, " Invalid shift value" );
3005- f (0 , 31 ), f (Tb & 1 , 30 ), f (sign == SIGNED ? 0 : 1 , 29 ), f (0b011110 , 28 , 23 );
2984+ f (0 , 31 ), f (Tb & 1 , 30 ), f (is_unsigned ? 1 : 0 , 29 ), f (0b011110 , 28 , 23 );
30062985 f ((1 << ((Tb>>1 )+3 ))|shift, 22 , 16 );
30072986 f (0b101001 , 15 , 10 ), rf (Vn, 5 ), rf (Vd, 0 );
30082987 }
30092988
30102989public:
30112990 void ushll (FloatRegister Vd, SIMD_Arrangement Ta, FloatRegister Vn, SIMD_Arrangement Tb, int shift) {
30122991 assert (Tb == T8B || Tb == T4H || Tb == T2S, " invalid arrangement" );
3013- _xshll (UNSIGNED , Vd, Ta, Vn, Tb, shift);
2992+ _xshll (/* is_unsigned */ true , Vd, Ta, Vn, Tb, shift);
30142993 }
30152994
30162995 void ushll2 (FloatRegister Vd, SIMD_Arrangement Ta, FloatRegister Vn, SIMD_Arrangement Tb, int shift) {
30172996 assert (Tb == T16B || Tb == T8H || Tb == T4S, " invalid arrangement" );
3018- _xshll (UNSIGNED , Vd, Ta, Vn, Tb, shift);
2997+ _xshll (/* is_unsigned */ true , Vd, Ta, Vn, Tb, shift);
30192998 }
30202999
30213000 void uxtl (FloatRegister Vd, SIMD_Arrangement Ta, FloatRegister Vn, SIMD_Arrangement Tb) {
@@ -3024,12 +3003,12 @@ template<typename R, typename... Rx>
30243003
30253004 void sshll (FloatRegister Vd, SIMD_Arrangement Ta, FloatRegister Vn, SIMD_Arrangement Tb, int shift) {
30263005 assert (Tb == T8B || Tb == T4H || Tb == T2S, " invalid arrangement" );
3027- _xshll (SIGNED , Vd, Ta, Vn, Tb, shift);
3006+ _xshll (/* is_unsigned */ false , Vd, Ta, Vn, Tb, shift);
30283007 }
30293008
30303009 void sshll2 (FloatRegister Vd, SIMD_Arrangement Ta, FloatRegister Vn, SIMD_Arrangement Tb, int shift) {
30313010 assert (Tb == T16B || Tb == T8H || Tb == T4S, " invalid arrangement" );
3032- _xshll (SIGNED , Vd, Ta, Vn, Tb, shift);
3011+ _xshll (/* is_unsigned */ false , Vd, Ta, Vn, Tb, shift);
30333012 }
30343013
30353014 void sxtl (FloatRegister Vd, SIMD_Arrangement Ta, FloatRegister Vn, SIMD_Arrangement Tb) {
@@ -3862,18 +3841,25 @@ template<typename R, typename... Rx>
38623841 }
38633842
38643843// SVE unpack vector elements
3865- #define INSN (NAME, op ) \
3866- void NAME (FloatRegister Zd, SIMD_RegVariant T, FloatRegister Zn) { \
3867- starti; \
3868- assert (T != B && T != Q, " invalid size" ); \
3869- f (0b00000101 , 31 , 24 ), f (T, 23 , 22 ), f (0b1100 , 21 , 18 ); \
3870- f (op, 17 , 16 ), f (0b001110 , 15 , 10 ), rf (Zn, 5 ), rf (Zd, 0 ); \
3844+ protected:
3845+ void _sve_xunpk (bool is_unsigned, bool is_high, FloatRegister Zd, SIMD_RegVariant T, FloatRegister Zn) {
3846+ starti;
3847+ assert (T != B && T != Q, " invalid size" );
3848+ f (0b00000101 , 31 , 24 ), f (T, 23 , 22 ), f (0b1100 , 21 , 18 );
3849+ f (is_unsigned ? 1 : 0 , 17 ), f (is_high ? 1 : 0 , 16 ),
3850+ f (0b001110 , 15 , 10 ), rf (Zn, 5 ), rf (Zd, 0 );
3851+ }
3852+
3853+ public:
3854+ #define INSN (NAME, is_unsigned, is_high ) \
3855+ void NAME (FloatRegister Zd, SIMD_RegVariant T, FloatRegister Zn) { \
3856+ _sve_xunpk (is_unsigned, is_high, Zd, T, Zn); \
38713857 }
38723858
3873- INSN (sve_uunpkhi, 0b11 ); // Signed unpack and extend half of vector - high half
3874- INSN (sve_uunpklo, 0b10 ); // Signed unpack and extend half of vector - low half
3875- INSN (sve_sunpkhi, 0b01 ); // Unsigned unpack and extend half of vector - high half
3876- INSN (sve_sunpklo, 0b00 ); // Unsigned unpack and extend half of vector - low half
3859+ INSN (sve_uunpkhi, true , true ); // Unsigned unpack and extend half of vector - high half
3860+ INSN (sve_uunpklo, true , false ); // Unsigned unpack and extend half of vector - low half
3861+ INSN (sve_sunpkhi, false , true ); // Signed unpack and extend half of vector - high half
3862+ INSN (sve_sunpklo, false , false ); // Signed unpack and extend half of vector - low half
38773863#undef INSN
38783864
38793865// SVE unpack predicate elements
0 commit comments