# RUN: llvm-mc -triple=hexagon -disassemble < %s | FileCheck %s # Hexagon Programmer's Reference Manual 11.10.1 XTYPE/ALU # Absolute value doubleword 0xd0 0xc0 0x94 0x80 # CHECK: r17:16 = abs(r21:20) 0x91 0xc0 0x95 0x8c # CHECK: r17 = abs(r21) 0xb1 0xc0 0x95 0x8c # CHECK: r17 = abs(r21):sat # Add and accumulate 0xff 0xd1 0x35 0xdb # CHECK: r17 = add(r21, add(r31, #23)) 0xff 0xd1 0xb5 0xdb # CHECK: r17 = add(r21, sub(#23, r31)) 0xf1 0xc2 0x15 0xe2 # CHECK: r17 += add(r21, #23) 0xf1 0xc2 0x95 0xe2 # CHECK: r17 -= add(r21, #23) 0x31 0xdf 0x15 0xef # CHECK: r17 += add(r21, r31) 0x31 0xdf 0x95 0xef # CHECK: r17 -= add(r21, r31) # Add doublewords 0xf0 0xde 0x14 0xd3 # CHECK: r17:16 = add(r21:20, r31:30) 0xb0 0xde 0x74 0xd3 # CHECK: r17:16 = add(r21:20, r31:30):sat 0xd0 0xde 0x74 0xd3 # CHECK: r17:16 = add(r21:20, r31:30):raw:lo 0xf0 0xde 0x74 0xd3 # CHECK: r17:16 = add(r21:20, r31:30):raw:hi # Add halfword 0x11 0xd5 0x1f 0xd5 # CHECK: r17 = add(r21.l, r31.l) 0x51 0xd5 0x1f 0xd5 # CHECK: r17 = add(r21.l, r31.h) 0x91 0xd5 0x1f 0xd5 # CHECK: r17 = add(r21.l, r31.l):sat 0xd1 0xd5 0x1f 0xd5 # CHECK: r17 = add(r21.l, r31.h):sat 0x11 0xd5 0x5f 0xd5 # CHECK: r17 = add(r21.l, r31.l):<<16 0x31 0xd5 0x5f 0xd5 # CHECK: r17 = add(r21.l, r31.h):<<16 0x51 0xd5 0x5f 0xd5 # CHECK: r17 = add(r21.h, r31.l):<<16 0x71 0xd5 0x5f 0xd5 # CHECK: r17 = add(r21.h, r31.h):<<16 0x91 0xd5 0x5f 0xd5 # CHECK: r17 = add(r21.l, r31.l):sat:<<16 0xb1 0xd5 0x5f 0xd5 # CHECK: r17 = add(r21.l, r31.h):sat:<<16 0xd1 0xd5 0x5f 0xd5 # CHECK: r17 = add(r21.h, r31.l):sat:<<16 0xf1 0xd5 0x5f 0xd5 # CHECK: r17 = add(r21.h, r31.h):sat:<<16 # Add or subtract doublewords with carry 0x70 0xde 0xd4 0xc2 # CHECK: r17:16 = add(r21:20, r31:30, p3):carry 0x70 0xde 0xf4 0xc2 # CHECK: r17:16 = sub(r21:20, r31:30, p3):carry # Logical doublewords 0x90 0xc0 0x94 0x80 # CHECK: r17:16 = not(r21:20) 0x10 0xde 0xf4 0xd3 # CHECK: r17:16 = and(r21:20, r31:30) 0x30 0xd4 0xfe 0xd3 # CHECK: r17:16 = and(r21:20, ~r31:30) 0x50 0xde 0xf4 0xd3 # CHECK: r17:16 = or(r21:20, r31:30) 0x70 0xd4 0xfe 0xd3 # CHECK: r17:16 = or(r21:20, ~r31:30) 0x90 0xde 0xf4 0xd3 # CHECK: r17:16 = xor(r21:20, r31:30) # Logical-logical doublewords 0x10 0xde 0x94 0xca # CHECK: r17:16 ^= xor(r21:20, r31:30) # Logical-logical words 0xf1 0xc3 0x15 0xda # CHECK: r17 |= and(r21, #31) 0xf5 0xc3 0x51 0xda # CHECK: r17 = or(r21, and(r17, #31)) 0xf1 0xc3 0x95 0xda # CHECK: r17 |= or(r21, #31) 0x11 0xdf 0x35 0xef # CHECK: r17 |= and(r21, ~r31) 0x31 0xdf 0x35 0xef # CHECK: r17 &= and(r21, ~r31) 0x51 0xdf 0x35 0xef # CHECK: r17 ^= and(r21, ~r31) 0x11 0xdf 0x55 0xef # CHECK: r17 &= and(r21, r31) 0x31 0xdf 0x55 0xef # CHECK: r17 &= or(r21, r31) 0x51 0xdf 0x55 0xef # CHECK: r17 &= xor(r21, r31) 0x71 0xdf 0x55 0xef # CHECK: r17 |= and(r21, r31) 0x71 0xdf 0x95 0xef # CHECK: r17 ^= xor(r21, r31) 0x11 0xdf 0xd5 0xef # CHECK: r17 |= or(r21, r31) 0x31 0xdf 0xd5 0xef # CHECK: r17 |= xor(r21, r31) 0x51 0xdf 0xd5 0xef # CHECK: r17 ^= and(r21, r31) 0x71 0xdf 0xd5 0xef # CHECK: r17 ^= or(r21, r31) # Maximum words 0x11 0xdf 0xd5 0xd5 # CHECK: r17 = max(r21, r31) 0x91 0xdf 0xd5 0xd5 # CHECK: r17 = maxu(r21, r31) # Maximum doublewords 0x90 0xde 0xd4 0xd3 # CHECK: r17:16 = max(r21:20, r31:30) 0xb0 0xde 0xd4 0xd3 # CHECK: r17:16 = maxu(r21:20, r31:30) # Minimum words 0x11 0xd5 0xbf 0xd5 # CHECK: r17 = min(r21, r31) 0x91 0xd5 0xbf 0xd5 # CHECK: r17 = minu(r21, r31) # Minimum doublewords 0xd0 0xd4 0xbe 0xd3 # CHECK: r17:16 = min(r21:20, r31:30) 0xf0 0xd4 0xbe 0xd3 # CHECK: r17:16 = minu(r21:20, r31:30) # Module wrap 0xf1 0xdf 0xf5 0xd3 # CHECK: r17 = modwrap(r21, r31) # Negate 0xb0 0xc0 0x94 0x80 # CHECK: r17:16 = neg(r21:20) 0xd1 0xc0 0x95 0x8c # CHECK: r17 = neg(r21):sat # Round 0x31 0xc0 0xd4 0x88 # CHECK: r17 = round(r21:20):sat 0x11 0xdf 0xf5 0x8c # CHECK: r17 = cround(r21, #31) 0x91 0xdf 0xf5 0x8c # CHECK: r17 = round(r21, #31) 0xd1 0xdf 0xf5 0x8c # CHECK: r17 = round(r21, #31):sat 0x11 0xdf 0xd5 0xc6 # CHECK: r17 = cround(r21, r31) 0x91 0xdf 0xd5 0xc6 # CHECK: r17 = round(r21, r31) 0xd1 0xdf 0xd5 0xc6 # CHECK: r17 = round(r21, r31):sat # Subtract doublewords 0xf0 0xd4 0x3e 0xd3 # CHECK: r17:16 = sub(r21:20, r31:30) # Subtract and accumulate words 0x71 0xd5 0x1f 0xef # CHECK: r17 += sub(r21, r31) # Subtract halfword 0x11 0xd5 0x3f 0xd5 # CHECK: r17 = sub(r21.l, r31.l) 0x51 0xd5 0x3f 0xd5 # CHECK: r17 = sub(r21.l, r31.h) 0x91 0xd5 0x3f 0xd5 # CHECK: r17 = sub(r21.l, r31.l):sat 0xd1 0xd5 0x3f 0xd5 # CHECK: r17 = sub(r21.l, r31.h):sat 0x11 0xd5 0x7f 0xd5 # CHECK: r17 = sub(r21.l, r31.l):<<16 0x31 0xd5 0x7f 0xd5 # CHECK: r17 = sub(r21.l, r31.h):<<16 0x51 0xd5 0x7f 0xd5 # CHECK: r17 = sub(r21.h, r31.l):<<16 0x71 0xd5 0x7f 0xd5 # CHECK: r17 = sub(r21.h, r31.h):<<16 0x91 0xd5 0x7f 0xd5 # CHECK: r17 = sub(r21.l, r31.l):sat:<<16 0xb1 0xd5 0x7f 0xd5 # CHECK: r17 = sub(r21.l, r31.h):sat:<<16 0xd1 0xd5 0x7f 0xd5 # CHECK: r17 = sub(r21.h, r31.l):sat:<<16 0xf1 0xd5 0x7f 0xd5 # CHECK: r17 = sub(r21.h, r31.h):sat:<<16 # Sign extend word to doubleword 0x10 0xc0 0x55 0x84 # CHECK: r17:16 = sxtw(r21) # Vector absolute value halfwords 0x90 0xc0 0x54 0x80 # CHECK: r17:16 = vabsh(r21:20) 0xb0 0xc0 0x54 0x80 # CHECK: r17:16 = vabsh(r21:20):sat # Vector absolute value words 0xd0 0xc0 0x54 0x80 # CHECK: r17:16 = vabsw(r21:20) 0xf0 0xc0 0x54 0x80 # CHECK: r17:16 = vabsw(r21:20):sat # Vector absolute difference halfwords 0x10 0xd4 0x7e 0xe8 # CHECK: r17:16 = vabsdiffh(r21:20, r31:30) # Vector absolute difference words 0x10 0xd4 0x3e 0xe8 # CHECK: r17:16 = vabsdiffw(r21:20, r31:30) # Vector add halfwords 0x50 0xde 0x14 0xd3 # CHECK: r17:16 = vaddh(r21:20, r31:30) 0x70 0xde 0x14 0xd3 # CHECK: r17:16 = vaddh(r21:20, r31:30):sat 0x90 0xde 0x14 0xd3 # CHECK: r17:16 = vadduh(r21:20, r31:30):sat # Vector add halfwords with saturate and pack to unsigned bytes 0x31 0xde 0x54 0xc1 # CHECK: r17 = vaddhub(r21:20, r31:30):sat # Vector reduce add unsigned bytes 0x30 0xde 0x54 0xe8 # CHECK: r17:16 = vraddub(r21:20, r31:30) 0x30 0xde 0x54 0xea # CHECK: r17:16 += vraddub(r21:20, r31:30) # Vector reduce add halfwords 0x31 0xde 0x14 0xe9 # CHECK: r17 = vradduh(r21:20, r31:30) 0xf1 0xde 0x34 0xe9 # CHECK: r17 = vraddh(r21:20, r31:30) # Vector add bytes 0x10 0xde 0x14 0xd3 # CHECK: r17:16 = vaddub(r21:20, r31:30) 0x30 0xde 0x14 0xd3 # CHECK: r17:16 = vaddub(r21:20, r31:30):sat # Vector add words 0xb0 0xde 0x14 0xd3 # CHECK: r17:16 = vaddw(r21:20, r31:30) 0xd0 0xde 0x14 0xd3 # CHECK: r17:16 = vaddw(r21:20, r31:30):sat # Vector average halfwords 0x50 0xde 0x54 0xd3 # CHECK: r17:16 = vavgh(r21:20, r31:30) 0x70 0xde 0x54 0xd3 # CHECK: r17:16 = vavgh(r21:20, r31:30):rnd 0x90 0xde 0x54 0xd3 # CHECK: r17:16 = vavgh(r21:20, r31:30):crnd 0xb0 0xde 0x54 0xd3 # CHECK: r17:16 = vavguh(r21:20, r31:30) 0xd0 0xde 0x54 0xd3 # CHECK: r17:16 = vavguh(r21:20, r31:30):rnd 0x10 0xd4 0x9e 0xd3 # CHECK: r17:16 = vnavgh(r21:20, r31:30) 0x30 0xd4 0x9e 0xd3 # CHECK: r17:16 = vnavgh(r21:20, r31:30):rnd:sat 0x50 0xd4 0x9e 0xd3 # CHECK: r17:16 = vnavgh(r21:20, r31:30):crnd:sat # Vector average unsigned bytes 0x10 0xde 0x54 0xd3 # CHECK: r17:16 = vavgub(r21:20, r31:30) 0x30 0xde 0x54 0xd3 # CHECK: r17:16 = vavgub(r21:20, r31:30):rnd # Vector average words 0x10 0xde 0x74 0xd3 # CHECK: r17:16 = vavgw(r21:20, r31:30) 0x30 0xde 0x74 0xd3 # CHECK: r17:16 = vavgw(r21:20, r31:30):rnd 0x50 0xde 0x74 0xd3 # CHECK: r17:16 = vavgw(r21:20, r31:30):crnd 0x70 0xde 0x74 0xd3 # CHECK: r17:16 = vavguw(r21:20, r31:30) 0x90 0xde 0x74 0xd3 # CHECK: r17:16 = vavguw(r21:20, r31:30):rnd 0x70 0xd4 0x9e 0xd3 # CHECK: r17:16 = vnavgw(r21:20, r31:30) 0x90 0xd4 0x9e 0xd3 # CHECK: r17:16 = vnavgw(r21:20, r31:30):rnd:sat 0xd0 0xd4 0x9e 0xd3 # CHECK: r17:16 = vnavgw(r21:20, r31:30):crnd:sat # Vector conditional negate 0x50 0xdf 0xd4 0xc3 # CHECK: r17:16 = vcnegh(r21:20, r31) 0xf0 0xff 0x34 0xcb # CHECK: r17:16 += vrcnegh(r21:20, r31) # Vector maximum bytes 0x10 0xd4 0xde 0xd3 # CHECK: r17:16 = vmaxub(r21:20, r31:30) 0xd0 0xd4 0xde 0xd3 # CHECK: r17:16 = vmaxb(r21:20, r31:30) # Vector maximum halfwords 0x30 0xd4 0xde 0xd3 # CHECK: r17:16 = vmaxh(r21:20, r31:30) 0x50 0xd4 0xde 0xd3 # CHECK: r17:16 = vmaxuh(r21:20, r31:30) # Vector reduce maximum halfwords 0x3f 0xd0 0x34 0xcb # CHECK: r17:16 = vrmaxh(r21:20, r31) 0x3f 0xf0 0x34 0xcb # CHECK: r17:16 = vrmaxuh(r21:20, r31) # Vector reduce maximum words 0x5f 0xd0 0x34 0xcb # CHECK: r17:16 = vrmaxw(r21:20, r31) 0x5f 0xf0 0x34 0xcb # CHECK: r17:16 = vrmaxuw(r21:20, r31) # Vector maximum words 0xb0 0xd4 0xbe 0xd3 # CHECK: r17:16 = vmaxuw(r21:20, r31:30) 0x70 0xd4 0xde 0xd3 # CHECK: r17:16 = vmaxw(r21:20, r31:30) # Vector minimum bytes 0x10 0xd4 0xbe 0xd3 # CHECK: r17:16 = vminub(r21:20, r31:30) 0xf0 0xd4 0xde 0xd3 # CHECK: r17:16 = vminb(r21:20, r31:30) # Vector minimum halfwords 0x30 0xd4 0xbe 0xd3 # CHECK: r17:16 = vminh(r21:20, r31:30) 0x50 0xd4 0xbe 0xd3 # CHECK: r17:16 = vminuh(r21:20, r31:30) # Vector reduce minimum halfwords 0xbf 0xd0 0x34 0xcb # CHECK: r17:16 = vrminh(r21:20, r31) 0xbf 0xf0 0x34 0xcb # CHECK: r17:16 = vrminuh(r21:20, r31) # Vector reduce minimum words 0xdf 0xd0 0x34 0xcb # CHECK: r17:16 = vrminw(r21:20, r31) 0xdf 0xf0 0x34 0xcb # CHECK: r17:16 = vrminuw(r21:20, r31) # Vector minimum words 0x70 0xd4 0xbe 0xd3 # CHECK: r17:16 = vminw(r21:20, r31:30) 0x90 0xd4 0xbe 0xd3 # CHECK: r17:16 = vminuw(r21:20, r31:30) # Vector sum of absolute differences unsigned bytes 0x50 0xde 0x54 0xe8 # CHECK: r17:16 = vrsadub(r21:20, r31:30) 0x50 0xde 0x54 0xea # CHECK: r17:16 += vrsadub(r21:20, r31:30) # Vector subtract halfwords 0x50 0xd4 0x3e 0xd3 # CHECK: r17:16 = vsubh(r21:20, r31:30) 0x70 0xd4 0x3e 0xd3 # CHECK: r17:16 = vsubh(r21:20, r31:30):sat 0x90 0xd4 0x3e 0xd3 # CHECK: r17:16 = vsubuh(r21:20, r31:30):sat # Vector subtract bytes 0x10 0xd4 0x3e 0xd3 # CHECK: r17:16 = vsubub(r21:20, r31:30) 0x30 0xd4 0x3e 0xd3 # CHECK: r17:16 = vsubub(r21:20, r31:30):sat # Vector subtract words 0xb0 0xd4 0x3e 0xd3 # CHECK: r17:16 = vsubw(r21:20, r31:30) 0xd0 0xd4 0x3e 0xd3 # CHECK: r17:16 = vsubw(r21:20, r31:30):sat