• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ART_RUNTIME_ARCH_X86_ASM_SUPPORT_X86_S_
18#define ART_RUNTIME_ARCH_X86_ASM_SUPPORT_X86_S_
19
20#include "asm_support_x86.h"
21
22#if defined(__APPLE__)
23    // Mac OS' as(1) doesn't let you name macro parameters.
24    #define MACRO0(macro_name) .macro macro_name
25    #define MACRO1(macro_name, macro_arg1) .macro macro_name
26    #define MACRO2(macro_name, macro_arg1, macro_args2) .macro macro_name
27    #define MACRO3(macro_name, macro_arg1, macro_args2, macro_args3) .macro macro_name
28    #define END_MACRO .endmacro
29
30    // Mac OS' as(1) uses $0, $1, and so on for macro arguments, and function names
31    // are mangled with an extra underscore prefix. The use of $x for arguments
32    // mean that literals need to be represented with $$x in macros.
33    #define SYMBOL(name) _ ## name
34    #define VAR(name,index) SYMBOL($index)
35    #define REG_VAR(name,index) %$index
36    #define CALL_MACRO(name,index) $index
37    #define LITERAL(value) $value
38    #define MACRO_LITERAL(value) $$value
39#else
40    // Regular gas(1) lets you name macro parameters.
41    #define MACRO0(macro_name) .macro macro_name
42    #define MACRO1(macro_name, macro_arg1) .macro macro_name macro_arg1
43    #define MACRO2(macro_name, macro_arg1, macro_arg2) .macro macro_name macro_arg1, macro_arg2
44    #define MACRO3(macro_name, macro_arg1, macro_arg2, macro_arg3) .macro macro_name macro_arg1, macro_arg2, macro_arg3
45    #define END_MACRO .endm
46
47    // Regular gas(1) uses \argument_name for macro arguments.
48    // We need to turn on alternate macro syntax so we can use & instead or the preprocessor
49    // will screw us by inserting a space between the \ and the name. Even in this mode there's
50    // no special meaning to $, so literals are still just $x. The use of altmacro means % is a
51    // special character meaning care needs to be taken when passing registers as macro arguments.
52    .altmacro
53    #define SYMBOL(name) name
54    #define VAR(name,index) name&
55    #define REG_VAR(name,index) %name
56    #define CALL_MACRO(name,index) name&
57    #define LITERAL(value) $value
58    #define MACRO_LITERAL(value) $value
59#endif
60
61    /* Cache alignment for function entry */
62MACRO0(ALIGN_FUNCTION_ENTRY)
63    .balign 16
64END_MACRO
65
66MACRO1(DEFINE_FUNCTION, c_name)
67    .type VAR(c_name, 0), @function
68    .globl VAR(c_name, 0)
69    ALIGN_FUNCTION_ENTRY
70VAR(c_name, 0):
71    .cfi_startproc
72END_MACRO
73
74MACRO1(END_FUNCTION, c_name)
75    .cfi_endproc
76    .size \c_name, .-\c_name
77END_MACRO
78
79MACRO1(PUSH, reg)
80  pushl REG_VAR(reg, 0)
81  .cfi_adjust_cfa_offset 4
82  .cfi_rel_offset REG_VAR(reg, 0), 0
83END_MACRO
84
85MACRO1(POP, reg)
86  popl REG_VAR(reg,0)
87  .cfi_adjust_cfa_offset -4
88  .cfi_restore REG_VAR(reg,0)
89END_MACRO
90
91MACRO1(UNIMPLEMENTED,name)
92    .type VAR(name, 0), @function
93    .globl VAR(name, 0)
94    ALIGN_FUNCTION_ENTRY
95VAR(name, 0):
96    .cfi_startproc
97    int3
98    int3
99    .cfi_endproc
100    .size \name, .-\name
101END_MACRO
102
103#endif  // ART_RUNTIME_ARCH_X86_ASM_SUPPORT_X86_S_
104