Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Diff of /sml/trunk/src/runtime/mach-dep/PPC.prim.asm
ViewVC logotype

Diff of /sml/trunk/src/runtime/mach-dep/PPC.prim.asm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 809, Wed Apr 18 17:53:01 2001 UTC revision 810, Fri Apr 20 13:26:46 2001 UTC
# Line 15  Line 15 
15  #include "ml-limits.h"  #include "ml-limits.h"
16  #include "mlstate-offsets.h"    /** this file is generated **/  #include "mlstate-offsets.h"    /** this file is generated **/
17    
18  /** register usage **/  /* factor out variations in assembler synatax */
19    #if defined(OPSYS_DARWIN)
20       /* use the macOS X names by default */
21    #  define HI(name) ha16(name)
22    #  define LO(name) lo16(name)
23    
24    
25    #else
26    #  define HI(name) name@ha
27    #  define LO(name) name@l
28    
29    #  define cr0 0
30    #  define cr1 1
31    #  define r0  0
32    #  define r1  1
33    #  define r2  2
34    #  define r3  3
35    #  define r4  4
36    #  define r5  5
37    #  define r6  6
38    #  define r7  7
39    #  define r8  8
40    #  define r9  9
41    #  define r10  10
42    #  define r11  11
43    #  define r12  12
44    #  define r13  13
45    #  define r14  14
46    #  define r15  15
47    #  define r16  16
48    #  define r17  17
49    #  define r18  18
50    #  define r19  19
51    #  define r20  20
52    #  define r21  21
53    #  define r22  22
54    #  define r23  23
55    #  define r24  24
56    #  define r25  25
57    #  define r26  26
58    #  define r27  27
59    #  define r28  28
60    #  define r29  29
61    #  define r30  30
62    #  define r31  31
63    
64    #  define f0  0
65    #  define f1  1
66    #  define f2  2
67    #  define f3  3
68    #  define f4  4
69    #  define f5  5
70    #  define f6  6
71    #  define f7  7
72    #  define f8  8
73    #  define f9  9
74    #  define f10  10
75    #  define f11  11
76    #  define f12  12
77    #  define f13  13
78    #  define f14  14
79    #  define f15  15
80    #  define f16  16
81    #  define f17  17
82    #  define f18  18
83    #  define f19  19
84    #  define f20  20
85    #  define f21  21
86    #  define f22  22
87    #  define f23  23
88    #  define f24  24
89    #  define f25  25
90    #  define f26  26
91    #  define f27  27
92    #  define f28  28
93    #  define f29  29
94    #  define f30  30
95    #  define f31  31
96    
97    #endif
98    
99    
100  #define         sp              1  
101    /** register usage **/
102    #define         sp              r1
103  #define         stackptr        sp  #define         stackptr        sp
104    
105  #define         allocptr        14  #define         allocptr        r14
106  #define         limitptr        15  #define         limitptr        r15
107  #define         storeptr        16  #define         storeptr        r16
108  #define         stdlink         17  #define         stdlink         r17
109  #define         stdclos         18  #define         stdclos         r18
110  #define         stdarg          19  #define         stdarg          r19
111  #define         stdcont         20  #define         stdcont         r20
112  #define         exncont         21  #define         exncont         r21
113  #define         varptr          22  #define         varptr          r22
114  #define         miscreg0        24  #define         miscreg0        r24
115  #define         miscreg1        25  #define         miscreg1        r25
116  #define         miscreg2        26  #define         miscreg2        r26
117    
118  #define         pc              28  #define         pc              r28
119    
120    
121  #define         atmp1 29  #define         atmp1 r29
122  #define         atmp2 30  #define         atmp2 r30
123  #define         atmp3 31  #define         atmp3 r31
124  #define         atmp4 13  #define         atmp4 r13
125    
126  /* stackframe layout:  /* stackframe layout:
127   * Note: 1. The offset of cvti2d tmp is used in rs6000.sml   * Note: 1. The offset of cvti2d tmp is used in rs6000.sml
# Line 86  Line 168 
168  #define CR0_EQ 2  #define CR0_EQ 2
169  #define CR0_SO 3  #define CR0_SO 3
170    
171  #define CR0     0  #define CR0     cr0
172    
 /** special registers **/  
   
 #define SPR_LR  8  
