summaryrefslogtreecommitdiff
path: root/template/optunifs.inc.tmpl
blob: 3ac58723464856ba7d80d72cf57ddb6fd7321e6f (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
/* -*-c-*- *********************************************************/
/*******************************************************************/
/*******************************************************************/
/**
  This file is for threaded code.

  ----
  This file is auto generated by insns2vm.rb
  DO NOT TOUCH!

  If you want to fix something, you must edit 'template/optunifs.inc.tmpl'
  or tool/insns2vm.rb
 */

/*
  static const int UNIFIED_insn_name_1[] = {id, size, ...};
  static const int UNIFIED_insn_name_2[] = {id, size, ...};
  ...

  static const int *const UNIFIED_insn_name[] = {size,
    UNIFIED_insn_name_1,
    UNIFIED_insn_name_2, ...};
  ...

  static const int *const *const unified_insns_data[] = {
    UNIFIED_insn_nameA,
    UNIFIED_insn_nameB, ...};
 */

% unif_insns_data = @insns.find_all {|insn| !insn.is_sc}.map do |insn|
%   size = insn.unifs.size
%   if size > 0
%     name = "UNIFIED_#{insn.name}"
%     insn.unifs.sort_by{|unif| -unif[1].size}.each_with_index do |(uni_insn, uni_insns), i|
%       uni_insns = uni_insns[1..-1]
static const int <%=name%>_<%=i%>[] = {
    BIN(<%=uni_insn.name%>), <%=uni_insns.size + 2%>,
    <% uni_insns.map{|e| -%>
BIN(<%=e.name%>),<% -%>
% }

};
%     end

static const int *const <%=name%>[] = {(int *)<%=size+1%>,
%     size.times do |e|
    <%=name%>_<%=e%>,
%     end
};
%     name
%   end
% end

static const int *const *const unified_insns_data[] = {<%#-%>
% unif_insns_data.each_with_index do |insn, i|
%   if (i%8).zero?

   <% -%>
%   end
 <%=insn || "0"%>,<%#-%>
% end

};

#undef GET_INSN_NAME

ASSERT_VM_INSTRUCTION_SIZE(unified_insns_data);