1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
use strum_macros::{IntoStaticStr, VariantArray};

use super::{super::super::basic::parser::lexer::RISCVOpToken, oplist::OP_LIST};

#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, VariantArray, IntoStaticStr)]
#[strum(serialize_all = "snake_case")]
pub enum RV32FOpToken {
    FaddS,
    FclassS,
    FcvtSW,
    FcvtSWu,
    FcvtWS,
    FcvtWuS,
    FdivS,
    FeqS,
    FleS,
    FltS,
    Flw,
    FmaddS,
    FmaxS,
    FminS,
    FmsubS,
    FmulS,
    FmvSX,
    FmvXS,
    FnmaddS,
    FnmsubS,
    FsgnjS,
    FsgnjnS,
    FsgnjxS,
    FsqrtS,
    FsubS,
    Fsw,
    FabsS,
    FgeS,
    FgtS,
    FmvS,
    FmvWX,
    FmvXW,
    FnegS,
    // FaddD,
    // FclassD,
    // FcvtDS,
    // FcvtDW,
    // FcvtDWu,
    // FcvtSD,
    // FcvtWD,
    // FcvtWuD,
    // FdivD,
    // FeqD,
    // Fld,
    // FleD,
    // FltD,
    // FmaddD,
    // FmaxD,
    // FminD,
    // FmsubD,
    // FmulD,
    // FnmaddD,
    // FnmsubD,
    // Fsd,
    // FsgnjD,
    // FsgnjnD,
    // FsgnjxD,
    // FsqrtD,
    // FsubD,
    // FabsD,
    // FgeD,
    // FgtD,
    // FmvD,
    // FnegD,
    Frcsr,
    Frflags,
    Frrm,
    Frsr,
    Fsflags,
    Fsrm,
    Fsrr,
}

impl RV32FOpToken {
    pub fn name(&self) -> String {
        Into::<&'static str>::into(self).replace("_", ".")
    }
}

impl From<RV32FOpToken> for RISCVOpToken {
    fn from(op: RV32FOpToken) -> RISCVOpToken {
        RISCVOpToken {
            val: op as u8,
            get_opd_set_fn: |v| &OP_LIST[v as usize],
        }
    }
}