• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-- -mcpu=corei7 | FileCheck %s --check-prefix=ALL --check-prefix=X64
3; RUN: llc < %s -mtriple=x86_64-- -mcpu=corei7-avx | FileCheck %s --check-prefix=ALL --check-prefix=SHLD
4; RUN: llc < %s -mtriple=x86_64-- -mcpu=core-avx2 | FileCheck %s --check-prefix=ALL --check-prefix=BMI2
5
6define i64 @foo(i64 %x, i64 %y, i64 %z) nounwind readnone {
7; ALL-LABEL: foo:
8; ALL:       # %bb.0: # %entry
9; ALL-NEXT:    movl %edx, %ecx
10; ALL-NEXT:    rolq %cl, %rdi
11; ALL-NEXT:    movq %rdi, %rax
12; ALL-NEXT:    retq
13entry:
14	%0 = shl i64 %x, %z
15	%1 = sub i64 64, %z
16	%2 = lshr i64 %x, %1
17	%3 = or i64 %2, %0
18	ret i64 %3
19}
20
21define i64 @bar(i64 %x, i64 %y, i64 %z) nounwind readnone {
22; ALL-LABEL: bar:
23; ALL:       # %bb.0: # %entry
24; ALL-NEXT:    movl %edx, %ecx
25; ALL-NEXT:    shldq %cl, %rdi, %rsi
26; ALL-NEXT:    movq %rsi, %rax
27; ALL-NEXT:    retq
28entry:
29	%0 = shl i64 %y, %z
30	%1 = sub i64 64, %z
31	%2 = lshr i64 %x, %1
32	%3 = or i64 %2, %0
33	ret i64 %3
34}
35
36define i64 @un(i64 %x, i64 %y, i64 %z) nounwind readnone {
37; ALL-LABEL: un:
38; ALL:       # %bb.0: # %entry
39; ALL-NEXT:    movl %edx, %ecx
40; ALL-NEXT:    rorq %cl, %rdi
41; ALL-NEXT:    movq %rdi, %rax
42; ALL-NEXT:    retq
43entry:
44	%0 = lshr i64 %x, %z
45	%1 = sub i64 64, %z
46	%2 = shl i64 %x, %1
47	%3 = or i64 %2, %0
48	ret i64 %3
49}
50
51define i64 @bu(i64 %x, i64 %y, i64 %z) nounwind readnone {
52; ALL-LABEL: bu:
53; ALL:       # %bb.0: # %entry
54; ALL-NEXT:    movl %edx, %ecx
55; ALL-NEXT:    shrdq %cl, %rdi, %rsi
56; ALL-NEXT:    movq %rsi, %rax
57; ALL-NEXT:    retq
58entry:
59	%0 = lshr i64 %y, %z
60	%1 = sub i64 64, %z
61	%2 = shl i64 %x, %1
62	%3 = or i64 %2, %0
63	ret i64 %3
64}
65
66define i64 @xfoo(i64 %x, i64 %y, i64 %z) nounwind readnone {
67; X64-LABEL: xfoo:
68; X64:       # %bb.0: # %entry
69; X64-NEXT:    rolq $7, %rdi
70; X64-NEXT:    movq %rdi, %rax
71; X64-NEXT:    retq
72;
73; SHLD-LABEL: xfoo:
74; SHLD:       # %bb.0: # %entry
75; SHLD-NEXT:    shldq $7, %rdi, %rdi
76; SHLD-NEXT:    movq %rdi, %rax
77; SHLD-NEXT:    retq
78;
79; BMI2-LABEL: xfoo:
80; BMI2:       # %bb.0: # %entry
81; BMI2-NEXT:    rorxq $57, %rdi, %rax
82; BMI2-NEXT:    retq
83entry:
84	%0 = lshr i64 %x, 57
85	%1 = shl i64 %x, 7
86	%2 = or i64 %0, %1
87	ret i64 %2
88}
89
90define i64 @xfoop(i64* %p) nounwind readnone {
91; X64-LABEL: xfoop:
92; X64:       # %bb.0: # %entry
93; X64-NEXT:    movq (%rdi), %rax
94; X64-NEXT:    rolq $7, %rax
95; X64-NEXT:    retq
96;
97; SHLD-LABEL: xfoop:
98; SHLD:       # %bb.0: # %entry
99; SHLD-NEXT:    movq (%rdi), %rax
100; SHLD-NEXT:    shldq $7, %rax, %rax
101; SHLD-NEXT:    retq
102;
103; BMI2-LABEL: xfoop:
104; BMI2:       # %bb.0: # %entry
105; BMI2-NEXT:    rorxq $57, (%rdi), %rax
106; BMI2-NEXT:    retq
107entry:
108	%x = load i64, i64* %p
109	%a = lshr i64 %x, 57
110	%b = shl i64 %x, 7
111	%c = or i64 %a, %b
112	ret i64 %c
113}
114
115define i64 @xbar(i64 %x, i64 %y, i64 %z) nounwind readnone {
116; ALL-LABEL: xbar:
117; ALL:       # %bb.0: # %entry
118; ALL-NEXT:    shrdq $57, %rsi, %rdi
119; ALL-NEXT:    movq %rdi, %rax
120; ALL-NEXT:    retq
121entry:
122	%0 = shl i64 %y, 7
123	%1 = lshr i64 %x, 57
124	%2 = or i64 %0, %1
125	ret i64 %2
126}
127
128define i64 @xun(i64 %x, i64 %y, i64 %z) nounwind readnone {
129; X64-LABEL: xun:
130; X64:       # %bb.0: # %entry
131; X64-NEXT:    rolq $57, %rdi
132; X64-NEXT:    movq %rdi, %rax
133; X64-NEXT:    retq
134;
135; SHLD-LABEL: xun:
136; SHLD:       # %bb.0: # %entry
137; SHLD-NEXT:    shldq $57, %rdi, %rdi
138; SHLD-NEXT:    movq %rdi, %rax
139; SHLD-NEXT:    retq
140;
141; BMI2-LABEL: xun:
142; BMI2:       # %bb.0: # %entry
143; BMI2-NEXT:    rorxq $7, %rdi, %rax
144; BMI2-NEXT:    retq
145entry:
146	%0 = lshr i64 %x, 7
147	%1 = shl i64 %x, 57
148	%2 = or i64 %0, %1
149	ret i64 %2
150}
151
152define i64 @xunp(i64* %p) nounwind readnone {
153; X64-LABEL: xunp:
154; X64:       # %bb.0: # %entry
155; X64-NEXT:    movq (%rdi), %rax
156; X64-NEXT:    rolq $57, %rax
157; X64-NEXT:    retq
158;
159; SHLD-LABEL: xunp:
160; SHLD:       # %bb.0: # %entry
161; SHLD-NEXT:    movq (%rdi), %rax
162; SHLD-NEXT:    shldq $57, %rax, %rax
163; SHLD-NEXT:    retq
164;
165; BMI2-LABEL: xunp:
166; BMI2:       # %bb.0: # %entry
167; BMI2-NEXT:    rorxq $7, (%rdi), %rax
168; BMI2-NEXT:    retq
169entry:
170	%x = load i64, i64* %p
171	%a = lshr i64 %x, 7
172	%b = shl i64 %x, 57
173	%c = or i64 %a, %b
174	ret i64 %c
175}
176
177define i64 @xbu(i64 %x, i64 %y, i64 %z) nounwind readnone {
178; ALL-LABEL: xbu:
179; ALL:       # %bb.0: # %entry
180; ALL-NEXT:    shldq $57, %rsi, %rdi
181; ALL-NEXT:    movq %rdi, %rax
182; ALL-NEXT:    retq
183entry:
184	%0 = lshr i64 %y, 7
185	%1 = shl i64 %x, 57
186	%2 = or i64 %0, %1
187	ret i64 %2
188}
189