Skip to content

Commit 1fed64e

Browse files
Addressed the review comments2
1 parent 74389a0 commit 1fed64e

File tree

3 files changed

+73
-156
lines changed

3 files changed

+73
-156
lines changed

llvm/lib/Target/X86/GISel/X86LegalizerInfo.cpp

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)