173    
174  /** C parameter passing conventions **/  /** C parameter passing conventions **/
175  #define CARG1           3  #define CARG1           r3
176  #define CRESULT1        3  #define CRESULT1        r3
177    
178    
179  #define CONTINUE                                        \  #define CONTINUE                                        \
180              cmpl        CR0,allocptr,limitptr;          \              cmpl        CR0,allocptr,limitptr __SC__    \
181              mtlr        stdcont;                        \              mtlr        stdcont __SC__                  \
182              blr              blr
183    
184  #define CHECKLIMIT(label)                               \  #define CHECKLIMIT(label)                               \
185              bt          CR0_LT, label;                  \              bt          CR0_LT, label __SC__            \
186              addi        pc, stdlink,0;                  \              addi        pc, stdlink,0 __SC__            \
187              b           saveregs;                       \              b           CSYM(saveregs) __SC__   \
188      label:      label:
189    
190    #if defined (USE_TOC)
191    /* create table of contents entries for things we need the address of. */
192          .extern         CSYM(_PollFreq0)          .extern         CSYM(_PollFreq0)
193          .extern         CSYM(_PollEvent0)          .extern         CSYM(_PollEvent0)
194          .extern         CSYM(saveregs)          .extern         CSYM(saveregs)
195    
 #if defined (USE_TOC)  
 /* create table of contents entries for things we need the address of. */  
