[llvm] r340781 - [WebAssembly] TableGen backend for stackifying instructions

Thomas Lively via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 27 15:02:09 PDT 2018


Author: tlively
Date: Mon Aug 27 15:02:09 2018
New Revision: 340781

URL: http://llvm.org/viewvc/llvm-project?rev=340781&view=rev
Log:
[WebAssembly] TableGen backend for stackifying instructions

Summary:
The new stackification backend generates the giant switch statement
used to translate instructions to their stackified forms. I did this
because it was more interesting than adding all the different vector
versions of the various SIMD instructions to the switch statment
manually.

Reviewers: aardappel, aheejin, dschuff

Subscribers: mgorny, sbc100, jgravelle-google, sunfish, jfb, llvm-commits

Differential Revision: https://reviews.llvm.org/D51318

Added:
    llvm/trunk/utils/TableGen/WebAssemblyStackifierEmitter.cpp
Modified:
    llvm/trunk/lib/Target/WebAssembly/CMakeLists.txt
    llvm/trunk/lib/Target/WebAssembly/WebAssemblyMCInstLower.cpp
    llvm/trunk/utils/TableGen/CMakeLists.txt
    llvm/trunk/utils/TableGen/TableGen.cpp
    llvm/trunk/utils/TableGen/TableGenBackends.h

