Skip to content

Commit 2684fc1

Browse files
author
esmeyi
committed
F16 and f128 conversion.
1 parent 3641efc commit 2684fc1

File tree

3 files changed

+116
-0
lines changed

3 files changed

+116
-0
lines changed

llvm/lib/Target/PowerPC/PPCISelLowering.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,18 +211,24 @@ PPCTargetLowering::PPCTargetLowering(const PPCTargetMachine &TM,
211211
}
212212

213213
if (Subtarget.isISA3_0()) {
214+
setLoadExtAction(ISD::EXTLOAD, MVT::f128, MVT::f16, Legal);
214215
setLoadExtAction(ISD::EXTLOAD, MVT::f64, MVT::f16, Legal);
215216
setLoadExtAction(ISD::EXTLOAD, MVT::f32, MVT::f16, Legal);
217+
setTruncStoreAction(MVT::f128, MVT::f16, Legal);
216218
setTruncStoreAction(MVT::f64, MVT::f16, Legal);
217219
setTruncStoreAction(MVT::f32, MVT::f16, Legal);
218220
} else {
219221
// No extending loads from f16 or HW conversions back and forth.
222+
setLoadExtAction(ISD::EXTLOAD, MVT::f128, MVT::f16, Expand);
223+
setOperationAction(ISD::FP16_TO_FP, MVT::f128, Expand);
224+
setOperationAction(ISD::FP_TO_FP16, MVT::f128, Expand);
220225
setLoadExtAction(ISD::EXTLOAD, MVT::f64, MVT::f16, Expand);
221226
setOperationAction(ISD::FP16_TO_FP, MVT::f64, Expand);
222227
setOperationAction(ISD::FP_TO_FP16, MVT::f64, Expand);
223228
setLoadExtAction(ISD::EXTLOAD, MVT::f32, MVT::f16, Expand);
224229
setOperationAction(ISD::FP16_TO_FP, MVT::f32, Expand);
225230
setOperationAction(ISD::FP_TO_FP16, MVT::f32, Expand);
231+
setTruncStoreAction(MVT::f128, MVT::f16, Expand);
226232
setTruncStoreAction(MVT::f64, MVT::f16, Expand);
227233
setTruncStoreAction(MVT::f32, MVT::f16, Expand);
228234
}

llvm/lib/Target/PowerPC/PPCInstrVSX.td

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3993,6 +3993,10 @@ defm : ScalToVecWPermute<
39933993
(SUBREG_TO_REG (i64 1), (VEXTSH2Ds (LXSIHZX ForceXForm:$src)), sub_64)>;
39943994

39953995
// Load/convert and convert/store patterns for f16.
3996+
def : Pat<(f128 (extloadf16 ForceXForm:$src)),
3997+
(f128 (XSCVDPQP (XSCVHPDP (LXSIHZX ForceXForm:$src))))>;
3998+
def : Pat<(truncstoref16 f128:$src, ForceXForm:$dst),
3999+
(STXSIHX (XSCVDPHP (XSCVQPDP $src)), ForceXForm:$dst)>;
39964000
def : Pat<(f64 (extloadf16 ForceXForm:$src)),
39974001
(f64 (XSCVHPDP (LXSIHZX ForceXForm:$src)))>;
39984002
def : Pat<(truncstoref16 f64:$src, ForceXForm:$dst),
@@ -4001,13 +4005,17 @@ def : Pat<(f32 (extloadf16 ForceXForm:$src)),
40014005
(f32 (COPY_TO_REGCLASS (XSCVHPDP (LXSIHZX ForceXForm:$src)), VSSRC))>;
40024006
def : Pat<(truncstoref16 f32:$src, ForceXForm:$dst),
40034007
(STXSIHX (XSCVDPHP (COPY_TO_REGCLASS $src, VSFRC)), ForceXForm:$dst)>;
4008+
def : Pat<(f128 (f16_to_fp i32:$A)),
4009+
(f128 (XSCVDPQP (XSCVHPDP (MTVSRWZ $A))))>;
40044010
def : Pat<(f64 (f16_to_fp i32:$A)),
40054011
(f64 (XSCVHPDP (MTVSRWZ $A)))>;
40064012
def : Pat<(f32 (f16_to_fp i32:$A)),
40074013
(f32 (COPY_TO_REGCLASS (XSCVHPDP (MTVSRWZ $A)), VSSRC))>;
40084014
def : Pat<(i32 (fp_to_f16 f32:$A)),
40094015
(i32 (MFVSRWZ (XSCVDPHP (COPY_TO_REGCLASS $A, VSFRC))))>;
40104016
def : Pat<(i32 (fp_to_f16 f64:$A)), (i32 (MFVSRWZ (XSCVDPHP $A)))>;
4017+
def : Pat<(i32 (fp_to_f16 f128:$A)),
4018+
(i32 (MFVSRWZ (XSCVDPHP (XSCVQPDP $A))))>;
40114019

