; Compute the sieve of an integer
; @param(0) the integer argument
; @local(1) the boolean array
; @local(2) the current index
; @local(3) the limit
; @local(4) the other index
.method public static sieve(I)[Z
.limit stack 8
.limit locals 8
iload_0
iconst_1
iadd
newarray boolean
astore_1
iload_0
i2d
invokestatic java/lang/Math.sqrt(D)D
d2i
iconst_1
iadd
istore_3
iconst_2
istore 4
aload_1
iconst_0
iconst_1
bastore
aload_1
iconst_1
iconst_1
bastore
aload_1
iconst_2
iconst_0
bastore
bipush 4
istore_2
initialization_loop:
iload_2
iload_0
if_icmpgt initialization_loop_breakpoint
aload_1
iload_2
iconst_0
bastore
iinc 2 1
goto initialization_loop
initialization_loop_breakpoint:
iconst_2
istore_2
loop:
iload_2
iload_3
if_icmpge loop_breakpoint
aload_1
iload_2
baload
ifne inner_loop_breakpoint
iload_2
iload_2
imul
istore 4
inner_loop:
iload 4
iload_0
if_icmpgt inner_loop_breakpoint
aload_1
iload 4
iconst_1
bastore
iload 4
iload_2
iadd
istore 4
goto inner_loop
inner_loop_breakpoint:
iinc 2 1
goto loop
loop_breakpoint:
aload_1
areturn
.end method
; @locals
; @param(0) the array argument
; @local(1) the count
; @local(2) the current index
; @local(3) the array argument length
.method public static falseCount([Z)I
.limit stack 4
.limit locals 4
iconst_0
istore_1
iconst_0
istore_2
aload_0
arraylength
istore_3
loop:
iload_2
iload_3
if_icmpge loop_breakpoint
aload_0
iload_2
baload
ifeq is_false
goto is_false_breakpoint
is_false:
iinc 1 1
is_false_breakpoint:
iinc 2 1
goto loop
loop_breakpoint:
iload_1
ireturn
.end method
; Get the true indices of a boolean array
; @param(0) the argument array
; @local(1) the return array
; @local(2) the current index
; @local(3) the argument array length
; @local(4) the return array index
.method public static falseIndices([Z)[I
.limit stack 4
.limit locals 5
aload_0
invokestatic Sieve/falseCount([Z)I
newarray int
astore_1
iconst_0
istore_2
aload_0
arraylength
istore_3
iconst_0
istore 4
loop:
iload_2
iload_3
if_icmpge loop_breakpoint
aload_0
iload_2
baload
ifeq is_false
goto is_false_breakpoint
is_false:
aload_1
iload 4
iload_2
iastore
iinc 4 1
is_false_breakpoint:
iinc 2 1
goto loop
loop_breakpoint:
aload_1
areturn
.end method
Friday, January 14, 2022
Sieve of Eratosthenes in Jasmin
I have hand written a number of programs in pure Java bytecode. So for example, the sieve which I implemented before in Java is something I have written out in bytecode before by hand. In particular, what you will notice about this code is the high amount of documentation and structure for JVM bytecode.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment