Project

General

Profile

Feature #619 ยป basic_op_unredefined_p_perf.patch

cout (Paul Brannan), 10/08/2008 12:10 AM

View differences:

vm.c
VALUE rb_mRubyVMFrozenCore;
VALUE ruby_vm_global_state_version = 1;
VALUE ruby_vm_redefined_flag = 0;
VALUE ruby_vm_redefined_flag[BOP_LAST_];
rb_thread_t *ruby_current_thread = 0;
rb_vm_t *ruby_current_vm = 0;
......
VALUE bop;
if (st_lookup(vm_opt_method_table, (st_data_t)node, &bop)) {
ruby_vm_redefined_flag |= bop;
ruby_vm_redefined_flag[bop] = 1;
}
}
......
vm_opt_method_table = st_init_numtable();
#define OP(mid_, bop_) (mid = id##mid_, bop = BOP_##bop_)
#define OP(mid_, bop_) (mid = id##mid_, bop = BOP_##bop_, ruby_vm_redefined_flag[bop] = 0)
#define C(k) add_opt_method(rb_c##k, mid, bop)
OP(PLUS, PLUS), (C(Fixnum), C(Float), C(String), C(Array));
OP(MINUS, MINUS), (C(Fixnum));
vm_insnhelper.h
/* VM state version */
extern VALUE ruby_vm_global_state_version;
extern VALUE ruby_vm_redefined_flag;
/* extern VALUE ruby_vm_redefined_flag; */
#define GET_VM_STATE_VERSION() (ruby_vm_global_state_version)
#define INC_VM_STATE_VERSION() \
(ruby_vm_global_state_version = (ruby_vm_global_state_version+1) & 0x8fffffff)
#define BOP_PLUS 0x01
#define BOP_MINUS 0x02
#define BOP_MULT 0x04
#define BOP_DIV 0x08
#define BOP_MOD 0x10
#define BOP_EQ 0x20
#define BOP_LT 0x40
#define BOP_LE 0x80
#define BOP_LTLT 0x100
#define BOP_AREF 0x200
#define BOP_ASET 0x400
#define BOP_LENGTH 0x800
#define BOP_SUCC 0x1000
#define BOP_GT 0x2000
#define BOP_GE 0x4000
#define BOP_NOT 0x8000
#define BOP_NEQ 0x10000
enum {
BOP_PLUS,
BOP_MINUS,
BOP_MULT,
BOP_DIV,
BOP_MOD,
BOP_EQ,
BOP_LT,
BOP_LE,
BOP_LTLT,
BOP_AREF,
BOP_ASET,
BOP_LENGTH,
BOP_SUCC,
BOP_GT,
BOP_GE,
BOP_NOT,
BOP_NEQ,
BOP_LAST_,
};
extern VALUE ruby_vm_redefined_flag[BOP_LAST_];
/**********************************************************/
/* deal with stack */
......
/* optimize insn */
#define FIXNUM_2_P(a, b) ((a) & (b) & 1)
#define BASIC_OP_UNREDEFINED_P(op) ((ruby_vm_redefined_flag & (op)) == 0)
#define BASIC_OP_UNREDEFINED_P(op) ((ruby_vm_redefined_flag[op]) == 0)
#define HEAP_CLASS_OF(obj) RBASIC(obj)->klass
#define CALL_SIMPLE_METHOD(num, id, recv) do { \
    (1-1/1)