Advertisement
Guest User

Untitled

a guest
Jun 25th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.93 KB | None | 0 0
  1.  
  2. findfirst(cond,vec){for i from 0 to length(vec) {element=vec[i];if(cond(element)){return element}}}
  3.  
  4.  
  5. : findfirst dup length 0 do I 2dup swap getindex dup 4 pick execute if nip nip nip unloop exit then drop drop loop ;
  6.  
  7. need to preserve function arity information to go to assembly
  8. this assembly is just a sketch, not tested
  9.  
  10. % pretend I have 4 registers
  11. % special 2 reg for top of rstack
  12. : findfirst findfirst:
  13. dup mov(stack(0),reg(0)),
  14. length mov(*reg(0),reg(0)),
  15. 0 mov($0,reg(1))
  16.  
  17. do
  18. mov(reg(1),rreg(0)) % reg(1) consumed
  19. mov(reg(0),rreg(1)) % reg(0) consumed HIGHER
  20. loop1:
  21. I mov(rreg(0),reg(0))
  22. 2dup mov(stack(1),reg(1))
  23. mov(stack(0),reg(0))
  24. swap xchg(reg(1),reg(0))
  25. getindex push(rreg(0))
  26. push(rreg(1))
  27. push($here)
  28. push(reg(0))
  29. push(reg(1))
  30. jmp(getindex)
  31. pop(reg(0))
  32. mov(stack(0),rreg(1))
  33. mov(stack(1),rreg(0)
  34. sub($16,%esp)
  35. dup mov(reg(0),reg(1))
  36. 4
  37. pick mov(stack(4),reg(1))
  38. execute push(rreg(0))
  39. push(rreg(1))
  40. push($here)
  41. push(reg(0))
  42. jmp(reg(1))
  43. pop(reg(0))
  44. mov(stack(0),rreg(1))
  45. mov(stack(1),rreg(0))
  46. if jnz(reg(0),$if1)
  47. nip nip nip pop(reg(0))
  48. sub($24,%esp)
  49. unloop % on special stack registers, no need to do anything
  50. exit ret
  51. then if1:
  52. % stack position is from last if - 1
  53. drop drop sub($16,%esp)
  54.  
  55. loop inc(rreg(0))
  56. mov(rreg(0),rreg(2))
  57. sub(rreg(1),rreg(2))
  58. jnz($loop1)
  59. ;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement