@@ -9490,6 +9490,84 @@ void CodeGen::genAmd64EmitterUnitTestsAvx10v2()
94909490 theEmitter->emitIns_R_R (INS_vmovw, EA_16BYTE, REG_XMM0, REG_XMM1);
94919491}
94929492
9493+ /* ****************************************************************************
9494+ * Unit tests for the CCMP instructions.
9495+ */
9496+
9497+ void CodeGen::genAmd64EmitterUnitTestsCCMP ()
9498+ {
9499+ emitter* theEmitter = GetEmitter ();
9500+ genDefineTempLabel (genCreateTempLabel ());
9501+
9502+ // ============
9503+ // Test RR form
9504+ // ============
9505+
9506+ // Test all sizes
9507+ theEmitter->emitIns_R_R (INS_ccmpe, EA_4BYTE, REG_RAX, REG_RCX, INS_OPTS_EVEX_dfv_cf);
9508+ theEmitter->emitIns_R_R (INS_ccmpe, EA_8BYTE, REG_RAX, REG_RCX, INS_OPTS_EVEX_dfv_cf);
9509+ theEmitter->emitIns_R_R (INS_ccmpe, EA_2BYTE, REG_RAX, REG_RCX, INS_OPTS_EVEX_dfv_cf);
9510+ theEmitter->emitIns_R_R (INS_ccmpe, EA_1BYTE, REG_RAX, REG_RCX, INS_OPTS_EVEX_dfv_cf);
9511+
9512+ // Test all CC codes
9513+ for (uint32_t ins = INS_FIRST_CCMP_INSTRUCTION + 1 ; ins < INS_LAST_CCMP_INSTRUCTION; ins++)
9514+ {
9515+ theEmitter->emitIns_R_R ((instruction)ins, EA_4BYTE, REG_RAX, REG_RCX, INS_OPTS_EVEX_dfv_cf);
9516+ }
9517+
9518+ // Test all dfv
9519+ for (int i = 0 ; i < 16 ; i++)
9520+ {
9521+ theEmitter->emitIns_R_R (INS_ccmpe, EA_4BYTE, REG_RAX, REG_RCX, (insOpts)(i << INS_OPTS_EVEX_dfv_byte_offset));
9522+ }
9523+
9524+ // ============
9525+ // Test RS form
9526+ // ============
9527+
9528+ // Test all sizes
9529+ theEmitter->emitIns_R_S (INS_ccmpe, EA_4BYTE, REG_RAX, 0 , 0 , INS_OPTS_EVEX_dfv_cf);
9530+ theEmitter->emitIns_R_S (INS_ccmpe, EA_8BYTE, REG_RAX, 0 , 0 , INS_OPTS_EVEX_dfv_cf);
9531+ theEmitter->emitIns_R_S (INS_ccmpe, EA_2BYTE, REG_RAX, 0 , 0 , INS_OPTS_EVEX_dfv_cf);
9532+ theEmitter->emitIns_R_S (INS_ccmpe, EA_1BYTE, REG_RAX, 0 , 0 , INS_OPTS_EVEX_dfv_cf);
9533+
9534+ // Test all CC codes
9535+ for (uint32_t ins = INS_FIRST_CCMP_INSTRUCTION + 1 ; ins < INS_LAST_CCMP_INSTRUCTION; ins++)
9536+ {
9537+ theEmitter->emitIns_R_S ((instruction)ins, EA_4BYTE, REG_RAX, 0 , 0 , INS_OPTS_EVEX_dfv_cf);
9538+ }
9539+
9540+ // Test all dfv
9541+ for (int i = 0 ; i < 16 ; i++)
9542+ {
9543+ theEmitter->emitIns_R_S (INS_ccmpe, EA_4BYTE, REG_RAX, 0 , 0 , (insOpts)(i << INS_OPTS_EVEX_dfv_byte_offset));
9544+ }
9545+
9546+ // ============
9547+ // Test RI form (test small and large sizes and constants)
9548+ // ============
9549+
9550+ theEmitter->emitIns_R_I (INS_ccmpe, EA_4BYTE, REG_RAX, 123 , INS_OPTS_EVEX_dfv_cf);
9551+ theEmitter->emitIns_R_I (INS_ccmpe, EA_4BYTE, REG_RAX, 270 , INS_OPTS_EVEX_dfv_cf);
9552+
9553+ theEmitter->emitIns_R_I (INS_ccmpe, EA_8BYTE, REG_RAX, 123 , INS_OPTS_EVEX_dfv_cf);
9554+ theEmitter->emitIns_R_I (INS_ccmpe, EA_8BYTE, REG_RAX, 270 , INS_OPTS_EVEX_dfv_cf);
9555+
9556+ theEmitter->emitIns_R_I (INS_ccmpe, EA_2BYTE, REG_RAX, 123 , INS_OPTS_EVEX_dfv_cf);
9557+ theEmitter->emitIns_R_I (INS_ccmpe, EA_2BYTE, REG_RAX, 270 , INS_OPTS_EVEX_dfv_cf);
9558+
9559+ theEmitter->emitIns_R_I (INS_ccmpe, EA_1BYTE, REG_RAX, 123 , INS_OPTS_EVEX_dfv_cf);
9560+ theEmitter->emitIns_R_I (INS_ccmpe, EA_1BYTE, REG_RAX, 270 , INS_OPTS_EVEX_dfv_cf);
9561+
9562+ // ============
9563+ // Test RC form
9564+ // ============
9565+
9566+ CORINFO_FIELD_HANDLE hnd = theEmitter->emitFltOrDblConst (1 .0f , EA_4BYTE);
9567+ theEmitter->emitIns_R_C (INS_ccmpe, EA_4BYTE, REG_RAX, hnd, 0 , INS_OPTS_EVEX_dfv_cf);
9568+ theEmitter->emitIns_R_C (INS_ccmpe, EA_4BYTE, REG_RAX, hnd, 4 , INS_OPTS_EVEX_dfv_cf);
9569+ }
9570+
94939571#endif // defined(DEBUG) && defined(TARGET_AMD64)
94949572
94959573#ifdef PROFILING_SUPPORTED
0 commit comments