Home | History | Annotate | Download | only in WebAssembly
      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.
     16 class 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.
     24 class 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.
     32 multiclass 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 }
     40 multiclass 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 }
     48 multiclass 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 }
     56 multiclass 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 }
     64 multiclass 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 }
     72 multiclass 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