summaryrefslogtreecommitdiff
path: root/test/CodeGen/X86/avx512-regcall-Mask.ll
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2017-01-02 19:17:04 +0000
committerDimitry Andric <dim@FreeBSD.org>2017-01-02 19:17:04 +0000
commitb915e9e0fc85ba6f398b3fab0db6a81a8913af94 (patch)
tree98b8f811c7aff2547cab8642daf372d6c59502fb /test/CodeGen/X86/avx512-regcall-Mask.ll
parent6421cca32f69ac849537a3cff78c352195e99f1b (diff)
downloadsrc-test-b915e9e0fc85ba6f398b3fab0db6a81a8913af94.tar.gz
src-test-b915e9e0fc85ba6f398b3fab0db6a81a8913af94.zip
Notes
Diffstat (limited to 'test/CodeGen/X86/avx512-regcall-Mask.ll')
-rw-r--r--test/CodeGen/X86/avx512-regcall-Mask.ll350
1 files changed, 350 insertions, 0 deletions
diff --git a/test/CodeGen/X86/avx512-regcall-Mask.ll b/test/CodeGen/X86/avx512-regcall-Mask.ll
new file mode 100644
index 0000000000000..325097ee95105
--- /dev/null
+++ b/test/CodeGen/X86/avx512-regcall-Mask.ll
@@ -0,0 +1,350 @@
+; RUN: llc < %s -mtriple=i386-pc-win32 -mattr=+avx512bw | FileCheck --check-prefix=CHECK --check-prefix=X32 %s
+; RUN: llc < %s -mtriple=x86_64-win32 -mattr=+avx512bw | FileCheck --check-prefix=CHECK --check-prefix=CHECK64 --check-prefix=WIN64 %s
+; RUN: llc < %s -mtriple=x86_64-linux-gnu -mattr=+avx512bw | FileCheck --check-prefix=CHECK --check-prefix=CHECK64 --check-prefix=LINUXOSX64 %s
+
+; X32-LABEL: test_argv64i1:
+; X32: kmovd %edx, %k0
+; X32: kmovd %edi, %k1
+; X32: kmovd %eax, %k1
+; X32: kmovd %ecx, %k2
+; X32: ad{{d|c}}l {{([0-9])*}}(%ebp), %e{{a|c}}x
+; X32: ad{{d|c}}l {{([0-9])*}}(%ebp), %e{{a|c}}x
+; X32: ad{{d|c}}l {{([0-9])*}}(%ebp), %e{{a|c}}x
+; X32: ad{{d|c}}l {{([0-9])*}}(%ebp), %e{{a|c}}x
+; X32: ad{{d|c}}l {{([0-9])*}}(%ebp), %e{{a|c}}x
+; X32: ad{{d|c}}l {{([0-9])*}}(%ebp), %e{{a|c}}x
+; X32: ad{{d|c}}l {{([0-9])*}}(%ebp), %e{{a|c}}x
+; X32: ad{{d|c}}l {{([0-9])*}}(%ebp), %e{{a|c}}x
+; X32: ad{{d|c}}l {{([0-9])*}}(%ebp), %e{{a|c}}x
+; X32: ad{{d|c}}l {{([0-9])*}}(%ebp), %e{{a|c}}x
+; X32: ad{{d|c}}l {{([0-9])*}}(%ebp), %e{{a|c}}x
+; X32: ad{{d|c}}l {{([0-9])*}}(%ebp), %e{{a|c}}x
+; X32: ad{{d|c}}l {{([0-9])*}}(%ebp), %e{{a|c}}x
+; X32: ad{{d|c}}l {{([0-9])*}}(%ebp), %e{{a|c}}x
+; X32: ad{{d|c}}l {{([0-9])*}}(%ebp), %e{{a|c}}x
+; X32: ad{{d|c}}l {{([0-9])*}}(%ebp), %e{{a|c}}x
+; X32: ad{{d|c}}l {{([0-9])*}}(%ebp), %e{{a|c}}x
+; X32: ad{{d|c}}l {{([0-9])*}}(%ebp), %e{{a|c}}x
+; X32: ad{{d|c}}l {{([0-9])*}}(%ebp), %e{{a|c}}x
+; X32: ad{{d|c}}l {{([0-9])*}}(%ebp), %e{{a|c}}x
+; X32: ad{{d|c}}l {{([0-9])*}}(%ebp), %e{{a|c}}x
+; X32: ad{{d|c}}l {{([0-9])*}}(%ebp), %e{{a|c}}x
+; X32: retl
+
+; WIN64-LABEL: test_argv64i1:
+; WIN64: addq %rcx, %rax
+; WIN64: addq %rdx, %rax
+; WIN64: addq %rdi, %rax
+; WIN64: addq %rsi, %rax
+; WIN64: addq %r8, %rax
+; WIN64: addq %r9, %rax
+; WIN64: addq %r10, %rax
+; WIN64: addq %r11, %rax
+; WIN64: addq %r12, %rax
+; WIN64: addq %r14, %rax
+; WIN64: addq %r15, %rax
+; WIN64: addq {{([0-9])*}}(%rsp), %rax
+; WIN64: retq
+
+; LINUXOSX64-LABEL: test_argv64i1:
+; LINUXOSX64: addq %rcx, %rax
+; LINUXOSX64: addq %rdx, %rax
+; LINUXOSX64: addq %rdi, %rax
+; LINUXOSX64: addq %rsi, %rax
+; LINUXOSX64: addq %r8, %rax
+; LINUXOSX64: addq %r9, %rax
+; LINUXOSX64: addq %r12, %rax
+; LINUXOSX64: addq %r13, %rax
+; LINUXOSX64: addq %r14, %rax
+; LINUXOSX64: addq %r15, %rax
+; LINUXOSX64: addq {{([0-9])*}}(%rsp), %rax
+; LINUXOSX64: addq {{([0-9])*}}(%rsp), %rax
+; LINUXOSX64: retq
+
+; Test regcall when receiving arguments of v64i1 type
+define x86_regcallcc i64 @test_argv64i1(<64 x i1> %x0, <64 x i1> %x1, <64 x i1> %x2,
+ <64 x i1> %x3, <64 x i1> %x4, <64 x i1> %x5,
+ <64 x i1> %x6, <64 x i1> %x7, <64 x i1> %x8,
+ <64 x i1> %x9, <64 x i1> %x10, <64 x i1> %x11,
+ <64 x i1> %x12) {
+ %y0 = bitcast <64 x i1> %x0 to i64
+ %y1 = bitcast <64 x i1> %x1 to i64
+ %y2 = bitcast <64 x i1> %x2 to i64
+ %y3 = bitcast <64 x i1> %x3 to i64
+ %y4 = bitcast <64 x i1> %x4 to i64
+ %y5 = bitcast <64 x i1> %x5 to i64
+ %y6 = bitcast <64 x i1> %x6 to i64
+ %y7 = bitcast <64 x i1> %x7 to i64
+ %y8 = bitcast <64 x i1> %x8 to i64
+ %y9 = bitcast <64 x i1> %x9 to i64
+ %y10 = bitcast <64 x i1> %x10 to i64
+ %y11 = bitcast <64 x i1> %x11 to i64
+ %y12 = bitcast <64 x i1> %x12 to i64
+ %add1 = add i64 %y0, %y1
+ %add2 = add i64 %add1, %y2
+ %add3 = add i64 %add2, %y3
+ %add4 = add i64 %add3, %y4
+ %add5 = add i64 %add4, %y5
+ %add6 = add i64 %add5, %y6
+ %add7 = add i64 %add6, %y7
+ %add8 = add i64 %add7, %y8
+ %add9 = add i64 %add8, %y9
+ %add10 = add i64 %add9, %y10
+ %add11 = add i64 %add10, %y11
+ %add12 = add i64 %add11, %y12
+ ret i64 %add12
+}
+
+; X32-LABEL: caller_argv64i1:
+; X32: movl $2, %eax
+; X32: movl $1, %ecx
+; X32: movl $2, %edx
+; X32: movl $1, %edi
+; X32: pushl ${{1|2}}
+; X32: pushl ${{1|2}}
+; X32: pushl ${{1|2}}
+; X32: pushl ${{1|2}}
+; X32: pushl ${{1|2}}
+; X32: pushl ${{1|2}}
+; X32: pushl ${{1|2}}
+; X32: pushl ${{1|2}}
+; X32: pushl ${{1|2}}
+; X32: pushl ${{1|2}}
+; X32: pushl ${{1|2}}
+; X32: pushl ${{1|2}}
+; X32: pushl ${{1|2}}
+; X32: pushl ${{1|2}}
+; X32: pushl ${{1|2}}
+; X32: pushl ${{1|2}}
+; X32: pushl ${{1|2}}
+; X32: pushl ${{1|2}}
+; X32: pushl ${{1|2}}
+; X32: pushl ${{1|2}}
+; X32: pushl ${{1|2}}
+; X32: pushl ${{1|2}}
+; X32: call{{.*}} _test_argv64i1
+
+; WIN64-LABEL: caller_argv64i1:
+; WIN64: movabsq $4294967298, %rax
+; WIN64: movq %rax, (%rsp)
+; WIN64: movq %rax, %rcx
+; WIN64: movq %rax, %rdx
+; WIN64: movq %rax, %rdi
+; WIN64: movq %rax, %rsi
+; WIN64: movq %rax, %r8
+; WIN64: movq %rax, %r9
+; WIN64: movq %rax, %r10
+; WIN64: movq %rax, %r11
+; WIN64: movq %rax, %r12
+; WIN64: movq %rax, %r14
+; WIN64: movq %rax, %r15
+; WIN64: callq test_argv64i1
+
+; LINUXOSX64-LABEL: caller_argv64i1:
+; LINUXOSX64: movabsq $4294967298, %rax
+; LINUXOSX64: movq %rax, %rcx
+; LINUXOSX64: movq %rax, %rdx
+; LINUXOSX64: movq %rax, %rdi
+; LINUXOSX64: movq %rax, %rsi
+; LINUXOSX64: movq %rax, %r8
+; LINUXOSX64: movq %rax, %r9
+; LINUXOSX64: movq %rax, %r12
+; LINUXOSX64: movq %rax, %r13
+; LINUXOSX64: movq %rax, %r14
+; LINUXOSX64: movq %rax, %r15
+; LINUXOSX64: call{{.*}} test_argv64i1
+
+; Test regcall when passing arguments of v64i1 type
+define i64 @caller_argv64i1() #0 {
+entry:
+ %v0 = bitcast i64 4294967298 to <64 x i1>
+ %call = call x86_regcallcc i64 @test_argv64i1(<64 x i1> %v0, <64 x i1> %v0, <64 x i1> %v0,
+ <64 x i1> %v0, <64 x i1> %v0, <64 x i1> %v0,
+ <64 x i1> %v0, <64 x i1> %v0, <64 x i1> %v0,
+ <64 x i1> %v0, <64 x i1> %v0, <64 x i1> %v0,
+ <64 x i1> %v0)
+ ret i64 %call
+}
+
+; X32-LABEL: test_retv64i1:
+; X32: mov{{.*}} $2, %eax
+; X32: mov{{.*}} $1, %ecx
+; X32: ret{{.*}}
+
+; CHECK64-LABEL: test_retv64i1:
+; CHECK64: mov{{.*}} $4294967298, %rax
+; CHECK64: ret{{.*}}
+
+; Test regcall when returning v64i1 type
+define x86_regcallcc <64 x i1> @test_retv64i1() {
+ %a = bitcast i64 4294967298 to <64 x i1>
+ ret <64 x i1> %a
+}
+
+; X32-LABEL: caller_retv64i1:
+; X32: call{{.*}} _test_retv64i1
+; X32: kmov{{.*}} %eax, %k0
+; X32: kmov{{.*}} %ecx, %k1
+; X32: kunpckdq %k0, %k1, %k0
+
+; CHECK64-LABEL: caller_retv64i1:
+; CHECK64: call{{.*}} {{_*}}test_retv64i1
+; CHECK64: kmovq %rax, %k0
+; CHECK64: ret{{.*}}
+
+; Test regcall when processing result of v64i1 type
+define <64 x i1> @caller_retv64i1() #0 {
+entry:
+ %call = call x86_regcallcc <64 x i1> @test_retv64i1()
+ ret <64 x i1> %call
+}
+
+; CHECK-LABEL: test_argv32i1:
+; CHECK: kmovd %edx, %k{{[0-9]+}}
+; CHECK: kmovd %ecx, %k{{[0-9]+}}
+; CHECK: kmovd %eax, %k{{[0-9]+}}
+; CHECK: ret{{l|q}}
+
+; Test regcall when receiving arguments of v32i1 type
+declare i32 @test_argv32i1helper(<32 x i1> %x0, <32 x i1> %x1, <32 x i1> %x2)
+define x86_regcallcc i32 @test_argv32i1(<32 x i1> %x0, <32 x i1> %x1, <32 x i1> %x2) {
+entry:
+ %res = call i32 @test_argv32i1helper(<32 x i1> %x0, <32 x i1> %x1, <32 x i1> %x2)
+ ret i32 %res
+}
+
+; CHECK-LABEL: caller_argv32i1:
+; CHECK: mov{{.*}} $1, %eax
+; CHECK: mov{{.*}} $1, %ecx
+; CHECK: mov{{.*}} $1, %edx
+; CHECK: call{{.*}} {{_*}}test_argv32i1
+
+; Test regcall when passing arguments of v32i1 type
+define i32 @caller_argv32i1() #0 {
+entry:
+ %v0 = bitcast i32 1 to <32 x i1>
+ %call = call x86_regcallcc i32 @test_argv32i1(<32 x i1> %v0, <32 x i1> %v0, <32 x i1> %v0)
+ ret i32 %call
+}
+
+; CHECK-LABEL: test_retv32i1:
+; CHECK: movl $1, %eax
+; CHECK: ret{{l|q}}
+
+; Test regcall when returning v32i1 type
+define x86_regcallcc <32 x i1> @test_retv32i1() {
+ %a = bitcast i32 1 to <32 x i1>
+ ret <32 x i1> %a
+}
+
+; CHECK-LABEL: caller_retv32i1:
+; CHECK: call{{.*}} {{_*}}test_retv32i1
+; CHECK: incl %eax
+
+; Test regcall when processing result of v32i1 type
+define i32 @caller_retv32i1() #0 {
+entry:
+ %call = call x86_regcallcc <32 x i1> @test_retv32i1()
+ %c = bitcast <32 x i1> %call to i32
+ %add = add i32 %c, 1
+ ret i32 %add
+}
+
+; CHECK-LABEL: test_argv16i1:
+; CHECK: kmovw %edx, %k{{[0-9]+}}
+; CHECK: kmovw %ecx, %k{{[0-9]+}}
+; CHECK: kmovw %eax, %k{{[0-9]+}}
+; CHECK: ret{{l|q}}
+
+; Test regcall when receiving arguments of v16i1 type
+declare i16 @test_argv16i1helper(<16 x i1> %x0, <16 x i1> %x1, <16 x i1> %x2)
+define x86_regcallcc i16 @test_argv16i1(<16 x i1> %x0, <16 x i1> %x1, <16 x i1> %x2) {
+ %res = call i16 @test_argv16i1helper(<16 x i1> %x0, <16 x i1> %x1, <16 x i1> %x2)
+ ret i16 %res
+}
+
+; CHECK-LABEL: caller_argv16i1:
+; CHECK: movl $1, %eax
+; CHECK: movl $1, %ecx
+; CHECK: movl $1, %edx
+; CHECK: call{{l|q}} {{_*}}test_argv16i1
+
+; Test regcall when passing arguments of v16i1 type
+define i16 @caller_argv16i1() #0 {
+entry:
+ %v0 = bitcast i16 1 to <16 x i1>
+ %call = call x86_regcallcc i16 @test_argv16i1(<16 x i1> %v0, <16 x i1> %v0, <16 x i1> %v0)
+ ret i16 %call
+}
+
+; CHECK-LABEL: test_retv16i1:
+; CHECK: movw $1, %ax
+; CHECK: ret{{l|q}}
+
+; Test regcall when returning v16i1 type
+define x86_regcallcc <16 x i1> @test_retv16i1() {
+ %a = bitcast i16 1 to <16 x i1>
+ ret <16 x i1> %a
+}
+
+; CHECK-LABEL: caller_retv16i1:
+; CHECK: call{{l|q}} {{_*}}test_retv16i1
+; CHECK: incl %eax
+
+; Test regcall when processing result of v16i1 type
+define i16 @caller_retv16i1() #0 {
+entry:
+ %call = call x86_regcallcc <16 x i1> @test_retv16i1()
+ %c = bitcast <16 x i1> %call to i16
+ %add = add i16 %c, 1
+ ret i16 %add
+}
+
+; CHECK-LABEL: test_argv8i1:
+; CHECK: kmovw %edx, %k{{[0-9]+}}
+; CHECK: kmovw %ecx, %k{{[0-9]+}}
+; CHECK: kmovw %eax, %k{{[0-9]+}}
+; CHECK: ret{{l|q}}
+
+; Test regcall when receiving arguments of v8i1 type
+declare i8 @test_argv8i1helper(<8 x i1> %x0, <8 x i1> %x1, <8 x i1> %x2)
+define x86_regcallcc i8 @test_argv8i1(<8 x i1> %x0, <8 x i1> %x1, <8 x i1> %x2) {
+ %res = call i8 @test_argv8i1helper(<8 x i1> %x0, <8 x i1> %x1, <8 x i1> %x2)
+ ret i8 %res
+}
+
+; CHECK-LABEL: caller_argv8i1:
+; CHECK: movl $1, %eax
+; CHECK: movl $1, %ecx
+; CHECK: movl $1, %edx
+; CHECK: call{{l|q}} {{_*}}test_argv8i1
+
+; Test regcall when passing arguments of v8i1 type
+define i8 @caller_argv8i1() #0 {
+entry:
+ %v0 = bitcast i8 1 to <8 x i1>
+ %call = call x86_regcallcc i8 @test_argv8i1(<8 x i1> %v0, <8 x i1> %v0, <8 x i1> %v0)
+ ret i8 %call
+}
+
+; CHECK-LABEL: test_retv8i1:
+; CHECK: movb $1, %al
+; CHECK: ret{{q|l}}
+
+; Test regcall when returning v8i1 type
+define x86_regcallcc <8 x i1> @test_retv8i1() {
+ %a = bitcast i8 1 to <8 x i1>
+ ret <8 x i1> %a
+}
+
+; CHECK-LABEL: caller_retv8i1:
+; CHECK: call{{l|q}} {{_*}}test_retv8i1
+; CHECK: kmovw %eax, %k{{[0-9]+}}
+; CHECK: ret{{l|q}}
+
+; Test regcall when processing result of v8i1 type
+define <8 x i1> @caller_retv8i1() #0 {
+entry:
+ %call = call x86_regcallcc <8 x i1> @test_retv8i1()
+ ret <8 x i1> %call
+}