1/* PowerPC asm definitions for GNU C. 2 3Copyright (C) 2002-2020 Free Software Foundation, Inc. 4 5This file is part of GCC. 6 7GCC is free software; you can redistribute it and/or modify it under 8the terms of the GNU General Public License as published by the Free 9Software Foundation; either version 3, or (at your option) any later 10version. 11 12GCC is distributed in the hope that it will be useful, but WITHOUT ANY 13WARRANTY; without even the implied warranty of MERCHANTABILITY or 14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15for more details. 16 17Under Section 7 of GPL version 3, you are granted additional 18permissions described in the GCC Runtime Library Exception, version 193.1, as published by the Free Software Foundation. 20 21You should have received a copy of the GNU General Public License and 22a copy of the GCC Runtime Library Exception along with this program; 23see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 24<http://www.gnu.org/licenses/>. */ 25 26/* Under winnt, 1) gas supports the following as names and 2) in particular 27 defining "toc" breaks the FUNC_START macro as ".toc" becomes ".2" */ 28 29#define r0 0 30#define sp 1 31#define toc 2 32#define r3 3 33#define r4 4 34#define r5 5 35#define r6 6 36#define r7 7 37#define r8 8 38#define r9 9 39#define r10 10 40#define r11 11 41#define r12 12 42#define r13 13 43#define r14 14 44#define r15 15 45#define r16 16 46#define r17 17 47#define r18 18 48#define r19 19 49#define r20 20 50#define r21 21 51#define r22 22 52#define r23 23 53#define r24 24 54#define r25 25 55#define r26 26 56#define r27 27 57#define r28 28 58#define r29 29 59#define r30 30 60#define r31 31 61 62#define cr0 0 63#define cr1 1 64#define cr2 2 65#define cr3 3 66#define cr4 4 67#define cr5 5 68#define cr6 6 69#define cr7 7 70 71#define f0 0 72#define f1 1 73#define f2 2 74#define f3 3 75#define f4 4 76#define f5 5 77#define f6 6 78#define f7 7 79#define f8 8 80#define f9 9 81#define f10 10 82#define f11 11 83#define f12 12 84#define f13 13 85#define f14 14 86#define f15 15 87#define f16 16 88#define f17 17 89#define f18 18 90#define f19 19 91#define f20 20 92#define f21 21 93#define f22 22 94#define f23 23 95#define f24 24 96#define f25 25 97#define f26 26 98#define f27 27 99#define f28 28 100#define f29 29 101#define f30 30 102#define f31 31 103 104#ifdef __VSX__ 105#define f32 32 106#define f33 33 107#define f34 34 108#define f35 35 109#define f36 36 110#define f37 37 111#define f38 38 112#define f39 39 113#define f40 40 114#define f41 41 115#define f42 42 116#define f43 43 117#define f44 44 118#define f45 45 119#define f46 46 120#define f47 47 121#define f48 48 122#define f49 49 123#define f50 50 124#define f51 51 125#define f52 52 126#define f53 53 127#define f54 54 128#define f55 55 129#define f56 56 130#define f57 57 131#define f58 58 132#define f59 59 133#define f60 60 134#define f61 61 135#define f62 62 136#define f63 63 137#endif 138 139#ifdef __ALTIVEC__ 140#define v0 0 141#define v1 1 142#define v2 2 143#define v3 3 144#define v4 4 145#define v5 5 146#define v6 6 147#define v7 7 148#define v8 8 149#define v9 9 150#define v10 10 151#define v11 11 152#define v12 12 153#define v13 13 154#define v14 14 155#define v15 15 156#define v16 16 157#define v17 17 158#define v18 18 159#define v19 19 160#define v20 20 161#define v21 21 162#define v22 22 163#define v23 23 164#define v24 24 165#define v25 25 166#define v26 26 167#define v27 27 168#define v28 28 169#define v29 29 170#define v30 30 171#define v31 31 172#endif 173 174#ifdef __VSX__ 175#define vs0 0 176#define vs1 1 177#define vs2 2 178#define vs3 3 179#define vs4 4 180#define vs5 5 181#define vs6 6 182#define vs7 7 183#define vs8 8 184#define vs9 9 185#define vs10 10 186#define vs11 11 187#define vs12 12 188#define vs13 13 189#define vs14 14 190#define vs15 15 191#define vs16 16 192#define vs17 17 193#define vs18 18 194#define vs19 19 195#define vs20 20 196#define vs21 21 197#define vs22 22 198#define vs23 23 199#define vs24 24 200#define vs25 25 201#define vs26 26 202#define vs27 27 203#define vs28 28 204#define vs29 29 205#define vs30 30 206#define vs31 31 207#define vs32 32 208#define vs33 33 209#define vs34 34 210#define vs35 35 211#define vs36 36 212#define vs37 37 213#define vs38 38 214#define vs39 39 215#define vs40 40 216#define vs41 41 217#define vs42 42 218#define vs43 43 219#define vs44 44 220#define vs45 45 221#define vs46 46 222#define vs47 47 223#define vs48 48 224#define vs49 49 225#define vs50 50 226#define vs51 51 227#define vs52 52 228#define vs53 53 229#define vs54 54 230#define vs55 55 231#define vs56 56 232#define vs57 57 233#define vs58 58 234#define vs59 59 235#define vs60 60 236#define vs61 61 237#define vs62 62 238#define vs63 63 239#endif 240 241/* 242 * Macros to glue together two tokens. 243 */ 244 245#ifdef __STDC__ 246#define XGLUE(a,b) a##b 247#else 248#define XGLUE(a,b) a/**/b 249#endif 250 251#define GLUE(a,b) XGLUE(a,b) 252 253/* 254 * Macros to begin and end a function written in assembler. If -mcall-aixdesc 255 * or -mcall-nt, create a function descriptor with the given name, and create 256 * the real function with one or two leading periods respectively. 257 */ 258 259#if defined(__powerpc64__) && _CALL_ELF == 2 260 261/* Defining "toc" above breaks @toc in assembler code. */ 262#undef toc 263 264#define FUNC_NAME(name) GLUE(__USER_LABEL_PREFIX__,name) 265#ifdef __PCREL__ 266#define JUMP_TARGET(name) GLUE(FUNC_NAME(name),@notoc) 267#define FUNC_START(name) \ 268 .type FUNC_NAME(name),@function; \ 269 .globl FUNC_NAME(name); \ 270FUNC_NAME(name): \ 271 .localentry FUNC_NAME(name),1 272#else 273#define JUMP_TARGET(name) FUNC_NAME(name) 274#define FUNC_START(name) \ 275 .type FUNC_NAME(name),@function; \ 276 .globl FUNC_NAME(name); \ 277FUNC_NAME(name): \ 2780: addis 2,12,(.TOC.-0b)@ha; \ 279 addi 2,2,(.TOC.-0b)@l; \ 280 .localentry FUNC_NAME(name),.-FUNC_NAME(name) 281#endif /* !__PCREL__ */ 282 283#define HIDDEN_FUNC(name) \ 284 FUNC_START(name) \ 285 .hidden FUNC_NAME(name); 286 287#define FUNC_END(name) \ 288 .size FUNC_NAME(name),.-FUNC_NAME(name) 289 290#elif defined (__powerpc64__) 291 292#define FUNC_NAME(name) GLUE(.,name) 293#define JUMP_TARGET(name) FUNC_NAME(name) 294#define FUNC_START(name) \ 295 .section ".opd","aw"; \ 296name: \ 297 .quad GLUE(.,name); \ 298 .quad .TOC.@tocbase; \ 299 .quad 0; \ 300 .previous; \ 301 .type GLUE(.,name),@function; \ 302 .globl name; \ 303 .globl GLUE(.,name); \ 304GLUE(.,name): 305 306#define HIDDEN_FUNC(name) \ 307 FUNC_START(name) \ 308 .hidden name; \ 309 .hidden GLUE(.,name); 310 311#define FUNC_END(name) \ 312GLUE(.L,name): \ 313 .size GLUE(.,name),GLUE(.L,name)-GLUE(.,name) 314 315#elif defined(_CALL_AIXDESC) 316 317#ifdef _RELOCATABLE 318#define DESC_SECTION ".got2" 319#else 320#define DESC_SECTION ".got1" 321#endif 322 323#define FUNC_NAME(name) GLUE(.,name) 324#define JUMP_TARGET(name) FUNC_NAME(name) 325#define FUNC_START(name) \ 326 .section DESC_SECTION,"aw"; \ 327name: \ 328 .long GLUE(.,name); \ 329 .long _GLOBAL_OFFSET_TABLE_; \ 330 .long 0; \ 331 .previous; \ 332 .type GLUE(.,name),@function; \ 333 .globl name; \ 334 .globl GLUE(.,name); \ 335GLUE(.,name): 336 337#define HIDDEN_FUNC(name) \ 338 FUNC_START(name) \ 339 .hidden name; \ 340 .hidden GLUE(.,name); 341 342#define FUNC_END(name) \ 343GLUE(.L,name): \ 344 .size GLUE(.,name),GLUE(.L,name)-GLUE(.,name) 345 346#else 347 348#define FUNC_NAME(name) GLUE(__USER_LABEL_PREFIX__,name) 349#if defined __PIC__ || defined __pic__ 350#define JUMP_TARGET(name) FUNC_NAME(name@plt) 351#else 352#define JUMP_TARGET(name) FUNC_NAME(name) 353#endif 354#define FUNC_START(name) \ 355 .type FUNC_NAME(name),@function; \ 356 .globl FUNC_NAME(name); \ 357FUNC_NAME(name): 358 359#define HIDDEN_FUNC(name) \ 360 FUNC_START(name) \ 361 .hidden FUNC_NAME(name); 362 363#define FUNC_END(name) \ 364GLUE(.L,name): \ 365 .size FUNC_NAME(name),GLUE(.L,name)-FUNC_NAME(name) 366#endif 367 368#ifdef IN_GCC 369/* For HAVE_GAS_CFI_DIRECTIVE. */ 370#include "auto-host.h" 371 372#ifdef HAVE_GAS_CFI_DIRECTIVE 373# define CFI_STARTPROC .cfi_startproc 374# define CFI_ENDPROC .cfi_endproc 375# define CFI_OFFSET(reg, off) .cfi_offset reg, off 376# define CFI_DEF_CFA_REGISTER(reg) .cfi_def_cfa_register reg 377# define CFI_RESTORE(reg) .cfi_restore reg 378#else 379# define CFI_STARTPROC 380# define CFI_ENDPROC 381# define CFI_OFFSET(reg, off) 382# define CFI_DEF_CFA_REGISTER(reg) 383# define CFI_RESTORE(reg) 384#endif 385#endif 386 387#if defined(__ELF__) && defined(__linux__) && !defined(__powerpc64__) 388 .section .note.GNU-stack 389 .previous 390#endif 391