Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:42.2
neko
0008-jit.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0008-jit.patch of Package neko
From ccc78c29deab7971e1369f4fe3dedd14cf9f3128 Mon Sep 17 00:00:00 2001 From: sharow <shirowmiura@gmail.com> Date: Sun, 12 Oct 2014 11:08:13 +0900 Subject: [PATCH] - fix: remove reusing argument on stack - separate JIT logic and others (switch/case, etc) --- vm/jit_x86.c | 52 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/vm/jit_x86.c b/vm/jit_x86.c index ae979d0..261b616 100644 --- a/vm/jit_x86.c +++ b/vm/jit_x86.c @@ -1621,58 +1621,70 @@ static void jit_make_env( jit_ctx *ctx, int esize ) { static void jit_object_op_gen( jit_ctx *ctx, enum Operation op, int right ) { int *next; + field f; + int is_opset; + INIT_BUFFER; - // prepare args - XPush_r(right?REG_TMP:REG_ACC); - if( op == OP_SET ) { - XMov_rp(TMP2,Esp,FIELD(3)); - XPush_r(TMP2); - } - XMov_rr(TMP2,Esp); - XPush_c(0); - XPush_c((op == OP_SET)?2:1); - XPush_r(TMP2); + f = 0; + is_opset = 0; switch( op ) { case OP_ADD: - XPush_c(right?id_radd:id_add); + f = (right ? id_radd : id_add); break; case OP_SUB: - XPush_c(right?id_rsub:id_sub); + f = (right ? id_rsub : id_sub); break; case OP_MUL: - XPush_c(right?id_rmult:id_mult); + f = (right ? id_rmult : id_mult); break; case OP_DIV: - XPush_c(right?id_rdiv:id_div); + f = (right ? id_rdiv : id_div); break; case OP_MOD: - XPush_c(right?id_rmod:id_mod); + f = (right ? id_rmod : id_mod); break; case OP_GET: - XPush_c(id_get); + f = id_get; break; case OP_SET: - XPush_c(id_set); + f = id_set; + is_opset = 1; break; default: ERROR; } + + // prepare args + XPush_r(right?REG_TMP:REG_ACC); + if( is_opset ) { + XMov_rp(TMP2,Esp,FIELD(3)); + XPush_r(TMP2); + } + XMov_rr(TMP2,Esp); + XPush_c(0); + XPush_c(is_opset?2:1); + XPush_r(TMP2); + XPush_r(right?REG_ACC:REG_TMP); + + XPush_c(f); XPush_r(right?REG_ACC:REG_TMP); XCall_m(val_field); + stack_pop(Esp,2); XCmp_rc(ACC,CONST(val_null)); XJump(JNeq,next); - stack_pop(Esp,(op == OP_SET)?7:6); + stack_pop(Esp,is_opset?6:5); runtime_error(11,true); // Unsupported operation + PATCH_JUMP(next); XPop_r(TMP); - stack_pop(Esp,1); + XPush_r(ACC); XPush_r(TMP); begin_call(); XCall_m(val_callEx); end_call(); - stack_pop(Esp,(op == OP_SET)?7:6); + stack_pop(Esp,is_opset?7:6); XRet(); END_BUFFER; } -- 2.1.0
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor