summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target
diff options
context:
space:
mode:
authorAnton Korobeynikov <asl@math.spbu.ru>2009-07-16 14:27:01 +0000
committerAnton Korobeynikov <asl@math.spbu.ru>2009-07-16 14:27:01 +0000
commit6c01db428f18a0f3386db40f8d7ef7e543838501 (patch)
tree721a3f41fb16291bb5fc660ce96e1b4b2a572009 /llvm/lib/Target
parent70d0bceed6519d1b481c79f493e99f8ceab44ad9 (diff)
downloadbcm5719-llvm-6c01db428f18a0f3386db40f8d7ef7e543838501.tar.gz
bcm5719-llvm-6c01db428f18a0f3386db40f8d7ef7e543838501.zip
Handle bitconverts
llvm-svn: 76042
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r--llvm/lib/Target/SystemZ/SystemZISelLowering.cpp4
-rw-r--r--llvm/lib/Target/SystemZ/SystemZInstrFP.td7
-rw-r--r--llvm/lib/Target/SystemZ/SystemZInstrInfo.td9
3 files changed, 16 insertions, 4 deletions
diff --git a/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp b/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp
index 757255e3ebb..05797c81ab9 100644
--- a/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp
+++ b/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp
@@ -129,6 +129,10 @@ SystemZTargetLowering::SystemZTargetLowering(SystemZTargetMachine &tm) :
setOperationAction(ISD::FCOS, MVT::f32, Expand);
setOperationAction(ISD::FCOS, MVT::f64, Expand);
+ // We have only 64-bit bitconverts
+ setOperationAction(ISD::BIT_CONVERT, MVT::f32, Promote);
+ setOperationAction(ISD::BIT_CONVERT, MVT::i32, Promote);
+
setOperationAction(ISD::UINT_TO_FP, MVT::i32, Expand);
setOperationAction(ISD::UINT_TO_FP, MVT::i64, Expand);
setOperationAction(ISD::FP_TO_UINT, MVT::i32, Expand);
diff --git a/llvm/lib/Target/SystemZ/SystemZInstrFP.td b/llvm/lib/Target/SystemZ/SystemZInstrFP.td
index 9e367fe43a5..5972264d1e7 100644
--- a/llvm/lib/Target/SystemZ/SystemZInstrFP.td
+++ b/llvm/lib/Target/SystemZ/SystemZInstrFP.td
@@ -295,6 +295,13 @@ def FCONVGR64 : Pseudo<(outs GR64:$dst), (ins FP64:$src),
(implicit PSW)]>;
} // Defs = [PSW]
+def FBCONVG64 : Pseudo<(outs GR64:$dst), (ins FP64:$src),
+ "lgdr\t{$dst, $src}",
+ [(set GR64:$dst, (bitconvert FP64:$src))]>;
+def FBCONVF64 : Pseudo<(outs FP64:$dst), (ins GR64:$src),
+ "ldgr\t{$dst, $src}",
+ [(set FP64:$dst, (bitconvert GR64:$src))]>;
+
//===----------------------------------------------------------------------===//
// Test instructions (like AND but do not produce any result)
diff --git a/llvm/lib/Target/SystemZ/SystemZInstrInfo.td b/llvm/lib/Target/SystemZ/SystemZInstrInfo.td
index 5672b048d20..7bfd8eb82bd 100644
--- a/llvm/lib/Target/SystemZ/SystemZInstrInfo.td
+++ b/llvm/lib/Target/SystemZ/SystemZInstrInfo.td
@@ -785,7 +785,11 @@ def : Pat<(SystemZcall (i64 texternalsym:$dst)), (CALLi texternalsym:$dst)>;
// FIXME: use add/sub tricks with 32678/-32768
-// Arbitrary immediate support. Implement in terms of LLIHF/OILF.
+// Arbitrary immediate support.
+def : Pat<(i32 imm:$src),
+ (EXTRACT_SUBREG (MOV64ri32 (i64 imm:$src)), subreg_32bit)>;
+
+// Implement in terms of LLIHF/OILF.
def : Pat<(i64 imm:$imm),
(OR64rilo32 (MOV64rihi32 (HI32 imm:$imm)), (LO32 imm:$imm))>;
@@ -821,6 +825,3 @@ def : Pat<(mulhu GR64:$src1, GR64:$src2),
GR64:$src1, subreg_odd),
GR64:$src2),
subreg_even)>;
-
-def : Pat<(i32 imm:$src),
- (EXTRACT_SUBREG (MOV64ri32 (i64 imm:$src)), subreg_32bit)>;
OpenPOWER on IntegriCloud