From 1766971769c21aa4e55671ac5be45b21ff31f8cd Mon Sep 17 00:00:00 2001 From: Elena Demikhovsky Date: Wed, 1 Feb 2012 10:46:14 +0000 Subject: [PATCH 1/1] Passing AVX 256-bit structures in Win64 was wrong. Fixed Win64 calling conventions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@149494 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86CallingConv.td | 4 ++++ test/CodeGen/X86/avx-win64-args.ll | 18 ++++++++++++++++++ test/CodeGen/X86/avx-win64.ll | 1 - 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100755 test/CodeGen/X86/avx-win64-args.ll diff --git a/lib/Target/X86/X86CallingConv.td b/lib/Target/X86/X86CallingConv.td index ed389a03a4c..1e48deee409 100644 --- a/lib/Target/X86/X86CallingConv.td +++ b/lib/Target/X86/X86CallingConv.td @@ -198,6 +198,10 @@ def CC_X86_Win64_C : CallingConv<[ // 128 bit vectors are passed by pointer CCIfType<[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], CCPassIndirect>, + + // 256 bit vectors are passed by pointer + CCIfType<[v32i8, v16i16, v8i32, v4i64, v8f32, v4f64], CCPassIndirect>, + // The first 4 MMX vector arguments are passed in GPRs. CCIfType<[x86mmx], CCBitConvertToType>, diff --git a/test/CodeGen/X86/avx-win64-args.ll b/test/CodeGen/X86/avx-win64-args.ll new file mode 100755 index 00000000000..8b52417c10f --- /dev/null +++ b/test/CodeGen/X86/avx-win64-args.ll @@ -0,0 +1,18 @@ +; RUN: llc < %s -mcpu=corei7-avx -mattr=+avx | FileCheck %s +target triple = "x86_64-pc-win32" + +declare <8 x float> @foo(<8 x float>, i32) + +define <8 x float> @test1(<8 x float> %x, <8 x float> %y) nounwind uwtable readnone ssp { +entry: +; CHECK: test1 +; CHECK: leaq {{.*}}, %rcx +; CHECK: movl {{.*}}, %edx +; CHECK: call +; CHECK: ret + %x1 = fadd <8 x float> %x, %y + %call = call <8 x float> @foo(<8 x float> %x1, i32 1) nounwind + %y1 = fsub <8 x float> %call, %y + ret <8 x float> %y1 +} + diff --git a/test/CodeGen/X86/avx-win64.ll b/test/CodeGen/X86/avx-win64.ll index 511f94944b6..dc6bd594450 100644 --- a/test/CodeGen/X86/avx-win64.ll +++ b/test/CodeGen/X86/avx-win64.ll @@ -9,7 +9,6 @@ target triple = "x86_64-pc-win32" ; CHECK: f___vyf ; CHECK: pushq %rbp -; CHECK-NOT: vmovaps{{.*}}(%r ; CHECK: vmovmsk ; CHECK: vmovaps %ymm{{.*}}(%r ; CHECK: vmovaps %ymm{{.*}}(%r -- 2.34.1