summaryrefslogtreecommitdiffstats
path: root/src/cmd/asm/internal/arch/loong64.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/asm/internal/arch/loong64.go')
-rw-r--r--src/cmd/asm/internal/arch/loong64.go78
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
+}