aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgrischka <grischka>2013-01-14 18:33:59 +0100
committergrischka <grischka>2013-01-14 18:41:37 +0100
commitc5892fe4f5b285dddea4ed89edba749e40346d1f (patch)
tree66cd1b13cc82ac9cfcf592591f26530b35aff139
parent2daf8b96a82e51b719b6585ed2ba2719c682ee40 (diff)
downloadtinycc-c5892fe4f5b285dddea4ed89edba749e40346d1f.tar.gz
tinycc-c5892fe4f5b285dddea4ed89edba749e40346d1f.tar.bz2
Revert "Optimize vswap()"
This reverts commit 63193d1794b037eb4f3b6551596fa8a6d423e0c3. Had some problems (_STATIC_ASSERT) and was too ugly anyway. For retry, I'd suggest to implement a general function static inline void memswap (void *p1, void* p2, size_t n); and then use that. If you do so, please keep the original code as comment.
-rw-r--r--tcc.h4
-rw-r--r--tccgen.c37
2 files changed, 8 insertions, 33 deletions
diff --git a/tcc.h b/tcc.h
index 5489b49..b8b81c2 100644
--- a/tcc.h
+++ b/tcc.h
@@ -228,10 +228,6 @@
#define true 1
typedef int BOOL;
-#ifndef _STATIC_ASSERT
-#define _STATIC_ASSERT(cond) do { (void) sizeof(char [1 - 2*!(cond)]); } while(0)
-#endif
-
#define INCLUDE_STACK_SIZE 32
#define IFDEF_STACK_SIZE 64
#define VSTACK_SIZE 256
diff --git a/tccgen.c b/tccgen.c
index e058811..4300403 100644
--- a/tccgen.c
+++ b/tccgen.c
@@ -458,7 +458,7 @@ static void vseti(int r, int v)
ST_FUNC void vswap(void)
{
- unsigned long *vtopl;
+ SValue tmp;
/* cannot let cpu flags if other instruction are generated. Also
avoid leaving VT_JMP anywhere except on the top of the stack
because it would complicate the code generator. */
@@ -467,35 +467,14 @@ ST_FUNC void vswap(void)
if (v == VT_CMP || (v & ~1) == VT_JMP)
gv(RC_INT);
}
+ tmp = vtop[0];
+ vtop[0] = vtop[-1];
+ vtop[-1] = tmp;
- /*
- * vtop[0], vtop[-1] = vtop[-1], vtop[0]
- *
- * vswap is called often and exchanging vtop[0] vs vtop[-1] is hot on
- * profile, so it is hand optimized
- */
- vtopl = (unsigned long *) vtop;
-# define VSIZEL (sizeof(*vtop) / sizeof(*vtopl))
-
- _STATIC_ASSERT( VSIZEL*sizeof(*vtopl) == sizeof(*vtop) );
- _STATIC_ASSERT( VSIZEL <= 16 ); /* should be enough */
- switch(VSIZEL) {
-# define VSWAPL(i) \
- case i+1: { \
- unsigned long tmpl; \
- tmpl = vtopl[i]; \
- vtopl[i] = vtopl[-1*VSIZEL + i]; \
- vtopl[-1*VSIZEL + i] = tmpl; \
- } do {} while (0)
-
- VSWAPL(15); VSWAPL(14); VSWAPL(13); VSWAPL(12);
- VSWAPL(11); VSWAPL(10); VSWAPL( 9); VSWAPL( 8);
- VSWAPL( 7); VSWAPL( 6); VSWAPL( 5); VSWAPL( 4);
- VSWAPL( 3); VSWAPL( 2); VSWAPL( 1); VSWAPL( 0);
- }
-
-# undef VSWAPL
-# undef VSIZEL
+/* XXX: +2% overall speed possible with optimized memswap
+ *
+ * memswap(&vtop[0], &vtop[1], sizeof *vtop);
+ */
}
ST_FUNC void vpushv(SValue *v)