pike.git / src / code / amd64.c

version» Context lines:

pike.git/src/code/amd64.c:450:    modrm( 3, 7, from_reg );    ib( shift );    }   }      static void clear_reg( enum amd64_reg reg )   {    xor_reg_reg( reg, reg );   }    - #if 0 +    static void neg_reg( enum amd64_reg reg )   {    rex(1,0,0,reg);    opcode(0xf7);    modrm(3,3,reg);   } - #endif +       static void mov_imm_reg( long imm, enum amd64_reg reg )   {    if( (imm > 0x7fffffffLL) || (imm < -0x80000000LL) )    {    rex(1,0,0,reg);    opcode(0xb8 | (reg&0x7)); /* mov imm64 -> reg64 */    id( (imm & 0xffffffffLL) );    id( ((imm >> 32)&0xffffffffLL) );    }
pike.git/src/code/amd64.c:1944:    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:    {    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 ); -  +  if( b+F_OFFSET == F_MOD ) +  { +  cmp_reg_imm(P_REG_RAX, 0 ); +  /* FIXME: Emulate pikes % functionality. */ +  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.    -  +  This checks for -<whatever> / -1. +     There is bound to be a better way.    Somehow disable the exception?    -  Some SSE alternative? +  Some SSE alternative that does not throw? +  +  Perhaps a 64/64->64 instead of the current 128/64->64?    */    LABEL_C;    div_reg_reg(P_REG_RAX,P_REG_RBX);    jo(&label_A);    mov_imm_mem(PIKE_T_INT, sp_reg, SVAL(-2).type); -  +  if( b+F_OFFSET == F_MOD ) +  mov_reg_mem(P_REG_RDX, sp_reg, SVAL(-2).value); +  else    mov_reg_mem(P_REG_RAX, sp_reg, SVAL(-2).value);    amd64_add_sp(-1);    jmp(&label_B);    LABEL_A;    amd64_call_c_opcode(addr, flags);    amd64_load_sp_reg();    LABEL_B;    }    return;    case F_MULTIPLY: