Skip to content

Commit 0a819fe

Browse files
author
esmeyi
committed
For truncation from f128 to f16, always use the lib fucntion (direct conversion) instead of HW instructions (stepwise conversion).
1 parent 2684fc1 commit 0a819fe

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
@@ -210,25 +210,25 @@ PPCTargetLowering::PPCTargetLowering(const PPCTargetMachine &TM,
210210
setLoadExtAction(ISD::SEXTLOAD, VT, MVT::i8, Expand);
211211
}
212212

213+
setTruncStoreAction(MVT::f128, MVT::f16, Expand);
214+
setOperationAction(ISD::FP_TO_FP16, MVT::f128, Expand);
215+
213216
if (Subtarget.isISA3_0()) {
214217
setLoadExtAction(ISD::EXTLOAD, MVT::f128, MVT::f16, Legal);
215218
setLoadExtAction(ISD::EXTLOAD, MVT::f64, MVT::f16, Legal);
216219
setLoadExtAction(ISD::EXTLOAD, MVT::f32, MVT::f16, Legal);
217-
setTruncStoreAction(MVT::f128, MVT::f16, Legal);
218220
setTruncStoreAction(MVT::f64, MVT::f16, Legal);
219221
setTruncStoreAction(MVT::f32, MVT::f16, Legal);
220222
} else {
221223
// No extending loads from f16 or HW conversions back and forth.
222224
setLoadExtAction(ISD::EXTLOAD, MVT::f128, MVT::f16, Expand);
223225
setOperationAction(ISD::FP16_TO_FP, MVT::f128, Expand);
224-
setOperationAction(ISD::FP_TO_FP16, MVT::f128, Expand);
225226
setLoadExtAction(ISD::EXTLOAD, MVT::f64, MVT::f16, Expand);
226227
setOperationAction(ISD::FP16_TO_FP, MVT::f64, Expand);
227228
setOperationAction(ISD::FP_TO_FP16, MVT::f64, Expand);
228229
setLoadExtAction(ISD::EXTLOAD, MVT::f32, MVT::f16, Expand);
229230
setOperationAction(ISD::FP16_TO_FP, MVT::f32, Expand);
230231
setOperationAction(ISD::FP_TO_FP16, MVT::f32, Expand);
231-
setTruncStoreAction(MVT::f128, MVT::f16, Expand);
232232
setTruncStoreAction(MVT::f64, MVT::f16, Expand);
233233
setTruncStoreAction(MVT::f32, MVT::f16, Expand);
234234
}

llvm/lib/Target/PowerPC/PPCInstrVSX.td

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3995,8 +3995,6 @@ defm : ScalToVecWPermute<
39953995
// Load/convert and convert/store patterns for f16.
39963996
def : Pat<(f128 (extloadf16 ForceXForm:$src)),
39973997
(f128 (XSCVDPQP (XSCVHPDP (LXSIHZX ForceXForm:$src))))>;
3998-
def : Pat<(truncstoref16 f128:$src, ForceXForm:$dst),
3999-
(STXSIHX (XSCVDPHP (XSCVQPDP $src)), ForceXForm:$dst)>;
40003998
def : Pat<(f64 (extloadf16 ForceXForm:$src)),
40013999
(f64 (XSCVHPDP (LXSIHZX ForceXForm:$src)))>;
40024000
def : Pat<(truncstoref16 f64:$src, ForceXForm:$dst),
@@ -4014,8 +4012,6 @@ def : Pat<(f32 (f16_to_fp i32:$A)),
40144012
def : Pat<(i32 (fp_to_f16 f32:$A)),
40154013
(i32 (MFVSRWZ (XSCVDPHP (COPY_TO_REGCLASS $A, VSFRC))))>;
40164014
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))))>;
40194015

40204016
// Vector sign extensions
40214017
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)