# RUN: llvm-mc -triple hexagon -disassemble < %s | FileCheck %s
# Hexagon Programmer's Reference Manual 11.5 LD

# Load doubleword
0x90 0xff 0xd5 0x3a
# CHECK: r17:16 = memd(r21 + r31<<#3)
0xb0 0xc2 0xc0 0x49
# CHECK: r17:16 = memd(#168)
0x02 0x40 0x00 0x00 0x10 0xc5 0xc0 0x49
# CHECK: r17:16 = memd(##168)
0xd0 0xc0 0xd5 0x91
# CHECK: r17:16 = memd(r21 + #48)
0xb0 0xe0 0xd5 0x99
# CHECK: r17:16 = memd(r21 ++ #40:circ(m1))
0x10 0xe2 0xd5 0x99
# CHECK: r17:16 = memd(r21 ++ I:circ(m1))
0x00 0x40 0x00 0x00 0x70 0xd7 0xd5 0x9b
# CHECK: r17:16 = memd(r21 = ##31)
0xb0 0xc0 0xd5 0x9b
# CHECK: r17:16 = memd(r21++#40)
0x10 0xe0 0xd5 0x9d
# CHECK: r17:16 = memd(r21++m1)
0x10 0xe0 0xd5 0x9f
# CHECK: r17:16 = memd(r21 ++ m1:brev)

# Load doubleword conditionally
0xf0 0xff 0xd5 0x30
# CHECK: if (p3) r17:16 = memd(r21+r31<<#3)
0xf0 0xff 0xd5 0x31
# CHECK: if (!p3) r17:16 = memd(r21+r31<<#3)
0x03 0x40 0x45 0x85 0xf0 0xff 0xd5 0x32
# CHECK: p3 = r5
# CHECK-NEXT: if (p3.new) r17:16 = memd(r21+r31<<#3)
0x03 0x40 0x45 0x85 0xf0 0xff 0xd5 0x33
# CHECK: p3 = r5
# CHECK-NEXT: if (!p3.new) r17:16 = memd(r21+r31<<#3)
0x70 0xd8 0xd5 0x41
# CHECK: if (p3) r17:16 = memd(r21 + #24)
0x03 0x40 0x45 0x85 0x70 0xd8 0xd5 0x43
# CHECK: p3 = r5
# CHECK-NEXT: if (p3.new) r17:16 = memd(r21 + #24)
0x70 0xd8 0xd5 0x45
# CHECK: if (!p3) r17:16 = memd(r21 + #24)
0x03 0x40 0x45 0x85 0x70 0xd8 0xd5 0x47
# CHECK: p3 = r5
# CHECK-NEXT: if (!p3.new) r17:16 = memd(r21 + #24)
0xb0 0xe6 0xd5 0x9b
# CHECK: if (p3) r17:16 = memd(r21++#40)
0xb0 0xee 0xd5 0x9b
# CHECK: if (!p3) r17:16 = memd(r21++#40)
0x03 0x40 0x45 0x85 0xb0 0xf6 0xd5 0x9b
# CHECK: p3 = r5
# CHECK-NEXT: if (p3.new) r17:16 = memd(r21++#40)
0x03 0x40 0x45 0x85 0xb0 0xfe 0xd5 0x9b
# CHECK: p3 = r5
# CHECK-NEXT: if (!p3.new) r17:16 = memd(r21++#40)

# Load byte
0x91 0xff 0x15 0x3a
# CHECK: r17 = memb(r21 + r31<<#3)
0xb1 0xc2 0x00 0x49
# CHECK: r17 = memb(#21)
0x00 0x40 0x00 0x00 0xb1 0xc2 0x00 0x49
# CHECK: r17 = memb(##21)
0xf1 0xc3 0x15 0x91
# CHECK: r17 = memb(r21 + #31)
0xb1 0xe0 0x15 0x99
# CHECK: r17 = memb(r21 ++ #5:circ(m1))
0x11 0xe2 0x15 0x99
# CHECK: r17 = memb(r21 ++ I:circ(m1))
0x00 0x40 0x00 0x00 0x71 0xd7 0x15 0x9b
# CHECK: r17 = memb(r21 = ##31)
0xb1 0xc0 0x15 0x9b
# CHECK: r17 = memb(r21++#5)
0x11 0xe0 0x15 0x9d
# CHECK: r17 = memb(r21++m1)
0x11 0xe0 0x15 0x9f
# CHECK: r17 = memb(r21 ++ m1:brev)

