1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * Copyright (c) 2009 Loren Merritt
3cabdff1aSopenharmony_ci *
4cabdff1aSopenharmony_ci * This file is part of FFmpeg.
5cabdff1aSopenharmony_ci *
6cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
7cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
8cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
9cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
10cabdff1aSopenharmony_ci *
11cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
12cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
13cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14cabdff1aSopenharmony_ci * Lesser General Public License for more details.
15cabdff1aSopenharmony_ci *
16cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
17cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
18cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19cabdff1aSopenharmony_ci */
20cabdff1aSopenharmony_ci
21cabdff1aSopenharmony_ci#include "config.h"
22cabdff1aSopenharmony_ci
23cabdff1aSopenharmony_ci#define GLUE(a, b) a ## b
24cabdff1aSopenharmony_ci#define JOIN(a, b) GLUE(a, b)
25cabdff1aSopenharmony_ci#define X(s) JOIN(EXTERN_ASM, s)
26cabdff1aSopenharmony_ci
27cabdff1aSopenharmony_ci#if __APPLE__
28cabdff1aSopenharmony_ci#define R(n) r ## n
29cabdff1aSopenharmony_ci#else
30cabdff1aSopenharmony_ci#define R(n) n
31cabdff1aSopenharmony_ci#endif
32cabdff1aSopenharmony_ci
33cabdff1aSopenharmony_ci#if ARCH_PPC64
34cabdff1aSopenharmony_ci
35cabdff1aSopenharmony_ci#define PTR  .quad
36cabdff1aSopenharmony_ci#define lp   ld
37cabdff1aSopenharmony_ci#define lpx  ldx
38cabdff1aSopenharmony_ci#define stp  std
39cabdff1aSopenharmony_ci#define stpu stdu
40cabdff1aSopenharmony_ci#define PS   8
41cabdff1aSopenharmony_ci#define L(s) JOIN(., s)
42cabdff1aSopenharmony_ci
43cabdff1aSopenharmony_ci.macro extfunc name
44cabdff1aSopenharmony_ci    .global X(\name)
45cabdff1aSopenharmony_ci#if _CALL_ELF == 2
46cabdff1aSopenharmony_ci    .text
47cabdff1aSopenharmony_ciX(\name):
48cabdff1aSopenharmony_ci    addis %r2, %r12, .TOC.-X(\name)@ha
49cabdff1aSopenharmony_ci    addi %r2, %r2, .TOC.-X(\name)@l
50cabdff1aSopenharmony_ci    .localentry X(\name), .-X(\name)
51cabdff1aSopenharmony_ci#else
52cabdff1aSopenharmony_ci    .section .opd, "aw"
53cabdff1aSopenharmony_ciX(\name):
54cabdff1aSopenharmony_ci    .quad L(\name), .TOC.@tocbase, 0
55cabdff1aSopenharmony_ci    .previous
56cabdff1aSopenharmony_ci    .type X(\name), STT_FUNC
57cabdff1aSopenharmony_ciL(\name):
58cabdff1aSopenharmony_ci#endif
59cabdff1aSopenharmony_ci.endm
60cabdff1aSopenharmony_ci
61cabdff1aSopenharmony_ci.macro movrel rd, sym, gp
62cabdff1aSopenharmony_ci    ld      \rd, \sym@got(R(2))
63cabdff1aSopenharmony_ci.endm
64cabdff1aSopenharmony_ci
65cabdff1aSopenharmony_ci.macro get_got rd
66cabdff1aSopenharmony_ci.endm
67cabdff1aSopenharmony_ci
68cabdff1aSopenharmony_ci#else /* ARCH_PPC64 */
69cabdff1aSopenharmony_ci
70cabdff1aSopenharmony_ci#define PTR  .int
71cabdff1aSopenharmony_ci#define lp   lwz
72cabdff1aSopenharmony_ci#define lpx  lwzx
73cabdff1aSopenharmony_ci#define stp  stw
74cabdff1aSopenharmony_ci#define stpu stwu
75cabdff1aSopenharmony_ci#define PS   4
76cabdff1aSopenharmony_ci#define L(s) s
77cabdff1aSopenharmony_ci
78cabdff1aSopenharmony_ci.macro extfunc name
79cabdff1aSopenharmony_ci    .global X(\name)
80cabdff1aSopenharmony_ci    .type   X(\name), STT_FUNC
81cabdff1aSopenharmony_ciX(\name):
82cabdff1aSopenharmony_ci\name:
83cabdff1aSopenharmony_ci.endm
84cabdff1aSopenharmony_ci
85cabdff1aSopenharmony_ci.macro movrel rd, sym, gp
86cabdff1aSopenharmony_ci#if CONFIG_PIC
87cabdff1aSopenharmony_ci    lwz     \rd, \sym@got(\gp)
88cabdff1aSopenharmony_ci#else
89cabdff1aSopenharmony_ci    lis     \rd, \sym@ha
90cabdff1aSopenharmony_ci    la      \rd, \sym@l(\rd)
91cabdff1aSopenharmony_ci#endif
92cabdff1aSopenharmony_ci.endm
93cabdff1aSopenharmony_ci
94cabdff1aSopenharmony_ci.macro get_got rd
95cabdff1aSopenharmony_ci#if CONFIG_PIC
96cabdff1aSopenharmony_ci    bcl     20, 31, .Lgot\@
97cabdff1aSopenharmony_ci.Lgot\@:
98cabdff1aSopenharmony_ci    mflr    \rd
99cabdff1aSopenharmony_ci    addis   \rd, \rd, _GLOBAL_OFFSET_TABLE_ - .Lgot\@@ha
100cabdff1aSopenharmony_ci    addi    \rd, \rd, _GLOBAL_OFFSET_TABLE_ - .Lgot\@@l
101cabdff1aSopenharmony_ci#endif
102cabdff1aSopenharmony_ci.endm
103cabdff1aSopenharmony_ci
104cabdff1aSopenharmony_ci#endif /* ARCH_PPC64 */
105cabdff1aSopenharmony_ci
106cabdff1aSopenharmony_ci#if HAVE_IBM_ASM
107cabdff1aSopenharmony_ci
108cabdff1aSopenharmony_ci.macro DEFINE_REG n
109cabdff1aSopenharmony_ci    .equiv r\n, \n
110cabdff1aSopenharmony_ci    .equiv f\n, \n
111cabdff1aSopenharmony_ci    .equiv v\n, \n
112cabdff1aSopenharmony_ci.endm
113cabdff1aSopenharmony_ci
114cabdff1aSopenharmony_ciDEFINE_REG 0
115cabdff1aSopenharmony_ciDEFINE_REG 1
116cabdff1aSopenharmony_ciDEFINE_REG 2
117cabdff1aSopenharmony_ciDEFINE_REG 3
118cabdff1aSopenharmony_ciDEFINE_REG 4
119cabdff1aSopenharmony_ciDEFINE_REG 5
120cabdff1aSopenharmony_ciDEFINE_REG 6
121cabdff1aSopenharmony_ciDEFINE_REG 7
122cabdff1aSopenharmony_ciDEFINE_REG 8
123cabdff1aSopenharmony_ciDEFINE_REG 9
124cabdff1aSopenharmony_ciDEFINE_REG 10
125cabdff1aSopenharmony_ciDEFINE_REG 11
126cabdff1aSopenharmony_ciDEFINE_REG 12
127cabdff1aSopenharmony_ciDEFINE_REG 13
128cabdff1aSopenharmony_ciDEFINE_REG 14
129cabdff1aSopenharmony_ciDEFINE_REG 15
130cabdff1aSopenharmony_ciDEFINE_REG 16
131cabdff1aSopenharmony_ciDEFINE_REG 17
132cabdff1aSopenharmony_ciDEFINE_REG 18
133cabdff1aSopenharmony_ciDEFINE_REG 19
134cabdff1aSopenharmony_ciDEFINE_REG 20
135cabdff1aSopenharmony_ciDEFINE_REG 21
136cabdff1aSopenharmony_ciDEFINE_REG 22
137cabdff1aSopenharmony_ciDEFINE_REG 23
138cabdff1aSopenharmony_ciDEFINE_REG 24
139cabdff1aSopenharmony_ciDEFINE_REG 25
140cabdff1aSopenharmony_ciDEFINE_REG 26
141cabdff1aSopenharmony_ciDEFINE_REG 27
142cabdff1aSopenharmony_ciDEFINE_REG 28
143cabdff1aSopenharmony_ciDEFINE_REG 29
144cabdff1aSopenharmony_ciDEFINE_REG 30
145cabdff1aSopenharmony_ciDEFINE_REG 31
146cabdff1aSopenharmony_ci
147cabdff1aSopenharmony_ci#endif /* HAVE_IBM_ASM */
148