mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
Add intrinsics to match mmx shift builtin's with immediate operand.
llvm-svn: 48569
This commit is contained in:
parent
c9c6d88ee5
commit
6f729b2820
@ -916,29 +916,53 @@ let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.".
|
||||
def int_x86_mmx_psll_w : GCCBuiltin<"__builtin_ia32_psllw">,
|
||||
Intrinsic<[llvm_v4i16_ty, llvm_v4i16_ty,
|
||||
llvm_v1i64_ty], [IntrNoMem]>;
|
||||
def int_x86_mmx_pslli_w : GCCBuiltin<"__builtin_ia32_psllwi">,
|
||||
Intrinsic<[llvm_v4i16_ty, llvm_v4i16_ty,
|
||||
llvm_i32_ty], [IntrNoMem]>;
|
||||
def int_x86_mmx_psll_d : GCCBuiltin<"__builtin_ia32_pslld">,
|
||||
Intrinsic<[llvm_v2i32_ty, llvm_v2i32_ty,
|
||||
llvm_v1i64_ty], [IntrNoMem]>;
|
||||
def int_x86_mmx_pslli_d : GCCBuiltin<"__builtin_ia32_pslldi">,
|
||||
Intrinsic<[llvm_v2i32_ty, llvm_v2i32_ty,
|
||||
llvm_i32_ty], [IntrNoMem]>;
|
||||
def int_x86_mmx_psll_q : GCCBuiltin<"__builtin_ia32_psllq">,
|
||||
Intrinsic<[llvm_v1i64_ty, llvm_v1i64_ty,
|
||||
llvm_v1i64_ty], [IntrNoMem]>;
|
||||
def int_x86_mmx_pslli_q : GCCBuiltin<"__builtin_ia32_psllqi">,
|
||||
Intrinsic<[llvm_v1i64_ty, llvm_v1i64_ty,
|
||||
llvm_i32_ty], [IntrNoMem]>;
|
||||
|
||||
def int_x86_mmx_psrl_w : GCCBuiltin<"__builtin_ia32_psrlw">,
|
||||
Intrinsic<[llvm_v4i16_ty, llvm_v4i16_ty,
|
||||
llvm_v1i64_ty], [IntrNoMem]>;
|
||||
def int_x86_mmx_psrli_w : GCCBuiltin<"__builtin_ia32_psrlwi">,
|
||||
Intrinsic<[llvm_v4i16_ty, llvm_v4i16_ty,
|
||||
llvm_i32_ty], [IntrNoMem]>;
|
||||
def int_x86_mmx_psrl_d : GCCBuiltin<"__builtin_ia32_psrld">,
|
||||
Intrinsic<[llvm_v2i32_ty, llvm_v2i32_ty,
|
||||
llvm_v1i64_ty], [IntrNoMem]>;
|
||||
def int_x86_mmx_psrli_d : GCCBuiltin<"__builtin_ia32_psrldi">,
|
||||
Intrinsic<[llvm_v2i32_ty, llvm_v2i32_ty,
|
||||
llvm_i32_ty], [IntrNoMem]>;
|
||||
def int_x86_mmx_psrl_q : GCCBuiltin<"__builtin_ia32_psrlq">,
|
||||
Intrinsic<[llvm_v1i64_ty, llvm_v1i64_ty,
|
||||
llvm_v1i64_ty], [IntrNoMem]>;
|
||||
def int_x86_mmx_psrli_q : GCCBuiltin<"__builtin_ia32_psrlqi">,
|
||||
Intrinsic<[llvm_v1i64_ty, llvm_v1i64_ty,
|
||||
llvm_i32_ty], [IntrNoMem]>;
|
||||
|
||||
def int_x86_mmx_psra_w : GCCBuiltin<"__builtin_ia32_psraw">,
|
||||
Intrinsic<[llvm_v4i16_ty, llvm_v4i16_ty,
|
||||
llvm_v1i64_ty], [IntrNoMem]>;
|
||||
def int_x86_mmx_psrai_w : GCCBuiltin<"__builtin_ia32_psrawi">,
|
||||
Intrinsic<[llvm_v4i16_ty, llvm_v4i16_ty,
|
||||
llvm_i32_ty], [IntrNoMem]>;
|
||||
def int_x86_mmx_psra_d : GCCBuiltin<"__builtin_ia32_psrad">,
|
||||
Intrinsic<[llvm_v2i32_ty, llvm_v2i32_ty,
|
||||
llvm_v1i64_ty], [IntrNoMem]>;
|
||||
def int_x86_mmx_psrai_d : GCCBuiltin<"__builtin_ia32_psradi">,
|
||||
Intrinsic<[llvm_v2i32_ty, llvm_v2i32_ty,
|
||||
llvm_i32_ty], [IntrNoMem]>;
|
||||
}
|
||||
|
||||
// Pack ops.
|
||||
|
@ -116,7 +116,8 @@ let isTwoAddress = 1 in {
|
||||
}
|
||||
|
||||
multiclass MMXI_binop_rmi_int<bits<8> opc, bits<8> opc2, Format ImmForm,
|
||||
string OpcodeStr, Intrinsic IntId> {
|
||||
string OpcodeStr, Intrinsic IntId,
|
||||
Intrinsic ImmIntId> {
|
||||
def rr : MMXI<opc, MRMSrcReg, (outs VR64:$dst), (ins VR64:$src1, VR64:$src2),
|
||||
!strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
|
||||
[(set VR64:$dst, (IntId VR64:$src1, VR64:$src2))]>;
|
||||
@ -126,8 +127,7 @@ let isTwoAddress = 1 in {
|
||||
(bitconvert (load_mmx addr:$src2))))]>;
|
||||
def ri : MMXIi8<opc2, ImmForm, (outs VR64:$dst), (ins VR64:$src1, i32i8imm:$src2),
|
||||
!strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
|
||||
[(set VR64:$dst, (IntId VR64:$src1,
|
||||
(scalar_to_vector (i32 imm:$src2))))]>;
|
||||
[(set VR64:$dst, (ImmIntId VR64:$src1, imm:$src2))]>;
|
||||
}
|
||||
}
|
||||
|
||||
@ -268,23 +268,23 @@ let isTwoAddress = 1 in {
|
||||
|
||||
// Shift Instructions
|
||||
defm MMX_PSRLW : MMXI_binop_rmi_int<0xD1, 0x71, MRM2r, "psrlw",
|
||||
int_x86_mmx_psrl_w>;
|
||||
int_x86_mmx_psrl_w, int_x86_mmx_psrli_w>;
|
||||
defm MMX_PSRLD : MMXI_binop_rmi_int<0xD2, 0x72, MRM2r, "psrld",
|
||||
int_x86_mmx_psrl_d>;
|
||||
int_x86_mmx_psrl_d, int_x86_mmx_psrli_d>;
|
||||
defm MMX_PSRLQ : MMXI_binop_rmi_int<0xD3, 0x73, MRM2r, "psrlq",
|
||||
int_x86_mmx_psrl_q>;
|
||||
int_x86_mmx_psrl_q, int_x86_mmx_psrli_q>;
|
||||
|
||||
defm MMX_PSLLW : MMXI_binop_rmi_int<0xF1, 0x71, MRM6r, "psllw",
|
||||
int_x86_mmx_psll_w>;
|
||||
int_x86_mmx_psll_w, int_x86_mmx_pslli_w>;
|
||||
defm MMX_PSLLD : MMXI_binop_rmi_int<0xF2, 0x72, MRM6r, "pslld",
|
||||
int_x86_mmx_psll_d>;
|
||||
int_x86_mmx_psll_d, int_x86_mmx_pslli_d>;
|
||||
defm MMX_PSLLQ : MMXI_binop_rmi_int<0xF3, 0x73, MRM6r, "psllq",
|
||||
int_x86_mmx_psll_q>;
|
||||
int_x86_mmx_psll_q, int_x86_mmx_pslli_q>;
|
||||
|
||||
defm MMX_PSRAW : MMXI_binop_rmi_int<0xE1, 0x71, MRM4r, "psraw",
|
||||
int_x86_mmx_psra_w>;
|
||||
int_x86_mmx_psra_w, int_x86_mmx_psrai_w>;
|
||||
defm MMX_PSRAD : MMXI_binop_rmi_int<0xE2, 0x72, MRM4r, "psrad",
|
||||
int_x86_mmx_psra_d>;
|
||||
int_x86_mmx_psra_d, int_x86_mmx_psrai_d>;
|
||||
|
||||
// Comparison Instructions
|
||||
defm MMX_PCMPEQB : MMXI_binop_rm_int<0x74, "pcmpeqb", int_x86_mmx_pcmpeq_b>;
|
||||
|
@ -122,7 +122,8 @@ static bool UpgradeIntrinsicFunction1(Function *F, Function *&NewFn) {
|
||||
if (Name.compare(5,10,"x86.mmx.ps",10) == 0 &&
|
||||
(Name.compare(13,4,"psll", 4) == 0 ||
|
||||
Name.compare(13,4,"psra", 4) == 0 ||
|
||||
Name.compare(13,4,"psrl", 4) == 0)) {
|
||||
Name.compare(13,4,"psrl", 4) == 0) &&
|
||||
Name[17] != 'i') {
|
||||
|
||||
const llvm::Type *VT = VectorType::get(IntegerType::get(64), 1);
|
||||
|
||||
|
20
test/CodeGen/X86/mmx-shift.ll
Normal file
20
test/CodeGen/X86/mmx-shift.ll
Normal file
@ -0,0 +1,20 @@
|
||||
; RUN: llvm-as < %s | llc -march=x86 -mattr=+mmx | grep psllq | grep 32
|
||||
; RUN: llvm-as < %s | llc -march=x86 -mattr=+mmx | grep psrad
|
||||
|
||||
define i64 @t1(<1 x i64> %mm1) nounwind {
|
||||
entry:
|
||||
%tmp6 = tail call <1 x i64> @llvm.x86.mmx.pslli.q( <1 x i64> %mm1, i32 32 ) ; <<1 x i64>> [#uses=1]
|
||||
%retval1112 = bitcast <1 x i64> %tmp6 to i64 ; <i64> [#uses=1]
|
||||
ret i64 %retval1112
|
||||
}
|
||||
|
||||
declare <1 x i64> @llvm.x86.mmx.pslli.q(<1 x i64>, i32) nounwind readnone
|
||||
|
||||
define i64 @t2(<2 x i32> %mm1, <2 x i32> %mm2) nounwind {
|
||||
entry:
|
||||
%tmp7 = tail call <2 x i32> @llvm.x86.mmx.psra.d( <2 x i32> %mm1, <2 x i32> %mm2 ) nounwind readnone ; <<2 x i32>> [#uses=1]
|
||||
%retval1112 = bitcast <2 x i32> %tmp7 to i64 ; <i64> [#uses=1]
|
||||
ret i64 %retval1112
|
||||
}
|
||||
|
||||
declare <2 x i32> @llvm.x86.mmx.psra.d(<2 x i32>, <2 x i32>) nounwind readnone
|
Loading…
Reference in New Issue
Block a user