diff options
| author | Michael Matz <matz@suse.de> | 2016-06-29 18:31:45 +0200 |
|---|---|---|
| committer | Michael Matz <matz@suse.de> | 2016-12-15 17:47:07 +0100 |
| commit | 253afeed1e822965804c0f5503bac057e68f08e8 (patch) | |
| tree | 7cb211c05e6dd775a3ed06ee48739286778d7738 | |
| parent | 63e3ff7cca5437518f540261b34170ce80a47686 (diff) | |
| download | tinycc-253afeed1e822965804c0f5503bac057e68f08e8.tar.gz tinycc-253afeed1e822965804c0f5503bac057e68f08e8.tar.bz2 | |
inline asm: Accept 'p' constraint and 'P' template mod
'p' is conservatively the same as 'r' and 'P' as template
modifier can be ignored in TCC.
| -rw-r--r-- | i386-asm.c | 2 | ||||
| -rw-r--r-- | tccasm.c | 5 | ||||
| -rw-r--r-- | tests/tcctest.c | 9 |
3 files changed, 15 insertions, 1 deletions
@@ -1002,6 +1002,7 @@ static inline int constraint_priority(const char *str) pr = 2; break; case 'r': + case 'p': pr = 3; break; case 'N': @@ -1170,6 +1171,7 @@ ST_FUNC void asm_compute_constraints(ASMOperand *operands, } goto try_next; case 'r': + case 'p': /* A general address, for x86(64) any register is acceptable*/ /* any general register */ for(reg = 0; reg < 8; reg++) { if (!is_reg_allocated(reg)) @@ -991,7 +991,10 @@ static void subst_asm_operands(ASMOperand *operands, int nb_operands, modifier = 0; if (*str == 'c' || *str == 'n' || *str == 'b' || *str == 'w' || - *str == 'h' || *str == 'k' || *str == 'q') + *str == 'h' || *str == 'k' || *str == 'q' || + /* P in GCC would add "@PLT" to symbol refs in PIC mode + Ignore this in TCC. */ + *str == 'P') modifier = *str++; index = find_constraint(operands, nb_operands, str, &str); if (index < 0) diff --git a/tests/tcctest.c b/tests/tcctest.c index 41a9a10..9230020 100644 --- a/tests/tcctest.c +++ b/tests/tcctest.c @@ -2600,6 +2600,14 @@ int fls64(unsigned long long x) } #endif +void other_constraints_test(void) +{ + unsigned long ret; + int var; + __asm__ volatile ("movq %P1,%0" : "=r" (ret) : "p" (&var)); + printf ("oc1: %d\n", ret == (unsigned long)&var); +} + unsigned int set; void asm_test(void) @@ -2633,6 +2641,7 @@ void asm_test(void) s1.b = 43; printf("mconstraint: %d", mconstraint_test(&s2)); printf(" %d %d\n", s1.a, s1.b); + other_constraints_test(); set = 0xff; sigdelset1(&set, 2); sigaddset1(&set, 16); |
