From 355750be61fbf4b90d132a9560e01113f22f4c38 Mon Sep 17 00:00:00 2001 From: Marc Vertes Date: Mon, 24 Jul 2023 14:20:45 +0200 Subject: vm1: add file pos for debug and a few immediate instructions (#4) * vm1: add file pos for debug and a few immediate instructions `op[0]` is now reserved for storing the file position computed at code compiling. No impact on performances. Added `Subi` and `Infi` which use integer immediate argument instead of stack. Experimental. Improves `fib()` speed by ~ 20%. * vm1: add benchmark as proposed by @ajnavarro --- cmd/gint/main.go | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) (limited to 'cmd') diff --git a/cmd/gint/main.go b/cmd/gint/main.go index 44f59ac..b36eb5d 100644 --- a/cmd/gint/main.go +++ b/cmd/gint/main.go @@ -1,11 +1,15 @@ package main import ( + "fmt" "log" "os" + "github.com/gnolang/parscan/codegen" "github.com/gnolang/parscan/lang/golang" + "github.com/gnolang/parscan/parser" "github.com/gnolang/parscan/vm0" + "github.com/gnolang/parscan/vm1" ) func main() { @@ -14,12 +18,18 @@ func main() { if err != nil { log.Fatal(err) } - if err := runSrc(string(buf)); err != nil { - log.Fatal(err) + if len(os.Args) > 1 { + if err := run1(string(buf)); err != nil { + log.Fatal(err) + } + } else { + if err := run0(string(buf)); err != nil { + log.Fatal(err) + } } } -func runSrc(src string) error { +func run0(src string) error { i := vm0.New(golang.GoParser) nodes, err := i.Parse(src) if err != nil { @@ -33,3 +43,26 @@ func runSrc(src string) error { } return nil } + +func run1(src string) (err error) { + m := &vm1.Machine{} + c := &codegen.Compiler{Symbols: map[string]int{}} + c.AddSym(fmt.Println, "println") + n := &parser.Node{} + if n.Child, err = golang.GoParser.Parse(src); err != nil { + return err + } + n.Dot(os.Getenv("DOT"), "") + if err = c.CodeGen(n); err != nil { + return err + } + c.Emit(n, vm1.Exit) + log.Println("data:", c.Data) + log.Println("code:", vm1.Disas(c.Code)) + for _, v := range c.Data { + m.Push(v) + } + m.PushCode(c.Code) + m.Run() + return +} -- cgit v1.2.3