1//=- WebAssemblyInstrFormats.td - WebAssembly Instr. Formats -*- tablegen -*-=// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9/// 10/// \file 11/// \brief WebAssembly instruction format definitions. 12/// 13//===----------------------------------------------------------------------===// 14 15// WebAssembly Instruction Format. 16class WebAssemblyInst<string asmstr> : Instruction { 17 field bits<0> Inst; // Instruction encoding. 18 let Namespace = "WebAssembly"; 19 let Pattern = []; 20 let AsmString = asmstr; 21} 22 23// Normal instructions. 24class I<dag oops, dag iops, list<dag> pattern, string asmstr = ""> 25 : WebAssemblyInst<asmstr> { 26 dag OutOperandList = oops; 27 dag InOperandList = iops; 28 let Pattern = pattern; 29} 30 31// Unary and binary instructions, for the local types that WebAssembly supports. 32multiclass UnaryInt<SDNode node, string name> { 33 def _I32 : I<(outs I32:$dst), (ins I32:$src), 34 [(set I32:$dst, (node I32:$src))], 35 !strconcat("i32.", !strconcat(name, "\t$dst, $src"))>; 36 def _I64 : I<(outs I64:$dst), (ins I64:$src), 37 [(set I64:$dst, (node I64:$src))], 38 !strconcat("i64.", !strconcat(name, "\t$dst, $src"))>; 39} 40multiclass BinaryInt<SDNode node, string name> { 41 def _I32 : I<(outs I32:$dst), (ins I32:$lhs, I32:$rhs), 42 [(set I32:$dst, (node I32:$lhs, I32:$rhs))], 43 !strconcat("i32.", !strconcat(name, "\t$dst, $lhs, $rhs"))>; 44 def _I64 : I<(outs I64:$dst), (ins I64:$lhs, I64:$rhs), 45 [(set I64:$dst, (node I64:$lhs, I64:$rhs))], 46 !strconcat("i64.", !strconcat(name, "\t$dst, $lhs, $rhs"))>; 47} 48multiclass UnaryFP<SDNode node, string name> { 49 def _F32 : I<(outs F32:$dst), (ins F32:$src), 50 [(set F32:$dst, (node F32:$src))], 51 !strconcat("f32.", !strconcat(name, "\t$dst, $src"))>; 52 def _F64 : I<(outs F64:$dst), (ins F64:$src), 53 [(set F64:$dst, (node F64:$src))], 54 !strconcat("f64.", !strconcat(name, "\t$dst, $src"))>; 55} 56multiclass BinaryFP<SDNode node, string name> { 57 def _F32 : I<(outs F32:$dst), (ins F32:$lhs, F32:$rhs), 58 [(set F32:$dst, (node F32:$lhs, F32:$rhs))], 59 !strconcat("f32.", !strconcat(name, "\t$dst, $lhs, $rhs"))>; 60 def _F64 : I<(outs F64:$dst), (ins F64:$lhs, F64:$rhs), 61 [(set F64:$dst, (node F64:$lhs, F64:$rhs))], 62 !strconcat("f64.", !strconcat(name, "\t$dst, $lhs, $rhs"))>; 63} 64multiclass ComparisonInt<CondCode cond, string name> { 65 def _I32 : I<(outs I32:$dst), (ins I32:$lhs, I32:$rhs), 66 [(set I32:$dst, (setcc I32:$lhs, I32:$rhs, cond))], 67 !strconcat("i32.", !strconcat(name, "\t$dst, $lhs, $rhs"))>; 68 def _I64 : I<(outs I32:$dst), (ins I64:$lhs, I64:$rhs), 69 [(set I32:$dst, (setcc I64:$lhs, I64:$rhs, cond))], 70 !strconcat("i64.", !strconcat(name, "\t$dst, $lhs, $rhs"))>; 71} 72multiclass ComparisonFP<CondCode cond, string name> { 73 def _F32 : I<(outs I32:$dst), (ins F32:$lhs, F32:$rhs), 74 [(set I32:$dst, (setcc F32:$lhs, F32:$rhs, cond))], 75 !strconcat("f32.", !strconcat(name, "\t$dst, $lhs, $rhs"))>; 76 def _F64 : I<(outs I32:$dst), (ins F64:$lhs, F64:$rhs), 77 [(set I32:$dst, (setcc F64:$lhs, F64:$rhs, cond))], 78 !strconcat("f64.", !strconcat(name, "\t$dst, $lhs, $rhs"))>; 79} 80