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
51
52
53
54 func IsRISCV64PseudoCSRO(op obj.As) (imm bool, index int, ok bool) {
55 switch op {
56 case riscv.ACSRCI, riscv.ACSRSI, riscv.ACSRWI:
57 imm, index, ok = true, 1, true
58 case riscv.ACSRC, riscv.ACSRS, riscv.ACSRW:
59 imm, index, ok = false, 1, true
60 case riscv.ACSRR:
61 imm, index, ok = false, 0, true
62 }
63 return
64 }
65
66 var riscv64SpecialOperand map[string]riscv.SpecialOperand
67
68
69 func RISCV64SpecialOperand(name string) riscv.SpecialOperand {
70 if riscv64SpecialOperand == nil {
71
72 riscv64SpecialOperand = map[string]riscv.SpecialOperand{}
73 for opd := riscv.SPOP_RVV_BEGIN; opd < riscv.SPOP_RVV_END; opd++ {
74 riscv64SpecialOperand[opd.String()] = opd
75 }
76
77 for csrCode, csrName := range riscv.CSRs {
78
79
80
81
82
83 if _, ok := riscv64SpecialOperand[csrName]; ok {
84 panic(fmt.Sprintf("riscv64 special operand %q redefined", csrName))
85 }
86 riscv64SpecialOperand[csrName] = riscv.SpecialOperand(int(csrCode) + int(riscv.SPOP_CSR_BEGIN))
87 }
88
89 for opd := riscv.SPOP_FENCE_BEGIN + 1; opd < riscv.SPOP_FENCE_END; opd++ {
90 riscv64SpecialOperand[opd.String()] = opd
91 }
92 }
93 if opd, ok := riscv64SpecialOperand[name]; ok {
94 return opd
95 }
96 return riscv.SPOP_END
97 }
98
99
100
101 func RISCV64ValidateVectorType(vsew, vlmul, vtail, vmask int64) error {
102 _, err := riscv.EncodeVectorType(vsew, vlmul, vtail, vmask)
103 return err
104 }
105
View as plain text