github.com/go-asm/go@v1.21.1-0.20240213172139-40c5ead50c48/cmd/asm/arch/loong64.go (about) 1 // Copyright 2022 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 // Loong64 (LoongArch64) 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/loong64" 14 ) 15 16 func jumpLoong64(word string) bool { 17 switch word { 18 case "BEQ", "BFPF", "BFPT", "BLTZ", "BGEZ", "BLEZ", "BGTZ", "BLT", "BLTU", "JIRL", "BNE", "BGE", "BGEU", "JMP", "JAL", "CALL": 19 return true 20 } 21 return false 22 } 23 24 // IsLoong64CMP reports whether the op (as defined by an loong64.A* constant) is 25 // one of the CMP instructions that require special handling. 26 func IsLoong64CMP(op obj.As) bool { 27 switch op { 28 case loong64.ACMPEQF, loong64.ACMPEQD, loong64.ACMPGEF, loong64.ACMPGED, 29 loong64.ACMPGTF, loong64.ACMPGTD: 30 return true 31 } 32 return false 33 } 34 35 // IsLoong64MUL reports whether the op (as defined by an loong64.A* constant) is 36 // one of the MUL/DIV/REM instructions that require special handling. 37 func IsLoong64MUL(op obj.As) bool { 38 switch op { 39 case loong64.AMUL, loong64.AMULU, loong64.AMULV, loong64.AMULVU, 40 loong64.ADIV, loong64.ADIVU, loong64.ADIVV, loong64.ADIVVU, 41 loong64.AREM, loong64.AREMU, loong64.AREMV, loong64.AREMVU: 42 return true 43 } 44 return false 45 } 46 47 // IsLoong64RDTIME reports whether the op (as defined by an loong64.A* 48 // constant) is one of the RDTIMELW/RDTIMEHW/RDTIMED instructions that 49 // require special handling. 50 func IsLoong64RDTIME(op obj.As) bool { 51 switch op { 52 case loong64.ARDTIMELW, loong64.ARDTIMEHW, loong64.ARDTIMED: 53 return true 54 } 55 return false 56 } 57 58 func loong64RegisterNumber(name string, n int16) (int16, bool) { 59 switch name { 60 case "F": 61 if 0 <= n && n <= 31 { 62 return loong64.REG_F0 + n, true 63 } 64 case "FCSR": 65 if 0 <= n && n <= 31 { 66 return loong64.REG_FCSR0 + n, true 67 } 68 case "FCC": 69 if 0 <= n && n <= 31 { 70 return loong64.REG_FCC0 + n, true 71 } 72 case "R": 73 if 0 <= n && n <= 31 { 74 return loong64.REG_R0 + n, true 75 } 76 } 77 return 0, false 78 }