invokeNative_arc.s 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. /*
  2. * Copyright (C) 2019 Intel Corporation. All rights reserved.
  3. * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. */
  5. .text
  6. .align 2
  7. #ifndef BH_PLATFORM_DARWIN
  8. .globl invokeNative
  9. .type invokeNative, function
  10. invokeNative:
  11. #else
  12. .globl _invokeNative
  13. _invokeNative:
  14. #endif /* end of BH_PLATFORM_DARWIN */
  15. /*
  16. * Arguments passed in:
  17. * r0: function ptr
  18. * r1: argv
  19. * r2: nstacks
  20. * ARC ABI:
  21. * r0-r7: function arguments, caller-saved
  22. * r8-r12: temp registers, caller-saved
  23. */
  24. push_s blink /* push return addr */
  25. st.aw fp, [sp, -4] /* push fp */
  26. mov fp, sp /* fp = sp */
  27. mov r8, r0 /* r8 = func_ptr */
  28. mov r9, r1 /* r9 = argv */
  29. mov r10, r2 /* r10 = nstacks */
  30. ld r0, [r9, 0] /* r0 = argv[0] */
  31. ld r1, [r9, 4] /* r1 = argv[1] */
  32. ld r2, [r9, 8] /* r2 = argv[2] */
  33. ld r3, [r9, 12] /* r3 = argv[3] */
  34. ld r4, [r9, 16] /* r4 = argv[4] */
  35. ld r5, [r9, 20] /* r5 = argv[5] */
  36. ld r6, [r9, 24] /* r6 = argv[6] */
  37. ld r7, [r9, 28] /* r7 = argv[7] */
  38. add r9, r9, 32 /* r9 = stack_args */
  39. breq r10, 0, call_func /* if (r10 == 0) goto call_func */
  40. asl r11, r10, 2 /* r11 = nstacks * 4 */
  41. sub sp, sp, r11 /* sp = sp - nstacks * 4 */
  42. and sp, sp, ~7 /* make sp 8-byte aligned */
  43. mov r11, sp /* r11 = sp */
  44. loop_stack_args:
  45. breq r10, 0, call_func /* if (r10 == 0) goto call_func */
  46. ld r12, [r9] /* r12 = stack_args[i] */
  47. st r12, [r11] /* stack[i] = r12 */
  48. add r9, r9, 4 /* r9 = r9 + 4 */
  49. add r11, r11, 4 /* r11 = r11 + 4 */
  50. sub r10, r10, 1 /* r10 = r10 + 1 */
  51. j loop_stack_args
  52. call_func:
  53. jl [r8] /* call function */
  54. mov sp, fp /* sp = fp */
  55. ld.ab fp, [sp, 4] /* pop fp */
  56. pop_s blink /* pop return addr */
  57. j_s [blink] /* ret */
  58. nop_s
  59. #if defined(__linux__) && defined(__ELF__)
  60. .section .note.GNU-stack,"",%progbits
  61. #endif