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
use crate::ir::{macros::cpa, Scope, Variable, Vectorization};
use serde::{Deserialize, Serialize};

/// Write to a global array.
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[allow(missing_docs)]
pub struct WriteGlobal {
    pub input: Variable,
    pub global: Variable,
    pub position: Variable,
}

impl WriteGlobal {
    #[allow(missing_docs)]
    pub fn expand(self, scope: &mut Scope) {
        let output = self.global;
        let input = self.input;
        let position = self.position;

        cpa!(scope, output[position] = input);
    }

    pub(crate) fn vectorize(&self, vectorization: Vectorization) -> Self {
        Self {
            input: self.input.vectorize(vectorization),
            global: self.global.vectorize(vectorization),
            position: self.position,
        }
    }
}