xref: /llvm-project/llvm/test/CodeGen/X86/movbe.ll (revision 02d56801ee8e4fcce303a47e5fac1967f5660d38)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2; RUN: llc -mtriple=x86_64-linux -mcpu=atom < %s | FileCheck %s
3; RUN: llc -mtriple=x86_64-linux -mcpu=slm < %s | FileCheck %s -check-prefix=SLM
4; RUN: llc -mtriple=x86_64-linux -mattr=+egpr,+ndd,+movbe --show-mc-encoding < %s | FileCheck %s -check-prefix=EGPR
5; RUN: llc -mtriple=x86_64-linux -mattr=+egpr,+ndd --show-mc-encoding < %s | FileCheck %s -check-prefix=NOMOVBE
6declare i16 @llvm.bswap.i16(i16) nounwind readnone
7declare i32 @llvm.bswap.i32(i32) nounwind readnone
8declare i64 @llvm.bswap.i64(i64) nounwind readnone
9
10define void @test1(ptr nocapture %x, i16 %y) nounwind {
11; CHECK-LABEL: test1:
12; CHECK:       # %bb.0:
13; CHECK-NEXT:    movbew %si, (%rdi)
14; CHECK-NEXT:    nop
15; CHECK-NEXT:    nop
16; CHECK-NEXT:    nop
17; CHECK-NEXT:    nop
18; CHECK-NEXT:    nop
19; CHECK-NEXT:    nop
20; CHECK-NEXT:    retq
21;
22; SLM-LABEL: test1:
23; SLM:       # %bb.0:
24; SLM-NEXT:    movbew %si, (%rdi)
25; SLM-NEXT:    retq
26;
27; EGPR-LABEL: test1:
28; EGPR:       # %bb.0:
29; EGPR-NEXT:    movbew %si, (%rdi) # EVEX TO LEGACY Compression encoding: [0x66,0x0f,0x38,0xf1,0x37]
30; EGPR-NEXT:    retq # encoding: [0xc3]
31;
32; NOMOVBE-LABEL: test1:
33; NOMOVBE:       # %bb.0:
34; NOMOVBE-NEXT:    rolw $8, %si, %ax # encoding: [0x62,0xf4,0x7d,0x18,0xc1,0xc6,0x08]
35; NOMOVBE-NEXT:    movw %ax, (%rdi) # encoding: [0x66,0x89,0x07]
36; NOMOVBE-NEXT:    retq # encoding: [0xc3]
37  %bswap = call i16 @llvm.bswap.i16(i16 %y)
38  store i16 %bswap, ptr %x, align 2
39  ret void
40}
41
42define i16 @test2(ptr %x) nounwind {
43; CHECK-LABEL: test2:
44; CHECK:       # %bb.0:
45; CHECK-NEXT:    movbew (%rdi), %ax
46; CHECK-NEXT:    nop
47; CHECK-NEXT:    nop
48; CHECK-NEXT:    nop
49; CHECK-NEXT:    nop
50; CHECK-NEXT:    nop
51; CHECK-NEXT:    nop
52; CHECK-NEXT:    retq
53;
54; SLM-LABEL: test2:
55; SLM:       # %bb.0:
56; SLM-NEXT:    movbew (%rdi), %ax
57; SLM-NEXT:    retq
58;
59; EGPR-LABEL: test2:
60; EGPR:       # %bb.0:
61; EGPR-NEXT:    movbew (%rdi), %ax # EVEX TO LEGACY Compression encoding: [0x66,0x0f,0x38,0xf0,0x07]
62; EGPR-NEXT:    retq # encoding: [0xc3]
63;
64; NOMOVBE-LABEL: test2:
65; NOMOVBE:       # %bb.0:
66; NOMOVBE-NEXT:    rolw $8, (%rdi), %ax # encoding: [0x62,0xf4,0x7d,0x18,0xc1,0x07,0x08]
67; NOMOVBE-NEXT:    retq # encoding: [0xc3]
68  %load = load i16, ptr %x, align 2
69  %bswap = call i16 @llvm.bswap.i16(i16 %load)
70  ret i16 %bswap
71}
72
73define void @test3(ptr nocapture %x, i32 %y) nounwind {
74; CHECK-LABEL: test3:
75; CHECK:       # %bb.0:
76; CHECK-NEXT:    movbel %esi, (%rdi)
77; CHECK-NEXT:    nop
78; CHECK-NEXT:    nop
79; CHECK-NEXT:    nop
80; CHECK-NEXT:    nop
81; CHECK-NEXT:    nop
82; CHECK-NEXT:    nop
83; CHECK-NEXT:    retq
84;
85; SLM-LABEL: test3:
86; SLM:       # %bb.0:
87; SLM-NEXT:    movbel %esi, (%rdi)
88; SLM-NEXT:    retq
89;
90; EGPR-LABEL: test3:
91; EGPR:       # %bb.0:
92; EGPR-NEXT:    movbel %esi, (%rdi) # EVEX TO LEGACY Compression encoding: [0x0f,0x38,0xf1,0x37]
93; EGPR-NEXT:    retq # encoding: [0xc3]
94;
95; NOMOVBE-LABEL: test3:
96; NOMOVBE:       # %bb.0:
97; NOMOVBE-NEXT:    bswapl %esi # encoding: [0x0f,0xce]
98; NOMOVBE-NEXT:    movl %esi, (%rdi) # encoding: [0x89,0x37]
99; NOMOVBE-NEXT:    retq # encoding: [0xc3]
100  %bswap = call i32 @llvm.bswap.i32(i32 %y)
101  store i32 %bswap, ptr %x, align 4
102  ret void
103}
104
105define i32 @test4(ptr %x) nounwind {
106; CHECK-LABEL: test4:
107; CHECK:       # %bb.0:
108; CHECK-NEXT:    movbel (%rdi), %eax
109; CHECK-NEXT:    nop
110; CHECK-NEXT:    nop
111; CHECK-NEXT:    nop
112; CHECK-NEXT:    nop
113; CHECK-NEXT:    nop
114; CHECK-NEXT:    nop
115; CHECK-NEXT:    retq
116;
117; SLM-LABEL: test4:
118; SLM:       # %bb.0:
119; SLM-NEXT:    movbel (%rdi), %eax
120; SLM-NEXT:    retq
121;
122; EGPR-LABEL: test4:
123; EGPR:       # %bb.0:
124; EGPR-NEXT:    movbel (%rdi), %eax # EVEX TO LEGACY Compression encoding: [0x0f,0x38,0xf0,0x07]
125; EGPR-NEXT:    retq # encoding: [0xc3]
126;
127; NOMOVBE-LABEL: test4:
128; NOMOVBE:       # %bb.0:
129; NOMOVBE-NEXT:    movl (%rdi), %eax # encoding: [0x8b,0x07]
130; NOMOVBE-NEXT:    bswapl %eax # encoding: [0x0f,0xc8]
131; NOMOVBE-NEXT:    retq # encoding: [0xc3]
132  %load = load i32, ptr %x, align 4
133  %bswap = call i32 @llvm.bswap.i32(i32 %load)
134  ret i32 %bswap
135}
136
137define void @test5(ptr %x, i64 %y) nounwind {
138; CHECK-LABEL: test5:
139; CHECK:       # %bb.0:
140; CHECK-NEXT:    movbeq %rsi, (%rdi)
141; CHECK-NEXT:    nop
142; CHECK-NEXT:    nop
143; CHECK-NEXT:    nop
144; CHECK-NEXT:    nop
145; CHECK-NEXT:    nop
146; CHECK-NEXT:    nop
147; CHECK-NEXT:    retq
148;
149; SLM-LABEL: test5:
150; SLM:       # %bb.0:
151; SLM-NEXT:    movbeq %rsi, (%rdi)
152; SLM-NEXT:    retq
153;
154; EGPR-LABEL: test5:
155; EGPR:       # %bb.0:
156; EGPR-NEXT:    movbeq %rsi, (%rdi) # EVEX TO LEGACY Compression encoding: [0x48,0x0f,0x38,0xf1,0x37]
157; EGPR-NEXT:    retq # encoding: [0xc3]
158;
159; NOMOVBE-LABEL: test5:
160; NOMOVBE:       # %bb.0:
161; NOMOVBE-NEXT:    bswapq %rsi # encoding: [0x48,0x0f,0xce]
162; NOMOVBE-NEXT:    movq %rsi, (%rdi) # encoding: [0x48,0x89,0x37]
163; NOMOVBE-NEXT:    retq # encoding: [0xc3]
164  %bswap = call i64 @llvm.bswap.i64(i64 %y)
165  store i64 %bswap, ptr %x, align 8
166  ret void
167}
168
169define i64 @test6(ptr %x) nounwind {
170; CHECK-LABEL: test6:
171; CHECK:       # %bb.0:
172; CHECK-NEXT:    movbeq (%rdi), %rax
173; CHECK-NEXT:    nop
174; CHECK-NEXT:    nop
175; CHECK-NEXT:    nop
176; CHECK-NEXT:    nop
177; CHECK-NEXT:    nop
178; CHECK-NEXT:    nop
179; CHECK-NEXT:    retq
180;
181; SLM-LABEL: test6:
182; SLM:       # %bb.0:
183; SLM-NEXT:    movbeq (%rdi), %rax
184; SLM-NEXT:    retq
185;
186; EGPR-LABEL: test6:
187; EGPR:       # %bb.0:
188; EGPR-NEXT:    movbeq (%rdi), %rax # EVEX TO LEGACY Compression encoding: [0x48,0x0f,0x38,0xf0,0x07]
189; EGPR-NEXT:    retq # encoding: [0xc3]
190;
191; NOMOVBE-LABEL: test6:
192; NOMOVBE:       # %bb.0:
193; NOMOVBE-NEXT:    movq (%rdi), %rax # encoding: [0x48,0x8b,0x07]
194; NOMOVBE-NEXT:    bswapq %rax # encoding: [0x48,0x0f,0xc8]
195; NOMOVBE-NEXT:    retq # encoding: [0xc3]
196  %load = load i64, ptr %x, align 8
197  %bswap = call i64 @llvm.bswap.i64(i64 %load)
198  ret i64 %bswap
199}
200
201define i64 @test7(i64 %x) nounwind {
202; CHECK-LABEL: test7:
203; CHECK:       # %bb.0:
204; CHECK-NEXT:    movq %rdi, %rax
205; CHECK-NEXT:    bswapq %rax
206; CHECK-NEXT:    nop
207; CHECK-NEXT:    nop
208; CHECK-NEXT:    nop
209; CHECK-NEXT:    nop
210; CHECK-NEXT:    retq
211;
212; SLM-LABEL: test7:
213; SLM:       # %bb.0:
214; SLM-NEXT:    movq %rdi, %rax
215; SLM-NEXT:    bswapq %rax
216; SLM-NEXT:    retq
217;
218; EGPR-LABEL: test7:
219; EGPR:       # %bb.0:
220; EGPR-NEXT:    movbeq %rdi, %rax # encoding: [0x62,0xf4,0xfc,0x08,0x61,0xf8]
221; EGPR-NEXT:    retq # encoding: [0xc3]
222;
223; NOMOVBE-LABEL: test7:
224; NOMOVBE:       # %bb.0:
225; NOMOVBE-NEXT:    movq %rdi, %rax # encoding: [0x48,0x89,0xf8]
226; NOMOVBE-NEXT:    bswapq %rax # encoding: [0x48,0x0f,0xc8]
227; NOMOVBE-NEXT:    retq # encoding: [0xc3]
228  %bswap = call i64 @llvm.bswap.i64(i64 %x)
229  ret i64 %bswap
230}
231