mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +01:00
[SystemZ] Bugfix in SystemZVectorConstantInfo
In order to correctly load an all-ones FP NaN value into a floating point register with a VGBM, the analyzed 32/64 FP bits must first be shifted left (into element 0 of the vector register). SystemZVectorConstantInfo has so far relied on element replication which has bypassed the need to do this shift, but now it is clear that this must be done in order to handle NaNs. Review: Ulrich Weigand Differential Revision: https://reviews.llvm.org/D89389
This commit is contained in:
parent
75a07ccbc2
commit
bd7c60edbb
@ -784,10 +784,11 @@ bool SystemZVectorConstantInfo::isVectorConstantLegal(
|
||||
SystemZVectorConstantInfo::SystemZVectorConstantInfo(APFloat FPImm) {
|
||||
IntBits = FPImm.bitcastToAPInt().zextOrSelf(128);
|
||||
isFP128 = (&FPImm.getSemantics() == &APFloat::IEEEquad());
|
||||
|
||||
// Find the smallest splat.
|
||||
SplatBits = FPImm.bitcastToAPInt();
|
||||
unsigned Width = SplatBits.getBitWidth();
|
||||
IntBits <<= (SystemZ::VectorBits - Width);
|
||||
|
||||
// Find the smallest splat.
|
||||
while (Width > 8) {
|
||||
unsigned HalfSize = Width / 2;
|
||||
APInt HighValue = SplatBits.lshr(HalfSize).trunc(HalfSize);
|
||||
|
@ -1,4 +1,4 @@
|
||||
; Test loads of FP constants with VGM.
|
||||
; Test loads of FP constants with VGM and VGBM.
|
||||
;
|
||||
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s
|
||||
|
||||
@ -61,3 +61,15 @@ define float @f10() {
|
||||
; CHECK: vgmf %v0, 2, 6
|
||||
ret float 0.125
|
||||
}
|
||||
|
||||
define float @f11() {
|
||||
; CHECK-LABEL: f11:
|
||||
; CHECK: vgbm %v0, 61440
|
||||
ret float 0xFFFFFFFFE0000000
|
||||
}
|
||||
|
||||
define double @f12() {
|
||||
; CHECK-LABEL: f12:
|
||||
; CHECK: vgbm %v0, 61440
|
||||
ret double 0xFFFFFFFF00000000
|
||||
}
|
||||
|
@ -802,7 +802,7 @@ define <3 x float> @constrained_vector_fadd_v3f32() #0 {
|
||||
;
|
||||
; SZ13-LABEL: constrained_vector_fadd_v3f32:
|
||||
; SZ13: # %bb.0: # %entry
|
||||
; SZ13-NEXT: vgbm %v0, 15
|
||||
; SZ13-NEXT: vgbm %v0, 61440
|
||||
; SZ13-NEXT: vgmf %v2, 1, 1
|
||||
; SZ13-NEXT: vgmf %v3, 2, 8
|
||||
; SZ13-NEXT: lzer %f1
|
||||
@ -974,12 +974,12 @@ define <3 x float> @constrained_vector_fsub_v3f32() #0 {
|
||||
;
|
||||
; SZ13-LABEL: constrained_vector_fsub_v3f32:
|
||||
; SZ13: # %bb.0: # %entry
|
||||
; SZ13-NEXT: vgbm %v2, 15
|
||||
; SZ13-NEXT: vgbm %v2, 61440
|
||||
; SZ13-NEXT: lzer %f1
|
||||
; SZ13-NEXT: sebr %f2, %f1
|
||||
; SZ13-NEXT: vgmf %v1, 1, 1
|
||||
; SZ13-NEXT: vgbm %v3, 15
|
||||
; SZ13-NEXT: vgbm %v0, 15
|
||||
; SZ13-NEXT: vgbm %v3, 61440
|
||||
; SZ13-NEXT: vgbm %v0, 61440
|
||||
; SZ13-NEXT: sebr %f3, %f1
|
||||
; SZ13-NEXT: vgmf %v1, 2, 8
|
||||
; SZ13-NEXT: sebr %f0, %f1
|
||||
|
Loading…
Reference in New Issue
Block a user