mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Support very basic (doesn't include ABI support in the front-end, varags, ...) 256-bit argument passing and return for AVX
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@110394 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
130073904f
commit
ac09835a22
@ -33,13 +33,19 @@ def RetCC_X86Common : CallingConv<[
|
||||
CCIfType<[i16], CCAssignToReg<[AX, DX]>>,
|
||||
CCIfType<[i32], CCAssignToReg<[EAX, EDX]>>,
|
||||
CCIfType<[i64], CCAssignToReg<[RAX, RDX]>>,
|
||||
|
||||
// Vector types are returned in XMM0 and XMM1, when they fit. XMMM2 and XMM3
|
||||
|
||||
// Vector types are returned in XMM0 and XMM1, when they fit. XMM2 and XMM3
|
||||
// can only be used by ABI non-compliant code. If the target doesn't have XMM
|
||||
// registers, it won't have vector types.
|
||||
CCIfType<[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64],
|
||||
CCAssignToReg<[XMM0,XMM1,XMM2,XMM3]>>,
|
||||
|
||||
// 256-bit vectors are returned in YMM0 and XMM1, when they fit. YMM2 and YMM3
|
||||
// can only be used by ABI non-compliant code. This vector type is only
|
||||
// supported while using the AVX target feature.
|
||||
CCIfType<[v32i8, v16i16, v8i32, v4i64, v8f32, v4f64],
|
||||
CCIfSubtarget<"hasAVX()", CCAssignToReg<[YMM0,YMM1,YMM2,YMM3]>>>,
|
||||
|
||||
// MMX vector types are always returned in MM0. If the target doesn't have
|
||||
// MM0, it doesn't support these vector types.
|
||||
CCIfType<[v8i8, v4i16, v2i32, v1i64], CCAssignToReg<[MM0]>>,
|
||||
@ -164,11 +170,16 @@ def CC_X86_64_C : CallingConv<[
|
||||
CCIfType<[f32, f64, v16i8, v8i16, v4i32, v2i64, v4f32, v2f64],
|
||||
CCIfSubtarget<"hasSSE1()",
|
||||
CCAssignToReg<[XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7]>>>,
|
||||
|
||||
|
||||
// The first 8 256-bit vector arguments are passed in YMM registers.
|
||||
CCIfType<[v32i8, v16i16, v8i32, v4i64, v8f32, v4f64],
|
||||
CCIfSubtarget<"hasAVX()",
|
||||
CCAssignToReg<[YMM0, YMM1, YMM2, YMM3, YMM4, YMM5, YMM6, YMM7]>>>,
|
||||
|
||||
// Integer/FP values get stored in stack slots that are 8 bytes in size and
|
||||
// 8-byte aligned if there are no more registers to hold them.
|
||||
CCIfType<[i32, i64, f32, f64], CCAssignToStack<8, 8>>,
|
||||
|
||||
|
||||
// Long doubles get stack slots whose size and alignment depends on the
|
||||
// subtarget.
|
||||
CCIfType<[f80], CCAssignToStack<0, 0>>,
|
||||
@ -176,6 +187,10 @@ def CC_X86_64_C : CallingConv<[
|
||||
// Vectors get 16-byte stack slots that are 16-byte aligned.
|
||||
CCIfType<[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], CCAssignToStack<16, 16>>,
|
||||
|
||||
// 256-bit vectors get 32-byte stack slots that are 32-byte aligned.
|
||||
CCIfType<[v32i8, v16i16, v8i32, v4i64, v8f32, v4f64],
|
||||
CCAssignToStack<32, 32>>,
|
||||
|
||||
// __m64 vectors get 8-byte stack slots that are 8-byte aligned.
|
||||
CCIfType<[v8i8, v4i16, v2i32, v1i64], CCAssignToStack<8, 8>>
|
||||
]>;
|
||||
@ -271,9 +286,18 @@ def CC_X86_32_Common : CallingConv<[
|
||||
CCIfNotVarArg<CCIfType<[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64],
|
||||
CCAssignToReg<[XMM0, XMM1, XMM2, XMM3]>>>,
|
||||
|
||||
// The first 4 AVX 256-bit vector arguments are passed in YMM registers.
|
||||
CCIfNotVarArg<CCIfType<[v32i8, v16i16, v8i32, v4i64, v8f32, v4f64],
|
||||
CCIfSubtarget<"hasAVX()",
|
||||
CCAssignToReg<[YMM0, YMM1, YMM2, YMM3]>>>>,
|
||||
|
||||
// Other SSE vectors get 16-byte stack slots that are 16-byte aligned.
|
||||
CCIfType<[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], CCAssignToStack<16, 16>>,
|
||||
|
||||
// 256-bit AVX vectors get 32-byte stack slots that are 32-byte aligned.
|
||||
CCIfType<[v32i8, v16i16, v8i32, v4i64, v8f32, v4f64],
|
||||
CCAssignToStack<32, 32>>,
|
||||
|
||||
// __m64 vectors get 8-byte stack slots that are 4-byte aligned. They are
|
||||
// passed in the parameter area.
|
||||
CCIfType<[v8i8, v4i16, v2i32, v1i64], CCAssignToStack<8, 4>>]>;
|
||||
|
@ -1633,6 +1633,8 @@ X86TargetLowering::LowerFormalArguments(SDValue Chain,
|
||||
RC = X86::FR32RegisterClass;
|
||||
else if (RegVT == MVT::f64)
|
||||
RC = X86::FR64RegisterClass;
|
||||
else if (RegVT.isVector() && RegVT.getSizeInBits() == 256)
|
||||
RC = X86::VR256RegisterClass;
|
||||
else if (RegVT.isVector() && RegVT.getSizeInBits() == 128)
|
||||
RC = X86::VR128RegisterClass;
|
||||
else if (RegVT.isVector() && RegVT.getSizeInBits() == 64)
|
||||
|
Loading…
Reference in New Issue
Block a user