LinearScanMdA.S 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. .intel_syntax noprefix
  6. #include "unixasmmacros.inc"
  7. //------------------------------------------------------------------------------
  8. // LinearScanMD::SaveAllRegisters(BailOutRecord *const bailOutRecord)
  9. .balign 16
  10. LEAF_ENTRY _ZN12LinearScanMD26SaveAllRegistersEP13BailOutRecord, _TEXT
  11. // [rsp + 7 * 8] == saved rax
  12. // [rsp + 8 * 8] == saved rdi
  13. // [rsp + 9 * 8] == saved rsi
  14. // rdi == bailOutRecord
  15. // rsi == condition
  16. mov rax, [rdi] // bailOutRecord->globalBailOutRecordDataTable
  17. mov rax, [rax] // bailOutRecord->globalBailOutRecordDataTable->registerSaveSpace
  18. // Save r8 first to free up a register
  19. mov [rax + 8 * 8], r8
  20. // Save the original values of rax, rdi, and rsi into the actual register save space
  21. mov r8, [rsp + 7 * 8] // saved rax
  22. mov [rax + 0 * 8], r8
  23. mov r8, [rsp + 8 * 8] // saved rdi
  24. mov [rax + 7 * 8], r8
  25. mov r8, [rsp + 9 * 8] // saved rsi
  26. mov [rax + 6 * 8], r8
  27. // Save remaining registers
  28. mov [rax + 1 * 8], rcx
  29. mov [rax + 2 * 8], rdx
  30. mov [rax + 3 * 8], rbx
  31. // [rax + 4 * 8] == save space for rsp, which doesn't need to be saved since bailout uses rbp for stack access
  32. mov [rax + 5 * 8], rbp
  33. // mov [rax + 6 * 8], rsi // rsi saved above
  34. // mov [rax + 7 * 8], rdi // rdi saved above
  35. // mov [rax + 8 * 8], r8 // r8 was saved earlier
  36. mov [rax + 9 * 8], r9
  37. mov [rax + 10 * 8], r10
  38. mov [rax + 11 * 8], r11
  39. mov [rax + 12 * 8], r12
  40. mov [rax + 13 * 8], r13
  41. mov [rax + 14 * 8], r14
  42. mov [rax + 15 * 8], r15
  43. // Save all XMM regs (full width)
  44. movups xmmword ptr [rax + 80h], xmm0 // [rax + 16 * 8 + 0 * 16] = xmm0
  45. movups xmmword ptr [rax + 90h], xmm1 // [rax + 16 * 8 + 1 * 16] = xmm1
  46. movups xmmword ptr [rax + 0a0h], xmm2 // ...
  47. // movups xmmword ptr [rax + 0b0h], xmm3 // xplat: WHY this one fails to compile...
  48. movups xmmword ptr [rax + 11 * 16], xmm3
  49. movups xmmword ptr [rax + 0c0h], xmm4
  50. movups xmmword ptr [rax + 0d0h], xmm5
  51. movups xmmword ptr [rax + 0e0h], xmm6
  52. movups xmmword ptr [rax + 0f0h], xmm7
  53. movups xmmword ptr [rax + 100h], xmm8
  54. movups xmmword ptr [rax + 110h], xmm9
  55. movups xmmword ptr [rax + 120h], xmm10
  56. movups xmmword ptr [rax + 130h], xmm11
  57. movups xmmword ptr [rax + 140h], xmm12
  58. movups xmmword ptr [rax + 150h], xmm13
  59. movups xmmword ptr [rax + 160h], xmm14
  60. movups xmmword ptr [rax + 170h], xmm15 // [rax + 16 * 8 + 15 * 16] = xmm15
  61. ret
  62. LEAF_END _ZN12LinearScanMD26SaveAllRegistersEP13BailOutRecord, _TEXT
  63. //------------------------------------------------------------------------------
  64. // LinearScanMD::SaveAllRegistersAndBailOut(BailOutRecord *const bailOutRecord)
  65. .balign 16
  66. NESTED_ENTRY _ZN12LinearScanMD26SaveAllRegistersAndBailOutEP13BailOutRecord, _TEXT, NoHandler
  67. // We follow Custom calling convention
  68. // [rsp + 1 * 8] == saved rax
  69. // [rsp + 2 * 8] == saved rdi
  70. // rdi == bailOutRecord
  71. // Relative to this function, SaveAllRegisters expects:
  72. // [rsp + 3 * 8] == saved rsi
  73. // Since rsi is not a parameter to this function, it won't be saved on the stack by jitted code, so copy it there now
  74. mov [rsp + 3 * 8], rsi
  75. sub rsp, 28h // use the same as Windows x64 so register locations are the same
  76. .cfi_adjust_cfa_offset 0x28
  77. call C_FUNC(_ZN12LinearScanMD26SaveAllRegistersEP13BailOutRecord)
  78. add rsp, 28h // deallocate stack space
  79. .cfi_adjust_cfa_offset -0x28
  80. jmp C_FUNC(_ZN13BailOutRecord7BailOutEPKS_)
  81. NESTED_END _ZN12LinearScanMD26SaveAllRegistersAndBailOutEP13BailOutRecord, _TEXT
  82. //------------------------------------------------------------------------------
  83. // LinearScanMD::SaveAllRegistersAndBranchBailOut(BranchBailOutRecord *const bailOutRecord, const BOOL condition)
  84. .balign 16
  85. NESTED_ENTRY _ZN12LinearScanMD32SaveAllRegistersAndBranchBailOutEP19BranchBailOutRecordi, _TEXT, NoHandler
  86. // We follow custom calling convention
  87. // [rsp + 1 * 8] == saved rax
  88. // [rsp + 2 * 8] == saved rdi
  89. // [rsp + 3 * 8] == saved rsi
  90. // rdi == bailOutRecord
  91. // rsi == condition
  92. sub rsp, 28h // use the same as Windows x64 so register locations are the same
  93. .cfi_adjust_cfa_offset 0x28
  94. call C_FUNC(_ZN12LinearScanMD26SaveAllRegistersEP13BailOutRecord)
  95. add rsp, 28h // deallocate stack space
  96. .cfi_adjust_cfa_offset -0x28
  97. jmp C_FUNC(_ZN19BranchBailOutRecord7BailOutEPKS_i)
  98. NESTED_END _ZN12LinearScanMD32SaveAllRegistersAndBranchBailOutEP19BranchBailOutRecordi, _TEXT