mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
[X86] Remove X86 specific scalar FMA intrinsics and upgrade to tart independent FMA and extractelement/insertelement.
llvm-svn: 336315
This commit is contained in:
parent
6c9349ab49
commit
852bb77ea4
@ -1903,14 +1903,6 @@ let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.".
|
||||
// FMA3 and FMA4
|
||||
|
||||
let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.".
|
||||
def int_x86_fma_vfmadd_ss : // FIXME: remove this intrinsic.
|
||||
Intrinsic<[llvm_v4f32_ty],
|
||||
[llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4f32_ty],
|
||||
[IntrNoMem]>;
|
||||
def int_x86_fma_vfmadd_sd : // FIXME: remove this intrinsic.
|
||||
Intrinsic<[llvm_v2f64_ty],
|
||||
[llvm_v2f64_ty, llvm_v2f64_ty, llvm_v2f64_ty],
|
||||
[IntrNoMem]>;
|
||||
def int_x86_fma4_vfmadd_ss : GCCBuiltin<"__builtin_ia32_vfmaddss">,
|
||||
Intrinsic<[llvm_v4f32_ty],
|
||||
[llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4f32_ty],
|
||||
|
@ -74,7 +74,7 @@ static bool ShouldUpgradeX86Intrinsic(Function *F, StringRef Name) {
|
||||
if (Name=="ssse3.pabs.b.128" || // Added in 6.0
|
||||
Name=="ssse3.pabs.w.128" || // Added in 6.0
|
||||
Name=="ssse3.pabs.d.128" || // Added in 6.0
|
||||
Name.startswith("fma.vfmadd.p") || // Added in 7.0
|
||||
Name.startswith("fma.vfmadd.") || // Added in 7.0
|
||||
Name.startswith("fma.vfmsub.") || // Added in 7.0
|
||||
Name.startswith("fma.vfmsubadd.") || // Added in 7.0
|
||||
Name.startswith("fma.vfnmadd.") || // Added in 7.0
|
||||
@ -2746,74 +2746,55 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) {
|
||||
Rep = EmitX86Select(Builder, CI->getArgOperand(3), Rep,
|
||||
CI->getArgOperand(2));
|
||||
}
|
||||
} else if (IsX86 && (Name.startswith("fma.vfmadd.p") ||
|
||||
Name.startswith("fma.vfmsub.p") ||
|
||||
Name.startswith("fma.vfnmadd.p") ||
|
||||
Name.startswith("fma.vfnmsub.p"))) {
|
||||
} else if (IsX86 && (Name.startswith("fma.vfmadd.") ||
|
||||
Name.startswith("fma.vfmsub.") ||
|
||||
Name.startswith("fma.vfnmadd.") ||
|
||||
Name.startswith("fma.vfnmsub."))) {
|
||||
bool NegMul = Name[6] == 'n';
|
||||
bool NegAcc = NegMul ? Name[8] == 's' : Name[7] == 's';
|
||||
bool IsScalar = NegMul ? Name[12] == 's' : Name[11] == 's';
|
||||
|
||||
Value *Ops[] = { CI->getArgOperand(0), CI->getArgOperand(1),
|
||||
CI->getArgOperand(2) };
|
||||
|
||||
if (NegMul)
|
||||
if (IsScalar) {
|
||||
Ops[0] = Builder.CreateExtractElement(Ops[0], (uint64_t)0);
|
||||
Ops[1] = Builder.CreateExtractElement(Ops[1], (uint64_t)0);
|
||||
Ops[2] = Builder.CreateExtractElement(Ops[2], (uint64_t)0);
|
||||
}
|
||||
|
||||
if (NegMul && !IsScalar)
|
||||
Ops[0] = Builder.CreateFNeg(Ops[0]);
|
||||
if (NegMul && IsScalar)
|
||||
Ops[1] = Builder.CreateFNeg(Ops[1]);
|
||||
if (NegAcc)
|
||||
Ops[2] = Builder.CreateFNeg(Ops[2]);
|
||||
|
||||
Rep = Builder.CreateCall(Intrinsic::getDeclaration(CI->getModule(),
|
||||
Intrinsic::fma,
|
||||
CI->getType()), Ops);
|
||||
} else if (IsX86 && (Name.startswith("fma.vfmsub.s") ||
|
||||
Name.startswith("fma.vfmsubadd.p"))) {
|
||||
// Handle FMSUB and FSUBADD.
|
||||
Ops[0]->getType()),
|
||||
Ops);
|
||||
|
||||
if (IsScalar)
|
||||
Rep = Builder.CreateInsertElement(CI->getArgOperand(0), Rep,
|
||||
(uint64_t)0);
|
||||
} else if (IsX86 && Name.startswith("fma.vfmsubadd.p")) {
|
||||
// Handle FSUBADD.
|
||||
unsigned VecWidth = CI->getType()->getPrimitiveSizeInBits();
|
||||
unsigned EltWidth = CI->getType()->getScalarSizeInBits();
|
||||
Intrinsic::ID IID;
|
||||
if (Name[10] == '.' && Name[11] == 's') {
|
||||
// Scalar FMSUB
|
||||
if (EltWidth == 32)
|
||||
IID = Intrinsic::x86_fma_vfmadd_ss;
|
||||
else if (EltWidth == 64)
|
||||
IID = Intrinsic::x86_fma_vfmadd_sd;
|
||||
else
|
||||
llvm_unreachable("Unexpected intrinsic");
|
||||
} else {
|
||||
// FMSUBADD
|
||||
if (VecWidth == 128 && EltWidth == 32)
|
||||
IID = Intrinsic::x86_fma_vfmaddsub_ps;
|
||||
else if (VecWidth == 128 && EltWidth == 64)
|
||||
IID = Intrinsic::x86_fma_vfmaddsub_pd;
|
||||
else if (VecWidth == 256 && EltWidth == 32)
|
||||
IID = Intrinsic::x86_fma_vfmaddsub_ps_256;
|
||||
else if (VecWidth == 256 && EltWidth == 64)
|
||||
IID = Intrinsic::x86_fma_vfmaddsub_pd_256;
|
||||
else
|
||||
llvm_unreachable("Unexpected intrinsic");
|
||||
}
|
||||
Value *Arg2 = Builder.CreateFNeg(CI->getArgOperand(2));
|
||||
Value *Ops[] = { CI->getArgOperand(0), CI->getArgOperand(1), Arg2 };
|
||||
Rep = Builder.CreateCall(Intrinsic::getDeclaration(CI->getModule(), IID),
|
||||
Ops);
|
||||
} else if (IsX86 && (Name.startswith("fma.vfnmadd.s") ||
|
||||
Name.startswith("fma.vfnmsub.s"))) {
|
||||
Value *Arg0 = CI->getArgOperand(0);
|
||||
Value *Arg1 = CI->getArgOperand(1);
|
||||
Value *Arg2 = CI->getArgOperand(2);
|
||||
unsigned EltWidth = CI->getType()->getScalarSizeInBits();
|
||||
// Scalar FNMADD/FNMSUB
|
||||
Arg1 = Builder.CreateFNeg(Arg1); // Arg0 is passthru so invert Arg1.
|
||||
Intrinsic::ID IID;
|
||||
if (EltWidth == 32)
|
||||
IID = Intrinsic::x86_fma_vfmadd_ss;
|
||||
else if (EltWidth == 64)
|
||||
IID = Intrinsic::x86_fma_vfmadd_sd;
|
||||
if (VecWidth == 128 && EltWidth == 32)
|
||||
IID = Intrinsic::x86_fma_vfmaddsub_ps;
|
||||
else if (VecWidth == 128 && EltWidth == 64)
|
||||
IID = Intrinsic::x86_fma_vfmaddsub_pd;
|
||||
else if (VecWidth == 256 && EltWidth == 32)
|
||||
IID = Intrinsic::x86_fma_vfmaddsub_ps_256;
|
||||
else if (VecWidth == 256 && EltWidth == 64)
|
||||
IID = Intrinsic::x86_fma_vfmaddsub_pd_256;
|
||||
else
|
||||
llvm_unreachable("Unexpected intrinsic");
|
||||
// Invert for FNMSUB.
|
||||
if (Name[8] == 's')
|
||||
Arg2 = Builder.CreateFNeg(Arg2);
|
||||
Value *Ops[] = { Arg0, Arg1, Arg2 };
|
||||
Value *Arg2 = Builder.CreateFNeg(CI->getArgOperand(2));
|
||||
Value *Ops[] = { CI->getArgOperand(0), CI->getArgOperand(1), Arg2 };
|
||||
Rep = Builder.CreateCall(Intrinsic::getDeclaration(CI->getModule(), IID),
|
||||
Ops);
|
||||
} else if (IsX86 && (Name.startswith("avx512.mask.pternlog.") ||
|
||||
|
@ -1249,8 +1249,6 @@ static const IntrinsicData IntrinsicsWithoutChain[] = {
|
||||
X86_INTRINSIC_DATA(avx512_vpshrd_w_512, INTR_TYPE_3OP_IMM8, X86ISD::VSHRD, 0),
|
||||
X86_INTRINSIC_DATA(bmi_bextr_32, INTR_TYPE_2OP, X86ISD::BEXTR, 0),
|
||||
X86_INTRINSIC_DATA(bmi_bextr_64, INTR_TYPE_2OP, X86ISD::BEXTR, 0),
|
||||
X86_INTRINSIC_DATA(fma_vfmadd_sd, INTR_TYPE_3OP, X86ISD::FMADDS1, 0),
|
||||
X86_INTRINSIC_DATA(fma_vfmadd_ss, INTR_TYPE_3OP, X86ISD::FMADDS1, 0),
|
||||
X86_INTRINSIC_DATA(fma_vfmaddsub_pd, INTR_TYPE_3OP, X86ISD::FMADDSUB, 0),
|
||||
X86_INTRINSIC_DATA(fma_vfmaddsub_pd_256, INTR_TYPE_3OP, X86ISD::FMADDSUB, 0),
|
||||
X86_INTRINSIC_DATA(fma_vfmaddsub_ps, INTR_TYPE_3OP, X86ISD::FMADDSUB, 0),
|
||||
|
@ -2545,8 +2545,6 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
|
||||
case Intrinsic::x86_avx512_mask3_vfmsub_sd:
|
||||
case Intrinsic::x86_avx512_mask3_vfnmsub_ss:
|
||||
case Intrinsic::x86_avx512_mask3_vfnmsub_sd:
|
||||
case Intrinsic::x86_fma_vfmadd_ss:
|
||||
case Intrinsic::x86_fma_vfmadd_sd:
|
||||
case Intrinsic::x86_sse_cmp_ss:
|
||||
case Intrinsic::x86_sse_min_ss:
|
||||
case Intrinsic::x86_sse_max_ss:
|
||||
|
@ -1497,8 +1497,6 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts,
|
||||
case Intrinsic::x86_avx512_mask_sub_sd_round:
|
||||
case Intrinsic::x86_avx512_mask_max_sd_round:
|
||||
case Intrinsic::x86_avx512_mask_min_sd_round:
|
||||
case Intrinsic::x86_fma_vfmadd_ss:
|
||||
case Intrinsic::x86_fma_vfmadd_sd:
|
||||
case Intrinsic::x86_avx512_mask_vfmadd_ss:
|
||||
case Intrinsic::x86_avx512_mask_vfmadd_sd:
|
||||
case Intrinsic::x86_avx512_maskz_vfmadd_ss:
|
||||
|
@ -43,16 +43,16 @@ declare <4 x float> @llvm.x86.fma.vfmadd.ps(<4 x float> %a, <4 x float> %b, <4 x
|
||||
define <4 x float> @test3(<4 x float> %a, <4 x float> %b, <4 x float> %c) {
|
||||
; X32-LABEL: test3:
|
||||
; X32: # %bb.0: # %entry
|
||||
; X32-NEXT: vbroadcastss {{.*#+}} xmm3 = [-0,-0,-0,-0]
|
||||
; X32-NEXT: vfnmadd213ss {{.*#+}} xmm0 = -(xmm1 * xmm0) + xmm2
|
||||
; X32-NEXT: vxorps %xmm3, %xmm0, %xmm0
|
||||
; X32-NEXT: vbroadcastss {{.*#+}} xmm1 = [-0,-0,-0,-0]
|
||||
; X32-NEXT: vxorps %xmm1, %xmm0, %xmm0
|
||||
; X32-NEXT: retl
|
||||
;
|
||||
; X64-LABEL: test3:
|
||||
; X64: # %bb.0: # %entry
|
||||
; X64-NEXT: vbroadcastss {{.*#+}} xmm3 = [-0,-0,-0,-0]
|
||||
; X64-NEXT: vfnmadd213ss {{.*#+}} xmm0 = -(xmm1 * xmm0) + xmm2
|
||||
; X64-NEXT: vxorps %xmm3, %xmm0, %xmm0
|
||||
; X64-NEXT: vbroadcastss {{.*#+}} xmm1 = [-0,-0,-0,-0]
|
||||
; X64-NEXT: vxorps %xmm1, %xmm0, %xmm0
|
||||
; X64-NEXT: retq
|
||||
entry:
|
||||
%0 = tail call <4 x float> @llvm.x86.fma.vfnmadd.ss(<4 x float> %a, <4 x float> %b, <4 x float> %c) #2
|
||||
|
@ -9,9 +9,9 @@ declare <4 x float> @llvm.x86.fma.vfmadd.ss(<4 x float>, <4 x float>, <4 x float
|
||||
define <4 x float> @test_x86_fmadd_baa_ss(<4 x float> %a, <4 x float> %b) #0 {
|
||||
; FMA-LABEL: test_x86_fmadd_baa_ss:
|
||||
; FMA: # %bb.0:
|
||||
; FMA-NEXT: vmovaps (%rcx), %xmm1
|
||||
; FMA-NEXT: vmovaps (%rdx), %xmm0
|
||||
; FMA-NEXT: vfmadd213ss %xmm1, %xmm1, %xmm0
|
||||
; FMA-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
|
||||
; FMA-NEXT: vfmadd213ss {{.*#+}} xmm0 = (xmm1 * xmm0) + xmm1
|
||||
; FMA-NEXT: retq
|
||||
%res = call <4 x float> @llvm.x86.fma.vfmadd.ss(<4 x float> %b, <4 x float> %a, <4 x float> %a) nounwind
|
||||
ret <4 x float> %res
|
||||
@ -103,9 +103,9 @@ declare <2 x double> @llvm.x86.fma.vfmadd.sd(<2 x double>, <2 x double>, <2 x do
|
||||
define <2 x double> @test_x86_fmadd_baa_sd(<2 x double> %a, <2 x double> %b) #0 {
|
||||
; FMA-LABEL: test_x86_fmadd_baa_sd:
|
||||
; FMA: # %bb.0:
|
||||
; FMA-NEXT: vmovapd (%rcx), %xmm1
|
||||
; FMA-NEXT: vmovapd (%rdx), %xmm0
|
||||
; FMA-NEXT: vfmadd213sd %xmm1, %xmm1, %xmm0
|
||||
; FMA-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero
|
||||
; FMA-NEXT: vfmadd213sd {{.*#+}} xmm0 = (xmm1 * xmm0) + xmm1
|
||||
; FMA-NEXT: retq
|
||||
%res = call <2 x double> @llvm.x86.fma.vfmadd.sd(<2 x double> %b, <2 x double> %a, <2 x double> %a) nounwind
|
||||
ret <2 x double> %res
|
||||
@ -198,9 +198,9 @@ declare <4 x float> @llvm.x86.fma.vfnmadd.ss(<4 x float>, <4 x float>, <4 x floa
|
||||
define <4 x float> @test_x86_fnmadd_baa_ss(<4 x float> %a, <4 x float> %b) #0 {
|
||||
; FMA-LABEL: test_x86_fnmadd_baa_ss:
|
||||
; FMA: # %bb.0:
|
||||
; FMA-NEXT: vmovaps (%rcx), %xmm1
|
||||
; FMA-NEXT: vmovaps (%rdx), %xmm0
|
||||
; FMA-NEXT: vfnmadd213ss %xmm1, %xmm1, %xmm0
|
||||
; FMA-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
|
||||
; FMA-NEXT: vfnmadd213ss {{.*#+}} xmm0 = -(xmm1 * xmm0) + xmm1
|
||||
; FMA-NEXT: retq
|
||||
%res = call <4 x float> @llvm.x86.fma.vfnmadd.ss(<4 x float> %b, <4 x float> %a, <4 x float> %a) nounwind
|
||||
ret <4 x float> %res
|
||||
@ -292,9 +292,9 @@ declare <2 x double> @llvm.x86.fma.vfnmadd.sd(<2 x double>, <2 x double>, <2 x d
|
||||
define <2 x double> @test_x86_fnmadd_baa_sd(<2 x double> %a, <2 x double> %b) #0 {
|
||||
; FMA-LABEL: test_x86_fnmadd_baa_sd:
|
||||
; FMA: # %bb.0:
|
||||
; FMA-NEXT: vmovapd (%rcx), %xmm1
|
||||
; FMA-NEXT: vmovapd (%rdx), %xmm0
|
||||
; FMA-NEXT: vfnmadd213sd %xmm1, %xmm1, %xmm0
|
||||
; FMA-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero
|
||||
; FMA-NEXT: vfnmadd213sd {{.*#+}} xmm0 = -(xmm1 * xmm0) + xmm1
|
||||
; FMA-NEXT: retq
|
||||
%res = call <2 x double> @llvm.x86.fma.vfnmadd.sd(<2 x double> %b, <2 x double> %a, <2 x double> %a) nounwind
|
||||
ret <2 x double> %res
|
||||
@ -386,9 +386,9 @@ declare <4 x float> @llvm.x86.fma.vfmsub.ss(<4 x float>, <4 x float>, <4 x float
|
||||
define <4 x float> @test_x86_fmsub_baa_ss(<4 x float> %a, <4 x float> %b) #0 {
|
||||
; FMA-LABEL: test_x86_fmsub_baa_ss:
|
||||
; FMA: # %bb.0:
|
||||
; FMA-NEXT: vmovaps (%rcx), %xmm1
|
||||
; FMA-NEXT: vmovaps (%rdx), %xmm0
|
||||
; FMA-NEXT: vfmsub213ss %xmm1, %xmm1, %xmm0
|
||||
; FMA-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
|
||||
; FMA-NEXT: vfmsub213ss {{.*#+}} xmm0 = (xmm1 * xmm0) - xmm1
|
||||
; FMA-NEXT: retq
|
||||
%res = call <4 x float> @llvm.x86.fma.vfmsub.ss(<4 x float> %b, <4 x float> %a, <4 x float> %a) nounwind
|
||||
ret <4 x float> %res
|
||||
@ -480,9 +480,9 @@ declare <2 x double> @llvm.x86.fma.vfmsub.sd(<2 x double>, <2 x double>, <2 x do
|
||||
define <2 x double> @test_x86_fmsub_baa_sd(<2 x double> %a, <2 x double> %b) #0 {
|
||||
; FMA-LABEL: test_x86_fmsub_baa_sd:
|
||||
; FMA: # %bb.0:
|
||||
; FMA-NEXT: vmovapd (%rcx), %xmm1
|
||||
; FMA-NEXT: vmovapd (%rdx), %xmm0
|
||||
; FMA-NEXT: vfmsub213sd %xmm1, %xmm1, %xmm0
|
||||
; FMA-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero
|
||||
; FMA-NEXT: vfmsub213sd {{.*#+}} xmm0 = (xmm1 * xmm0) - xmm1
|
||||
; FMA-NEXT: retq
|
||||
%res = call <2 x double> @llvm.x86.fma.vfmsub.sd(<2 x double> %b, <2 x double> %a, <2 x double> %a) nounwind
|
||||
ret <2 x double> %res
|
||||
@ -575,9 +575,9 @@ declare <4 x float> @llvm.x86.fma.vfnmsub.ss(<4 x float>, <4 x float>, <4 x floa
|
||||
define <4 x float> @test_x86_fnmsub_baa_ss(<4 x float> %a, <4 x float> %b) #0 {
|
||||
; FMA-LABEL: test_x86_fnmsub_baa_ss:
|
||||
; FMA: # %bb.0:
|
||||
; FMA-NEXT: vmovaps (%rcx), %xmm1
|
||||
; FMA-NEXT: vmovaps (%rdx), %xmm0
|
||||
; FMA-NEXT: vfnmsub213ss %xmm1, %xmm1, %xmm0
|
||||
; FMA-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
|
||||
; FMA-NEXT: vfnmsub213ss {{.*#+}} xmm0 = -(xmm1 * xmm0) - xmm1
|
||||
; FMA-NEXT: retq
|
||||
%res = call <4 x float> @llvm.x86.fma.vfnmsub.ss(<4 x float> %b, <4 x float> %a, <4 x float> %a) nounwind
|
||||
ret <4 x float> %res
|
||||
@ -669,9 +669,9 @@ declare <2 x double> @llvm.x86.fma.vfnmsub.sd(<2 x double>, <2 x double>, <2 x d
|
||||
define <2 x double> @test_x86_fnmsub_baa_sd(<2 x double> %a, <2 x double> %b) #0 {
|
||||
; FMA-LABEL: test_x86_fnmsub_baa_sd:
|
||||
; FMA: # %bb.0:
|
||||
; FMA-NEXT: vmovapd (%rcx), %xmm1
|
||||
; FMA-NEXT: vmovapd (%rdx), %xmm0
|
||||
; FMA-NEXT: vfnmsub213sd %xmm1, %xmm1, %xmm0
|
||||
; FMA-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero
|
||||
; FMA-NEXT: vfnmsub213sd {{.*#+}} xmm0 = -(xmm1 * xmm0) - xmm1
|
||||
; FMA-NEXT: retq
|
||||
%res = call <2 x double> @llvm.x86.fma.vfnmsub.sd(<2 x double> %b, <2 x double> %a, <2 x double> %a) nounwind
|
||||
ret <2 x double> %res
|
||||
|
@ -19,10 +19,11 @@ define <4 x float> @test_x86_fma_vfmadd_ss(<4 x float> %a0, <4 x float> %a1, <4
|
||||
;
|
||||
; CHECK-FMA-WIN-LABEL: test_x86_fma_vfmadd_ss:
|
||||
; CHECK-FMA-WIN: # %bb.0:
|
||||
; CHECK-FMA-WIN-NEXT: vmovaps (%rdx), %xmm1 # encoding: [0xc5,0xf8,0x28,0x0a]
|
||||
; CHECK-FMA-WIN-NEXT: vmovaps (%rcx), %xmm0 # encoding: [0xc5,0xf8,0x28,0x01]
|
||||
; CHECK-FMA-WIN-NEXT: vfmadd213ss (%r8), %xmm1, %xmm0 # encoding: [0xc4,0xc2,0x71,0xa9,0x00]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm0 = (xmm1 * xmm0) + mem
|
||||
; CHECK-FMA-WIN-NEXT: vmovss (%r8), %xmm1 # encoding: [0xc4,0xc1,0x7a,0x10,0x08]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm1 = mem[0],zero,zero,zero
|
||||
; CHECK-FMA-WIN-NEXT: vfmadd132ss (%rdx), %xmm1, %xmm0 # encoding: [0xc4,0xe2,0x71,0x99,0x02]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm0 = (xmm0 * mem) + xmm1
|
||||
; CHECK-FMA-WIN-NEXT: retq # encoding: [0xc3]
|
||||
%res = call <4 x float> @llvm.x86.fma.vfmadd.ss(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2)
|
||||
ret <4 x float> %res
|
||||
@ -45,10 +46,11 @@ define <4 x float> @test_x86_fma_vfmadd_bac_ss(<4 x float> %a0, <4 x float> %a1,
|
||||
;
|
||||
; CHECK-FMA-WIN-LABEL: test_x86_fma_vfmadd_bac_ss:
|
||||
; CHECK-FMA-WIN: # %bb.0:
|
||||
; CHECK-FMA-WIN-NEXT: vmovaps (%rcx), %xmm1 # encoding: [0xc5,0xf8,0x28,0x09]
|
||||
; CHECK-FMA-WIN-NEXT: vmovaps (%rdx), %xmm0 # encoding: [0xc5,0xf8,0x28,0x02]
|
||||
; CHECK-FMA-WIN-NEXT: vfmadd213ss (%r8), %xmm1, %xmm0 # encoding: [0xc4,0xc2,0x71,0xa9,0x00]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm0 = (xmm1 * xmm0) + mem
|
||||
; CHECK-FMA-WIN-NEXT: vmovss (%r8), %xmm1 # encoding: [0xc4,0xc1,0x7a,0x10,0x08]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm1 = mem[0],zero,zero,zero
|
||||
; CHECK-FMA-WIN-NEXT: vfmadd132ss (%rcx), %xmm1, %xmm0 # encoding: [0xc4,0xe2,0x71,0x99,0x01]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm0 = (xmm0 * mem) + xmm1
|
||||
; CHECK-FMA-WIN-NEXT: retq # encoding: [0xc3]
|
||||
%res = call <4 x float> @llvm.x86.fma.vfmadd.ss(<4 x float> %a1, <4 x float> %a0, <4 x float> %a2)
|
||||
ret <4 x float> %res
|
||||
@ -70,10 +72,11 @@ define <2 x double> @test_x86_fma_vfmadd_sd(<2 x double> %a0, <2 x double> %a1,
|
||||
;
|
||||
; CHECK-FMA-WIN-LABEL: test_x86_fma_vfmadd_sd:
|
||||
; CHECK-FMA-WIN: # %bb.0:
|
||||
; CHECK-FMA-WIN-NEXT: vmovapd (%rdx), %xmm1 # encoding: [0xc5,0xf9,0x28,0x0a]
|
||||
; CHECK-FMA-WIN-NEXT: vmovapd (%rcx), %xmm0 # encoding: [0xc5,0xf9,0x28,0x01]
|
||||
; CHECK-FMA-WIN-NEXT: vfmadd213sd (%r8), %xmm1, %xmm0 # encoding: [0xc4,0xc2,0xf1,0xa9,0x00]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm0 = (xmm1 * xmm0) + mem
|
||||
; CHECK-FMA-WIN-NEXT: vmovsd (%r8), %xmm1 # encoding: [0xc4,0xc1,0x7b,0x10,0x08]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm1 = mem[0],zero
|
||||
; CHECK-FMA-WIN-NEXT: vfmadd132sd (%rdx), %xmm1, %xmm0 # encoding: [0xc4,0xe2,0xf1,0x99,0x02]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm0 = (xmm0 * mem) + xmm1
|
||||
; CHECK-FMA-WIN-NEXT: retq # encoding: [0xc3]
|
||||
%res = call <2 x double> @llvm.x86.fma.vfmadd.sd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2)
|
||||
ret <2 x double> %res
|
||||
@ -96,10 +99,11 @@ define <2 x double> @test_x86_fma_vfmadd_bac_sd(<2 x double> %a0, <2 x double> %
|
||||
;
|
||||
; CHECK-FMA-WIN-LABEL: test_x86_fma_vfmadd_bac_sd:
|
||||
; CHECK-FMA-WIN: # %bb.0:
|
||||
; CHECK-FMA-WIN-NEXT: vmovapd (%rcx), %xmm1 # encoding: [0xc5,0xf9,0x28,0x09]
|
||||
; CHECK-FMA-WIN-NEXT: vmovapd (%rdx), %xmm0 # encoding: [0xc5,0xf9,0x28,0x02]
|
||||
; CHECK-FMA-WIN-NEXT: vfmadd213sd (%r8), %xmm1, %xmm0 # encoding: [0xc4,0xc2,0xf1,0xa9,0x00]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm0 = (xmm1 * xmm0) + mem
|
||||
; CHECK-FMA-WIN-NEXT: vmovsd (%r8), %xmm1 # encoding: [0xc4,0xc1,0x7b,0x10,0x08]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm1 = mem[0],zero
|
||||
; CHECK-FMA-WIN-NEXT: vfmadd132sd (%rcx), %xmm1, %xmm0 # encoding: [0xc4,0xe2,0xf1,0x99,0x01]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm0 = (xmm0 * mem) + xmm1
|
||||
; CHECK-FMA-WIN-NEXT: retq # encoding: [0xc3]
|
||||
%res = call <2 x double> @llvm.x86.fma.vfmadd.sd(<2 x double> %a1, <2 x double> %a0, <2 x double> %a2)
|
||||
ret <2 x double> %res
|
||||
@ -222,10 +226,11 @@ define <4 x float> @test_x86_fma_vfmsub_ss(<4 x float> %a0, <4 x float> %a1, <4
|
||||
;
|
||||
; CHECK-FMA-WIN-LABEL: test_x86_fma_vfmsub_ss:
|
||||
; CHECK-FMA-WIN: # %bb.0:
|
||||
; CHECK-FMA-WIN-NEXT: vmovaps (%rdx), %xmm1 # encoding: [0xc5,0xf8,0x28,0x0a]
|
||||
; CHECK-FMA-WIN-NEXT: vmovaps (%rcx), %xmm0 # encoding: [0xc5,0xf8,0x28,0x01]
|
||||
; CHECK-FMA-WIN-NEXT: vfmsub213ss (%r8), %xmm1, %xmm0 # encoding: [0xc4,0xc2,0x71,0xab,0x00]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm0 = (xmm1 * xmm0) - mem
|
||||
; CHECK-FMA-WIN-NEXT: vmovss (%r8), %xmm1 # encoding: [0xc4,0xc1,0x7a,0x10,0x08]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm1 = mem[0],zero,zero,zero
|
||||
; CHECK-FMA-WIN-NEXT: vfmsub132ss (%rdx), %xmm1, %xmm0 # encoding: [0xc4,0xe2,0x71,0x9b,0x02]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm0 = (xmm0 * mem) - xmm1
|
||||
; CHECK-FMA-WIN-NEXT: retq # encoding: [0xc3]
|
||||
%res = call <4 x float> @llvm.x86.fma.vfmsub.ss(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2)
|
||||
ret <4 x float> %res
|
||||
@ -248,10 +253,11 @@ define <4 x float> @test_x86_fma_vfmsub_bac_ss(<4 x float> %a0, <4 x float> %a1,
|
||||
;
|
||||
; CHECK-FMA-WIN-LABEL: test_x86_fma_vfmsub_bac_ss:
|
||||
; CHECK-FMA-WIN: # %bb.0:
|
||||
; CHECK-FMA-WIN-NEXT: vmovaps (%rcx), %xmm1 # encoding: [0xc5,0xf8,0x28,0x09]
|
||||
; CHECK-FMA-WIN-NEXT: vmovaps (%rdx), %xmm0 # encoding: [0xc5,0xf8,0x28,0x02]
|
||||
; CHECK-FMA-WIN-NEXT: vfmsub213ss (%r8), %xmm1, %xmm0 # encoding: [0xc4,0xc2,0x71,0xab,0x00]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm0 = (xmm1 * xmm0) - mem
|
||||
; CHECK-FMA-WIN-NEXT: vmovss (%r8), %xmm1 # encoding: [0xc4,0xc1,0x7a,0x10,0x08]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm1 = mem[0],zero,zero,zero
|
||||
; CHECK-FMA-WIN-NEXT: vfmsub132ss (%rcx), %xmm1, %xmm0 # encoding: [0xc4,0xe2,0x71,0x9b,0x01]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm0 = (xmm0 * mem) - xmm1
|
||||
; CHECK-FMA-WIN-NEXT: retq # encoding: [0xc3]
|
||||
%res = call <4 x float> @llvm.x86.fma.vfmsub.ss(<4 x float> %a1, <4 x float> %a0, <4 x float> %a2)
|
||||
ret <4 x float> %res
|
||||
@ -273,10 +279,11 @@ define <2 x double> @test_x86_fma_vfmsub_sd(<2 x double> %a0, <2 x double> %a1,
|
||||
;
|
||||
; CHECK-FMA-WIN-LABEL: test_x86_fma_vfmsub_sd:
|
||||
; CHECK-FMA-WIN: # %bb.0:
|
||||
; CHECK-FMA-WIN-NEXT: vmovapd (%rdx), %xmm1 # encoding: [0xc5,0xf9,0x28,0x0a]
|
||||
; CHECK-FMA-WIN-NEXT: vmovapd (%rcx), %xmm0 # encoding: [0xc5,0xf9,0x28,0x01]
|
||||
; CHECK-FMA-WIN-NEXT: vfmsub213sd (%r8), %xmm1, %xmm0 # encoding: [0xc4,0xc2,0xf1,0xab,0x00]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm0 = (xmm1 * xmm0) - mem
|
||||
; CHECK-FMA-WIN-NEXT: vmovsd (%r8), %xmm1 # encoding: [0xc4,0xc1,0x7b,0x10,0x08]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm1 = mem[0],zero
|
||||
; CHECK-FMA-WIN-NEXT: vfmsub132sd (%rdx), %xmm1, %xmm0 # encoding: [0xc4,0xe2,0xf1,0x9b,0x02]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm0 = (xmm0 * mem) - xmm1
|
||||
; CHECK-FMA-WIN-NEXT: retq # encoding: [0xc3]
|
||||
%res = call <2 x double> @llvm.x86.fma.vfmsub.sd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2)
|
||||
ret <2 x double> %res
|
||||
@ -299,10 +306,11 @@ define <2 x double> @test_x86_fma_vfmsub_bac_sd(<2 x double> %a0, <2 x double> %
|
||||
;
|
||||
; CHECK-FMA-WIN-LABEL: test_x86_fma_vfmsub_bac_sd:
|
||||
; CHECK-FMA-WIN: # %bb.0:
|
||||
; CHECK-FMA-WIN-NEXT: vmovapd (%rcx), %xmm1 # encoding: [0xc5,0xf9,0x28,0x09]
|
||||
; CHECK-FMA-WIN-NEXT: vmovapd (%rdx), %xmm0 # encoding: [0xc5,0xf9,0x28,0x02]
|
||||
; CHECK-FMA-WIN-NEXT: vfmsub213sd (%r8), %xmm1, %xmm0 # encoding: [0xc4,0xc2,0xf1,0xab,0x00]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm0 = (xmm1 * xmm0) - mem
|
||||
; CHECK-FMA-WIN-NEXT: vmovsd (%r8), %xmm1 # encoding: [0xc4,0xc1,0x7b,0x10,0x08]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm1 = mem[0],zero
|
||||
; CHECK-FMA-WIN-NEXT: vfmsub132sd (%rcx), %xmm1, %xmm0 # encoding: [0xc4,0xe2,0xf1,0x9b,0x01]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm0 = (xmm0 * mem) - xmm1
|
||||
; CHECK-FMA-WIN-NEXT: retq # encoding: [0xc3]
|
||||
%res = call <2 x double> @llvm.x86.fma.vfmsub.sd(<2 x double> %a1, <2 x double> %a0, <2 x double> %a2)
|
||||
ret <2 x double> %res
|
||||
@ -425,10 +433,11 @@ define <4 x float> @test_x86_fma_vfnmadd_ss(<4 x float> %a0, <4 x float> %a1, <4
|
||||
;
|
||||
; CHECK-FMA-WIN-LABEL: test_x86_fma_vfnmadd_ss:
|
||||
; CHECK-FMA-WIN: # %bb.0:
|
||||
; CHECK-FMA-WIN-NEXT: vmovaps (%rdx), %xmm1 # encoding: [0xc5,0xf8,0x28,0x0a]
|
||||
; CHECK-FMA-WIN-NEXT: vmovaps (%rcx), %xmm0 # encoding: [0xc5,0xf8,0x28,0x01]
|
||||
; CHECK-FMA-WIN-NEXT: vfnmadd213ss (%r8), %xmm1, %xmm0 # encoding: [0xc4,0xc2,0x71,0xad,0x00]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm0 = -(xmm1 * xmm0) + mem
|
||||
; CHECK-FMA-WIN-NEXT: vmovss (%r8), %xmm1 # encoding: [0xc4,0xc1,0x7a,0x10,0x08]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm1 = mem[0],zero,zero,zero
|
||||
; CHECK-FMA-WIN-NEXT: vfnmadd132ss (%rdx), %xmm1, %xmm0 # encoding: [0xc4,0xe2,0x71,0x9d,0x02]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm0 = -(xmm0 * mem) + xmm1
|
||||
; CHECK-FMA-WIN-NEXT: retq # encoding: [0xc3]
|
||||
%res = call <4 x float> @llvm.x86.fma.vfnmadd.ss(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2)
|
||||
ret <4 x float> %res
|
||||
@ -451,10 +460,11 @@ define <4 x float> @test_x86_fma_vfnmadd_bac_ss(<4 x float> %a0, <4 x float> %a1
|
||||
;
|
||||
; CHECK-FMA-WIN-LABEL: test_x86_fma_vfnmadd_bac_ss:
|
||||
; CHECK-FMA-WIN: # %bb.0:
|
||||
; CHECK-FMA-WIN-NEXT: vmovaps (%rcx), %xmm1 # encoding: [0xc5,0xf8,0x28,0x09]
|
||||
; CHECK-FMA-WIN-NEXT: vmovaps (%rdx), %xmm0 # encoding: [0xc5,0xf8,0x28,0x02]
|
||||
; CHECK-FMA-WIN-NEXT: vfnmadd213ss (%r8), %xmm1, %xmm0 # encoding: [0xc4,0xc2,0x71,0xad,0x00]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm0 = -(xmm1 * xmm0) + mem
|
||||
; CHECK-FMA-WIN-NEXT: vmovss (%r8), %xmm1 # encoding: [0xc4,0xc1,0x7a,0x10,0x08]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm1 = mem[0],zero,zero,zero
|
||||
; CHECK-FMA-WIN-NEXT: vfnmadd132ss (%rcx), %xmm1, %xmm0 # encoding: [0xc4,0xe2,0x71,0x9d,0x01]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm0 = -(xmm0 * mem) + xmm1
|
||||
; CHECK-FMA-WIN-NEXT: retq # encoding: [0xc3]
|
||||
%res = call <4 x float> @llvm.x86.fma.vfnmadd.ss(<4 x float> %a1, <4 x float> %a0, <4 x float> %a2)
|
||||
ret <4 x float> %res
|
||||
@ -476,10 +486,11 @@ define <2 x double> @test_x86_fma_vfnmadd_sd(<2 x double> %a0, <2 x double> %a1,
|
||||
;
|
||||
; CHECK-FMA-WIN-LABEL: test_x86_fma_vfnmadd_sd:
|
||||
; CHECK-FMA-WIN: # %bb.0:
|
||||
; CHECK-FMA-WIN-NEXT: vmovapd (%rdx), %xmm1 # encoding: [0xc5,0xf9,0x28,0x0a]
|
||||
; CHECK-FMA-WIN-NEXT: vmovapd (%rcx), %xmm0 # encoding: [0xc5,0xf9,0x28,0x01]
|
||||
; CHECK-FMA-WIN-NEXT: vfnmadd213sd (%r8), %xmm1, %xmm0 # encoding: [0xc4,0xc2,0xf1,0xad,0x00]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm0 = -(xmm1 * xmm0) + mem
|
||||
; CHECK-FMA-WIN-NEXT: vmovsd (%r8), %xmm1 # encoding: [0xc4,0xc1,0x7b,0x10,0x08]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm1 = mem[0],zero
|
||||
; CHECK-FMA-WIN-NEXT: vfnmadd132sd (%rdx), %xmm1, %xmm0 # encoding: [0xc4,0xe2,0xf1,0x9d,0x02]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm0 = -(xmm0 * mem) + xmm1
|
||||
; CHECK-FMA-WIN-NEXT: retq # encoding: [0xc3]
|
||||
%res = call <2 x double> @llvm.x86.fma.vfnmadd.sd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2)
|
||||
ret <2 x double> %res
|
||||
@ -502,10 +513,11 @@ define <2 x double> @test_x86_fma_vfnmadd_bac_sd(<2 x double> %a0, <2 x double>
|
||||
;
|
||||
; CHECK-FMA-WIN-LABEL: test_x86_fma_vfnmadd_bac_sd:
|
||||
; CHECK-FMA-WIN: # %bb.0:
|
||||
; CHECK-FMA-WIN-NEXT: vmovapd (%rcx), %xmm1 # encoding: [0xc5,0xf9,0x28,0x09]
|
||||
; CHECK-FMA-WIN-NEXT: vmovapd (%rdx), %xmm0 # encoding: [0xc5,0xf9,0x28,0x02]
|
||||
; CHECK-FMA-WIN-NEXT: vfnmadd213sd (%r8), %xmm1, %xmm0 # encoding: [0xc4,0xc2,0xf1,0xad,0x00]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm0 = -(xmm1 * xmm0) + mem
|
||||
; CHECK-FMA-WIN-NEXT: vmovsd (%r8), %xmm1 # encoding: [0xc4,0xc1,0x7b,0x10,0x08]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm1 = mem[0],zero
|
||||
; CHECK-FMA-WIN-NEXT: vfnmadd132sd (%rcx), %xmm1, %xmm0 # encoding: [0xc4,0xe2,0xf1,0x9d,0x01]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm0 = -(xmm0 * mem) + xmm1
|
||||
; CHECK-FMA-WIN-NEXT: retq # encoding: [0xc3]
|
||||
%res = call <2 x double> @llvm.x86.fma.vfnmadd.sd(<2 x double> %a1, <2 x double> %a0, <2 x double> %a2)
|
||||
ret <2 x double> %res
|
||||
@ -628,10 +640,11 @@ define <4 x float> @test_x86_fma_vfnmsub_ss(<4 x float> %a0, <4 x float> %a1, <4
|
||||
;
|
||||
; CHECK-FMA-WIN-LABEL: test_x86_fma_vfnmsub_ss:
|
||||
; CHECK-FMA-WIN: # %bb.0:
|
||||
; CHECK-FMA-WIN-NEXT: vmovaps (%rdx), %xmm1 # encoding: [0xc5,0xf8,0x28,0x0a]
|
||||
; CHECK-FMA-WIN-NEXT: vmovaps (%rcx), %xmm0 # encoding: [0xc5,0xf8,0x28,0x01]
|
||||
; CHECK-FMA-WIN-NEXT: vfnmsub213ss (%r8), %xmm1, %xmm0 # encoding: [0xc4,0xc2,0x71,0xaf,0x00]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm0 = -(xmm1 * xmm0) - mem
|
||||
; CHECK-FMA-WIN-NEXT: vmovss (%r8), %xmm1 # encoding: [0xc4,0xc1,0x7a,0x10,0x08]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm1 = mem[0],zero,zero,zero
|
||||
; CHECK-FMA-WIN-NEXT: vfnmsub132ss (%rdx), %xmm1, %xmm0 # encoding: [0xc4,0xe2,0x71,0x9f,0x02]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm0 = -(xmm0 * mem) - xmm1
|
||||
; CHECK-FMA-WIN-NEXT: retq # encoding: [0xc3]
|
||||
%res = call <4 x float> @llvm.x86.fma.vfnmsub.ss(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2)
|
||||
ret <4 x float> %res
|
||||
@ -654,10 +667,11 @@ define <4 x float> @test_x86_fma_vfnmsub_bac_ss(<4 x float> %a0, <4 x float> %a1
|
||||
;
|
||||
; CHECK-FMA-WIN-LABEL: test_x86_fma_vfnmsub_bac_ss:
|
||||
; CHECK-FMA-WIN: # %bb.0:
|
||||
; CHECK-FMA-WIN-NEXT: vmovaps (%rcx), %xmm1 # encoding: [0xc5,0xf8,0x28,0x09]
|
||||
; CHECK-FMA-WIN-NEXT: vmovaps (%rdx), %xmm0 # encoding: [0xc5,0xf8,0x28,0x02]
|
||||
; CHECK-FMA-WIN-NEXT: vfnmsub213ss (%r8), %xmm1, %xmm0 # encoding: [0xc4,0xc2,0x71,0xaf,0x00]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm0 = -(xmm1 * xmm0) - mem
|
||||
; CHECK-FMA-WIN-NEXT: vmovss (%r8), %xmm1 # encoding: [0xc4,0xc1,0x7a,0x10,0x08]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm1 = mem[0],zero,zero,zero
|
||||
; CHECK-FMA-WIN-NEXT: vfnmsub132ss (%rcx), %xmm1, %xmm0 # encoding: [0xc4,0xe2,0x71,0x9f,0x01]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm0 = -(xmm0 * mem) - xmm1
|
||||
; CHECK-FMA-WIN-NEXT: retq # encoding: [0xc3]
|
||||
%res = call <4 x float> @llvm.x86.fma.vfnmsub.ss(<4 x float> %a1, <4 x float> %a0, <4 x float> %a2)
|
||||
ret <4 x float> %res
|
||||
@ -679,10 +693,11 @@ define <2 x double> @test_x86_fma_vfnmsub_sd(<2 x double> %a0, <2 x double> %a1,
|
||||
;
|
||||
; CHECK-FMA-WIN-LABEL: test_x86_fma_vfnmsub_sd:
|
||||
; CHECK-FMA-WIN: # %bb.0:
|
||||
; CHECK-FMA-WIN-NEXT: vmovapd (%rdx), %xmm1 # encoding: [0xc5,0xf9,0x28,0x0a]
|
||||
; CHECK-FMA-WIN-NEXT: vmovapd (%rcx), %xmm0 # encoding: [0xc5,0xf9,0x28,0x01]
|
||||
; CHECK-FMA-WIN-NEXT: vfnmsub213sd (%r8), %xmm1, %xmm0 # encoding: [0xc4,0xc2,0xf1,0xaf,0x00]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm0 = -(xmm1 * xmm0) - mem
|
||||
; CHECK-FMA-WIN-NEXT: vmovsd (%r8), %xmm1 # encoding: [0xc4,0xc1,0x7b,0x10,0x08]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm1 = mem[0],zero
|
||||
; CHECK-FMA-WIN-NEXT: vfnmsub132sd (%rdx), %xmm1, %xmm0 # encoding: [0xc4,0xe2,0xf1,0x9f,0x02]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm0 = -(xmm0 * mem) - xmm1
|
||||
; CHECK-FMA-WIN-NEXT: retq # encoding: [0xc3]
|
||||
%res = call <2 x double> @llvm.x86.fma.vfnmsub.sd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2)
|
||||
ret <2 x double> %res
|
||||
@ -705,10 +720,11 @@ define <2 x double> @test_x86_fma_vfnmsub_bac_sd(<2 x double> %a0, <2 x double>
|
||||
;
|
||||
; CHECK-FMA-WIN-LABEL: test_x86_fma_vfnmsub_bac_sd:
|
||||
; CHECK-FMA-WIN: # %bb.0:
|
||||
; CHECK-FMA-WIN-NEXT: vmovapd (%rcx), %xmm1 # encoding: [0xc5,0xf9,0x28,0x09]
|
||||
; CHECK-FMA-WIN-NEXT: vmovapd (%rdx), %xmm0 # encoding: [0xc5,0xf9,0x28,0x02]
|
||||
; CHECK-FMA-WIN-NEXT: vfnmsub213sd (%r8), %xmm1, %xmm0 # encoding: [0xc4,0xc2,0xf1,0xaf,0x00]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm0 = -(xmm1 * xmm0) - mem
|
||||
; CHECK-FMA-WIN-NEXT: vmovsd (%r8), %xmm1 # encoding: [0xc4,0xc1,0x7b,0x10,0x08]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm1 = mem[0],zero
|
||||
; CHECK-FMA-WIN-NEXT: vfnmsub132sd (%rcx), %xmm1, %xmm0 # encoding: [0xc4,0xe2,0xf1,0x9f,0x01]
|
||||
; CHECK-FMA-WIN-NEXT: # xmm0 = -(xmm0 * mem) - xmm1
|
||||
; CHECK-FMA-WIN-NEXT: retq # encoding: [0xc3]
|
||||
%res = call <2 x double> @llvm.x86.fma.vfnmsub.sd(<2 x double> %a1, <2 x double> %a0, <2 x double> %a2)
|
||||
ret <2 x double> %res
|
||||
|
@ -44,7 +44,7 @@ define void @fmadd_aba_ss(float* %a, float* %b) {
|
||||
; CHECK-LABEL: fmadd_aba_ss:
|
||||
; CHECK: # %bb.0:
|
||||
; CHECK-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
|
||||
; CHECK-NEXT: vfmadd132ss (%rsi), %xmm0, %xmm0
|
||||
; CHECK-NEXT: vfmadd231ss {{.*#+}} xmm0 = (xmm0 * mem) + xmm0
|
||||
; CHECK-NEXT: vmovss %xmm0, (%rdi)
|
||||
; CHECK-NEXT: retq
|
||||
%a.val = load float, float* %a
|
||||
@ -96,7 +96,7 @@ define void @fmsub_aba_ss(float* %a, float* %b) {
|
||||
; CHECK-LABEL: fmsub_aba_ss:
|
||||
; CHECK: # %bb.0:
|
||||
; CHECK-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
|
||||
; CHECK-NEXT: vfmsub132ss (%rsi), %xmm0, %xmm0
|
||||
; CHECK-NEXT: vfmsub231ss {{.*#+}} xmm0 = (xmm0 * mem) - xmm0
|
||||
; CHECK-NEXT: vmovss %xmm0, (%rdi)
|
||||
; CHECK-NEXT: retq
|
||||
%a.val = load float, float* %a
|
||||
@ -148,7 +148,7 @@ define void @fnmadd_aba_ss(float* %a, float* %b) {
|
||||
; CHECK-LABEL: fnmadd_aba_ss:
|
||||
; CHECK: # %bb.0:
|
||||
; CHECK-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
|
||||
; CHECK-NEXT: vfnmadd132ss (%rsi), %xmm0, %xmm0
|
||||
; CHECK-NEXT: vfnmadd231ss {{.*#+}} xmm0 = -(xmm0 * mem) + xmm0
|
||||
; CHECK-NEXT: vmovss %xmm0, (%rdi)
|
||||
; CHECK-NEXT: retq
|
||||
%a.val = load float, float* %a
|
||||
@ -200,7 +200,7 @@ define void @fnmsub_aba_ss(float* %a, float* %b) {
|
||||
; CHECK-LABEL: fnmsub_aba_ss:
|
||||
; CHECK: # %bb.0:
|
||||
; CHECK-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
|
||||
; CHECK-NEXT: vfnmsub132ss (%rsi), %xmm0, %xmm0
|
||||
; CHECK-NEXT: vfnmsub231ss {{.*#+}} xmm0 = -(xmm0 * mem) - xmm0
|
||||
; CHECK-NEXT: vmovss %xmm0, (%rdi)
|
||||
; CHECK-NEXT: retq
|
||||
%a.val = load float, float* %a
|
||||
@ -226,8 +226,8 @@ define void @fmadd_aab_sd(double* %a, double* %b) {
|
||||
; CHECK-LABEL: fmadd_aab_sd:
|
||||
; CHECK: # %bb.0:
|
||||
; CHECK-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
|
||||
; CHECK-NEXT: vfmadd213sd (%rsi), %xmm0, %xmm0
|
||||
; CHECK-NEXT: vmovlpd %xmm0, (%rdi)
|
||||
; CHECK-NEXT: vfmadd213sd {{.*#+}} xmm0 = (xmm0 * xmm0) + mem
|
||||
; CHECK-NEXT: vmovsd %xmm0, (%rdi)
|
||||
; CHECK-NEXT: retq
|
||||
%a.val = load double, double* %a
|
||||
%av0 = insertelement <2 x double> undef, double %a.val, i32 0
|
||||
@ -248,8 +248,8 @@ define void @fmadd_aba_sd(double* %a, double* %b) {
|
||||
; CHECK-LABEL: fmadd_aba_sd:
|
||||
; CHECK: # %bb.0:
|
||||
; CHECK-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
|
||||
; CHECK-NEXT: vfmadd132sd (%rsi), %xmm0, %xmm0
|
||||
; CHECK-NEXT: vmovlpd %xmm0, (%rdi)
|
||||
; CHECK-NEXT: vfmadd231sd {{.*#+}} xmm0 = (xmm0 * mem) + xmm0
|
||||
; CHECK-NEXT: vmovsd %xmm0, (%rdi)
|
||||
; CHECK-NEXT: retq
|
||||
%a.val = load double, double* %a
|
||||
%av0 = insertelement <2 x double> undef, double %a.val, i32 0
|
||||
@ -270,8 +270,8 @@ define void @fmsub_aab_sd(double* %a, double* %b) {
|
||||
; CHECK-LABEL: fmsub_aab_sd:
|
||||
; CHECK: # %bb.0:
|
||||
; CHECK-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
|
||||
; CHECK-NEXT: vfmsub213sd (%rsi), %xmm0, %xmm0
|
||||
; CHECK-NEXT: vmovlpd %xmm0, (%rdi)
|
||||
; CHECK-NEXT: vfmsub213sd {{.*#+}} xmm0 = (xmm0 * xmm0) - mem
|
||||
; CHECK-NEXT: vmovsd %xmm0, (%rdi)
|
||||
; CHECK-NEXT: retq
|
||||
%a.val = load double, double* %a
|
||||
%av0 = insertelement <2 x double> undef, double %a.val, i32 0
|
||||
@ -292,8 +292,8 @@ define void @fmsub_aba_sd(double* %a, double* %b) {
|
||||
; CHECK-LABEL: fmsub_aba_sd:
|
||||
; CHECK: # %bb.0:
|
||||
; CHECK-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
|
||||
; CHECK-NEXT: vfmsub132sd (%rsi), %xmm0, %xmm0
|
||||
; CHECK-NEXT: vmovlpd %xmm0, (%rdi)
|
||||
; CHECK-NEXT: vfmsub231sd {{.*#+}} xmm0 = (xmm0 * mem) - xmm0
|
||||
; CHECK-NEXT: vmovsd %xmm0, (%rdi)
|
||||
; CHECK-NEXT: retq
|
||||
%a.val = load double, double* %a
|
||||
%av0 = insertelement <2 x double> undef, double %a.val, i32 0
|
||||
@ -314,8 +314,8 @@ define void @fnmadd_aab_sd(double* %a, double* %b) {
|
||||
; CHECK-LABEL: fnmadd_aab_sd:
|
||||
; CHECK: # %bb.0:
|
||||
; CHECK-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
|
||||
; CHECK-NEXT: vfnmadd213sd (%rsi), %xmm0, %xmm0
|
||||
; CHECK-NEXT: vmovlpd %xmm0, (%rdi)
|
||||
; CHECK-NEXT: vfnmadd213sd {{.*#+}} xmm0 = -(xmm0 * xmm0) + mem
|
||||
; CHECK-NEXT: vmovsd %xmm0, (%rdi)
|
||||
; CHECK-NEXT: retq
|
||||
%a.val = load double, double* %a
|
||||
%av0 = insertelement <2 x double> undef, double %a.val, i32 0
|
||||
@ -336,8 +336,8 @@ define void @fnmadd_aba_sd(double* %a, double* %b) {
|
||||
; CHECK-LABEL: fnmadd_aba_sd:
|
||||
; CHECK: # %bb.0:
|
||||
; CHECK-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
|
||||
; CHECK-NEXT: vfnmadd132sd (%rsi), %xmm0, %xmm0
|
||||
; CHECK-NEXT: vmovlpd %xmm0, (%rdi)
|
||||
; CHECK-NEXT: vfnmadd231sd {{.*#+}} xmm0 = -(xmm0 * mem) + xmm0
|
||||
; CHECK-NEXT: vmovsd %xmm0, (%rdi)
|
||||
; CHECK-NEXT: retq
|
||||
%a.val = load double, double* %a
|
||||
%av0 = insertelement <2 x double> undef, double %a.val, i32 0
|
||||
@ -358,8 +358,8 @@ define void @fnmsub_aab_sd(double* %a, double* %b) {
|
||||
; CHECK-LABEL: fnmsub_aab_sd:
|
||||
; CHECK: # %bb.0:
|
||||
; CHECK-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
|
||||
; CHECK-NEXT: vfnmsub213sd (%rsi), %xmm0, %xmm0
|
||||
; CHECK-NEXT: vmovlpd %xmm0, (%rdi)
|
||||
; CHECK-NEXT: vfnmsub213sd {{.*#+}} xmm0 = -(xmm0 * xmm0) - mem
|
||||
; CHECK-NEXT: vmovsd %xmm0, (%rdi)
|
||||
; CHECK-NEXT: retq
|
||||
%a.val = load double, double* %a
|
||||
%av0 = insertelement <2 x double> undef, double %a.val, i32 0
|
||||
@ -380,8 +380,8 @@ define void @fnmsub_aba_sd(double* %a, double* %b) {
|
||||
; CHECK-LABEL: fnmsub_aba_sd:
|
||||
; CHECK: # %bb.0:
|
||||
; CHECK-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
|
||||
; CHECK-NEXT: vfnmsub132sd (%rsi), %xmm0, %xmm0
|
||||
; CHECK-NEXT: vmovlpd %xmm0, (%rdi)
|
||||
; CHECK-NEXT: vfnmsub231sd {{.*#+}} xmm0 = -(xmm0 * mem) - xmm0
|
||||
; CHECK-NEXT: vmovsd %xmm0, (%rdi)
|
||||
; CHECK-NEXT: retq
|
||||
%a.val = load double, double* %a
|
||||
%av0 = insertelement <2 x double> undef, double %a.val, i32 0
|
||||
|
@ -2,12 +2,14 @@
|
||||
; RUN: opt < %s -instcombine -S | FileCheck %s
|
||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
|
||||
declare <4 x float> @llvm.x86.fma.vfmadd.ss(<4 x float>, <4 x float>, <4 x float>)
|
||||
|
||||
define <4 x float> @test_vfmadd_ss(<4 x float> %a, <4 x float> %b, <4 x float> %c) {
|
||||
; CHECK-LABEL: @test_vfmadd_ss(
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = tail call <4 x float> @llvm.x86.fma.vfmadd.ss(<4 x float> %a, <4 x float> %b, <4 x float> %c)
|
||||
; CHECK-NEXT: ret <4 x float> [[TMP1]]
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x float> [[A:%.*]], i64 0
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = extractelement <4 x float> [[B:%.*]], i32 0
|
||||
; CHECK-NEXT: [[TMP3:%.*]] = extractelement <4 x float> [[C:%.*]], i32 0
|
||||
; CHECK-NEXT: [[TMP4:%.*]] = call float @llvm.fma.f32(float [[TMP1]], float [[TMP2]], float [[TMP3]])
|
||||
; CHECK-NEXT: [[TMP5:%.*]] = insertelement <4 x float> [[A]], float [[TMP4]], i64 0
|
||||
; CHECK-NEXT: ret <4 x float> [[TMP5]]
|
||||
;
|
||||
%1 = insertelement <4 x float> %b, float 1.000000e+00, i32 1
|
||||
%2 = insertelement <4 x float> %1, float 2.000000e+00, i32 2
|
||||
@ -15,22 +17,32 @@ define <4 x float> @test_vfmadd_ss(<4 x float> %a, <4 x float> %b, <4 x float> %
|
||||
%4 = insertelement <4 x float> %c, float 4.000000e+00, i32 1
|
||||
%5 = insertelement <4 x float> %4, float 5.000000e+00, i32 2
|
||||
%6 = insertelement <4 x float> %5, float 6.000000e+00, i32 3
|
||||
%res = tail call <4 x float> @llvm.x86.fma.vfmadd.ss(<4 x float> %a, <4 x float> %3, <4 x float> %6)
|
||||
ret <4 x float> %res
|
||||
%7 = extractelement <4 x float> %a, i64 0
|
||||
%8 = extractelement <4 x float> %3, i64 0
|
||||
%9 = extractelement <4 x float> %6, i64 0
|
||||
%10 = call float @llvm.fma.f32(float %7, float %8, float %9)
|
||||
%11 = insertelement <4 x float> %a, float %10, i64 0
|
||||
ret <4 x float> %11
|
||||
}
|
||||
|
||||
define float @test_vfmadd_ss_0(<4 x float> %a, <4 x float> %b, <4 x float> %c) {
|
||||
; CHECK-LABEL: @test_vfmadd_ss_0(
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = tail call <4 x float> @llvm.x86.fma.vfmadd.ss(<4 x float> %a, <4 x float> %b, <4 x float> %c)
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = extractelement <4 x float> [[TMP1]], i32 0
|
||||
; CHECK-NEXT: ret float [[TMP2]]
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x float> [[A:%.*]], i32 0
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = extractelement <4 x float> [[B:%.*]], i64 0
|
||||
; CHECK-NEXT: [[TMP3:%.*]] = extractelement <4 x float> [[C:%.*]], i64 0
|
||||
; CHECK-NEXT: [[TMP4:%.*]] = call float @llvm.fma.f32(float [[TMP1]], float [[TMP2]], float [[TMP3]])
|
||||
; CHECK-NEXT: ret float [[TMP4]]
|
||||
;
|
||||
%1 = insertelement <4 x float> %a, float 1.000000e+00, i32 1
|
||||
%2 = insertelement <4 x float> %1, float 2.000000e+00, i32 2
|
||||
%3 = insertelement <4 x float> %2, float 3.000000e+00, i32 3
|
||||
%4 = tail call <4 x float> @llvm.x86.fma.vfmadd.ss(<4 x float> %3, <4 x float> %b, <4 x float> %c)
|
||||
%5 = extractelement <4 x float> %4, i32 0
|
||||
ret float %5
|
||||
%4 = extractelement <4 x float> %3, i64 0
|
||||
%5 = extractelement <4 x float> %b, i64 0
|
||||
%6 = extractelement <4 x float> %c, i64 0
|
||||
%7 = call float @llvm.fma.f32(float %4, float %5, float %6)
|
||||
%8 = insertelement <4 x float> %3, float %7, i64 0
|
||||
%9 = extractelement <4 x float> %8, i32 0
|
||||
ret float %9
|
||||
}
|
||||
|
||||
define float @test_vfmadd_ss_1(<4 x float> %a, <4 x float> %b, <4 x float> %c) {
|
||||
@ -40,34 +52,50 @@ define float @test_vfmadd_ss_1(<4 x float> %a, <4 x float> %b, <4 x float> %c) {
|
||||
%1 = insertelement <4 x float> %a, float 1.000000e+00, i32 1
|
||||
%2 = insertelement <4 x float> %1, float 2.000000e+00, i32 2
|
||||
%3 = insertelement <4 x float> %2, float 3.000000e+00, i32 3
|
||||
%4 = tail call <4 x float> @llvm.x86.fma.vfmadd.ss(<4 x float> %3, <4 x float> %b, <4 x float> %c)
|
||||
%5 = extractelement <4 x float> %4, i32 1
|
||||
ret float %5
|
||||
%4 = extractelement <4 x float> %3, i64 0
|
||||
%5 = extractelement <4 x float> %b, i64 0
|
||||
%6 = extractelement <4 x float> %c, i64 0
|
||||
%7 = call float @llvm.fma.f32(float %4, float %5, float %6)
|
||||
%8 = insertelement <4 x float> %3, float %7, i64 0
|
||||
%9 = extractelement <4 x float> %8, i32 1
|
||||
ret float %9
|
||||
}
|
||||
|
||||
declare <2 x double> @llvm.x86.fma.vfmadd.sd(<2 x double>, <2 x double>, <2 x double>)
|
||||
|
||||
define <2 x double> @test_vfmadd_sd(<2 x double> %a, <2 x double> %b, <2 x double> %c) {
|
||||
; CHECK-LABEL: @test_vfmadd_sd(
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = tail call <2 x double> @llvm.x86.fma.vfmadd.sd(<2 x double> %a, <2 x double> %b, <2 x double> %c)
|
||||
; CHECK-NEXT: ret <2 x double> [[TMP1]]
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = extractelement <2 x double> [[A:%.*]], i64 0
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = extractelement <2 x double> [[B:%.*]], i64 0
|
||||
; CHECK-NEXT: [[TMP3:%.*]] = extractelement <2 x double> [[C:%.*]], i64 0
|
||||
; CHECK-NEXT: [[TMP4:%.*]] = call double @llvm.fma.f64(double [[TMP1]], double [[TMP2]], double [[TMP3]])
|
||||
; CHECK-NEXT: [[TMP5:%.*]] = insertelement <2 x double> [[A]], double [[TMP4]], i64 0
|
||||
; CHECK-NEXT: ret <2 x double> [[TMP5]]
|
||||
;
|
||||
%1 = insertelement <2 x double> %b, double 1.000000e+00, i32 1
|
||||
%2 = insertelement <2 x double> %c, double 2.000000e+00, i32 1
|
||||
%res = tail call <2 x double> @llvm.x86.fma.vfmadd.sd(<2 x double> %a, <2 x double> %1, <2 x double> %2)
|
||||
ret <2 x double> %res
|
||||
%3 = extractelement <2 x double> %a, i64 0
|
||||
%4 = extractelement <2 x double> %1, i64 0
|
||||
%5 = extractelement <2 x double> %2, i64 0
|
||||
%6 = call double @llvm.fma.f64(double %3, double %4, double %5)
|
||||
%7 = insertelement <2 x double> %a, double %6, i64 0
|
||||
ret <2 x double> %7
|
||||
}
|
||||
|
||||
define double @test_vfmadd_sd_0(<2 x double> %a, <2 x double> %b, <2 x double> %c) {
|
||||
; CHECK-LABEL: @test_vfmadd_sd_0(
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = tail call <2 x double> @llvm.x86.fma.vfmadd.sd(<2 x double> %a, <2 x double> %b, <2 x double> %c)
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = extractelement <2 x double> [[TMP1]], i32 0
|
||||
; CHECK-NEXT: ret double [[TMP2]]
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = extractelement <2 x double> [[A:%.*]], i64 0
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = extractelement <2 x double> [[B:%.*]], i64 0
|
||||
; CHECK-NEXT: [[TMP3:%.*]] = extractelement <2 x double> [[C:%.*]], i64 0
|
||||
; CHECK-NEXT: [[TMP4:%.*]] = call double @llvm.fma.f64(double [[TMP1]], double [[TMP2]], double [[TMP3]])
|
||||
; CHECK-NEXT: ret double [[TMP4]]
|
||||
;
|
||||
%1 = insertelement <2 x double> %a, double 1.000000e+00, i32 1
|
||||
%2 = tail call <2 x double> @llvm.x86.fma.vfmadd.sd(<2 x double> %1, <2 x double> %b, <2 x double> %c)
|
||||
%3 = extractelement <2 x double> %2, i32 0
|
||||
ret double %3
|
||||
%2 = extractelement <2 x double> %1, i64 0
|
||||
%3 = extractelement <2 x double> %b, i64 0
|
||||
%4 = extractelement <2 x double> %c, i64 0
|
||||
%5 = call double @llvm.fma.f64(double %2, double %3, double %4)
|
||||
%6 = insertelement <2 x double> %1, double %5, i64 0
|
||||
%7 = extractelement <2 x double> %6, i32 0
|
||||
ret double %7
|
||||
}
|
||||
|
||||
define double @test_vfmadd_sd_1(<2 x double> %a, <2 x double> %b, <2 x double> %c) {
|
||||
@ -75,8 +103,14 @@ define double @test_vfmadd_sd_1(<2 x double> %a, <2 x double> %b, <2 x double> %
|
||||
; CHECK-NEXT: ret double 1.000000e+00
|
||||
;
|
||||
%1 = insertelement <2 x double> %a, double 1.000000e+00, i32 1
|
||||
%2 = tail call <2 x double> @llvm.x86.fma.vfmadd.sd(<2 x double> %1, <2 x double> %b, <2 x double> %c)
|
||||
%3 = extractelement <2 x double> %2, i32 1
|
||||
ret double %3
|
||||
%2 = extractelement <2 x double> %1, i64 0
|
||||
%3 = extractelement <2 x double> %b, i64 0
|
||||
%4 = extractelement <2 x double> %c, i64 0
|
||||
%5 = call double @llvm.fma.f64(double %2, double %3, double %4)
|
||||
%6 = insertelement <2 x double> %1, double %5, i64 0
|
||||
%7 = extractelement <2 x double> %6, i32 1
|
||||
ret double %7
|
||||
}
|
||||
|
||||
declare float @llvm.fma.f32(float, float, float)
|
||||
declare double @llvm.fma.f64(double, double, double)
|
||||
|
Loading…
x
Reference in New Issue
Block a user