Replace XOP vpcom intrinsics with fewer intrinsics that take the immediate as an argument.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@158278 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Craig Topper 2012-06-09 16:46:13 +00:00
parent 82ce516591
commit c29106b36f
4 changed files with 149 additions and 431 deletions

View File

@ -1950,262 +1950,32 @@ let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.".
Intrinsic<[llvm_v4i64_ty],
[llvm_v4i64_ty, llvm_v4i64_ty, llvm_v4i64_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomeqb :
GCCBuiltin<"__builtin_ia32_vpcomeqb">,
Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomeqw :
GCCBuiltin<"__builtin_ia32_vpcomeqw">,
Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomeqd :
GCCBuiltin<"__builtin_ia32_vpcomeqd">,
Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomeqq :
GCCBuiltin<"__builtin_ia32_vpcomeqq">,
Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomequb :
GCCBuiltin<"__builtin_ia32_vpcomequb">,
Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomequd :
GCCBuiltin<"__builtin_ia32_vpcomequd">,
Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomequq :
GCCBuiltin<"__builtin_ia32_vpcomequq">,
Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomequw :
GCCBuiltin<"__builtin_ia32_vpcomequw">,
Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomfalseb :
GCCBuiltin<"__builtin_ia32_vpcomfalseb">,
Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomfalsed :
GCCBuiltin<"__builtin_ia32_vpcomfalsed">,
Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomfalseq :
GCCBuiltin<"__builtin_ia32_vpcomfalseq">,
Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomfalseub :
GCCBuiltin<"__builtin_ia32_vpcomfalseub">,
Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomfalseud :
GCCBuiltin<"__builtin_ia32_vpcomfalseud">,
Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomfalseuq :
GCCBuiltin<"__builtin_ia32_vpcomfalseuq">,
Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomfalseuw :
GCCBuiltin<"__builtin_ia32_vpcomfalseuw">,
Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomfalsew :
GCCBuiltin<"__builtin_ia32_vpcomfalsew">,
Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomgeb :
GCCBuiltin<"__builtin_ia32_vpcomgeb">,
Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomged :
GCCBuiltin<"__builtin_ia32_vpcomged">,
Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomgeq :
GCCBuiltin<"__builtin_ia32_vpcomgeq">,
Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomgeub :
GCCBuiltin<"__builtin_ia32_vpcomgeub">,
Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomgeud :
GCCBuiltin<"__builtin_ia32_vpcomgeud">,
Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomgeuq :
GCCBuiltin<"__builtin_ia32_vpcomgeuq">,
Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomgeuw :
GCCBuiltin<"__builtin_ia32_vpcomgeuw">,
Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomgew :
GCCBuiltin<"__builtin_ia32_vpcomgew">,
Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomgtb :
GCCBuiltin<"__builtin_ia32_vpcomgtb">,
Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomgtd :
GCCBuiltin<"__builtin_ia32_vpcomgtd">,
Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomgtq :
GCCBuiltin<"__builtin_ia32_vpcomgtq">,
Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomgtub :
GCCBuiltin<"__builtin_ia32_vpcomgtub">,
Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomgtud :
GCCBuiltin<"__builtin_ia32_vpcomgtud">,
Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomgtuq :
GCCBuiltin<"__builtin_ia32_vpcomgtuq">,
Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomgtuw :
GCCBuiltin<"__builtin_ia32_vpcomgtuw">,
Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomgtw :
GCCBuiltin<"__builtin_ia32_vpcomgtw">,
Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomleb :
GCCBuiltin<"__builtin_ia32_vpcomleb">,
Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomled :
GCCBuiltin<"__builtin_ia32_vpcomled">,
Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomleq :
GCCBuiltin<"__builtin_ia32_vpcomleq">,
Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomleub :
GCCBuiltin<"__builtin_ia32_vpcomleub">,
Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomleud :
GCCBuiltin<"__builtin_ia32_vpcomleud">,
Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomleuq :
GCCBuiltin<"__builtin_ia32_vpcomleuq">,
Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomleuw :
GCCBuiltin<"__builtin_ia32_vpcomleuw">,
Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomlew :
GCCBuiltin<"__builtin_ia32_vpcomlew">,
Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomltb :
GCCBuiltin<"__builtin_ia32_vpcomltb">,
Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomltd :
GCCBuiltin<"__builtin_ia32_vpcomltd">,
Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomltq :
GCCBuiltin<"__builtin_ia32_vpcomltq">,
Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomltub :
GCCBuiltin<"__builtin_ia32_vpcomltub">,
Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomltud :
GCCBuiltin<"__builtin_ia32_vpcomltud">,
Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomltuq :
GCCBuiltin<"__builtin_ia32_vpcomltuq">,
Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomltuw :
GCCBuiltin<"__builtin_ia32_vpcomltuw">,
Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomltw :
GCCBuiltin<"__builtin_ia32_vpcomltw">,
Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomneb :
GCCBuiltin<"__builtin_ia32_vpcomneb">,
Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomned :
GCCBuiltin<"__builtin_ia32_vpcomned">,
Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomneq :
GCCBuiltin<"__builtin_ia32_vpcomneq">,
Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomneub :
GCCBuiltin<"__builtin_ia32_vpcomneub">,
Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomneud :
GCCBuiltin<"__builtin_ia32_vpcomneud">,
Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomneuq :
GCCBuiltin<"__builtin_ia32_vpcomneuq">,
Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomneuw :
GCCBuiltin<"__builtin_ia32_vpcomneuw">,
Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomnew :
GCCBuiltin<"__builtin_ia32_vpcomnew">,
Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomtrueb :
GCCBuiltin<"__builtin_ia32_vpcomtrueb">,
Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomtrued :
GCCBuiltin<"__builtin_ia32_vpcomtrued">,
Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomtrueq :
GCCBuiltin<"__builtin_ia32_vpcomtrueq">,
Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomtrueub :
GCCBuiltin<"__builtin_ia32_vpcomtrueub">,
Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomtrueud :
GCCBuiltin<"__builtin_ia32_vpcomtrueud">,
Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomtrueuq :
GCCBuiltin<"__builtin_ia32_vpcomtrueuq">,
Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomtrueuw :
GCCBuiltin<"__builtin_ia32_vpcomtrueuw">,
Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomtruew :
GCCBuiltin<"__builtin_ia32_vpcomtruew">,
Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty],
[IntrNoMem]>;
def int_x86_xop_vpcomb : GCCBuiltin<"__builtin_ia32_vpcomb">,
Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty,
llvm_i8_ty], [IntrNoMem]>;
def int_x86_xop_vpcomw : GCCBuiltin<"__builtin_ia32_vpcomw">,
Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
llvm_i8_ty], [IntrNoMem]>;
def int_x86_xop_vpcomd : GCCBuiltin<"__builtin_ia32_vpcomd">,
Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty,
llvm_i8_ty], [IntrNoMem]>;
def int_x86_xop_vpcomq : GCCBuiltin<"__builtin_ia32_vpcomq">,
Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty,
llvm_i8_ty], [IntrNoMem]>;
def int_x86_xop_vpcomub : GCCBuiltin<"__builtin_ia32_vpcomub">,
Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty,
llvm_i8_ty], [IntrNoMem]>;
def int_x86_xop_vpcomuw : GCCBuiltin<"__builtin_ia32_vpcomuw">,
Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty,
llvm_i8_ty], [IntrNoMem]>;
def int_x86_xop_vpcomud : GCCBuiltin<"__builtin_ia32_vpcomud">,
Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty,
llvm_i8_ty], [IntrNoMem]>;
def int_x86_xop_vpcomuq : GCCBuiltin<"__builtin_ia32_vpcomuq">,
Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty,
llvm_i8_ty], [IntrNoMem]>;
def int_x86_xop_vphaddbd :
GCCBuiltin<"__builtin_ia32_vphaddbd">,
Intrinsic<[llvm_v4i32_ty], [llvm_v16i8_ty], [IntrNoMem]>;

