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