nasm/macros/standard.mac
2022-11-07 12:39:44 -08:00

332 lines
8.6 KiB
Plaintext

;; --------------------------------------------------------------------------
;;
;; Copyright 1996-2019 The NASM Authors - All Rights Reserved
;; See the file AUTHORS included with the NASM distribution for
;; the specific copyright holders.
;;
;; Redistribution and use in source and binary forms, with or without
;; modification, are permitted provided that the following
;; conditions are met:
;;
;; * Redistributions of source code must retain the above copyright
;; notice, this list of conditions and the following disclaimer.
;; * Redistributions in binary form must reproduce the above
;; copyright notice, this list of conditions and the following
;; disclaimer in the documentation and/or other materials provided
;; with the distribution.
;;
;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
;; CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
;; INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
;; MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
;; DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
;; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
;; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
;; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
;; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
;; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
;; CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
;; OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
;; EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
;;
;; --------------------------------------------------------------------------
; Standard macro set for NASM -*- nasm -*-
; Macros to make NASM ignore some TASM directives
STD: tasm
%idefine IDEAL
%idefine JUMPS
%idefine P386
%idefine P486
%idefine P586
%idefine END
; The normal standard macros
STD: nasm
; Note that although some user-level forms of directives are defined
; here, not all of them are: the user-level form of a format-specific
; directive should be defined in the module for that directive.
%define __?SECT?__ ; it ought to be defined, even if as nothing
%defalias __SECT__ __?SECT?__
%imacro section 1+.nolist
%define __?SECT?__ [section %1]
__?SECT?__
%endmacro
%imacro segment 1+.nolist
%define __?SECT?__ [segment %1]
__?SECT?__
%endmacro
%define __?SECTALIGN_ALIGN_UPDATES_SECTION?__ 1
%imacro sectalign 1+.nolist
%ifidni %1,off
%define __?SECTALIGN_ALIGN_UPDATES_SECTION?__ 0
%elifidni %1,on
%define __?SECTALIGN_ALIGN_UPDATES_SECTION?__ 1
%else
[sectalign %1]
%endif
%endmacro
%defalias __SECTALIGN_ALIGN_UPDATES_SECTION__ __?SECTALIGN_ALIGN_UPDATES_SECTION?__
%imacro absolute 1+.nolist
%define __?SECT?__ [absolute %1]
__?SECT?__
%endmacro
%imacro struc 1-2.nolist 0
%push
%define %$strucname %1
[absolute %2]
%$strucname: ; allow definition of `.member' to work sanely
%endmacro
%imacro endstruc 0.nolist
%{$strucname}_size equ ($-%$strucname)
%pop
__?SECT?__
%endmacro
%imacro istruc 1.nolist
%push
%define %$strucname %1
%$strucstart:
%endmacro
%imacro at 1-2+.nolist
%defstr %$member %1
%substr %$member1 %$member 1
%ifidn %$member1, '.'
times (%$strucname%1-%$strucname)-($-%$strucstart) db 0
%else
times (%1-%$strucname)-($-%$strucstart) db 0
%endif
%2
%endmacro
%imacro iend 0.nolist
times %{$strucname}_size-($-%$strucstart) db 0
%pop
%endmacro
%imacro align 1-2+.nolist nop
%if __?SECTALIGN_ALIGN_UPDATES_SECTION?__
sectalign %1
%endif
times (((%1) - (($-$$) % (%1))) % (%1)) %2
%endmacro
%imacro alignb 1-2+.nolist
%if __?SECTALIGN_ALIGN_UPDATES_SECTION?__
sectalign %1
%endif
%ifempty %2
[warning push]
[warning -zeroing]
resb (((%1) - (($-$$) % (%1))) % (%1))
[warning pop]
%else
times (((%1) - (($-$$) % (%1))) % (%1)) %2
%endif
%endmacro
%imacro bits 1+.nolist
[bits %1]
%endmacro
%imacro use16 0.nolist
[bits 16]
%endmacro
%imacro use32 0.nolist
[bits 32]
%endmacro
%imacro use64 0.nolist
[bits 64]
%endmacro
%imacro extern 1-*.nolist
%rep %0
[extern %1]
%rotate 1
%endrep
%endmacro
%imacro static 1-*.nolist
%rep %0
[static %1]
%rotate 1
%endrep
%endmacro
%imacro global 1-*.nolist
%rep %0
[global %1]
%rotate 1
%endrep
%endmacro
%imacro required 1-*.nolist
%rep %0
[required %1]
%rotate 1
%endrep
%endmacro
%imacro common 1-*.nolist
%rep %0
[common %1]
%rotate 1
%endrep
%endmacro
%imacro cpu 1+.nolist
[cpu %1]
%endmacro
%define __?FLOAT_DAZ?__ nodaz
%define __?FLOAT_ROUND?__ near
; __?FLOAT?__ contains the whole floating-point configuration so it can
; be saved and restored
%define __?FLOAT?__ __?FLOAT_DAZ?__,__?FLOAT_ROUND?__
%defalias __FLOAT_DAZ__ __?FLOAT_DAZ?__
%defalias __FLOAT_ROUND__ __?FLOAT_ROUND?__
%defalias __FLOAT__ __?FLOAT?__
%imacro float 1-*.nolist
%rep %0
[float %1]
%ifidni %1,daz
%define __?FLOAT_DAZ?__ daz
%elifidni %1,nodaz
%define __?FLOAT_DAZ?__ nodaz
%elifidni %1,near
%define __?FLOAT_ROUND?__ near
%elifidni %1,up
%define __?FLOAT_ROUND?__ up
%elifidni %1,down
%define __?FLOAT_ROUND?__ down
%elifidni %1,zero
%define __?FLOAT_ROUND?__ zero
%elifidni %1,default
%define __?FLOAT_DAZ?__ nodaz
%define __?FLOAT_ROUND?__ near
%endif
%rotate 1
%endrep
%endmacro
%imacro default 1+.nolist
[default %1]
%endmacro
%imacro userel 0.nolist
[default rel]
%endmacro
%imacro useabs 0.nolist
[default abs]
%endmacro
%imacro usebnd 0.nolist
[default bnd]
%endmacro
%imacro usenobnd 0.nolist
[default nobnd]
%endmacro
%imacro incbin 1-2+.nolist 0
%push
%pathsearch %$dep %1
%depend %$dep
%? %$dep,%2
%pop
%endmacro
; Compatibility macro aliases
%defalias __NASM_MAJOR__ __?NASM_MAJOR?__
%defalias __NASM_MINOR__ __?NASM_MINOR?__
%defalias __NASM_SUBMINOR__ __?NASM_SUBMINOR?__
%defalias __NASM_PATCHLEVEL__ __?NASM_PATCHLEVEL?__
%defalias __NASM_SNAPSHOT__ __?NASM_SNAPSHOT?__
%defalias __NASM_VERSION_ID__ __?NASM_VERSION_ID?__
%defalias __NASM_VER__ __?NASM_VER?__
%defalias __OUTPUT_FORMAT__ __?OUTPUT_FORMAT?__
%defalias __DEBUG_FORMAT__ __?DEBUG_FORMAT?__
%defalias __DATE__ __?DATE?__
%defalias __DATE_NUM__ __?DATE_NUM?__
%defalias __TIME__ __?TIME?__
%defalias __TIME_NUM__ __?TIME_NUM?__
%defalias __UTC_DATE__ __?UTC_DATE?__
%defalias __UTC_DATE_NUM__ __?UTC_DATE_NUM?__
%defalias __UTC_TIME__ __?UTC_TIME?__
%defalias __UTC_TIME_NUM__ __?UTC_TIME_NUM?__
%defalias __POSIX_TIME__ __?POSIX_TIME?__
%defalias __FILE__ __?FILE?__
%defalias __LINE__ __?LINE?__
%defalias __BITS__ __?BITS?__
%defalias __PTR__ __?PTR?__
%defalias __PASS__ __?PASS?__
; Backwards compatibility aliases for tokens. The extra level of indirection here
; means %aliases on|off will do the right thing for these as well.
%idefine __?infinity?__ %?
%idefine __?nan?__ %?
%idefine __?qnan?__ %?
%idefine __?snan?__ %?
%idefine __?float8?__ %?
%idefine __?float16?__ %?
%idefine __?float32?__ %?
%idefine __?float64?__ %?
%idefine __?float80m?__ %?
%idefine __?float80e?__ %?
%idefine __?float128l?__ %?
%idefine __?float128h?__ %?
%idefine __?utf16?__ %?
%idefine __?utf16le?__ %?
%idefine __?utf16be?__ %?
%idefine __?utf32?__ %?
%idefine __?utf32le?__ %?
%idefine __?utf32be?__ %?
%idefine __?ilog2e?__ %?
%idefine __?ilog2w?__ %?
%idefine __?ilog2f?__ %?
%idefine __?ilog2c?__ %?
%idefalias __infinity__ __?infinity?__
%idefalias __nan__ __?nan?__
%idefalias __qnan__ __?qnan?__
%idefalias __snan__ __?snan?__
%idefalias __float8__ __?float8?__
%idefalias __float16__ __?float16?__
%idefalias __float32__ __?float32?__
%idefalias __float64__ __?float64?__
%idefalias __float80m__ __?float80m?__
%idefalias __float80e__ __?float80e?__
%idefalias __float128l__ __?float128l?__
%idefalias __float128h__ __?float128h?__
%idefalias __utf16__ __?utf16?__
%idefalias __utf16le__ __?utf16le?__
%idefalias __utf16be__ __?utf16be?__
%idefalias __utf32__ __?utf32?__
%idefalias __utf32le__ __?utf32le?__
%idefalias __utf32be__ __?utf32be?__
%idefalias __ilog2e__ __?ilog2e?__
%idefalias __ilog2w__ __?ilog2w?__
%idefalias __ilog2f__ __?ilog2f?__
%idefalias __ilog2c__ __?ilog2c?__