# Load byte conditionally
0xf1 0xff 0x15 0x30
# CHECK: if (p3) r17 = memb(r21+r31<<#3)
0xf1 0xff 0x15 0x31
# CHECK: if (!p3) r17 = memb(r21+r31<<#3)
0x03 0x40 0x45 0x85 0xf1 0xff 0x15 0x32
# CHECK: p3 = r5
# CHECK-NEXT: if (p3.new) r17 = memb(r21+r31<<#3)
0x03 0x40 0x45 0x85 0xf1 0xff 0x15 0x33
# CHECK: p3 = r5
# CHECK-NEXT: if (!p3.new) r17 = memb(r21+r31<<#3)
0x91 0xdd 0x15 0x41
# CHECK: if (p3) r17 = memb(r21 + #44)
0x03 0x40 0x45 0x85 0x91 0xdd 0x15 0x43
# CHECK: p3 = r5
# CHECK-NEXT: if (p3.new) r17 = memb(r21 + #44)
0x91 0xdd 0x15 0x45
# CHECK: if (!p3) r17 = memb(r21 + #44)
0x03 0x40 0x45 0x85 0x91 0xdd 0x15 0x47
# CHECK: p3 = r5
# CHECK-NEXT: if (!p3.new) r17 = memb(r21 + #44)
0xb1 0xe6 0x15 0x9b
# CHECK: if (p3) r17 = memb(r21++#5)
0xb1 0xee 0x15 0x9b
# CHECK: if (!p3) r17 = memb(r21++#5)
0x03 0x40 0x45 0x85 0xb1 0xf6 0x15 0x9b
# CHECK: p3 = r5
# CHECK-NEXT: if (p3.new) r17 = memb(r21++#5)
0x03 0x40 0x45 0x85 0xb1 0xfe 0x15 0x9b
# CHECK: p3 = r5
# CHECK-NEXT: if (!p3.new) r17 = memb(r21++#5)

# Load byte into shifted vector
0xf0 0xc3 0x95 0x90
# CHECK: r17:16 = memb_fifo(r21 + #31)
0xb0 0xe0 0x95 0x98
# CHECK: r17:16 = memb_fifo(r21 ++ #5:circ(m1))
0x10 0xe2 0x95 0x98
# CHECK: r17:16 = memb_fifo(r21 ++ I:circ(m1))

# Load half into shifted vector
0xf0 0xc3 0x55 0x90
# CHECK: r17:16 = memh_fifo(r21 + #62)
0xb0 0xe0 0x55 0x98
# CHECK: r17:16 = memh_fifo(r21 ++ #10:circ(m1))
0x10 0xe2 0x55 0x98
# CHECK: r17:16 = memh_fifo(r21 ++ I:circ(m1))

# Load halfword
0x91 0xff 0x55 0x3a
# CHECK: r17 = memh(r21 + r31<<#3)
0xb1 0xc2 0x40 0x49
# CHECK: r17 = memh(#42)
0x00 0x40 0x00 0x00 0x51 0xc5 0x40 0x49
# CHECK: r17 = memh(##42)
0xf1 0xc3 0x55 0x91
# CHECK: r17 = memh(r21 + #62)
0xb1 0xe0 0x55 0x99
# CHECK: r17 = memh(r21 ++ #10:circ(m1))
0x11 0xe2 0x55 0x99
# CHECK: r17 = memh(r21 ++ I:circ(m1))
0x00 0x40 0x00 0x00 0x71 0xd7 0x55 0x9b
# CHECK: r17 = memh(r21 = ##31)
0xb1 0xc0 0x55 0x9b
# CHECK: r17 = memh(r21++#10)
0x11 0xe0 0x55 0x9d
# CHECK: r17 = memh(r21++m1)
0x11 0xe0 0x55 0x9f
# CHECK: r17 = memh(r21 ++ m1:brev)

