LinearScanMdA.asm 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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. include ksamd64.inc
  6. _TEXT SEGMENT
  7. ;; BailOutRecord::BailOut(BailOutRecord const * bailOutRecord)
  8. extrn ?BailOut@BailOutRecord@@SAPEAXPEBV1@@Z : PROC
  9. ;; BranchBailOutRecord::BailOut(BranchBailOutRecord const * bailOutRecord, BOOL cond)
  10. extrn ?BailOut@BranchBailOutRecord@@SAPEAXPEBV1@H@Z : PROC
  11. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  12. ;; LinearScanMD::SaveAllRegisters(BailOutRecord *const bailOutRecord)
  13. align 16
  14. ?SaveAllRegisters@LinearScanMD@@CAXQEAVBailOutRecord@@@Z PROC
  15. ;; [rsp + 7 * 8] == saved rax
  16. ;; [rsp + 8 * 8] == saved rcx
  17. ;; [rsp + 9 * 8] == saved rdx
  18. ;; rcx == bailOutRecord
  19. ;; rdx == condition
  20. mov rax, [rcx] ;; bailOutRecord->globalBailOutRecordDataTable
  21. mov rax, [rax] ;; bailOutRecord->globalBailOutRecordDataTable->registerSaveSpace
  22. ;; Save r8 first to free up a register
  23. mov [rax + 8 * 8], r8
  24. ;; Save the original values of rax, rcx, and rdx into the actual register save space
  25. mov r8, [rsp + 7 * 8] ;; saved rax
  26. mov [rax + 0 * 8], r8
  27. mov r8, [rsp + 8 * 8] ;; saved rcx
  28. mov [rax + 1 * 8], r8
  29. mov r8, [rsp + 9 * 8] ;; saved rdx
  30. mov [rax + 2 * 8], r8
  31. ;; Save remaining registers
  32. mov [rax + 3 * 8], rbx
  33. ;; [rax + 4 * 8] == save space for rsp, which doesn't need to be saved since bailout uses rbp for stack access
  34. mov [rax + 5 * 8], rbp
  35. mov [rax + 6 * 8], rsi
  36. mov [rax + 7 * 8], rdi
  37. ;; mov [rax + 8 * 8], r8 ;; r8 was saved earlier
  38. mov [rax + 9 * 8], r9
  39. mov [rax + 10 * 8], r10
  40. mov [rax + 11 * 8], r11
  41. mov [rax + 12 * 8], r12
  42. mov [rax + 13 * 8], r13
  43. mov [rax + 14 * 8], r14
  44. mov [rax + 15 * 8], r15
  45. ;; Save all XMM regs (full width)
  46. movups xmmword ptr [rax + 80h], xmm0 ;; [rax + 16 * 8 + 0 * 16] = xmm0
  47. movups xmmword ptr [rax + 90h], xmm1 ;; [rax + 16 * 8 + 1 * 16] = xmm1
  48. movups xmmword ptr [rax + 0a0h], xmm2 ;; ...
  49. movups xmmword ptr [rax + 0b0h], xmm3
  50. movups xmmword ptr [rax + 0c0h], xmm4
  51. movups xmmword ptr [rax + 0d0h], xmm5
  52. movups xmmword ptr [rax + 0e0h], xmm6
  53. movups xmmword ptr [rax + 0f0h], xmm7
  54. movups xmmword ptr [rax + 100h], xmm8
  55. movups xmmword ptr [rax + 110h], xmm9
  56. movups xmmword ptr [rax + 120h], xmm10
  57. movups xmmword ptr [rax + 130h], xmm11
  58. movups xmmword ptr [rax + 140h], xmm12
  59. movups xmmword ptr [rax + 150h], xmm13
  60. movups xmmword ptr [rax + 160h], xmm14
  61. movups xmmword ptr [rax + 170h], xmm15 ;; [rax + 16 * 8 + 15 * 16] = xmm15
  62. ret
  63. ?SaveAllRegisters@LinearScanMD@@CAXQEAVBailOutRecord@@@Z ENDP
  64. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  65. ;; LinearScanMD::SaveAllRegistersAndBailOut(BailOutRecord *const bailOutRecord)
  66. align 16
  67. NESTED_ENTRY ?SaveAllRegistersAndBailOut@LinearScanMD@@SAXQEAVBailOutRecord@@@Z, _TEXT
  68. ;; We follow Custom calling convention
  69. ;; [rsp + 1 * 8] == saved rax
  70. ;; [rsp + 2 * 8] == saved rcx
  71. ;; rcx == bailOutRecord
  72. ;; Relative to this function, SaveAllRegisters expects:
  73. ;; [rsp + 3 * 8] == saved rdx
  74. ;; Since rdx is not a parameter to this function, it won't be saved on the stack by jitted code, so copy it there now
  75. mov [rsp + 3 * 8], rdx
  76. sub rsp, 28h ;; standard minimum stack allocation space which accounts for 4 home params and to align the return address.
  77. END_PROLOGUE
  78. call ?SaveAllRegisters@LinearScanMD@@CAXQEAVBailOutRecord@@@Z
  79. add rsp, 28h ;; deallocate stack space
  80. jmp ?BailOut@BailOutRecord@@SAPEAXPEBV1@@Z
  81. NESTED_END ?SaveAllRegistersAndBailOut@LinearScanMD@@SAXQEAVBailOutRecord@@@Z, _TEXT
  82. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  83. ;; LinearScanMD::SaveAllRegistersAndBranchBailOut(BranchBailOutRecord *const bailOutRecord, const BOOL condition)
  84. align 16
  85. NESTED_ENTRY ?SaveAllRegistersAndBranchBailOut@LinearScanMD@@SAXQEAVBranchBailOutRecord@@H@Z, _TEXT
  86. ;; We follow custom calling convention
  87. ;; [rsp + 1 * 8] == saved rax
  88. ;; [rsp + 2 * 8] == saved rcx
  89. ;; [rsp + 3 * 8] == saved rdx
  90. ;; rcx == bailOutRecord
  91. ;; rdx == condition
  92. sub rsp, 28h ;; standard minimum stack allocation space which accounts for 4 home params and to align the return address.
  93. END_PROLOGUE
  94. call ?SaveAllRegisters@LinearScanMD@@CAXQEAVBailOutRecord@@@Z
  95. add rsp, 28h ;; deallocate stack space
  96. jmp ?BailOut@BranchBailOutRecord@@SAPEAXPEBV1@H@Z
  97. NESTED_END ?SaveAllRegistersAndBranchBailOut@LinearScanMD@@SAXQEAVBranchBailOutRecord@@H@Z, _TEXT
  98. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  99. _TEXT ENDS
  100. end