xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/legalize-shift-64.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mcpu=generic -mtriple=i686-unknown-unknown < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Workerdefine i64 @test1(i32 %xx, i32 %test) nounwind {
3*9880d681SAndroid Build Coastguard Worker  %conv = zext i32 %xx to i64
4*9880d681SAndroid Build Coastguard Worker  %and = and i32 %test, 7
5*9880d681SAndroid Build Coastguard Worker  %sh_prom = zext i32 %and to i64
6*9880d681SAndroid Build Coastguard Worker  %shl = shl i64 %conv, %sh_prom
7*9880d681SAndroid Build Coastguard Worker  ret i64 %shl
8*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1:
9*9880d681SAndroid Build Coastguard Worker; CHECK: shll	%cl, %eax
10*9880d681SAndroid Build Coastguard Worker; CHECK: shrl	%edx
11*9880d681SAndroid Build Coastguard Worker; CHECK: xorb	$31
12*9880d681SAndroid Build Coastguard Worker; CHECK: shrl	%cl, %edx
13*9880d681SAndroid Build Coastguard Worker}
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Workerdefine i64 @test2(i64 %xx, i32 %test) nounwind {
16*9880d681SAndroid Build Coastguard Worker  %and = and i32 %test, 7
17*9880d681SAndroid Build Coastguard Worker  %sh_prom = zext i32 %and to i64
18*9880d681SAndroid Build Coastguard Worker  %shl = shl i64 %xx, %sh_prom
19*9880d681SAndroid Build Coastguard Worker  ret i64 %shl
20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2:
21*9880d681SAndroid Build Coastguard Worker; CHECK: shll	%cl, %esi
22*9880d681SAndroid Build Coastguard Worker; CHECK: shrl	%edx
23*9880d681SAndroid Build Coastguard Worker; CHECK: xorb	$31
24*9880d681SAndroid Build Coastguard Worker; CHECK: shrl	%cl, %edx
25*9880d681SAndroid Build Coastguard Worker; CHECK: orl	%esi, %edx
26*9880d681SAndroid Build Coastguard Worker; CHECK: shll	%cl, %eax
27*9880d681SAndroid Build Coastguard Worker}
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Workerdefine i64 @test3(i64 %xx, i32 %test) nounwind {
30*9880d681SAndroid Build Coastguard Worker  %and = and i32 %test, 7
31*9880d681SAndroid Build Coastguard Worker  %sh_prom = zext i32 %and to i64
32*9880d681SAndroid Build Coastguard Worker  %shr = lshr i64 %xx, %sh_prom
33*9880d681SAndroid Build Coastguard Worker  ret i64 %shr
34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3:
35*9880d681SAndroid Build Coastguard Worker; CHECK: shrl	%cl, %esi
36*9880d681SAndroid Build Coastguard Worker; CHECK: leal	(%edx,%edx), %eax
37*9880d681SAndroid Build Coastguard Worker; CHECK: xorb	$31, %cl
38*9880d681SAndroid Build Coastguard Worker; CHECK: shll	%cl, %eax
39*9880d681SAndroid Build Coastguard Worker; CHECK: orl	%esi, %eax
40*9880d681SAndroid Build Coastguard Worker; CHECK: shrl	%cl, %edx
41*9880d681SAndroid Build Coastguard Worker}
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Workerdefine i64 @test4(i64 %xx, i32 %test) nounwind {
44*9880d681SAndroid Build Coastguard Worker  %and = and i32 %test, 7
45*9880d681SAndroid Build Coastguard Worker  %sh_prom = zext i32 %and to i64
46*9880d681SAndroid Build Coastguard Worker  %shr = ashr i64 %xx, %sh_prom
47*9880d681SAndroid Build Coastguard Worker  ret i64 %shr
48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test4:
49*9880d681SAndroid Build Coastguard Worker; CHECK: shrl	%cl, %esi
50*9880d681SAndroid Build Coastguard Worker; CHECK: leal	(%edx,%edx), %eax
51*9880d681SAndroid Build Coastguard Worker; CHECK: xorb	$31, %cl
52*9880d681SAndroid Build Coastguard Worker; CHECK: shll	%cl, %eax
53*9880d681SAndroid Build Coastguard Worker; CHECK: orl	%esi, %eax
54*9880d681SAndroid Build Coastguard Worker; CHECK: sarl	%cl, %edx
55*9880d681SAndroid Build Coastguard Worker}
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Worker; PR14668
58*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test5(<2 x i64> %A, <2 x i64> %B) {
59*9880d681SAndroid Build Coastguard Worker  %shl = shl <2 x i64> %A, %B
60*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %shl
61*9880d681SAndroid Build Coastguard Worker; CHECK: test5
62*9880d681SAndroid Build Coastguard Worker; CHECK: shl
63*9880d681SAndroid Build Coastguard Worker; CHECK: shldl
64*9880d681SAndroid Build Coastguard Worker; CHECK: shl
65*9880d681SAndroid Build Coastguard Worker; CHECK: shldl
66*9880d681SAndroid Build Coastguard Worker}
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker; PR16108
69*9880d681SAndroid Build Coastguard Workerdefine i32 @test6() {
70*9880d681SAndroid Build Coastguard Worker  %x = alloca i32, align 4
71*9880d681SAndroid Build Coastguard Worker  %t = alloca i64, align 8
72*9880d681SAndroid Build Coastguard Worker  store i32 1, i32* %x, align 4
73*9880d681SAndroid Build Coastguard Worker  store i64 1, i64* %t, align 8  ;; DEAD
74*9880d681SAndroid Build Coastguard Worker  %load = load i32, i32* %x, align 4
75*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 %load, 8
76*9880d681SAndroid Build Coastguard Worker  %add = add i32 %shl, -224
77*9880d681SAndroid Build Coastguard Worker  %sh_prom = zext i32 %add to i64
78*9880d681SAndroid Build Coastguard Worker  %shl1 = shl i64 1, %sh_prom
79*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i64 %shl1, 4294967296
80*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %if.then, label %if.end
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %entry
83*9880d681SAndroid Build Coastguard Worker  ret i32 1
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %entry
86*9880d681SAndroid Build Coastguard Worker  ret i32 0
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test6:
89*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: andb $31
90*9880d681SAndroid Build Coastguard Worker; CHECK: sete
91*9880d681SAndroid Build Coastguard Worker; CHECK: movzbl
92*9880d681SAndroid Build Coastguard Worker; CHECK: xorl $1
93*9880d681SAndroid Build Coastguard Worker; CHECK: orl
94*9880d681SAndroid Build Coastguard Worker}
95