# Load halfword conditionally
0xf1 0xff 0x55 0x30
# CHECK: if (p3) r17 = memh(r21+r31<<#3)
0xf1 0xff 0x55 0x31
# CHECK: if (!p3) r17 = memh(r21+r31<<#3)
0x03 0x40 0x45 0x85 0xf1 0xff 0x55 0x32
# CHECK: p3 = r5
# CHECK-NEXT: if (p3.new) r17 = memh(r21+r31<<#3)
0x03 0x40 0x45 0x85 0xf1 0xff 0x55 0x33
# CHECK: p3 = r5
# CHECK-NEXT: if (!p3.new) r17 = memh(r21+r31<<#3)
0xb1 0xe6 0x55 0x9b
# CHECK: if (p3) r17 = memh(r21++#10)
0xb1 0xee 0x55 0x9b
# CHECK: if (!p3) r17 = memh(r21++#10)
0x03 0x40 0x45 0x85 0xb1 0xf6 0x55 0x9b
# CHECK: p3 = r5
# CHECK-NEXT: if (p3.new) r17 = memh(r21++#10)
0x03 0x40 0x45 0x85 0xb1 0xfe 0x55 0x9b
# CHECK: p3 = r5
# CHECK-NEXT: if (!p3.new) r17 = memh(r21++#10)
0xf1 0xdb 0x55 0x41
# CHECK: if (p3) r17 = memh(r21 + #62)
0xf1 0xdb 0x55 0x45
# CHECK: if (!p3) r17 = memh(r21 + #62)
0x03 0x40 0x45 0x85 0xf1 0xdb 0x55 0x43
# CHECK: p3 = r5
# CHECK-NEXT: if (p3.new) r17 = memh(r21 + #62)
0x03 0x40 0x45 0x85 0xf1 0xdb 0x55 0x47
# CHECK: p3 = r5
# CHECK-NEXT: if (!p3.new) r17 = memh(r21 + #62)

# Load unsigned byte
0x91 0xff 0x35 0x3a
# CHECK: r17 = memub(r21 + r31<<#3)
0xb1 0xc2 0x20 0x49
# CHECK: r17 = memub(#21)
0x00 0x40 0x00 0x00 0xb1 0xc2 0x20 0x49
# CHECK: r17 = memub(##21)
0xf1 0xc3 0x35 0x91
# CHECK: r17 = memub(r21 + #31)
0xb1 0xe0 0x35 0x99
# CHECK: r17 = memub(r21 ++ #5:circ(m1))
0x11 0xe2 0x35 0x99
# CHECK: r17 = memub(r21 ++ I:circ(m1))
0x00 0x40 0x00 0x00 0x71 0xd7 0x35 0x9b
# CHECK: r17 = memub(r21 = ##31)
0xb1 0xc0 0x35 0x9b
# CHECK: r17 = memub(r21++#5)
0x11 0xe0 0x35 0x9d
# CHECK: r17 = memub(r21++m1)
0x11 0xe0 0x35 0x9f
# CHECK: r17 = memub(r21 ++ m1:brev)

# Load unsigned byte conditionally
0xf1 0xff 0x35 0x30
# CHECK: if (p3) r17 = memub(r21+r31<<#3)
0xf1 0xff 0x35 0x31
# CHECK: if (!p3) r17 = memub(r21+r31<<#3)
0x03 0x40 0x45 0x85 0xf1 0xff 0x35 0x32
# CHECK: p3 = r5
# CHECK-NEXT: if (p3.new) r17 = memub(r21+r31<<#3)
0x03 0x40 0x45 0x85 0xf1 0xff 0x35 0x33
# CHECK: p3 = r5
# CHECK-NEXT: if (!p3.new) r17 = memub(r21+r31<<#3)
0xf1 0xdb 0x35 0x41
# CHECK: if (p3) r17 = memub(r21 + #31)
0x03 0x40 0x45 0x85 0xf1 0xdb 0x35 0x43
# CHECK: p3 = r5
# CHECK-NEXT: if (p3.new) r17 = memub(r21 + #31)
0xf1 0xdb 0x35 0x45
# CHECK: if (!p3) r17 = memub(r21 + #31)
0x03 0x40 0x45 0x85 0xf1 0xdb 0x35 0x47
# CHECK: p3 = r5
# CHECK-NEXT: if (!p3.new) r17 = memub(r21 + #31)
0xb1 0xe6 0x35 0x9b
# CHECK: if (p3) r17 = memub(r21++#5)
0xb1 0xee 0x35 0x9b
# CHECK: if (!p3) r17 = memub(r21++#5)
0x03 0x40 0x45 0x85 0xb1 0xf6 0x35 0x9b
# CHECK: p3 = r5
# CHECK-NEXT: if (p3.new) r17 = memub(r21++#5)
0x03 0x40 0x45 0x85 0xb1 0xfe 0x35 0x9b
# CHECK: p3 = r5
# CHECK-NEXT: if (!p3.new) r17 = memub(r21++#5)

