@@ -13,7 +13,9 @@ use core::ops::{Deref, DerefMut};
1313///
1414/// Cache lines are assumed to be N bytes long, depending on the architecture:
1515///
16- /// * On x86-64 and aarch64, N = 128.
16+ /// * On x86-64, aarch64, and powerpc64, N = 128.
17+ /// * On arm, mips, mips64, and riscv64, N = 32.
18+ /// * On s390x, N = 256.
1719/// * On all others, N = 64.
1820///
1921/// Note that N is just a reasonable guess and is not guaranteed to match the actual cache line
@@ -64,13 +66,63 @@ use core::ops::{Deref, DerefMut};
6466// - https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf
6567// - https://github.com/facebook/folly/blob/1b5288e6eea6df074758f877c849b6e73bbb9fbb/folly/lang/Align.h#L107
6668//
67- // ARM's big.LITTLE architecture has asymmetric cores and "big" cores have 128 byte cache line size
69+ // ARM's big.LITTLE architecture has asymmetric cores and "big" cores have 128-byte cache line size.
70+ //
6871// Sources:
6972// - https://www.mono-project.com/news/2016/09/12/arm64-icache/
7073//
71- #[ cfg_attr( any( target_arch = "x86_64" , target_arch = "aarch64" ) , repr( align( 128 ) ) ) ]
74+ // powerpc64 has 128-byte cache line size.
75+ //
76+ // Sources:
77+ // - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_ppc64x.go#L9
78+ #[ cfg_attr(
79+ any(
80+ target_arch = "x86_64" ,
81+ target_arch = "aarch64" ,
82+ target_arch = "powerpc64" ,
83+ ) ,
84+ repr( align( 128 ) )
85+ ) ]
86+ // arm, mips, mips64, and riscv64 have 32-byte cache line size.
87+ //
88+ // Sources:
89+ // - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_arm.go#L7
90+ // - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_mips.go#L7
91+ // - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_mipsle.go#L7
92+ // - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_mips64x.go#L9
93+ // - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_riscv64.go#L7
94+ #[ cfg_attr(
95+ any(
96+ target_arch = "arm" ,
97+ target_arch = "mips" ,
98+ target_arch = "mips64" ,
99+ target_arch = "riscv64" ,
100+ ) ,
101+ repr( align( 32 ) )
102+ ) ]
103+ // s390x has 256-byte cache line size.
104+ //
105+ // Sources:
106+ // - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_s390x.go#L7
107+ #[ cfg_attr( target_arch = "s390x" , repr( align( 256 ) ) ) ]
108+ // x86 and wasm have 64-byte cache line size.
109+ //
110+ // Sources:
111+ // - https://github.com/golang/go/blob/dda2991c2ea0c5914714469c4defc2562a907230/src/internal/cpu/cpu_x86.go#L9
112+ // - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_wasm.go#L7
113+ //
114+ // All others are assumed to have 64-byte cache line size.
72115#[ cfg_attr(
73- not( any( target_arch = "x86_64" , target_arch = "aarch64" ) ) ,
116+ not( any(
117+ target_arch = "x86_64" ,
118+ target_arch = "aarch64" ,
119+ target_arch = "powerpc64" ,
120+ target_arch = "arm" ,
121+ target_arch = "mips" ,
122+ target_arch = "mips64" ,
123+ target_arch = "riscv64" ,
124+ target_arch = "s390x" ,
125+ ) ) ,
74126 repr( align( 64 ) )
75127) ]
76128pub struct CachePadded < T > {
0 commit comments