pike.git / src / code / amd64.c

version» Context lines:

pike.git/src/code/amd64.c:244:    low_mov_mem_reg( from_reg, offset, to_reg );   }      static void xor_reg_reg( enum amd64_reg reg1, enum amd64_reg reg2 )   {    rex(1,reg1,0,reg2);    opcode( 0x31 );    modrm(3,reg1,reg2);   }    + static void and_reg_reg( enum amd64_reg reg1, enum amd64_reg reg2 ) + { +  rex(1,reg1,0,reg2); +  opcode( 0x23 ); +  modrm(3,reg1,reg2); + } +  + static void or_reg_reg( enum amd64_reg reg1, enum amd64_reg reg2 ) + { +  rex(1,reg1,0,reg2); +  opcode( 0x09 ); +  modrm(3,reg1,reg2); + } +    static void and_reg_imm( enum amd64_reg reg, int imm32 )   {    rex( 1, 0, 0, reg );       if( imm32 < -0x80 || imm32 > 0x7f )    {    if( reg == P_REG_RAX )    {    opcode( 0x25 ); /* AND rax,imm32 */    id( imm32 );
pike.git/src/code/amd64.c:379: Inside #if 0
  #if 0   static void shl_reg_mem( enum amd64_reg reg, enum amd64_reg mem, int offset)   {    if( reg == P_REG_RCX )    Pike_fatal("Not supported\n");    mov_mem8_reg( mem, offset, P_REG_RCX );    shl_reg_reg( reg, P_REG_RCX );   }   #endif    + static void shr_mem_reg( enum amd64_reg reg, int off, enum amd64_reg sreg) + { +  if( sreg != P_REG_RCX ) +  Pike_fatal("Not supported\n"); +  +  rex( 1, 0, 0, reg ); +  opcode( 0xd3 ); /* SAR r/m64,CL */ +  offset_modrm_sib(off, 7, reg ); + /* modrm( 3, 7, reg ); */ + } +    static void shr_reg_imm( enum amd64_reg from_reg, int shift )   {    rex( 1, from_reg, 0, 0 );    if( shift == 1 )    {    opcode( 0xd1 ); /* SAR */    modrm( 3, 7, from_reg );    }    else    {
pike.git/src/code/amd64.c:808:   }      /* reg += reg2 */   static void add_reg_reg( enum amd64_reg reg, enum amd64_reg reg2 )   {    rex(1,reg2,0,reg);    opcode( 0x1 );    modrm( 3, reg2, reg );   }    + /* reg += reg2 */ + static void add_reg32_reg32( enum amd64_reg reg, enum amd64_reg reg2 ) + { +  rex(0,reg2,0,reg); +  opcode( 0x1 ); +  modrm( 3, reg2, reg ); + } +    /* reg -= reg2 */   static void sub_reg_reg( enum amd64_reg reg, enum amd64_reg reg2 )   {    rex(1,reg2,0,reg);    opcode( 0x29 );    modrm( 3, reg2, reg );   }      /* dst += *(src+off) */   static void add_reg_mem( enum amd64_reg dst, enum amd64_reg src, long off )
pike.git/src/code/amd64.c:1772:    mov_reg_mem( P_REG_RAX, P_REG_RBX, 0 );    mov_reg_mem( P_REG_RCX, P_REG_RBX, 8 );    /*    Note: For SVALUEPTR we know we do not have to free    the lvalue.    */    amd64_add_sp( -3 );    LABEL_B;    }    return; +  case F_AND: +  { +  LABELS(); +  ins_debug_instr_prologue(b, 0, 0); +  amd64_load_sp_reg(); +  mov_mem8_reg(sp_reg, SVAL(-1).type, P_REG_RAX ); +  mov_mem8_reg(sp_reg, SVAL(-2).type, P_REG_RBX ); +  add_reg_reg(P_REG_RAX,P_REG_RBX); +  /* test_reg(P_REG_RAX); int == 0 */ +  jnz(&label_A); +  +  mov_mem_reg(sp_reg, SVAL(-1).value, P_REG_RAX ); +  mov_mem_reg(sp_reg, SVAL(-2).value, P_REG_RBX ); +  and_reg_reg(P_REG_RBX,P_REG_RAX); +  mov_reg_mem(P_REG_RBX,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_OR: +  { +  LABELS(); +  ins_debug_instr_prologue(b, 0, 0); +  amd64_load_sp_reg(); +  mov_mem8_reg(sp_reg, SVAL(-1).type, P_REG_RAX ); +  mov_mem8_reg(sp_reg, SVAL(-2).type, P_REG_RBX ); +  add_reg32_reg32(P_REG_RAX,P_REG_RBX); +  /* test_reg(P_REG_RAX); int == 0 */ +  jnz(&label_A); +  +  mov_mem_reg(sp_reg, SVAL(-1).value, P_REG_RAX ); +  mov_mem_reg(sp_reg, SVAL(-2).value, P_REG_RBX ); +  or_reg_reg(P_REG_RAX,P_REG_RBX); +  mov_reg_mem(P_REG_RBX,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_RSH: +  { +  LABELS(); +  ins_debug_instr_prologue(b, 0, 0); +  amd64_load_sp_reg(); +  mov_mem8_reg(sp_reg, -1*sizeof(struct svalue), P_REG_RAX ); +  mov_mem8_reg(sp_reg, -2*sizeof(struct svalue), P_REG_RBX ); +  add_reg32_reg32(P_REG_RAX,P_REG_RBX); +  /* test_reg(P_REG_RAX); int == 0 */ +  jnz(&label_A); +  +  mov_mem_reg(sp_reg, SVAL(-1).value, P_REG_RCX ); +  cmp_reg_imm(P_REG_RCX,0); +  jl( &label_A ); +  amd64_add_sp(-1); +  cmp_reg_imm(P_REG_RCX,63); +  jle( &label_B ); +  mov_imm_reg(P_REG_RCX,63); +  LABEL_B; +  shr_mem_reg(sp_reg,SVAL(-1).value, P_REG_RCX); +  jmp(&label_C); +  LABEL_A; +  amd64_call_c_opcode(addr, flags); +  amd64_load_sp_reg(); +  LABEL_C; +  } +  return;    case F_ADD_INTS:    {    ins_debug_instr_prologue(b, 0, 0);    amd64_load_sp_reg();    mov_mem_reg( sp_reg, -sizeof(struct svalue)*2, P_REG_RAX );    add_reg_mem( P_REG_RAX, sp_reg, -sizeof(struct svalue ) );   #if PIKE_T_INT != 0   #error This code assumes PIKE_T_INT is 0.    /* cmp_reg32_imm( P_REG_RAX, 0 ); */   #endif
pike.git/src/code/amd64.c:2042:    return;          case F_SUBTRACT:    {    LABELS();    ins_debug_instr_prologue(b, 0, 0);    amd64_load_sp_reg();    mov_mem8_reg(sp_reg, -1*sizeof(struct svalue), P_REG_RAX );    mov_mem8_reg(sp_reg, -2*sizeof(struct svalue), P_REG_RBX ); -  add_reg_reg(P_REG_RAX,P_REG_RBX); -  test_reg32(P_REG_RAX); /* int == 0 */ +  add_reg32_reg32(P_REG_RAX,P_REG_RBX); +  /* test_reg32(P_REG_RAX); int == 0 */    jnz(&label_A);      #ifdef PIKE_DEBUG    if( PIKE_T_INT )    Pike_fatal("Assertion failed\n");   #endif    mov_mem_reg(sp_reg, -1*sizeof(struct svalue)+OFFSETOF(svalue,u.integer),    P_REG_RAX );    mov_mem_reg(sp_reg, -2*sizeof(struct svalue)+OFFSETOF(svalue,u.integer),    P_REG_RCX );