Modified: llvm/trunk/lib/Target/WebAssembly/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/CMakeLists.txt?rev=340781&r1=340780&r2=340781&view=diff
==============================================================================
--- llvm/trunk/lib/Target/WebAssembly/CMakeLists.txt (original)
+++ llvm/trunk/lib/Target/WebAssembly/CMakeLists.txt Mon Aug 27 15:02:09 2018
@@ -9,6 +9,7 @@ tablegen(LLVM WebAssemblyGenInstrInfo.in
 tablegen(LLVM WebAssemblyGenMCCodeEmitter.inc -gen-emitter)
 tablegen(LLVM WebAssemblyGenRegisterInfo.inc -gen-register-info)
 tablegen(LLVM WebAssemblyGenSubtargetInfo.inc -gen-subtarget)
+tablegen(LLVM WebAssemblyGenStackifier.inc -gen-wasm-stackifier)
 
 add_public_tablegen_target(WebAssemblyCommonTableGen)
 

Modified: llvm/trunk/lib/Target/WebAssembly/WebAssemblyMCInstLower.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyMCInstLower.cpp?rev=340781&r1=340780&r2=340781&view=diff
==============================================================================
--- llvm/trunk/lib/Target/WebAssembly/WebAssemblyMCInstLower.cpp (original)
+++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyMCInstLower.cpp Mon Aug 27 15:02:09 2018
@@ -283,365 +283,14 @@ static void removeRegisterOperands(const
 }
 
 static unsigned regInstructionToStackInstruction(unsigned OpCode) {
+  // For most opcodes, this function could have been implemented as "return
+  // OpCode + 1", but since table-gen alphabetically sorts them, this cannot be
+  // guaranteed (see e.g. BR and BR_IF), so we table-gen a giant switch
+  // statement instead.
   switch (OpCode) {
   default:
-    // You may hit this if you add new instructions, please add them below.
-    // For most of these opcodes, this function could have been implemented
-    // as "return OpCode + 1", but since table-gen alphabetically sorts them,
-    // this cannot be guaranteed (see e.g. BR and BR_IF).
-    // The approach below is the same as what the x87 backend does.
-    // TODO(wvo): to make this code cleaner, create a custom tablegen
-    // code generator that emits the table below automatically.
     llvm_unreachable(
           "unknown WebAssembly instruction in Explicit Locals pass");
-  case WebAssembly::ABS_F32: return WebAssembly::ABS_F32_S;
-  case WebAssembly::ABS_F64: return WebAssembly::ABS_F64_S;
-  case WebAssembly::ADD_F32: return WebAssembly::ADD_F32_S;
-  case WebAssembly::ADD_F64: return WebAssembly::ADD_F64_S;
-  case WebAssembly::ADD_I32: return WebAssembly::ADD_I32_S;
-  case WebAssembly::ADD_I64: return WebAssembly::ADD_I64_S;
-  case WebAssembly::ADD_v16i8: return WebAssembly::ADD_v16i8_S;
-  case WebAssembly::ADD_v2f64: return WebAssembly::ADD_v2f64_S;
-  case WebAssembly::ADD_v2i64: return WebAssembly::ADD_v2i64_S;
-  case WebAssembly::ADD_v4f32: return WebAssembly::ADD_v4f32_S;
-  case WebAssembly::ADD_v4i32: return WebAssembly::ADD_v4i32_S;
-  case WebAssembly::ADD_v8i16: return WebAssembly::ADD_v8i16_S;
-  case WebAssembly::ADJCALLSTACKDOWN: return WebAssembly::ADJCALLSTACKDOWN_S;
-  case WebAssembly::ADJCALLSTACKUP: return WebAssembly::ADJCALLSTACKUP_S;
-  case WebAssembly::AND_I32: return WebAssembly::AND_I32_S;
-  case WebAssembly::AND_I64: return WebAssembly::AND_I64_S;
-  case WebAssembly::ARGUMENT_EXCEPT_REF: return WebAssembly::ARGUMENT_EXCEPT_REF_S;
-  case WebAssembly::ARGUMENT_F32: return WebAssembly::ARGUMENT_F32_S;
-  case WebAssembly::ARGUMENT_F64: return WebAssembly::ARGUMENT_F64_S;
-  case WebAssembly::ARGUMENT_I32: return WebAssembly::ARGUMENT_I32_S;
-  case WebAssembly::ARGUMENT_I64: return WebAssembly::ARGUMENT_I64_S;
-  case WebAssembly::ARGUMENT_v16i8: return WebAssembly::ARGUMENT_v16i8_S;
-  case WebAssembly::ARGUMENT_v4f32: return WebAssembly::ARGUMENT_v4f32_S;
-  case WebAssembly::ARGUMENT_v4i32: return WebAssembly::ARGUMENT_v4i32_S;
-  case WebAssembly::ARGUMENT_v8i16: return WebAssembly::ARGUMENT_v8i16_S;
-  case WebAssembly::ARGUMENT_v2f64: return WebAssembly::ARGUMENT_v2f64_S;
-  case WebAssembly::ARGUMENT_v2i64: return WebAssembly::ARGUMENT_v2i64_S;
-  case WebAssembly::ATOMIC_LOAD16_U_I32: return WebAssembly::ATOMIC_LOAD16_U_I32_S;
-  case WebAssembly::ATOMIC_LOAD16_U_I64: return WebAssembly::ATOMIC_LOAD16_U_I64_S;
-  case WebAssembly::ATOMIC_LOAD32_U_I64: return WebAssembly::ATOMIC_LOAD32_U_I64_S;
-  case WebAssembly::ATOMIC_LOAD8_U_I32: return WebAssembly::ATOMIC_LOAD8_U_I32_S;
-  case WebAssembly::ATOMIC_LOAD8_U_I64: return WebAssembly::ATOMIC_LOAD8_U_I64_S;
-  case WebAssembly::ATOMIC_LOAD_I32: return WebAssembly::ATOMIC_LOAD_I32_S;
-  case WebAssembly::ATOMIC_LOAD_I64: return WebAssembly::ATOMIC_LOAD_I64_S;
-  case WebAssembly::ATOMIC_STORE16_I32: return WebAssembly::ATOMIC_STORE16_I32_S;
-  case WebAssembly::ATOMIC_STORE16_I64: return WebAssembly::ATOMIC_STORE16_I64_S;
-  case WebAssembly::ATOMIC_STORE32_I64: return WebAssembly::ATOMIC_STORE32_I64_S;
-  case WebAssembly::ATOMIC_STORE8_I32: return WebAssembly::ATOMIC_STORE8_I32_S;
-  case WebAssembly::ATOMIC_STORE8_I64: return WebAssembly::ATOMIC_STORE8_I64_S;
-  case WebAssembly::ATOMIC_STORE_I32: return WebAssembly::ATOMIC_STORE_I32_S;
-  case WebAssembly::ATOMIC_STORE_I64: return WebAssembly::ATOMIC_STORE_I64_S;
-  case WebAssembly::BLOCK: return WebAssembly::BLOCK_S;
-  case WebAssembly::BR: return WebAssembly::BR_S;
-  case WebAssembly::BR_IF: return WebAssembly::BR_IF_S;
-  case WebAssembly::BR_TABLE_I32: return WebAssembly::BR_TABLE_I32_S;
-  case WebAssembly::BR_TABLE_I64: return WebAssembly::BR_TABLE_I64_S;
-  case WebAssembly::BR_UNLESS: return WebAssembly::BR_UNLESS_S;
-  case WebAssembly::CALL_EXCEPT_REF: return WebAssembly::CALL_EXCEPT_REF_S;
-  case WebAssembly::CALL_F32: return WebAssembly::CALL_F32_S;
-  case WebAssembly::CALL_F64: return WebAssembly::CALL_F64_S;
-  case WebAssembly::CALL_I32: return WebAssembly::CALL_I32_S;
-  case WebAssembly::CALL_I64: return WebAssembly::CALL_I64_S;
-  case WebAssembly::CALL_INDIRECT_EXCEPT_REF: return WebAssembly::CALL_INDIRECT_EXCEPT_REF_S;
-  case WebAssembly::CALL_INDIRECT_F32: return WebAssembly::CALL_INDIRECT_F32_S;
-  case WebAssembly::CALL_INDIRECT_F64: return WebAssembly::CALL_INDIRECT_F64_S;
-  case WebAssembly::CALL_INDIRECT_I32: return WebAssembly::CALL_INDIRECT_I32_S;
-  case WebAssembly::CALL_INDIRECT_I64: return WebAssembly::CALL_INDIRECT_I64_S;
-  case WebAssembly::CALL_INDIRECT_VOID: return WebAssembly::CALL_INDIRECT_VOID_S;
-  case WebAssembly::CALL_INDIRECT_v16i8: return WebAssembly::CALL_INDIRECT_v16i8_S;
-  case WebAssembly::CALL_INDIRECT_v4f32: return WebAssembly::CALL_INDIRECT_v4f32_S;
-  case WebAssembly::CALL_INDIRECT_v4i32: return WebAssembly::CALL_INDIRECT_v4i32_S;
-  case WebAssembly::CALL_INDIRECT_v8i16: return WebAssembly::CALL_INDIRECT_v8i16_S;
-  case WebAssembly::CALL_VOID: return WebAssembly::CALL_VOID_S;
-  case WebAssembly::CALL_v16i8: return WebAssembly::CALL_v16i8_S;
-  case WebAssembly::CALL_v4f32: return WebAssembly::CALL_v4f32_S;
-  case WebAssembly::CALL_v4i32: return WebAssembly::CALL_v4i32_S;
-  case WebAssembly::CALL_v8i16: return WebAssembly::CALL_v8i16_S;
-  case WebAssembly::CATCHRET: return WebAssembly::CATCHRET_S;
-  case WebAssembly::CATCH_ALL: return WebAssembly::CATCH_ALL_S;
-  case WebAssembly::CATCH_I32: return WebAssembly::CATCH_I32_S;
-  case WebAssembly::CATCH_I64: return WebAssembly::CATCH_I64_S;
-  case WebAssembly::CEIL_F32: return WebAssembly::CEIL_F32_S;
-  case WebAssembly::CEIL_F64: return WebAssembly::CEIL_F64_S;
-  case WebAssembly::CLEANUPRET: return WebAssembly::CLEANUPRET_S;
-  case WebAssembly::CLZ_I32: return WebAssembly::CLZ_I32_S;
-  case WebAssembly::CLZ_I64: return WebAssembly::CLZ_I64_S;
-  case WebAssembly::CONST_F32: return WebAssembly::CONST_F32_S;
-  case WebAssembly::CONST_F64: return WebAssembly::CONST_F64_S;
-  case WebAssembly::CONST_I32: return WebAssembly::CONST_I32_S;
-  case WebAssembly::CONST_I64: return WebAssembly::CONST_I64_S;
-  case WebAssembly::COPYSIGN_F32: return WebAssembly::COPYSIGN_F32_S;
-  case WebAssembly::COPYSIGN_F64: return WebAssembly::COPYSIGN_F64_S;
-  case WebAssembly::COPY_EXCEPT_REF: return WebAssembly::COPY_EXCEPT_REF_S;
-  case WebAssembly::COPY_F32: return WebAssembly::COPY_F32_S;
-  case WebAssembly::COPY_F64: return WebAssembly::COPY_F64_S;
-  case WebAssembly::COPY_I32: return WebAssembly::COPY_I32_S;
-  case WebAssembly::COPY_I64: return WebAssembly::COPY_I64_S;
-  case WebAssembly::COPY_V128: return WebAssembly::COPY_V128_S;
-  case WebAssembly::CTZ_I32: return WebAssembly::CTZ_I32_S;
-  case WebAssembly::CTZ_I64: return WebAssembly::CTZ_I64_S;
-  case WebAssembly::CURRENT_MEMORY_I32: return WebAssembly::CURRENT_MEMORY_I32_S;
-  case WebAssembly::DIV_F32: return WebAssembly::DIV_F32_S;
-  case WebAssembly::DIV_F64: return WebAssembly::DIV_F64_S;
-  case WebAssembly::DIV_S_I32: return WebAssembly::DIV_S_I32_S;
-  case WebAssembly::DIV_S_I64: return WebAssembly::DIV_S_I64_S;
-  case WebAssembly::DIV_U_I32: return WebAssembly::DIV_U_I32_S;
-  case WebAssembly::DIV_U_I64: return WebAssembly::DIV_U_I64_S;
-  case WebAssembly::DROP_EXCEPT_REF: return WebAssembly::DROP_EXCEPT_REF_S;
-  case WebAssembly::DROP_F32: return WebAssembly::DROP_F32_S;
-  case WebAssembly::DROP_F64: return WebAssembly::DROP_F64_S;
-  case WebAssembly::DROP_I32: return WebAssembly::DROP_I32_S;
-  case WebAssembly::DROP_I64: return WebAssembly::DROP_I64_S;
-  case WebAssembly::DROP_V128: return WebAssembly::DROP_V128_S;
-  case WebAssembly::END_BLOCK: return WebAssembly::END_BLOCK_S;
-  case WebAssembly::END_FUNCTION: return WebAssembly::END_FUNCTION_S;
-  case WebAssembly::END_LOOP: return WebAssembly::END_LOOP_S;
-  case WebAssembly::END_TRY: return WebAssembly::END_TRY_S;
-  case WebAssembly::EQZ_I32: return WebAssembly::EQZ_I32_S;
-  case WebAssembly::EQZ_I64: return WebAssembly::EQZ_I64_S;
-  case WebAssembly::EQ_F32: return WebAssembly::EQ_F32_S;
-  case WebAssembly::EQ_F64: return WebAssembly::EQ_F64_S;
-  case WebAssembly::EQ_I32: return WebAssembly::EQ_I32_S;
-  case WebAssembly::EQ_I64: return WebAssembly::EQ_I64_S;
-  case WebAssembly::F32_CONVERT_S_I32: return WebAssembly::F32_CONVERT_S_I32_S;
-  case WebAssembly::F32_CONVERT_S_I64: return WebAssembly::F32_CONVERT_S_I64_S;
-  case WebAssembly::F32_CONVERT_U_I32: return WebAssembly::F32_CONVERT_U_I32_S;
-  case WebAssembly::F32_CONVERT_U_I64: return WebAssembly::F32_CONVERT_U_I64_S;
-  case WebAssembly::F32_DEMOTE_F64: return WebAssembly::F32_DEMOTE_F64_S;
-  case WebAssembly::F32_REINTERPRET_I32: return WebAssembly::F32_REINTERPRET_I32_S;
-  case WebAssembly::F64_CONVERT_S_I32: return WebAssembly::F64_CONVERT_S_I32_S;
-  case WebAssembly::F64_CONVERT_S_I64: return WebAssembly::F64_CONVERT_S_I64_S;
-  case WebAssembly::F64_CONVERT_U_I32: return WebAssembly::F64_CONVERT_U_I32_S;
-  case WebAssembly::F64_CONVERT_U_I64: return WebAssembly::F64_CONVERT_U_I64_S;
-  case WebAssembly::F64_PROMOTE_F32: return WebAssembly::F64_PROMOTE_F32_S;
-  case WebAssembly::F64_REINTERPRET_I64: return WebAssembly::F64_REINTERPRET_I64_S;
-  case WebAssembly::FALLTHROUGH_RETURN_EXCEPT_REF: return WebAssembly::FALLTHROUGH_RETURN_EXCEPT_REF_S;
-  case WebAssembly::FALLTHROUGH_RETURN_F32: return WebAssembly::FALLTHROUGH_RETURN_F32_S;
-  case WebAssembly::FALLTHROUGH_RETURN_F64: return WebAssembly::FALLTHROUGH_RETURN_F64_S;
-  case WebAssembly::FALLTHROUGH_RETURN_I32: return WebAssembly::FALLTHROUGH_RETURN_I32_S;
-  case WebAssembly::FALLTHROUGH_RETURN_I64: return WebAssembly::FALLTHROUGH_RETURN_I64_S;
-  case WebAssembly::FALLTHROUGH_RETURN_VOID: return WebAssembly::FALLTHROUGH_RETURN_VOID_S;
-  case WebAssembly::FALLTHROUGH_RETURN_v16i8: return WebAssembly::FALLTHROUGH_RETURN_v16i8_S;
-  case WebAssembly::FALLTHROUGH_RETURN_v4f32: return WebAssembly::FALLTHROUGH_RETURN_v4f32_S;
-  case WebAssembly::FALLTHROUGH_RETURN_v4i32: return WebAssembly::FALLTHROUGH_RETURN_v4i32_S;
-  case WebAssembly::FALLTHROUGH_RETURN_v8i16: return WebAssembly::FALLTHROUGH_RETURN_v8i16_S;
-  case WebAssembly::FALLTHROUGH_RETURN_v2f64: return WebAssembly::FALLTHROUGH_RETURN_v2f64_S;
-  case WebAssembly::FALLTHROUGH_RETURN_v2i64: return WebAssembly::FALLTHROUGH_RETURN_v2i64_S;
-  case WebAssembly::FLOOR_F32: return WebAssembly::FLOOR_F32_S;
-  case WebAssembly::FLOOR_F64: return WebAssembly::FLOOR_F64_S;
-  case WebAssembly::FP_TO_SINT_I32_F32: return WebAssembly::FP_TO_SINT_I32_F32_S;
-  case WebAssembly::FP_TO_SINT_I32_F64: return WebAssembly::FP_TO_SINT_I32_F64_S;
-  case WebAssembly::FP_TO_SINT_I64_F32: return WebAssembly::FP_TO_SINT_I64_F32_S;
-  case WebAssembly::FP_TO_SINT_I64_F64: return WebAssembly::FP_TO_SINT_I64_F64_S;
-  case WebAssembly::FP_TO_UINT_I32_F32: return WebAssembly::FP_TO_UINT_I32_F32_S;
-  case WebAssembly::FP_TO_UINT_I32_F64: return WebAssembly::FP_TO_UINT_I32_F64_S;
-  case WebAssembly::FP_TO_UINT_I64_F32: return WebAssembly::FP_TO_UINT_I64_F32_S;
-  case WebAssembly::FP_TO_UINT_I64_F64: return WebAssembly::FP_TO_UINT_I64_F64_S;
-  case WebAssembly::GET_GLOBAL_EXCEPT_REF: return WebAssembly::GET_GLOBAL_EXCEPT_REF_S;
-  case WebAssembly::GET_GLOBAL_F32: return WebAssembly::GET_GLOBAL_F32_S;
-  case WebAssembly::GET_GLOBAL_F64: return WebAssembly::GET_GLOBAL_F64_S;
-  case WebAssembly::GET_GLOBAL_I32: return WebAssembly::GET_GLOBAL_I32_S;
-  case WebAssembly::GET_GLOBAL_I64: return WebAssembly::GET_GLOBAL_I64_S;
-  case WebAssembly::GET_GLOBAL_V128: return WebAssembly::GET_GLOBAL_V128_S;
-  case WebAssembly::GET_LOCAL_EXCEPT_REF: return WebAssembly::GET_LOCAL_EXCEPT_REF_S;
-  case WebAssembly::GET_LOCAL_F32: return WebAssembly::GET_LOCAL_F32_S;
-  case WebAssembly::GET_LOCAL_F64: return WebAssembly::GET_LOCAL_F64_S;
-  case WebAssembly::GET_LOCAL_I32: return WebAssembly::GET_LOCAL_I32_S;
-  case WebAssembly::GET_LOCAL_I64: return WebAssembly::GET_LOCAL_I64_S;
-  case WebAssembly::GET_LOCAL_V128: return WebAssembly::GET_LOCAL_V128_S;
-  case WebAssembly::GE_F32: return WebAssembly::GE_F32_S;
-  case WebAssembly::GE_F64: return WebAssembly::GE_F64_S;
-  case WebAssembly::GE_S_I32: return WebAssembly::GE_S_I32_S;
-  case WebAssembly::GE_S_I64: return WebAssembly::GE_S_I64_S;
-  case WebAssembly::GE_U_I32: return WebAssembly::GE_U_I32_S;
-  case WebAssembly::GE_U_I64: return WebAssembly::GE_U_I64_S;
-  case WebAssembly::GROW_MEMORY_I32: return WebAssembly::GROW_MEMORY_I32_S;
-  case WebAssembly::GT_F32: return WebAssembly::GT_F32_S;
-  case WebAssembly::GT_F64: return WebAssembly::GT_F64_S;
-  case WebAssembly::GT_S_I32: return WebAssembly::GT_S_I32_S;
-  case WebAssembly::GT_S_I64: return WebAssembly::GT_S_I64_S;
-  case WebAssembly::GT_U_I32: return WebAssembly::GT_U_I32_S;
-  case WebAssembly::GT_U_I64: return WebAssembly::GT_U_I64_S;
-  case WebAssembly::I32_EXTEND16_S_I32: return WebAssembly::I32_EXTEND16_S_I32_S;
-  case WebAssembly::I32_EXTEND8_S_I32: return WebAssembly::I32_EXTEND8_S_I32_S;
-  case WebAssembly::I32_REINTERPRET_F32: return WebAssembly::I32_REINTERPRET_F32_S;
-  case WebAssembly::I32_TRUNC_S_F32: return WebAssembly::I32_TRUNC_S_F32_S;
-  case WebAssembly::I32_TRUNC_S_F64: return WebAssembly::I32_TRUNC_S_F64_S;
-  case WebAssembly::I32_TRUNC_S_SAT_F32: return WebAssembly::I32_TRUNC_S_SAT_F32_S;
-  case WebAssembly::I32_TRUNC_S_SAT_F64: return WebAssembly::I32_TRUNC_S_SAT_F64_S;
-  case WebAssembly::I32_TRUNC_U_F32: return WebAssembly::I32_TRUNC_U_F32_S;
-  case WebAssembly::I32_TRUNC_U_F64: return WebAssembly::I32_TRUNC_U_F64_S;
-  case WebAssembly::I32_TRUNC_U_SAT_F32: return WebAssembly::I32_TRUNC_U_SAT_F32_S;
-  case WebAssembly::I32_TRUNC_U_SAT_F64: return WebAssembly::I32_TRUNC_U_SAT_F64_S;
-  case WebAssembly::I32_WRAP_I64: return WebAssembly::I32_WRAP_I64_S;
-  case WebAssembly::I64_EXTEND16_S_I64: return WebAssembly::I64_EXTEND16_S_I64_S;
-  case WebAssembly::I64_EXTEND32_S_I64: return WebAssembly::I64_EXTEND32_S_I64_S;
-  case WebAssembly::I64_EXTEND8_S_I64: return WebAssembly::I64_EXTEND8_S_I64_S;
-  case WebAssembly::I64_EXTEND_S_I32: return WebAssembly::I64_EXTEND_S_I32_S;
-  case WebAssembly::I64_EXTEND_U_I32: return WebAssembly::I64_EXTEND_U_I32_S;
-  case WebAssembly::I64_REINTERPRET_F64: return WebAssembly::I64_REINTERPRET_F64_S;
-  case WebAssembly::I64_TRUNC_S_F32: return WebAssembly::I64_TRUNC_S_F32_S;
-  case WebAssembly::I64_TRUNC_S_F64: return WebAssembly::I64_TRUNC_S_F64_S;
-  case WebAssembly::I64_TRUNC_S_SAT_F32: return WebAssembly::I64_TRUNC_S_SAT_F32_S;
-  case WebAssembly::I64_TRUNC_S_SAT_F64: return WebAssembly::I64_TRUNC_S_SAT_F64_S;
-  case WebAssembly::I64_TRUNC_U_F32: return WebAssembly::I64_TRUNC_U_F32_S;
-  case WebAssembly::I64_TRUNC_U_F64: return WebAssembly::I64_TRUNC_U_F64_S;
-  case WebAssembly::I64_TRUNC_U_SAT_F32: return WebAssembly::I64_TRUNC_U_SAT_F32_S;
-  case WebAssembly::I64_TRUNC_U_SAT_F64: return WebAssembly::I64_TRUNC_U_SAT_F64_S;
-  case WebAssembly::LE_F32: return WebAssembly::LE_F32_S;
-  case WebAssembly::LE_F64: return WebAssembly::LE_F64_S;
-  case WebAssembly::LE_S_I32: return WebAssembly::LE_S_I32_S;
-  case WebAssembly::LE_S_I64: return WebAssembly::LE_S_I64_S;
-  case WebAssembly::LE_U_I32: return WebAssembly::LE_U_I32_S;
-  case WebAssembly::LE_U_I64: return WebAssembly::LE_U_I64_S;
-  case WebAssembly::LOAD16_S_I32: return WebAssembly::LOAD16_S_I32_S;
-  case WebAssembly::LOAD16_S_I64: return WebAssembly::LOAD16_S_I64_S;
-  case WebAssembly::LOAD16_U_I32: return WebAssembly::LOAD16_U_I32_S;
-  case WebAssembly::LOAD16_U_I64: return WebAssembly::LOAD16_U_I64_S;
-  case WebAssembly::LOAD32_S_I64: return WebAssembly::LOAD32_S_I64_S;
-  case WebAssembly::LOAD32_U_I64: return WebAssembly::LOAD32_U_I64_S;
-  case WebAssembly::LOAD8_S_I32: return WebAssembly::LOAD8_S_I32_S;
-  case WebAssembly::LOAD8_S_I64: return WebAssembly::LOAD8_S_I64_S;
-  case WebAssembly::LOAD8_U_I32: return WebAssembly::LOAD8_U_I32_S;
-  case WebAssembly::LOAD8_U_I64: return WebAssembly::LOAD8_U_I64_S;
-  case WebAssembly::LOAD_F32: return WebAssembly::LOAD_F32_S;
-  case WebAssembly::LOAD_F64: return WebAssembly::LOAD_F64_S;
-  case WebAssembly::LOAD_I32: return WebAssembly::LOAD_I32_S;
-  case WebAssembly::LOAD_I64: return WebAssembly::LOAD_I64_S;
-  case WebAssembly::LOOP: return WebAssembly::LOOP_S;
-  case WebAssembly::LT_F32: return WebAssembly::LT_F32_S;
-  case WebAssembly::LT_F64: return WebAssembly::LT_F64_S;
-  case WebAssembly::LT_S_I32: return WebAssembly::LT_S_I32_S;
-  case WebAssembly::LT_S_I64: return WebAssembly::LT_S_I64_S;
-  case WebAssembly::LT_U_I32: return WebAssembly::LT_U_I32_S;
-  case WebAssembly::LT_U_I64: return WebAssembly::LT_U_I64_S;
-  case WebAssembly::MAX_F32: return WebAssembly::MAX_F32_S;
-  case WebAssembly::MAX_F64: return WebAssembly::MAX_F64_S;
-  case WebAssembly::MEMORY_GROW_I32: return WebAssembly::MEMORY_GROW_I32_S;
-  case WebAssembly::MEMORY_SIZE_I32: return WebAssembly::MEMORY_SIZE_I32_S;
-  case WebAssembly::MEM_GROW_I32: return WebAssembly::MEM_GROW_I32_S;
-  case WebAssembly::MEM_SIZE_I32: return WebAssembly::MEM_SIZE_I32_S;
-  case WebAssembly::MIN_F32: return WebAssembly::MIN_F32_S;
-  case WebAssembly::MIN_F64: return WebAssembly::MIN_F64_S;
-  case WebAssembly::MUL_F32: return WebAssembly::MUL_F32_S;
-  case WebAssembly::MUL_F64: return WebAssembly::MUL_F64_S;
-  case WebAssembly::MUL_I32: return WebAssembly::MUL_I32_S;
-  case WebAssembly::MUL_I64: return WebAssembly::MUL_I64_S;
-  case WebAssembly::MUL_v16i8: return WebAssembly::MUL_v16i8_S;
-  case WebAssembly::MUL_v2f64: return WebAssembly::MUL_v2f64_S;
-  case WebAssembly::MUL_v4f32: return WebAssembly::MUL_v4f32_S;
-  case WebAssembly::MUL_v4i32: return WebAssembly::MUL_v4i32_S;
-  case WebAssembly::MUL_v8i16: return WebAssembly::MUL_v8i16_S;
-  case WebAssembly::NEAREST_F32: return WebAssembly::NEAREST_F32_S;
-  case WebAssembly::NEAREST_F64: return WebAssembly::NEAREST_F64_S;
-  case WebAssembly::NEG_F32: return WebAssembly::NEG_F32_S;
-  case WebAssembly::NEG_F64: return WebAssembly::NEG_F64_S;
-  case WebAssembly::NE_F32: return WebAssembly::NE_F32_S;
-  case WebAssembly::NE_F64: return WebAssembly::NE_F64_S;
-  case WebAssembly::NE_I32: return WebAssembly::NE_I32_S;
-  case WebAssembly::NE_I64: return WebAssembly::NE_I64_S;
-  case WebAssembly::NOP: return WebAssembly::NOP_S;
-  case WebAssembly::OR_I32: return WebAssembly::OR_I32_S;
-  case WebAssembly::OR_I64: return WebAssembly::OR_I64_S;
-  case WebAssembly::PCALL_INDIRECT_EXCEPT_REF: return WebAssembly::PCALL_INDIRECT_EXCEPT_REF_S;
-  case WebAssembly::PCALL_INDIRECT_F32: return WebAssembly::PCALL_INDIRECT_F32_S;
-  case WebAssembly::PCALL_INDIRECT_F64: return WebAssembly::PCALL_INDIRECT_F64_S;
-  case WebAssembly::PCALL_INDIRECT_I32: return WebAssembly::PCALL_INDIRECT_I32_S;
-  case WebAssembly::PCALL_INDIRECT_I64: return WebAssembly::PCALL_INDIRECT_I64_S;
-  case WebAssembly::PCALL_INDIRECT_VOID: return WebAssembly::PCALL_INDIRECT_VOID_S;
-  case WebAssembly::PCALL_INDIRECT_v16i8: return WebAssembly::PCALL_INDIRECT_v16i8_S;
-  case WebAssembly::PCALL_INDIRECT_v4f32: return WebAssembly::PCALL_INDIRECT_v4f32_S;
-  case WebAssembly::PCALL_INDIRECT_v4i32: return WebAssembly::PCALL_INDIRECT_v4i32_S;
-  case WebAssembly::PCALL_INDIRECT_v8i16: return WebAssembly::PCALL_INDIRECT_v8i16_S;
-  case WebAssembly::POPCNT_I32: return WebAssembly::POPCNT_I32_S;
-  case WebAssembly::POPCNT_I64: return WebAssembly::POPCNT_I64_S;
-  case WebAssembly::REM_S_I32: return WebAssembly::REM_S_I32_S;
-  case WebAssembly::REM_S_I64: return WebAssembly::REM_S_I64_S;
-  case WebAssembly::REM_U_I32: return WebAssembly::REM_U_I32_S;
-  case WebAssembly::REM_U_I64: return WebAssembly::REM_U_I64_S;
-  case WebAssembly::RETHROW: return WebAssembly::RETHROW_S;
-  case WebAssembly::RETHROW_TO_CALLER: return WebAssembly::RETHROW_TO_CALLER_S;
-  case WebAssembly::RETURN_EXCEPT_REF: return WebAssembly::RETURN_EXCEPT_REF_S;
-  case WebAssembly::RETURN_F32: return WebAssembly::RETURN_F32_S;
-  case WebAssembly::RETURN_F64: return WebAssembly::RETURN_F64_S;
-  case WebAssembly::RETURN_I32: return WebAssembly::RETURN_I32_S;
-  case WebAssembly::RETURN_I64: return WebAssembly::RETURN_I64_S;
-  case WebAssembly::RETURN_VOID: return WebAssembly::RETURN_VOID_S;
-  case WebAssembly::RETURN_v16i8: return WebAssembly::RETURN_v16i8_S;
-  case WebAssembly::RETURN_v4f32: return WebAssembly::RETURN_v4f32_S;
-  case WebAssembly::RETURN_v4i32: return WebAssembly::RETURN_v4i32_S;
-  case WebAssembly::RETURN_v8i16: return WebAssembly::RETURN_v8i16_S;
-  case WebAssembly::ROTL_I32: return WebAssembly::ROTL_I32_S;
-  case WebAssembly::ROTL_I64: return WebAssembly::ROTL_I64_S;
-  case WebAssembly::ROTR_I32: return WebAssembly::ROTR_I32_S;
-  case WebAssembly::ROTR_I64: return WebAssembly::ROTR_I64_S;
-  case WebAssembly::SELECT_EXCEPT_REF: return WebAssembly::SELECT_EXCEPT_REF_S;
-  case WebAssembly::SELECT_F32: return WebAssembly::SELECT_F32_S;
-  case WebAssembly::SELECT_F64: return WebAssembly::SELECT_F64_S;
-  case WebAssembly::SELECT_I32: return WebAssembly::SELECT_I32_S;
-  case WebAssembly::SELECT_I64: return WebAssembly::SELECT_I64_S;
-  case WebAssembly::SET_GLOBAL_EXCEPT_REF: return WebAssembly::SET_GLOBAL_EXCEPT_REF_S;
-  case WebAssembly::SET_GLOBAL_F32: return WebAssembly::SET_GLOBAL_F32_S;
-  case WebAssembly::SET_GLOBAL_F64: return WebAssembly::SET_GLOBAL_F64_S;
-  case WebAssembly::SET_GLOBAL_I32: return WebAssembly::SET_GLOBAL_I32_S;
-  case WebAssembly::SET_GLOBAL_I64: return WebAssembly::SET_GLOBAL_I64_S;
-  case WebAssembly::SET_GLOBAL_V128: return WebAssembly::SET_GLOBAL_V128_S;
-  case WebAssembly::SET_LOCAL_EXCEPT_REF: return WebAssembly::SET_LOCAL_EXCEPT_REF_S;
-  case WebAssembly::SET_LOCAL_F32: return WebAssembly::SET_LOCAL_F32_S;
-  case WebAssembly::SET_LOCAL_F64: return WebAssembly::SET_LOCAL_F64_S;
-  case WebAssembly::SET_LOCAL_I32: return WebAssembly::SET_LOCAL_I32_S;
-  case WebAssembly::SET_LOCAL_I64: return WebAssembly::SET_LOCAL_I64_S;
-  case WebAssembly::SET_LOCAL_V128: return WebAssembly::SET_LOCAL_V128_S;
-  case WebAssembly::SHL_I32: return WebAssembly::SHL_I32_S;
-  case WebAssembly::SHL_I64: return WebAssembly::SHL_I64_S;
-  case WebAssembly::SHR_S_I32: return WebAssembly::SHR_S_I32_S;
-  case WebAssembly::SHR_S_I64: return WebAssembly::SHR_S_I64_S;
-  case WebAssembly::SHR_U_I32: return WebAssembly::SHR_U_I32_S;
-  case WebAssembly::SHR_U_I64: return WebAssembly::SHR_U_I64_S;
-  case WebAssembly::SQRT_F32: return WebAssembly::SQRT_F32_S;
-  case WebAssembly::SQRT_F64: return WebAssembly::SQRT_F64_S;
-  case WebAssembly::STORE16_I32: return WebAssembly::STORE16_I32_S;
-  case WebAssembly::STORE16_I64: return WebAssembly::STORE16_I64_S;
-  case WebAssembly::STORE32_I64: return WebAssembly::STORE32_I64_S;
-  case WebAssembly::STORE8_I32: return WebAssembly::STORE8_I32_S;
-  case WebAssembly::STORE8_I64: return WebAssembly::STORE8_I64_S;
-  case WebAssembly::STORE_F32: return WebAssembly::STORE_F32_S;
-  case WebAssembly::STORE_F64: return WebAssembly::STORE_F64_S;
-  case WebAssembly::STORE_I32: return WebAssembly::STORE_I32_S;
-  case WebAssembly::STORE_I64: return WebAssembly::STORE_I64_S;
-  case WebAssembly::SUB_F32: return WebAssembly::SUB_F32_S;
-  case WebAssembly::SUB_F64: return WebAssembly::SUB_F64_S;
-  case WebAssembly::SUB_I32: return WebAssembly::SUB_I32_S;
-  case WebAssembly::SUB_I64: return WebAssembly::SUB_I64_S;
-  case WebAssembly::SUB_v16i8: return WebAssembly::SUB_v16i8_S;
-  case WebAssembly::SUB_v2f64: return WebAssembly::SUB_v2f64_S;
-  case WebAssembly::SUB_v2i64: return WebAssembly::SUB_v2i64_S;
-  case WebAssembly::SUB_v4f32: return WebAssembly::SUB_v4f32_S;
-  case WebAssembly::SUB_v4i32: return WebAssembly::SUB_v4i32_S;
-  case WebAssembly::SUB_v8i16: return WebAssembly::SUB_v8i16_S;
-  case WebAssembly::TEE_EXCEPT_REF: return WebAssembly::TEE_EXCEPT_REF_S;
-  case WebAssembly::TEE_F32: return WebAssembly::TEE_F32_S;
-  case WebAssembly::TEE_F64: return WebAssembly::TEE_F64_S;
-  case WebAssembly::TEE_I32: return WebAssembly::TEE_I32_S;
-  case WebAssembly::TEE_I64: return WebAssembly::TEE_I64_S;
-  case WebAssembly::TEE_LOCAL_EXCEPT_REF: return WebAssembly::TEE_LOCAL_EXCEPT_REF_S;
-  case WebAssembly::TEE_LOCAL_F32: return WebAssembly::TEE_LOCAL_F32_S;
-  case WebAssembly::TEE_LOCAL_F64: return WebAssembly::TEE_LOCAL_F64_S;
-  case WebAssembly::TEE_LOCAL_I32: return WebAssembly::TEE_LOCAL_I32_S;
-  case WebAssembly::TEE_LOCAL_I64: return WebAssembly::TEE_LOCAL_I64_S;
-  case WebAssembly::TEE_LOCAL_V128: return WebAssembly::TEE_LOCAL_V128_S;
-  case WebAssembly::TEE_V128: return WebAssembly::TEE_V128_S;
-  case WebAssembly::THROW_I32: return WebAssembly::THROW_I32_S;
-  case WebAssembly::THROW_I64: return WebAssembly::THROW_I64_S;
-  case WebAssembly::TRUNC_F32: return WebAssembly::TRUNC_F32_S;
-  case WebAssembly::TRUNC_F64: return WebAssembly::TRUNC_F64_S;
-  case WebAssembly::TRY: return WebAssembly::TRY_S;
-  case WebAssembly::UNREACHABLE: return WebAssembly::UNREACHABLE_S;
-  case WebAssembly::XOR_I32: return WebAssembly::XOR_I32_S;
-  case WebAssembly::XOR_I64: return WebAssembly::XOR_I64_S;
+#include "WebAssemblyGenStackifier.inc"
   }
 }

Modified: llvm/trunk/utils/TableGen/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CMakeLists.txt?rev=340781&r1=340780&r2=340781&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/CMakeLists.txt (original)
+++ llvm/trunk/utils/TableGen/CMakeLists.txt Mon Aug 27 15:02:09 2018
@@ -46,6 +46,7 @@ add_tablegen(llvm-tblgen LLVM
   X86ModRMFilters.cpp
   X86RecognizableInstr.cpp
   WebAssemblyDisassemblerEmitter.cpp
+  WebAssemblyStackifierEmitter.cpp
   CTagsEmitter.cpp
   )
 set_target_properties(llvm-tblgen PROPERTIES FOLDER "Tablegenning")

Modified: llvm/trunk/utils/TableGen/TableGen.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/TableGen.cpp?rev=340781&r1=340780&r2=340781&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/TableGen.cpp (original)
+++ llvm/trunk/utils/TableGen/TableGen.cpp Mon Aug 27 15:02:09 2018
@@ -53,6 +53,7 @@ enum ActionType {
   GenX86EVEX2VEXTables,
   GenX86FoldTables,
   GenRegisterBank,
+  GenWebAssemblyStackifier,
 };
 
 namespace {
@@ -117,7 +118,9 @@ namespace {
                     clEnumValN(GenX86FoldTables, "gen-x86-fold-tables",
                                "Generate X86 fold tables"),
                     clEnumValN(GenRegisterBank, "gen-register-bank",
-                               "Generate registers bank descriptions")));
+                               "Generate registers bank descriptions"),
+                    clEnumValN(GenWebAssemblyStackifier, "gen-wasm-stackifier",
+                               "Generate WebAssembly stackification cases")));
 
   cl::OptionCategory PrintEnumsCat("Options for -print-enums");
   cl::opt<std::string>
