Skip to content

Commit e0bb2ad

Browse files
committed
Initial experiments
1 parent 8411214 commit e0bb2ad

File tree

3 files changed

+116
-0
lines changed

3 files changed

+116
-0
lines changed

clang/lib/Basic/Targets/SystemZ.h

+9
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,20 @@ class LLVM_LIBRARY_VISIBILITY SystemZTargetInfo : public TargetInfo {
9191
"-v128:64-a:8:16-n32:64");
9292
}
9393
MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 128;
94+
95+
HasLegalHalfType = false; // Default=false
96+
HalfArgsAndReturns = false; // Default=false
97+
HasFloat16 = true; // Default=false
98+
9499
HasStrictFP = true;
95100
}
96101

97102
unsigned getMinGlobalAlign(uint64_t Size, bool HasNonWeakDef) const override;
98103

104+
bool useFP16ConversionIntrinsics() const override {
105+
return false;
106+
}
107+
99108
void getTargetDefines(const LangOptions &Opts,
100109
MacroBuilder &Builder) const override;
101110

llvm/lib/Target/SystemZ/SystemZISelLowering.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -704,6 +704,13 @@ SystemZTargetLowering::SystemZTargetLowering(const TargetMachine &TM,
704704
setOperationAction(ISD::BITCAST, MVT::f32, Custom);
705705
}
706706

707+
// Expand FP16 <=> FP32 conversions to libcalls and handle FP16 loads and
708+
// stores in GPRs.
709+
setOperationAction(ISD::FP16_TO_FP, MVT::f32, Expand);
710+
setOperationAction(ISD::FP_TO_FP16, MVT::f32, Expand);
711+
setLoadExtAction(ISD::EXTLOAD, MVT::f32, MVT::f16, Expand);
712+
setTruncStoreAction(MVT::f32, MVT::f16, Expand);
713+
707714
// VASTART and VACOPY need to deal with the SystemZ-specific varargs
708715
// structure, but VAEND is a no-op.
709716
setOperationAction(ISD::VASTART, MVT::Other, Custom);

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

