1 ; RUN: llc -march=hexagon < %s | FileCheck %s 2 3 @l = external global <32 x i32> 4 @k = external global <16 x i32> 5 @h = external global <16 x i32> 6 @n = external global i64 7 @m = external global i32 8 9 ; CHECK-LABEL: test1: 10 ; CHECK: v{{[0-9]+}}:{{[0-9]+}}.w = vrmpy(v{{[0-9]+}}:{{[0-9]+}}.ub,r{{[0-9]+}}.b,#1) 11 define void @test1(<32 x i32> %a, i32 %b) #0 { 12 entry: 13 %0 = tail call <32 x i32> @llvm.hexagon.V6.vrmpybusi(<32 x i32> %a, i32 %b, i32 1) 14 store <32 x i32> %0, <32 x i32>* @l, align 128 15 ret void 16 } 17 18 ; CHECK-LABEL: test2: 19 ; CHECK: v{{[0-9]+}}:{{[0-9]+}}.uw = vrsad(v{{[0-9]+}}:{{[0-9]+}}.ub,r{{[0-9]+}}.ub,#1) 20 define void @test2(<32 x i32> %a, i32 %b) #0 { 21 entry: 22 %0 = tail call <32 x i32> @llvm.hexagon.V6.vrsadubi(<32 x i32> %a, i32 %b, i32 1) 23 store <32 x i32> %0, <32 x i32>* @l, align 128 24 ret void 25 } 26 27 ; CHECK-LABEL: test3: 28 ; CHECK: v{{[0-9]+}}:{{[0-9]+}}.uw = vrmpy(v{{[0-9]+}}:{{[0-9]+}}.ub,r{{[0-9]+}}.ub,#1) 29 define void @test3(<32 x i32> %a, i32 %b) #0 { 30 entry: 31 %0 = tail call <32 x i32> @llvm.hexagon.V6.vrmpyubi(<32 x i32> %a, i32 %b, i32 1) 32 store <32 x i32> %0, <32 x i32>* @l, align 128 33 ret void 34 } 35 36 ; CHECK-LABEL: test4: 37 ; CHECK: v{{[0-9]+}}:{{[0-9]+}}.w += vrmpy(v{{[0-9]+}}:{{[0-9]+}}.ub,r{{[0-9]+}}.b,#1) 38 define void @test4(<32 x i32> %a, <32 x i32> %b, i32 %c) #0 { 39 entry: 40 %0 = tail call <32 x i32> @llvm.hexagon.V6.vrmpybusi.acc(<32 x i32> %a, <32 x i32> %b, i32 %c, i32 1) 41 store <32 x i32> %0, <32 x i32>* @l, align 128 42 ret void 43 } 44 45 ; CHECK-LABEL: test5: 46 ; CHECK: v{{[0-9]+}}:{{[0-9]+}}.uw += vrsad(v{{[0-9]+}}:{{[0-9]+}}.ub,r{{[0-9]+}}.ub,#1) 47 define void @test5(<32 x i32> %a, <32 x i32> %b, i32 %c) #0 { 48 entry: 49 %0 = tail call <32 x i32> @llvm.hexagon.V6.vrsadubi.acc(<32 x i32> %a, <32 x i32> %b, i32 %c, i32 1) 50 store <32 x i32> %0, <32 x i32>* @l, align 128 51 ret void 52 } 53 54 ; CHECK-LABEL: test6: 55 ; CHECK: v{{[0-9]+}}:{{[0-9]+}}.uw += vrmpy(v{{[0-9]+}}:{{[0-9]+}}.ub,r{{[0-9]+}}.ub,#0) 56 define void @test6(<32 x i32> %a, <32 x i32> %b, i32 %c) #0 { 57 entry: 58 %0 = tail call <32 x i32> @llvm.hexagon.V6.vrmpyubi.acc(<32 x i32> %a, <32 x i32> %b, i32 %c, i32 0) 59 store <32 x i32> %0, <32 x i32>* @l, align 128 60 ret void 61 } 62 63 ; CHECK-LABEL: test7: 64 ; CHECK: v{{[0-9]+}} = valign(v{{[0-9]+}},v{{[0-9]+}},r{{[0-9]+}}) 65 define void @test7(<16 x i32> %a, <16 x i32> %b, i32 %c) #0 { 66 entry: 67 %0 = tail call <16 x i32> @llvm.hexagon.V6.valignb(<16 x i32> %a, <16 x i32> %b, i32 %c) 68 store <16 x i32> %0, <16 x i32>* @k, align 64 69 ret void 70 } 71 72 ; CHECK-LABEL: test8: 73 ; CHECK: v{{[0-9]+}} = vlalign(v{{[0-9]+}},v{{[0-9]+}},r{{[0-9]+}}) 74 define void @test8(<16 x i32> %a, <16 x i32> %b, i32 %c) #0 { 75 entry: 76 %0 = tail call <16 x i32> @llvm.hexagon.V6.vlalignb(<16 x i32> %a, <16 x i32> %b, i32 %c) 77 store <16 x i32> %0, <16 x i32>* @k, align 64 78 ret void 79 } 80 81 ; CHECK-LABEL: test9: 82 ; CHECK: v{{[0-9]+}}.h = vasr(v{{[0-9]+}}.w,v{{[0-9]+}}.w,r{{[0-9]+}}) 83 define void @test9(<16 x i32> %a, <16 x i32> %b, i32 %c) #0 { 84 entry: 85 %0 = tail call <16 x i32> @llvm.hexagon.V6.vasrwh(<16 x i32> %a, <16 x i32> %b, i32 %c) 86 store <16 x i32> %0, <16 x i32>* @k, align 64 87 ret void 88 } 89 90 ; CHECK-LABEL: test10: 91 ; CHECK: v{{[0-9]+}}.h = vasr(v{{[0-9]+}}.w,v{{[0-9]+}}.w,r{{[0-9]+}}):sat 92 define void @test10(<16 x i32> %a, <16 x i32> %b, i32 %c) #0 { 93 entry: 94 %0 = tail call <16 x i32> @llvm.hexagon.V6.vasrwhsat(<16 x i32> %a, <16 x i32> %b, i32 %c) 95 store <16 x i32> %0, <16 x i32>* @k, align 64 96 ret void 97 } 98 99 ; CHECK-LABEL: test11: 100 ; CHECK: v{{[0-9]+}}.h = vasr(v{{[0-9]+}}.w,v{{[0-9]+}}.w,r{{[0-9]+}}):rnd:sat 101 define void @test11(<16 x i32> %a, <16 x i32> %b, i32 %c) #0 { 102 entry: 103 %0 = tail call <16 x i32> @llvm.hexagon.V6.vasrwhrndsat(<16 x i32> %a, <16 x i32> %b, i32 %c) 104 store <16 x i32> %0, <16 x i32>* @k, align 64 105 ret void 106 } 107 108 ; CHECK-LABEL: test12: 109 ; CHECK: v{{[0-9]+}}.uh = vasr(v{{[0-9]+}}.w,v{{[0-9]+}}.w,r{{[0-9]+}}):sat 110 define void @test12(<16 x i32> %a, <16 x i32> %b, i32 %c) #0 { 111 entry: 112 %0 = tail call <16 x i32> @llvm.hexagon.V6.vasrwuhsat(<16 x i32> %a, <16 x i32> %b, i32 %c) 113 store <16 x i32> %0, <16 x i32>* @k, align 64 114 ret void 115 } 116 117 ; CHECK-LABEL: test13: 118 ; CHECK: v{{[0-9]+}}.ub = vasr(v{{[0-9]+}}.h,v{{[0-9]+}}.h,r{{[0-9]+}}):sat 119 define void @test13(<16 x i32> %a, <16 x i32> %b, i32 %c) #0 { 120 entry: 121 %0 = tail call <16 x i32> @llvm.hexagon.V6.vasrhubsat(<16 x i32> %a, <16 x i32> %b, i32 %c) 122 store <16 x i32> %0, <16 x i32>* @k, align 64 123 ret void 124 } 125 126 ; CHECK-LABEL: test14: 127 ; CHECK: v{{[0-9]+}}.ub = vasr(v{{[0-9]+}}.h,v{{[0-9]+}}.h,r{{[0-9]+}}):rnd:sat 128 define void @test14(<16 x i32> %a, <16 x i32> %b, i32 %c) #0 { 129 entry: 130 %0 = tail call <16 x i32> @llvm.hexagon.V6.vasrhubrndsat(<16 x i32> %a, <16 x i32> %b, i32 %c) 131 store <16 x i32> %0, <16 x i32>* @k, align 64 132 ret void 133 } 134 135 ; CHECK-LABEL: test15: 136 ; CHECK: v{{[0-9]+}}.b = vasr(v{{[0-9]+}}.h,v{{[0-9]+}}.h,r{{[0-9]+}}):rnd:sat 137 define void @test15(<16 x i32> %a, <16 x i32> %b, i32 %c) #0 { 138 entry: 139 %0 = tail call <16 x i32> @llvm.hexagon.V6.vasrhbrndsat(<16 x i32> %a, <16 x i32> %b, i32 %c) 140 store <16 x i32> %0, <16 x i32>* @k, align 64 141 ret void 142 } 143 144 ; CHECK-LABEL: test16: 145 ; CHECK: v{{[0-9]+}}:{{[0-9]+}}.h |= vunpacko(v{{[0-9]+}}.b) 146 define void @test16(<32 x i32> %a, <16 x i32> %b) #0 { 147 entry: 148 %0 = tail call <32 x i32> @llvm.hexagon.V6.vunpackob(<32 x i32> %a, <16 x i32> %b) 149 store <32 x i32> %0, <32 x i32>* @l, align 128 150 ret void 151 } 152 153 ; CHECK-LABEL: test17: 154 ; CHECK: v{{[0-9]+}}:{{[0-9]+}}.w |= vunpacko(v{{[0-9]+}}.h) 155 define void @test17(<32 x i32> %a, <16 x i32> %b) #0 { 156 entry: 157 %0 = tail call <32 x i32> @llvm.hexagon.V6.vunpackoh(<32 x i32> %a, <16 x i32> %b) 158 store <32 x i32> %0, <32 x i32>* @l, align 128 159 ret void 160 } 161 162 ; CHECK-LABEL: test18: 163 ; CHECK: v{{[0-9]+}} = valign(v{{[0-9]+}},v{{[0-9]+}},#3) 164 define void @test18(<16 x i32> %a, <16 x i32> %b) #0 { 165 entry: 166 %0 = tail call <16 x i32> @llvm.hexagon.V6.valignbi(<16 x i32> %a, <16 x i32> %b, i32 3) 167 store <16 x i32> %0, <16 x i32>* @k, align 64 168 ret void 169 } 170 171 ; CHECK-LABEL: test19: 172 ; CHECK: v{{[0-9]+}} = vlalign(v{{[0-9]+}},v{{[0-9]+}},#3) 173 define void @test19(<16 x i32> %a, <16 x i32> %b) #0 { 174 entry: 175 %0 = tail call <16 x i32> @llvm.hexagon.V6.vlalignbi(<16 x i32> %a, <16 x i32> %b, i32 3) 176 store <16 x i32> %0, <16 x i32>* @k, align 64 177 ret void 178 } 179 180 ; CHECK-LABEL: test20: 181 ; CHECK: v{{[0-9]+}} = vmux(q{{[0-3]+}},v{{[0-9]+}},v{{[0-9]+}}) 182 define void @test20(<16 x i32> %a, <16 x i32> %b, <16 x i32> %c) #0 { 183 entry: 184 %0 = bitcast <16 x i32> %a to <512 x i1> 185 %1 = tail call <16 x i32> @llvm.hexagon.V6.vmux(<512 x i1> %0, <16 x i32> %b, <16 x i32> %c) 186 store <16 x i32> %1, <16 x i32>* @k, align 64 187 ret void 188 } 189 190 ; CHECK-LABEL: test21: 191 ; CHECK: q{{[0-3]+}} = and(q{{[0-3]+}},q{{[0-3]+}}) 192 define void @test21(<16 x i32> %a, <16 x i32> %b) #0 { 193 entry: 194 %0 = bitcast <16 x i32> %a to <512 x i1> 195 %1 = bitcast <16 x i32> %b to <512 x i1> 196 %2 = tail call <512 x i1> @llvm.hexagon.V6.pred.and(<512 x i1> %0, <512 x i1> %1) 197 store <512 x i1> %2, <512 x i1>* bitcast (<16 x i32>* @h to <512 x i1>*), align 64 198 ret void 199 } 200 201 ; CHECK-LABEL: test22: 202 ; CHECK: q{{[0-3]+}} = or(q{{[0-3]+}},q{{[0-3]+}}) 203 define void @test22(<16 x i32> %a, <16 x i32> %b) #0 { 204 entry: 205 %0 = bitcast <16 x i32> %a to <512 x i1> 206 %1 = bitcast <16 x i32> %b to <512 x i1> 207 %2 = tail call <512 x i1> @llvm.hexagon.V6.pred.or(<512 x i1> %0, <512 x i1> %1) 208 store <512 x i1> %2, <512 x i1>* bitcast (<16 x i32>* @h to <512 x i1>*), align 64 209 ret void 210 } 211 212 ; CHECK-LABEL: test23: 213 ; CHECK: q{{[0-3]+}} = not(q{{[0-3]+}}) 214 define void @test23(<16 x i32> %a) #0 { 215 entry: 216 %0 = bitcast <16 x i32> %a to <512 x i1> 217 %1 = tail call <512 x i1> @llvm.hexagon.V6.pred.not(<512 x i1> %0) 218 store <512 x i1> %1, <512 x i1>* bitcast (<16 x i32>* @h to <512 x i1>*), align 64 219 ret void 220 } 221 222 ; CHECK-LABEL: test24: 223 ; CHECK: q{{[0-3]+}} = xor(q{{[0-3]+}},q{{[0-3]+}}) 224 define void @test24(<16 x i32> %a, <16 x i32> %b) #0 { 225 entry: 226 %0 = bitcast <16 x i32> %a to <512 x i1> 227 %1 = bitcast <16 x i32> %b to <512 x i1> 228 %2 = tail call <512 x i1> @llvm.hexagon.V6.pred.xor(<512 x i1> %0, <512 x i1> %1) 229 store <512 x i1> %2, <512 x i1>* bitcast (<16 x i32>* @h to <512 x i1>*), align 64 230 ret void 231 } 232 233 ; CHECK-LABEL: test25: 234 ; CHECK: q{{[0-3]+}} = or(q{{[0-3]+}},!q{{[0-3]+}}) 235 define void @test25(<16 x i32> %a, <16 x i32> %b) #0 { 236 entry: 237 %0 = bitcast <16 x i32> %a to <512 x i1> 238 %1 = bitcast <16 x i32> %b to <512 x i1> 239 %2 = tail call <512 x i1> @llvm.hexagon.V6.pred.or.n(<512 x i1> %0, <512 x i1> %1) 240 store <512 x i1> %2, <512 x i1>* bitcast (<16 x i32>* @h to <512 x i1>*), align 64 241 ret void 242 } 243 244 ; CHECK-LABEL: test26: 245 ; CHECK: q{{[0-3]+}} = and(q{{[0-3]+}},!q{{[0-3]+}}) 246 define void @test26(<16 x i32> %a, <16 x i32> %b) #0 { 247 entry: 248 %0 = bitcast <16 x i32> %a to <512 x i1> 249 %1 = bitcast <16 x i32> %b to <512 x i1> 250 %2 = tail call <512 x i1> @llvm.hexagon.V6.pred.and.n(<512 x i1> %0, <512 x i1> %1) 251 store <512 x i1> %2, <512 x i1>* bitcast (<16 x i32>* @h to <512 x i1>*), align 64 252 ret void 253 } 254 255 ; CHECK-LABEL: test27: 256 ; CHECK: q{{[0-3]+}} = vcmp.gt(v{{[0-9]+}}.ub,v{{[0-9]+}}.ub) 257 define void @test27(<16 x i32> %a, <16 x i32> %b) #0 { 258 entry: 259 %0 = tail call <512 x i1> @llvm.hexagon.V6.vgtub(<16 x i32> %a, <16 x i32> %b) 260 store <512 x i1> %0, <512 x i1>* bitcast (<16 x i32>* @k to <512 x i1>*), align 64 261 ret void 262 } 263 264 ; CHECK-LABEL: test28: 265 ; CHECK: q{{[0-3]+}} = vcmp.gt(v{{[0-9]+}}.h,v{{[0-9]+}}.h) 266 define void @test28(<16 x i32> %a, <16 x i32> %b) #0 { 267 entry: 268 %0 = tail call <512 x i1> @llvm.hexagon.V6.vgth(<16 x i32> %a, <16 x i32> %b) 269 store <512 x i1> %0, <512 x i1>* bitcast (<16 x i32>* @k to <512 x i1>*), align 64 270 ret void 271 } 272 273 ; CHECK-LABEL: test29: 274 ; CHECK: q{{[0-3]+}} = vcmp.eq(v{{[0-9]+}}.h,v{{[0-9]+}}.h) 275 define void @test29(<16 x i32> %a, <16 x i32> %b) #0 { 276 entry: 277 %0 = tail call <512 x i1> @llvm.hexagon.V6.veqh(<16 x i32> %a, <16 x i32> %b) 278 store <512 x i1> %0, <512 x i1>* bitcast (<16 x i32>* @k to <512 x i1>*), align 64 279 ret void 280 } 281 282 ; CHECK-LABEL: test30: 283 ; CHECK: q{{[0-3]+}} = vcmp.gt(v{{[0-9]+}}.w,v{{[0-9]+}}.w) 284 define void @test30(<16 x i32> %a, <16 x i32> %b) #0 { 285 entry: 286 %0 = tail call <512 x i1> @llvm.hexagon.V6.vgtw(<16 x i32> %a, <16 x i32> %b) 287 store <512 x i1> %0, <512 x i1>* bitcast (<16 x i32>* @k to <512 x i1>*), align 64 288 ret void 289 } 290 291 ; CHECK-LABEL: test31: 292 ; CHECK: q{{[0-3]+}} = vcmp.eq(v{{[0-9]+}}.w,v{{[0-9]+}}.w) 293 define void @test31(<16 x i32> %a, <16 x i32> %b) #0 { 294 entry: 295 %0 = tail call <512 x i1> @llvm.hexagon.V6.veqw(<16 x i32> %a, <16 x i32> %b) 296 store <512 x i1> %0, <512 x i1>* bitcast (<16 x i32>* @k to <512 x i1>*), align 64 297 ret void 298 } 299 300 ; CHECK-LABEL: test32: 301 ; CHECK: q{{[0-3]+}} = vcmp.gt(v{{[0-9]+}}.uh,v{{[0-9]+}}.uh) 302 define void @test32(<16 x i32> %a, <16 x i32> %b) #0 { 303 entry: 304 %0 = tail call <512 x i1> @llvm.hexagon.V6.vgtuh(<16 x i32> %a, <16 x i32> %b) 305 store <512 x i1> %0, <512 x i1>* bitcast (<16 x i32>* @k to <512 x i1>*), align 64 306 ret void 307 } 308 309 ; CHECK-LABEL: test33: 310 ; CHECK: v{{[0-9]+}} |= vand(q{{[0-3]+}},r{{[0-9]+}}) 311 define void @test33(<16 x i32> %a, <16 x i32> %b, i32 %c) #0 { 312 entry: 313 %0 = bitcast <16 x i32> %b to <512 x i1> 314 %1 = tail call <16 x i32> @llvm.hexagon.V6.vandqrt.acc(<16 x i32> %a, <512 x i1> %0, i32 %c) 315 store <16 x i32> %1, <16 x i32>* @h, align 64 316 ret void 317 } 318 319 ; CHECK-LABEL: test34: 320 ; CHECK: q{{[0-3]+}} |= vand(v{{[0-9]+}},r{{[0-9]+}}) 321 define void @test34(<16 x i32> %a, <16 x i32> %b, i32 %c) #0 { 322 entry: 323 %0 = bitcast <16 x i32> %a to <512 x i1> 324 %1 = tail call <512 x i1> @llvm.hexagon.V6.vandvrt.acc(<512 x i1> %0, <16 x i32> %b, i32 %c) 325 store <512 x i1> %1, <512 x i1>* bitcast (<16 x i32>* @k to <512 x i1>*), align 64 326 ret void 327 } 328 329 ; CHECK-LABEL: test35: 330 ; CHECK: v{{[0-9]+}} = vand(q{{[0-3]+}},r{{[0-9]+}}) 331 define void @test35(<16 x i32> %a, i32 %b) #0 { 332 entry: 333 %0 = bitcast <16 x i32> %a to <512 x i1> 334 %1 = tail call <16 x i32> @llvm.hexagon.V6.vandqrt(<512 x i1> %0, i32 %b) 335 store <16 x i32> %1, <16 x i32>* @h, align 64 336 ret void 337 } 338 339 ; CHECK-LABEL: test36: 340 ; CHECK: q{{[0-3]+}} = vand(v{{[0-9]+}},r{{[0-9]+}}) 341 define void @test36(<16 x i32> %a, i32 %b) #0 { 342 entry: 343 %0 = tail call <512 x i1> @llvm.hexagon.V6.vandvrt(<16 x i32> %a, i32 %b) 344 store <512 x i1> %0, <512 x i1>* bitcast (<16 x i32>* @k to <512 x i1>*), align 64 345 ret void 346 } 347 348 ; CHECK-LABEL: test37: 349 ; CHECK: r{{[0-9]+}}:{{[0-9]+}} = rol(r{{[0-9]+}}:{{[0-9]+}},#38) 350 define void @test37(i64 %a) #0 { 351 entry: 352 %0 = tail call i64 @llvm.hexagon.S6.rol.i.p(i64 %a, i32 38) 353 store i64 %0, i64* @n, align 8 354 ret void 355 } 356 357 ; CHECK-LABEL: test38: 358 ; CHECK: r{{[0-9]+}}:{{[0-9]+}} += rol(r{{[0-9]+}}:{{[0-9]+}},#36) 359 define void @test38(i64 %a, i64 %b) #0 { 360 entry: 361 %0 = tail call i64 @llvm.hexagon.S6.rol.i.p.acc(i64 %a, i64 %b, i32 36) 362 store i64 %0, i64* @n, align 8 363 ret void 364 } 365 366 ; CHECK-LABEL: test39: 367 ; CHECK: r{{[0-9]+}}:{{[0-9]+}} &= rol(r{{[0-9]+}}:{{[0-9]+}},#25) 368 define void @test39(i64 %a, i64 %b) #0 { 369 entry: 370 %0 = tail call i64 @llvm.hexagon.S6.rol.i.p.and(i64 %a, i64 %b, i32 25) 371 store i64 %0, i64* @n, align 8 372 ret void 373 } 374 375 ; CHECK-LABEL: test40: 376 ; CHECK: r{{[0-9]+}}:{{[0-9]+}} -= rol(r{{[0-9]+}}:{{[0-9]+}},#20) 377 define void @test40(i64 %a, i64 %b) #0 { 378 entry: 379 %0 = tail call i64 @llvm.hexagon.S6.rol.i.p.nac(i64 %a, i64 %b, i32 20) 380 store i64 %0, i64* @n, align 8 381 ret void 382 } 383 384 ; CHECK-LABEL: test41: 385 ; CHECK: r{{[0-9]+}}:{{[0-9]+}} |= rol(r{{[0-9]+}}:{{[0-9]+}},#22) 386 define void @test41(i64 %a, i64 %b) #0 { 387 entry: 388 %0 = tail call i64 @llvm.hexagon.S6.rol.i.p.or(i64 %a, i64 %b, i32 22) 389 store i64 %0, i64* @n, align 8 390 ret void 391 } 392 393 ; CHECK-LABEL: test42: 394 ; CHECK: r{{[0-9]+}}:{{[0-9]+}} ^= rol(r{{[0-9]+}}:{{[0-9]+}},#25) 395 define void @test42(i64 %a, i64 %b) #0 { 396 entry: 397 %0 = tail call i64 @llvm.hexagon.S6.rol.i.p.xacc(i64 %a, i64 %b, i32 25) 398 store i64 %0, i64* @n, align 8 399 ret void 400 } 401 402 ; CHECK-LABEL: test43: 403 ; CHECK: r{{[0-9]+}} = rol(r{{[0-9]+}},#14) 404 define void @test43(i32 %a) #0 { 405 entry: 406 %0 = tail call i32 @llvm.hexagon.S6.rol.i.r(i32 %a, i32 14) 407 %conv = sext i32 %0 to i64 408 store i64 %conv, i64* @n, align 8 409 ret void 410 } 411 412 ; CHECK-LABEL: test44: 413 ; CHECK: r{{[0-9]+}} += rol(r{{[0-9]+}},#12) 414 define void @test44(i32 %a, i32 %b) #0 { 415 entry: 416 %0 = tail call i32 @llvm.hexagon.S6.rol.i.r.acc(i32 %a, i32 %b, i32 12) 417 store i32 %0, i32* @m, align 4 418 ret void 419 } 420 421 ; CHECK-LABEL: test45: 422 ; CHECK: r{{[0-9]+}} &= rol(r{{[0-9]+}},#18) 423 define void @test45(i32 %a, i32 %b) #0 { 424 entry: 425 %0 = tail call i32 @llvm.hexagon.S6.rol.i.r.and(i32 %a, i32 %b, i32 18) 426 store i32 %0, i32* @m, align 4 427 ret void 428 } 429 430 ; CHECK-LABEL: test46: 431 ; CHECK: r{{[0-9]+}} -= rol(r{{[0-9]+}},#31) 432 define void @test46(i32 %a, i32 %b) #0 { 433 entry: 434 %0 = tail call i32 @llvm.hexagon.S6.rol.i.r.nac(i32 %a, i32 %b, i32 31) 435 store i32 %0, i32* @m, align 4 436 ret void 437 } 438 439 ; CHECK-LABEL: test47: 440 ; CHECK: r{{[0-9]+}} |= rol(r{{[0-9]+}},#30) 441 define void @test47(i32 %a, i32 %b) #0 { 442 entry: 443 %0 = tail call i32 @llvm.hexagon.S6.rol.i.r.or(i32 %a, i32 %b, i32 30) 444 store i32 %0, i32* @m, align 4 445 ret void 446 } 447 448 ; CHECK-LABEL: test48: 449 ; CHECK: r{{[0-9]+}} ^= rol(r{{[0-9]+}},#31) 450 define void @test48(i32 %a, i32 %b) #0 { 451 entry: 452 %0 = tail call i32 @llvm.hexagon.S6.rol.i.r.xacc(i32 %a, i32 %b, i32 31) 453 store i32 %0, i32* @m, align 4 454 ret void 455 } 456 457 ; CHECK-LABEL: test49: 458 ; CHECK: r{{[0-9]+}} = vextract(v{{[0-9]+}},r{{[0-9]+}}) 459 define void @test49(<16 x i32> %a, i32 %b) #0 { 460 entry: 461 %0 = tail call i32 @llvm.hexagon.V6.extractw(<16 x i32> %a, i32 %b) 462 store i32 %0, i32* @m, align 4 463 ret void 464 } 465 466 ; CHECK-LABEL: test50: 467 ; CHECK: v{{[0-9]+}} = vsplat(r{{[0-9]+}}) 468 define void @test50(i32 %a) #0 { 469 entry: 470 %0 = tail call <16 x i32> @llvm.hexagon.V6.lvsplatw(i32 %a) 471 store <16 x i32> %0, <16 x i32>* @k, align 64 472 ret void 473 } 474 475 ; CHECK-LABEL: test51: 476 ; CHECK: q{{[0-3]}} = vsetq(r{{[0-9]+}}) 477 define void @test51(i32 %a) #0 { 478 entry: 479 %0 = tail call <512 x i1> @llvm.hexagon.V6.pred.scalar2(i32 %a) 480 store <512 x i1> %0, <512 x i1>* bitcast (<16 x i32>* @k to <512 x i1>*), align 64 481 ret void 482 } 483 484 ; CHECK-LABEL: test52: 485 ; CHECK: v{{[0-9]+}}.b = vlut32(v{{[0-9]+}}.b,v{{[0-9]+}}.b,r{{[0-9]+}}) 486 define void @test52(<16 x i32> %a, <16 x i32> %b, i32 %c) #0 { 487 entry: 488 %0 = tail call <16 x i32> @llvm.hexagon.V6.vlutvvb(<16 x i32> %a, <16 x i32> %b, i32 %c) 489 store <16 x i32> %0, <16 x i32>* @k, align 64 490 ret void 491 } 492 493 ; CHECK-LABEL: test53: 494 ; CHECK: v{{[0-9]+}}.b |= vlut32(v{{[0-9]+}}.b,v{{[0-9]+}}.b,r{{[0-9]+}}) 495 define void @test53(<16 x i32> %a, <16 x i32> %b, <16 x i32> %c, i32 %d) #0 { 496 entry: 497 %0 = tail call <16 x i32> @llvm.hexagon.V6.vlutvvb.oracc(<16 x i32> %a, <16 x i32> %b, <16 x i32> %c, i32 %d) 498 store <16 x i32> %0, <16 x i32>* @k, align 64 499 ret void 500 } 501 502 ; CHECK-LABEL: test54: 503 ; CHECK: v{{[0-9]+}}:{{[0-9]+}}.h |= vlut16(v{{[0-9]+}}.b,v{{[0-9]+}}.h,r{{[0-9]+}}) 504 define void @test54(<32 x i32> %a, <16 x i32> %b, <16 x i32> %c, i32 %d) #0 { 505 entry: 506 %0 = tail call <32 x i32> @llvm.hexagon.V6.vlutvwh.oracc(<32 x i32> %a, <16 x i32> %b, <16 x i32> %c, i32 %d) 507 store <32 x i32> %0, <32 x i32>* @l, align 128 508 ret void 509 } 510 511 ; CHECK-LABEL: test55: 512 ; CHECK: v{{[0-9]+}}:{{[0-9]+}}.h = vlut16(v{{[0-9]+}}.b,v{{[0-9]+}}.h,r{{[0-9]+}}) 513 define void @test55(<16 x i32> %a, <16 x i32> %b, i32 %l) #0 { 514 entry: 515 %0 = tail call <32 x i32> @llvm.hexagon.V6.vlutvwh(<16 x i32> %a, <16 x i32> %b, i32 %l) 516 store <32 x i32> %0, <32 x i32>* @l, align 128 517 ret void 518 } 519 520 ; CHECK-LABEL: test56: 521 ; CHECK: v{{[0-9]+}}.w = vinsert(r{{[0-9]+}}) 522 define void @test56(i32 %b) #0 { 523 entry: 524 %0 = load <16 x i32>, <16 x i32>* @k, align 64 525 %1 = tail call <16 x i32> @llvm.hexagon.V6.vinsertwr(<16 x i32> %0, i32 %b) 526 store <16 x i32> %1, <16 x i32>* @k, align 64 527 ret void 528 } 529 530 declare <32 x i32> @llvm.hexagon.V6.vrmpybusi(<32 x i32>, i32, i32) #0 531 declare <32 x i32> @llvm.hexagon.V6.vrsadubi(<32 x i32>, i32, i32) #0 532 declare <32 x i32> @llvm.hexagon.V6.vrmpyubi(<32 x i32>, i32, i32) #0 533 declare <32 x i32> @llvm.hexagon.V6.vrmpybusi.acc(<32 x i32>, <32 x i32>, i32, i32) #0 534 declare <32 x i32> @llvm.hexagon.V6.vrsadubi.acc(<32 x i32>, <32 x i32>, i32, i32) #0 535 declare <32 x i32> @llvm.hexagon.V6.vrmpyubi.acc(<32 x i32>, <32 x i32>, i32, i32) #0 536 declare <16 x i32> @llvm.hexagon.V6.valignb(<16 x i32>, <16 x i32>, i32) #0 537 declare <16 x i32> @llvm.hexagon.V6.vlalignb(<16 x i32>, <16 x i32>, i32) #0 538 declare <16 x i32> @llvm.hexagon.V6.vasrwh(<16 x i32>, <16 x i32>, i32) #0 539 declare <16 x i32> @llvm.hexagon.V6.vasrwhsat(<16 x i32>, <16 x i32>, i32) #0 540 declare <16 x i32> @llvm.hexagon.V6.vasrwhrndsat(<16 x i32>, <16 x i32>, i32) #0 541 declare <16 x i32> @llvm.hexagon.V6.vasrwuhsat(<16 x i32>, <16 x i32>, i32) #0 542 declare <16 x i32> @llvm.hexagon.V6.vasrhubsat(<16 x i32>, <16 x i32>, i32) #0 543 declare <16 x i32> @llvm.hexagon.V6.vasrhubrndsat(<16 x i32>, <16 x i32>, i32) #0 544 declare <16 x i32> @llvm.hexagon.V6.vasrhbrndsat(<16 x i32>, <16 x i32>, i32) #0 545 declare <32 x i32> @llvm.hexagon.V6.vunpackob(<32 x i32>, <16 x i32>) #0 546 declare <32 x i32> @llvm.hexagon.V6.vunpackoh(<32 x i32>, <16 x i32>) #0 547 declare <16 x i32> @llvm.hexagon.V6.valignbi(<16 x i32>, <16 x i32>, i32) #0 548 declare <16 x i32> @llvm.hexagon.V6.vlalignbi(<16 x i32>, <16 x i32>, i32) #0 549 declare <16 x i32> @llvm.hexagon.V6.vmux(<512 x i1>, <16 x i32>, <16 x i32>) #0 550 declare <512 x i1> @llvm.hexagon.V6.pred.and(<512 x i1>, <512 x i1>) #0 551 declare <512 x i1> @llvm.hexagon.V6.pred.or(<512 x i1>, <512 x i1>) #0 552 declare <512 x i1> @llvm.hexagon.V6.pred.not(<512 x i1>) #0 553 declare <512 x i1> @llvm.hexagon.V6.pred.xor(<512 x i1>, <512 x i1>) #0 554 declare <512 x i1> @llvm.hexagon.V6.pred.or.n(<512 x i1>, <512 x i1>) #0 555 declare <512 x i1> @llvm.hexagon.V6.pred.and.n(<512 x i1>, <512 x i1>) #0 556 declare <512 x i1> @llvm.hexagon.V6.vgtub(<16 x i32>, <16 x i32>) #0 557 declare <512 x i1> @llvm.hexagon.V6.vgth(<16 x i32>, <16 x i32>) #0 558 declare <512 x i1> @llvm.hexagon.V6.veqh(<16 x i32>, <16 x i32>) #0 559 declare <512 x i1> @llvm.hexagon.V6.vgtw(<16 x i32>, <16 x i32>) #0 560 declare <512 x i1> @llvm.hexagon.V6.veqw(<16 x i32>, <16 x i32>) #0 561 declare <512 x i1> @llvm.hexagon.V6.vgtuh(<16 x i32>, <16 x i32>) #0 562 declare <16 x i32> @llvm.hexagon.V6.vandqrt.acc(<16 x i32>, <512 x i1>, i32) #0 563 declare <512 x i1> @llvm.hexagon.V6.vandvrt.acc(<512 x i1>, <16 x i32>, i32) #0 564 declare <16 x i32> @llvm.hexagon.V6.vandqrt(<512 x i1>, i32) #0 565 declare <512 x i1> @llvm.hexagon.V6.vandvrt(<16 x i32>, i32) #0 566 declare i64 @llvm.hexagon.S6.rol.i.p(i64, i32) #0 567 declare i64 @llvm.hexagon.S6.rol.i.p.acc(i64, i64, i32) #0 568 declare i64 @llvm.hexagon.S6.rol.i.p.and(i64, i64, i32) #0 569 declare i64 @llvm.hexagon.S6.rol.i.p.nac(i64, i64, i32) #0 570 declare i64 @llvm.hexagon.S6.rol.i.p.or(i64, i64, i32) #0 571 declare i64 @llvm.hexagon.S6.rol.i.p.xacc(i64, i64, i32) #0 572 declare i32 @llvm.hexagon.S6.rol.i.r(i32, i32) #0 573 declare i32 @llvm.hexagon.S6.rol.i.r.acc(i32, i32, i32) #0 574 declare i32 @llvm.hexagon.S6.rol.i.r.and(i32, i32, i32) #0 575 declare i32 @llvm.hexagon.S6.rol.i.r.nac(i32, i32, i32) #0 576 declare i32 @llvm.hexagon.S6.rol.i.r.or(i32, i32, i32) #0 577 declare i32 @llvm.hexagon.S6.rol.i.r.xacc(i32, i32, i32) #0 578 declare i32 @llvm.hexagon.V6.extractw(<16 x i32>, i32) #0 579 declare <16 x i32> @llvm.hexagon.V6.lvsplatw(i32) #0 580 declare <512 x i1> @llvm.hexagon.V6.pred.scalar2(i32) #0 581 declare <16 x i32> @llvm.hexagon.V6.vlutvvb(<16 x i32>, <16 x i32>, i32) #0 582 declare <32 x i32> @llvm.hexagon.V6.vlutvwh(<16 x i32>, <16 x i32>, i32) #0 583 declare <16 x i32> @llvm.hexagon.V6.vlutvvb.oracc(<16 x i32>, <16 x i32>, <16 x i32>, i32) #0 584 declare <32 x i32> @llvm.hexagon.V6.vlutvwh.oracc(<32 x i32>, <16 x i32>, <16 x i32>, i32) #0 585 declare <16 x i32> @llvm.hexagon.V6.vinsertwr(<16 x i32>, i32) #0 586 587 attributes #0 = { nounwind readnone "target-cpu"="hexagonv60" "target-features"="+hvxv60,+hvx-length64b" } 588