aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/asm/internal
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/asm/internal')
-rw-r--r--src/cmd/asm/internal/arch/arch.go28
-rw-r--r--src/cmd/asm/internal/asm/asm.go9
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