diff options
| author | Colin LeMahieu <colinl@codeaurora.org> | 2014-12-08 18:33:49 +0000 |
|---|---|---|
| committer | Colin LeMahieu <colinl@codeaurora.org> | 2014-12-08 18:33:49 +0000 |
| commit | cc46cd8eecca578d0166cab883f348d05898e541 (patch) | |
| tree | 65121dd88287849e894503edde46f36e6669d5cc /llvm/lib/Target | |
| parent | d5b3aa49acc264186efce781a0a4fb30fbfb9273 (diff) | |
| download | bcm5719-llvm-cc46cd8eecca578d0166cab883f348d05898e541.tar.gz bcm5719-llvm-cc46cd8eecca578d0166cab883f348d05898e541.zip | |
[Hexagon] Adding add/sub with saturation. Removing unused def. Cleaning up shift patterns.
llvm-svn: 223680
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/Hexagon/HexagonInstrInfo.td | 32 | ||||
| -rw-r--r-- | llvm/lib/Target/Hexagon/HexagonRegisterInfo.td | 6 |
2 files changed, 22 insertions, 16 deletions
diff --git a/llvm/lib/Target/Hexagon/HexagonInstrInfo.td b/llvm/lib/Target/Hexagon/HexagonInstrInfo.td index 99a02a9a233..70f07e6eea6 100644 --- a/llvm/lib/Target/Hexagon/HexagonInstrInfo.td +++ b/llvm/lib/Target/Hexagon/HexagonInstrInfo.td @@ -170,6 +170,18 @@ def A2_combine_lh : T_ALU32_combineh<".l", ".h", 0b011, 0b110, 1>; def A2_combine_ll : T_ALU32_combineh<".l", ".l", 0b011, 0b111, 1>; } +class T_ALU32_3op_sfx<string mnemonic, string suffix, bits<3> MajOp, + bits<3> MinOp, bit OpsRev, bit IsComm> + : T_ALU32_3op<"", MajOp, MinOp, OpsRev, IsComm> { + let AsmString = "$Rd = "#mnemonic#"($Rs, $Rt)"#suffix; +} + +let Defs = [USR_OVF], Itinerary = ALU32_3op_tc_2_SLOT0123, + isCodeGenOnly = 0 in { + def A2_addsat : T_ALU32_3op_sfx<"add", ":sat", 0b110, 0b010, 0, 1>; + def A2_subsat : T_ALU32_3op_sfx<"sub", ":sat", 0b110, 0b110, 1, 0>; +} + multiclass T_ALU32_3op_p<string mnemonic, bits<3> MajOp, bits<3> MinOp, bit OpsRev> { def t : T_ALU32_3op_pred<mnemonic, MajOp, MinOp, OpsRev, 0, 0>; @@ -834,11 +846,10 @@ multiclass ZXTB_base <string mnemonic, bits<3> minOp> { let isCodeGenOnly=0 in defm zxtb : ZXTB_base<"zxtb",0b100>, PredNewRel; -let hasSideEffects = 0 in -def COMBINE_ii : ALU32_ii<(outs DoubleRegs:$dst), - (ins s8Imm:$src1, s8Imm:$src2), - "$dst = combine(#$src1, #$src2)", - []>; +def: Pat<(shl I32:$src1, (i32 16)), (A2_aslh I32:$src1)>; +def: Pat<(sra I32:$src1, (i32 16)), (A2_asrh I32:$src1)>; +def: Pat<(sext_inreg I32:$src1, i8), (A2_sxtb I32:$src1)>; +def: Pat<(sext_inreg I32:$src1, i16), (A2_sxth I32:$src1)>; // Mux. def VMUX_prr64 : ALU64_rr<(outs DoubleRegs:$dst), (ins PredRegs:$src1, @@ -847,17 +858,6 @@ def VMUX_prr64 : ALU64_rr<(outs DoubleRegs:$dst), (ins PredRegs:$src1, "$dst = vmux($src1, $src2, $src3)", []>; -def : Pat <(shl (i32 IntRegs:$src1), (i32 16)), - (A2_aslh IntRegs:$src1)>; - -def : Pat <(sra (i32 IntRegs:$src1), (i32 16)), - (A2_asrh IntRegs:$src1)>; - -def : Pat <(sext_inreg (i32 IntRegs:$src1), i8), - (A2_sxtb IntRegs:$src1)>; - -def : Pat <(sext_inreg (i32 IntRegs:$src1), i16), - (A2_sxth IntRegs:$src1)>; //===----------------------------------------------------------------------===// // ALU32/PERM - diff --git a/llvm/lib/Target/Hexagon/HexagonRegisterInfo.td b/llvm/lib/Target/Hexagon/HexagonRegisterInfo.td index 97509842aca..70a1381b50b 100644 --- a/llvm/lib/Target/Hexagon/HexagonRegisterInfo.td +++ b/llvm/lib/Target/Hexagon/HexagonRegisterInfo.td @@ -97,6 +97,12 @@ let Namespace = "Hexagon" in { def P2 : Rp<2, "p2">, DwarfRegNum<[65]>; def P3 : Rp<3, "p3">, DwarfRegNum<[66]>; + // Fake register to represent USR.OVF bit. Artihmetic/saturating instruc- + // tions modify this bit, and multiple such instructions are allowed in the + // same packet. We need to ignore output dependencies on this bit, but not + // on the entire USR. + def USR_OVF : Rc<?, "usr.ovf">; + // Control registers. def SA0 : Rc<0, "sa0">, DwarfRegNum<[67]>; def LC0 : Rc<1, "lc0">, DwarfRegNum<[68]>; |

