setjmp.S 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. /* setjmp for LoongArch64.
  2. Copyright (C) 2024 uClibc-ng contributors.
  3. Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
  4. */
  5. #include <sysdep.h>
  6. #include <sys/asm.h>
  7. ENTRY (_setjmp)
  8. li.w $a1, 0
  9. b HIDDEN_JUMPTARGET (__sigsetjmp)
  10. END (_setjmp)
  11. ENTRY (setjmp)
  12. li.w $a1, 1
  13. /* Fallthrough */
  14. END (setjmp)
  15. ENTRY (__sigsetjmp)
  16. REG_S $ra, $a0, 0*SZREG
  17. REG_S $sp, $a0, 1*SZREG
  18. REG_S $r21, $a0, 2*SZREG
  19. REG_S $fp, $a0, 3*SZREG
  20. REG_S $s0, $a0, 4*SZREG
  21. REG_S $s1, $a0, 5*SZREG
  22. REG_S $s2, $a0, 6*SZREG
  23. REG_S $s3, $a0, 7*SZREG
  24. REG_S $s4, $a0, 8*SZREG
  25. REG_S $s5, $a0, 9*SZREG
  26. REG_S $s6, $a0, 10*SZREG
  27. REG_S $s7, $a0, 11*SZREG
  28. REG_S $s8, $a0, 12*SZREG
  29. #ifndef __loongarch_soft_float
  30. FREG_S $fs0, $a0, 13*SZREG + 0*SZFREG
  31. FREG_S $fs1, $a0, 13*SZREG + 1*SZFREG
  32. FREG_S $fs2, $a0, 13*SZREG + 2*SZFREG
  33. FREG_S $fs3, $a0, 13*SZREG + 3*SZFREG
  34. FREG_S $fs4, $a0, 13*SZREG + 4*SZFREG
  35. FREG_S $fs5, $a0, 13*SZREG + 5*SZFREG
  36. FREG_S $fs6, $a0, 13*SZREG + 6*SZFREG
  37. FREG_S $fs7, $a0, 13*SZREG + 7*SZFREG
  38. #endif
  39. #if !IS_IN_libc && IS_IN_rtld
  40. /* In ld.so we never save the signal mask. */
  41. li.w $a0, 0
  42. jr $ra
  43. #else
  44. /* Make a tail call to __sigjmp_save; it takes the same args. */
  45. b __sigjmp_save
  46. #endif
  47. END (__sigsetjmp)
  48. hidden_def (__sigsetjmp)
  49. weak_alias (_setjmp, __GI__setjmp)