amd64call.asm
上传用户:qaz666999
上传日期:2022-08-06
资源大小:2570k
文件大小:4k
源码类别:

数学计算

开发平台:

Unix_Linux

  1. dnl  AMD64 calling conventions checking.
  2. dnl  Copyright 2000, 2003, 2004, 2006, 2007 Free Software Foundation, Inc.
  3. dnl
  4. dnl  This file is part of the GNU MP Library.
  5. dnl
  6. dnl  The GNU MP Library is free software; you can redistribute it and/or
  7. dnl  modify it under the terms of the GNU Lesser General Public License as
  8. dnl  published by the Free Software Foundation; either version 3 of the
  9. dnl  License, or (at your option) any later version.
  10. dnl
  11. dnl  The GNU MP Library is distributed in the hope that it will be useful,
  12. dnl  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. dnl  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14. dnl  Lesser General Public License for more details.
  15. dnl
  16. dnl  You should have received a copy of the GNU Lesser General Public License
  17. dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  18. include(`../config.m4')
  19. C void x86_fldcw (unsigned short cw);
  20. C
  21. C Execute an fldcw, setting the x87 control word to cw.
  22. PROLOGUE(x86_fldcw)
  23. movq %rdi, -8(%rsp)
  24. fldcw -8(%rsp)
  25. ret
  26. EPILOGUE()
  27. C unsigned short x86_fstcw (void);
  28. C
  29. C Execute an fstcw, returning the current x87 control word.
  30. PROLOGUE(x86_fstcw)
  31.         movq $0, -8(%rsp)
  32.         fstcw -8(%rsp)
  33.         movq -8(%rsp), %rax
  34. ret
  35. EPILOGUE()
  36. dnl  Instrumented profiling won't come out quite right below, since we don't
  37. dnl  do an actual "ret".  There's only a few instructions here, so there's
  38. dnl  no great need to get them separately accounted, just let them get
  39. dnl  attributed to the caller.
  40. ifelse(WANT_PROFILING,instrument,
  41. `define(`WANT_PROFILING',no)')
  42. C int calling_conventions (...);
  43. C
  44. C The global variable "calling_conventions_function" is the function to
  45. C call, with the arguments as passed here.
  46. C
  47. C Perhaps the finit should be done only if the tags word isn't clear, but
  48. C nothing uses the rounding mode or anything at the moment.
  49. define(`WANT_RBX', eval(8*0)($1))
  50. define(`WANT_RBP', eval(8*1)($1))
  51. define(`WANT_R12', eval(8*2)($1))
  52. define(`WANT_R13', eval(8*3)($1))
  53. define(`WANT_R14', eval(8*4)($1))
  54. define(`WANT_R15', eval(8*5)($1))
  55. define(`JUNK_RAX', eval(8*6)($1))
  56. define(`JUNK_R10', eval(8*7)($1))
  57. define(`JUNK_R11', eval(8*8)($1))
  58. define(`SAVE_RBX', eval(8*9)($1))
  59. define(`SAVE_RBP', eval(8*10)($1))
  60. define(`SAVE_R12', eval(8*11)($1))
  61. define(`SAVE_R13', eval(8*12)($1))
  62. define(`SAVE_R14', eval(8*13)($1))
  63. define(`SAVE_R15', eval(8*14)($1))
  64. define(`RETADDR',  eval(8*15)($1))
  65. define(`RBX',    eval(8*16)($1))
  66. define(`RBP',    eval(8*17)($1))
  67. define(`R12',    eval(8*18)($1))
  68. define(`R13',    eval(8*19)($1))
  69. define(`R14',    eval(8*20)($1))
  70. define(`R15',    eval(8*21)($1))
  71. define(`RFLAGS',   eval(8*22)($1))
  72. define(G,
  73. m4_assert_numargs(1)
  74. `GSYM_PREFIX`'$1')
  75. TEXT
  76. ALIGN(32)
  77. PROLOGUE(calling_conventions)
  78. push %rdi
  79. movq G(calling_conventions_values)@GOTPCREL(%rip), %rdi
  80. movq 8(%rsp), %rax
  81. movq %rax, RETADDR(%rdi)
  82. leaq L(return)(%rip), %rax
  83. movq %rax, 8(%rsp)
  84. movq %rbx, SAVE_RBX(%rdi)
  85. movq %rbp, SAVE_RBP(%rdi)
  86. movq %r12, SAVE_R12(%rdi)
  87. movq %r13, SAVE_R13(%rdi)
  88. movq %r14, SAVE_R14(%rdi)
  89. movq %r15, SAVE_R15(%rdi)
  90. C values we expect to see unchanged, as per amd64check.c
  91. movq WANT_RBX(%rdi), %rbx
  92. movq WANT_RBP(%rdi), %rbp
  93. movq WANT_R12(%rdi), %r12
  94. movq WANT_R13(%rdi), %r13
  95. movq WANT_R14(%rdi), %r14
  96. movq WANT_R15(%rdi), %r15
  97. C Try to provoke a problem by starting with junk in the registers,
  98. C especially %rax which will be the return value.
  99. C
  100. C ENHANCE-ME: If we knew how many of the parameter registers were
  101. C actually being used we could put junk in the rest.  Maybe we could
  102. C get try.c to communicate this to us.
  103. C movq JUNK_RAX(%rdi), %rax C overwritten below anyway
  104. movq JUNK_R10(%rdi), %r10
  105. movq JUNK_R11(%rdi), %r11
  106. movq G(calling_conventions_function)@GOTPCREL(%rip), %rax
  107. pop %rdi
  108. jmp *(%rax)
  109. L(return):
  110. movq G(calling_conventions_values)@GOTPCREL(%rip), %rdi
  111. movq %rbx, RBX(%rdi)
  112. movq %rbp, RBP(%rdi)
  113. movq %r12, R12(%rdi)
  114. movq %r13, R13(%rdi)
  115. movq %r14, R14(%rdi)
  116. movq %r15, R15(%rdi)
  117. pushfq
  118. popq %rbx
  119. movq %rbx, RFLAGS(%rdi)
  120. movq G(calling_conventions_fenv)@GOTPCREL(%rip), %rbx
  121. fstenv (%rbx)
  122. finit
  123. movq SAVE_RBX(%rdi), %rbx
  124. movq SAVE_RBP(%rdi), %rbp
  125. movq SAVE_R12(%rdi), %r12
  126. movq SAVE_R13(%rdi), %r13
  127. movq SAVE_R14(%rdi), %r14
  128. movq SAVE_R15(%rdi), %r15
  129. jmp *RETADDR(%rdi)
  130. EPILOGUE()