github.com/go-asm/go@v1.21.1-0.20240213172139-40c5ead50c48/cmd/asm/arch/mips.go (about)

     1  // Copyright 2015 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // This file encapsulates some of the odd characteristics of the
     6  // MIPS (MIPS64) instruction set, to minimize its interaction
     7  // with the core of the assembler.
     8  
     9  package arch
    10  
    11  import (
    12  	"github.com/go-asm/go/cmd/obj"
    13  	"github.com/go-asm/go/cmd/obj/mips"
    14  )
    15  
    16  func jumpMIPS(word string) bool {
    17  	switch word {
    18  	case "BEQ", "BFPF", "BFPT", "BGEZ", "BGEZAL", "BGTZ", "BLEZ", "BLTZ", "BLTZAL", "BNE", "JMP", "JAL", "CALL":
    19  		return true
    20  	}
    21  	return false
    22  }
    23  
    24  // IsMIPSCMP reports whether the op (as defined by an mips.A* constant) is
    25  // one of the CMP instructions that require special handling.
    26  func IsMIPSCMP(op obj.As) bool {
    27  	switch op {
    28  	case mips.ACMPEQF, mips.ACMPEQD, mips.ACMPGEF, mips.ACMPGED,
    29  		mips.ACMPGTF, mips.ACMPGTD:
    30  		return true
    31  	}
    32  	return false
    33  }
    34  
    35  // IsMIPSMUL reports whether the op (as defined by an mips.A* constant) is
    36  // one of the MUL/DIV/REM/MADD/MSUB instructions that require special handling.
    37  func IsMIPSMUL(op obj.As) bool {
    38  	switch op {
    39  	case mips.AMUL, mips.AMULU, mips.AMULV, mips.AMULVU,
    40  		mips.ADIV, mips.ADIVU, mips.ADIVV, mips.ADIVVU,
    41  		mips.AREM, mips.AREMU, mips.AREMV, mips.AREMVU,
    42  		mips.AMADD, mips.AMSUB:
    43  		return true
    44  	}
    45  	return false
    46  }
    47  
    48  func mipsRegisterNumber(name string, n int16) (int16, bool) {
    49  	switch name {
    50  	case "F":
    51  		if 0 <= n && n <= 31 {
    52  			return mips.REG_F0 + n, true
    53  		}
    54  	case "FCR":
    55  		if 0 <= n && n <= 31 {
    56  			return mips.REG_FCR0 + n, true
    57  		}
    58  	case "M":
    59  		if 0 <= n && n <= 31 {
    60  			return mips.REG_M0 + n, true
    61  		}
    62  	case "R":
    63  		if 0 <= n && n <= 31 {
    64  			return mips.REG_R0 + n, true
    65  		}
    66  	case "W":
    67  		if 0 <= n && n <= 31 {
    68  			return mips.REG_W0 + n, true
    69  		}
    70  	}
    71  	return 0, false
    72  }