@@ -231,6 +234,9 @@ bool LLVMTableGenMain(raw_ostream &OS, R
   case GenX86FoldTables:
     EmitX86FoldTables(Records, OS);
     break;
+  case GenWebAssemblyStackifier:
+    EmitWebAssemblyStackifier(Records, OS);
+    break;
   }
 
   return false;

Modified: llvm/trunk/utils/TableGen/TableGenBackends.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/TableGenBackends.h?rev=340781&r1=340780&r2=340781&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/TableGenBackends.h (original)
+++ llvm/trunk/utils/TableGen/TableGenBackends.h Mon Aug 27 15:02:09 2018
@@ -89,6 +89,7 @@ void EmitGlobalISel(RecordKeeper &RK, ra
 void EmitX86EVEX2VEXTables(RecordKeeper &RK, raw_ostream &OS);
 void EmitX86FoldTables(RecordKeeper &RK, raw_ostream &OS);
 void EmitRegisterBank(RecordKeeper &RK, raw_ostream &OS);
+void EmitWebAssemblyStackifier(RecordKeeper &RK, raw_ostream &OS);
 
 } // End llvm namespace
 

Added: llvm/trunk/utils/TableGen/WebAssemblyStackifierEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/WebAssemblyStackifierEmitter.cpp?rev=340781&view=auto
==============================================================================
--- llvm/trunk/utils/TableGen/WebAssemblyStackifierEmitter.cpp (added)
+++ llvm/trunk/utils/TableGen/WebAssemblyStackifierEmitter.cpp Mon Aug 27 15:02:09 2018
@@ -0,0 +1,31 @@
+//===- WebAssemblyStackifierEmitter.cpp - Stackifier cases ------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file emits the switch statement cases to translate WebAssembly
+// instructions to their stack forms.
+//
+//===----------------------------------------------------------------------===//
+
+#include "WebAssemblyDisassemblerEmitter.h"
+#include "llvm/TableGen/Record.h"
+
+namespace llvm {
+
+void EmitWebAssemblyStackifier(RecordKeeper &RK, raw_ostream &OS) {
+  Record *InstrClass = RK.getClass("WebAssemblyInst");
+  for (auto &RecordPair : RK.getDefs()) {
+    if (!RecordPair.second->isSubClassOf(InstrClass)) continue;
+    bool IsStackBased = RecordPair.second->getValueAsBit("StackBased");
+    if (IsStackBased) continue;
+    OS << "  case WebAssembly::" << RecordPair.first << ": return "
+       << "WebAssembly::" << RecordPair.first << "_S; break;\n";
+  }
+}
+
+} // namespace llvm




More information about the llvm-commits mailing list