aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/asm/internal/arch/arch.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/asm/internal/arch/arch.go')
-rw-r--r--src/cmd/asm/internal/arch/arch.go66
1 files changed, 65 insertions, 1 deletions
diff --git a/src/cmd/asm/internal/arch/arch.go b/src/cmd/asm/internal/arch/arch.go
index fd2430561b..9110ca7c02 100644
--- a/src/cmd/asm/internal/arch/arch.go
+++ b/src/cmd/asm/internal/arch/arch.go
@@ -59,6 +59,14 @@ func Set(GOARCH string) *Arch {
return archArm()
case "arm64":
return archArm64()
+ case "mips":
+ a := archMips()
+ a.LinkArch = &mips.Linkmips
+ return a
+ case "mipsle":
+ a := archMips()
+ a.LinkArch = &mips.Linkmipsle
+ return a
case "mips64":
a := archMips64()
a.LinkArch = &mips.Linkmips64
@@ -374,6 +382,62 @@ func archPPC64() *Arch {
}
}
+func archMips() *Arch {
+ register := make(map[string]int16)
+ // Create maps for easy lookup of instruction names etc.
+ // Note that there is no list of names as there is for x86.
+ for i := mips.REG_R0; i <= mips.REG_R31; i++ {
+ register[obj.Rconv(i)] = int16(i)
+ }
+
+ for i := mips.REG_F0; i <= mips.REG_F31; i++ {
+ register[obj.Rconv(i)] = int16(i)
+ }
+ for i := mips.REG_M0; i <= mips.REG_M31; i++ {
+ register[obj.Rconv(i)] = int16(i)
+ }
+ for i := mips.REG_FCR0; i <= mips.REG_FCR31; i++ {
+ register[obj.Rconv(i)] = int16(i)
+ }
+ register["HI"] = mips.REG_HI
+ register["LO"] = mips.REG_LO
+ // Pseudo-registers.
+ register["SB"] = RSB
+ register["FP"] = RFP
+ register["PC"] = RPC
+ // Avoid unintentionally clobbering g using R30.
+ delete(register, "R30")
+ register["g"] = mips.REG_R30
+
+ registerPrefix := map[string]bool{
+ "F": true,
+ "FCR": true,
+ "M": true,
+ "R": true,
+ }
+
+ instructions := make(map[string]obj.As)
+ for i, s := range obj.Anames {
+ instructions[s] = obj.As(i)
+ }
+ for i, s := range mips.Anames {
+ if obj.As(i) >= obj.A_ARCHSPECIFIC {
+ instructions[s] = obj.As(i) + obj.ABaseMIPS
+ }
+ }
+ // Annoying alias.
+ instructions["JAL"] = mips.AJAL
+
+ return &Arch{
+ LinkArch: &mips.Linkmipsle,
+ Instructions: instructions,
+ Register: register,
+ RegisterPrefix: registerPrefix,
+ RegisterNumber: mipsRegisterNumber,
+ IsJump: jumpMIPS,
+ }
+}
+
func archMips64() *Arch {
register := make(map[string]int16)
// Create maps for easy lookup of instruction names etc.
@@ -427,7 +491,7 @@ func archMips64() *Arch {
Register: register,
RegisterPrefix: registerPrefix,
RegisterNumber: mipsRegisterNumber,
- IsJump: jumpMIPS64,
+ IsJump: jumpMIPS,
}
}