diff options
| author | Pavlas, Zdenek <zden3k@gmail.com> | 2016-09-30 07:29:38 -0700 |
|---|---|---|
| committer | Pavlas, Zdenek <zden3k@gmail.com> | 2016-09-30 07:33:20 -0700 |
| commit | e238e6521bcbbc3a4ff6d795564b8f2d322de349 (patch) | |
| tree | 137d4b6fc7ab60c010e24050db67f159aed525b8 | |
| parent | fc0fc6aba3d8fce415325b76fcd1499365d448ea (diff) | |
| download | tinycc-e238e6521bcbbc3a4ff6d795564b8f2d322de349.tar.gz tinycc-e238e6521bcbbc3a4ff6d795564b8f2d322de349.tar.bz2 | |
gtst_addr(): short conditional jumps (i386, x86_64)
| -rw-r--r-- | i386-gen.c | 13 | ||||
| -rw-r--r-- | tcc.h | 5 | ||||
| -rw-r--r-- | tccgen.c | 4 | ||||
| -rw-r--r-- | x86_64-gen.c | 15 |
4 files changed, 34 insertions, 3 deletions
@@ -695,6 +695,19 @@ ST_FUNC void gjmp_addr(int a) } } +ST_FUNC void gtst_addr(int inv, int a) +{ + inv ^= (vtop--)->c.i; + a -= ind + 2; + if (a == (char)a) { + g(inv - 32); + g(a); + } else { + g(0x0f); + oad(inv - 16, a - 4); + } +} + /* generate a test. set 'inv' to invert test. Stack entry is popped */ ST_FUNC int gtst(int inv, int t) { @@ -1472,6 +1472,11 @@ ST_FUNC void gfunc_epilog(void); ST_FUNC int gjmp(int t); ST_FUNC void gjmp_addr(int a); ST_FUNC int gtst(int inv, int t); +#if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64 +ST_FUNC void gtst_addr(int inv, int a); +#else +#define gtst_addr(inv, a) gsym_addr(gtst(inv, 0), a) +#endif ST_FUNC void gen_opi(int op); ST_FUNC void gen_opf(int op); ST_FUNC void gen_cvt_ftoi(int t); @@ -5179,7 +5179,7 @@ static void block(int *bsym, int *csym, int is_expr) vpushi(v); if (v == d) { gen_op(TOK_EQ); - gsym_addr(gtst(0, 0), sw.p[b]->sym); + gtst_addr(0, sw.p[b]->sym); } else { int e; gen_op(TOK_GE); @@ -5187,7 +5187,7 @@ static void block(int *bsym, int *csym, int is_expr) vseti(c, 0); vpushi(d); gen_op(TOK_LE); - gsym_addr(gtst(0, 0), sw.p[b]->sym); + gtst_addr(0, sw.p[b]->sym); gsym(e); } } diff --git a/x86_64-gen.c b/x86_64-gen.c index 19418fd..921813b 100644 --- a/x86_64-gen.c +++ b/x86_64-gen.c @@ -1686,8 +1686,21 @@ void gjmp_addr(int a) } } +ST_FUNC void gtst_addr(int inv, int a) +{ + inv ^= (vtop--)->c.i; + a -= ind + 2; + if (a == (char)a) { + g(inv - 32); + g(a); + } else { + g(0x0f); + oad(inv - 16, a - 4); + } +} + /* generate a test. set 'inv' to invert test. Stack entry is popped */ -int gtst(int inv, int t) +ST_FUNC int gtst(int inv, int t) { int v = vtop->r & VT_VALMASK; if (v == VT_CMP) { |
