Commit 50d469d9 authored by Yukihiro Matsumoto's avatar Yukihiro Matsumoto

small performance tweak; inline assignment

parent bf7f9f83
...@@ -404,6 +404,11 @@ argnum_error(mrb_state *mrb, int num) ...@@ -404,6 +404,11 @@ argnum_error(mrb_state *mrb, int num)
#define SET_INT_VALUE(r,n) MRB_SET_VALUE(r, MRB_TT_FIXNUM, value.i, (n)) #define SET_INT_VALUE(r,n) MRB_SET_VALUE(r, MRB_TT_FIXNUM, value.i, (n))
#define SET_SYM_VALUE(r,v) MRB_SET_VALUE(r, MRB_TT_SYMBOL, value.sym, (v)) #define SET_SYM_VALUE(r,v) MRB_SET_VALUE(r, MRB_TT_SYMBOL, value.sym, (v))
#define SET_OBJ_VALUE(r,v) MRB_SET_VALUE(r, (((struct RObject*)(v))->tt), value.p, (v)) #define SET_OBJ_VALUE(r,v) MRB_SET_VALUE(r, (((struct RObject*)(v))->tt), value.p, (v))
#ifdef MRB_NAN_BOXING
#define SET_FLT_VALUE(r,v) r.f = (v)
#else
#define SET_FLT_VALUE(r,v) MRB_SET_VALUE(r, MRB_TT_FLOAT, value.f, (v))
#endif
#ifdef __GNUC__ #ifdef __GNUC__
#define DIRECT_THREADED #define DIRECT_THREADED
...@@ -496,17 +501,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) ...@@ -496,17 +501,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
CASE(OP_MOVE) { CASE(OP_MOVE) {
/* A B R(A) := R(B) */ /* A B R(A) := R(B) */
#if 1
regs[GETARG_A(i)] = regs[GETARG_B(i)]; regs[GETARG_A(i)] = regs[GETARG_B(i)];
#elif 0
int a = GETARG_A(i);
int b = GETARG_B(i);
regs[a].tt = regs[b].tt;
regs[a].value = regs[b].value;
#else
memcpy(regs+GETARG_A(i), regs+GETARG_B(i), sizeof(mrb_value));
#endif
NEXT; NEXT;
} }
...@@ -530,19 +525,19 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) ...@@ -530,19 +525,19 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
CASE(OP_LOADSELF) { CASE(OP_LOADSELF) {
/* A R(A) := self */ /* A R(A) := self */
regs[GETARG_A(i)] = mrb->stack[0]; regs[GETARG_A(i)] = regs[0];
NEXT; NEXT;
} }
CASE(OP_LOADT) { CASE(OP_LOADT) {
/* A R(A) := true */ /* A R(A) := true */
regs[GETARG_A(i)] = mrb_true_value(); SET_TRUE_VALUE(regs[GETARG_A(i)]);
NEXT; NEXT;
} }
CASE(OP_LOADF) { CASE(OP_LOADF) {
/* A R(A) := false */ /* A R(A) := false */
regs[GETARG_A(i)] = mrb_false_value(); SET_FALSE_VALUE(regs[GETARG_A(i)]);
NEXT; NEXT;
} }
...@@ -624,6 +619,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) ...@@ -624,6 +619,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
CASE(OP_GETUPVAR) { CASE(OP_GETUPVAR) {
/* A B C R(A) := uvget(B,C) */ /* A B C R(A) := uvget(B,C) */
regs[GETARG_A(i)] = uvget(mrb, GETARG_C(i), GETARG_B(i)); regs[GETARG_A(i)] = uvget(mrb, GETARG_C(i), GETARG_B(i));
NEXT; NEXT;
} }
...@@ -671,7 +667,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) ...@@ -671,7 +667,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
CASE(OP_RESCUE) { CASE(OP_RESCUE) {
/* A R(A) := exc; clear(exc) */ /* A R(A) := exc; clear(exc) */
SET_OBJ_VALUE(regs[GETARG_A(i)],mrb->exc); SET_OBJ_VALUE(regs[GETARG_A(i)], mrb->exc);
mrb->exc = 0; mrb->exc = 0;
NEXT; NEXT;
} }
...@@ -1278,16 +1274,17 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) ...@@ -1278,16 +1274,17 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
z = x + y; z = x + y;
if (((x < 0) ^ (y < 0)) == 0 && (x < 0) != (z < 0)) { if (((x < 0) ^ (y < 0)) == 0 && (x < 0) != (z < 0)) {
/* integer overflow */ /* integer overflow */
return mrb_float_value((mrb_float)x + (mrb_float)y); SET_FLT_VALUE(regs[a], (mrb_float)x + (mrb_float)y);
break;
} }
regs[a] = mrb_fixnum_value(z); SET_INT_VALUE(regs[a], z);
} }
break; break;
case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT): case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT):
{ {
mrb_int x = mrb_fixnum(regs[a]); mrb_int x = mrb_fixnum(regs[a]);
mrb_float y = mrb_float(regs[a+1]); mrb_float y = mrb_float(regs[a+1]);
regs[a] = mrb_float_value((mrb_float)x + y); SET_FLT_VALUE(regs[a], (mrb_float)x + y);
} }
break; break;
case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM): case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM):
...@@ -1300,7 +1297,6 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) ...@@ -1300,7 +1297,6 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
regs[a] = mrb_str_plus(mrb, regs[a], regs[a+1]); regs[a] = mrb_str_plus(mrb, regs[a], regs[a+1]);
break; break;
default: default:
i = MKOP_ABC(OP_SEND, a, GETARG_B(i), GETARG_C(i));
goto L_SEND; goto L_SEND;
} }
mrb->arena_idx = ai; mrb->arena_idx = ai;
...@@ -1322,16 +1318,17 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) ...@@ -1322,16 +1318,17 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
z = x - y; z = x - y;
if (((x < 0) ^ (y < 0)) == 0 && (x < 0) != (z < 0)) { if (((x < 0) ^ (y < 0)) == 0 && (x < 0) != (z < 0)) {
/* integer overflow */ /* integer overflow */
return mrb_float_value((mrb_float)x - (mrb_float)y); SET_FLT_VALUE(regs[a], (mrb_float)x - (mrb_float)y);
break;
} }
regs[a] = mrb_fixnum_value(z); SET_INT_VALUE(regs[a], z);
} }
break; break;
case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT): case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT):
{ {
mrb_int x = mrb_fixnum(regs[a]); mrb_int x = mrb_fixnum(regs[a]);
mrb_float y = mrb_float(regs[a+1]); mrb_float y = mrb_float(regs[a+1]);
regs[a] = mrb_float_value((mrb_float)x - y); SET_FLT_VALUE(regs[a], (mrb_float)x - y);
} }
break; break;
case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM): case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM):
...@@ -1341,7 +1338,6 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) ...@@ -1341,7 +1338,6 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
OP_MATH_BODY(-,attr_f,attr_f); OP_MATH_BODY(-,attr_f,attr_f);
break; break;
default: default:
i = MKOP_ABC(OP_SEND, a, GETARG_B(i), GETARG_C(i));
goto L_SEND; goto L_SEND;
} }
NEXT; NEXT;
...@@ -1361,10 +1357,10 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) ...@@ -1361,10 +1357,10 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
y = mrb_fixnum(regs[a+1]); y = mrb_fixnum(regs[a+1]);
z = x * y; z = x * y;
if (x != 0 && z/x != y) { if (x != 0 && z/x != y) {
regs[a] = mrb_float_value((mrb_float)x * (mrb_float)y); SET_FLT_VALUE(regs[a], (mrb_float)x * (mrb_float)y);
} }
else { else {
regs[a] = mrb_fixnum_value(z); SET_INT_VALUE(regs[a], z);
} }
} }
break; break;
...@@ -1372,7 +1368,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) ...@@ -1372,7 +1368,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
{ {
mrb_int x = mrb_fixnum(regs[a]); mrb_int x = mrb_fixnum(regs[a]);
mrb_float y = mrb_float(regs[a+1]); mrb_float y = mrb_float(regs[a+1]);
regs[a] = mrb_float_value((mrb_float)x * y); SET_FLT_VALUE(regs[a], (mrb_float)x * y);
} }
break; break;
case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM): case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM):
...@@ -1382,7 +1378,6 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) ...@@ -1382,7 +1378,6 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
OP_MATH_BODY(*,attr_f,attr_f); OP_MATH_BODY(*,attr_f,attr_f);
break; break;
default: default:
i = MKOP_ABC(OP_SEND, a, GETARG_B(i), GETARG_C(i));
goto L_SEND; goto L_SEND;
} }
NEXT; NEXT;
...@@ -1398,14 +1393,14 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) ...@@ -1398,14 +1393,14 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
{ {
mrb_int x = mrb_fixnum(regs[a]); mrb_int x = mrb_fixnum(regs[a]);
mrb_int y = mrb_fixnum(regs[a+1]); mrb_int y = mrb_fixnum(regs[a+1]);
regs[a] = mrb_float_value((mrb_float)x / (mrb_float)y); SET_FLT_VALUE(regs[a], (mrb_float)x / (mrb_float)y);
} }
break; break;
case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT): case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT):
{ {
mrb_int x = mrb_fixnum(regs[a]); mrb_int x = mrb_fixnum(regs[a]);
mrb_float y = mrb_float(regs[a+1]); mrb_float y = mrb_float(regs[a+1]);
regs[a] = mrb_float_value((mrb_float)x / y); SET_FLT_VALUE(regs[a], (mrb_float)x / y);
} }
break; break;
case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM): case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM):
...@@ -1415,7 +1410,6 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) ...@@ -1415,7 +1410,6 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
OP_MATH_BODY(/,attr_f,attr_f); OP_MATH_BODY(/,attr_f,attr_f);
break; break;
default: default:
i = MKOP_ABC(OP_SEND, a, GETARG_B(i), GETARG_C(i));
goto L_SEND; goto L_SEND;
} }
NEXT; NEXT;
...@@ -1487,7 +1481,6 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) ...@@ -1487,7 +1481,6 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
OP_CMP_BODY(op,attr_f,attr_f);\ OP_CMP_BODY(op,attr_f,attr_f);\
break;\ break;\
default:\ default:\
i = MKOP_ABC(OP_SEND, a, GETARG_B(i), GETARG_C(i));\
goto L_SEND;\ goto L_SEND;\
}\ }\
} while (0) } while (0)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment