23 {
24
27
28
29
33
34
35 x_frac_vec = fl::simd::sll_u32_4(x_frac_vec, 8);
36 y_frac_vec = fl::simd::sll_u32_4(y_frac_vec, 8);
37
38
40 X_vec = fl::simd::and_u32_4(X_vec, mask_255);
41 Y_vec = fl::simd::and_u32_4(Y_vec, mask_255);
42
43
44
45
46
47
49 auto lane = [&](int i) -> fl::i32 {
50 fl::u32 Xi = fl::simd::extract_u32_4(X_vec, i);
51 fl::u32 Yi = fl::simd::extract_u32_4(Y_vec, i);
52 fl::i32 xf = static_cast<fl::i32>(fl::simd::extract_u32_4(x_frac_vec, i));
53 fl::i32 yf = static_cast<fl::i32>(fl::simd::extract_u32_4(y_frac_vec, i));
54
57
58 int A = perm[Xi & 255] + Yi;
59 int AA = perm[A & 255];
60 int AB = perm[(A + 1) & 255];
61 int B = perm[(Xi + 1) & 255] + Yi;
62 int BA = perm[
B & 255];
63 int BB = perm[(
B + 1) & 255];
64
72 };
73 return fl::simd::set_u32_4(
74 static_cast<fl::u32>(lane(0)), static_cast<fl::u32>(lane(1)),
75 static_cast<fl::u32>(lane(2)), static_cast<fl::u32>(lane(3)));
76
77}
static constexpr int FRAC_BITS
platforms::simd_u32x4 simd_u32x4
static constexpr fl::i32 FP_ONE
static constexpr int HP_BITS
static constexpr int FP_BITS
static constexpr fl::i32 HP_ONE
static fl::i32 fade(fl::i32 t, const fl::i32 *table) FL_NO_EXCEPT
static fl::i32 grad(int hash, fl::i32 x, fl::i32 y) FL_NO_EXCEPT
static fl::i32 lerp(fl::i32 t, fl::i32 a, fl::i32 b) FL_NO_EXCEPT