[PowerPC] Add extended subtract mnemonics

This adds support for the extended subtract mnemonics to the asm parser:
   subi
   subis
   subic
   subic.
   sub
   sub.
   subc
   subc.
 

llvm-svn: 184832
This commit is contained in:
Ulrich Weigand 2013-06-25 13:16:48 +00:00
parent aaaf28971d
commit 4069e24bd3
3 changed files with 73 additions and 1 deletions
llvm
lib/Target/PowerPC
test/MC/PowerPC

View File

@ -432,6 +432,46 @@ ProcessInstruction(MCInst &Inst,
Inst = TmpInst; Inst = TmpInst;
break; break;
} }
case PPC::SUBI: {
MCInst TmpInst;
int64_t N = Inst.getOperand(2).getImm();
TmpInst.setOpcode(PPC::ADDI);
TmpInst.addOperand(Inst.getOperand(0));
TmpInst.addOperand(Inst.getOperand(1));
TmpInst.addOperand(MCOperand::CreateImm(-N));
Inst = TmpInst;
break;
}
case PPC::SUBIS: {
MCInst TmpInst;
int64_t N = Inst.getOperand(2).getImm();
TmpInst.setOpcode(PPC::ADDIS);
TmpInst.addOperand(Inst.getOperand(0));
TmpInst.addOperand(Inst.getOperand(1));
TmpInst.addOperand(MCOperand::CreateImm(-N));
Inst = TmpInst;
break;
}
case PPC::SUBIC: {
MCInst TmpInst;
int64_t N = Inst.getOperand(2).getImm();
TmpInst.setOpcode(PPC::ADDIC);
TmpInst.addOperand(Inst.getOperand(0));
TmpInst.addOperand(Inst.getOperand(1));
TmpInst.addOperand(MCOperand::CreateImm(-N));
Inst = TmpInst;
break;
}
case PPC::SUBICo: {
MCInst TmpInst;
int64_t N = Inst.getOperand(2).getImm();
TmpInst.setOpcode(PPC::ADDICo);
TmpInst.addOperand(Inst.getOperand(0));
TmpInst.addOperand(Inst.getOperand(1));
TmpInst.addOperand(MCOperand::CreateImm(-N));
Inst = TmpInst;
break;
}
case PPC::SLWI: { case PPC::SLWI: {
MCInst TmpInst; MCInst TmpInst;
int64_t N = Inst.getOperand(2).getImm(); int64_t N = Inst.getOperand(2).getImm();

View File

@ -2276,6 +2276,20 @@ def : InstAlias<"not. $rA, $rB", (NOR8o g8rc:$rA, g8rc:$rB, g8rc:$rB)>;
def LAx : PPCAsmPseudo<"la $rA, $addr", (ins gprc:$rA, memri:$addr)>; def LAx : PPCAsmPseudo<"la $rA, $addr", (ins gprc:$rA, memri:$addr)>;
def SUBI : PPCAsmPseudo<"subi $rA, $rB, $imm",
(ins gprc:$rA, gprc:$rB, s16imm:$imm)>;
def SUBIS : PPCAsmPseudo<"subis $rA, $rB, $imm",
(ins gprc:$rA, gprc:$rB, s16imm:$imm)>;
def SUBIC : PPCAsmPseudo<"subic $rA, $rB, $imm",
(ins gprc:$rA, gprc:$rB, s16imm:$imm)>;
def SUBICo : PPCAsmPseudo<"subic. $rA, $rB, $imm",
(ins gprc:$rA, gprc:$rB, s16imm:$imm)>;
def : InstAlias<"sub $rA, $rB, $rC", (SUBF8 g8rc:$rA, g8rc:$rC, g8rc:$rB)>;
def : InstAlias<"sub. $rA, $rB, $rC", (SUBF8o g8rc:$rA, g8rc:$rC, g8rc:$rB)>;
def : InstAlias<"subc $rA, $rB, $rC", (SUBFC8 g8rc:$rA, g8rc:$rC, g8rc:$rB)>;
def : InstAlias<"subc. $rA, $rB, $rC", (SUBFC8o g8rc:$rA, g8rc:$rC, g8rc:$rB)>;
def SLWI : PPCAsmPseudo<"slwi $rA, $rS, $n", def SLWI : PPCAsmPseudo<"slwi $rA, $rS, $n",
(ins gprc:$rA, gprc:$rS, u5imm:$n)>; (ins gprc:$rA, gprc:$rS, u5imm:$n)>;
def SRWI : PPCAsmPseudo<"srwi $rA, $rS, $n", def SRWI : PPCAsmPseudo<"srwi $rA, $rS, $n",

View File

@ -1788,7 +1788,25 @@
# FIXME: Condition register logical mnemonics # FIXME: Condition register logical mnemonics
# FIXME: Subtract mnemonics # Subtract mnemonics
# CHECK: addi 2, 3, -128 # encoding: [0x38,0x43,0xff,0x80]
subi 2, 3, 128
# CHECK: addis 2, 3, -128 # encoding: [0x3c,0x43,0xff,0x80]
subis 2, 3, 128
# CHECK: addic 2, 3, -128 # encoding: [0x30,0x43,0xff,0x80]
subic 2, 3, 128
# CHECK: addic. 2, 3, -128 # encoding: [0x34,0x43,0xff,0x80]
subic. 2, 3, 128
# CHECK: subf 2, 4, 3 # encoding: [0x7c,0x44,0x18,0x50]
sub 2, 3, 4
# CHECK: subf. 2, 4, 3 # encoding: [0x7c,0x44,0x18,0x51]
sub. 2, 3, 4
# CHECK: subfc 2, 4, 3 # encoding: [0x7c,0x44,0x18,0x10]
subc 2, 3, 4
# CHECK: subfc. 2, 4, 3 # encoding: [0x7c,0x44,0x18,0x11]
subc. 2, 3, 4
# Compare mnemonics # Compare mnemonics