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

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

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

revision 879 by zherczeg, Sat Jan 14 17:05:53 2012 UTC revision 880 by zherczeg, Sun Jan 15 17:23:37 2012 UTC
# Line 86  static sljit_ub* generate_fixed_jump(slj Line 86  static sljit_ub* generate_fixed_jump(slj
86          return code_ptr;          return code_ptr;
87  }  }
88    
89  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_enter(struct sljit_compiler *compiler, int args, int temporaries, int generals, int local_size)  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_enter(struct sljit_compiler *compiler, int args, int temporaries, int saveds, int local_size)
90  {  {
91          int size, pushed_size;          int size, pushed_size;
92          sljit_ub *buf;          sljit_ub *buf;
93    
94          CHECK_ERROR();          CHECK_ERROR();
95          check_sljit_emit_enter(compiler, args, temporaries, generals, local_size);          check_sljit_emit_enter(compiler, args, temporaries, saveds, local_size);
96    
97          compiler->temporaries = temporaries;          compiler->temporaries = temporaries;
98          compiler->generals = generals;          compiler->saveds = saveds;
99          compiler->flags_saved = 0;          compiler->flags_saved = 0;
100    
101          size = generals;          size = saveds;
102          /* Including the return address saved by the call instruction. */          /* Including the return address saved by the call instruction. */
103          pushed_size = (generals + 1) * sizeof(sljit_w);          pushed_size = (saveds + 1) * sizeof(sljit_w);
104  #ifndef _WIN64  #ifndef _WIN64
105          if (generals >= 2)          if (saveds >= 2)
106                  size += generals - 1;                  size += saveds - 1;
107  #else  #else
108          /* Saving the virtual stack pointer. */          /* Saving the virtual stack pointer. */
109          compiler->has_locals = local_size > 0;          compiler->has_locals = local_size > 0;
# Line 111  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_ Line 111  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_
111                  size += 2;                  size += 2;
112                  pushed_size += sizeof(sljit_w);                  pushed_size += sizeof(sljit_w);
113          }          }
114          if (generals >= 4)          if (saveds >= 4)
115                  size += generals - 3;                  size += saveds - 3;
116          if (temporaries >= 5) {          if (temporaries >= 5) {
117                  size += (5 - 4) * 2;                  size += (5 - 4) * 2;
118                  pushed_size += sizeof(sljit_w);                  pushed_size += sizeof(sljit_w);
# Line 124  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_ Line 124  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_
124                  FAIL_IF(!buf);                  FAIL_IF(!buf);
125    
126                  INC_SIZE(size);                  INC_SIZE(size);
127                  if (generals >= 5) {                  if (saveds >= 5) {
128                          SLJIT_COMPILE_ASSERT(reg_map[SLJIT_GENERAL_EREG2] >= 8, general_ereg2_is_hireg);                          SLJIT_COMPILE_ASSERT(reg_map[SLJIT_SAVED_EREG2] >= 8, saved_ereg2_is_hireg);
129                          *buf++ = REX_B;                          *buf++ = REX_B;
130                          PUSH_REG(reg_lmap[SLJIT_GENERAL_EREG2]);                          PUSH_REG(reg_lmap[SLJIT_SAVED_EREG2]);
131                  }                  }
132                  if (generals >= 4) {                  if (saveds >= 4) {
133                          SLJIT_COMPILE_ASSERT(reg_map[SLJIT_GENERAL_EREG1] >= 8, general_ereg1_is_hireg);                          SLJIT_COMPILE_ASSERT(reg_map[SLJIT_SAVED_EREG1] >= 8, saved_ereg1_is_hireg);
134                          *buf++ = REX_B;                          *buf++ = REX_B;
135                          PUSH_REG(reg_lmap[SLJIT_GENERAL_EREG1]);                          PUSH_REG(reg_lmap[SLJIT_SAVED_EREG1]);
136                  }                  }
137                  if (generals >= 3) {                  if (saveds >= 3) {
138  #ifndef _WIN64  #ifndef _WIN64
139                          SLJIT_COMPILE_ASSERT(reg_map[SLJIT_GENERAL_REG3] >= 8, general_reg3_is_hireg);                          SLJIT_COMPILE_ASSERT(reg_map[SLJIT_SAVED_REG3] >= 8, saved_reg3_is_hireg);
140                          *buf++ = REX_B;                          *buf++ = REX_B;
141  #else  #else
142                          SLJIT_COMPILE_ASSERT(reg_map[SLJIT_GENERAL_REG3] < 8, general_reg3_is_loreg);                          SLJIT_COMPILE_ASSERT(reg_map[SLJIT_SAVED_REG3] < 8, saved_reg3_is_loreg);
143  #endif  #endif
144                          PUSH_REG(reg_lmap[SLJIT_GENERAL_REG3]);                          PUSH_REG(reg_lmap[SLJIT_SAVED_REG3]);
145                  }                  }
146                  if (generals >= 2) {                  if (saveds >= 2) {
147  #ifndef _WIN64  #ifndef _WIN64
148                          SLJIT_COMPILE_ASSERT(reg_map[SLJIT_GENERAL_REG2] >= 8, general_reg2_is_hireg);                          SLJIT_COMPILE_ASSERT(reg_map[SLJIT_SAVED_REG2] >= 8, saved_reg2_is_hireg);
149                          *buf++ = REX_B;                          *buf++ = REX_B;
150  #else  #else
151                          SLJIT_COMPILE_ASSERT(reg_map[SLJIT_GENERAL_REG2] < 8, general_reg2_is_loreg);                          SLJIT_COMPILE_ASSERT(reg_map[SLJIT_SAVED_REG2] < 8, saved_reg2_is_loreg);
152  #endif  #endif
153                          PUSH_REG(reg_lmap[SLJIT_GENERAL_REG2]);                          PUSH_REG(reg_lmap[SLJIT_SAVED_REG2]);
154                  }                  }
155                  if (generals >= 1) {                  if (saveds >= 1) {
156                          SLJIT_COMPILE_ASSERT(reg_map[SLJIT_GENERAL_REG1] < 8, general_reg1_is_loreg);                          SLJIT_COMPILE_ASSERT(reg_map[SLJIT_SAVED_REG1] < 8, saved_reg1_is_loreg);
157                          PUSH_REG(reg_lmap[SLJIT_GENERAL_REG1]);                          PUSH_REG(reg_lmap[SLJIT_SAVED_REG1]);
158                  }                  }
159  #ifdef _WIN64  #ifdef _WIN64
160                  if (temporaries >= 5) {                  if (temporaries >= 5) {
# Line 173  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_ Line 173  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_
173                  if (args > 0) {                  if (args > 0) {
174                          *buf++ = REX_W;                          *buf++ = REX_W;
175                          *buf++ = 0x8b;                          *buf++ = 0x8b;
176                          *buf++ = 0xc0 | (reg_map[SLJIT_GENERAL_REG1] << 3) | 0x7;                          *buf++ = 0xc0 | (reg_map[SLJIT_SAVED_REG1] << 3) | 0x7;
177                  }                  }
178                  if (args > 1) {                  if (args > 1) {
179                          *buf++ = REX_W | REX_R;                          *buf++ = REX_W | REX_R;
180                          *buf++ = 0x8b;                          *buf++ = 0x8b;
181                          *buf++ = 0xc0 | (reg_lmap[SLJIT_GENERAL_REG2] << 3) | 0x6;                          *buf++ = 0xc0 | (reg_lmap[SLJIT_SAVED_REG2] << 3) | 0x6;
182                  }                  }
183                  if (args > 2) {                  if (args > 2) {
184                          *buf++ = REX_W | REX_R;                          *buf++ = REX_W | REX_R;
185                          *buf++ = 0x8b;                          *buf++ = 0x8b;
186                          *buf++ = 0xc0 | (reg_lmap[SLJIT_GENERAL_REG3] << 3) | 0x2;                          *buf++ = 0xc0 | (reg_lmap[SLJIT_SAVED_REG3] << 3) | 0x2;
187                  }                  }
188  #else  #else
189                  if (args > 0) {                  if (args > 0) {
190                          *buf++ = REX_W;                          *buf++ = REX_W;
191                          *buf++ = 0x8b;                          *buf++ = 0x8b;
192                          *buf++ = 0xc0 | (reg_map[SLJIT_GENERAL_REG1] << 3) | 0x1;                          *buf++ = 0xc0 | (reg_map[SLJIT_SAVED_REG1] << 3) | 0x1;
193                  }                  }
194                  if (args > 1) {                  if (args > 1) {
195                          *buf++ = REX_W;                          *buf++ = REX_W;
196                          *buf++ = 0x8b;                          *buf++ = 0x8b;
197                          *buf++ = 0xc0 | (reg_map[SLJIT_GENERAL_REG2] << 3) | 0x2;                          *buf++ = 0xc0 | (reg_map[SLJIT_SAVED_REG2] << 3) | 0x2;
198                  }                  }
199                  if (args > 2) {                  if (args > 2) {
200                          *buf++ = REX_W | REX_B;                          *buf++ = REX_W | REX_B;
201                          *buf++ = 0x8b;                          *buf++ = 0x8b;
202                          *buf++ = 0xc0 | (reg_map[SLJIT_GENERAL_REG3] << 3) | 0x0;                          *buf++ = 0xc0 | (reg_map[SLJIT_SAVED_REG3] << 3) | 0x0;
203                  }                  }
204  #endif  #endif
205          }          }
# Line 269  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_ Line 269  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_
269          }          }
270  #endif  #endif
271    
         /* Mov arguments to general registers. */  
