aboutsummaryrefslogtreecommitdiffstats
path: root/tool/ruby_vm/views/_insn_entry.erb
diff options
context:
space:
mode:
Diffstat (limited to 'tool/ruby_vm/views/_insn_entry.erb')
-rw-r--r--tool/ruby_vm/views/_insn_entry.erb11
1 files changed, 10 insertions, 1 deletions
diff --git a/tool/ruby_vm/views/_insn_entry.erb b/tool/ruby_vm/views/_insn_entry.erb
index 836ca32b6b..bae8eae890 100644
--- a/tool/ruby_vm/views/_insn_entry.erb
+++ b/tool/ruby_vm/views/_insn_entry.erb
@@ -30,16 +30,25 @@ INSN_ENTRY(<%= insn.name %>)
% end
DEBUG_ENTER_INSN(INSN_ATTR(name));
ADD_PC(INSN_ATTR(width));
+% if insn.handles_frame?
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));
-% insn.rets.each do |ret|
+% 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
+% end
END_INSN(<%= insn.name %>);
# undef INSN_ATTR
# undef NAME_OF_CURRENT_INSN