diff options
Diffstat (limited to 'src/cmd/asm/internal')
| -rw-r--r-- | src/cmd/asm/internal/arch/arch.go | 28 | ||||
| -rw-r--r-- | src/cmd/asm/internal/asm/asm.go | 9 |
2 files changed, 37 insertions, 0 deletions
diff --git a/src/cmd/asm/internal/arch/arch.go b/src/cmd/asm/internal/arch/arch.go index 357ec757bc..0e4d63744b 100644 --- a/src/cmd/asm/internal/arch/arch.go +++ b/src/cmd/asm/internal/arch/arch.go @@ -11,6 +11,7 @@ import ( "cmd/internal/obj/mips" "cmd/internal/obj/ppc64" "cmd/internal/obj/s390x" + "cmd/internal/obj/wasm" "cmd/internal/obj/x86" "fmt" "strings" @@ -87,6 +88,8 @@ func Set(GOARCH string) *Arch { a := archS390x() a.LinkArch = &s390x.Links390x return a + case "wasm": + return archWasm() } return nil } @@ -95,6 +98,10 @@ func jumpX86(word string) bool { return word[0] == 'J' || word == "CALL" || strings.HasPrefix(word, "LOOP") || word == "XBEGIN" } +func jumpWasm(word string) bool { + return word == "JMP" || word == "CALL" || word == "Call" || word == "Br" || word == "BrIf" +} + func archX86(linkArch *obj.LinkArch) *Arch { register := make(map[string]int16) // Create maps for easy lookup of instruction names etc. @@ -577,3 +584,24 @@ func archS390x() *Arch { IsJump: jumpS390x, } } + +func archWasm() *Arch { + instructions := make(map[string]obj.As) + for i, s := range obj.Anames { + instructions[s] = obj.As(i) + } + for i, s := range wasm.Anames { + if obj.As(i) >= obj.A_ARCHSPECIFIC { + instructions[s] = obj.As(i) + obj.ABaseWasm + } + } + + return &Arch{ + LinkArch: &wasm.Linkwasm, + Instructions: instructions, + Register: wasm.Register, + RegisterPrefix: nil, + RegisterNumber: nilRegisterNumber, + IsJump: jumpWasm, + } +} diff --git a/src/cmd/asm/internal/asm/asm.go b/src/cmd/asm/internal/asm/asm.go index 4c256f62b2..17572e731d 100644 --- a/src/cmd/asm/internal/asm/asm.go +++ b/src/cmd/asm/internal/asm/asm.go @@ -343,6 +343,13 @@ func (p *Parser) asmJump(op obj.As, cond string, a []obj.Addr) { As: op, } switch len(a) { + case 0: + if p.arch.Family == sys.Wasm { + target = &obj.Addr{Type: obj.TYPE_NONE} + break + } + p.errorf("wrong number of arguments to %s instruction", op) + return case 1: target = &a[0] case 2: @@ -445,6 +452,8 @@ func (p *Parser) asmJump(op obj.As, cond string, a []obj.Addr) { case target.Type == obj.TYPE_CONST: // JMP $4 prog.To = a[0] + case target.Type == obj.TYPE_NONE: + // JMP default: p.errorf("cannot assemble jump %+v", target) return |
