NAME=basic integer arith
FILE=malloc://0x200
CMDS=<<EOF
e asm.arch=xtensa
e asm.bits=32
wx 22a0060c7330828030729022c2012b3242a0080c354065c04065d0
aecu 0x0000001b
ar~a2,a3,a4,a5,a6,a7,a8
EOF
EXPECT=<<EOF
a2 = 0x00000007
a3 = 0x00000009
a4 = 0x00000008
a5 = 0x00000003
a6 = 0xfffffffe
a7 = 0x00000013
a8 = 0x0000000d
EOF
RUN

NAME=load/store imm
FILE=malloc://0x200
CMDS=<<EOF
e asm.arch=xtensa
e asm.bits=32
wx 22a05032a0bb42afff52a0cc7cf6326200425202524208722200829202921202a20208
aecu 0x00000023
ar~a2,a3,a4,a5,a6,a7,a8,a9,a10
EOF
EXPECT=<<EOF
a2 = 0x00000050
a3 = 0x000000bb
a4 = 0xffffffff
a5 = 0x000000cc
a6 = 0xffffffff
a7 = 0x000000bb
a8 = 0xffffffff
a9 = 0x0000ffff
a10 = 0x000000cc
EOF
RUN

NAME=load relative
FILE=malloc://0x200
ARGS=-a xtensa -b 32
CMDS=<<EOF
wx ddccbbaa @ 0
s 0x14
wx 21fbff31faff41f9ff51f8fff8ff
aei
aeip
4aes
ar~a2,a3,a4,a5
EOF
EXPECT=<<EOF
a2 = 0xaabbccdd
a3 = 0xaabbccdd
a4 = 0xaabbccdd
a5 = 0xaabbccdd
EOF
RUN

NAME=call0 ABI
FILE=malloc://0x200
CMDS=<<EOF
e asm.arch=xtensa
e asm.bits=32
wx c5000022a020c00200000000000000008000000000000000000000000000000002a030c00000
aes
ar~pc
ar~a0
aes
aes
ar~a2
aes
ar~pc
ar~a0
aes
aes
ar~pc
ar~a0
EOF
EXPECT=<<EOF
pc = 0x00000010
a0 = 0x00000003
a2 = 0x00000020
pc = 0x00000020
a0 = 0x00000009
pc = 0x00000030
a0 = 0x00000026
EOF
RUN

NAME=branch compare imm
FILE=malloc://0x200
CMDS=<<EOF
e asm.arch=xtensa
e asm.bits=32
wx 22a002e6320526320200000086fdff
aes
aes
ar~pc
aes
ar~pc
aes
ar~pc
EOF
EXPECT=<<EOF
pc = 0x00000006
pc = 0x00000009
pc = 0x0000000c
EOF
RUN

NAME=branch compare single
FILE=malloc://0x200
CMDS=<<EOF
e asm.arch=xtensa
e asm.bits=32
wx 22a002d6920000000000000000000000060000
aes
aes
ar~pc
EOF
EXPECT=<<EOF
pc = 0x00000010
EOF
RUN

NAME=branch compare
FILE=malloc://0x200
CMDS=<<EOF
e asm.arch=xtensa
e asm.bits=32
wx 22a00232a00327130627a30300000000060000
aes
aes
aes
aes
ar~pc
EOF
EXPECT=<<EOF
pc = 0x00000010
EOF
RUN

NAME=branch check mask
FILE=malloc://0x200
CMDS=<<EOF
e asm.arch=xtensa
e asm.bits=32
wx 00000fff34120fff000000000000000021fcff31fcff2743060000000000000006ffff
s 0x10
aeip
aes
aes
aes
ar~pc
EOF
EXPECT=<<EOF
pc = 0x00000020
EOF
RUN

NAME=branch check bit imm
FILE=malloc://0x200
CMDS=<<EOF
e asm.arch=xtensa
e asm.bits=32
wx 0000004000000000000000000000000021fcffe7f2090000000000000000000006ffff
s 0x10
aeip
aes
aes
ar~pc
EOF
EXPECT=<<EOF
pc = 0x00000020
EOF
RUN

NAME=branch check bit
FILE=malloc://0x200
CMDS=<<EOF
e asm.arch=xtensa
e asm.bits=32
wx 0000000400000000000000000000000021fcff32a01a37d2060000000000000006ffff
s 0x10
aeip
aes
aes
aes
ar~pc
EOF
EXPECT=<<EOF
pc = 0x00000020
EOF
RUN

