📄 ppc.s
字号:
/* GRT stack implementation for ppc. Copyright (C) 2005 Tristan Gingold. GHDL is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. GHDL is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.*/ .file "ppc.S" .section ".text"#define OFF 240#define GREG(x) x#define FREG(x) x #define r0 GREG(0)#define r1 GREG(1)#define r2 GREG(2)#define r3 GREG(3)#define r4 GREG(4)#define r5 GREG(5)#define r6 GREG(6)#define r7 GREG(7)#define r8 GREG(8)#define r9 GREG(9)#define r10 GREG(10)#define r11 GREG(11)#define r12 GREG(12)#define r13 GREG(13)#define r14 GREG(14)#define r15 GREG(15)#define r16 GREG(16)#define r17 GREG(17)#define r18 GREG(18)#define r19 GREG(19)#define r20 GREG(20)#define r21 GREG(21)#define r22 GREG(22)#define r23 GREG(23)#define r24 GREG(24)#define r25 GREG(25)#define r26 GREG(26)#define r27 GREG(27)#define r28 GREG(28)#define r29 GREG(29)#define r30 GREG(30)#define r31 GREG(31)#define f0 FREG(0)#define f1 FREG(1)#define f2 FREG(2)#define f3 FREG(3)#define f4 FREG(4)#define f5 FREG(5)#define f6 FREG(6)#define f7 FREG(7)#define f8 FREG(8)#define f9 FREG(9)#define f10 FREG(10)#define f11 FREG(11)#define f12 FREG(12)#define f13 FREG(13)#define f14 FREG(14)#define f15 FREG(15)#define f16 FREG(16)#define f17 FREG(17)#define f18 FREG(18)#define f19 FREG(19)#define f20 FREG(20)#define f21 FREG(21)#define f22 FREG(22)#define f23 FREG(23)#define f24 FREG(24)#define f25 FREG(25)#define f26 FREG(26)#define f27 FREG(27)#define f28 FREG(28)#define f29 FREG(29)#define f30 FREG(30)#define f31 FREG(31) /* Stack structure is: +4 : cur_length \ Stack +0 : cur_sp / Context -4 : arg -8 : func -12: pad -16: pad -20: LR save word -24: Back chain -28: fp/gp saved registers. -4 : return address -8 : process function to be executed -12: function argument ... -72: %sp */ /* Function called to loop on the process. */ .align 4 .type grt_stack_loop,@functiongrt_stack_loop: /* Get function. */ lwz r0,16(r1) /* Get argument. */ lwz r3,20(r1) mtlr r0 blrl b grt_stack_loop .size grt_stack_loop, . - grt_stack_loop /* function Stack_Create (Func : Address; Arg : Address) return Stack_Type; */ .align 4 .global grt_stack_create .type grt_stack_create,@functiongrt_stack_create: /* Standard prologue. */ stwu r1,-32(r1) mflr r0 stw r0,36(r1) /* Save arguments. */ stw r3,24(r1) stw r4,28(r1) /* Allocate the stack, and exit in case of failure */ bl grt_stack_allocate cmpwi 0,r3,0 beq- .Ldone /* Note: r3 contains the address of the stack_context. This is also the top of the stack. */ /* Prepare stack. */ /* Align the stack. */ addi r5,r3,-24 /* Save the parameters. */ lwz r6,24(r1) stw r6,16(r5) lwz r7,28(r1) stw r7,20(r5) /* The return function. */ lis r4,grt_stack_loop@ha la r4,grt_stack_loop@l(r4) stw r4,4(r5) /* Back-Chain. */ addi r4,r1,32 stw r4,0(r5) /* Save register. They should be considered as garbage. */ addi r4,r5,-OFF stfd f31,(OFF - 8)(r4) stfd f30,(OFF - 16)(r4) stfd f29,(OFF - 24)(r4) stfd f28,(OFF - 32)(r4) stfd f27,(OFF - 40)(r4) stfd f26,(OFF - 48)(r4) stfd f25,(OFF - 56)(r4) stfd f24,(OFF - 64)(r4) stfd f23,(OFF - 72)(r4) stfd f22,(OFF - 80)(r4) stfd f21,(OFF - 88)(r4) stfd f20,(OFF - 96)(r4) stfd f19,(OFF - 104)(r4) stfd f18,(OFF - 112)(r4) stfd f17,(OFF - 120)(r4) stfd f16,(OFF - 128)(r4) stfd f15,(OFF - 136)(r4) stfd f14,(OFF - 144)(r4) stw r31,(OFF - 148)(r4) stw r30,(OFF - 152)(r4) stw r29,(OFF - 156)(r4) stw r28,(OFF - 160)(r4) stw r27,(OFF - 164)(r4) stw r26,(OFF - 168)(r4) stw r25,(OFF - 172)(r4) stw r24,(OFF - 176)(r4) stw r23,(OFF - 180)(r4) stw r22,(OFF - 184)(r4) stw r21,(OFF - 188)(r4) stw r20,(OFF - 192)(r4) stw r19,(OFF - 196)(r4) stw r18,(OFF - 200)(r4) stw r17,(OFF - 204)(r4) stw r16,(OFF - 208)(r4) stw r15,(OFF - 212)(r4) stw r14,(OFF - 216)(r4) mfcr r0 stw r0, (OFF - 220)(r4) /* Save stack pointer. */ stw r4, 0(r3).Ldone: lwz r0,36(r1) mtlr r0 addi r1,r1,32 blr .size grt_stack_create,. - grt_stack_create .align 4 .global grt_stack_switch /* Arguments: TO, FROM. Both are pointers to a stack_context. */ .type grt_stack_switch,@functiongrt_stack_switch: /* Standard prologue, save return address. */ stwu r1,(-OFF)(r1) mflr r0 stw r0,(OFF + 4)(r1) /* Save r14-r31, f14-f31, CR This is 18 words + 18 double words, ie 216 bytes. */ /* Maybe use the savefpr function ? */ stfd f31,(OFF - 8)(r1) stfd f30,(OFF - 16)(r1) stfd f29,(OFF - 24)(r1) stfd f28,(OFF - 32)(r1) stfd f27,(OFF - 40)(r1) stfd f26,(OFF - 48)(r1) stfd f25,(OFF - 56)(r1) stfd f24,(OFF - 64)(r1) stfd f23,(OFF - 72)(r1) stfd f22,(OFF - 80)(r1) stfd f21,(OFF - 88)(r1) stfd f20,(OFF - 96)(r1) stfd f19,(OFF - 104)(r1) stfd f18,(OFF - 112)(r1) stfd f17,(OFF - 120)(r1) stfd f16,(OFF - 128)(r1) stfd f15,(OFF - 136)(r1) stfd f14,(OFF - 144)(r1) stw r31,(OFF - 148)(r1) stw r30,(OFF - 152)(r1) stw r29,(OFF - 156)(r1) stw r28,(OFF - 160)(r1) stw r27,(OFF - 164)(r1) stw r26,(OFF - 168)(r1) stw r25,(OFF - 172)(r1) stw r24,(OFF - 176)(r1) stw r23,(OFF - 180)(r1) stw r22,(OFF - 184)(r1) stw r21,(OFF - 188)(r1) stw r20,(OFF - 192)(r1) stw r19,(OFF - 196)(r1) stw r18,(OFF - 200)(r1) stw r17,(OFF - 204)(r1) stw r16,(OFF - 208)(r1) stw r15,(OFF - 212)(r1) stw r14,(OFF - 216)(r1) mfcr r0 stw r0, (OFF - 220)(r1) /* Save stack pointer. */ stw r1, 0(r4) /* Load stack pointer. */ lwz r1, 0(r3) lfd f31,(OFF - 8)(r1) lfd f30,(OFF - 16)(r1) lfd f29,(OFF - 24)(r1) lfd f28,(OFF - 32)(r1) lfd f27,(OFF - 40)(r1) lfd f26,(OFF - 48)(r1) lfd f25,(OFF - 56)(r1) lfd f24,(OFF - 64)(r1) lfd f23,(OFF - 72)(r1) lfd f22,(OFF - 80)(r1) lfd f21,(OFF - 88)(r1) lfd f20,(OFF - 96)(r1) lfd f19,(OFF - 104)(r1) lfd f18,(OFF - 112)(r1) lfd f17,(OFF - 120)(r1) lfd f16,(OFF - 128)(r1) lfd f15,(OFF - 136)(r1) lfd f14,(OFF - 144)(r1) lwz r31,(OFF - 148)(r1) lwz r30,(OFF - 152)(r1) lwz r29,(OFF - 156)(r1) lwz r28,(OFF - 160)(r1) lwz r27,(OFF - 164)(r1) lwz r26,(OFF - 168)(r1) lwz r25,(OFF - 172)(r1) lwz r24,(OFF - 176)(r1) lwz r23,(OFF - 180)(r1) lwz r22,(OFF - 184)(r1) lwz r21,(OFF - 188)(r1) lwz r20,(OFF - 192)(r1) lwz r19,(OFF - 196)(r1) lwz r18,(OFF - 200)(r1) lwz r17,(OFF - 204)(r1) lwz r16,(OFF - 208)(r1) lwz r15,(OFF - 212)(r1) lwz r14,(OFF - 216)(r1) lwz r0, (OFF - 220)(r1) mtcr r0 lwz r0,(OFF + 4)(r1) mtlr r0 addi r1,r1,OFF blr .size grt_stack_switch, . - grt_stack_switch .ident "Written by T.Gingold"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -