NAME=tcc-star
FILE=bins/elf/ls
CMDS=<<EOF
tcc
tcc-*
tcc
EOF
EXPECT=<<EOF
amd64
amd64syscall
dlang
golang
golang_abi0
ms
p9
reg
swift
EOF
RUN

# merged: tccj, tccl, tcc* outputs
NAME=tcc
FILE=bins/elf/ls
CMDS=<<EOF
tcc
?e --
tccj
tccl
tcc*
EOF
EXPECT=<<EOF
amd64
amd64syscall
dlang
golang
golang_abi0
ms
p9
reg
swift
--
{"amd64":{"ret":"rax","rets":["rax"],"signature":"rax amd64 (rdi, rsi, rdx, rcx, r8, r9, stack);","args":["rdi","rsi","rdx","rcx","r8","r9"],"argn":"^"},"amd64syscall":{"ret":"rax","rets":["rax"],"signature":"rax amd64syscall (rdi, rsi, rdx, r10, r8, r9);","args":["rdi","rsi","rdx","r10","r8","r9"]},"dlang":{"ret":"rax","rets":["rax","rdx"],"signature":"rax:rdx dlang (rdi, rsi, rdx, rcx, r8d, r9d, stack);","args":["rdi","rsi","rdx","rcx","r8d","r9d"],"argn":"^"},"golang":{"ret":"rax","rets":["rax","rbx","rcx","rdi","rsi","r8","r9","r10","r11"],"signature":"rax:rbx:rcx:rdi:rsi:r8:r9:r10:r11 golang (rax, rbx, rcx, rdi, rsi, r8, r9, r10, r11, stack);","args":["rax","rbx","rcx","rdi","rsi","r8","r9","r10","r11"],"argn":"^"},"golang_abi0":{"ret":"stack","rets":["stack"],"signature":"stack golang_abi0 (stack);","args":[],"argn":"^"},"ms":{"ret":"rax","rets":["rax"],"signature":"rax ms (rcx, rdx, r8, r9, stack);","args":["rcx","rdx","r8","r9"],"argn":"^"},"p9":{"ret":"rax","rets":["rax"],"signature":"rax p9 (rbp, stack);","args":["rbp"],"argn":"^"},"reg":{"ret":"rax","rets":["rax"],"signature":"rax reg (rdi, rsi, rdx, rcx);","args":["rdi","rsi","rdx","rcx"]},"swift":{"ret":"rax","rets":["rax"],"signature":"rax r13.swift (rdi, rsi, rdx, rcx, r8, r9, stack) r12;","args":["rdi","rsi","rdx","rcx","r8","r9"],"argn":"^","error":"r12"}}
rax amd64 (rdi, rsi, rdx, rcx, r8, r9, stack);
rax amd64syscall (rdi, rsi, rdx, r10, r8, r9);
rax:rdx dlang (rdi, rsi, rdx, rcx, r8d, r9d, stack);
rax:rbx:rcx:rdi:rsi:r8:r9:r10:r11 golang (rax, rbx, rcx, rdi, rsi, r8, r9, r10, r11, stack);
stack golang_abi0 (stack);
rax ms (rcx, rdx, r8, r9, stack);
rax p9 (rbp, stack);
rax reg (rdi, rsi, rdx, rcx);
rax r13.swift (rdi, rsi, rdx, rcx, r8, r9, stack) r12;
tcc rax amd64 (rdi, rsi, rdx, rcx, r8, r9, stack);
k anal/cc/cc.amd64.fpret0=xmm0
tcc rax amd64syscall (rdi, rsi, rdx, r10, r8, r9);
tcc rax:rdx dlang (rdi, rsi, rdx, rcx, r8d, r9d, stack);
tcc rax:rbx:rcx:rdi:rsi:r8:r9:r10:r11 golang (rax, rbx, rcx, rdi, rsi, r8, r9, r10, r11, stack);
k anal/cc/cc.golang.fpret0=xmm0
tcc stack golang_abi0 (stack);
tcc rax ms (rcx, rdx, r8, r9, stack);
k anal/cc/cc.ms.fpret0=xmm0
tcc rax p9 (rbp, stack);
tcc rax reg (rdi, rsi, rdx, rcx);
tcc rax r13.swift (rdi, rsi, rdx, rcx, r8, r9, stack) r12;
k anal/cc/cc.swift.fpret0=xmm0
EOF
RUN

