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");
|
tcc_error("internal compiler error");
|
||||||
|
|
||||||
/* choose register operand size */
|
/* 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;
|
size = 1;
|
||||||
else if ((sv->type.t & VT_BTYPE) == VT_SHORT)
|
else if ((sv->type.t & VT_BTYPE) == VT_SHORT)
|
||||||
size = 2;
|
size = 2;
|
||||||
|
@ -2678,6 +2678,9 @@ void asm_test(void)
|
|||||||
int base_func = 42;
|
int base_func = 42;
|
||||||
void override_func3 (void);
|
void override_func3 (void);
|
||||||
unsigned long asmret;
|
unsigned long asmret;
|
||||||
|
#ifdef BOOL_ISOC99
|
||||||
|
_Bool somebool;
|
||||||
|
#endif
|
||||||
|
|
||||||
printf("inline asm:\n");
|
printf("inline asm:\n");
|
||||||
|
|
||||||
@ -2726,6 +2729,13 @@ void asm_test(void)
|
|||||||
asm volatile("" : "=r" (asmret) : "0"(s2));
|
asm volatile("" : "=r" (asmret) : "0"(s2));
|
||||||
if (asmret != s2.addr)
|
if (asmret != s2.addr)
|
||||||
printf("asmstr: failed\n");
|
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;
|
return;
|
||||||
label1:
|
label1:
|
||||||
goto label2;
|
goto label2;
|
||||||
|
Loading…
Reference in New Issue
Block a user