mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-14 00:23:44 +00:00
[AVX-512] Add support for lowering fp_to_f16 and f16_to_fp when VLX is supported regardless of whether F16C is also supported.
Still need to add support for lowering using AVX512F when neither VLX or F16C is supported. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281884 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
764028eefa
commit
d5369d3bd4
@ -349,7 +349,8 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
|
||||
// Special handling for half-precision floating point conversions.
|
||||
// If we don't have F16C support, then lower half float conversions
|
||||
// into library calls.
|
||||
if (Subtarget.useSoftFloat() || !Subtarget.hasF16C()) {
|
||||
if (Subtarget.useSoftFloat() ||
|
||||
(!Subtarget.hasF16C() && !Subtarget.hasVLX())) {
|
||||
setOperationAction(ISD::FP16_TO_FP, MVT::f32, Expand);
|
||||
setOperationAction(ISD::FP_TO_FP16, MVT::f32, Expand);
|
||||
}
|
||||
|
@ -6295,6 +6295,26 @@ let Predicates = [HasAVX512] in {
|
||||
}
|
||||
}
|
||||
|
||||
// Patterns for matching conversions from float to half-float and vice versa.
|
||||
let Predicates = [HasVLX] in {
|
||||
// Use MXCSR.RC for rounding instead of explicitly specifying the default
|
||||
// rounding mode (Nearest-Even, encoded as 0). Both are equivalent in the
|
||||
// configurations we support (the default). However, falling back to MXCSR is
|
||||
// more consistent with other instructions, which are always controlled by it.
|
||||
// It's encoded as 0b100.
|
||||
def : Pat<(fp_to_f16 FR32X:$src),
|
||||
(i16 (EXTRACT_SUBREG (VMOVPDI2DIZrr (VCVTPS2PHZ128rr
|
||||
(COPY_TO_REGCLASS FR32X:$src, VR128X), 4)), sub_16bit))>;
|
||||
|
||||
def : Pat<(f16_to_fp GR16:$src),
|
||||
(f32 (COPY_TO_REGCLASS (VCVTPH2PSZ128rr
|
||||
(COPY_TO_REGCLASS (MOVSX32rr16 GR16:$src), VR128X)), FR32X)) >;
|
||||
|
||||
def : Pat<(f16_to_fp (i16 (fp_to_f16 FR32X:$src))),
|
||||
(f32 (COPY_TO_REGCLASS (VCVTPH2PSZ128rr
|
||||
(VCVTPS2PHZ128rr (COPY_TO_REGCLASS FR32X:$src, VR128X), 4)), FR32X)) >;
|
||||
}
|
||||
|
||||
// Unordered/Ordered scalar fp compare with Sea and set EFLAGS
|
||||
multiclass avx512_ord_cmp_sae<bits<8> opc, X86VectorVTInfo _, SDNode OpNode,
|
||||
string OpcodeStr> {
|
||||
|
@ -8227,7 +8227,7 @@ let Predicates = [HasF16C] in {
|
||||
}
|
||||
|
||||
// Patterns for matching conversions from float to half-float and vice versa.
|
||||
let Predicates = [HasF16C] in {
|
||||
let Predicates = [HasF16C, NoVLX] in {
|
||||
// Use MXCSR.RC for rounding instead of explicitly specifying the default
|
||||
// rounding mode (Nearest-Even, encoded as 0). Both are equivalent in the
|
||||
// configurations we support (the default). However, falling back to MXCSR is
|
||||
|
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user