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
695695 }
696696 }
697697
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+
698711 /* generate a test. set 'inv' to invert test. Stack entry is popped */
699712 ST_FUNC int gtst(int inv, int t)
700713 {
tcc.h+5−0
@@ -1472,6 +1472,11 @@ ST_FUNC void gfunc_epilog(void); · 1471 unmodified lines
14721472 ST_FUNC int gjmp(int t);
14731473 ST_FUNC void gjmp_addr(int a);
14741474 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
14751480 ST_FUNC void gen_opi(int op);
14761481 ST_FUNC void gen_opf(int op);
14771482 ST_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
51795179 vpushi(v);
51805180 if (v == d) {
51815181 gen_op(TOK_EQ);
5182− gsym_addr(gtst(0, 0), sw.p[b]->sym);
5182+ gtst_addr(0, sw.p[b]->sym);
51835183 } else {
51845184 int e;
51855185 gen_op(TOK_GE);
@@ -5187,7 +5187,7 @@ static void block(int *bsym, int *csym, int is_expr) · 1 unmodified line
51875187 vseti(c, 0);
51885188 vpushi(d);
51895189 gen_op(TOK_LE);
5190− gsym_addr(gtst(0, 0), sw.p[b]->sym);
5190+ gtst_addr(0, sw.p[b]->sym);
51915191 gsym(e);
51925192 }
51935193 }
x86_64-gen.c+14−1
@@ -1686,8 +1686,21 @@ void gjmp_addr(int a) · 1685 unmodified lines
16861686 }
16871687 }
16881688
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+
16891702 /* 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)
16911704 {
16921705 int v = vtop->r & VT_VALMASK;
16931706 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