zend_jit_arm64.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. /*
  2. +----------------------------------------------------------------------+
  3. | Zend JIT |
  4. +----------------------------------------------------------------------+
  5. | Copyright (c) The PHP Group |
  6. +----------------------------------------------------------------------+
  7. | This source file is subject to version 3.01 of the PHP license, |
  8. | that is bundled with this package in the file LICENSE, and is |
  9. | available through the world-wide-web at the following url: |
  10. | https://www.php.net/license/3_01.txt |
  11. | If you did not receive a copy of the PHP license and are unable to |
  12. | obtain it through the world-wide-web, please send a note to |
  13. | license@php.net so we can mail you a copy immediately. |
  14. +----------------------------------------------------------------------+
  15. | Authors: Dmitry Stogov <dmitry@php.net> |
  16. | Hao Sun <hao.sun@arm.com> |
  17. +----------------------------------------------------------------------+
  18. */
  19. #ifndef HAVE_JIT_ARM64_H
  20. #define HAVE_JIT_ARM64_H
  21. typedef enum _zend_reg {
  22. ZREG_NONE = -1,
  23. ZREG_X0,
  24. ZREG_X1,
  25. ZREG_X2,
  26. ZREG_X3,
  27. ZREG_X4,
  28. ZREG_X5,
  29. ZREG_X6,
  30. ZREG_X7,
  31. ZREG_X8,
  32. ZREG_X9,
  33. ZREG_X10,
  34. ZREG_X11,
  35. ZREG_X12,
  36. ZREG_X13,
  37. ZREG_X14,
  38. ZREG_X15,
  39. ZREG_X16,
  40. ZREG_X17,
  41. ZREG_X18,
  42. ZREG_X19,
  43. ZREG_X20,
  44. ZREG_X21,
  45. ZREG_X22,
  46. ZREG_X23,
  47. ZREG_X24,
  48. ZREG_X25,
  49. ZREG_X26,
  50. ZREG_X27,
  51. ZREG_X28,
  52. ZREG_X29,
  53. ZREG_X30,
  54. ZREG_X31,
  55. ZREG_V0,
  56. ZREG_V1,
  57. ZREG_V2,
  58. ZREG_V3,
  59. ZREG_V4,
  60. ZREG_V5,
  61. ZREG_V6,
  62. ZREG_V7,
  63. ZREG_V8,
  64. ZREG_V9,
  65. ZREG_V10,
  66. ZREG_V11,
  67. ZREG_V12,
  68. ZREG_V13,
  69. ZREG_V14,
  70. ZREG_V15,
  71. ZREG_V16,
  72. ZREG_V17,
  73. ZREG_V18,
  74. ZREG_V19,
  75. ZREG_V20,
  76. ZREG_V21,
  77. ZREG_V22,
  78. ZREG_V23,
  79. ZREG_V24,
  80. ZREG_V25,
  81. ZREG_V26,
  82. ZREG_V27,
  83. ZREG_V28,
  84. ZREG_V29,
  85. ZREG_V30,
  86. ZREG_V31,
  87. ZREG_NUM,
  88. ZREG_THIS, /* used for delayed FETCH_THIS deoptimization */
  89. /* pseudo constants used by deoptimizer */
  90. ZREG_LONG_MIN_MINUS_1,
  91. ZREG_LONG_MIN,
  92. ZREG_LONG_MAX,
  93. ZREG_LONG_MAX_PLUS_1,
  94. ZREG_NULL,
  95. ZREG_ZVAL_TRY_ADDREF,
  96. ZREG_ZVAL_COPY_GPR0,
  97. } zend_reg;
  98. typedef struct _zend_jit_registers_buf {
  99. uint64_t gpr[32]; /* general purpose integer register */
  100. double fpr[32]; /* floating point registers */
  101. } zend_jit_registers_buf;
  102. #define ZREG_RSP ZREG_X31
  103. #define ZREG_RLR ZREG_X30
  104. #define ZREG_RFP ZREG_X29
  105. #define ZREG_RPR ZREG_X18
  106. #define ZREG_FP ZREG_X27
  107. #define ZREG_IP ZREG_X28
  108. #define ZREG_RX ZREG_IP
  109. #define ZREG_REG0 ZREG_X8
  110. #define ZREG_REG1 ZREG_X9
  111. #define ZREG_REG2 ZREG_X10
  112. #define ZREG_FPR0 ZREG_V0
  113. #define ZREG_FPR1 ZREG_V1
  114. #define ZREG_TMP1 ZREG_X15
  115. #define ZREG_TMP2 ZREG_X16
  116. #define ZREG_TMP3 ZREG_X17
  117. #define ZREG_FPTMP ZREG_V16
  118. #define ZREG_COPY ZREG_REG0
  119. #define ZREG_FIRST_FPR ZREG_V0
  120. typedef uint64_t zend_regset;
  121. #define ZEND_REGSET_64BIT 1
  122. # define ZEND_REGSET_FIXED \
  123. (ZEND_REGSET(ZREG_RSP) | ZEND_REGSET(ZREG_RLR) | ZEND_REGSET(ZREG_RFP) | \
  124. ZEND_REGSET(ZREG_RPR) | ZEND_REGSET(ZREG_FP) | ZEND_REGSET(ZREG_IP) | \
  125. ZEND_REGSET_INTERVAL(ZREG_TMP1, ZREG_TMP3) | ZEND_REGSET(ZREG_FPTMP))
  126. # define ZEND_REGSET_GP \
  127. ZEND_REGSET_DIFFERENCE(ZEND_REGSET_INTERVAL(ZREG_X0, ZREG_X30), ZEND_REGSET_FIXED)
  128. # define ZEND_REGSET_FP \
  129. ZEND_REGSET_DIFFERENCE(ZEND_REGSET_INTERVAL(ZREG_V0, ZREG_V31), ZEND_REGSET_FIXED)
  130. # define ZEND_REGSET_SCRATCH \
  131. (ZEND_REGSET_INTERVAL(ZREG_X0, ZREG_X17) | ZEND_REGSET_INTERVAL(ZREG_V0, ZREG_V7) | \
  132. ZEND_REGSET_INTERVAL(ZREG_V16, ZREG_V31))
  133. # define ZEND_REGSET_PRESERVED \
  134. (ZEND_REGSET_INTERVAL(ZREG_X19, ZREG_X28) | ZEND_REGSET_INTERVAL(ZREG_V8, ZREG_V15))
  135. #define ZEND_REGSET_LOW_PRIORITY \
  136. (ZEND_REGSET(ZREG_REG0) | ZEND_REGSET(ZREG_REG1) | ZEND_REGSET(ZREG_FPR0) | ZEND_REGSET(ZREG_FPR1))
  137. #endif /* ZEND_JIT_ARM64_H */