Skip to content

Commit f23cfb4

Browse files
JonPsson1IanWood1
authored andcommitted
[SystemZ] Handle f16 load positive/negative/complement without libcalls. (llvm#136286)
This can be done directly with the (64-bit) target instruction as only the sign bit is changed.
1 parent 85f1ca5 commit f23cfb4

File tree

10 files changed

+46
-39
lines changed

10 files changed

+46
-39
lines changed

llvm/lib/Target/SystemZ/SystemZISelLowering.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -553,7 +553,8 @@ SystemZTargetLowering::SystemZTargetLowering(const TargetMachine &TM,
553553
setOperationAction(ISD::STRICT_FP_ROUND, MVT::f16, LibCall);
554554
setOperationAction(ISD::BITCAST, MVT::i16, Custom);
555555
setOperationAction(ISD::IS_FPCLASS, MVT::f16, Custom);
556-
setOperationAction(ISD::FCOPYSIGN, MVT::f16, Legal);
556+
for (auto Op : {ISD::FNEG, ISD::FABS, ISD::FCOPYSIGN})
557+
setOperationAction(Op, MVT::f16, Legal);
557558
}
558559

559560
for (unsigned I = MVT::FIRST_FP_VALUETYPE;

llvm/lib/Target/SystemZ/SystemZInstrFP.td

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -378,8 +378,10 @@ let Defs = [CC], CCValues = 0xF, CompareZeroCCMask = 0xF in {
378378
}
379379
// Generic form, which does not set CC.
380380
def LPDFR : UnaryRRE<"lpdfr", 0xB370, fabs, FP64, FP64>;
381-
let isCodeGenOnly = 1 in
381+
let isCodeGenOnly = 1 in {
382+
def LPDFR_16 : UnaryRRE<"lpdfr", 0xB370, fabs, FP16, FP16>;
382383
def LPDFR_32 : UnaryRRE<"lpdfr", 0xB370, fabs, FP32, FP32>;
384+
}
383385

384386
// Negative absolute value (Load Negative).
385387
let Defs = [CC], CCValues = 0xF, CompareZeroCCMask = 0xF in {
@@ -389,8 +391,10 @@ let Defs = [CC], CCValues = 0xF, CompareZeroCCMask = 0xF in {
389391
}
390392
// Generic form, which does not set CC.
391393
def LNDFR : UnaryRRE<"lndfr", 0xB371, fnabs, FP64, FP64>;
392-
let isCodeGenOnly = 1 in
394+
let isCodeGenOnly = 1 in {
395+
def LNDFR_16 : UnaryRRE<"lndfr", 0xB371, fnabs, FP16, FP16>;
393396
def LNDFR_32 : UnaryRRE<"lndfr", 0xB371, fnabs, FP32, FP32>;
397+
}
394398

395399
// Square root.
396400
let Uses = [FPC], mayRaiseFPException = 1 in {

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +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
10+
; CHECK: # %bb.0:
1111
; CHECK-NEXT: lpdfr %f0, %f0
12-
; CHECK-NEXT: brasl %r14, __truncsfhf2@PLT
13-
; CHECK: br %r14
12+
; CHECK-NEXT: br %r14
1413
%res = call half @llvm.fabs.f16(half %f)
1514
ret half %res
1615
}

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,18 @@
33
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
44
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s
55

6+
; Test f16.
7+
declare half @llvm.fabs.f16(half %f)
8+
define half @f0(half %f) {
9+
; CHECK-LABEL: f0:
10+
; CHECK: # %bb.0:
11+
; CHECK-NEXT: lndfr %f0, %f0
12+
; CHECK-NEXT: br %r14
13+
%abs = call half @llvm.fabs.f16(half %f)
14+
%res = fneg half %abs
15+
ret half %res
16+
}
17+
618
; Test f32.
719
declare float @llvm.fabs.f32(float %f)
820
define float @f1(float %f) {

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +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
9+
; CHECK: # %bb.0:
1010
; CHECK-NEXT: lpdfr %f0, %f0
11-
; CHECK-NEXT: brasl %r14, __truncsfhf2@PLT
12-
; CHECK: br %r14
11+
; CHECK-NEXT: br %r14
1312
%res = call half @llvm.fabs.f16(half %f)
1413
ret half %res
1514
}

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

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +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-NEXT: lpdfr %f0, %f0
11-
; CHECK-NEXT: brasl %r14, __truncsfhf2@PLT
12-
; CHECK-NEXT: brasl %r14, __extendhfsf2@PLT
13-
; CHECK-NEXT: lcdfr %f0, %f0
14-
; CHECK-NEXT: brasl %r14, __truncsfhf2@PLT
15-
; CHECK: br %r14
9+
; CHECK: # %bb.0:
10+
; CHECK-NEXT: lndfr %f0, %f0
11+
; CHECK-NEXT: br %r14
1612
%abs = call half @llvm.fabs.f16(half %f)
1713
%res = fneg half %abs
1814
ret half %res

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,12 @@ declare float @llvm.fma.f32(float %f1, float %f2, float %f3)
88

99
define half @f0(half %f1, half %f2, half %acc) {
1010
; CHECK-LABEL: f0:
11-
; CHECK: brasl %r14, __extendhfsf2@PLT
12-
; CHECK: lcdfr %f0, %f0
13-
; CHECK: brasl %r14, __truncsfhf2@PLT
11+
; CHECK-NOT: brasl
12+
; CHECK: lcdfr %f{{[0-9]+}}, %f4
1413
; CHECK: brasl %r14, __extendhfsf2@PLT
1514
; CHECK: brasl %r14, __extendhfsf2@PLT
1615
; CHECK: brasl %r14, __extendhfsf2@PLT
17-
; CHECK-SCALAR: maebr %f0, %f9, %f8
16+
; CHECK-SCALAR: maebr %f0, %f8, %f10
1817
; CHECK-VECTOR: wfmasb %f0, %f0, %f8, %f10
1918
; CHECK: brasl %r14, __truncsfhf2@PLT
2019
; CHECK: br %r14

llvm/test/CodeGen/SystemZ/fp-mul-10.ll

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,10 @@ define half @f3_half(half %f1, half %f2, half %acc) {
3030
; CHECK: brasl %r14, __extendhfsf2@PLT
3131
; CHECK: wfmasb %f0, %f0, %f8, %f10
3232
; CHECK: brasl %r14, __truncsfhf2@PLT
33-
; CHECK: brasl %r14, __extendhfsf2@PLT
34-
; CHECK: lcdfr %f0, %f0
35-
; CHECK: brasl %r14, __truncsfhf2@PLT
36-
; CHECK: br %r14
33+
; CHECK-NOT: brasl
34+
; CHECK: lcdfr %f0, %f0
35+
; CHECK-NEXT: lmg
36+
; CHECK-NEXT: br %r14
3737
%res = call half @llvm.fma.f16 (half %f1, half %f2, half %acc)
3838
%negres = fneg half %res
3939
ret half %negres
@@ -50,18 +50,17 @@ define float @f3(float %f1, float %f2, float %acc) {
5050

5151
define half @f4_half(half %f1, half %f2, half %acc) {
5252
; CHECK-LABEL: f4_half:
53-
; CHECK: brasl %r14, __extendhfsf2@PLT
54-
; CHECK: lcdfr %f0, %f0
55-
; CHECK: brasl %r14, __truncsfhf2@PLT
53+
; CHECK-NOT: brasl
54+
; CHECK: lcdfr %f0, %f4
5655
; CHECK: brasl %r14, __extendhfsf2@PLT
5756
; CHECK: brasl %r14, __extendhfsf2@PLT
5857
; CHECK: brasl %r14, __extendhfsf2@PLT
5958
; CHECK: wfmasb %f0, %f0, %f8, %f10
6059
; CHECK: brasl %r14, __truncsfhf2@PLT
61-
; CHECK: brasl %r14, __extendhfsf2@PLT
62-
; CHECK: lcdfr %f0, %f0
63-
; CHECK: brasl %r14, __truncsfhf2@PLT
64-
; CHECK: br %r14
60+
; CHECK-NOT: brasl
61+
; CHECK: lcdfr %f0, %f0
62+
; CHECK-NEXT: lmg
63+
; CHECK-NEXT: br %r14
6564
%negacc = fneg half %acc
6665
%res = call half @llvm.fma.f16 (half %f1, half %f2, half %negacc)
6766
%negres = fneg half %res

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,9 @@
66
; Test f16.
77
define half @f0(half %f) {
88
; CHECK-LABEL: f0:
9-
; CHECK: brasl %r14, __extendhfsf2@PLT
10-
; CHECK: lcdfr %f0, %f0
11-
; CHECK: brasl %r14, __truncsfhf2@PLT
12-
; CHECK: br %r14
9+
; CHECK: # %bb.0:
10+
; CHECK-NEXT: lcdfr %f0, %f0
11+
; CHECK-NEXT: br %r14
1312
%res = fneg half %f
1413
ret half %res
1514
}

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,9 @@
55
; Test f16.
66
define half @f0(half %f) {
77
; CHECK-LABEL: f0:
8-
; CHECK: brasl %r14, __extendhfsf2@PLT
9-
; CHECK: lcdfr %f0, %f0
10-
; CHECK: brasl %r14, __truncsfhf2@PLT
11-
; CHECK: br %r14
8+
; CHECK: # %bb.0:
9+
; CHECK-NEXT: lcdfr %f0, %f0
10+
; CHECK-NEXT: br %r14
1211
%res = fneg half %f
1312
ret half %res
1413
}

0 commit comments

Comments
 (0)