NAME=extract unsigned imm
FILE=malloc://0x200
CMDS=<<EOF
e asm.arch=xtensa
e asm.bits=32
e asm.esil=1
wx ddccbbaa00000000000000000000000021fcff2038f4
s 0x10
aeip
aes
aes
ar~a3
EOF
EXPECT=<<EOF
a3 = 0x0000bbcc
EOF
RUN

NAME=movi.n: extract unsigned imm
FILE=malloc://0x200
CMDS=<<EOF
e asm.arch=xtensa
e asm.bits=32
e asm.esil=1
wx 4ce87cdb
s 0x0
aeip
aes
ar~a8
EOF
EXPECT=<<EOF
a8 = 0x0000004e
EOF
RUN

NAME=movi.n: extract signed imm
FILE=malloc://0x200
CMDS=<<EOF
e asm.arch=xtensa
e asm.bits=32
e asm.esil=1
wx 4ce87cdb
s 0x0
aeip
aes
aes
ar~a11
EOF
EXPECT=<<EOF
a11 = 0xfffffffd
EOF
RUN

NAME=neg and abs keep source and write destination
FILE=malloc://256
ARGS=-a xtensa -b 32
CMDS=<<EOF
wx 203060204160
aei
aeip
ar a2=0xfffffffb
2aes
ar~a2,a3,a4
s 0
aeip
ar a2=5
2aes
ar~a2,a3,a4
EOF
EXPECT=<<EOF
a2 = 0xfffffffb
a3 = 0x00000005
a4 = 0x00000005
a2 = 0x00000005
a3 = 0xfffffffb
a4 = 0x00000005
EOF
RUN

NAME=narrow branches use two byte next PC
FILE=malloc://256
ARGS=-a xtensa -b 32
CMDS=<<EOF
wx 8c4a
aei
aeip
ar a10=0
aes
ar~pc
EOF
EXPECT=<<EOF
pc = 0x00000008
EOF
RUN

NAME=signed and unsigned register comparisons
FILE=malloc://256
ARGS=-a xtensa -b 32
CMDS=<<EOF
wx 37b20537a205
aei
aeip
ar a2=0xffffffff
ar a3=1
aes
ar~pc
s 3
aeip
aes
ar~pc
EOF
EXPECT=<<EOF
pc = 0x00000009
pc = 0x00000006
EOF
RUN

NAME=immediate compare decodes the constant table
FILE=malloc://256
ARGS=-a xtensa -b 32
CMDS=<<EOF
wx 262205
aei
aeip
ar a2=2
aes
ar~pc
EOF
EXPECT=<<EOF
pc = 0x00000009
EOF
RUN

NAME=addi.n minus one and addmi sign and scale
FILE=malloc://256
ARGS=-a xtensa -b 32
CMDS=<<EOF
wx 0b2232d2ff
aei
aeip
ar a2=5
2aes
ar~a2,a3
EOF
EXPECT=<<EOF
a2 = 0x00000004
a3 = 0xffffff04
EOF
RUN

NAME=SSL and SLL use complementary masked shift counts
FILE=malloc://256
ARGS=-a xtensa -b 32
CMDS=<<EOF
wx 0012400034a1
aei
aeip
ar a2=35
ar a4=3
2aes
ar~a3,sar
EOF
EXPECT=<<EOF
a3 = 0x00000018
sar = 0x0000001d
EOF
RUN

NAME=signed right shifts and funnel shift
FILE=malloc://256
ARGS=-a xtensa -b 32
CMDS=<<EOF
wx 2030b1203321405381
aei
aeip
ar sar=4
ar a2=0x80000000
aes
ar~a3
ar a3=0x11223344
ar a4=0x55667788
s 6
aeip
aes
ar~a5
s 3
aeip
aes
ar~a3
EOF
EXPECT=<<EOF
a3 = 0xf8000000
a5 = 0x45566778
a3 = 0xf0000000
EOF
RUN

NAME=BANY compares intersection with zero
FILE=malloc://256
ARGS=-a xtensa -b 32
CMDS=<<EOF
wx 378205
aei
aeip
ar a2=3
ar a3=6
aes
ar~pc
EOF
EXPECT=<<EOF
pc = 0x00000009
EOF
RUN

NAME=BBC masks the bit index to five bits
FILE=malloc://256
ARGS=-a xtensa -b 32
CMDS=<<EOF
wx 375205
aei
aeip
ar a2=8
ar a3=35
aes
ar~pc
EOF
EXPECT=<<EOF
pc = 0x00000003
EOF
RUN

NAME=min and minu interpret the sign bit independently
FILE=malloc://256
ARGS=-a xtensa -b 32
CMDS=<<EOF
wx 306243306263
aei
aeip
ar a2=0xffffffff
ar a3=1
aes
ar~a6
aes
ar~a6
EOF
EXPECT=<<EOF
a6 = 0xffffffff
a6 = 0x00000001
EOF
RUN

NAME=multiply and conditional compare store
FILE=malloc://256
ARGS=-a xtensa -b 32
CMDS=<<EOF
wx 30628222e300
aei
aeip
ar a2=7
ar a3=0x80
ar scompare1=0x11223344
wx 44332211 @ 0x80
aes
ar~a6
ar a2=0xaabbccdd
aes
ar~a2
pxw 4 @ 0x80
s 3
aeip
ar a2=0x12345678
ar scompare1=0
aes
ar~a2
pxw 4 @ 0x80
EOF
EXPECT=<<EOF
a6 = 0x00000380
a2 = 0x11223344
0x00000080  0xaabbccdd                                   ....
a2 = 0xaabbccdd
0x00000080  0xaabbccdd                                   ....
EOF
RUN

NAME=loop setup always enters even with zero count
FILE=malloc://64
ARGS=-a xtensa -b 32
CMDS=<<EOF2
wx 768204
aei
aeip
ar a2=0
aes
ar~pc,lbeg,lend,lcount
EOF2
EXPECT=<<EOF2
pc = 0x00000003
lbeg = 0x00000003
lend = 0x00000008
lcount = 0xffffffff
EOF2
RUN

NAME=loopnez zero skips but still initializes loop registers
FILE=malloc://64
ARGS=-a xtensa -b 32
CMDS=<<EOF2
wx 769204
aei
aeip
ar a2=0
aes
ar~pc,lbeg,lend,lcount
ar pc=0
ar a2=1
aes
ar~pc,lcount
ar pc=0
ar a2=0xffffffff
aes
ar~pc,lcount
EOF2
EXPECT=<<EOF2
pc = 0x00000008
lbeg = 0x00000003
lend = 0x00000008
lcount = 0xffffffff
pc = 0x00000003
lcount = 0x00000000
pc = 0x00000003
lcount = 0xfffffffe
EOF2
RUN

NAME=loopgtz uses signed positive count
FILE=malloc://64
ARGS=-a xtensa -b 32
CMDS=<<EOF2
wx 76a204
aei
aeip
ar a2=0
aes
ar~pc,lcount
ar pc=0
ar a2=0xffffffff
aes
ar~pc,lcount
ar pc=0
ar a2=0x80000000
aes
ar~pc,lcount
ar pc=0
ar a2=0x7fffffff
aes
ar~pc,lcount
EOF2
EXPECT=<<EOF2
pc = 0x00000008
lcount = 0xffffffff
pc = 0x00000008
lcount = 0xfffffffe
pc = 0x00000008
lcount = 0x7fffffff
pc = 0x00000003
lcount = 0x7ffffffe
EOF2
RUN

NAME=loop special register reads writes and exchanges
FILE=malloc://128
ARGS=-a xtensa -b 32
CMDS=<<EOF2
wx 200013300003400061500113600103700161800213900203a00261
aei
aeip
ar a2=0x11
ar a4=0x44
ar a5=0x55
ar a7=0x77
ar a8=0x88
ar a10=0xaa
9aes
ar~a3,a4,a6,a7,a9,a10,lbeg,lend,lcount
EOF2
EXPECT=<<EOF2
a3 = 0x00000011
a4 = 0x00000011
a6 = 0x00000055
a7 = 0x00000055
a9 = 0x00000088
a10 = 0x00000088
lbeg = 0x00000044
lend = 0x00000077
lcount = 0x000000aa
EOF2
RUN

NAME=bit branches expose absolute destinations and separate predicate tokens
FILE=malloc://64
ARGS=-a xtensa -b 32
CMDS=<<EOF2
wx 07e20507620537520537d205
aoe
s 3
aoe
s 6
aoe
s 9
aoe
EOF2
EXPECT=<<EOF2
0x00000000 a2,0x1,&,0,==,$z,!,?{,0x9,pc,=,}
0x00000003 a2,0x1,&,0,==,$z,?{,0xc,pc,=,}
0x00000006 31,a3,&,1,<<,a2,&,0,==,$z,?{,0xf,pc,=,}
0x00000009 31,a3,&,1,<<,a2,&,0,==,$z,!,?{,0x12,pc,=,}
EOF2
RUN
