Skip to main content

luaur_code_gen/methods/
assembly_builder_a_64_str.rs

1use crate::enums::kind_a_64::KindA64;
2use crate::records::address_a_64::AddressA64;
3use crate::records::assembly_builder_a_64::AssemblyBuilderA64;
4use crate::records::register_a_64::RegisterA64;
5
6impl AssemblyBuilderA64 {
7    pub fn str(&mut self, src: RegisterA64, dst: AddressA64) {
8        assert!(
9            src.kind() == KindA64::x
10                || src.kind() == KindA64::w
11                || src.kind() == KindA64::s
12                || src.kind() == KindA64::d
13                || src.kind() == KindA64::q
14        );
15
16        match src.kind() {
17            KindA64::w => self.place_a(
18                b"str\0".as_ptr() as *const core::ffi::c_char,
19                src,
20                dst,
21                0b10_11100000,
22                2,
23            ),
24            KindA64::x => self.place_a(
25                b"str\0".as_ptr() as *const core::ffi::c_char,
26                src,
27                dst,
28                0b11_11100000,
29                3,
30            ),
31            KindA64::s => self.place_a(
32                b"str\0".as_ptr() as *const core::ffi::c_char,
33                src,
34                dst,
35                0b10_11110000,
36                2,
37            ),
38            KindA64::d => self.place_a(
39                b"str\0".as_ptr() as *const core::ffi::c_char,
40                src,
41                dst,
42                0b11_11110000,
43                3,
44            ),
45            KindA64::q => self.place_a(
46                b"str\0".as_ptr() as *const core::ffi::c_char,
47                src,
48                dst,
49                0b00_11110010,
50                4,
51            ),
52            KindA64::none => unreachable!("Unexpected register kind"),
53        }
54    }
55}