Increased TInstr field sizes: allow long jumps and 65535 VM registers (#12777)
* Increased regBx size from 16 to 24 bits to increase jump range in the VM from 32K to 8M instructions. Fixes #12727 * Increased VM TInst register field sizes to 16 bits to allow up to 65535 VM registers per proc * Added test case for >255 VM registers
This commit is contained in:
parent
b8152b29e8
commit
e61d702206
3 changed files with 35 additions and 5 deletions
|
|
@ -12,14 +12,14 @@
|
||||||
|
|
||||||
import ast, idents, options, modulegraphs, lineinfos
|
import ast, idents, options, modulegraphs, lineinfos
|
||||||
|
|
||||||
type TInstrType* = uint32
|
type TInstrType* = uint64
|
||||||
|
|
||||||
const
|
const
|
||||||
regOBits = 8 # Opcode
|
regOBits = 8 # Opcode
|
||||||
regABits = 8
|
regABits = 16
|
||||||
regBBits = 8
|
regBBits = 16
|
||||||
regCBits = 8
|
regCBits = 16
|
||||||
regBxBits = 16
|
regBxBits = 24
|
||||||
|
|
||||||
byteExcess* = 128 # we use excess-K for immediates
|
byteExcess* = 128 # we use excess-K for immediates
|
||||||
|
|
||||||
|
|
|
||||||
14
tests/vm/tfarjump.nim
Normal file
14
tests/vm/tfarjump.nim
Normal file
|
|
@ -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()
|
||||||
16
tests/vm/tmanyregs.nim
Normal file
16
tests/vm/tmanyregs.nim
Normal file
|
|
@ -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()
|
||||||
Loading…
Add table
Add a link
Reference in a new issue