mirror of
https://github.com/frida/tinycc
synced 2024-11-24 16:49:44 +03:00
x86-asm: Correctly infer register size for bools
Register operands of type _Bool weren't correctly getting the 8-bit sized registers (but rather used the default 32-bit ones).
This commit is contained in:
parent
9e0af6d2b5
commit
0381387640
@ -1478,7 +1478,8 @@ ST_FUNC void subst_asm_operand(CString *add_str,
|
||||
tcc_error("internal compiler error");
|
||||
|
||||
/* choose register operand size */
|
||||
if ((sv->type.t & VT_BTYPE) == VT_BYTE)
|
||||
if ((sv->type.t & VT_BTYPE) == VT_BYTE ||
|
||||
(sv->type.t & VT_BTYPE) == VT_BOOL)
|
||||
size = 1;
|
||||
else if ((sv->type.t & VT_BTYPE) == VT_SHORT)
|
||||
size = 2;
|
||||
|
@ -2678,6 +2678,9 @@ void asm_test(void)
|
||||
int base_func = 42;
|
||||
void override_func3 (void);
|
||||
unsigned long asmret;
|
||||
#ifdef BOOL_ISOC99
|
||||
_Bool somebool;
|
||||
#endif
|
||||
|
||||
printf("inline asm:\n");
|
||||
|
||||
@ -2726,6 +2729,13 @@ void asm_test(void)
|
||||
asm volatile("" : "=r" (asmret) : "0"(s2));
|
||||
if (asmret != s2.addr)
|
||||
printf("asmstr: failed\n");
|
||||
#ifdef BOOL_ISOC99
|
||||
/* Check that the typesize correctly sets the register size to
|
||||
8 bit. */
|
||||
asm volatile("cmp %1,%2; sete %0" : "=a"(somebool) : "r"(1), "r"(2));
|
||||
if (!somebool)
|
||||
printf("asmbool: failed\n");
|
||||
#endif
|
||||
return;
|
||||
label1:
|
||||
goto label2;
|
||||
|
Loading…
Reference in New Issue
Block a user