/[pcre]/code/trunk/sljit/sljitNativePPC_common.c
ViewVC logotype

Diff of /code/trunk/sljit/sljitNativePPC_common.c

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

revision 1462 by zherczeg, Fri Mar 7 11:54:31 2014 UTC revision 1463 by zherczeg, Thu Mar 13 11:16:17 2014 UTC
# Line 35  typedef sljit_ui sljit_ins; Line 35  typedef sljit_ui sljit_ins;
35    
36  #if ((defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) && (defined _AIX)) \  #if ((defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) && (defined _AIX)) \
37          || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)          || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
38  #define SLJIT_PPC_ABI_V2 1  #define SLJIT_PPC_STACK_FRAME_V2 1
39  #endif  #endif
40    
41  #ifdef _AIX  #ifdef _AIX
42  #include <sys/cache.h>  #include <sys/cache.h>
43  #endif  #endif
44    
45    #if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
46    #define SLJIT_PASS_ENTRY_ADDR_TO_CALL 1
47    #endif
48    
49  static void ppc_cache_flush(sljit_ins *from, sljit_ins *to)  static void ppc_cache_flush(sljit_ins *from, sljit_ins *to)
50  {  {
51  #ifdef _AIX  #ifdef _AIX
# Line 88  static void ppc_cache_flush(sljit_ins *f Line 92  static void ppc_cache_flush(sljit_ins *f
92  #define TMP_REG3        (SLJIT_NO_REGISTERS + 3)  #define TMP_REG3        (SLJIT_NO_REGISTERS + 3)
93  #define TMP_ZERO        (SLJIT_NO_REGISTERS + 4)  #define TMP_ZERO        (SLJIT_NO_REGISTERS + 4)
94    
95    #if (defined SLJIT_PASS_ENTRY_ADDR_TO_CALL && SLJIT_PASS_ENTRY_ADDR_TO_CALL)
96    #define TMP_CALL_REG    (SLJIT_NO_REGISTERS + 5)
97    #else
98    #define TMP_CALL_REG    TMP_REG2
99    #endif
100    
101  #define TMP_FREG1       (0)  #define TMP_FREG1       (0)
102  #define TMP_FREG2       (SLJIT_FLOAT_REG6 + 1)  #define TMP_FREG2       (SLJIT_FLOAT_REG6 + 1)
103    
104  static SLJIT_CONST sljit_ub reg_map[SLJIT_NO_REGISTERS + 5] = {  static SLJIT_CONST sljit_ub reg_map[SLJIT_NO_REGISTERS + 6] = {
105          0, 3, 4, 5, 6, 7, 30, 29, 28, 27, 26, 1, 8, 9, 10, 31          0, 3, 4, 5, 6, 7, 30, 29, 28, 27, 26, 1, 8, 9, 10, 31, 12
106  };  };
107    
108  /* --------------------------------------------------------------------- */  /* --------------------------------------------------------------------- */
# Line 235  static SLJIT_INLINE sljit_si detect_jump Line 245  static SLJIT_INLINE sljit_si detect_jump
245          sljit_uw target_addr;          sljit_uw target_addr;
246          sljit_sw extra_jump_flags;          sljit_sw extra_jump_flags;
247    
248    #if (defined SLJIT_PASS_ENTRY_ADDR_TO_CALL && SLJIT_PASS_ENTRY_ADDR_TO_CALL) && (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
249            if (jump->flags & (SLJIT_REWRITABLE_JUMP | IS_CALL))
250                    return 0;
251    #else
252          if (jump->flags & SLJIT_REWRITABLE_JUMP)          if (jump->flags & SLJIT_REWRITABLE_JUMP)
253                  return 0;                  return 0;
254    #endif
255    
256          if (jump->flags & JUMP_ADDR)          if (jump->flags & JUMP_ADDR)
257                  target_addr = jump->u.target;                  target_addr = jump->u.target;
# Line 244  static SLJIT_INLINE sljit_si detect_jump Line 259  static SLJIT_INLINE sljit_si detect_jump
259                  SLJIT_ASSERT(jump->flags & JUMP_LABEL);                  SLJIT_ASSERT(jump->flags & JUMP_LABEL);
260                  target_addr = (sljit_uw)(code + jump->u.label->size);                  target_addr = (sljit_uw)(code + jump->u.label->size);
261          }          }
262    
263    #if (defined SLJIT_PASS_ENTRY_ADDR_TO_CALL && SLJIT_PASS_ENTRY_ADDR_TO_CALL) && (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
264            if (jump->flags & IS_CALL)
265                    goto keep_address;
266    #endif
267    
268          diff = ((sljit_sw)target_addr - (sljit_sw)(code_ptr)) & ~0x3l;          diff = ((sljit_sw)target_addr - (sljit_sw)(code_ptr)) & ~0x3l;
269    
270          extra_jump_flags = 0;          extra_jump_flags = 0;
271          if (jump->flags & COND_B) {          if (jump->flags & IS_COND) {
272                  if (diff <= 0x7fff && diff >= -0x8000) {                  if (diff <= 0x7fff && diff >= -0x8000) {
273                          jump->flags |= PATCH_B;                          jump->flags |= PATCH_B;
274                          return 1;                          return 1;
275                  }                  }
276                  if (target_addr <= 0xffff) {                  if (target_addr <= 0xffff) {
277                          jump->flags |= PATCH_B | ABSOLUTE_B;                          jump->flags |= PATCH_B | PATCH_ABS_B;
278                          return 1;                          return 1;
279                  }                  }
280                  extra_jump_flags = REMOVE_COND;                  extra_jump_flags = REMOVE_COND;
# Line 266  static SLJIT_INLINE sljit_si detect_jump Line 287  static SLJIT_INLINE sljit_si detect_jump
287                  return 1;                  return 1;
288          }          }
289          if (target_addr <= 0x03ffffff) {          if (target_addr <= 0x03ffffff) {
290                  jump->flags |= PATCH_B | ABSOLUTE_B | extra_jump_flags;                  jump->flags |= PATCH_B | PATCH_ABS_B | extra_jump_flags;
291                  return 1;                  return 1;
292          }          }
293    
294  #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)  #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
295    #if (defined SLJIT_PASS_ENTRY_ADDR_TO_CALL && SLJIT_PASS_ENTRY_ADDR_TO_CALL)
296    keep_address:
297    #endif
298          if (target_addr <= 0x7fffffff) {          if (target_addr <= 0x7fffffff) {
299                  jump->flags |= PATCH_ABS32;                  jump->flags |= PATCH_ABS32;
300                  return 1;                  return 1;
# Line 369  SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen Line 393  SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen
393                                                  code_ptr++;                                                  code_ptr++;
394                                                  jump->addr += sizeof(sljit_ins);                                                  jump->addr += sizeof(sljit_ins);
395                                                  code_ptr[0] = Bx;                                                  code_ptr[0] = Bx;
396                                                  jump->flags -= COND_B;                                                  jump->flags -= IS_COND;
397                                          }                                          }
398                                  }                                  }
399                                  jump = jump->next;                                  jump = jump->next;
# Line 406  SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen Line 430  SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen
430                          addr = (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target;                          addr = (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target;
431                          buf_ptr = (sljit_ins*)jump->addr;                          buf_ptr = (sljit_ins*)jump->addr;
432                          if (jump->flags & PATCH_B) {                          if (jump->flags & PATCH_B) {
433                                  if (jump->flags & COND_B) {                                  if (jump->flags & IS_COND) {
434                                          if (!(jump->flags & ABSOLUTE_B)) {                                          if (!(jump->flags & PATCH_ABS_B)) {
435                                                  addr = addr - jump->addr;                                                  addr = addr - jump->addr;
436                                                  SLJIT_ASSERT((sljit_sw)addr <= 0x7fff && (sljit_sw)addr >= -0x8000);                                                  SLJIT_ASSERT((sljit_sw)addr <= 0x7fff && (sljit_sw)addr >= -0x8000);
437                                                  *buf_ptr = BCx | (addr & 0xfffc) | ((*buf_ptr) & 0x03ff0001);                                                  *buf_ptr = BCx | (addr & 0xfffc) | ((*buf_ptr) & 0x03ff0001);
# Line 418  SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen Line 442  SLJIT_API_FUNC_ATTRIBUTE void* sljit_gen
442                                          }                                          }
443                                  }                                  }
444                                  else {                                  else {
445                                          if (!(jump->flags & ABSOLUTE_B)) {                                          if (!(jump->flags & PATCH_ABS_B)) {
446                                                  addr = addr - jump->addr;                                                  addr = addr - jump->addr;
447                                                  SLJIT_ASSERT((sljit_sw)addr <= 0x01ffffff && (sljit_sw)addr >= -0x02000000);                                                  SLJIT_ASSERT((sljit_sw)addr <= 0x01ffffff && (sljit_sw)addr >= -0x02000000);
448                                                  *buf_ptr = Bx | (addr & 0x03fffffc) | ((*buf_ptr) & 0x1);                                                  *buf_ptr = Bx | (addr & 0x03fffffc) | ((*buf_ptr) & 0x1);
# Line 564  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 588  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
588                  FAIL_IF(push_inst(compiler, STACK_STORE | S(SLJIT_SAVED_EREG1) | A(SLJIT_LOCALS_REG) | IMM(-5 * (sljit_si)(sizeof(sljit_sw))) ));                  FAIL_IF(push_inst(compiler, STACK_STORE | S(SLJIT_SAVED_EREG1) | A(SLJIT_LOCALS_REG) | IMM(-5 * (sljit_si)(sizeof(sljit_sw))) ));
589          if (saveds >= 5)          if (saveds >= 5)
590                  FAIL_IF(push_inst(compiler, STACK_STORE | S(SLJIT_SAVED_EREG2) | A(SLJIT_LOCALS_REG) | IMM(-6 * (sljit_si)(sizeof(sljit_sw))) ));                  FAIL_IF(push_inst(compiler, STACK_STORE | S(SLJIT_SAVED_EREG2) | A(SLJIT_LOCALS_REG) | IMM(-6 * (sljit_si)(sizeof(sljit_sw))) ));
591  #if (defined SLJIT_PPC_ABI_V2 && SLJIT_PPC_ABI_V2)  #if (defined SLJIT_PPC_STACK_FRAME_V2 && SLJIT_PPC_STACK_FRAME_V2)
592          FAIL_IF(push_inst(compiler, STACK_STORE | S(0) | A(SLJIT_LOCALS_REG) | IMM(2 * sizeof(sljit_sw)) ));          FAIL_IF(push_inst(compiler, STACK_STORE | S(0) | A(SLJIT_LOCALS_REG) | IMM(2 * sizeof(sljit_sw)) ));
593  #else  #else
594          FAIL_IF(push_inst(compiler, STACK_STORE | S(0) | A(SLJIT_LOCALS_REG) | IMM(sizeof(sljit_sw)) ));          FAIL_IF(push_inst(compiler, STACK_STORE | S(0) | A(SLJIT_LOCALS_REG) | IMM(sizeof(sljit_sw)) ));
# Line 578  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 602  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
602          if (args >= 3)          if (args >= 3)
603                  FAIL_IF(push_inst(compiler, OR | S(SLJIT_SCRATCH_REG3) | A(SLJIT_SAVED_REG3) | B(SLJIT_SCRATCH_REG3)));                  FAIL_IF(push_inst(compiler, OR | S(SLJIT_SCRATCH_REG3) | A(SLJIT_SAVED_REG3) | B(SLJIT_SCRATCH_REG3)));
604    
605  #if (defined SLJIT_PPC_ABI_V2 && SLJIT_PPC_ABI_V2)  #if (defined SLJIT_PPC_STACK_FRAME_V2 && SLJIT_PPC_STACK_FRAME_V2)
606          compiler->local_size = (1 + saveds + 6 + 8) * sizeof(sljit_sw) + local_size;          compiler->local_size = (1 + saveds + 6 + 8) * sizeof(sljit_sw) + local_size;
607  #else  #else
608          compiler->local_size = (1 + saveds + 2) * sizeof(sljit_sw) + local_size;          compiler->local_size = (1 + saveds + 2) * sizeof(sljit_sw) + local_size;
# Line 615  SLJIT_API_FUNC_ATTRIBUTE void sljit_set_ Line 639  SLJIT_API_FUNC_ATTRIBUTE void sljit_set_
639          compiler->logical_local_size = local_size;          compiler->logical_local_size = local_size;
640  #endif  #endif
641    
642  #if (defined SLJIT_PPC_ABI_V2 && SLJIT_PPC_ABI_V2)  #if (defined SLJIT_PPC_STACK_FRAME_V2 && SLJIT_PPC_STACK_FRAME_V2)
643          compiler->local_size = (1 + saveds + 6 + 8) * sizeof(sljit_sw) + local_size;          compiler->local_size = (1 + saveds + 6 + 8) * sizeof(sljit_sw) + local_size;
644  #else  #else
645          compiler->local_size = (1 + saveds + 2) * sizeof(sljit_sw) + local_size;          compiler->local_size = (1 + saveds + 2) * sizeof(sljit_sw) + local_size;
# Line 637  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 661  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
661                  FAIL_IF(push_inst(compiler, ADD | D(SLJIT_LOCALS_REG) | A(SLJIT_LOCALS_REG) | B(0)));                  FAIL_IF(push_inst(compiler, ADD | D(SLJIT_LOCALS_REG) | A(SLJIT_LOCALS_REG) | B(0)));
662          }          }
663    
664  #if (defined SLJIT_PPC_ABI_V2 && SLJIT_PPC_ABI_V2)  #if (defined SLJIT_PPC_STACK_FRAME_V2 && SLJIT_PPC_STACK_FRAME_V2)
665          FAIL_IF(push_inst(compiler, STACK_LOAD | D(0) | A(SLJIT_LOCALS_REG) | IMM(2 * sizeof(sljit_sw))));          FAIL_IF(push_inst(compiler, STACK_LOAD | D(0) | A(SLJIT_LOCALS_REG) | IMM(2 * sizeof(sljit_sw))));
666  #else  #else
667          FAIL_IF(push_inst(compiler, STACK_LOAD | D(0) | A(SLJIT_LOCALS_REG) | IMM(sizeof(sljit_sw))));          FAIL_IF(push_inst(compiler, STACK_LOAD | D(0) | A(SLJIT_LOCALS_REG) | IMM(sizeof(sljit_sw))));
# Line 1937  SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju Line 1961  SLJIT_API_FUNC_ATTRIBUTE struct sljit_ju
1961    
1962          /* In PPC, we don't need to touch the arguments. */          /* In PPC, we don't need to touch the arguments. */
1963          if (type < SLJIT_JUMP)          if (type < SLJIT_JUMP)
1964                  jump->flags |= COND_B;                  jump->flags |= IS_COND;
1965    #if (defined SLJIT_PASS_ENTRY_ADDR_TO_CALL && SLJIT_PASS_ENTRY_ADDR_TO_CALL)
1966            if (type >= SLJIT_CALL0)
1967                    jump->flags |= IS_CALL;
1968    #endif
1969    
1970          PTR_FAIL_IF(emit_const(compiler, TMP_REG1, 0));          PTR_FAIL_IF(emit_const(compiler, TMP_CALL_REG, 0));
1971          PTR_FAIL_IF(push_inst(compiler, MTCTR | S(TMP_REG1)));          PTR_FAIL_IF(push_inst(compiler, MTCTR | S(TMP_CALL_REG)));
1972          jump->addr = compiler->size;          jump->addr = compiler->size;
1973          PTR_FAIL_IF(push_inst(compiler, BCCTR | bo_bi_flags | (type >= SLJIT_FAST_CALL ? 1 : 0)));          PTR_FAIL_IF(push_inst(compiler, BCCTR | bo_bi_flags | (type >= SLJIT_FAST_CALL ? 1 : 0)));
1974          return jump;          return jump;
# Line 1955  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_ Line 1983  SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_
1983          check_sljit_emit_ijump(compiler, type, src, srcw);          check_sljit_emit_ijump(compiler, type, src, srcw);
1984          ADJUST_LOCAL_OFFSET(src, srcw);          ADJUST_LOCAL_OFFSET(src, srcw);
1985    
1986          if (FAST_IS_REG(src))          if (FAST_IS_REG(src)) {
1987    #if (defined SLJIT_PASS_ENTRY_ADDR_TO_CALL && SLJIT_PASS_ENTRY_ADDR_TO_CALL)
1988                    if (type >= SLJIT_CALL0) {
1989                            FAIL_IF(push_inst(compiler, OR | S(src) | A(TMP_CALL_REG) | B(src)));
1990                            src_r = TMP_CALL_REG;
1991                    }
1992                    else
1993                            src_r = src;
1994    #else
1995                  src_r = src;                  src_r = src;
1996          else if (src & SLJIT_IMM) {  #endif
1997            } else if (src & SLJIT_IMM) {
1998                  jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));                  jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
1999                  FAIL_IF(!jump);                  FAIL_IF(!jump);
2000                  set_jump(jump, compiler, JUMP_ADDR);                  set_jump(jump, compiler, JUMP_ADDR);
2001                  jump->u.target = srcw;                  jump->u.target = srcw;
2002    #if (defined SLJIT_PASS_ENTRY_ADDR_TO_CALL && SLJIT_PASS_ENTRY_ADDR_TO_CALL)
2003                  FAIL_IF(emit_const(compiler, TMP_REG2, 0));                  if (type >= SLJIT_CALL0)
2004                  src_r = TMP_REG2;                          jump->flags |= IS_CALL;
2005    #endif
2006                    FAIL_IF(emit_const(compiler, TMP_CALL_REG, 0));
2007                    src_r = TMP_CALL_REG;
2008          }          }
2009          else {          else {
2010                  FAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, TMP_REG2, 0, TMP_REG1, 0, src, srcw));                  FAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, TMP_CALL_REG, 0, TMP_REG1, 0, src, srcw));
2011                  src_r = TMP_REG2;                  src_r = TMP_CALL_REG;
2012          }          }
2013    
2014          FAIL_IF(push_inst(compiler, MTCTR | S(src_r)));          FAIL_IF(push_inst(compiler, MTCTR | S(src_r)));

Legend:
Removed from v.1462  
changed lines
  Added in v.1463

  ViewVC Help
Powered by ViewVC 1.1.5