40124020
// Vector sign extensions
40134021
def : Pat<(f64 (PPCVexts f64:$A, 1)),
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc -mcpu=pwr8 -mtriple=powerpc64le-unknown-unknown \
3+
; RUN: -verify-machineinstrs -ppc-asm-full-reg-names < %s | FileCheck %s \
4+
; RUN: --check-prefix=P8
5+
; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-unknown \
6+
; RUN: -verify-machineinstrs -ppc-asm-full-reg-names < %s | FileCheck %s
7+
; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-unknown -mattr=-hard-float \
8+
; RUN: -verify-machineinstrs -ppc-asm-full-reg-names < %s | FileCheck %s \
9+
; RUN: --check-prefix=SOFT
10+
11+
define half @trunc(fp128 %a) unnamed_addr {
12+
; P8-LABEL: trunc:
13+
; P8: # %bb.0: # %entry
14+
; P8-NEXT: mflr r0
15+
; P8-NEXT: stdu r1, -32(r1)
16+
; P8-NEXT: std r0, 48(r1)
17+
; P8-NEXT: .cfi_def_cfa_offset 32
18+
; P8-NEXT: .cfi_offset lr, 16
19+
; P8-NEXT: bl __trunctfhf2
20+
; P8-NEXT: nop
21+
; P8-NEXT: clrldi r3, r3, 48
22+
; P8-NEXT: bl __gnu_h2f_ieee
23+
; P8-NEXT: nop
24+
; P8-NEXT: addi r1, r1, 32
25+
; P8-NEXT: ld r0, 16(r1)
26+
; P8-NEXT: mtlr r0
27+
; P8-NEXT: blr
28+
;
29+
; CHECK-LABEL: trunc:
30+
; CHECK: # %bb.0: # %entry
31+
; CHECK-NEXT: xscvqpdp v2, v2
32+
; CHECK-NEXT: xscvdphp f0, vs34
33+
; CHECK-NEXT: mffprwz r3, f0
34+
; CHECK-NEXT: clrlwi r3, r3, 16
35+
; CHECK-NEXT: mtfprwz f0, r3
36+
; CHECK-NEXT: xscvhpdp f1, f0
37+
; CHECK-NEXT: blr
38+
;
39+
; SOFT-LABEL: trunc:
40+
; SOFT: # %bb.0: # %entry
41+
; SOFT-NEXT: mflr r0
42+
; SOFT-NEXT: stdu r1, -32(r1)
43+
; SOFT-NEXT: std r0, 48(r1)
44+
; SOFT-NEXT: .cfi_def_cfa_offset 32
45+
; SOFT-NEXT: .cfi_offset lr, 16
46+
; SOFT-NEXT: bl __trunctfhf2
47+
; SOFT-NEXT: nop
48+
; SOFT-NEXT: clrldi r3, r3, 48
49+
; SOFT-NEXT: bl __gnu_h2f_ieee
50+
; SOFT-NEXT: nop
51+
; SOFT-NEXT: bl __gnu_f2h_ieee
52+
; SOFT-NEXT: nop
53+
; SOFT-NEXT: addi r1, r1, 32
54+
; SOFT-NEXT: ld r0, 16(r1)
55+
; SOFT-NEXT: mtlr r0
56+
; SOFT-NEXT: blr
57+
entry:
58+
%0 = fptrunc fp128 %a to half
59+
ret half %0
60+
}
61+
62+
define fp128 @ext(half %a) unnamed_addr {
63+
; P8-LABEL: ext:
64+
; P8: # %bb.0: # %entry
65+
; P8-NEXT: mflr r0
66+
; P8-NEXT: stdu r1, -32(r1)
67+
; P8-NEXT: std r0, 48(r1)
68+
; P8-NEXT: .cfi_def_cfa_offset 32
69+
; P8-NEXT: .cfi_offset lr, 16
70+
; P8-NEXT: bl __extendsfkf2
71+
; P8-NEXT: nop
72+
; P8-NEXT: addi r1, r1, 32
73+
; P8-NEXT: ld r0, 16(r1)
74+
; P8-NEXT: mtlr r0
75+
; P8-NEXT: blr
76+
;
77+
; CHECK-LABEL: ext:
78+
; CHECK: # %bb.0: # %entry
79+
; CHECK-NEXT: xscpsgndp vs34, f1, f1
80+
; CHECK-NEXT: xscvdpqp v2, v2
81+
; CHECK-NEXT: blr
82+
;
83+
; SOFT-LABEL: ext:
84+
; SOFT: # %bb.0: # %entry
85+
; SOFT-NEXT: mflr r0
86+
; SOFT-NEXT: stdu r1, -32(r1)
87+
; SOFT-NEXT: std r0, 48(r1)
88+
; SOFT-NEXT: .cfi_def_cfa_offset 32
89+
; SOFT-NEXT: .cfi_offset lr, 16
90+
; SOFT-NEXT: clrldi r3, r3, 48
91+
; SOFT-NEXT: bl __gnu_h2f_ieee
92+
; SOFT-NEXT: nop
93+
; SOFT-NEXT: bl __extendsfkf2
94+
; SOFT-NEXT: nop
95+
; SOFT-NEXT: addi r1, r1, 32
96+
; SOFT-NEXT: ld r0, 16(r1)
97+
; SOFT-NEXT: mtlr r0
98+
; SOFT-NEXT: blr
99+
entry:
100+
%0 = fpext half %a to fp128
101+
ret fp128 %0
102+
}

0 commit comments

Comments
 (0)