+100
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
3+
;
4+
; Tests for FP16 (Half).
5+
6+
; A function where everything is done in Half.
7+
define void @fun0(ptr %Op0, ptr %Op1, ptr %Dst) {
8+
; CHECK-LABEL: fun0:
9+
; CHECK: # %bb.0: # %entry
10+
; CHECK-NEXT: stmg %r12, %r15, 96(%r15)
11+
; CHECK-NEXT: .cfi_offset %r12, -64
12+
; CHECK-NEXT: .cfi_offset %r13, -56
13+
; CHECK-NEXT: .cfi_offset %r14, -48
14+
; CHECK-NEXT: .cfi_offset %r15, -40
15+
; CHECK-NEXT: aghi %r15, -168
16+
; CHECK-NEXT: .cfi_def_cfa_offset 328
17+
; CHECK-NEXT: std %f8, 160(%r15) # 8-byte Folded Spill
18+
; CHECK-NEXT: .cfi_offset %f8, -168
19+
; CHECK-NEXT: llgh %r2, 0(%r2)
20+
; CHECK-NEXT: lgr %r13, %r4
21+
; CHECK-NEXT: lgr %r12, %r3
22+
; CHECK-NEXT: brasl %r14, __gnu_h2f_ieee@PLT
23+
; CHECK-NEXT: llgh %r2, 0(%r12)
24+
; CHECK-NEXT: ler %f8, %f0
25+
; CHECK-NEXT: brasl %r14, __gnu_h2f_ieee@PLT
26+
; CHECK-NEXT: aebr %f0, %f8
27+
; CHECK-NEXT: brasl %r14, __gnu_f2h_ieee@PLT
28+
; CHECK-NEXT: sth %r2, 0(%r13)
29+
; CHECK-NEXT: ld %f8, 160(%r15) # 8-byte Folded Reload
30+
; CHECK-NEXT: lmg %r12, %r15, 264(%r15)
31+
; CHECK-NEXT: br %r14
32+
entry:
33+
%0 = load half, ptr %Op0, align 2
34+
%1 = load half, ptr %Op1, align 2
35+
%add = fadd half %0, %1
36+
store half %add, ptr %Dst, align 2
37+
ret void
38+
}
39+
40+
; A function where Half values are loaded and extended to float and then
41+
; operated on.
42+
define void @fun1(ptr %Op0, ptr %Op1, ptr %Dst) {
43+
; CHECK-LABEL: fun1:
44+
; CHECK: # %bb.0: # %entry
45+
; CHECK-NEXT: stmg %r12, %r15, 96(%r15)
46+
; CHECK-NEXT: .cfi_offset %r12, -64
47+
; CHECK-NEXT: .cfi_offset %r13, -56
48+
; CHECK-NEXT: .cfi_offset %r14, -48
49+
; CHECK-NEXT: .cfi_offset %r15, -40
50+
; CHECK-NEXT: aghi %r15, -168
51+
; CHECK-NEXT: .cfi_def_cfa_offset 328
52+
; CHECK-NEXT: std %f8, 160(%r15) # 8-byte Folded Spill
53+
; CHECK-NEXT: .cfi_offset %f8, -168
54+
; CHECK-NEXT: llgh %r2, 0(%r2)
55+
; CHECK-NEXT: lgr %r13, %r4
56+
; CHECK-NEXT: lgr %r12, %r3
57+
; CHECK-NEXT: brasl %r14, __gnu_h2f_ieee@PLT
58+
; CHECK-NEXT: llgh %r2, 0(%r12)
59+
; CHECK-NEXT: ler %f8, %f0
60+
; CHECK-NEXT: brasl %r14, __gnu_h2f_ieee@PLT
61+
; CHECK-NEXT: aebr %f0, %f8
62+
; CHECK-NEXT: brasl %r14, __gnu_f2h_ieee@PLT
63+
; CHECK-NEXT: sth %r2, 0(%r13)
64+
; CHECK-NEXT: ld %f8, 160(%r15) # 8-byte Folded Reload
65+
; CHECK-NEXT: lmg %r12, %r15, 264(%r15)
66+
; CHECK-NEXT: br %r14
67+
entry:
68+
%0 = load half, ptr %Op0, align 2
69+
%ext = fpext half %0 to float
70+
%1 = load half, ptr %Op1, align 2
71+
%ext1 = fpext half %1 to float
72+
%add = fadd float %ext, %ext1
73+
%res = fptrunc float %add to half
74+
store half %res, ptr %Dst, align 2
75+
ret void
76+
}
77+
78+
; Test case with a Half incoming argument.
79+
define zeroext i1 @fun2(half noundef %f) {
80+
; CHECK-LABEL: fun2:
81+
; CHECK: # %bb.0: # %start
82+
; CHECK-NEXT: stmg %r14, %r15, 112(%r15)
83+
; CHECK-NEXT: .cfi_offset %r14, -48
84+
; CHECK-NEXT: .cfi_offset %r15, -40
85+
; CHECK-NEXT: aghi %r15, -160
86+
; CHECK-NEXT: .cfi_def_cfa_offset 320
87+
; CHECK-NEXT: brasl %r14, __gnu_f2h_ieee@PLT
88+
; CHECK-NEXT: brasl %r14, __gnu_h2f_ieee@PLT
89+
; CHECK-NEXT: larl %r1, .LCPI2_0
90+
; CHECK-NEXT: deb %f0, 0(%r1)
91+
; CHECK-NEXT: brasl %r14, __gnu_f2h_ieee@PLT
92+
; CHECK-NEXT: risbg %r2, %r2, 63, 191, 49
93+
; CHECK-NEXT: lmg %r14, %r15, 272(%r15)
94+
; CHECK-NEXT: br %r14
95+
start:
96+
%self = fdiv half %f, 0xHC700
97+
%_4 = bitcast half %self to i16
98+
%_0 = icmp slt i16 %_4, 0
99+
ret i1 %_0
100+
}

0 commit comments

Comments
 (0)