mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
9c6bd0d840
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
60 lines
2 KiB
Text
60 lines
2 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 ## ') %>
|
|
bool leaf;
|
|
MAYBE_UNUSED(VALUE *) canary;
|
|
% 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 (! (leaf = INSN_ATTR(leaf))) ADD_PC(INSN_ATTR(width));
|
|
% if insn.handles_sp?
|
|
POPN(INSN_ATTR(popn));
|
|
% end
|
|
<%= insn.handle_canary "SETUP_CANARY()" -%>
|
|
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.handle_canary "CHECK_CANARY()" -%>
|
|
% if insn.handles_sp?
|
|
% insn.rets.reverse_each do |ret|
|
|
PUSH(<%= insn.cast_to_VALUE ret %>);
|
|
% end
|
|
% else
|
|
INC_SP(INSN_ATTR(sp_inc));
|
|
% insn.rets.reverse_each.with_index do |ret, i|
|
|
TOPN(<%= i %>) = <%= insn.cast_to_VALUE ret %>;
|
|
% end
|
|
% end
|
|
if (leaf) ADD_PC(INSN_ATTR(width));
|
|
END_INSN(<%= insn.name %>);
|
|
# undef INSN_ATTR
|
|
# undef NAME_OF_CURRENT_INSN
|
|
}
|