Files
ivy/doc/example.asm

242 lines
3.3 KiB
NASM
Raw Permalink Normal View History

2024-11-02 15:11:00 +00:00
@msgh (net.doorstuck.test.Person) [-init(name:age:)]
ldr x0, [bp, #-1]
str x0, [self, #0]
ldr x0, [bp, #-2]
str x0, [self, #1]
ret
@end
@msgh (net.doorstuck.test.Person) [-name]
ldr x0, [self, #0]
ret
@end
@msgh (net.doorstuck.test.Person) [-age]
ldr x0, [self, #1]
ret
@end
@msgh (net.doorstuck.test.Person) [-ageInMonths]
ldr x0, [self, #1]
ldr x1, #12
mul x0, x0, x1
ret
@end
@msgh (net.doorstuck.test.Person) [-setName:]
ldr x0, [bp, #-1]
str x0, [self, #0]
ret
@end
@msgh (net.doorstuck.test.Person) [-setAge:]
ldr x0, [bp, #-1]
str x0, [self, #1]
ret
@end
@msgh (net.doorstuck.test.Person) [-setAge:in:]
ldr x0, [bp, #-1]
ldr x1, "years"
cmp x0, x1
b.eq $L0001
ldr x1, "months"
cmp x0, x1
b.eq $L0002
ldr x1, "days"
cmp x0, x1
b.eq $L0003
; else
ldr x2, #0
str x2, [self, #1]
br $L0004
; if units == "years"
L0001: str x0, [self, #1]
br $L0004
; if units == "months"
L0002: ldr x2, #12
div x0, x0, x2
str x0, [self, #1]
br $L0004
; if units == "days"
L0003: ldr x2, #365
div x0, x0, x2
str x0, [self, #1]
; end
L0004:
ret
@end
@lambda (Lx0001) [_:]
ldr x1, @ident[cout]
ldr x2, [bp, #-1]
ldr x3, "Count is "
add x3, x3, x2
push x3
msg x1, @selector[-put:]
ret
@end
@lambda (Lx0002) []
ldr x1, @ident[cout]
ldr x2, "True!"
push x2
msg x1, @selector[-put:]
@end
@lambda (Lx0003) []
ldr x1, @ident[cout]
ldr x2, "False!"
push x2
msg x1, @selector[-put:]
@end
@init
rsv #3 ; 3 local variables
/* stack layout is now this:
bp[1] = p1
bp[2] = i
bp[3] = j
*/
; p1 = Person new(name:"John Doe", age:34)
ldr x0, #34
push x0
ldr x0, "John Doe"
push x0
ob.c x1, x1
msg x1, @selector[-init(name:age:)] ; x0 = new Person object
str x1, [bp, #1] ; p1 = new Person object
; p1 setAge:100 in:"months"
; p1 is already loaded in x1, no need to load it again
ldr x2, @selector[-setAge:in:]
ldr x3, "months"
push x3
ldr x3, #100
push x3
msg x1, @selector[-setAge:in:] ; x0 = null
ldr x3, #0
str x3, [bp, #2] ; i = 0
; (while i < 10) begin
L0001: ldr x2, @ident[cout] ; x5 = cout
ldr x4, "Count is "
add x4, x4, x3 ; append i (in x4) to "Count is " (in x7)
push x4
msg x2, @selector[-put:]
add x3, x3, #2
cmp x3, #100
b.lt $L0001
; (while i < 0) end
; for i in 0 to:100 step:2
ldr x4, #2
push x4
ldr x4, #100
push x4
ldr x4, #0
msg x5, @selector[-to:step:]
mov x5, x0 ; x5 = (0 to:100 step:2) -> iterator
; (for i in 0 to:100 step:2) begin
L0002: it.v x5 ; is iterator still valid?
b.z $L0003
it.g x4, x5 ; get current iterator value
ldr x6, "Count is "
add x6, x6, x4 ; append i (in x4) to "Count is " (in x6)
ldr x7, @ident[cout]
push x6
msg x7, @selector[-put:]
it.n x5 ; Advance iterator
br $L0002
; (for i in 0 to:100 step:2) end
L0003: ob.e x5 ; Clean up iterator
lam.c x5, @lambda[Lx0001] ; x5 = [ _:i | cout put:'Count: {i}' ],
push x5
ldr x5, #2
push x5
ldr x5, #100
push x5
ldr x5, #0
msg x5, @selector[-to:step:do:]
ldr x5, #32
str x5, [bp, #3] ; (x5) j = 32
ldr x6, [bp, #1] ; (x6) i
c.lt x5, x6, x5
lam.c x6, @lambda[Lx0003]
push x6
lam.c x6, @lambda[Lx0002]
push x6
msg x5, @selector[-if:else:]
ldr x5, [bp, #2] ; (x5) j
ldr x6, [bp, #1] ; (x6) i
cmp x6, x5
b.ge $L0004
ldr x5, "True!"
push x5
ldr x5, @ident[cout]
msg x5, @selector[-put:]
L0004: ret
@end