on master help sign in
Small runtime performance tweak
24a083fEdwin Brady
rts/idris_rts.h+3
@@ -291,6 +291,9 @@ typedef intptr_t i_int;
291 if (vm->valstack_top+(x) > vm->stack_max) { stackOverflow(); } \
291 if (vm->valstack_top+(x) > vm->stack_max) { stackOverflow(); } \
292 else { memset(vm->valstack_top, 0, (x)*sizeof(VAL)); } \
292 else { memset(vm->valstack_top, 0, (x)*sizeof(VAL)); } \
293 } while(0)
293 } while(0)
294+#define RESERVENOALLOC(x) do { \
295+ if (vm->valstack_top+(x) > vm->stack_max) { stackOverflow(); } \
296+ } while(0)
294#define ADDTOP(x) vm->valstack_top += (x)
297#define ADDTOP(x) vm->valstack_top += (x)
295#define TOPBASE(x) vm->valstack_top = vm->valstack_base + (x)
298#define TOPBASE(x) vm->valstack_top = vm->valstack_base + (x)
296#define BASETOP(x) vm->valstack_base = vm->valstack_top + (x)
299#define BASETOP(x) vm->valstack_base = vm->valstack_top + (x)
src/IRTS/Bytecode.hs+3−2
@@ -86,6 +86,7 @@ data BC =
86 -- | reserve n more stack items (i.e. check there's space, grow if
86 -- | reserve n more stack items (i.e. check there's space, grow if
87 -- necessary)
87 -- necessary)
88 | RESERVE Int
88 | RESERVE Int
89+ | RESERVENOALLOC Int
89
90
90 -- | move the top of stack up
91 -- | move the top of stack up
91 | ADDTOP Int
92 | ADDTOP Int
@@ -127,13 +128,13 @@ bc reg (SV (Loc i)) r = assign reg (L i) ++ clean r
127bc reg (SApp False f vs) r =
128bc reg (SApp False f vs) r =
128 if argCount == 0
129 if argCount == 0
129 then moveReg 0 vs ++ [STOREOLD, BASETOP 0, CALL f] ++ ret
130 then moveReg 0 vs ++ [STOREOLD, BASETOP 0, CALL f] ++ ret
130− else RESERVE argCount : moveReg 0 vs ++
131+ else RESERVENOALLOC argCount : moveReg 0 vs ++
131 [STOREOLD, BASETOP 0, ADDTOP argCount, CALL f] ++ ret
132 [STOREOLD, BASETOP 0, ADDTOP argCount, CALL f] ++ ret
132 where
133 where
133 ret = assign reg RVal ++ clean r
134 ret = assign reg RVal ++ clean r
134 argCount = length vs
135 argCount = length vs
135bc reg (SApp True f vs) r
136bc reg (SApp True f vs) r
136− = RESERVE (length vs) : moveReg 0 vs
137+ = RESERVENOALLOC (length vs) : moveReg 0 vs
137 ++ [SLIDE (length vs), TOPBASE (length vs), TAILCALL f]
138 ++ [SLIDE (length vs), TOPBASE (length vs), TAILCALL f]
138bc reg (SForeign t fname args) r
139bc reg (SForeign t fname args) r
139 = FOREIGNCALL reg t fname (map farg args) : clean r
140 = FOREIGNCALL reg t fname (map farg args) : clean r
src/IRTS/CodegenC.hs+2
@@ -321,6 +321,8 @@ bcc f i (SLIDE n) = indent i ++ "SLIDE(vm, " ++ show n ++ ");\n"
321bcc f i REBASE = indent i ++ "REBASE;\n"
321bcc f i REBASE = indent i ++ "REBASE;\n"
322bcc f i (RESERVE 0) = ""
322bcc f i (RESERVE 0) = ""
323bcc f i (RESERVE n) = indent i ++ "RESERVE(" ++ show n ++ ");\n"
323bcc f i (RESERVE n) = indent i ++ "RESERVE(" ++ show n ++ ");\n"
324+bcc f i (RESERVENOALLOC 0) = ""
325+bcc f i (RESERVENOALLOC n) = indent i ++ "RESERVENOALLOC(" ++ show n ++ ");\n"
324bcc f i (ADDTOP 0) = ""
326bcc f i (ADDTOP 0) = ""
325bcc f i (ADDTOP n) = indent i ++ "ADDTOP(" ++ show n ++ ");\n"
327bcc f i (ADDTOP n) = indent i ++ "ADDTOP(" ++ show n ++ ");\n"
326bcc f i (TOPBASE n) = indent i ++ "TOPBASE(" ++ show n ++ ");\n"
328bcc f i (TOPBASE n) = indent i ++ "TOPBASE(" ++ show n ++ ");\n"