blob: 676f1edabaa10a6ce875d0efd0563fb7616ca8c2 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
/* -*- C -*- */
%# 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.
<%= render 'copyright' -%>
<%= render 'notice', locals: {
this_file: 'is for threaded code',
edit: __FILE__,
} -%>
static INSN *
insn_operands_unification(INSN *iobj)
{
#ifdef OPT_OPERANDS_UNIFICATION
VALUE *op = iobj->operands;
switch (iobj->insn_id) {
default:
/* do nothing */;
break;
% RubyVM::OperandsUnifications.each_group do |orig, unifs|
case <%= orig.bin %>:
% unifs.each do |insn|
/* <%= insn.pretty_name %> */
if ( <%= insn.condition('op') %> ) {
% insn.opes.each_with_index do |o, x|
% n = insn.operand_shift_of(o)
% if n != 0 then
op[<%= x %>] = op[<%= x + n %>];
% end
% end
iobj->insn_id = <%= insn.bin %>;
iobj->operand_size = <%= insn.opes.size %>;
break;
}
% end
break;
% end
}
#endif
return iobj;
}
int
rb_insn_unified_local_var_level(VALUE insn)
{
#ifdef OPT_OPERANDS_UNIFICATION
/* optimize rule */
switch (insn) {
default:
return -1; /* do nothing */;
% RubyVM::OperandsUnifications.each_group do |orig, unifs|
% unifs.each do|insn|
case <%= insn.bin %>:
% insn.spec.map{|(var,val)|val}.reject{|i| i == '*' }.each do |val|
return <%= val %>;
% break
% end
% end
% end
}
#endif
return -1;
}
|