[AVX512] Bring back vector-shuffle lowering support through broadcasts
[oota-llvm.git] / test / CodeGen / X86 / h-registers-0.ll
1 ; RUN: llc < %s -mattr=-bmi -mtriple=x86_64-linux | FileCheck %s -check-prefix=X86-64
2 ; RUN: llc < %s -mattr=-bmi -mtriple=x86_64-win32 | FileCheck %s -check-prefix=WIN64
3 ; RUN: llc < %s -mattr=-bmi -march=x86    | FileCheck %s -check-prefix=X86-32
4
5 ; Use h registers. On x86-64, codegen doesn't support general allocation
6 ; of h registers yet, due to x86 encoding complications.
7
8 define void @bar64(i64 inreg %x, i8* inreg %p) nounwind {
9 ; X86-64-LABEL: bar64:
10 ; X86-64: shrq $8, %rdi
11 ; X86-64: incb %dil
12
13 ; See FIXME: on regclass GR8.
14 ; It could be optimally transformed like; incb %ch; movb %ch, (%rdx)
15 ; WIN64-LABEL:  bar64:
16 ; WIN64:  shrq $8, %rcx
17 ; WIN64:  incb %cl
18
19 ; X86-32-LABEL: bar64:
20 ; X86-32: incb %ah
21   %t0 = lshr i64 %x, 8
22   %t1 = trunc i64 %t0 to i8
23   %t2 = add i8 %t1, 1
24   store i8 %t2, i8* %p
25   ret void
26 }
27
28 define void @bar32(i32 inreg %x, i8* inreg %p) nounwind {
29 ; X86-64-LABEL: bar32:
30 ; X86-64: shrl $8, %edi
31 ; X86-64: incb %dil
32
33 ; WIN64-LABEL:  bar32:
34 ; WIN64:  shrl $8, %ecx
35 ; WIN64:  incb %cl
36
37 ; X86-32-LABEL: bar32:
38 ; X86-32: incb %ah
39   %t0 = lshr i32 %x, 8
40   %t1 = trunc i32 %t0 to i8
41   %t2 = add i8 %t1, 1
42   store i8 %t2, i8* %p
43   ret void
44 }
45
46 define void @bar16(i16 inreg %x, i8* inreg %p) nounwind {
47 ; X86-64-LABEL: bar16:
48 ; X86-64: shrl $8, %edi
49 ; X86-64: incb %dil
50
51 ; WIN64-LABEL:  bar16:
52 ; WIN64:  shrl $8, %ecx
53 ; WIN64:  incb %cl
54
55 ; X86-32-LABEL: bar16:
56 ; X86-32: incb %ah
57   %t0 = lshr i16 %x, 8
58   %t1 = trunc i16 %t0 to i8
59   %t2 = add i8 %t1, 1
60   store i8 %t2, i8* %p
61   ret void
62 }
63
64 define i64 @qux64(i64 inreg %x) nounwind {
65 ; X86-64-LABEL: qux64:
66 ; X86-64: movq %rdi, %rax
67 ; X86-64: movzbl %ah, %eax
68
69 ; WIN64-LABEL:  qux64:
70 ; WIN64:  movzbl %ch, %eax
71
72 ; X86-32-LABEL: qux64:
73 ; X86-32: movzbl %ah, %eax
74   %t0 = lshr i64 %x, 8
75   %t1 = and i64 %t0, 255
76   ret i64 %t1
77 }
78
79 define i32 @qux32(i32 inreg %x) nounwind {
80 ; X86-64-LABEL: qux32:
81 ; X86-64: movl %edi, %eax
82 ; X86-64: movzbl %ah, %eax
83
84 ; WIN64-LABEL:  qux32:
85 ; WIN64:  movzbl %ch, %eax
86
87 ; X86-32-LABEL: qux32:
88 ; X86-32: movzbl %ah, %eax
89   %t0 = lshr i32 %x, 8
90   %t1 = and i32 %t0, 255
91   ret i32 %t1
92 }
93
94 define i16 @qux16(i16 inreg %x) nounwind {
95 ; X86-64-LABEL: qux16:
96 ; X86-64: movl %edi, %eax
97 ; X86-64: movzbl %ah, %eax
98
99 ; WIN64-LABEL:  qux16:
100 ; WIN64:  movzbl %ch, %eax
101
102 ; X86-32-LABEL: qux16:
103 ; X86-32: movzbl %ah, %eax
104   %t0 = lshr i16 %x, 8
105   ret i16 %t0
106 }