Skip to content

Commit 38955d0

Browse files
committed
Switch xoshiro256✴︎✴︎ implementation to pure Julia
1 parent 225dcef commit 38955d0

File tree

1 file changed

+26
-91
lines changed

1 file changed

+26
-91
lines changed

src/staticrng.jl

Lines changed: 26 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -141,98 +141,33 @@ julia> rand(rng) # Draw a `Float64` between 0 and 1
141141
"""
142142
@inline xoshiro256✴︎✴︎(rng::StaticRNG{4}) = GC.@preserve rng xoshiro256✴︎✴︎(pointer(rng))
143143
@inline function xoshiro256✴︎✴︎(state::Ptr{UInt64})
144-
Base.llvmcall(("""
145-
; Function Attrs: noinline nounwind ssp uwtable
146-
define i64 @next(i64) #0 {
147-
%ptr = inttoptr i64 %0 to i64*
148-
%2 = alloca i64*, align 8
149-
%3 = alloca i64, align 8
150-
%4 = alloca i64, align 8
151-
store i64* %ptr, i64** %2, align 8
152-
%5 = load i64*, i64** %2, align 8
153-
%6 = getelementptr inbounds i64, i64* %5, i64 1
154-
%7 = load i64, i64* %6, align 8
155-
%8 = mul i64 %7, 5
156-
%9 = call i64 @rotl(i64 %8, i32 7)
157-
%10 = mul i64 %9, 9
158-
store i64 %10, i64* %3, align 8
159-
%11 = load i64*, i64** %2, align 8
160-
%12 = getelementptr inbounds i64, i64* %11, i64 1
161-
%13 = load i64, i64* %12, align 8
162-
%14 = shl i64 %13, 17
163-
store i64 %14, i64* %4, align 8
164-
%15 = load i64*, i64** %2, align 8
165-
%16 = getelementptr inbounds i64, i64* %15, i64 0
166-
%17 = load i64, i64* %16, align 8
167-
%18 = load i64*, i64** %2, align 8
168-
%19 = getelementptr inbounds i64, i64* %18, i64 2
169-
%20 = load i64, i64* %19, align 8
170-
%21 = xor i64 %20, %17
171-
store i64 %21, i64* %19, align 8
172-
%22 = load i64*, i64** %2, align 8
173-
%23 = getelementptr inbounds i64, i64* %22, i64 1
174-
%24 = load i64, i64* %23, align 8
175-
%25 = load i64*, i64** %2, align 8
176-
%26 = getelementptr inbounds i64, i64* %25, i64 3
177-
%27 = load i64, i64* %26, align 8
178-
%28 = xor i64 %27, %24
179-
store i64 %28, i64* %26, align 8
180-
%29 = load i64*, i64** %2, align 8
181-
%30 = getelementptr inbounds i64, i64* %29, i64 2
182-
%31 = load i64, i64* %30, align 8
183-
%32 = load i64*, i64** %2, align 8
184-
%33 = getelementptr inbounds i64, i64* %32, i64 1
185-
%34 = load i64, i64* %33, align 8
186-
%35 = xor i64 %34, %31
187-
store i64 %35, i64* %33, align 8
188-
%36 = load i64*, i64** %2, align 8
189-
%37 = getelementptr inbounds i64, i64* %36, i64 3
190-
%38 = load i64, i64* %37, align 8
191-
%39 = load i64*, i64** %2, align 8
192-
%40 = getelementptr inbounds i64, i64* %39, i64 0
193-
%41 = load i64, i64* %40, align 8
194-
%42 = xor i64 %41, %38
195-
store i64 %42, i64* %40, align 8
196-
%43 = load i64, i64* %4, align 8
197-
%44 = load i64*, i64** %2, align 8
198-
%45 = getelementptr inbounds i64, i64* %44, i64 2
199-
%46 = load i64, i64* %45, align 8
200-
%47 = xor i64 %46, %43
201-
store i64 %47, i64* %45, align 8
202-
%48 = load i64*, i64** %2, align 8
203-
%49 = getelementptr inbounds i64, i64* %48, i64 3
204-
%50 = load i64, i64* %49, align 8
205-
%51 = call i64 @rotl(i64 %50, i32 45)
206-
%52 = load i64*, i64** %2, align 8
207-
%53 = getelementptr inbounds i64, i64* %52, i64 3
208-
store i64 %51, i64* %53, align 8
209-
%54 = load i64, i64* %3, align 8
210-
ret i64 %54
211-
}
212-
213-
; Function Attrs: noinline nounwind ssp uwtable
214-
define internal i64 @rotl(i64, i32) #0 {
215-
%3 = alloca i64, align 8
216-
%4 = alloca i32, align 4
217-
store i64 %0, i64* %3, align 8
218-
store i32 %1, i32* %4, align 4
219-
%5 = load i64, i64* %3, align 8
220-
%6 = load i32, i32* %4, align 4
221-
%7 = zext i32 %6 to i64
222-
%8 = shl i64 %5, %7
223-
%9 = load i64, i64* %3, align 8
224-
%10 = load i32, i32* %4, align 4
225-
%11 = sub nsw i32 64, %10
226-
%12 = zext i32 %11 to i64
227-
%13 = lshr i64 %9, %12
228-
%14 = or i64 %8, %13
229-
ret i64 %14
230-
}
231-
232-
attributes #0 = { noinline nounwind ssp uwtable }
233-
""", "next"), UInt64, Tuple{Ptr{UInt64}}, state)
144+
# Retrieve state from pointer
145+
s1 = Base.unsafe_load(state, 1)
146+
s2 = Base.unsafe_load(state, 2)
147+
s3 = Base.unsafe_load(state, 3)
148+
s4 = Base.unsafe_load(state, 4)
149+
150+
# Calculate the result we will return this time
151+
result = rotl(s2 * 5, 7) * 9
152+
153+
# Prepare the next state
154+
t = s2 << 17
155+
s3 ⊻= s1
156+
s4 ⊻= s2
157+
s2 ⊻= s3
158+
s1 ⊻= s4
159+
s3 ⊻= t
160+
s4 = rotl(s4, 45)
161+
162+
# Store state
163+
Base.unsafe_store!(state, s1, 1)
164+
Base.unsafe_store!(state, s2, 2)
165+
Base.unsafe_store!(state, s3, 3)
166+
Base.unsafe_store!(state, s4, 4)
167+
168+
return result
234169
end
235-
170+
@inline rotl(x::UInt64, k::Int) = (x << k) | (x >> (64 - k))
236171

237172
"""
238173
```julia

0 commit comments

Comments
 (0)