272          return SLJIT_SUCCESS;          return SLJIT_SUCCESS;
273  }  }
274    
275  SLJIT_API_FUNC_ATTRIBUTE void sljit_set_context(struct sljit_compiler *compiler, int args, int temporaries, int generals, int local_size)  SLJIT_API_FUNC_ATTRIBUTE void sljit_set_context(struct sljit_compiler *compiler, int args, int temporaries, int saveds, int local_size)
276  {  {
277          int pushed_size;          int pushed_size;
278    
279          CHECK_ERROR_VOID();          CHECK_ERROR_VOID();
280          check_sljit_set_context(compiler, args, temporaries, generals, local_size);          check_sljit_set_context(compiler, args, temporaries, saveds, local_size);
281    
282          compiler->temporaries = temporaries;          compiler->temporaries = temporaries;
283          compiler->generals = generals;          compiler->saveds = saveds;
284          /* Including the return address saved by the call instruction. */          /* Including the return address saved by the call instruction. */
285          pushed_size = (generals + 1) * sizeof(sljit_w);          pushed_size = (saveds + 1) * sizeof(sljit_w);
286  #ifdef _WIN64  #ifdef _WIN64
287          compiler->has_locals = local_size > 0;          compiler->has_locals = local_size > 0;
288          if (local_size > 0)          if (local_size > 0)
# Line 329  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_ Line 328  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_
328                  }                  }
329          }          }
330    
331          size = 1 + compiler->generals;          size = 1 + compiler->saveds;
332  #ifndef _WIN64  #ifndef _WIN64
333          if (compiler->generals >= 2)          if (compiler->saveds >= 2)
334                  size += compiler->generals - 1;                  size += compiler->saveds - 1;
335  #else  #else
336          if (compiler->has_locals)          if (compiler->has_locals)
337                  size += 2;                  size += 2;
338          if (compiler->generals >= 4)          if (compiler->saveds >= 4)
339                  size += compiler->generals - 3;                  size += compiler->saveds - 3;
340          if (compiler->temporaries >= 5)          if (compiler->temporaries >= 5)
341                  size += (5 - 4) * 2;                  size += (5 - 4) * 2;
342  #endif  #endif
# Line 356  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_ Line 355  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_
355                  POP_REG(reg_lmap[SLJIT_TEMPORARY_EREG2]);                  POP_REG(reg_lmap[SLJIT_TEMPORARY_EREG2]);
356          }          }
357  #endif  #endif
358          if (compiler->generals >= 1)          if (compiler->saveds >= 1)
359                  POP_REG(reg_map[SLJIT_GENERAL_REG1]);                  POP_REG(reg_map[SLJIT_SAVED_REG1]);
360          if (compiler->generals >= 2) {          if (compiler->saveds >= 2) {
361  #ifndef _WIN64  #ifndef _WIN64
362                  *buf++ = REX_B;                  *buf++ = REX_B;
363  #endif  #endif
364                  POP_REG(reg_lmap[SLJIT_GENERAL_REG2]);                  POP_REG(reg_lmap[SLJIT_SAVED_REG2]);
365          }          }
366          if (compiler->generals >= 3) {          if (compiler->saveds >= 3) {
367  #ifndef _WIN64  #ifndef _WIN64
368                  *buf++ = REX_B;                  *buf++ = REX_B;
369  #endif  #endif
370                  POP_REG(reg_lmap[SLJIT_GENERAL_REG3]);                  POP_REG(reg_lmap[SLJIT_SAVED_REG3]);
371          }          }
372          if (compiler->generals >= 4) {          if (compiler->saveds >= 4) {
373                  *buf++ = REX_B;                  *buf++ = REX_B;
374                  POP_REG(reg_lmap[SLJIT_GENERAL_EREG1]);                  POP_REG(reg_lmap[SLJIT_SAVED_EREG1]);
375          }          }
376          if (compiler->generals >= 5) {          if (compiler->saveds >= 5) {
377                  *buf++ = REX_B;                  *buf++ = REX_B;
378                  POP_REG(reg_lmap[SLJIT_GENERAL_EREG2]);                  POP_REG(reg_lmap[SLJIT_SAVED_EREG2]);
379          }          }
380    
381          RET();          RET();
# Line 672  static SLJIT_INLINE int call_with_args(s Line 671  static SLJIT_INLINE int call_with_args(s
671          return SLJIT_SUCCESS;          return SLJIT_SUCCESS;
672  }  }
673    
674  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_fast_enter(struct sljit_compiler *compiler, int dst, sljit_w dstw, int args, int temporaries, int generals, int local_size)  SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_fast_enter(struct sljit_compiler *compiler, int dst, sljit_w dstw, int args, int temporaries, int saveds, int local_size)
675  {  {
676          sljit_ub *buf;          sljit_ub *buf;
677    
678          CHECK_ERROR();          CHECK_ERROR();
679          check_sljit_emit_fast_enter(compiler, dst, dstw, args, temporaries, generals, local_size);          check_sljit_emit_fast_enter(compiler, dst, dstw, args, temporaries, saveds, local_size);
680    
681          compiler->temporaries = temporaries;          compiler->temporaries = temporaries;
682          compiler->generals = generals;          compiler->saveds = saveds;
683          compiler->local_size = (local_size + sizeof(sljit_uw) - 1) & ~(sizeof(sljit_uw) - 1);          compiler->local_size = (local_size + sizeof(sljit_uw) - 1) & ~(sizeof(sljit_uw) - 1);
684  #ifdef _WIN64  #ifdef _WIN64
685          compiler->local_size += 4 * sizeof(sljit_w);          compiler->local_size += 4 * sizeof(sljit_w);
# Line 815  static int emit_mov_int(struct sljit_com Line 814  static int emit_mov_int(struct sljit_com
814                  return SLJIT_SUCCESS;                  return SLJIT_SUCCESS;
815          }          }
816    
817          dst_r = (dst >= SLJIT_TEMPORARY_REG1 && dst <= SLJIT_GENERAL_REG3) ? dst : TMP_REGISTER;          dst_r = (dst >= SLJIT_TEMPORARY_REG1 && dst <= SLJIT_SAVED_REG3) ? dst : TMP_REGISTER;
818    
819          if ((dst & SLJIT_MEM) && (src >= SLJIT_TEMPORARY_REG1 && src <= SLJIT_GENERAL_REG3))          if ((dst & SLJIT_MEM) && (src >= SLJIT_TEMPORARY_REG1 && src <= SLJIT_SAVED_REG3))
820                  dst_r = src;                  dst_r = src;
821          else {          else {
822                  if (sign) {                  if (sign) {

Legend:
Removed from v.879  
changed lines
  Added in v.880

  ViewVC Help
Powered by ViewVC 1.1.5