Skip to content

Commit 13d167a

Browse files
committed
Optimize bswap.
1 parent 7649b46 commit 13d167a

File tree

6 files changed

+219
-1388
lines changed

6 files changed

+219
-1388
lines changed

llvm/include/llvm/IR/RuntimeLibcalls.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,9 @@ HANDLE_LIBCALL(BITREV_I24, nullptr)
165165
HANDLE_LIBCALL(BITREV_I32, nullptr)
166166
HANDLE_LIBCALL(BITREV_I64, nullptr)
167167
HANDLE_LIBCALL(BITREV_I128, nullptr)
168+
HANDLE_LIBCALL(BSWAP_I32, nullptr)
169+
HANDLE_LIBCALL(BSWAP_I64, nullptr)
170+
HANDLE_LIBCALL(BSWAP_I128, nullptr)
168171

169172
// Floating-point
170173
HANDLE_LIBCALL(ADD_F32, "__addsf3")

llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -556,6 +556,8 @@ static RTLIB::Libcall getRTLibDesc(unsigned Opcode, unsigned Size) {
556556
RTLIBCASE_ALL(UREM_I);
557557
case TargetOpcode::G_CTPOP:
558558
RTLIBCASE_ALL(POPCNT_I);
559+
case TargetOpcode::G_BSWAP:
560+
RTLIBCASE_INT(BSWAP_I);
559561
case TargetOpcode::G_BITREVERSE:
560562
RTLIBCASE_ALL(BITREV_I);
561563
case TargetOpcode::G_CTLZ_ZERO_UNDEF:
@@ -876,6 +878,7 @@ LegalizerHelper::libcall(MachineInstr &MI, LostDebugLocObserver &LocObserver) {
876878
case TargetOpcode::G_UDIV:
877879
case TargetOpcode::G_SREM:
878880
case TargetOpcode::G_UREM:
881+
case TargetOpcode::G_BSWAP:
879882
case TargetOpcode::G_BITREVERSE: {
880883
Type *HLTy = IntegerType::get(Ctx, Size);
881884
auto Status = simpleLibcall(MI, MIRBuilder, Size, HLTy);

llvm/lib/Target/Z80/GISel/Z80LegalizerInfo.cpp

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -224,10 +224,9 @@ Z80LegalizerInfo::Z80LegalizerInfo(const Z80Subtarget &STI,
224224
.clampScalar(0, s8, sMax);
225225

226226
getActionDefinitionsBuilder(
227-
{G_SDIVREM, G_UDIVREM, G_ABS, G_DYN_STACKALLOC, G_SEXT_INREG,
228-
G_BSWAP, G_SMULO, G_SMULH, G_UMULH, G_SMIN,
229-
G_SMAX, G_UMIN, G_UMAX, G_UADDSAT, G_SADDSAT,
230-
G_USUBSAT, G_SSUBSAT, G_USHLSAT, G_SSHLSAT, G_FPOWI})
227+
{G_SDIVREM, G_UDIVREM, G_ABS, G_DYN_STACKALLOC, G_SEXT_INREG, G_SMULO,
228+
G_SMULH, G_UMULH, G_SMIN, G_SMAX, G_UMIN, G_UMAX, G_UADDSAT, G_SADDSAT,
229+
G_USUBSAT, G_SSUBSAT, G_USHLSAT, G_SSHLSAT, G_FPOWI})
231230
.lower();
232231

233232
getActionDefinitionsBuilder({G_CTTZ, G_CTTZ_ZERO_UNDEF, G_CTLZ_ZERO_UNDEF})
@@ -242,6 +241,11 @@ Z80LegalizerInfo::Z80LegalizerInfo(const Z80Subtarget &STI,
242241
.libcallForCartesianProduct({s8}, LegalLibcallScalars)
243242
.clampScalar(0, s8, s8);
244243

244+
getActionDefinitionsBuilder(G_BSWAP)
245+
.legalFor({s16})
246+
.libcallFor({s32, s64})
247+
.clampScalar(0, s16, s64);
248+
245249
getActionDefinitionsBuilder(G_BITREVERSE)
246250
.libcallFor(LegalLibcallScalars)
247251
.clampScalar(0, s8, s64);
@@ -448,8 +452,8 @@ Z80LegalizerInfo::legalizeVAStart(LegalizerHelper &Helper,
448452
LegalizerHelper::LegalizeResult
449453
Z80LegalizerInfo::legalizeShift(LegalizerHelper &Helper, MachineInstr &MI,
450454
LostDebugLocObserver &LocObserver) const {
451-
assert((MI.getOpcode() == G_SHL || MI.getOpcode() == G_LSHR ||
452-
MI.getOpcode() == G_ASHR) &&
455+
unsigned Opc = MI.getOpcode();
456+
assert((Opc == G_SHL || Opc == G_LSHR || Opc == G_ASHR) &&
453457
"Unexpected opcode");
454458
MachineRegisterInfo &MRI = *Helper.MIRBuilder.getMRI();
455459
Register DstReg = MI.getOperand(0).getReg();
@@ -458,17 +462,13 @@ Z80LegalizerInfo::legalizeShift(LegalizerHelper &Helper, MachineInstr &MI,
458462
getIConstantVRegValWithLookThrough(MI.getOperand(2).getReg(), MRI)) {
459463
if (Ty == LLT::scalar(8) && Amt->Value == 1)
460464
return LegalizerHelper::AlreadyLegal;
461-
if (MI.getOpcode() == G_SHL && Amt->Value == 1) {
462-
Helper.Observer.changingInstr(MI);
463-
MI.setDesc(Helper.MIRBuilder.getTII().get(G_ADD));
464-
MI.getOperand(2).setReg(MI.getOperand(1).getReg());
465-
Helper.Observer.changedInstr(MI);
466-
return LegalizerHelper::Legalized;
467-
}
465+
if ((Opc == G_SHL || Opc == G_LSHR) && Ty == LLT::scalar(16) &&
466+
Amt->Value == 8)
467+
return LegalizerHelper::AlreadyLegal;
468468
if (MI.getOpcode() == G_ASHR && Amt->Value == Ty.getSizeInBits() - 1 &&
469469
(Ty == LLT::scalar(8) || Ty == LLT::scalar(16) ||
470470
(Subtarget.is24Bit() && Ty == LLT::scalar(24))))
471-
return LegalizerHelper::Legalized;
471+
return LegalizerHelper::AlreadyLegal;
472472
}
473473
return Helper.libcall(MI, LocObserver);
474474
}

llvm/lib/Target/Z80/Z80ISelLowering.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,8 @@ Z80TargetLowering::Z80TargetLowering(const Z80TargetMachine &TM,
148148
setLibcall(RTLIB::BITREV_I24, "_ibitrev", CallingConv::Z80_LibCall );
149149
setLibcall(RTLIB::BITREV_I32, "_lbitrev", CallingConv::Z80_LibCall );
150150
setLibcall(RTLIB::BITREV_I64, "_llbitrev", CallingConv::Z80_LibCall );
151+
setLibcall(RTLIB::BSWAP_I32, "_lbswap", CallingConv::Z80_LibCall );
152+
setLibcall(RTLIB::BSWAP_I64, "_llbswap", CallingConv::Z80_LibCall );
151153

152154
setLibcall(RTLIB::ADD_F32, "_fadd", CallingConv::Z80_LibCall_L );
153155
setLibcall(RTLIB::SUB_F32, "_fsub", CallingConv::Z80_LibCall_L );

llvm/lib/Target/Z80/Z80InstrInfo.td

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1256,7 +1256,7 @@ def : Pat<(Z80tcret (texternalsym:$dst)), (TCRETURN24 texternalsym:$dst)>,
12561256
Requires<[In24BitMode]>;
12571257

12581258
//===----------------------------------------------------------------------===//
1259-
// Subsystems.
1259+
// Subreg Twiddling
12601260
//===----------------------------------------------------------------------===//
12611261

12621262
// anyext
@@ -1279,3 +1279,16 @@ def : Pat<(i24 (zext R16:$src)),
12791279
def : Pat<(i8 (trunc R16:$src)), (EXTRACT_SUBREG R16:$src, sub_low)>;
12801280
def : Pat<(i8 (trunc R24:$src)), (EXTRACT_SUBREG R24:$src, sub_low)>;
12811281
def : Pat<(i16 (trunc R24:$src)), (EXTRACT_SUBREG R24:$src, sub_short)>;
1282+
1283+
// shift
1284+
def : Pat<(shl R16:$src, (i8 8)),
1285+
(REG_SEQUENCE R16, (i8 (EXTRACT_SUBREG R16:$src, sub_low)), sub_high,
1286+
(LD8r0), sub_low)>;
1287+
def : Pat<(srl R16:$src, (i8 8)),
1288+
(REG_SEQUENCE R16, (LD8r0), sub_high,
1289+
(i8 (EXTRACT_SUBREG R16:$src, sub_high)), sub_low)>;
1290+
1291+
// bswap
1292+
def : Pat<(bswap R16:$src),
1293+
(REG_SEQUENCE R16, (i8 (EXTRACT_SUBREG R16:$src, sub_low)), sub_high,
1294+
(i8 (EXTRACT_SUBREG R16:$src, sub_high)), sub_low)>;

0 commit comments

Comments
 (0)