mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
Add intrinsic for pclmulqdq instruction.
llvm-svn: 157731
This commit is contained in:
parent
9d64361208
commit
c6bd90e646
@ -819,6 +819,13 @@ let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.".
|
||||
[IntrNoMem]>;
|
||||
}
|
||||
|
||||
// PCLMUL instruction
|
||||
let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.".
|
||||
def int_x86_pclmulqdq : GCCBuiltin<"__builtin_ia32_pclmulqdq128">,
|
||||
Intrinsic<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_v2i64_ty, llvm_i8_ty],
|
||||
[IntrNoMem]>;
|
||||
}
|
||||
|
||||
// Vector pack
|
||||
let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.".
|
||||
def int_x86_sse41_packusdw : GCCBuiltin<"__builtin_ia32_packusdw128">,
|
||||
|
@ -7212,49 +7212,47 @@ def AESKEYGENASSIST128rm : AESAI<0xDF, MRMSrcMem, (outs VR128:$dst),
|
||||
// CLMUL Instructions
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// Carry-less Multiplication instructions
|
||||
let neverHasSideEffects = 1 in {
|
||||
// AVX carry-less Multiplication instructions
|
||||
def VPCLMULQDQrr : AVXCLMULIi8<0x44, MRMSrcReg, (outs VR128:$dst),
|
||||
(ins VR128:$src1, VR128:$src2, i8imm:$src3),
|
||||
"vpclmulqdq\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}",
|
||||
[]>;
|
||||
[(set VR128:$dst,
|
||||
(int_x86_pclmulqdq VR128:$src1, VR128:$src2, imm:$src3))]>;
|
||||
|
||||
let mayLoad = 1 in
|
||||
def VPCLMULQDQrm : AVXCLMULIi8<0x44, MRMSrcMem, (outs VR128:$dst),
|
||||
(ins VR128:$src1, i128mem:$src2, i8imm:$src3),
|
||||
"vpclmulqdq\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}",
|
||||
[]>;
|
||||
[(set VR128:$dst, (int_x86_pclmulqdq VR128:$src1,
|
||||
(memopv2i64 addr:$src2), imm:$src3))]>;
|
||||
|
||||
// Carry-less Multiplication instructions
|
||||
let Constraints = "$src1 = $dst" in {
|
||||
def PCLMULQDQrr : CLMULIi8<0x44, MRMSrcReg, (outs VR128:$dst),
|
||||
(ins VR128:$src1, VR128:$src2, i8imm:$src3),
|
||||
"pclmulqdq\t{$src3, $src2, $dst|$dst, $src2, $src3}",
|
||||
[]>;
|
||||
[(set VR128:$dst,
|
||||
(int_x86_pclmulqdq VR128:$src1, VR128:$src2, imm:$src3))]>;
|
||||
|
||||
let mayLoad = 1 in
|
||||
def PCLMULQDQrm : CLMULIi8<0x44, MRMSrcMem, (outs VR128:$dst),
|
||||
(ins VR128:$src1, i128mem:$src2, i8imm:$src3),
|
||||
"pclmulqdq\t{$src3, $src2, $dst|$dst, $src2, $src3}",
|
||||
[]>;
|
||||
[(set VR128:$dst, (int_x86_pclmulqdq VR128:$src1,
|
||||
(memopv2i64 addr:$src2), imm:$src3))]>;
|
||||
} // Constraints = "$src1 = $dst"
|
||||
} // neverHasSideEffects = 1
|
||||
|
||||
|
||||
multiclass pclmul_alias<string asm, int immop> {
|
||||
def : InstAlias<!strconcat("pclmul", asm,
|
||||
"dq {$src, $dst|$dst, $src}"),
|
||||
def : InstAlias<!strconcat("pclmul", asm, "dq {$src, $dst|$dst, $src}"),
|
||||
(PCLMULQDQrr VR128:$dst, VR128:$src, immop)>;
|
||||
|
||||
def : InstAlias<!strconcat("pclmul", asm,
|
||||
"dq {$src, $dst|$dst, $src}"),
|
||||
def : InstAlias<!strconcat("pclmul", asm, "dq {$src, $dst|$dst, $src}"),
|
||||
(PCLMULQDQrm VR128:$dst, i128mem:$src, immop)>;
|
||||
|
||||
def : InstAlias<!strconcat("vpclmul", asm,
|
||||
def : InstAlias<!strconcat("vpclmul", asm,
|
||||
"dq {$src2, $src1, $dst|$dst, $src1, $src2}"),
|
||||
(VPCLMULQDQrr VR128:$dst, VR128:$src1, VR128:$src2, immop)>;
|
||||
|
||||
def : InstAlias<!strconcat("vpclmul", asm,
|
||||
def : InstAlias<!strconcat("vpclmul", asm,
|
||||
"dq {$src2, $src1, $dst|$dst, $src1, $src2}"),
|
||||
(VPCLMULQDQrm VR128:$dst, VR128:$src1, i128mem:$src2, immop)>;
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
; RUN: llc < %s -mtriple=x86_64-apple-darwin -march=x86 -mcpu=corei7 -mattr=avx | FileCheck %s
|
||||
; RUN: llc < %s -mtriple=x86_64-apple-darwin -march=x86 -mcpu=corei7-avx | FileCheck %s
|
||||
|
||||
define <2 x i64> @test_x86_aesni_aesdec(<2 x i64> %a0, <2 x i64> %a1) {
|
||||
; CHECK: vaesdec
|
||||
@ -2579,3 +2579,12 @@ define void @movnt_pd(i8* %p, <4 x double> %a1) nounwind {
|
||||
ret void
|
||||
}
|
||||
declare void @llvm.x86.avx.movnt.pd.256(i8*, <4 x double>) nounwind
|
||||
|
||||
|
||||
; Check for pclmulqdq
|
||||
define <2 x i64> @test_x86_pclmulqdq(<2 x i64> %a0, <2 x i64> %a1) {
|
||||
; CHECK: vpclmulqdq
|
||||
%res = call <2 x i64> @llvm.x86.pclmulqdq(<2 x i64> %a0, <2 x i64> %a1, i8 0) ; <<2 x i64>> [#uses=1]
|
||||
ret <2 x i64> %res
|
||||
}
|
||||
declare <2 x i64> @llvm.x86.pclmulqdq(<2 x i64>, <2 x i64>, i8) nounwind readnone
|
||||
|
Loading…
Reference in New Issue
Block a user