Skip to content

Commit 8f3d0ae

Browse files
committed
Updates per review.
1 parent 8369b75 commit 8f3d0ae

26 files changed

+499
-484
lines changed

compiler-rt/lib/builtins/extendhfdf2.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@
1010
#define DST_DOUBLE
1111
#include "fp_extend_impl.inc"
1212

13-
// Use a forwarding definition and noinline to implement a poor man's alias,
14-
// as there isn't a good cross-platform way of defining one.
1513
COMPILER_RT_ABI NOINLINE dst_t __extendhfdf2(src_t a) {
1614
return __extendXfYf2__(a);
1715
}

llvm/lib/Target/SystemZ/SystemZISelLowering.cpp

Lines changed: 228 additions & 108 deletions
Large diffs are not rendered by default.

llvm/lib/Target/SystemZ/SystemZISelLowering.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -627,6 +627,9 @@ class SystemZTargetLowering : public TargetLowering {
627627
bool IsSigned, SDLoc DL, bool DoesNotReturn,
628628
bool IsReturnValueUsed) const;
629629

630+
SDValue useLibCall(SelectionDAG &DAG, RTLIB::Libcall LC, MVT VT, SDValue Arg,
631+
SDLoc DL, SDValue Chain, bool IsStrict) const;
632+
630633
bool CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF,
631634
bool isVarArg,
632635
const SmallVectorImpl<ISD::OutputArg> &Outs,
@@ -747,9 +750,7 @@ class SystemZTargetLowering : public TargetLowering {
747750
SDValue lowerFSHR(SDValue Op, SelectionDAG &DAG) const;
748751
SDValue lowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const;
749752
SDValue lower_FP_TO_INT(SDValue Op, SelectionDAG &DAG) const;
750-
SDValue lowerSTRICT_FP_TO_INT(SDValue Op, SelectionDAG &DAG) const;
751753
SDValue lower_INT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
752-
SDValue lowerSTRICT_INT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
753754
SDValue lowerLoadF16(SDValue Op, SelectionDAG &DAG) const;
754755
SDValue lowerStoreF16(SDValue Op, SelectionDAG &DAG) const;
755756

llvm/lib/Target/SystemZ/SystemZInstrVector.td

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ let Predicates = [FeatureVector] in {
141141
// LEY and LDY offer full 20-bit displacement fields. It's often better
142142
// to use those instructions rather than force a 20-bit displacement
143143
// into a GPR temporary.
144-
let mayLoad = 1, canFoldAsLoad = 1 in {
144+
let mayLoad = 1, SimpleBDXLoad = 1, canFoldAsLoad = 1 in {
145145
def VL16 : UnaryAliasVRX<z_load, v16hb, bdxaddr12pair>;
146146
def VL32 : UnaryAliasVRX<z_load, v32sb, bdxaddr12pair>;
147147
def VL64 : UnaryAliasVRX<z_load, v64db, bdxaddr12pair>;
@@ -238,7 +238,7 @@ let Predicates = [FeatureVector] in {
238238
// STEY and STDY offer full 20-bit displacement fields. It's often better
239239
// to use those instructions rather than force a 20-bit displacement
240240
// into a GPR temporary.
241-
let mayStore = 1 in {
241+
let mayStore = 1, SimpleBDXStore = 1 in {
242242
def VST16 : StoreAliasVRX<store, v16hb, bdxaddr12pair>;
243243
def VST32 : StoreAliasVRX<store, v32sb, bdxaddr12pair>;
244244
def VST64 : StoreAliasVRX<store, v64db, bdxaddr12pair>;

llvm/test/CodeGen/SystemZ/atomic-load-10.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
define half @f1(ptr %src) {
88
; CHECK-LABEL: f1:
99
; CHECK: # %bb.0:
10-
; CHECK-NEXT: lh %r0, 0(%r2)
10+
; CHECK-NEXT: lgh %r0, 0(%r2)
1111
; CHECK-NEXT: sllg %r0, %r0, 48
1212
; CHECK-NEXT: ldgr %f0, %r0
1313
; CHECK-NEXT: # kill: def $f0h killed $f0h killed $f0d

llvm/test/CodeGen/SystemZ/fp-abs-01.ll

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@
77
declare half @llvm.fabs.f16(half %f)
88
define half @f0(half %f) {
99
; CHECK-LABEL: f0:
10-
; CHECK: brasl %r14, __extendhfsf2@PLT
11-
; CHECK: lpdfr %f0, %f0
10+
; CHECK: brasl %r14, __extendhfsf2@PLT
11+
; CHECK-NEXT: lpdfr %f0, %f0
12+
; CHECK-NEXT: brasl %r14, __truncsfhf2@PLT
1213
; CHECK: br %r14
1314
%res = call half @llvm.fabs.f16(half %f)
1415
ret half %res

llvm/test/CodeGen/SystemZ/fp-abs-03.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
declare half @llvm.fabs.f16(half %f)
77
define half @f0(half %f) {
88
; CHECK-LABEL: f0:
9-
; CHECK: brasl %r14, __extendhfsf2@PLT
10-
; CHECK: lpdfr %f0, %f0
11-
; CHECK: brasl %r14, __truncsfhf2@PLT
9+
; CHECK: brasl %r14, __extendhfsf2@PLT
10+
; CHECK-NEXT: lpdfr %f0, %f0
11+
; CHECK-NEXT: brasl %r14, __truncsfhf2@PLT
1212
; CHECK: br %r14
1313
%res = call half @llvm.fabs.f16(half %f)
1414
ret half %res

llvm/test/CodeGen/SystemZ/fp-conv-08.ll

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
; Test i64->f16. For z10, this results in just a single a libcall.
66
define half @f0(i64 %i) {
77
; CHECK-LABEL: f0:
8-
; CHECK: brasl %r14, __floatundihf@PLT
8+
; CHECK: cegbr
9+
; CHECK: aebr
10+
; CHECK: brasl %r14, __truncsfhf2@PLT
911
; CHECK: br %r14
1012
%conv = uitofp i64 %i to half
1113
ret half %conv

llvm/test/CodeGen/SystemZ/fp-conv-20.ll

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ define float @f3(i128 %i) {
3333
; Test signed i128->f16.
3434
define half @f4(i128 %i) {
3535
; CHECK-LABEL: f4:
36-
; CHECK: brasl %r14, __floattihf@PLT
36+
; CHECK: brasl %r14, __floattisf@PLT
37+
; CHECK: brasl %r14, __truncsfhf2@PLT
3738
; CHECK: br %r14
3839
%conv = sitofp i128 %i to half
3940
ret half %conv
@@ -69,7 +70,8 @@ define float @f7(i128 %i) {
6970
; Test unsigned i128->f16.
7071
define half @f8(i128 %i) {
7172
; CHECK-LABEL: f8:
72-
; CHECK: brasl %r14, __floatuntihf@PLT
73+
; CHECK: brasl %r14, __floatuntisf@PLT
74+
; CHECK: brasl %r14, __truncsfhf2@PLT
7375
; CHECK: br %r14
7476
%conv = uitofp i128 %i to half
7577
ret half %conv
@@ -105,7 +107,8 @@ define i128 @f11(float %f) {
105107
; Test signed f16->i128.
106108
define i128 @f12(half %f) {
107109
; CHECK-LABEL: f12:
108-
; CHECK: brasl %r14, __fixhfti@PLT
110+
; CHECK: brasl %r14, __extendhfsf2@PLT
111+
; CHECK: brasl %r14, __fixsfti@PLT
109112
; CHECK: br %r14
110113
%conv = fptosi half %f to i128
111114
ret i128 %conv
@@ -141,7 +144,8 @@ define i128 @f15(float %f) {
141144
; Test unsigned f16->i128.
142145
define i128 @f16(half %f) {
143146
; CHECK-LABEL: f16:
144-
; CHECK: brasl %r14, __fixunshfti@PLT
147+
; CHECK: brasl %r14, __extendhfsf2@PLT
148+
; CHECK: brasl %r14, __fixunssfti@PLT
145149
; CHECK: br %r14
146150
%conv = fptoui half %f to i128
147151
ret i128 %conv

llvm/test/CodeGen/SystemZ/fp-copysign-01.ll

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,11 @@
22
;
33
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
44

5-
declare half @copysignh(half, half) readnone
65
declare float @copysignf(float, float) readnone
76
declare double @copysign(double, double) readnone
87
; FIXME: not really the correct prototype for SystemZ.
98
declare fp128 @copysignl(fp128, fp128) readnone
109

11-
; Test f32 copies in which the sign comes from an f16.
12-
define float @f0(float %a, half %bh) {
13-
; CHECK-LABEL: f0:
14-
; CHECK: brasl %r14, __extendhfsf2@PLT
15-
; CHECK: cpsdr %f0, %f0, %f8
16-
; CHECK: br %r14
17-
%b = fpext half %bh to float
18-
%res = call float @copysignf(float %a, float %b) readnone
19-
ret float %res
20-
}
21-
2210
; Test f32 copies in which the sign comes from an f32.
2311
define float @f1(float %a, float %b) {
2412
; CHECK-LABEL: f1:
@@ -138,23 +126,3 @@ define void @f9(ptr %cptr, ptr %aptr, ptr %bptr) {
138126
store fp128 %c, ptr %cptr
139127
ret void
140128
}
141-
142-
; Test f16 copies in which the sign comes from an f16.
143-
define half @f10(half %a, half %b) {
144-
; CHECK-LABEL: f10:
145-
; CHECK: brasl %r14, copysignh@PLT
146-
; CHECK: br %r14
147-
%res = call half @copysignh(half %a, half %b) readnone
148-
ret half %res
149-
}
150-
151-
; Test f16 copies in which the sign comes from an f32.
152-
define half @f11(half %a, float %bf) {
153-
; CHECK-LABEL: f11:
154-
; CHECK: brasl %r14, __truncsfhf2@PLT
155-
; CHECK: brasl %r14, copysignh@PLT
156-
; CHECK: br %r14
157-
%b = fptrunc float %bf to half
158-
%res = call half @copysignh(half %a, half %b) readnone
159-
ret half %res
160-
}

llvm/test/CodeGen/SystemZ/fp-copysign-02.ll

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,11 @@
22
;
33
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s
44

5-
declare half @copysignh(half, half) readnone
65
declare float @copysignf(float, float) readnone
76
declare double @copysign(double, double) readnone
87
; FIXME: not really the correct prototype for SystemZ.
98
declare fp128 @copysignl(fp128, fp128) readnone
109

11-
; Test f16 copies in which the sign comes from an f128.
12-
define half @f0(half %a, ptr %bptr) {
13-
; CHECK-LABEL: f0:
14-
; CHECK: vl %v[[REG:[0-9]+]], 0(%r2)
15-
; CHECK: brasl %r14, __trunctfhf2@PLT
16-
; CHECK: brasl %r14, copysignh@PLT
17-
; CHECK: br %r14
18-
%bl = load volatile fp128, ptr %bptr
19-
%b = fptrunc fp128 %bl to half
20-
%res = call half @copysignh(half %a, half %b) readnone
21-
ret half %res
22-
}
23-
2410
; Test f32 copies in which the sign comes from an f128.
2511
define float @f1(float %a, ptr %bptr) {
2612
; CHECK-LABEL: f1:
@@ -45,21 +31,6 @@ define double @f2(double %a, ptr %bptr) {
4531
ret double %res
4632
}
4733

48-
; Test f128 copies in which the sign comes from an f16.
49-
define void @f7_half(ptr %cptr, ptr %aptr, half %bh) {
50-
; CHECK-LABEL: f7_half:
51-
; CHECK: vl [[REG1:%v[0-7]+]], 0(%r3)
52-
; CHECK: vsteh %v0, 164(%r15), 0
53-
; CHECK: tm 164(%r15), 128
54-
; CHECK: wflnxb [[REG2:%v[0-9]+]], [[REG1]]
55-
; CHECK: wflpxb [[REG2]], [[REG1]]
56-
%a = load volatile fp128, ptr %aptr
57-
%b = fpext half %bh to fp128
58-
%c = call fp128 @copysignl(fp128 %a, fp128 %b) readnone
59-
store fp128 %c, ptr %cptr
60-
ret void
61-
}
62-
6334
; Test f128 copies in which the sign comes from an f32.
6435
define void @f7(ptr %cptr, ptr %aptr, float %bf) {
6536
; CHECK-LABEL: f7:
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
; Test copysign intrinsics involving half.
2+
;
3+
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
4+
5+
declare half @llvm.copysign.f16(half, half)
6+
declare float @llvm.copysign.f32(float, float)
7+
declare double @llvm.copysign.f64(double, double)
8+
9+
; Test f16 copies.
10+
define half @f0(half %a, half %b) {
11+
; CHECK-LABEL: f0:
12+
; CHECK: brasl %r14, __extendhfsf2@PLT
13+
; CHECK: brasl %r14, __extendhfsf2@PLT
14+
; CHECK: cpsdr %f0, %f9, %f0
15+
; CHECK: brasl %r14, __truncsfhf2@PLT
16+
; CHECK: br %r14
17+
%res = call half @llvm.copysign.f16(half %a, half %b)
18+
ret half %res
19+
}
20+
21+
; Test f16 copies where the sign comes from an f32.
22+
define half @f1(half %a, float %b) {
23+
; CHECK-LABEL: f1:
24+
; CHECK: brasl %r14, __extendhfsf2@PLT
25+
; CHECK: cpsdr %f0, %f8, %f0
26+
; CHECK: brasl %r14, __truncsfhf2@PLT
27+
; CHECK: br %r14
28+
%bh = fptrunc float %b to half
29+
%res = call half @llvm.copysign.f16(half %a, half %bh)
30+
ret half %res
31+
}
32+
33+
; Test f16 copies where the sign comes from an f64.
34+
define half @f2(half %a, double %b) {
35+
; CHECK-LABEL: f2:
36+
; CHECK: brasl %r14, __extendhfdf2@PLT
37+
; CHECK: cpsdr %f0, %f8, %f0
38+
; CHECK: brasl %r14, __truncdfhf2@PLT
39+
; CHECK: br %r14
40+
%bh = fptrunc double %b to half
41+
%res = call half @llvm.copysign.f16(half %a, half %bh)
42+
ret half %res
43+
}
44+
45+
; Test f32 copies in which the sign comes from an f16.
46+
define float @f3(float %a, half %b) {
47+
; CHECK-LABEL: f3:
48+
; CHECK: brasl %r14, __extendhfsf2@PLT
49+
; CHECK: cpsdr %f0, %f0, %f8
50+
; CHECK: br %r14
51+
%bf = fpext half %b to float
52+
%res = call float @llvm.copysign.f32(float %a, float %bf)
53+
ret float %res
54+
}
55+
56+
; Test f64 copies in which the sign comes from an f16.
57+
define double @f4(double %a, half %b) {
58+
; CHECK-LABEL: f4:
59+
; CHECK: brasl %r14, __extendhfdf2@PLT
60+
; CHECK: cpsdr %f0, %f0, %f8
61+
; CHECK: br %r14
62+
%bd = fpext half %b to double
63+
%res = call double @llvm.copysign.f64(double %a, double %bd)
64+
ret double %res
65+
}

llvm/test/CodeGen/SystemZ/fp-half-mem.ll

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,8 @@ define half @f1() {
1717
; NOVEC-NEXT: .cfi_def_cfa_offset 328
1818
; NOVEC-NEXT: la %r2, 166(%r15)
1919
; NOVEC-NEXT: brasl %r14, foo@PLT
20-
; NOVEC-NEXT: lh %r0, 166(%r15)
21-
; NOVEC-NEXT: sll %r0, 16
22-
; NOVEC-NEXT: risbhg %r0, %r0, 0, 159, 32
20+
; NOVEC-NEXT: lgh %r0, 166(%r15)
21+
; NOVEC-NEXT: sllg %r0, %r0, 48
2322
; NOVEC-NEXT: ldgr %f0, %r0
2423
; NOVEC-NEXT: # kill: def $f0h killed $f0h killed $f0d
2524
; NOVEC-NEXT: lmg %r14, %r15, 280(%r15)
@@ -48,9 +47,8 @@ define half @f1() {
4847
define half @f2(ptr %P) {
4948
; NOVEC-LABEL: f2:
5049
; NOVEC: # %bb.0:
51-
; NOVEC-NEXT: lh %r0, 6(%r2)
52-
; NOVEC-NEXT: sll %r0, 16
53-
; NOVEC-NEXT: risbhg %r0, %r0, 0, 159, 32
50+
; NOVEC-NEXT: lgh %r0, 6(%r2)
51+
; NOVEC-NEXT: sllg %r0, %r0, 48
5452
; NOVEC-NEXT: ldgr %f0, %r0
5553
; NOVEC-NEXT: # kill: def $f0h killed $f0h killed $f0d
5654
; NOVEC-NEXT: br %r14

llvm/test/CodeGen/SystemZ/fp-half-move.ll

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,8 @@ define half @f1(ptr %ptr) {
1010
; NOVEC-LABEL: f1:
1111
; NOVEC: # %bb.0:
1212
; NOVEC-NEXT: lh %r0, 0(%r2)
13-
; NOVEC-NEXT: sll %r0, 16
14-
; NOVEC-NEXT: oilh %r0, 255
15-
; NOVEC-NEXT: risbhg %r0, %r0, 0, 159, 32
13+
; NOVEC-NEXT: oill %r0, 255
14+
; NOVEC-NEXT: sllg %r0, %r0, 48
1615
; NOVEC-NEXT: ldgr %f0, %r0
1716
; NOVEC-NEXT: # kill: def $f0h killed $f0h killed $f0d
1817
; NOVEC-NEXT: br %r14
@@ -32,8 +31,8 @@ define half @f1(ptr %ptr) {
3231
define half @f2(i16 %Arg) {
3332
; NOVEC-LABEL: f2:
3433
; NOVEC: # %bb.0:
35-
; NOVEC-NEXT: sll %r2, 16
36-
; NOVEC-NEXT: risbhg %r0, %r2, 0, 159, 32
34+
; NOVEC-NEXT: # kill: def $r2l killed $r2l def $r2d
35+
; NOVEC-NEXT: sllg %r0, %r2, 48
3736
; NOVEC-NEXT: ldgr %f0, %r0
3837
; NOVEC-NEXT: # kill: def $f0h killed $f0h killed $f0d
3938
; NOVEC-NEXT: br %r14
@@ -51,8 +50,7 @@ define void @f3(half %val, ptr %ptr) {
5150
; NOVEC: # %bb.0:
5251
; NOVEC-NEXT: # kill: def $f0h killed $f0h def $f0d
5352
; NOVEC-NEXT: lgdr %r0, %f0
54-
; NOVEC-NEXT: risblg %r0, %r0, 0, 159, 32
55-
; NOVEC-NEXT: srl %r0, 16
53+
; NOVEC-NEXT: srlg %r0, %r0, 48
5654
; NOVEC-NEXT: stc %r0, 0(%r2)
5755
; NOVEC-NEXT: br %r14
5856
;
@@ -72,8 +70,8 @@ define i16 @f4(half %Arg) {
7270
; NOVEC: # %bb.0:
7371
; NOVEC-NEXT: # kill: def $f0h killed $f0h def $f0d
7472
; NOVEC-NEXT: lgdr %r0, %f0
75-
; NOVEC-NEXT: risblg %r2, %r0, 0, 159, 32
76-
; NOVEC-NEXT: srl %r2, 16
73+
; NOVEC-NEXT: srlg %r2, %r0, 48
74+
; NOVEC-NEXT: # kill: def $r2l killed $r2l killed $r2d
7775
; NOVEC-NEXT: br %r14
7876
;
7977
; VECTOR-LABEL: f4:

llvm/test/CodeGen/SystemZ/fp-half-strict.ll

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,8 @@ define void @fun1(ptr %Src, ptr %Dst) #0 {
7777
; NOVEC-NEXT: .cfi_offset %r15, -40
7878
; NOVEC-NEXT: aghi %r15, -160
7979
; NOVEC-NEXT: .cfi_def_cfa_offset 320
80-
; NOVEC-NEXT: lh %r0, 0(%r2)
81-
; NOVEC-NEXT: sll %r0, 16
82-
; NOVEC-NEXT: risbhg %r0, %r0, 0, 159, 32
80+
; NOVEC-NEXT: lgh %r0, 0(%r2)
81+
; NOVEC-NEXT: sllg %r0, %r0, 48
8382
; NOVEC-NEXT: lgr %r13, %r3
8483
; NOVEC-NEXT: ldgr %f0, %r0
8584
; NOVEC-NEXT: # kill: def $f0h killed $f0h killed $f0d
@@ -88,8 +87,7 @@ define void @fun1(ptr %Src, ptr %Dst) #0 {
8887
; NOVEC-NEXT: brasl %r14, __truncdfhf2@PLT
8988
; NOVEC-NEXT: # kill: def $f0h killed $f0h def $f0d
9089
; NOVEC-NEXT: lgdr %r0, %f0
91-
; NOVEC-NEXT: risblg %r0, %r0, 0, 159, 32
92-
; NOVEC-NEXT: srl %r0, 16
90+
; NOVEC-NEXT: srlg %r0, %r0, 48
9391
; NOVEC-NEXT: sth %r0, 0(%r13)
9492
; NOVEC-NEXT: bcr 14, %r0
9593
; NOVEC-NEXT: lmg %r13, %r15, 264(%r15)

0 commit comments

Comments
 (0)