diff options
author | Daniel Colson <danieljamescolson@gmail.com> | 2022-11-30 20:28:14 -0500 |
---|---|---|
committer | John Hawthorn <john@hawthorn.email> | 2022-12-06 12:37:23 -0800 |
commit | c43951e60eed0b01f464cd25441b81751d2d5087 (patch) | |
tree | bcf5a060db738653287650970c0034b0d3473a6e /vm_core.h | |
parent | 9d4483f24deaf360dafe745a71211ec73dc7029a (diff) |
Move BOP macros to separate file
This commit moves ruby_basic_operators and the unredefined macros out of
vm_core.h and into basic_operators.h so that we can use them more
broadly in places where we currently use a method look up via
`rb_method_basic_definition_p` (e.g. object.c, numeric.c, complex.c,
enum.c, but also in internal/compar.h after introducing BOP_CMP and
elsewhere if we introduce more BOPs)
The most controversial part of this change is probably moving
redefined_flag out of rb_vm_t. [vm_opt_method_def_table and
vm_opt_mid_table](https://github.com/ruby/ruby/blob/9da2a5204f32a4f2ce135fddde2abb6e07d647e9/vm.c)
are not part of rb_vm_t either, and I think this fits well with those.
But more significantly it seems to result in one fewer instruction. For
example:
Before:
```
(lldb) disassemble -n vm_opt_str_freeze
miniruby`vm_exec_core:
miniruby[0x10028233e] <+14558>: movq 0x11a86b(%rip), %rax ; ruby_current_vm_ptr
miniruby[0x100282345] <+14565>: testb $0x4, 0x242c(%rax)
```
After:
```
(lldb) disassemble -n vm_opt_str_freeze
ruby`vm_exec_core:
ruby[0x100280ebe] <+14510>: testb $0x4, 0x120147(%rip) ; ruby_vm_redefined_flag + 43
```
Co-authored-by: John Hawthorn <jhawthorn@github.com>
Diffstat (limited to 'vm_core.h')
-rw-r--r-- | vm_core.h | 53 |
1 files changed, 1 insertions, 52 deletions
@@ -91,6 +91,7 @@ extern int ruby_assert_critical_section_entered; #include "id.h" #include "internal.h" #include "internal/array.h" +#include "internal/basic_operators.h" #include "internal/serial.h" #include "internal/vm.h" #include "method.h" @@ -582,40 +583,6 @@ enum ruby_special_exceptions { ruby_special_error_count }; -enum ruby_basic_operators { - BOP_PLUS, - BOP_MINUS, - BOP_MULT, - BOP_DIV, - BOP_MOD, - BOP_EQ, - BOP_EQQ, - BOP_LT, - BOP_LE, - BOP_LTLT, - BOP_AREF, - BOP_ASET, - BOP_LENGTH, - BOP_SIZE, - BOP_EMPTY_P, - BOP_NIL_P, - BOP_SUCC, - BOP_GT, - BOP_GE, - BOP_NOT, - BOP_NEQ, - BOP_MATCH, - BOP_FREEZE, - BOP_UMINUS, - BOP_MAX, - BOP_MIN, - BOP_CALL, - BOP_AND, - BOP_OR, - - BOP_LAST_ -}; - #define GetVMPtr(obj, ptr) \ GetCoreDataFromValue((obj), rb_vm_t, (ptr)) @@ -775,7 +742,6 @@ typedef struct rb_vm_struct { size_t fiber_machine_stack_size; } default_params; - short redefined_flag[BOP_LAST_]; } rb_vm_t; /* default values */ @@ -808,23 +774,6 @@ typedef struct rb_vm_struct { #define RUBY_VM_FIBER_MACHINE_STACK_SIZE_MIN ( 128 * 1024 * sizeof(VALUE)) #endif -/* optimize insn */ -#define INTEGER_REDEFINED_OP_FLAG (1 << 0) -#define FLOAT_REDEFINED_OP_FLAG (1 << 1) -#define STRING_REDEFINED_OP_FLAG (1 << 2) -#define ARRAY_REDEFINED_OP_FLAG (1 << 3) -#define HASH_REDEFINED_OP_FLAG (1 << 4) -/* #define BIGNUM_REDEFINED_OP_FLAG (1 << 5) */ -#define SYMBOL_REDEFINED_OP_FLAG (1 << 6) -#define TIME_REDEFINED_OP_FLAG (1 << 7) -#define REGEXP_REDEFINED_OP_FLAG (1 << 8) -#define NIL_REDEFINED_OP_FLAG (1 << 9) -#define TRUE_REDEFINED_OP_FLAG (1 << 10) -#define FALSE_REDEFINED_OP_FLAG (1 << 11) -#define PROC_REDEFINED_OP_FLAG (1 << 12) - -#define BASIC_OP_UNREDEFINED_P(op, klass) (LIKELY((GET_VM()->redefined_flag[(op)]&(klass)) == 0)) - #ifndef VM_DEBUG_BP_CHECK #define VM_DEBUG_BP_CHECK 0 #endif |