1
0
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:
Jonas Paulsson 2020-10-14 14:39:35 +02:00
parent 75a07ccbc2
commit bd7c60edbb
3 changed files with 20 additions and 7 deletions

View File

@ -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);

View File

@ -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
}

View File

@ -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