[llvm] r257433 - [WebAssembly] Use TSFlags instead of keeping a list of special-case opcodes.

Dan Gohman via llvm-commits llvm-commits at lists.llvm.org
Mon Jan 11 17:45:12 PST 2016


Author: djg
Date: Mon Jan 11 19:45:12 2016
New Revision: 257433

URL: http://llvm.org/viewvc/llvm-project?rev=257433&view=rev
Log:
[WebAssembly] Use TSFlags instead of keeping a list of special-case opcodes.

Modified:
    llvm/trunk/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp
    llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h
    llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrControl.td
    llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.td

Modified: llvm/trunk/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp?rev=257433&r1=257432&r2=257433&view=diff
==============================================================================
--- llvm/trunk/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp (original)
+++ llvm/trunk/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp Mon Jan 11 19:45:12 2016
@@ -82,6 +82,9 @@ void WebAssemblyInstPrinter::printOperan
                                           raw_ostream &O) {
   const MCOperand &Op = MI->getOperand(OpNo);
   if (Op.isReg()) {
+    assert((OpNo < MII.get(MI->getOpcode()).getNumOperands() ||
+            MII.get(MI->getOpcode()).TSFlags == 0) &&
+           "WebAssembly variable_ops register ops don't use TSFlags");
     unsigned WAReg = Op.getReg();
     if (int(WAReg) >= 0)
       printRegName(O, WAReg);
@@ -95,19 +98,28 @@ void WebAssemblyInstPrinter::printOperan
     if (OpNo < MII.get(MI->getOpcode()).getNumDefs())
       O << '=';
   } else if (Op.isImm()) {
-    switch (MI->getOpcode()) {
-    case WebAssembly::PARAM:
-    case WebAssembly::RESULT:
-    case WebAssembly::LOCAL:
+    assert((OpNo < MII.get(MI->getOpcode()).getNumOperands() ||
+            (MII.get(MI->getOpcode()).TSFlags &
+                     WebAssemblyII::VariableOpIsImmediate)) &&
+           "WebAssemblyII::VariableOpIsImmediate should be set for "
+           "variable_ops immediate ops");
+    if (MII.get(MI->getOpcode()).TSFlags &
+        WebAssemblyII::VariableOpImmediateIsType)
+      // The immediates represent types.
       O << WebAssembly::TypeToString(MVT::SimpleValueType(Op.getImm()));
-      break;
-    default:
+    else
       O << Op.getImm();
-      break;
-    }
-  } else if (Op.isFPImm())
+  } else if (Op.isFPImm()) {
+    assert((OpNo < MII.get(MI->getOpcode()).getNumOperands() ||
+            MII.get(MI->getOpcode()).TSFlags == 0) &&
+           "WebAssembly variable_ops floating point ops don't use TSFlags");
     O << toString(APFloat(Op.getFPImm()));
-  else {
+  } else {
+    assert((OpNo < MII.get(MI->getOpcode()).getNumOperands() ||
+            (MII.get(MI->getOpcode()).TSFlags &
+                     WebAssemblyII::VariableOpIsImmediate)) &&
+           "WebAssemblyII::VariableOpIsImmediate should be set for "
+           "variable_ops expr ops");
     assert(Op.isExpr() && "unknown operand kind in printOperand");
     Op.getExpr()->print(O, &MAI);
   }

Modified: llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h?rev=257433&r1=257432&r2=257433&view=diff
==============================================================================
--- llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h (original)
+++ llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h Mon Jan 11 19:45:12 2016
@@ -56,4 +56,15 @@ MCObjectWriter *createWebAssemblyELFObje
 #define GET_SUBTARGETINFO_ENUM
 #include "WebAssemblyGenSubtargetInfo.inc"
 
+namespace WebAssemblyII {
+enum {
+  // For variadic instructions, this flag indicates whether an operand
+  // in the variable_ops range is an immediate value.
+  VariableOpIsImmediate       = (1 << 0),
+  // For immediate values in the variable_ops range, this flag indicates
+  // whether the value represents a type.
+  VariableOpImmediateIsType   = (1 << 1),
+};
+} // end namespace WebAssemblyII
+
 #endif

Modified: llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrControl.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrControl.td?rev=257433&r1=257432&r2=257433&view=diff
==============================================================================
--- llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrControl.td (original)
+++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrControl.td Mon Jan 11 19:45:12 2016
@@ -41,13 +41,18 @@ let Defs = [ARGUMENTS] in {
 // TODO: SelectionDAG's lowering insists on using a pointer as the index for
 // jump tables, so in practice we don't ever use TABLESWITCH_I64 in wasm32 mode
 // currently.
+// Set TSFlags{0} to 1 to indicate that the variable_ops are immediates.
 let isTerminator = 1, hasCtrlDep = 1, isBarrier = 1 in {
 def TABLESWITCH_I32 : I<(outs), (ins I32:$index, bb_op:$default, variable_ops),
                         [(WebAssemblytableswitch I32:$index, bb:$default)],
-                        "tableswitch\t$index, $default">;
+                        "tableswitch\t$index, $default"> {
+  let TSFlags{0} = 1;
+}
 def TABLESWITCH_I64 : I<(outs), (ins I64:$index, bb_op:$default, variable_ops),
                         [(WebAssemblytableswitch I64:$index, bb:$default)],
-                        "tableswitch\t$index, $default">;
+                        "tableswitch\t$index, $default"> {
+  let TSFlags{0} = 1;
+}
 } // isTerminator = 1, hasCtrlDep = 1, isBarrier = 1
 
 // Placemarkers to indicate the start of a block or loop scope. These

Modified: llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.td?rev=257433&r1=257432&r2=257433&view=diff
==============================================================================
--- llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.td (original)
+++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.td Mon Jan 11 19:45:12 2016
@@ -138,9 +138,20 @@ def : Pat<(i32 (WebAssemblywrapper texte
 let Defs = [ARGUMENTS] in {
 
 // Function signature and local variable declaration "instructions".
-def PARAM  : I<(outs), (ins variable_ops), [], ".param  \t">;
-def RESULT : I<(outs), (ins variable_ops), [], ".result \t">;
-def LOCAL  : I<(outs), (ins variable_ops), [], ".local  \t">;
+// Set TSFlags{0} to 1 to indicate that the variable_ops are immediates.
+// Set TSFlags{1} to 1 to indicate that the immediates represent types.
+def PARAM  : I<(outs), (ins variable_ops), [], ".param  \t"> {
+  let TSFlags{0} = 1;
+  let TSFlags{1} = 1;
+}
+def RESULT : I<(outs), (ins variable_ops), [], ".result \t"> {
+  let TSFlags{0} = 1;
+  let TSFlags{1} = 1;
+}
+def LOCAL  : I<(outs), (ins variable_ops), [], ".local  \t"> {
+  let TSFlags{0} = 1;
+  let TSFlags{1} = 1;
+}
 
 } // Defs = [ARGUMENTS]
 




More information about the llvm-commits mailing list