1 ; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s
3 declare i128 @llvm.ctlz.i128(i128, i1)
4 declare i64 @llvm.ctlz.i64(i64, i1)
5 declare i32 @llvm.ctlz.i32(i32, i1)
6 declare i16 @llvm.ctlz.i16(i16, i1)
7 declare i8 @llvm.ctlz.i8(i8, i1)
9 define i128 @func128(i128 %p){
10 ; CHECK-LABEL: func128:
12 ; CHECK-NEXT: cmps.l %s2, %s1, (0)1
13 ; CHECK-NEXT: ldz %s1, %s1
14 ; CHECK-NEXT: ldz %s0, %s0
15 ; CHECK-NEXT: lea %s0, 64(, %s0)
16 ; CHECK-NEXT: cmov.l.ne %s0, %s1, %s2
17 ; CHECK-NEXT: or %s1, 0, (0)1
18 ; CHECK-NEXT: b.l.t (, %s10)
19 %r = tail call i128 @llvm.ctlz.i128(i128 %p, i1 true)
23 define i64 @func64(i64 %p) {
24 ; CHECK-LABEL: func64:
26 ; CHECK-NEXT: ldz %s0, %s0
27 ; CHECK-NEXT: b.l.t (, %s10)
28 %r = tail call i64 @llvm.ctlz.i64(i64 %p, i1 true)
32 define signext i32 @func32s(i32 signext %p) {
33 ; CHECK-LABEL: func32s:
35 ; CHECK-NEXT: and %s0, %s0, (32)0
36 ; CHECK-NEXT: ldz %s0, %s0
37 ; CHECK-NEXT: lea %s0, -32(, %s0)
38 ; CHECK-NEXT: and %s0, %s0, (32)0
39 ; CHECK-NEXT: b.l.t (, %s10)
40 %r = tail call i32 @llvm.ctlz.i32(i32 %p, i1 true)
44 define zeroext i32 @func32z(i32 zeroext %p) {
45 ; CHECK-LABEL: func32z:
47 ; CHECK-NEXT: ldz %s0, %s0
48 ; CHECK-NEXT: lea %s0, -32(, %s0)
49 ; CHECK-NEXT: and %s0, %s0, (32)0
50 ; CHECK-NEXT: b.l.t (, %s10)
51 %r = tail call i32 @llvm.ctlz.i32(i32 %p, i1 true)
55 define signext i16 @func16s(i16 signext %p) {
56 ; CHECK-LABEL: func16s:
58 ; CHECK-NEXT: and %s0, %s0, (48)0
59 ; CHECK-NEXT: ldz %s0, %s0
60 ; CHECK-NEXT: lea %s0, -32(, %s0)
61 ; CHECK-NEXT: adds.w.sx %s0, -16, %s0
62 ; CHECK-NEXT: and %s0, %s0, (48)0
63 ; CHECK-NEXT: b.l.t (, %s10)
64 %r = tail call i16 @llvm.ctlz.i16(i16 %p, i1 true)
68 define zeroext i16 @func16z(i16 zeroext %p) {
69 ; CHECK-LABEL: func16z:
71 ; CHECK-NEXT: ldz %s0, %s0
72 ; CHECK-NEXT: lea %s0, -32(, %s0)
73 ; CHECK-NEXT: adds.w.sx %s0, -16, %s0
74 ; CHECK-NEXT: and %s0, %s0, (48)0
75 ; CHECK-NEXT: b.l.t (, %s10)
76 %r = tail call i16 @llvm.ctlz.i16(i16 %p, i1 true)
80 define signext i8 @func8s(i8 signext %p) {
81 ; CHECK-LABEL: func8s:
83 ; CHECK-NEXT: and %s0, %s0, (56)0
84 ; CHECK-NEXT: ldz %s0, %s0
85 ; CHECK-NEXT: lea %s0, -32(, %s0)
86 ; CHECK-NEXT: adds.w.sx %s0, -24, %s0
87 ; CHECK-NEXT: and %s0, %s0, (56)0
88 ; CHECK-NEXT: b.l.t (, %s10)
89 %r = tail call i8 @llvm.ctlz.i8(i8 %p, i1 true)
93 define zeroext i8 @func8z(i8 zeroext %p) {
94 ; CHECK-LABEL: func8z:
96 ; CHECK-NEXT: ldz %s0, %s0
97 ; CHECK-NEXT: lea %s0, -32(, %s0)
98 ; CHECK-NEXT: adds.w.sx %s0, -24, %s0
99 ; CHECK-NEXT: and %s0, %s0, (56)0
100 ; CHECK-NEXT: b.l.t (, %s10)
101 %r = tail call i8 @llvm.ctlz.i8(i8 %p, i1 true)
105 define i128 @func128i(){
106 ; CHECK-LABEL: func128i:
108 ; CHECK-NEXT: lea %s0, 112
109 ; CHECK-NEXT: or %s1, 0, (0)1
110 ; CHECK-NEXT: b.l.t (, %s10)
111 %r = tail call i128 @llvm.ctlz.i128(i128 65535, i1 true)
115 define i64 @func64i() {
116 ; CHECK-LABEL: func64i:
118 ; CHECK-NEXT: or %s0, 48, (0)1
119 ; CHECK-NEXT: b.l.t (, %s10)
120 %r = tail call i64 @llvm.ctlz.i64(i64 65535, i1 true)
124 define signext i32 @func32is() {
125 ; CHECK-LABEL: func32is:
127 ; CHECK-NEXT: or %s0, 16, (0)1
128 ; CHECK-NEXT: b.l.t (, %s10)
129 %r = tail call i32 @llvm.ctlz.i32(i32 65535, i1 true)
133 define zeroext i32 @func32iz() {
134 ; CHECK-LABEL: func32iz:
136 ; CHECK-NEXT: or %s0, 16, (0)1
137 ; CHECK-NEXT: b.l.t (, %s10)
138 %r = tail call i32 @llvm.ctlz.i32(i32 65535, i1 true)
142 define signext i16 @func16is() {
143 ; CHECK-LABEL: func16is:
145 ; CHECK-NEXT: or %s0, 8, (0)1
146 ; CHECK-NEXT: b.l.t (, %s10)
147 %r = tail call i16 @llvm.ctlz.i16(i16 255, i1 true)
151 define zeroext i16 @func16iz() {
152 ; CHECK-LABEL: func16iz:
154 ; CHECK-NEXT: or %s0, 8, (0)1
155 ; CHECK-NEXT: b.l.t (, %s10)
156 %r = tail call i16 @llvm.ctlz.i16(i16 255, i1 true)
160 define signext i8 @func8is() {
161 ; CHECK-LABEL: func8is:
163 ; CHECK-NEXT: or %s0, 0, (0)1
164 ; CHECK-NEXT: b.l.t (, %s10)
165 %r = tail call i8 @llvm.ctlz.i8(i8 255, i1 true)
169 define zeroext i8 @func8iz() {
170 ; CHECK-LABEL: func8iz:
172 ; CHECK-NEXT: or %s0, 0, (0)1
173 ; CHECK-NEXT: b.l.t (, %s10)
174 %r = tail call i8 @llvm.ctlz.i8(i8 255, i1 true)
178 define i128 @func128x(i128 %p){
179 ; CHECK-LABEL: func128x:
181 ; CHECK-NEXT: cmps.l %s2, %s1, (0)1
182 ; CHECK-NEXT: ldz %s1, %s1
183 ; CHECK-NEXT: ldz %s0, %s0
184 ; CHECK-NEXT: lea %s0, 64(, %s0)
185 ; CHECK-NEXT: cmov.l.ne %s0, %s1, %s2
186 ; CHECK-NEXT: or %s1, 0, (0)1
187 ; CHECK-NEXT: b.l.t (, %s10)
188 %r = tail call i128 @llvm.ctlz.i128(i128 %p, i1 false)
192 define i64 @func64x(i64 %p) {
193 ; CHECK-LABEL: func64x:
195 ; CHECK-NEXT: ldz %s0, %s0
196 ; CHECK-NEXT: b.l.t (, %s10)
197 %r = tail call i64 @llvm.ctlz.i64(i64 %p, i1 false)
201 define signext i32 @func32sx(i32 signext %p) {
202 ; CHECK-LABEL: func32sx:
204 ; CHECK-NEXT: and %s0, %s0, (32)0
205 ; CHECK-NEXT: ldz %s0, %s0
206 ; CHECK-NEXT: lea %s0, -32(, %s0)
207 ; CHECK-NEXT: and %s0, %s0, (32)0
208 ; CHECK-NEXT: b.l.t (, %s10)
209 %r = tail call i32 @llvm.ctlz.i32(i32 %p, i1 false)
213 define zeroext i32 @func32zx(i32 zeroext %p) {
214 ; CHECK-LABEL: func32zx:
216 ; CHECK-NEXT: ldz %s0, %s0
217 ; CHECK-NEXT: lea %s0, -32(, %s0)
218 ; CHECK-NEXT: and %s0, %s0, (32)0
219 ; CHECK-NEXT: b.l.t (, %s10)
220 %r = tail call i32 @llvm.ctlz.i32(i32 %p, i1 false)
224 define signext i16 @func16sx(i16 signext %p) {
225 ; CHECK-LABEL: func16sx:
227 ; CHECK-NEXT: and %s0, %s0, (48)0
228 ; CHECK-NEXT: ldz %s0, %s0
229 ; CHECK-NEXT: lea %s0, -32(, %s0)
230 ; CHECK-NEXT: adds.w.sx %s0, -16, %s0
231 ; CHECK-NEXT: and %s0, %s0, (48)0
232 ; CHECK-NEXT: b.l.t (, %s10)
233 %r = tail call i16 @llvm.ctlz.i16(i16 %p, i1 false)
237 define zeroext i16 @func16zx(i16 zeroext %p) {
238 ; CHECK-LABEL: func16zx:
240 ; CHECK-NEXT: ldz %s0, %s0
241 ; CHECK-NEXT: lea %s0, -32(, %s0)
242 ; CHECK-NEXT: adds.w.sx %s0, -16, %s0
243 ; CHECK-NEXT: and %s0, %s0, (48)0
244 ; CHECK-NEXT: b.l.t (, %s10)
245 %r = tail call i16 @llvm.ctlz.i16(i16 %p, i1 false)
249 define signext i8 @func8sx(i8 signext %p) {
250 ; CHECK-LABEL: func8sx:
252 ; CHECK-NEXT: and %s0, %s0, (56)0
253 ; CHECK-NEXT: ldz %s0, %s0
254 ; CHECK-NEXT: lea %s0, -32(, %s0)
255 ; CHECK-NEXT: adds.w.sx %s0, -24, %s0
256 ; CHECK-NEXT: and %s0, %s0, (56)0
257 ; CHECK-NEXT: b.l.t (, %s10)
258 %r = tail call i8 @llvm.ctlz.i8(i8 %p, i1 false)
262 define zeroext i8 @func8zx(i8 zeroext %p) {
263 ; CHECK-LABEL: func8zx:
265 ; CHECK-NEXT: ldz %s0, %s0
266 ; CHECK-NEXT: lea %s0, -32(, %s0)
267 ; CHECK-NEXT: adds.w.sx %s0, -24, %s0
268 ; CHECK-NEXT: and %s0, %s0, (56)0
269 ; CHECK-NEXT: b.l.t (, %s10)
270 %r = tail call i8 @llvm.ctlz.i8(i8 %p, i1 false)