[PATCH] D106812: [PowerPC] Fix materialization of SP float values on Power10
Lei Huang via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 26 10:32:28 PDT 2021
lei created this revision.
lei added reviewers: stefanp, amyk, NeHuang, power-llvm-team.
Herald added subscribers: shchenz, hiraditya, nemanjai.
lei requested review of this revision.
Herald added a project: LLVM.
All floating point values in registers are in double precision
representation. In order to materialize the correct single precision
value, we need to convert the APFloat that represents the value
to double precision first.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D106812
Files:
llvm/lib/Target/PowerPC/PPCInstrInfo.td
llvm/test/CodeGen/PowerPC/constant-pool.ll
llvm/test/CodeGen/PowerPC/p10-splatImm-CPload-pcrel.ll
Index: llvm/test/CodeGen/PowerPC/p10-splatImm-CPload-pcrel.ll
===================================================================
--- llvm/test/CodeGen/PowerPC/p10-splatImm-CPload-pcrel.ll
+++ llvm/test/CodeGen/PowerPC/p10-splatImm-CPload-pcrel.ll
@@ -160,22 +160,22 @@
define dso_local float @testFloatDenormScalar() local_unnamed_addr {
; CHECK-LE-LABEL: testFloatDenormScalar:
; CHECK-LE: # %bb.0: # %entry
-; CHECK-LE-NEXT: xxsplti32dx vs1, 0, 0
-; CHECK-LE-NEXT: xxsplti32dx vs1, 1, 7136238
+; CHECK-LE-NEXT: xxsplti32dx vs1, 0, 940259579
+; CHECK-LE-NEXT: xxsplti32dx vs1, 1, -2147483648
; CHECK-LE-NEXT: # kill: def $f1 killed $f1 killed $vsl1
; CHECK-LE-NEXT: blr
;
; CHECK-NOPCREL-BE-LABEL: testFloatDenormScalar:
; CHECK-NOPCREL-BE: # %bb.0: # %entry
-; CHECK-NOPCREL-BE-NEXT: xxsplti32dx vs1, 0, 0
-; CHECK-NOPCREL-BE-NEXT: xxsplti32dx vs1, 1, 7136238
+; CHECK-NOPCREL-BE-NEXT: xxsplti32dx vs1, 0, 940259579
+; CHECK-NOPCREL-BE-NEXT: xxsplti32dx vs1, 1, -2147483648
; CHECK-NOPCREL-BE-NEXT: # kill: def $f1 killed $f1 killed $vsl1
; CHECK-NOPCREL-BE-NEXT: blr
;
; CHECK-NOPCREL-LE-LABEL: testFloatDenormScalar:
; CHECK-NOPCREL-LE: # %bb.0: # %entry
-; CHECK-NOPCREL-LE-NEXT: xxsplti32dx vs1, 0, 0
-; CHECK-NOPCREL-LE-NEXT: xxsplti32dx vs1, 1, 7136238
+; CHECK-NOPCREL-LE-NEXT: xxsplti32dx vs1, 0, 940259579
+; CHECK-NOPCREL-LE-NEXT: xxsplti32dx vs1, 1, -2147483648
; CHECK-NOPCREL-LE-NEXT: # kill: def $f1 killed $f1 killed $vsl1
; CHECK-NOPCREL-LE-NEXT: blr
;
@@ -187,8 +187,8 @@
;
; CHECK-BE-LABEL: testFloatDenormScalar:
; CHECK-BE: # %bb.0: # %entry
-; CHECK-BE-NEXT: xxsplti32dx vs1, 0, 0
-; CHECK-BE-NEXT: xxsplti32dx vs1, 1, 7136238
+; CHECK-BE-NEXT: xxsplti32dx vs1, 0, 940259579
+; CHECK-BE-NEXT: xxsplti32dx vs1, 1, -2147483648
; CHECK-BE-NEXT: # kill: def $f1 killed $f1 killed $vsl1
; CHECK-BE-NEXT: blr
entry:
Index: llvm/test/CodeGen/PowerPC/constant-pool.ll
===================================================================
--- llvm/test/CodeGen/PowerPC/constant-pool.ll
+++ llvm/test/CodeGen/PowerPC/constant-pool.ll
@@ -9,8 +9,8 @@
define float @FloatConstantPool() {
; CHECK-LABEL: FloatConstantPool:
; CHECK: # %bb.0: # %entry
-; CHECK-NEXT: xxsplti32dx vs1, 0, 0
-; CHECK-NEXT: xxsplti32dx vs1, 1, 8388577
+; CHECK-NEXT: xxsplti32dx vs1, 0, 940572664
+; CHECK-NEXT: xxsplti32dx vs1, 1, 1073741824
; CHECK-NEXT: # kill: def $f1 killed $f1 killed $vsl1
; CHECK-NEXT: blr
;
Index: llvm/lib/Target/PowerPC/PPCInstrInfo.td
===================================================================
--- llvm/lib/Target/PowerPC/PPCInstrInfo.td
+++ llvm/lib/Target/PowerPC/PPCInstrInfo.td
@@ -410,6 +410,9 @@
// Get the Hi bits of a 64 bit immediate.
def getFPAs64BitIntHi : SDNodeXForm<fpimm, [{
APFloat APFloatOfN = N->getValueAPF();
+ bool LosesInfo;
+ APFloatOfN.convert(APFloat::IEEEdouble(), APFloat::rmNearestTiesToEven,
+ &LosesInfo);
uint32_t Hi = (uint32_t)((APFloatOfN.bitcastToAPInt().getZExtValue() &
0xFFFFFFFF00000000LL) >> 32);
return CurDAG->getTargetConstant(Hi, SDLoc(N), MVT::i32);
@@ -418,6 +421,9 @@
// Get the Lo bits of a 64 bit immediate.
def getFPAs64BitIntLo : SDNodeXForm<fpimm, [{
APFloat APFloatOfN = N->getValueAPF();
+ bool LosesInfo;
+ APFloatOfN.convert(APFloat::IEEEdouble(), APFloat::rmNearestTiesToEven,
+ &LosesInfo);
uint32_t Lo = (uint32_t)(APFloatOfN.bitcastToAPInt().getZExtValue() &
0xFFFFFFFF);
return CurDAG->getTargetConstant(Lo, SDLoc(N), MVT::i32);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D106812.361719.patch
Type: text/x-patch
Size: 3687 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210726/7b79a9ad/attachment.bin>
More information about the llvm-commits
mailing list