Skip to content

Commit 00df4d9

Browse files
committed
[mips] Implement sgt/sgtu pseudo instructions with immediate operand
The `sgt/sgtu Dst, Src1, Src2/Imm` pseudo instructions set register `Dst` to 1 if register `Src1` is greater than `Src2/Imm` and to 0 otherwise. Differential Revision: https://reviews.llvm.org/D64313 llvm-svn: 365475
1 parent 8447b41 commit 00df4d9

File tree

5 files changed

+135
-0
lines changed

5 files changed

+135
-0
lines changed

llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,9 @@ class MipsAsmParser : public MCTargetAsmParser {
275275
bool expandUxw(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out,
276276
const MCSubtargetInfo *STI);
277277

278+
bool expandSgtImm(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out,
279+
const MCSubtargetInfo *STI);
280+
278281
bool expandRotation(MCInst &Inst, SMLoc IDLoc,
279282
MCStreamer &Out, const MCSubtargetInfo *STI);
280283
bool expandRotationImm(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out,
@@ -2473,6 +2476,11 @@ MipsAsmParser::tryExpandInstruction(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out,
24732476
case Mips::NORImm:
24742477
case Mips::NORImm64:
24752478
return expandAliasImmediate(Inst, IDLoc, Out, STI) ? MER_Fail : MER_Success;
2479+
case Mips::SGTImm:
2480+
case Mips::SGTUImm:
2481+
case Mips::SGTImm64:
2482+
case Mips::SGTUImm64:
2483+
return expandSgtImm(Inst, IDLoc, Out, STI) ? MER_Fail : MER_Success;
24762484
case Mips::SLTImm64:
24772485
if (isInt<16>(Inst.getOperand(2).getImm())) {
24782486
Inst.setOpcode(Mips::SLTi64);
@@ -4285,6 +4293,53 @@ bool MipsAsmParser::expandUxw(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out,
42854293
return false;
42864294
}
42874295

4296+
bool MipsAsmParser::expandSgtImm(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out,
4297+
const MCSubtargetInfo *STI) {
4298+
MipsTargetStreamer &TOut = getTargetStreamer();
4299+
4300+
assert(Inst.getNumOperands() == 3 && "Invalid operand count");
4301+
assert(Inst.getOperand(0).isReg() &&
4302+
Inst.getOperand(1).isReg() &&
4303+
Inst.getOperand(2).isImm() && "Invalid instruction operand.");
4304+
4305+
unsigned DstReg = Inst.getOperand(0).getReg();
4306+
unsigned SrcReg = Inst.getOperand(1).getReg();
4307+
unsigned ImmReg = DstReg;
4308+
int64_t ImmValue = Inst.getOperand(2).getImm();
4309+
unsigned OpCode;
4310+
4311+
warnIfNoMacro(IDLoc);
4312+
4313+
switch (Inst.getOpcode()) {
4314+
case Mips::SGTImm:
4315+
case Mips::SGTImm64:
4316+
OpCode = Mips::SLT;
4317+
break;
4318+
case Mips::SGTUImm:
4319+
case Mips::SGTUImm64:
4320+
OpCode = Mips::SLTu;
4321+
break;
4322+
default:
4323+
llvm_unreachable("unexpected 'sgt' opcode with immediate");
4324+
}
4325+
4326+
if (DstReg == SrcReg) {
4327+
unsigned ATReg = getATReg(Inst.getLoc());
4328+
if (!ATReg)
4329+
return true;
4330+
ImmReg = ATReg;
4331+
}
4332+
4333+
if (loadImmediate(ImmValue, ImmReg, Mips::NoRegister, isInt<32>(ImmValue),
4334+
false, IDLoc, Out, STI))
4335+
return true;
4336+
4337+
// $SrcReg > $ImmReg is equal to $ImmReg < $SrcReg
4338+
TOut.emitRRR(OpCode, DstReg, ImmReg, SrcReg, IDLoc, STI);
4339+
4340+
return false;
4341+
}
4342+
42884343
bool MipsAsmParser::expandAliasImmediate(MCInst &Inst, SMLoc IDLoc,
42894344
MCStreamer &Out,
42904345
const MCSubtargetInfo *STI) {

llvm/lib/Target/Mips/Mips64InstrInfo.td

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1155,5 +1155,19 @@ def SLTUImm64 : MipsAsmPseudoInst<(outs GPR64Opnd:$rs),
11551155
def : MipsInstAlias<"sltu\t$rs, $imm", (SLTUImm64 GPR64Opnd:$rs, GPR64Opnd:$rs,
11561156
imm64:$imm)>, GPR_64;
11571157

1158+
def SGTImm64 : MipsAsmPseudoInst<(outs GPR64Opnd:$rd),
1159+
(ins GPR64Opnd:$rs, imm64:$imm),
1160+
"sgt\t$rd, $rs, $imm">, GPR_64;
1161+
def : MipsInstAlias<"sgt $rs, $imm", (SGTImm64 GPR64Opnd:$rs,
1162+
GPR64Opnd:$rs,
1163+
imm64:$imm), 0>, GPR_64;
1164+
1165+
def SGTUImm64 : MipsAsmPseudoInst<(outs GPR64Opnd:$rd),
1166+
(ins GPR64Opnd:$rs, imm64:$imm),
1167+
"sgtu\t$rd, $rs, $imm">, GPR_64;
1168+
def : MipsInstAlias<"sgtu $rs, $imm", (SGTUImm64 GPR64Opnd:$rs,
1169+
GPR64Opnd:$rs,
1170+
imm64:$imm), 0>, GPR_64;
1171+
11581172
def : MipsInstAlias<"rdhwr $rt, $rs",
11591173
(RDHWR64 GPR64Opnd:$rt, HWRegsOpnd:$rs, 0), 1>, GPR_64;

llvm/lib/Target/Mips/MipsInstrInfo.td

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2699,12 +2699,29 @@ let AdditionalPredicates = [NotInMicroMips] in {
26992699
def : MipsInstAlias<
27002700
"sgt $rs, $rt",
27012701
(SLT GPR32Opnd:$rs, GPR32Opnd:$rt, GPR32Opnd:$rs), 0>, ISA_MIPS1;
2702+
2703+
def SGTImm : MipsAsmPseudoInst<(outs GPR32Opnd:$rd),
2704+
(ins GPR32Opnd:$rs, simm32:$imm),
2705+
"sgt\t$rd, $rs, $imm">, GPR_32;
2706+
def : MipsInstAlias<"sgt $rs, $imm", (SGTImm GPR32Opnd:$rs,
2707+
GPR32Opnd:$rs,
2708+
simm32:$imm), 0>,
2709+
GPR_32;
27022710
def : MipsInstAlias<
27032711
"sgtu $rd, $rs, $rt",
27042712
(SLTu GPR32Opnd:$rd, GPR32Opnd:$rt, GPR32Opnd:$rs), 0>, ISA_MIPS1;
27052713
def : MipsInstAlias<
27062714
"sgtu $$rs, $rt",
27072715
(SLTu GPR32Opnd:$rs, GPR32Opnd:$rt, GPR32Opnd:$rs), 0>, ISA_MIPS1;
2716+
2717+
def SGTUImm : MipsAsmPseudoInst<(outs GPR32Opnd:$rd),
2718+
(ins GPR32Opnd:$rs, uimm32_coerced:$imm),
2719+
"sgtu\t$rd, $rs, $imm">, GPR_32;
2720+
def : MipsInstAlias<"sgtu $rs, $imm", (SGTUImm GPR32Opnd:$rs,
2721+
GPR32Opnd:$rs,
2722+
uimm32_coerced:$imm), 0>,
2723+
GPR_32;
2724+
27082725
def : MipsInstAlias<
27092726
"not $rt, $rs",
27102727
(NOR GPR32Opnd:$rt, GPR32Opnd:$rs, ZERO), 0>, ISA_MIPS1;

llvm/test/MC/Mips/macro-sgt.s

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# RUN: llvm-mc -arch=mips -show-encoding -mcpu=mips1 < %s | FileCheck %s
2+
# RUN: llvm-mc -arch=mips -show-encoding -mcpu=mips64 < %s | FileCheck %s
3+
4+
sgt $4, $5
5+
# CHECK: slt $4, $5, $4 # encoding: [0x00,0xa4,0x20,0x2a]
6+
sgt $4, $5, $6
7+
# CHECK: slt $4, $6, $5 # encoding: [0x00,0xc5,0x20,0x2a]
8+
sgt $4, $5, 16
9+
# CHECK: addiu $4, $zero, 16 # encoding: [0x24,0x04,0x00,0x10]
10+
# CHECK: slt $4, $4, $5 # encoding: [0x00,0x85,0x20,0x2a]
11+
sgtu $4, $5
12+
# CHECK: sltu $4, $5, $4 # encoding: [0x00,0xa4,0x20,0x2b]
13+
sgtu $4, $5, $6
14+
# CHECK: sltu $4, $6, $5 # encoding: [0x00,0xc5,0x20,0x2b]
15+
sgtu $4, $5, 16
16+
# CHECK: addiu $4, $zero, 16 # encoding: [0x24,0x04,0x00,0x10]
17+
# CHECK: sltu $4, $4, $5 # encoding: [0x00,0x85,0x20,0x2b]
18+
19+
sgt $4, 16
20+
# CHECK: addiu $1, $zero, 16 # encoding: [0x24,0x01,0x00,0x10]
21+
# CHECK: slt $4, $1, $4 # encoding: [0x00,0x24,0x20,0x2a]
22+
sgtu $4, 16
23+
# CHECK: addiu $1, $zero, 16 # encoding: [0x24,0x01,0x00,0x10]
24+
# CHECK: sltu $4, $1, $4 # encoding: [0x00,0x24,0x20,0x2b]

llvm/test/MC/Mips/macro-sgt64.s

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# RUN: not llvm-mc -arch=mips -mcpu=mips1 < %s 2>&1 \
2+
# RUN: | FileCheck --check-prefix=MIPS32 %s
3+
# RUN: llvm-mc -arch=mips -show-encoding -mcpu=mips64 < %s \
4+
# RUN: | FileCheck --check-prefix=MIPS64 %s
5+
6+
sgt $4, $5, 0x100000000
7+
# MIPS32: :[[@LINE-1]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
8+
# MIPS64: ori $4, $zero, 32768 # encoding: [0x34,0x04,0x80,0x00]
9+
# MIPS64: dsll $4, $4, 17 # encoding: [0x00,0x04,0x24,0x78]
10+
# MIPS64: slt $4, $4, $5 # encoding: [0x00,0x85,0x20,0x2a]
11+
sgtu $4, $5, 0x100000000
12+
# MIPS32: :[[@LINE-1]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
13+
# MIPS64: ori $4, $zero, 32768 # encoding: [0x34,0x04,0x80,0x00]
14+
# MIPS64: dsll $4, $4, 17 # encoding: [0x00,0x04,0x24,0x78]
15+
# MIPS64: sltu $4, $4, $5 # encoding: [0x00,0x85,0x20,0x2b]
16+
sgt $4, 0x100000000
17+
# MIPS32: :[[@LINE-1]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
18+
# MIPS64: ori $1, $zero, 32768 # encoding: [0x34,0x01,0x80,0x00]
19+
# MIPS64: dsll $1, $1, 17 # encoding: [0x00,0x01,0x0c,0x78]
20+
# MIPS64: slt $4, $1, $4 # encoding: [0x00,0x24,0x20,0x2a]
21+
sgtu $4, 0x100000000
22+
# MIPS32: :[[@LINE-1]]:{{[0-9]+}}: error: instruction requires a CPU feature not currently enabled
23+
# MIPS64: ori $1, $zero, 32768 # encoding: [0x34,0x01,0x80,0x00]
24+
# MIPS64: dsll $1, $1, 17 # encoding: [0x00,0x01,0x0c,0x78]
25+
# MIPS64: sltu $4, $1, $4 # encoding: [0x00,0x24,0x20,0x2b]

0 commit comments

Comments
 (0)