1; RUN: llc -mcpu=generic -mtriple=i686-unknown-unknown < %s | FileCheck %s
2define i64 @test1(i32 %xx, i32 %test) nounwind {
3  %conv = zext i32 %xx to i64
4  %and = and i32 %test, 7
5  %sh_prom = zext i32 %and to i64
6  %shl = shl i64 %conv, %sh_prom
7  ret i64 %shl
8; CHECK-LABEL: test1:
9; CHECK: shll	%cl, %eax
10; CHECK: shrl	%edx
11; CHECK: xorb	$31
12; CHECK: shrl	%cl, %edx
13}
14
15define i64 @test2(i64 %xx, i32 %test) nounwind {
16  %and = and i32 %test, 7
17  %sh_prom = zext i32 %and to i64
18  %shl = shl i64 %xx, %sh_prom
19  ret i64 %shl
20; CHECK-LABEL: test2:
21; CHECK: shll	%cl, %esi
22; CHECK: shrl	%edx
23; CHECK: xorb	$31
24; CHECK: shrl	%cl, %edx
25; CHECK: orl	%esi, %edx
26; CHECK: shll	%cl, %eax
27}
28
29define i64 @test3(i64 %xx, i32 %test) nounwind {
30  %and = and i32 %test, 7
31  %sh_prom = zext i32 %and to i64
32  %shr = lshr i64 %xx, %sh_prom
33  ret i64 %shr
34; CHECK-LABEL: test3:
35; CHECK: shrl	%cl, %esi
36; CHECK: leal	(%edx,%edx), %eax
37; CHECK: xorb	$31, %cl
38; CHECK: shll	%cl, %eax
39; CHECK: orl	%esi, %eax
40; CHECK: shrl	%cl, %edx
41}
42
43define i64 @test4(i64 %xx, i32 %test) nounwind {
44  %and = and i32 %test, 7
45  %sh_prom = zext i32 %and to i64
46  %shr = ashr i64 %xx, %sh_prom
47  ret i64 %shr
48; CHECK-LABEL: test4:
49; CHECK: shrl	%cl, %esi
50; CHECK: leal	(%edx,%edx), %eax
51; CHECK: xorb	$31, %cl
52; CHECK: shll	%cl, %eax
53; CHECK: orl	%esi, %eax
54; CHECK: sarl	%cl, %edx
55}
56
57; PR14668
58define <2 x i64> @test5(<2 x i64> %A, <2 x i64> %B) {
59  %shl = shl <2 x i64> %A, %B
60  ret <2 x i64> %shl
61; CHECK: test5
62; CHECK: shl
63; CHECK: shldl
64; CHECK: shl
65; CHECK: shldl
66}
67