# RUN: llvm-mc -triple=hexagon -disassemble < %s | FileCheck %s # Hexagon Programmer's Reference Manual 11.10.5 XTYPE/MPY # Multiply and use lower result 0xb1 0xdf 0x35 0xd7 # CHECK: r17 = add(#21, mpyi(r21, r31)) 0xbf 0xd1 0x35 0xd8 # CHECK: r17 = add(#21, mpyi(r21, #31)) 0xb5 0xd1 0x3f 0xdf # CHECK: r17 = add(r21, mpyi(#84, r31)) 0xf5 0xf1 0xb5 0xdf # CHECK: r17 = add(r21, mpyi(r21, #31)) 0x15 0xd1 0x1f 0xe3 # CHECK: r17 = add(r21, mpyi(r17, r31)) 0xf1 0xc3 0x15 0xe0 # CHECK: r17 =+ mpyi(r21, #31) 0xf1 0xc3 0x95 0xe0 # CHECK: r17 =- mpyi(r21, #31) 0xf1 0xc3 0x15 0xe1 # CHECK: r17 += mpyi(r21, #31) 0xf1 0xc3 0x95 0xe1 # CHECK: r17 -= mpyi(r21, #31) 0x11 0xdf 0x15 0xed # CHECK: r17 = mpyi(r21, r31) 0x11 0xdf 0x15 0xef # CHECK: r17 += mpyi(r21, r31) # Vector multiply word by signed half (32x16) 0xb0 0xde 0x14 0xe8 # CHECK: r17:16 = vmpyweh(r21:20, r31:30):sat 0xb0 0xde 0x94 0xe8 # CHECK: r17:16 = vmpyweh(r21:20, r31:30):<<1:sat 0xf0 0xde 0x14 0xe8 # CHECK: r17:16 = vmpywoh(r21:20, r31:30):sat 0xf0 0xde 0x94 0xe8 # CHECK: r17:16 = vmpywoh(r21:20, r31:30):<<1:sat 0xb0 0xde 0x34 0xe8 # CHECK: r17:16 = vmpyweh(r21:20, r31:30):rnd:sat 0xb0 0xde 0xb4 0xe8 # CHECK: r17:16 = vmpyweh(r21:20, r31:30):<<1:rnd:sat 0xf0 0xde 0x34 0xe8 # CHECK: r17:16 = vmpywoh(r21:20, r31:30):rnd:sat 0xf0 0xde 0xb4 0xe8 # CHECK: r17:16 = vmpywoh(r21:20, r31:30):<<1:rnd:sat 0xb0 0xde 0x14 0xea # CHECK: r17:16 += vmpyweh(r21:20, r31:30):sat 0xb0 0xde 0x94 0xea # CHECK: r17:16 += vmpyweh(r21:20, r31:30):<<1:sat 0xf0 0xde 0x14 0xea # CHECK: r17:16 += vmpywoh(r21:20, r31:30):sat 0xf0 0xde 0x94 0xea # CHECK: r17:16 += vmpywoh(r21:20, r31:30):<<1:sat 0xb0 0xde 0x34 0xea # CHECK: r17:16 += vmpyweh(r21:20, r31:30):rnd:sat 0xb0 0xde 0xb4 0xea # CHECK: r17:16 += vmpyweh(r21:20, r31:30):<<1:rnd:sat 0xf0 0xde 0x34 0xea # CHECK: r17:16 += vmpywoh(r21:20, r31:30):rnd:sat 0xf0 0xde 0xb4 0xea # CHECK: r17:16 += vmpywoh(r21:20, r31:30):<<1:rnd:sat # Vector multiply word by unsigned half (32x16) 0xb0 0xde 0x54 0xe8 # CHECK: r17:16 = vmpyweuh(r21:20, r31:30):sat 0xb0 0xde 0xd4 0xe8 # CHECK: r17:16 = vmpyweuh(r21:20, r31:30):<<1:sat 0xf0 0xde 0x54 0xe8 # CHECK: r17:16 = vmpywouh(r21:20, r31:30):sat 0xf0 0xde 0xd4 0xe8 # CHECK: r17:16 = vmpywouh(r21:20, r31:30):<<1:sat 0xb0 0xde 0x74 0xe8 # CHECK: r17:16 = vmpyweuh(r21:20, r31:30):rnd:sat 0xb0 0xde 0xf4 0xe8 # CHECK: r17:16 = vmpyweuh(r21:20, r31:30):<<1:rnd:sat 0xf0 0xde 0x74 0xe8 # CHECK: r17:16 = vmpywouh(r21:20, r31:30):rnd:sat 0xf0 0xde 0xf4 0xe8 # CHECK: r17:16 = vmpywouh(r21:20, r31:30):<<1:rnd:sat 0xb0 0xde 0x54 0xea # CHECK: r17:16 += vmpyweuh(r21:20, r31:30):sat 0xb0 0xde 0xd4 0xea # CHECK: r17:16 += vmpyweuh(r21:20, r31:30):<<1:sat 0xf0 0xde 0x54 0xea # CHECK: r17:16 += vmpywouh(r21:20, r31:30):sat 0xf0 0xde 0xd4 0xea # CHECK: r17:16 += vmpywouh(r21:20, r31:30):<<1:sat 0xb0 0xde 0x74 0xea # CHECK: r17:16 += vmpyweuh(r21:20, r31:30):rnd:sat 0xb0 0xde 0xf4 0xea # CHECK: r17:16 += vmpyweuh(r21:20, r31:30):<<1:rnd:sat 0xf0 0xde 0x74 0xea # CHECK: r17:16 += vmpywouh(r21:20, r31:30):rnd:sat 0xf0 0xde 0xf4 0xea # CHECK: r17:16 += vmpywouh(r21:20, r31:30):<<1:rnd:sat # Multiply signed halfwords 0x10 0xdf 0x95 0xe4 # CHECK: r17:16 = mpy(r21.l, r31.l):<<1 0x30 0xdf 0x95 0xe4 # CHECK: r17:16 = mpy(r21.l, r31.h):<<1 0x50 0xdf 0x95 0xe4 # CHECK: r17:16 = mpy(r21.h, r31.l):<<1 0x70 0xdf 0x95 0xe4 # CHECK: r17:16 = mpy(r21.h, r31.h):<<1 0x10 0xdf 0xb5 0xe4 # CHECK: r17:16 = mpy(r21.l, r31.l):<<1:rnd 0x30 0xdf 0xb5 0xe4 # CHECK: r17:16 = mpy(r21.l, r31.h):<<1:rnd 0x50 0xdf 0xb5 0xe4 # CHECK: r17:16 = mpy(r21.h, r31.l):<<1:rnd 0x70 0xdf 0xb5 0xe4 # CHECK: r17:16 = mpy(r21.h, r31.h):<<1:rnd 0x10 0xdf 0x95 0xe6 # CHECK: r17:16 += mpy(r21.l, r31.l):<<1 0x30 0xdf 0x95 0xe6 # CHECK: r17:16 += mpy(r21.l, r31.h):<<1 0x50 0xdf 0x95 0xe6 # CHECK: r17:16 += mpy(r21.h, r31.l):<<1 0x70 0xdf 0x95 0xe6 # CHECK: r17:16 += mpy(r21.h, r31.h):<<1 0x10 0xdf 0xb5 0xe6 # CHECK: r17:16 -= mpy(r21.l, r31.l):<<1 0x30 0xdf 0xb5 0xe6 # CHECK: r17:16 -= mpy(r21.l, r31.h):<<1 0x50 0xdf 0xb5 0xe6 # CHECK: r17:16 -= mpy(r21.h, r31.l):<<1 0x70 0xdf 0xb5 0xe6 # CHECK: r17:16 -= mpy(r21.h, r31.h):<<1 0x11 0xdf 0x95 0xec # CHECK: r17 = mpy(r21.l, r31.l):<<1 0x31 0xdf 0x95 0xec # CHECK: r17 = mpy(r21.l, r31.h):<<1 0x51 0xdf 0x95 0xec # CHECK: r17 = mpy(r21.h, r31.l):<<1 0x71 0xdf 0x95 0xec # CHECK: r17 = mpy(r21.h, r31.h):<<1 0x91 0xdf 0x95 0xec # CHECK: r17 = mpy(r21.l, r31.l):<<1:sat 0xb1 0xdf 0x95 0xec # CHECK: r17 = mpy(r21.l, r31.h):<<1:sat 0xd1 0xdf 0x95 0xec # CHECK: r17 = mpy(r21.h, r31.l):<<1:sat 0xf1 0xdf 0x95 0xec # CHECK: r17 = mpy(r21.h, r31.h):<<1:sat 0x11 0xdf 0xb5 0xec # CHECK: r17 = mpy(r21.l, r31.l):<<1:rnd 0x31 0xdf 0xb5 0xec # CHECK: r17 = mpy(r21.l, r31.h):<<1:rnd 0x51 0xdf 0xb5 0xec # CHECK: r17 = mpy(r21.h, r31.l):<<1:rnd 0x71 0xdf 0xb5 0xec # CHECK: r17 = mpy(r21.h, r31.h):<<1:rnd 0x91 0xdf 0xb5 0xec # CHECK: r17 = mpy(r21.l, r31.l):<<1:rnd:sat 0xb1 0xdf 0xb5 0xec # CHECK: r17 = mpy(r21.l, r31.h):<<1:rnd:sat 0xd1 0xdf 0xb5 0xec # CHECK: r17 = mpy(r21.h, r31.l):<<1:rnd:sat 0xf1 0xdf 0xb5 0xec # CHECK: r17 = mpy(r21.h, r31.h):<<1:rnd:sat 0x11 0xdf 0x95 0xee # CHECK: r17 += mpy(r21.l, r31.l):<<1 0x31 0xdf 0x95 0xee # CHECK: r17 += mpy(r21.l, r31.h):<<1 0x51 0xdf 0x95 0xee # CHECK: r17 += mpy(r21.h, r31.l):<<1 0x71 0xdf 0x95 0xee # CHECK: r17 += mpy(r21.h, r31.h):<<1 0x91 0xdf 0x95 0xee # CHECK: r17 += mpy(r21.l, r31.l):<<1:sat 0xb1 0xdf 0x95 0xee # CHECK: r17 += mpy(r21.l, r31.h):<<1:sat 0xd1 0xdf 0x95 0xee # CHECK: r17 += mpy(r21.h, r31.l):<<1:sat 0xf1 0xdf 0x95 0xee # CHECK: r17 += mpy(r21.h, r31.h):<<1:sat 0x11 0xdf 0xb5 0xee # CHECK: r17 -= mpy(r21.l, r31.l):<<1 0x31 0xdf 0xb5 0xee # CHECK: r17 -= mpy(r21.l, r31.h):<<1 0x51 0xdf 0xb5 0xee # CHECK: r17 -= mpy(r21.h, r31.l):<<1 0x71 0xdf 0xb5 0xee # CHECK: r17 -= mpy(r21.h, r31.h):<<1 0x91 0xdf 0xb5 0xee # CHECK: r17 -= mpy(r21.l, r31.l):<<1:sat 0xb1 0xdf 0xb5 0xee # CHECK: r17 -= mpy(r21.l, r31.h):<<1:sat 0xd1 0xdf 0xb5 0xee # CHECK: r17 -= mpy(r21.h, r31.l):<<1:sat 0xf1 0xdf 0xb5 0xee # CHECK: r17 -= mpy(r21.h, r31.h):<<1:sat # Multiply unsigned halfwords 0x10 0xdf 0xd5 0xe4 # CHECK: r17:16 = mpyu(r21.l, r31.l):<<1 0x30 0xdf 0xd5 0xe4 # CHECK: r17:16 = mpyu(r21.l, r31.h):<<1 0x50 0xdf 0xd5 0xe4 # CHECK: r17:16 = mpyu(r21.h, r31.l):<<1 0x70 0xdf 0xd5 0xe4 # CHECK: r17:16 = mpyu(r21.h, r31.h):<<1 0x10 0xdf 0xd5 0xe6 # CHECK: r17:16 += mpyu(r21.l, r31.l):<<1 0x30 0xdf 0xd5 0xe6 # CHECK: r17:16 += mpyu(r21.l, r31.h):<<1 0x50 0xdf 0xd5 0xe6 # CHECK: r17:16 += mpyu(r21.h, r31.l):<<1 0x70 0xdf 0xd5 0xe6 # CHECK: r17:16 += mpyu(r21.h, r31.h):<<1 0x10 0xdf 0xf5 0xe6 # CHECK: r17:16 -= mpyu(r21.l, r31.l):<<1 0x30 0xdf 0xf5 0xe6 # CHECK: r17:16 -= mpyu(r21.l, r31.h):<<1 0x50 0xdf 0xf5 0xe6 # CHECK: r17:16 -= mpyu(r21.h, r31.l):<<1 0x70 0xdf 0xf5 0xe6 # CHECK: r17:16 -= mpyu(r21.h, r31.h):<<1 0x11 0xdf 0xd5 0xec # CHECK: r17 = mpyu(r21.l, r31.l):<<1 0x31 0xdf 0xd5 0xec # CHECK: r17 = mpyu(r21.l, r31.h):<<1 0x51 0xdf 0xd5 0xec # CHECK: r17 = mpyu(r21.h, r31.l):<<1 0x71 0xdf 0xd5 0xec # CHECK: r17 = mpyu(r21.h, r31.h):<<1 0x11 0xdf 0xd5 0xee # CHECK: r17 += mpyu(r21.l, r31.l):<<1 0x31 0xdf 0xd5 0xee # CHECK: r17 += mpyu(r21.l, r31.h):<<1 0x51 0xdf 0xd5 0xee # CHECK: r17 += mpyu(r21.h, r31.l):<<1 0x71 0xdf 0xd5 0xee # CHECK: r17 += mpyu(r21.h, r31.h):<<1 0x11 0xdf 0xf5 0xee # CHECK: r17 -= mpyu(r21.l, r31.l):<<1 0x31 0xdf 0xf5 0xee # CHECK: r17 -= mpyu(r21.l, r31.h):<<1 0x51 0xdf 0xf5 0xee # CHECK: r17 -= mpyu(r21.h, r31.l):<<1 0x71 0xdf 0xf5 0xee # CHECK: r17 -= mpyu(r21.h, r31.h):<<1 # Polynomial multiply words 0xf0 0xdf 0x55 0xe5 # CHECK: r17:16 = pmpyw(r21, r31) 0xf0 0xdf 0x35 0xe7 # CHECK: r17:16 ^= pmpyw(r21, r31) # Vector reduce multiply word by signed half (32x16) 0x50 0xde 0x34 0xe8 # CHECK: r17:16 = vrmpywoh(r21:20, r31:30) 0x50 0xde 0xb4 0xe8 # CHECK: r17:16 = vrmpywoh(r21:20, r31:30):<<1 0x90 0xde 0x54 0xe8 # CHECK: r17:16 = vrmpyweh(r21:20, r31:30) 0x90 0xde 0xd4 0xe8 # CHECK: r17:16 = vrmpyweh(r21:20, r31:30):<<1 0xd0 0xde 0x74 0xea # CHECK: r17:16 += vrmpywoh(r21:20, r31:30) 0xd0 0xde 0xf4 0xea # CHECK: r17:16 += vrmpywoh(r21:20, r31:30):<<1 0xd0 0xde 0x34 0xea # CHECK: r17:16 += vrmpyweh(r21:20, r31:30) 0xd0 0xde 0xb4 0xea # CHECK: r17:16 += vrmpyweh(r21:20, r31:30):<<1 # Multiply and use upper result 0x31 0xdf 0x15 0xed # CHECK: r17 = mpy(r21, r31) 0x31 0xdf 0x35 0xed # CHECK: r17 = mpy(r21, r31):rnd 0x31 0xdf 0x55 0xed # CHECK: r17 = mpyu(r21, r31) 0x31 0xdf 0x75 0xed # CHECK: r17 = mpysu(r21, r31) 0x11 0xdf 0xb5 0xed # CHECK: r17 = mpy(r21, r31.h):<<1:sat 0x31 0xdf 0xb5 0xed # CHECK: r17 = mpy(r21, r31.l):<<1:sat 0x91 0xdf 0xb5 0xed # CHECK: r17 = mpy(r21, r31.h):<<1:rnd:sat 0x11 0xdf 0xf5 0xed # CHECK: r17 = mpy(r21, r31):<<1:sat 0x91 0xdf 0xf5 0xed # CHECK: r17 = mpy(r21, r31.l):<<1:rnd:sat 0x51 0xdf 0xb5 0xed # CHECK: r17 = mpy(r21, r31):<<1 0x11 0xdf 0x75 0xef # CHECK: r17 += mpy(r21, r31):<<1:sat 0x31 0xdf 0x75 0xef # CHECK: r17 -= mpy(r21, r31):<<1:sat # Multiply and use full result 0x10 0xdf 0x15 0xe5 # CHECK: r17:16 = mpy(r21, r31) 0x10 0xdf 0x55 0xe5 # CHECK: r17:16 = mpyu(r21, r31) 0x10 0xdf 0x15 0xe7 # CHECK: r17:16 += mpy(r21, r31) 0x10 0xdf 0x35 0xe7 # CHECK: r17:16 -= mpy(r21, r31) 0x10 0xdf 0x55 0xe7 # CHECK: r17:16 += mpyu(r21, r31) 0x10 0xdf 0x75 0xe7 # CHECK: r17:16 -= mpyu(r21, r31) # Vector dual multiply 0x90 0xde 0x14 0xe8 # CHECK: r17:16 = vdmpy(r21:20, r31:30):sat 0x90 0xde 0x94 0xe8 # CHECK: r17:16 = vdmpy(r21:20, r31:30):<<1:sat 0x90 0xde 0x14 0xea # CHECK: r17:16 += vdmpy(r21:20, r31:30):sat 0x90 0xde 0x94 0xea # CHECK: r17:16 += vdmpy(r21:20, r31:30):<<1:sat # Vector dual multiply with round and pack 0x11 0xde 0x14 0xe9 # CHECK: r17 = vdmpy(r21:20, r31:30):rnd:sat 0x11 0xde 0x94 0xe9 # CHECK: r17 = vdmpy(r21:20, r31:30):<<1:rnd:sat # Vector reduce multiply bytes 0x30 0xde 0x94 0xe8 # CHECK: r17:16 = vrmpybu(r21:20, r31:30) 0x30 0xde 0xd4 0xe8 # CHECK: r17:16 = vrmpybsu(r21:20, r31:30) 0x30 0xde 0x94 0xea # CHECK: r17:16 += vrmpybu(r21:20, r31:30) 0x30 0xde 0xd4 0xea # CHECK: r17:16 += vrmpybsu(r21:20, r31:30) # Vector dual multiply signed by unsigned bytes 0x30 0xde 0xb4 0xe8 # CHECK: r17:16 = vdmpybsu(r21:20, r31:30):sat 0x30 0xde 0x34 0xea # CHECK: r17:16 += vdmpybsu(r21:20, r31:30):sat # Vector multiply even haldwords 0xd0 0xde 0x14 0xe8 # CHECK: r17:16 = vmpyeh(r21:20, r31:30):sat 0xd0 0xde 0x94 0xe8 # CHECK: r17:16 = vmpyeh(r21:20, r31:30):<<1:sat 0x50 0xde 0x34 0xea # CHECK: r17:16 += vmpyeh(r21:20, r31:30) 0xd0 0xde 0x14 0xea # CHECK: r17:16 += vmpyeh(r21:20, r31:30):sat 0xd0 0xde 0x94 0xea # CHECK: r17:16 += vmpyeh(r21:20, r31:30):<<1:sat # Vector multiply halfwords 0xb0 0xdf 0x15 0xe5 # CHECK: r17:16 = vmpyh(r21, r31):sat 0xb0 0xdf 0x95 0xe5 # CHECK: r17:16 = vmpyh(r21, r31):<<1:sat 0x30 0xdf 0x35 0xe7 # CHECK: r17:16 += vmpyh(r21, r31) 0xb0 0xdf 0x15 0xe7 # CHECK: r17:16 += vmpyh(r21, r31):sat 0xb0 0xdf 0x95 0xe7 # CHECK: r17:16 += vmpyh(r21, r31):<<1:sat # Vector multiply halfwords with round and pack 0xf1 0xdf 0x35 0xed # CHECK: r17 = vmpyh(r21, r31):rnd:sat 0xf1 0xdf 0xb5 0xed # CHECK: r17 = vmpyh(r21, r31):<<1:rnd:sat # Vector multiply halfwords signed by unsigned 0xf0 0xdf 0x15 0xe5 # CHECK: r17:16 = vmpyhsu(r21, r31):sat 0xf0 0xdf 0x95 0xe5 # CHECK: r17:16 = vmpyhsu(r21, r31):<<1:sat 0xb0 0xdf 0x75 0xe7 # CHECK: r17:16 += vmpyhsu(r21, r31):sat 0xb0 0xdf 0xf5 0xe7 # CHECK: r17:16 += vmpyhsu(r21, r31):<<1:sat # Vector reduce multiply halfwords 0x50 0xde 0x14 0xe8 # CHECK: r17:16 = vrmpyh(r21:20, r31:30) 0x50 0xde 0x14 0xea # CHECK: r17:16 += vrmpyh(r21:20, r31:30) # Vector multiply bytes 0x30 0xdf 0x55 0xe5 # CHECK: r17:16 = vmpybsu(r21, r31) 0x30 0xdf 0x95 0xe5 # CHECK: r17:16 = vmpybu(r21, r31) 0x30 0xdf 0x95 0xe7 # CHECK: r17:16 += vmpybu(r21, r31) 0x30 0xdf 0xd5 0xe7 # CHECK: r17:16 += vmpybsu(r21, r31) # Vector polynomial multiply halfwords 0xf0 0xdf 0xd5 0xe5 # CHECK: r17:16 = vpmpyh(r21, r31) 0xf0 0xdf 0xb5 0xe7 # CHECK: r17:16 ^= vpmpyh(r21, r31)