History

gtst_addr(): short conditional jumps (i386, x86_64)

Pavlas, Zdenek committed 10 years ago

Commit e238e651 parent fc0fc6a4 files · +34 −3Browse files

Unified · Split

4 files
  1. i386-gen.c +13 −0
  2. tcc.h +5 −0
  3. tccgen.c +2 −2
  4. x86_64-gen.c +14 −1
i386-gen.c+13−0
@@ -695,6 +695,19 @@ ST_FUNC void gjmp_addr(int a) · 694 unmodified lines
695 }695 }
696}696}
697 697
698ST_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 */
699ST_FUNC int gtst(int inv, int t)712ST_FUNC int gtst(int inv, int t)
700{713{
tcc.h+5−0
@@ -1472,6 +1472,11 @@ ST_FUNC void gfunc_epilog(void); · 1471 unmodified lines
1472ST_FUNC int gjmp(int t);1472ST_FUNC int gjmp(int t);
1473ST_FUNC void gjmp_addr(int a);1473ST_FUNC void gjmp_addr(int a);
1474ST_FUNC int gtst(int inv, int t);1474ST_FUNC int gtst(int inv, int t);
1475#if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64
1476ST_FUNC void gtst_addr(int inv, int a);
1477#else
1478#define gtst_addr(inv, a) gsym_addr(gtst(inv, 0), a)
1479#endif
1475ST_FUNC void gen_opi(int op);1480ST_FUNC void gen_opi(int op);
1476ST_FUNC void gen_opf(int op);1481ST_FUNC void gen_opf(int op);
1477ST_FUNC void gen_cvt_ftoi(int t);1482ST_FUNC void gen_cvt_ftoi(int t);
tccgen.c+2−2
@@ -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 }
x86_64-gen.c+14−1
@@ -1686,8 +1686,21 @@ void gjmp_addr(int a) · 1685 unmodified lines
1686 }1686 }
1687}1687}
1688 1688
1689ST_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 */
1690int gtst(int inv, int t)1703ST_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) {

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t