@@ -894,18 +894,43 @@ bool X86LegalizerInfo::legalizeSETROUNDING(MachineInstr &MI,
894894 auto ClearedCWD =
895895 MIRBuilder.buildAnd (s16, CWD16, MIRBuilder.buildConstant (s16, 0xf3ff ));
896896
897- // Convert Src (rounding mode) to bits for control word
898- // (0xc9 << (2 * Src + 4)) & 0xc00
899- auto Src32 = MIRBuilder.buildZExtOrTrunc (s32, Src);
900- auto ShiftAmt = MIRBuilder.buildAdd (
901- s32, MIRBuilder.buildShl (s32, Src32, MIRBuilder.buildConstant (s32, 1 )),
902- MIRBuilder.buildConstant (s32, 4 ));
903- auto ShiftAmt8 = MIRBuilder.buildTrunc (s8, ShiftAmt);
904- auto Shifted =
905- MIRBuilder.buildShl (s16, MIRBuilder.buildConstant (s16, 0xc9 ), ShiftAmt8);
906- auto RMBits =
907- MIRBuilder.buildAnd (s16, Shifted, MIRBuilder.buildConstant (s16, 0xc00 ));
908-
897+ // Check if Src is a constant
898+ auto *SrcDef = MRI.getVRegDef (Src);
899+ Register RMBits;
900+ if (SrcDef && SrcDef->getOpcode () == TargetOpcode::G_CONSTANT) {
901+ uint64_t RM = getIConstantFromReg (Src, MRI).getZExtValue ();
902+ int FieldVal;
903+ switch (static_cast <RoundingMode>(RM)) {
904+ case RoundingMode::NearestTiesToEven:
905+ FieldVal = X86::rmToNearest;
906+ break ;
907+ case RoundingMode::TowardNegative:
908+ FieldVal = X86::rmDownward;
909+ break ;
910+ case RoundingMode::TowardPositive:
911+ FieldVal = X86::rmUpward;
912+ break ;
913+ case RoundingMode::TowardZero:
914+ FieldVal = X86::rmTowardZero;
915+ break ;
916+ default :
917+ report_fatal_error (" rounding mode is not supported by X86 hardware" );
918+ }
919+ RMBits = MIRBuilder.buildConstant (s16, FieldVal).getReg (0 );
920+ } else {
921+ // Convert Src (rounding mode) to bits for control word
922+ // (0xc9 << (2 * Src + 4)) & 0xc00
923+ auto Src32 = MIRBuilder.buildZExtOrTrunc (s32, Src);
924+ auto ShiftAmt = MIRBuilder.buildAdd (
925+ s32, MIRBuilder.buildShl (s32, Src32, MIRBuilder.buildConstant (s32, 1 )),
926+ MIRBuilder.buildConstant (s32, 4 ));
927+ auto ShiftAmt8 = MIRBuilder.buildTrunc (s8, ShiftAmt);
928+ auto Shifted = MIRBuilder.buildShl (s16, MIRBuilder.buildConstant (s16, 0xc9 ),
929+ ShiftAmt8);
930+ RMBits =
931+ MIRBuilder.buildAnd (s16, Shifted, MIRBuilder.buildConstant (s16, 0xc00 ))
932+ .getReg (0 );
933+ }
909934 // Update rounding mode bits
910935 auto NewCWD =
911936 MIRBuilder.buildOr (s16, ClearedCWD, RMBits, MachineInstr::Disjoint);
0 commit comments