1
2
3
4
5
6
7
8
9 package arch
10
11 import (
12 "cmd/internal/obj"
13 "cmd/internal/obj/riscv"
14 "fmt"
15 )
16
17
18
19 func IsRISCV64AMO(op obj.As) bool {
20 switch op {
21 case riscv.ASCW, riscv.ASCD, riscv.AAMOSWAPW, riscv.AAMOSWAPD, riscv.AAMOADDW, riscv.AAMOADDD,
22 riscv.AAMOANDW, riscv.AAMOANDD, riscv.AAMOORW, riscv.AAMOORD, riscv.AAMOXORW, riscv.AAMOXORD,
23 riscv.AAMOMINW, riscv.AAMOMIND, riscv.AAMOMINUW, riscv.AAMOMINUD,
24 riscv.AAMOMAXW, riscv.AAMOMAXD, riscv.AAMOMAXUW, riscv.AAMOMAXUD:
25 return true
26 }
27 return false
28 }
29
30
31
32 func IsRISCV64VTypeI(op obj.As) bool {
33 return op == riscv.AVSETVLI || op == riscv.AVSETIVLI
34 }
35
36
37
38
39 func IsRISCV64CSRO(op obj.As) (imm bool, ok bool) {
40 switch op {
41 case riscv.ACSRRCI, riscv.ACSRRSI, riscv.ACSRRWI:
42 imm = true
43 fallthrough
44 case riscv.ACSRRC, riscv.ACSRRS, riscv.ACSRRW:
45 ok = true
46 }
47 return
48 }
49
50 var riscv64SpecialOperand map[string]riscv.SpecialOperand
51
52
53 func RISCV64SpecialOperand(name string) riscv.SpecialOperand {
54 if riscv64SpecialOperand == nil {
55
56 riscv64SpecialOperand = map[string]riscv.SpecialOperand{}
57 for opd := riscv.SPOP_RVV_BEGIN; opd < riscv.SPOP_RVV_END; opd++ {
58 riscv64SpecialOperand[opd.String()] = opd
59 }
60
61 for csrCode, csrName := range riscv.CSRs {
62
63
64
65
66
67 if _, ok := riscv64SpecialOperand[csrName]; ok {
68 panic(fmt.Sprintf("riscv64 special operand %q redefined", csrName))
69 }
70 riscv64SpecialOperand[csrName] = riscv.SpecialOperand(int(csrCode) + int(riscv.SPOP_CSR_BEGIN))
71 }
72 }
73 if opd, ok := riscv64SpecialOperand[name]; ok {
74 return opd
75 }
76 return riscv.SPOP_END
77 }
78
79
80
81 func RISCV64ValidateVectorType(vsew, vlmul, vtail, vmask int64) error {
82 _, err := riscv.EncodeVectorType(vsew, vlmul, vtail, vmask)
83 return err
84 }
85
View as plain text