WebAssemblyInstrFormats.td revision 288943
1183906Skmacy// WebAssemblyInstrFormats.td - WebAssembly Instruction Formats -*- tblgen -*-//
2183906Skmacy//
3183906Skmacy//                     The LLVM Compiler Infrastructure
4255040Sgibbs//
5183906Skmacy// This file is distributed under the University of Illinois Open Source
6183906Skmacy// License. See LICENSE.TXT for details.
7183906Skmacy//
8185386Sdfr//===----------------------------------------------------------------------===//
9185386Sdfr///
10185386Sdfr/// \file
11183906Skmacy/// \brief WebAssembly instruction format definitions.
12185386Sdfr///
13185386Sdfr//===----------------------------------------------------------------------===//
14185386Sdfr
15185386Sdfr// WebAssembly Instruction Format
16185386Sdfrclass WebAssemblyInst<string cstr> : Instruction {
17185386Sdfr  field bits<0> Inst; // Instruction encoding.
18183906Skmacy  let Namespace   = "WebAssembly";
19183906Skmacy  let Pattern     = [];
20183906Skmacy  let Constraints = cstr;
21183906Skmacy}
22183906Skmacy
23183906Skmacy// Normal instructions
24183906Skmacyclass I<dag oops, dag iops, list<dag> pattern, string cstr = "">
25183906Skmacy    : WebAssemblyInst<cstr> {
26183906Skmacy  dag OutOperandList = oops;
27183906Skmacy  dag InOperandList  = iops;
28183906Skmacy  let Pattern        = pattern;
29183906Skmacy}
30183906Skmacy
31183906Skmacy// Unary and binary instructions, for the local types that WebAssembly supports.
32183906Skmacymulticlass UnaryInt<SDNode node> {
33183906Skmacy  def _I32 : I<(outs Int32:$dst), (ins Int32:$src),
34183906Skmacy               [(set Int32:$dst, (node Int32:$src))]>;
35255040Sgibbs  def _I64 : I<(outs Int64:$dst), (ins Int64:$src),
36255040Sgibbs               [(set Int64:$dst, (node Int64:$src))]>;
37183906Skmacy}
38183906Skmacymulticlass BinaryInt<SDNode node> {
39185637Sdfr  def _I32 : I<(outs Int32:$dst), (ins Int32:$lhs, Int32:$rhs),
40185637Sdfr               [(set Int32:$dst, (node Int32:$lhs, Int32:$rhs))]>;
41183906Skmacy  def _I64 : I<(outs Int64:$dst), (ins Int64:$lhs, Int64:$rhs),
42183906Skmacy               [(set Int64:$dst, (node Int64:$lhs, Int64:$rhs))]>;
43183906Skmacy}
44185637Sdfrmulticlass UnaryFP<SDNode node> {
45185386Sdfr  def _F32 : I<(outs Float32:$dst), (ins Float32:$src),
46185386Sdfr               [(set Float32:$dst, (node Float32:$src))]>;
47185386Sdfr  def _F64 : I<(outs Float64:$dst), (ins Float64:$src),
48183906Skmacy               [(set Float64:$dst, (node Float64:$src))]>;
49183906Skmacy}
50183906Skmacymulticlass BinaryFP<SDNode node> {
51183906Skmacy  def _F32 : I<(outs Float32:$dst), (ins Float32:$lhs, Float32:$rhs),
52185386Sdfr               [(set Float32:$dst, (node Float32:$lhs, Float32:$rhs))]>;
53183906Skmacy  def _F64 : I<(outs Float64:$dst), (ins Float64:$lhs, Float64:$rhs),
54185386Sdfr               [(set Float64:$dst, (node Float64:$lhs, Float64:$rhs))]>;
55185386Sdfr}
56185386Sdfr