invokeNative_xtensa.s 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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. .global invokeNative
  8. .type invokeNative,function
  9. /*
  10. * Arguments passed in:
  11. *
  12. * a2 function pntr
  13. * a3 argv
  14. * a4 argc
  15. */
  16. invokeNative:
  17. entry a1, 256
  18. blti a4, 1, return /* at least one argument required: exec_env */
  19. /* register a10 ~ a15 are used to pass first 6 arguments */
  20. l32i.n a10, a3, 0
  21. beqi a4, 1, call_func
  22. l32i.n a11, a3, 4
  23. beqi a4, 2, call_func
  24. l32i.n a12, a3, 8
  25. beqi a4, 3, call_func
  26. l32i.n a13, a3, 12
  27. beqi a4, 4, call_func
  28. l32i.n a14, a3, 16
  29. beqi a4, 5, call_func
  30. l32i.n a15, a3, 20
  31. beqi a4, 6, call_func
  32. /* left arguments are passed through stack */
  33. addi a4, a4, -6
  34. addi a3, a3, 24 /* move argv pointer */
  35. mov.n a6, a1 /* store stack pointer */
  36. addi a7, a1, 256 /* stack boundary */
  37. loop_args:
  38. beqi a4, 0, call_func
  39. bge a6, a7, call_func /* reach stack boundary */
  40. l32i.n a5, a3, 0 /* load argument to a5 */
  41. s32i.n a5, a6, 0 /* push data to stack */
  42. addi a4, a4, -1 /* decrease argc */
  43. addi a3, a3, 4 /* move argv pointer */
  44. addi a6, a6, 4 /* move stack pointer */
  45. j loop_args
  46. call_func:
  47. mov.n a8, a2
  48. callx8 a8
  49. /* the result returned from callee is stored in a2
  50. mov the result to a10 so the caller of this function
  51. can receive the value */
  52. mov.n a2, a10
  53. mov.n a3, a11
  54. return:
  55. retw.n