Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / h-register-addressing-64.ll
blobb36a9484d8561a3b54abe27227c46b03d109c4b6
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-- -mattr=-bmi | FileCheck %s
4 ; Use h-register extract and zero-extend.
6 define double @foo8(ptr nocapture inreg %p, i64 inreg %x) nounwind readonly {
7 ; CHECK-LABEL: foo8:
8 ; CHECK:       # %bb.0:
9 ; CHECK-NEXT:    movq %rsi, %rax
10 ; CHECK-NEXT:    movzbl %ah, %eax
11 ; CHECK-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
12 ; CHECK-NEXT:    retq
13   %t0 = lshr i64 %x, 8
14   %t1 = and i64 %t0, 255
15   %t2 = getelementptr double, ptr %p, i64 %t1
16   %t3 = load double, ptr %t2, align 8
17   ret double %t3
20 define float @foo4(ptr nocapture inreg %p, i64 inreg %x) nounwind readonly {
21 ; CHECK-LABEL: foo4:
22 ; CHECK:       # %bb.0:
23 ; CHECK-NEXT:    movq %rsi, %rax
24 ; CHECK-NEXT:    movzbl %ah, %eax
25 ; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
26 ; CHECK-NEXT:    retq
27   %t0 = lshr i64 %x, 8
28   %t1 = and i64 %t0, 255
29   %t2 = getelementptr float, ptr %p, i64 %t1
30   %t3 = load float, ptr %t2, align 8
31   ret float %t3
34 define i16 @foo2(ptr nocapture inreg %p, i64 inreg %x) nounwind readonly {
35 ; CHECK-LABEL: foo2:
36 ; CHECK:       # %bb.0:
37 ; CHECK-NEXT:    movq %rsi, %rax
38 ; CHECK-NEXT:    movzbl %ah, %eax
39 ; CHECK-NEXT:    movzwl (%rdi,%rax,2), %eax
40 ; CHECK-NEXT:    retq
41   %t0 = lshr i64 %x, 8
42   %t1 = and i64 %t0, 255
43   %t2 = getelementptr i16, ptr %p, i64 %t1
44   %t3 = load i16, ptr %t2, align 8
45   ret i16 %t3
48 define i8 @foo1(ptr nocapture inreg %p, i64 inreg %x) nounwind readonly {
49 ; CHECK-LABEL: foo1:
50 ; CHECK:       # %bb.0:
51 ; CHECK-NEXT:    movq %rsi, %rax
52 ; CHECK-NEXT:    movzbl %ah, %eax
53 ; CHECK-NEXT:    movzbl (%rdi,%rax), %eax
54 ; CHECK-NEXT:    retq
55   %t0 = lshr i64 %x, 8
56   %t1 = and i64 %t0, 255
57   %t2 = getelementptr i8, ptr %p, i64 %t1
58   %t3 = load i8, ptr %t2, align 8
59   ret i8 %t3
62 define i8 @bar8(ptr nocapture inreg %p, i64 inreg %x) nounwind readonly {
63 ; CHECK-LABEL: bar8:
64 ; CHECK:       # %bb.0:
65 ; CHECK-NEXT:    movq %rsi, %rax
66 ; CHECK-NEXT:    movzbl %ah, %eax
67 ; CHECK-NEXT:    movzbl (%rdi,%rax,8), %eax
68 ; CHECK-NEXT:    retq
69   %t0 = lshr i64 %x, 5
70   %t1 = and i64 %t0, 2040
71   %t2 = getelementptr i8, ptr %p, i64 %t1
72   %t3 = load i8, ptr %t2, align 8
73   ret i8 %t3
76 define i8 @bar4(ptr nocapture inreg %p, i64 inreg %x) nounwind readonly {
77 ; CHECK-LABEL: bar4:
78 ; CHECK:       # %bb.0:
79 ; CHECK-NEXT:    movq %rsi, %rax
80 ; CHECK-NEXT:    movzbl %ah, %eax
81 ; CHECK-NEXT:    movzbl (%rdi,%rax,4), %eax
82 ; CHECK-NEXT:    retq
83   %t0 = lshr i64 %x, 6
84   %t1 = and i64 %t0, 1020
85   %t2 = getelementptr i8, ptr %p, i64 %t1
86   %t3 = load i8, ptr %t2, align 8
87   ret i8 %t3
90 define i8 @bar2(ptr nocapture inreg %p, i64 inreg %x) nounwind readonly {
91 ; CHECK-LABEL: bar2:
92 ; CHECK:       # %bb.0:
93 ; CHECK-NEXT:    movq %rsi, %rax
94 ; CHECK-NEXT:    movzbl %ah, %eax
95 ; CHECK-NEXT:    movzbl (%rdi,%rax,2), %eax
96 ; CHECK-NEXT:    retq
97   %t0 = lshr i64 %x, 7
98   %t1 = and i64 %t0, 510
99   %t2 = getelementptr i8, ptr %p, i64 %t1
100   %t3 = load i8, ptr %t2, align 8
101   ret i8 %t3
104 define double @ext8(ptr nocapture inreg %p, i32 inreg %x) nounwind readonly {
105 ; CHECK-LABEL: ext8:
106 ; CHECK:       # %bb.0:
107 ; CHECK-NEXT:    movl %esi, %eax
108 ; CHECK-NEXT:    movzbl %ah, %eax
109 ; CHECK-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
110 ; CHECK-NEXT:    retq
111   %t0 = lshr i32 %x, 5
112   %t1 = and i32 %t0, 2040
113   %t2 = zext i32 %t1 to i64
114   %t3 = getelementptr i8, ptr %p, i64 %t2
115   %t4 = load double, ptr %t3, align 8
116   ret double %t4
119 define float @ext4(ptr nocapture inreg %p, i32 inreg %x) nounwind readonly {
120 ; CHECK-LABEL: ext4:
121 ; CHECK:       # %bb.0:
122 ; CHECK-NEXT:    movl %esi, %eax
123 ; CHECK-NEXT:    movzbl %ah, %eax
124 ; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
125 ; CHECK-NEXT:    retq
126   %t0 = lshr i32 %x, 6
127   %t1 = and i32 %t0, 1020
128   %t2 = zext i32 %t1 to i64
129   %t3 = getelementptr i8, ptr %p, i64 %t2
130   %t4 = load float, ptr %t3, align 8
131   ret float %t4
134 define i8 @ext2(ptr nocapture inreg %p, i32 inreg %x) nounwind readonly {
135 ; CHECK-LABEL: ext2:
136 ; CHECK:       # %bb.0:
137 ; CHECK-NEXT:    movl %esi, %eax
138 ; CHECK-NEXT:    movzbl %ah, %eax
139 ; CHECK-NEXT:    movzbl (%rdi,%rax,2), %eax
140 ; CHECK-NEXT:    retq
141   %t0 = lshr i32 %x, 7
142   %t1 = and i32 %t0, 510
143   %t2 = zext i32 %t1 to i64
144   %t3 = getelementptr i8, ptr %p, i64 %t2
145   %t4 = load i8, ptr %t3, align 8
146   ret i8 %t4