mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
7d4ad74f22
Now that sp_inc attributes are officially provided as inline functions. Why not use them directly from the vm core, not just by the compiler. By doing so, it is now possible for us to optimize stack manipulations. We can now know exactly how many words of stack space an instruction consumes before it actually does. This changeset deletes some lines from insns.def because they are no longer needed. As a result it reduces the size of vm_exec_core function from 32,400 bytes to 32,352 bytes on my machine. It seems it does not affect performance: ----------------------------------------------------------- benchmark results: minimum results in each 3 measurements. Execution time (sec) name before after loop_for 1.093 1.061 loop_generator 1.156 1.152 loop_times 0.982 0.974 loop_whileloop 0.549 0.587 loop_whileloop2 0.115 0.121 Speedup ratio: compare with the result of `before' (greater is better) name after loop_for 1.030 loop_generator 1.003 loop_times 1.008 loop_whileloop 0.935 loop_whileloop2 0.949 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62087 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
57 lines
1.8 KiB
Text
57 lines
1.8 KiB
Text
%# -*- mode:c; style:ruby; coding: utf-8; indent-tabs-mode: nil -*-
|
|
%# Copyright (c) 2017 Urabe, Shyouhei. All rights reserved.
|
|
%#
|
|
%# This file is a part of the programming language Ruby. Permission is hereby
|
|
%# granted, to either redistribute and/or modify this file, provided that the
|
|
%# conditions mentioned in the file COPYING are met. Consult the file for
|
|
%# details.
|
|
%;
|
|
|
|
/* insn <%= insn.pretty_name %> */
|
|
INSN_ENTRY(<%= insn.name %>)
|
|
{
|
|
%# NAME_OF_CURRENT_INSN is used in vm_exec.h
|
|
# define NAME_OF_CURRENT_INSN <%= insn.name %>
|
|
# define INSN_ATTR(x) <%= insn.call_attribute(' ## x ## ') %>
|
|
% unless insn.declarations.empty?
|
|
<%= insn.declarations.join(";\n ") %>;
|
|
|
|
% end
|
|
START_OF_ORIGINAL_INSN(<%= insn.name %>);
|
|
% insn.preamble.each do |konst|
|
|
<%= render_c_expr konst -%>
|
|
% end
|
|
% insn.opes.each_with_index do |ope, i|
|
|
<%= ope[:name] %> = (<%= ope[:type] %>)GET_OPERAND(<%= i + 1 %>);
|
|
% end
|
|
%
|
|
% insn.pops.reverse_each.with_index.reverse_each do |pop, i|
|
|
<%= pop[:name] %> = <%= insn.cast_from_VALUE pop, "TOPN(#{i})"%>;
|
|
% end
|
|
DEBUG_ENTER_INSN(INSN_ATTR(name));
|
|
% if insn.handles_frame?
|
|
ADD_PC(INSN_ATTR(width));
|
|
POPN(INSN_ATTR(popn));
|
|
% end
|
|
COLLECT_USAGE_INSN(INSN_ATTR(bin));
|
|
% insn.opes.each_with_index do |ope, i|
|
|
COLLECT_USAGE_OPERAND(INSN_ATTR(bin), <%= i %>, <%= ope[:name] %>);
|
|
% end
|
|
<%= render_c_expr insn.expr -%>
|
|
CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
|
|
% if insn.handles_frame?
|
|
% insn.rets.reverse_each do |ret|
|
|
PUSH(<%= insn.cast_to_VALUE ret %>);
|
|
% end
|
|
% else
|
|
ADJ_SP(INSN_ATTR(sp_inc));
|
|
% insn.rets.reverse_each.with_index do |ret, i|
|
|
TOPN(<%= i %>) = <%= insn.cast_to_VALUE ret %>;
|
|
% end
|
|
ADD_PC(INSN_ATTR(width));
|
|
PREFETCH(GET_PC());
|
|
% end
|
|
END_INSN(<%= insn.name %>);
|
|
# undef INSN_ATTR
|
|
# undef NAME_OF_CURRENT_INSN
|
|
}
|