mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-16 00:17:32 +00:00
Add v2f32 (MMX) type to X86. Support is primitive:
load,store,call,return,bitcast. This is enough to make call and return work. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52691 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
45e3958941
commit
a68f9013f2
@ -35,7 +35,7 @@ def RetCC_X86Common : CallingConv<[
|
||||
|
||||
// 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]>>,
|
||||
CCIfType<[v8i8, v4i16, v2i32, v1i64, v2f32], CCAssignToReg<[MM0]>>,
|
||||
|
||||
// Long double types are always returned in ST0 (even with SSE).
|
||||
CCIfType<[f80], CCAssignToReg<[ST0, ST1]>>
|
||||
@ -75,6 +75,9 @@ def RetCC_X86_64_C : CallingConv<[
|
||||
// The X86-64 calling convention always returns FP values in XMM0.
|
||||
CCIfType<[f32], CCAssignToReg<[XMM0, XMM1]>>,
|
||||
CCIfType<[f64], CCAssignToReg<[XMM0, XMM1]>>,
|
||||
|
||||
// MMX vector types are always returned in XMM0.
|
||||
CCIfType<[v8i8, v4i16, v2i32, v1i64, v2f32], CCAssignToReg<[XMM0, XMM1]>>,
|
||||
CCDelegateTo<RetCC_X86Common>
|
||||
]>;
|
||||
|
||||
@ -141,7 +144,7 @@ def CC_X86_64_C : CallingConv<[
|
||||
|
||||
// The first 8 MMX (except for v1i64) vector arguments are passed in XMM
|
||||
// registers on Darwin.
|
||||
CCIfType<[v8i8, v4i16, v2i32],
|
||||
CCIfType<[v8i8, v4i16, v2i32, v2f32],
|
||||
CCIfSubtarget<"isTargetDarwin()",
|
||||
CCIfSubtarget<"hasSSE2()",
|
||||
CCAssignToReg<[XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7]>>>>,
|
||||
@ -163,7 +166,7 @@ def CC_X86_64_C : CallingConv<[
|
||||
CCIfType<[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], CCAssignToStack<16, 16>>,
|
||||
|
||||
// __m64 vectors get 8-byte stack slots that are 8-byte aligned.
|
||||
CCIfType<[v8i8, v4i16, v2i32, v1i64], CCAssignToStack<8, 8>>
|
||||
CCIfType<[v8i8, v4i16, v2i32, v1i64, v2f32], CCAssignToStack<8, 8>>
|
||||
]>;
|
||||
|
||||
// Calling convention used on Win64
|
||||
@ -189,7 +192,7 @@ def CC_X86_Win64_C : CallingConv<[
|
||||
[RCX , RDX , R8 , R9 ]>>,
|
||||
|
||||
// The first 4 MMX vector arguments are passed in GPRs.
|
||||
CCIfType<[v8i8, v4i16, v2i32, v1i64],
|
||||
CCIfType<[v8i8, v4i16, v2i32, v1i64, v2f32],
|
||||
CCAssignToRegWithShadow<[RCX , RDX , R8 , R9 ],
|
||||
[XMM0, XMM1, XMM2, XMM3]>>,
|
||||
|
||||
@ -230,7 +233,7 @@ def CC_X86_64_TailCall : CallingConv<[
|
||||
|
||||
// The first 8 MMX (except for v1i64) vector arguments are passed in XMM
|
||||
// registers on Darwin.
|
||||
CCIfType<[v8i8, v4i16, v2i32],
|
||||
CCIfType<[v8i8, v4i16, v2i32, v2f32],
|
||||
CCIfSubtarget<"isTargetDarwin()",
|
||||
CCAssignToReg<[XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7]>>>,
|
||||
|
||||
@ -270,7 +273,7 @@ def CC_X86_32_Common : CallingConv<[
|
||||
|
||||
// The first 3 __m64 (except for v1i64) vector arguments are passed in mmx
|
||||
// registers if the call is not a vararg call.
|
||||
CCIfNotVarArg<CCIfType<[v8i8, v4i16, v2i32],
|
||||
CCIfNotVarArg<CCIfType<[v8i8, v4i16, v2i32, v2f32],
|
||||
CCAssignToReg<[MM0, MM1, MM2]>>>,
|
||||
|
||||
// Integer/Float values get stored in stack slots that are 4 bytes in
|
||||
|
@ -536,6 +536,7 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)
|
||||
addRegisterClass(MVT::v8i8, X86::VR64RegisterClass);
|
||||
addRegisterClass(MVT::v4i16, X86::VR64RegisterClass);
|
||||
addRegisterClass(MVT::v2i32, X86::VR64RegisterClass);
|
||||
addRegisterClass(MVT::v2f32, X86::VR64RegisterClass);
|
||||
addRegisterClass(MVT::v1i64, X86::VR64RegisterClass);
|
||||
|
||||
// FIXME: add MMX packed arithmetics
|
||||
@ -583,11 +584,14 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)
|
||||
AddPromotedToType (ISD::LOAD, MVT::v4i16, MVT::v1i64);
|
||||
setOperationAction(ISD::LOAD, MVT::v2i32, Promote);
|
||||
AddPromotedToType (ISD::LOAD, MVT::v2i32, MVT::v1i64);
|
||||
setOperationAction(ISD::LOAD, MVT::v2f32, Promote);
|
||||
AddPromotedToType (ISD::LOAD, MVT::v2f32, MVT::v1i64);
|
||||
setOperationAction(ISD::LOAD, MVT::v1i64, Legal);
|
||||
|
||||
setOperationAction(ISD::BUILD_VECTOR, MVT::v8i8, Custom);
|
||||
setOperationAction(ISD::BUILD_VECTOR, MVT::v4i16, Custom);
|
||||
setOperationAction(ISD::BUILD_VECTOR, MVT::v2i32, Custom);
|
||||
setOperationAction(ISD::BUILD_VECTOR, MVT::v2f32, Custom);
|
||||
setOperationAction(ISD::BUILD_VECTOR, MVT::v1i64, Custom);
|
||||
|
||||
setOperationAction(ISD::VECTOR_SHUFFLE, MVT::v8i8, Custom);
|
||||
@ -894,7 +898,7 @@ SDOperand X86TargetLowering::LowerRET(SDOperand Op, SelectionDAG &DAG) {
|
||||
// Don't emit a copytoreg.
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
Chain = DAG.getCopyToReg(Chain, VA.getLocReg(), ValToCopy, Flag);
|
||||
Flag = Chain.getValue(1);
|
||||
}
|
||||
|
@ -528,20 +528,30 @@ def : Pat<(store (v4i16 VR64:$src), addr:$dst),
|
||||
(MMX_MOVQ64mr addr:$dst, VR64:$src)>;
|
||||
def : Pat<(store (v2i32 VR64:$src), addr:$dst),
|
||||
(MMX_MOVQ64mr addr:$dst, VR64:$src)>;
|
||||
def : Pat<(store (v2f32 VR64:$src), addr:$dst),
|
||||
(MMX_MOVQ64mr addr:$dst, VR64:$src)>;
|
||||
def : Pat<(store (v1i64 VR64:$src), addr:$dst),
|
||||
(MMX_MOVQ64mr addr:$dst, VR64:$src)>;
|
||||
|
||||
// Bit convert.
|
||||
def : Pat<(v8i8 (bitconvert (v1i64 VR64:$src))), (v8i8 VR64:$src)>;
|
||||
def : Pat<(v8i8 (bitconvert (v2i32 VR64:$src))), (v8i8 VR64:$src)>;
|
||||
def : Pat<(v8i8 (bitconvert (v2f32 VR64:$src))), (v8i8 VR64:$src)>;
|
||||
def : Pat<(v8i8 (bitconvert (v4i16 VR64:$src))), (v8i8 VR64:$src)>;
|
||||
def : Pat<(v4i16 (bitconvert (v1i64 VR64:$src))), (v4i16 VR64:$src)>;
|
||||
def : Pat<(v4i16 (bitconvert (v2i32 VR64:$src))), (v4i16 VR64:$src)>;
|
||||
def : Pat<(v4i16 (bitconvert (v2f32 VR64:$src))), (v4i16 VR64:$src)>;
|
||||
def : Pat<(v4i16 (bitconvert (v8i8 VR64:$src))), (v4i16 VR64:$src)>;
|
||||
def : Pat<(v2i32 (bitconvert (v1i64 VR64:$src))), (v2i32 VR64:$src)>;
|
||||
def : Pat<(v2i32 (bitconvert (v2f32 VR64:$src))), (v2i32 VR64:$src)>;
|
||||
def : Pat<(v2i32 (bitconvert (v4i16 VR64:$src))), (v2i32 VR64:$src)>;
|
||||
def : Pat<(v2i32 (bitconvert (v8i8 VR64:$src))), (v2i32 VR64:$src)>;
|
||||
def : Pat<(v2f32 (bitconvert (v1i64 VR64:$src))), (v2f32 VR64:$src)>;
|
||||
def : Pat<(v2f32 (bitconvert (v2i32 VR64:$src))), (v2f32 VR64:$src)>;
|
||||
def : Pat<(v2f32 (bitconvert (v4i16 VR64:$src))), (v2f32 VR64:$src)>;
|
||||
def : Pat<(v2f32 (bitconvert (v8i8 VR64:$src))), (v2f32 VR64:$src)>;
|
||||
def : Pat<(v1i64 (bitconvert (v2i32 VR64:$src))), (v1i64 VR64:$src)>;
|
||||
def : Pat<(v1i64 (bitconvert (v2f32 VR64:$src))), (v1i64 VR64:$src)>;
|
||||
def : Pat<(v1i64 (bitconvert (v4i16 VR64:$src))), (v1i64 VR64:$src)>;
|
||||
def : Pat<(v1i64 (bitconvert (v8i8 VR64:$src))), (v1i64 VR64:$src)>;
|
||||
|
||||
@ -550,6 +560,8 @@ def : Pat<(v1i64 (bitconvert (i64 GR64:$src))),
|
||||
(MMX_MOVD64to64rr GR64:$src)>;
|
||||
def : Pat<(v2i32 (bitconvert (i64 GR64:$src))),
|
||||
(MMX_MOVD64to64rr GR64:$src)>;
|
||||
def : Pat<(v2f32 (bitconvert (i64 GR64:$src))),
|
||||
(MMX_MOVD64to64rr GR64:$src)>;
|
||||
def : Pat<(v4i16 (bitconvert (i64 GR64:$src))),
|
||||
(MMX_MOVD64to64rr GR64:$src)>;
|
||||
def : Pat<(v8i8 (bitconvert (i64 GR64:$src))),
|
||||
@ -558,6 +570,8 @@ def : Pat<(i64 (bitconvert (v1i64 VR64:$src))),
|
||||
(MMX_MOVD64from64rr VR64:$src)>;
|
||||
def : Pat<(i64 (bitconvert (v2i32 VR64:$src))),
|
||||
(MMX_MOVD64from64rr VR64:$src)>;
|
||||
def : Pat<(i64 (bitconvert (v2f32 VR64:$src))),
|
||||
(MMX_MOVD64from64rr VR64:$src)>;
|
||||
def : Pat<(i64 (bitconvert (v4i16 VR64:$src))),
|
||||
(MMX_MOVD64from64rr VR64:$src)>;
|
||||
def : Pat<(i64 (bitconvert (v8i8 VR64:$src))),
|
||||
|
@ -509,7 +509,7 @@ def RST : RegisterClass<"X86", [f80, f64, f32], 32,
|
||||
}
|
||||
|
||||
// Generic vector registers: VR64 and VR128.
|
||||
def VR64 : RegisterClass<"X86", [v8i8, v4i16, v2i32, v1i64], 64,
|
||||
def VR64 : RegisterClass<"X86", [v8i8, v4i16, v2i32, v1i64, v2f32], 64,
|
||||
[MM0, MM1, MM2, MM3, MM4, MM5, MM6, MM7]>;
|
||||
def VR128 : RegisterClass<"X86", [v16i8, v8i16, v4i32, v2i64, v4f32, v2f64],128,
|
||||
[XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7,
|
||||
|
Loading…
Reference in New Issue
Block a user