...

Source file src/pkg/cmd/asm/internal/arch/mips.go

     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		"cmd/internal/obj"
    13		"cmd/internal/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		}
    67		return 0, false
    68	}
    69	

View as plain text