NAME=hexagon jumps
FILE=bins/elf/analysis/hexagon-hello-loop
CMDS=<<EOF
b 0x100000
e analysis.jmp.cref=true
s sym.main
aaa
afx
EOF
EXPECT=<<EOF
c 0x00005124 -> 0x00005128 ?   jump 0x5128
c 0x00005130 -> 0x00005134 ?   if (P0) jump:nt 0x5154
c 0x00005130 -> 0x00005154 ?   if (P0) jump:nt 0x5154
c 0x00005134 -> 0x00005138 [   jump 0x5138
C 0x00005138 -> 0x000050e0 [   call sym.pHello
C 0x0000513c -> 0x000050f8 [   call sym.pWorld
c 0x00005140 -> 0x00005144 [   jump 0x5144
c 0x00005150 -> 0x00005128 ?   jump 0x5128
EOF
RUN

NAME=hexagon immext
FILE=bins/elf/analysis/hexagon-hello-loop
CMDS=<<EOF
b 0x100000
s 0x000050e4
pi 2
s 0x0000539c
pi 4
EOF
EXPECT=<<EOF
?   immext(##0xb0c0)
?   R0 = ##loc._MSG_BASE
?   immext(##0xd180)
?   R2 = ##0xd1ac
?   immext(##0xfe105000)
?   R3 = ##-0x1efb000
EOF
RUN

NAME=hexagon immediate search
FILE=bins/elf/analysis/hexagon-hello-loop
CMDS=<<EOF
b 0x100000
aar
/ai 0xdead
/ai 0xbeef
/ai -8
/ai 0x1c00
/ai 0xffffff40 0xffffffff
EOF
EXPECT=<<EOF
0x00000b80   # 4: [   R0.h = #0xdead
0x00000b84   # 4: [   R0.l = #0xbeef
0x00001e68   # 4: [   R4.l = #0xbeef
0x0000342c   # 4: |   if (!P3) memh(R23++#-0x8) = R11.h
0x0000511c   # 4: [   R2 = add(FP,##-0x8)
0x00005128   # 4: [   R2 = memw(FP+##-0x8)
0x00005144   # 4: [   R2 = memw(FP+##-0x8)
0x0000514c   # 4: [   memw(FP+##-0x8) = R2
0x0000564c   # 4: \   R2 = memw(R0+##-0x8)
0x00005654   # 4: \   if (P0.new) R17 = add(R16,##-0x8)
0x00005740   # 4: \   R17 = and(R2,##-0x8)
0x00005840   # 4: /   R4 = add(R2,##-0x8)
0x00005970   # 4: \   if (P2.new) R2 = add(R2,##-0x8)
0x000059d0   # 4: \   R1 = and(R1,##-0x8)
0x00005c88   # 4: |   if (P0.new) R2 = add(R2,##-0x8)
0x00005d00   # 4: |   if (P0.new) R2 = add(R2,##-0x8)
0x00006394   # 4: [   R4 = and(R4,##-0x8)
0x000063f8   # 4: [   R4 = and(R4,##-0x8)
0x0000641c   # 4: [   R4 = and(R4,##-0x8)
0x00006510   # 4: [   R4 = and(R4,##-0x8)
0x00006534   # 4: [   R4 = and(R4,##-0x8)
0x00007134   # 4: |   R3 = mux(P0,##-0x4,#-0x8)
0x0000747c   # 4: \   R2 = add(R2,##-0x8)
0x00007ee0   # 4: /   R17 = add(R17,##-0x8)
0x00008484   # 4: \   R2 = add(R16,add(R2,##-0x8))
0x0000848c   # 4: /   R2 = add(R2,##-0x8)
0x00008500   # 4: \   memd(R2+##-0x8) = R1:0
0x00008598   # 4: \   memd(R2+##-0x8) = R1:0
0x000087b8   # 4: \   memd(R3+##-0x8) = R1:0
0x00009b64   # 4: [   R2 = memw(R18+##-0x8)
0x0000afd8   # 4: /   R3 = and(R3,##-0x8)
0x00000aac   # 4: /   immext(##0x1c00)
0x00000ab4   # 4: |   immext(##0x1c00)
0x00000b44   # 4: /   immext(##0x1c00)
0x00005170   # 4: /   immext(##0x1c00)
0x00005178   # 4: |   immext(##0x1c00)
0x00005180   # 4: /   immext(##0x1c00)
0x000060e4   # 4: /   immext(##0xffffffc0)
0x000060e8   # 4: |   R2 = add(R2,add(R3,##-0x30))
0x000061e4   # 4: /   immext(##0xffffffc0)
0x000061e8   # 4: |   R2 = add(R2,add(R3,##-0x30))
0x00006264   # 4: /   immext(##0xffffffc0)
0x00006268   # 4: |   R2 = add(R2,add(R3,##-0x30))
0x00007140   # 4: |   immext(##0xffffffc0)
0x00007144   # 4: |   R0 = add(##0xfffffffa,mpyi(R2,#0x6))
0x00009684   # 4: |   immext(##0xffffff40)
0x00009688   # 4: \   memh(R0+#0x0) = ##-0x81
EOF
RUN

NAME=hexagon extended immediate search
FILE=bins/elf/analysis/hexagon-hello-loop
BROKEN=1
CMDS=<<EOF
b 0x100000
aar
/ai sym.sys_TLSFreeAll
/ai sym.coredump
EOF
EXPECT=<<EOF
0x000051d4   # 4: ?   R1 = ##0x5410
0x00000b70   # 4: ?   jump sym.coredump
0x00000b7c   # 4: ?   jump sym.coredump
0x00000b8c   # 4: ?   jump sym.coredump
0x00000f48   # 4: ?   jump sym.coredump
0x000051f0   # 4: ?   R28 = ##sym.coredump
EOF
RUN

NAME=hexagon extended immediates
FILE==
CMDS=<<EOF
wx 00c0007fc045e401834080491ae24220
e asm.arch=hexagon
e analysis.arch=hexagon
pi 4
EOF
EXPECT=<<EOF
?   nop
/   immext(##0x1e417000)
|   R3 = memw(GP+##0x1e417004)
\   if (!cmp.eq(R3.new,R2)) jump:t 0x38
EOF
RUN

NAME=hexagon hardware loop simple
FILE==
CMDS=<<EOF
wx 12c03e6388c0006900c0007f0080007f00c0007f
e asm.arch=hexagon
e analysis.arch=hexagon
pi 5
EOF
EXPECT=<<EOF
?   PKTCOUNT = LR:FP
[   loop0(0x8,#0x10)
[   nop
/   nop
\   nop     < endloop0
EOF
RUN

NAME=hexagon hardware loop nested I
FILE==
CMDS=<<EOF
wx 00c0007f0bc0006900404d850040000076d09b9a0ac020690040007f07407c700040000087c40aab048063700080007f00c0007f
e asm.arch=hexagon
e analysis.arch=hexagon
pi 13
EOF
EXPECT=<<EOF
?   nop
[   loop0(0x8,#0x3)
/   P0 = R13
|   immext(##0x0)
\   R23:22 = memb_fifo(R27=##0x3)
[   loop1(0x18,#0x2)
/   nop
|   R7 = R28
|   immext(##0x0)
\   memb(R10=##0x7) = R4
/   R4 = R3
|   nop
\   nop     < endloop01
EOF
RUN

NAME=hexagon hardware loop nested II
FILE==
CMDS=<<EOF
wx 00c0007f0bc0206900404d850040000076d09b9a00c000580ac0006907807c7000c0007f044063700080007f00c0007f
e asm.arch=hexagon
e analysis.arch=hexagon
pi 12
EOF
EXPECT=<<EOF
?   nop
[   loop1(0x8,#0x3)
/   P0 = R13
|   immext(##0x0)
\   R23:22 = memb_fifo(R27=##0x3)
[   jump 0x14
[   loop0(0x1c,#0x2)
/   R7 = R28
\   nop     < endloop0
/   R4 = R3
|   nop
\   nop     < endloop1
EOF
RUN

NAME=hexagon undocumented hardware loop
FILE==
CMDS=<<EOF
wx 04c0947c20410069414041752240017543c00175838003b055314420
e asm.arch=hexagon
e analysis.arch=hexagon
pi 7
EOF
EXPECT=<<EOF
?   R5:4 = combine(#0x0,##0x28)
/   loop0(0x14,#0x4)
|   P1 = cmp.gt(R1,##0x2)
|   P2 = cmp.eq(R1,##0x1)
\   P3 = cmp.eq(R1,##0x2)
/   R3 = add(R3,##0x4)
\   R4 = add(R4,##0x4) ; R5 = add(R5,#1)     < endloop0
EOF
RUN


NAME=hexagon Nt.new register
FILE==
CMDS=<<EOF
wx ffffffff20400078e15f1076e25f107601d6bda120400078e15f1076e25f107601d4bda120400078e15f1076e25f107601d2bda1e15f107620400078e25f107601d4bda1fd5f10760040007fe25f107601d6bda1044411f30ae24221cc7fff59024402f300d2a3a103406070004d2f0c0040007800d4bda103406070004d2f0c0040007800d2bda1174d2f0c004400787140000000d2bda10340607000400078004d2f0c00d2bda10340607000400078004d2f0c00d4bda1
e asm.arch=hexagon
e analysis.arch=hexagon
pi 46
EOF
EXPECT=<<EOF
?   invalid
/   R0 = ##0x1
|   R1 = and(R16,##0xff)
|   R2 = and(R16,##0xff)
\   memw(SP+##0x4) = R0.new
/   R0 = ##0x1
|   R1 = and(R16,##0xff)
|   R2 = and(R16,##0xff)
\   memw(SP+##0x4) = R1.new
/   R0 = ##0x1
|   R1 = and(R16,##0xff)
|   R2 = and(R16,##0xff)
\   memw(SP+##0x4) = R2.new
/   R1 = and(R16,##0xff)
|   R0 = ##0x1
|   R2 = and(R16,##0xff)
\   memw(SP+##0x4) = R0.new
/   SP = and(R16,##0xff)
|   nop
|   R2 = and(R16,##0xff)
\   memw(SP+##0x4) = SP.new
/   R4 = add(R17,R4)
\   if (!cmp.gtu(R4.new,R2)) jump:t 0x68
/   jump 0xfffffff4
|   R2 = add(R2,R4)
\   memw(R3+##0x0) = R2.new
/   R3 = R0
|   immext(##0xc2f34000)
|   R0 = ##-0x3d0cc000
\   memw(SP+##0x0) = R3.new
/   R3 = R0
|   immext(##0xc2f34000)
|   R0 = ##-0x3d0cc000
\   memw(SP+##0x0) = R0.new
/   immext(##0xc2f345c0)
|   R0 = ##-0x3d0cba20
|   immext(##0x1c40)
\   memw(SP+##0x1c40) = R0.new
/   R3 = R0
|   R0 = ##0x0
|   immext(##0xc2f34000)
\   memw(SP+##-0x3d0cc000) = R0.new
/   R3 = R0
|   R0 = ##0x0
|   immext(##0xc2f34000)
\   memw(SP+##-0x3d0cc000) = R3.new
EOF
RUN

NAME=hexagon hash prefix
FILE==
CMDS=<<EOF
wx 00c0007f0bc0006900404d850040000076d09b9a0ac020690040007f07407c700040000087c40aab048063700080007f00c0007f
e asm.arch=hexagon
e analysis.arch=hexagon
e plugins.hexagon.imm.hash=false
pi 13
EOF
EXPECT=<<EOF
?   nop
[   loop0(0x8,0x3)
/   P0 = R13
|   immext(0x0)
\   R23:22 = memb_fifo(R27=0x3)
[   loop1(0x18,0x2)
/   nop
|   R7 = R28
|   immext(0x0)
\   memb(R10=0x7) = R4
/   R4 = R3
|   nop
\   nop     < endloop01
EOF
RUN

NAME=hexagon negative immediates without sign
FILE=bins/elf/analysis/hexagon-hello-loop
CMDS=<<EOF
b 0x100000
aar
e plugins.hexagon.imm.sign=false
/ai -8
/ai 0xffffff40 0xffffffff
EOF
EXPECT=<<EOF
0x0000342c   # 4: |   if (!P3) memh(R23++#0xfffffff8) = R11.h
0x0000511c   # 4: [   R2 = add(FP,##0xfffffff8)
0x00005128   # 4: [   R2 = memw(FP+##0xfffffff8)
0x00005144   # 4: [   R2 = memw(FP+##0xfffffff8)
0x0000514c   # 4: [   memw(FP+##0xfffffff8) = R2
0x0000564c   # 4: \   R2 = memw(R0+##0xfffffff8)
0x00005654   # 4: \   if (P0.new) R17 = add(R16,##0xfffffff8)
0x00005740   # 4: \   R17 = and(R2,##0xfffffff8)
0x00005840   # 4: /   R4 = add(R2,##0xfffffff8)
0x00005970   # 4: \   if (P2.new) R2 = add(R2,##0xfffffff8)
0x000059d0   # 4: \   R1 = and(R1,##0xfffffff8)
0x00005c88   # 4: |   if (P0.new) R2 = add(R2,##0xfffffff8)
0x00005d00   # 4: |   if (P0.new) R2 = add(R2,##0xfffffff8)
0x00006394   # 4: [   R4 = and(R4,##0xfffffff8)
0x000063f8   # 4: [   R4 = and(R4,##0xfffffff8)
0x0000641c   # 4: [   R4 = and(R4,##0xfffffff8)
0x00006510   # 4: [   R4 = and(R4,##0xfffffff8)
0x00006534   # 4: [   R4 = and(R4,##0xfffffff8)
0x00007134   # 4: |   R3 = mux(P0,##0xfffffffc,#0xfffffff8)
0x0000747c   # 4: \   R2 = add(R2,##0xfffffff8)
0x00007ee0   # 4: /   R17 = add(R17,##0xfffffff8)
0x00008484   # 4: \   R2 = add(R16,add(R2,##0xfffffff8))
0x0000848c   # 4: /   R2 = add(R2,##0xfffffff8)
0x00008500   # 4: \   memd(R2+##0xfffffff8) = R1:0
0x00008598   # 4: \   memd(R2+##0xfffffff8) = R1:0
0x000087b8   # 4: \   memd(R3+##0xfffffff8) = R1:0
0x00009b64   # 4: [   R2 = memw(R18+##0xfffffff8)
0x0000afd8   # 4: /   R3 = and(R3,##0xfffffff8)
0x000060e4   # 4: /   immext(##0xffffffc0)
0x000060e8   # 4: |   R2 = add(R2,add(R3,##0xffffffd0))
0x000061e4   # 4: /   immext(##0xffffffc0)
0x000061e8   # 4: |   R2 = add(R2,add(R3,##0xffffffd0))
0x00006264   # 4: /   immext(##0xffffffc0)
0x00006268   # 4: |   R2 = add(R2,add(R3,##0xffffffd0))
0x00007140   # 4: |   immext(##0xffffffc0)
0x00007144   # 4: |   R0 = add(##0xfffffffa,mpyi(R2,#0x6))
0x00009684   # 4: |   immext(##0xffffff40)
0x00009688   # 4: \   memh(R0+#0x0) = ##0xffffff7f
EOF
RUN

NAME=hexagon analysis.jmp.after endloop
FILE==
CMDS=<<EOF
e asm.arch=hexagon
e analysis.arch=hexagon
e analysis.jmp.cref=true
wx 0ec4057608c00f60464a0cc2034175f208c6c0ab0c8a0bf52ae6c19b464e86c3
af
aar
pd 8
EOF
EXPECT=<<EOF
/ fcn.00000000();
|           0x00000000      ?       R14 = and(R5,##0x20)
|       ,=< 0x00000004      [   loop0(0x8,R15)
|       |   ; CODE XREFS from fcn.00000000 @ 0x4, 0x18
|      .`-> 0x00000008      /       R7:6 = valignb(R11:10,R13:12,P2)
|      :    0x0000000c      |       P3 = cmp.gtu(R21,R1)
|      :    0x00000010      \       memd(R0++#0x8) = R7:6
|      :    0x00000014      /       R13:12 = combine(R11,R10)
|      `==< 0x00000018      \       if (P3) R11:10 = memd(R1++#0x8)     < endloop0
|           0x0000001c      /       R7:6 = lsr(R7:6,R14)
EOF
RUN

NAME=hexagon analysis.jmp.after conditional jumpr
FILE==
CMDS=<<EOF
e asm.arch=hexagon
e analysis.arch=hexagon
wx 11400275114001f20e4021f1e0c282752943028c00417f53e34b82750ec22ef102478e8500c001940242636b027f427446ea005c3260
af
pd 0xd
EOF
EXPECT=<<EOF
/ fcn.00000000();
|           0x00000000      ?       P1 = !cmp.eq(R2,##0x0)
|           0x00000004      ?       P1 = !cmp.eq(R1,R0)
|           0x00000008      ?       R14 = or(R1,R0)
|           0x0000000c      ?       P0 = cmp.gtu(R2,##0x17)
|           0x00000010      /       R9 = lsr(R2,#0x3)
|           0x00000014      |       if (!P1) jumpr:nt LR
|           0x00000018      |       P3 = cmp.gtu(R2,##0x5f)
|           0x0000001c      \       R14 = or(R14,R2)
|           0x00000020      /       P2 = bitsclr(R14,#0x7)
|           0x00000024      \       dcfetch(R1+#0x0)
|           0x00000028      /       P2 = and(P2,!P3)
|           0x0000002c      |       if (P2.new) R2 = add(R2,##-0x8)
|       ,=< 0x00000030      \       if (P2.new) jump:nt 0x2b4
EOF
RUN

NAME=hexagon analysis.trap.after
FILE==
CMDS=<<EOF
e asm.arch=hexagon
e analysis.arch=hexagon
e analysis.trap.after=true
wx 104300000244804920c00224201cf4eb2846005a110800e82446005a01410078082c002ca0c2007801c0707000c0005402c0607000406270001f0c3e00c09f5202c00078
af
pd 0x12
EOF
EXPECT=<<EOF
/ fcn.00000000();
|           0x00000000      ?       immext(##0xc400)
|           0x00000004      ?       R2 = memw(GP+##0xc420)
|       ,=< 0x00000008      ?       if (cmp.eq(R2.new,#0x0)) jump:nt 0x40
|       |   0x0000000c      [   memd(R29+#-0x10) = R17:16 ; allocframe(#0x10)
|       |   0x00000010      /       call 0xc60
|       |   0x00000014      \       memw(R29+#0x0) = R0 ; memw(R29+#0x4) = R1
|       |   0x00000018      /       call 0xc60
|       |   0x0000001c      |       R1 = ##0x8
|       |   0x00000020      \       R0 = add(R29,#0x0) ; R16 = add(R29,#0x0)
|       |   0x00000024      [   R0 = ##0x15
|       |   0x00000028      [   R1 = R16
|       |   0x0000002c      [   trap0(#0x0)
|       |   0x00000030      [   R2 = R0
|       |   0x00000034      /       R0 = R2
|       |   0x00000038      \       R17:16 = memd(R29+#0x8) ; deallocframe
|       |   0x0000003c      [   jumpr LR
|       `-> 0x00000040      [   R2 = ##0x0
\           0x00000044      [   invalid
EOF
RUN

NAME=hexagon reg alias on first disassembled instruction
FILE=bins/elf/analysis/hexagon-hello-loop
CMDS=<<EOF
aaa
s main
pd 1
EOF
EXPECT=<<EOF
            ; CALL XREF from sym.__libc_start_main @ 0x5e98
/ int main(int argc, char **argv, char **envp);
|           ; arg int argc @ r0
|           0x00005110      ?       allocframe(SP,#0x8):raw
EOF
RUN

NAME=hexagon basic block graph
FILE=bins/elf/analysis/hexagon-hello-loop
CMDS=<<EOF
aaa
s main
agf
EOF
EXPECT=<<EOF
          .---------------------------------------------------.
          |  0x5110                                           |
          |   ; CALL XREF from sym.__libc_start_main @ 0x5e98 |
          | int main(int argc, char **argv, char **envp);     |
          | ; arg int argc @ r0                               |
          | ?   allocframe(SP,#0x8):raw                       |
          | [   R2 = add(FP,##-0x4)                           |
          | [   memw(R2+#0x0) = ##0x0                         |
          | [   R2 = add(FP,##-0x8)                           |
          | [   memw(R2+#0x0) = ##0x0                         |
          | [   jump 0x5128                                   |
          `---------------------------------------------------'
              v
              |
              '------.
.----------------------.
|                    | |
|              .-----------------------------------------.
|              |  0x5128                                 |
|              | ; CODE XREFS from main @ 0x5124, 0x5150 |
|              | [   R2 = memw(FP+##-0x8)                |
|              | [   P0 = cmp.gt(R2,##0x2)               |
|              | [   if (P0) jump:nt 0x5154              |
|              `-----------------------------------------'
|                    t f
|                    | |
|    .---------------' |
|    |                 '-----------------------.
|    |                                         |
|.------------------------------------.    .-----------------.
||  0x5154                            |    |  0x5134         |
|| ; DATA XREF from main @ 0x5130     |    | ?   jump 0x5138 |
|| ?   R0 = ##0x0                     |    `-----------------'
|| [   LR:FP = dealloc_return(FP):raw |        v
|`------------------------------------'        |
|                                              |
|                                              |
|                              .---------------'
|                              |
|                          .--------------------------------.
|                          |  0x5138                        |
|                          | ; CODE XREF from main @ 0x5134 |
|                          | [   call sym.pHello            |
|                          | [   call sym.pWorld            |
|                          | [   jump 0x5144                |
|                          `--------------------------------'
|                              v
|                              |
|                              |
|                          .--------------------------------.
|                          |  0x5144                        |
|                          | ; CODE XREF from main @ 0x5140 |
|                          | [   R2 = memw(FP+##-0x8)       |
|                          | [   R2 = add(R2,##0x1)         |
|                          | [   memw(FP+##-0x8) = R2       |
|                          | [   jump 0x5128                |
|                          `--------------------------------'
|                              v
|                              |
`------------------------------'
EOF
RUN

NAME=hexagon basic block cond return
FILE=bins/elf/analysis/hexagon-hello-loop
CMDS=<<EOF
aaa
s sym.thread_join
pd 12
EOF
EXPECT=<<EOF
/ sym.thread_join();
|           0x00005200      ?       R1 = HTID
|           0x00005204      ?       R3 = ##0x1
|           0x00005208      [   R1 = asl(R3,R1)
|           0x0000520c      [   R1 = sub(##-0x1,R1)
|           0x00005210      [   R0 = and(R0,R1)
|           0x00005214      [   R0 = combine(R0.l,R0.l)
|           ; CODE XREF from sym.thread_join @ 0x5228
|       .-> 0x00005218      [   R2 = MODECTL
|       :   0x0000521c      [   R2 = and(R0,R2)
|       :   0x00005220      [   P0 = cmp.eq(R2,#0x0) ; if (P0.new) jumpr:nt R31
|       :   0x00005224      [   pause(#0x1)
\       `=< 0x00005228      [   jump 0x5218
\           0x0000522c      [   nop
EOF
RUN

NAME=hexagon basic block treat invalid as return
FILE=bins/elf/analysis/hexagon-hello-loop
CMDS=<<EOF
e analysis.jmp.cref=true
e analysis.trap.after=true
e asm.pcalign=4
e plugins.hexagon.imm.sign=false
aaa
s sym.sys_deinit_tls
pd 11
EOF
EXPECT=<<EOF
/ sym.sys_deinit_tls();
|           0x00005344      ?       R2 = UGP
|           0x00005348      /       immext(##loc.CoreDump)             ; 0x1100
|           0x0000534c      |       R3 = memw(GP+##loc._TLSEnd)        ; 0x1110
|           0x00005350      |       immext(##loc.CoreDump)             ; 0x1100
|           0x00005354      \       R4 = memw(GP+##loc._TLSStart)      ; 0x1108
|           0x00005358      [   R2 = sub(R2,R3)
|       ,=< 0x0000535c      /       jump sym.free
|       |   0x00005360      \       R0 = add(R2,R4)
\       |   0x00005364      [   invalid
        |   0x00005368      [   invalid
        |   0x0000536c      [   invalid
EOF
RUN

NAME=hexagon last instr. is endloop branch.
FILE=bins/elf/analysis/hexagon-hello-loop
CMDS=<<EOF
e analysis.jmp.cref=true
aaa
s 0x00005abc
pd 22
EOF
EXPECT=<<EOF
|       ,=< 0x00005abc      ?       if (P3) jump:nt 0x5b1c
|       |   ; CODE XREF from sym.memcpy @ 0x5abc
|      ,==< 0x00005ac0      /       loop0(0x5acc,R4)
|      ||   0x00005ac4      |       P0 = cmp.gtu(R4,##0x1)
|      ||   0x00005ac8      \       R8 = R4
|      ||   ; CODE XREFS from sym.memcpy @ 0x5ac0, 0x5b10
|     .`--> 0x00005acc      /       if (P0) R17 = add(R17,##0x20)
|     : |   0x00005ad0      \       dcfetch(R5+#0x0)
|     : |   0x00005ad4      /       P3 = cmp.eq(R4,R8)
|     : |   0x00005ad8      \       dczeroa(R17)
|     : |   0x00005adc      /       R5:4 = vaddw(R5:4,R15:14)
|     : |   0x00005ae0      |       R19:18 = valignb(R11:10,R13:12,P2)
|     : |   0x00005ae4      |       R13:12 = memd(R1++#0x8)
|     : |   0x00005ae8      \       if (!P3) memd(R0++#0x8) = R19:18
|     : |   0x00005aec      /       R7:6 = valignb(R13:12,R11:10,P2)
|     : |   0x00005af0      |       R11:10 = memd(R1++#0x8)
|     : |   0x00005af4      \       memd(R0++#0x8) = R7:6
|     : |   0x00005af8      /       R19:18 = valignb(R11:10,R13:12,P2)
|     : |   0x00005afc      |       R13:12 = memd(R1++#0x8)
|     : |   0x00005b00      \       memd(R0++#0x8) = R19:18
|     : |   0x00005b04      /       R7:6 = valignb(R13:12,R11:10,P2)
|     : |   0x00005b08      |       P0 = cmp.gtu(R4,##0x1)
|     : |   0x00005b0c      |       R11:10 = memd(R1++#0x8)
|     `===< 0x00005b10      \       memd(R0++#0x8) = R7:6     < endloop0
EOF
RUN

NAME=hexagon multiple endloop refs.
FILE=bins/elf/analysis/hexagon-hello-loop
CMDS=<<EOF
e analysis.jmp.cref=true
e analysis.trap.after=true
aaa
s 0x00008df4
axt
EOF
EXPECT=<<EOF
sym._Mbtowcx 0x8df0 [CODE] ?   loop0(0x8df4,R2)
sym._Mbtowcx 0x8e3c [CODE] ?   R6 = ##0x1 ; R7 = add(R7,#1)
sym._Mbtowcx 0x8e54 [CODE] ?   R6 = ##0x2 ; R7 = add(R7,#1)
sym._Mbtowcx 0x8e70 [CODE] ?   R6 = ##0x3 ; R7 = add(R7,#1)
sym._Mbtowcx 0x8e98 [CODE] ?   nop
EOF
RUN

NAME=hexagon continue analysis after unmapped jumps
FILE==
CMDS=<<EOF
wx 9852730118c00058824700e010406070
e asm.arch=hexagon
e analysis.arch=hexagon
af
pd 4
EOF
EXPECT=<<EOF
/ fcn.00000000();
|           0x00000000      ?       immext(##0x1734a600)
|       ,=< 0x00000004      ?       jump 0x1734a60c
|       |   0x00000008      /       R2 = +mpyi(R0,##0x3c)
|       |   0x0000000c      |       R16 = R0
EOF
RUN

NAME=hexagon string search
FILE==
CMDS=<<EOF
e asm.sub.varmin=0
e asm.arch=hexagon
e analysis.arch=hexagon
e analysis.strings=true
wx 81c100781cc0513c00c09f5257686572652069732057616c6c793f0054686572652069732057616c6c792100
aar
pd 2
fs strings
fl
EOF
EXPECT=<<EOF
            0x00000000      ?       R1 = ##str.Where_is_Wally          ; 0xc ; "Where is Wally?"
            0x00000004      [   memw(R17+#0x0) = ##str.There_is_Wally  ; 0x1c ; "There is Wally!"
0x0000000c 16 str.Where_is_Wally
0x0000001c 16 str.There_is_Wally
EOF
RUN

NAME=hexagon objdump like assembly
FILE==
CMDS=<<EOF
wx 00c0007f0bc0006900404d850040000076d09b9a0ac020690040007f07407c700040000087c40aab048063700080007f00c0007f00c0007f0bc0206900404d850040000076d09b9a00c000580ac0006907807c7000c0007f044063700080007f00c0007f
e asm.arch=hexagon
e analysis.arch=hexagon
e plugins.hexagon.sdk=true
pi 25
EOF
EXPECT=<<EOF
?   nop
{   loop0(0x8,#0x3) }
{   P0 = R13
    immext(##0x0)
    R23:22 = memb_fifo(R27=##0x3) }
{   loop1(0x18,#0x2) }
{   nop
    R7 = R28
    immext(##0x0)
    memb(R10=##0x7) = R4 }
{   R4 = R3
    nop
    nop }:endloop01
{   nop }
{   loop1(0x3c,#0x3) }
{   P0 = R13
    immext(##0x0)
    R23:22 = memb_fifo(R27=##0x3) }
{   jump 0x48 }
{   loop0(0x50,#0x2) }
{   R7 = R28
    nop }:endloop0
{   R4 = R3
    nop
    nop }:endloop1
EOF
RUN

NAME=hexagon regs
FILE=
CMDS=<<EOF
e asm.arch=hexagon
arp~[0-1]
EOF
EXPECT=<<EOF
PC pc
SP R29
BP R30
LR R31
SR C8
SN R0
A0 R0
A1 R1
A2 R2
A3 R3
A4 R4
A5 R5
R0 R0
R1 R1
ctr C0
ctr C1
ctr C2
ctr C3
ctr C4
ctr C5
ctr C6
ctr C7
ctr C8
ctr C9
ctr C10
ctr C11
ctr C12
ctr C13
ctr C14
ctr C15
ctr C16
ctr C17
ctr C18
ctr C19
ctr C30
ctr C31
ctr C1:0
ctr C3:2
ctr C5:4
ctr C7:6
ctr C9:8
ctr C11:10
ctr C13:12
ctr C15:14
ctr C17:16
ctr C19:18
ctr C31:30
gpr R1:0
gpr R3:2
gpr R5:4
gpr R7:6
gpr R9:8
gpr R11:10
gpr R13:12
gpr R15:14
gpr R17:16
gpr R19:18
gpr R21:20
gpr R23:22
gpr R25:24
gpr R27:26
gpr R29:28
gpr R31:30
gpr G0
gpr G1
gpr G2
gpr G3
gpr G4
gpr G5
gpr G6
gpr G7
gpr G8
gpr G9
gpr G10
gpr G11
gpr G12
gpr G13
gpr G14
gpr G15
gpr G16
gpr G17
gpr G18
gpr G19
gpr G20
gpr G21
gpr G22
gpr G23
gpr G24
gpr G25
gpr G26
gpr G27
gpr G28
gpr G29
gpr G30
gpr G31
gpr G1:0
gpr G3:2
gpr G5:4
gpr G7:6
gpr G9:8
gpr G11:10
gpr G13:12
gpr G15:14
gpr G17:16
gpr G19:18
gpr G21:20
gpr G23:22
gpr G25:24
gpr G27:26
gpr G29:28
gpr G31:30
vcc Q0
vcc Q1
vcc Q2
vcc Q3
vc V3:0
vc V7:4
vc V11:8
vc V15:12
vc V19:16
vc V23:20
vc V27:24
vc V31:28
vc V0
vc V1
vc V2
vc V3
vc V4
vc V5
vc V6
vc V7
vc V8
vc V9
vc V10
vc V11
vc V12
vc V13
vc V14
vc V15
vc V16
vc V17
vc V18
vc V19
vc V20
vc V21
vc V22
vc V23
vc V24
vc V25
vc V26
vc V27
vc V28
vc V29
vc V30
vc V31
vc V1:0
vc V3:2
vc V5:4
vc V7:6
vc V9:8
vc V11:10
vc V13:12
vc V15:14
vc V17:16
vc V19:18
vc V21:20
vc V23:22
vc V25:24
vc V27:26
vc V29:28
vc V31:30
gpr R0
gpr R1
gpr R2
gpr R3
gpr R4
gpr R5
gpr R6
gpr R7
gpr R8
gpr R9
gpr R10
gpr R11
gpr R12
gpr R13
gpr R14
gpr R15
gpr R16
gpr R17
gpr R18
gpr R19
gpr R20
gpr R21
gpr R22
gpr R23
gpr R24
gpr R25
gpr R26
gpr R27
gpr R28
gpr R29
gpr R30
gpr R31
ctr P0
ctr P1
ctr P2
ctr P3
sys S0
sys S1
sys S2
sys S3
sys S4
sys S5
sys S6
sys S7
sys S8
sys S9
sys S10
sys S11
sys S12
sys S13
sys S14
sys S15
sys S16
sys S17
sys S18
sys S19
sys S20
sys S21
sys S22
sys S23
sys S24
sys S25
sys S26
sys S27
sys S28
sys S29
sys S30
sys S31
sys S32
sys S33
sys S34
sys S35
sys S36
sys S37
sys S38
sys S39
sys S40
sys S41
sys S42
sys S43
sys S44
sys S45
sys S46
sys S47
sys S48
sys S49
sys S50
sys S51
sys S52
sys S53
sys S54
sys S55
sys S56
sys S57
sys S58
sys S59
sys S60
sys S61
sys S62
sys S63
sys S64
sys S65
sys S66
sys S67
sys S68
sys S69
sys S70
sys S71
sys S72
sys S73
sys S74
sys S75
sys S76
sys S77
sys S78
sys S79
sys S80
sys S1:0
sys S3:2
sys S5:4
sys S7:6
sys S9:8
sys S11:10
sys S13:12
sys S15:14
sys S17:16
sys S19:18
sys S21:20
sys S23:22
sys S25:24
sys S27:26
sys S29:28
sys S31:30
sys S33:32
sys S35:34
sys S37:36
sys S39:38
sys S41:40
sys S43:42
sys S45:44
sys S47:46
sys S49:48
sys S51:50
sys S53:52
sys S55:54
sys S57:56
sys S59:58
sys S61:60
sys S63:62
sys S65:64
sys S67:66
sys S69:68
sys S71:70
sys S73:72
sys S75:74
sys S77:76
sys S79:78
ctr C0_tmp
ctr C1_tmp
ctr C2_tmp
ctr C3_tmp
ctr C4_tmp
ctr C5_tmp
ctr C6_tmp
ctr C7_tmp
ctr C8_tmp
ctr C9_tmp
ctr C10_tmp
ctr C11_tmp
ctr C12_tmp
ctr C13_tmp
ctr C14_tmp
ctr C15_tmp
ctr C16_tmp
ctr C17_tmp
ctr C18_tmp
ctr C19_tmp
ctr C30_tmp
ctr C31_tmp
ctr C1:0_tmp
ctr C3:2_tmp
ctr C5:4_tmp
ctr C7:6_tmp
ctr C9:8_tmp
ctr C11:10_tmp
ctr C13:12_tmp
ctr C15:14_tmp
ctr C17:16_tmp
ctr C19:18_tmp
ctr C31:30_tmp
gpr R1:0_tmp
gpr R3:2_tmp
gpr R5:4_tmp
gpr R7:6_tmp
gpr R9:8_tmp
gpr R11:10_tmp
gpr R13:12_tmp
gpr R15:14_tmp
gpr R17:16_tmp
gpr R19:18_tmp
gpr R21:20_tmp
gpr R23:22_tmp
gpr R25:24_tmp
gpr R27:26_tmp
gpr R29:28_tmp
gpr R31:30_tmp
gpr G0_tmp
gpr G1_tmp
gpr G2_tmp
gpr G3_tmp
gpr G4_tmp
gpr G5_tmp
gpr G6_tmp
gpr G7_tmp
gpr G8_tmp
gpr G9_tmp
gpr G10_tmp
gpr G11_tmp
gpr G12_tmp
gpr G13_tmp
gpr G14_tmp
gpr G15_tmp
gpr G16_tmp
gpr G17_tmp
gpr G18_tmp
gpr G19_tmp
gpr G20_tmp
gpr G21_tmp
gpr G22_tmp
gpr G23_tmp
gpr G24_tmp
gpr G25_tmp
gpr G26_tmp
gpr G27_tmp
gpr G28_tmp
gpr G29_tmp
gpr G30_tmp
gpr G31_tmp
gpr G1:0_tmp
gpr G3:2_tmp
gpr G5:4_tmp
gpr G7:6_tmp
gpr G9:8_tmp
gpr G11:10_tmp
gpr G13:12_tmp
gpr G15:14_tmp
gpr G17:16_tmp
gpr G19:18_tmp
gpr G21:20_tmp
gpr G23:22_tmp
gpr G25:24_tmp
gpr G27:26_tmp
gpr G29:28_tmp
gpr G31:30_tmp
vcc Q0_tmp
vcc Q1_tmp
vcc Q2_tmp
vcc Q3_tmp
vc V3:0_tmp
vc V7:4_tmp
vc V11:8_tmp
vc V15:12_tmp
vc V19:16_tmp
vc V23:20_tmp
vc V27:24_tmp
vc V31:28_tmp
vc V0_tmp
vc V1_tmp
vc V2_tmp
vc V3_tmp
vc V4_tmp
vc V5_tmp
vc V6_tmp
vc V7_tmp
vc V8_tmp
vc V9_tmp
vc V10_tmp
vc V11_tmp
vc V12_tmp
vc V13_tmp
vc V14_tmp
vc V15_tmp
vc V16_tmp
vc V17_tmp
vc V18_tmp
vc V19_tmp
vc V20_tmp
vc V21_tmp
vc V22_tmp
vc V23_tmp
vc V24_tmp
vc V25_tmp
vc V26_tmp
vc V27_tmp
vc V28_tmp
vc V29_tmp
vc V30_tmp
vc V31_tmp
vc V1:0_tmp
vc V3:2_tmp
vc V5:4_tmp
vc V7:6_tmp
vc V9:8_tmp
vc V11:10_tmp
vc V13:12_tmp
vc V15:14_tmp
vc V17:16_tmp
vc V19:18_tmp
vc V21:20_tmp
vc V23:22_tmp
vc V25:24_tmp
vc V27:26_tmp
vc V29:28_tmp
vc V31:30_tmp
gpr R0_tmp
gpr R1_tmp
gpr R2_tmp
gpr R3_tmp
gpr R4_tmp
gpr R5_tmp
gpr R6_tmp
gpr R7_tmp
gpr R8_tmp
gpr R9_tmp
gpr R10_tmp
gpr R11_tmp
gpr R12_tmp
gpr R13_tmp
gpr R14_tmp
gpr R15_tmp
gpr R16_tmp
gpr R17_tmp
gpr R18_tmp
gpr R19_tmp
gpr R20_tmp
gpr R21_tmp
gpr R22_tmp
gpr R23_tmp
gpr R24_tmp
gpr R25_tmp
gpr R26_tmp
gpr R27_tmp
gpr R28_tmp
gpr R29_tmp
gpr R30_tmp
gpr R31_tmp
ctr P0_tmp
ctr P1_tmp
ctr P2_tmp
ctr P3_tmp
sys S0_tmp
sys S1_tmp
sys S2_tmp
sys S3_tmp
sys S4_tmp
sys S5_tmp
sys S6_tmp
sys S7_tmp
sys S8_tmp
sys S9_tmp
sys S10_tmp
sys S11_tmp
sys S12_tmp
sys S13_tmp
sys S14_tmp
sys S15_tmp
sys S16_tmp
sys S17_tmp
sys S18_tmp
sys S19_tmp
sys S20_tmp
sys S21_tmp
sys S22_tmp
sys S23_tmp
sys S24_tmp
sys S25_tmp
sys S26_tmp
sys S27_tmp
sys S28_tmp
sys S29_tmp
sys S30_tmp
sys S31_tmp
sys S32_tmp
sys S33_tmp
sys S34_tmp
sys S35_tmp
sys S36_tmp
sys S37_tmp
sys S38_tmp
sys S39_tmp
sys S40_tmp
sys S41_tmp
sys S42_tmp
sys S43_tmp
sys S44_tmp
sys S45_tmp
sys S46_tmp
sys S47_tmp
sys S48_tmp
sys S49_tmp
sys S50_tmp
sys S51_tmp
sys S52_tmp
sys S53_tmp
sys S54_tmp
sys S55_tmp
sys S56_tmp
sys S57_tmp
sys S58_tmp
sys S59_tmp
sys S60_tmp
sys S61_tmp
sys S62_tmp
sys S63_tmp
sys S64_tmp
sys S65_tmp
sys S66_tmp
sys S67_tmp
sys S68_tmp
sys S69_tmp
sys S70_tmp
sys S71_tmp
sys S72_tmp
sys S73_tmp
sys S74_tmp
sys S75_tmp
sys S76_tmp
sys S77_tmp
sys S78_tmp
sys S79_tmp
sys S80_tmp
sys S1:0_tmp
sys S3:2_tmp
sys S5:4_tmp
sys S7:6_tmp
sys S9:8_tmp
sys S11:10_tmp
sys S13:12_tmp
sys S15:14_tmp
sys S17:16_tmp
sys S19:18_tmp
sys S21:20_tmp
sys S23:22_tmp
sys S25:24_tmp
sys S27:26_tmp
sys S29:28_tmp
sys S31:30_tmp
sys S33:32_tmp
sys S35:34_tmp
sys S37:36_tmp
sys S39:38_tmp
sys S41:40_tmp
sys S43:42_tmp
sys S45:44_tmp
sys S47:46_tmp
sys S49:48_tmp
sys S51:50_tmp
sys S53:52_tmp
sys S55:54_tmp
sys S57:56_tmp
sys S59:58_tmp
sys S61:60_tmp
sys S63:62_tmp
sys S65:64_tmp
sys S67:66_tmp
sys S69:68_tmp
sys S71:70_tmp
sys S73:72_tmp
sys S75:74_tmp
sys S77:76_tmp
EOF
RUN

NAME=hexagon relocation tests I
FILE=bins/elf/hexagon/relocs
CMDS=<<EOF
pi 30
s loc.r_hex_32
px 16~[1-8]
EOF
EXPECT=<<EOF
?   nop
[   nop
[   nop
[   nop
[   jump 0x8000038
[   if (P0) jump:nt loc.test_sym
[   loop1(loc.test_sym,#0x0)
[   R0.l = #0x34
[   R0.h = #0x800
[   if (R0!=#0) jump:nt loc.test_sym
[   R0 = #0x0 ; jump loc.test_sym
/   immext(##0xffffffc0)
\   jump loc.test_sym
/   immext(##segment.ehdr)
\   R0 = ##loc.test_sym
/   immext(##0xffffffc0)
\   jump loc.test_sym
/   immext(##0xffffff80)
\   if (P0) jump:nt loc.test_sym
/   immext(##0xffffff80)
\   loop1(loc.test_sym,#0x0)
[   jump loc.test_sym
/   immext(##0xffffff80)
\   R0 = ##0xffffffa8 ; R1 = R1
/   immext(##segment.ehdr)
\   R0 = ##loc.test_sym
/   immext(##segment.ehdr)
\   R0 = ##loc.test_sym
/   immext(##segment.ehdr)
\   R0 = memw(R0+##loc.test_sym)
offset - 0 1 2 3 4 5
3400 0008 3400 0000 3400 0000 7cff ffff
EOF
RUN
