pike.git / src / code / amd64.c

version» Context lines:

pike.git/src/code/amd64.c:124:    } \    add_to_program(rex__); \    add_to_program(0x89); \    if (!off32__) { \    if (!from_reg__) { \    add_to_program(0x04); \    from_reg__ = 0x04; \    } \    add_to_program((from_reg__<<3)| to_reg__); \    } else if ((-0x80 <= off32__) && (0x7f >= off32__)) { \ -  if (!from_reg__) { \ -  add_to_program(0x44); \ -  from_reg__ = 0x04; \ +  add_to_program(0x40|(from_reg__<<3)| to_reg__); \ +  if (to_reg__ == 4) { \ +  add_to_program(0x24); \    } \ -  add_to_program((from_reg__<<3)| to_reg__); \ +     add_to_program(off32__); \    } else { \    add_to_program(0x80|(from_reg__<<3)| to_reg__); \    PUSH_INT(off32__); \    } \    } while(0)      #define AMD64_SHL_IMM8(REG, IMM8) do { \    enum amd64_reg reg__ = (REG); \    int imm8__ = (IMM8); \
pike.git/src/code/amd64.c:155:    if (imm8__ == 1) { \    add_to_program(0xd1); \    add_to_program(0xe0|reg__); \    } else { \    add_to_program(0xc1); \    add_to_program(0xe0|reg__); \    add_to_program(imm8__); \    } \    } while(0)    + #define AMD64_AND_IMM32(REG, IMM32) do { \ +  enum amd64_reg reg__ = (REG); \ +  int imm32__ = (IMM32); \ +  if (reg__ & 0x08) { \ +  add_to_program(0x49); \ +  reg__ &= 0x07; \ +  } else { \ +  add_to_program(0x48); \ +  } \ +  add_to_program(0x83); \ +  if ((imm32__ >= -0x80) && (imm32__ <= 0x7f)) { \ +  add_to_program(0xe0|reg__); \ +  add_to_program(imm32__); \ +  } else { \ +  Pike_error("Not supported yet.\n"); \ +  PUSH_INT(imm32__); \ +  } \ +  } while(0) +    #define AMD64_ADD_IMM32(REG, IMM32) do { \    enum amd64_reg reg__ = (REG); \    int imm32__ = (IMM32); \    if (reg__ & 0x08) { \    add_to_program(0x49); \    reg__ &= 0x07; \    } else { \    add_to_program(0x48); \    } \    add_to_program(0x83); \
pike.git/src/code/amd64.c:648:    CLEAR_REGS();   }      void amd64_update_pc(void)   {    INT32 tmp = PIKE_PC, disp;       if (amd64_prev_stored_pc == -1) {    enum amd64_reg tmp_reg = alloc_reg(0);    amd64_load_fp_reg(); -  AMD64_MOV_REG(REG_RSP, tmp_reg); -  AMD64_ADD_REG_IMM32(fp_reg, OFFSETOF(pike_frame, pc) + 0x08, REG_RSP); -  /* CALL .+0 */ -  add_to_program(0xe8); -  PUSH_INT(0x00000000); +  AMD64_LOAD_RIP32(0x00, tmp_reg);    tmp = PIKE_PC; -  AMD64_MOV_REG(tmp_reg, REG_RSP); +  AMD64_MOVE_REG_TO_RELADDR(tmp_reg, fp_reg, OFFSETOF(pike_frame, pc));   #ifdef PIKE_DEBUG    if (a_flag >= 60)    fprintf (stderr, "pc %d update pc via call\n", tmp);   #endif    DEALLOC_REG (tmp_reg);    }    else if ((disp = tmp - amd64_prev_stored_pc)) {   #ifdef PIKE_DEBUG    if (a_flag >= 60)    fprintf (stderr, "pc %d update pc relative: %d\n", tmp, disp);