Home | History | Annotate | Download | only in arch
      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 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 		return true
     43 	}
     44 	return false
     45 }
     46 
     47 func mipsRegisterNumber(name string, n int16) (int16, bool) {
     48 	switch name {
     49 	case "F":
     50 		if 0 <= n && n <= 31 {
     51 			return mips.REG_F0 + n, true
     52 		}
     53 	case "FCR":
     54 		if 0 <= n && n <= 31 {
     55 			return mips.REG_FCR0 + n, true
     56 		}
     57 	case "M":
     58 		if 0 <= n && n <= 31 {
     59 			return mips.REG_M0 + n, true
     60 		}
     61 	case "R":
     62 		if 0 <= n && n <= 31 {
     63 			return mips.REG_R0 + n, true
     64 		}
     65 	}
     66 	return 0, false
     67 }
     68