diff options
Diffstat (limited to 'src/cmd/asm/internal/arch/loong64.go')
-rw-r--r-- | src/cmd/asm/internal/arch/loong64.go | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/src/cmd/asm/internal/arch/loong64.go b/src/cmd/asm/internal/arch/loong64.go new file mode 100644 index 0000000..2958ee1 --- /dev/null +++ b/src/cmd/asm/internal/arch/loong64.go @@ -0,0 +1,78 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file encapsulates some of the odd characteristics of the +// Loong64 (LoongArch64) instruction set, to minimize its interaction +// with the core of the assembler. + +package arch + +import ( + "cmd/internal/obj" + "cmd/internal/obj/loong64" +) + +func jumpLoong64(word string) bool { + switch word { + case "BEQ", "BFPF", "BFPT", "BLTZ", "BGEZ", "BLEZ", "BGTZ", "BLT", "BLTU", "JIRL", "BNE", "BGE", "BGEU", "JMP", "JAL", "CALL": + return true + } + return false +} + +// IsLoong64CMP reports whether the op (as defined by an loong64.A* constant) is +// one of the CMP instructions that require special handling. +func IsLoong64CMP(op obj.As) bool { + switch op { + case loong64.ACMPEQF, loong64.ACMPEQD, loong64.ACMPGEF, loong64.ACMPGED, + loong64.ACMPGTF, loong64.ACMPGTD: + return true + } + return false +} + +// IsLoong64MUL reports whether the op (as defined by an loong64.A* constant) is +// one of the MUL/DIV/REM instructions that require special handling. +func IsLoong64MUL(op obj.As) bool { + switch op { + case loong64.AMUL, loong64.AMULU, loong64.AMULV, loong64.AMULVU, + loong64.ADIV, loong64.ADIVU, loong64.ADIVV, loong64.ADIVVU, + loong64.AREM, loong64.AREMU, loong64.AREMV, loong64.AREMVU: + return true + } + return false +} + +// IsLoong64RDTIME reports whether the op (as defined by an loong64.A* +// constant) is one of the RDTIMELW/RDTIMEHW/RDTIMED instructions that +// require special handling. +func IsLoong64RDTIME(op obj.As) bool { + switch op { + case loong64.ARDTIMELW, loong64.ARDTIMEHW, loong64.ARDTIMED: + return true + } + return false +} + +func loong64RegisterNumber(name string, n int16) (int16, bool) { + switch name { + case "F": + if 0 <= n && n <= 31 { + return loong64.REG_F0 + n, true + } + case "FCSR": + if 0 <= n && n <= 31 { + return loong64.REG_FCSR0 + n, true + } + case "FCC": + if 0 <= n && n <= 31 { + return loong64.REG_FCC0 + n, true + } + case "R": + if 0 <= n && n <= 31 { + return loong64.REG_R0 + n, true + } + } + return 0, false +} |