You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

145 lines
5.2 KiB

/*
* Copyright 2002-2019 Intel Corporation.
*
* This software and the related documents are Intel copyrighted materials, and your
* use of them is governed by the express license under which they were provided to
* you ("License"). Unless the License provides otherwise, you may not use, modify,
* copy, publish, distribute, disclose or transmit this software or the related
* documents without Intel's prior written permission.
*
* This software and the related documents are provided as is, with no express or
* implied warranties, other than those that are expressly stated in the License.
*/
/*
** <COMPONENT>: asm
** <FILE-TYPE>: component public header
*/
#ifndef ASM_H
#define ASM_H
/*
* This header provides a set of C macros for use in assembly language files. Using
* these macros can help make assembly sources easier to read and can also provide some
* amount of portability between different assembler syntaxes.
*
* Client code can use the following macros:
*
* ASM_FILEBEGIN()
* Use this at the start of the source file.
*
* ASM_FILEEND()
* Use this at the end of the source file.
*
* ASM_FUNCBEGIN(name, rtype, (args))
* Use this before defining a function. The macro does NOT generate any prolog
* instructions, so you still need to do that yourself.
*
* @param name The name of the function. The macro automatically includes
* any leading underscore, etc. if necessary.
* @param rtype The C / C++ type returned by this function. (Used to auto-generate
* a header file with external declarations.)
* @param (args) A list of C / C++ parameters separated by commas and enclosed in
* parens. (Used to auto-generate a header file.)
*
* When a header file is auto-generated, any comment block that immediately precedes
* the ASM_FUNCBEGIN() is also included in the header. If that comment block
* contains Doxygen style comments, the auto-generated header can be processed with
* Doxygen.
*
* ASM_FUNCEND(name)
* Use this immediately after a function definition. The macro does NOT generate
* any epilog code, so you still need to do that yourself.
*
* @param name The name of the function, exactly as it appeared in the
* ASM_FUNCBEGIN().
*
* ASM_HEX(val)
* Use this whenever a hex constant is needed.
*
* @param val The value of the constant in base 16, but without any leading 0x.
*
* ASM_LABDEF(n)
* Use this to define a local label in a function.
*
* @param n A number (decimal) which identifies the label.
*
* ASM_LABF(n)
* Use this in an instruction operand when refering to a label that is *forward*
* in the file.
*
* @param n The label's number.
*
* ASM_LABB(n)
* Use this in an instruction operand when refering to a label that is *backward*
* in the file.
*
* @param n The label's number.
*
* ASM_BYTE()
* ASM_WORD()
* ASM_DWORD()
* ASM_QWORD()
* Use these to disambiguate the size of a memory reference in x86 assembly code.
*
* ASM_REGARG0
* ASM_REGARG1
* ASM_REGARG2
* ASM_REGARG3
* ASM_REGARG4
* ASM_REGARG5
* Use these to refer to the register that contains a function argument on the
* Intel(R) 64 architecture. These macros help insulate source code from the differences
* between the Unix and Windows calling standards.
*
* ASM_<type>_SIZE
* Size of type <type> in bytes.
*
* ASM_<type>_TYPE
* Keyword to declare instance of type <type>
*
* ASM_NAMED_DATA(label, type, value)
* declares a (local) variable with type 'type', name 'label'
* and initial value of 'value'
*
* ASM_PIC_INIT(reg)
* Initialization code for function that reference PIC code/data.
* 'reg' is assigned as the PIC register to be used for later references
* to PIC data/code
*
* ASM_PC_REL_REF(var,reg)
* Reference to a PIC variable using PC relative addressing.
* 'var' is the variable to reference while 'reg' is the PIC register.
*
* Toolchains must define the following macros in order to enable the ASM support:
*
* ASM_TC_GAS, ASM_TC_MASM, ASM_TC_NASM
* Must define one of these, according to the assembler provided by the toolchain.
*/
#define ASM_BYTE_SIZE 1
#define ASM_WORD_SIZE 2
#define ASM_DWORD_SIZE 4
#define ASM_QWORD_SIZE 8
#if defined(ASM_TC_GAS)
# include "asm/gas-x86.h"
#elif defined(ASM_TC_MASM)
# include "asm/masm-x86.h"
#elif defined(ASM_TC_NASM)
# include "asm/nasm-x86.h"
#else
# error "Must define assembler type and architecture"
#endif
#if defined(HOST_IA32E) && defined(TARGET_WINDOWS)
# include "asm/windows-intel64.h"
#elif (defined(TARGET_ANDROID) || defined(TARGET_MAC) || defined(TARGET_LINUX)) && defined(HOST_IA32E)
# include "asm/unix-intel64.h"
#endif
#endif /*file guard*/