mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
builtin.h: avoid copy&paste
Instead of doubling the invokebuiltin logic here and there, use the same insns.def definition for both MJIT/non-JIT situations.
This commit is contained in:
parent
802bcd3ec8
commit
7e536b3be2
Notes:
git
2020-07-13 08:56:51 +09:00
4 changed files with 24 additions and 38 deletions
16
builtin.h
16
builtin.h
|
@ -80,20 +80,4 @@ struct builtin_binary {
|
||||||
size_t bin_size;
|
size_t bin_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
// mjit
|
|
||||||
|
|
||||||
RBIMPL_ATTR_MAYBE_UNUSED()
|
|
||||||
static void
|
|
||||||
mjit_invokebuiltin_default_compiler(FILE *f, const struct rb_builtin_function *bf, long index)
|
|
||||||
{
|
|
||||||
if (index >= 0) {
|
|
||||||
fprintf(f, "val = vm_invoke_builtin(ec, GET_CFP(), %p, STACK_ADDR_FROM_TOP(%d));\n",
|
|
||||||
(const void *)bf, bf->argc);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
fprintf(f, "val = vm_invoke_builtin_delegate(ec, GET_CFP(), %p, %ld);\n",
|
|
||||||
(const void *)bf, index);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // BUILTIN_H_INCLUDED
|
#endif // BUILTIN_H_INCLUDED
|
||||||
|
|
|
@ -63,10 +63,6 @@
|
||||||
fprintf(f, " goto label_%lu;\n", arg.base_pos + else_offset);
|
fprintf(f, " goto label_%lu;\n", arg.base_pos + else_offset);
|
||||||
fprintf(f, " }\n");
|
fprintf(f, " }\n");
|
||||||
}
|
}
|
||||||
% elsif insn.name == 'invokebuiltin' || insn.name == 'opt_invokebuiltin_delegate'
|
|
||||||
{
|
|
||||||
<%= render 'mjit_compile_invokebuiltin', locals: { insn: insn } -%>
|
|
||||||
}
|
|
||||||
% else
|
% else
|
||||||
% # Before we `goto` next insn, we need to set return values, especially for getinlinecache
|
% # Before we `goto` next insn, we need to set return values, especially for getinlinecache
|
||||||
% insn.rets.reverse_each.with_index do |ret, i|
|
% insn.rets.reverse_each.with_index do |ret, i|
|
||||||
|
|
|
@ -6,18 +6,24 @@
|
||||||
% # conditions mentioned in the file COPYING are met. Consult the file for
|
% # conditions mentioned in the file COPYING are met. Consult the file for
|
||||||
% # details.
|
% # details.
|
||||||
%
|
%
|
||||||
/* <%= insn.name %> */
|
% insn.opes.each_with_index do |ope, i|
|
||||||
const struct rb_builtin_function *bf = (const void *)operands[0];
|
<%= ope.fetch(:decl) %> = (<%= ope.fetch(:type) %>)operands[<%= i %>];
|
||||||
%
|
|
||||||
% if insn.name == 'invokebuiltin' then
|
|
||||||
const rb_num_t index = -1;
|
|
||||||
% else
|
|
||||||
const rb_num_t index = (rb_num_t)operands[1];
|
|
||||||
% end
|
% end
|
||||||
%
|
rb_snum_t sp_inc = <%= insn.call_attribute('sp_inc') %>;
|
||||||
if (bf->compiler) {
|
unsigned sp = b->stack_size + (unsigned)sp_inc;
|
||||||
bf->compiler(f, index);
|
VM_ASSERT(sp_inc >= 0);
|
||||||
}
|
VM_ASSERT(sp_inc < UINT_MAX - b->stack_size);
|
||||||
else {
|
|
||||||
mjit_invokebuiltin_default_compiler(f, bf, index);
|
if (bf->compiler) {
|
||||||
}
|
fprintf(f, "{\n");
|
||||||
|
fprintf(f, " VALUE val;\n");
|
||||||
|
bf->compiler(f, <%=
|
||||||
|
insn.name == 'invokebuiltin' ? '-1' : '(rb_num_t)operands[1]'
|
||||||
|
%>);
|
||||||
|
fprintf(f, " stack[%u] = val;\n", sp - 1);
|
||||||
|
fprintf(f, "}\n");
|
||||||
|
% if insn.name != 'opt_invokebuiltin_delegate_leave'
|
||||||
|
b->stack_size = sp;
|
||||||
|
break;
|
||||||
|
% end
|
||||||
|
}
|
||||||
|
|
|
@ -63,15 +63,15 @@ switch (insn) {
|
||||||
}
|
}
|
||||||
% when 'getinstancevariable', 'setinstancevariable'
|
% when 'getinstancevariable', 'setinstancevariable'
|
||||||
<%= render 'mjit_compile_ivar', locals: { insn: insn } -%>
|
<%= render 'mjit_compile_ivar', locals: { insn: insn } -%>
|
||||||
|
% when 'invokebuiltin', 'opt_invokebuiltin_delegate'
|
||||||
|
{
|
||||||
|
<%= render 'mjit_compile_invokebuiltin', locals: { insn: insn } -%>
|
||||||
|
}
|
||||||
% when 'leave', 'opt_invokebuiltin_delegate_leave'
|
% when 'leave', 'opt_invokebuiltin_delegate_leave'
|
||||||
{
|
{
|
||||||
% # opt_invokebuiltin_delegate_leave also implements leave insn. We need to handle it here for inlining.
|
% # opt_invokebuiltin_delegate_leave also implements leave insn. We need to handle it here for inlining.
|
||||||
% if insn.name == 'opt_invokebuiltin_delegate_leave'
|
% if insn.name == 'opt_invokebuiltin_delegate_leave'
|
||||||
fprintf(f, "{\n");
|
|
||||||
fprintf(f, " VALUE val;\n");
|
|
||||||
<%= render 'mjit_compile_invokebuiltin', locals: { insn: insn } -%>
|
<%= render 'mjit_compile_invokebuiltin', locals: { insn: insn } -%>
|
||||||
fprintf(f, " stack[0] = val;\n");
|
|
||||||
fprintf(f, "}\n");
|
|
||||||
% else
|
% else
|
||||||
if (b->stack_size != 1) {
|
if (b->stack_size != 1) {
|
||||||
if (mjit_opts.warnings || mjit_opts.verbose)
|
if (mjit_opts.warnings || mjit_opts.verbose)
|
||||||
|
|
Loading…
Add table
Reference in a new issue