xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/rot64.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86-64 -mcpu=corei7 > %t
2*9880d681SAndroid Build Coastguard Worker; RUN: grep rol %t | count 5
3*9880d681SAndroid Build Coastguard Worker; RUN: grep ror %t | count 1
4*9880d681SAndroid Build Coastguard Worker; RUN: grep shld %t | count 2
5*9880d681SAndroid Build Coastguard Worker; RUN: grep shrd %t | count 2
6*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86-64 -mcpu=core-avx2 | FileCheck %s --check-prefix=BMI2
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Workerdefine i64 @foo(i64 %x, i64 %y, i64 %z) nounwind readnone {
9*9880d681SAndroid Build Coastguard Workerentry:
10*9880d681SAndroid Build Coastguard Worker	%0 = shl i64 %x, %z
11*9880d681SAndroid Build Coastguard Worker	%1 = sub i64 64, %z
12*9880d681SAndroid Build Coastguard Worker	%2 = lshr i64 %x, %1
13*9880d681SAndroid Build Coastguard Worker	%3 = or i64 %2, %0
14*9880d681SAndroid Build Coastguard Worker	ret i64 %3
15*9880d681SAndroid Build Coastguard Worker}
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Workerdefine i64 @bar(i64 %x, i64 %y, i64 %z) nounwind readnone {
18*9880d681SAndroid Build Coastguard Workerentry:
19*9880d681SAndroid Build Coastguard Worker	%0 = shl i64 %y, %z
20*9880d681SAndroid Build Coastguard Worker	%1 = sub i64 64, %z
21*9880d681SAndroid Build Coastguard Worker	%2 = lshr i64 %x, %1
22*9880d681SAndroid Build Coastguard Worker	%3 = or i64 %2, %0
23*9880d681SAndroid Build Coastguard Worker	ret i64 %3
24*9880d681SAndroid Build Coastguard Worker}
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Workerdefine i64 @un(i64 %x, i64 %y, i64 %z) nounwind readnone {
27*9880d681SAndroid Build Coastguard Workerentry:
28*9880d681SAndroid Build Coastguard Worker	%0 = lshr i64 %x, %z
29*9880d681SAndroid Build Coastguard Worker	%1 = sub i64 64, %z
30*9880d681SAndroid Build Coastguard Worker	%2 = shl i64 %x, %1
31*9880d681SAndroid Build Coastguard Worker	%3 = or i64 %2, %0
32*9880d681SAndroid Build Coastguard Worker	ret i64 %3
33*9880d681SAndroid Build Coastguard Worker}
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Workerdefine i64 @bu(i64 %x, i64 %y, i64 %z) nounwind readnone {
36*9880d681SAndroid Build Coastguard Workerentry:
37*9880d681SAndroid Build Coastguard Worker	%0 = lshr i64 %y, %z
38*9880d681SAndroid Build Coastguard Worker	%1 = sub i64 64, %z
39*9880d681SAndroid Build Coastguard Worker	%2 = shl i64 %x, %1
40*9880d681SAndroid Build Coastguard Worker	%3 = or i64 %2, %0
41*9880d681SAndroid Build Coastguard Worker	ret i64 %3
42*9880d681SAndroid Build Coastguard Worker}
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Workerdefine i64 @xfoo(i64 %x, i64 %y, i64 %z) nounwind readnone {
45*9880d681SAndroid Build Coastguard Workerentry:
46*9880d681SAndroid Build Coastguard Worker; BMI2-LABEL: xfoo:
47*9880d681SAndroid Build Coastguard Worker; BMI2: rorxq $57
48*9880d681SAndroid Build Coastguard Worker	%0 = lshr i64 %x, 57
49*9880d681SAndroid Build Coastguard Worker	%1 = shl i64 %x, 7
50*9880d681SAndroid Build Coastguard Worker	%2 = or i64 %0, %1
51*9880d681SAndroid Build Coastguard Worker	ret i64 %2
52*9880d681SAndroid Build Coastguard Worker}
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Workerdefine i64 @xfoop(i64* %p) nounwind readnone {
55*9880d681SAndroid Build Coastguard Workerentry:
56*9880d681SAndroid Build Coastguard Worker; BMI2-LABEL: xfoop:
57*9880d681SAndroid Build Coastguard Worker; BMI2: rorxq $57, ({{.+}}), %{{.+}}
58*9880d681SAndroid Build Coastguard Worker	%x = load i64, i64* %p
59*9880d681SAndroid Build Coastguard Worker	%a = lshr i64 %x, 57
60*9880d681SAndroid Build Coastguard Worker	%b = shl i64 %x, 7
61*9880d681SAndroid Build Coastguard Worker	%c = or i64 %a, %b
62*9880d681SAndroid Build Coastguard Worker	ret i64 %c
63*9880d681SAndroid Build Coastguard Worker}
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Workerdefine i64 @xbar(i64 %x, i64 %y, i64 %z) nounwind readnone {
66*9880d681SAndroid Build Coastguard Workerentry:
67*9880d681SAndroid Build Coastguard Worker	%0 = shl i64 %y, 7
68*9880d681SAndroid Build Coastguard Worker	%1 = lshr i64 %x, 57
69*9880d681SAndroid Build Coastguard Worker	%2 = or i64 %0, %1
70*9880d681SAndroid Build Coastguard Worker	ret i64 %2
71*9880d681SAndroid Build Coastguard Worker}
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Workerdefine i64 @xun(i64 %x, i64 %y, i64 %z) nounwind readnone {
74*9880d681SAndroid Build Coastguard Workerentry:
75*9880d681SAndroid Build Coastguard Worker; BMI2-LABEL: xun:
76*9880d681SAndroid Build Coastguard Worker; BMI2: rorxq $7
77*9880d681SAndroid Build Coastguard Worker	%0 = lshr i64 %x, 7
78*9880d681SAndroid Build Coastguard Worker	%1 = shl i64 %x, 57
79*9880d681SAndroid Build Coastguard Worker	%2 = or i64 %0, %1
80*9880d681SAndroid Build Coastguard Worker	ret i64 %2
81*9880d681SAndroid Build Coastguard Worker}
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Workerdefine i64 @xunp(i64* %p) nounwind readnone {
84*9880d681SAndroid Build Coastguard Workerentry:
85*9880d681SAndroid Build Coastguard Worker; BMI2-LABEL: xunp:
86*9880d681SAndroid Build Coastguard Worker; BMI2: rorxq $7, ({{.+}}), %{{.+}}
87*9880d681SAndroid Build Coastguard Worker	%x = load i64, i64* %p
88*9880d681SAndroid Build Coastguard Worker	%a = lshr i64 %x, 7
89*9880d681SAndroid Build Coastguard Worker	%b = shl i64 %x, 57
90*9880d681SAndroid Build Coastguard Worker	%c = or i64 %a, %b
91*9880d681SAndroid Build Coastguard Worker	ret i64 %c
92*9880d681SAndroid Build Coastguard Worker}
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Workerdefine i64 @xbu(i64 %x, i64 %y, i64 %z) nounwind readnone {
95*9880d681SAndroid Build Coastguard Workerentry:
96*9880d681SAndroid Build Coastguard Worker	%0 = lshr i64 %y, 7
97*9880d681SAndroid Build Coastguard Worker	%1 = shl i64 %x, 57
98*9880d681SAndroid Build Coastguard Worker	%2 = or i64 %0, %1
99*9880d681SAndroid Build Coastguard Worker	ret i64 %2
100*9880d681SAndroid Build Coastguard Worker}
101