@@ -50,54 +50,65 @@ unsafe fn remainder(mut c: u32, mut buf: &[u8]) -> u32 {
5050 c
5151}
5252
53+ cfg_select ! {
54+ miri => {
55+ use core:: arch:: aarch64:: { __crc32b, __crc32h, __crc32d, __crc32w} ;
56+ }
57+ _ => {
58+ use asm:: { __crc32b, __crc32h, __crc32d, __crc32w} ;
59+ }
60+ }
61+
5362// FIXME the intrinsics below are stable since rust 1.80.0: remove these and use the standard
5463// library versions once our MSRV reaches that version.
55-
56- /// CRC32 single round checksum for bytes (8 bits).
57- ///
58- /// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/__crc32b)
59- #[ target_feature( enable = "crc" ) ]
60- #[ cfg_attr( target_arch = "arm" , target_feature( enable = "v8" ) ) ]
61- unsafe fn __crc32b ( mut crc : u32 , data : u8 ) -> u32 {
62- unsafe {
63- core:: arch:: asm!( "crc32b {crc:w}, {crc:w}, {data:w}" , crc = inout( reg) crc, data = in( reg) data) ;
64- crc
64+ mod asm {
65+
66+ /// CRC32 single round checksum for bytes (8 bits).
67+ ///
68+ /// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/__crc32b)
69+ #[ target_feature( enable = "crc" ) ]
70+ #[ cfg_attr( target_arch = "arm" , target_feature( enable = "v8" ) ) ]
71+ unsafe fn __crc32b ( mut crc : u32 , data : u8 ) -> u32 {
72+ unsafe {
73+ core:: arch:: asm!( "crc32b {crc:w}, {crc:w}, {data:w}" , crc = inout( reg) crc, data = in( reg) data) ;
74+ crc
75+ }
6576 }
66- }
6777
68- /// CRC32 single round checksum for half words (16 bits).
69- ///
70- /// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/__crc32h)
71- #[ target_feature( enable = "crc" ) ]
72- #[ cfg_attr( target_arch = "arm" , target_feature( enable = "v8" ) ) ]
73- unsafe fn __crc32h ( mut crc : u32 , data : u16 ) -> u32 {
74- unsafe {
75- core:: arch:: asm!( "crc32h {crc:w}, {crc:w}, {data:w}" , crc = inout( reg) crc, data = in( reg) data) ;
76- crc
78+ /// CRC32 single round checksum for half words (16 bits).
79+ ///
80+ /// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/__crc32h)
81+ #[ target_feature( enable = "crc" ) ]
82+ #[ cfg_attr( target_arch = "arm" , target_feature( enable = "v8" ) ) ]
83+ unsafe fn __crc32h ( mut crc : u32 , data : u16 ) -> u32 {
84+ unsafe {
85+ core:: arch:: asm!( "crc32h {crc:w}, {crc:w}, {data:w}" , crc = inout( reg) crc, data = in( reg) data) ;
86+ crc
87+ }
7788 }
78- }
7989
80- /// CRC32 single round checksum for words (32 bits).
81- ///
82- /// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/__crc32w)
83- #[ target_feature( enable = "crc" ) ]
84- #[ cfg_attr( target_arch = "arm" , target_feature( enable = "v8" ) ) ]
85- pub unsafe fn __crc32w ( mut crc : u32 , data : u32 ) -> u32 {
86- unsafe {
87- core:: arch:: asm!( "crc32w {crc:w}, {crc:w}, {data:w}" , crc = inout( reg) crc, data = in( reg) data) ;
88- crc
90+ /// CRC32 single round checksum for words (32 bits).
91+ ///
92+ /// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/__crc32w)
93+ #[ target_feature( enable = "crc" ) ]
94+ #[ cfg_attr( target_arch = "arm" , target_feature( enable = "v8" ) ) ]
95+ pub unsafe fn __crc32w ( mut crc : u32 , data : u32 ) -> u32 {
96+ unsafe {
97+ core:: arch:: asm!( "crc32w {crc:w}, {crc:w}, {data:w}" , crc = inout( reg) crc, data = in( reg) data) ;
98+ crc
99+ }
89100 }
90- }
91101
92- /// CRC32 single round checksum for double words (64 bits).
93- ///
94- /// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/__crc32d)
95- #[ cfg( target_arch = "aarch64" ) ]
96- #[ target_feature( enable = "crc" ) ]
97- unsafe fn __crc32d ( mut crc : u32 , data : u64 ) -> u32 {
98- unsafe {
99- core:: arch:: asm!( "crc32x {crc:w}, {crc:w}, {data:x}" , crc = inout( reg) crc, data = in( reg) data) ;
100- crc
102+ /// CRC32 single round checksum for double words (64 bits).
103+ ///
104+ /// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/__crc32d)
105+ #[ cfg( target_arch = "aarch64" ) ]
106+ #[ target_feature( enable = "crc" ) ]
107+ unsafe fn __crc32d ( mut crc : u32 , data : u64 ) -> u32 {
108+ unsafe {
109+ core:: arch:: asm!( "crc32x {crc:w}, {crc:w}, {data:x}" , crc = inout( reg) crc, data = in( reg) data) ;
110+ crc
111+ }
101112 }
102113}
103114
0 commit comments