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 | /* generate a test. set 'inv' to invert test. Stack entry is popped */ | 711 | /* generate a test. set 'inv' to invert test. Stack entry is popped */ |
| 699 | ST_FUNC int gtst(int inv, int t) | 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 | ST_FUNC int gjmp(int t); | 1472 | ST_FUNC int gjmp(int t); |
| 1473 | ST_FUNC void gjmp_addr(int a); | 1473 | ST_FUNC void gjmp_addr(int a); |
| 1474 | ST_FUNC int gtst(int inv, int t); | 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 | ST_FUNC void gen_opi(int op); | 1480 | ST_FUNC void gen_opi(int op); |
| 1476 | ST_FUNC void gen_opf(int op); | 1481 | ST_FUNC void gen_opf(int op); |
| 1477 | ST_FUNC void gen_cvt_ftoi(int t); | 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 | vpushi(v); | 5179 | vpushi(v); |
| 5180 | if (v == d) { | 5180 | if (v == d) { |
| 5181 | gen_op(TOK_EQ); | 5181 | gen_op(TOK_EQ); |
| 5182 | gsym_addr(gtst(0, 0), sw.p[b]->sym); | 5182 | gtst_addr(0, sw.p[b]->sym); |
| 5183 | } else { | 5183 | } else { |
| 5184 | int e; | 5184 | int e; |
| 5185 | gen_op(TOK_GE); | 5185 | gen_op(TOK_GE); |
| @@ -5187,7 +5187,7 @@ static void block(int *bsym, int *csym, int is_expr) · 1 unmodified line | |||
| 5187 | vseti(c, 0); | 5187 | vseti(c, 0); |
| 5188 | vpushi(d); | 5188 | vpushi(d); |
| 5189 | gen_op(TOK_LE); | 5189 | gen_op(TOK_LE); |
| 5190 | gsym_addr(gtst(0, 0), sw.p[b]->sym); | 5190 | gtst_addr(0, sw.p[b]->sym); |
| 5191 | gsym(e); | 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 | /* generate a test. set 'inv' to invert test. Stack entry is popped */ | 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 | int v = vtop->r & VT_VALMASK; | 1705 | int v = vtop->r & VT_VALMASK; |
| 1693 | if (v == VT_CMP) { | 1706 | if (v == VT_CMP) { |