More working CellSPU test cases:
[oota-llvm.git] / test / CodeGen / CellSPU / rotate_ops.ll
1 ; RUN: llvm-as -o - %s | llc -march=cellspu -f -o %t1.s
2 ; RUN: grep rot          %t1.s | count 85
3 ; RUN: grep roth         %t1.s | count 8
4 ; RUN: grep roti.*5      %t1.s | count 1
5 ; RUN: grep roti.*27     %t1.s | count 1
6 ; RUN grep rothi.*5      %t1.s | count 2
7 ; RUN grep rothi.*11     %t1.s | count 1
8 ; RUN grep rothi.*,.3    %t1.s | count 1
9 ; RUN: grep andhi        %t1.s | count 4
10 ; RUN: grep shlhi        %t1.s | count 4
11
12 ; Vector rotates are not currently supported in gcc or llvm assembly. These are
13 ; not tested.
14
15 ; 32-bit rotates:
16 define i32 @rotl32_1a(i32 %arg1, i8 %arg2) {
17         %tmp1 = zext i8 %arg2 to i32    ; <i32> [#uses=1]
18         %B = shl i32 %arg1, %tmp1       ; <i32> [#uses=1]
19         %arg22 = sub i8 32, %arg2       ; <i8> [#uses=1]
20         %tmp2 = zext i8 %arg22 to i32   ; <i32> [#uses=1]
21         %C = lshr i32 %arg1, %tmp2      ; <i32> [#uses=1]
22         %D = or i32 %B, %C              ; <i32> [#uses=1]
23         ret i32 %D
24 }
25
26 define i32 @rotl32_1b(i32 %arg1, i16 %arg2) {
27         %tmp1 = zext i16 %arg2 to i32   ; <i32> [#uses=1]
28         %B = shl i32 %arg1, %tmp1       ; <i32> [#uses=1]
29         %arg22 = sub i16 32, %arg2      ; <i8> [#uses=1]
30         %tmp2 = zext i16 %arg22 to i32  ; <i32> [#uses=1]
31         %C = lshr i32 %arg1, %tmp2      ; <i32> [#uses=1]
32         %D = or i32 %B, %C              ; <i32> [#uses=1]
33         ret i32 %D
34 }
35
36 define i32 @rotl32_2(i32 %arg1, i32 %arg2) {
37         %B = shl i32 %arg1, %arg2       ; <i32> [#uses=1]
38         %tmp1 = sub i32 32, %arg2       ; <i32> [#uses=1]
39         %C = lshr i32 %arg1, %tmp1      ; <i32> [#uses=1]
40         %D = or i32 %B, %C              ; <i32> [#uses=1]
41         ret i32 %D
42 }
43
44 define i32 @rotl32_3(i32 %arg1, i32 %arg2) {
45         %tmp1 = sub i32 32, %arg2       ; <i32> [#uses=1]
46         %B = shl i32 %arg1, %arg2       ; <i32> [#uses=1]
47         %C = lshr i32 %arg1, %tmp1      ; <i32> [#uses=1]
48         %D = or i32 %B, %C              ; <i32> [#uses=1]
49         ret i32 %D
50 }
51
52 define i32 @rotl32_4(i32 %arg1, i32 %arg2) {
53         %tmp1 = sub i32 32, %arg2       ; <i32> [#uses=1]
54         %C = lshr i32 %arg1, %tmp1      ; <i32> [#uses=1]
55         %B = shl i32 %arg1, %arg2       ; <i32> [#uses=1]
56         %D = or i32 %B, %C              ; <i32> [#uses=1]
57         ret i32 %D
58 }
59
60 define i32 @rotr32_1(i32 %A, i8 %Amt) {
61         %tmp1 = zext i8 %Amt to i32     ; <i32> [#uses=1]
62         %B = lshr i32 %A, %tmp1         ; <i32> [#uses=1]
63         %Amt2 = sub i8 32, %Amt         ; <i8> [#uses=1]
64         %tmp2 = zext i8 %Amt2 to i32    ; <i32> [#uses=1]
65         %C = shl i32 %A, %tmp2          ; <i32> [#uses=1]
66         %D = or i32 %B, %C              ; <i32> [#uses=1]
67         ret i32 %D
68 }
69
70 define i32 @rotr32_2(i32 %A, i8 %Amt) {
71         %Amt2 = sub i8 32, %Amt         ; <i8> [#uses=1]
72         %tmp1 = zext i8 %Amt to i32     ; <i32> [#uses=1]
73         %B = lshr i32 %A, %tmp1         ; <i32> [#uses=1]
74         %tmp2 = zext i8 %Amt2 to i32    ; <i32> [#uses=1]
75         %C = shl i32 %A, %tmp2          ; <i32> [#uses=1]
76         %D = or i32 %B, %C              ; <i32> [#uses=1]
77         ret i32 %D
78 }
79
80 ; Rotate left with immediate
81 define i32 @rotli32(i32 %A) {
82         %B = shl i32 %A, 5              ; <i32> [#uses=1]
83         %C = lshr i32 %A, 27            ; <i32> [#uses=1]
84         %D = or i32 %B, %C              ; <i32> [#uses=1]
85         ret i32 %D
86 }
87
88 ; Rotate right with immediate
89 define i32 @rotri32(i32 %A) {
90         %B = lshr i32 %A, 5             ; <i32> [#uses=1]
91         %C = shl i32 %A, 27             ; <i32> [#uses=1]
92         %D = or i32 %B, %C              ; <i32> [#uses=1]
93         ret i32 %D
94 }
95
96 ; 16-bit rotates:
97 define i16 @rotr16_1(i16 %arg1, i8 %arg) {
98         %tmp1 = zext i8 %arg to i16             ; <i16> [#uses=1]
99         %B = lshr i16 %arg1, %tmp1              ; <i16> [#uses=1]
100         %arg2 = sub i8 16, %arg                 ; <i8> [#uses=1]
101         %tmp2 = zext i8 %arg2 to i16            ; <i16> [#uses=1]
102         %C = shl i16 %arg1, %tmp2               ; <i16> [#uses=1]
103         %D = or i16 %B, %C                      ; <i16> [#uses=1]
104         ret i16 %D
105 }
106
107 define i16 @rotr16_2(i16 %arg1, i16 %arg) {
108         %B = lshr i16 %arg1, %arg       ; <i16> [#uses=1]
109         %tmp1 = sub i16 16, %arg        ; <i16> [#uses=1]
110         %C = shl i16 %arg1, %tmp1       ; <i16> [#uses=1]
111         %D = or i16 %B, %C              ; <i16> [#uses=1]
112         ret i16 %D
113 }
114
115 define i16 @rotli16(i16 %A) {
116         %B = shl i16 %A, 5              ; <i16> [#uses=1]
117         %C = lshr i16 %A, 11            ; <i16> [#uses=1]
118         %D = or i16 %B, %C              ; <i16> [#uses=1]
119         ret i16 %D
120 }
121
122 define i16 @rotri16(i16 %A) {
123         %B = lshr i16 %A, 5             ; <i16> [#uses=1]
124         %C = shl i16 %A, 11             ; <i16> [#uses=1]
125         %D = or i16 %B, %C              ; <i16> [#uses=1]
126         ret i16 %D
127 }
128
129 define i8 @rotl8(i8 %A, i8 %Amt) {
130         %B = shl i8 %A, %Amt            ; <i8> [#uses=1]
131         %Amt2 = sub i8 8, %Amt          ; <i8> [#uses=1]
132         %C = lshr i8 %A, %Amt2          ; <i8> [#uses=1]
133         %D = or i8 %B, %C               ; <i8> [#uses=1]
134         ret i8 %D
135 }
136
137 define i8 @rotr8(i8 %A, i8 %Amt) {
138         %B = lshr i8 %A, %Amt           ; <i8> [#uses=1]
139         %Amt2 = sub i8 8, %Amt          ; <i8> [#uses=1]
140         %C = shl i8 %A, %Amt2           ; <i8> [#uses=1]
141         %D = or i8 %B, %C               ; <i8> [#uses=1]
142         ret i8 %D
143 }
144
145 define i8 @rotli8(i8 %A) {
146         %B = shl i8 %A, 5               ; <i8> [#uses=1]
147         %C = lshr i8 %A, 3              ; <i8> [#uses=1]
148         %D = or i8 %B, %C               ; <i8> [#uses=1]
149         ret i8 %D
150 }
151
152 define i8 @rotri8(i8 %A) {
153         %B = lshr i8 %A, 5              ; <i8> [#uses=1]
154         %C = shl i8 %A, 3               ; <i8> [#uses=1]
155         %D = or i8 %B, %C               ; <i8> [#uses=1]
156         ret i8 %D
157 }