(
&mut self,
dst: Self::Value,
_dst_align: Align,
src: Self::Value,
_src_align: Align,
size: Self::Value,
flags: MemFlags,
)
| 1921 | } |
| 1922 | |
| 1923 | fn memcpy( |
| 1924 | &mut self, |
| 1925 | dst: Self::Value, |
| 1926 | _dst_align: Align, |
| 1927 | src: Self::Value, |
| 1928 | _src_align: Align, |
| 1929 | size: Self::Value, |
| 1930 | flags: MemFlags, |
| 1931 | ) { |
| 1932 | if flags != MemFlags::empty() { |
| 1933 | self.err(&format!( |
| 1934 | "memcpy with mem flags is not supported yet: {flags:?}" |
| 1935 | )); |
| 1936 | } |
| 1937 | let const_size = self.builder.lookup_const_u64(size); |
| 1938 | if const_size == Some(0) { |
| 1939 | // Nothing to do! |
| 1940 | return; |
| 1941 | } |
| 1942 | let src_pointee = match self.lookup_type(src.ty) { |
| 1943 | SpirvType::Pointer { pointee } => Some(pointee), |
| 1944 | _ => None, |
| 1945 | }; |
| 1946 | let src_element_size = src_pointee.and_then(|p| self.lookup_type(p).sizeof(self)); |
| 1947 | if src_element_size.is_some() && src_element_size == const_size.map(Size::from_bytes) { |
| 1948 | if let Some(const_value) = src.const_fold_load(self) { |
| 1949 | self.store(const_value, dst, Align::from_bytes(0).unwrap()); |
| 1950 | } else { |
| 1951 | self.emit() |
| 1952 | .copy_memory(dst.def(self), src.def(self), None, None, empty()) |
| 1953 | .unwrap(); |
| 1954 | } |
| 1955 | } else { |
| 1956 | self.emit() |
| 1957 | .copy_memory_sized( |
| 1958 | dst.def(self), |
| 1959 | src.def(self), |
| 1960 | size.def(self), |
| 1961 | None, |
| 1962 | None, |
| 1963 | empty(), |
| 1964 | ) |
| 1965 | .unwrap(); |
| 1966 | self.zombie(dst.def(self), "cannot memcpy dynamically sized data"); |
| 1967 | } |
| 1968 | } |
| 1969 | |
| 1970 | fn memmove( |
| 1971 | &mut self, |
no test coverage detected