sway_core/language/
asm.rs

1use serde::{Deserialize, Serialize};
2use std::hash::{Hash, Hasher};
3use sway_types::{BaseIdent, Ident, Span};
4
5#[derive(Debug, Clone, Eq, Serialize, Deserialize)]
6pub struct AsmOp {
7    pub(crate) op_name: Ident,
8    pub(crate) op_args: Vec<Ident>,
9    pub(crate) span: Span,
10    pub(crate) immediate: Option<Ident>,
11}
12
13impl AsmOp {
14    pub fn retd(ptr: BaseIdent, len: BaseIdent) -> Self {
15        AsmOp {
16            op_name: Ident::new_no_span("retd".to_string()),
17            op_args: vec![ptr, len],
18            span: Span::dummy(),
19            immediate: None,
20        }
21    }
22}
23
24impl Hash for AsmOp {
25    fn hash<H: Hasher>(&self, state: &mut H) {
26        self.op_name.hash(state);
27        self.op_args.hash(state);
28        if let Some(immediate) = self.immediate.clone() {
29            immediate.hash(state);
30        }
31    }
32}
33
34impl PartialEq for AsmOp {
35    fn eq(&self, other: &Self) -> bool {
36        self.op_name == other.op_name
37            && self.op_args == other.op_args
38            && if let (Some(l), Some(r)) = (self.immediate.clone(), other.immediate.clone()) {
39                l == r
40            } else {
41                true
42            }
43    }
44}
45
46#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
47pub struct AsmRegister {
48    pub(crate) name: String,
49}
50
51impl From<AsmRegister> for String {
52    fn from(register: AsmRegister) -> String {
53        register.name
54    }
55}