diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-04-15 20:08:15 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-04-15 20:08:15 +0900 |
| commit | f301f36ec517a90033567bfc1806352d52243c8d (patch) | |
| tree | b08e67ebe385d18a4671ce8f75b66efc5908a1de /src/vm.c | |
| parent | 216b051756bb44ff3bbe7d0d96e1abc51ecc6078 (diff) | |
| parent | b796c503fa58797f094c688b038dc426a67ad568 (diff) | |
| download | mruby-f301f36ec517a90033567bfc1806352d52243c8d.tar.gz mruby-f301f36ec517a90033567bfc1806352d52243c8d.zip | |
Merge pull request #2064 from mirichi/opt_jmp
OP_EQ系が速くなった
Diffstat (limited to 'src/vm.c')
| -rw-r--r-- | src/vm.c | 29 |
1 files changed, 16 insertions, 13 deletions
@@ -1888,34 +1888,33 @@ RETRY_TRY_BLOCK: NEXT; } -#define OP_CMP_BODY(op,v1,v2) do {\ - if (regs[a].v1 op regs[a+1].v2) {\ - SET_TRUE_VALUE(regs[a]);\ - }\ - else {\ - SET_FALSE_VALUE(regs[a]);\ - }\ -} while(0) +#define OP_CMP_BODY(op,v1,v2) (regs[a].v1 op regs[a+1].v2) #define OP_CMP(op) do {\ - int a = GETARG_A(i);\ + 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):\ - OP_CMP_BODY(op,attr_i,attr_i);\ + result = 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);\ + result = 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);\ + result = 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);\ + result = OP_CMP_BODY(op,attr_f,attr_f);\ break;\ default:\ goto L_SEND;\ }\ + if (result) {\ + SET_TRUE_VALUE(regs[a]);\ + }\ + else {\ + SET_FALSE_VALUE(regs[a]);\ + }\ } while(0) CASE(OP_EQ) { @@ -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; } |
