cvsuser     04/10/24 02:50:55

  Modified:    .        MANIFEST
               config/init/hints darwin.pl
               jit/ppc  core.jit jit_emit.h
  Added:       config/gen/platform/darwin asm.s
  Log:
  PPC fpr allocation fix
  
  Revision  Changes    Path
  1.756     +1 -0      parrot/MANIFEST
  
  Index: MANIFEST
  ===================================================================
  RCS file: /cvs/public/parrot/MANIFEST,v
  retrieving revision 1.755
  retrieving revision 1.756
  diff -u -r1.755 -r1.756
  --- MANIFEST  23 Oct 2004 17:53:48 -0000      1.755
  +++ MANIFEST  24 Oct 2004 09:50:51 -0000      1.756
  @@ -208,6 +208,7 @@
   config/gen/platform/ansi/exec.c                   []
   config/gen/platform/ansi/io.h                     []
   config/gen/platform/ansi/time.c                   []
  +config/gen/platform/darwin/asm.s                  []
   config/gen/platform/darwin/begin.c                []
   config/gen/platform/darwin/dl.c                   []
   config/gen/platform/darwin/memalign.c             []
  
  
  
  1.1                  parrot/config/gen/platform/darwin/asm.s
  
  Index: asm.s
  ===================================================================
  #define PPC_JIT_GP_REGISTER_SAVE_SPACE (4*19)
  
  ;; This macro would generate the below asm, but requires using 'cc -c' 
  ;; rather than 'as' as the assembler (so that the preprocessor runs), 
  ;; and this is not currently configurable in the Parrot makefiles
  
  .macro RESTORE_NONVOLATILE_FLOATS
      lfd    f14, -PPC_JIT_GP_REGISTER_SAVE_SPACE-1*8(r1)
      lfd    f15, -PPC_JIT_GP_REGISTER_SAVE_SPACE-2*8(r1)
      lfd    f16, -PPC_JIT_GP_REGISTER_SAVE_SPACE-3*8(r1)
      lfd    f17, -PPC_JIT_GP_REGISTER_SAVE_SPACE-4*8(r1)
      lfd    f18, -PPC_JIT_GP_REGISTER_SAVE_SPACE-5*8(r1)
      lfd    f19, -PPC_JIT_GP_REGISTER_SAVE_SPACE-6*8(r1)
      lfd    f20, -PPC_JIT_GP_REGISTER_SAVE_SPACE-7*8(r1)
      lfd    f21, -PPC_JIT_GP_REGISTER_SAVE_SPACE-8*8(r1)
      lfd    f22, -PPC_JIT_GP_REGISTER_SAVE_SPACE-9*8(r1)
      lfd    f23, -PPC_JIT_GP_REGISTER_SAVE_SPACE-10*8(r1)
      lfd    f24, -PPC_JIT_GP_REGISTER_SAVE_SPACE-11*8(r1)
      lfd    f25, -PPC_JIT_GP_REGISTER_SAVE_SPACE-12*8(r1)
      lfd    f26, -PPC_JIT_GP_REGISTER_SAVE_SPACE-13*8(r1)
      lfd    f27, -PPC_JIT_GP_REGISTER_SAVE_SPACE-14*8(r1)
      lfd    f28, -PPC_JIT_GP_REGISTER_SAVE_SPACE-15*8(r1)
      lfd    f29, -PPC_JIT_GP_REGISTER_SAVE_SPACE-16*8(r1)
      lfd    f30, -PPC_JIT_GP_REGISTER_SAVE_SPACE-17*8(r1)
      lfd    f31, -PPC_JIT_GP_REGISTER_SAVE_SPACE-18*8(r1)
  
  .endmacro
  
  .text
        .align  12              ; vm page aligned
        .globl _Parrot_ppc_jit_restore_nonvolatile_registers
  _Parrot_ppc_jit_restore_nonvolatile_registers:
  
      lfd     f14,-84(r1)
      lfd     f15,-92(r1)
      lfd     f16,-100(r1)
      lfd     f17,-108(r1)
      lfd     f18,-116(r1)
      lfd     f19,-124(r1)
      lfd     f20,-132(r1)
      lfd     f21,-140(r1)
      lfd     f22,-148(r1)
      lfd     f23,-156(r1)
      lfd     f24,-164(r1)
      lfd     f25,-172(r1)
      lfd     f26,-180(r1)
      lfd     f27,-188(r1)
      lfd     f28,-196(r1)
      lfd     f29,-204(r1)
      lfd     f30,-212(r1)
      lfd     f31,-220(r1)
  
      blr       
  
  
  
  1.16      +1 -0      parrot/config/init/hints/darwin.pl
  
  Index: darwin.pl
  ===================================================================
  RCS file: /cvs/public/parrot/config/init/hints/darwin.pl,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- darwin.pl 13 Oct 2004 14:38:06 -0000      1.15
  +++ darwin.pl 24 Oct 2004 09:50:54 -0000      1.16
  @@ -26,4 +26,5 @@
     ld_share_flags => '-dynamiclib',
     ld_load_flags => '-bundle -undefined suppress',
     memalign => 'some_memalign',
  +  platform_asm => 1,
   );
  
  
  
  1.19      +37 -2     parrot/jit/ppc/core.jit
  
  Index: core.jit
  ===================================================================
  RCS file: /cvs/public/parrot/jit/ppc/core.jit,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- core.jit  21 Oct 2004 20:34:35 -0000      1.18
  +++ core.jit  24 Oct 2004 09:50:55 -0000      1.19
  @@ -2,7 +2,7 @@
   ; ppc/core.jit
   ;
   ;
  -; $Id: core.jit,v 1.18 2004/10/21 20:34:35 leo Exp $
  +; $Id: core.jit,v 1.19 2004/10/24 09:50:55 leo Exp $
   ;
   
   # TODO complete this
  @@ -10,8 +10,12 @@
   Parrot_end {
       jit_emit_lwz(NATIVECODE, r1, 0, r1);
       jit_emit_lwz(NATIVECODE, r0, 8, r1);
  +
  +     jit_emit_call_func(NATIVECODE, (void 
*)Parrot_ppc_jit_restore_nonvolatile_registers);
  +
       jit_emit_mtlr(NATIVECODE, r0);
  -    jit_emit_lmw(NATIVECODE, r13, -PPC_JIT_REGISTER_SAVE_SPACE, r1);
  +    jit_emit_lmw(NATIVECODE, r13, -PPC_JIT_GP_REGISTER_SAVE_SPACE, r1);
  +
       jit_emit_blr(NATIVECODE);
   }
   
  @@ -919,3 +923,34 @@
       jit_emit_blr(NATIVECODE);
   }
   
  +TEMPLATE Parrot_set_or_clone_s_sc {
  +; string_copy(Interp *interpreter, STRING *s)
  +    jit_emit_mov_rr(NATIVECODE, r3, r13);
  +    jit_emit_mov_ri_i(NATIVECODE, r4, CONST(2)->u.string);
  +
  +    jit_emit_call_func(NATIVECODE, (void*) string_copy);
  +
  +    jit_emit_mov_mr_i(NATIVECODE, &STRING_REG[1], r3);
  +}
  +
  +Parrot_set_s_sc {
  +    Parrot_set_or_clone_s_sc
  +}
  +
  +Parrot_clone_s_sc {
  +    Parrot_set_or_clone_s_sc
  +}
  +
  +Parrot_set_s_s {
  +     jit_emit_mov_rm_i(NATIVECODE, ISR1, &STRING_REG[2]); 
  +     jit_emit_mov_mr_i(NATIVECODE, &STRING_REG[1], ISR1); 
  +}
  +
  +Parrot_clone_s_s {
  +    jit_emit_mov_rr(NATIVECODE, r3, r13);
  +    jit_emit_mov_rm_i(NATIVECODE, r4, &STRING_REG[2]);
  +
  +    jit_emit_call_func(NATIVECODE, (void*) string_copy);
  +
  +    jit_emit_mov_mr_i(NATIVECODE, &STRING_REG[1], r3);
  +}
  
  
  
  1.44      +44 -28    parrot/jit/ppc/jit_emit.h
  
  Index: jit_emit.h
  ===================================================================
  RCS file: /cvs/public/parrot/jit/ppc/jit_emit.h,v
  retrieving revision 1.43
  retrieving revision 1.44
  diff -u -r1.43 -r1.44
  --- jit_emit.h        22 Oct 2004 08:36:39 -0000      1.43
  +++ jit_emit.h        24 Oct 2004 09:50:55 -0000      1.44
  @@ -3,7 +3,7 @@
    *
    * PPC
    *
  - * $Id: jit_emit.h,v 1.43 2004/10/22 08:36:39 leo Exp $
  + * $Id: jit_emit.h,v 1.44 2004/10/24 09:50:55 leo Exp $
    */
   
   #if !defined(PARROT_PPC_JIT_EMIT_H_GUARD)
  @@ -367,6 +367,9 @@
   #  define jit_emit_lwz(pc, D, disp, A) \
       jit_emit_2reg(pc, 32, D, A, disp)
   
  +#  define jit_emit_lwzx(pc, D, A, B) \
  +    jit_emit_3reg_x(pc, 31, D, A, B, 23, 0)
  +
   #  define jit_emit_stw(pc, S, disp, A) \
       jit_emit_2reg(pc, 36, S, A, disp)
   
  @@ -589,11 +592,21 @@
   
   #  define jit_emit_branch_to_opcode(pc, D) \
       jit_emit_sub_rrr(jit_info->native_ptr, ISR1, D, r15); \
  -    jit_emit_add_rrr(jit_info->native_ptr, ISR1, r14, ISR1); \
  -    jit_emit_lwz(jit_info->native_ptr, ISR1, 0, ISR1); \
  +    jit_emit_lwzx(jit_info->native_ptr, ISR1, ISR1, r14); \
       jit_emit_mtctr(jit_info->native_ptr, ISR1); \
       jit_emit_bctrl(jit_info->native_ptr)
   
  +#if PARROT_EXEC_OS_AIX /* support AIX calling convention using compiler 
