;++ ; ; Copyright (c) Microsoft Corporation. All rights reserved. ; ; ; Module: ; ; macamd64.w ; ; Astract: ; ; Contains AMD64 public architecture constants and assembly macros. ; ; Author: ;-- ;++ ; ; push_reg ; ; Macro Description: ; ; This macro emits a single-byte push instruction in a ; nested prologue, as well as the associated unwind code. ; ; Arguments: ; ; reg - supplies the integer register to push ; ;-- push_reg macro Reg push Reg .pushreg Reg endm ;++ ; ; rex_push_reg ; ; Macro Description: ; ; This macro emits a single-byte push instruction in a ; nested prologue, as well as the associated unwind code. ; ; This differs from push_reg only in that a redundant rex prefix ; is added. rex_push_reg must be used in lieu of push_reg when it ; appears as the first instruction in a function, as the calling ; standard dictates that functions must not begin with a single ; byte instruction. ; ; Arguments: ; ; reg - supplies the integer register to push ; ;-- rex_push_reg macro Reg db 048h push Reg .pushreg Reg endm ;++ ; ; push_eflags ; ; Macro Description: ; ; This macro emits a single-byte pushfq instruction in a ; nested prologue, as well as the associated unwind code. ; ; Arguments: ; ; none ; ;-- push_eflags macro pushfq .allocstack 8 endm ;++ ; ; rex_push_eflags ; ; Macro Description: ; ; This macro emits a single-byte pushfq instruction in a ; nested prologue, as well as the associated unwind code. ; ; This differs from push_eflags only in that a redundant rex prefix ; is added. rex_push_eflags must be used in lieu of push_eflags when it ; appears as the first instruction in a function, as the calling ; standard dictates that functions must not begin with a single ; byte instruction. ; ; Arguments: ; ; none ; ;-- rex_push_eflags macro db 048h pushfq .allocstack 8 endm ;++ ; ; ret_zero ; ; Macro Description: ; ; This macro emits a three byte return instruction. ; ; This differs from the typical ret in that it adds additional padding bytes ; that prevent branch misprediction problems when the ret is the target of ; a (un)conditional branch, or is immediately preceded by a conditional branch. ; ; Arguments: ; ; none ; ;-- ret_zero macro db 0c2h, 0, 0 endm ;++ ; ; alloc_stack ; ; Macro Description: ; ; This macro emits an opcode to subtract from rsp, as well ; as the associated unwind code. ; ; Arguments: ; ; Size - The number of bytes to subtract from rsp. ; ;-- alloc_stack macro Size sub rsp, Size .allocstack Size endm ;++ ; ; save_reg , ; ; Macro Description: ; ; This macro emits an opcode to save the non-volatile 64-bit general purpose ; register indicated by at offset relative to the current ; position of the stack pointer. It also generates the associated unwind ; code. ; ; Arguments: ; ; Reg - Supplies the integer register to save ; ; Offset - Supplies the offset relative to the current position of the stack ; pointer. ; ;-- save_reg macro Reg, Offset mov Offset[rsp], Reg .savereg Reg, Offset endm ;++ ; ; save_xmm128 , ; ; Macro Description: ; ; This macro emits an opcode to save the 128-bit non-volatile xmm register ; indicated by at offset relative to the current position ; of the stack pointer. It also generates the associated unwind code. ; ; Arguments: ; ; Reg - Supplies the xmm register register to save ; ; Offset - Supplies the offset relative to the current position of the stack ; pointer. ; ;-- save_xmm128 macro Reg, Offset movaps Offset[rsp], Reg .savexmm128 Reg, Offset endm ;++ ; ; push_frame ; ; Macro Description: ; ; This macro emits unwind data indicating that a machine frame has been ; pushed on the stack (usually by the CPU in response to a trap or fault). ; ; Arguments: ; ; None. ; ;-- push_frame macro Code .pushframe Code endm ;++ ; ; set_frame , ; ; Macro Description: ; ; This macro emits an opcode and unwind data establishing the use of ; as the current stack frame pointer. ; ; Arguments: ; ; Reg - Supplies the integer register to use as the current stack frame ; pointer. ; ; Offset - Supplies the optional offset of the frame pointer relative to ; the stack frame. In stack frames greater than 080h bytes, ; a non-zero offset can help reduce the size of subsequent opcodes ; that access portions of the stack frame by facilitating the use of ; positive and negative single-byte displacements. ; ; If not supplied, no offset is assumed. ; ;-- set_frame macro Reg, Offset if Offset lea Reg, Offset[rsp] else mov Reg, rsp endif .setframe Reg, Offset endm ;++ ; ; END_PROLOGUE ; ; Macro Description: ; ; This macro marks the end of the prologue. This must appear after all ; of the prologue directives in a nested function. ; ; Arguments: ; ; None. ; ;-- END_PROLOGUE macro .endprolog endm ;++ ; ; LEAF_ENTRY ,
, ; ; Macro Description: ; ; This macro indicates the beginning of a leaf function. ; ; A leaf function is one that DOES NOT: ; ; - manipulate non-volatile registers ; - manipulate the stack pointer ; - call other functions ; - reference an exception handler ; - contain a prologue ; - have any unwind data associated with it ; ; Arguments: ; ; Name - Supplies the name of the function ; ; Section - Supplies the name of the section within which the function ; is to appear ; ; NoPad - If present, indicates that the function should not be prefixed ; with 6 bytes of padding. This is for internal use only - the ; calling standard dictates that functions (nested and leaf) must ; be prefixed with padding. ; ;-- LEAF_ENTRY macro Name, Section, NoPad Section segment para 'CODE' ifb db 6 dup (0cch) endif align 16 public Name Name proc frame END_PROLOGUE endm ;++ ; ; LEAF_ENTRY_ARG1 ,
, , ; ; Macro Description: ; ; Indicates the beginning of a leaf function, as LEAF_ENTRY above, ; and declares one input parameter so that debug info will be ; generated for it. The other forms, LEAF_ENTRY_ARG2 and LEAF_ENTRY_ARG3, ; are similar. ; ;-- LEAF_ENTRY_ARG1 macro Name, Section, Arg1, NoPad Section segment para 'CODE' ifb db 6 dup (0cch) endif align 16 public Name Name proc frame END_PROLOGUE endm ;++ ; ; LEAF_ENTRY_ARG2 ,
, , , ; ; Macro Description: ; ; As LEAF_ENTRY_ARG1 above, marks the entry to a leaf function ; and defines 2 input parameters. ; ;-- LEAF_ENTRY_ARG2 macro Name, Section, Arg1, Arg2, NoPad Section segment para 'CODE' ifb db 6 dup (0cch) endif align 16 public Name Name proc frame END_PROLOGUE endm ;++ ; ; LEAF_ENTRY_ARG3 ,
, , , , ; ; Macro Description: ; ; As LEAF_ENTRY_ARG1 above, marks the entry to a leaf function ; and defines 3 input parameters. ; ;-- LEAF_ENTRY_ARG3 macro Name, Section, Arg1, Arg2, Arg3, NoPad Section segment para 'CODE' ifb db 6 dup (0cch) endif align 16 public Name Name proc frame END_PROLOGUE endm ;++ ; ; LEAF_END ,
; ; Macro Description: ; ; This macro indicates the end of a leaf function. It must be paired ; with a LEAF_ENTRY macro that includes matching Name and Section ; parameters. ; ; Arguments: ; ; Name - Supplies the name of the function. Must match that supplied to ; the corresponding LEAF_ENTRY macro. ; ; Section - Supplies the name of the section within which the function ; is to appear. Must match that supplied to the corresponding ; LEAF_ENTRY macro. ; ;-- LEAF_END macro Name, section Name endp Section ends endm ;++ ; ; NESTED_ENTRY ,
, , ; ; Macro Description: ; ; This macro indicates the beginning of a nested function. ; ; A nested function is one that does any of the following: ; ; - manipulates non-volatile registers ; - manipulates the stack pointer ; - references an exception handler ; - calls other functions ; ; A nested function must include a prologue with unwind data. ; ; Arguments: ; ; Name - Supplies the name of the function. ; ; Section - Supplies the name of the section within which the function ; is to appear. ; ; Handler - Supplies the name of the handler for exceptions raised ; within the scope of this function. ; ; NoPad - If present, indicates that the function should not be prefixed ; with 6 bytes of padding. This is for internal use only - the ; calling standard dictates that functions (nested and leaf) must ; be prefixed with padding. ; ;-- NESTED_ENTRY macro Name, Section, Handler, NoPad ifdef _CurrentSection_ ifdif
, _CurrentSection_ .err endif endif _CurrentSection_ EQU
Section segment para 'CODE' ifb db 6 dup (0cch) endif align 16 public Name ifb Name proc frame else Name proc frame:Handler endif endm ;++ ; ; NESTED_END ,
; ; Macro Description: ; ; This macro indicates the end of a nested function. It must be paired ; with a NESTED_ENTRY macro that includes matching Name and Section ; parameters. ; ; Arguments: ; ; Name - Supplies the name of the function. Must match that supplied to ; the corresponding NESTED_ENTRY macro. ; ; Section - Supplies the name of the section within which the function ; is to appear. Must match that supplied to the corresponding ; NESTED_ENTRY macro. ; ;-- NESTED_END macro Name, section Name endp Section ends endm ;++ ; ; ALTERNATE_ENTRY ; ; Macro Description: ; ; This macro indicates an alternate entry point in a function, or ; a synonymous name for an existing function. ; ; Arguments: ; ; Name - Supplies the name of the alternate entry point. ; ;-- ALTERNATE_ENTRY macro Name Name: endm ;++ ; ; Yield ; ; Macro Description: ; ; This macro generates a yield instruction, interpreted by SMT processors ; as an indication of a stall or idle condition. ; ; Arguments: ; ; None. ; ;-- Yield macro pause ; yield execution on SMT processors endm