NAME=tcc
FILE=-
CMDS=<<EOF
e asm.arch=x86
e asm.bits=32
?e 1
"tcc eax jeje(ebx, ecx)"
tcc jeje
tcc- jeje
?e 2
"tcc eax    jeje(ebx, ecx)"
tcc   jeje
tcc- jeje
?e 3
"tcc eax  jeje   (ebx, ecx)"
tcc   jeje
tcc- jeje
?e 4
"tcc   eax  jeje   (ebx, ecx)"
tcc jeje
tcc- jeje
?e 5
"tcc   eax  jeje   ( ebx, ecx )"
tcc jeje
tcc- jeje
?e 6
"tcc   eax  jeje   ( 	ebx  ,  ecx  )"
tcc jeje
tcc- jeje
EOF
EXPECT=<<EOF
1
eax jeje (ebx, ecx);
2
eax jeje (ebx, ecx);
3
eax jeje (ebx, ecx);
4
eax jeje (ebx, ecx);
5
eax jeje (ebx, ecx);
6
eax jeje (ebx, ecx);
EOF
RUN

NAME=tcc: floating return register per convention
FILE=-
ARGS=-a arm -b 64
CMDS=<<EOF
k anal/cc/cc.arm64.fpret0
k anal/cc/cc.swift.fpret0
e asm.arch=x86
e asm.bits=64
k anal/cc/cc.amd64.fpret0
k anal/cc/cc.swift.fpret0
k anal/cc/cc.ms.fpret0
EOF
EXPECT=<<EOF
{d0,s0,v0,q0}
{d0,s0,v0,q0}
xmm0
xmm0
xmm0
EOF
RUN

NAME=tcc: redefining a convention clears its floating return
FILE=-
ARGS=-a x86 -b 64
CMDS=<<EOF
k anal/cc/cc.amd64.fpret0
tcc rax amd64 (rdi, rsi);
k anal/cc/cc.amd64.fpret0
k anal/cc/cc.amd64.ret0
EOF
EXPECT=<<EOF
xmm0
rax
EOF
RUN

NAME=tcc: deleting a convention clears its floating return
FILE=-
ARGS=-a x86 -b 64
CMDS=<<EOF
k anal/cc/cc.amd64.fpret0
tcc-amd64
k anal/cc/cc.amd64.fpret0
k anal/cc/cc.amd64.ret0
EOF
EXPECT=<<EOF
xmm0
EOF
RUN

NAME=tcc: the export restores the floating return
FILE=-
ARGS=-a x86 -b 64
CMDS=<<EOF
k anal/cc/cc.amd64.fpret0
tcc* > .fpret-roundtrip.r2
. .fpret-roundtrip.r2
k anal/cc/cc.amd64.fpret0
rm .fpret-roundtrip.r2
EOF
EXPECT=<<EOF
xmm0
xmm0
EOF
RUN

NAME=tcc: the export restores an alias-group floating return
FILE=-
ARGS=-a arm -b 64
CMDS=<<EOF
k anal/cc/cc.arm64.fpret0
tcc* > .fpret-roundtrip-arm.r2
. .fpret-roundtrip-arm.r2
k anal/cc/cc.arm64.fpret0
rm .fpret-roundtrip-arm.r2
EOF
EXPECT=<<EOF
{d0,s0,v0,q0}
{d0,s0,v0,q0}
EOF
RUN
