aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXotchkass <78706300+Xotchkass@users.noreply.github.com>2026-01-13 22:11:01 +0200
committerGitHub <noreply@github.com>2026-01-13 21:11:01 +0100
commitedb70a8d7560e003482af5277feb014a1e65251d (patch)
tree0f65fd173eb8d9ac5f2d31c58b8d9a5dd76d7192
parent0c3f3f536bd802ee8cdb0d8cf844c3962513a251 (diff)
optimized slice filling in xoshiro/pcg_random_generator_proc (#6001)
-rw-r--r--core/math/rand/rand_pcg.odin22
-rw-r--r--core/math/rand/rand_xoshiro256.odin22
2 files changed, 26 insertions, 18 deletions
diff --git a/core/math/rand/rand_pcg.odin b/core/math/rand/rand_pcg.odin
index 009e139be..79c18acbb 100644
--- a/core/math/rand/rand_pcg.odin
+++ b/core/math/rand/rand_pcg.odin
@@ -55,16 +55,20 @@ pcg_random_generator_proc :: proc(data: rawptr, mode: runtime.Random_Generator_M
intrinsics.unaligned_store((^u64)(raw_data(p)), read_u64(r))
case:
// All other cases.
- pos := i8(0)
- val := u64(0)
- for &v in p {
- if pos == 0 {
- val = read_u64(r)
- pos = 8
+ n := len(p) / size_of(u64)
+ buff := ([^]u64)(raw_data(p))[:n]
+ for &e in buff {
+ intrinsics.unaligned_store(&e, read_u64(r))
+ }
+ // Handle remaining bytes
+ rem := len(p) % size_of(u64)
+ if rem > 0 {
+ val := read_u64(r)
+ tail := p[len(p) - rem:]
+ for &b in tail {
+ b = byte(val)
+ val >>= 8
}
- v = byte(val)
- val >>= 8
- pos -= 1
}
}
diff --git a/core/math/rand/rand_xoshiro256.odin b/core/math/rand/rand_xoshiro256.odin
index 54dd02130..7326ba8d5 100644
--- a/core/math/rand/rand_xoshiro256.odin
+++ b/core/math/rand/rand_xoshiro256.odin
@@ -74,16 +74,20 @@ xoshiro256_random_generator_proc :: proc(data: rawptr, mode: runtime.Random_Gene
intrinsics.unaligned_store((^u64)(raw_data(p)), read_u64(r))
case:
// All other cases.
- pos := i8(0)
- val := u64(0)
- for &v in p {
- if pos == 0 {
- val = read_u64(r)
- pos = 8
+ n := len(p) / size_of(u64)
+ buff := ([^]u64)(raw_data(p))[:n]
+ for &e in buff {
+ intrinsics.unaligned_store(&e, read_u64(r))
+ }
+ // Handle remaining bytes
+ rem := len(p) % size_of(u64)
+ if rem > 0 {
+ val := read_u64(r)
+ tail := p[len(p) - rem:]
+ for &b in tail {
+ b = byte(val)
+ val >>= 8
}
- v = byte(val)
- val >>= 8
- pos -= 1
}
}