pike.git / src / code / amd64.c

version» Context lines:

pike.git/src/code/amd64.c:1918:    mov_mem8_reg(sp_reg, SVAL(-1).type, P_REG_RAX );    test_reg32(P_REG_RAX);    jz(&label_B);    jmp(&label_A);    LABEL_D;    neg_mem(sp_reg, SVAL(-1).value );    LABEL_A;    amd64_call_c_opcode(addr, flags);    jmp(&label_C);    LABEL_B; +  mov_imm_mem(PIKE_T_INT, sp_reg, SVAL(-1).type );    neg_mem(sp_reg, SVAL(-1).value );    jo(&label_D);    LABEL_C;    }    return;       case F_COMPL:    {    LABELS();    ins_debug_instr_prologue(b, 0, 0);
pike.git/src/code/amd64.c:1941:    jz(&label_B);    LABEL_A;    amd64_call_c_opcode(addr, flags);    jmp(&label_C);    LABEL_B;    not_mem(sp_reg, SVAL(-1).value );    LABEL_C;    }    return;    -  case F_DIVIDE: +     case F_MOD: -  +  case F_DIVIDE:    {    LABELS();    if_not_two_int(&label_A,0);    mov_mem_reg(sp_reg, SVAL(-1).value, P_REG_RBX );    mov_mem_reg(sp_reg, SVAL(-2).value, P_REG_RAX ); -  +  cmp_reg_imm(P_REG_RAX, 0 ); jl(&label_A);    if( b+F_OFFSET == F_MOD )    { -  cmp_reg_imm(P_REG_RAX, 0 ); -  /* FIXME: Emulate pikes % functionality. */ -  jl(&label_A); +  /* Emulates pikes % functionality. */ +  cmp_reg_imm(P_REG_RBX, 0 ); jl(&label_A);    }    cmp_reg_imm(P_REG_RBX,0);    je(&label_A);    cmp_reg_imm(P_REG_RBX,-1);    jne(&label_C);    cmp_reg_imm(P_REG_RAX,0);    jle(&label_A);    /* FIXME:       Int.native_min / -1 -> exception.
pike.git/src/code/amd64.c:3035:    jmp(&label_B);    LABEL_A;    update_arg1(b);    amd64_call_c_opcode(instrs[a-F_OFFSET].address,    instrs[a-F_OFFSET].flags);    LABEL_B;    }    return;       case F_MOD_INT: +  if( b < 0 ) +  break;    case F_DIVIDE_INT:    if( b == 0 )    {    yyerror("Divide by constant 0\n");    break;    }    {    LABELS();    ins_debug_instr_prologue(a-F_OFFSET, b, 0);    amd64_load_sp_reg();       mov_mem8_reg(sp_reg,SVAL(-1).type, P_REG_RAX);    test_reg32(P_REG_RAX);    jnz(&label_A);       mov_mem_reg(sp_reg, SVAL(-1).value, P_REG_RAX);    if( b == -1 )    {    /* 64bit imm not done. */    cmp_reg_imm(P_REG_RAX,-0x80000000); -  jl(&label_A); +  jle(&label_A);    } -  else if( a == F_MOD_INT ) +  /*if( a == F_MOD_INT )*/    {    cmp_reg_imm(P_REG_RAX, 0);    jl(&label_A);    }       mov_imm_reg(b,P_REG_RBX);    div_reg_reg(P_REG_RAX,P_REG_RBX);    mov_imm_mem(PIKE_T_INT, sp_reg, SVAL(-1).type);    if( a == F_MOD_INT )    mov_reg_mem(P_REG_RDX, sp_reg, SVAL(-1).value);