diff options
| -rw-r--r-- | llvm/lib/Target/R600/AMDGPUISelLowering.cpp | 16 | ||||
| -rw-r--r-- | llvm/lib/Target/R600/EvergreenInstructions.td | 7 | ||||
| -rw-r--r-- | llvm/lib/Target/R600/R600ISelLowering.cpp | 24 | ||||
| -rw-r--r-- | llvm/lib/Target/R600/SIISelLowering.cpp | 16 | 
4 files changed, 47 insertions, 16 deletions
diff --git a/llvm/lib/Target/R600/AMDGPUISelLowering.cpp b/llvm/lib/Target/R600/AMDGPUISelLowering.cpp index b87a06e9344..2e7e7584a9d 100644 --- a/llvm/lib/Target/R600/AMDGPUISelLowering.cpp +++ b/llvm/lib/Target/R600/AMDGPUISelLowering.cpp @@ -212,22 +212,6 @@ AMDGPUTargetLowering::AMDGPUTargetLowering(TargetMachine &TM) :      setOperationAction(ISD::SELECT, VT, Expand);    } -  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i1, Custom); -  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::v2i1, Custom); -  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::v4i1, Custom); - -  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i8, Custom); -  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::v2i8, Custom); -  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::v4i8, Custom); - -  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i16, Custom); -  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::v2i16, Custom); -  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::v4i16, Custom); - -  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i32, Custom); - -  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::Other, Custom); -    setTargetDAGCombine(ISD::MUL);  } diff --git a/llvm/lib/Target/R600/EvergreenInstructions.td b/llvm/lib/Target/R600/EvergreenInstructions.td index 7153b70b531..d9931c81d62 100644 --- a/llvm/lib/Target/R600/EvergreenInstructions.td +++ b/llvm/lib/Target/R600/EvergreenInstructions.td @@ -286,6 +286,13 @@ def BFI_INT_eg : R600_3OP <0x06, "BFI_INT",    VecALU  >; +def : Pat<(i32 (sext_inreg i32:$src, i1)), +  (BFE_INT_eg i32:$src, (i32 ZERO), (i32 ONE_INT))>; +def : Pat<(i32 (sext_inreg i32:$src, i8)), +  (BFE_INT_eg i32:$src, (i32 ZERO), (MOV_IMM_I32 8))>; +def : Pat<(i32 (sext_inreg i32:$src, i16)), +  (BFE_INT_eg i32:$src, (i32 ZERO), (MOV_IMM_I32 16))>; +  defm : BFIPatterns <BFI_INT_eg>;  def BFM_INT_eg : R600_2OP <0xA0, "BFM_INT", diff --git a/llvm/lib/Target/R600/R600ISelLowering.cpp b/llvm/lib/Target/R600/R600ISelLowering.cpp index 489e63aa45b..37cac8960c9 100644 --- a/llvm/lib/Target/R600/R600ISelLowering.cpp +++ b/llvm/lib/Target/R600/R600ISelLowering.cpp @@ -86,6 +86,30 @@ R600TargetLowering::R600TargetLowering(TargetMachine &TM) :    setOperationAction(ISD::SELECT, MVT::v4i32, Expand);    setOperationAction(ISD::SELECT, MVT::v4f32, Expand); +  // Expand sign extension of vectors +  if (!Subtarget->hasBFE()) +    setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i1, Expand); + +  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::v2i1, Expand); +  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::v4i1, Expand); + +  if (!Subtarget->hasBFE()) +    setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i8, Expand); +  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::v2i8, Expand); +  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::v4i8, Expand); + +  if (!Subtarget->hasBFE()) +    setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i16, Expand); +  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::v2i16, Expand); +  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::v4i16, Expand); + +  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i32, Legal); +  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::v2i32, Expand); +  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::v4i32, Expand); + +  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::Other, Expand); + +    // Legalize loads and stores to the private address space.    setOperationAction(ISD::LOAD, MVT::i32, Custom);    setOperationAction(ISD::LOAD, MVT::v2i32, Custom); diff --git a/llvm/lib/Target/R600/SIISelLowering.cpp b/llvm/lib/Target/R600/SIISelLowering.cpp index 223e076d151..8c3b9bbb764 100644 --- a/llvm/lib/Target/R600/SIISelLowering.cpp +++ b/llvm/lib/Target/R600/SIISelLowering.cpp @@ -119,6 +119,22 @@ SITargetLowering::SITargetLowering(TargetMachine &TM) :    setOperationAction(ISD::SIGN_EXTEND, MVT::i64, Custom);    setOperationAction(ISD::ZERO_EXTEND, MVT::i64, Custom); +  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i1, Custom); +  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::v2i1, Custom); +  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::v4i1, Custom); + +  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i8, Custom); +  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::v2i8, Custom); +  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::v4i8, Custom); + +  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i16, Custom); +  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::v2i16, Custom); +  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::v4i16, Custom); + +  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i32, Custom); + +  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::Other, Custom); +    setOperationAction(ISD::INTRINSIC_WO_CHAIN, MVT::Other, Custom);    setOperationAction(ISD::INTRINSIC_WO_CHAIN, MVT::f32, Custom);    setOperationAction(ISD::INTRINSIC_WO_CHAIN, MVT::v16i8, Custom);  | 

