los.s 820 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #
  2. ! $Source$
  3. ! $State$
  4. ! $Revision$
  5. #include "powerpc.h"
  6. .sect .text
  7. ! Loads a variable-sized structure onto the stack.
  8. !
  9. ! r3 = size
  10. ! r4 = address
  11. .define .los
  12. .los:
  13. ! These sizes are handled specially.
  14. cmpi cr0, 0, r3, 1
  15. bc IFFALSE, GT, size1
  16. cmpi cr0, 0, r3, 2
  17. bc IFFALSE, GT, size2
  18. cmpi cr0, 0, r3, 4
  19. bc IFFALSE, GT, size4
  20. ! Variable-sized structure.
  21. addi r3, r3, 3
  22. andi. r3, r3, ~3 ! align size
  23. add r4, r4, r3 ! adjust address to top of block
  24. srawi r3, r3, 2 ! convert size to the number of words
  25. mtspr ctr, r3
  26. 1:
  27. lwzu r5, -4(r4)
  28. stwu r5, -4(sp)
  29. bc DNZ, 0, 1b ! decrement CTR, jump if non-zero
  30. bclr ALWAYS, 0, 0
  31. size1:
  32. lbz r3, 0(r4)
  33. b 1f
  34. size2:
  35. lhz r3, 0(r4)
  36. b 1f
  37. size4:
  38. lwz r3, 0(r4)
  39. 1:
  40. stwu r3, -4(sp)
  41. bclr ALWAYS, 0, 0