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

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

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

revision 846 by zherczeg, Fri Dec 30 13:22:28 2011 UTC revision 847 by zherczeg, Tue Jan 3 17:49:03 2012 UTC
# Line 474  static void SLJIT_CALL sljit_touch_stack Line 474  static void SLJIT_CALL sljit_touch_stack
474  #include "sljitNativeX86_64.c"  #include "sljitNativeX86_64.c"
475  #endif  #endif
476    
 SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_op0(struct sljit_compiler *compiler, int op)  
 {  
         sljit_ub *buf;  
   
         CHECK_ERROR();  
         check_sljit_emit_op0(compiler, op);  
   
         op = GET_OPCODE(op);  
         switch (op) {  
         case SLJIT_BREAKPOINT:  
                 buf = (sljit_ub*)ensure_buf(compiler, 1 + 1);  
                 FAIL_IF(!buf);  
                 INC_SIZE(1);  
                 *buf = 0xcc;  
                 break;  
         case SLJIT_NOP:  
                 buf = (sljit_ub*)ensure_buf(compiler, 1 + 1);  
                 FAIL_IF(!buf);  
                 INC_SIZE(1);  
                 *buf = 0x90;  
                 break;  
         }  
   
         return SLJIT_SUCCESS;  
 }  
   
477  static int emit_mov(struct sljit_compiler *compiler,  static int emit_mov(struct sljit_compiler *compiler,
478          int dst, sljit_w dstw,          int dst, sljit_w dstw,
479          int src, sljit_w srcw)          int src, sljit_w srcw)
# Line 568  static int emit_mov(struct sljit_compile Line 542  static int emit_mov(struct sljit_compile
542  #define EMIT_MOV(compiler, dst, dstw, src, srcw) \  #define EMIT_MOV(compiler, dst, dstw, src, srcw) \
543          FAIL_IF(emit_mov(compiler, dst, dstw, src, srcw));          FAIL_IF(emit_mov(compiler, dst, dstw, src, srcw));
544    
545    SLJIT_API_FUNC_ATTRIBUTE int sljit_emit_op0(struct sljit_compiler *compiler, int op)
546    {
547            sljit_ub *buf;
548    #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
549            int size;
550    #endif
551    
552            CHECK_ERROR();
553            check_sljit_emit_op0(compiler, op);
554    
555            switch (GET_OPCODE(op)) {
556            case SLJIT_BREAKPOINT:
557                    buf = (sljit_ub*)ensure_buf(compiler, 1 + 1);
558                    FAIL_IF(!buf);
559                    INC_SIZE(1);
560                    *buf = 0xcc;
561                    break;
562            case SLJIT_NOP:
563                    buf = (sljit_ub*)ensure_buf(compiler, 1 + 1);
564                    FAIL_IF(!buf);
565                    INC_SIZE(1);
566                    *buf = 0x90;
567                    break;
568            case SLJIT_UMUL:
569            case SLJIT_SMUL:
570            case SLJIT_UDIV:
571            case SLJIT_SDIV:
572                    compiler->flags_saved = 0;
573    #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
574    #ifdef _WIN64
575                    SLJIT_COMPILE_ASSERT(
576                            reg_map[SLJIT_TEMPORARY_REG1] == 0
577                            && reg_map[SLJIT_TEMPORARY_REG2] == 2
578                            && reg_map[TMP_REGISTER] > 7,
579                            invalid_register_assignment_for_div_mul);
580    #else
581                    SLJIT_COMPILE_ASSERT(
582                            reg_map[SLJIT_TEMPORARY_REG1] == 0
583                            && reg_map[SLJIT_TEMPORARY_REG2] < 7
584                            && reg_map[TMP_REGISTER] == 2,
585                            invalid_register_assignment_for_div_mul);
586    #endif
587                    compiler->mode32 = op & SLJIT_INT_OP;
588    #endif
589    
590                    op = GET_OPCODE(op);
591                    if (op == SLJIT_UDIV) {
592    #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || defined(_WIN64)
593                            EMIT_MOV(compiler, TMP_REGISTER, 0, SLJIT_TEMPORARY_REG2, 0);
594                            buf = emit_x86_instruction(compiler, 1, SLJIT_TEMPORARY_REG2, 0, SLJIT_TEMPORARY_REG2, 0);
595    #else
596                            buf = emit_x86_instruction(compiler, 1, TMP_REGISTER, 0, TMP_REGISTER, 0);
597    #endif
598                            FAIL_IF(!buf);
599                            *buf = 0x33;
600                    }
601    
602                    if (op == SLJIT_SDIV) {
603    #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || defined(_WIN64)
604                            EMIT_MOV(compiler, TMP_REGISTER, 0, SLJIT_TEMPORARY_REG2, 0);
605                            EMIT_MOV(compiler, SLJIT_TEMPORARY_REG2, 0, SLJIT_TEMPORARY_REG1, 0);
606    #else
607                            EMIT_MOV(compiler, TMP_REGISTER, 0, SLJIT_TEMPORARY_REG1, 0);
608    #endif
609    
610    #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
611                            buf = (sljit_ub*)ensure_buf(compiler, 1 + 3);
612                            FAIL_IF(!buf);
613                            INC_SIZE(3);
614                            *buf++ = 0xc1;
615                            *buf++ = 0xfa;
616                            *buf = 0x1f;
617    #else
618                            if (compiler->mode32) {
619                                    buf = (sljit_ub*)ensure_buf(compiler, 1 + 3);
620                                    FAIL_IF(!buf);
621                                    INC_SIZE(3);
622                                    *buf++ = 0xc1;
623                                    *buf++ = 0xfa;
624                                    *buf = 0x1f;
625                            } else {
626                                    buf = (sljit_ub*)ensure_buf(compiler, 1 + 4);
627                                    FAIL_IF(!buf);
628                                    INC_SIZE(4);
629                                    *buf++ = REX_W;
630                                    *buf++ = 0xc1;
631                                    *buf++ = 0xfa;
632                                    *buf = 0x3f;
633                            }
634    #endif
635                    }
636    
637    #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
638                    buf = (sljit_ub*)ensure_buf(compiler, 1 + 2);
639                    FAIL_IF(!buf);
640                    INC_SIZE(2);
641                    *buf++ = 0xf7;
642                    *buf = 0xc0 | ((op >= SLJIT_UDIV) ? reg_map[TMP_REGISTER] : reg_map[SLJIT_TEMPORARY_REG2]);
643    #else
644    #ifdef _WIN64
645                    size = (!compiler->mode32 || op >= SLJIT_UDIV) ? 3 : 2;
646    #else
647                    size = (!compiler->mode32) ? 3 : 2;
648    #endif
649                    buf = (sljit_ub*)ensure_buf(compiler, 1 + size);
650                    FAIL_IF(!buf);
651                    INC_SIZE(size);
652    #ifdef _WIN64
653                    if (!compiler->mode32)
654                            *buf++ = REX_W | ((op >= SLJIT_UDIV) ? REX_B : 0);
655                    else if (op >= SLJIT_UDIV)
656                            *buf++ = REX_B;
657                    *buf++ = 0xf7;
658                    *buf = 0xc0 | ((op >= SLJIT_UDIV) ? reg_lmap[TMP_REGISTER] : reg_lmap[SLJIT_TEMPORARY_REG2]);
659    #else
660                    if (!compiler->mode32)
661                            *buf++ = REX_W;
662                    *buf++ = 0xf7;
663                    *buf = 0xc0 | reg_map[SLJIT_TEMPORARY_REG2];
664    #endif
665    #endif
666                    switch (op) {
667                    case SLJIT_UMUL:
668                            *buf |= 4 << 3;
669                            break;
670                    case SLJIT_SMUL:
671                            *buf |= 5 << 3;
672                            break;
673                    case SLJIT_UDIV:
674                            *buf |= 6 << 3;
675                            break;
676                    case SLJIT_SDIV:
677                            *buf |= 7 << 3;
678                            break;
679                    }
680    #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) && !defined(_WIN64)
681                    EMIT_MOV(compiler, SLJIT_TEMPORARY_REG2, 0, TMP_REGISTER, 0);
682    #endif
683                    break;
684            }
685    
686            return SLJIT_SUCCESS;
687    }
688    
689  #define ENCODE_PREFIX(prefix) \  #define ENCODE_PREFIX(prefix) \
690          do { \          do { \
691                  code = (sljit_ub*)ensure_buf(compiler, 1 + 1); \                  code = (sljit_ub*)ensure_buf(compiler, 1 + 1); \

Legend:
Removed from v.846  
changed lines
  Added in v.847

webmaster@exim.org
ViewVC Help
Powered by ViewVC 1.1.12