# Load unsigned halfword
0x91 0xff 0x75 0x3a
# CHECK: r17 = memuh(r21 + r31<<#3)
0xb1 0xc2 0x60 0x49
# CHECK: r17 = memuh(#42)
0x00 0x40 0x00 0x00 0x51 0xc5 0x60 0x49
# CHECK: r17 = memuh(##42)
0xb1 0xc2 0x75 0x91
# CHECK: r17 = memuh(r21 + #42)
0xb1 0xe0 0x75 0x99
# CHECK: r17 = memuh(r21 ++ #10:circ(m1))
0x11 0xe2 0x75 0x99
# CHECK: r17 = memuh(r21 ++ I:circ(m1))
0x00 0x40 0x00 0x00 0x71 0xd7 0x75 0x9b
# CHECK: r17 = memuh(r21 = ##31)
0xb1 0xc0 0x75 0x9b
# CHECK: r17 = memuh(r21++#10)
0x11 0xe0 0x75 0x9d
# CHECK: r17 = memuh(r21++m1)
0x11 0xe0 0x75 0x9f
# CHECK: r17 = memuh(r21 ++ m1:brev)

# Load unsigned halfword conditionally
0xf1 0xff 0x75 0x30
# CHECK: if (p3) r17 = memuh(r21+r31<<#3)
0xf1 0xff 0x75 0x31
# CHECK: if (!p3) r17 = memuh(r21+r31<<#3)
0x03 0x40 0x45 0x85 0xf1 0xff 0x75 0x32
# CHECK: p3 = r5
# CHECK-NEXT: if (p3.new) r17 = memuh(r21+r31<<#3)
0x03 0x40 0x45 0x85 0xf1 0xff 0x75 0x33
# CHECK: p3 = r5
# CHECK-NEXT: if (!p3.new) r17 = memuh(r21+r31<<#3)
0xb1 0xda 0x75 0x41
# CHECK: if (p3) r17 = memuh(r21 + #42)
0xb1 0xda 0x75 0x45
# CHECK: if (!p3) r17 = memuh(r21 + #42)
0x03 0x40 0x45 0x85 0xb1 0xda 0x75 0x43
# CHECK: p3 = r5
# CHECK-NEXT: if (p3.new) r17 = memuh(r21 + #42)
0x03 0x40 0x45 0x85 0xb1 0xda 0x75 0x47
# CHECK: p3 = r5
# CHECK-NEXT: if (!p3.new) r17 = memuh(r21 + #42)
0xb1 0xe6 0x75 0x9b
# CHECK: if (p3) r17 = memuh(r21++#10)
0xb1 0xee 0x75 0x9b
# CHECK: if (!p3) r17 = memuh(r21++#10)
0x03 0x40 0x45 0x85 0xb1 0xf6 0x75 0x9b
# CHECK: p3 = r5
# CHECK-NEXT: if (p3.new) r17 = memuh(r21++#10)
0x03 0x40 0x45 0x85 0xb1 0xfe 0x75 0x9b
# CHECK: p3 = r5
# CHECK-NEXT: if (!p3.new) r17 = memuh(r21++#10)

# Load word
0x91 0xff 0x95 0x3a
# CHECK: r17 = memw(r21 + r31<<#3)
0xb1 0xc2 0x80 0x49
# CHECK: r17 = memw(#84)
0x01 0x40 0x00 0x00 0x91 0xc2 0x80 0x49
# CHECK: r17 = memw(##84)
0xb1 0xc2 0x95 0x91
# CHECK: r17 = memw(r21 + #84)
0xb1 0xe0 0x95 0x99
# CHECK: r17 = memw(r21 ++ #20:circ(m1))
0x11 0xe2 0x95 0x99
# CHECK: r17 = memw(r21 ++ I:circ(m1))
0x00 0x40 0x00 0x00 0x71 0xd7 0x95 0x9b
# CHECK: r17 = memw(r21 = ##31)
0xb1 0xc0 0x95 0x9b
# CHECK: r17 = memw(r21++#20)
0x11 0xe0 0x95 0x9d
# CHECK: r17 = memw(r21++m1)
0x11 0xe0 0x95 0x9f
# CHECK: r17 = memw(r21 ++ m1:brev)

# Load word conditionally
0xf1 0xff 0x95 0x30
# CHECK: if (p3) r17 = memw(r21+r31<<#3)
0xf1 0xff 0x95 0x31
# CHECK: if (!p3) r17 = memw(r21+r31<<#3)
0x03 0x40 0x45 0x85 0xf1 0xff 0x95 0x32
# CHECK: p3 = r5
# CHECK-NEXT: if (p3.new) r17 = memw(r21+r31<<#3)
0x03 0x40 0x45 0x85 0xf1 0xff 0x95 0x33
# CHECK: p3 = r5
# CHECK-NEXT: if (!p3.new) r17 = memw(r21+r31<<#3)
0xb1 0xda 0x95 0x41
# CHECK: if (p3) r17 = memw(r21 + #84)
0xb1 0xda 0x95 0x45
# CHECK: if (!p3) r17 = memw(r21 + #84)
0x03 0x40 0x45 0x85 0xb1 0xda 0x95 0x43
# CHECK: p3 = r5
# CHECK-NEXT: if (p3.new) r17 = memw(r21 + #84)
0x03 0x40 0x45 0x85 0xb1 0xda 0x95 0x47
# CHECK: p3 = r5
# CHECK-NEXT: if (!p3.new) r17 = memw(r21 + #84)
0xb1 0xe6 0x95 0x9b
# CHECK: if (p3) r17 = memw(r21++#20)
0xb1 0xee 0x95 0x9b
# CHECK: if (!p3) r17 = memw(r21++#20)
0x03 0x40 0x45 0x85 0xb1 0xf6 0x95 0x9b
# CHECK: p3 = r5
# CHECK-NEXT: if (p3.new) r17 = memw(r21++#20)
0x03 0x40 0x45 0x85 0xb1 0xfe 0x95 0x9b
# CHECK: p3 = r5
# CHECK-NEXT: if (!p3.new) r17 = memw(r21++#20)

# Deallocate stack frame
0x1e 0xc0 0x1e 0x90
# CHECK: deallocframe

# Deallocate stack frame and return
0x1e 0xc0 0x1e 0x96
# CHECK: dealloc_return
0x03 0x40 0x45 0x85 0x1e 0xcb 0x1e 0x96
# CHECK: p3 = r5
# CHECK-NEXT: if (p3.new) dealloc_return:nt
0x1e 0xd3 0x1e 0x96
# CHECK: if (p3) dealloc_return
0x03 0x40 0x45 0x85 0x1e 0xdb 0x1e 0x96
# CHECK: p3 = r5
# CHECK-NEXT: if (p3.new) dealloc_return:t
0x03 0x40 0x45 0x85 0x1e 0xeb 0x1e 0x96
# CHECK: p3 = r5
# CHECK-NEXT: if (!p3.new) dealloc_return:nt
0x1e 0xf3 0x1e 0x96
# CHECK: if (!p3) dealloc_return
0x03 0x40 0x45 0x85 0x1e 0xfb 0x1e 0x96
# CHECK: p3 = r5
# CHECK-NEXT: if (!p3.new) dealloc_return:t

