ir/tests/debug.aarch64/call_vaddr.irt
Dmitry Stogov 09829a9e69 Fixed x86_64 calling convention for vararg functions
%al is used as a hidden register to specify the number of passed vector registers
2023-09-27 10:23:34 +03:00

67 lines
1.2 KiB
Plaintext

--TEST--
Simple CALL with VADDR
--TARGET--
aarch64
--ARGS--
-S --run
--CODE--
{
uintptr_t c_1 = 0;
bool c_2 = 0;
bool c_3 = 1;
int32_t c_4 = 42;
char h = 'h';
char i = 'i';
char sp = ' ';
char pc = '%';
char d = 'd';
char nl = '\n';
char zero = 0;
uintptr_t one = 1;
uintptr_t c_5 = func(printf, 4);
l_1 = START(l_4);
uint64_t var = VAR(l_1, "str");
uintptr_t a_0 = VADDR(var);
s_1 = STORE(l_1, a_0, h);
uintptr_t a_1 = ADD(a_0, one);
s_2 = STORE(s_1, a_1, i);
uintptr_t a_2 = ADD(a_1, one);
s_3 = STORE(s_2, a_2, sp);
uintptr_t a_3 = ADD(a_2, one);
s_4 = STORE(s_3, a_3, pc);
uintptr_t a_4 = ADD(a_3, one);
s_5 = STORE(s_4, a_4, d);
uintptr_t a_5 = ADD(a_4, one);
s_6 = STORE(s_5, a_5, nl);
uintptr_t a_6 = ADD(a_5, one);
s_7 = STORE(s_6, a_6, zero);
int32_t d_2, l_2 = CALL/2(s_7, c_5, a_0, c_4);
l_4 = RETURN(l_2, d_2);
}
--EXPECT--
test:
stp x29, x30, [sp, #-0x20]!
mov x29, sp
add x0, x29, #0x10
movz w1, #0x68
strb w1, [x0]
movz w1, #0x69
strb w1, [x0, #1]
movz w1, #0x20
strb w1, [x0, #2]
movz w1, #0x25
strb w1, [x0, #3]
movz w1, #0x64
strb w1, [x0, #4]
movz w1, #0xa
strb w1, [x0, #5]
strb wzr, [x0, #6]
movz w1, #0x2a
bl printf
ldp x29, x30, [sp], #0x20
ret
hi 42
exit code = 6