Merge pull request #2064 from mirichi/opt_jmp

OP_EQ系が速くなった
This commit is contained in:
Yukihiro "Matz" Matsumoto
2014-04-15 20:08:15 +09:00
+26 -23
View File
@@ -1888,8 +1888,28 @@ RETRY_TRY_BLOCK:
NEXT;
}
#define OP_CMP_BODY(op,v1,v2) do {\
if (regs[a].v1 op regs[a+1].v2) {\
#define OP_CMP_BODY(op,v1,v2) (regs[a].v1 op regs[a+1].v2)
#define OP_CMP(op) do {\
int result;\
/* need to check if - is overridden */\
switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) {\
case TYPES2(MRB_TT_FIXNUM,MRB_TT_FIXNUM):\
result = OP_CMP_BODY(op,attr_i,attr_i);\
break;\
case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT):\
result = OP_CMP_BODY(op,attr_i,attr_f);\
break;\
case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM):\
result = OP_CMP_BODY(op,attr_f,attr_i);\
break;\
case TYPES2(MRB_TT_FLOAT,MRB_TT_FLOAT):\
result = OP_CMP_BODY(op,attr_f,attr_f);\
break;\
default:\
goto L_SEND;\
}\
if (result) {\
SET_TRUE_VALUE(regs[a]);\
}\
else {\
@@ -1897,27 +1917,6 @@ RETRY_TRY_BLOCK:
}\
} while(0)
#define OP_CMP(op) do {\
int a = GETARG_A(i);\
/* need to check if - is overridden */\
switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) {\
case TYPES2(MRB_TT_FIXNUM,MRB_TT_FIXNUM):\
OP_CMP_BODY(op,attr_i,attr_i);\
break;\
case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT):\
OP_CMP_BODY(op,attr_i,attr_f);\
break;\
case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM):\
OP_CMP_BODY(op,attr_f,attr_i);\
break;\
case TYPES2(MRB_TT_FLOAT,MRB_TT_FLOAT):\
OP_CMP_BODY(op,attr_f,attr_f);\
break;\
default:\
goto L_SEND;\
}\
} while(0)
CASE(OP_EQ) {
/* A B C R(A) := R(A)<R(A+1) (Syms[B]=:==,C=1)*/
int a = GETARG_A(i);
@@ -1932,24 +1931,28 @@ RETRY_TRY_BLOCK:
CASE(OP_LT) {
/* A B C R(A) := R(A)<R(A+1) (Syms[B]=:<,C=1)*/
int a = GETARG_A(i);
OP_CMP(<);
NEXT;
}
CASE(OP_LE) {
/* A B C R(A) := R(A)<=R(A+1) (Syms[B]=:<=,C=1)*/
int a = GETARG_A(i);
OP_CMP(<=);
NEXT;
}
CASE(OP_GT) {
/* A B C R(A) := R(A)<R(A+1) (Syms[B]=:<,C=1)*/
int a = GETARG_A(i);
OP_CMP(>);
NEXT;
}
CASE(OP_GE) {
/* A B C R(A) := R(A)<=R(A+1) (Syms[B]=:<=,C=1)*/
int a = GETARG_A(i);
OP_CMP(>=);
NEXT;
}