diff options
Diffstat (limited to 'test/MC/Disassembler/Hexagon')
21 files changed, 3395 insertions, 0 deletions
diff --git a/test/MC/Disassembler/Hexagon/alu32_alu.txt b/test/MC/Disassembler/Hexagon/alu32_alu.txt new file mode 100644 index 0000000..4dde7df --- /dev/null +++ b/test/MC/Disassembler/Hexagon/alu32_alu.txt @@ -0,0 +1,84 @@ +# RUN: llvm-mc -triple hexagon -disassemble < %s | FileCheck %s +# Hexagon Programmer's Reference Manual 11.1.1 ALU32/ALU + +# Add +0xf1 0xc3 0x15 0xb0 +# CHECK: r17 = add(r21, #31) +0x11 0xdf 0x15 0xf3 +# CHECK: r17 = add(r21, r31) +0x11 0xdf 0x55 0xf6 +# CHECK: r17 = add(r21, r31):sat + +# And +0xf1 0xc3 0x15 0x76 +# CHECK: r17 = and(r21, #31) +0xf1 0xc3 0x95 0x76 +# CHECK: r17 = or(r21, #31) +0x11 0xdf 0x15 0xf1 +# CHECK: r17 = and(r21, r31) +0x11 0xdf 0x35 0xf1 +# CHECK: r17 = or(r21, r31) +0x11 0xdf 0x75 0xf1 +# CHECK: r17 = xor(r21, r31) +0x11 0xd5 0x9f 0xf1 +# CHECK: r17 = and(r21, ~r31) +0x11 0xd5 0xbf 0xf1 +# CHECK: r17 = or(r21, ~r31) + +# Nop +0x00 0xc0 0x00 0x7f +# CHECK: nop + +# Subtract +0xb1 0xc2 0x5f 0x76 +# CHECK: r17 = sub(#21, r31) +0x11 0xdf 0x35 0xf3 +# CHECK: r17 = sub(r31, r21) +0x11 0xdf 0xd5 0xf6 +# CHECK: r17 = sub(r31, r21):sat + +# Sign extend +0x11 0xc0 0xbf 0x70 +# CHECK: r17 = sxtb(r31) + +# Transfer immediate +0x15 0xc0 0x31 0x72 +# CHECK: r17.h = #21 +0x15 0xc0 0x31 0x71 +# CHECK: r17.l = #21 +0xf1 0xff 0x5f 0x78 +# CHECK: r17 = #32767 +0xf1 0xff 0xdf 0x78 +# CHECK: r17 = ##65535 + +# Transfer register +0x11 0xc0 0x75 0x70 +# CHECK: r17 = r21 + +# Vector add halfwords +0x11 0xdf 0x15 0xf6 +# CHECK: r17 = vaddh(r21, r31) +0x11 0xdf 0x35 0xf6 +# CHECK: r17 = vaddh(r21, r31):sat +0x11 0xdf 0x75 0xf6 +# CHECK: r17 = vadduh(r21, r31):sat + +# Vector average halfwords +0x11 0xdf 0x15 0xf7 +# CHECK: r17 = vavgh(r21, r31) +0x11 0xdf 0x35 0xf7 +# CHECK: r17 = vavgh(r21, r31):rnd +0x11 0xdf 0x75 0xf7 +# CHECK: r17 = vnavgh(r31, r21) + +# Vector subtract halfwords +0x11 0xdf 0x95 0xf6 +# CHECK: r17 = vsubh(r31, r21) +0x11 0xdf 0xb5 0xf6 +# CHECK: r17 = vsubh(r31, r21):sat +0x11 0xdf 0xf5 0xf6 +# CHECK: r17 = vsubuh(r31, r21):sat + +# Zero extend +0x11 0xc0 0xd5 0x70 +# CHECK: r17 = zxth(r21) diff --git a/test/MC/Disassembler/Hexagon/alu32_perm.txt b/test/MC/Disassembler/Hexagon/alu32_perm.txt new file mode 100644 index 0000000..a295350 --- /dev/null +++ b/test/MC/Disassembler/Hexagon/alu32_perm.txt @@ -0,0 +1,40 @@ +# RUN: llvm-mc -triple hexagon -disassemble < %s | FileCheck %s +# Hexagon Programmer's Reference Manual 11.1.2 ALU32/PERM + +# Combine words in to doublewords +0x11 0xdf 0x95 0xf3 +# CHECK: r17 = combine(r31.h, r21.h) +0x11 0xdf 0xb5 0xf3 +# CHECK: r17 = combine(r31.h, r21.l) +0x11 0xdf 0xd5 0xf3 +# CHECK: r17 = combine(r31.l, r21.h) +0x11 0xdf 0xf5 0xf3 +# CHECK: r17 = combine(r31.l, r21.l) +0xb0 0xe2 0x0f 0x7c +# CHECK: r17:16 = combine(#21, #31) +0xb0 0xe2 0x3f 0x73 +# CHECK: r17:16 = combine(#21, r31) +0xf0 0xe3 0x15 0x73 +# CHECK: r17:16 = combine(r21, #31) +0x10 0xdf 0x15 0xf5 +# CHECK: r17:16 = combine(r21, r31) + +# Mux +0xf1 0xc3 0x75 0x73 +# CHECK: r17 = mux(p3, r21, #31) +0xb1 0xc2 0xff 0x73 +# CHECK: r17 = mux(p3, #21, r31) +0xb1 0xe2 0x8f 0x7b +# CHECK: r17 = mux(p3, #21, #31) +0x71 0xdf 0x15 0xf4 +# CHECK: r17 = mux(p3, r21, r31) + +# Shift word by 16 +0x11 0xc0 0x15 0x70 +# CHECK: r17 = aslh(r21) +0x11 0xc0 0x35 0x70 +# CHECK: r17 = asrh(r21) + +# Pack high and low halfwords +0x10 0xdf 0x95 0xf5 +# CHECK: r17:16 = packhl(r21, r31) diff --git a/test/MC/Disassembler/Hexagon/alu32_pred.txt b/test/MC/Disassembler/Hexagon/alu32_pred.txt new file mode 100644 index 0000000..084b39d --- /dev/null +++ b/test/MC/Disassembler/Hexagon/alu32_pred.txt @@ -0,0 +1,194 @@ +# RUN: llvm-mc -triple hexagon -disassemble < %s | FileCheck %s +# Hexagon Programmer's Reference Manual 11.1.3 ALU32/PRED + +# Conditional add +0xf1 0xc3 0x75 0x74 +# CHECK: if (p3) r17 = add(r21, #31) +0x03 0x40 0x45 0x85 0xf1 0xe3 0x75 0x74 +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) r17 = add(r21, #31) +0xf1 0xc3 0xf5 0x74 +# CHECK: if (!p3) r17 = add(r21, #31) +0x03 0x40 0x45 0x85 0xf1 0xe3 0xf5 0x74 +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) r17 = add(r21, #31) +0x71 0xdf 0x15 0xfb +# CHECK: if (p3) r17 = add(r21, r31) +0x03 0x40 0x45 0x85 0x71 0xff 0x15 0xfb +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) r17 = add(r21, r31) +0xf1 0xdf 0x15 0xfb +# CHECK: if (!p3) r17 = add(r21, r31) +0x03 0x40 0x45 0x85 0xf1 0xff 0x15 0xfb +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) r17 = add(r21, r31) + +# Conditional shift halfword +0x11 0xe3 0x15 0x70 +# CHECK: if (p3) r17 = aslh(r21) +0x03 0x40 0x45 0x85 0x11 0xe7 0x15 0x70 +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) r17 = aslh(r21) +0x11 0xeb 0x15 0x70 +# CHECK: if (!p3) r17 = aslh(r21) +0x03 0x40 0x45 0x85 0x11 0xef 0x15 0x70 +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) r17 = aslh(r21) +0x11 0xe3 0x35 0x70 +# CHECK: if (p3) r17 = asrh(r21) +0x03 0x40 0x45 0x85 0x11 0xe7 0x35 0x70 +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) r17 = asrh(r21) +0x11 0xeb 0x35 0x70 +# CHECK: if (!p3) r17 = asrh(r21) +0x03 0x40 0x45 0x85 0x11 0xef 0x35 0x70 +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) r17 = asrh(r21) + +# Conditional combine +0x70 0xdf 0x15 0xfd +# CHECK: if (p3) r17:16 = combine(r21, r31) +0xf0 0xdf 0x15 0xfd +# CHECK: if (!p3) r17:16 = combine(r21, r31) +0x03 0x40 0x45 0x85 0x70 0xff 0x15 0xfd +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) r17:16 = combine(r21, r31) +0x03 0x40 0x45 0x85 0xf0 0xff 0x15 0xfd +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) r17:16 = combine(r21, r31) + +# Conditional logical operations +0x71 0xdf 0x15 0xf9 +# CHECK: if (p3) r17 = and(r21, r31) +0xf1 0xdf 0x15 0xf9 +# CHECK: if (!p3) r17 = and(r21, r31) +0x03 0x40 0x45 0x85 0x71 0xff 0x15 0xf9 +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) r17 = and(r21, r31) +0x03 0x40 0x45 0x85 0xf1 0xff 0x15 0xf9 +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) r17 = and(r21, r31) +0x71 0xdf 0x35 0xf9 +# CHECK: if (p3) r17 = or(r21, r31) +0xf1 0xdf 0x35 0xf9 +# CHECK: if (!p3) r17 = or(r21, r31) +0x03 0x40 0x45 0x85 0x71 0xff 0x35 0xf9 +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) r17 = or(r21, r31) +0x03 0x40 0x45 0x85 0xf1 0xff 0x35 0xf9 +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) r17 = or(r21, r31) +0x71 0xdf 0x75 0xf9 +# CHECK: if (p3) r17 = xor(r21, r31) +0xf1 0xdf 0x75 0xf9 +# CHECK: if (!p3) r17 = xor(r21, r31) +0x03 0x40 0x45 0x85 0x71 0xff 0x75 0xf9 +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) r17 = xor(r21, r31) +0x03 0x40 0x45 0x85 0xf1 0xff 0x75 0xf9 +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) r17 = xor(r21, r31) + +# Conditional subtract +0x71 0xdf 0x35 0xfb +# CHECK: if (p3) r17 = sub(r31, r21) +0xf1 0xdf 0x35 0xfb +# CHECK: if (!p3) r17 = sub(r31, r21) +0x03 0x40 0x45 0x85 0x71 0xff 0x35 0xfb +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) r17 = sub(r31, r21) +0x03 0x40 0x45 0x85 0xf1 0xff 0x35 0xfb +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) r17 = sub(r31, r21) + +# Conditional sign extend +0x11 0xe3 0xb5 0x70 +# CHECK: if (p3) r17 = sxtb(r21) +0x11 0xeb 0xb5 0x70 +# CHECK: if (!p3) r17 = sxtb(r21) +0x03 0x40 0x45 0x85 0x11 0xe7 0xb5 0x70 +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) r17 = sxtb(r21) +0x03 0x40 0x45 0x85 0x11 0xef 0xb5 0x70 +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) r17 = sxtb(r21) +0x11 0xe3 0xf5 0x70 +# CHECK: if (p3) r17 = sxth(r21) +0x11 0xeb 0xf5 0x70 +# CHECK: if (!p3) r17 = sxth(r21) +0x03 0x40 0x45 0x85 0x11 0xe7 0xf5 0x70 +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) r17 = sxth(r21) +0x03 0x40 0x45 0x85 0x11 0xef 0xf5 0x70 +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) r17 = sxth(r21) + +# Conditional transfer +0xb1 0xc2 0x60 0x7e +# CHECK: if (p3) r17 = #21 +0xb1 0xc2 0xe0 0x7e +# CHECK: if (!p3) r17 = #21 +0x03 0x40 0x45 0x85 0xb1 0xe2 0x60 0x7e +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) r17 = #21 +0x03 0x40 0x45 0x85 0xb1 0xe2 0xe0 0x7e +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) r17 = #21 + +# Conditional zero extend +0x11 0xe3 0x95 0x70 +# CHECK: if (p3) r17 = zxtb(r21) +0x11 0xeb 0x95 0x70 +# CHECK: if (!p3) r17 = zxtb(r21) +0x03 0x40 0x45 0x85 0x11 0xe7 0x95 0x70 +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) r17 = zxtb(r21) +0x03 0x40 0x45 0x85 0x11 0xef 0x95 0x70 +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) r17 = zxtb(r21) +0x11 0xe3 0xd5 0x70 +# CHECK: if (p3) r17 = zxth(r21) +0x11 0xeb 0xd5 0x70 +# CHECK: if (!p3) r17 = zxth(r21) +0x03 0x40 0x45 0x85 0x11 0xe7 0xd5 0x70 +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) r17 = zxth(r21) +0x03 0x40 0x45 0x85 0x11 0xef 0xd5 0x70 +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) r17 = zxth(r21) + +# Compare +0xe3 0xc3 0x15 0x75 +# CHECK: p3 = cmp.eq(r21, #31) +0xf3 0xc3 0x15 0x75 +# CHECK: p3 = !cmp.eq(r21, #31) +0xe3 0xc3 0x55 0x75 +# CHECK: p3 = cmp.gt(r21, #31) +0xf3 0xc3 0x55 0x75 +# CHECK: p3 = !cmp.gt(r21, #31) +0xe3 0xc3 0x95 0x75 +# CHECK: p3 = cmp.gtu(r21, #31) +0xf3 0xc3 0x95 0x75 +# CHECK: p3 = !cmp.gtu(r21, #31) +0x03 0xdf 0x15 0xf2 +# CHECK: p3 = cmp.eq(r21, r31) +0x13 0xdf 0x15 0xf2 +# CHECK: p3 = !cmp.eq(r21, r31) +0x03 0xdf 0x55 0xf2 +# CHECK: p3 = cmp.gt(r21, r31) +0x13 0xdf 0x55 0xf2 +# CHECK: p3 = !cmp.gt(r21, r31) +0x03 0xdf 0x75 0xf2 +# CHECK: p3 = cmp.gtu(r21, r31) +0x13 0xdf 0x75 0xf2 +# CHECK: p3 = !cmp.gtu(r21, r31) + +# Compare to general register +0xf1 0xe3 0x55 0x73 +# CHECK: r17 = cmp.eq(r21, #31) +0xf1 0xe3 0x75 0x73 +# CHECK: r17 = !cmp.eq(r21, #31) +0x11 0xdf 0x55 0xf3 +# CHECK: r17 = cmp.eq(r21, r31) +0x11 0xdf 0x75 0xf3 +# CHECK: r17 = !cmp.eq(r21, r31) diff --git a/test/MC/Disassembler/Hexagon/cr.txt b/test/MC/Disassembler/Hexagon/cr.txt new file mode 100644 index 0000000..6cf2b5f --- /dev/null +++ b/test/MC/Disassembler/Hexagon/cr.txt @@ -0,0 +1,78 @@ +# RUN: llvm-mc --triple hexagon -disassemble < %s | FileCheck %s +# Hexagon Programmer's Reference Manual 11.2 CR + +# Corner detection acceleration +0x93 0xe1 0x12 0x6b +# CHECK: p3 = !fastcorner9(p2, p1) +0x91 0xe3 0x02 0x6b +# CHECK: p1 = fastcorner9(p2, p3) + +# Logical reductions on predicates +0x01 0xc0 0x82 0x6b +# CHECK: p1 = any8(p2) +0x01 0xc0 0xa2 0x6b +# CHECK: p1 = all8(p2) + +# Looping instructions +0x08 0xc4 0x15 0x60 +# CHECK: loop0 +0x08 0xc4 0x35 0x60 +# CHECK: loop1 +0x68 0xc4 0x00 0x69 +# CHECK: loop0 +0x68 0xc4 0x20 0x69 +# CHECK: loop1 + +# Add to PC +0x91 0xca 0x49 0x6a +# CHECK: r17 = add(pc, #21) + +# Pipelined loop instructions +0x08 0xc4 0xb5 0x60 +# CHECK: p3 = sp1loop0 +0x08 0xc4 0xd5 0x60 +# CHECK: p3 = sp2loop0 +0x08 0xc4 0xf5 0x60 +# CHECK: p3 = sp3loop0 +0xa9 0xc4 0xa0 0x69 +# CHECK: p3 = sp1loop0 +0xa9 0xc4 0xc0 0x69 +# CHECK: p3 = sp2loop0 +0xa9 0xc4 0xe0 0x69 +# CHECK: p3 = sp3loop0 + +# Logical operations on predicates +0x01 0xc3 0x02 0x6b +# CHECK: p1 = and(p3, p2) +0xc1 0xc3 0x12 0x6b +# CHECK: p1 = and(p2, and(p3, p3)) +0x01 0xc3 0x22 0x6b +# CHECK: p1 = or(p3, p2) +0xc1 0xc3 0x32 0x6b +# CHECK: p1 = and(p2, or(p3, p3)) +0x01 0xc3 0x42 0x6b +# CHECK: p1 = xor(p2, p3) +0xc1 0xc3 0x52 0x6b +# CHECK: p1 = or(p2, and(p3, p3)) +0x01 0xc2 0x63 0x6b +# CHECK: p1 = and(p2, !p3) +0xc1 0xc3 0x72 0x6b +# CHECK: p1 = or(p2, or(p3, p3)) +0xc1 0xc3 0x92 0x6b +# CHECK: p1 = and(p2, and(p3, !p3)) +0xc1 0xc3 0xb2 0x6b +# CHECK: p1 = and(p2, or(p3, !p3)) +0x01 0xc0 0xc2 0x6b +# CHECK: p1 = not(p2) +0xc1 0xc3 0xd2 0x6b +# CHECK: p1 = or(p2, and(p3, !p3)) +0x01 0xc2 0xe3 0x6b +# CHECK: p1 = or(p2, !p3) +0xc1 0xc3 0xf2 0x6b +# CHECK: p1 = or(p2, or(p3, !p3)) + +# User control register transfer +0x0d 0xc0 0x35 0x62 +# CHECK: cs1 = r21 +0x11 0xc0 0x0d 0x6a +# CHECK: r17 = cs1 diff --git a/test/MC/Disassembler/Hexagon/j.txt b/test/MC/Disassembler/Hexagon/j.txt new file mode 100644 index 0000000..0c2cc7a --- /dev/null +++ b/test/MC/Disassembler/Hexagon/j.txt @@ -0,0 +1,202 @@ +# RUN: llvm-mc -triple hexagon -disassemble < %s | FileCheck %s +# Hexagon Programmer's Reference Manual 11.4 J + +# Call subroutine +0x22 0xc0 0x00 0x5a +# CHECK: call +0x22 0xc3 0x00 0x5d +# CHECK: if (p3) call +0x22 0xc3 0x20 0x5d +# CHECK: if (!p3) call + +# Compare and jump +0x00 0xc0 0x89 0x11 +# CHECK: p0 = cmp.eq(r9,#-1); if (p0.new) jump:nt +0x00 0xc1 0x89 0x11 +# CHECK: p0 = cmp.gt(r9,#-1); if (p0.new) jump:nt +0x00 0xc3 0x89 0x11 +# CHECK: p0 = tstbit(r9, #0); if (p0.new) jump:nt +0x00 0xe0 0x89 0x11 +# CHECK: p0 = cmp.eq(r9,#-1); if (p0.new) jump:t +0x00 0xe1 0x89 0x11 +# CHECK: p0 = cmp.gt(r9,#-1); if (p0.new) jump:t +0x00 0xe3 0x89 0x11 +# CHECK: p0 = tstbit(r9, #0); if (p0.new) jump:t +0x00 0xc0 0xc9 0x11 +# CHECK: p0 = cmp.eq(r9,#-1); if (!p0.new) jump:nt +0x00 0xc1 0xc9 0x11 +# CHECK: p0 = cmp.gt(r9,#-1); if (!p0.new) jump:nt +0x00 0xc3 0xc9 0x11 +# CHECK: p0 = tstbit(r9, #0); if (!p0.new) jump:nt +0x00 0xe0 0xc9 0x11 +# CHECK: p0 = cmp.eq(r9,#-1); if (!p0.new) jump:t +0x00 0xe1 0xc9 0x11 +# CHECK: p0 = cmp.gt(r9,#-1); if (!p0.new) jump:t +0x00 0xe3 0xc9 0x11 +# CHECK: p0 = tstbit(r9, #0); if (!p0.new) jump:t +0x00 0xd5 0x09 0x10 +# CHECK: p0 = cmp.eq(r9, #21); if (p0.new) jump:nt +0x00 0xf5 0x09 0x10 +# CHECK: p0 = cmp.eq(r9, #21); if (p0.new) jump:t +0x00 0xd5 0x49 0x10 +# CHECK: p0 = cmp.eq(r9, #21); if (!p0.new) jump:nt +0x00 0xf5 0x49 0x10 +# CHECK: p0 = cmp.eq(r9, #21); if (!p0.new) jump:t +0x00 0xd5 0x89 0x10 +# CHECK: p0 = cmp.gt(r9, #21); if (p0.new) jump:nt +0x00 0xf5 0x89 0x10 +# CHECK: p0 = cmp.gt(r9, #21); if (p0.new) jump:t +0x00 0xd5 0xc9 0x10 +# CHECK: p0 = cmp.gt(r9, #21); if (!p0.new) jump:nt +0x00 0xf5 0xc9 0x10 +# CHECK: p0 = cmp.gt(r9, #21); if (!p0.new) jump:t +0x00 0xd5 0x09 0x11 +# CHECK: p0 = cmp.gtu(r9, #21); if (p0.new) jump:nt +0x00 0xf5 0x09 0x11 +# CHECK: p0 = cmp.gtu(r9, #21); if (p0.new) jump:t +0x00 0xd5 0x49 0x11 +# CHECK: p0 = cmp.gtu(r9, #21); if (!p0.new) jump:nt +0x00 0xf5 0x49 0x11 +# CHECK: p0 = cmp.gtu(r9, #21); if (!p0.new) jump:t +0x00 0xc0 0x89 0x13 +# CHECK: p1 = cmp.eq(r9,#-1); if (p1.new) jump:nt +0x00 0xc1 0x89 0x13 +# CHECK: p1 = cmp.gt(r9,#-1); if (p1.new) jump:nt +0x00 0xc3 0x89 0x13 +# CHECK: p1 = tstbit(r9, #0); if (p1.new) jump:nt +0x00 0xe0 0x89 0x13 +# CHECK: p1 = cmp.eq(r9,#-1); if (p1.new) jump:t +0x00 0xe1 0x89 0x13 +# CHECK: p1 = cmp.gt(r9,#-1); if (p1.new) jump:t +0x00 0xe3 0x89 0x13 +# CHECK: p1 = tstbit(r9, #0); if (p1.new) jump:t +0x00 0xc0 0xc9 0x13 +# CHECK: p1 = cmp.eq(r9,#-1); if (!p1.new) jump:nt +0x00 0xc1 0xc9 0x13 +# CHECK: p1 = cmp.gt(r9,#-1); if (!p1.new) jump:nt +0x00 0xc3 0xc9 0x13 +# CHECK: p1 = tstbit(r9, #0); if (!p1.new) jump:nt +0x00 0xe0 0xc9 0x13 +# CHECK: p1 = cmp.eq(r9,#-1); if (!p1.new) jump:t +0x00 0xe1 0xc9 0x13 +# CHECK: p1 = cmp.gt(r9,#-1); if (!p1.new) jump:t +0x00 0xe3 0xc9 0x13 +# CHECK: p1 = tstbit(r9, #0); if (!p1.new) jump:t +0x00 0xd5 0x09 0x12 +# CHECK: p1 = cmp.eq(r9, #21); if (p1.new) jump:nt +0x00 0xf5 0x09 0x12 +# CHECK: p1 = cmp.eq(r9, #21); if (p1.new) jump:t +0x00 0xd5 0x49 0x12 +# CHECK: p1 = cmp.eq(r9, #21); if (!p1.new) jump:nt +0x00 0xf5 0x49 0x12 +# CHECK: p1 = cmp.eq(r9, #21); if (!p1.new) jump:t +0x00 0xd5 0x89 0x12 +# CHECK: p1 = cmp.gt(r9, #21); if (p1.new) jump:nt +0x00 0xf5 0x89 0x12 +# CHECK: p1 = cmp.gt(r9, #21); if (p1.new) jump:t +0x00 0xd5 0xc9 0x12 +# CHECK: p1 = cmp.gt(r9, #21); if (!p1.new) jump:nt +0x00 0xf5 0xc9 0x12 +# CHECK: p1 = cmp.gt(r9, #21); if (!p1.new) jump:t +0x00 0xd5 0x09 0x13 +# CHECK: p1 = cmp.gtu(r9, #21); if (p1.new) jump:nt +0x00 0xf5 0x09 0x13 +# CHECK: p1 = cmp.gtu(r9, #21); if (p1.new) jump:t +0x00 0xd5 0x49 0x13 +# CHECK: p1 = cmp.gtu(r9, #21); if (!p1.new) jump:nt +0x00 0xf5 0x49 0x13 +# CHECK: p1 = cmp.gtu(r9, #21); if (!p1.new) jump:t +0x00 0xcd 0x09 0x14 +# CHECK: p0 = cmp.eq(r9, r13); if (p0.new) jump:nt +0x00 0xdd 0x09 0x14 +# CHECK: p1 = cmp.eq(r9, r13); if (p1.new) jump:nt +0x00 0xed 0x09 0x14 +# CHECK: p0 = cmp.eq(r9, r13); if (p0.new) jump:t +0x00 0xfd 0x09 0x14 +# CHECK: p1 = cmp.eq(r9, r13); if (p1.new) jump:t +0x00 0xcd 0x49 0x14 +# CHECK: p0 = cmp.eq(r9, r13); if (!p0.new) jump:nt +0x00 0xdd 0x49 0x14 +# CHECK: p1 = cmp.eq(r9, r13); if (!p1.new) jump:nt +0x00 0xed 0x49 0x14 +# CHECK: p0 = cmp.eq(r9, r13); if (!p0.new) jump:t +0x00 0xfd 0x49 0x14 +# CHECK: p1 = cmp.eq(r9, r13); if (!p1.new) jump:t +0x00 0xcd 0x89 0x14 +# CHECK: p0 = cmp.gt(r9, r13); if (p0.new) jump:nt +0x00 0xdd 0x89 0x14 +# CHECK: p1 = cmp.gt(r9, r13); if (p1.new) jump:nt +0x00 0xed 0x89 0x14 +# CHECK: p0 = cmp.gt(r9, r13); if (p0.new) jump:t +0x00 0xfd 0x89 0x14 +# CHECK: p1 = cmp.gt(r9, r13); if (p1.new) jump:t +0x00 0xcd 0xc9 0x14 +# CHECK: p0 = cmp.gt(r9, r13); if (!p0.new) jump:nt +0x00 0xdd 0xc9 0x14 +# CHECK: p1 = cmp.gt(r9, r13); if (!p1.new) jump:nt +0x00 0xed 0xc9 0x14 +# CHECK: p0 = cmp.gt(r9, r13); if (!p0.new) jump:t +0x00 0xfd 0xc9 0x14 +# CHECK: p1 = cmp.gt(r9, r13); if (!p1.new) jump:t +0x00 0xcd 0x09 0x15 +# CHECK: p0 = cmp.gtu(r9, r13); if (p0.new) jump:nt +0x00 0xdd 0x09 0x15 +# CHECK: p1 = cmp.gtu(r9, r13); if (p1.new) jump:nt +0x00 0xed 0x09 0x15 +# CHECK: p0 = cmp.gtu(r9, r13); if (p0.new) jump:t +0x00 0xfd 0x09 0x15 +# CHECK: p1 = cmp.gtu(r9, r13); if (p1.new) jump:t +0x00 0xcd 0x49 0x15 +# CHECK: p0 = cmp.gtu(r9, r13); if (!p0.new) jump:nt +0x00 0xdd 0x49 0x15 +# CHECK: p1 = cmp.gtu(r9, r13); if (!p1.new) jump:nt +0x00 0xed 0x49 0x15 +# CHECK: p0 = cmp.gtu(r9, r13); if (!p0.new) jump:t +0x00 0xfd 0x49 0x15 +# CHECK: p1 = cmp.gtu(r9, r13); if (!p1.new) jump:t + +# Jump to address +0x22 0xc0 0x00 0x58 +# CHECK: jump +0x22 0xc3 0x00 0x5c +# CHECK: if (p3) jump +0x22 0xc3 0x20 0x5c +# CHECK: if (!p3) jump + +# Jump to address conditioned on new predicate +0x03 0x40 0x45 0x85 0x00 0xcb 0x00 0x5c +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) jump:nt +0x03 0x40 0x45 0x85 0x00 0xdb 0x00 0x5c +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) jump:t +0x03 0x40 0x45 0x85 0x00 0xcb 0x20 0x5c +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) jump:nt +0x03 0x40 0x45 0x85 0x00 0xdb 0x20 0x5c +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) jump:t + +# Jump to address conditioned on register value +0x00 0xc0 0x11 0x61 +# CHECK: if (r17!=#0) jump:nt +0x00 0xd0 0x11 0x61 +# CHECK: if (r17!=#0) jump:t +0x00 0xc0 0x51 0x61 +# CHECK: if (r17>=#0) jump:nt +0x00 0xd0 0x51 0x61 +# CHECK: if (r17>=#0) jump:t +0x00 0xc0 0x91 0x61 +# CHECK: if (r17==#0) jump:nt +0x00 0xd0 0x91 0x61 +# CHECK: if (r17==#0) jump:t +0x00 0xc0 0xd1 0x61 +# CHECK: if (r17<=#0) jump:nt +0x00 0xd0 0xd1 0x61 +# CHECK: if (r17<=#0) jump:t + +# Transfer and jump +0x00 0xd5 0x09 0x16 +# CHECK: r9 = #21 ; jump +0x00 0xc9 0x0d 0x17 +# CHECK: r9 = r13 ; jump diff --git a/test/MC/Disassembler/Hexagon/jr.txt b/test/MC/Disassembler/Hexagon/jr.txt new file mode 100644 index 0000000..c9deb5f --- /dev/null +++ b/test/MC/Disassembler/Hexagon/jr.txt @@ -0,0 +1,34 @@ +# RUN: llvm-mc -triple hexagon -disassemble < %s | FileCheck %s +# Hexagon Programmer's Reference Manual 11.3 JR + +# Call subroutine from register +0x00 0xc0 0xb5 0x50 +# CHECK: callr r21 +0x00 0xc1 0x15 0x51 +# CHECK: if (p1) callr r21 +0x00 0xc3 0x35 0x51 +# CHECK: if (!p3) callr r21 + +# Hint an indirect jump address +0x00 0xc0 0xb5 0x52 +# CHECK: hintjr(r21) + +# Jump to address from register +0x00 0xc0 0x95 0x52 +# CHECK: jumpr r21 +0x00 0xc1 0x55 0x53 +# CHECK: if (p1) jumpr r21 +0x03 0x40 0x45 0x85 0x00 0xcb 0x55 0x53 +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) jumpr:nt r21 +0x03 0x40 0x45 0x85 0x00 0xdb 0x55 0x53 +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) jumpr:t r21 +0x00 0xc3 0x75 0x53 +# CHECK: if (!p3) jumpr r21 +0x03 0x40 0x45 0x85 0x00 0xcb 0x75 0x53 +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) jumpr:nt r21 +0x03 0x40 0x45 0x85 0x00 0xdb 0x75 0x53 +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) jumpr:t r21 diff --git a/test/MC/Disassembler/Hexagon/ld.txt b/test/MC/Disassembler/Hexagon/ld.txt new file mode 100644 index 0000000..15c23b6 --- /dev/null +++ b/test/MC/Disassembler/Hexagon/ld.txt @@ -0,0 +1,364 @@ +# 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) +0x10 0xc5 0xc0 0x49 +# CHECK: r17:16 = memd(##320) +0xb0 0xe0 0xd5 0x99 +# CHECK: r17:16 = memd(r21 ++ #40:circ(m1)) +0x10 0xe2 0xd5 0x99 +# CHECK: r17:16 = memd(r21 ++ I:circ(m1)) +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) +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)) +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 halfword +0x91 0xff 0x55 0x3a +# CHECK: r17 = memh(r21 + r31<<#3) +0x51 0xc5 0x40 0x49 +# CHECK: r17 = memh(##84) +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)) +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) + +# Load unsigned byte +0x91 0xff 0x35 0x3a +# CHECK: r17 = memub(r21 + r31<<#3) +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)) +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) +0x51 0xc5 0x60 0x49 +# CHECK: r17 = memuh(##84) +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)) +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) +0x91 0xc2 0x80 0x49 +# CHECK: r17 = memw(##80) +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)) +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)) +0xb1 0xc0 0x35 0x9a +# CHECK: r17 = membh(r21++#10) +0xb1 0xc0 0x75 0x9a +# CHECK: r17 = memubh(r21++#10) +0xb0 0xc0 0xb5 0x9a +# CHECK: r17:16 = memubh(r21++#20) +0xb0 0xc0 0xf5 0x9a +# CHECK: r17:16 = membh(r21++#20) +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) diff --git a/test/MC/Disassembler/Hexagon/lit.local.cfg b/test/MC/Disassembler/Hexagon/lit.local.cfg new file mode 100644 index 0000000..6500d4d --- /dev/null +++ b/test/MC/Disassembler/Hexagon/lit.local.cfg @@ -0,0 +1,3 @@ +if not 'Hexagon' in config.root.targets:
+ config.unsupported = True
+
diff --git a/test/MC/Disassembler/Hexagon/memop.txt b/test/MC/Disassembler/Hexagon/memop.txt new file mode 100644 index 0000000..47dfd93 --- /dev/null +++ b/test/MC/Disassembler/Hexagon/memop.txt @@ -0,0 +1,56 @@ +# RUN: llvm-mc -triple=hexagon -disassemble < %s | FileCheck %s +# Hexagon Programmer's Reference Manual 11.6 MEMOP + +# Operation on memory byte +0x95 0xd9 0x11 0x3e +# CHECK: memb(r17+#51) += r21 +0xb5 0xd9 0x11 0x3e +# CHECK: memb(r17+#51) -= r21 +0xd5 0xd9 0x11 0x3e +# CHECK: memb(r17+#51) &= r21 +0xf5 0xd9 0x11 0x3e +# CHECK: memb(r17+#51) |= r21 +0x95 0xd9 0x11 0x3f +# CHECK: memb(r17+#51) += #21 +0xb5 0xd9 0x11 0x3f +# CHECK: memb(r17+#51) -= #21 +0xd5 0xd9 0x11 0x3f +# CHECK: memb(r17+#51) = clrbit(#21) +0xf5 0xd9 0x11 0x3f +# CHECK: memb(r17+#51) = setbit(#21) + +# Operation on memory halfword +0x95 0xd9 0x31 0x3e +# CHECK: memh(r17+#102) += r21 +0xb5 0xd9 0x31 0x3e +# CHECK: memh(r17+#102) -= r21 +0xd5 0xd9 0x31 0x3e +# CHECK: memh(r17+#102) &= r21 +0xf5 0xd9 0x31 0x3e +# CHECK: memh(r17+#102) |= r21 +0x95 0xd9 0x31 0x3f +# CHECK: memh(r17+#102) += #21 +0xb5 0xd9 0x31 0x3f +# CHECK: memh(r17+#102) -= #21 +0xd5 0xd9 0x31 0x3f +# CHECK: memh(r17+#102) = clrbit(#21) +0xf5 0xd9 0x31 0x3f +# CHECK: memh(r17+#102) = setbit(#21) + +# Operation on memory word +0x95 0xd9 0x51 0x3e +# CHECK: memw(r17+#204) += r21 +0xb5 0xd9 0x51 0x3e +# CHECK: memw(r17+#204) -= r21 +0xd5 0xd9 0x51 0x3e +# CHECK: memw(r17+#204) &= r21 +0xf5 0xd9 0x51 0x3e +# CHECK: memw(r17+#204) |= r21 +0x95 0xd9 0x51 0x3f +# CHECK: memw(r17+#204) += #21 +0xb5 0xd9 0x51 0x3f +# CHECK: memw(r17+#204) -= #21 +0xd5 0xd9 0x51 0x3f +# CHECK: memw(r17+#204) = clrbit(#21) +0xf5 0xd9 0x51 0x3f +# CHECK: memw(r17+#204) = setbit(#21) diff --git a/test/MC/Disassembler/Hexagon/nv_j.txt b/test/MC/Disassembler/Hexagon/nv_j.txt new file mode 100644 index 0000000..a6773c3 --- /dev/null +++ b/test/MC/Disassembler/Hexagon/nv_j.txt @@ -0,0 +1,136 @@ +# RUN: llvm-mc -triple=hexagon -disassemble < %s | FileCheck %s +# Hexagon Programmer's Reference Manual 11.7.1 NV/J + +# Jump to address conditioned on new register value +0x11 0x40 0x71 0x70 0x92 0xd5 0x02 0x20 +# CHECK: r17 = r17 +# CHECK-NEXT: if (cmp.eq(r2.new, r21)) jump:nt +0x11 0x40 0x71 0x70 0x92 0xf5 0x02 0x20 +# CHECK: r17 = r17 +# CHECK-NEXT: if (cmp.eq(r2.new, r21)) jump:t +0x11 0x40 0x71 0x70 0x92 0xd5 0x42 0x20 +# CHECK: r17 = r17 +# CHECK-NEXT: if (!cmp.eq(r2.new, r21)) jump:nt +0x11 0x40 0x71 0x70 0x92 0xf5 0x42 0x20 +# CHECK: r17 = r17 +# CHECK-NEXT: if (!cmp.eq(r2.new, r21)) jump:t +0x11 0x40 0x71 0x70 0x92 0xd5 0x82 0x20 +# CHECK: r17 = r17 +# CHECK-NEXT: if (cmp.gt(r2.new, r21)) jump:nt +0x11 0x40 0x71 0x70 0x92 0xf5 0x82 0x20 +# CHECK: r17 = r17 +# CHECK-NEXT: if (cmp.gt(r2.new, r21)) jump:t +0x11 0x40 0x71 0x70 0x92 0xd5 0xc2 0x20 +# CHECK: r17 = r17 +# CHECK-NEXT: if (!cmp.gt(r2.new, r21)) jump:nt +0x11 0x40 0x71 0x70 0x92 0xf5 0xc2 0x20 +# CHECK: r17 = r17 +# CHECK-NEXT: if (!cmp.gt(r2.new, r21)) jump:t +0x11 0x40 0x71 0x70 0x92 0xd5 0x02 0x21 +# CHECK: r17 = r17 +# CHECK-NEXT: if (cmp.gtu(r2.new, r21)) jump:nt +0x11 0x40 0x71 0x70 0x92 0xf5 0x02 0x21 +# CHECK: r17 = r17 +# CHECK-NEXT: if (cmp.gtu(r2.new, r21)) jump:t +0x11 0x40 0x71 0x70 0x92 0xd5 0x42 0x21 +# CHECK: r17 = r17 +# CHECK-NEXT: if (!cmp.gtu(r2.new, r21)) jump:nt +0x11 0x40 0x71 0x70 0x92 0xf5 0x42 0x21 +# CHECK: r17 = r17 +# CHECK-NEXT: if (!cmp.gtu(r2.new, r21)) jump:t +0x11 0x40 0x71 0x70 0x92 0xd5 0x82 0x21 +# CHECK: r17 = r17 +# CHECK-NEXT: if (cmp.gt(r21, r2.new)) jump:nt +0x11 0x40 0x71 0x70 0x92 0xf5 0x82 0x21 +# CHECK: r17 = r17 +# CHECK-NEXT: if (cmp.gt(r21, r2.new)) jump:t +0x11 0x40 0x71 0x70 0x92 0xd5 0xc2 0x21 +# CHECK: r17 = r17 +# CHECK-NEXT: if (!cmp.gt(r21, r2.new)) jump:nt +0x11 0x40 0x71 0x70 0x92 0xf5 0xc2 0x21 +# CHECK: r17 = r17 +# CHECK-NEXT: if (!cmp.gt(r21, r2.new)) jump:t +0x11 0x40 0x71 0x70 0x92 0xd5 0x02 0x22 +# CHECK: r17 = r17 +# CHECK-NEXT: if (cmp.gtu(r21, r2.new)) jump:nt +0x11 0x40 0x71 0x70 0x92 0xf5 0x02 0x22 +# CHECK: r17 = r17 +# CHECK-NEXT: if (cmp.gtu(r21, r2.new)) jump:t +0x11 0x40 0x71 0x70 0x92 0xd5 0x42 0x22 +# CHECK: r17 = r17 +# CHECK-NEXT: if (!cmp.gtu(r21, r2.new)) jump:nt +0x11 0x40 0x71 0x70 0x92 0xf5 0x42 0x22 +# CHECK: r17 = r17 +# CHECK-NEXT: if (!cmp.gtu(r21, r2.new)) jump:t +0x11 0x40 0x71 0x70 0x92 0xd5 0x02 0x24 +# CHECK: r17 = r17 +# CHECK-NEXT: if (cmp.eq(r2.new, #21)) jump:nt +0x11 0x40 0x71 0x70 0x92 0xf5 0x02 0x24 +# CHECK: r17 = r17 +# CHECK-NETX: if (cmp.eq(r2.new, #21)) jump:t +0x11 0x40 0x71 0x70 0x92 0xd5 0x42 0x24 +# CHECK: r17 = r17 +# CHECK-NEXT: if (!cmp.eq(r2.new, #21)) jump:nt +0x11 0x40 0x71 0x70 0x92 0xf5 0x42 0x24 +# CHECK: r17 = r17 +# CHECK-NEXT: if (!cmp.eq(r2.new, #21)) jump:t +0x11 0x40 0x71 0x70 0x92 0xd5 0x82 0x24 +# CHECK: r17 = r17 +# CHECK-NEXT: if (cmp.gt(r2.new, #21)) jump:nt +0x11 0x40 0x71 0x70 0x92 0xf5 0x82 0x24 +# CHECK: r17 = r17 +# CHECK-NEXT: if (cmp.gt(r2.new, #21)) jump:t +0x11 0x40 0x71 0x70 0x92 0xd5 0xc2 0x24 +# CHECK: r17 = r17 +# CHECK-NEXT: if (!cmp.gt(r2.new, #21)) jump:nt +0x11 0x40 0x71 0x70 0x92 0xf5 0xc2 0x24 +# CHECK: r17 = r17 +# CHECK-NEXT: if (!cmp.gt(r2.new, #21)) jump:t +0x11 0x40 0x71 0x70 0x92 0xd5 0x02 0x25 +# CHECK: r17 = r17 +# CHECK-NEXT: if (cmp.gtu(r2.new, #21)) jump:nt +0x11 0x40 0x71 0x70 0x92 0xf5 0x02 0x25 +# CHECK: r17 = r17 +# CHECK-NEXT: if (cmp.gtu(r2.new, #21)) jump:t +0x11 0x40 0x71 0x70 0x92 0xd5 0x42 0x25 +# CHECK: r17 = r17 +# CHECK-NEXT: if (!cmp.gtu(r2.new, #21)) jump:nt +0x11 0x40 0x71 0x70 0x92 0xf5 0x42 0x25 +# CHECK: r17 = r17 +# CHECK-NEXT: if (!cmp.gtu(r2.new, #21)) jump:t +0x11 0x40 0x71 0x70 0x92 0xc0 0x82 0x25 +# CHECK: r17 = r17 +# CHECK-NEXT: if (tstbit(r2.new, #0)) jump:nt +0x11 0x40 0x71 0x70 0x92 0xe0 0x82 0x25 +# CHECK: r17 = r17 +# CHECK-NEXT: if (tstbit(r2.new, #0)) jump:t +0x11 0x40 0x71 0x70 0x92 0xc0 0xc2 0x25 +# CHECK: r17 = r17 +# CHECK-NEXT: if (!tstbit(r2.new, #0)) jump:nt +0x11 0x40 0x71 0x70 0x92 0xe0 0xc2 0x25 +# CHECK: r17 = r17 +# CHECK-NEXT: if (!tstbit(r2.new, #0)) jump:t +0x11 0x40 0x71 0x70 0x92 0xc0 0x02 0x26 +# CHECK: r17 = r17 +# CHECK-NEXT: if (cmp.eq(r2.new, #-1)) jump:nt +0x11 0x40 0x71 0x70 0x92 0xe0 0x02 0x26 +# CHECK: r17 = r17 +# CHECK-NEXT: if (cmp.eq(r2.new, #-1)) jump:t +0x11 0x40 0x71 0x70 0x92 0xc0 0x42 0x26 +# CHECK: r17 = r17 +# CHECK-NEXT: if (!cmp.eq(r2.new, #-1)) jump:nt +0x11 0x40 0x71 0x70 0x92 0xe0 0x42 0x26 +# CHECK: r17 = r17 +# CHECK-NEXT: if (!cmp.eq(r2.new, #-1)) jump:t +0x11 0x40 0x71 0x70 0x92 0xc0 0x82 0x26 +# CHECK: r17 = r17 +# CHECK-NEXT: if (cmp.gt(r2.new, #-1)) jump:nt +0x11 0x40 0x71 0x70 0x92 0xe0 0x82 0x26 +# CHECK: r17 = r17 +# CHECK-NEXT: if (cmp.gt(r2.new, #-1)) jump:t +0x11 0x40 0x71 0x70 0x92 0xc0 0xc2 0x26 +# CHECK: r17 = r17 +# CHECK-NEXT: if (!cmp.gt(r2.new, #-1)) jump:nt +0x11 0x40 0x71 0x70 0x92 0xe0 0xc2 0x26 +# CHECK: r17 = r17 +# CHECK-NEXT: if (!cmp.gt(r2.new, #-1)) jump:t diff --git a/test/MC/Disassembler/Hexagon/nv_st.txt b/test/MC/Disassembler/Hexagon/nv_st.txt new file mode 100644 index 0000000..ef49455 --- /dev/null +++ b/test/MC/Disassembler/Hexagon/nv_st.txt @@ -0,0 +1,203 @@ +# RUN: llvm-mc -triple=hexagon -disassemble < %s | FileCheck %s +# Hexagon Programmer's Reference Manual 11.7.2 NV/ST + +# Store new-value byte +0x1f 0x40 0x7f 0x70 0x82 0xf5 0xb1 0x3b +# CHECK: r31 = r31 +# CHECK-NEXT: memb(r17 + r21<<#3) = r2.new +0x1f 0x40 0x7f 0x70 0x15 0xc2 0xb1 0xa1 +# CHECK: r31 = r31 +# CHECK-NEXT: memb(r17+#21) = r2.new +0x1f 0x40 0x7f 0x70 0x02 0xe2 0xb1 0xa9 +# CHECK: r31 = r31 +# CHECK-NEXT: memb(r17 ++ I:circ(m1)) = r2.new +0x1f 0x40 0x7f 0x70 0x28 0xe2 0xb1 0xa9 +# CHECK: r31 = r31 +# CHECK-NEXT: memb(r17 ++ #5:circ(m1)) = r2.new +0x1f 0x40 0x7f 0x70 0x28 0xc2 0xb1 0xab +# CHECK: r31 = r31 +# CHECK-NEXT: memb(r17++#5) = r2.new +0x1f 0x40 0x7f 0x70 0x00 0xe2 0xb1 0xad +# CHECK: r31 = r31 +# CHECK-NEXT: memb(r17++m1) = r2.new +0x1f 0x40 0x7f 0x70 0x00 0xe2 0xb1 0xaf +# CHECK: r31 = r31 +# CHECK-NEXT: memb(r17 ++ m1:brev) = r2.new + +# Store new-value byte conditionally +0x1f 0x40 0x7f 0x70 0xe2 0xf5 0xb1 0x34 +# CHECK: r31 = r31 +# CHECK-NEXT: if (p3) memb(r17+r21<<#3) = r2.new +0x1f 0x40 0x7f 0x70 0xe2 0xf5 0xb1 0x35 +# CHECK: r31 = r31 +# CHECK-NEXT: if (!p3) memb(r17+r21<<#3) = r2.new +0x03 0x40 0x45 0x85 0x1f 0x40 0x7f 0x70 0xe2 0xf5 0xb1 0x36 +# CHECK: p3 = r5 +# CHECK-NEXT: r31 = r31 +# CHECK-NEXT: if (p3.new) memb(r17+r21<<#3) = r2.new +0x03 0x40 0x45 0x85 0x1f 0x40 0x7f 0x70 0xe2 0xf5 0xb1 0x37 +# CHECK: p3 = r5 +# CHECK-NEXT: r31 = r31 +# CHECK-NEXT: if (!p3.new) memb(r17+r21<<#3) = r2.new +0x1f 0x40 0x7f 0x70 0xab 0xc2 0xb1 0x40 +# CHECK: r31 = r31 +# CHECK-NEXT: if (p3) memb(r17+#21) = r2.new +0x1f 0x40 0x7f 0x70 0xab 0xc2 0xb1 0x44 +# CHECK: r31 = r31 +# CHECK-NEXT: if (!p3) memb(r17+#21) = r2.new +0x03 0x40 0x45 0x85 0x1f 0x40 0x7f 0x70 0xab 0xc2 0xb1 0x42 +# CHECK: p3 = r5 +# CHECK-NEXT: r31 = r31 +# CHECK-NEXT: if (p3.new) memb(r17+#21) = r2.new +0x03 0x40 0x45 0x85 0x1f 0x40 0x7f 0x70 0xab 0xc2 0xb1 0x46 +# CHECK: p3 = r5 +# CHECK-NEXT: r31 = r31 +# CHECK-NEXT: if (!p3.new) memb(r17+#21) = r2.new +0x1f 0x40 0x7f 0x70 0x2b 0xe2 0xb1 0xab +# CHECK: r31 = r31 +# CHECK-NEXT: if (p3) memb(r17++#5) = r2.new +0x1f 0x40 0x7f 0x70 0x2f 0xe2 0xb1 0xab +# CHECK: r31 = r31 +# CHECK-NEXT: if (!p3) memb(r17++#5) = r2.new +0x03 0x40 0x45 0x85 0x1f 0x40 0x7f 0x70 0xab 0xe2 0xb1 0xab +# CHECK: p3 = r5 +# CHECK-NEXT: r31 = r31 +# CHECK-NEXT: if (p3.new) memb(r17++#5) = r2.new +0x03 0x40 0x45 0x85 0x1f 0x40 0x7f 0x70 0xaf 0xe2 0xb1 0xab +# CHECK: p3 = r5 +# CHECK-NEXT: r31 = r31 +# CHECK-NEXT: if (!p3.new) memb(r17++#5) = r2.new + +# Store new-value halfword +0x1f 0x40 0x7f 0x70 0x8a 0xf5 0xb1 0x3b +# CHECK: r31 = r31 +# CHECK-NEXT: memh(r17 + r21<<#3) = r2.new +0x1f 0x40 0x7f 0x70 0x15 0xca 0xb1 0xa1 +# CHECK: r31 = r31 +# CHECK-NEXT: memh(r17+#42) = r2.new +0x1f 0x40 0x7f 0x70 0x02 0xea 0xb1 0xa9 +# CHECK: r31 = r31 +# CHECK-NEXT: memh(r17 ++ I:circ(m1)) = r2.new +0x1f 0x40 0x7f 0x70 0x28 0xea 0xb1 0xa9 +# CHECK: r31 = r31 +# CHECK-NEXT: memh(r17 ++ #10:circ(m1)) = r2.new +0x1f 0x40 0x7f 0x70 0x28 0xca 0xb1 0xab +# CHECK: r31 = r31 +# CHECK-NEXT: memh(r17++#10) = r2.new +0x1f 0x40 0x7f 0x70 0x00 0xea 0xb1 0xad +# CHECK: r31 = r31 +# CHECK-NEXT: memh(r17++m1) = r2.new +0x1f 0x40 0x7f 0x70 0x00 0xea 0xb1 0xaf +# CHECK: r31 = r31 +# CHECK-NEXT: memh(r17 ++ m1:brev) = r2.new + +# Store new-value halfword conditionally +0x1f 0x40 0x7f 0x70 0xea 0xf5 0xb1 0x34 +# CHECK: r31 = r31 +# CHECK-NEXT: if (p3) memh(r17+r21<<#3) = r2.new +0x1f 0x40 0x7f 0x70 0xea 0xf5 0xb1 0x35 +# CHECK: r31 = r31 +# CHECK-NEXT: if (!p3) memh(r17+r21<<#3) = r2.new +0x03 0x40 0x45 0x85 0x1f 0x40 0x7f 0x70 0xea 0xf5 0xb1 0x36 +# CHECK: p3 = r5 +# CHECK-NEXT: r31 = r31 +# CHECK-NEXT: if (p3.new) memh(r17+r21<<#3) = r2.new +0x03 0x40 0x45 0x85 0x1f 0x40 0x7f 0x70 0xea 0xf5 0xb1 0x37 +# CHECK: p3 = r5 +# CHECK-NEXT: r31 = r31 +# CHECK-NEXT: if (!p3.new) memh(r17+r21<<#3) = r2.new +0x1f 0x40 0x7f 0x70 0xab 0xca 0xb1 0x40 +# CHECK: r31 = r31 +# CHECK-NEXT: if (p3) memh(r17+#42) = r2.new +0x1f 0x40 0x7f 0x70 0xab 0xca 0xb1 0x44 +# CHECK: r31 = r31 +# CHECK-NEXT: if (!p3) memh(r17+#42) = r2.new +0x03 0x40 0x45 0x85 0x1f 0x40 0x7f 0x70 0xab 0xca 0xb1 0x42 +# CHECK: p3 = r5 +# CHECK-NEXT: r31 = r31 +# CHECK-NEXT: if (p3.new) memh(r17+#42) = r2.new +0x03 0x40 0x45 0x85 0x1f 0x40 0x7f 0x70 0xab 0xca 0xb1 0x46 +# CHECK: p3 = r5 +# CHECK-NEXT: r31 = r31 +# CHECK-NEXT: if (!p3.new) memh(r17+#42) = r2.new +0x1f 0x40 0x7f 0x70 0x2b 0xea 0xb1 0xab +# CHECK: r31 = r31 +# CHECK-NEXT: if (p3) memh(r17++#10) = r2.new +0x1f 0x40 0x7f 0x70 0x2f 0xea 0xb1 0xab +# CHECK: r31 = r31 +# CHECK-NEXT: if (!p3) memh(r17++#10) = r2.new +0x03 0x40 0x45 0x85 0x1f 0x40 0x7f 0x70 0xab 0xea 0xb1 0xab +# CHECK: p3 = r5 +# CHECK-NEXT: r31 = r31 +# CHECK-NEXT: if (p3.new) memh(r17++#10) = r2.new +0x03 0x40 0x45 0x85 0x1f 0x40 0x7f 0x70 0xaf 0xea 0xb1 0xab +# CHECK: p3 = r5 +# CHECK-NEXT: r31 = r31 +# CHECK-NEXT: if (!p3.new) memh(r17++#10) = r2.new + +# Store new-value word +0x1f 0x40 0x7f 0x70 0x92 0xf5 0xb1 0x3b +# CHECK: r31 = r31 +# CHECK-NEXT: memw(r17 + r21<<#3) = r2.new +0x1f 0x40 0x7f 0x70 0x15 0xd2 0xb1 0xa1 +# CHECK: r31 = r31 +# CHECK-NEXT: memw(r17+#84) = r2.new +0x1f 0x40 0x7f 0x70 0x28 0xf2 0xb1 0xa9 +# CHECK: r31 = r31 +# CHECK-NEXT: memw(r17 ++ #20:circ(m1)) = r2.new +0x1f 0x40 0x7f 0x70 0x02 0xf2 0xb1 0xa9 +# CHECK: r31 = r31 +# CHECK-NEXT: memw(r17 ++ I:circ(m1)) = r2.new +0x1f 0x40 0x7f 0x70 0x28 0xd2 0xb1 0xab +# CHECK: r31 = r31 +# CHECK-NEXT: memw(r17++#20) = r2.new +0x1f 0x40 0x7f 0x70 0x00 0xf2 0xb1 0xad +# CHECK: r31 = r31 +# CHECK-NEXT: memw(r17++m1) = r2.new +0x1f 0x40 0x7f 0x70 0x00 0xf2 0xb1 0xaf +# CHECK: r31 = r31 +# CHECK-NEXT: memw(r17 ++ m1:brev) = r2.new + +# Store new-value word conditionally +0x1f 0x40 0x7f 0x70 0xf2 0xf5 0xb1 0x34 +# CHECK: r31 = r31 +# CHECK-NEXT: if (p3) memw(r17+r21<<#3) = r2.new +0x1f 0x40 0x7f 0x70 0xf2 0xf5 0xb1 0x35 +# CHECK: r31 = r31 +# CHECK-NEXT: if (!p3) memw(r17+r21<<#3) = r2.new +0x03 0x40 0x45 0x85 0x1f 0x40 0x7f 0x70 0xf2 0xf5 0xb1 0x36 +# CHECK: p3 = r5 +# CHECK-NEXT: r31 = r31 +# CHECK-NEXT: if (p3.new) memw(r17+r21<<#3) = r2.new +0x03 0x40 0x45 0x85 0x1f 0x40 0x7f 0x70 0xf2 0xf5 0xb1 0x37 +# CHECK: p3 = r5 +# CHECK-NEXT: r31 = r31 +# CHECK-NEXT: if (!p3.new) memw(r17+r21<<#3) = r2.new +0x1f 0x40 0x7f 0x70 0xab 0xd2 0xb1 0x40 +# CHECK: r31 = r31 +# CHECK-NEXT: if (p3) memw(r17+#84) = r2.new +0x1f 0x40 0x7f 0x70 0xab 0xd2 0xb1 0x44 +# CHECK: r31 = r31 +# CHECK-NEXT: if (!p3) memw(r17+#84) = r2.new +0x03 0x40 0x45 0x85 0x1f 0x40 0x7f 0x70 0xab 0xd2 0xb1 0x42 +# CHECK: p3 = r5 +# CHECK-NEXT: r31 = r31 +# CHECK-NEXT: if (p3.new) memw(r17+#84) = r2.new +0x03 0x40 0x45 0x85 0x1f 0x40 0x7f 0x70 0xab 0xd2 0xb1 0x46 +# CHECK: p3 = r5 +# CHECK-NEXT: r31 = r31 +# CHECK-NEXT: if (!p3.new) memw(r17+#84) = r2.new +0x1f 0x40 0x7f 0x70 0x2b 0xf2 0xb1 0xab +# CHECK: r31 = r31 +# CHECK-NEXT: if (p3) memw(r17++#20) = r2.new +0x1f 0x40 0x7f 0x70 0x2f 0xf2 0xb1 0xab +# CHECK: r31 = r31 +# CHECK-NEXT: if (!p3) memw(r17++#20) = r2.new +0x03 0x40 0x45 0x85 0x1f 0x40 0x7f 0x70 0xab 0xf2 0xb1 0xab +# CHECK: p3 = r5 +# CHECK-NEXT: r31 = r31 +# CHECK-NEXT: if (p3.new) memw(r17++#20) = r2.new +0x03 0x40 0x45 0x85 0x1f 0x40 0x7f 0x70 0xaf 0xf2 0xb1 0xab +# CHECK: p3 = r5 +# CHECK-NEXT: r31 = r31 +# CHECK-NEXT: if (!p3.new) memw(r17++#20) = r2.new diff --git a/test/MC/Disassembler/Hexagon/st.txt b/test/MC/Disassembler/Hexagon/st.txt new file mode 100644 index 0000000..3b809d3 --- /dev/null +++ b/test/MC/Disassembler/Hexagon/st.txt @@ -0,0 +1,288 @@ +# RUN: llvm-mc -triple=hexagon -disassemble < %s | FileCheck %s +# Hexagon Programmer's Reference Manual 11.8 ST + +# Store doubleword +0x9e 0xf5 0xd1 0x3b +# CHECK: memd(r17 + r21<<#3) = r31:30 +0x28 0xd4 0xc0 0x48 +# CHECK: memd(##320) = r21:20 +0x15 0xd4 0xd1 0xa1 +# CHECK: memd(r17+#168) = r21:20 +0x02 0xf4 0xd1 0xa9 +# CHECK: memd(r17 ++ I:circ(m1)) = r21:20 +0x28 0xf4 0xd1 0xa9 +# CHECK: memd(r17 ++ #40:circ(m1)) = r21:20 +0x28 0xd4 0xd1 0xab +# CHECK: memd(r17++#40) = r21:20 +0x00 0xf4 0xd1 0xad +# CHECK: memd(r17++m1) = r21:20 +0x00 0xf4 0xd1 0xaf +# CHECK: memd(r17 ++ m1:brev) = r21:20 + +# Store doubleword conditionally +0xfe 0xf5 0xd1 0x34 +# CHECK: if (p3) memd(r17+r21<<#3) = r31:30 +0xfe 0xf5 0xd1 0x35 +# CHECK: if (!p3) memd(r17+r21<<#3) = r31:30 +0x03 0x40 0x45 0x85 0xfe 0xf5 0xd1 0x36 +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) memd(r17+r21<<#3) = r31:30 +0x03 0x40 0x45 0x85 0xfe 0xf5 0xd1 0x37 +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) memd(r17+r21<<#3) = r31:30 +0xab 0xde 0xd1 0x40 +# CHECK: if (p3) memd(r17+#168) = r31:30 +0xab 0xde 0xd1 0x44 +# CHECK: if (!p3) memd(r17+#168) = r31:30 +0x03 0x40 0x45 0x85 0xab 0xde 0xd1 0x42 +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) memd(r17+#168) = r31:30 +0x03 0x40 0x45 0x85 0xab 0xde 0xd1 0x46 +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) memd(r17+#168) = r31:30 +0x2b 0xf4 0xd1 0xab +# CHECK: if (p3) memd(r17++#40) = r21:20 +0x2f 0xf4 0xd1 0xab +# CHECK: if (!p3) memd(r17++#40) = r21:20 +0x03 0x40 0x45 0x85 0xab 0xf4 0xd1 0xab +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) memd(r17++#40) = r21:20 +0x03 0x40 0x45 0x85 0xaf 0xf4 0xd1 0xab +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) memd(r17++#40) = r21:20 + +# Store byte +0x9f 0xf5 0x11 0x3b +# CHECK: memb(r17 + r21<<#3) = r31 +0x9f 0xca 0x11 0x3c +# CHECK: memb(r17+#21)=#31 +0x15 0xd5 0x00 0x48 +# CHECK: memb(##21) = r21 +0x15 0xd5 0x11 0xa1 +# CHECK: memb(r17+#21) = r21 +0x02 0xf5 0x11 0xa9 +# CHECK: memb(r17 ++ I:circ(m1)) = r21 +0x28 0xf5 0x11 0xa9 +# CHECK: memb(r17 ++ #5:circ(m1)) = r21 +0x28 0xd5 0x11 0xab +# CHECK: memb(r17++#5) = r21 +0x00 0xf5 0x11 0xad +# CHECK: memb(r17++m1) = r21 +0x00 0xf5 0x11 0xaf +# CHECK: memb(r17 ++ m1:brev) = r21 + +# Store byte conditionally +0xff 0xf5 0x11 0x34 +# CHECK: if (p3) memb(r17+r21<<#3) = r31 +0xff 0xf5 0x11 0x35 +# CHECK: if (!p3) memb(r17+r21<<#3) = r31 +0x03 0x40 0x45 0x85 0xff 0xf5 0x11 0x36 +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) memb(r17+r21<<#3) = r31 +0x03 0x40 0x45 0x85 0xff 0xf5 0x11 0x37 +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) memb(r17+r21<<#3) = r31 +0xff 0xca 0x11 0x38 +# CHECK: if (p3) memb(r17+#21)=#31 +0xff 0xca 0x91 0x38 +# CHECK: if (!p3) memb(r17+#21)=#31 +0x03 0x40 0x45 0x85 0xff 0xca 0x11 0x39 +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) memb(r17+#21)=#31 +0x03 0x40 0x45 0x85 0xff 0xca 0x91 0x39 +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) memb(r17+#21)=#31 +0xab 0xdf 0x11 0x40 +# CHECK: if (p3) memb(r17+#21) = r31 +0xab 0xdf 0x11 0x44 +# CHECK: if (!p3) memb(r17+#21) = r31 +0x03 0x40 0x45 0x85 0xab 0xdf 0x11 0x42 +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) memb(r17+#21) = r31 +0x03 0x40 0x45 0x85 0xab 0xdf 0x11 0x46 +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) memb(r17+#21) = r31 +0x2b 0xf5 0x11 0xab +# CHECK: if (p3) memb(r17++#5) = r21 +0x2f 0xf5 0x11 0xab +# CHECK: if (!p3) memb(r17++#5) = r21 +0x03 0x40 0x45 0x85 0xab 0xf5 0x11 0xab +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) memb(r17++#5) = r21 +0x03 0x40 0x45 0x85 0xaf 0xf5 0x11 0xab +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) memb(r17++#5) = r21 + +# Store halfword +0x9f 0xf5 0x51 0x3b +# CHECK: memh(r17 + r21<<#3) = r31 +0x9f 0xf5 0x71 0x3b +# CHECK: memh(r17 + r21<<#3) = r31.h +0x95 0xcf 0x31 0x3c +# CHECK: memh(r17+#62)=#21 +0x2a 0xd5 0x40 0x48 +# CHECK: memh(##84) = r21 +0x2a 0xd5 0x60 0x48 +# CHECK: memh(##84) = r21.h +0x15 0xdf 0x51 0xa1 +# CHECK: memh(r17+#42) = r31 +0x15 0xdf 0x71 0xa1 +# CHECK: memh(r17+#42) = r31.h +0x02 0xf5 0x51 0xa9 +# CHECK: memh(r17 ++ I:circ(m1)) = r21 +0x28 0xf5 0x51 0xa9 +# CHECK: memh(r17 ++ #10:circ(m1)) = r21 +0x02 0xf5 0x71 0xa9 +# CHECK: memh(r17 ++ I:circ(m1)) = r21.h +0x28 0xf5 0x71 0xa9 +# CHECK: memh(r17 ++ #10:circ(m1)) = r21.h +0x28 0xd5 0x51 0xab +# CHECK: memh(r17++#10) = r21 +0x28 0xd5 0x71 0xab +# CHECK: memh(r17++#10) = r21.h +0x00 0xf5 0x51 0xad +# CHECK: memh(r17++m1) = r21 +0x00 0xf5 0x71 0xad +# CHECK: memh(r17++m1) = r21.h +0x00 0xf5 0x51 0xaf +# CHECK: memh(r17 ++ m1:brev) = r21 +0x00 0xf5 0x71 0xaf +# CHECK: memh(r17 ++ m1:brev) = r21.h + +# Store halfword conditionally +0xff 0xf5 0x51 0x34 +# CHECK: if (p3) memh(r17+r21<<#3) = r31 +0xff 0xf5 0x71 0x34 +# CHECK: if (p3) memh(r17+r21<<#3) = r31.h +0xff 0xf5 0x51 0x35 +# CHECK: if (!p3) memh(r17+r21<<#3) = r31 +0xff 0xf5 0x71 0x35 +# CHECK: if (!p3) memh(r17+r21<<#3) = r31.h +0x03 0x40 0x45 0x85 0xff 0xf5 0x51 0x36 +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) memh(r17+r21<<#3) = r31 +0x03 0x40 0x45 0x85 0xff 0xf5 0x71 0x36 +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) memh(r17+r21<<#3) = r31.h +0x03 0x40 0x45 0x85 0xff 0xf5 0x51 0x37 +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) memh(r17+r21<<#3) = r31 +0x03 0x40 0x45 0x85 0xff 0xf5 0x71 0x37 +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) memh(r17+r21<<#3) = r31.h +0xf5 0xcf 0x31 0x38 +# CHECK: if (p3) memh(r17+#62)=#21 +0xf5 0xcf 0xb1 0x38 +# CHECK: if (!p3) memh(r17+#62)=#21 +0x03 0x40 0x45 0x85 0xf5 0xcf 0x31 0x39 +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) memh(r17+#62)=#21 +0x03 0x40 0x45 0x85 0xf5 0xcf 0xb1 0x39 +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) memh(r17+#62)=#21 +0xfb 0xd5 0x51 0x40 +# CHECK: if (p3) memh(r17+#62) = r21 +0xfb 0xd5 0x71 0x40 +# CHECK: if (p3) memh(r17+#62) = r21.h +0xfb 0xd5 0x51 0x44 +# CHECK: if (!p3) memh(r17+#62) = r21 +0xfb 0xd5 0x71 0x44 +# CHECK: if (!p3) memh(r17+#62) = r21.h +0x03 0x40 0x45 0x85 0xfb 0xd5 0x51 0x42 +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) memh(r17+#62) = r21 +0x03 0x40 0x45 0x85 0xfb 0xd5 0x71 0x42 +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) memh(r17+#62) = r21.h +0x03 0x40 0x45 0x85 0xfb 0xd5 0x51 0x46 +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) memh(r17+#62) = r21 +0x03 0x40 0x45 0x85 0xfb 0xd5 0x71 0x46 +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) memh(r17+#62) = r21.h +0x2b 0xf5 0x51 0xab +# CHECK: if (p3) memh(r17++#10) = r21 +0x2f 0xf5 0x51 0xab +# CHECK: if (!p3) memh(r17++#10) = r21 +0x03 0x40 0x45 0x85 0xab 0xf5 0x51 0xab +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) memh(r17++#10) = r21 +0x03 0x40 0x45 0x85 0xaf 0xf5 0x51 0xab +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) memh(r17++#10) = r21 +0x2b 0xf5 0x71 0xab +# CHECK: if (p3) memh(r17++#10) = r21.h +0x2f 0xf5 0x71 0xab +# CHECK: if (!p3) memh(r17++#10) = r21.h +0x03 0x40 0x45 0x85 0xab 0xf5 0x71 0xab +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) memh(r17++#10) = r21.h +0x03 0x40 0x45 0x85 0xaf 0xf5 0x71 0xab +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) memh(r17++#10) = r21.h + +# Store word +0x9f 0xf5 0x91 0x3b +# CHECK: memw(r17 + r21<<#3) = r31 +0x9f 0xca 0x51 0x3c +# CHECK: memw(r17+#84)=#31 +0x15 0xdf 0x91 0xa1 +# CHECK: memw(r17+#84) = r31 +0x14 0xd5 0x80 0x48 +# CHECK: memw(##80) = r21 +0x02 0xf5 0x91 0xa9 +# CHECK: memw(r17 ++ I:circ(m1)) = r21 +0x28 0xf5 0x91 0xa9 +# CHECK: memw(r17 ++ #20:circ(m1)) = r21 +0x28 0xd5 0x91 0xab +# CHECK: memw(r17++#20) = r21 +0x00 0xf5 0x91 0xad +# CHECK: memw(r17++m1) = r21 +0x00 0xf5 0x91 0xaf +# CHECK: memw(r17 ++ m1:brev) = r21 + +# Store word conditionally +0xff 0xf5 0x91 0x34 +# CHECK: if (p3) memw(r17+r21<<#3) = r31 +0xff 0xf5 0x91 0x35 +# CHECK: if (!p3) memw(r17+r21<<#3) = r31 +0x03 0x40 0x45 0x85 0xff 0xf5 0x91 0x36 +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) memw(r17+r21<<#3) = r31 +0x03 0x40 0x45 0x85 0xff 0xf5 0x91 0x37 +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) memw(r17+r21<<#3) = r31 +0xff 0xca 0x51 0x38 +# CHECK: if (p3) memw(r17+#84)=#31 +0xff 0xca 0xd1 0x38 +# CHECK: if (!p3) memw(r17+#84)=#31 +0x03 0x40 0x45 0x85 0xff 0xca 0x51 0x39 +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) memw(r17+#84)=#31 +0x03 0x40 0x45 0x85 0xff 0xca 0xd1 0x39 +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) memw(r17+#84)=#31 +0xab 0xdf 0x91 0x40 +# CHECK: if (p3) memw(r17+#84) = r31 +0xab 0xdf 0x91 0x44 +# CHECK: if (!p3) memw(r17+#84) = r31 +0x03 0x40 0x45 0x85 0xab 0xdf 0x91 0x42 +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) memw(r17+#84) = r31 +0x03 0x40 0x45 0x85 0xab 0xdf 0x91 0x46 +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) memw(r17+#84) = r31 +0x2b 0xf5 0x91 0xab +# CHECK: if (p3) memw(r17++#20) = r21 +0x2f 0xf5 0x91 0xab +# CHECK: if (!p3) memw(r17++#20) = r21 +0x03 0x40 0x45 0x85 0xaf 0xf5 0x91 0xab +# CHECK: p3 = r5 +# CHECK-NEXT: if (!p3.new) memw(r17++#20) = r21 +0x03 0x40 0x45 0x85 0xab 0xf5 0x91 0xab +# CHECK: p3 = r5 +# CHECK-NEXT: if (p3.new) memw(r17++#20) = r21 + +# Allocate stack frame +0x1f 0xc0 0x9d 0xa0 +# CHECK: allocframe(#248)
\ No newline at end of file diff --git a/test/MC/Disassembler/Hexagon/system_user.txt b/test/MC/Disassembler/Hexagon/system_user.txt new file mode 100644 index 0000000..d55a94e --- /dev/null +++ b/test/MC/Disassembler/Hexagon/system_user.txt @@ -0,0 +1,26 @@ +# RUN: llvm-mc -triple=hexagon -disassemble < %s | FileCheck %s +# Hexagon Programmer's Reference Manual 11.9.1 SYSTEM/USER + +# Load locked +0x11 0xc0 0x15 0x92 +# CHECK: r17 = memw_locked(r21) +0x10 0xd0 0x15 0x92 +# CHECK: r17:16 = memd_locked(r21) + +# Store conditional +0x03 0xd5 0xb1 0xa0 +# CHECK: memw_locked(r17, p3) = r21 +0x03 0xd4 0xf1 0xa0 +# CHECK: memd_locked(r17, p3) = r21:20 + +# Memory barrier +0x00 0xc0 0x00 0xa8 +# CHECK: barrier + +# Data cache prefetch +0x15 0xc0 0x11 0x94 +# CHECK: dcfetch(r17 + #168) + +# Send value to ETM trace +0x00 0xc0 0x51 0x62 +# CHECK: trace(r17) diff --git a/test/MC/Disassembler/Hexagon/xtype_alu.txt b/test/MC/Disassembler/Hexagon/xtype_alu.txt new file mode 100644 index 0000000..03d0f05 --- /dev/null +++ b/test/MC/Disassembler/Hexagon/xtype_alu.txt @@ -0,0 +1,395 @@ +# 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 diff --git a/test/MC/Disassembler/Hexagon/xtype_bit.txt b/test/MC/Disassembler/Hexagon/xtype_bit.txt new file mode 100644 index 0000000..89b6906 --- /dev/null +++ b/test/MC/Disassembler/Hexagon/xtype_bit.txt @@ -0,0 +1,118 @@ +# RUN: llvm-mc -triple=hexagon -disassemble < %s | FileCheck %s +# Hexagon Programmer's Reference Manual 11.10.2 XTYPE/BIT + +# Count leading +0x11 0xc0 0x54 0x88 +# CHECK: r17 = clb(r21:20) +0x51 0xc0 0x54 0x88 +# CHECK: r17 = cl0(r21:20) +0x91 0xc0 0x54 0x88 +# CHECK: r17 = cl1(r21:20) +0x11 0xc0 0x74 0x88 +# CHECK: r17 = normamt(r21:20) +0x51 0xd7 0x74 0x88 +# CHECK: r17 = add(clb(r21:20), #23) +0x11 0xd7 0x35 0x8c +# CHECK: r17 = add(clb(r21), #23) +0x91 0xc0 0x15 0x8c +# CHECK: r17 = clb(r21) +0xb1 0xc0 0x15 0x8c +# CHECK: r17 = cl0(r21) +0xd1 0xc0 0x15 0x8c +# CHECK: r17 = cl1(r21) +0xf1 0xc0 0x15 0x8c +# CHECK: r17 = normamt(r21) + +# Count population +0x71 0xc0 0x74 0x88 +# CHECK: r17 = popcount(r21:20) + +# Count trailing +0x51 0xc0 0xf4 0x88 +# CHECK: r17 = ct0(r21:20) +0x91 0xc0 0xf4 0x88 +# CHECK: r17 = ct1(r21:20) +0x91 0xc0 0x55 0x8c +# CHECK: r17 = ct0(r21) +0xb1 0xc0 0x55 0x8c +# CHECK: r17 = ct1(r21) + +# Extract bitfield +0xf0 0xdf 0x54 0x81 +# CHECK: r17:16 = extractu(r21:20, #31, #23) +0xf0 0xdf 0x54 0x8a +# CHECK: r17:16 = extract(r21:20, #31, #23) +0xf1 0xdf 0x55 0x8d +# CHECK: r17 = extractu(r21, #31, #23) +0xf1 0xdf 0xd5 0x8d +# CHECK: r17 = extract(r21, #31, #23) +0x10 0xde 0x14 0xc1 +# CHECK: r17:16 = extractu(r21:20, r31:30) +0x90 0xde 0xd4 0xc1 +# CHECK: r17:16 = extract(r21:20, r31:30) +0x11 0xde 0x15 0xc9 +# CHECK: r17 = extractu(r21, r31:30) +0x51 0xde 0x15 0xc9 +# CHECK: r17 = extract(r21, r31:30) + +# Insert bitfield +0xf0 0xdf 0x54 0x83 +# CHECK: r17:16 = insert(r21:20, #31, #23) +0xf1 0xdf 0x55 0x8f +# CHECK: r17 = insert(r21, #31, #23) +0x11 0xde 0x15 0xc8 +# CHECK: r17 = insert(r21, r31:30) +0x10 0xde 0x14 0xca +# CHECK: r17:16 = insert(r21:20, r31:30) + +# Interleave/deinterleave +0x90 0xc0 0xd4 0x80 +# CHECK: r17:16 = deinterleave(r21:20) +0xb0 0xc0 0xd4 0x80 +# CHECK: r17:16 = interleave(r21:20) + +# Linear feedback-shift iteration +0xd0 0xde 0x94 0xc1 +# CHECK: r17:16 = lfs(r21:20, r31:30) + +# Masked parity +0x11 0xde 0x14 0xd0 +# CHECK: r17 = parity(r21:20, r31:30) +0x11 0xdf 0xf5 0xd5 +# CHECK: r17 = parity(r21, r31) + +# Bit reverse +0xd0 0xc0 0xd4 0x80 +# CHECK: r17:16 = brev(r21:20) +0xd1 0xc0 0x55 0x8c +# CHECK: r17 = brev(r21) + +# Set/clear/toggle bit +0x11 0xdf 0xd5 0x8c +# CHECK: r17 = setbit(r21, #31) +0x31 0xdf 0xd5 0x8c +# CHECK: r17 = clrbit(r21, #31) +0x51 0xdf 0xd5 0x8c +# CHECK: r17 = togglebit(r21, #31) +0x11 0xdf 0x95 0xc6 +# CHECK: r17 = setbit(r21, r31) +0x51 0xdf 0x95 0xc6 +# CHECK: r17 = clrbit(r21, r31) +0x91 0xdf 0x95 0xc6 +# CHECK: r17 = togglebit(r21, r31) + +# Split bitfield +0x90 0xdf 0xd5 0x88 +# CHECK: r17:16 = bitsplit(r21, #31) +0x10 0xdf 0x35 0xd4 +# CHECK: r17:16 = bitsplit(r21, r31) + +# Table index +0xf1 0xcd 0x15 0x87 +# CHECK: r17 = tableidxb(r21, #7, #13):raw +0xf1 0xcd 0x55 0x87 +# CHECK: r17 = tableidxh(r21, #7, #13):raw +0xf1 0xcd 0x95 0x87 +# CHECK: r17 = tableidxw(r21, #7, #13):raw +0xf1 0xcd 0xd5 0x87 +# CHECK: r17 = tableidxd(r21, #7, #13):raw diff --git a/test/MC/Disassembler/Hexagon/xtype_complex.txt b/test/MC/Disassembler/Hexagon/xtype_complex.txt new file mode 100644 index 0000000..2332082 --- /dev/null +++ b/test/MC/Disassembler/Hexagon/xtype_complex.txt @@ -0,0 +1,128 @@ +# RUN: llvm-mc -triple=hexagon -disassemble < %s | FileCheck %s +# Hexagon Programmer's Reference Manual 11.10.3 XTYPE/COMPLEX + +# Complex add/sub halfwords +0x90 0xde 0x54 0xc1 +# CHECK: r17:16 = vxaddsubh(r21:20, r31:30):sat +0xd0 0xde 0x54 0xc1 +# CHECK: r17:16 = vxsubaddh(r21:20, r31:30):sat +0x10 0xde 0xd4 0xc1 +# CHECK: r17:16 = vxaddsubh(r21:20, r31:30):rnd:>>1:sat +0x50 0xde 0xd4 0xc1 +# CHECK: r17:16 = vxsubaddh(r21:20, r31:30):rnd:>>1:sat + +# Complex add/sub words +0x10 0xde 0x54 0xc1 +# CHECK: r17:16 = vxaddsubw(r21:20, r31:30):sat +0x50 0xde 0x54 0xc1 +# CHECK: r17:16 = vxsubaddw(r21:20, r31:30):sat + +# Complex multiply +0xd0 0xdf 0x15 0xe5 +# CHECK: r17:16 = cmpy(r21, r31):sat +0xd0 0xdf 0x95 0xe5 +# CHECK: r17:16 = cmpy(r21, r31):<<1:sat +0xd0 0xdf 0x55 0xe5 +# CHECK: r17:16 = cmpy(r21, r31*):sat +0xd0 0xdf 0xd5 0xe5 +# CHECK: r17:16 = cmpy(r21, r31*):<<1:sat +0xd0 0xdf 0x15 0xe7 +# CHECK: r17:16 += cmpy(r21, r31):sat +0xd0 0xdf 0x95 0xe7 +# CHECK: r17:16 += cmpy(r21, r31):<<1:sat +0xf0 0xdf 0x15 0xe7 +# CHECK: r17:16 -= cmpy(r21, r31):sat +0xf0 0xdf 0x95 0xe7 +# CHECK: r17:16 -= cmpy(r21, r31):<<1:sat +0xd0 0xdf 0x55 0xe7 +# CHECK: r17:16 += cmpy(r21, r31*):sat +0xd0 0xdf 0xd5 0xe7 +# CHECK: r17:16 += cmpy(r21, r31*):<<1:sat +0xf0 0xdf 0x55 0xe7 +# CHECK: r17:16 -= cmpy(r21, r31*):sat +0xf0 0xdf 0xd5 0xe7 +# CHECK: r17:16 -= cmpy(r21, r31*):<<1:sat + +# Complex multiply real or imaginary +0x30 0xdf 0x15 0xe5 +# CHECK: r17:16 = cmpyi(r21, r31) +0x50 0xdf 0x15 0xe5 +# CHECK: r17:16 = cmpyr(r21, r31) +0x30 0xdf 0x15 0xe7 +# CHECK: r17:16 += cmpyi(r21, r31) +0x50 0xdf 0x15 0xe7 +# CHECK: r17:16 += cmpyr(r21, r31) + +# Complex multiply with round and pack +0xd1 0xdf 0x35 0xed +# CHECK: r17 = cmpy(r21, r31):rnd:sat +0xd1 0xdf 0xb5 0xed +# CHECK: r17 = cmpy(r21, r31):<<1:rnd:sat +0xd1 0xdf 0x75 0xed +# CHECK: r17 = cmpy(r21, r31*):rnd:sat +0xd1 0xdf 0xf5 0xed +# CHECK: r17 = cmpy(r21, r31*):<<1:rnd:sat + +# Complex multiply 32x16 +0x91 0xdf 0x14 0xc5 +# CHECK: r17 = cmpyiwh(r21:20, r31):<<1:rnd:sat +0xb1 0xdf 0x14 0xc5 +# CHECK: r17 = cmpyiwh(r21:20, r31*):<<1:rnd:sat +0xd1 0xdf 0x14 0xc5 +# CHECK: r17 = cmpyrwh(r21:20, r31):<<1:rnd:sat +0xf1 0xdf 0x14 0xc5 +# CHECK: r17 = cmpyrwh(r21:20, r31*):<<1:rnd:sat + +# Vector complex multiply real or imaginary +0xd0 0xde 0x34 0xe8 +# CHECK: r17:16 = vcmpyr(r21:20, r31:30):sat +0xd0 0xde 0xb4 0xe8 +# CHECK: r17:16 = vcmpyr(r21:20, r31:30):<<1:sat +0xd0 0xde 0x54 0xe8 +# CHECK: r17:16 = vcmpyi(r21:20, r31:30):sat +0xd0 0xde 0xd4 0xe8 +# CHECK: r17:16 = vcmpyi(r21:20, r31:30):<<1:sat +0x90 0xde 0x34 0xea +# CHECK: r17:16 += vcmpyr(r21:20, r31:30):sat +0x90 0xde 0x54 0xea +# CHECK: r17:16 += vcmpyi(r21:20, r31:30):sat + +# Vector complex conjugate +0xf0 0xc0 0x94 0x80 +# CHECK: r17:16 = vconj(r21:20):sat + +# Vector complex rotate +0x10 0xdf 0xd4 0xc3 +# CHECK: r17:16 = vcrotate(r21:20, r31) + +# Vector reduce complex multiply real or imaginary +0x10 0xde 0x14 0xe8 +# CHECK: r17:16 = vrcmpyi(r21:20, r31:30) +0x30 0xde 0x14 0xe8 +# CHECK: r17:16 = vrcmpyr(r21:20, r31:30) +0x10 0xde 0x54 0xe8 +# CHECK: r17:16 = vrcmpyi(r21:20, r31:30*) +0x30 0xde 0x74 0xe8 +# CHECK: r17:16 = vrcmpyr(r21:20, r31:30*) + +# Vector reduce complex multiply by scalar +0x90 0xde 0xb4 0xe8 +# CHECK: r17:16 = vrcmpys(r21:20, r31:30):<<1:sat:raw:hi +0x90 0xde 0xf4 0xe8 +# CHECK: r17:16 = vrcmpys(r21:20, r31:30):<<1:sat:raw:lo +0x90 0xde 0xb4 0xea +# CHECK: r17:16 += vrcmpys(r21:20, r31:30):<<1:sat:raw:hi +0x90 0xde 0xf4 0xea +# CHECK: r17:16 += vrcmpys(r21:20, r31:30):<<1:sat:raw:lo + +# Vector reduce complex multiply by scalar with round and pack +0xd1 0xde 0xb4 0xe9 +# CHECK: r17 = vrcmpys(r21:20, r31:30):<<1:rnd:sat:raw:hi +0xf1 0xde 0xb4 0xe9 +# CHECK: r17 = vrcmpys(r21:20, r31:30):<<1:rnd:sat:raw:lo + +# Vector reduce complex rotate +0xf0 0xff 0xd4 0xc3 +# CHECK: r17:16 = vrcrotate(r21:20, r31, #3) +0x30 0xff 0xb4 0xcb +# CHECK: r17:16 += vrcrotate(r21:20, r31, #3) diff --git a/test/MC/Disassembler/Hexagon/xtype_fp.txt b/test/MC/Disassembler/Hexagon/xtype_fp.txt new file mode 100644 index 0000000..7007420 --- /dev/null +++ b/test/MC/Disassembler/Hexagon/xtype_fp.txt @@ -0,0 +1,146 @@ +# RUN: llvm-mc -triple=hexagon -disassemble < %s | FileCheck %s +# Hexagon Programmer's Reference Manual 11.10.4 XTYPE/FP + +# Floating point addition +0x11 0xdf 0x15 0xeb +# CHECK: r17 = sfadd(r21, r31) + +# Classify floating-point value +0x03 0xd5 0xf1 0x85 +# CHECK: p3 = sfclass(r17, #21) +0xb3 0xc2 0x90 0xdc +# CHECK: p3 = dfclass(r17:16, #21) + +# Compare floating-point value +0x03 0xd5 0xf1 0xc7 +# CHECK: p3 = sfcmp.ge(r17, r21) +0x23 0xd5 0xf1 0xc7 +# CHECK: p3 = sfcmp.uo(r17, r21) +0x63 0xd5 0xf1 0xc7 +# CHECK: p3 = sfcmp.eq(r17, r21) +0x83 0xd5 0xf1 0xc7 +# CHECK: p3 = sfcmp.gt(r17, r21) +0x03 0xd4 0xf0 0xd2 +# CHECK: p3 = dfcmp.eq(r17:16, r21:20) +0x23 0xd4 0xf0 0xd2 +# CHECK: p3 = dfcmp.gt(r17:16, r21:20) +0x43 0xd4 0xf0 0xd2 +# CHECK: p3 = dfcmp.ge(r17:16, r21:20) +0x63 0xd4 0xf0 0xd2 +# CHECK: p3 = dfcmp.uo(r17:16, r21:20) + +# Convert floating-point value to other format +0x10 0xc0 0x95 0x84 +# CHECK: r17:16 = convert_sf2df(r21) +0x31 0xc0 0x14 0x88 +# CHECK: r17 = convert_df2sf(r21:20) + +# Convert integer to floating-point value +0x50 0xc0 0xf4 0x80 +# CHECK: r17:16 = convert_ud2df(r21:20) +0x70 0xc0 0xf4 0x80 +# CHECK: r17:16 = convert_d2df(r21:20) +0x30 0xc0 0x95 0x84 +# CHECK: r17:16 = convert_uw2df(r21) +0x50 0xc0 0x95 0x84 +# CHECK: r17:16 = convert_w2df(r21) +0x31 0xc0 0x34 0x88 +# CHECK: r17 = convert_ud2sf(r21:20) +0x31 0xc0 0x54 0x88 +# CHECK: r17 = convert_d2sf(r21:20) +0x11 0xc0 0x35 0x8b +# CHECK: r17 = convert_uw2sf(r21) +0x11 0xc0 0x55 0x8b +# CHECK: r17 = convert_w2sf(r21) + +# Convert floating-point value to integer +0x10 0xc0 0xf4 0x80 +# CHECK: r17:16 = convert_df2d(r21:20) +0x30 0xc0 0xf4 0x80 +# CHECK: r17:16 = convert_df2ud(r21:20) +0xd0 0xc0 0xf4 0x80 +# CHECK: r17:16 = convert_df2d(r21:20):chop +0xf0 0xc0 0xf4 0x80 +# CHECK: r17:16 = convert_df2ud(r21:20):chop +0x70 0xc0 0x95 0x84 +# CHECK: r17:16 = convert_sf2ud(r21) +0x90 0xc0 0x95 0x84 +# CHECK: r17:16 = convert_sf2d(r21) +0xb0 0xc0 0x95 0x84 +# CHECK: r17:16 = convert_sf2ud(r21):chop +0xd0 0xc0 0x95 0x84 +# CHECK: r17:16 = convert_sf2d(r21):chop +0x31 0xc0 0x74 0x88 +# CHECK: r17 = convert_df2uw(r21:20) +0x31 0xc0 0x94 0x88 +# CHECK: r17 = convert_df2w(r21:20) +0x31 0xc0 0xb4 0x88 +# CHECK: r17 = convert_df2uw(r21:20):chop +0x31 0xc0 0xf4 0x88 +# CHECK: r17 = convert_df2w(r21:20):chop +0x11 0xc0 0x75 0x8b +# CHECK: r17 = convert_sf2uw(r21) +0x31 0xc0 0x75 0x8b +# CHECK: r17 = convert_sf2uw(r21):chop +0x11 0xc0 0x95 0x8b +# CHECK: r17 = convert_sf2w(r21) +0x31 0xc0 0x95 0x8b +# CHECK: r17 = convert_sf2w(r21):chop + +# Floating point extreme value assistance +0x11 0xc0 0xb5 0x8b +# CHECK: r17 = sffixupr(r21) +0x11 0xdf 0xd5 0xeb +# CHECK: r17 = sffixupn(r21, r31) +0x31 0xdf 0xd5 0xeb +# CHECK: r17 = sffixupd(r21, r31) + +# Floating point fused multiply-add +0x91 0xdf 0x15 0xef +# CHECK: r17 += sfmpy(r21, r31) +0xb1 0xdf 0x15 0xef +# CHECK: r17 -= sfmpy(r21, r31) + +# Floating point fused multiply-add with scaling +0xf1 0xdf 0x75 0xef +# CHECK: r17 += sfmpy(r21, r31, p3):scale + +# Floating point reciprocal square root approximation +0x71 0xc0 0xf5 0x8b +# CHECK: r17, p3 = sfinvsqrta(r21) + +# Floating point fused multiply-add for library routines +0xd1 0xdf 0x15 0xef +# CHECK: r17 += sfmpy(r21, r31):lib +0xf1 0xdf 0x15 0xef +# CHECK: r17 -= sfmpy(r21, r31):lib + +# Create floating-point constant +0xb1 0xc2 0x00 0xd6 +# CHECK: r17 = sfmake(#21):pos +0xb1 0xc2 0x40 0xd6 +# CHECK: r17 = sfmake(#21):neg +0xb0 0xc2 0x00 0xd9 +# CHECK: r17:16 = dfmake(#21):pos +0xb0 0xc2 0x40 0xd9 +# CHECK: r17:16 = dfmake(#21):neg + +# Floating point maximum +0x11 0xdf 0x95 0xeb +# CHECK: r17 = sfmax(r21, r31) + +# Floating point minimum +0x31 0xdf 0x95 0xeb +# CHECK: r17 = sfmin(r21, r31) + +# Floating point multiply +0x11 0xdf 0x55 0xeb +# CHECK: r17 = sfmpy(r21, r31) + +# Floating point reciprocal approximation +0xf1 0xdf 0xf5 0xeb +# CHECK: r17, p3 = sfrecipa(r21, r31) + +# Floating point subtraction +0x31 0xdf 0x15 0xeb +# CHECK: r17 = sfsub(r21, r31) diff --git a/test/MC/Disassembler/Hexagon/xtype_mpy.txt b/test/MC/Disassembler/Hexagon/xtype_mpy.txt new file mode 100644 index 0000000..ada3216 --- /dev/null +++ b/test/MC/Disassembler/Hexagon/xtype_mpy.txt @@ -0,0 +1,400 @@ +# 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) diff --git a/test/MC/Disassembler/Hexagon/xtype_perm.txt b/test/MC/Disassembler/Hexagon/xtype_perm.txt new file mode 100644 index 0000000..91d2fc5 --- /dev/null +++ b/test/MC/Disassembler/Hexagon/xtype_perm.txt @@ -0,0 +1,104 @@ +# RUN: llvm-mc -triple=hexagon -disassemble < %s | FileCheck %s +# Hexagon Programmer's Reference Manual 11.10.6 XTYPE/PERM + +# CABAC decode bin +0xd0 0xde 0xd4 0xc1 +# CHECK: r17:16 = decbin(r21:20, r31:30) + +# Saturate +0x11 0xc0 0xd4 0x88 +# CHECK: r17 = sat(r21:20) +0x91 0xc0 0xd5 0x8c +# CHECK: r17 = sath(r21) +0xb1 0xc0 0xd5 0x8c +# CHECK: r17 = satuh(r21) +0xd1 0xc0 0xd5 0x8c +# CHECK: r17 = satub(r21) +0xf1 0xc0 0xd5 0x8c +# CHECK: r17 = satb(r21) + +# Swizzle bytes +0xf1 0xc0 0x95 0x8c +# CHECK: r17 = swiz(r21) + +# Vector align +0x70 0xd4 0x1e 0xc2 +# CHECK: r17:16 = valignb(r21:20, r31:30, p3) +0x70 0xde 0x94 0xc2 +# CHECK: r17:16 = vspliceb(r21:20, r31:30, p3) + +# Vector round and pack +0x91 0xc0 0x94 0x88 +# CHECK: r17 = vrndwh(r21:20) +0xd1 0xc0 0x94 0x88 +# CHECK: r17 = vrndwh(r21:20):sat + +# Vector saturate and pack +0x11 0xc0 0x14 0x88 +# CHECK: r17 = vsathub(r21:20) +0x51 0xc0 0x14 0x88 +# CHECK: r17 = vsatwh(r21:20) +0x91 0xc0 0x14 0x88 +# CHECK: r17 = vsatwuh(r21:20) +0xd1 0xc0 0x14 0x88 +# CHECK: r17 = vsathb(r21:20) +0x11 0xc0 0x95 0x8c +# CHECK: r17 = vsathb(r21) +0x51 0xc0 0x95 0x8c +# CHECK: r17 = vsathub(r21) + +# Vector saturate without pack +0x90 0xc0 0x14 0x80 +# CHECK: r17:16 = vsathub(r21:20) +0xb0 0xc0 0x14 0x80 +# CHECK: r17:16 = vsatwuh(r21:20) +0xd0 0xc0 0x14 0x80 +# CHECK: r17:16 = vsatwh(r21:20) +0xf0 0xc0 0x14 0x80 +# CHECK: r17:16 = vsathb(r21:20) + +# Vector shuffle +0x50 0xde 0x14 0xc1 +# CHECK: r17:16 = shuffeb(r21:20, r31:30) +0x90 0xd4 0x1e 0xc1 +# CHECK: r17:16 = shuffob(r21:20, r31:30) +0xd0 0xde 0x14 0xc1 +# CHECK: r17:16 = shuffeh(r21:20, r31:30) +0x10 0xd4 0x9e 0xc1 +# CHECK: r17:16 = shuffoh(r21:20, r31:30) + +# Vector splat bytes +0xf1 0xc0 0x55 0x8c +# CHECK: r17 = vsplatb(r21) + +# Vector splat halfwords +0x50 0xc0 0x55 0x84 +# CHECK: r17:16 = vsplath(r21) + +# Vector splice +0x70 0xde 0x94 0xc0 +# CHECK: r17:16 = vspliceb(r21:20, r31:30, #3) +0x70 0xde 0x94 0xc2 +# CHECK: r17:16 = vspliceb(r21:20, r31:30, p3) + +# Vector sign extend +0x10 0xc0 0x15 0x84 +# CHECK: r17:16 = vsxtbh(r21) +0x90 0xc0 0x15 0x84 +# CHECK: r17:16 = vsxthw(r21) + +# Vector truncate +0x11 0xc0 0x94 0x88 +# CHECK: r17 = vtrunohb(r21:20) +0x51 0xc0 0x94 0x88 +# CHECK: r17 = vtrunehb(r21:20) +0x50 0xde 0x94 0xc1 +# CHECK: r17:16 = vtrunewh(r21:20, r31:30) +0x90 0xde 0x94 0xc1 +# CHECK: r17:16 = vtrunowh(r21:20, r31:30) + +# Vector zero extend +0x50 0xc0 0x15 0x84 +# CHECK: r17:16 = vzxtbh(r21) +0xd0 0xc0 0x15 0x84 +# CHECK: r17:16 = vzxthw(r21) diff --git a/test/MC/Disassembler/Hexagon/xtype_pred.txt b/test/MC/Disassembler/Hexagon/xtype_pred.txt new file mode 100644 index 0000000..cec6d1b --- /dev/null +++ b/test/MC/Disassembler/Hexagon/xtype_pred.txt @@ -0,0 +1,136 @@ +# RUN: llvm-mc -triple=hexagon -disassemble < %s | FileCheck %s +# Hexagon Programmer's Reference Manual 11.10.7 XTYPE/PRED + +# Bounds check +0x83 0xf4 0x10 0xd2 +# CHECK: p3 = boundscheck(r17:16, r21:20):raw:lo +0xa3 0xf4 0x10 0xd2 +# CHECK: p3 = boundscheck(r17:16, r21:20):raw:hi + +# Compare byte +0x43 0xd5 0xd1 0xc7 +# CHECK: p3 = cmpb.gt(r17, r21) +0xc3 0xd5 0xd1 0xc7 +# CHECK: p3 = cmpb.eq(r17, r21) +0xe3 0xd5 0xd1 0xc7 +# CHECK: p3 = cmpb.gtu(r17, r21) +0xa3 0xc2 0x11 0xdd +# CHECK: p3 = cmpb.eq(r17, #21) +0xa3 0xc2 0x31 0xdd +# CHECK: p3 = cmpb.gt(r17, #21) +0xa3 0xc2 0x51 0xdd +# CHECK: p3 = cmpb.gtu(r17, #21) + +# Compare half +0x63 0xd5 0xd1 0xc7 +# CHECK: p3 = cmph.eq(r17, r21) +0x83 0xd5 0xd1 0xc7 +# CHECK: p3 = cmph.gt(r17, r21) +0xa3 0xd5 0xd1 0xc7 +# CHECK: p3 = cmph.gtu(r17, r21) +0xab 0xc2 0x11 0xdd +# CHECK: p3 = cmph.eq(r17, #21) +0xab 0xc2 0x31 0xdd +# CHECK: p3 = cmph.gt(r17, #21) +0xab 0xc2 0x51 0xdd +# CHECK: p3 = cmph.gtu(r17, #21) + +# Compare doublewords +0x03 0xde 0x94 0xd2 +# CHECK: p3 = cmp.eq(r21:20, r31:30) +0x43 0xde 0x94 0xd2 +# CHECK: p3 = cmp.gt(r21:20, r31:30) +0x83 0xde 0x94 0xd2 +# CHECK: p3 = cmp.gtu(r21:20, r31:30) + +# Compare bitmask +0x03 0xd5 0x91 0x85 +# CHECK: p3 = bitsclr(r17, #21) +0x03 0xd5 0xb1 0x85 +# CHECK: p3 = !bitsclr(r17, #21) +0x03 0xd5 0x51 0xc7 +# CHECK: p3 = bitsset(r17, r21) +0x03 0xd5 0x71 0xc7 +# CHECK: p3 = !bitsset(r17, r21) +0x03 0xd5 0x91 0xc7 +# CHECK: p3 = bitsclr(r17, r21) +0x03 0xd5 0xb1 0xc7 +# CHECK: p3 = !bitsclr(r17, r21) + +# mask generate from predicate +0x10 0xc3 0x00 0x86 +# CHECK: r17:16 = mask(p3) + +# Check for TLB match +0x63 0xf5 0x10 0xd2 +# CHECK: p3 = tlbmatch(r17:16, r21) + +# Predicate Transfer +0x03 0xc0 0x45 0x85 +# CHECK: p3 = r5 +0x05 0xc0 0x43 0x89 +# CHECK: r5 = p3 + +# Test bit +0x03 0xd5 0x11 0x85 +# CHECK: p3 = tstbit(r17, #21) +0x03 0xd5 0x31 0x85 +# CHECK: p3 = !tstbit(r17, #21) +0x03 0xd5 0x11 0xc7 +# CHECK: p3 = tstbit(r17, r21) +0x03 0xd5 0x31 0xc7 +# CHECK: p3 = !tstbit(r17, r21) + +# Vector compare halfwords +0x63 0xde 0x14 0xd2 +# CHECK: p3 = vcmph.eq(r21:20, r31:30) +0x83 0xde 0x14 0xd2 +# CHECK: p3 = vcmph.gt(r21:20, r31:30) +0xa3 0xde 0x14 0xd2 +# CHECK: p3 = vcmph.gtu(r21:20, r31:30) +0xeb 0xc3 0x14 0xdc +# CHECK: p3 = vcmph.eq(r21:20, #31) +0xeb 0xc3 0x34 0xdc +# CHECK: p3 = vcmph.gt(r21:20, #31) +0xeb 0xc3 0x54 0xdc +# CHECK: p3 = vcmph.gtu(r21:20, #31) + +# Vector compare bytes for any match +0x03 0xfe 0x14 0xd2 +# CHECK: p3 = any8(vcmpb.eq(r21:20, r31:30)) + +# Vector compare bytes +0x63 0xde 0x14 0xd2 +# CHECK: p3 = vcmph.eq(r21:20, r31:30) +0x83 0xde 0x14 0xd2 +# CHECK: p3 = vcmph.gt(r21:20, r31:30) +0xa3 0xde 0x14 0xd2 +# CHECK: p3 = vcmph.gtu(r21:20, r31:30) +0xeb 0xc3 0x14 0xdc +# CHECK: p3 = vcmph.eq(r21:20, #31) +0xeb 0xc3 0x34 0xdc +# CHECK: p3 = vcmph.gt(r21:20, #31) +0xeb 0xc3 0x54 0xdc +# CHECK: p3 = vcmph.gtu(r21:20, #31) + +# Vector compare words +0x03 0xde 0x14 0xd2 +# CHECK: p3 = vcmpw.eq(r21:20, r31:30) +0x23 0xde 0x14 0xd2 +# CHECK: p3 = vcmpw.gt(r21:20, r31:30) +0x43 0xde 0x14 0xd2 +# CHECK: p3 = vcmpw.gtu(r21:20, r31:30) +0xf3 0xc3 0x14 0xdc +# CHECK: p3 = vcmpw.eq(r21:20, #31) +0xf3 0xc3 0x34 0xdc +# CHECK: p3 = vcmpw.gt(r21:20, #31) +0xf3 0xc3 0x54 0xdc +# CHECK: p3 = vcmpw.gtu(r21:20, #31) + +# Viterbi pack even and odd predicate bits +0x11 0xc2 0x03 0x89 +# CHECK: r17 = vitpack(p3, p2) + +# Vector mux +0x70 0xde 0x14 0xd1 +# CHECK: r17:16 = vmux(p3, r21:20, r31:30) diff --git a/test/MC/Disassembler/Hexagon/xtype_shift.txt b/test/MC/Disassembler/Hexagon/xtype_shift.txt new file mode 100644 index 0000000..e2d6816 --- /dev/null +++ b/test/MC/Disassembler/Hexagon/xtype_shift.txt @@ -0,0 +1,260 @@ +# RUN: llvm-mc -triple=hexagon -disassemble < %s | FileCheck %s +# Hexagon Programmer's Reference Manual 11.10.8 XTYPE/SHIFT + +# Shift by immediate +0x10 0xdf 0x14 0x80 +# CHECK: r17:16 = asr(r21:20, #31) +0x30 0xdf 0x14 0x80 +# CHECK: r17:16 = lsr(r21:20, #31) +0x50 0xdf 0x14 0x80 +# CHECK: r17:16 = asl(r21:20, #31) +0x11 0xdf 0x15 0x8c +# CHECK: r17 = asr(r21, #31) +0x31 0xdf 0x15 0x8c +# CHECK: r17 = lsr(r21, #31) +0x51 0xdf 0x15 0x8c +# CHECK: r17 = asl(r21, #31) + +# Shift by immediate and accumulate +0x10 0xdf 0x14 0x82 +# CHECK: r17:16 -= asr(r21:20, #31) +0x30 0xdf 0x14 0x82 +# CHECK: r17:16 -= lsr(r21:20, #31) +0x50 0xdf 0x14 0x82 +# CHECK: r17:16 -= asl(r21:20, #31) +0x90 0xdf 0x14 0x82 +# CHECK: r17:16 += asr(r21:20, #31) +0xb0 0xdf 0x14 0x82 +# CHECK: r17:16 += lsr(r21:20, #31) +0xd0 0xdf 0x14 0x82 +# CHECK: r17:16 += asl(r21:20, #31) +0x11 0xdf 0x15 0x8e +# CHECK: r17 -= asr(r21, #31) +0x31 0xdf 0x15 0x8e +# CHECK: r17 -= lsr(r21, #31) +0x51 0xdf 0x15 0x8e +# CHECK: r17 -= asl(r21, #31) +0x91 0xdf 0x15 0x8e +# CHECK: r17 += asr(r21, #31) +0xb1 0xdf 0x15 0x8e +# CHECK: r17 += lsr(r21, #31) +0xd1 0xdf 0x15 0x8e +# CHECK: r17 += asl(r21, #31) +0x4c 0xf7 0x11 0xde +# CHECK: r17 = add(#21, asl(r17, #23)) +0x4e 0xf7 0x11 0xde +# CHECK: r17 = sub(#21, asl(r17, #23)) +0x5c 0xf7 0x11 0xde +# CHECK: r17 = add(#21, lsr(r17, #23)) +0x5e 0xf7 0x11 0xde +# CHECK: r17 = sub(#21, lsr(r17, #23)) + +# Shift by immediate and add +0xf1 0xd5 0x1f 0xc4 +# CHECK: r17 = addasl(r21, r31, #7) + +# Shift by immediate and logical +0x10 0xdf 0x54 0x82 +# CHECK: r17:16 &= asr(r21:20, #31) +0x30 0xdf 0x54 0x82 +# CHECK: r17:16 &= lsr(r21:20, #31) +0x50 0xdf 0x54 0x82 +# CHECK: r17:16 &= asl(r21:20, #31) +0x90 0xdf 0x54 0x82 +# CHECK: r17:16 |= asr(r21:20, #31) +0xb0 0xdf 0x54 0x82 +# CHECK: r17:16 |= lsr(r21:20, #31) +0xd0 0xdf 0x54 0x82 +# CHECK: r17:16 |= asl(r21:20, #31) +0x30 0xdf 0x94 0x82 +# CHECK: r17:16 ^= lsr(r21:20, #31) +0x50 0xdf 0x94 0x82 +# CHECK: r17:16 ^= asl(r21:20, #31) +0x11 0xdf 0x55 0x8e +# CHECK: r17 &= asr(r21, #31) +0x31 0xdf 0x55 0x8e +# CHECK: r17 &= lsr(r21, #31) +0x51 0xdf 0x55 0x8e +# CHECK: r17 &= asl(r21, #31) +0x91 0xdf 0x55 0x8e +# CHECK: r17 |= asr(r21, #31) +0xb1 0xdf 0x55 0x8e +# CHECK: r17 |= lsr(r21, #31) +0xd1 0xdf 0x55 0x8e +# CHECK: r17 |= asl(r21, #31) +0x31 0xdf 0x95 0x8e +# CHECK: r17 ^= lsr(r21, #31) +0x51 0xdf 0x95 0x8e +# CHECK: r17 ^= asl(r21, #31) +0x48 0xff 0x11 0xde +# CHECK: r17 = and(#21, asl(r17, #31)) +0x4a 0xff 0x11 0xde +# CHECK: r17 = or(#21, asl(r17, #31)) +0x58 0xff 0x11 0xde +# CHECK: r17 = and(#21, lsr(r17, #31)) +0x5a 0xff 0x11 0xde +# CHECK: r17 = or(#21, lsr(r17, #31)) + +# Shift right by immediate with rounding +0xf0 0xdf 0xd4 0x80 +# CHECK: r17:16 = asr(r21:20, #31):rnd +0x11 0xdf 0x55 0x8c +# CHECK: r17 = asr(r21, #31):rnd + +# Shift left by immediate with saturation +0x51 0xdf 0x55 0x8c +# CHECK: r17 = asl(r21, #31):sat + +# Shift by register +0x10 0xdf 0x94 0xc3 +# CHECK: r17:16 = asr(r21:20, r31) +0x50 0xdf 0x94 0xc3 +# CHECK: r17:16 = lsr(r21:20, r31) +0x90 0xdf 0x94 0xc3 +# CHECK: r17:16 = asl(r21:20, r31) +0xd0 0xdf 0x94 0xc3 +# CHECK: r17:16 = lsl(r21:20, r31) +0x11 0xdf 0x55 0xc6 +# CHECK: r17 = asr(r21, r31) +0x51 0xdf 0x55 0xc6 +# CHECK: r17 = lsr(r21, r31) +0x91 0xdf 0x55 0xc6 +# CHECK: r17 = asl(r21, r31) +0xd1 0xdf 0x55 0xc6 +# CHECK: r17 = lsl(r21, r31) +0xf1 0xdf 0x8a 0xc6 +# CHECK: r17 = lsl(#21, r31) + +# Shift by register and accumulate +0x10 0xdf 0x94 0xcb +# CHECK: r17:16 -= asr(r21:20, r31) +0x50 0xdf 0x94 0xcb +# CHECK: r17:16 -= lsr(r21:20, r31) +0x90 0xdf 0x94 0xcb +# CHECK: r17:16 -= asl(r21:20, r31) +0xd0 0xdf 0x94 0xcb +# CHECK: r17:16 -= lsl(r21:20, r31) +0x10 0xdf 0xd4 0xcb +# CHECK: r17:16 += asr(r21:20, r31) +0x50 0xdf 0xd4 0xcb +# CHECK: r17:16 += lsr(r21:20, r31) +0x90 0xdf 0xd4 0xcb +# CHECK: r17:16 += asl(r21:20, r31) +0xd0 0xdf 0xd4 0xcb +# CHECK: r17:16 += lsl(r21:20, r31) +0x11 0xdf 0x95 0xcc +# CHECK: r17 -= asr(r21, r31) +0x51 0xdf 0x95 0xcc +# CHECK: r17 -= lsr(r21, r31) +0x91 0xdf 0x95 0xcc +# CHECK: r17 -= asl(r21, r31) +0xd1 0xdf 0x95 0xcc +# CHECK: r17 -= lsl(r21, r31) +0x11 0xdf 0xd5 0xcc +# CHECK: r17 += asr(r21, r31) +0x51 0xdf 0xd5 0xcc +# CHECK: r17 += lsr(r21, r31) +0x91 0xdf 0xd5 0xcc +# CHECK: r17 += asl(r21, r31) +0xd1 0xdf 0xd5 0xcc +# CHECK: r17 += lsl(r21, r31) + +# Shift by register and logical +0x10 0xdf 0x14 0xcb +# CHECK: r17:16 |= asr(r21:20, r31) +0x50 0xdf 0x14 0xcb +# CHECK: r17:16 |= lsr(r21:20, r31) +0x90 0xdf 0x14 0xcb +# CHECK: r17:16 |= asl(r21:20, r31) +0xd0 0xdf 0x14 0xcb +# CHECK: r17:16 |= lsl(r21:20, r31) +0x10 0xdf 0x54 0xcb +# CHECK: r17:16 &= asr(r21:20, r31) +0x50 0xdf 0x54 0xcb +# CHECK: r17:16 &= lsr(r21:20, r31) +0x90 0xdf 0x54 0xcb +# CHECK: r17:16 &= asl(r21:20, r31) +0xd0 0xdf 0x54 0xcb +# CHECK: r17:16 &= lsl(r21:20, r31) +0x10 0xdf 0x74 0xcb +# CHECK: r17:16 ^= asr(r21:20, r31) +0x50 0xdf 0x74 0xcb +# CHECK: r17:16 ^= lsr(r21:20, r31) +0x90 0xdf 0x74 0xcb +# CHECK: r17:16 ^= asl(r21:20, r31) +0xd0 0xdf 0x74 0xcb +# CHECK: r17:16 ^= lsl(r21:20, r31) +0x11 0xdf 0x15 0xcc +# CHECK: r17 |= asr(r21, r31) +0x51 0xdf 0x15 0xcc +# CHECK: r17 |= lsr(r21, r31) +0x91 0xdf 0x15 0xcc +# CHECK: r17 |= asl(r21, r31) +0xd1 0xdf 0x15 0xcc +# CHECK: r17 |= lsl(r21, r31) +0x11 0xdf 0x55 0xcc +# CHECK: r17 &= asr(r21, r31) +0x51 0xdf 0x55 0xcc +# CHECK: r17 &= lsr(r21, r31) +0x91 0xdf 0x55 0xcc +# CHECK: r17 &= asl(r21, r31) +0xd1 0xdf 0x55 0xcc +# CHECK: r17 &= lsl(r21, r31) + +# Shift by register with saturation +0x11 0xdf 0x15 0xc6 +# CHECK: r17 = asr(r21, r31):sat +0x91 0xdf 0x15 0xc6 +# CHECK: r17 = asl(r21, r31):sat + +# Vector shift halfwords by immediate +0x10 0xc5 0x94 0x80 +# CHECK: r17:16 = vasrh(r21:20, #5) +0x30 0xc5 0x94 0x80 +# CHECK: r17:16 = vlsrh(r21:20, #5) +0x50 0xc5 0x94 0x80 +# CHECK: r17:16 = vaslh(r21:20, #5) + +# Vector arithmetic shift halfwords with round +0x10 0xc5 0x34 0x80 +# CHECK: r17:16 = vasrh(r21:20, #5):raw + +# Vector arithmetic shift halfwords with saturate and pack +0x91 0xc5 0x74 0x88 +# CHECK: r17 = vasrhub(r21:20, #5):raw +0xb1 0xc5 0x74 0x88 +# CHECK: r17 = vasrhub(r21:20, #5):sat + +# Vector shift halfwords by register +0x10 0xdf 0x54 0xc3 +# CHECK: r17:16 = vasrh(r21:20, r31) +0x50 0xdf 0x54 0xc3 +# CHECK: r17:16 = vlsrh(r21:20, r31) +0x90 0xdf 0x54 0xc3 +# CHECK: r17:16 = vaslh(r21:20, r31) +0xd0 0xdf 0x54 0xc3 +# CHECK: r17:16 = vlslh(r21:20, r31) + +# Vector shift words by immediate +0x10 0xdf 0x54 0x80 +# CHECK: r17:16 = vasrw(r21:20, #31) +0x30 0xdf 0x54 0x80 +# CHECK: r17:16 = vlsrw(r21:20, #31) +0x50 0xdf 0x54 0x80 +# CHECK: r17:16 = vaslw(r21:20, #31) + +# Vector shift words by register +0x10 0xdf 0x14 0xc3 +# CHECK: r17:16 = vasrw(r21:20, r31) +0x50 0xdf 0x14 0xc3 +# CHECK: r17:16 = vlsrw(r21:20, r31) +0x90 0xdf 0x14 0xc3 +# CHECK: r17:16 = vaslw(r21:20, r31) +0xd0 0xdf 0x14 0xc3 +# CHECK: r17:16 = vlslw(r21:20, r31) + +# Vector shift words with truncate and pack +0x51 0xdf 0xd4 0x88 +# CHECK: r17 = vasrw(r21:20, #31) +0x51 0xdf 0x14 0xc5 +# CHECK: r17 = vasrw(r21:20, r31) |