@@ -2653,12 +2653,6 @@ template<typename R, typename... Rx>
26532653 INSN (cnt, 0 , 0b100000010110 , 0 ); // accepted arrangements: T8B, T16B
26542654 INSN (uaddlp, 1 , 0b100000001010 , 2 ); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S
26552655 INSN (uaddlv, 1 , 0b110000001110 , 1 ); // accepted arrangements: T8B, T16B, T4H, T8H, T4S
2656- // Zero compare.
2657- INSN (cmeq, 0 , 0b100000100110 , 3 ); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S, T2D
2658- INSN (cmge, 1 , 0b100000100010 , 3 ); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S, T2D
2659- INSN (cmgt, 0 , 0b100000100010 , 3 ); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S, T2D
2660- INSN (cmle, 1 , 0b100000100110 , 3 ); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S, T2D
2661- INSN (cmlt, 0 , 0b100000101010 , 3 ); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S, T2D
26622656
26632657#undef INSN
26642658
@@ -3190,6 +3184,48 @@ template<typename R, typename... Rx>
31903184
31913185#undef INSN
31923186
3187+ // AdvSIMD compare with zero (vector)
3188+ void cm (Condition cond, FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn) {
3189+ starti;
3190+ assert (T != T1Q && T != T1D, " invalid arrangement" );
3191+ int cond_op;
3192+ switch (cond) {
3193+ case EQ: cond_op = 0b001 ; break ;
3194+ case GE: cond_op = 0b100 ; break ;
3195+ case GT: cond_op = 0b000 ; break ;
3196+ case LE: cond_op = 0b101 ; break ;
3197+ case LT: cond_op = 0b010 ; break ;
3198+ default :
3199+ ShouldNotReachHere ();
3200+ break ;
3201+ }
3202+
3203+ f (0 , 31 ), f ((int )T & 1 , 30 ), f ((cond_op >> 2 ) & 1 , 29 );
3204+ f (0b01110 , 28 , 24 ), f ((int )T >> 1 , 23 , 22 ), f (0b10000010 , 21 , 14 );
3205+ f (cond_op & 0b11 , 13 , 12 ), f (0b10 , 11 , 10 ), rf (Vn, 5 ), rf (Vd, 0 );
3206+ }
3207+
3208+ // AdvSIMD Floating-point compare with zero (vector)
3209+ void fcm (Condition cond, FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn) {
3210+ starti;
3211+ assert (T == T2S || T == T4S || T == T2D, " invalid arrangement" );
3212+ int cond_op;
3213+ switch (cond) {
3214+ case EQ: cond_op = 0b010 ; break ;
3215+ case GT: cond_op = 0b000 ; break ;
3216+ case GE: cond_op = 0b001 ; break ;
3217+ case LE: cond_op = 0b011 ; break ;
3218+ case LT: cond_op = 0b100 ; break ;
3219+ default :
3220+ ShouldNotReachHere ();
3221+ break ;
3222+ }
3223+
3224+ f (0 , 31 ), f ((int )T & 1 , 30 ), f (cond_op & 1 , 29 ), f (0b011101 , 28 , 23 );
3225+ f (((int )(T >> 1 ) & 1 ), 22 ), f (0b10000011 , 21 , 14 );
3226+ f ((cond_op >> 1 ) & 0b11 , 13 , 12 ), f (0b10 , 11 , 10 ), rf (Vn, 5 ), rf (Vd, 0 );
3227+ }
3228+
31933229 void ext (FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn, FloatRegister Vm, int index)
31943230 {
31953231 starti;
0 commit comments