intermediary _ptrgl */
  +#  define jit_emit_call_func(pc, addr) \
  +    jit_emit_mov_ri_i(jit_info->native_ptr, ISR1, (long)*((long*)(addr))); \
  +    jit_emit_mtctr(jit_info->native_ptr, ISR1); \
  +    jit_emit_bctrl(jit_info->native_ptr);
  +#else
  +#  define jit_emit_call_func(pc, addr) \
  +    jit_emit_mov_ri_i(jit_info->native_ptr, ISR1, (long)(addr)); \
  +    jit_emit_mtctr(jit_info->native_ptr, ISR1); \
  +    jit_emit_bctrl(jit_info->native_ptr);
  +#endif
   
   #  if EXEC_CAPABLE
   #   define load_nc(pc, D, disp) \
  @@ -607,16 +620,21 @@
   
   #endif /* JIT_EMIT */
   
  +void Parrot_ppc_jit_restore_nonvolatile_registers(void);
  +
   /*
    * r13 - r31 are preserved i.e. 19 GPRs
  + * f14 - f31 are preserved
  + * (these are all of the nonvolatile registers)
    */
  -#define PPC_JIT_REGISTER_SAVE_SPACE (4*19)
  +#define PPC_JIT_GP_REGISTER_SAVE_SPACE (4*19)
  +#define PPC_JIT_FP_REGISTER_SAVE_SPACE (8*18)
   /*
    * 24 linkage area
    * 32 param area i.e.enough for 8 args
    * 12 round up so that sum is divisible by 16
    */
  -#define PPC_JIT_FRAME_SIZE (PPC_JIT_REGISTER_SAVE_SPACE + 68)
  +#define PPC_JIT_FRAME_SIZE (PPC_JIT_GP_REGISTER_SAVE_SPACE + 
