1# RUN: llvm-mc -triple=hexagon -filetype=obj -o - %s | llvm-objdump -d - | FileCheck %s 2# Hexagon Programmer's Reference Manual 11.10.5 XTYPE/MPY 3 4# Multiply and use lower result 5# CHECK: b1 df 35 d7 6r17 = add(#21, mpyi(r21, r31)) 7# CHECK: bf d1 35 d8 8r17 = add(#21, mpyi(r21, #31)) 9# CHECK: b5 d1 3f df 10r17 = add(r21, mpyi(#84, r31)) 11# CHECK: f5 f1 b5 df 12r17 = add(r21, mpyi(r21, #31)) 13# CHECK: 15 d1 1f e3 14r17 = add(r21, mpyi(r17, r31)) 15# CHECK: f1 c3 15 e0 16r17 =+ mpyi(r21, #31) 17# CHECK: f1 c3 95 e0 18r17 =- mpyi(r21, #31) 19# CHECK: f1 c3 15 e1 20r17 += mpyi(r21, #31) 21# CHECK: f1 c3 95 e1 22r17 -= mpyi(r21, #31) 23# CHECK: 11 df 15 ed 24r17 = mpyi(r21, r31) 25# CHECK: 11 df 15 ef 26r17 += mpyi(r21, r31) 27 28# Vector multiply word by signed half (32x16) 29# CHECK: b0 de 14 e8 30r17:16 = vmpyweh(r21:20, r31:30):sat 31# CHECK: b0 de 94 e8 32r17:16 = vmpyweh(r21:20, r31:30):<<1:sat 33# CHECK: f0 de 14 e8 34r17:16 = vmpywoh(r21:20, r31:30):sat 35# CHECK: f0 de 94 e8 36r17:16 = vmpywoh(r21:20, r31:30):<<1:sat 37# CHECK: b0 de 34 e8 38r17:16 = vmpyweh(r21:20, r31:30):rnd:sat 39# CHECK: b0 de b4 e8 40r17:16 = vmpyweh(r21:20, r31:30):<<1:rnd:sat 41# CHECK: f0 de 34 e8 42r17:16 = vmpywoh(r21:20, r31:30):rnd:sat 43# CHECK: f0 de b4 e8 44r17:16 = vmpywoh(r21:20, r31:30):<<1:rnd:sat 45# CHECK: b0 de 14 ea 46r17:16 += vmpyweh(r21:20, r31:30):sat 47# CHECK: b0 de 94 ea 48r17:16 += vmpyweh(r21:20, r31:30):<<1:sat 49# CHECK: f0 de 14 ea 50r17:16 += vmpywoh(r21:20, r31:30):sat 51# CHECK: f0 de 94 ea 52r17:16 += vmpywoh(r21:20, r31:30):<<1:sat 53# CHECK: b0 de 34 ea 54r17:16 += vmpyweh(r21:20, r31:30):rnd:sat 55# CHECK: b0 de b4 ea 56r17:16 += vmpyweh(r21:20, r31:30):<<1:rnd:sat 57# CHECK: f0 de 34 ea 58r17:16 += vmpywoh(r21:20, r31:30):rnd:sat 59# CHECK: f0 de b4 ea 60r17:16 += vmpywoh(r21:20, r31:30):<<1:rnd:sat 61 62# Vector multiply word by unsigned half (32x16) 63# CHECK: b0 de 54 e8 64r17:16 = vmpyweuh(r21:20, r31:30):sat 65# CHECK: b0 de d4 e8 66r17:16 = vmpyweuh(r21:20, r31:30):<<1:sat 67# CHECK: f0 de 54 e8 68r17:16 = vmpywouh(r21:20, r31:30):sat 69# CHECK: f0 de d4 e8 70r17:16 = vmpywouh(r21:20, r31:30):<<1:sat 71# CHECK: b0 de 74 e8 72r17:16 = vmpyweuh(r21:20, r31:30):rnd:sat 73# CHECK: b0 de f4 e8 74r17:16 = vmpyweuh(r21:20, r31:30):<<1:rnd:sat 75# CHECK: f0 de 74 e8 76r17:16 = vmpywouh(r21:20, r31:30):rnd:sat 77# CHECK: f0 de f4 e8 78r17:16 = vmpywouh(r21:20, r31:30):<<1:rnd:sat 79# CHECK: b0 de 54 ea 80r17:16 += vmpyweuh(r21:20, r31:30):sat 81# CHECK: b0 de d4 ea 82r17:16 += vmpyweuh(r21:20, r31:30):<<1:sat 83# CHECK: f0 de 54 ea 84r17:16 += vmpywouh(r21:20, r31:30):sat 85# CHECK: f0 de d4 ea 86r17:16 += vmpywouh(r21:20, r31:30):<<1:sat 87# CHECK: b0 de 74 ea 88r17:16 += vmpyweuh(r21:20, r31:30):rnd:sat 89# CHECK: b0 de f4 ea 90r17:16 += vmpyweuh(r21:20, r31:30):<<1:rnd:sat 91# CHECK: f0 de 74 ea 92r17:16 += vmpywouh(r21:20, r31:30):rnd:sat 93# CHECK: f0 de f4 ea 94r17:16 += vmpywouh(r21:20, r31:30):<<1:rnd:sat 95 96# Multiply signed halfwords 97# CHECK: 10 df 95 e4 98r17:16 = mpy(r21.l, r31.l):<<1 99# CHECK: 30 df 95 e4 100r17:16 = mpy(r21.l, r31.h):<<1 101# CHECK: 50 df 95 e4 102r17:16 = mpy(r21.h, r31.l):<<1 103# CHECK: 70 df 95 e4 104r17:16 = mpy(r21.h, r31.h):<<1 105# CHECK: 10 df b5 e4 106r17:16 = mpy(r21.l, r31.l):<<1:rnd 107# CHECK: 30 df b5 e4 108r17:16 = mpy(r21.l, r31.h):<<1:rnd 109# CHECK: 50 df b5 e4 110r17:16 = mpy(r21.h, r31.l):<<1:rnd 111# CHECK: 70 df b5 e4 112r17:16 = mpy(r21.h, r31.h):<<1:rnd 113# CHECK: 10 df 95 e6 114r17:16 += mpy(r21.l, r31.l):<<1 115# CHECK: 30 df 95 e6 116r17:16 += mpy(r21.l, r31.h):<<1 117# CHECK: 50 df 95 e6 118r17:16 += mpy(r21.h, r31.l):<<1 119# CHECK: 70 df 95 e6 120r17:16 += mpy(r21.h, r31.h):<<1 121# CHECK: 10 df b5 e6 122r17:16 -= mpy(r21.l, r31.l):<<1 123# CHECK: 30 df b5 e6 124r17:16 -= mpy(r21.l, r31.h):<<1 125# CHECK: 50 df b5 e6 126r17:16 -= mpy(r21.h, r31.l):<<1 127# CHECK: 70 df b5 e6 128r17:16 -= mpy(r21.h, r31.h):<<1 129# CHECK: 11 df 95 ec 130r17 = mpy(r21.l, r31.l):<<1 131# CHECK: 31 df 95 ec 132r17 = mpy(r21.l, r31.h):<<1 133# CHECK: 51 df 95 ec 134r17 = mpy(r21.h, r31.l):<<1 135# CHECK: 71 df 95 ec 136r17 = mpy(r21.h, r31.h):<<1 137# CHECK: 91 df 95 ec 138r17 = mpy(r21.l, r31.l):<<1:sat 139# CHECK: b1 df 95 ec 140r17 = mpy(r21.l, r31.h):<<1:sat 141# CHECK: d1 df 95 ec 142r17 = mpy(r21.h, r31.l):<<1:sat 143# CHECK: f1 df 95 ec 144r17 = mpy(r21.h, r31.h):<<1:sat 145# CHECK: 11 df b5 ec 146r17 = mpy(r21.l, r31.l):<<1:rnd 147# CHECK: 31 df b5 ec 148r17 = mpy(r21.l, r31.h):<<1:rnd 149# CHECK: 51 df b5 ec 150r17 = mpy(r21.h, r31.l):<<1:rnd 151# CHECK: 71 df b5 ec 152r17 = mpy(r21.h, r31.h):<<1:rnd 153# CHECK: 91 df b5 ec 154r17 = mpy(r21.l, r31.l):<<1:rnd:sat 155# CHECK: b1 df b5 ec 156r17 = mpy(r21.l, r31.h):<<1:rnd:sat 157# CHECK: d1 df b5 ec 158r17 = mpy(r21.h, r31.l):<<1:rnd:sat 159# CHECK: f1 df b5 ec 160r17 = mpy(r21.h, r31.h):<<1:rnd:sat 161# CHECK: 11 df 95 ee 162r17 += mpy(r21.l, r31.l):<<1 163# CHECK: 31 df 95 ee 164r17 += mpy(r21.l, r31.h):<<1 165# CHECK: 51 df 95 ee 166r17 += mpy(r21.h, r31.l):<<1 167# CHECK: 71 df 95 ee 168r17 += mpy(r21.h, r31.h):<<1 169# CHECK: 91 df 95 ee 170r17 += mpy(r21.l, r31.l):<<1:sat 171# CHECK: b1 df 95 ee 172r17 += mpy(r21.l, r31.h):<<1:sat 173# CHECK: d1 df 95 ee 174r17 += mpy(r21.h, r31.l):<<1:sat 175# CHECK: f1 df 95 ee 176r17 += mpy(r21.h, r31.h):<<1:sat 177# CHECK: 11 df b5 ee 178r17 -= mpy(r21.l, r31.l):<<1 179# CHECK: 31 df b5 ee 180r17 -= mpy(r21.l, r31.h):<<1 181# CHECK: 51 df b5 ee 182r17 -= mpy(r21.h, r31.l):<<1 183# CHECK: 71 df b5 ee 184r17 -= mpy(r21.h, r31.h):<<1 185# CHECK: 91 df b5 ee 186r17 -= mpy(r21.l, r31.l):<<1:sat 187# CHECK: b1 df b5 ee 188r17 -= mpy(r21.l, r31.h):<<1:sat 189# CHECK: d1 df b5 ee 190r17 -= mpy(r21.h, r31.l):<<1:sat 191# CHECK: f1 df b5 ee 192r17 -= mpy(r21.h, r31.h):<<1:sat 193 194# Multiply unsigned halfwords 195# CHECK: 10 df d5 e4 196r17:16 = mpyu(r21.l, r31.l):<<1 197# CHECK: 30 df d5 e4 198r17:16 = mpyu(r21.l, r31.h):<<1 199# CHECK: 50 df d5 e4 200r17:16 = mpyu(r21.h, r31.l):<<1 201# CHECK: 70 df d5 e4 202r17:16 = mpyu(r21.h, r31.h):<<1 203# CHECK: 10 df d5 e6 204r17:16 += mpyu(r21.l, r31.l):<<1 205# CHECK: 30 df d5 e6 206r17:16 += mpyu(r21.l, r31.h):<<1 207# CHECK: 50 df d5 e6 208r17:16 += mpyu(r21.h, r31.l):<<1 209# CHECK: 70 df d5 e6 210r17:16 += mpyu(r21.h, r31.h):<<1 211# CHECK: 10 df f5 e6 212r17:16 -= mpyu(r21.l, r31.l):<<1 213# CHECK: 30 df f5 e6 214r17:16 -= mpyu(r21.l, r31.h):<<1 215# CHECK: 50 df f5 e6 216r17:16 -= mpyu(r21.h, r31.l):<<1 217# CHECK: 70 df f5 e6 218r17:16 -= mpyu(r21.h, r31.h):<<1 219# CHECK: 11 df d5 ec 220r17 = mpyu(r21.l, r31.l):<<1 221# CHECK: 31 df d5 ec 222r17 = mpyu(r21.l, r31.h):<<1 223# CHECK: 51 df d5 ec 224r17 = mpyu(r21.h, r31.l):<<1 225# CHECK: 71 df d5 ec 226r17 = mpyu(r21.h, r31.h):<<1 227# CHECK: 11 df d5 ee 228r17 += mpyu(r21.l, r31.l):<<1 229# CHECK: 31 df d5 ee 230r17 += mpyu(r21.l, r31.h):<<1 231# CHECK: 51 df d5 ee 232r17 += mpyu(r21.h, r31.l):<<1 233# CHECK: 71 df d5 ee 234r17 += mpyu(r21.h, r31.h):<<1 235# CHECK: 11 df f5 ee 236r17 -= mpyu(r21.l, r31.l):<<1 237# CHECK: 31 df f5 ee 238r17 -= mpyu(r21.l, r31.h):<<1 239# CHECK: 51 df f5 ee 240r17 -= mpyu(r21.h, r31.l):<<1 241# CHECK: 71 df f5 ee 242r17 -= mpyu(r21.h, r31.h):<<1 243 244# Polynomial multiply words 245# CHECK: f0 df 55 e5 246r17:16 = pmpyw(r21, r31) 247# CHECK: f0 df 35 e7 248r17:16 ^= pmpyw(r21, r31) 249 250# Vector reduce multiply word by signed half (32x16) 251# CHECK: 50 de 34 e8 252r17:16 = vrmpywoh(r21:20, r31:30) 253# CHECK: 50 de b4 e8 254r17:16 = vrmpywoh(r21:20, r31:30):<<1 255# CHECK: 90 de 54 e8 256r17:16 = vrmpyweh(r21:20, r31:30) 257# CHECK: 90 de d4 e8 258r17:16 = vrmpyweh(r21:20, r31:30):<<1 259# CHECK: d0 de 74 ea 260r17:16 += vrmpywoh(r21:20, r31:30) 261# CHECK: d0 de f4 ea 262r17:16 += vrmpywoh(r21:20, r31:30):<<1 263# CHECK: d0 de 34 ea 264r17:16 += vrmpyweh(r21:20, r31:30) 265# CHECK: d0 de b4 ea 266r17:16 += vrmpyweh(r21:20, r31:30):<<1 267 268# Multiply and use upper result 269# CHECK: 31 df 15 ed 270r17 = mpy(r21, r31) 271# CHECK: 31 df 35 ed 272r17 = mpy(r21, r31):rnd 273# CHECK: 31 df 55 ed 274r17 = mpyu(r21, r31) 275# CHECK: 31 df 75 ed 276r17 = mpysu(r21, r31) 277# CHECK: 11 df b5 ed 278r17 = mpy(r21, r31.h):<<1:sat 279# CHECK: 31 df b5 ed 280r17 = mpy(r21, r31.l):<<1:sat 281# CHECK: 91 df b5 ed 282r17 = mpy(r21, r31.h):<<1:rnd:sat 283# CHECK: 11 df f5 ed 284r17 = mpy(r21, r31):<<1:sat 285# CHECK: 91 df f5 ed 286r17 = mpy(r21, r31.l):<<1:rnd:sat 287# CHECK: 51 df b5 ed 288r17 = mpy(r21, r31):<<1 289# CHECK: 11 df 75 ef 290r17 += mpy(r21, r31):<<1:sat 291# CHECK: 31 df 75 ef 292r17 -= mpy(r21, r31):<<1:sat 293 294# Multiply and use full result 295# CHECK: 10 df 15 e5 296r17:16 = mpy(r21, r31) 297# CHECK: 10 df 55 e5 298r17:16 = mpyu(r21, r31) 299# CHECK: 10 df 15 e7 300r17:16 += mpy(r21, r31) 301# CHECK: 10 df 35 e7 302r17:16 -= mpy(r21, r31) 303# CHECK: 10 df 55 e7 304r17:16 += mpyu(r21, r31) 305# CHECK: 10 df 75 e7 306r17:16 -= mpyu(r21, r31) 307 308# Vector dual multiply 309# CHECK: 90 de 14 e8 310r17:16 = vdmpy(r21:20, r31:30):sat 311# CHECK: 90 de 94 e8 312r17:16 = vdmpy(r21:20, r31:30):<<1:sat 313# CHECK: 90 de 14 ea 314r17:16 += vdmpy(r21:20, r31:30):sat 315# CHECK: 90 de 94 ea 316r17:16 += vdmpy(r21:20, r31:30):<<1:sat 317 318# Vector dual multiply with round and pack 319# CHECK: 11 de 14 e9 320r17 = vdmpy(r21:20, r31:30):rnd:sat 321# CHECK: 11 de 94 e9 322r17 = vdmpy(r21:20, r31:30):<<1:rnd:sat 323 324# Vector reduce multiply bytes 325# CHECK: 30 de 94 e8 326r17:16 = vrmpybu(r21:20, r31:30) 327# CHECK: 30 de d4 e8 328r17:16 = vrmpybsu(r21:20, r31:30) 329# CHECK: 30 de 94 ea 330r17:16 += vrmpybu(r21:20, r31:30) 331# CHECK: 30 de d4 ea 332r17:16 += vrmpybsu(r21:20, r31:30) 333 334# Vector dual multiply signed by unsigned bytes 335# CHECK: 30 de b4 e8 336r17:16 = vdmpybsu(r21:20, r31:30):sat 337# CHECK: 30 de 34 ea 338r17:16 += vdmpybsu(r21:20, r31:30):sat 339 340# Vector multiply even haldwords 341# CHECK: d0 de 14 e8 342r17:16 = vmpyeh(r21:20, r31:30):sat 343# CHECK: d0 de 94 e8 344r17:16 = vmpyeh(r21:20, r31:30):<<1:sat 345# CHECK: 50 de 34 ea 346r17:16 += vmpyeh(r21:20, r31:30) 347# CHECK: d0 de 14 ea 348r17:16 += vmpyeh(r21:20, r31:30):sat 349# CHECK: d0 de 94 ea 350r17:16 += vmpyeh(r21:20, r31:30):<<1:sat 351 352# Vector multiply halfwords 353# CHECK: b0 df 15 e5 354r17:16 = vmpyh(r21, r31):sat 355# CHECK: b0 df 95 e5 356r17:16 = vmpyh(r21, r31):<<1:sat 357# CHECK: 30 df 35 e7 358r17:16 += vmpyh(r21, r31) 359# CHECK: b0 df 15 e7 360r17:16 += vmpyh(r21, r31):sat 361# CHECK: b0 df 95 e7 362r17:16 += vmpyh(r21, r31):<<1:sat 363 364# Vector multiply halfwords with round and pack 365# CHECK: f1 df 35 ed 366r17 = vmpyh(r21, r31):rnd:sat 367# CHECK: f1 df b5 ed 368r17 = vmpyh(r21, r31):<<1:rnd:sat 369 370# Vector multiply halfwords signed by unsigned 371# CHECK: f0 df 15 e5 372r17:16 = vmpyhsu(r21, r31):sat 373# CHECK: f0 df 95 e5 374r17:16 = vmpyhsu(r21, r31):<<1:sat 375# CHECK: b0 df 75 e7 376r17:16 += vmpyhsu(r21, r31):sat 377# CHECK: b0 df f5 e7 378r17:16 += vmpyhsu(r21, r31):<<1:sat 379 380# Vector reduce multiply halfwords 381# CHECK: 50 de 14 e8 382r17:16 = vrmpyh(r21:20, r31:30) 383# CHECK: 50 de 14 ea 384r17:16 += vrmpyh(r21:20, r31:30) 385 386# Vector multiply bytes 387# CHECK: 30 df 55 e5 388r17:16 = vmpybsu(r21, r31) 389# CHECK: 30 df 95 e5 390r17:16 = vmpybu(r21, r31) 391# CHECK: 30 df 95 e7 392r17:16 += vmpybu(r21, r31) 393# CHECK: 30 df d5 e7 394r17:16 += vmpybsu(r21, r31) 395 396# Vector polynomial multiply halfwords 397# CHECK: f0 df d5 e5 398r17:16 = vpmpyh(r21, r31) 399# CHECK: f0 df b5 e7 400r17:16 ^= vpmpyh(r21, r31) 401