aboutsummaryrefslogtreecommitdiffstats
path: root/vm_insnhelper.h
diff options
context:
space:
mode:
authorshyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-09-14 07:44:44 +0000
committershyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-09-14 07:44:44 +0000
commit9c6bd0d84064dcdbba24ab4b65238706827fe7a3 (patch)
tree669915f5faa81efdd826b4b51162fca733a2ab88 /vm_insnhelper.h
parent402001d6c79c10e620e9b7b1e64752d5431a0129 (diff)
downloadruby-9c6bd0d84064dcdbba24ab4b65238706827fe7a3.tar.gz
move ADD_PC around (take 2)
Now that we can say for sure if an instruction calls a method or not internally, it is now possible to reroute the bugs that forced us to revert the "move PC around" optimization. First try: r62051 Reverted: r63763 See also: r63999 ---- trunk: ruby 2.6.0dev (2018-09-13 trunk 64736) [x86_64-darwin15] ours: ruby 2.6.0dev (2018-09-13 trunk 64736) [x86_64-darwin15] last_commit=move ADD_PC around (take 2) Calculating ------------------------------------- trunk ours so_ackermann 1.884 2.278 i/s - 1.000 times in 0.530926s 0.438935s so_array 1.178 1.157 i/s - 1.000 times in 0.848786s 0.864467s so_binary_trees 0.176 0.177 i/s - 1.000 times in 5.683895s 5.657707s so_concatenate 0.220 0.221 i/s - 1.000 times in 4.546896s 4.518949s so_count_words 6.729 6.470 i/s - 1.000 times in 0.148602s 0.154561s so_exception 3.324 3.688 i/s - 1.000 times in 0.300872s 0.271147s so_fannkuch 0.546 0.968 i/s - 1.000 times in 1.831328s 1.033376s so_fasta 0.541 0.547 i/s - 1.000 times in 1.849923s 1.827091s so_k_nucleotide 0.800 0.777 i/s - 1.000 times in 1.250635s 1.286295s so_lists 2.101 1.848 i/s - 1.000 times in 0.475954s 0.541095s so_mandelbrot 0.435 0.408 i/s - 1.000 times in 2.299328s 2.450535s so_matrix 1.946 1.912 i/s - 1.000 times in 0.513872s 0.523076s so_meteor_contest 0.311 0.317 i/s - 1.000 times in 3.219297s 3.152052s so_nbody 0.746 0.703 i/s - 1.000 times in 1.339815s 1.423441s so_nested_loop 0.899 0.901 i/s - 1.000 times in 1.111767s 1.109555s so_nsieve 0.559 0.579 i/s - 1.000 times in 1.787763s 1.726552s so_nsieve_bits 0.435 0.428 i/s - 1.000 times in 2.296282s 2.333852s so_object 1.368 1.442 i/s - 1.000 times in 0.731237s 0.693684s so_partial_sums 0.616 0.546 i/s - 1.000 times in 1.623592s 1.833097s so_pidigits 0.831 0.832 i/s - 1.000 times in 1.203117s 1.202334s so_random 2.934 2.724 i/s - 1.000 times in 0.340791s 0.367150s so_reverse_complement 0.583 0.866 i/s - 1.000 times in 1.714144s 1.154615s so_sieve 1.829 2.081 i/s - 1.000 times in 0.546607s 0.480562s so_spectralnorm 0.524 0.558 i/s - 1.000 times in 1.908716s 1.792382s git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64737 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_insnhelper.h')
-rw-r--r--vm_insnhelper.h18
1 files changed, 11 insertions, 7 deletions
diff --git a/vm_insnhelper.h b/vm_insnhelper.h
index 6c1de01a62..56e63cd841 100644
--- a/vm_insnhelper.h
+++ b/vm_insnhelper.h
@@ -112,7 +112,6 @@ enum vm_regan_acttype {
#define DEC_SP(x) (VM_REG_SP -= (COLLECT_USAGE_REGISTER_HELPER(SP, SET, (x))))
#define SET_SV(x) (*GET_SP() = (x))
/* set current stack value as x */
-#define ADJ_SP(x) INC_SP(x)
/* instruction sequence C struct */
#define GET_ISEQ() (GET_CFP()->iseq)
@@ -184,9 +183,6 @@ enum vm_regan_acttype {
#define GET_BLOCK_HANDLER() (GET_LEP()[VM_ENV_DATA_INDEX_SPECVAL])
-#define WIDTH_OF_opt_send_without_block \
- ((rb_snum_t)attr_width_opt_send_without_block(0, 0))
-
/**********************************************************/
/* deal with control flow 3: exception */
/**********************************************************/
@@ -197,9 +193,8 @@ enum vm_regan_acttype {
/**********************************************************/
#if VM_CHECK_MODE > 0
-#define DECLARE_CANARY bool leaf; VALUE *canary
#define SETUP_CANARY() \
- if ((leaf = INSN_ATTR(leaf))) { \
+ if (leaf) { \
canary = GET_SP(); \
SET_SV(vm_stack_canary); \
}
@@ -208,7 +203,6 @@ enum vm_regan_acttype {
vm_canary_is_found_dead(INSN_ATTR(bin), *canary); \
}
#else
-#define DECLARE_CANARY /* void */
#define SETUP_CANARY() /* void */
#define CHECK_CANARY() /* void */
#endif
@@ -231,6 +225,16 @@ enum vm_regan_acttype {
#define USE_IC_FOR_SPECIALIZED_METHOD 1
#endif
+#ifndef MJIT_HEADER
+#define CALL_SIMPLE_METHOD() do { \
+ rb_snum_t x = leaf ? INSN_ATTR(width) : 0; \
+ rb_snum_t y = attr_width_opt_send_without_block(0, 0); \
+ rb_snum_t z = x - y; \
+ ADD_PC(z); \
+ DISPATCH_ORIGINAL_INSN(opt_send_without_block); \
+} while (0)
+#endif
+
#define NEXT_CLASS_SERIAL() (++ruby_vm_class_serial)
#define GET_GLOBAL_METHOD_STATE() (ruby_vm_global_method_state)
#define INC_GLOBAL_METHOD_STATE() (++ruby_vm_global_method_state)