1; RUN: llc -march=hexagon -O0 < %s | FileCheck %s 2; RUN: llc -march=hexagon -O0 < %s | FileCheck -check-prefix=CHECK-CALL %s 3; Hexagon Programmer's Reference Manual 11.10.2 XTYPE/BIT 4 5; CHECK-CALL-NOT: call 6 7; Count leading 8declare i32 @llvm.hexagon.S2.clbp(i64) 9define i32 @S2_clbp(i64 %a) { 10 %z = call i32 @llvm.hexagon.S2.clbp(i64 %a) 11 ret i32 %z 12} 13; CHECK: = clb({{.*}}) 14 15declare i32 @llvm.hexagon.S2.cl0p(i64) 16define i32 @S2_cl0p(i64 %a) { 17 %z = call i32 @llvm.hexagon.S2.cl0p(i64 %a) 18 ret i32 %z 19} 20; CHECK: = cl0({{.*}}) 21 22declare i32 @llvm.hexagon.S2.cl1p(i64) 23define i32 @S2_cl1p(i64 %a) { 24 %z = call i32 @llvm.hexagon.S2.cl1p(i64 %a) 25 ret i32 %z 26} 27; CHECK: = cl1({{.*}}) 28 29declare i32 @llvm.hexagon.S4.clbpnorm(i64) 30define i32 @S4_clbpnorm(i64 %a) { 31 %z = call i32 @llvm.hexagon.S4.clbpnorm(i64 %a) 32 ret i32 %z 33} 34; CHECK: = normamt({{.*}}) 35 36declare i32 @llvm.hexagon.S4.clbpaddi(i64, i32) 37define i32 @S4_clbpaddi(i64 %a) { 38 %z = call i32 @llvm.hexagon.S4.clbpaddi(i64 %a, i32 0) 39 ret i32 %z 40} 41; CHECK: = add(clb({{.*}}),#0) 42 43declare i32 @llvm.hexagon.S4.clbaddi(i32, i32) 44define i32 @S4_clbaddi(i32 %a) { 45 %z = call i32 @llvm.hexagon.S4.clbaddi(i32 %a, i32 0) 46 ret i32 %z 47} 48; CHECK: = add(clb({{.*}}),#0) 49 50declare i32 @llvm.hexagon.S2.cl0(i32) 51define i32 @S2_cl0(i32 %a) { 52 %z = call i32 @llvm.hexagon.S2.cl0(i32 %a) 53 ret i32 %z 54} 55; CHECK: = cl0({{.*}}) 56 57declare i32 @llvm.hexagon.S2.cl1(i32) 58define i32 @S2_cl1(i32 %a) { 59 %z = call i32 @llvm.hexagon.S2.cl1(i32 %a) 60 ret i32 %z 61} 62; CHECK: = cl1({{.*}}) 63 64declare i32 @llvm.hexagon.S2.clbnorm(i32) 65define i32 @S4_clbnorm(i32 %a) { 66 %z = call i32 @llvm.hexagon.S2.clbnorm(i32 %a) 67 ret i32 %z 68} 69; CHECK: = normamt({{.*}}) 70 71; Count population 72declare i32 @llvm.hexagon.S5.popcountp(i64) 73define i32 @S5_popcountp(i64 %a) { 74 %z = call i32 @llvm.hexagon.S5.popcountp(i64 %a) 75 ret i32 %z 76} 77; CHECK: = popcount({{.*}}) 78 79; Count trailing 80declare i32 @llvm.hexagon.S2.ct0p(i64) 81define i32 @S2_ct0p(i64 %a) { 82 %z = call i32 @llvm.hexagon.S2.ct0p(i64 %a) 83 ret i32 %z 84} 85; CHECK: = ct0({{.*}}) 86 87declare i32 @llvm.hexagon.S2.ct1p(i64) 88define i32 @S2_ct1p(i64 %a) { 89 %z = call i32 @llvm.hexagon.S2.ct1p(i64 %a) 90 ret i32 %z 91} 92; CHECK: = ct1({{.*}}) 93 94declare i32 @llvm.hexagon.S2.ct0(i32) 95define i32 @S2_ct0(i32 %a) { 96 %z = call i32 @llvm.hexagon.S2.ct0(i32 %a) 97 ret i32 %z 98} 99; CHECK: = ct0({{.*}}) 100 101declare i32 @llvm.hexagon.S2.ct1(i32) 102define i32 @S2_ct1(i32 %a) { 103 %z = call i32 @llvm.hexagon.S2.ct1(i32 %a) 104 ret i32 %z 105} 106; CHECK: = ct1({{.*}}) 107 108; Extract bitfield 109declare i64 @llvm.hexagon.S2.extractup(i64, i32, i32) 110define i64 @S2_extractup(i64 %a) { 111 %z = call i64 @llvm.hexagon.S2.extractup(i64 %a, i32 0, i32 0) 112 ret i64 %z 113} 114; CHECK: = extractu({{.*}},#0,#0) 115 116declare i64 @llvm.hexagon.S4.extractp(i64, i32, i32) 117define i64 @S2_extractp(i64 %a) { 118 %z = call i64 @llvm.hexagon.S4.extractp(i64 %a, i32 0, i32 0) 119 ret i64 %z 120} 121; CHECK: = extract({{.*}},#0,#0) 122 123declare i32 @llvm.hexagon.S2.extractu(i32, i32, i32) 124define i32 @S2_extractu(i32 %a) { 125 %z = call i32 @llvm.hexagon.S2.extractu(i32 %a, i32 0, i32 0) 126 ret i32 %z 127} 128; CHECK: = extractu({{.*}},#0,#0) 129 130declare i32 @llvm.hexagon.S4.extract(i32, i32, i32) 131define i32 @S2_extract(i32 %a) { 132 %z = call i32 @llvm.hexagon.S4.extract(i32 %a, i32 0, i32 0) 133 ret i32 %z 134} 135; CHECK: = extract({{.*}},#0,#0) 136 137declare i64 @llvm.hexagon.S2.extractup.rp(i64, i64) 138define i64 @S2_extractup_rp(i64 %a, i64 %b) { 139 %z = call i64 @llvm.hexagon.S2.extractup.rp(i64 %a, i64 %b) 140 ret i64 %z 141} 142; CHECK: = extractu({{.*}},{{.*}}) 143 144declare i64 @llvm.hexagon.S4.extractp.rp(i64, i64) 145define i64 @S4_extractp_rp(i64 %a, i64 %b) { 146 %z = call i64 @llvm.hexagon.S4.extractp.rp(i64 %a, i64 %b) 147 ret i64 %z 148} 149; CHECK: = extract({{.*}},{{.*}}) 150 151declare i32 @llvm.hexagon.S2.extractu.rp(i32, i64) 152define i32 @S2_extractu_rp(i32 %a, i64 %b) { 153 %z = call i32 @llvm.hexagon.S2.extractu.rp(i32 %a, i64 %b) 154 ret i32 %z 155} 156; CHECK: = extractu({{.*}},{{.*}}) 157 158declare i32 @llvm.hexagon.S4.extract.rp(i32, i64) 159define i32 @S4_extract_rp(i32 %a, i64 %b) { 160 %z = call i32 @llvm.hexagon.S4.extract.rp(i32 %a, i64 %b) 161 ret i32 %z 162} 163; CHECK: = extract({{.*}},{{.*}}) 164 165; Insert bitfield 166declare i64 @llvm.hexagon.S2.insertp(i64, i64, i32, i32) 167define i64 @S2_insertp(i64 %a, i64 %b) { 168 %z = call i64 @llvm.hexagon.S2.insertp(i64 %a, i64 %b, i32 0, i32 0) 169 ret i64 %z 170} 171; CHECK: = insert({{.*}},#0,#0) 172 173declare i32 @llvm.hexagon.S2.insert(i32, i32, i32, i32) 174define i32 @S2_insert(i32 %a, i32 %b) { 175 %z = call i32 @llvm.hexagon.S2.insert(i32 %a, i32 %b, i32 0, i32 0) 176 ret i32 %z 177} 178; CHECK: = insert({{.*}},#0,#0) 179 180declare i32 @llvm.hexagon.S2.insert.rp(i32, i32, i64) 181define i32 @S2_insert_rp(i32 %a, i32 %b, i64 %c) { 182 %z = call i32 @llvm.hexagon.S2.insert.rp(i32 %a, i32 %b, i64 %c) 183 ret i32 %z 184} 185; CHECK: = insert({{.*}},{{.*}}) 186 187declare i64 @llvm.hexagon.S2.insertp.rp(i64, i64, i64) 188define i64 @S2_insertp_rp(i64 %a, i64 %b, i64 %c) { 189 %z = call i64 @llvm.hexagon.S2.insertp.rp(i64 %a, i64 %b, i64 %c) 190 ret i64 %z 191} 192; CHECK: = insert({{.*}},r5:4) 193 194; Interleave/deinterleave 195declare i64 @llvm.hexagon.S2.deinterleave(i64) 196define i64 @S2_deinterleave(i64 %a) { 197 %z = call i64 @llvm.hexagon.S2.deinterleave(i64 %a) 198 ret i64 %z 199} 200; CHECK: = deinterleave({{.*}}) 201 202declare i64 @llvm.hexagon.S2.interleave(i64) 203define i64 @S2_interleave(i64 %a) { 204 %z = call i64 @llvm.hexagon.S2.interleave(i64 %a) 205 ret i64 %z 206} 207; CHECK: = interleave({{.*}}) 208 209; Linear feedback-shift operation 210declare i64 @llvm.hexagon.S2.lfsp(i64, i64) 211define i64 @S2_lfsp(i64 %a, i64 %b) { 212 %z = call i64 @llvm.hexagon.S2.lfsp(i64 %a, i64 %b) 213 ret i64 %z 214} 215; CHECK: = lfs({{.*}},{{.*}}) 216 217; Masked parity 218declare i32 @llvm.hexagon.S2.parityp(i64, i64) 219define i32 @S2_parityp(i64 %a, i64 %b) { 220 %z = call i32 @llvm.hexagon.S2.parityp(i64 %a, i64 %b) 221 ret i32 %z 222} 223; CHECK: = parity({{.*}},{{.*}}) 224 225declare i32 @llvm.hexagon.S4.parity(i32, i32) 226define i32 @S4_parity(i32 %a, i32 %b) { 227 %z = call i32 @llvm.hexagon.S4.parity(i32 %a, i32 %b) 228 ret i32 %z 229} 230; CHECK: = parity({{.*}},{{.*}}) 231 232; Bit reverse 233declare i64 @llvm.hexagon.S2.brevp(i64) 234define i64 @S2_brevp(i64 %a) { 235 %z = call i64 @llvm.hexagon.S2.brevp(i64 %a) 236 ret i64 %z 237} 238; CHECK: = brev({{.*}}) 239 240declare i32 @llvm.hexagon.S2.brev(i32) 241define i32 @S2_brev(i32 %a) { 242 %z = call i32 @llvm.hexagon.S2.brev(i32 %a) 243 ret i32 %z 244} 245; CHECK: = brev({{.*}}) 246 247; Set/clear/toggle bit 248declare i32 @llvm.hexagon.S2.setbit.i(i32, i32) 249define i32 @S2_setbit_i(i32 %a) { 250 %z = call i32 @llvm.hexagon.S2.setbit.i(i32 %a, i32 0) 251 ret i32 %z 252} 253; CHECK: = setbit({{.*}},#0) 254 255declare i32 @llvm.hexagon.S2.clrbit.i(i32, i32) 256define i32 @S2_clrbit_i(i32 %a) { 257 %z = call i32 @llvm.hexagon.S2.clrbit.i(i32 %a, i32 0) 258 ret i32 %z 259} 260; CHECK: = clrbit({{.*}},#0) 261 262declare i32 @llvm.hexagon.S2.togglebit.i(i32, i32) 263define i32 @S2_togglebit_i(i32 %a) { 264 %z = call i32 @llvm.hexagon.S2.togglebit.i(i32 %a, i32 0) 265 ret i32 %z 266} 267; CHECK: = togglebit({{.*}},#0) 268 269declare i32 @llvm.hexagon.S2.setbit.r(i32, i32) 270define i32 @S2_setbit_r(i32 %a, i32 %b) { 271 %z = call i32 @llvm.hexagon.S2.setbit.r(i32 %a, i32 %b) 272 ret i32 %z 273} 274; CHECK: = setbit({{.*}},{{.*}}) 275 276declare i32 @llvm.hexagon.S2.clrbit.r(i32, i32) 277define i32 @S2_clrbit_r(i32 %a, i32 %b) { 278 %z = call i32 @llvm.hexagon.S2.clrbit.r(i32 %a, i32 %b) 279 ret i32 %z 280} 281; CHECK: = clrbit({{.*}},{{.*}}) 282 283declare i32 @llvm.hexagon.S2.togglebit.r(i32, i32) 284define i32 @S2_togglebit_r(i32 %a, i32 %b) { 285 %z = call i32 @llvm.hexagon.S2.togglebit.r(i32 %a, i32 %b) 286 ret i32 %z 287} 288; CHECK: = togglebit({{.*}},{{.*}}) 289 290; Split bitfield 291declare i64 @llvm.hexagon.A4.bitspliti(i32, i32) 292define i64 @A4_bitspliti(i32 %a) { 293 %z = call i64 @llvm.hexagon.A4.bitspliti(i32 %a, i32 0) 294 ret i64 %z 295} 296; CHECK: = bitsplit({{.*}},#0) 297 298declare i64 @llvm.hexagon.A4.bitsplit(i32, i32) 299define i64 @A4_bitsplit(i32 %a, i32 %b) { 300 %z = call i64 @llvm.hexagon.A4.bitsplit(i32 %a, i32 %b) 301 ret i64 %z 302} 303; CHECK: = bitsplit({{.*}},{{.*}}) 304 305; Table index 306declare i32 @llvm.hexagon.S2.tableidxb.goodsyntax(i32, i32, i32, i32) 307define i32 @S2_tableidxb_goodsyntax(i32 %a, i32 %b) { 308 %z = call i32 @llvm.hexagon.S2.tableidxb.goodsyntax(i32 %a, i32 %b, i32 0, i32 0) 309 ret i32 %z 310} 311; CHECK: = tableidxb({{.*}},#0,#0) 312 313declare i32 @llvm.hexagon.S2.tableidxh.goodsyntax(i32, i32, i32, i32) 314define i32 @S2_tableidxh_goodsyntax(i32 %a, i32 %b) { 315 %z = call i32 @llvm.hexagon.S2.tableidxh.goodsyntax(i32 %a, i32 %b, i32 0, i32 0) 316 ret i32 %z 317} 318; CHECK: = tableidxh({{.*}},#0,#-1) 319 320declare i32 @llvm.hexagon.S2.tableidxw.goodsyntax(i32, i32, i32, i32) 321define i32 @S2_tableidxw_goodsyntax(i32 %a, i32 %b) { 322 %z = call i32 @llvm.hexagon.S2.tableidxw.goodsyntax(i32 %a, i32 %b, i32 0, i32 0) 323 ret i32 %z 324} 325; CHECK: = tableidxw({{.*}},#0,#-2) 326 327declare i32 @llvm.hexagon.S2.tableidxd.goodsyntax(i32, i32, i32, i32) 328define i32 @S2_tableidxd_goodsyntax(i32 %a, i32 %b) { 329 %z = call i32 @llvm.hexagon.S2.tableidxd.goodsyntax(i32 %a, i32 %b, i32 0, i32 0) 330 ret i32 %z 331} 332; CHECK: = tableidxd({{.*}},#0,#-3) 333