forked from OSchip/llvm-project
[AVX-512] Use FR32X/FR64X/VR128X/VR256X register classes in addRegisterClass if AVX512(for FR32X/FR64) or VLX(for VR128X/VR256) is supported. This is a minimal requirement to be able to allocate all 32 registers.
llvm-svn: 277319
This commit is contained in:
parent
da50eec26d
commit
3946176314
|
@ -484,8 +484,10 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
|
|||
if (!Subtarget.useSoftFloat() && X86ScalarSSEf64) {
|
||||
// f32 and f64 use SSE.
|
||||
// Set up the FP register classes.
|
||||
addRegisterClass(MVT::f32, &X86::FR32RegClass);
|
||||
addRegisterClass(MVT::f64, &X86::FR64RegClass);
|
||||
addRegisterClass(MVT::f32, Subtarget.hasAVX512() ? &X86::FR32XRegClass
|
||||
: &X86::FR32RegClass);
|
||||
addRegisterClass(MVT::f64, Subtarget.hasAVX512() ? &X86::FR64XRegClass
|
||||
: &X86::FR64RegClass);
|
||||
|
||||
for (auto VT : { MVT::f32, MVT::f64 }) {
|
||||
// Use ANDPD to simulate FABS.
|
||||
|
@ -514,7 +516,8 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
|
|||
} else if (UseX87 && X86ScalarSSEf32) {
|
||||
// Use SSE for f32, x87 for f64.
|
||||
// Set up the FP register classes.
|
||||
addRegisterClass(MVT::f32, &X86::FR32RegClass);
|
||||
addRegisterClass(MVT::f32, Subtarget.hasAVX512() ? &X86::FR32XRegClass
|
||||
: &X86::FR32RegClass);
|
||||
addRegisterClass(MVT::f64, &X86::RFP64RegClass);
|
||||
|
||||
// Use ANDPS to simulate FABS.
|
||||
|
@ -717,7 +720,8 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
|
|||
}
|
||||
|
||||
if (!Subtarget.useSoftFloat() && Subtarget.hasSSE1()) {
|
||||
addRegisterClass(MVT::v4f32, &X86::VR128RegClass);
|
||||
addRegisterClass(MVT::v4f32, Subtarget.hasVLX() ? &X86::VR128XRegClass
|
||||
: &X86::VR128RegClass);
|
||||
|
||||
setOperationAction(ISD::FNEG, MVT::v4f32, Custom);
|
||||
setOperationAction(ISD::FABS, MVT::v4f32, Custom);
|
||||
|
@ -730,14 +734,19 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
|
|||
}
|
||||
|
||||
if (!Subtarget.useSoftFloat() && Subtarget.hasSSE2()) {
|
||||
addRegisterClass(MVT::v2f64, &X86::VR128RegClass);
|
||||
addRegisterClass(MVT::v2f64, Subtarget.hasVLX() ? &X86::VR128XRegClass
|
||||
: &X86::VR128RegClass);
|
||||
|
||||
// FIXME: Unfortunately, -soft-float and -no-implicit-float mean XMM
|
||||
// registers cannot be used even for integer operations.
|
||||
addRegisterClass(MVT::v16i8, &X86::VR128RegClass);
|
||||
addRegisterClass(MVT::v8i16, &X86::VR128RegClass);
|
||||
addRegisterClass(MVT::v4i32, &X86::VR128RegClass);
|
||||
addRegisterClass(MVT::v2i64, &X86::VR128RegClass);
|
||||
addRegisterClass(MVT::v16i8, Subtarget.hasVLX() ? &X86::VR128XRegClass
|
||||
: &X86::VR128RegClass);
|
||||
addRegisterClass(MVT::v8i16, Subtarget.hasVLX() ? &X86::VR128XRegClass
|
||||
: &X86::VR128RegClass);
|
||||
addRegisterClass(MVT::v4i32, Subtarget.hasVLX() ? &X86::VR128XRegClass
|
||||
: &X86::VR128RegClass);
|
||||
addRegisterClass(MVT::v2i64, Subtarget.hasVLX() ? &X86::VR128XRegClass
|
||||
: &X86::VR128RegClass);
|
||||
|
||||
setOperationAction(ISD::MUL, MVT::v16i8, Custom);
|
||||
setOperationAction(ISD::MUL, MVT::v4i32, Custom);
|
||||
|
@ -945,12 +954,18 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
|
|||
if (!Subtarget.useSoftFloat() && Subtarget.hasFp256()) {
|
||||
bool HasInt256 = Subtarget.hasInt256();
|
||||
|
||||
addRegisterClass(MVT::v32i8, &X86::VR256RegClass);
|
||||
addRegisterClass(MVT::v16i16, &X86::VR256RegClass);
|
||||
addRegisterClass(MVT::v8i32, &X86::VR256RegClass);
|
||||
addRegisterClass(MVT::v8f32, &X86::VR256RegClass);
|
||||
addRegisterClass(MVT::v4i64, &X86::VR256RegClass);
|
||||
addRegisterClass(MVT::v4f64, &X86::VR256RegClass);
|
||||
addRegisterClass(MVT::v32i8, Subtarget.hasVLX() ? &X86::VR256XRegClass
|
||||
: &X86::VR256RegClass);
|
||||
addRegisterClass(MVT::v16i16, Subtarget.hasVLX() ? &X86::VR256XRegClass
|
||||
: &X86::VR256RegClass);
|
||||
addRegisterClass(MVT::v8i32, Subtarget.hasVLX() ? &X86::VR256XRegClass
|
||||
: &X86::VR256RegClass);
|
||||
addRegisterClass(MVT::v8f32, Subtarget.hasVLX() ? &X86::VR256XRegClass
|
||||
: &X86::VR256RegClass);
|
||||
addRegisterClass(MVT::v4i64, Subtarget.hasVLX() ? &X86::VR256XRegClass
|
||||
: &X86::VR256RegClass);
|
||||
addRegisterClass(MVT::v4f64, Subtarget.hasVLX() ? &X86::VR256XRegClass
|
||||
: &X86::VR256RegClass);
|
||||
|
||||
for (auto VT : { MVT::v8f32, MVT::v4f64 }) {
|
||||
setOperationAction(ISD::FFLOOR, VT, Legal);
|
||||
|
|
Loading…
Reference in New Issue