xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/shift-and.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i386-apple-macosx   | FileCheck %s --check-prefix=X32
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-apple-macosx | FileCheck %s --check-prefix=X64
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Workerdefine i32 @t1(i32 %t, i32 %val) nounwind {
5*9880d681SAndroid Build Coastguard Worker; X32-LABEL: t1:
6*9880d681SAndroid Build Coastguard Worker; X32-NOT: andl
7*9880d681SAndroid Build Coastguard Worker; X32: shll
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker; X64-LABEL: t1:
10*9880d681SAndroid Build Coastguard Worker; X64-NOT: andl
11*9880d681SAndroid Build Coastguard Worker; X64: shll
12*9880d681SAndroid Build Coastguard Worker       %shamt = and i32 %t, 31
13*9880d681SAndroid Build Coastguard Worker       %res = shl i32 %val, %shamt
14*9880d681SAndroid Build Coastguard Worker       ret i32 %res
15*9880d681SAndroid Build Coastguard Worker}
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Workerdefine i32 @t2(i32 %t, i32 %val) nounwind {
18*9880d681SAndroid Build Coastguard Worker; X32-LABEL: t2:
19*9880d681SAndroid Build Coastguard Worker; X32-NOT: andl
20*9880d681SAndroid Build Coastguard Worker; X32: shll
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Worker; X64-LABEL: t2:
23*9880d681SAndroid Build Coastguard Worker; X64-NOT: andl
24*9880d681SAndroid Build Coastguard Worker; X64: shll
25*9880d681SAndroid Build Coastguard Worker       %shamt = and i32 %t, 63
26*9880d681SAndroid Build Coastguard Worker       %res = shl i32 %val, %shamt
27*9880d681SAndroid Build Coastguard Worker       ret i32 %res
28*9880d681SAndroid Build Coastguard Worker}
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Worker@X = internal global i16 0
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Workerdefine void @t3(i16 %t) nounwind {
33*9880d681SAndroid Build Coastguard Worker; X32-LABEL: t3:
34*9880d681SAndroid Build Coastguard Worker; X32-NOT: andl
35*9880d681SAndroid Build Coastguard Worker; X32: sarw
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker; X64-LABEL: t3:
38*9880d681SAndroid Build Coastguard Worker; X64-NOT: andl
39*9880d681SAndroid Build Coastguard Worker; X64: sarw
40*9880d681SAndroid Build Coastguard Worker       %shamt = and i16 %t, 31
41*9880d681SAndroid Build Coastguard Worker       %tmp = load i16, i16* @X
42*9880d681SAndroid Build Coastguard Worker       %tmp1 = ashr i16 %tmp, %shamt
43*9880d681SAndroid Build Coastguard Worker       store i16 %tmp1, i16* @X
44*9880d681SAndroid Build Coastguard Worker       ret void
45*9880d681SAndroid Build Coastguard Worker}
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Workerdefine i64 @t4(i64 %t, i64 %val) nounwind {
48*9880d681SAndroid Build Coastguard Worker; X64-LABEL: t4:
49*9880d681SAndroid Build Coastguard Worker; X64-NOT: and
50*9880d681SAndroid Build Coastguard Worker; X64: shrq
51*9880d681SAndroid Build Coastguard Worker       %shamt = and i64 %t, 63
52*9880d681SAndroid Build Coastguard Worker       %res = lshr i64 %val, %shamt
53*9880d681SAndroid Build Coastguard Worker       ret i64 %res
54*9880d681SAndroid Build Coastguard Worker}
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Workerdefine i64 @t5(i64 %t, i64 %val) nounwind {
57*9880d681SAndroid Build Coastguard Worker; X64-LABEL: t5:
58*9880d681SAndroid Build Coastguard Worker; X64-NOT: and
59*9880d681SAndroid Build Coastguard Worker; X64: shrq
60*9880d681SAndroid Build Coastguard Worker       %shamt = and i64 %t, 191
61*9880d681SAndroid Build Coastguard Worker       %res = lshr i64 %val, %shamt
62*9880d681SAndroid Build Coastguard Worker       ret i64 %res
63*9880d681SAndroid Build Coastguard Worker}
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker; rdar://11866926
67*9880d681SAndroid Build Coastguard Workerdefine i64 @t6(i64 %key, i64* nocapture %val) nounwind {
68*9880d681SAndroid Build Coastguard Workerentry:
69*9880d681SAndroid Build Coastguard Worker; X64-LABEL: t6:
70*9880d681SAndroid Build Coastguard Worker; X64-NOT: movabsq
71*9880d681SAndroid Build Coastguard Worker; X64: decq
72*9880d681SAndroid Build Coastguard Worker; X64: andq
73*9880d681SAndroid Build Coastguard Worker  %shr = lshr i64 %key, 3
74*9880d681SAndroid Build Coastguard Worker  %0 = load i64, i64* %val, align 8
75*9880d681SAndroid Build Coastguard Worker  %sub = add i64 %0, 2305843009213693951
76*9880d681SAndroid Build Coastguard Worker  %and = and i64 %sub, %shr
77*9880d681SAndroid Build Coastguard Worker  ret i64 %and
78*9880d681SAndroid Build Coastguard Worker}
79