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