blob: 1a7926f8186a901a52b86439dc424d6cc83103c5 [file] [edit]
// 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: <T>
// 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
}