1; RUN: llc -O1 -mtriple=armv6-none-none-eabi %s -o - | FileCheck %s 2; RUN: llc -O1 -mtriple=armv7-none-none-eabi %s -o - | FileCheck %s 3; RUN: llc -O1 -mtriple=thumbv7-none-none-eabi %s -o - | FileCheck %s 4; RUN: llc -O1 -mtriple=thumbv6t2-none-none-eabi %s -o - | FileCheck %s 5; RUN: llc -O1 -mtriple=thumbv7em-none-none-eabi %s -o - | FileCheck %s 6; RUN: llc -O1 -mtriple=thumbv8m.main-none-none-eabi -mattr=+dsp %s -o - | FileCheck %s 7 8 9; upper-bound of the immediate argument 10define i32 @ssat1(i32 %a) nounwind { 11; CHECK-LABEL: ssat1 12; CHECK: ssat r0, #32, r0 13 %tmp = call i32 @llvm.arm.ssat(i32 %a, i32 32) 14 ret i32 %tmp 15} 16 17; lower-bound of the immediate argument 18define i32 @ssat2(i32 %a) nounwind { 19; CHECK-LABEL: ssat2 20; CHECK: ssat r0, #1, r0 21 %tmp = call i32 @llvm.arm.ssat(i32 %a, i32 1) 22 ret i32 %tmp 23} 24 25; upper-bound of the immediate argument 26define i32 @usat1(i32 %a) nounwind { 27; CHECK-LABEL: usat1 28; CHECK: usat r0, #31, r0 29 %tmp = call i32 @llvm.arm.usat(i32 %a, i32 31) 30 ret i32 %tmp 31} 32 33; lower-bound of the immediate argument 34define i32 @usat2(i32 %a) nounwind { 35; CHECK-LABEL: usat2 36; CHECK: usat r0, #0, r0 37 %tmp = call i32 @llvm.arm.usat(i32 %a, i32 0) 38 ret i32 %tmp 39} 40 41define i32 @ssat16 (i32 %a) nounwind { 42; CHECK-LABEL: ssat16 43; CHECK: ssat16 r0, #1, r0 44; CHECK: ssat16 r0, #16, r0 45 %tmp = call i32 @llvm.arm.ssat16(i32 %a, i32 1) 46 %tmp2 = call i32 @llvm.arm.ssat16(i32 %tmp, i32 16) 47 ret i32 %tmp2 48} 49 50define i32 @usat16(i32 %a) nounwind { 51; CHECK-LABEL: usat16 52; CHECK: usat16 r0, #0, r0 53; CHECK: usat16 r0, #15, r0 54 %tmp = call i32 @llvm.arm.usat16(i32 %a, i32 0) 55 %tmp2 = call i32 @llvm.arm.usat16(i32 %tmp, i32 15) 56 ret i32 %tmp2 57} 58 59define i32 @pack_unpack(i32 %a, i32 %b) nounwind { 60; CHECK-LABEL: pack_unpack 61; CHECK: sxtab16 r0, r0, r1 62; CHECK: sxtb16 r0, r0 63; CHECK: uxtab16 r0, r1, r0 64; CHECK: uxtb16 r0, r0 65 %tmp = call i32 @llvm.arm.sxtab16(i32 %a, i32 %b) 66 %tmp1 = call i32 @llvm.arm.sxtb16(i32 %tmp) 67 %tmp2 = call i32 @llvm.arm.uxtab16(i32 %b, i32 %tmp1) 68 %tmp3 = call i32 @llvm.arm.uxtb16(i32 %tmp2) 69 ret i32 %tmp3 70} 71 72define i32 @sel(i32 %a, i32 %b) nounwind { 73; CHECK-LABEL: sel 74; CHECK: sel r0, r0, r1 75 %tmp = call i32 @llvm.arm.sel(i32 %a, i32 %b) 76 ret i32 %tmp 77} 78 79define i32 @qadd8(i32 %a, i32 %b) nounwind { 80; CHECK-LABEL: qadd8 81; CHECK: qadd8 r0, r0, r1 82 %tmp = call i32 @llvm.arm.qadd8(i32 %a, i32 %b) 83 ret i32 %tmp 84} 85 86define i32 @qsub8(i32 %a, i32 %b) nounwind { 87; CHECK-LABEL: qsub8 88; CHECK: qsub8 r0, r0, r1 89 %tmp = call i32 @llvm.arm.qsub8(i32 %a, i32 %b) 90 ret i32 %tmp 91} 92 93define i32 @sadd8(i32 %a, i32 %b) nounwind { 94; CHECK-LABEL: sadd8 95; CHECK: sadd8 r0, r0, r1 96 %tmp = call i32 @llvm.arm.sadd8(i32 %a, i32 %b) 97 ret i32 %tmp 98} 99 100define i32 @shadd8(i32 %a, i32 %b) nounwind { 101; CHECK-LABEL: shadd8 102; CHECK: shadd8 r0, r0, r1 103 %tmp = call i32 @llvm.arm.shadd8(i32 %a, i32 %b) 104 ret i32 %tmp 105} 106 107define i32 @shsub8(i32 %a, i32 %b) nounwind { 108; CHECK-LABEL: shsub8 109; CHECK: shsub8 r0, r0, r1 110 %tmp = call i32 @llvm.arm.shsub8(i32 %a, i32 %b) 111 ret i32 %tmp 112} 113 114define i32 @ssub8(i32 %a, i32 %b) nounwind { 115; CHECK-LABEL: ssub8 116; CHECK: ssub8 r0, r0, r1 117 %tmp = call i32 @llvm.arm.ssub8(i32 %a, i32 %b) 118 ret i32 %tmp 119} 120 121define i32 @uadd8(i32 %a, i32 %b) nounwind { 122; CHECK-LABEL: uadd8 123; CHECK: uadd8 r0, r0, r1 124 %tmp = call i32 @llvm.arm.uadd8(i32 %a, i32 %b) 125 ret i32 %tmp 126} 127 128define i32 @uhadd8(i32 %a, i32 %b) nounwind { 129; CHECK-LABEL: uhadd8 130; CHECK: uhadd8 r0, r0, r1 131 %tmp = call i32 @llvm.arm.uhadd8(i32 %a, i32 %b) 132 ret i32 %tmp 133} 134 135define i32 @uhsub8(i32 %a, i32 %b) nounwind { 136; CHECK-LABEL: uhsub8 137; CHECK: uhsub8 r0, r0, r1 138 %tmp = call i32 @llvm.arm.uhsub8(i32 %a, i32 %b) 139 ret i32 %tmp 140} 141 142define i32 @uqadd8(i32 %a, i32 %b) nounwind { 143; CHECK-LABEL: uqadd8 144; CHECK: uqadd8 r0, r0, r1 145 %tmp = call i32 @llvm.arm.uqadd8(i32 %a, i32 %b) 146 ret i32 %tmp 147} 148 149define i32 @uqsub8(i32 %a, i32 %b) nounwind { 150; CHECK-LABEL: uqsub8 151; CHECK: uqsub8 r0, r0, r1 152 %tmp = call i32 @llvm.arm.uqsub8(i32 %a, i32 %b) 153 ret i32 %tmp 154} 155 156define i32 @usub8(i32 %a, i32 %b) nounwind { 157; CHECK-LABEL: usub8 158; CHECK: usub8 r0, r0, r1 159 %tmp = call i32 @llvm.arm.usub8(i32 %a, i32 %b) 160 ret i32 %tmp 161} 162 163define i32 @usad(i32 %a, i32 %b, i32 %c) nounwind { 164; CHECK-LABEL: usad 165; CHECK: usad8 r0, r0, r1 166; CHECK: usada8 r0, r0, r1, r2 167 %tmp = call i32 @llvm.arm.usad8(i32 %a, i32 %b) 168 %tmp1 = call i32 @llvm.arm.usada8(i32 %tmp, i32 %b, i32 %c) 169 ret i32 %tmp1 170} 171 172define i32 @qadd16(i32 %a, i32 %b) nounwind { 173; CHECK-LABEL: qadd16 174; CHECK: qadd16 r0, r0, r1 175 %tmp = call i32 @llvm.arm.qadd16(i32 %a, i32 %b) 176 ret i32 %tmp 177} 178 179define i32 @qasx(i32 %a, i32 %b) nounwind { 180; CHECK-LABEL: qasx 181; CHECK: qasx r0, r0, r1 182 %tmp = call i32 @llvm.arm.qasx(i32 %a, i32 %b) 183 ret i32 %tmp 184} 185 186define i32 @qsax(i32 %a, i32 %b) nounwind { 187; CHECK-LABEL: qsax 188; CHECK: qsax r0, r0, r1 189 %tmp = call i32 @llvm.arm.qsax(i32 %a, i32 %b) 190 ret i32 %tmp 191} 192 193define i32 @qsub16(i32 %a, i32 %b) nounwind { 194; CHECK-LABEL: qsub16 195; CHECK: qsub16 r0, r0, r1 196 %tmp = call i32 @llvm.arm.qsub16(i32 %a, i32 %b) 197 ret i32 %tmp 198} 199 200define i32 @sadd16(i32 %a, i32 %b) nounwind { 201; CHECK-LABEL: sadd16 202; CHECK: sadd16 r0, r0, r1 203 %tmp = call i32 @llvm.arm.sadd16(i32 %a, i32 %b) 204 ret i32 %tmp 205} 206 207define i32 @sasx(i32 %a, i32 %b) nounwind { 208; CHECK-LABEL: sasx 209; CHECK: sasx r0, r0, r1 210 %tmp = call i32 @llvm.arm.sasx(i32 %a, i32 %b) 211 ret i32 %tmp 212} 213 214define i32 @shadd16(i32 %a, i32 %b) nounwind { 215; CHECK-LABEL: shadd16 216; CHECK: shadd16 r0, r0, r1 217 %tmp = call i32 @llvm.arm.shadd16(i32 %a, i32 %b) 218 ret i32 %tmp 219} 220 221define i32 @shasx(i32 %a, i32 %b) nounwind { 222; CHECK-LABEL: shasx 223; CHECK: shasx r0, r0, r1 224 %tmp = call i32 @llvm.arm.shasx(i32 %a, i32 %b) 225 ret i32 %tmp 226} 227 228define i32 @shsax(i32 %a, i32 %b) nounwind { 229; CHECK-LABEL: shsax 230; CHECK: shsax r0, r0, r1 231 %tmp = call i32 @llvm.arm.shsax(i32 %a, i32 %b) 232 ret i32 %tmp 233} 234 235define i32 @shsub16(i32 %a, i32 %b) nounwind { 236; CHECK-LABEL: shsub16 237; CHECK: shsub16 r0, r0, r1 238 %tmp = call i32 @llvm.arm.shsub16(i32 %a, i32 %b) 239 ret i32 %tmp 240} 241 242define i32 @ssax(i32 %a, i32 %b) nounwind { 243; CHECK-LABEL: ssax 244; CHECK: ssax r0, r0, r1 245 %tmp = call i32 @llvm.arm.ssax(i32 %a, i32 %b) 246 ret i32 %tmp 247} 248 249define i32 @ssub16(i32 %a, i32 %b) nounwind { 250; CHECK-LABEL: ssub16 251; CHECK: ssub16 r0, r0, r1 252 %tmp = call i32 @llvm.arm.ssub16(i32 %a, i32 %b) 253 ret i32 %tmp 254} 255 256define i32 @uadd16(i32 %a, i32 %b) nounwind { 257; CHECK-LABEL: uadd16 258; CHECK: uadd16 r0, r0, r1 259 %tmp = call i32 @llvm.arm.uadd16(i32 %a, i32 %b) 260 ret i32 %tmp 261} 262 263define i32 @uasx(i32 %a, i32 %b) nounwind { 264; CHECK-LABEL: uasx 265; CHECK: uasx r0, r0, r1 266 %tmp = call i32 @llvm.arm.uasx(i32 %a, i32 %b) 267 ret i32 %tmp 268} 269 270define i32 @uhadd16(i32 %a, i32 %b) nounwind { 271; CHECK-LABEL: uhadd16 272; CHECK: uhadd16 r0, r0, r1 273 %tmp = call i32 @llvm.arm.uhadd16(i32 %a, i32 %b) 274 ret i32 %tmp 275} 276 277define i32 @uhasx(i32 %a, i32 %b) nounwind { 278; CHECK-LABEL: uhasx 279; CHECK: uhasx r0, r0, r1 280 %tmp = call i32 @llvm.arm.uhasx(i32 %a, i32 %b) 281 ret i32 %tmp 282} 283 284define i32 @uhsax(i32 %a, i32 %b) nounwind { 285; CHECK-LABEL: uhsax 286; CHECK: uhsax r0, r0, r1 287 %tmp = call i32 @llvm.arm.uhsax(i32 %a, i32 %b) 288 ret i32 %tmp 289} 290 291define i32 @uhsub16(i32 %a, i32 %b) nounwind { 292; CHECK-LABEL: uhsub16 293; CHECK: uhsub16 r0, r0, r1 294 %tmp = call i32 @llvm.arm.uhsub16(i32 %a, i32 %b) 295 ret i32 %tmp 296} 297 298define i32 @uqadd16(i32 %a, i32 %b) nounwind { 299; CHECK-LABEL: uqadd16 300; CHECK: uqadd16 r0, r0, r1 301 %tmp = call i32 @llvm.arm.uqadd16(i32 %a, i32 %b) 302 ret i32 %tmp 303} 304 305define i32 @uqasx(i32 %a, i32 %b) nounwind { 306; CHECK-LABEL: uqasx 307; CHECK: uqasx r0, r0, r1 308 %tmp = call i32 @llvm.arm.uqasx(i32 %a, i32 %b) 309 ret i32 %tmp 310} 311 312define i32 @uqsax(i32 %a, i32 %b) nounwind { 313; CHECK-LABEL: uqsax 314; CHECK: uqsax r0, r0, r1 315 %tmp = call i32 @llvm.arm.uqsax(i32 %a, i32 %b) 316 ret i32 %tmp 317} 318 319define i32 @uqsub16(i32 %a, i32 %b) nounwind { 320; CHECK-LABEL: uqsub16 321; CHECK: uqsub16 r0, r0, r1 322 %tmp = call i32 @llvm.arm.uqsub16(i32 %a, i32 %b) 323 ret i32 %tmp 324} 325 326define i32 @usax(i32 %a, i32 %b) nounwind { 327; CHECK-LABEL: usax 328; CHECK: usax r0, r0, r1 329 %tmp = call i32 @llvm.arm.usax(i32 %a, i32 %b) 330 ret i32 %tmp 331} 332 333define i32 @usub16(i32 %a, i32 %b) nounwind { 334; CHECK-LABEL: usub16 335; CHECK: usub16 r0, r0, r1 336 %tmp = call i32 @llvm.arm.usub16(i32 %a, i32 %b) 337 ret i32 %tmp 338} 339 340define i32 @smlad(i32 %a, i32 %b, i32 %c) nounwind { 341; CHECK-LABEL: smlad 342; CHECK: smlad r0, r0, r1, r2 343 %tmp = call i32 @llvm.arm.smlad(i32 %a, i32 %b, i32 %c) 344 ret i32 %tmp 345} 346 347define i32 @smladx(i32 %a, i32 %b, i32 %c) nounwind { 348; CHECK-LABEL: smladx 349; CHECK: smladx r0, r0, r1, r2 350 %tmp = call i32 @llvm.arm.smladx(i32 %a, i32 %b, i32 %c) 351 ret i32 %tmp 352} 353 354define i64 @smlald(i32 %a, i32 %b, i64 %c) nounwind { 355; CHECK-LABEL: smlald 356; CHECK: smlald r2, r3, r0, r1 357 %tmp = call i64 @llvm.arm.smlald(i32 %a, i32 %b, i64 %c) 358 ret i64 %tmp 359} 360 361define i64 @smlaldx(i32 %a, i32 %b, i64 %c) nounwind { 362; CHECK-LABEL: smlaldx 363; CHECK: smlaldx r2, r3, r0, r1 364 %tmp = call i64 @llvm.arm.smlaldx(i32 %a, i32 %b, i64 %c) 365 ret i64 %tmp 366} 367 368define i32 @smlsd(i32 %a, i32 %b, i32 %c) nounwind { 369; CHECK-LABEL: smlsd 370; CHECK: smlsd r0, r0, r1, r2 371 %tmp = call i32 @llvm.arm.smlsd(i32 %a, i32 %b, i32 %c) 372 ret i32 %tmp 373} 374 375define i32 @smlsdx(i32 %a, i32 %b, i32 %c) nounwind { 376; CHECK-LABEL: smlsdx 377; CHECK: smlsdx r0, r0, r1, r2 378 %tmp = call i32 @llvm.arm.smlsdx(i32 %a, i32 %b, i32 %c) 379 ret i32 %tmp 380} 381 382define i64 @smlsld(i32 %a, i32 %b, i64 %c) nounwind { 383; CHECK-LABEL: smlsld 384; CHECK: smlsld r2, r3, r0, r1 385 %tmp = call i64 @llvm.arm.smlsld(i32 %a, i32 %b, i64 %c) 386 ret i64 %tmp 387} 388 389define i64 @smlsldx(i32 %a, i32 %b, i64 %c) nounwind { 390; CHECK-LABEL: smlsldx 391; CHECK: smlsldx r2, r3, r0, r1 392 %tmp = call i64 @llvm.arm.smlsldx(i32 %a, i32 %b, i64 %c) 393 ret i64 %tmp 394} 395 396define i32 @smuad(i32 %a, i32 %b) nounwind { 397; CHECK-LABEL: smuad 398; CHECK: smuad r0, r0, r1 399 %tmp = call i32 @llvm.arm.smuad(i32 %a, i32 %b) 400 ret i32 %tmp 401} 402 403define i32 @smuadx(i32 %a, i32 %b) nounwind { 404;CHECK-LABEL: smuadx 405; CHECK: smuadx r0, r0, r1 406 %tmp = call i32 @llvm.arm.smuadx(i32 %a, i32 %b) 407 ret i32 %tmp 408} 409 410define i32 @smusd(i32 %a, i32 %b) nounwind { 411; CHECK-LABEL: smusd 412; CHECK: smusd r0, r0, r1 413 %tmp = call i32 @llvm.arm.smusd(i32 %a, i32 %b) 414 ret i32 %tmp 415} 416 417define i32 @smusdx(i32 %a, i32 %b) nounwind { 418; CHECK-LABEL: smusdx 419; CHECK: smusdx r0, r0, r1 420 %tmp = call i32 @llvm.arm.smusdx(i32 %a, i32 %b) 421 ret i32 %tmp 422} 423declare i32 @llvm.arm.ssat(i32, i32) nounwind readnone 424declare i32 @llvm.arm.usat(i32, i32) nounwind readnone 425declare i32 @llvm.arm.ssat16(i32, i32) nounwind 426declare i32 @llvm.arm.usat16(i32, i32) nounwind 427declare i32 @llvm.arm.sxtab16(i32, i32) 428declare i32 @llvm.arm.sxtb16(i32) 429declare i32 @llvm.arm.uxtab16(i32, i32) 430declare i32 @llvm.arm.uxtb16(i32) 431declare i32 @llvm.arm.sel(i32, i32) nounwind 432declare i32 @llvm.arm.qadd8(i32, i32) nounwind 433declare i32 @llvm.arm.qsub8(i32, i32) nounwind 434declare i32 @llvm.arm.sadd8(i32, i32) nounwind 435declare i32 @llvm.arm.shadd8(i32, i32) nounwind 436declare i32 @llvm.arm.shsub8(i32, i32) nounwind 437declare i32 @llvm.arm.ssub8(i32, i32) nounwind 438declare i32 @llvm.arm.uadd8(i32, i32) nounwind 439declare i32 @llvm.arm.uhadd8(i32, i32) nounwind 440declare i32 @llvm.arm.uhsub8(i32, i32) nounwind 441declare i32 @llvm.arm.uqadd8(i32, i32) nounwind 442declare i32 @llvm.arm.uqsub8(i32, i32) nounwind 443declare i32 @llvm.arm.usub8(i32, i32) nounwind 444declare i32 @llvm.arm.usad8(i32, i32) nounwind readnone 445declare i32 @llvm.arm.usada8(i32, i32, i32) nounwind readnone 446declare i32 @llvm.arm.qadd16(i32, i32) nounwind 447declare i32 @llvm.arm.qasx(i32, i32) nounwind 448declare i32 @llvm.arm.qsax(i32, i32) nounwind 449declare i32 @llvm.arm.qsub16(i32, i32) nounwind 450declare i32 @llvm.arm.sadd16(i32, i32) nounwind 451declare i32 @llvm.arm.sasx(i32, i32) nounwind 452declare i32 @llvm.arm.shadd16(i32, i32) nounwind 453declare i32 @llvm.arm.shasx(i32, i32) nounwind 454declare i32 @llvm.arm.shsax(i32, i32) nounwind 455declare i32 @llvm.arm.shsub16(i32, i32) nounwind 456declare i32 @llvm.arm.ssax(i32, i32) nounwind 457declare i32 @llvm.arm.ssub16(i32, i32) nounwind 458declare i32 @llvm.arm.uadd16(i32, i32) nounwind 459declare i32 @llvm.arm.uasx(i32, i32) nounwind 460declare i32 @llvm.arm.usax(i32, i32) nounwind 461declare i32 @llvm.arm.uhadd16(i32, i32) nounwind 462declare i32 @llvm.arm.uhasx(i32, i32) nounwind 463declare i32 @llvm.arm.uhsax(i32, i32) nounwind 464declare i32 @llvm.arm.uhsub16(i32, i32) nounwind 465declare i32 @llvm.arm.uqadd16(i32, i32) nounwind 466declare i32 @llvm.arm.uqasx(i32, i32) nounwind 467declare i32 @llvm.arm.uqsax(i32, i32) nounwind 468declare i32 @llvm.arm.uqsub16(i32, i32) nounwind 469declare i32 @llvm.arm.usub16(i32, i32) nounwind 470declare i32 @llvm.arm.smlad(i32, i32, i32) nounwind 471declare i32 @llvm.arm.smladx(i32, i32, i32) nounwind 472declare i64 @llvm.arm.smlald(i32, i32, i64) nounwind 473declare i64 @llvm.arm.smlaldx(i32, i32, i64) nounwind 474declare i32 @llvm.arm.smlsd(i32, i32, i32) nounwind 475declare i32 @llvm.arm.smlsdx(i32, i32, i32) nounwind 476declare i64 @llvm.arm.smlsld(i32, i32, i64) nounwind 477declare i64 @llvm.arm.smlsldx(i32, i32, i64) nounwind 478declare i32 @llvm.arm.smuad(i32, i32) nounwind 479declare i32 @llvm.arm.smuadx(i32, i32) nounwind 480declare i32 @llvm.arm.smusd(i32, i32) nounwind 481declare i32 @llvm.arm.smusdx(i32, i32) nounwind 482