diff options
| author | Dale Johannesen <dalej@apple.com> | 2009-09-18 20:15:22 +0000 | 
|---|---|---|
| committer | Dale Johannesen <dalej@apple.com> | 2009-09-18 20:15:22 +0000 | 
| commit | 5e9a5c3664038a61d210a1284aa403a2e2c2014c (patch) | |
| tree | 4979086ec1b3a84e36137d2f01d230a019725c7c /llvm/lib/Target/PowerPC | |
| parent | 82b688e4239347dfd4773cafef4918cdfe3694e1 (diff) | |
| download | bcm5719-llvm-5e9a5c3664038a61d210a1284aa403a2e2c2014c.tar.gz bcm5719-llvm-5e9a5c3664038a61d210a1284aa403a2e2c2014c.zip  | |
Model the carry bit on ppc32.  Without this we could
move a SUBFC (etc.) below the SUBFE (etc.) that consumed
the carry bit.  Add missing ADDIC8, noticed along the way.
llvm-svn: 82266
Diffstat (limited to 'llvm/lib/Target/PowerPC')
| -rw-r--r-- | llvm/lib/Target/PowerPC/PPCInstr64Bit.td | 44 | ||||
| -rw-r--r-- | llvm/lib/Target/PowerPC/PPCInstrInfo.td | 36 | ||||
| -rw-r--r-- | llvm/lib/Target/PowerPC/PPCRegisterInfo.td | 8 | 
3 files changed, 60 insertions, 28 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCInstr64Bit.td b/llvm/lib/Target/PowerPC/PPCInstr64Bit.td index 85524cef01c..0f68fb939dc 100644 --- a/llvm/lib/Target/PowerPC/PPCInstr64Bit.td +++ b/llvm/lib/Target/PowerPC/PPCInstr64Bit.td @@ -68,7 +68,7 @@ let isCall = 1, PPC970_Unit = 7,            F0,F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12,F13,            V0,V1,V2,V3,V4,V5,V6,V7,V8,V9,V10,V11,V12,V13,V14,V15,V16,V17,V18,V19,            LR8,CTR8, -          CR0,CR1,CR5,CR6,CR7] in { +          CR0,CR1,CR5,CR6,CR7,CARRY] in {    // Convenient aliases for call instructions    let Uses = [RM] in {      def BL8_Darwin  : IForm<18, 0, 1, @@ -94,7 +94,7 @@ let isCall = 1, PPC970_Unit = 7,            F0,F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12,F13,            V0,V1,V2,V3,V4,V5,V6,V7,V8,V9,V10,V11,V12,V13,V14,V15,V16,V17,V18,V19,            LR8,CTR8, -          CR0,CR1,CR5,CR6,CR7] in { +          CR0,CR1,CR5,CR6,CR7,CARRY] in {    // Convenient aliases for call instructions    let Uses = [RM] in {      def BL8_ELF  : IForm<18, 0, 1, @@ -329,14 +329,15 @@ def ADD8  : XOForm_1<31, 266, 0, (outs G8RC:$rT), (ins G8RC:$rA, G8RC:$rB),                       "add $rT, $rA, $rB", IntGeneral,                       [(set G8RC:$rT, (add G8RC:$rA, G8RC:$rB))]>; +let Defs = [CARRY] in {  def ADDC8 : XOForm_1<31, 10, 0, (outs G8RC:$rT), (ins G8RC:$rA, G8RC:$rB),                       "addc $rT, $rA, $rB", IntGeneral,                       [(set G8RC:$rT, (addc G8RC:$rA, G8RC:$rB))]>,                       PPC970_DGroup_Cracked; -def ADDE8 : XOForm_1<31, 138, 0, (outs G8RC:$rT), (ins G8RC:$rA, G8RC:$rB), -                     "adde $rT, $rA, $rB", IntGeneral, -                     [(set G8RC:$rT, (adde G8RC:$rA, G8RC:$rB))]>; -                      +def ADDIC8 : DForm_2<12, (outs G8RC:$rD), (ins G8RC:$rA, s16imm64:$imm), +                     "addic $rD, $rA, $imm", IntGeneral, +                     [(set G8RC:$rD, (addc G8RC:$rA, immSExt16:$imm))]>; +}  def ADDI8  : DForm_2<14, (outs G8RC:$rD), (ins G8RC:$rA, s16imm64:$imm),                       "addi $rD, $rA, $imm", IntGeneral,                       [(set G8RC:$rD, (add G8RC:$rA, immSExt16:$imm))]>; @@ -344,36 +345,41 @@ def ADDIS8 : DForm_2<15, (outs G8RC:$rD), (ins G8RC:$rA, symbolHi64:$imm),                       "addis $rD, $rA, $imm", IntGeneral,                       [(set G8RC:$rD, (add G8RC:$rA, imm16ShiftedSExt:$imm))]>; +let Defs = [CARRY] in {  def SUBFIC8: DForm_2< 8, (outs G8RC:$rD), (ins G8RC:$rA, s16imm64:$imm),                       "subfic $rD, $rA, $imm", IntGeneral,                       [(set G8RC:$rD, (subc immSExt16:$imm, G8RC:$rA))]>; -def SUBF8 : XOForm_1<31, 40, 0, (outs G8RC:$rT), (ins G8RC:$rA, G8RC:$rB), -                     "subf $rT, $rA, $rB", IntGeneral, -                     [(set G8RC:$rT, (sub G8RC:$rB, G8RC:$rA))]>;  def SUBFC8 : XOForm_1<31, 8, 0, (outs G8RC:$rT), (ins G8RC:$rA, G8RC:$rB),                        "subfc $rT, $rA, $rB", IntGeneral,                        [(set G8RC:$rT, (subc G8RC:$rB, G8RC:$rA))]>,                        PPC970_DGroup_Cracked; - -def SUBFE8 : XOForm_1<31, 136, 0, (outs G8RC:$rT), (ins G8RC:$rA, G8RC:$rB), -                      "subfe $rT, $rA, $rB", IntGeneral, -                      [(set G8RC:$rT, (sube G8RC:$rB, G8RC:$rA))]>; +} +def SUBF8 : XOForm_1<31, 40, 0, (outs G8RC:$rT), (ins G8RC:$rA, G8RC:$rB), +                     "subf $rT, $rA, $rB", IntGeneral, +                     [(set G8RC:$rT, (sub G8RC:$rB, G8RC:$rA))]>; +def NEG8    : XOForm_3<31, 104, 0, (outs G8RC:$rT), (ins G8RC:$rA), +                       "neg $rT, $rA", IntGeneral, +                       [(set G8RC:$rT, (ineg G8RC:$rA))]>; +let Uses = [CARRY], Defs = [CARRY] in { +def ADDE8   : XOForm_1<31, 138, 0, (outs G8RC:$rT), (ins G8RC:$rA, G8RC:$rB), +                       "adde $rT, $rA, $rB", IntGeneral, +                       [(set G8RC:$rT, (adde G8RC:$rA, G8RC:$rB))]>;  def ADDME8  : XOForm_3<31, 234, 0, (outs G8RC:$rT), (ins G8RC:$rA),                         "addme $rT, $rA", IntGeneral,                         [(set G8RC:$rT, (adde G8RC:$rA, immAllOnes))]>;  def ADDZE8  : XOForm_3<31, 202, 0, (outs G8RC:$rT), (ins G8RC:$rA),                         "addze $rT, $rA", IntGeneral,                         [(set G8RC:$rT, (adde G8RC:$rA, 0))]>; -def NEG8    : XOForm_3<31, 104, 0, (outs G8RC:$rT), (ins G8RC:$rA), -                       "neg $rT, $rA", IntGeneral, -                       [(set G8RC:$rT, (ineg G8RC:$rA))]>; +def SUBFE8  : XOForm_1<31, 136, 0, (outs G8RC:$rT), (ins G8RC:$rA, G8RC:$rB), +                       "subfe $rT, $rA, $rB", IntGeneral, +                       [(set G8RC:$rT, (sube G8RC:$rB, G8RC:$rA))]>;  def SUBFME8 : XOForm_3<31, 232, 0, (outs G8RC:$rT), (ins G8RC:$rA),                         "subfme $rT, $rA", IntGeneral,                         [(set G8RC:$rT, (sube immAllOnes, G8RC:$rA))]>;  def SUBFZE8 : XOForm_3<31, 200, 0, (outs G8RC:$rT), (ins G8RC:$rA),                         "subfze $rT, $rA", IntGeneral,                         [(set G8RC:$rT, (sube 0, G8RC:$rA))]>; - +}  def MULHD : XOForm_1<31, 73, 0, (outs G8RC:$rT), (ins G8RC:$rA, G8RC:$rB), @@ -398,9 +404,11 @@ def SLD  : XForm_6<31,  27, (outs G8RC:$rA), (ins G8RC:$rS, GPRC:$rB),  def SRD  : XForm_6<31, 539, (outs G8RC:$rA), (ins G8RC:$rS, GPRC:$rB),                     "srd $rA, $rS, $rB", IntRotateD,                     [(set G8RC:$rA, (PPCsrl G8RC:$rS, GPRC:$rB))]>, isPPC64; +let Defs = [CARRY] in {  def SRAD : XForm_6<31, 794, (outs G8RC:$rA), (ins G8RC:$rS, GPRC:$rB),                     "srad $rA, $rS, $rB", IntRotateD,                     [(set G8RC:$rA, (PPCsra G8RC:$rS, GPRC:$rB))]>, isPPC64; +}  def EXTSB8 : XForm_11<31, 954, (outs G8RC:$rA), (ins G8RC:$rS),                        "extsb $rA, $rS", IntGeneral, @@ -420,9 +428,11 @@ def EXTSW_32_64 : XForm_11<31, 986, (outs G8RC:$rA), (ins GPRC:$rS),                        "extsw $rA, $rS", IntGeneral,                        [(set G8RC:$rA, (sext GPRC:$rS))]>, isPPC64; +let Defs = [CARRY] in {  def SRADI  : XSForm_1<31, 413, (outs G8RC:$rA), (ins G8RC:$rS, u6imm:$SH),                        "sradi $rA, $rS, $SH", IntRotateD,                        [(set G8RC:$rA, (sra G8RC:$rS, (i32 imm:$SH)))]>, isPPC64; +}  def CNTLZD : XForm_11<31, 58, (outs G8RC:$rA), (ins G8RC:$rS),                        "cntlzd $rA, $rS", IntGeneral,                        [(set G8RC:$rA, (ctlz G8RC:$rS))]>; diff --git a/llvm/lib/Target/PowerPC/PPCInstrInfo.td b/llvm/lib/Target/PowerPC/PPCInstrInfo.td index 3c32c4abfc6..2f9cba2ddbd 100644 --- a/llvm/lib/Target/PowerPC/PPCInstrInfo.td +++ b/llvm/lib/Target/PowerPC/PPCInstrInfo.td @@ -426,7 +426,7 @@ let isCall = 1, PPC970_Unit = 7,            LR,CTR,            CR0,CR1,CR5,CR6,CR7,            CR0LT,CR0GT,CR0EQ,CR0UN,CR1LT,CR1GT,CR1EQ,CR1UN,CR5LT,CR5GT,CR5EQ, -          CR5UN,CR6LT,CR6GT,CR6EQ,CR6UN,CR7LT,CR7GT,CR7EQ,CR7UN] in { +          CR5UN,CR6LT,CR6GT,CR6EQ,CR6UN,CR7LT,CR7GT,CR7EQ,CR7UN,CARRY] in {    // Convenient aliases for call instructions    let Uses = [RM] in {      def BL_Darwin  : IForm<18, 0, 1, @@ -453,7 +453,7 @@ let isCall = 1, PPC970_Unit = 7,            LR,CTR,            CR0,CR1,CR5,CR6,CR7,            CR0LT,CR0GT,CR0EQ,CR0UN,CR1LT,CR1GT,CR1EQ,CR1UN,CR5LT,CR5GT,CR5EQ, -          CR5UN,CR6LT,CR6GT,CR6EQ,CR6UN,CR7LT,CR7GT,CR7EQ,CR7UN] in { +          CR5UN,CR6LT,CR6GT,CR6EQ,CR6UN,CR7LT,CR7GT,CR7EQ,CR7UN,CARRY] in {    // Convenient aliases for call instructions    let Uses = [RM] in {      def BL_SVR4  : IForm<18, 0, 1, @@ -869,6 +869,7 @@ let PPC970_Unit = 1 in {  // FXU Operations.  def ADDI   : DForm_2<14, (outs GPRC:$rD), (ins GPRC:$rA, s16imm:$imm),                       "addi $rD, $rA, $imm", IntGeneral,                       [(set GPRC:$rD, (add GPRC:$rA, immSExt16:$imm))]>; +let Defs = [CARRY] in {  def ADDIC  : DForm_2<12, (outs GPRC:$rD), (ins GPRC:$rA, s16imm:$imm),                       "addic $rD, $rA, $imm", IntGeneral,                       [(set GPRC:$rD, (addc GPRC:$rA, immSExt16:$imm))]>, @@ -876,6 +877,7 @@ def ADDIC  : DForm_2<12, (outs GPRC:$rD), (ins GPRC:$rA, s16imm:$imm),  def ADDICo : DForm_2<13, (outs GPRC:$rD), (ins GPRC:$rA, s16imm:$imm),                       "addic. $rD, $rA, $imm", IntGeneral,                       []>; +}  def ADDIS  : DForm_2<15, (outs GPRC:$rD), (ins GPRC:$rA, symbolHi:$imm),                       "addis $rD, $rA, $imm", IntGeneral,                       [(set GPRC:$rD, (add GPRC:$rA, imm16ShiftedSExt:$imm))]>; @@ -886,9 +888,11 @@ def LA     : DForm_2<14, (outs GPRC:$rD), (ins GPRC:$rA, symbolLo:$sym),  def MULLI  : DForm_2< 7, (outs GPRC:$rD), (ins GPRC:$rA, s16imm:$imm),                       "mulli $rD, $rA, $imm", IntMulLI,                       [(set GPRC:$rD, (mul GPRC:$rA, immSExt16:$imm))]>; +let Defs = [CARRY] in {  def SUBFIC : DForm_2< 8, (outs GPRC:$rD), (ins GPRC:$rA, s16imm:$imm),                       "subfic $rD, $rA, $imm", IntGeneral,                       [(set GPRC:$rD, (subc immSExt16:$imm, GPRC:$rA))]>; +}  let isReMaterializable = 1 in {    def LI  : DForm_2_r0<14, (outs GPRC:$rD), (ins symbolLo:$imm), @@ -961,15 +965,19 @@ def SLW  : XForm_6<31,  24, (outs GPRC:$rA), (ins GPRC:$rS, GPRC:$rB),  def SRW  : XForm_6<31, 536, (outs GPRC:$rA), (ins GPRC:$rS, GPRC:$rB),                     "srw $rA, $rS, $rB", IntGeneral,                     [(set GPRC:$rA, (PPCsrl GPRC:$rS, GPRC:$rB))]>; +let Defs = [CARRY] in {  def SRAW : XForm_6<31, 792, (outs GPRC:$rA), (ins GPRC:$rS, GPRC:$rB),                     "sraw $rA, $rS, $rB", IntShift,                     [(set GPRC:$rA, (PPCsra GPRC:$rS, GPRC:$rB))]>;  } +}  let PPC970_Unit = 1 in {  // FXU Operations. +let Defs = [CARRY] in {  def SRAWI : XForm_10<31, 824, (outs GPRC:$rA), (ins GPRC:$rS, u5imm:$SH),                        "srawi $rA, $rS, $SH", IntShift,                       [(set GPRC:$rA, (sra GPRC:$rS, (i32 imm:$SH)))]>; +}  def CNTLZW : XForm_11<31,  26, (outs GPRC:$rA), (ins GPRC:$rS),                        "cntlzw $rA, $rS", IntGeneral,                        [(set GPRC:$rA, (ctlz GPRC:$rS))]>; @@ -1164,13 +1172,12 @@ let PPC970_Unit = 1 in {  // FXU Operations.  def ADD4  : XOForm_1<31, 266, 0, (outs GPRC:$rT), (ins GPRC:$rA, GPRC:$rB),                       "add $rT, $rA, $rB", IntGeneral,                       [(set GPRC:$rT, (add GPRC:$rA, GPRC:$rB))]>; +let Defs = [CARRY] in {  def ADDC  : XOForm_1<31, 10, 0, (outs GPRC:$rT), (ins GPRC:$rA, GPRC:$rB),                       "addc $rT, $rA, $rB", IntGeneral,                       [(set GPRC:$rT, (addc GPRC:$rA, GPRC:$rB))]>,                       PPC970_DGroup_Cracked; -def ADDE  : XOForm_1<31, 138, 0, (outs GPRC:$rT), (ins GPRC:$rA, GPRC:$rB), -                     "adde $rT, $rA, $rB", IntGeneral, -                     [(set GPRC:$rT, (adde GPRC:$rA, GPRC:$rB))]>; +}  def DIVW  : XOForm_1<31, 491, 0, (outs GPRC:$rT), (ins GPRC:$rA, GPRC:$rB),                       "divw $rT, $rA, $rB", IntDivW,                       [(set GPRC:$rT, (sdiv GPRC:$rA, GPRC:$rB))]>, @@ -1191,22 +1198,28 @@ def MULLW : XOForm_1<31, 235, 0, (outs GPRC:$rT), (ins GPRC:$rA, GPRC:$rB),  def SUBF  : XOForm_1<31, 40, 0, (outs GPRC:$rT), (ins GPRC:$rA, GPRC:$rB),                       "subf $rT, $rA, $rB", IntGeneral,                       [(set GPRC:$rT, (sub GPRC:$rB, GPRC:$rA))]>; +let Defs = [CARRY] in {  def SUBFC : XOForm_1<31, 8, 0, (outs GPRC:$rT), (ins GPRC:$rA, GPRC:$rB),                       "subfc $rT, $rA, $rB", IntGeneral,                       [(set GPRC:$rT, (subc GPRC:$rB, GPRC:$rA))]>,                       PPC970_DGroup_Cracked; -def SUBFE : XOForm_1<31, 136, 0, (outs GPRC:$rT), (ins GPRC:$rA, GPRC:$rB), -                     "subfe $rT, $rA, $rB", IntGeneral, -                     [(set GPRC:$rT, (sube GPRC:$rB, GPRC:$rA))]>; +} +def NEG    : XOForm_3<31, 104, 0, (outs GPRC:$rT), (ins GPRC:$rA), +                      "neg $rT, $rA", IntGeneral, +                      [(set GPRC:$rT, (ineg GPRC:$rA))]>; +let Uses = [CARRY], Defs = [CARRY] in { +def ADDE  : XOForm_1<31, 138, 0, (outs GPRC:$rT), (ins GPRC:$rA, GPRC:$rB), +                      "adde $rT, $rA, $rB", IntGeneral, +                      [(set GPRC:$rT, (adde GPRC:$rA, GPRC:$rB))]>;  def ADDME  : XOForm_3<31, 234, 0, (outs GPRC:$rT), (ins GPRC:$rA),                        "addme $rT, $rA", IntGeneral,                        [(set GPRC:$rT, (adde GPRC:$rA, immAllOnes))]>;  def ADDZE  : XOForm_3<31, 202, 0, (outs GPRC:$rT), (ins GPRC:$rA),                        "addze $rT, $rA", IntGeneral,                        [(set GPRC:$rT, (adde GPRC:$rA, 0))]>; -def NEG    : XOForm_3<31, 104, 0, (outs GPRC:$rT), (ins GPRC:$rA), -                      "neg $rT, $rA", IntGeneral, -                      [(set GPRC:$rT, (ineg GPRC:$rA))]>; +def SUBFE : XOForm_1<31, 136, 0, (outs GPRC:$rT), (ins GPRC:$rA, GPRC:$rB), +                      "subfe $rT, $rA, $rB", IntGeneral, +                      [(set GPRC:$rT, (sube GPRC:$rB, GPRC:$rA))]>;  def SUBFME : XOForm_3<31, 232, 0, (outs GPRC:$rT), (ins GPRC:$rA),                        "subfme $rT, $rA", IntGeneral,                        [(set GPRC:$rT, (sube immAllOnes, GPRC:$rA))]>; @@ -1214,6 +1227,7 @@ def SUBFZE : XOForm_3<31, 200, 0, (outs GPRC:$rT), (ins GPRC:$rA),                        "subfze $rT, $rA", IntGeneral,                        [(set GPRC:$rT, (sube 0, GPRC:$rA))]>;  } +}  // A-Form instructions.  Most of the instructions executed in the FPU are of  // this type. diff --git a/llvm/lib/Target/PowerPC/PPCRegisterInfo.td b/llvm/lib/Target/PowerPC/PPCRegisterInfo.td index 140f5df3e6a..049e893e82e 100644 --- a/llvm/lib/Target/PowerPC/PPCRegisterInfo.td +++ b/llvm/lib/Target/PowerPC/PPCRegisterInfo.td @@ -255,6 +255,11 @@ def CTR8 : SPR<9, "ctr">, DwarfRegNum<[66]>;  // VRsave register  def VRSAVE: SPR<256, "VRsave">, DwarfRegNum<[107]>; +// Carry bit.  In the architecture this is really bit 0 of the XER register +// (which really is SPR register 1);  this is the only bit interesting to a +// compiler. +def CARRY: SPR<1, "ca">, DwarfRegNum<[0]>; +  // FP rounding mode:  bits 30 and 31 of the FP status and control register  // This is not allocated as a normal register; it appears only in  // Uses and Defs.  The ABI says it needs to be preserved by a function, @@ -377,3 +382,6 @@ def CRRC : RegisterClass<"PPC", [i32], 32, [CR0, CR1, CR5, CR6, CR7, CR2,  def CTRRC : RegisterClass<"PPC", [i32], 32, [CTR]>;  def CTRRC8 : RegisterClass<"PPC", [i64], 64, [CTR8]>;  def VRSAVERC : RegisterClass<"PPC", [i32], 32, [VRSAVE]>; +def CARRYRC : RegisterClass<"PPC", [i32], 32, [CARRY]> { +  let CopyCost = -1; +}  | 

