// 11.7: Single-Precision Floating-Point Conversion and Move Instructions
FCVTWS F0, X5 // d31200c0
+ FCVTWS.RNE F0, X5 // d30200c0
+ FCVTWS.RTZ F0, X5 // d31200c0
+ FCVTWS.RDN F0, X5 // d32200c0
+ FCVTWS.RUP F0, X5 // d33200c0
+ FCVTWS.RMM F0, X5 // d34200c0
FCVTLS F0, X5 // d31220c0
+ FCVTLS.RNE F0, X5 // d30220c0
+ FCVTLS.RTZ F0, X5 // d31220c0
+ FCVTLS.RDN F0, X5 // d32220c0
+ FCVTLS.RUP F0, X5 // d33220c0
+ FCVTLS.RMM F0, X5 // d34220c0
FCVTSW X5, F0 // 538002d0
FCVTSL X5, F0 // 538022d0
FCVTWUS F0, X5 // d31210c0
+ FCVTWUS.RNE F0, X5 // d30210c0
+ FCVTWUS.RTZ F0, X5 // d31210c0
+ FCVTWUS.RDN F0, X5 // d32210c0
+ FCVTWUS.RUP F0, X5 // d33210c0
+ FCVTWUS.RMM F0, X5 // d34210c0
FCVTLUS F0, X5 // d31230c0
+ FCVTLUS.RNE F0, X5 // d30230c0
+ FCVTLUS.RTZ F0, X5 // d31230c0
+ FCVTLUS.RDN F0, X5 // d32230c0
+ FCVTLUS.RUP F0, X5 // d33230c0
+ FCVTLUS.RMM F0, X5 // d34230c0
FCVTSWU X5, F0 // 538012d0
FCVTSLU X5, F0 // 538032d0
FSGNJS F1, F0, F2 // 53011020
// 12.5: Double-Precision Floating-Point Conversion and Move Instructions
FCVTWD F0, X5 // d31200c2
+ FCVTWD.RNE F0, X5 // d30200c2
+ FCVTWD.RTZ F0, X5 // d31200c2
+ FCVTWD.RDN F0, X5 // d32200c2
+ FCVTWD.RUP F0, X5 // d33200c2
+ FCVTWD.RMM F0, X5 // d34200c2
FCVTLD F0, X5 // d31220c2
+ FCVTLD.RNE F0, X5 // d30220c2
+ FCVTLD.RTZ F0, X5 // d31220c2
+ FCVTLD.RDN F0, X5 // d32220c2
+ FCVTLD.RUP F0, X5 // d33220c2
+ FCVTLD.RMM F0, X5 // d34220c2
FCVTDW X5, F0 // 538002d2
FCVTDL X5, F0 // 538022d2
FCVTWUD F0, X5 // d31210c2
+ FCVTWUD.RNE F0, X5 // d30210c2
+ FCVTWUD.RTZ F0, X5 // d31210c2
+ FCVTWUD.RDN F0, X5 // d32210c2
+ FCVTWUD.RUP F0, X5 // d33210c2
+ FCVTWUD.RMM F0, X5 // d34210c2
FCVTLUD F0, X5 // d31230c2
+ FCVTLUD.RNE F0, X5 // d30230c2
+ FCVTLUD.RTZ F0, X5 // d31230c2
+ FCVTLUD.RDN F0, X5 // d32230c2
+ FCVTLUD.RUP F0, X5 // d33230c2
+ FCVTLUD.RMM F0, X5 // d34230c2
FCVTDWU X5, F0 // 538012d2
FCVTDLU X5, F0 // 538032d2
FCVTSD F0, F1 // d3001040
package riscv
-import "cmd/internal/obj"
+import (
+ "errors"
+ "fmt"
+
+ "cmd/internal/obj"
+)
//go:generate go run ../stringer.go -i $GOFILE -o anames.go -p riscv
ALAST
)
+// opSuffix encoding to uint8 which fit into p.Scond
+var rmSuffixSet = map[string]uint8{
+ "RNE": RM_RNE,
+ "RTZ": RM_RTZ,
+ "RDN": RM_RDN,
+ "RUP": RM_RUP,
+ "RMM": RM_RMM,
+}
+
+const rmSuffixBit uint8 = 1 << 7
+
+func rmSuffixEncode(s string) (uint8, error) {
+ if s == "" {
+ return 0, errors.New("empty suffix")
+ }
+ enc, ok := rmSuffixSet[s]
+ if !ok {
+ return 0, fmt.Errorf("invalid encoding for unknown suffix:%q", s)
+ }
+ return enc | rmSuffixBit, nil
+}
+
+func rmSuffixString(u uint8) (string, error) {
+ if u&rmSuffixBit == 0 {
+ return "", fmt.Errorf("invalid suffix, require round mode bit:%x", u)
+ }
+
+ u &^= rmSuffixBit
+ for k, v := range rmSuffixSet {
+ if v == u {
+ return k, nil
+ }
+ }
+ return "", fmt.Errorf("unknown suffix:%x", u)
+}
+
+const (
+ RM_RNE uint8 = iota // Round to Nearest, ties to Even
+ RM_RTZ // Round towards Zero
+ RM_RDN // Round Down
+ RM_RUP // Round Up
+ RM_RMM // Round to Nearest, ties to Max Magnitude
+)
+
// All unary instructions which write to their arguments (as opposed to reading
// from them) go here. The assembly parser uses this information to populate
// its AST in a semantically reasonable way.
"internal/abi"
"log"
"math/bits"
+ "strings"
)
func buildop(ctxt *obj.Link) {}
ins.imm = 0x0ff
case AFCVTWS, AFCVTLS, AFCVTWUS, AFCVTLUS, AFCVTWD, AFCVTLD, AFCVTWUD, AFCVTLUD:
- // Set the rounding mode in funct3 to round to zero.
- ins.funct3 = 1
+ // Set the default rounding mode in funct3 to round to zero.
+ if p.Scond&rmSuffixBit == 0 {
+ ins.funct3 = uint32(RM_RTZ)
+ } else {
+ ins.funct3 = uint32(p.Scond &^ rmSuffixBit)
+ }
case AFNES, AFNED:
// Replace FNE[SD] with FEQ[SD] and NOT.
return p.Mark&USES_REG_TMP == USES_REG_TMP || p.From.Reg == REG_TMP || p.To.Reg == REG_TMP || p.Reg == REG_TMP
}
+func ParseSuffix(prog *obj.Prog, cond string) (err error) {
+ switch prog.As {
+ case AFCVTWS, AFCVTLS, AFCVTWUS, AFCVTLUS, AFCVTWD, AFCVTLD, AFCVTWUD, AFCVTLUD:
+ prog.Scond, err = rmSuffixEncode(strings.TrimPrefix(cond, "."))
+ }
+ return
+}
+
var LinkRISCV64 = obj.LinkArch{
Arch: sys.ArchRISCV64,
Init: buildop,