Skip to content

Commit 864b9ac

Browse files
esmeyilei137
authored andcommitted
For truncation from f128 to f16, always use the lib fucntion (direct conversion) instead of HW instructions (stepwise conversion).
1 parent 522a2f0 commit 864b9ac

File tree

3 files changed

+13
-10
lines changed

3 files changed

+13
-10
lines changed

llvm/lib/Target/PowerPC/PPCISelLowering.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -223,25 +223,25 @@ PPCTargetLowering::PPCTargetLowering(const PPCTargetMachine &TM,
223223
setLoadExtAction(ISD::SEXTLOAD, VT, MVT::i8, Expand);
224224
}
225225

226+
setTruncStoreAction(MVT::f128, MVT::f16, Expand);
227+
setOperationAction(ISD::FP_TO_FP16, MVT::f128, Expand);
228+
226229
if (Subtarget.isISA3_0()) {
227230
setLoadExtAction(ISD::EXTLOAD, MVT::f128, MVT::f16, Legal);
228231
setLoadExtAction(ISD::EXTLOAD, MVT::f64, MVT::f16, Legal);
229232
setLoadExtAction(ISD::EXTLOAD, MVT::f32, MVT::f16, Legal);
230-
setTruncStoreAction(MVT::f128, MVT::f16, Legal);
231233
setTruncStoreAction(MVT::f64, MVT::f16, Legal);
232234
setTruncStoreAction(MVT::f32, MVT::f16, Legal);
233235
} else {
234236
// No extending loads from f16 or HW conversions back and forth.
235237
setLoadExtAction(ISD::EXTLOAD, MVT::f128, MVT::f16, Expand);
236238
setOperationAction(ISD::FP16_TO_FP, MVT::f128, Expand);
237-
setOperationAction(ISD::FP_TO_FP16, MVT::f128, Expand);
238239
setLoadExtAction(ISD::EXTLOAD, MVT::f64, MVT::f16, Expand);
239240
setOperationAction(ISD::FP16_TO_FP, MVT::f64, Expand);
240241
setOperationAction(ISD::FP_TO_FP16, MVT::f64, Expand);
241242
setLoadExtAction(ISD::EXTLOAD, MVT::f32, MVT::f16, Expand);
242243
setOperationAction(ISD::FP16_TO_FP, MVT::f32, Expand);
243244
setOperationAction(ISD::FP_TO_FP16, MVT::f32, Expand);
244-
setTruncStoreAction(MVT::f128, MVT::f16, Expand);
245245
setTruncStoreAction(MVT::f64, MVT::f16, Expand);
246246
setTruncStoreAction(MVT::f32, MVT::f16, Expand);
247247
}

llvm/lib/Target/PowerPC/PPCInstrVSX.td

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3997,8 +3997,6 @@ defm : ScalToVecWPermute<
39973997
// Load/convert and convert/store patterns for f16.
39983998
def : Pat<(f128 (extloadf16 ForceXForm:$src)),
39993999
(f128 (XSCVDPQP (XSCVHPDP (LXSIHZX ForceXForm:$src))))>;
4000-
def : Pat<(truncstoref16 f128:$src, ForceXForm:$dst),
4001-
(STXSIHX (XSCVDPHP (XSCVQPDP $src)), ForceXForm:$dst)>;
40024000
def : Pat<(f64 (extloadf16 ForceXForm:$src)),
40034001
(f64 (XSCVHPDP (LXSIHZX ForceXForm:$src)))>;
40044002
def : Pat<(truncstoref16 f64:$src, ForceXForm:$dst),
@@ -4016,8 +4014,6 @@ def : Pat<(f32 (f16_to_fp i32:$A)),
40164014
def : Pat<(i32 (fp_to_f16 f32:$A)),
40174015
(i32 (MFVSRWZ (XSCVDPHP (COPY_TO_REGCLASS $A, VSFRC))))>;
40184016
def : Pat<(i32 (fp_to_f16 f64:$A)), (i32 (MFVSRWZ (XSCVDPHP $A)))>;
4019-
def : Pat<(i32 (fp_to_f16 f128:$A)),
4020-
(i32 (MFVSRWZ (XSCVDPHP (XSCVQPDP $A))))>;
40214017

40224018
// Vector sign extensions
40234019
def : Pat<(f64 (PPCVexts f64:$A, 1)),

llvm/test/CodeGen/PowerPC/f16-to-from-f128.ll

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,19 @@ define half @trunc(fp128 %a) unnamed_addr {
2828
;
2929
; CHECK-LABEL: trunc:
3030
; CHECK: # %bb.0: # %entry
31-
; CHECK-NEXT: xscvqpdp v2, v2
32-
; CHECK-NEXT: xscvdphp f0, vs34
33-
; CHECK-NEXT: mffprwz r3, f0
31+
; CHECK-NEXT: mflr r0
32+
; CHECK-NEXT: stdu r1, -32(r1)
33+
; CHECK-NEXT: std r0, 48(r1)
34+
; CHECK-NEXT: .cfi_def_cfa_offset 32
35+
; CHECK-NEXT: .cfi_offset lr, 16
36+
; CHECK-NEXT: bl __trunctfhf2
37+
; CHECK-NEXT: nop
3438
; CHECK-NEXT: clrlwi r3, r3, 16
3539
; CHECK-NEXT: mtfprwz f0, r3
3640
; CHECK-NEXT: xscvhpdp f1, f0
41+
; CHECK-NEXT: addi r1, r1, 32
42+
; CHECK-NEXT: ld r0, 16(r1)
43+
; CHECK-NEXT: mtlr r0
3744
; CHECK-NEXT: blr
3845
;
3946
; SOFT-LABEL: trunc:

0 commit comments

Comments
 (0)