csa.s 502 B

12345678910111213141516171819202122232425262728293031323334353637
  1. .global csa
  2. ECASE=20
  3. STACK_CLICK=4
  4. csa:
  5. ! jump table address in %o0
  6. ! index in %o1
  7. ld [%o0], %o4 ! default address
  8. ld [%o0+4], %o2
  9. subcc %o1, %o2, %o1 ! index - lower bound
  10. bl 1f
  11. ld [%o0+2*4], %o3
  12. cmp %o1, %o3 ! rel. index, upper - lower bound
  13. bgt 1f
  14. nop
  15. sll %o1, 2, %o5
  16. add %o0, %o5, %o3 ! %o3 = @jump address
  17. ld [%o3+12], %o2 ! %o2 = jump address
  18. tst %o2
  19. be 1f
  20. nop
  21. jmp %o2
  22. nop
  23. 1:
  24. tst %o4
  25. beq 2f
  26. nop
  27. jmp %o4
  28. nop
  29. 2:
  30. mov ECASE, %o0
  31. set trp, %g1
  32. jmp %g1
  33. nop
  34. .align 4