Fix vbroadcast matching logic to early unmatch if the node doesn't have
[oota-llvm.git] / test / CodeGen / X86 / rotate.ll
1 ; RUN: llc < %s -march=x86 -x86-asm-syntax=intel | \
2 ; RUN:   grep {ro\[rl\]} | count 12
3
4 define i32 @rotl32(i32 %A, i8 %Amt) {
5         %shift.upgrd.1 = zext i8 %Amt to i32            ; <i32> [#uses=1]
6         %B = shl i32 %A, %shift.upgrd.1         ; <i32> [#uses=1]
7         %Amt2 = sub i8 32, %Amt         ; <i8> [#uses=1]
8         %shift.upgrd.2 = zext i8 %Amt2 to i32           ; <i32> [#uses=1]
9         %C = lshr i32 %A, %shift.upgrd.2                ; <i32> [#uses=1]
10         %D = or i32 %B, %C              ; <i32> [#uses=1]
11         ret i32 %D
12 }
13
14 define i32 @rotr32(i32 %A, i8 %Amt) {
15         %shift.upgrd.3 = zext i8 %Amt to i32            ; <i32> [#uses=1]
16         %B = lshr i32 %A, %shift.upgrd.3                ; <i32> [#uses=1]
17         %Amt2 = sub i8 32, %Amt         ; <i8> [#uses=1]
18         %shift.upgrd.4 = zext i8 %Amt2 to i32           ; <i32> [#uses=1]
19         %C = shl i32 %A, %shift.upgrd.4         ; <i32> [#uses=1]
20         %D = or i32 %B, %C              ; <i32> [#uses=1]
21         ret i32 %D
22 }
23
24 define i32 @rotli32(i32 %A) {
25         %B = shl i32 %A, 5              ; <i32> [#uses=1]
26         %C = lshr i32 %A, 27            ; <i32> [#uses=1]
27         %D = or i32 %B, %C              ; <i32> [#uses=1]
28         ret i32 %D
29 }
30
31 define i32 @rotri32(i32 %A) {
32         %B = lshr i32 %A, 5             ; <i32> [#uses=1]
33         %C = shl i32 %A, 27             ; <i32> [#uses=1]
34         %D = or i32 %B, %C              ; <i32> [#uses=1]
35         ret i32 %D
36 }
37
38 define i16 @rotl16(i16 %A, i8 %Amt) {
39         %shift.upgrd.5 = zext i8 %Amt to i16            ; <i16> [#uses=1]
40         %B = shl i16 %A, %shift.upgrd.5         ; <i16> [#uses=1]
41         %Amt2 = sub i8 16, %Amt         ; <i8> [#uses=1]
42         %shift.upgrd.6 = zext i8 %Amt2 to i16           ; <i16> [#uses=1]
43         %C = lshr i16 %A, %shift.upgrd.6                ; <i16> [#uses=1]
44         %D = or i16 %B, %C              ; <i16> [#uses=1]
45         ret i16 %D
46 }
47
48 define i16 @rotr16(i16 %A, i8 %Amt) {
49         %shift.upgrd.7 = zext i8 %Amt to i16            ; <i16> [#uses=1]
50         %B = lshr i16 %A, %shift.upgrd.7                ; <i16> [#uses=1]
51         %Amt2 = sub i8 16, %Amt         ; <i8> [#uses=1]
52         %shift.upgrd.8 = zext i8 %Amt2 to i16           ; <i16> [#uses=1]
53         %C = shl i16 %A, %shift.upgrd.8         ; <i16> [#uses=1]
54         %D = or i16 %B, %C              ; <i16> [#uses=1]
55         ret i16 %D
56 }
57
58 define i16 @rotli16(i16 %A) {
59         %B = shl i16 %A, 5              ; <i16> [#uses=1]
60         %C = lshr i16 %A, 11            ; <i16> [#uses=1]
61         %D = or i16 %B, %C              ; <i16> [#uses=1]
62         ret i16 %D
63 }
64
65 define i16 @rotri16(i16 %A) {
66         %B = lshr i16 %A, 5             ; <i16> [#uses=1]
67         %C = shl i16 %A, 11             ; <i16> [#uses=1]
68         %D = or i16 %B, %C              ; <i16> [#uses=1]
69         ret i16 %D
70 }
71
72 define i8 @rotl8(i8 %A, i8 %Amt) {
73         %B = shl i8 %A, %Amt            ; <i8> [#uses=1]
74         %Amt2 = sub i8 8, %Amt          ; <i8> [#uses=1]
75         %C = lshr i8 %A, %Amt2          ; <i8> [#uses=1]
76         %D = or i8 %B, %C               ; <i8> [#uses=1]
77         ret i8 %D
78 }
79
80 define i8 @rotr8(i8 %A, i8 %Amt) {
81         %B = lshr i8 %A, %Amt           ; <i8> [#uses=1]
82         %Amt2 = sub i8 8, %Amt          ; <i8> [#uses=1]
83         %C = shl i8 %A, %Amt2           ; <i8> [#uses=1]
84         %D = or i8 %B, %C               ; <i8> [#uses=1]
85         ret i8 %D
86 }
87
88 define i8 @rotli8(i8 %A) {
89         %B = shl i8 %A, 5               ; <i8> [#uses=1]
90         %C = lshr i8 %A, 3              ; <i8> [#uses=1]
91         %D = or i8 %B, %C               ; <i8> [#uses=1]
92         ret i8 %D
93 }
94
95 define i8 @rotri8(i8 %A) {
96         %B = lshr i8 %A, 5              ; <i8> [#uses=1]
97         %C = shl i8 %A, 3               ; <i8> [#uses=1]
98         %D = or i8 %B, %C               ; <i8> [#uses=1]
99         ret i8 %D
100 }