• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright (c) 2021 Huawei Device Co., Ltd.
2// Licensed under the Apache License, Version 2.0 (the "License");
3// you may not use this file except in compliance with the License.
4// You may obtain a copy of the License at
5//
6//     http://www.apache.org/licenses/LICENSE-2.0
7//
8// Unless required by applicable law or agreed to in writing, software
9// distributed under the License is distributed on an "AS IS" BASIS,
10// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11// See the License for the specific language governing permissions and
12// limitations under the License.
13
14// Autogenerated file -- DO NOT EDIT!
15import * as ir from "./irnodes";
16
17export const builtinsCodeMap = {
18% PandaBuiltins::instructions.each do |instr|
19%   sig = instr['sig']
20%   args = sig.split(/,?\s+/)
21%   args_len = args.length()
22%   builtin_num_of_instr = 0;
23    "<%= instr.mnemonic %>" : {
24%   PandaBuiltins::builtins.each do |builtin|
25%     if builtin.insn == instr.mnemonic
26      "<%= builtin.mnemonic %>" : <%= builtin.id %>,
27      <%= builtin.id %> : "<%= builtin.mnemonic %>",
28%     end
29%   end
30    },
31% end
32};
33
34% def insn2node(insn)
35%   mnemonic = insn.mnemonic.split('.')
36%   return mnemonic.map{|el| el == '64' ? 'Wide' : el.capitalize}.join()
37% end
38
39export class BuiltinExpander {
40    static getSubCode(ins: ir.Intrinsic): number | undefined {
41        for (let key in builtinsCodeMap) {
42            let code = (builtinsCodeMap as any)[key][ins.mnemonic];
43            if (code != undefined) {
44                return code;
45            }
46        }
47        return undefined;
48    }
49
50    static expand2Builtin(ins: ir.Intrinsic, operands: ir.OperandType[]) {
51        let code = this.getSubCode(ins);
52        if ((code == undefined) || (code >= 256)) {
53            throw new Error("Intrinsic getSubCode subcode(" + ins.mnemonic + ") ir = " + ins.toString());
54        }
55
56        let codeImm = new ir.Imm(ir.ResultType.Int, code);
57        let newNode;
58        switch (ins.mnemonic) {
59% PandaBuiltins::instructions.each do |instr|
60%   sig = instr['sig']
61%   args = sig.split(/,?\s+/)
62%   args_len = args.length()
63%   builtin_num_of_instr = 0;
64%   PandaBuiltins::builtins.each do |builtin|
65%     if builtin.insn == instr.mnemonic
66%       builtin_num_of_instr += 1;
67            case "<%= builtin.sig.split(' ')[0]%>":
68%     end
69%   end
70%   if builtin_num_of_instr > 0
71%     parameters = ""
72%     for i in 2..args_len-1 # ignore first two opcode
73%       if (args[i].start_with?("imm"))
74                if (!(operands[<%= i-2%>] instanceof ir.Imm)) {
75                    throw new Error("<%= i-2%> parameters must be Imm <" + ins.toString() + ">");
76%         parameters += ", <ir.Imm>operands[" + (i-2).to_s + "]"
77                }
78%       elsif (args[i].start_with?("v"))
79                if (!(operands[<%= i-2%>] instanceof ir.VReg)) {
80                    throw new Error("<%= i-2%> parameters must be VReg <" + ins.toString() + ">");
81%         parameters += ", <ir.VReg>operands[" + (i-2).to_s + "]"
82                }
83%       elsif (args[i].include?("string_id"))
84                if (typeof(operands[<%= i-2%>]) != 'string') {
85                    throw new Error("<%= i-2%> parameters must be string <" + ins.toString() + ">");
86%         parameters += ", <string>operands[" + (i-2).to_s + "]"
87                }
88%       elsif (args[i].include?("method_id"))
89                if (typeof(operands[<%= i-2%>]) != 'string') {
90                    throw new Error("<%= i-2%> parameters must be string <" + ins.toString() + ">");
91%         parameters += ", <string>operands[" + (i-2).to_s + "]"
92                }
93%       else
94%         raise "Unknown parameters type"
95%       end
96%     end
97%     if insn2node(instr) == "BuiltinR2i"
98                let imm = <ir.Imm>operands[0];
99                operands.shift();
100                newNode = new ir.<%= insn2node(instr)%>(codeImm, imm, <ir.VReg[]>operands);
101                break;
102%     else
103                newNode = new ir.<%= insn2node(instr)%>(codeImm<%= parameters%>);
104                break;
105%     end
106%   end
107% end
108            default:
109                throw new Error("Intrinsic can't found subcode(" + ins.mnemonic + ") ir = " + ins.toString());
110        }
111
112        return newNode;
113    }
114}
115