196          .toc          .toc
197  T._PollFreq0:  T._PollFreq0:
198          .tc     H._PollFreq0[TC],CSYM(_PollFreq0)          .tc     H._PollFreq0[TC],CSYM(_PollFreq0)
# Line 208  Line 287 
287  set_request:  set_request:
288          lwz     atmp3,MLSTATE_OFFSET(sp)        /* save the minimal ML state */          lwz     atmp3,MLSTATE_OFFSET(sp)        /* save the minimal ML state */
289          lwz     atmp2,VProcOffMSP(atmp3)        /* atmp2 := VProc State ptr */          lwz     atmp2,VProcOffMSP(atmp3)        /* atmp2 := VProc State ptr */
290          li      0,0          li      r0,0
291          stw     0,InMLOffVSP(atmp2)             /* note that we have left ML */          stw     r0,InMLOffVSP(atmp2)            /* note that we have left ML */
292          stw     allocptr,AllocPtrOffMSP(atmp3)          stw     allocptr,AllocPtrOffMSP(atmp3)
293          stw     limitptr,LimitPtrOffMSP(atmp3)          stw     limitptr,LimitPtrOffMSP(atmp3)
294          stw     storeptr,StorePtrOffMSP(atmp3)          stw     storeptr,StorePtrOffMSP(atmp3)
# Line 224  Line 303 
303          stw     miscreg1,Misc1OffMSP(atmp3)          stw     miscreg1,Misc1OffMSP(atmp3)
304          stw     miscreg2,Misc2OffMSP(atmp3)          stw     miscreg2,Misc2OffMSP(atmp3)
305    
306          addi    3,atmp4,0                       /* request as argument */          addi    r3,atmp4,0                      /* request as argument */
307    
308  restore_c_regs:  restore_c_regs:
309          lwz     2, (argblock+4)(sp)          lwz     r2, (argblock+4)(sp)
310          lwz     13, (argblock+8)(sp)          lwz     r13, (argblock+8)(sp)
311          lwz     14, (argblock+12)(sp)          lwz     r14, (argblock+12)(sp)
312          lwz     15, (argblock+16)(sp)          lwz     r15, (argblock+16)(sp)
313          lwz     16, (argblock+20)(sp)          lwz     r16, (argblock+20)(sp)
314          lwz     17, (argblock+24)(sp)          lwz     r17, (argblock+24)(sp)
315          lwz     18, (argblock+28)(sp)          lwz     r18, (argblock+28)(sp)
316          lwz     19, (argblock+32)(sp)          lwz     r19, (argblock+32)(sp)
317          lwz     20, (argblock+36)(sp)          lwz     r20, (argblock+36)(sp)
318          lwz     21, (argblock+40)(sp)          lwz     r21, (argblock+40)(sp)
319          lwz     22, (argblock+44)(sp)          lwz     r22, (argblock+44)(sp)
320          lwz     23, (argblock+48)(sp)          lwz     r23, (argblock+48)(sp)
321          lwz     24, (argblock+52)(sp)          lwz     r24, (argblock+52)(sp)
322          lwz     25, (argblock+56)(sp)          lwz     r25, (argblock+56)(sp)
323          lwz     26, (argblock+60)(sp)          lwz     r26, (argblock+60)(sp)
324          lwz     27, (argblock+64)(sp)          lwz     r27, (argblock+64)(sp)
325          lwz     28, (argblock+68)(sp)          lwz     r28, (argblock+68)(sp)
326          lwz     29, (argblock+72)(sp)          lwz     r29, (argblock+72)(sp)
327          lwz     30, (argblock+76)(sp)          lwz     r30, (argblock+76)(sp)
328          lwz     31, (argblock+80)(sp)          lwz     r31, (argblock+80)(sp)
329          lwz     0, (argblock+84)(sp)          lwz     r0, (argblock+84)(sp)
330          mtlr    0          mtlr    r0
331          lwz     0, (argblock+88)(sp)          lwz     r0, (argblock+88)(sp)
332          mtcrf   0x80, 0          mtcrf   0x80, r0
333          addi    sp,sp,framesize          addi    sp,sp,framesize
334          blr          blr
335    
# Line 259  Line 338 
338  CENTRY(restoreregs)  CENTRY(restoreregs)
339          addi    sp,sp,-framesize          addi    sp,sp,-framesize
340  #if defined(USE_TOC)  #if defined(USE_TOC)
341          lwz     0,T.saveregs(2)          lwz     r0,T.saveregs(2)
342  #else  #else
343          lis     28, CSYM(saveregs)@ha           /* GPR0 <- addrof(saveregs) */          lis     r28, HI(CSYM(saveregs)) /* GPR0 <- addrof(saveregs) */
344          addi    28, 28, CSYM(saveregs)@l          addi    r28, r28, LO(CSYM(saveregs))
345          li      0, 0          li      r0, 0
346          add     0, 28, 0          add     r0, r28, r0
347  #endif  #endif
348          stw     3, MLSTATE_OFFSET(sp)          stw     r3, MLSTATE_OFFSET(sp)
349          stw     0, STARTGC_OFFSET(sp)          stw     r0, STARTGC_OFFSET(sp)
350  #if defined(USE_TOC)  #if defined(USE_TOC)
351          lwz     4, T.cvti2d_CONST(2)            /* GPR2 is RTOC */          lwz     r4, T.cvti2d_CONST(r2)          /* GPR2 is RTOC */
352          lfd     0, 0(4)          lfd     f0, 0(r4)
353  #else  #else
354          lis     4, cvti2d_CONST@ha          lis     r4, HI(cvti2d_CONST)
355          lfd     0, cvti2d_CONST@l(4)          lfd     f0, LO(cvti2d_CONST)(r4)
356  #endif  #endif
357          stfd    0, CVTI2D_OFFSET(sp)          stfd    f0, CVTI2D_OFFSET(sp)
358    
359          stw     2, argblock+4(sp)          stw     r2, argblock+4(sp)
360          stw     13, argblock+8(sp)          stw     r13, argblock+8(sp)
361          stw     14, argblock+12(sp)          stw     r14, argblock+12(sp)
362          stw     15, argblock+16(sp)          stw     r15, argblock+16(sp)
363          stw     16, argblock+20(sp)          stw     r16, argblock+20(sp)
364          stw     17, argblock+24(sp)          stw     r17, argblock+24(sp)
365          stw     18, argblock+28(sp)          stw     r18, argblock+28(sp)
366          stw     19, argblock+32(sp)          stw     r19, argblock+32(sp)
367          stw     20, argblock+36(sp)          stw     r20, argblock+36(sp)
368          stw     21, argblock+40(sp)          stw     r21, argblock+40(sp)
369          stw     22, argblock+44(sp)          stw     r22, argblock+44(sp)
370          stw     23, argblock+48(sp)          stw     r23, argblock+48(sp)
371          stw     24, argblock+52(sp)          stw     r24, argblock+52(sp)
372          stw     25, argblock+56(sp)          stw     r25, argblock+56(sp)
373          stw     26, argblock+60(sp)          stw     r26, argblock+60(sp)
374          stw     27, argblock+64(sp)          stw     r27, argblock+64(sp)
375          stw     28, argblock+68(sp)          stw     r28, argblock+68(sp)
376          stw     29, argblock+72(sp)          stw     r29, argblock+72(sp)
377          stw     30, argblock+76(sp)          stw     r30, argblock+76(sp)
378          stw     31, argblock+80(sp)          stw     r31, argblock+80(sp)
379          mflr    0          mflr    r0
380          stw     0,  argblock+84(sp)          stw     r0,  argblock+84(sp)
381          mfcr    0          mfcr    r0
382          stw     0,  argblock+88(sp)          stw     r0,  argblock+88(sp)
383    
384          and     atmp1,3,3                       /* atmp1 := MLState pointer */          and     atmp1,r3,r3                     /* atmp1 := MLState pointer */
385    
386          lwz     allocptr,AllocPtrOffMSP(atmp1)          lwz     allocptr,AllocPtrOffMSP(atmp1)
387          lwz     limitptr,LimitPtrOffMSP(atmp1)          lwz     limitptr,LimitPtrOffMSP(atmp1)
# Line 335  Line 414 
414          mtfsfi  2,0          mtfsfi  2,0
415          mtfsfi  1,0          mtfsfi  1,0
416          mtfsfi  0,0          mtfsfi  0,0
417          li      0,0          li      r0,0
418          mtxer   0          mtxer   r0
419          blr                             /* jump to ML code */          blr                             /* jump to ML code */
420    
421  pending_sigs:                           /* there are pending signals */  pending_sigs:                           /* there are pending signals */
# Line 348  Line 427 
427          cmpi    CR0,atmp1,0          cmpi    CR0,atmp1,0
428          bf      CR0_EQ,CSYM(ml_go)          bf      CR0_EQ,CSYM(ml_go)
429    
430          li      0,1          li      r0,1
431          stw     0,HandlerPendingOffVSP(atmp2)          stw     r0,HandlerPendingOffVSP(atmp2)
432          addi    limitptr,allocptr,0          addi    limitptr,allocptr,0
433          b       CSYM(ml_go)          b       CSYM(ml_go)
434    
# Line 448  Line 527 
527          addi    atmp3,allocptr,0        /* atmp3 = data object */          addi    atmp3,allocptr,0        /* atmp3 = data object */
528          slwi    atmp2,atmp2,2           /* atmp2 = length in bytes */          slwi    atmp2,atmp2,2           /* atmp2 = length in bytes */
529          add     allocptr,atmp2,allocptr /* allocptr += total length */          add     allocptr,atmp2,allocptr /* allocptr += total length */
530          stw     0,-4(allocptr)          /* store zero in last word */          stw     r0,-4(allocptr)         /* store zero in last word */
531    
532          /* Allocate the header object */          /* Allocate the header object */
533          li      atmp1, DESC_string      /* header descriptor */          li      atmp1, DESC_string      /* header descriptor */
# Line 567  Line 646 
646          **      bring the required bits into the mantissa.          **      bring the required bits into the mantissa.
647          */          */
648  ML_CODE_HDR(floor_a)  ML_CODE_HDR(floor_a)
649          lfd     1, 0(stdarg)          lfd     f1, 0(stdarg)
650          /*          /*
651          ** Neat thing here is that this code works for          ** Neat thing here is that this code works for
652          ** both +ve and -ve floating point numbers.          ** both +ve and -ve floating point numbers.
653          */          */
654          mffs    0          mffs    f0
655          stfd    0,0(allocptr)   /* steal the allocptr for a second */          stfd    f0,0(allocptr)  /* steal the allocptr for a second */
656          lwz     0, 4(allocptr)          lwz     r0, 4(allocptr)
657          mtfsb1  30          mtfsb1  30
658          mtfsb1  31          mtfsb1  31
659  #ifdef USE_TOC  #ifdef USE_TOC
660          lwz     atmp1, T.floor_CONST(2)          lwz     atmp1, T.floor_CONST(r2)
661          lfd     3, 0(atmp1)          lfd     f3, 0(atmp1)
662  #else  #else
663          lis     atmp1, floor_CONST@ha          lis     atmp1, HI(floor_CONST)
664          lfd     3, floor_CONST@l(atmp1)          lfd     f3, LO(floor_CONST)(atmp1)
665  #endif  #endif
666          fadd    6,1,3          fadd    f6,f1,f3
667          stfd    6,FLOOR_OFFSET(sp)          stfd    f6,FLOOR_OFFSET(sp)
668          lwz     stdarg,FLOOR_OFFSET+4(sp)          lwz     stdarg,FLOOR_OFFSET+4(sp)
669          add     stdarg,stdarg,stdarg          add     stdarg,stdarg,stdarg
670          addi    stdarg,stdarg,1          addi    stdarg,stdarg,1
671    
672          andi.   0,0, 0xf          andi.   r0,r0, 0xf
673          mtfsf   0xff,0          mtfsf   0xff,f0
674          CONTINUE          CONTINUE
675    
676    
# Line 615  Line 694 
694          srawi   atmp1,atmp1,1           /* atmp1 := machine int y */          srawi   atmp1,atmp1,1           /* atmp1 := machine int y */
695          lwz     stdarg,0(stdarg)        /* stdarg := x */          lwz     stdarg,0(stdarg)        /* stdarg := x */
696          lwz     atmp2,0(stdarg)         /* atmp2 := MSW(x) */          lwz     atmp2,0(stdarg)         /* atmp2 := MSW(x) */
697          lis     0,0x7ff0                /* r0 := 0x7ff0,0000 */          lis     r0,0x7ff0               /* r0 := 0x7ff0,0000 */
698          and.    atmp3,atmp2,0           /* atmp3 := atmp2 & 0x7ff00000 */          and.    atmp3,atmp2,r0          /* atmp3 := atmp2 & 0x7ff00000 */
699          bt      CR0_EQ,scalb_all_done          bt      CR0_EQ,scalb_all_done
700    
701          srawi   atmp3,atmp3,20          /* atmp3 := ieee(exp) */          srawi   atmp3,atmp3,20          /* atmp3 := ieee(exp) */
# Line 626  Line 705 
705          cmpi    CR0,atmp1,2047          /* max. ieee(exp) */          cmpi    CR0,atmp1,2047          /* max. ieee(exp) */
706          bf      CR0_LT,scalb_overflow          bf      CR0_LT,scalb_overflow
707    
708          not     0,0                     /* r0 := not(r0) */          not     r0,r0                   /* r0 := not(r0) */
709          and     atmp2,atmp2,0           /* atmp2 := high mantessa bits + sign */          and     atmp2,atmp2,r0          /* atmp2 := high mantessa bits + sign */
710          slwi    atmp1,atmp1,20          /* atmp1 := new exponent */          slwi    atmp1,atmp1,20          /* atmp1 := new exponent */
711          or      atmp1,atmp1,atmp2       /* atmp1 := new MSB(x) */          or      atmp1,atmp1,atmp2       /* atmp1 := new MSB(x) */
712          lwz     atmp2, 4(stdarg)          lwz     atmp2, 4(stdarg)
# Line 685  Line 764 
764    
765    
766  CENTRY(SaveFPRegs)  CENTRY(SaveFPRegs)
767          stfd    14, 4(3)          stfd    f14, 4(r3)
768          stfd    15, 12(3)          stfd    f15, 12(r3)
769          stfd    16, 20(3)          stfd    f16, 20(r3)
770          stfd    17, 28(3)          stfd    f17, 28(r3)
771          stfd    18, 36(3)          stfd    f18, 36(r3)
772          stfd    19, 44(3)          stfd    f19, 44(r3)
773          stfd    20, 52(3)          stfd    f20, 52(r3)
774          stfd    21, 60(3)          stfd    f21, 60(r3)
775          stfd    22, 68(3)          stfd    f22, 68(r3)
776          stfd    23, 76(3)          stfd    f23, 76(r3)
777          stfd    24, 84(3)          stfd    f24, 84(r3)
778          stfd    25, 92(3)          stfd    f25, 92(r3)
779          stfd    26, 100(3)          stfd    f26, 100(r3)
780          stfd    27, 108(3)          stfd    f27, 108(r3)
781          stfd    28, 116(3)          stfd    f28, 116(r3)
782          stfd    29, 124(3)          stfd    f29, 124(r3)
783          stfd    30, 132(3)          stfd    f30, 132(r3)
784          stfd    31, 140(3)          stfd    f31, 140(r3)
785    
786          blr          blr
787    
788  CENTRY(RestoreFPRegs)  CENTRY(RestoreFPRegs)
789          lfd     14, 0(3)          lfd     f14, 0(r3)
790          lfd     15, 8(3)          lfd     f15, 8(r3)
791          lfd     16, 16(3)          lfd     f16, 16(r3)
792          lfd     17, 24(3)          lfd     f17, 24(r3)
793          lfd     18, 32(3)          lfd     f18, 32(r3)
794          lfd     19, 40(3)          lfd     f19, 40(r3)
795          lfd     20, 48(3)          lfd     f20, 48(r3)
796          lfd     21, 56(3)          lfd     f21, 56(r3)
797          lfd     22, 64(3)          lfd     f22, 64(r3)
798          lfd     23, 72(3)          lfd     f23, 72(r3)
799          lfd     24, 80(3)          lfd     f24, 80(r3)
800          lfd     25, 88(3)          lfd     f25, 88(r3)
801          lfd     26, 96(3)          lfd     f26, 96(r3)
802          lfd     27, 104(3)          lfd     f27, 104(r3)
803          lfd     28, 112(3)          lfd     f28, 112(r3)
804          lfd     29, 120(3)          lfd     f29, 120(r3)
805          lfd     30, 128(3)          lfd     f30, 128(r3)
806          lfd     31, 136(3)          lfd     f31, 136(r3)
807          blr          blr
808    
809  #if (defined(OPSYS_LINUX) && defined(TARGET_PPC))  #if (defined(TARGET_PPC) && (defined(OPSYS_LINUX) || defined(OPSYS_DARWIN) ))
810    
811  #define CACHE_LINE_SZB          32  #define CACHE_LINE_SZB          32
812  #define CACHE_LINE_MASK         (CACHE_LINE_SZB-1)  #define CACHE_LINE_MASK         (CACHE_LINE_SZB-1)
# Line 738  Line 817 
817   *   void FlushICache (Addr_t addr, Addr_t nbytes)   *   void FlushICache (Addr_t addr, Addr_t nbytes)
818   */   */
819  CENTRY(FlushICache)  CENTRY(FlushICache)
820          add     4,3,4                   /* stop := addr+nbytes */          add     r4,r3,r4                /* stop := addr+nbytes */
821          addic   4,4,CACHE_LINE_MASK     /* stop := stop + CACHE_LINE_MASK */          addic   r4,r4,CACHE_LINE_MASK   /* stop := stop + CACHE_LINE_MASK */
822          rlwinm  4,4,0,0,CACHE_LINE_BITS /* stop := stop & ~CACHE_LINE_MASK */          rlwinm  r4,r4,0,0,CACHE_LINE_BITS       /* stop := stop & ~CACHE_LINE_MASK */
823  L_FlushICache_1:  L_FlushICache_1:
824          cmplw   1,3,4                   /* while (addr < stop) */          cmplw   cr1,r3,r4               /* while (addr < stop) */
825          bc      4,4,L_FlushICache_2          bc      4,4,L_FlushICache_2
826          dcbf    0,3                     /*   flush addr */          dcbf    0,r3                    /*   flush addr */
827          icbi    0,3                     /*   invalidate addr */          icbi    0,r3                    /*   invalidate addr */
828          addi    3,3,CACHE_LINE_SZB      /*   addr := addr + CACHE_LINE_SZB */          addi    r3,r3,CACHE_LINE_SZB    /*   addr := addr + CACHE_LINE_SZB */
829          b       L_FlushICache_1         /* end while */          b       L_FlushICache_1         /* end while */
830  L_FlushICache_2:  L_FlushICache_2:
831          blr          blr

Legend:
Removed from v.809  
changed lines
  Added in v.810

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0