Unified · Split
| @@ -695,6 +695,19 @@ ST_FUNC void gjmp_addr(int a) · 694 unmodified lines | ||
| 695 | 695 | } |
| 696 | 696 | } |
| 697 | 697 | |
| 698 | +ST_FUNC void gtst_addr(int inv, int a) | |
| 699 | +{ | |
| 700 | + inv ^= (vtop--)->c.i; | |
| 701 | + a -= ind + 2; | |
| 702 | + if (a == (char)a) { | |
| 703 | + g(inv - 32); | |
| 704 | + g(a); | |
| 705 | + } else { | |
| 706 | + g(0x0f); | |
| 707 | + oad(inv - 16, a - 4); | |
| 708 | + } | |
| 709 | +} | |
| 710 | + | |
| 698 | 711 | /* generate a test. set 'inv' to invert test. Stack entry is popped */ |
| 699 | 712 | ST_FUNC int gtst(int inv, int t) |
| 700 | 713 | { |
| @@ -1472,6 +1472,11 @@ ST_FUNC void gfunc_epilog(void); · 1471 unmodified lines | ||
| 1472 | 1472 | ST_FUNC int gjmp(int t); |
| 1473 | 1473 | ST_FUNC void gjmp_addr(int a); |
| 1474 | 1474 | ST_FUNC int gtst(int inv, int t); |
| 1475 | +#if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64 | |
| 1476 | +ST_FUNC void gtst_addr(int inv, int a); | |
| 1477 | +#else | |
| 1478 | +#define gtst_addr(inv, a) gsym_addr(gtst(inv, 0), a) | |
| 1479 | +#endif | |
| 1475 | 1480 | ST_FUNC void gen_opi(int op); |
| 1476 | 1481 | ST_FUNC void gen_opf(int op); |
| 1477 | 1482 | ST_FUNC void gen_cvt_ftoi(int t); |
| @@ -5179,7 +5179,7 @@ static void block(int *bsym, int *csym, int is_expr) · 5178 unmodified lines | ||
| 5179 | 5179 | vpushi(v); |
| 5180 | 5180 | if (v == d) { |
| 5181 | 5181 | gen_op(TOK_EQ); |
| 5182 | − gsym_addr(gtst(0, 0), sw.p[b]->sym); | |
| 5182 | + gtst_addr(0, sw.p[b]->sym); | |
| 5183 | 5183 | } else { |
| 5184 | 5184 | int e; |
| 5185 | 5185 | gen_op(TOK_GE); |
| @@ -5187,7 +5187,7 @@ static void block(int *bsym, int *csym, int is_expr) · 1 unmodified line | ||
| 5187 | 5187 | vseti(c, 0); |
| 5188 | 5188 | vpushi(d); |
| 5189 | 5189 | gen_op(TOK_LE); |
| 5190 | − gsym_addr(gtst(0, 0), sw.p[b]->sym); | |
| 5190 | + gtst_addr(0, sw.p[b]->sym); | |
| 5191 | 5191 | gsym(e); |
| 5192 | 5192 | } |
| 5193 | 5193 | } |
| @@ -1686,8 +1686,21 @@ void gjmp_addr(int a) · 1685 unmodified lines | ||
| 1686 | 1686 | } |
| 1687 | 1687 | } |
| 1688 | 1688 | |
| 1689 | +ST_FUNC void gtst_addr(int inv, int a) | |
| 1690 | +{ | |
| 1691 | + inv ^= (vtop--)->c.i; | |
| 1692 | + a -= ind + 2; | |
| 1693 | + if (a == (char)a) { | |
| 1694 | + g(inv - 32); | |
| 1695 | + g(a); | |
| 1696 | + } else { | |
| 1697 | + g(0x0f); | |
| 1698 | + oad(inv - 16, a - 4); | |
| 1699 | + } | |
| 1700 | +} | |
| 1701 | + | |
| 1689 | 1702 | /* generate a test. set 'inv' to invert test. Stack entry is popped */ |
| 1690 | −int gtst(int inv, int t) | |
| 1703 | +ST_FUNC int gtst(int inv, int t) | |
| 1691 | 1704 | { |
| 1692 | 1705 | int v = vtop->r & VT_VALMASK; |
| 1693 | 1706 | if (v == VT_CMP) { |