diff options
author | shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-01-26 06:30:58 +0000 |
---|---|---|
committer | shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-01-26 06:30:58 +0000 |
commit | 3234245ae3240fd2018d8d33de998d0573914111 (patch) | |
tree | 0daee12c5f01e02da51a1cbcc3dc9d472dd58225 /tool/ruby_vm/views | |
parent | b56f6a6b8c84d82259ef9af3a21253832a3326cb (diff) |
move ADD_PC around to optimize PC manipluiations
This commit introduces new attribute handles_flame and if that is
_not_ the case, places ADD_PC right after INC_SP. This improves
locality of PC manipulations to prevents unnecessary register spill-
outs. As a result, it reduces the size of vm_exec_core from 32,688
bytes to 32,384 bytes on my machine.
Speedup is very faint, but certain.
-----------------------------------------------------------
benchmark results:
minimum results in each 3 measurements.
Execution time (sec)
name before after
so_ackermann 0.476 0.464
so_array 0.742 0.728
so_binary_trees 5.493 5.466
so_concatenate 3.619 3.395
so_count_words 0.190 0.184
so_exception 0.249 0.239
so_fannkuch 0.994 0.953
so_fasta 1.369 1.374
so_k_nucleotide 1.111 1.111
so_lists 0.470 0.481
so_mandelbrot 2.059 2.050
so_matrix 0.466 0.465
so_meteor_contest 2.712 2.781
so_nbody 1.154 1.204
so_nested_loop 0.852 0.846
so_nsieve 1.636 1.623
so_nsieve_bits 2.073 2.039
so_object 0.616 0.584
so_partial_sums 1.464 1.481
so_pidigits 1.075 1.082
so_random 0.321 0.317
so_reverse_complement 0.555 0.558
so_sieve 0.495 0.490
so_spectralnorm 1.634 1.627
Speedup ratio: compare with the result of `before' (greater is better)
name after
so_ackermann 1.025
so_array 1.019
so_binary_trees 1.005
so_concatenate 1.066
so_count_words 1.030
so_exception 1.040
so_fannkuch 1.043
so_fasta 0.996
so_k_nucleotide 1.000
so_lists 0.978
so_mandelbrot 1.004
so_matrix 1.001
so_meteor_contest 0.975
so_nbody 0.959
so_nested_loop 1.007
so_nsieve 1.008
so_nsieve_bits 1.017
so_object 1.056
so_partial_sums 0.989
so_pidigits 0.994
so_random 1.014
so_reverse_complement 0.996
so_sieve 1.010
so_spectralnorm 1.004
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62051 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'tool/ruby_vm/views')
-rw-r--r-- | tool/ruby_vm/views/_insn_entry.erb | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/tool/ruby_vm/views/_insn_entry.erb b/tool/ruby_vm/views/_insn_entry.erb index cebca8b8d0..f2f0f6418e 100644 --- a/tool/ruby_vm/views/_insn_entry.erb +++ b/tool/ruby_vm/views/_insn_entry.erb @@ -28,8 +28,9 @@ INSN_ENTRY(<%= insn.name %>) <%= pop[:name] %> = <%= insn.cast_from_VALUE pop, "TOPN(#{i})"%>; % end DEBUG_ENTER_INSN(<%=cstr insn.name %>); +% if insn.handles_frame? ADD_PC(<%= insn.width %>); - PREFETCH(GET_PC()); +% end % unless insn.pops.empty? POPN(<%= insn.pops.size %>); % end @@ -44,7 +45,10 @@ INSN_ENTRY(<%= insn.name %>) PUSH(<%= insn.cast_to_VALUE ret %>); % end % end -% +% unless insn.handles_frame? + ADD_PC(<%= insn.width %>); + PREFETCH(GET_PC()); +% end END_INSN(<%= insn.name %>); } #undef NAME_OF_CURRENT_INSN |