diff --git a/compiler/vmdef.nim b/compiler/vmdef.nim index 0c3c54d0e2a8..a5df87ca8398 100644 --- a/compiler/vmdef.nim +++ b/compiler/vmdef.nim @@ -12,14 +12,14 @@ import ast, idents, options, modulegraphs, lineinfos -type TInstrType* = uint32 +type TInstrType* = uint64 const regOBits = 8 # Opcode - regABits = 8 - regBBits = 8 - regCBits = 8 - regBxBits = 16 + regABits = 16 + regBBits = 16 + regCBits = 16 + regBxBits = 24 byteExcess* = 128 # we use excess-K for immediates diff --git a/tests/vm/tfarjump.nim b/tests/vm/tfarjump.nim new file mode 100644 index 000000000000..f5798b8d2eb2 --- /dev/null +++ b/tests/vm/tfarjump.nim @@ -0,0 +1,14 @@ +# Test a VM relative jump with an offset larger then 32767 instructions. + +import macros + +static: + var a = 0 + macro foo(): untyped = + let s = newStmtList() + for i in 1..6554: + s.add nnkCommand.newTree(ident("inc"), ident("a")) + quote do: + if true: + `s` + foo() diff --git a/tests/vm/tmanyregs.nim b/tests/vm/tmanyregs.nim new file mode 100644 index 000000000000..711c69285d12 --- /dev/null +++ b/tests/vm/tmanyregs.nim @@ -0,0 +1,16 @@ +import macros + +# Generate a proc with more then 255 registers. Should not generate an error at +# compile time + +static: + macro mkFoo() = + let ss = newStmtList() + for i in 1..256: + ss.add parseStmt "var x" & $i & " = " & $i + ss.add parseStmt "inc x" & $i + quote do: + proc foo() = + `ss` + mkFoo() + foo()