# Load and unpack bytes to halfwords
0xf1 0xc3 0x35 0x90
# CHECK: r17 = membh(r21 + #62)
0xf1 0xc3 0x75 0x90
# CHECK: r17 = memubh(r21 + #62)
0xf0 0xc3 0xb5 0x90
# CHECK: r17:16 = memubh(r21 + #124)
0xf0 0xc3 0xf5 0x90
# CHECK: r17:16 = membh(r21 + #124)
0xb1 0xe0 0x35 0x98
# CHECK: r17 = membh(r21 ++ #10:circ(m1))
0x11 0xe2 0x35 0x98
# CHECK: r17 = membh(r21 ++ I:circ(m1))
0xb1 0xe0 0x75 0x98
# CHECK: r17 = memubh(r21 ++ #10:circ(m1))
0x11 0xe2 0x75 0x98
# CHECK: r17 = memubh(r21 ++ I:circ(m1))
0xb0 0xe0 0xf5 0x98
# CHECK: r17:16 = membh(r21 ++ #20:circ(m1))
0x10 0xe2 0xf5 0x98
# CHECK: r17:16 = membh(r21 ++ I:circ(m1))
0xb0 0xe0 0xb5 0x98
# CHECK: r17:16 = memubh(r21 ++ #20:circ(m1))
0x10 0xe2 0xb5 0x98
# CHECK: r17:16 = memubh(r21 ++ I:circ(m1))
0x00 0x40 0x00 0x00 0x71 0xd7 0x35 0x9a
# CHECK: r17 = membh(r21 = ##31)
0xb1 0xc0 0x35 0x9a
# CHECK: r17 = membh(r21++#10)
0x00 0x40 0x00 0x00 0x71 0xd7 0x75 0x9a
# CHECK: r17 = memubh(r21 = ##31)
0xb1 0xc0 0x75 0x9a
# CHECK: r17 = memubh(r21++#10)
0x00 0x40 0x00 0x00 0x70 0xd7 0xb5 0x9a
# CHECK: r17:16 = memubh(r21 = ##31)
0xb0 0xc0 0xb5 0x9a
# CHECK: r17:16 = memubh(r21++#20)
0x00 0x40 0x00 0x00 0x70 0xd7 0xf5 0x9a
# CHECK: r17:16 = membh(r21 = ##31)
0xb0 0xc0 0xf5 0x9a
# CHECK: r17:16 = membh(r21++#20)
0x00 0x40 0x00 0x00 0xf1 0xf7 0x35 0x9c
# CHECK: r17 = membh(r21<<#3 + ##31)
0x11 0xe0 0x35 0x9c
# CHECK: r17 = membh(r21++m1)
0x00 0x40 0x00 0x00 0xf1 0xf7 0x75 0x9c
# CHECK: r17 = memubh(r21<<#3 + ##31)
0x11 0xe0 0x75 0x9c
# CHECK: r17 = memubh(r21++m1)
0x00 0x40 0x00 0x00 0xf0 0xf7 0xf5 0x9c
# CHECK: r17:16 = membh(r21<<#3 + ##31)
0x10 0xe0 0xf5 0x9c
# CHECK: r17:16 = membh(r21++m1)
0x00 0x40 0x00 0x00 0xf0 0xf7 0xb5 0x9c
# CHECK: r17:16 = memubh(r21<<#3 + ##31)
0x11 0xe0 0x35 0x9c
# CHECK: r17 = membh(r21++m1)
0x11 0xe0 0x75 0x9c
# CHECK: r17 = memubh(r21++m1)
0x10 0xe0 0xf5 0x9c
# CHECK: r17:16 = membh(r21++m1)
0x10 0xe0 0xb5 0x9c
# CHECK: r17:16 = memubh(r21++m1)
0x11 0xe0 0x35 0x9e
# CHECK: r17 = membh(r21 ++ m1:brev)
0x11 0xe0 0x75 0x9e
# CHECK: r17 = memubh(r21 ++ m1:brev)
0x10 0xe0 0xb5 0x9e
# CHECK: r17:16 = memubh(r21 ++ m1:brev)
0x10 0xe0 0xf5 0x9e
# CHECK: r17:16 = membh(r21 ++ m1:brev)