Skip to content

Commit b8d9750

Browse files
committed
Update size_of check
1 parent d736361 commit b8d9750

2 files changed

Lines changed: 69 additions & 43 deletions

File tree

fearless_simd/src/generated/simd_types.rs

Lines changed: 63 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -552,7 +552,7 @@ impl<S: Simd> SimdGather<S> for u8x16<S> {
552552
#[inline(always)]
553553
fn gather<T: Copy>(self, src: &[T]) -> Self::Gathered<T> {
554554
assert!(!src.is_empty(), "gather: source slice must not be empty");
555-
let inbounds = if core::mem::size_of::<Self::Element>() <= core::mem::size_of::<usize>()
555+
let inbounds = if core::mem::size_of::<Self::Element>() < core::mem::size_of::<usize>()
556556
&& src.len() > Self::Element::MAX as usize
557557
{
558558
self
@@ -576,7 +576,7 @@ impl<S: Simd> SimdGather<S> for u8x16<S> {
576576
!src.is_empty(),
577577
"gather_into: source slice must not be empty"
578578
);
579-
let inbounds = if core::mem::size_of::<Self::Element>() <= core::mem::size_of::<usize>()
579+
let inbounds = if core::mem::size_of::<Self::Element>() < core::mem::size_of::<usize>()
580580
&& src.len() > Self::Element::MAX as usize
581581
{
582582
self
@@ -602,8 +602,11 @@ impl<S: Simd> SimdScatter<S> for u8x16<S> {
602602
src.len(),
603603
"scatter: source slice must have the same element count as the vector type"
604604
);
605-
assert!(!dst.is_empty(), "scatter: source slice must not be empty");
606-
let inbounds = if core::mem::size_of::<Self::Element>() <= core::mem::size_of::<usize>()
605+
assert!(
606+
!dst.is_empty(),
607+
"scatter: destination slice must not be empty"
608+
);
609+
let inbounds = if core::mem::size_of::<Self::Element>() < core::mem::size_of::<usize>()
607610
&& dst.len() > Self::Element::MAX as usize
608611
{
609612
self
@@ -1090,7 +1093,7 @@ impl<S: Simd> SimdGather<S> for u16x8<S> {
10901093
#[inline(always)]
10911094
fn gather<T: Copy>(self, src: &[T]) -> Self::Gathered<T> {
10921095
assert!(!src.is_empty(), "gather: source slice must not be empty");
1093-
let inbounds = if core::mem::size_of::<Self::Element>() <= core::mem::size_of::<usize>()
1096+
let inbounds = if core::mem::size_of::<Self::Element>() < core::mem::size_of::<usize>()
10941097
&& src.len() > Self::Element::MAX as usize
10951098
{
10961099
self
@@ -1114,7 +1117,7 @@ impl<S: Simd> SimdGather<S> for u16x8<S> {
11141117
!src.is_empty(),
11151118
"gather_into: source slice must not be empty"
11161119
);
1117-
let inbounds = if core::mem::size_of::<Self::Element>() <= core::mem::size_of::<usize>()
1120+
let inbounds = if core::mem::size_of::<Self::Element>() < core::mem::size_of::<usize>()
11181121
&& src.len() > Self::Element::MAX as usize
11191122
{
11201123
self
@@ -1140,8 +1143,11 @@ impl<S: Simd> SimdScatter<S> for u16x8<S> {
11401143
src.len(),
11411144
"scatter: source slice must have the same element count as the vector type"
11421145
);
1143-
assert!(!dst.is_empty(), "scatter: source slice must not be empty");
1144-
let inbounds = if core::mem::size_of::<Self::Element>() <= core::mem::size_of::<usize>()
1146+
assert!(
1147+
!dst.is_empty(),
1148+
"scatter: destination slice must not be empty"
1149+
);
1150+
let inbounds = if core::mem::size_of::<Self::Element>() < core::mem::size_of::<usize>()
11451151
&& dst.len() > Self::Element::MAX as usize
11461152
{
11471153
self
@@ -1652,7 +1658,7 @@ impl<S: Simd> SimdGather<S> for u32x4<S> {
16521658
#[inline(always)]
16531659
fn gather<T: Copy>(self, src: &[T]) -> Self::Gathered<T> {
16541660
assert!(!src.is_empty(), "gather: source slice must not be empty");
1655-
let inbounds = if core::mem::size_of::<Self::Element>() <= core::mem::size_of::<usize>()
1661+
let inbounds = if core::mem::size_of::<Self::Element>() < core::mem::size_of::<usize>()
16561662
&& src.len() > Self::Element::MAX as usize
16571663
{
16581664
self
@@ -1676,7 +1682,7 @@ impl<S: Simd> SimdGather<S> for u32x4<S> {
16761682
!src.is_empty(),
16771683
"gather_into: source slice must not be empty"
16781684
);
1679-
let inbounds = if core::mem::size_of::<Self::Element>() <= core::mem::size_of::<usize>()
1685+
let inbounds = if core::mem::size_of::<Self::Element>() < core::mem::size_of::<usize>()
16801686
&& src.len() > Self::Element::MAX as usize
16811687
{
16821688
self
@@ -1702,8 +1708,11 @@ impl<S: Simd> SimdScatter<S> for u32x4<S> {
17021708
src.len(),
17031709
"scatter: source slice must have the same element count as the vector type"
17041710
);
1705-
assert!(!dst.is_empty(), "scatter: source slice must not be empty");
1706-
let inbounds = if core::mem::size_of::<Self::Element>() <= core::mem::size_of::<usize>()
1711+
assert!(
1712+
!dst.is_empty(),
1713+
"scatter: destination slice must not be empty"
1714+
);
1715+
let inbounds = if core::mem::size_of::<Self::Element>() < core::mem::size_of::<usize>()
17071716
&& dst.len() > Self::Element::MAX as usize
17081717
{
17091718
self
@@ -2782,7 +2791,7 @@ impl<S: Simd> SimdGather<S> for u8x32<S> {
27822791
#[inline(always)]
27832792
fn gather<T: Copy>(self, src: &[T]) -> Self::Gathered<T> {
27842793
assert!(!src.is_empty(), "gather: source slice must not be empty");
2785-
let inbounds = if core::mem::size_of::<Self::Element>() <= core::mem::size_of::<usize>()
2794+
let inbounds = if core::mem::size_of::<Self::Element>() < core::mem::size_of::<usize>()
27862795
&& src.len() > Self::Element::MAX as usize
27872796
{
27882797
self
@@ -2806,7 +2815,7 @@ impl<S: Simd> SimdGather<S> for u8x32<S> {
28062815
!src.is_empty(),
28072816
"gather_into: source slice must not be empty"
28082817
);
2809-
let inbounds = if core::mem::size_of::<Self::Element>() <= core::mem::size_of::<usize>()
2818+
let inbounds = if core::mem::size_of::<Self::Element>() < core::mem::size_of::<usize>()
28102819
&& src.len() > Self::Element::MAX as usize
28112820
{
28122821
self
@@ -2832,8 +2841,11 @@ impl<S: Simd> SimdScatter<S> for u8x32<S> {
28322841
src.len(),
28332842
"scatter: source slice must have the same element count as the vector type"
28342843
);
2835-
assert!(!dst.is_empty(), "scatter: source slice must not be empty");
2836-
let inbounds = if core::mem::size_of::<Self::Element>() <= core::mem::size_of::<usize>()
2844+
assert!(
2845+
!dst.is_empty(),
2846+
"scatter: destination slice must not be empty"
2847+
);
2848+
let inbounds = if core::mem::size_of::<Self::Element>() < core::mem::size_of::<usize>()
28372849
&& dst.len() > Self::Element::MAX as usize
28382850
{
28392851
self
@@ -3351,7 +3363,7 @@ impl<S: Simd> SimdGather<S> for u16x16<S> {
33513363
#[inline(always)]
33523364
fn gather<T: Copy>(self, src: &[T]) -> Self::Gathered<T> {
33533365
assert!(!src.is_empty(), "gather: source slice must not be empty");
3354-
let inbounds = if core::mem::size_of::<Self::Element>() <= core::mem::size_of::<usize>()
3366+
let inbounds = if core::mem::size_of::<Self::Element>() < core::mem::size_of::<usize>()
33553367
&& src.len() > Self::Element::MAX as usize
33563368
{
33573369
self
@@ -3375,7 +3387,7 @@ impl<S: Simd> SimdGather<S> for u16x16<S> {
33753387
!src.is_empty(),
33763388
"gather_into: source slice must not be empty"
33773389
);
3378-
let inbounds = if core::mem::size_of::<Self::Element>() <= core::mem::size_of::<usize>()
3390+
let inbounds = if core::mem::size_of::<Self::Element>() < core::mem::size_of::<usize>()
33793391
&& src.len() > Self::Element::MAX as usize
33803392
{
33813393
self
@@ -3401,8 +3413,11 @@ impl<S: Simd> SimdScatter<S> for u16x16<S> {
34013413
src.len(),
34023414
"scatter: source slice must have the same element count as the vector type"
34033415
);
3404-
assert!(!dst.is_empty(), "scatter: source slice must not be empty");
3405-
let inbounds = if core::mem::size_of::<Self::Element>() <= core::mem::size_of::<usize>()
3416+
assert!(
3417+
!dst.is_empty(),
3418+
"scatter: destination slice must not be empty"
3419+
);
3420+
let inbounds = if core::mem::size_of::<Self::Element>() < core::mem::size_of::<usize>()
34063421
&& dst.len() > Self::Element::MAX as usize
34073422
{
34083423
self
@@ -3934,7 +3949,7 @@ impl<S: Simd> SimdGather<S> for u32x8<S> {
39343949
#[inline(always)]
39353950
fn gather<T: Copy>(self, src: &[T]) -> Self::Gathered<T> {
39363951
assert!(!src.is_empty(), "gather: source slice must not be empty");
3937-
let inbounds = if core::mem::size_of::<Self::Element>() <= core::mem::size_of::<usize>()
3952+
let inbounds = if core::mem::size_of::<Self::Element>() < core::mem::size_of::<usize>()
39383953
&& src.len() > Self::Element::MAX as usize
39393954
{
39403955
self
@@ -3958,7 +3973,7 @@ impl<S: Simd> SimdGather<S> for u32x8<S> {
39583973
!src.is_empty(),
39593974
"gather_into: source slice must not be empty"
39603975
);
3961-
let inbounds = if core::mem::size_of::<Self::Element>() <= core::mem::size_of::<usize>()
3976+
let inbounds = if core::mem::size_of::<Self::Element>() < core::mem::size_of::<usize>()
39623977
&& src.len() > Self::Element::MAX as usize
39633978
{
39643979
self
@@ -3984,8 +3999,11 @@ impl<S: Simd> SimdScatter<S> for u32x8<S> {
39843999
src.len(),
39854000
"scatter: source slice must have the same element count as the vector type"
39864001
);
3987-
assert!(!dst.is_empty(), "scatter: source slice must not be empty");
3988-
let inbounds = if core::mem::size_of::<Self::Element>() <= core::mem::size_of::<usize>()
4002+
assert!(
4003+
!dst.is_empty(),
4004+
"scatter: destination slice must not be empty"
4005+
);
4006+
let inbounds = if core::mem::size_of::<Self::Element>() < core::mem::size_of::<usize>()
39894007
&& dst.len() > Self::Element::MAX as usize
39904008
{
39914009
self
@@ -5086,7 +5104,7 @@ impl<S: Simd> SimdGather<S> for u8x64<S> {
50865104
#[inline(always)]
50875105
fn gather<T: Copy>(self, src: &[T]) -> Self::Gathered<T> {
50885106
assert!(!src.is_empty(), "gather: source slice must not be empty");
5089-
let inbounds = if core::mem::size_of::<Self::Element>() <= core::mem::size_of::<usize>()
5107+
let inbounds = if core::mem::size_of::<Self::Element>() < core::mem::size_of::<usize>()
50905108
&& src.len() > Self::Element::MAX as usize
50915109
{
50925110
self
@@ -5110,7 +5128,7 @@ impl<S: Simd> SimdGather<S> for u8x64<S> {
51105128
!src.is_empty(),
51115129
"gather_into: source slice must not be empty"
51125130
);
5113-
let inbounds = if core::mem::size_of::<Self::Element>() <= core::mem::size_of::<usize>()
5131+
let inbounds = if core::mem::size_of::<Self::Element>() < core::mem::size_of::<usize>()
51145132
&& src.len() > Self::Element::MAX as usize
51155133
{
51165134
self
@@ -5136,8 +5154,11 @@ impl<S: Simd> SimdScatter<S> for u8x64<S> {
51365154
src.len(),
51375155
"scatter: source slice must have the same element count as the vector type"
51385156
);
5139-
assert!(!dst.is_empty(), "scatter: source slice must not be empty");
5140-
let inbounds = if core::mem::size_of::<Self::Element>() <= core::mem::size_of::<usize>()
5157+
assert!(
5158+
!dst.is_empty(),
5159+
"scatter: destination slice must not be empty"
5160+
);
5161+
let inbounds = if core::mem::size_of::<Self::Element>() < core::mem::size_of::<usize>()
51415162
&& dst.len() > Self::Element::MAX as usize
51425163
{
51435164
self
@@ -5637,7 +5658,7 @@ impl<S: Simd> SimdGather<S> for u16x32<S> {
56375658
#[inline(always)]
56385659
fn gather<T: Copy>(self, src: &[T]) -> Self::Gathered<T> {
56395660
assert!(!src.is_empty(), "gather: source slice must not be empty");
5640-
let inbounds = if core::mem::size_of::<Self::Element>() <= core::mem::size_of::<usize>()
5661+
let inbounds = if core::mem::size_of::<Self::Element>() < core::mem::size_of::<usize>()
56415662
&& src.len() > Self::Element::MAX as usize
56425663
{
56435664
self
@@ -5661,7 +5682,7 @@ impl<S: Simd> SimdGather<S> for u16x32<S> {
56615682
!src.is_empty(),
56625683
"gather_into: source slice must not be empty"
56635684
);
5664-
let inbounds = if core::mem::size_of::<Self::Element>() <= core::mem::size_of::<usize>()
5685+
let inbounds = if core::mem::size_of::<Self::Element>() < core::mem::size_of::<usize>()
56655686
&& src.len() > Self::Element::MAX as usize
56665687
{
56675688
self
@@ -5687,8 +5708,11 @@ impl<S: Simd> SimdScatter<S> for u16x32<S> {
56875708
src.len(),
56885709
"scatter: source slice must have the same element count as the vector type"
56895710
);
5690-
assert!(!dst.is_empty(), "scatter: source slice must not be empty");
5691-
let inbounds = if core::mem::size_of::<Self::Element>() <= core::mem::size_of::<usize>()
5711+
assert!(
5712+
!dst.is_empty(),
5713+
"scatter: destination slice must not be empty"
5714+
);
5715+
let inbounds = if core::mem::size_of::<Self::Element>() < core::mem::size_of::<usize>()
56925716
&& dst.len() > Self::Element::MAX as usize
56935717
{
56945718
self
@@ -6212,7 +6236,7 @@ impl<S: Simd> SimdGather<S> for u32x16<S> {
62126236
#[inline(always)]
62136237
fn gather<T: Copy>(self, src: &[T]) -> Self::Gathered<T> {
62146238
assert!(!src.is_empty(), "gather: source slice must not be empty");
6215-
let inbounds = if core::mem::size_of::<Self::Element>() <= core::mem::size_of::<usize>()
6239+
let inbounds = if core::mem::size_of::<Self::Element>() < core::mem::size_of::<usize>()
62166240
&& src.len() > Self::Element::MAX as usize
62176241
{
62186242
self
@@ -6236,7 +6260,7 @@ impl<S: Simd> SimdGather<S> for u32x16<S> {
62366260
!src.is_empty(),
62376261
"gather_into: source slice must not be empty"
62386262
);
6239-
let inbounds = if core::mem::size_of::<Self::Element>() <= core::mem::size_of::<usize>()
6263+
let inbounds = if core::mem::size_of::<Self::Element>() < core::mem::size_of::<usize>()
62406264
&& src.len() > Self::Element::MAX as usize
62416265
{
62426266
self
@@ -6262,8 +6286,11 @@ impl<S: Simd> SimdScatter<S> for u32x16<S> {
62626286
src.len(),
62636287
"scatter: source slice must have the same element count as the vector type"
62646288
);
6265-
assert!(!dst.is_empty(), "scatter: source slice must not be empty");
6266-
let inbounds = if core::mem::size_of::<Self::Element>() <= core::mem::size_of::<usize>()
6289+
assert!(
6290+
!dst.is_empty(),
6291+
"scatter: destination slice must not be empty"
6292+
);
6293+
let inbounds = if core::mem::size_of::<Self::Element>() < core::mem::size_of::<usize>()
62676294
&& dst.len() > Self::Element::MAX as usize
62686295
{
62696296
self

fearless_simd_gen/src/mk_simd_types.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -155,11 +155,10 @@ pub(crate) fn mk_simd_types() -> TokenStream {
155155
fn gather<T: Copy>(self, src: &[T]) -> Self::Gathered<T> {
156156
assert!(!src.is_empty(), "gather: source slice must not be empty");
157157

158-
// Before ensuring the source slice is bigger than `Self::Element::MAX as usize`, we need to
159-
// make sure that's actually a valid cast. We may eventually get an i64/u64 type, which is
160-
// larger than `usize` on 32-bit platforms. If our `Element` type is wider than `usize`, then
161-
// `Element::MAX` will be larger than any possible slice length.
162-
let inbounds = if core::mem::size_of::<Self::Element>() <= core::mem::size_of::<usize>() &&
158+
// Check if the element type is small enough that the slice's length could (and then does)
159+
// exceed its maximum value. The `size_of` check ensures that `Self::Element::MAX as usize` will
160+
// never truncate/wrap.
161+
let inbounds = if core::mem::size_of::<Self::Element>() < core::mem::size_of::<usize>() &&
163162
src.len() > Self::Element::MAX as usize
164163
{
165164
// The slice is big enough to accept any index. For instance, if this is a vector of `u8`s,
@@ -189,7 +188,7 @@ pub(crate) fn mk_simd_types() -> TokenStream {
189188
assert!(!src.is_empty(), "gather_into: source slice must not be empty");
190189

191190
// Same logic as for `gather`. See the comments there.
192-
let inbounds = if core::mem::size_of::<Self::Element>() <= core::mem::size_of::<usize>() &&
191+
let inbounds = if core::mem::size_of::<Self::Element>() < core::mem::size_of::<usize>() &&
193192
src.len() > Self::Element::MAX as usize
194193
{
195194
self
@@ -217,7 +216,7 @@ pub(crate) fn mk_simd_types() -> TokenStream {
217216
assert!(!dst.is_empty(), "scatter: destination slice must not be empty");
218217

219218
// Same logic as for `gather`, but for `dst`. See the comments there.
220-
let inbounds = if core::mem::size_of::<Self::Element>() <= core::mem::size_of::<usize>() &&
219+
let inbounds = if core::mem::size_of::<Self::Element>() < core::mem::size_of::<usize>() &&
221220
dst.len() > Self::Element::MAX as usize
222221
{
223222
self

0 commit comments

Comments
 (0)