From 664a32cbf7fc1672e7caad2c76f2942c2460c378 Mon Sep 17 00:00:00 2001 From: Alex Cameron Date: Sat, 24 Oct 2026 23:53:35 +1100 Subject: [PATCH] refactor(translate): replace emitOperation if-chain with a word table --- lib/Translation/ForthToMLIR/ForthToMLIR.cpp | 488 ++++++-------------- 1 file changed, 131 insertions(+), 357 deletions(-) diff --git a/lib/Translation/ForthToMLIR/ForthToMLIR.cpp b/lib/Translation/ForthToMLIR/ForthToMLIR.cpp index aa9f726..d10219e 100644 --- a/lib/Translation/ForthToMLIR/ForthToMLIR.cpp +++ b/lib/Translation/ForthToMLIR/ForthToMLIR.cpp @@ -16,6 +16,7 @@ #include "warpforth/Translation/ForthToMLIR/ForthToMLIR.h" #include "llvm/ADT/ScopeExit.h" #include "llvm/ADT/StringExtras.h" +#include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/MemoryBuffer.h" #include @@ -465,6 +466,132 @@ LogicalResult ForthParser::parseHeader() { return success(); } +using WordEmitter = Value (*)(OpBuilder &, Location, Value); + +template +static Value emitSimple(OpBuilder &builder, Location loc, Value inputStack) { + Type stackType = forth::StackType::get(builder.getContext()); + return builder.create(loc, stackType, inputStack).getResult(); +} + +// CELLS: multiply by 8 (sizeof i64 = sizeof f64) for byte addressing. +static Value emitCells(OpBuilder &builder, Location loc, Value inputStack) { + Type stackType = forth::StackType::get(builder.getContext()); + Value lit8 = builder + .create(loc, stackType, inputStack, + builder.getI64IntegerAttr(8)) + .getResult(); + return builder.create(loc, stackType, lit8).getResult(); +} + +static Value emitBarrier(OpBuilder &builder, Location loc, Value inputStack) { + builder.create(loc); + return inputStack; +} + +static const llvm::StringMap &getBuiltinWords() { + static const llvm::StringMap words = { + {"CELLS", emitCells}, + {"BARRIER", emitBarrier}, + {"DUP", emitSimple}, + {"DROP", emitSimple}, + {"SWAP", emitSimple}, + {"OVER", emitSimple}, + {"ROT", emitSimple}, + {"NIP", emitSimple}, + {"TUCK", emitSimple}, + {"PICK", emitSimple}, + {"ROLL", emitSimple}, + {"+", emitSimple}, + {"ADD", emitSimple}, + {"-", emitSimple}, + {"SUB", emitSimple}, + {"*", emitSimple}, + {"MUL", emitSimple}, + {"/", emitSimple}, + {"DIV", emitSimple}, + {"F+", emitSimple}, + {"F-", emitSimple}, + {"F*", emitSimple}, + {"F/", emitSimple}, + {"FEXP", emitSimple}, + {"FSQRT", emitSimple}, + {"FLOG", emitSimple}, + {"FABS", emitSimple}, + {"FNEG", emitSimple}, + {"FMAX", emitSimple}, + {"FMIN", emitSimple}, + {"MOD", emitSimple}, + {"AND", emitSimple}, + {"OR", emitSimple}, + {"XOR", emitSimple}, + {"NOT", emitSimple}, + {"LSHIFT", emitSimple}, + {"RSHIFT", emitSimple}, + {"@", emitSimple}, + {"!", emitSimple}, + {"F@", emitSimple}, + {"F!", emitSimple}, + {"S@", emitSimple}, + {"S!", emitSimple}, + {"SF@", emitSimple}, + {"SF!", emitSimple}, + {"I8@", emitSimple}, + {"I8!", emitSimple}, + {"SI8@", emitSimple}, + {"SI8!", emitSimple}, + {"I16@", emitSimple}, + {"I16!", emitSimple}, + {"SI16@", emitSimple}, + {"SI16!", emitSimple}, + {"I32@", emitSimple}, + {"I32!", emitSimple}, + {"SI32@", emitSimple}, + {"SI32!", emitSimple}, + {"HF@", emitSimple}, + {"HF!", emitSimple}, + {"SHF@", emitSimple}, + {"SHF!", emitSimple}, + {"BF@", emitSimple}, + {"BF!", emitSimple}, + {"SBF@", emitSimple}, + {"SBF!", emitSimple}, + {"F32@", emitSimple}, + {"F32!", emitSimple}, + {"SF32@", emitSimple}, + {"SF32!", emitSimple}, + {"TID-X", emitSimple}, + {"TID-Y", emitSimple}, + {"TID-Z", emitSimple}, + {"BID-X", emitSimple}, + {"BID-Y", emitSimple}, + {"BID-Z", emitSimple}, + {"BDIM-X", emitSimple}, + {"BDIM-Y", emitSimple}, + {"BDIM-Z", emitSimple}, + {"GDIM-X", emitSimple}, + {"GDIM-Y", emitSimple}, + {"GDIM-Z", emitSimple}, + {"GLOBAL-ID", emitSimple}, + {"=", emitSimple}, + {"<", emitSimple}, + {">", emitSimple}, + {"<>", emitSimple}, + {"<=", emitSimple}, + {">=", emitSimple}, + {"F=", emitSimple}, + {"F<", emitSimple}, + {"F>", emitSimple}, + {"F<>", emitSimple}, + {"F<=", emitSimple}, + {"F>=", emitSimple}, + {"S>F", emitSimple}, + {"F>S", emitSimple}, + {"0=", emitSimple}, + }; + return words; +} + Value ForthParser::emitOperation(StringRef word, Value inputStack, Location loc) { Type stackType = forth::StackType::get(context); @@ -531,364 +658,11 @@ Value ForthParser::emitOperation(StringRef word, Value inputStack, .getResult(0); } - // CELLS: multiply by 8 (sizeof i64 = sizeof f64) for byte addressing - if (word == "CELLS") { - Value lit8 = builder - .create(loc, stackType, inputStack, - builder.getI64IntegerAttr(8)) - .getResult(); - return builder.create(loc, stackType, lit8).getResult(); - } + const auto &builtins = getBuiltinWords(); + auto builtin = builtins.find(word); + if (builtin != builtins.end()) + return builtin->second(builder, loc, inputStack); - // Built-in operations - if (word == "DUP") { - return builder.create(loc, stackType, inputStack).getResult(); - } - if (word == "DROP") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "SWAP") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "OVER") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "ROT") { - return builder.create(loc, stackType, inputStack).getResult(); - } - if (word == "NIP") { - return builder.create(loc, stackType, inputStack).getResult(); - } - if (word == "TUCK") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "PICK") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "ROLL") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "+" || word == "ADD") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "-" || word == "SUB") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "*" || word == "MUL") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "/" || word == "DIV") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "F+") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "F-") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "F*") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "F/") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "FEXP") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "FSQRT") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "FLOG") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "FABS") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "FNEG") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "FMAX") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "FMIN") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "MOD") { - return builder.create(loc, stackType, inputStack).getResult(); - } - if (word == "AND") { - return builder.create(loc, stackType, inputStack).getResult(); - } - if (word == "OR") { - return builder.create(loc, stackType, inputStack).getResult(); - } - if (word == "XOR") { - return builder.create(loc, stackType, inputStack).getResult(); - } - if (word == "NOT") { - return builder.create(loc, stackType, inputStack).getResult(); - } - if (word == "LSHIFT") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "RSHIFT") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "@") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "!") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "F@") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "F!") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "S@") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "S!") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "SF@") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "SF!") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "I8@") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "I8!") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "SI8@") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "SI8!") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "I16@") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "I16!") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "SI16@") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "SI16!") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "I32@") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "I32!") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "SI32@") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "SI32!") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "HF@") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "HF!") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "SHF@") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "SHF!") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "BF@") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "BF!") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "SBF@") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "SBF!") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "F32@") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "F32!") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "SF32@") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "SF32!") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "TID-X") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "TID-Y") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "TID-Z") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "BID-X") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "BID-Y") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "BID-Z") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "BDIM-X") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "BDIM-Y") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "BDIM-Z") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "GDIM-X") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "GDIM-Y") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "GDIM-Z") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "GLOBAL-ID") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "BARRIER") { - builder.create(loc); - return inputStack; - } - if (word == "=") { - return builder.create(loc, stackType, inputStack).getResult(); - } - if (word == "<") { - return builder.create(loc, stackType, inputStack).getResult(); - } - if (word == ">") { - return builder.create(loc, stackType, inputStack).getResult(); - } - if (word == "<>") { - return builder.create(loc, stackType, inputStack).getResult(); - } - if (word == "<=") { - return builder.create(loc, stackType, inputStack).getResult(); - } - if (word == ">=") { - return builder.create(loc, stackType, inputStack).getResult(); - } - if (word == "F=") { - return builder.create(loc, stackType, inputStack).getResult(); - } - if (word == "F<") { - return builder.create(loc, stackType, inputStack).getResult(); - } - if (word == "F>") { - return builder.create(loc, stackType, inputStack).getResult(); - } - if (word == "F<>") { - return builder.create(loc, stackType, inputStack).getResult(); - } - if (word == "F<=") { - return builder.create(loc, stackType, inputStack).getResult(); - } - if (word == "F>=") { - return builder.create(loc, stackType, inputStack).getResult(); - } - if (word == "S>F") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "F>S") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } - if (word == "0=") { - return builder.create(loc, stackType, inputStack) - .getResult(); - } if (word == "I" || word == "J" || word == "K") { int64_t depth = (word == "I") ? 0 : (word == "J") ? 1 : 2; if (static_cast(loopStack.size()) < depth + 1) {