linux/arch/powerpc/lib/crtsavres.S
<<
>>
Prefs
   1/*
   2 * Special support for eabi and SVR4
   3 *
   4 *   Copyright (C) 1995, 1996, 1998, 2000, 2001 Free Software Foundation, Inc.
   5 *   Copyright 2008 Freescale Semiconductor, Inc.
   6 *   Written By Michael Meissner
   7 *
   8 * Based on gcc/config/rs6000/crtsavres.asm from gcc
   9 * 64 bit additions from reading the PPC elf64abi document.
  10 *
  11 * This file is free software; you can redistribute it and/or modify it
  12 * under the terms of the GNU General Public License as published by the
  13 * Free Software Foundation; either version 2, or (at your option) any
  14 * later version.
  15 *
  16 * In addition to the permissions in the GNU General Public License, the
  17 * Free Software Foundation gives you unlimited permission to link the
  18 * compiled version of this file with other programs, and to distribute
  19 * those programs without any restriction coming from the use of this
  20 * file.  (The General Public License restrictions do apply in other
  21 * respects; for example, they cover modification of the file, and
  22 * distribution when not linked into another program.)
  23 *
  24 * This file is distributed in the hope that it will be useful, but
  25 * WITHOUT ANY WARRANTY; without even the implied warranty of
  26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  27 * General Public License for more details.
  28 *
  29 * You should have received a copy of the GNU General Public License
  30 * along with this program; see the file COPYING.  If not, write to
  31 * the Free Software Foundation, 51 Franklin Street, Fifth Floor,
  32 * Boston, MA 02110-1301, USA.
  33 *
  34 *    As a special exception, if you link this library with files
  35 *    compiled with GCC to produce an executable, this does not cause
  36 *    the resulting executable to be covered by the GNU General Public License.
  37 *    This exception does not however invalidate any other reasons why
  38 *    the executable file might be covered by the GNU General Public License.
  39 */
  40
  41#include <asm/ppc_asm.h>
  42
  43        .file   "crtsavres.S"
  44
  45#ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
  46
  47        .section ".text"
  48
  49#ifndef CONFIG_PPC64
  50
  51/* Routines for saving integer registers, called by the compiler.  */
  52/* Called with r11 pointing to the stack header word of the caller of the */
  53/* function, just beyond the end of the integer save area.  */
  54
  55_GLOBAL(_savegpr_14)
  56_GLOBAL(_save32gpr_14)
  57        stw     14,-72(11)      /* save gp registers */
  58_GLOBAL(_savegpr_15)
  59_GLOBAL(_save32gpr_15)
  60        stw     15,-68(11)
  61_GLOBAL(_savegpr_16)
  62_GLOBAL(_save32gpr_16)
  63        stw     16,-64(11)
  64_GLOBAL(_savegpr_17)
  65_GLOBAL(_save32gpr_17)
  66        stw     17,-60(11)
  67_GLOBAL(_savegpr_18)
  68_GLOBAL(_save32gpr_18)
  69        stw     18,-56(11)
  70_GLOBAL(_savegpr_19)
  71_GLOBAL(_save32gpr_19)
  72        stw     19,-52(11)
  73_GLOBAL(_savegpr_20)
  74_GLOBAL(_save32gpr_20)
  75        stw     20,-48(11)
  76_GLOBAL(_savegpr_21)
  77_GLOBAL(_save32gpr_21)
  78        stw     21,-44(11)
  79_GLOBAL(_savegpr_22)
  80_GLOBAL(_save32gpr_22)
  81        stw     22,-40(11)
  82_GLOBAL(_savegpr_23)
  83_GLOBAL(_save32gpr_23)
  84        stw     23,-36(11)
  85_GLOBAL(_savegpr_24)
  86_GLOBAL(_save32gpr_24)
  87        stw     24,-32(11)
  88_GLOBAL(_savegpr_25)
  89_GLOBAL(_save32gpr_25)
  90        stw     25,-28(11)
  91_GLOBAL(_savegpr_26)
  92_GLOBAL(_save32gpr_26)
  93        stw     26,-24(11)
  94_GLOBAL(_savegpr_27)
  95_GLOBAL(_save32gpr_27)
  96        stw     27,-20(11)
  97_GLOBAL(_savegpr_28)
  98_GLOBAL(_save32gpr_28)
  99        stw     28,-16(11)
 100_GLOBAL(_savegpr_29)
 101_GLOBAL(_save32gpr_29)
 102        stw     29,-12(11)
 103_GLOBAL(_savegpr_30)
 104_GLOBAL(_save32gpr_30)
 105        stw     30,-8(11)
 106_GLOBAL(_savegpr_31)
 107_GLOBAL(_save32gpr_31)
 108        stw     31,-4(11)
 109        blr
 110
 111/* Routines for restoring integer registers, called by the compiler.  */
 112/* Called with r11 pointing to the stack header word of the caller of the */
 113/* function, just beyond the end of the integer restore area.  */
 114
 115_GLOBAL(_restgpr_14)
 116_GLOBAL(_rest32gpr_14)
 117        lwz     14,-72(11)      /* restore gp registers */
 118_GLOBAL(_restgpr_15)
 119_GLOBAL(_rest32gpr_15)
 120        lwz     15,-68(11)
 121_GLOBAL(_restgpr_16)
 122_GLOBAL(_rest32gpr_16)
 123        lwz     16,-64(11)
 124_GLOBAL(_restgpr_17)
 125_GLOBAL(_rest32gpr_17)
 126        lwz     17,-60(11)
 127_GLOBAL(_restgpr_18)
 128_GLOBAL(_rest32gpr_18)
 129        lwz     18,-56(11)
 130_GLOBAL(_restgpr_19)
 131_GLOBAL(_rest32gpr_19)
 132        lwz     19,-52(11)
 133_GLOBAL(_restgpr_20)
 134_GLOBAL(_rest32gpr_20)
 135        lwz     20,-48(11)
 136_GLOBAL(_restgpr_21)
 137_GLOBAL(_rest32gpr_21)
 138        lwz     21,-44(11)
 139_GLOBAL(_restgpr_22)
 140_GLOBAL(_rest32gpr_22)
 141        lwz     22,-40(11)
 142_GLOBAL(_restgpr_23)
 143_GLOBAL(_rest32gpr_23)
 144        lwz     23,-36(11)
 145_GLOBAL(_restgpr_24)
 146_GLOBAL(_rest32gpr_24)
 147        lwz     24,-32(11)
 148_GLOBAL(_restgpr_25)
 149_GLOBAL(_rest32gpr_25)
 150        lwz     25,-28(11)
 151_GLOBAL(_restgpr_26)
 152_GLOBAL(_rest32gpr_26)
 153        lwz     26,-24(11)
 154_GLOBAL(_restgpr_27)
 155_GLOBAL(_rest32gpr_27)
 156        lwz     27,-20(11)
 157_GLOBAL(_restgpr_28)
 158_GLOBAL(_rest32gpr_28)
 159        lwz     28,-16(11)
 160_GLOBAL(_restgpr_29)
 161_GLOBAL(_rest32gpr_29)
 162        lwz     29,-12(11)
 163_GLOBAL(_restgpr_30)
 164_GLOBAL(_rest32gpr_30)
 165        lwz     30,-8(11)
 166_GLOBAL(_restgpr_31)
 167_GLOBAL(_rest32gpr_31)
 168        lwz     31,-4(11)
 169        blr
 170
 171/* Routines for restoring integer registers, called by the compiler.  */
 172/* Called with r11 pointing to the stack header word of the caller of the */
 173/* function, just beyond the end of the integer restore area.  */
 174
 175_GLOBAL(_restgpr_14_x)
 176_GLOBAL(_rest32gpr_14_x)
 177        lwz     14,-72(11)      /* restore gp registers */
 178_GLOBAL(_restgpr_15_x)
 179_GLOBAL(_rest32gpr_15_x)
 180        lwz     15,-68(11)
 181_GLOBAL(_restgpr_16_x)
 182_GLOBAL(_rest32gpr_16_x)
 183        lwz     16,-64(11)
 184_GLOBAL(_restgpr_17_x)
 185_GLOBAL(_rest32gpr_17_x)
 186        lwz     17,-60(11)
 187_GLOBAL(_restgpr_18_x)
 188_GLOBAL(_rest32gpr_18_x)
 189        lwz     18,-56(11)
 190_GLOBAL(_restgpr_19_x)
 191_GLOBAL(_rest32gpr_19_x)
 192        lwz     19,-52(11)
 193_GLOBAL(_restgpr_20_x)
 194_GLOBAL(_rest32gpr_20_x)
 195        lwz     20,-48(11)
 196_GLOBAL(_restgpr_21_x)
 197_GLOBAL(_rest32gpr_21_x)
 198        lwz     21,-44(11)
 199_GLOBAL(_restgpr_22_x)
 200_GLOBAL(_rest32gpr_22_x)
 201        lwz     22,-40(11)
 202_GLOBAL(_restgpr_23_x)
 203_GLOBAL(_rest32gpr_23_x)
 204        lwz     23,-36(11)
 205_GLOBAL(_restgpr_24_x)
 206_GLOBAL(_rest32gpr_24_x)
 207        lwz     24,-32(11)
 208_GLOBAL(_restgpr_25_x)
 209_GLOBAL(_rest32gpr_25_x)
 210        lwz     25,-28(11)
 211_GLOBAL(_restgpr_26_x)
 212_GLOBAL(_rest32gpr_26_x)
 213        lwz     26,-24(11)
 214_GLOBAL(_restgpr_27_x)
 215_GLOBAL(_rest32gpr_27_x)
 216        lwz     27,-20(11)
 217_GLOBAL(_restgpr_28_x)
 218_GLOBAL(_rest32gpr_28_x)
 219        lwz     28,-16(11)
 220_GLOBAL(_restgpr_29_x)
 221_GLOBAL(_rest32gpr_29_x)
 222        lwz     29,-12(11)
 223_GLOBAL(_restgpr_30_x)
 224_GLOBAL(_rest32gpr_30_x)
 225        lwz     30,-8(11)
 226_GLOBAL(_restgpr_31_x)
 227_GLOBAL(_rest32gpr_31_x)
 228        lwz     0,4(11)
 229        lwz     31,-4(11)
 230        mtlr    0
 231        mr      1,11
 232        blr
 233
 234#ifdef CONFIG_ALTIVEC
 235/* Called with r0 pointing just beyond the end of the vector save area.  */
 236
 237_GLOBAL(_savevr_20)
 238        li      r11,-192
 239        stvx    v20,r11,r0
 240_GLOBAL(_savevr_21)
 241        li      r11,-176
 242        stvx    v21,r11,r0
 243_GLOBAL(_savevr_22)
 244        li      r11,-160
 245        stvx    v22,r11,r0
 246_GLOBAL(_savevr_23)
 247        li      r11,-144
 248        stvx    v23,r11,r0
 249_GLOBAL(_savevr_24)
 250        li      r11,-128
 251        stvx    v24,r11,r0
 252_GLOBAL(_savevr_25)
 253        li      r11,-112
 254        stvx    v25,r11,r0
 255_GLOBAL(_savevr_26)
 256        li      r11,-96
 257        stvx    v26,r11,r0
 258_GLOBAL(_savevr_27)
 259        li      r11,-80
 260        stvx    v27,r11,r0
 261_GLOBAL(_savevr_28)
 262        li      r11,-64
 263        stvx    v28,r11,r0
 264_GLOBAL(_savevr_29)
 265        li      r11,-48
 266        stvx    v29,r11,r0
 267_GLOBAL(_savevr_30)
 268        li      r11,-32
 269        stvx    v30,r11,r0
 270_GLOBAL(_savevr_31)
 271        li      r11,-16
 272        stvx    v31,r11,r0
 273        blr
 274
 275_GLOBAL(_restvr_20)
 276        li      r11,-192
 277        lvx     v20,r11,r0
 278_GLOBAL(_restvr_21)
 279        li      r11,-176
 280        lvx     v21,r11,r0
 281_GLOBAL(_restvr_22)
 282        li      r11,-160
 283        lvx     v22,r11,r0
 284_GLOBAL(_restvr_23)
 285        li      r11,-144
 286        lvx     v23,r11,r0
 287_GLOBAL(_restvr_24)
 288        li      r11,-128
 289        lvx     v24,r11,r0
 290_GLOBAL(_restvr_25)
 291        li      r11,-112
 292        lvx     v25,r11,r0
 293_GLOBAL(_restvr_26)
 294        li      r11,-96
 295        lvx     v26,r11,r0
 296_GLOBAL(_restvr_27)
 297        li      r11,-80
 298        lvx     v27,r11,r0
 299_GLOBAL(_restvr_28)
 300        li      r11,-64
 301        lvx     v28,r11,r0
 302_GLOBAL(_restvr_29)
 303        li      r11,-48
 304        lvx     v29,r11,r0
 305_GLOBAL(_restvr_30)
 306        li      r11,-32
 307        lvx     v30,r11,r0
 308_GLOBAL(_restvr_31)
 309        li      r11,-16
 310        lvx     v31,r11,r0
 311        blr
 312
 313#endif /* CONFIG_ALTIVEC */
 314
 315#else /* CONFIG_PPC64 */
 316
 317.globl  _savegpr0_14
 318_savegpr0_14:
 319        std     r14,-144(r1)
 320.globl  _savegpr0_15
 321_savegpr0_15:
 322        std     r15,-136(r1)
 323.globl  _savegpr0_16
 324_savegpr0_16:
 325        std     r16,-128(r1)
 326.globl  _savegpr0_17
 327_savegpr0_17:
 328        std     r17,-120(r1)
 329.globl  _savegpr0_18
 330_savegpr0_18:
 331        std     r18,-112(r1)
 332.globl  _savegpr0_19
 333_savegpr0_19:
 334        std     r19,-104(r1)
 335.globl  _savegpr0_20
 336_savegpr0_20:
 337        std     r20,-96(r1)
 338.globl  _savegpr0_21
 339_savegpr0_21:
 340        std     r21,-88(r1)
 341.globl  _savegpr0_22
 342_savegpr0_22:
 343        std     r22,-80(r1)
 344.globl  _savegpr0_23
 345_savegpr0_23:
 346        std     r23,-72(r1)
 347.globl  _savegpr0_24
 348_savegpr0_24:
 349        std     r24,-64(r1)
 350.globl  _savegpr0_25
 351_savegpr0_25:
 352        std     r25,-56(r1)
 353.globl  _savegpr0_26
 354_savegpr0_26:
 355        std     r26,-48(r1)
 356.globl  _savegpr0_27
 357_savegpr0_27:
 358        std     r27,-40(r1)
 359.globl  _savegpr0_28
 360_savegpr0_28:
 361        std     r28,-32(r1)
 362.globl  _savegpr0_29
 363_savegpr0_29:
 364        std     r29,-24(r1)
 365.globl  _savegpr0_30
 366_savegpr0_30:
 367        std     r30,-16(r1)
 368.globl  _savegpr0_31
 369_savegpr0_31:
 370        std     r31,-8(r1)
 371        std     r0,16(r1)
 372        blr
 373
 374.globl  _restgpr0_14
 375_restgpr0_14:
 376        ld      r14,-144(r1)
 377.globl  _restgpr0_15
 378_restgpr0_15:
 379        ld      r15,-136(r1)
 380.globl  _restgpr0_16
 381_restgpr0_16:
 382        ld      r16,-128(r1)
 383.globl  _restgpr0_17
 384_restgpr0_17:
 385        ld      r17,-120(r1)
 386.globl  _restgpr0_18
 387_restgpr0_18:
 388        ld      r18,-112(r1)
 389.globl  _restgpr0_19
 390_restgpr0_19:
 391        ld      r19,-104(r1)
 392.globl  _restgpr0_20
 393_restgpr0_20:
 394        ld      r20,-96(r1)
 395.globl  _restgpr0_21
 396_restgpr0_21:
 397        ld      r21,-88(r1)
 398.globl  _restgpr0_22
 399_restgpr0_22:
 400        ld      r22,-80(r1)
 401.globl  _restgpr0_23
 402_restgpr0_23:
 403        ld      r23,-72(r1)
 404.globl  _restgpr0_24
 405_restgpr0_24:
 406        ld      r24,-64(r1)
 407.globl  _restgpr0_25
 408_restgpr0_25:
 409        ld      r25,-56(r1)
 410.globl  _restgpr0_26
 411_restgpr0_26:
 412        ld      r26,-48(r1)
 413.globl  _restgpr0_27
 414_restgpr0_27:
 415        ld      r27,-40(r1)
 416.globl  _restgpr0_28
 417_restgpr0_28:
 418        ld      r28,-32(r1)
 419.globl  _restgpr0_29
 420_restgpr0_29:
 421        ld      r0,16(r1)
 422        ld      r29,-24(r1)
 423        mtlr    r0
 424        ld      r30,-16(r1)
 425        ld      r31,-8(r1)
 426        blr
 427
 428.globl  _restgpr0_30
 429_restgpr0_30:
 430        ld      r30,-16(r1)
 431.globl  _restgpr0_31
 432_restgpr0_31:
 433        ld      r0,16(r1)
 434        ld      r31,-8(r1)
 435        mtlr    r0
 436        blr
 437
 438#ifdef CONFIG_ALTIVEC
 439/* Called with r0 pointing just beyond the end of the vector save area.  */
 440
 441.globl  _savevr_20
 442_savevr_20:
 443        li      r12,-192
 444        stvx    v20,r12,r0
 445.globl  _savevr_21
 446_savevr_21:
 447        li      r12,-176
 448        stvx    v21,r12,r0
 449.globl  _savevr_22
 450_savevr_22:
 451        li      r12,-160
 452        stvx    v22,r12,r0
 453.globl  _savevr_23
 454_savevr_23:
 455        li      r12,-144
 456        stvx    v23,r12,r0
 457.globl  _savevr_24
 458_savevr_24:
 459        li      r12,-128
 460        stvx    v24,r12,r0
 461.globl  _savevr_25
 462_savevr_25:
 463        li      r12,-112
 464        stvx    v25,r12,r0
 465.globl  _savevr_26
 466_savevr_26:
 467        li      r12,-96
 468        stvx    v26,r12,r0
 469.globl  _savevr_27
 470_savevr_27:
 471        li      r12,-80
 472        stvx    v27,r12,r0
 473.globl  _savevr_28
 474_savevr_28:
 475        li      r12,-64
 476        stvx    v28,r12,r0
 477.globl  _savevr_29
 478_savevr_29:
 479        li      r12,-48
 480        stvx    v29,r12,r0
 481.globl  _savevr_30
 482_savevr_30:
 483        li      r12,-32
 484        stvx    v30,r12,r0
 485.globl  _savevr_31
 486_savevr_31:
 487        li      r12,-16
 488        stvx    v31,r12,r0
 489        blr
 490
 491.globl  _restvr_20
 492_restvr_20:
 493        li      r12,-192
 494        lvx     v20,r12,r0
 495.globl  _restvr_21
 496_restvr_21:
 497        li      r12,-176
 498        lvx     v21,r12,r0
 499.globl  _restvr_22
 500_restvr_22:
 501        li      r12,-160
 502        lvx     v22,r12,r0
 503.globl  _restvr_23
 504_restvr_23:
 505        li      r12,-144
 506        lvx     v23,r12,r0
 507.globl  _restvr_24
 508_restvr_24:
 509        li      r12,-128
 510        lvx     v24,r12,r0
 511.globl  _restvr_25
 512_restvr_25:
 513        li      r12,-112
 514        lvx     v25,r12,r0
 515.globl  _restvr_26
 516_restvr_26:
 517        li      r12,-96
 518        lvx     v26,r12,r0
 519.globl  _restvr_27
 520_restvr_27:
 521        li      r12,-80
 522        lvx     v27,r12,r0
 523.globl  _restvr_28
 524_restvr_28:
 525        li      r12,-64
 526        lvx     v28,r12,r0
 527.globl  _restvr_29
 528_restvr_29:
 529        li      r12,-48
 530        lvx     v29,r12,r0
 531.globl  _restvr_30
 532_restvr_30:
 533        li      r12,-32
 534        lvx     v30,r12,r0
 535.globl  _restvr_31
 536_restvr_31:
 537        li      r12,-16
 538        lvx     v31,r12,r0
 539        blr
 540
 541#endif /* CONFIG_ALTIVEC */
 542
 543#endif /* CONFIG_PPC64 */
 544
 545#endif
 546