summaryrefslogtreecommitdiffhomepage
path: root/src/vm.c
diff options
context:
space:
mode:
authorMasaki Muranaka <[email protected]>2013-03-18 17:04:23 +0900
committerMasaki Muranaka <[email protected]>2013-03-18 23:29:11 +0900
commit7a78ecb14ce2d28f3f99c19eacbbdff5b385e3a8 (patch)
tree1db03fc5bc809995faaaa6c8443fa6304b40fd99 /src/vm.c
parent5217d889633fc556458b2327c30ba483e02ce6d7 (diff)
downloadmruby-7a78ecb14ce2d28f3f99c19eacbbdff5b385e3a8.tar.gz
mruby-7a78ecb14ce2d28f3f99c19eacbbdff5b385e3a8.zip
Optimize OP_ADD instruction.
Diffstat (limited to 'src/vm.c')
-rw-r--r--src/vm.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/src/vm.c b/src/vm.c
index 8ae0c1612..ff5d7b829 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -1403,7 +1403,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
#define attr_f value.f
#endif
-#define TYPES2(a,b) (((((int)(a))<<8)|((int)(b)))&0xffff)
+#define TYPES2(a,b) ((((uint16_t)(a))<<8)|(((uint16_t)(b))&0xff))
#define OP_MATH_BODY(op,v1,v2) do {\
regs[a].v1 = regs[a].v1 op regs[a+1].v2;\
} while(0)
@@ -1417,16 +1417,18 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
case TYPES2(MRB_TT_FIXNUM,MRB_TT_FIXNUM):
{
mrb_int x, y, z;
+ mrb_value *regs_a = regs + a;
- x = mrb_fixnum(regs[a]);
- y = mrb_fixnum(regs[a+1]);
+ x = mrb_fixnum(regs_a[0]);
+ y = mrb_fixnum(regs_a[1]);
z = x + y;
- if (((x < 0) ^ (y < 0)) == 0 && (x < 0) != (z < 0)) {
+ if ((x < 0) != (z < 0) && ((x < 0) ^ (y < 0)) == 0) {
/* integer overflow */
- SET_FLT_VALUE(regs[a], (mrb_float)x + (mrb_float)y);
- break;
+ SET_FLT_VALUE(regs_a[0], (mrb_float)x + (mrb_float)y);
+ }
+ else {
+ regs_a[0].attr_i = z;
}
- SET_INT_VALUE(regs[a], z);
}
break;
case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT):