summaryrefslogtreecommitdiff
path: root/llvm/lib/Target/Sparc
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target/Sparc')
-rw-r--r--llvm/lib/Target/Sparc/SparcISelLowering.cpp37
-rw-r--r--llvm/lib/Target/Sparc/SparcSubtarget.cpp40
-rw-r--r--llvm/lib/Target/Sparc/SparcSubtarget.h2
3 files changed, 43 insertions, 36 deletions
diff --git a/llvm/lib/Target/Sparc/SparcISelLowering.cpp b/llvm/lib/Target/Sparc/SparcISelLowering.cpp
index dc1196127e3d..a4a9eafd52ff 100644
--- a/llvm/lib/Target/Sparc/SparcISelLowering.cpp
+++ b/llvm/lib/Target/Sparc/SparcISelLowering.cpp
@@ -1905,42 +1905,7 @@ SparcTargetLowering::SparcTargetLowering(const TargetMachine &TM,
setOperationAction(ISD::FP_EXTEND, MVT::f128, Custom);
setOperationAction(ISD::FP_ROUND, MVT::f64, Custom);
- setOperationAction(ISD::FP_ROUND, MVT::f32, Custom);
-
- // Setup Runtime library names.
- if (Subtarget->is64Bit() && !Subtarget->useSoftFloat()) {
- setLibcallImpl(RTLIB::ADD_F128, RTLIB::impl__Qp_add);
- setLibcallImpl(RTLIB::SUB_F128, RTLIB::impl__Qp_sub);
- setLibcallImpl(RTLIB::MUL_F128, RTLIB::impl__Qp_mul);
- setLibcallImpl(RTLIB::DIV_F128, RTLIB::impl__Qp_div);
- setLibcallImpl(RTLIB::SQRT_F128, RTLIB::impl__Qp_sqrt);
- setLibcallImpl(RTLIB::FPTOSINT_F128_I32, RTLIB::impl__Qp_qtoi);
- setLibcallImpl(RTLIB::FPTOUINT_F128_I32, RTLIB::impl__Qp_qtoui);
- setLibcallImpl(RTLIB::SINTTOFP_I32_F128, RTLIB::impl__Qp_itoq);
- setLibcallImpl(RTLIB::UINTTOFP_I32_F128, RTLIB::impl__Qp_uitoq);
- setLibcallImpl(RTLIB::FPTOSINT_F128_I64, RTLIB::impl__Qp_qtox);
- setLibcallImpl(RTLIB::FPTOUINT_F128_I64, RTLIB::impl__Qp_qtoux);
- setLibcallImpl(RTLIB::SINTTOFP_I64_F128, RTLIB::impl__Qp_xtoq);
- setLibcallImpl(RTLIB::UINTTOFP_I64_F128, RTLIB::impl__Qp_uxtoq);
- setLibcallImpl(RTLIB::FPEXT_F32_F128, RTLIB::impl__Qp_stoq);
- setLibcallImpl(RTLIB::FPEXT_F64_F128, RTLIB::impl__Qp_dtoq);
- setLibcallImpl(RTLIB::FPROUND_F128_F32, RTLIB::impl__Qp_qtos);
- setLibcallImpl(RTLIB::FPROUND_F128_F64, RTLIB::impl__Qp_qtod);
- } else if (!Subtarget->useSoftFloat()) {
- setLibcallImpl(RTLIB::ADD_F128, RTLIB::impl__Q_add);
- setLibcallImpl(RTLIB::SUB_F128, RTLIB::impl__Q_sub);
- setLibcallImpl(RTLIB::MUL_F128, RTLIB::impl__Q_mul);
- setLibcallImpl(RTLIB::DIV_F128, RTLIB::impl__Q_div);
- setLibcallImpl(RTLIB::SQRT_F128, RTLIB::impl__Q_sqrt);
- setLibcallImpl(RTLIB::FPTOSINT_F128_I32, RTLIB::impl__Q_qtoi);
- setLibcallImpl(RTLIB::FPTOUINT_F128_I32, RTLIB::impl__Q_qtou);
- setLibcallImpl(RTLIB::SINTTOFP_I32_F128, RTLIB::impl__Q_itoq);
- setLibcallImpl(RTLIB::UINTTOFP_I32_F128, RTLIB::impl__Q_utoq);
- setLibcallImpl(RTLIB::FPEXT_F32_F128, RTLIB::impl__Q_stoq);
- setLibcallImpl(RTLIB::FPEXT_F64_F128, RTLIB::impl__Q_dtoq);
- setLibcallImpl(RTLIB::FPROUND_F128_F32, RTLIB::impl__Q_qtos);
- setLibcallImpl(RTLIB::FPROUND_F128_F64, RTLIB::impl__Q_qtod);
- }
+ setOperationAction(ISD::FP_ROUND, MVT::f32, Custom);
}
if (Subtarget->fixAllFDIVSQRT()) {
diff --git a/llvm/lib/Target/Sparc/SparcSubtarget.cpp b/llvm/lib/Target/Sparc/SparcSubtarget.cpp
index 005930834a0c..1d72d0bdada0 100644
--- a/llvm/lib/Target/Sparc/SparcSubtarget.cpp
+++ b/llvm/lib/Target/Sparc/SparcSubtarget.cpp
@@ -68,6 +68,46 @@ const SelectionDAGTargetInfo *SparcSubtarget::getSelectionDAGInfo() const {
return TSInfo.get();
}
+void SparcSubtarget::initLibcallLoweringInfo(LibcallLoweringInfo &Info) const {
+ if (hasHardQuad())
+ return;
+
+ // Setup Runtime library names.
+ if (is64Bit() && !useSoftFloat()) {
+ Info.setLibcallImpl(RTLIB::ADD_F128, RTLIB::impl__Qp_add);
+ Info.setLibcallImpl(RTLIB::SUB_F128, RTLIB::impl__Qp_sub);
+ Info.setLibcallImpl(RTLIB::MUL_F128, RTLIB::impl__Qp_mul);
+ Info.setLibcallImpl(RTLIB::DIV_F128, RTLIB::impl__Qp_div);
+ Info.setLibcallImpl(RTLIB::SQRT_F128, RTLIB::impl__Qp_sqrt);
+ Info.setLibcallImpl(RTLIB::FPTOSINT_F128_I32, RTLIB::impl__Qp_qtoi);
+ Info.setLibcallImpl(RTLIB::FPTOUINT_F128_I32, RTLIB::impl__Qp_qtoui);
+ Info.setLibcallImpl(RTLIB::SINTTOFP_I32_F128, RTLIB::impl__Qp_itoq);
+ Info.setLibcallImpl(RTLIB::UINTTOFP_I32_F128, RTLIB::impl__Qp_uitoq);
+ Info.setLibcallImpl(RTLIB::FPTOSINT_F128_I64, RTLIB::impl__Qp_qtox);
+ Info.setLibcallImpl(RTLIB::FPTOUINT_F128_I64, RTLIB::impl__Qp_qtoux);
+ Info.setLibcallImpl(RTLIB::SINTTOFP_I64_F128, RTLIB::impl__Qp_xtoq);
+ Info.setLibcallImpl(RTLIB::UINTTOFP_I64_F128, RTLIB::impl__Qp_uxtoq);
+ Info.setLibcallImpl(RTLIB::FPEXT_F32_F128, RTLIB::impl__Qp_stoq);
+ Info.setLibcallImpl(RTLIB::FPEXT_F64_F128, RTLIB::impl__Qp_dtoq);
+ Info.setLibcallImpl(RTLIB::FPROUND_F128_F32, RTLIB::impl__Qp_qtos);
+ Info.setLibcallImpl(RTLIB::FPROUND_F128_F64, RTLIB::impl__Qp_qtod);
+ } else if (!useSoftFloat()) {
+ Info.setLibcallImpl(RTLIB::ADD_F128, RTLIB::impl__Q_add);
+ Info.setLibcallImpl(RTLIB::SUB_F128, RTLIB::impl__Q_sub);
+ Info.setLibcallImpl(RTLIB::MUL_F128, RTLIB::impl__Q_mul);
+ Info.setLibcallImpl(RTLIB::DIV_F128, RTLIB::impl__Q_div);
+ Info.setLibcallImpl(RTLIB::SQRT_F128, RTLIB::impl__Q_sqrt);
+ Info.setLibcallImpl(RTLIB::FPTOSINT_F128_I32, RTLIB::impl__Q_qtoi);
+ Info.setLibcallImpl(RTLIB::FPTOUINT_F128_I32, RTLIB::impl__Q_qtou);
+ Info.setLibcallImpl(RTLIB::SINTTOFP_I32_F128, RTLIB::impl__Q_itoq);
+ Info.setLibcallImpl(RTLIB::UINTTOFP_I32_F128, RTLIB::impl__Q_utoq);
+ Info.setLibcallImpl(RTLIB::FPEXT_F32_F128, RTLIB::impl__Q_stoq);
+ Info.setLibcallImpl(RTLIB::FPEXT_F64_F128, RTLIB::impl__Q_dtoq);
+ Info.setLibcallImpl(RTLIB::FPROUND_F128_F32, RTLIB::impl__Q_qtos);
+ Info.setLibcallImpl(RTLIB::FPROUND_F128_F64, RTLIB::impl__Q_qtod);
+ }
+}
+
int SparcSubtarget::getAdjustedFrameSize(int frameSize) const {
if (is64Bit()) {
diff --git a/llvm/lib/Target/Sparc/SparcSubtarget.h b/llvm/lib/Target/Sparc/SparcSubtarget.h
index f575f6d7da37..02d56eb8f300 100644
--- a/llvm/lib/Target/Sparc/SparcSubtarget.h
+++ b/llvm/lib/Target/Sparc/SparcSubtarget.h
@@ -63,6 +63,8 @@ public:
const SelectionDAGTargetInfo *getSelectionDAGInfo() const override;
+ void initLibcallLoweringInfo(LibcallLoweringInfo &Info) const override;
+
bool enableMachineScheduler() const override;
#define GET_SUBTARGETINFO_MACRO(ATTRIBUTE, DEFAULT, GETTER) \