asm_support_x86.S revision 3f2d031f639b3b9dd4adbf9e70d23de931a9801d
17655f29fabc0a12765de828914a18314382e5a35Ian Rogers/*
27655f29fabc0a12765de828914a18314382e5a35Ian Rogers * Copyright (C) 2013 The Android Open Source Project
37655f29fabc0a12765de828914a18314382e5a35Ian Rogers *
47655f29fabc0a12765de828914a18314382e5a35Ian Rogers * Licensed under the Apache License, Version 2.0 (the "License");
57655f29fabc0a12765de828914a18314382e5a35Ian Rogers * you may not use this file except in compliance with the License.
67655f29fabc0a12765de828914a18314382e5a35Ian Rogers * You may obtain a copy of the License at
77655f29fabc0a12765de828914a18314382e5a35Ian Rogers *
87655f29fabc0a12765de828914a18314382e5a35Ian Rogers *      http://www.apache.org/licenses/LICENSE-2.0
97655f29fabc0a12765de828914a18314382e5a35Ian Rogers *
107655f29fabc0a12765de828914a18314382e5a35Ian Rogers * Unless required by applicable law or agreed to in writing, software
117655f29fabc0a12765de828914a18314382e5a35Ian Rogers * distributed under the License is distributed on an "AS IS" BASIS,
127655f29fabc0a12765de828914a18314382e5a35Ian Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137655f29fabc0a12765de828914a18314382e5a35Ian Rogers * See the License for the specific language governing permissions and
147655f29fabc0a12765de828914a18314382e5a35Ian Rogers * limitations under the License.
157655f29fabc0a12765de828914a18314382e5a35Ian Rogers */
167655f29fabc0a12765de828914a18314382e5a35Ian Rogers
177655f29fabc0a12765de828914a18314382e5a35Ian Rogers#ifndef ART_RUNTIME_ARCH_X86_ASM_SUPPORT_X86_S_
187655f29fabc0a12765de828914a18314382e5a35Ian Rogers#define ART_RUNTIME_ARCH_X86_ASM_SUPPORT_X86_S_
197655f29fabc0a12765de828914a18314382e5a35Ian Rogers
207655f29fabc0a12765de828914a18314382e5a35Ian Rogers#include "asm_support_x86.h"
217655f29fabc0a12765de828914a18314382e5a35Ian Rogers
227655f29fabc0a12765de828914a18314382e5a35Ian Rogers#if defined(__APPLE__)
237655f29fabc0a12765de828914a18314382e5a35Ian Rogers    // Mac OS' as(1) doesn't let you name macro parameters.
247655f29fabc0a12765de828914a18314382e5a35Ian Rogers    #define MACRO0(macro_name) .macro macro_name
257655f29fabc0a12765de828914a18314382e5a35Ian Rogers    #define MACRO1(macro_name, macro_arg1) .macro macro_name
267655f29fabc0a12765de828914a18314382e5a35Ian Rogers    #define MACRO2(macro_name, macro_arg1, macro_args2) .macro macro_name
277655f29fabc0a12765de828914a18314382e5a35Ian Rogers    #define MACRO3(macro_name, macro_arg1, macro_args2, macro_args3) .macro macro_name
287655f29fabc0a12765de828914a18314382e5a35Ian Rogers    #define END_MACRO .endmacro
297655f29fabc0a12765de828914a18314382e5a35Ian Rogers
307655f29fabc0a12765de828914a18314382e5a35Ian Rogers    // Mac OS' as(1) uses $0, $1, and so on for macro arguments, and function names
317655f29fabc0a12765de828914a18314382e5a35Ian Rogers    // are mangled with an extra underscore prefix. The use of $x for arguments
327655f29fabc0a12765de828914a18314382e5a35Ian Rogers    // mean that literals need to be represented with $$x in macros.
337655f29fabc0a12765de828914a18314382e5a35Ian Rogers    #define SYMBOL(name) _ ## name
343f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    #define PLT_SYMBOL(name) _ ## name
357655f29fabc0a12765de828914a18314382e5a35Ian Rogers    #define VAR(name,index) SYMBOL($index)
363f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    #define PLT_VAR(name, index) SYMBOL($index)
377655f29fabc0a12765de828914a18314382e5a35Ian Rogers    #define REG_VAR(name,index) %$index
387655f29fabc0a12765de828914a18314382e5a35Ian Rogers    #define CALL_MACRO(name,index) $index
397655f29fabc0a12765de828914a18314382e5a35Ian Rogers    #define LITERAL(value) $value
407655f29fabc0a12765de828914a18314382e5a35Ian Rogers    #define MACRO_LITERAL(value) $$value
413f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell
423f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    // Mac OS' doesn't like cfi_* directives
433f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    #define CFI_STARTPROC
443f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    #define CFI_ENDPROC
453f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    #define CFI_ADJUST_CFA_OFFSET(size)
463f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    #define CFI_DEF_CFA(reg,size)
473f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    #define CFI_DEF_CFA_REGISTER(reg)
483f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    #define CFI_RESTORE(reg)
493f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    #define CFI_REL_OFFSET(reg,size)
503f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell
513f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    // Mac OS' doesn't support certain directives
523f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    #define FUNCTION_TYPE(name)
533f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    #define SIZE(name)
547655f29fabc0a12765de828914a18314382e5a35Ian Rogers#else
557655f29fabc0a12765de828914a18314382e5a35Ian Rogers    // Regular gas(1) lets you name macro parameters.
567655f29fabc0a12765de828914a18314382e5a35Ian Rogers    #define MACRO0(macro_name) .macro macro_name
577655f29fabc0a12765de828914a18314382e5a35Ian Rogers    #define MACRO1(macro_name, macro_arg1) .macro macro_name macro_arg1
587655f29fabc0a12765de828914a18314382e5a35Ian Rogers    #define MACRO2(macro_name, macro_arg1, macro_arg2) .macro macro_name macro_arg1, macro_arg2
597655f29fabc0a12765de828914a18314382e5a35Ian Rogers    #define MACRO3(macro_name, macro_arg1, macro_arg2, macro_arg3) .macro macro_name macro_arg1, macro_arg2, macro_arg3
607655f29fabc0a12765de828914a18314382e5a35Ian Rogers    #define END_MACRO .endm
617655f29fabc0a12765de828914a18314382e5a35Ian Rogers
627655f29fabc0a12765de828914a18314382e5a35Ian Rogers    // Regular gas(1) uses \argument_name for macro arguments.
637655f29fabc0a12765de828914a18314382e5a35Ian Rogers    // We need to turn on alternate macro syntax so we can use & instead or the preprocessor
647655f29fabc0a12765de828914a18314382e5a35Ian Rogers    // will screw us by inserting a space between the \ and the name. Even in this mode there's
657655f29fabc0a12765de828914a18314382e5a35Ian Rogers    // no special meaning to $, so literals are still just $x. The use of altmacro means % is a
667655f29fabc0a12765de828914a18314382e5a35Ian Rogers    // special character meaning care needs to be taken when passing registers as macro arguments.
677655f29fabc0a12765de828914a18314382e5a35Ian Rogers    .altmacro
687655f29fabc0a12765de828914a18314382e5a35Ian Rogers    #define SYMBOL(name) name
693f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    #define PLT_SYMBOL(name) name@PLT
707655f29fabc0a12765de828914a18314382e5a35Ian Rogers    #define VAR(name,index) name&
713f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    #define PLT_VAR(name, index) name&@PLT
727655f29fabc0a12765de828914a18314382e5a35Ian Rogers    #define REG_VAR(name,index) %name
737655f29fabc0a12765de828914a18314382e5a35Ian Rogers    #define CALL_MACRO(name,index) name&
747655f29fabc0a12765de828914a18314382e5a35Ian Rogers    #define LITERAL(value) $value
757655f29fabc0a12765de828914a18314382e5a35Ian Rogers    #define MACRO_LITERAL(value) $value
763f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell
773f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    // CFI support
783f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    #define CFI_STARTPROC .cfi_startproc
793f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    #define CFI_ENDPROC .cfi_endproc
803f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    #define CFI_ADJUST_CFA_OFFSET(size) .cfi_adjust_cfa_offset size
813f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    #define CFI_DEF_CFA(reg,size) .cfi_def_cfa reg,size
823f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    #define CFI_DEF_CFA_REGISTER(reg) .cfi_def_cfa_register reg
833f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    #define CFI_RESTORE(reg) .cfi_restore reg
843f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    #define CFI_REL_OFFSET(reg,size) .cfi_rel_offset reg,size
853f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell
863f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    #define FUNCTION_TYPE(name) .type name&, @function
873f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    #define SIZE(name) .size name, .-name
887655f29fabc0a12765de828914a18314382e5a35Ian Rogers#endif
897655f29fabc0a12765de828914a18314382e5a35Ian Rogers
907655f29fabc0a12765de828914a18314382e5a35Ian Rogers    /* Cache alignment for function entry */
917655f29fabc0a12765de828914a18314382e5a35Ian RogersMACRO0(ALIGN_FUNCTION_ENTRY)
927655f29fabc0a12765de828914a18314382e5a35Ian Rogers    .balign 16
937655f29fabc0a12765de828914a18314382e5a35Ian RogersEND_MACRO
947655f29fabc0a12765de828914a18314382e5a35Ian Rogers
957655f29fabc0a12765de828914a18314382e5a35Ian RogersMACRO1(DEFINE_FUNCTION, c_name)
963f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    FUNCTION_TYPE(\c_name)
977655f29fabc0a12765de828914a18314382e5a35Ian Rogers    .globl VAR(c_name, 0)
987655f29fabc0a12765de828914a18314382e5a35Ian Rogers    ALIGN_FUNCTION_ENTRY
997655f29fabc0a12765de828914a18314382e5a35Ian RogersVAR(c_name, 0):
1003f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    CFI_STARTPROC
1017655f29fabc0a12765de828914a18314382e5a35Ian RogersEND_MACRO
1027655f29fabc0a12765de828914a18314382e5a35Ian Rogers
1037655f29fabc0a12765de828914a18314382e5a35Ian RogersMACRO1(END_FUNCTION, c_name)
1043f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    CFI_ENDPROC
1053f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    SIZE(\c_name)
1067655f29fabc0a12765de828914a18314382e5a35Ian RogersEND_MACRO
1077655f29fabc0a12765de828914a18314382e5a35Ian Rogers
1087655f29fabc0a12765de828914a18314382e5a35Ian RogersMACRO1(PUSH, reg)
109a9abe872ad5ad6128d6f3fb018b6447962303eccMark Mendell    pushl REG_VAR(reg, 0)
1103f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    CFI_ADJUST_CFA_OFFSET(4)
1113f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    CFI_REL_OFFSET(REG_VAR(reg, 0), 0)
1127655f29fabc0a12765de828914a18314382e5a35Ian RogersEND_MACRO
1137655f29fabc0a12765de828914a18314382e5a35Ian Rogers
1147655f29fabc0a12765de828914a18314382e5a35Ian RogersMACRO1(POP, reg)
115a9abe872ad5ad6128d6f3fb018b6447962303eccMark Mendell    popl REG_VAR(reg,0)
1163f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    CFI_ADJUST_CFA_OFFSET(-4)
1173f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    CFI_RESTORE(REG_VAR(reg,0))
1187655f29fabc0a12765de828914a18314382e5a35Ian RogersEND_MACRO
1197655f29fabc0a12765de828914a18314382e5a35Ian Rogers
120468532ea115657709bc32ee498e701a4c71762d4Ian RogersMACRO1(UNIMPLEMENTED,name)
1213f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    FUNCTION_TYPE(\name)
122468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    .globl VAR(name, 0)
123468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    ALIGN_FUNCTION_ENTRY
124468532ea115657709bc32ee498e701a4c71762d4Ian RogersVAR(name, 0):
1253f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    CFI_STARTPROC
126468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    int3
127468532ea115657709bc32ee498e701a4c71762d4Ian Rogers    int3
1283f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    CFI_ENDPROC
1293f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell    SIZE(\name)
130468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND_MACRO
131468532ea115657709bc32ee498e701a4c71762d4Ian Rogers
132a9abe872ad5ad6128d6f3fb018b6447962303eccMark MendellMACRO0(SETUP_GOT_NOSAVE)
133a9abe872ad5ad6128d6f3fb018b6447962303eccMark Mendell    call __x86.get_pc_thunk.bx
134a9abe872ad5ad6128d6f3fb018b6447962303eccMark Mendell    addl $_GLOBAL_OFFSET_TABLE_, %ebx
135a9abe872ad5ad6128d6f3fb018b6447962303eccMark MendellEND_MACRO
136a9abe872ad5ad6128d6f3fb018b6447962303eccMark Mendell
137a9abe872ad5ad6128d6f3fb018b6447962303eccMark MendellMACRO0(SETUP_GOT)
138a9abe872ad5ad6128d6f3fb018b6447962303eccMark Mendell    PUSH  ebx
139a9abe872ad5ad6128d6f3fb018b6447962303eccMark Mendell    SETUP_GOT_NOSAVE
140a9abe872ad5ad6128d6f3fb018b6447962303eccMark MendellEND_MACRO
141a9abe872ad5ad6128d6f3fb018b6447962303eccMark Mendell
142a9abe872ad5ad6128d6f3fb018b6447962303eccMark MendellMACRO0(UNDO_SETUP_GOT)
143a9abe872ad5ad6128d6f3fb018b6447962303eccMark Mendell    POP  ebx
144a9abe872ad5ad6128d6f3fb018b6447962303eccMark MendellEND_MACRO
145a9abe872ad5ad6128d6f3fb018b6447962303eccMark Mendell
1467655f29fabc0a12765de828914a18314382e5a35Ian Rogers#endif  // ART_RUNTIME_ARCH_X86_ASM_SUPPORT_X86_S_
147