View File

@ -9535,193 +9535,39 @@ X86TargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const
return DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i32, SetCC);
}
// XOP comparison intrinsics
case Intrinsic::x86_xop_vpcomltb:
case Intrinsic::x86_xop_vpcomltw:
case Intrinsic::x86_xop_vpcomltd:
case Intrinsic::x86_xop_vpcomltq:
case Intrinsic::x86_xop_vpcomltub:
case Intrinsic::x86_xop_vpcomltuw:
case Intrinsic::x86_xop_vpcomltud:
case Intrinsic::x86_xop_vpcomltuq:
case Intrinsic::x86_xop_vpcomleb:
case Intrinsic::x86_xop_vpcomlew:
case Intrinsic::x86_xop_vpcomled:
case Intrinsic::x86_xop_vpcomleq:
case Intrinsic::x86_xop_vpcomleub:
case Intrinsic::x86_xop_vpcomleuw:
case Intrinsic::x86_xop_vpcomleud:
case Intrinsic::x86_xop_vpcomleuq:
case Intrinsic::x86_xop_vpcomgtb:
case Intrinsic::x86_xop_vpcomgtw:
case Intrinsic::x86_xop_vpcomgtd:
case Intrinsic::x86_xop_vpcomgtq:
case Intrinsic::x86_xop_vpcomgtub:
case Intrinsic::x86_xop_vpcomgtuw:
case Intrinsic::x86_xop_vpcomgtud:
case Intrinsic::x86_xop_vpcomgtuq:
case Intrinsic::x86_xop_vpcomgeb:
case Intrinsic::x86_xop_vpcomgew:
case Intrinsic::x86_xop_vpcomged:
case Intrinsic::x86_xop_vpcomgeq:
case Intrinsic::x86_xop_vpcomgeub:
case Intrinsic::x86_xop_vpcomgeuw:
case Intrinsic::x86_xop_vpcomgeud:
case Intrinsic::x86_xop_vpcomgeuq:
case Intrinsic::x86_xop_vpcomeqb:
case Intrinsic::x86_xop_vpcomeqw:
case Intrinsic::x86_xop_vpcomeqd:
case Intrinsic::x86_xop_vpcomeqq:
case Intrinsic::x86_xop_vpcomequb:
case Intrinsic::x86_xop_vpcomequw:
case Intrinsic::x86_xop_vpcomequd:
case Intrinsic::x86_xop_vpcomequq:
case Intrinsic::x86_xop_vpcomneb:
case Intrinsic::x86_xop_vpcomnew:
case Intrinsic::x86_xop_vpcomned:
case Intrinsic::x86_xop_vpcomneq:
case Intrinsic::x86_xop_vpcomneub:
case Intrinsic::x86_xop_vpcomneuw:
case Intrinsic::x86_xop_vpcomneud:
case Intrinsic::x86_xop_vpcomneuq:
case Intrinsic::x86_xop_vpcomfalseb:
case Intrinsic::x86_xop_vpcomfalsew:
case Intrinsic::x86_xop_vpcomfalsed:
case Intrinsic::x86_xop_vpcomfalseq:
case Intrinsic::x86_xop_vpcomfalseub:
case Intrinsic::x86_xop_vpcomfalseuw:
case Intrinsic::x86_xop_vpcomfalseud:
case Intrinsic::x86_xop_vpcomfalseuq:
case Intrinsic::x86_xop_vpcomtrueb:
case Intrinsic::x86_xop_vpcomtruew:
case Intrinsic::x86_xop_vpcomtrued:
case Intrinsic::x86_xop_vpcomtrueq:
case Intrinsic::x86_xop_vpcomtrueub:
case Intrinsic::x86_xop_vpcomtrueuw:
case Intrinsic::x86_xop_vpcomtrueud:
case Intrinsic::x86_xop_vpcomtrueuq: {
unsigned CC = 0;
unsigned Opc = 0;
case Intrinsic::x86_xop_vpcomb:
case Intrinsic::x86_xop_vpcomw:
case Intrinsic::x86_xop_vpcomd:
case Intrinsic::x86_xop_vpcomq:
case Intrinsic::x86_xop_vpcomub:
case Intrinsic::x86_xop_vpcomuw:
case Intrinsic::x86_xop_vpcomud:
case Intrinsic::x86_xop_vpcomuq: {
unsigned CC;
unsigned Opc;
switch (IntNo) {
default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
case Intrinsic::x86_xop_vpcomltb:
case Intrinsic::x86_xop_vpcomltw:
case Intrinsic::x86_xop_vpcomltd:
case Intrinsic::x86_xop_vpcomltq:
case Intrinsic::x86_xop_vpcomb:
case Intrinsic::x86_xop_vpcomw:
case Intrinsic::x86_xop_vpcomd:
case Intrinsic::x86_xop_vpcomq:
CC = 0;
Opc = X86ISD::VPCOM;
break;
case Intrinsic::x86_xop_vpcomltub:
case Intrinsic::x86_xop_vpcomltuw:
case Intrinsic::x86_xop_vpcomltud:
case Intrinsic::x86_xop_vpcomltuq:
case Intrinsic::x86_xop_vpcomub:
case Intrinsic::x86_xop_vpcomuw:
case Intrinsic::x86_xop_vpcomud:
case Intrinsic::x86_xop_vpcomuq:
CC = 0;
Opc = X86ISD::VPCOMU;
break;
case Intrinsic::x86_xop_vpcomleb:
case Intrinsic::x86_xop_vpcomlew:
case Intrinsic::x86_xop_vpcomled:
case Intrinsic::x86_xop_vpcomleq:
CC = 1;
Opc = X86ISD::VPCOM;
break;
case Intrinsic::x86_xop_vpcomleub:
case Intrinsic::x86_xop_vpcomleuw:
case Intrinsic::x86_xop_vpcomleud:
case Intrinsic::x86_xop_vpcomleuq:
CC = 1;
Opc = X86ISD::VPCOMU;
break;
case Intrinsic::x86_xop_vpcomgtb:
case Intrinsic::x86_xop_vpcomgtw:
case Intrinsic::x86_xop_vpcomgtd:
case Intrinsic::x86_xop_vpcomgtq:
CC = 2;
Opc = X86ISD::VPCOM;
break;
case Intrinsic::x86_xop_vpcomgtub:
case Intrinsic::x86_xop_vpcomgtuw:
case Intrinsic::x86_xop_vpcomgtud:
case Intrinsic::x86_xop_vpcomgtuq:
CC = 2;
Opc = X86ISD::VPCOMU;
break;
case Intrinsic::x86_xop_vpcomgeb:
case Intrinsic::x86_xop_vpcomgew:
case Intrinsic::x86_xop_vpcomged:
case Intrinsic::x86_xop_vpcomgeq:
CC = 3;
Opc = X86ISD::VPCOM;
break;
case Intrinsic::x86_xop_vpcomgeub:
case Intrinsic::x86_xop_vpcomgeuw:
case Intrinsic::x86_xop_vpcomgeud:
case Intrinsic::x86_xop_vpcomgeuq:
CC = 3;
Opc = X86ISD::VPCOMU;
break;
case Intrinsic::x86_xop_vpcomeqb:
case Intrinsic::x86_xop_vpcomeqw:
case Intrinsic::x86_xop_vpcomeqd:
case Intrinsic::x86_xop_vpcomeqq:
CC = 4;
Opc = X86ISD::VPCOM;
break;
case Intrinsic::x86_xop_vpcomequb:
case Intrinsic::x86_xop_vpcomequw:
case Intrinsic::x86_xop_vpcomequd:
case Intrinsic::x86_xop_vpcomequq:
CC = 4;
Opc = X86ISD::VPCOMU;
break;
case Intrinsic::x86_xop_vpcomneb:
case Intrinsic::x86_xop_vpcomnew:
case Intrinsic::x86_xop_vpcomned:
case Intrinsic::x86_xop_vpcomneq:
CC = 5;
Opc = X86ISD::VPCOM;
break;
case Intrinsic::x86_xop_vpcomneub:
case Intrinsic::x86_xop_vpcomneuw:
case Intrinsic::x86_xop_vpcomneud:
case Intrinsic::x86_xop_vpcomneuq:
CC = 5;
Opc = X86ISD::VPCOMU;
break;
case Intrinsic::x86_xop_vpcomfalseb:
case Intrinsic::x86_xop_vpcomfalsew:
case Intrinsic::x86_xop_vpcomfalsed:
case Intrinsic::x86_xop_vpcomfalseq:
CC = 6;
Opc = X86ISD::VPCOM;
break;
case Intrinsic::x86_xop_vpcomfalseub:
case Intrinsic::x86_xop_vpcomfalseuw:
case Intrinsic::x86_xop_vpcomfalseud:
case Intrinsic::x86_xop_vpcomfalseuq:
CC = 6;
Opc = X86ISD::VPCOMU;
break;
case Intrinsic::x86_xop_vpcomtrueb:
case Intrinsic::x86_xop_vpcomtruew:
case Intrinsic::x86_xop_vpcomtrued:
case Intrinsic::x86_xop_vpcomtrueq:
CC = 7;
Opc = X86ISD::VPCOM;
break;
case Intrinsic::x86_xop_vpcomtrueub:
case Intrinsic::x86_xop_vpcomtrueuw:
case Intrinsic::x86_xop_vpcomtrueud:
case Intrinsic::x86_xop_vpcomtrueuq:
CC = 7;
Opc = X86ISD::VPCOMU;
break;
}
SDValue LHS = Op.getOperand(1);
SDValue RHS = Op.getOperand(2);
return DAG.getNode(Opc, dl, Op.getValueType(), LHS, RHS,
DAG.getConstant(CC, MVT::i8));
SDValue Imm = Op.getOperand(3);
return DAG.getNode(Opc, dl, Op.getValueType(), LHS, RHS, Imm);
}
// Arithmetic intrinsics.

View File

@ -60,7 +60,8 @@ static bool UpgradeIntrinsicFunction1(Function *F, Function *&NewFn) {
Name.startswith("x86.avx.vpermil.") ||
Name == "x86.avx.movnt.dq.256" ||
Name == "x86.avx.movnt.pd.256" ||
Name == "x86.avx.movnt.ps.256") {
Name == "x86.avx.movnt.ps.256" ||
(Name.startswith("x86.xop.vpcom") && F->arg_size() == 2)) {
NewFn = 0;
return true;
}
@ -152,6 +153,51 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) {
// Remove intrinsic.
CI->eraseFromParent();
return;
} else if (Name.startswith("llvm.x86.xop.vpcom")) {
Intrinsic::ID intID;
if (Name.endswith("ub"))
intID = Intrinsic::x86_xop_vpcomub;
else if (Name.endswith("uw"))
intID = Intrinsic::x86_xop_vpcomuw;
else if (Name.endswith("ud"))
intID = Intrinsic::x86_xop_vpcomud;
else if (Name.endswith("uq"))
intID = Intrinsic::x86_xop_vpcomuq;
else if (Name.endswith("b"))
intID = Intrinsic::x86_xop_vpcomb;
else if (Name.endswith("w"))
intID = Intrinsic::x86_xop_vpcomw;
else if (Name.endswith("d"))
intID = Intrinsic::x86_xop_vpcomd;
else if (Name.endswith("q"))
intID = Intrinsic::x86_xop_vpcomq;
else
llvm_unreachable("Unknown suffix");
Name = Name.substr(18); // strip off "llvm.x86.xop.vpcom"
unsigned Imm;
if (Name.startswith("lt"))
Imm = 0;
else if (Name.startswith("le"))
Imm = 1;
else if (Name.startswith("gt"))
Imm = 2;
else if (Name.startswith("ge"))
Imm = 3;
else if (Name.startswith("eq"))
Imm = 4;
else if (Name.startswith("ne"))
Imm = 5;
else if (Name.startswith("true"))
Imm = 6;
else if (Name.startswith("false"))
Imm = 7;
else
llvm_unreachable("Unknown condition");
Function *VPCOM = Intrinsic::getDeclaration(F->getParent(), intID);
Rep = Builder.CreateCall3(VPCOM, CI->getArgOperand(0),
CI->getArgOperand(1), Builder.getInt8(Imm));
} else {
bool PD128 = false, PD256 = false, PS128 = false, PS256 = false;
if (Name == "llvm.x86.avx.vpermil.pd.256")

View File

@ -967,3 +967,59 @@ define <8 x float> @test_int_x86_xop_vfrcz_ps_256_mem(<8 x float>* %a0) {
}
declare <8 x float> @llvm.x86.xop.vfrcz.ps.256(<8 x float>) nounwind readnone
define <16 x i8> @test_int_x86_xop_vpcomb(<16 x i8> %a0, <16 x i8> %a1) {
; CHECK:vpcomb
%res = call <16 x i8> @llvm.x86.xop.vpcomb(<16 x i8> %a0, <16 x i8> %a1, i8 0) ;
ret <16 x i8> %res
}
declare <16 x i8> @llvm.x86.xop.vpcomb(<16 x i8>, <16 x i8>, i8) nounwind readnone
define <8 x i16> @test_int_x86_xop_vpcomw(<8 x i16> %a0, <8 x i16> %a1) {
; CHECK: vpcomw
%res = call <8 x i16> @llvm.x86.xop.vpcomw(<8 x i16> %a0, <8 x i16> %a1, i8 0) ;
ret <8 x i16> %res
}
declare <8 x i16> @llvm.x86.xop.vpcomw(<8 x i16>, <8 x i16>, i8) nounwind readnone
define <4 x i32> @test_int_x86_xop_vpcomd(<4 x i32> %a0, <4 x i32> %a1) {
; CHECK: vpcomd
%res = call <4 x i32> @llvm.x86.xop.vpcomd(<4 x i32> %a0, <4 x i32> %a1, i8 0) ;
ret <4 x i32> %res
}
declare <4 x i32> @llvm.x86.xop.vpcomd(<4 x i32>, <4 x i32>, i8) nounwind readnone
define <2 x i64> @test_int_x86_xop_vpcomq(<2 x i64> %a0, <2 x i64> %a1) {
; CHECK: vpcomq
%res = call <2 x i64> @llvm.x86.xop.vpcomq(<2 x i64> %a0, <2 x i64> %a1, i8 0) ;
ret <2 x i64> %res
}
declare <2 x i64> @llvm.x86.xop.vpcomq(<2 x i64>, <2 x i64>, i8) nounwind readnone
define <16 x i8> @test_int_x86_xop_vpcomub(<16 x i8> %a0, <16 x i8> %a1) {
; CHECK:vpcomub
%res = call <16 x i8> @llvm.x86.xop.vpcomub(<16 x i8> %a0, <16 x i8> %a1, i8 0) ;
ret <16 x i8> %res
}
declare <16 x i8> @llvm.x86.xop.vpcomub(<16 x i8>, <16 x i8>, i8) nounwind readnone
define <8 x i16> @test_int_x86_xop_vpcomuw(<8 x i16> %a0, <8 x i16> %a1) {
; CHECK: vpcomuw
%res = call <8 x i16> @llvm.x86.xop.vpcomuw(<8 x i16> %a0, <8 x i16> %a1, i8 0) ;
ret <8 x i16> %res
}
declare <8 x i16> @llvm.x86.xop.vpcomuw(<8 x i16>, <8 x i16>, i8) nounwind readnone
define <4 x i32> @test_int_x86_xop_vpcomud(<4 x i32> %a0, <4 x i32> %a1) {
; CHECK: vpcomud
%res = call <4 x i32> @llvm.x86.xop.vpcomud(<4 x i32> %a0, <4 x i32> %a1, i8 0) ;
ret <4 x i32> %res
}
declare <4 x i32> @llvm.x86.xop.vpcomud(<4 x i32>, <4 x i32>, i8) nounwind readnone
define <2 x i64> @test_int_x86_xop_vpcomuq(<2 x i64> %a0, <2 x i64> %a1) {
; CHECK: vpcomuq
%res = call <2 x i64> @llvm.x86.xop.vpcomuq(<2 x i64> %a0, <2 x i64> %a1, i8 0) ;
ret <2 x i64> %res
}
declare <2 x i64> @llvm.x86.xop.vpcomuq(<2 x i64>, <2 x i64>, i8) nounwind readnone