More changes from Chris' review: simplify getIndices and avoid
[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 target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128"
12 target triple = "spu"
13
14 ; Vector rotates are not currently supported in gcc or llvm assembly. These are
15 ; not tested.
16
17 ; 32-bit rotates:
18 define i32 @rotl32_1a(i32 %arg1, i8 %arg2) {
19         %tmp1 = zext i8 %arg2 to i32    ; <i32> [#uses=1]
20         %B = shl i32 %arg1, %tmp1       ; <i32> [#uses=1]
21         %arg22 = sub i8 32, %arg2       ; <i8> [#uses=1]
22         %tmp2 = zext i8 %arg22 to i32   ; <i32> [#uses=1]
23         %C = lshr i32 %arg1, %tmp2      ; <i32> [#uses=1]
24         %D = or i32 %B, %C              ; <i32> [#uses=1]
25         ret i32 %D
26 }
27
28 define i32 @rotl32_1b(i32 %arg1, i16 %arg2) {
29         %tmp1 = zext i16 %arg2 to i32   ; <i32> [#uses=1]
30         %B = shl i32 %arg1, %tmp1       ; <i32> [#uses=1]
31         %arg22 = sub i16 32, %arg2      ; <i8> [#uses=1]
32         %tmp2 = zext i16 %arg22 to i32  ; <i32> [#uses=1]
33         %C = lshr i32 %arg1, %tmp2      ; <i32> [#uses=1]
34         %D = or i32 %B, %C              ; <i32> [#uses=1]
35         ret i32 %D
36 }
37
38 define i32 @rotl32_2(i32 %arg1, i32 %arg2) {
39         %B = shl i32 %arg1, %arg2       ; <i32> [#uses=1]
40         %tmp1 = sub i32 32, %arg2       ; <i32> [#uses=1]
41         %C = lshr i32 %arg1, %tmp1      ; <i32> [#uses=1]
42         %D = or i32 %B, %C              ; <i32> [#uses=1]
43         ret i32 %D
44 }
45
46 define i32 @rotl32_3(i32 %arg1, i32 %arg2) {
47         %tmp1 = sub i32 32, %arg2       ; <i32> [#uses=1]
48         %B = shl i32 %arg1, %arg2       ; <i32> [#uses=1]
49         %C = lshr i32 %arg1, %tmp1      ; <i32> [#uses=1]
50         %D = or i32 %B, %C              ; <i32> [#uses=1]
51         ret i32 %D
52 }
53
54 define i32 @rotl32_4(i32 %arg1, i32 %arg2) {
55         %tmp1 = sub i32 32, %arg2       ; <i32> [#uses=1]
56         %C = lshr i32 %arg1, %tmp1      ; <i32> [#uses=1]
57         %B = shl i32 %arg1, %arg2       ; <i32> [#uses=1]
58         %D = or i32 %B, %C              ; <i32> [#uses=1]
59         ret i32 %D
60 }
61
62 define i32 @rotr32_1(i32 %A, i8 %Amt) {
63         %tmp1 = zext i8 %Amt to i32     ; <i32> [#uses=1]
64         %B = lshr i32 %A, %tmp1         ; <i32> [#uses=1]
65         %Amt2 = sub i8 32, %Amt         ; <i8> [#uses=1]
66         %tmp2 = zext i8 %Amt2 to i32    ; <i32> [#uses=1]
67         %C = shl i32 %A, %tmp2          ; <i32> [#uses=1]
68         %D = or i32 %B, %C              ; <i32> [#uses=1]
69         ret i32 %D
70 }
71
72 define i32 @rotr32_2(i32 %A, i8 %Amt) {
73         %Amt2 = sub i8 32, %Amt         ; <i8> [#uses=1]
74         %tmp1 = zext i8 %Amt to i32     ; <i32> [#uses=1]
75         %B = lshr i32 %A, %tmp1         ; <i32> [#uses=1]
76         %tmp2 = zext i8 %Amt2 to i32    ; <i32> [#uses=1]
77         %C = shl i32 %A, %tmp2          ; <i32> [#uses=1]
78         %D = or i32 %B, %C              ; <i32> [#uses=1]
79         ret i32 %D
80 }
81
82 ; Rotate left with immediate
83 define i32 @rotli32(i32 %A) {
84         %B = shl i32 %A, 5              ; <i32> [#uses=1]
85         %C = lshr i32 %A, 27            ; <i32> [#uses=1]
86         %D = or i32 %B, %C              ; <i32> [#uses=1]
87         ret i32 %D
88 }
89
90 ; Rotate right with immediate
91 define i32 @rotri32(i32 %A) {
92         %B = lshr i32 %A, 5             ; <i32> [#uses=1]
93         %C = shl i32 %A, 27             ; <i32> [#uses=1]
94         %D = or i32 %B, %C              ; <i32> [#uses=1]
95         ret i32 %D
96 }
97
98 ; 16-bit rotates:
99 define i16 @rotr16_1(i16 %arg1, i8 %arg) {
100         %tmp1 = zext i8 %arg to i16             ; <i16> [#uses=1]
101         %B = lshr i16 %arg1, %tmp1              ; <i16> [#uses=1]
102         %arg2 = sub i8 16, %arg                 ; <i8> [#uses=1]
103         %tmp2 = zext i8 %arg2 to i16            ; <i16> [#uses=1]
104         %C = shl i16 %arg1, %tmp2               ; <i16> [#uses=1]
105         %D = or i16 %B, %C                      ; <i16> [#uses=1]
106         ret i16 %D
107 }
108
109 define i16 @rotr16_2(i16 %arg1, i16 %arg) {
110         %B = lshr i16 %arg1, %arg       ; <i16> [#uses=1]
111         %tmp1 = sub i16 16, %arg        ; <i16> [#uses=1]
112         %C = shl i16 %arg1, %tmp1       ; <i16> [#uses=1]
113         %D = or i16 %B, %C              ; <i16> [#uses=1]
114         ret i16 %D
115 }
116
117 define i16 @rotli16(i16 %A) {
118         %B = shl i16 %A, 5              ; <i16> [#uses=1]
119         %C = lshr i16 %A, 11            ; <i16> [#uses=1]
120         %D = or i16 %B, %C              ; <i16> [#uses=1]
121         ret i16 %D
122 }
123
124 define i16 @rotri16(i16 %A) {
125         %B = lshr i16 %A, 5             ; <i16> [#uses=1]
126         %C = shl i16 %A, 11             ; <i16> [#uses=1]
127         %D = or i16 %B, %C              ; <i16> [#uses=1]
128         ret i16 %D
129 }
130
131 define i8 @rotl8(i8 %A, i8 %Amt) {
132         %B = shl i8 %A, %Amt            ; <i8> [#uses=1]
133         %Amt2 = sub i8 8, %Amt          ; <i8> [#uses=1]
134         %C = lshr i8 %A, %Amt2          ; <i8> [#uses=1]
135         %D = or i8 %B, %C               ; <i8> [#uses=1]
136         ret i8 %D
137 }
138
139 define i8 @rotr8(i8 %A, i8 %Amt) {
140         %B = lshr i8 %A, %Amt           ; <i8> [#uses=1]
141         %Amt2 = sub i8 8, %Amt          ; <i8> [#uses=1]
142         %C = shl i8 %A, %Amt2           ; <i8> [#uses=1]
143         %D = or i8 %B, %C               ; <i8> [#uses=1]
144         ret i8 %D
145 }
146
147 define i8 @rotli8(i8 %A) {
148         %B = shl i8 %A, 5               ; <i8> [#uses=1]
149         %C = lshr i8 %A, 3              ; <i8> [#uses=1]
150         %D = or i8 %B, %C               ; <i8> [#uses=1]
151         ret i8 %D
152 }
153
154 define i8 @rotri8(i8 %A) {
155         %B = lshr i8 %A, 5              ; <i8> [#uses=1]
156         %C = shl i8 %A, 3               ; <i8> [#uses=1]
157         %D = or i8 %B, %C               ; <i8> [#uses=1]
158         ret i8 %D
159 }