PPC_JIT_FP_REGISTER_SAVE_SPACE + 68)
   
   #if JIT_EMIT == 2
   /*
  @@ -627,8 +645,14 @@
   Parrot_jit_begin(Parrot_jit_info_t *jit_info,
                    Interp * interpreter)
   {
  +    int i;
       jit_emit_mflr(jit_info->native_ptr, r0);
  -    jit_emit_stmw(jit_info->native_ptr, r13, -PPC_JIT_REGISTER_SAVE_SPACE, r1);
  +    jit_emit_stmw(jit_info->native_ptr, r13, -PPC_JIT_GP_REGISTER_SAVE_SPACE, r1);
  +
  +    for( i = 1; i <= 18; ++i )
  +    {
  +        jit_emit_stfd(jit_info->native_ptr, (i + 13), 
(-PPC_JIT_GP_REGISTER_SAVE_SPACE - i*8), r1);
  +    }
       jit_emit_stw(jit_info->native_ptr, r0, 8, r1);
       jit_emit_stwu(jit_info->native_ptr, r1, -PPC_JIT_FRAME_SIZE, r1);
       jit_emit_xor_rrr(jit_info->native_ptr, r31, r31, r31);
  @@ -673,16 +697,8 @@
       _emit_bx(jit_info->native_ptr, 1, 0);
       */
   
  -#   if PARROT_EXEC_OS_AIX
  -    /* support AIX calling convention using compiler intermediary _ptrgl */
  -    jit_emit_mov_ri_i(jit_info->native_ptr, ISR1, (long)
  -            *((long*)(interpreter->op_func_table[*(jit_info->cur_op)])));
  -#   else
  -    jit_emit_mov_ri_i(jit_info->native_ptr, ISR1,
  -            (long)(interpreter->op_func_table[*(jit_info->cur_op)]));
  -#   endif
  -    jit_emit_mtctr(jit_info->native_ptr, ISR1);
  -    jit_emit_bctrl(jit_info->native_ptr);
  +    jit_emit_call_func(jit_info->native_ptr,
  +                       interpreter->op_func_table[*(jit_info->cur_op)]);
   }
   
   void
  @@ -827,11 +843,11 @@
   
   #  define REQUIRES_CONSTANT_POOL 0
   #  ifdef PARROT_EXEC_OS_AIX
  -#    define INT_REGISTERS_TO_MAP 22
  +#    define INT_REGISTERS_TO_MAP 14
   #  else
  -#    define INT_REGISTERS_TO_MAP 23
  +#    define INT_REGISTERS_TO_MAP 14
   #  endif
  -#  define FLOAT_REGISTERS_TO_MAP 12
  +#  define FLOAT_REGISTERS_TO_MAP 18
   
   /* 
    * Register usage
  @@ -859,22 +875,22 @@
   char intval_map[INT_REGISTERS_TO_MAP] =
   
       { r17, r18, r19, r20, r21, r22, r23,
  -      r24, r25, r26, r27, r28, r29, r30,
  +      r24, r25, r26, r27, r28, r29, r30
   #  ifndef PARROT_EXEC_OS_AIX
         /* AIX calling convention reserves r2 */
  -      r2,
  +      /* r2, */
   #  endif
  -      r3, r4, r5, r6, r7, r8, r9, r10 };
  +      /* r3, r4, r5, r6, r7, r8, r9, r10 */ };
   /*
  - * f14 - f31 are not preserved currently
  - * f1  - f11 are usable without preserving
  + * f0, f13 are used as scratch registers
  + * f1  - f12 are (additional) volatile registers
  + * f14 - f31 are not nonvolatile, and preserved in begin/end
    */
   char floatval_map[FLOAT_REGISTERS_TO_MAP] =
       { 
  -      f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12
  -      /* not currently saved - so don't use */     
  -      /* f14, f15, f16, f17, f18, f19, f20, f21,
  -      f22, f23, f24, f25, f26, f27, f28, f29, f30, f31 */ 
  +      /* f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12 */
  +      f14, f15, f16, f17, f18, f19, f20, f21,
  +      f22, f23, f24, f25, f26, f27, f28, f29, f30, f31 
       };
   
   void ppc_flush_line(char *_sync);
  
  
  

Reply via email to