Source file src/cmd/internal/obj/riscv/list.go

     1  // Copyright 2019 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  package riscv
     6  
     7  import (
     8  	"fmt"
     9  
    10  	"cmd/internal/obj"
    11  )
    12  
    13  func init() {
    14  	obj.RegisterRegister(obj.RBaseRISCV, REG_END, RegName)
    15  	obj.RegisterOpcode(obj.ABaseRISCV, Anames)
    16  	obj.RegisterOpSuffix("riscv64", opSuffixString)
    17  	obj.RegisterSpecialOperands(int64(SPOP_BEGIN), int64(SPOP_END), specialOperandConv)
    18  }
    19  
    20  func RegName(r int) string {
    21  	switch {
    22  	case r == 0:
    23  		return "NONE"
    24  	case r == REG_G:
    25  		return "g"
    26  	case r == REG_SP:
    27  		return "SP"
    28  	case REG_X0 <= r && r <= REG_X31:
    29  		return fmt.Sprintf("X%d", r-REG_X0)
    30  	case REG_F0 <= r && r <= REG_F31:
    31  		return fmt.Sprintf("F%d", r-REG_F0)
    32  	case REG_V0 <= r && r <= REG_V31:
    33  		return fmt.Sprintf("V%d", r-REG_V0)
    34  	default:
    35  		return fmt.Sprintf("Rgok(%d)", r-obj.RBaseRISCV)
    36  	}
    37  }
    38  
    39  func opSuffixString(s uint8) string {
    40  	if s&rmSuffixBit == 0 {
    41  		return ""
    42  	}
    43  
    44  	ss, err := rmSuffixString(s)
    45  	if err != nil {
    46  		ss = fmt.Sprintf("<invalid 0x%x>", s)
    47  	}
    48  	if ss == "" {
    49  		return ss
    50  	}
    51  	return fmt.Sprintf(".%s", ss)
    52  }
    53  
    54  func specialOperandConv(a int64) string {
    55  	spc := SpecialOperand(a)
    56  	if spc >= SPOP_BEGIN && spc < SPOP_END {
    57  		return spc.String()
    58  	}
    59  	return "SPC_??"
    60  }
    61  

View as plain text