(atomic_add): Don't allow address register for operand 0.
[glibc.git] / sysdeps / cris / sysdep.h
blob913d5ad9b74eade78280df05ccf1e580e7377698
1 /* Assembler macros for CRIS.
2 Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, write to the Free
17 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18 02111-1307 USA. */
20 #include <sysdeps/generic/sysdep.h>
22 #ifndef HAVE_ELF
23 # error ELF is assumed. Generalize the code and retry.
24 #endif
26 #ifndef NO_UNDERSCORES
27 # error User-label prefix (underscore) assumed absent. Generalize the code and retry.
28 #endif
30 #ifdef __ASSEMBLER__
32 /* Syntactic details of assembly-code. */
34 /* It is *not* generally true that "ELF uses byte-counts for .align, most
35 others use log2 of count of bytes", like some neighboring configs say.
36 See "align" in gas/read.c which is not overridden by
37 gas/config/obj-elf.c. It takes a log2 argument. *Some* targets
38 override it to take a byte argument. People should read source instead
39 of relying on hearsay. */
40 # define ALIGNARG(log2) log2
42 # define ASM_TYPE_DIRECTIVE(name,typearg) .type name,typearg
43 # define ASM_SIZE_DIRECTIVE(name) .size name,.-name
45 /* The non-PIC jump is preferred, since it does not stall, and does not
46 invoke generation of a PLT. These macros assume that $r0 is set up as
47 GOT register. */
48 # ifdef __PIC__
49 # define PLTJUMP(_x) \
50 add.d C_SYMBOL_NAME (_x):PLT,$pc
52 # define PLTCALL(_x) \
53 move.d C_SYMBOL_NAME (_x):PLTG,$r9 @ \
54 add.d $r0,$r9 @ \
55 jsr $r9
57 # define SETUP_PIC \
58 push $r0 @ \
59 move.d $pc,$r0 @ \
60 sub.d .:GOTOFF,$r0
62 # define TEARDOWN_PIC pop $r0
63 # else
64 # define PLTJUMP(_x) jump C_SYMBOL_NAME (_x)
65 # define PLTCALL(_x) jsr C_SYMBOL_NAME (_x)
66 # define SETUP_PIC
67 # define TEARDOWN_PIC
68 # endif
70 /* Define an entry point visible from C. */
71 # define ENTRY(name) \
72 .text @ \
73 ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (name) @ \
74 ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME (name), function) @ \
75 .align ALIGNARG (2) @ \
76 C_LABEL(name) @ \
77 CALL_MCOUNT
79 # undef END
80 # define END(name) \
81 ASM_SIZE_DIRECTIVE (C_SYMBOL_NAME (name))
83 /* If compiled for profiling, call `mcount' at the start of each function.
84 FIXME: Note that profiling is not actually implemented. This is just
85 example code which might not even compile, though it is believed to be
86 correct. */
87 # ifdef PROF
88 # define CALL_MCOUNT \
89 push $srp @ \
90 push $r9 @ \
91 push $r10 @ \
92 push $r11 @ \
93 push $r12 @ \
94 push $r13 @ \
95 SETUP_PIC @ \
96 PLTCALL (mcount) @ \
97 TEARDOWN_PIC @ \
98 pop $r13 @ \
99 pop $r12 @ \
100 pop $r11 @ \
101 pop $r10 @ \
102 pop $r9 @ \
103 pop $srp
104 # else
105 # define CALL_MCOUNT /* Do nothing. */
106 # endif
108 /* Since C identifiers are not normally prefixed with an underscore
109 on this system, the asm identifier `syscall_error' intrudes on the
110 C name space. Make sure we use an innocuous name. */
111 # define syscall_error __syscall_error
112 # define mcount _mcount
114 #endif /* __ASSEMBLER__ */