Currently, the only way to write a large amount of data into volatile memory is through iterating through individual VolAddress and writing a single T to memory one after another.
I've not inspected myself the generated code, but it seems reasonable to assume this results in slower than optimal code (it seems fast, so maybe it actually is optimizing it!) I've read your amazing writeup on how to hand optimize load/store ASM code, and it seems reasonable that a write_slice and read_slice methods could make use of better intrinsics such as volatile_copy_memory and volatile_set_memory (Using a pointer cast might just work??)
impl VolBlock {
pub fn write_slice_at_offset(self, offset: usize, slice: &[T]) {
//...
}
pub fn read_slice_at_offset<const L: usize>(self, offset: usize) -> [T; L] {
//...
}
pub fn write_slice(self, slice: &[T]) {
//...
}
pub fn read_slice<const L: usize>(self) -> [T; L] {
//...
}
}
I've written already such methods (though without optimizations, just the API) and I'd be happy to contribute it back if this is wanted.
Currently, the only way to write a large amount of data into volatile memory is through iterating through individual
VolAddressand writing a singleTto memory one after another.I've not inspected myself the generated code, but it seems reasonable to assume this results in slower than optimal code (it seems fast, so maybe it actually is optimizing it!) I've read your amazing writeup on how to hand optimize load/store ASM code, and it seems reasonable that a
write_sliceandread_slicemethods could make use of better intrinsics such asvolatile_copy_memoryandvolatile_set_memory(Using a pointer cast might just work??)I've written already such methods (though without optimizations, just the API) and I'd be happy to contribute it back if this is wanted.