1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
/*
* Copyright (C) 2006 CodeSourcery Inc
*
* Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
*
* This file defines some m68k assembly macros for handling the differences
* between PIC and non-PIC.
*/
#include <features.h>
/* When assembling code for shared flat libraries, this is nonzero
* if %a5 points the current library's GOT. */
.equ have_current_got, 0
/* Perform the equivalent of "<op> <target>", where <target> is
* a text address. <tmp> is available as a temporary address
* register. */
.macro DO_TEXT op,target,tmp
#if defined __UCLIBC_FORMAT_SHARED_FLAT__
.ifne have_current_got
move.l \target@GOT(%a5),\tmp
.else
move.l _current_shared_library_a5_offset_(%a5),\tmp
move.l \target@GOT(\tmp),\tmp
.endif
\op (\tmp)
#elif defined __PIC__
lea \target-.-8,\tmp
\op (%pc,\tmp)
#else
\op \target
#endif
.endm
/* Do "pea <target>" when <target> is a text address.
* <tmp> is available as a temporary register. */
.macro PEA_TEXT target,tmp
DO_TEXT pea,\target,\tmp
.endm
/* Likewise jsr. */
.macro CALL target,tmp
DO_TEXT jsr,\target,\tmp
.endm
/* Likewise jmp. */
.macro JUMP target,tmp
DO_TEXT jmp,\target,\tmp
.endm
/* Initialize the global pointer, if functions need to do that. */
.macro INIT_GP
#if defined __UCLIBC_FORMAT_SHARED_FLAT__
move.l %a5,-(%sp)
move.l _current_shared_library_a5_offset_(%a5),%a5
#endif
.endm
/* Undo the effects of INIT_GP. */
.macro FINI_GP
#if defined __UCLIBC_FORMAT_SHARED_FLAT__
move.l (%sp)+,%a5
#endif
.endm
|