diff options
author | shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-01-29 07:15:08 +0000 |
---|---|---|
committer | shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-01-29 07:15:08 +0000 |
commit | c788fb48086653599cf51b9dd128b8efe7dec33c (patch) | |
tree | 61260067141ebc574c176f781f1c15863e13bea1 /insns.def | |
parent | 31ecd18f1aa0589571c2a1264d9e45d7b228d644 (diff) |
eliminate CALL_SIMPLE_METHOD
Arrange operands of several opt_something insns so that jumps to
opt_send_without_block can be applied to them. This makes it
possible to eliminate CALL_SIMPLE_METHOD macro at all. Results
in binary size of vm_exec_core to change from 27,008 bytes to
26,016 bytes on my machine. [close GH-1779]
Note however that PC can point somewhere non-instruction now.
-----------------------------------------------------------
benchmark results:
minimum results in each 3 measurements.
Execution time (sec)
name before after
so_ackermann 0.450 0.426
so_array 0.789 0.824
so_binary_trees 5.760 5.635
so_concatenate 3.594 3.508
so_count_words 0.211 0.196
so_exception 0.256 0.244
so_fannkuch 1.049 1.044
so_fasta 1.485 1.472
so_k_nucleotide 1.195 1.216
so_lists 0.517 0.513
so_mandelbrot 2.264 2.394
so_matrix 0.501 0.468
so_meteor_contest 2.987 2.912
so_nbody 1.307 1.289
so_nested_loop 0.908 0.925
so_nsieve 1.679 1.614
so_nsieve_bits 2.131 2.092
so_object 0.620 0.625
so_partial_sums 1.623 1.675
so_pidigits 1.135 1.190
so_random 0.357 0.321
so_reverse_complement 0.619 0.583
so_sieve 0.493 0.496
so_spectralnorm 1.749 1.737
Speedup ratio: compare with the result of `before' (greater is better)
name after
so_ackermann 1.057
so_array 0.958
so_binary_trees 1.022
so_concatenate 1.024
so_count_words 1.077
so_exception 1.049
so_fannkuch 1.004
so_fasta 1.009
so_k_nucleotide 0.983
so_lists 1.007
so_mandelbrot 0.946
so_matrix 1.072
so_meteor_contest 1.026
so_nbody 1.013
so_nested_loop 0.982
so_nsieve 1.040
so_nsieve_bits 1.018
so_object 0.992
so_partial_sums 0.969
so_pidigits 0.954
so_random 1.111
so_reverse_complement 1.062
so_sieve 0.994
so_spectralnorm 1.007
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62089 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'insns.def')
-rw-r--r-- | insns.def | 27 |
1 files changed, 10 insertions, 17 deletions
@@ -1083,18 +1083,15 @@ opt_eq /* optimized X!=Y. */ DEFINE_INSN opt_neq -(CALL_INFO ci, CALL_CACHE cc, CALL_INFO ci_eq, CALL_CACHE cc_eq) +(CALL_INFO ci_eq, CALL_CACHE cc_eq, CALL_INFO ci, CALL_CACHE cc) (VALUE recv, VALUE obj) (VALUE val) -// attr bool handles_frame = true; { val = vm_opt_neq(ci, cc, ci_eq, cc_eq, recv, obj); if (val == Qundef) { - /* other */ - PUSH(recv); - PUSH(obj); - CALL_SIMPLE_METHOD(recv); + ADD_PC(2); /* !!! */ + DISPATCH_ORIGINAL_INSN(opt_send_without_block); } } @@ -1199,10 +1196,9 @@ opt_aset /* recv[str] = set */ DEFINE_INSN opt_aset_with -(CALL_INFO ci, CALL_CACHE cc, VALUE key) +(VALUE key, CALL_INFO ci, CALL_CACHE cc) (VALUE recv, VALUE val) (VALUE val) -// attr bool handles_frame = true; { VALUE tmp = vm_opt_aset_with(recv, key, val); @@ -1210,29 +1206,26 @@ opt_aset_with val = tmp; } else { - /* other */ - PUSH(recv); - PUSH(rb_str_resurrect(key)); + TOPN(0) = rb_str_resurrect(key); PUSH(val); - CALL_SIMPLE_METHOD(recv); + ADD_PC(1); /* !!! */ + DISPATCH_ORIGINAL_INSN(opt_send_without_block); } } /* recv[str] */ DEFINE_INSN opt_aref_with -(CALL_INFO ci, CALL_CACHE cc, VALUE key) +(VALUE key, CALL_INFO ci, CALL_CACHE cc) (VALUE recv) (VALUE val) -// attr bool handles_frame = true; { val = vm_opt_aref_with(recv, key); if (val == Qundef) { - /* other */ - PUSH(recv); PUSH(rb_str_resurrect(key)); - CALL_SIMPLE_METHOD(recv); + ADD_PC(1); /* !!! */ + DISPATCH_ORIGINAL_INSN(opt_send_without_block); } } |