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 229f21e419bea6be16c42363f09d6b1295eb74a030Ian Rogers#if defined(__APPLE__) || (defined(__clang__) && (__clang_major__ < 4) && (__clang_minor__ < 5)) 23861ea56e20d60f28e21d47f331c29b2e303e2dbeStephen Hines // Clang's as(1) doesn't let you name macro parameters prior to 3.5. 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 30b48b9eb6d181a1f52e2e605cf26a21505f1d46edIan Rogers // Clang's as(1) uses $0, $1, and so on for macro arguments. 31c5f17732d8144491c642776b6b48c85dfadf4b52Ian Rogers #define RAW_VAR(name,index) $index 327655f29fabc0a12765de828914a18314382e5a35Ian Rogers #define VAR(name,index) SYMBOL($index) 333f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell #define PLT_VAR(name, index) SYMBOL($index) 347655f29fabc0a12765de828914a18314382e5a35Ian Rogers #define REG_VAR(name,index) %$index 357655f29fabc0a12765de828914a18314382e5a35Ian Rogers #define CALL_MACRO(name,index) $index 36b48b9eb6d181a1f52e2e605cf26a21505f1d46edIan Rogers 37b48b9eb6d181a1f52e2e605cf26a21505f1d46edIan Rogers // The use of $x for arguments mean that literals need to be represented with $$x in macros. 387655f29fabc0a12765de828914a18314382e5a35Ian Rogers #define LITERAL(value) $value 397655f29fabc0a12765de828914a18314382e5a35Ian Rogers #define MACRO_LITERAL(value) $$value 407655f29fabc0a12765de828914a18314382e5a35Ian Rogers#else 417655f29fabc0a12765de828914a18314382e5a35Ian Rogers // Regular gas(1) lets you name macro parameters. 427655f29fabc0a12765de828914a18314382e5a35Ian Rogers #define MACRO0(macro_name) .macro macro_name 437655f29fabc0a12765de828914a18314382e5a35Ian Rogers #define MACRO1(macro_name, macro_arg1) .macro macro_name macro_arg1 447655f29fabc0a12765de828914a18314382e5a35Ian Rogers #define MACRO2(macro_name, macro_arg1, macro_arg2) .macro macro_name macro_arg1, macro_arg2 457655f29fabc0a12765de828914a18314382e5a35Ian Rogers #define MACRO3(macro_name, macro_arg1, macro_arg2, macro_arg3) .macro macro_name macro_arg1, macro_arg2, macro_arg3 467655f29fabc0a12765de828914a18314382e5a35Ian Rogers #define END_MACRO .endm 477655f29fabc0a12765de828914a18314382e5a35Ian Rogers 487655f29fabc0a12765de828914a18314382e5a35Ian Rogers // Regular gas(1) uses \argument_name for macro arguments. 497655f29fabc0a12765de828914a18314382e5a35Ian Rogers // We need to turn on alternate macro syntax so we can use & instead or the preprocessor 507655f29fabc0a12765de828914a18314382e5a35Ian Rogers // will screw us by inserting a space between the \ and the name. Even in this mode there's 517655f29fabc0a12765de828914a18314382e5a35Ian Rogers // no special meaning to $, so literals are still just $x. The use of altmacro means % is a 527655f29fabc0a12765de828914a18314382e5a35Ian Rogers // special character meaning care needs to be taken when passing registers as macro arguments. 537655f29fabc0a12765de828914a18314382e5a35Ian Rogers .altmacro 54c5f17732d8144491c642776b6b48c85dfadf4b52Ian Rogers #define RAW_VAR(name,index) name& 557655f29fabc0a12765de828914a18314382e5a35Ian Rogers #define VAR(name,index) name& 563f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell #define PLT_VAR(name, index) name&@PLT 577655f29fabc0a12765de828914a18314382e5a35Ian Rogers #define REG_VAR(name,index) %name 587655f29fabc0a12765de828914a18314382e5a35Ian Rogers #define CALL_MACRO(name,index) name& 59b48b9eb6d181a1f52e2e605cf26a21505f1d46edIan Rogers 607655f29fabc0a12765de828914a18314382e5a35Ian Rogers #define LITERAL(value) $value 617655f29fabc0a12765de828914a18314382e5a35Ian Rogers #define MACRO_LITERAL(value) $value 62b48b9eb6d181a1f52e2e605cf26a21505f1d46edIan Rogers#endif 633f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell 649f21e419bea6be16c42363f09d6b1295eb74a030Ian Rogers#if defined(__APPLE__) 659f21e419bea6be16c42363f09d6b1295eb74a030Ian Rogers #define FUNCTION_TYPE(name,index) 669f21e419bea6be16c42363f09d6b1295eb74a030Ian Rogers #define SIZE(name,index) 679f21e419bea6be16c42363f09d6b1295eb74a030Ian Rogers#elif defined(__clang__) && (__clang_major__ < 4) && (__clang_minor__ < 5) 689f21e419bea6be16c42363f09d6b1295eb74a030Ian Rogers #define FUNCTION_TYPE(name,index) .type $index, @function 699f21e419bea6be16c42363f09d6b1295eb74a030Ian Rogers #define SIZE(name,index) .size $index, .-$index 709f21e419bea6be16c42363f09d6b1295eb74a030Ian Rogers#else 719f21e419bea6be16c42363f09d6b1295eb74a030Ian Rogers #define FUNCTION_TYPE(name,index) .type name&, @function 729f21e419bea6be16c42363f09d6b1295eb74a030Ian Rogers #define SIZE(name,index) .size name, .-name 739f21e419bea6be16c42363f09d6b1295eb74a030Ian Rogers#endif 749f21e419bea6be16c42363f09d6b1295eb74a030Ian Rogers 75b48b9eb6d181a1f52e2e605cf26a21505f1d46edIan Rogers // CFI support. 76b48b9eb6d181a1f52e2e605cf26a21505f1d46edIan Rogers#if !defined(__APPLE__) 773f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell #define CFI_STARTPROC .cfi_startproc 783f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell #define CFI_ENDPROC .cfi_endproc 793f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell #define CFI_ADJUST_CFA_OFFSET(size) .cfi_adjust_cfa_offset size 803f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell #define CFI_DEF_CFA(reg,size) .cfi_def_cfa reg,size 813f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell #define CFI_DEF_CFA_REGISTER(reg) .cfi_def_cfa_register reg 823f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell #define CFI_RESTORE(reg) .cfi_restore reg 833f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell #define CFI_REL_OFFSET(reg,size) .cfi_rel_offset reg,size 84907194a395ffa5bc27cad81adbed241f9fd772f0Alexander Ivchenko #define CFI_RESTORE_STATE .cfi_restore_state 85907194a395ffa5bc27cad81adbed241f9fd772f0Alexander Ivchenko #define CFI_REMEMBER_STATE .cfi_remember_state 86b48b9eb6d181a1f52e2e605cf26a21505f1d46edIan Rogers#else 87b48b9eb6d181a1f52e2e605cf26a21505f1d46edIan Rogers // Mac OS' doesn't like cfi_* directives. 88b48b9eb6d181a1f52e2e605cf26a21505f1d46edIan Rogers #define CFI_STARTPROC 89b48b9eb6d181a1f52e2e605cf26a21505f1d46edIan Rogers #define CFI_ENDPROC 90b48b9eb6d181a1f52e2e605cf26a21505f1d46edIan Rogers #define CFI_ADJUST_CFA_OFFSET(size) 91b48b9eb6d181a1f52e2e605cf26a21505f1d46edIan Rogers #define CFI_DEF_CFA(reg,size) 92b48b9eb6d181a1f52e2e605cf26a21505f1d46edIan Rogers #define CFI_DEF_CFA_REGISTER(reg) 93b48b9eb6d181a1f52e2e605cf26a21505f1d46edIan Rogers #define CFI_RESTORE(reg) 94b48b9eb6d181a1f52e2e605cf26a21505f1d46edIan Rogers #define CFI_REL_OFFSET(reg,size) 95907194a395ffa5bc27cad81adbed241f9fd772f0Alexander Ivchenko #define CFI_RESTORE_STATE 96907194a395ffa5bc27cad81adbed241f9fd772f0Alexander Ivchenko #define CFI_REMEMBER_STATE 97b48b9eb6d181a1f52e2e605cf26a21505f1d46edIan Rogers#endif 983f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell 99b48b9eb6d181a1f52e2e605cf26a21505f1d46edIan Rogers // Symbols. 100b48b9eb6d181a1f52e2e605cf26a21505f1d46edIan Rogers#if !defined(__APPLE__) 101b48b9eb6d181a1f52e2e605cf26a21505f1d46edIan Rogers #define SYMBOL(name) name 102a0ff60587a7f81d8d065adf21008ead5f0251bbfIan Rogers #if defined(__clang__) && (__clang_major__ < 4) && (__clang_minor__ < 5) 103c5f17732d8144491c642776b6b48c85dfadf4b52Ian Rogers // TODO: Disabled for old clang 3.3, this leads to text relocations and there should be a 104a0ff60587a7f81d8d065adf21008ead5f0251bbfIan Rogers // better fix. 105a0ff60587a7f81d8d065adf21008ead5f0251bbfIan Rogers #define PLT_SYMBOL(name) name // ## @PLT 106a0ff60587a7f81d8d065adf21008ead5f0251bbfIan Rogers #else 107a0ff60587a7f81d8d065adf21008ead5f0251bbfIan Rogers #define PLT_SYMBOL(name) name ## @PLT 108a0ff60587a7f81d8d065adf21008ead5f0251bbfIan Rogers #endif 109b48b9eb6d181a1f52e2e605cf26a21505f1d46edIan Rogers#else 110b48b9eb6d181a1f52e2e605cf26a21505f1d46edIan Rogers // Mac OS' symbols have an _ prefix. 111b48b9eb6d181a1f52e2e605cf26a21505f1d46edIan Rogers #define SYMBOL(name) _ ## name 112b48b9eb6d181a1f52e2e605cf26a21505f1d46edIan Rogers #define PLT_SYMBOL(name) _ ## name 1137655f29fabc0a12765de828914a18314382e5a35Ian Rogers#endif 1147655f29fabc0a12765de828914a18314382e5a35Ian Rogers 115235e77bd9f19e4faefda109be40f8744f3a66f40Andreas Gampe// Directive to hide a function symbol. 116a0b530dd5e76662156b40c8a84ebb446b6332598Dan Albert#if defined(__APPLE__) 117a0b530dd5e76662156b40c8a84ebb446b6332598Dan Albert #define ASM_HIDDEN .private_extern 118a0b530dd5e76662156b40c8a84ebb446b6332598Dan Albert#else 119a0b530dd5e76662156b40c8a84ebb446b6332598Dan Albert #define ASM_HIDDEN .hidden 120a0b530dd5e76662156b40c8a84ebb446b6332598Dan Albert#endif 121a0b530dd5e76662156b40c8a84ebb446b6332598Dan Albert 1227655f29fabc0a12765de828914a18314382e5a35Ian Rogers /* Cache alignment for function entry */ 1237655f29fabc0a12765de828914a18314382e5a35Ian RogersMACRO0(ALIGN_FUNCTION_ENTRY) 1247655f29fabc0a12765de828914a18314382e5a35Ian Rogers .balign 16 1257655f29fabc0a12765de828914a18314382e5a35Ian RogersEND_MACRO 1267655f29fabc0a12765de828914a18314382e5a35Ian Rogers 1277655f29fabc0a12765de828914a18314382e5a35Ian RogersMACRO1(DEFINE_FUNCTION, c_name) 128b48b9eb6d181a1f52e2e605cf26a21505f1d46edIan Rogers FUNCTION_TYPE(\c_name, 0) 129235e77bd9f19e4faefda109be40f8744f3a66f40Andreas Gampe ASM_HIDDEN VAR(c_name, 0) 130235e77bd9f19e4faefda109be40f8744f3a66f40Andreas Gampe .globl VAR(c_name, 0) 131235e77bd9f19e4faefda109be40f8744f3a66f40Andreas Gampe ALIGN_FUNCTION_ENTRY 132235e77bd9f19e4faefda109be40f8744f3a66f40Andreas GampeVAR(c_name, 0): 133235e77bd9f19e4faefda109be40f8744f3a66f40Andreas Gampe CFI_STARTPROC 134235e77bd9f19e4faefda109be40f8744f3a66f40Andreas Gampe // Ensure we get a sane starting CFA. 135235e77bd9f19e4faefda109be40f8744f3a66f40Andreas Gampe CFI_DEF_CFA(esp, 4) 136235e77bd9f19e4faefda109be40f8744f3a66f40Andreas GampeEND_MACRO 137235e77bd9f19e4faefda109be40f8744f3a66f40Andreas Gampe 138235e77bd9f19e4faefda109be40f8744f3a66f40Andreas GampeMACRO1(DEFINE_FUNCTION_NO_HIDE, c_name) 139235e77bd9f19e4faefda109be40f8744f3a66f40Andreas Gampe FUNCTION_TYPE(\c_name, 0) 1407655f29fabc0a12765de828914a18314382e5a35Ian Rogers .globl VAR(c_name, 0) 1417655f29fabc0a12765de828914a18314382e5a35Ian Rogers ALIGN_FUNCTION_ENTRY 1427655f29fabc0a12765de828914a18314382e5a35Ian RogersVAR(c_name, 0): 1433f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell CFI_STARTPROC 144c6651298ef631d787a17c4f6f751bffe9e748a28Ian Rogers // Ensure we get a sane starting CFA. 145ee043fc5b2459d221ff020e2b096e2d492311d11Ian Rogers CFI_DEF_CFA(esp, 4) 1467655f29fabc0a12765de828914a18314382e5a35Ian RogersEND_MACRO 1477655f29fabc0a12765de828914a18314382e5a35Ian Rogers 1487655f29fabc0a12765de828914a18314382e5a35Ian RogersMACRO1(END_FUNCTION, c_name) 1493f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell CFI_ENDPROC 150b48b9eb6d181a1f52e2e605cf26a21505f1d46edIan Rogers SIZE(\c_name, 0) 1517655f29fabc0a12765de828914a18314382e5a35Ian RogersEND_MACRO 1527655f29fabc0a12765de828914a18314382e5a35Ian Rogers 1537655f29fabc0a12765de828914a18314382e5a35Ian RogersMACRO1(PUSH, reg) 154a9abe872ad5ad6128d6f3fb018b6447962303eccMark Mendell pushl REG_VAR(reg, 0) 1553f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell CFI_ADJUST_CFA_OFFSET(4) 1563f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell CFI_REL_OFFSET(REG_VAR(reg, 0), 0) 1577655f29fabc0a12765de828914a18314382e5a35Ian RogersEND_MACRO 1587655f29fabc0a12765de828914a18314382e5a35Ian Rogers 1597655f29fabc0a12765de828914a18314382e5a35Ian RogersMACRO1(POP, reg) 160a9abe872ad5ad6128d6f3fb018b6447962303eccMark Mendell popl REG_VAR(reg,0) 1613f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell CFI_ADJUST_CFA_OFFSET(-4) 1623f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell CFI_RESTORE(REG_VAR(reg,0)) 1637655f29fabc0a12765de828914a18314382e5a35Ian RogersEND_MACRO 1647655f29fabc0a12765de828914a18314382e5a35Ian Rogers 165468532ea115657709bc32ee498e701a4c71762d4Ian RogersMACRO1(UNIMPLEMENTED,name) 166b48b9eb6d181a1f52e2e605cf26a21505f1d46edIan Rogers FUNCTION_TYPE(\name, 0) 167468532ea115657709bc32ee498e701a4c71762d4Ian Rogers .globl VAR(name, 0) 168468532ea115657709bc32ee498e701a4c71762d4Ian Rogers ALIGN_FUNCTION_ENTRY 169468532ea115657709bc32ee498e701a4c71762d4Ian RogersVAR(name, 0): 1703f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell CFI_STARTPROC 171468532ea115657709bc32ee498e701a4c71762d4Ian Rogers int3 172468532ea115657709bc32ee498e701a4c71762d4Ian Rogers int3 1733f2d031f639b3b9dd4adbf9e70d23de931a9801dMark Mendell CFI_ENDPROC 174b48b9eb6d181a1f52e2e605cf26a21505f1d46edIan Rogers SIZE(\name, 0) 175468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND_MACRO 176468532ea115657709bc32ee498e701a4c71762d4Ian Rogers 177a9abe872ad5ad6128d6f3fb018b6447962303eccMark MendellMACRO0(SETUP_GOT_NOSAVE) 178c5f17732d8144491c642776b6b48c85dfadf4b52Ian Rogers#ifndef __APPLE__ 179a9abe872ad5ad6128d6f3fb018b6447962303eccMark Mendell call __x86.get_pc_thunk.bx 180a9abe872ad5ad6128d6f3fb018b6447962303eccMark Mendell addl $_GLOBAL_OFFSET_TABLE_, %ebx 181c5f17732d8144491c642776b6b48c85dfadf4b52Ian Rogers#endif 182a9abe872ad5ad6128d6f3fb018b6447962303eccMark MendellEND_MACRO 183a9abe872ad5ad6128d6f3fb018b6447962303eccMark Mendell 184a9abe872ad5ad6128d6f3fb018b6447962303eccMark MendellMACRO0(SETUP_GOT) 185a9abe872ad5ad6128d6f3fb018b6447962303eccMark Mendell PUSH ebx 186a9abe872ad5ad6128d6f3fb018b6447962303eccMark Mendell SETUP_GOT_NOSAVE 187a9abe872ad5ad6128d6f3fb018b6447962303eccMark MendellEND_MACRO 188a9abe872ad5ad6128d6f3fb018b6447962303eccMark Mendell 189a9abe872ad5ad6128d6f3fb018b6447962303eccMark MendellMACRO0(UNDO_SETUP_GOT) 190a9abe872ad5ad6128d6f3fb018b6447962303eccMark Mendell POP ebx 191a9abe872ad5ad6128d6f3fb018b6447962303eccMark MendellEND_MACRO 192a9abe872ad5ad6128d6f3fb018b6447962303eccMark Mendell 1937655f29fabc0a12765de828914a18314382e5a35Ian Rogers#endif // ART_RUNTIME_ARCH_X86_ASM_SUPPORT_X86_S_ 194