@@ -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
234169end
235-
170+ @inline rotl (x :: UInt64 , k :: Int ) = (x << k) | (x >> ( 64 - k))
236171
237172"""
238173```julia
0 commit comments