asm_support_x86.S revision 468532ea115657709bc32ee498e701a4c71762d4
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 347655f29fabc0a12765de828914a18314382e5a35Ian Rogers #define VAR(name,index) SYMBOL($index) 357655f29fabc0a12765de828914a18314382e5a35Ian Rogers #define REG_VAR(name,index) %$index 367655f29fabc0a12765de828914a18314382e5a35Ian Rogers #define CALL_MACRO(name,index) $index 377655f29fabc0a12765de828914a18314382e5a35Ian Rogers #define LITERAL(value) $value 387655f29fabc0a12765de828914a18314382e5a35Ian Rogers #define MACRO_LITERAL(value) $$value 397655f29fabc0a12765de828914a18314382e5a35Ian Rogers#else 407655f29fabc0a12765de828914a18314382e5a35Ian Rogers // Regular gas(1) lets you name macro parameters. 417655f29fabc0a12765de828914a18314382e5a35Ian Rogers #define MACRO0(macro_name) .macro macro_name 427655f29fabc0a12765de828914a18314382e5a35Ian Rogers #define MACRO1(macro_name, macro_arg1) .macro macro_name macro_arg1 437655f29fabc0a12765de828914a18314382e5a35Ian Rogers #define MACRO2(macro_name, macro_arg1, macro_arg2) .macro macro_name macro_arg1, macro_arg2 447655f29fabc0a12765de828914a18314382e5a35Ian Rogers #define MACRO3(macro_name, macro_arg1, macro_arg2, macro_arg3) .macro macro_name macro_arg1, macro_arg2, macro_arg3 457655f29fabc0a12765de828914a18314382e5a35Ian Rogers #define END_MACRO .endm 467655f29fabc0a12765de828914a18314382e5a35Ian Rogers 477655f29fabc0a12765de828914a18314382e5a35Ian Rogers // Regular gas(1) uses \argument_name for macro arguments. 487655f29fabc0a12765de828914a18314382e5a35Ian Rogers // We need to turn on alternate macro syntax so we can use & instead or the preprocessor 497655f29fabc0a12765de828914a18314382e5a35Ian Rogers // will screw us by inserting a space between the \ and the name. Even in this mode there's 507655f29fabc0a12765de828914a18314382e5a35Ian Rogers // no special meaning to $, so literals are still just $x. The use of altmacro means % is a 517655f29fabc0a12765de828914a18314382e5a35Ian Rogers // special character meaning care needs to be taken when passing registers as macro arguments. 527655f29fabc0a12765de828914a18314382e5a35Ian Rogers .altmacro 537655f29fabc0a12765de828914a18314382e5a35Ian Rogers #define SYMBOL(name) name 547655f29fabc0a12765de828914a18314382e5a35Ian Rogers #define VAR(name,index) name& 557655f29fabc0a12765de828914a18314382e5a35Ian Rogers #define REG_VAR(name,index) %name 567655f29fabc0a12765de828914a18314382e5a35Ian Rogers #define CALL_MACRO(name,index) name& 577655f29fabc0a12765de828914a18314382e5a35Ian Rogers #define LITERAL(value) $value 587655f29fabc0a12765de828914a18314382e5a35Ian Rogers #define MACRO_LITERAL(value) $value 597655f29fabc0a12765de828914a18314382e5a35Ian Rogers#endif 607655f29fabc0a12765de828914a18314382e5a35Ian Rogers 617655f29fabc0a12765de828914a18314382e5a35Ian Rogers /* Cache alignment for function entry */ 627655f29fabc0a12765de828914a18314382e5a35Ian RogersMACRO0(ALIGN_FUNCTION_ENTRY) 637655f29fabc0a12765de828914a18314382e5a35Ian Rogers .balign 16 647655f29fabc0a12765de828914a18314382e5a35Ian RogersEND_MACRO 657655f29fabc0a12765de828914a18314382e5a35Ian Rogers 667655f29fabc0a12765de828914a18314382e5a35Ian RogersMACRO1(DEFINE_FUNCTION, c_name) 677655f29fabc0a12765de828914a18314382e5a35Ian Rogers .type VAR(c_name, 0), @function 687655f29fabc0a12765de828914a18314382e5a35Ian Rogers .globl VAR(c_name, 0) 697655f29fabc0a12765de828914a18314382e5a35Ian Rogers ALIGN_FUNCTION_ENTRY 707655f29fabc0a12765de828914a18314382e5a35Ian RogersVAR(c_name, 0): 717655f29fabc0a12765de828914a18314382e5a35Ian Rogers .cfi_startproc 727655f29fabc0a12765de828914a18314382e5a35Ian RogersEND_MACRO 737655f29fabc0a12765de828914a18314382e5a35Ian Rogers 747655f29fabc0a12765de828914a18314382e5a35Ian RogersMACRO1(END_FUNCTION, c_name) 757655f29fabc0a12765de828914a18314382e5a35Ian Rogers .cfi_endproc 767655f29fabc0a12765de828914a18314382e5a35Ian Rogers .size \c_name, .-\c_name 777655f29fabc0a12765de828914a18314382e5a35Ian RogersEND_MACRO 787655f29fabc0a12765de828914a18314382e5a35Ian Rogers 797655f29fabc0a12765de828914a18314382e5a35Ian RogersMACRO1(PUSH, reg) 807655f29fabc0a12765de828914a18314382e5a35Ian Rogers pushl REG_VAR(reg, 0) 817655f29fabc0a12765de828914a18314382e5a35Ian Rogers .cfi_adjust_cfa_offset 4 827655f29fabc0a12765de828914a18314382e5a35Ian Rogers .cfi_rel_offset REG_VAR(reg, 0), 0 837655f29fabc0a12765de828914a18314382e5a35Ian RogersEND_MACRO 847655f29fabc0a12765de828914a18314382e5a35Ian Rogers 857655f29fabc0a12765de828914a18314382e5a35Ian RogersMACRO1(POP, reg) 867655f29fabc0a12765de828914a18314382e5a35Ian Rogers popl REG_VAR(reg,0) 877655f29fabc0a12765de828914a18314382e5a35Ian Rogers .cfi_adjust_cfa_offset -4 887655f29fabc0a12765de828914a18314382e5a35Ian Rogers .cfi_restore REG_VAR(reg,0) 897655f29fabc0a12765de828914a18314382e5a35Ian RogersEND_MACRO 907655f29fabc0a12765de828914a18314382e5a35Ian Rogers 91468532ea115657709bc32ee498e701a4c71762d4Ian RogersMACRO1(UNIMPLEMENTED,name) 92468532ea115657709bc32ee498e701a4c71762d4Ian Rogers .type VAR(name, 0), @function 93468532ea115657709bc32ee498e701a4c71762d4Ian Rogers .globl VAR(name, 0) 94468532ea115657709bc32ee498e701a4c71762d4Ian Rogers ALIGN_FUNCTION_ENTRY 95468532ea115657709bc32ee498e701a4c71762d4Ian RogersVAR(name, 0): 96468532ea115657709bc32ee498e701a4c71762d4Ian Rogers .cfi_startproc 97468532ea115657709bc32ee498e701a4c71762d4Ian Rogers int3 98468532ea115657709bc32ee498e701a4c71762d4Ian Rogers int3 99468532ea115657709bc32ee498e701a4c71762d4Ian Rogers .cfi_endproc 100468532ea115657709bc32ee498e701a4c71762d4Ian Rogers .size \name, .-\name 101468532ea115657709bc32ee498e701a4c71762d4Ian RogersEND_MACRO 102468532ea115657709bc32ee498e701a4c71762d4Ian Rogers 1037655f29fabc0a12765de828914a18314382e5a35Ian Rogers#endif // ART_RUNTIME_ARCH_X86_ASM_SUPPORT_X86_S_ 104