// 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. package loong64 import ( "cmd/internal/obj" "fmt" ) func init() { obj.RegisterRegister(obj.RBaseLOONG64, REG_LAST, RegName) obj.RegisterOpcode(obj.ABaseLoong64, Anames) } func arrange(valid int16) string { var regPrefix string var arngName string // bits 0-4 indicates register: Vn or Xn // bits 5-9 indicates arrangement: // bits 10 indicates SMID type: 0: LSX, 1: LASX simdType := (valid >> EXT_SIMDTYPE_SHIFT) & EXT_SIMDTYPE_MASK simdReg := (valid >> EXT_REG_SHIFT) & EXT_REG_MASK arngType := (valid >> EXT_TYPE_SHIFT) & EXT_TYPE_MASK switch simdType { case LSX: regPrefix = "V" case LASX: regPrefix = "X" default: regPrefix = "#" } switch arngType { case ARNG_32B: arngName = "B32" case ARNG_16H: arngName = "H16" case ARNG_8W: arngName = "W8" case ARNG_4V: arngName = "V4" case ARNG_2Q: arngName = "Q2" case ARNG_16B: arngName = "B16" case ARNG_8H: arngName = "H8" case ARNG_4W: arngName = "W4" case ARNG_2V: arngName = "V2" case ARNG_B: arngName = "B" case ARNG_H: arngName = "H" case ARNG_W: arngName = "W" case ARNG_V: arngName = "V" case ARNG_BU: arngName = "BU" case ARNG_HU: arngName = "HU" case ARNG_WU: arngName = "WU" case ARNG_VU: arngName = "VU" default: arngName = "ARNG_???" } return fmt.Sprintf("%s%d.%s", regPrefix, simdReg, arngName) } func RegName(r int) string { switch { case r == 0: return "NONE" case r == REGG: // Special case. return "g" case REG_R0 <= r && r <= REG_R31: return fmt.Sprintf("R%d", r-REG_R0) case REG_F0 <= r && r <= REG_F31: return fmt.Sprintf("F%d", r-REG_F0) case REG_FCSR0 <= r && r <= REG_FCSR31: return fmt.Sprintf("FCSR%d", r-REG_FCSR0) case REG_FCC0 <= r && r <= REG_FCC31: return fmt.Sprintf("FCC%d", r-REG_FCC0) case REG_V0 <= r && r <= REG_V31: return fmt.Sprintf("V%d", r-REG_V0) case REG_X0 <= r && r <= REG_X31: return fmt.Sprintf("X%d", r-REG_X0) case REG_ARNG <= r && r < REG_ELEM: return arrange(int16(r - REG_ARNG)) case REG_ELEM <= r && r < REG_ELEM_END: return arrange(int16(r - REG_ELEM)) } return fmt.Sprintf("badreg(%d)", r-obj.RBaseLOONG64) } func DRconv(a int) string { s := "C_??" if a >= C_NONE && a <= C_NCLASS { s = cnames0[a] } return s }