Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- findfirst(cond,vec){for i from 0 to length(vec) {element=vec[i];if(cond(element)){return element}}}
- : findfirst dup length 0 do I 2dup swap getindex dup 4 pick execute if nip nip nip unloop exit then drop drop loop ;
- need to preserve function arity information to go to assembly
- this assembly is just a sketch, not tested
- % pretend I have 4 registers
- % special 2 reg for top of rstack
- : findfirst findfirst:
- dup mov(stack(0),reg(0)),
- length mov(*reg(0),reg(0)),
- 0 mov($0,reg(1))
- do
- mov(reg(1),rreg(0)) % reg(1) consumed
- mov(reg(0),rreg(1)) % reg(0) consumed HIGHER
- loop1:
- I mov(rreg(0),reg(0))
- 2dup mov(stack(1),reg(1))
- mov(stack(0),reg(0))
- swap xchg(reg(1),reg(0))
- getindex push(rreg(0))
- push(rreg(1))
- push($here)
- push(reg(0))
- push(reg(1))
- jmp(getindex)
- pop(reg(0))
- mov(stack(0),rreg(1))
- mov(stack(1),rreg(0)
- sub($16,%esp)
- dup mov(reg(0),reg(1))
- 4
- pick mov(stack(4),reg(1))
- execute push(rreg(0))
- push(rreg(1))
- push($here)
- push(reg(0))
- jmp(reg(1))
- pop(reg(0))
- mov(stack(0),rreg(1))
- mov(stack(1),rreg(0))
- if jnz(reg(0),$if1)
- nip nip nip pop(reg(0))
- sub($24,%esp)
- unloop % on special stack registers, no need to do anything
- exit ret
- then if1:
- % stack position is from last if - 1
- drop drop sub($16,%esp)
- loop inc(rreg(0))
- mov(rreg(0),rreg(2))
- sub(rreg(1),rreg(2))
- jnz($loop1)
- ;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement