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