799039 | 2006-04-27 | Tor Edvardsson | |
#include "operators.h"
#include "constants.h"
#include "object.h"
#include "builtin_functions.h"
|
51f370 | 2015-08-06 | Per Hedbor | | #include "bignum.h"
|
f36a62 | 2017-02-09 | Henrik Grubbström (Grubba) | | #include "pike_compiler.h"
|
799039 | 2006-04-27 | Tor Edvardsson | |
|
ddc1ba | 2014-08-07 | Per Hedbor | |
|
13670c | 2015-05-25 | Martin Nilsson | | #ifdef REG_RBX
|
ddc1ba | 2014-08-07 | Per Hedbor | | #undef REG_RAX
#undef REG_RBX
#undef REG_RCX
#undef REG_RDX
#undef REG_RSP
#undef REG_RBP
#undef REG_RSI
#undef REG_RDI
#undef REG_R8
#undef REG_R9
#undef REG_R10
#undef REG_R11
#undef REG_R12
#undef REG_R13
#undef REG_R14
#undef REG_R15
#endif
#define REG_RAX MISSING_P_
#define REG_RBX MISSING_P_
#define REG_RCX MISSING_P_
#define REG_RDX MISSING_P_
#define REG_RSP MISSING_P_
#define REG_RBP MISSING_P_
#define REG_RSI MISSING_P_
#define REG_RDI MISSING_P_
#define REG_R8 MISSING_P_
#define REG_R9 MISSING_P_
#define REG_R10 MISSING_P_
#define REG_R11 MISSING_P_
#define REG_R12 MISSING_P_
#define REG_R13 MISSING_P_
#define REG_R14 MISSING_P_
#define REG_R15 MISSING_P_
|
85c1c1 | 2014-08-18 | Per Hedbor | | struct soff { int off; int type; int value; };
static struct soff SVAL(int i)
{
struct soff res;
res.off = res.type = i*sizeof(struct svalue);
res.value = res.type + 8;
return res;
}
|
799039 | 2006-04-27 | Tor Edvardsson | |
|
2fd805 | 2013-10-08 | Per Hedbor | | enum amd64_reg {P_REG_RAX = 0, P_REG_RBX = 3, P_REG_RCX = 1, P_REG_RDX = 2,
P_REG_RSP = 4, P_REG_RBP = 5, P_REG_RSI = 6, P_REG_RDI = 7,
P_REG_R8 = 8, P_REG_R9 = 9, P_REG_R10 = 10, P_REG_R11 = 11,
P_REG_R12 = 12, P_REG_R13 = 13, P_REG_R14 = 14, P_REG_R15 = 15,
P_REG_INVALID = -1,
P_REG_XMM0 = 0, P_REG_XMM1 = 1, P_REG_XMM2 = 2, P_REG_XMM3 = 3,
P_REG_XMM4 = 4, P_REG_XMM5 = 5, P_REG_XMM6 = 6, P_REG_XMM7 = 7,
P_REG_XMM8 = 8, P_REG_XMM9 = 9, P_REG_XMM10=10, P_REG_XMM11=11,
P_REG_XMM12=12, P_REG_XMM13=13, P_REG_XMM14=14, P_REG_XMM15=15,
|
622ebc | 2012-06-25 | Per Hedbor | | };
|
799039 | 2006-04-27 | Tor Edvardsson | |
|
2fd805 | 2013-10-08 | Per Hedbor | | #define PIKE_MARK_SP_REG P_REG_R12
#define PIKE_SP_REG P_REG_R13
#define PIKE_FP_REG P_REG_R14
#define Pike_interpreter_reg P_REG_R15
|
d1fa80 | 2011-05-09 | Henrik Grubbström (Grubba) | |
#ifdef __NT__
|
2fd805 | 2013-10-08 | Per Hedbor | | #define ARG1_REG P_REG_RCX
#define ARG2_REG P_REG_RDX
#define ARG3_REG P_REG_R8
#define ARG4_REG P_REG_R9
|
d1fa80 | 2011-05-09 | Henrik Grubbström (Grubba) | | #else
|
2fd805 | 2013-10-08 | Per Hedbor | | #define ARG1_REG P_REG_RDI
#define ARG2_REG P_REG_RSI
#define ARG3_REG P_REG_RDX
#define ARG4_REG P_REG_RCX
#define ARG5_REG P_REG_R8
#define ARG6_REG P_REG_R9
|
d1fa80 | 2011-05-09 | Henrik Grubbström (Grubba) | | #endif
|
799039 | 2006-04-27 | Tor Edvardsson | |
|
c33ce9 | 2012-06-28 | Per Hedbor | | static enum amd64_reg sp_reg = -1, fp_reg = -1, mark_sp_reg = -1;
static int dirty_regs = 0, ret_for_func = 0;
ptrdiff_t amd64_prev_stored_pc = -1;
|
638a2c | 2012-07-16 | Per Hedbor | | static int branch_check_threads_update_etc = 0;
static int store_pc = 0;
|
719c3a | 2012-06-12 | Per Hedbor | |
|
15e8a0 | 2012-06-13 | Henrik Grubbström (Grubba) | | #define MAX_LABEL_USES 6
|
719c3a | 2012-06-12 | Per Hedbor | | struct label {
int n_label_uses;
|
15e8a0 | 2012-06-13 | Henrik Grubbström (Grubba) | | ptrdiff_t addr;
|
719c3a | 2012-06-12 | Per Hedbor | | ptrdiff_t offset[MAX_LABEL_USES];
};
static void label( struct label *l )
{
int i;
|
15e8a0 | 2012-06-13 | Henrik Grubbström (Grubba) | | if (l->addr >= 0) Pike_fatal("Label reused.\n");
|
719c3a | 2012-06-12 | Per Hedbor | | for( i=0; i<l->n_label_uses; i++ )
{
int dist = PIKE_PC - (l->offset[i] + 1);
if( dist > 0x7f || dist < -0x80 )
|
888603 | 2012-06-25 | Per Hedbor | | Pike_fatal("Branch %d too far\n", dist);
|
719c3a | 2012-06-12 | Per Hedbor | | Pike_compiler->new_program->program[l->offset[i]] = dist;
}
l->n_label_uses = 0;
|
15e8a0 | 2012-06-13 | Henrik Grubbström (Grubba) | | l->addr = PIKE_PC;
|
719c3a | 2012-06-12 | Per Hedbor | | }
|
99c1e9 | 2012-06-20 | Per Hedbor | | static void ib( char x )
{
add_to_program( x );
}
static void iw( short x )
{
add_to_program( x );
|
620a4f | 2016-07-28 | Arne Goedeke | | add_to_program( x>>8 );
|
99c1e9 | 2012-06-20 | Per Hedbor | | }
static void id( int x )
{
add_to_program( (x)&0xff );
add_to_program( (x>>8)&0xff );
add_to_program( (x>>16)&0xff );
add_to_program( (x>>24)&0xff );
}
#define opcode(X) ib(X)
|
719c3a | 2012-06-12 | Per Hedbor | | static void modrm( int mod, int r, int m )
{
|
681070 | 2012-06-21 | Henrik Grubbström (Grubba) | | if (r < 0) Pike_fatal("Using an invalid register(1)!\n");
if (m < 0) Pike_fatal("Using an invalid register(2)!\n");
|
99c1e9 | 2012-06-20 | Per Hedbor | | ib( ((mod<<6) | ((r&0x7)<<3) | (m&0x7)) );
|
719c3a | 2012-06-12 | Per Hedbor | | }
static void sib( int scale, int index, enum amd64_reg base )
{
|
99c1e9 | 2012-06-20 | Per Hedbor | | ib( (scale<<6) | ((index&0x7)<<3) | (base&0x7) );
}
static void modrm_sib( int mod, int r, int m )
{
modrm( mod, r, m );
|
2fd805 | 2013-10-08 | Per Hedbor | | if( (m&7) == P_REG_RSP)
sib(0, P_REG_RSP, P_REG_RSP );
|
719c3a | 2012-06-12 | Per Hedbor | | }
static void rex( int w, enum amd64_reg r, int x, enum amd64_reg b )
{
unsigned char res = 1<<6;
if( w ) res |= 1<<3;
if( r > 0x7 ) res |= 1<<2;
if( x ) res |= 1<<1;
if( b > 0x7 ) res |= 1<<0;
if( res != (1<<6) )
add_to_program( res );
}
|
99c1e9 | 2012-06-20 | Per Hedbor | | static void offset_modrm_sib( int offset, int r, int m )
|
719c3a | 2012-06-12 | Per Hedbor | | {
|
99c1e9 | 2012-06-20 | Per Hedbor | |
if( offset < -128 || offset > 127 )
{
modrm_sib( 2, r, m );
id( offset );
}
|
2fd805 | 2013-10-08 | Per Hedbor | | else if( offset || (m&7) == P_REG_RSP || (m&7) == P_REG_RBP )
|
99c1e9 | 2012-06-20 | Per Hedbor | | {
modrm_sib( 1, r, m );
ib( offset );
}
else
{
modrm_sib( 0, r, m );
}
|
719c3a | 2012-06-12 | Per Hedbor | | }
static void ret()
{
opcode(0xc3);
}
static void push(enum amd64_reg reg )
{
|
681070 | 2012-06-21 | Henrik Grubbström (Grubba) | | if (reg < 0) Pike_fatal("Pushing invalid register.\n");
|
719c3a | 2012-06-12 | Per Hedbor | | if (reg & 0x08) add_to_program(0x41);
add_to_program(0x50 + (reg & 0x07));
}
static void pop(enum amd64_reg reg )
{
|
681070 | 2012-06-21 | Henrik Grubbström (Grubba) | | if (reg < 0) Pike_fatal("Popping invalid register.\n");
|
719c3a | 2012-06-12 | Per Hedbor | | if (reg & 0x08) add_to_program(0x41);
add_to_program(0x58 + (reg & 0x07));
}
static void mov_reg_reg(enum amd64_reg from_reg, enum amd64_reg to_reg )
{
rex( 1, from_reg, 0, to_reg );
opcode( 0x89 );
modrm( 3, from_reg, to_reg );
}
|
85c1c1 | 2014-08-18 | Per Hedbor | | static void mov_reg32_reg(enum amd64_reg from_reg, enum amd64_reg to_reg )
{
rex( 0, from_reg, 0, to_reg );
opcode( 0x89 );
modrm( 3, from_reg, to_reg );
}
|
799039 | 2006-04-27 | Tor Edvardsson | | #define PUSH_INT(X) ins_int((INT32)(X), (void (*)(char))add_to_program)
|
6785ae | 2012-06-15 | Per Hedbor | | static void low_mov_mem_reg(enum amd64_reg from_reg, ptrdiff_t offset,
enum amd64_reg to_reg)
|
719c3a | 2012-06-12 | Per Hedbor | | {
opcode( 0x8b );
|
99c1e9 | 2012-06-20 | Per Hedbor | | offset_modrm_sib(offset, to_reg, from_reg );
|
719c3a | 2012-06-12 | Per Hedbor | | }
static void mov_mem_reg( enum amd64_reg from_reg, ptrdiff_t offset, enum amd64_reg to_reg )
{
rex( 1, to_reg, 0, from_reg );
low_mov_mem_reg( from_reg, offset, to_reg );
}
|
99c1e9 | 2012-06-20 | Per Hedbor | | static void xor_reg_reg( enum amd64_reg reg1, enum amd64_reg reg2 )
|
719c3a | 2012-06-12 | Per Hedbor | | {
|
99c1e9 | 2012-06-20 | Per Hedbor | | rex(1,reg1,0,reg2);
opcode( 0x31 );
modrm(3,reg1,reg2);
|
719c3a | 2012-06-12 | Per Hedbor | | }
|
ad0d7e | 2014-08-28 | Per Hedbor | | 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);
}
|
156ab0 | 2014-08-31 | Per Hedbor | | static void or_reg_imm( enum amd64_reg reg, INT_TYPE imm32 )
{
rex( 1, 0, 0, reg );
if( imm32 < -0x80 || imm32 > 0x7f )
{
if( reg == P_REG_RAX )
{
opcode( 0xd );
id( imm32 );
}
else
{
opcode( 0x81 );
modrm( 3, 1, reg);
id( imm32 );
}
}
else
{
add_to_program(0x83);
modrm( 3, 1, reg );
ib( imm32 );
}
}
static void and_reg_imm( enum amd64_reg reg, INT_TYPE imm32 )
|
719c3a | 2012-06-12 | Per Hedbor | | {
rex( 1, 0, 0, reg );
if( imm32 < -0x80 || imm32 > 0x7f )
{
|
2fd805 | 2013-10-08 | Per Hedbor | | if( reg == P_REG_RAX )
|
719c3a | 2012-06-12 | Per Hedbor | | {
|
1c1a24 | 2012-06-13 | Henrik Grubbström (Grubba) | | opcode( 0x25 );
|
719c3a | 2012-06-12 | Per Hedbor | | id( imm32 );
}
else
{
|
1c1a24 | 2012-06-13 | Henrik Grubbström (Grubba) | | opcode( 0x81 );
|
719c3a | 2012-06-12 | Per Hedbor | | modrm( 3,4, reg);
id( imm32 );
}
}
else
{
|
1c1a24 | 2012-06-13 | Henrik Grubbström (Grubba) | | add_to_program(0x83);
|
719c3a | 2012-06-12 | Per Hedbor | | modrm( 3, 4, reg );
ib( imm32 );
}
}
|
378ad0 | 2012-06-25 | Per Hedbor | | static void and_reg32_imm( enum amd64_reg reg, int imm32 )
{
rex( 0, 0, 0, reg );
if( imm32 < -0x80 || imm32 > 0x7f )
{
|
2fd805 | 2013-10-08 | Per Hedbor | | if( reg == P_REG_RAX )
|
378ad0 | 2012-06-25 | Per Hedbor | | {
opcode( 0x25 );
id( imm32 );
}
else
{
opcode( 0x81 );
modrm( 3,4, reg);
id( imm32 );
}
}
else
{
add_to_program(0x83);
modrm( 3, 4, reg );
ib( imm32 );
}
}
|
99c1e9 | 2012-06-20 | Per Hedbor | | static void mov_mem32_reg( enum amd64_reg from_reg, ptrdiff_t offset, enum amd64_reg to_reg )
{
rex( 0, to_reg, 0, from_reg );
low_mov_mem_reg( from_reg, offset, to_reg );
}
|
719c3a | 2012-06-12 | Per Hedbor | | static void mov_mem16_reg( enum amd64_reg from_reg, ptrdiff_t offset, enum amd64_reg to_reg )
{
|
1af093 | 2012-06-22 | Per Hedbor | | #if 0
|
719c3a | 2012-06-12 | Per Hedbor | | mov_mem32_reg( from_reg, offset, to_reg );
|
99c1e9 | 2012-06-20 | Per Hedbor | | and_reg_imm(to_reg, 0xffff);
|
1af093 | 2012-06-22 | Per Hedbor | | #else
rex( 1,to_reg,0,from_reg );
opcode( 0xf );
opcode( 0xb7 );
offset_modrm_sib(offset, to_reg, from_reg );
#endif
}
static void mov_mem8_reg( enum amd64_reg from_reg, ptrdiff_t offset, enum amd64_reg to_reg )
{
#if 0
mov_mem32_reg( from_reg, offset, to_reg );
and_reg_imm(to_reg, 0xff);
#else
rex( 0,to_reg,0,from_reg );
opcode( 0xf );
opcode( 0xb6 );
offset_modrm_sib(offset, to_reg, from_reg );
#endif
|
719c3a | 2012-06-12 | Per Hedbor | | }
static void add_reg_imm( enum amd64_reg src, int imm32);
static void shl_reg_imm( enum amd64_reg from_reg, int shift )
{
rex( 1, from_reg, 0, 0 );
if( shift == 1 )
{
|
b233f4 | 2012-06-17 | Henrik Grubbström (Grubba) | | opcode( 0xd1 );
modrm( 3, 4, from_reg );
|
719c3a | 2012-06-12 | Per Hedbor | | }
else
{
opcode( 0xc1 );
|
b233f4 | 2012-06-17 | Henrik Grubbström (Grubba) | | modrm( 3, 4, from_reg );
|
719c3a | 2012-06-12 | Per Hedbor | | ib( shift );
}
}
|
378ad0 | 2012-06-25 | Per Hedbor | | static void shl_reg_reg( enum amd64_reg reg, enum amd64_reg sreg)
{
|
2fd805 | 2013-10-08 | Per Hedbor | | if( sreg != P_REG_RCX )
|
378ad0 | 2012-06-25 | Per Hedbor | | Pike_fatal("Not supported\n");
rex( 1, 0, 0, reg );
opcode( 0xd3 );
modrm( 3, 4, reg );
}
static void shl_reg32_reg( enum amd64_reg reg, enum amd64_reg sreg)
{
|
2fd805 | 2013-10-08 | Per Hedbor | | if( sreg != P_REG_RCX )
|
378ad0 | 2012-06-25 | Per Hedbor | | Pike_fatal("Not supported\n");
rex( 0, 0, 0, reg );
opcode( 0xd3 );
modrm( 3, 4, reg );
}
|
ad0d7e | 2014-08-28 | Per Hedbor | | 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 );
offset_modrm_sib(off, 7, reg );
}
|
156ab0 | 2014-08-31 | Per Hedbor | |
static void shr_reg_reg( enum amd64_reg reg, enum amd64_reg reg_rcx )
{
if( reg_rcx != P_REG_RCX )
Pike_fatal("Not supported\n");
rex( 1, 0, 0, reg );
opcode( 0xd3 );
modrm( 3, 7, reg );
}
|
1af093 | 2012-06-22 | Per Hedbor | | static void shr_reg_imm( enum amd64_reg from_reg, int shift )
{
rex( 1, from_reg, 0, 0 );
if( shift == 1 )
{
opcode( 0xd1 );
modrm( 3, 7, from_reg );
}
else
{
opcode( 0xc1 );
modrm( 3, 7, from_reg );
ib( shift );
}
}
|
719c3a | 2012-06-12 | Per Hedbor | | static void clear_reg( enum amd64_reg reg )
{
xor_reg_reg( reg, reg );
}
|
ca2a07 | 2014-09-02 | Martin Nilsson | | #if 0
|
6785ae | 2012-06-15 | Per Hedbor | | static void neg_reg( enum amd64_reg reg )
{
rex(1,0,0,reg);
opcode(0xf7);
modrm(3,3,reg);
}
|
ca2a07 | 2014-09-02 | Martin Nilsson | | #endif
|
6785ae | 2012-06-15 | Per Hedbor | |
|
719c3a | 2012-06-12 | Per Hedbor | | static void mov_imm_reg( long imm, enum amd64_reg reg )
{
|
13670c | 2015-05-25 | Martin Nilsson | | if( !imm )
|
3624ee | 2014-12-06 | Per Hedbor | | {
clear_reg(reg);
return;
}
|
719c3a | 2012-06-12 | Per Hedbor | | if( (imm > 0x7fffffffLL) || (imm < -0x80000000LL) )
{
rex(1,0,0,reg);
opcode(0xb8 | (reg&0x7));
id( (imm & 0xffffffffLL) );
id( ((imm >> 32)&0xffffffffLL) );
}
|
378ad0 | 2012-06-25 | Per Hedbor | | else if( imm > 0 )
{
rex(0,0,0,reg);
opcode( 0xc7 );
modrm( 3,0,reg );
id( (int)imm );
}
|
719c3a | 2012-06-12 | Per Hedbor | | else
{
rex(1,0,0,reg);
opcode( 0xc7 );
modrm( 3,0,reg );
id( (int)imm );
}
}
|
1807c0 | 2014-07-15 | Per Hedbor | |
|
622ebc | 2012-06-25 | Per Hedbor | | static void mov_mem128_reg( enum amd64_reg from_reg, int offset, enum amd64_reg to_reg )
{
if( from_reg > 7 )
Pike_fatal("Not supported\n");
rex(0,to_reg,0,from_reg);
opcode( 0x66 );
opcode( 0x0f );
opcode( 0x6f );
offset_modrm_sib( offset, to_reg, from_reg );
}
static void mov_reg_mem128( enum amd64_reg from_reg, enum amd64_reg to_reg, int offset )
{
if( from_reg > 7 )
Pike_fatal("Not supported\n");
rex(0,from_reg,0,to_reg);
opcode( 0x66 );
opcode( 0x0f );
opcode( 0x7f );
offset_modrm_sib( offset, from_reg, to_reg );
}
|
fe5ef3 | 2014-09-14 | Per Hedbor | | static void low_set_if_cond(unsigned char subop, enum amd64_reg reg)
{
rex( 0, 0, 0, reg );
opcode( 0xf );
opcode( subop );
modrm( 3, 0, reg );
}
static void set_if_lt(enum amd64_reg reg)
{
low_set_if_cond( 0x9c, reg );
}
static void set_if_lte(enum amd64_reg reg)
{
low_set_if_cond( 0x9e, reg );
}
static void set_if_gt(enum amd64_reg reg)
{
low_set_if_cond( 0x9f, reg );
}
static void set_if_gte(enum amd64_reg reg)
{
low_set_if_cond( 0x9d, reg );
}
static void set_if_eq(enum amd64_reg reg)
{
low_set_if_cond( 0x94, reg );
}
static void set_if_neq(enum amd64_reg reg)
{
low_set_if_cond( 0x95, reg );
}
#if 0
static void low_mov_if_cond_reg(unsigned char subop,
|
13670c | 2015-05-25 | Martin Nilsson | | enum amd64_reg to_reg,
|
fe5ef3 | 2014-09-14 | Per Hedbor | | enum amd64_reg from_reg )
{
rex(0, from_reg, 0, to_reg );
opcode( 0xf );
opcode( subop );
modrm_sib( 3, from_reg, to_reg );
}
static void mov_if_lte_reg( enum amd64_reg from_reg, enum amd64_reg to_reg )
{
low_mov_if_cond_reg( 0x4e, from_reg, to_reg);
}
static void mov_if_gte_reg( enum amd64_reg from_reg, enum amd64_reg to_reg )
{
low_mov_if_cond_reg( 0x4d, from_reg, to_reg );
}
static void mov_if_lt_reg( enum amd64_reg from_reg, enum amd64_reg to_reg )
{
low_mov_if_cond_reg( 0x4c, from_reg, to_reg );
}
static void mov_if_gt_reg( enum amd64_reg from_reg, enum amd64_reg to_reg )
{
low_mov_if_cond_reg( 0x4f, from_reg, to_reg );
}
static void mov_if_neq_reg( enum amd64_reg from_reg, enum amd64_reg to_reg )
{
low_mov_if_cond_reg( 0x45, from_reg, to_reg );
}
static void mov_if_eq_reg( enum amd64_reg from_reg, enum amd64_reg to_reg )
{
low_mov_if_cond_reg( 0x44, from_reg, to_reg );
}
#endif
|
99c1e9 | 2012-06-20 | Per Hedbor | | static void low_mov_reg_mem(enum amd64_reg from_reg, enum amd64_reg to_reg, ptrdiff_t offset )
{
opcode( 0x89 );
offset_modrm_sib( offset, from_reg, to_reg );
}
|
719c3a | 2012-06-12 | Per Hedbor | | static void mov_reg_mem( enum amd64_reg from_reg, enum amd64_reg to_reg, ptrdiff_t offset )
{
rex(1, from_reg, 0, to_reg );
|
99c1e9 | 2012-06-20 | Per Hedbor | | low_mov_reg_mem( from_reg, to_reg, offset );
}
|
719c3a | 2012-06-12 | Per Hedbor | |
|
99c1e9 | 2012-06-20 | Per Hedbor | | static void mov_reg_mem32( enum amd64_reg from_reg, enum amd64_reg to_reg, ptrdiff_t offset )
{
rex(0, from_reg, 0, to_reg );
low_mov_reg_mem( from_reg, to_reg, offset );
}
|
2f46bb | 2014-03-15 | Martin Nilsson | | #if 0
|
99c1e9 | 2012-06-20 | Per Hedbor | | static void mov_reg_mem16( enum amd64_reg from_reg, enum amd64_reg to_reg, ptrdiff_t offset )
{
opcode( 0x66 );
rex(0, from_reg, 0, to_reg );
low_mov_reg_mem( from_reg, to_reg, offset );
|
719c3a | 2012-06-12 | Per Hedbor | | }
|
bca80a | 2016-07-18 | Arne Goedeke | | #endif
|
4b3e02 | 2016-06-13 | Per Hedbor | |
|
e523af | 2018-04-02 | Henrik Grubbström (Grubba) | | static void PIKE_UNUSED_ATTRIBUTE mov_imm_mem16( short imm, enum amd64_reg to_reg,
ptrdiff_t offset )
|
4b3e02 | 2016-06-13 | Per Hedbor | | {
opcode( 0x66 );
rex( 0, 0, 0, to_reg );
opcode( 0xc7 );
offset_modrm_sib( offset, 0, to_reg );
iw( imm );
}
|
719c3a | 2012-06-12 | Per Hedbor | |
|
99c1e9 | 2012-06-20 | Per Hedbor | |
|
719c3a | 2012-06-12 | Per Hedbor | | static void mov_imm_mem( long imm, enum amd64_reg to_reg, ptrdiff_t offset )
{
if( imm >= -0x80000000LL && imm <= 0x7fffffffLL )
{
rex( 1, 0, 0, to_reg );
opcode( 0xc7 );
|
99c1e9 | 2012-06-20 | Per Hedbor | | offset_modrm_sib( offset, 0, to_reg );
|
719c3a | 2012-06-12 | Per Hedbor | | id( imm );
}
else
{
|
2fd805 | 2013-10-08 | Per Hedbor | | if( to_reg == P_REG_RAX )
Pike_fatal( "Clobbered TMP P_REG_RAX reg\n");
mov_imm_reg( imm, P_REG_RAX );
mov_reg_mem( P_REG_RAX, to_reg, offset );
|
719c3a | 2012-06-12 | Per Hedbor | | }
}
static void mov_imm_mem32( int imm, enum amd64_reg to_reg, ptrdiff_t offset )
{
rex( 0, 0, 0, to_reg );
opcode( 0xc7 );
|
99c1e9 | 2012-06-20 | Per Hedbor | | offset_modrm_sib( offset, 0, to_reg );
|
719c3a | 2012-06-12 | Per Hedbor | | id( imm );
}
|
99c1e9 | 2012-06-20 | Per Hedbor | | static void sub_reg_imm( enum amd64_reg reg, int imm32 );
|
156ab0 | 2014-08-31 | Per Hedbor | | static void neg_mem( enum amd64_reg reg, int off )
{
rex( 1, 0, 0, reg );
opcode(0xf7);
offset_modrm_sib( off, 3, reg );
}
|
36fea0 | 2014-08-31 | Per Hedbor | | static void not_mem( enum amd64_reg reg, int off )
{
rex( 1, 0, 0, reg );
opcode(0xf7);
offset_modrm_sib( off, 2, reg );
}
|
719c3a | 2012-06-12 | Per Hedbor | | static void add_reg_imm( enum amd64_reg reg, int imm32 )
{
if( !imm32 ) return;
|
99c1e9 | 2012-06-20 | Per Hedbor | | if( imm32 < 0 )
{
sub_reg_imm( reg, -imm32 );
return;
}
|
719c3a | 2012-06-12 | Per Hedbor | |
rex( 1, 0, 0, reg );
if( imm32 < -0x80 || imm32 > 0x7f )
{
|
2fd805 | 2013-10-08 | Per Hedbor | | if( reg == P_REG_RAX )
|
719c3a | 2012-06-12 | Per Hedbor | | {
|
1c1a24 | 2012-06-13 | Henrik Grubbström (Grubba) | | opcode( 0x05 );
|
719c3a | 2012-06-12 | Per Hedbor | | id( imm32 );
}
else
{
|
1c1a24 | 2012-06-13 | Henrik Grubbström (Grubba) | | opcode( 0x81 );
|
719c3a | 2012-06-12 | Per Hedbor | | modrm( 3, 0, reg);
id( imm32 );
}
}
else
{
|
1c1a24 | 2012-06-13 | Henrik Grubbström (Grubba) | | add_to_program(0x83);
|
719c3a | 2012-06-12 | Per Hedbor | | modrm( 3, 0, reg );
ib( imm32 );
}
}
|
99c1e9 | 2012-06-20 | Per Hedbor | |
static void low_add_mem_imm(int w, enum amd64_reg reg, int offset, int imm32 )
|
719c3a | 2012-06-12 | Per Hedbor | | {
int r2 = imm32 == -1 ? 1 : 0;
int large = 0;
if( !imm32 ) return;
|
99c1e9 | 2012-06-20 | Per Hedbor | | rex( w, 0, 0, reg );
|
719c3a | 2012-06-12 | Per Hedbor | |
if( r2 ) imm32 = -imm32;
if( imm32 == 1 )
|
1c1a24 | 2012-06-13 | Henrik Grubbström (Grubba) | | opcode( 0xff );
|
719c3a | 2012-06-12 | Per Hedbor | | else if( imm32 >= -128 && imm32 < 128 )
|
1c1a24 | 2012-06-13 | Henrik Grubbström (Grubba) | | opcode( 0x83 );
|
719c3a | 2012-06-12 | Per Hedbor | | else
{
|
1c1a24 | 2012-06-13 | Henrik Grubbström (Grubba) | | opcode( 0x81 );
|
719c3a | 2012-06-12 | Per Hedbor | | large = 1;
}
|
99c1e9 | 2012-06-20 | Per Hedbor | | offset_modrm_sib( offset, r2, reg );
|
719c3a | 2012-06-12 | Per Hedbor | | if( imm32 != 1 )
{
if( large )
id( imm32 );
else
ib( imm32 );
}
}
|
99c1e9 | 2012-06-20 | Per Hedbor | | static void add_mem32_imm( enum amd64_reg reg, int offset, int imm32 )
|
719c3a | 2012-06-12 | Per Hedbor | | {
|
99c1e9 | 2012-06-20 | Per Hedbor | | low_add_mem_imm( 0, reg, offset, imm32 );
|
6785ae | 2012-06-15 | Per Hedbor | | }
|
99c1e9 | 2012-06-20 | Per Hedbor | | static void add_mem_imm( enum amd64_reg reg, int offset, int imm32 )
|
6785ae | 2012-06-15 | Per Hedbor | | {
|
99c1e9 | 2012-06-20 | Per Hedbor | | low_add_mem_imm( 1, reg, offset, imm32 );
|
6785ae | 2012-06-15 | Per Hedbor | | }
|
10d27a | 2014-08-08 | Per Hedbor | | #ifndef USE_VALGRIND
|
6d62b6 | 2014-07-15 | Per Hedbor | | static void add_mem8_imm( enum amd64_reg reg, int offset, int imm32 )
{
int r2 = imm32 == -1 ? 1 : 0;
if( !imm32 ) return;
rex( 0, 0, 0, reg );
if( imm32 == 1 || imm32 == -1 )
opcode( 0xfe );
else if( imm32 >= -128 && imm32 < 128 )
opcode( 0x80 );
else
Pike_fatal("Not sensible");
offset_modrm_sib( offset, r2, reg );
if( imm32 != 1 && !r2 )
{
ib( imm32 );
}
}
|
10d27a | 2014-08-08 | Per Hedbor | | #endif
|
719c3a | 2012-06-12 | Per Hedbor | |
static void sub_reg_imm( enum amd64_reg reg, int imm32 )
{
if( !imm32 ) return;
|
99c1e9 | 2012-06-20 | Per Hedbor | | if( imm32 < 0 )
return add_reg_imm( reg, -imm32 );
|
719c3a | 2012-06-12 | Per Hedbor | | rex( 1, 0, 0, reg );
if( imm32 < -0x80 || imm32 > 0x7f )
{
|
2fd805 | 2013-10-08 | Per Hedbor | | if( reg == P_REG_RAX )
|
719c3a | 2012-06-12 | Per Hedbor | | {
|
1c1a24 | 2012-06-13 | Henrik Grubbström (Grubba) | | opcode( 0x2d );
|
719c3a | 2012-06-12 | Per Hedbor | | id( imm32 );
}
else
{
|
1c1a24 | 2012-06-13 | Henrik Grubbström (Grubba) | | opcode( 0x81 );
|
719c3a | 2012-06-12 | Per Hedbor | | modrm( 3, 5, reg);
id( imm32 );
}
}
else
{
|
1c1a24 | 2012-06-13 | Henrik Grubbström (Grubba) | | opcode(0x83);
|
719c3a | 2012-06-12 | Per Hedbor | | modrm( 3, 5, reg );
ib( imm32 );
}
}
static void test_reg_reg( enum amd64_reg reg1, enum amd64_reg reg2 )
{
rex(1,reg1,0,reg2);
opcode(0x85);
modrm(3, reg1, reg2 );
}
|
b40c77 | 2014-08-18 | Per Hedbor | | static void test_reg32_reg( enum amd64_reg reg1, enum amd64_reg reg2 )
{
rex(0,reg1,0,reg2);
opcode(0x85);
modrm(3, reg1, reg2 );
}
|
719c3a | 2012-06-12 | Per Hedbor | | static void test_reg( enum amd64_reg reg1 )
{
test_reg_reg( reg1, reg1 );
}
|
b40c77 | 2014-08-18 | Per Hedbor | | static void test_reg32( enum amd64_reg reg1 )
{
test_reg32_reg( reg1, reg1 );
}
|
719c3a | 2012-06-12 | Per Hedbor | | static void cmp_reg_imm( enum amd64_reg reg, int imm32 )
{
|
0dcd65 | 2014-08-18 | Per Hedbor | | if(!imm32)
{
test_reg( reg );
return;
}
|
719c3a | 2012-06-12 | Per Hedbor | | rex(1, 0, 0, reg);
if( imm32 > 0x7f || imm32 < -0x80 )
{
|
2fd805 | 2013-10-08 | Per Hedbor | | if( reg == P_REG_RAX )
|
719c3a | 2012-06-12 | Per Hedbor | | {
opcode( 0x3d );
id( imm32 );
}
else
{
opcode( 0x81 );
modrm(3,7,reg);
id( imm32 );
}
}
else
{
opcode( 0x83 );
modrm( 3,7,reg);
ib( imm32 );
}
}
|
4ceb79 | 2012-06-22 | Per Hedbor | | static void cmp_reg32_imm( enum amd64_reg reg, int imm32 )
{
|
0dcd65 | 2014-08-18 | Per Hedbor | | if(!imm32)
{
|
156ab0 | 2014-08-31 | Per Hedbor | | test_reg32( reg );
|
0dcd65 | 2014-08-18 | Per Hedbor | | return;
}
|
4ceb79 | 2012-06-22 | Per Hedbor | | rex(0, 0, 0, reg);
if( imm32 > 0x7f || imm32 < -0x80 )
{
|
2fd805 | 2013-10-08 | Per Hedbor | | if( reg == P_REG_RAX )
|
4ceb79 | 2012-06-22 | Per Hedbor | | {
opcode( 0x3d );
id( imm32 );
}
else
{
opcode( 0x81 );
modrm(3,7,reg);
id( imm32 );
}
}
else
{
opcode( 0x83 );
modrm( 3,7,reg);
ib( imm32 );
}
}
|
719c3a | 2012-06-12 | Per Hedbor | | static void cmp_reg_reg( enum amd64_reg reg1, enum amd64_reg reg2 )
{
|
996c48 | 2013-06-19 | Henrik Grubbström (Grubba) | | rex(1, reg2, 0, reg1);
|
719c3a | 2012-06-12 | Per Hedbor | | opcode( 0x39 );
|
996c48 | 2013-06-19 | Henrik Grubbström (Grubba) | | modrm( 3, reg2, reg1 );
|
719c3a | 2012-06-12 | Per Hedbor | | }
|
11619b | 2012-07-18 | Henrik Grubbström (Grubba) | | static int jmp_rel_imm32( int addr )
|
719c3a | 2012-06-12 | Per Hedbor | | {
|
11619b | 2012-07-18 | Henrik Grubbström (Grubba) | | int rel = addr - (PIKE_PC + 5);
|
719c3a | 2012-06-12 | Per Hedbor | | int res;
opcode( 0xe9 );
res = PIKE_PC;
id( rel );
return res;
}
|
11619b | 2012-07-18 | Henrik Grubbström (Grubba) | | static void jmp_rel_imm( int addr )
|
719c3a | 2012-06-12 | Per Hedbor | | {
|
11619b | 2012-07-18 | Henrik Grubbström (Grubba) | | int rel = addr - (PIKE_PC + 2);
|
719c3a | 2012-06-12 | Per Hedbor | | if(rel >= -0x80 && rel <= 0x7f )
{
opcode( 0xeb );
ib( rel );
return;
}
|
11619b | 2012-07-18 | Henrik Grubbström (Grubba) | | jmp_rel_imm32( addr );
|
719c3a | 2012-06-12 | Per Hedbor | | }
|
11619b | 2012-07-18 | Henrik Grubbström (Grubba) | | static void call_rel_imm32( int addr )
|
6785ae | 2012-06-15 | Per Hedbor | | {
|
11619b | 2012-07-18 | Henrik Grubbström (Grubba) | | int rel = addr - (PIKE_PC + 5);
|
6785ae | 2012-06-15 | Per Hedbor | | opcode( 0xe8 );
id( rel );
|
84c5f6 | 2012-06-28 | Per Hedbor | | sp_reg = -1;
|
6785ae | 2012-06-15 | Per Hedbor | | return;
}
|
719c3a | 2012-06-12 | Per Hedbor | | static void jmp_reg( enum amd64_reg reg )
{
rex(0,reg,0,0);
opcode( 0xff );
modrm( 3, 4, reg );
}
static void call_reg( enum amd64_reg reg )
{
rex(0,reg,0,0);
opcode( 0xff );
modrm( 3, 2, reg );
}
static void call_imm( void *ptr )
{
size_t addr = (size_t)ptr;
if( (addr & ~0x7fffffffLL) && !(addr & ~0x3fffffff8LL) )
{
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_imm_reg( addr>>3, P_REG_RAX);
shl_reg_imm( P_REG_RAX, 3 );
|
719c3a | 2012-06-12 | Per Hedbor | | }
else
{
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_imm_reg(addr, P_REG_RAX );
|
719c3a | 2012-06-12 | Per Hedbor | | }
|
2fd805 | 2013-10-08 | Per Hedbor | | call_reg( P_REG_RAX );
|
719c3a | 2012-06-12 | Per Hedbor | | }
|
6785ae | 2012-06-15 | Per Hedbor | |
static void add_reg_reg( enum amd64_reg reg, enum amd64_reg reg2 )
{
rex(1,reg2,0,reg);
opcode( 0x1 );
modrm( 3, reg2, reg );
}
|
51f370 | 2015-08-06 | Per Hedbor | |
static void mul_rax_reg_reg128( enum amd64_reg reg )
|
2e82fb | 2014-08-31 | Per Hedbor | | {
|
13670c | 2015-05-25 | Martin Nilsson | | |
2e82fb | 2014-08-31 | Per Hedbor | | This would actually not need an overflow check.
instead, push high if not zero, push low, genreate gmp.
but... Well.
*/
|
51f370 | 2015-08-06 | Per Hedbor | | rex(1,0,0,reg);
opcode( 0xf7 );
modrm( 3,5,reg );
}
static void mul_reg_reg( enum amd64_reg reg, enum amd64_reg reg2 )
{
rex(1,reg,0,reg2);
opcode( 0xf );
opcode( 0xaf );
modrm( 3, reg, reg2 );
|
2e82fb | 2014-08-31 | Per Hedbor | | }
|
5d4e63 | 2014-08-31 | Per Hedbor | |
static void div_reg_reg( enum amd64_reg reg, enum amd64_reg reg2 )
{
if( reg != P_REG_RAX ) Pike_error("Not supported, reg1 must be RAX\n");
if( reg2 == P_REG_RDX ) Pike_error("Clobbers RAX+RDX\n");
rex(1,0,0,0);
|
13670c | 2015-05-25 | Martin Nilsson | | opcode(0x99);
|
5d4e63 | 2014-08-31 | Per Hedbor | | *cqo:
*sign extend 64bit rax -> 128bit in rdx:rax
*/
rex(1,0,0,reg2);
opcode( 0xf7 );
modrm( 3, 7, reg2 );
|
13670c | 2015-05-25 | Martin Nilsson | | |
5d4e63 | 2014-08-31 | Per Hedbor | | dx = dx:ax % reg2
*/
}
|
ad0d7e | 2014-08-28 | Per Hedbor | |
static void add_reg32_reg32( enum amd64_reg reg, enum amd64_reg reg2 )
{
rex(0,reg2,0,reg);
opcode( 0x1 );
modrm( 3, reg2, reg );
}
|
6785ae | 2012-06-15 | Per Hedbor | |
static void sub_reg_reg( enum amd64_reg reg, enum amd64_reg reg2 )
{
rex(1,reg2,0,reg);
opcode( 0x29 );
modrm( 3, reg2, reg );
}
static void add_reg_mem( enum amd64_reg dst, enum amd64_reg src, long off )
{
rex(1,dst,0,src);
opcode( 0x3 );
|
99c1e9 | 2012-06-20 | Per Hedbor | | offset_modrm_sib( off, dst, src );
|
6785ae | 2012-06-15 | Per Hedbor | | }
static void sub_reg_mem( enum amd64_reg dst, enum amd64_reg src, long off )
{
rex(1,dst,0,src);
opcode( 0x2b );
|
99c1e9 | 2012-06-20 | Per Hedbor | | offset_modrm_sib( off, dst, src );
|
6785ae | 2012-06-15 | Per Hedbor | | }
|
719c3a | 2012-06-12 | Per Hedbor | |
static void add_reg_imm_reg( enum amd64_reg src, long imm32, enum amd64_reg dst )
{
if( imm32 > 0x7fffffffLL ||
imm32 <-0x80000000LL)
Pike_fatal("LEA [reg+imm] > 32bit Not supported\n");
if( src == dst )
{
if( !imm32 ) return;
add_reg_imm( src, imm32 );
}
else
{
if( !imm32 )
{
mov_reg_reg( src, dst );
return;
}
rex(1,dst,0,src);
opcode( 0x8d );
|
99c1e9 | 2012-06-20 | Per Hedbor | | offset_modrm_sib( imm32, dst, src );
|
719c3a | 2012-06-12 | Per Hedbor | | }
}
static void mov_rip_imm_reg( int imm, enum amd64_reg reg )
{
|
1c1a24 | 2012-06-13 | Henrik Grubbström (Grubba) | | imm -= 7;
|
719c3a | 2012-06-12 | Per Hedbor | |
rex( 1, reg, 0, 0 );
|
1c1a24 | 2012-06-13 | Henrik Grubbström (Grubba) | | opcode( 0x8d );
|
719c3a | 2012-06-12 | Per Hedbor | | modrm( 0, reg, 5 );
id( imm );
}
static void add_imm_mem( int imm32, enum amd64_reg reg, int offset )
{
int r2 = (imm32 == -1) ? 1 : 0;
int large = 0;
rex( 1, 0, 0, reg );
if( imm32 == 1 || imm32 == -1 )
|
1c1a24 | 2012-06-13 | Henrik Grubbström (Grubba) | | opcode( 0xff );
|
719c3a | 2012-06-12 | Per Hedbor | | else if( -128 <= imm32 && 128 > imm32 )
|
1c1a24 | 2012-06-13 | Henrik Grubbström (Grubba) | | opcode( 0x83 );
|
719c3a | 2012-06-12 | Per Hedbor | | else
{
|
1c1a24 | 2012-06-13 | Henrik Grubbström (Grubba) | | opcode( 0x81 );
|
719c3a | 2012-06-12 | Per Hedbor | | large = 1;
}
|
99c1e9 | 2012-06-20 | Per Hedbor | | offset_modrm_sib( offset, r2, reg );
|
719c3a | 2012-06-12 | Per Hedbor | |
if( imm32 != 1 && !r2 )
{
if( large )
id( imm32 );
else
ib( imm32 );
}
}
static void jump_rel8( struct label *res, unsigned char op )
{
opcode( op );
|
799039 | 2006-04-27 | Tor Edvardsson | |
|
15e8a0 | 2012-06-13 | Henrik Grubbström (Grubba) | | if (res->addr >= 0) {
ib(res->addr - (PIKE_PC+1));
return;
}
|
719c3a | 2012-06-12 | Per Hedbor | | if( res->n_label_uses >= MAX_LABEL_USES )
Pike_fatal( "Label used too many times\n" );
res->offset[res->n_label_uses] = PIKE_PC;
res->n_label_uses++;
ib(0);
}
static int jnz_imm_rel32( int rel )
{
int res;
opcode( 0xf );
opcode( 0x85 );
res = PIKE_PC;
id( rel );
return res;
}
static int jz_imm_rel32( int rel )
{
int res;
opcode( 0xf );
opcode( 0x84 );
res = PIKE_PC;
id( rel );
return res;
}
#define jne(X) jnz(X)
#define je(X) jz(X)
static void jmp( struct label *l ) { return jump_rel8( l, 0xeb ); }
static void jo( struct label *l ) { return jump_rel8( l, 0x70 ); }
|
6785ae | 2012-06-15 | Per Hedbor | | static void jno( struct label *l ) { return jump_rel8( l, 0x71 ); }
static void jz( struct label *l ) { return jump_rel8( l, 0x74 ); }
static void jnz( struct label *l ) { return jump_rel8( l, 0x75 ); }
|
888603 | 2012-06-25 | Per Hedbor | | static void js( struct label *l ) { return jump_rel8( l, 0x78 ); }
static void jl( struct label *l ) { return jump_rel8( l, 0x7c ); }
static void jge( struct label *l ) { return jump_rel8( l, 0x7d ); }
static void jle( struct label *l ) { return jump_rel8( l, 0x7e ); }
|
2ce89e | 2014-08-31 | Per Hedbor | | #if 0
|
fe5ef3 | 2014-09-14 | Per Hedbor | | static void jc( struct label *l ) { return jump_rel8( l, 0x72 ); }
static void jnc( struct label *l ) { return jump_rel8( l, 0x73 ); }
|
ca2a07 | 2014-09-02 | Martin Nilsson | | static void jg( struct label *l ) { return jump_rel8( l, 0x7f ); }
|
2f46bb | 2014-03-15 | Martin Nilsson | | #endif
|
719c3a | 2012-06-12 | Per Hedbor | |
|
378ad0 | 2012-06-25 | Per Hedbor | | #define LABELS() struct label label_A, label_B, label_C, label_D, label_E;label_A.addr = -1;label_A.n_label_uses = 0;label_B.addr = -1;label_B.n_label_uses = 0;label_C.addr = -1;label_C.n_label_uses = 0;label_D.addr = -1;label_D.n_label_uses = 0;label_E.addr=-1;label_E.n_label_uses=0;
|
719c3a | 2012-06-12 | Per Hedbor | | #define LABEL_A label(&label_A)
#define LABEL_B label(&label_B)
#define LABEL_C label(&label_C)
|
6785ae | 2012-06-15 | Per Hedbor | | #define LABEL_D label(&label_D)
|
378ad0 | 2012-06-25 | Per Hedbor | | #define LABEL_E label(&label_E)
|
d1fa80 | 2011-05-09 | Henrik Grubbström (Grubba) | |
|
638a2c | 2012-07-16 | Per Hedbor | | static void amd64_ins_branch_check_threads_etc(int code_only);
static int func_start = 0;
void amd64_start_function(int store_lines )
{
store_pc = store_lines;
branch_check_threads_update_etc = 0;
if( store_lines )
amd64_ins_branch_check_threads_etc(1);
func_start = PIKE_PC;
}
|
74dfe8 | 2012-12-30 | Jonas Walldén | | void amd64_end_function(int UNUSED(no_pc))
|
638a2c | 2012-07-16 | Per Hedbor | | {
branch_check_threads_update_etc = 0;
}
|
2cbc49 | 2017-02-21 | Martin Karlgren | | #ifdef MACHINE_CODE_STACK_FRAMES
static void amd64_pop_internal_c_frame()
{
mov_reg_reg(P_REG_RBP, P_REG_RSP);
pop(P_REG_RBP);
add_reg_imm(P_REG_RSP, 8);
}
#endif /* MACHINE_CODE_STACK_FRAMES */
static void amd64_load_fp_reg(void);
|
2827f8 | 2017-10-09 | Martin Karlgren | | static void amd64_call_c_function(void *addr);
|
2cbc49 | 2017-02-21 | Martin Karlgren | |
void amd64_ins_start_function(void)
{
#ifdef MACHINE_CODE_STACK_FRAMES
LABELS();
amd64_load_fp_reg();
mov_mem32_reg( fp_reg, OFFSETOF(pike_frame, flags), P_REG_RAX );
and_reg32_imm( P_REG_RAX, PIKE_FRAME_RETURN_INTERNAL);
jz( &label_A );
|
2827f8 | 2017-10-09 | Martin Karlgren | | amd64_call_c_function(check_c_stack_margin);
|
2cbc49 | 2017-02-21 | Martin Karlgren | |
mov_mem_reg(fp_reg, OFFSETOF(pike_frame, next), P_REG_RAX);
mov_mem_reg(P_REG_RAX, OFFSETOF(pike_frame, return_addr), P_REG_RAX);
push(P_REG_RAX);
push(P_REG_RBP);
mov_reg_reg(P_REG_RSP, P_REG_RBP);
LABEL_A;
#endif /* MACHINE_CODE_STACK_FRAMES */
}
|
638a2c | 2012-07-16 | Per Hedbor | |
|
d1fa80 | 2011-05-09 | Henrik Grubbström (Grubba) | | |
639a93 | 2011-05-15 | Henrik Grubbström (Grubba) | | * R15: Pike_interpreter
|
d1fa80 | 2011-05-09 | Henrik Grubbström (Grubba) | | */
void amd64_ins_entry(void)
{
|
d46b1d | 2014-08-11 | Per Hedbor | | size_t orig_ppc = PIKE_PC;
|
d1fa80 | 2011-05-09 | Henrik Grubbström (Grubba) | |
|
2fd805 | 2013-10-08 | Per Hedbor | | push(P_REG_RBP);
|
587137 | 2014-08-11 | Per Hedbor | | mov_reg_reg(P_REG_RSP, P_REG_RBP);
|
2fd805 | 2013-10-08 | Per Hedbor | | push(P_REG_R15);
push(P_REG_R14);
push(P_REG_R13);
push(P_REG_R12);
push(P_REG_RBX);
sub_reg_imm(P_REG_RSP, 8);
|
719c3a | 2012-06-12 | Per Hedbor | | mov_reg_reg(ARG1_REG, Pike_interpreter_reg);
|
639a93 | 2011-05-15 | Henrik Grubbström (Grubba) | | amd64_flush_code_generator_state();
|
d46b1d | 2014-08-11 | Per Hedbor | |
if( PIKE_PC - orig_ppc != ENTRY_PROLOGUE_SIZE )
Pike_fatal("ENTRY_PROLOGUE_SIZE incorrectly set, should be 0x%x\n",
PIKE_PC-orig_ppc );
|
d1fa80 | 2011-05-09 | Henrik Grubbström (Grubba) | | }
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | void amd64_flush_code_generator_state(void)
{
|
83b92e | 2014-08-16 | Per Hedbor | | amd64_prev_stored_pc = -1;
|
638a2c | 2012-07-16 | Per Hedbor | | ret_for_func = 0;
|
83b92e | 2014-08-16 | Per Hedbor | | fp_reg = -1;
sp_reg = -1;
|
681070 | 2012-06-21 | Henrik Grubbström (Grubba) | | mark_sp_reg = -1;
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | dirty_regs = 0;
}
|
9030f6 | 2011-05-26 | Henrik Grubbström (Grubba) | | static void flush_dirty_regs(void)
{
if (dirty_regs & (1 << PIKE_SP_REG)) {
|
719c3a | 2012-06-12 | Per Hedbor | | mov_reg_mem(PIKE_SP_REG, Pike_interpreter_reg,
|
d97eb7 | 2011-07-10 | Henrik Grubbström (Grubba) | | OFFSETOF(Pike_interpreter_struct, stack_pointer));
|
9030f6 | 2011-05-26 | Henrik Grubbström (Grubba) | | dirty_regs &= ~(1 << PIKE_SP_REG);
}
if (dirty_regs & (1 << PIKE_MARK_SP_REG)) {
|
719c3a | 2012-06-12 | Per Hedbor | | mov_reg_mem(PIKE_MARK_SP_REG, Pike_interpreter_reg,
|
d97eb7 | 2011-07-10 | Henrik Grubbström (Grubba) | | OFFSETOF(Pike_interpreter_struct, mark_stack_pointer));
|
9030f6 | 2011-05-26 | Henrik Grubbström (Grubba) | | dirty_regs &= ~(1 << PIKE_MARK_SP_REG);
}
}
|
799039 | 2006-04-27 | Tor Edvardsson | |
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | |
|
28b854 | 2014-08-11 | Per Hedbor | | static void amd64_load_fp_reg(void)
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | {
|
681070 | 2012-06-21 | Henrik Grubbström (Grubba) | | if (fp_reg < 0) {
|
719c3a | 2012-06-12 | Per Hedbor | | mov_mem_reg(Pike_interpreter_reg,
|
6785ae | 2012-06-15 | Per Hedbor | | OFFSETOF(Pike_interpreter_struct, frame_pointer),
PIKE_FP_REG);
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | fp_reg = PIKE_FP_REG;
}
}
|
28b854 | 2014-08-11 | Per Hedbor | | static void amd64_load_sp_reg(void)
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | {
|
681070 | 2012-06-21 | Henrik Grubbström (Grubba) | | if (sp_reg < 0) {
|
719c3a | 2012-06-12 | Per Hedbor | | mov_mem_reg(Pike_interpreter_reg,
|
6785ae | 2012-06-15 | Per Hedbor | | OFFSETOF(Pike_interpreter_struct, stack_pointer),
PIKE_SP_REG);
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | sp_reg = PIKE_SP_REG;
}
}
|
28b854 | 2014-08-11 | Per Hedbor | | static void amd64_load_mark_sp_reg(void)
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | {
|
681070 | 2012-06-21 | Henrik Grubbström (Grubba) | | if (mark_sp_reg < 0) {
|
719c3a | 2012-06-12 | Per Hedbor | | mov_mem_reg(Pike_interpreter_reg,
|
6785ae | 2012-06-15 | Per Hedbor | | OFFSETOF(Pike_interpreter_struct, mark_stack_pointer),
PIKE_MARK_SP_REG);
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | mark_sp_reg = PIKE_MARK_SP_REG;
}
}
|
28b854 | 2014-08-11 | Per Hedbor | |
static void mov_sval_type(enum amd64_reg src, enum amd64_reg dst )
{
|
85c1c1 | 2014-08-18 | Per Hedbor | | mov_mem8_reg( src, SVAL(0).type, dst);
|
28b854 | 2014-08-11 | Per Hedbor | |
}
|
83b92e | 2014-08-16 | Per Hedbor | | #if 0
|
28b854 | 2014-08-11 | Per Hedbor | | static void svalue_is_referenced(enum amd64_reg in, struct label *not )
{
and_reg_imm(in,-8);
cmp_reg_imm(in,MIN_REF_TYPE);
jne( not );
}
static void mem_svalue_is_referenced(enum amd64_reg in, struct label *not )
{
if( in == P_REG_RAX ) Pike_error("RAX not supported here.\n");
mov_sval_type(in,P_REG_RAX);
svalue_is_referenced(P_REG_RAX, not );
}
|
83b92e | 2014-08-16 | Per Hedbor | | #endif
|
28b854 | 2014-08-11 | Per Hedbor | |
|
d1fa80 | 2011-05-09 | Henrik Grubbström (Grubba) | | static void update_arg1(INT32 value)
{
|
719c3a | 2012-06-12 | Per Hedbor | | mov_imm_reg(value, ARG1_REG);
|
d1fa80 | 2011-05-09 | Henrik Grubbström (Grubba) | |
}
|
799039 | 2006-04-27 | Tor Edvardsson | |
|
d1fa80 | 2011-05-09 | Henrik Grubbström (Grubba) | | static void update_arg2(INT32 value)
{
|
719c3a | 2012-06-12 | Per Hedbor | | mov_imm_reg(value, ARG2_REG);
|
d1fa80 | 2011-05-09 | Henrik Grubbström (Grubba) | |
|
799039 | 2006-04-27 | Tor Edvardsson | | }
|
719c3a | 2012-06-12 | Per Hedbor | | static void amd64_add_sp( int num )
{
amd64_load_sp_reg();
|
85c1c1 | 2014-08-18 | Per Hedbor | | add_reg_imm( sp_reg, num * sizeof(struct svalue));
|
719c3a | 2012-06-12 | Per Hedbor | | dirty_regs |= 1 << PIKE_SP_REG;
|
1af093 | 2012-06-22 | Per Hedbor | | flush_dirty_regs();
|
719c3a | 2012-06-12 | Per Hedbor | | }
static void amd64_add_mark_sp( int num )
{
amd64_load_mark_sp_reg();
|
85c1c1 | 2014-08-18 | Per Hedbor | | add_reg_imm( mark_sp_reg, num * sizeof(struct svalue*));
|
719c3a | 2012-06-12 | Per Hedbor | | dirty_regs |= 1 << PIKE_MARK_SP_REG;
|
1af093 | 2012-06-22 | Per Hedbor | | flush_dirty_regs();
|
719c3a | 2012-06-12 | Per Hedbor | | }
|
2fd805 | 2013-10-08 | Per Hedbor | |
|
378ad0 | 2012-06-25 | Per Hedbor | | static void amd64_push_svaluep_to(int reg, int spoff)
|
9030f6 | 2011-05-26 | Henrik Grubbström (Grubba) | | {
|
719c3a | 2012-06-12 | Per Hedbor | | LABELS();
|
2fd805 | 2013-10-08 | Per Hedbor | | if( reg == P_REG_RAX )
|
378ad0 | 2012-06-25 | Per Hedbor | | Pike_fatal("Using RAX in push_svaluep not supported\n" );
|
9030f6 | 2011-05-26 | Henrik Grubbström (Grubba) | | amd64_load_sp_reg();
|
a5cf65 | 2014-06-24 | Henrik Grubbström (Grubba) | | mov_mem_reg(reg, OFFSETOF(svalue, tu.t.type), P_REG_RAX);
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg(reg, OFFSETOF(svalue, u.refs), P_REG_RCX);
|
85c1c1 | 2014-08-18 | Per Hedbor | | mov_reg_mem(P_REG_RAX, sp_reg, SVAL(spoff).type);
mov_reg_mem(P_REG_RCX, sp_reg, SVAL(spoff).value);
|
e30594 | 2014-08-08 | Per Hedbor | | and_reg32_imm(P_REG_RAX, MIN_REF_TYPE);
jz(&label_A);
|
2fd805 | 2013-10-08 | Per Hedbor | | add_imm_mem( 1, P_REG_RCX, OFFSETOF(pike_string, refs));
|
719c3a | 2012-06-12 | Per Hedbor | | LABEL_A;
|
378ad0 | 2012-06-25 | Per Hedbor | | }
static void amd64_push_svaluep(int reg)
{
amd64_push_svaluep_to( reg, 0 );
|
719c3a | 2012-06-12 | Per Hedbor | | amd64_add_sp( 1 );
|
9030f6 | 2011-05-26 | Henrik Grubbström (Grubba) | | }
|
eb42a1 | 2011-05-11 | Henrik Grubbström (Grubba) | | static void amd64_push_int(INT64 value, int subtype)
{
amd64_load_sp_reg();
|
85c1c1 | 2014-08-18 | Per Hedbor | | mov_imm_mem((subtype<<16) + PIKE_T_INT, sp_reg, SVAL(0).type);
mov_imm_mem(value, sp_reg, SVAL(0).value);
|
719c3a | 2012-06-12 | Per Hedbor | | amd64_add_sp( 1 );
}
static void amd64_push_int_reg(enum amd64_reg reg )
{
amd64_load_sp_reg();
|
a5cf65 | 2014-06-24 | Henrik Grubbström (Grubba) | | mov_imm_mem( PIKE_T_INT, sp_reg, OFFSETOF(svalue, tu.t.type));
|
719c3a | 2012-06-12 | Per Hedbor | | mov_reg_mem( reg, sp_reg, OFFSETOF(svalue, u.integer));
amd64_add_sp( 1 );
|
eb42a1 | 2011-05-11 | Henrik Grubbström (Grubba) | | }
|
d1fa80 | 2011-05-09 | Henrik Grubbström (Grubba) | |
|
4ec32c | 2014-08-07 | Per Hedbor | | static void amd64_get_storage( enum amd64_reg reg, ptrdiff_t offset )
{
amd64_load_fp_reg();
|
2caed1 | 2016-09-05 | Arne Goedeke | | #if 1
|
587137 | 2014-08-11 | Per Hedbor | |
|
2caed1 | 2016-09-05 | Arne Goedeke | | mov_mem_reg( fp_reg, OFFSETOF(pike_frame,current_storage), reg );
|
4ec32c | 2014-08-07 | Per Hedbor | | add_reg_imm( reg, offset );
#else
mov_mem_reg(fp_reg, OFFSETOF(pike_frame, current_object), P_REG_RAX);
mov_mem_reg(P_REG_RAX, OFFSETOF(object,storage), reg );
mov_mem_reg(fp_reg, OFFSETOF(pike_frame, context), P_REG_RAX);
add_reg_mem( reg, P_REG_RAX, OFFSETOF(inherit,storage_offset) );
add_reg_imm( reg, offset);
#endif
}
|
ab7cf5 | 2011-05-24 | Henrik Grubbström (Grubba) | | static void amd64_mark(int offset)
{
amd64_load_sp_reg();
amd64_load_mark_sp_reg();
if (offset) {
|
2fd805 | 2013-10-08 | Per Hedbor | | add_reg_imm_reg(sp_reg, -offset * sizeof(struct svalue), P_REG_RAX);
mov_reg_mem(P_REG_RAX, mark_sp_reg, 0);
|
ab7cf5 | 2011-05-24 | Henrik Grubbström (Grubba) | | } else {
|
719c3a | 2012-06-12 | Per Hedbor | | mov_reg_mem(sp_reg, mark_sp_reg, 0);
|
ab7cf5 | 2011-05-24 | Henrik Grubbström (Grubba) | | }
|
719c3a | 2012-06-12 | Per Hedbor | | amd64_add_mark_sp( 1 );
}
static void amd64_call_c_function(void *addr)
{
flush_dirty_regs();
call_imm(addr);
}
|
85c1c1 | 2014-08-18 | Per Hedbor | | static void amd64_free_svalue_off(enum amd64_reg src, int off, int guaranteed_ref )
|
719c3a | 2012-06-12 | Per Hedbor | | {
LABELS();
|
2fd805 | 2013-10-08 | Per Hedbor | | if( src == P_REG_RAX )
|
719c3a | 2012-06-12 | Per Hedbor | | Pike_fatal("Clobbering RAX for free-svalue\n");
|
85c1c1 | 2014-08-18 | Per Hedbor | | mov_mem8_reg( src, off, P_REG_RAX );
|
e30594 | 2014-08-08 | Per Hedbor | | and_reg_imm(P_REG_RAX, MIN_REF_TYPE);
jz( &label_A );
|
719c3a | 2012-06-12 | Per Hedbor | |
|
85c1c1 | 2014-08-18 | Per Hedbor | | mov_mem_reg( src,off+OFFSETOF(svalue, u.refs), P_REG_RAX);
|
719c3a | 2012-06-12 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | add_mem32_imm( P_REG_RAX, OFFSETOF(pike_string,refs), -1);
|
719c3a | 2012-06-12 | Per Hedbor | | if( !guaranteed_ref )
{
jnz( &label_A );
|
99c1e9 | 2012-06-20 | Per Hedbor | |
|
85c1c1 | 2014-08-18 | Per Hedbor | | add_reg_imm_reg( src, off, ARG1_REG );
|
99c1e9 | 2012-06-20 | Per Hedbor | | amd64_call_c_function(really_free_svalue);
}
LABEL_A;
}
|
85c1c1 | 2014-08-18 | Per Hedbor | | static void amd64_free_svalue(enum amd64_reg src, int guaranteed_ref )
{
amd64_free_svalue_off(src,0,guaranteed_ref);
}
|
ba7d5e | 2013-06-19 | Henrik Grubbström (Grubba) | |
|
99c1e9 | 2012-06-20 | Per Hedbor | | static void amd64_free_svalue_type(enum amd64_reg src, enum amd64_reg type,
int guaranteed_ref )
{
LABELS();
|
833cae | 2013-06-12 | Henrik Grubbström (Grubba) | |
|
2fd805 | 2013-10-08 | Per Hedbor | | if( src == P_REG_RAX )
|
99c1e9 | 2012-06-20 | Per Hedbor | | Pike_fatal("Clobbering RAX for free-svalue\n");
|
1af093 | 2012-06-22 | Per Hedbor | |
|
e30594 | 2014-08-08 | Per Hedbor | | and_reg32_imm(type, MIN_REF_TYPE);
jz( &label_A );
|
99c1e9 | 2012-06-20 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg( src, OFFSETOF(svalue, u.refs), P_REG_RAX);
|
99c1e9 | 2012-06-20 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | add_mem32_imm( P_REG_RAX, OFFSETOF(pike_string,refs), -1);
|
99c1e9 | 2012-06-20 | Per Hedbor | | if( !guaranteed_ref )
{
jnz( &label_A );
|
719c3a | 2012-06-12 | Per Hedbor | | if( src != ARG1_REG )
mov_reg_reg( src, ARG1_REG );
amd64_call_c_function(really_free_svalue);
|
ab7cf5 | 2011-05-24 | Henrik Grubbström (Grubba) | | }
|
719c3a | 2012-06-12 | Per Hedbor | | LABEL_A;
}
|
b505a7 | 2012-06-13 | Per Hedbor | | void amd64_ref_svalue( enum amd64_reg src, int already_have_type )
|
719c3a | 2012-06-12 | Per Hedbor | | {
LABELS();
|
2fd805 | 2013-10-08 | Per Hedbor | | if( src == P_REG_RAX ) Pike_fatal("Clobbering src in ref_svalue\n");
|
b505a7 | 2012-06-13 | Per Hedbor | | if( !already_have_type )
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_sval_type( src, P_REG_RAX );
|
e30594 | 2014-08-08 | Per Hedbor | | and_reg32_imm( P_REG_RAX, MIN_REF_TYPE );
jz( &label_A );
|
719c3a | 2012-06-12 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg( src, OFFSETOF(svalue, u.refs), P_REG_RAX);
|
719c3a | 2012-06-12 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | add_mem32_imm( P_REG_RAX, OFFSETOF(pike_string,refs), 1);
|
719c3a | 2012-06-12 | Per Hedbor | | LABEL_A;
}
|
4ec32c | 2014-08-07 | Per Hedbor | | void amd64_assign_svalue_no_free( enum amd64_reg dst, enum amd64_reg src, ptrdiff_t src_offset )
{
if( dst == P_REG_RAX ||src == P_REG_RAX )
Pike_fatal( "Clobbering src/dst in amd64_assign_svalue_no_free <%d,%d>\n", dst, src);
mov_mem_reg(src, src_offset, P_REG_RAX);
mov_reg_mem(P_REG_RAX, dst, 0 );
mov_mem_reg(src, src_offset+sizeof(long), P_REG_RAX);
mov_reg_mem(P_REG_RAX, dst, sizeof(long) );
}
|
719c3a | 2012-06-12 | Per Hedbor | | void amd64_assign_local( int b )
{
amd64_load_fp_reg();
amd64_load_sp_reg();
|
4ec32c | 2014-08-07 | Per Hedbor | | mov_mem_reg( fp_reg, OFFSETOF(pike_frame, locals), P_REG_RBX);
add_reg_imm( P_REG_RBX, b*sizeof(struct svalue) );
amd64_free_svalue(P_REG_RBX, 0);
amd64_assign_svalue_no_free( P_REG_RBX, sp_reg, -1*sizeof(struct svalue));
|
ab7cf5 | 2011-05-24 | Henrik Grubbström (Grubba) | | }
static void amd64_pop_mark(void)
{
|
719c3a | 2012-06-12 | Per Hedbor | | amd64_add_mark_sp( -1 );
|
ab7cf5 | 2011-05-24 | Henrik Grubbström (Grubba) | | }
static void amd64_push_string(int strno, int subtype)
{
|
7d577f | 2015-09-04 | Per Hedbor | | struct pike_string *str = Pike_compiler->new_program->strings[strno];
|
ab7cf5 | 2011-05-24 | Henrik Grubbström (Grubba) | | amd64_load_sp_reg();
|
7d577f | 2015-09-04 | Per Hedbor | |
mov_imm_reg((INT64)str,P_REG_RAX);
mov_imm_mem((subtype<<16) | PIKE_T_STRING, sp_reg, SVAL(0).type);
mov_reg_mem(P_REG_RAX,sp_reg,SVAL(0).value);
add_imm_mem(1, P_REG_RAX,OFFSETOF(pike_string, refs));
|
719c3a | 2012-06-12 | Per Hedbor | |
amd64_add_sp(1);
|
ab7cf5 | 2011-05-24 | Henrik Grubbström (Grubba) | | }
|
9030f6 | 2011-05-26 | Henrik Grubbström (Grubba) | | static void amd64_push_local_function(int fun)
{
amd64_load_fp_reg();
amd64_load_sp_reg();
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg(fp_reg, OFFSETOF(pike_frame, context), P_REG_RAX);
|
7e8ef5 | 2014-08-15 | Per Hedbor | | mov_mem_reg(fp_reg, OFFSETOF(pike_frame, current_object),P_REG_RCX);
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem32_reg(P_REG_RAX, OFFSETOF(inherit, identifier_level),
|
7e8ef5 | 2014-08-15 | Per Hedbor | | P_REG_RAX);
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_reg_mem(P_REG_RCX, sp_reg, OFFSETOF(svalue, u.object));
add_reg_imm(P_REG_RAX, fun);
|
7e8ef5 | 2014-08-15 | Per Hedbor | | add_imm_mem(1, P_REG_RCX,(INT32)OFFSETOF(object, refs));
|
2fd805 | 2013-10-08 | Per Hedbor | | shl_reg_imm(P_REG_RAX, 16);
add_reg_imm(P_REG_RAX, PIKE_T_FUNCTION);
|
a5cf65 | 2014-06-24 | Henrik Grubbström (Grubba) | | mov_reg_mem(P_REG_RAX, sp_reg, OFFSETOF(svalue, tu.t.type));
|
719c3a | 2012-06-12 | Per Hedbor | | amd64_add_sp(1);
|
d1fa80 | 2011-05-09 | Henrik Grubbström (Grubba) | | }
void amd64_update_pc(void)
{
INT32 tmp = PIKE_PC, disp;
|
2fd805 | 2013-10-08 | Per Hedbor | | const enum amd64_reg tmp_reg = P_REG_RAX;
|
719c3a | 2012-06-12 | Per Hedbor | |
if(amd64_prev_stored_pc == - 1)
{
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | amd64_load_fp_reg();
|
719c3a | 2012-06-12 | Per Hedbor | | mov_rip_imm_reg(tmp - PIKE_PC, tmp_reg);
mov_reg_mem(tmp_reg, fp_reg, OFFSETOF(pike_frame, pc));
|
799039 | 2006-04-27 | Tor Edvardsson | | #ifdef PIKE_DEBUG
if (a_flag >= 60)
|
719c3a | 2012-06-12 | Per Hedbor | | fprintf (stderr, "pc %d update pc via lea\n", tmp);
|
799039 | 2006-04-27 | Tor Edvardsson | | #endif
|
bf49e1 | 2012-06-15 | Henrik Grubbström (Grubba) | | amd64_prev_stored_pc = tmp;
|
799039 | 2006-04-27 | Tor Edvardsson | | }
|
719c3a | 2012-06-12 | Per Hedbor | | else if ((disp = tmp - amd64_prev_stored_pc))
{
|
799039 | 2006-04-27 | Tor Edvardsson | | #ifdef PIKE_DEBUG
if (a_flag >= 60)
fprintf (stderr, "pc %d update pc relative: %d\n", tmp, disp);
#endif
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | amd64_load_fp_reg();
|
84c5f6 | 2012-06-28 | Per Hedbor | | mov_rip_imm_reg(tmp - PIKE_PC, tmp_reg);
mov_reg_mem(tmp_reg, fp_reg, OFFSETOF(pike_frame, pc));
|
bf49e1 | 2012-06-15 | Henrik Grubbström (Grubba) | | amd64_prev_stored_pc += disp;
|
799039 | 2006-04-27 | Tor Edvardsson | | }
|
719c3a | 2012-06-12 | Per Hedbor | | else {
|
799039 | 2006-04-27 | Tor Edvardsson | | #ifdef PIKE_DEBUG
if (a_flag >= 60)
fprintf (stderr, "pc %d update pc - already up-to-date\n", tmp);
#endif
|
719c3a | 2012-06-12 | Per Hedbor | | }
|
799039 | 2006-04-27 | Tor Edvardsson | | }
|
d1fa80 | 2011-05-09 | Henrik Grubbström (Grubba) | | static void maybe_update_pc(void)
{
static int last_prog_id=-1;
static size_t last_num_linenumbers=-1;
|
638a2c | 2012-07-16 | Per Hedbor | | if( !store_pc ) return;
|
719c3a | 2012-06-12 | Per Hedbor | |
|
d1fa80 | 2011-05-09 | Henrik Grubbström (Grubba) | | if(
|
799039 | 2006-04-27 | Tor Edvardsson | | #ifdef PIKE_DEBUG
d_flag ||
#endif
(amd64_prev_stored_pc == -1) ||
last_prog_id != Pike_compiler->new_program->id ||
last_num_linenumbers != Pike_compiler->new_program->num_linenumbers
) {
last_prog_id=Pike_compiler->new_program->id;
last_num_linenumbers = Pike_compiler->new_program->num_linenumbers;
UPDATE_PC();
}
}
|
f3bbcc | 2012-07-13 | Henrik Grubbström (Grubba) | | static void maybe_load_fp(void)
{
static int last_prog_id=-1;
static size_t last_num_linenumbers=-1;
|
638a2c | 2012-07-16 | Per Hedbor | | if( !store_pc ) return;
|
f3bbcc | 2012-07-13 | Henrik Grubbström (Grubba) | |
if(
#ifdef PIKE_DEBUG
d_flag ||
#endif
(amd64_prev_stored_pc == -1) ||
last_prog_id != Pike_compiler->new_program->id ||
last_num_linenumbers != Pike_compiler->new_program->num_linenumbers
) {
amd64_load_fp_reg();
}
}
|
719c3a | 2012-06-12 | Per Hedbor | | static void sync_registers(int flags)
{
maybe_update_pc();
flush_dirty_regs();
|
2fd805 | 2013-10-08 | Per Hedbor | | if (flags & I_UPDATE_SP) sp_reg = P_REG_INVALID;
if (flags & I_UPDATE_M_SP) mark_sp_reg = P_REG_INVALID;
if (flags & I_UPDATE_FP) fp_reg = P_REG_INVALID;
|
719c3a | 2012-06-12 | Per Hedbor | | }
static void amd64_call_c_opcode(void *addr, int flags)
{
sync_registers(flags);
call_imm( addr );
}
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | #ifdef PIKE_DEBUG
static void ins_debug_instr_prologue (PIKE_INSTR_T instr, INT32 arg1, INT32 arg2)
{
int flags = instrs[instr].flags;
|
f3bbcc | 2012-07-13 | Henrik Grubbström (Grubba) | |
maybe_load_fp();
|
622ebc | 2012-06-25 | Per Hedbor | |
if( !d_flag )
return;
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | maybe_update_pc();
if (flags & I_HASARG2)
|
719c3a | 2012-06-12 | Per Hedbor | | mov_imm_reg(arg2, ARG3_REG);
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | if (flags & I_HASARG)
|
719c3a | 2012-06-12 | Per Hedbor | | mov_imm_reg(arg1, ARG2_REG);
mov_imm_reg(instr, ARG1_REG);
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | |
if (flags & I_HASARG2)
amd64_call_c_function (simple_debug_instr_prologue_2);
else if (flags & I_HASARG)
amd64_call_c_function (simple_debug_instr_prologue_1);
else
amd64_call_c_function (simple_debug_instr_prologue_0);
}
#else /* !PIKE_DEBUG */
|
d7805b | 2012-07-14 | Henrik Grubbström (Grubba) | | #define ins_debug_instr_prologue(instr, arg1, arg2) maybe_load_fp()
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | #endif
|
719c3a | 2012-06-12 | Per Hedbor | | static void amd64_push_this_object( )
{
amd64_load_fp_reg();
amd64_load_sp_reg();
|
a5cf65 | 2014-06-24 | Henrik Grubbström (Grubba) | | mov_imm_mem( PIKE_T_OBJECT, sp_reg, OFFSETOF(svalue, tu.t.type));
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg( fp_reg, OFFSETOF(pike_frame, current_object), P_REG_RAX );
mov_reg_mem( P_REG_RAX, sp_reg, OFFSETOF(svalue,u.object) );
add_mem32_imm( P_REG_RAX, (INT32)OFFSETOF(object, refs), 1);
|
719c3a | 2012-06-12 | Per Hedbor | | amd64_add_sp( 1 );
}
|
638a2c | 2012-07-16 | Per Hedbor | | static void amd64_align()
{
while( PIKE_PC & 3 )
ib( 0x90 );
}
static void amd64_ins_branch_check_threads_etc(int code_only)
|
719c3a | 2012-06-12 | Per Hedbor | | {
LABELS();
|
638a2c | 2012-07-16 | Per Hedbor | | if( !branch_check_threads_update_etc )
|
6785ae | 2012-06-15 | Per Hedbor | | {
|
11619b | 2012-07-18 | Henrik Grubbström (Grubba) | |
|
638a2c | 2012-07-16 | Per Hedbor | | if( !code_only )
jmp( &label_A );
|
6785ae | 2012-06-15 | Per Hedbor | | branch_check_threads_update_etc = PIKE_PC;
|
5e064b | 2012-06-15 | Henrik Grubbström (Grubba) | | if( (unsigned long long)&fast_check_threads_counter < 0x7fffffffULL )
|
6785ae | 2012-06-15 | Per Hedbor | | {
|
2fd805 | 2013-10-08 | Per Hedbor | | clear_reg( P_REG_RAX );
add_mem32_imm( P_REG_RAX,
|
5e064b | 2012-06-15 | Henrik Grubbström (Grubba) | | (int)(ptrdiff_t)&fast_check_threads_counter,
|
6785ae | 2012-06-15 | Per Hedbor | | 0x80 );
}
else
{
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_imm_reg( (long)&fast_check_threads_counter, P_REG_RAX);
add_mem_imm( P_REG_RAX, 0, 0x80 );
|
6785ae | 2012-06-15 | Per Hedbor | | }
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_imm_reg( (ptrdiff_t)branch_check_threads_etc, P_REG_RAX );
jmp_reg(P_REG_RAX);
|
638a2c | 2012-07-16 | Per Hedbor | | amd64_align();
}
if( !code_only )
{
LABEL_A;
|
10d27a | 2014-08-08 | Per Hedbor | | #ifndef USE_VALGRIND
|
2cbc49 | 2017-02-21 | Martin Karlgren | | #ifndef MACHINE_CODE_STACK_FRAMES
|
2fd805 | 2013-10-08 | Per Hedbor | | add_mem8_imm( P_REG_RSP, 0, 1 );
|
638a2c | 2012-07-16 | Per Hedbor | | jno( &label_B );
|
2cbc49 | 2017-02-21 | Martin Karlgren | | #endif
|
10d27a | 2014-08-08 | Per Hedbor | | #endif
|
11619b | 2012-07-18 | Henrik Grubbström (Grubba) | | call_rel_imm32( branch_check_threads_update_etc );
|
10d27a | 2014-08-08 | Per Hedbor | | #ifndef USE_VALGRIND
|
70ff3d | 2013-05-28 | Martin Nilsson | | LABEL_B;
|
10d27a | 2014-08-08 | Per Hedbor | | #endif
|
6785ae | 2012-06-15 | Per Hedbor | | }
|
719c3a | 2012-06-12 | Per Hedbor | | }
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | void amd64_init_interpreter_state(void)
{
|
85c1c1 | 2014-08-18 | Per Hedbor | | #ifdef PIKE_DEBUG
if( PIKE_T_INT != 0 )
Pike_fatal("assumption failed: pike_t_int == 0\n");
if( sizeof(struct svalue) != 16 )
Pike_fatal("assumption failed: sizeof svalue != 16\n");
if( OFFSETOF(svalue,tu.t.type) != 0 )
Pike_fatal("assumption failed: offsetof(svalue.tu.t.type) != 0\n");
if( OFFSETOF(svalue,u.integer) != 8 )
Pike_fatal("assumption failed: offsetof(svalue.u.integer) != 8\n");
#endif
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | }
|
6785ae | 2012-06-15 | Per Hedbor | | static void amd64_return_from_function()
{
if( ret_for_func )
{
|
11619b | 2012-07-18 | Henrik Grubbström (Grubba) | | jmp_rel_imm( ret_for_func );
|
6785ae | 2012-06-15 | Per Hedbor | | }
else
{
ret_for_func = PIKE_PC;
|
2fd805 | 2013-10-08 | Per Hedbor | | pop(P_REG_RBX);
pop(P_REG_RBX);
pop(P_REG_R12);
pop(P_REG_R13);
pop(P_REG_R14);
pop(P_REG_R15);
pop(P_REG_RBP);
|
6785ae | 2012-06-15 | Per Hedbor | | ret();
}
}
|
2e82fb | 2014-08-31 | Per Hedbor | | static void if_not_two_int(struct label *to, int load)
{
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);
jnz(to);
if( load )
{
mov_mem_reg(sp_reg, SVAL(-1).value, P_REG_RAX );
mov_mem_reg(sp_reg, SVAL(-2).value, P_REG_RBX );
}
}
|
d1fa80 | 2011-05-09 | Henrik Grubbström (Grubba) | | void ins_f_byte(unsigned int b)
{
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | int flags;
|
d1fa80 | 2011-05-09 | Henrik Grubbström (Grubba) | | void *addr;
|
2cbc49 | 2017-02-21 | Martin Karlgren | |
|
719c3a | 2012-06-12 | Per Hedbor | | LABELS();
|
d1fa80 | 2011-05-09 | Henrik Grubbström (Grubba) | | b-=F_OFFSET;
|
799039 | 2006-04-27 | Tor Edvardsson | | #ifdef PIKE_DEBUG
|
d1fa80 | 2011-05-09 | Henrik Grubbström (Grubba) | | if(b>255)
Pike_error("Instruction too big %d\n",b);
|
799039 | 2006-04-27 | Tor Edvardsson | | #endif
|
d1fa80 | 2011-05-09 | Henrik Grubbström (Grubba) | | maybe_update_pc();
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | |
flags = instrs[b].flags;
|
eb42a1 | 2011-05-11 | Henrik Grubbström (Grubba) | | addr=instrs[b].address;
|
1af093 | 2012-06-22 | Per Hedbor | | switch(b + F_OFFSET)
{
|
b505a7 | 2012-06-13 | Per Hedbor | | case F_DUP:
|
6785ae | 2012-06-15 | Per Hedbor | | ins_debug_instr_prologue(b, 0, 0);
|
c33ce9 | 2012-06-28 | Per Hedbor | | amd64_load_sp_reg();
|
2fd805 | 2013-10-08 | Per Hedbor | | add_reg_imm_reg(sp_reg, -sizeof(struct svalue), P_REG_R10 );
amd64_push_svaluep( P_REG_R10 );
|
b505a7 | 2012-06-13 | Per Hedbor | | return;
|
378ad0 | 2012-06-25 | Per Hedbor | |
|
4ceb79 | 2012-06-22 | Per Hedbor | | #if 0
|
378ad0 | 2012-06-25 | Per Hedbor | | case F_ESCAPE_CATCH:
|
1af093 | 2012-06-22 | Per Hedbor | | case F_EXIT_CATCH:
|
c33ce9 | 2012-06-28 | Per Hedbor | | ins_debug_instr_prologue(b, 0, 0);
|
1af093 | 2012-06-22 | Per Hedbor | | ins_f_byte( F_ESCAPE_CATCH );
amd64_load_sp_reg();
amd64_push_int( 0, 1 );
return;
|
4ceb79 | 2012-06-22 | Per Hedbor | | #endif
|
378ad0 | 2012-06-25 | Per Hedbor | |
case F_LTOSVAL2_AND_FREE:
{
|
c33ce9 | 2012-06-28 | Per Hedbor | | ins_debug_instr_prologue(b, 0, 0);
|
378ad0 | 2012-06-25 | Per Hedbor | | amd64_load_sp_reg();
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem8_reg( sp_reg, -3*sizeof(struct svalue), P_REG_RBX );
cmp_reg_imm( P_REG_RBX, T_SVALUE_PTR );
|
378ad0 | 2012-06-25 | Per Hedbor | | jne( &label_A );
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg( sp_reg, -sizeof(struct svalue), P_REG_RAX );
mov_mem_reg( sp_reg, -sizeof(struct svalue)+8, P_REG_RCX );
mov_reg_mem( P_REG_RAX, sp_reg, 0);
mov_reg_mem( P_REG_RCX, sp_reg, 8);
|
378ad0 | 2012-06-25 | Per Hedbor | | amd64_add_sp( 1 );
mov_mem_reg( sp_reg,
-4*sizeof(struct svalue)+OFFSETOF(svalue,u.lval),
|
2fd805 | 2013-10-08 | Per Hedbor | | P_REG_RBX );
amd64_push_svaluep_to(P_REG_RBX, -2);
|
378ad0 | 2012-06-25 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_reg_reg( P_REG_RAX, P_REG_RCX );
mov_imm_reg( 1, P_REG_RAX );
shl_reg32_reg( P_REG_RAX, P_REG_RCX );
and_reg_imm( P_REG_RAX, (BIT_ARRAY|BIT_MULTISET|BIT_MAPPING|BIT_STRING));
|
378ad0 | 2012-06-25 | Per Hedbor | | jz( &label_B );
|
2fd805 | 2013-10-08 | Per Hedbor | | amd64_free_svalue( P_REG_RBX, 0 );
|
378ad0 | 2012-06-25 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_imm_mem( PIKE_T_INT, P_REG_RBX, 0 );
mov_imm_mem( 0, P_REG_RBX, 8 );
|
378ad0 | 2012-06-25 | Per Hedbor | | jmp( &label_B );
LABEL_A;
amd64_call_c_opcode( addr, flags );
amd64_load_sp_reg();
LABEL_B;
}
return;
case F_LTOSVAL:
{
|
c33ce9 | 2012-06-28 | Per Hedbor | | ins_debug_instr_prologue(b, 0, 0);
|
378ad0 | 2012-06-25 | Per Hedbor | | amd64_load_sp_reg();
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem8_reg( sp_reg, -sizeof(struct svalue)*2, P_REG_RAX );
|
378ad0 | 2012-06-25 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | cmp_reg_imm( P_REG_RAX, T_SVALUE_PTR );
|
378ad0 | 2012-06-25 | Per Hedbor | | je( &label_A );
mov_reg_reg( sp_reg, ARG1_REG );
add_reg_imm_reg( sp_reg, -2*sizeof(struct svalue), ARG2_REG );
amd64_call_c_function(lvalue_to_svalue_no_free);
|
c33ce9 | 2012-06-28 | Per Hedbor | | amd64_load_sp_reg();
|
378ad0 | 2012-06-25 | Per Hedbor | | amd64_add_sp(1);
jmp(&label_B);
LABEL_A;
mov_mem_reg( sp_reg, -sizeof(struct svalue)*2+OFFSETOF(svalue,u.lval),
|
2fd805 | 2013-10-08 | Per Hedbor | | P_REG_RCX );
amd64_push_svaluep(P_REG_RCX);
|
378ad0 | 2012-06-25 | Per Hedbor | | LABEL_B;
}
return;
case F_ASSIGN:
{
|
c33ce9 | 2012-06-28 | Per Hedbor | | ins_debug_instr_prologue(b, 0, 0);
|
378ad0 | 2012-06-25 | Per Hedbor | | amd64_load_sp_reg();
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem8_reg( sp_reg, -3*sizeof(struct svalue), P_REG_RAX );
cmp_reg_imm( P_REG_RAX, T_SVALUE_PTR );
|
378ad0 | 2012-06-25 | Per Hedbor | |
je( &label_A );
amd64_call_c_opcode( addr, flags );
amd64_load_sp_reg();
jmp( &label_B );
amd64_align();
LABEL_A;
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg( sp_reg, -3*sizeof(struct svalue)+8, P_REG_RBX );
|
378ad0 | 2012-06-25 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | amd64_free_svalue( P_REG_RBX, 0 );
|
378ad0 | 2012-06-25 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg( sp_reg, -sizeof(struct svalue), P_REG_RAX );
mov_mem_reg( sp_reg, -sizeof(struct svalue)+8, P_REG_RCX );
mov_reg_mem( P_REG_RAX, P_REG_RBX, 0 );
mov_reg_mem( P_REG_RCX, P_REG_RBX, 8 );
add_reg_imm_reg( sp_reg, -sizeof(struct svalue), P_REG_RCX );
amd64_push_svaluep_to( P_REG_RCX, -3 );
|
378ad0 | 2012-06-25 | Per Hedbor | |
amd64_add_sp( -2 );
LABEL_B;
}
return;
case F_ASSIGN_AND_POP:
{
|
c33ce9 | 2012-06-28 | Per Hedbor | | ins_debug_instr_prologue(b, 0, 0);
|
378ad0 | 2012-06-25 | Per Hedbor | | amd64_load_sp_reg();
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem8_reg( sp_reg, -3*sizeof(struct svalue), P_REG_RAX );
cmp_reg_imm( P_REG_RAX, T_SVALUE_PTR );
|
378ad0 | 2012-06-25 | Per Hedbor | |
je( &label_A );
amd64_call_c_opcode( addr, flags );
amd64_load_sp_reg();
jmp( &label_B );
amd64_align();
LABEL_A;
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg( sp_reg, -3*sizeof(struct svalue)+8, P_REG_RBX );
|
378ad0 | 2012-06-25 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | amd64_free_svalue( P_REG_RBX, 0 );
|
378ad0 | 2012-06-25 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg( sp_reg, -sizeof(struct svalue), P_REG_RAX );
mov_mem_reg( sp_reg, -sizeof(struct svalue)+8, P_REG_RCX );
mov_reg_mem( P_REG_RAX, P_REG_RBX, 0 );
mov_reg_mem( P_REG_RCX, P_REG_RBX, 8 );
|
378ad0 | 2012-06-25 | Per Hedbor | |
amd64_add_sp( -3 );
LABEL_B;
}
return;
|
9840c2 | 2014-08-28 | Per Hedbor | |
|
156ab0 | 2014-08-31 | Per Hedbor | | case F_NEGATE:
{
LABELS();
ins_debug_instr_prologue(b, 0, 0);
amd64_load_sp_reg();
mov_mem8_reg(sp_reg, SVAL(-1).type, P_REG_RAX );
test_reg32(P_REG_RAX);
jz(&label_B);
|
fb2ce0 | 2014-08-31 | Per Hedbor | | jmp(&label_A);
|
156ab0 | 2014-08-31 | Per Hedbor | | LABEL_D;
neg_mem(sp_reg, SVAL(-1).value );
LABEL_A;
amd64_call_c_opcode(addr, flags);
jmp(&label_C);
LABEL_B;
|
da865c | 2014-09-01 | Per Hedbor | | mov_imm_mem(PIKE_T_INT, sp_reg, SVAL(-1).type );
|
156ab0 | 2014-08-31 | Per Hedbor | | neg_mem(sp_reg, SVAL(-1).value );
jo(&label_D);
LABEL_C;
}
return;
|
742006 | 2014-09-23 | Per Hedbor | | case F_NOT:
{
LABELS();
amd64_load_sp_reg();
mov_mem8_reg(sp_reg, SVAL(-1).type, P_REG_RCX );
test_reg32(P_REG_RCX);
jz(&label_B);
mov_imm_reg( 1, P_REG_RAX );
shl_reg32_reg( P_REG_RAX, P_REG_RCX );
and_reg32_imm( P_REG_RAX, (BIT_FLOAT|BIT_ARRAY|BIT_MULTISET|BIT_MAPPING|BIT_STRING|BIT_PROGRAM));
jnz( &label_A );
amd64_call_c_opcode(addr, flags);
jmp(&label_C);
LABEL_B;
mov_mem_reg( sp_reg, SVAL(-1).value, P_REG_RAX );
clear_reg( P_REG_RCX );
cmp_reg_imm( P_REG_RAX, 0 );
set_if_eq(P_REG_RCX);
mov_imm_mem( PIKE_T_INT, sp_reg, SVAL(-1).type );
mov_reg_mem( P_REG_RCX, sp_reg, SVAL(-1).value );
jmp(&label_C);
LABEL_A;
amd64_free_svalue_off( sp_reg, SVAL(-1).off, 0 );
mov_imm_mem( PIKE_T_INT, sp_reg, SVAL(-1).type );
mov_imm_mem( 0, sp_reg, SVAL(-1).value );
LABEL_C;
}
return;
|
36fea0 | 2014-08-31 | Per Hedbor | | case F_COMPL:
{
LABELS();
ins_debug_instr_prologue(b, 0, 0);
amd64_load_sp_reg();
mov_mem8_reg(sp_reg, SVAL(-1).type, P_REG_RAX );
test_reg32(P_REG_RAX);
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;
|
0eb13c | 2014-08-31 | Per Hedbor | | case F_MOD:
|
da865c | 2014-09-01 | Per Hedbor | | case F_DIVIDE:
|
5d4e63 | 2014-08-31 | Per Hedbor | | {
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 );
|
da865c | 2014-09-01 | Per Hedbor | | cmp_reg_imm(P_REG_RAX, 0 ); jl(&label_A);
|
0eb13c | 2014-08-31 | Per Hedbor | | if( b+F_OFFSET == F_MOD )
{
|
da865c | 2014-09-01 | Per Hedbor | |
cmp_reg_imm(P_REG_RBX, 0 ); jl(&label_A);
|
0eb13c | 2014-08-31 | Per Hedbor | | }
|
5d4e63 | 2014-08-31 | Per Hedbor | | cmp_reg_imm(P_REG_RBX,0);
|
da865c | 2014-09-01 | Per Hedbor | | je(&label_A);
|
5d4e63 | 2014-08-31 | Per Hedbor | | cmp_reg_imm(P_REG_RBX,-1);
|
da865c | 2014-09-01 | Per Hedbor | | jne(&label_C);
|
5d4e63 | 2014-08-31 | Per Hedbor | | cmp_reg_imm(P_REG_RAX,0);
jle(&label_A);
|
956b12 | 2014-09-23 | Per Hedbor | |
|
0eb13c | 2014-08-31 | Per Hedbor | | This checks for -<whatever> / -1.
|
5d4e63 | 2014-08-31 | Per Hedbor | | There is bound to be a better way.
Somehow disable the exception?
|
956b12 | 2014-09-23 | Per Hedbor | |
|
0eb13c | 2014-08-31 | Per Hedbor | | Some SSE alternative that does not throw?
Perhaps a 64/64->64 instead of the current 128/64->64?
|
5d4e63 | 2014-08-31 | Per Hedbor | | */
LABEL_C;
div_reg_reg(P_REG_RAX,P_REG_RBX);
mov_imm_mem(PIKE_T_INT, sp_reg, SVAL(-2).type);
|
0eb13c | 2014-08-31 | Per Hedbor | | 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);
|
5d4e63 | 2014-08-31 | Per Hedbor | | amd64_add_sp(-1);
jmp(&label_B);
LABEL_A;
amd64_call_c_opcode(addr, flags);
amd64_load_sp_reg();
LABEL_B;
}
return;
|
2e82fb | 2014-08-31 | Per Hedbor | | case F_MULTIPLY:
|
ad0d7e | 2014-08-28 | Per Hedbor | | {
|
5d4e63 | 2014-08-31 | Per Hedbor | | LABELS();
|
51f370 | 2015-08-06 | Per Hedbor | | if_not_two_int(&label_C,1);
|
2e82fb | 2014-08-31 | Per Hedbor | | amd64_add_sp(-1);
|
51f370 | 2015-08-06 | Per Hedbor | | mul_rax_reg_reg128(P_REG_RBX);
jo(&label_A);
mov_imm_mem(PIKE_T_INT, sp_reg, SVAL(-1).type);
|
2e82fb | 2014-08-31 | Per Hedbor | | jmp(&label_B);
|
51f370 | 2015-08-06 | Per Hedbor | | LABEL_C;
|
2e82fb | 2014-08-31 | Per Hedbor | | amd64_call_c_opcode(addr, flags);
amd64_load_sp_reg();
|
51f370 | 2015-08-06 | Per Hedbor | | jmp(&label_D);
LABEL_A;
mov_reg_reg( P_REG_RAX, ARG1_REG );
mov_reg_reg( P_REG_RDX, ARG2_REG );
amd64_call_c_function(create_double_bignum);
mov_imm_mem(PIKE_T_OBJECT, sp_reg, SVAL(-1).type);
|
ad0d7e | 2014-08-28 | Per Hedbor | | LABEL_B;
|
51f370 | 2015-08-06 | Per Hedbor | | mov_reg_mem(P_REG_RAX, sp_reg, SVAL(-1).value);
LABEL_D;
|
ad0d7e | 2014-08-28 | Per Hedbor | | }
return;
|
2e82fb | 2014-08-31 | Per Hedbor | | case F_AND:
{
LABELS();
ins_debug_instr_prologue(b, 0, 0);
if_not_two_int(&label_A,1);
and_reg_reg(P_REG_RBX,P_REG_RAX);
mov_imm_mem(PIKE_T_INT,sp_reg,SVAL(-2).type);
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;
|
ad0d7e | 2014-08-28 | Per Hedbor | | case F_OR:
{
LABELS();
ins_debug_instr_prologue(b, 0, 0);
|
2e82fb | 2014-08-31 | Per Hedbor | | if_not_two_int(&label_A,1);
|
ad0d7e | 2014-08-28 | Per Hedbor | | or_reg_reg(P_REG_RAX,P_REG_RBX);
|
282c37 | 2014-08-29 | Per Hedbor | | mov_imm_mem(PIKE_T_INT,sp_reg,SVAL(-2).type);
|
ad0d7e | 2014-08-28 | Per Hedbor | | 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;
|
2ce89e | 2014-08-31 | Per Hedbor | | case F_XOR:
{
LABELS();
ins_debug_instr_prologue(b, 0, 0);
if_not_two_int(&label_A,1);
xor_reg_reg(P_REG_RAX,P_REG_RBX);
mov_imm_mem(PIKE_T_INT,sp_reg,SVAL(-2).type);
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;
|
ad0d7e | 2014-08-28 | Per Hedbor | | case F_RSH:
{
LABELS();
ins_debug_instr_prologue(b, 0, 0);
|
2e82fb | 2014-08-31 | Per Hedbor | | if_not_two_int(&label_A,0);
|
ad0d7e | 2014-08-28 | Per Hedbor | | mov_mem_reg(sp_reg, SVAL(-1).value, P_REG_RCX );
cmp_reg_imm(P_REG_RCX,0);
jl( &label_A );
cmp_reg_imm(P_REG_RCX,63);
|
9840c2 | 2014-08-28 | Per Hedbor | | jl( &label_B );
|
ad0d7e | 2014-08-28 | Per Hedbor | | LABEL_A;
amd64_call_c_opcode(addr, flags);
amd64_load_sp_reg();
|
9840c2 | 2014-08-28 | Per Hedbor | | jmp(&label_C);
LABEL_B;
|
282c37 | 2014-08-29 | Per Hedbor | | mov_imm_mem(PIKE_T_INT,sp_reg,SVAL(-2).type);
|
9840c2 | 2014-08-28 | Per Hedbor | | shr_mem_reg( sp_reg, SVAL(-2).value, P_REG_RCX);
amd64_add_sp(-1);
|
ad0d7e | 2014-08-28 | Per Hedbor | | LABEL_C;
}
return;
|
156ab0 | 2014-08-31 | Per Hedbor | |
case F_LSH:
{
LABELS();
ins_debug_instr_prologue(b, 0, 0);
|
2e82fb | 2014-08-31 | Per Hedbor | | if_not_two_int(&label_A,0);
|
156ab0 | 2014-08-31 | Per Hedbor | | mov_mem_reg(sp_reg, SVAL(-1).value, P_REG_RCX );
cmp_reg_imm(P_REG_RCX,0);
jl( &label_A );
cmp_reg_imm(P_REG_RCX,63);
jl( &label_B );
LABEL_A;
amd64_call_c_opcode(addr, flags);
amd64_load_sp_reg();
jmp(&label_C);
LABEL_B;
mov_imm_mem(PIKE_T_INT,sp_reg,SVAL(-2).type);
mov_mem_reg( sp_reg, SVAL(-2).value, P_REG_RBX);
mov_reg_reg( P_REG_RBX, P_REG_RAX );
shl_reg_reg( P_REG_RBX, P_REG_RCX);
mov_reg_reg( P_REG_RBX, P_REG_RDX );
shr_reg_reg( P_REG_RDX, P_REG_RCX );
cmp_reg_reg( P_REG_RDX, P_REG_RAX );
jne( &label_A );
mov_reg_mem( P_REG_RBX, sp_reg, SVAL(-2).value);
amd64_add_sp(-1);
LABEL_C;
}
return;
|
6785ae | 2012-06-15 | Per Hedbor | | case F_ADD_INTS:
{
ins_debug_instr_prologue(b, 0, 0);
|
c33ce9 | 2012-06-28 | Per Hedbor | | amd64_load_sp_reg();
|
851d19 | 2014-08-07 | Per Hedbor | | mov_mem_reg( sp_reg, -sizeof(struct svalue)*2, P_REG_RAX );
add_reg_mem( P_REG_RAX, sp_reg, -sizeof(struct svalue ) );
jnz( &label_A );
|
6785ae | 2012-06-15 | Per Hedbor | |
mov_mem_reg( sp_reg,
-sizeof(struct svalue)+OFFSETOF(svalue,u.integer),
|
2fd805 | 2013-10-08 | Per Hedbor | | P_REG_RAX );
|
6785ae | 2012-06-15 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | add_reg_mem( P_REG_RAX,
|
6785ae | 2012-06-15 | Per Hedbor | | sp_reg,
|
851d19 | 2014-08-07 | Per Hedbor | | -sizeof(struct svalue)*2+OFFSETOF(svalue,u.integer));
|
6785ae | 2012-06-15 | Per Hedbor | |
jo( &label_A );
amd64_add_sp( -1 );
|
851d19 | 2014-08-07 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_reg_mem( P_REG_RAX, sp_reg,
|
6785ae | 2012-06-15 | Per Hedbor | | -sizeof(struct svalue)+OFFSETOF(svalue,u.integer));
jmp( &label_B );
LABEL_A;
update_arg1( 2 );
amd64_call_c_opcode( f_add, I_UPDATE_SP );
amd64_load_sp_reg();
LABEL_B;
}
return;
|
b505a7 | 2012-06-13 | Per Hedbor | | case F_SWAP:
|
6785ae | 2012-06-15 | Per Hedbor | |
|
c33ce9 | 2012-06-28 | Per Hedbor | | ins_debug_instr_prologue(b, 0, 0);
|
6785ae | 2012-06-15 | Per Hedbor | | amd64_load_sp_reg();
|
2fd805 | 2013-10-08 | Per Hedbor | | add_reg_imm_reg( sp_reg, -2*sizeof(struct svalue), P_REG_RCX );
mov_mem128_reg( P_REG_RCX, 0, P_REG_XMM0 );
mov_mem128_reg( P_REG_RCX, 16, P_REG_XMM1 );
mov_reg_mem128( P_REG_XMM1, P_REG_RCX, 0 );
mov_reg_mem128( P_REG_XMM0, P_REG_RCX, 16 );
|
6785ae | 2012-06-15 | Per Hedbor | | return;
|
888603 | 2012-06-25 | Per Hedbor | | case F_INDEX:
|
c33ce9 | 2012-06-28 | Per Hedbor | | ins_debug_instr_prologue(b, 0, 0);
|
888603 | 2012-06-25 | Per Hedbor | | amd64_load_sp_reg();
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem8_reg( sp_reg, -2*sizeof(struct svalue), P_REG_RAX );
mov_mem8_reg( sp_reg, -1*sizeof(struct svalue), P_REG_RBX );
shl_reg_imm( P_REG_RAX, 8 );
add_reg_reg( P_REG_RAX, P_REG_RBX );
mov_mem_reg( sp_reg, -1*sizeof(struct svalue)+8, P_REG_RBX );
mov_mem_reg( sp_reg, -2*sizeof(struct svalue)+8, P_REG_RCX );
cmp_reg32_imm( P_REG_RAX, (PIKE_T_ARRAY<<8)|PIKE_T_INT );
|
888603 | 2012-06-25 | Per Hedbor | | jne( &label_A );
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem32_reg( P_REG_RCX, OFFSETOF(array,size), P_REG_RDX );
|
956b12 | 2014-09-23 | Per Hedbor | | cmp_reg_imm( P_REG_RBX, 0 ); jge( &label_D );
|
888603 | 2012-06-25 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | add_reg_reg( P_REG_RBX, P_REG_RDX );
|
888603 | 2012-06-25 | Per Hedbor | |
LABEL_D;
|
2fd805 | 2013-10-08 | Per Hedbor | | cmp_reg32_imm( P_REG_RBX, 0 ); jl( &label_B );
cmp_reg_reg( P_REG_RBX, P_REG_RDX); jge( &label_B );
|
888603 | 2012-06-25 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | push( P_REG_RCX );
mov_mem_reg( P_REG_RCX, OFFSETOF(array,item), P_REG_RCX );
shl_reg_imm( P_REG_RBX, 4 );
add_reg_reg( P_REG_RBX, P_REG_RCX );
|
888603 | 2012-06-25 | Per Hedbor | |
amd64_add_sp( -1 );
|
2fd805 | 2013-10-08 | Per Hedbor | | amd64_push_svaluep_to( P_REG_RBX, -1 );
|
888603 | 2012-06-25 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | pop( P_REG_RCX );
|
888603 | 2012-06-25 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | add_mem32_imm( P_REG_RCX, OFFSETOF(array,refs), -1);
|
888603 | 2012-06-25 | Per Hedbor | | jnz( &label_C );
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_reg_reg( P_REG_RCX, ARG1_REG );
|
888603 | 2012-06-25 | Per Hedbor | | amd64_call_c_function(really_free_array);
jmp( &label_C );
LABEL_A;
#if 0
|
2fd805 | 2013-10-08 | Per Hedbor | | cmp_reg32_imm( P_REG_RAX, (PIKE_T_STRING<<8)|PIKE_T_INT );
|
888603 | 2012-06-25 | Per Hedbor | | jne( &label_B );
#endif
LABEL_B;
amd64_call_c_opcode( addr, flags );
amd64_load_sp_reg();
LABEL_C;
return;
|
956b12 | 2014-09-23 | Per Hedbor | | case F_SIZEOF_STRING:
{
LABELS();
ins_debug_instr_prologue(b, 0, 0);
amd64_load_sp_reg();
mov_mem8_reg( sp_reg, SVAL(-1).type, P_REG_RAX );
cmp_reg32_imm( P_REG_RAX, PIKE_T_STRING );
jne( &label_A );
mov_mem_reg( sp_reg, SVAL(-1).value, P_REG_RAX);
mov_mem_reg( P_REG_RAX, OFFSETOF(pike_string,len), P_REG_RBX );
add_mem32_imm( P_REG_RAX, OFFSETOF(pike_string,refs), -1);
jnz( &label_B );
add_reg_imm_reg( sp_reg, SVAL(-1).off, ARG1_REG );
amd64_call_c_function(really_free_svalue);
jmp(&label_B);
LABEL_A;
amd64_call_c_opcode( addr, flags );
jmp(&label_C);
LABEL_B;
mov_imm_mem( PIKE_T_INT, sp_reg, SVAL(-1).type );
mov_reg_mem( P_REG_RBX, sp_reg, SVAL(-1).value );
LABEL_C;
}
return;
|
ea8268 | 2012-06-25 | Per Hedbor | | case F_SIZEOF:
{
LABELS();
ins_debug_instr_prologue(b, 0, 0);
amd64_load_sp_reg();
|
2fd805 | 2013-10-08 | Per Hedbor | | add_reg_imm_reg( sp_reg, -sizeof(struct svalue), P_REG_RBX);
mov_sval_type( P_REG_RBX, P_REG_RAX );
|
ea8268 | 2012-06-25 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | cmp_reg32_imm( P_REG_RAX, PIKE_T_ARRAY ); jne( &label_A );
|
ea8268 | 2012-06-25 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg( P_REG_RBX, OFFSETOF(svalue, u.array ), ARG1_REG);
|
ea8268 | 2012-06-25 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem32_reg( ARG1_REG,OFFSETOF(array, size), P_REG_RAX );
|
ea8268 | 2012-06-25 | Per Hedbor | | jmp( &label_C );
LABEL_A;
|
2fd805 | 2013-10-08 | Per Hedbor | | cmp_reg32_imm( P_REG_RAX, PIKE_T_STRING ); jne( &label_B );
|
ea8268 | 2012-06-25 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg( P_REG_RBX, OFFSETOF(svalue, u.string ), ARG1_REG);
|
ea8268 | 2012-06-25 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem32_reg( ARG1_REG,OFFSETOF(pike_string, len ), P_REG_RAX );
|
ea8268 | 2012-06-25 | Per Hedbor | | jmp( &label_C );
LABEL_B;
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_reg_reg( P_REG_RBX, ARG1_REG );
|
ea8268 | 2012-06-25 | Per Hedbor | | amd64_call_c_function( pike_sizeof );
|
888603 | 2012-06-25 | Per Hedbor | |
|
ea8268 | 2012-06-25 | Per Hedbor | | LABEL_C;
|
2fd805 | 2013-10-08 | Per Hedbor | | push( P_REG_RAX );
amd64_free_svalue( P_REG_RBX, 0 );
pop( P_REG_RAX );
mov_reg_mem(P_REG_RAX, P_REG_RBX, OFFSETOF(svalue, u.integer));
|
a5cf65 | 2014-06-24 | Henrik Grubbström (Grubba) | | mov_imm_mem(PIKE_T_INT, P_REG_RBX, OFFSETOF(svalue, tu.t.type));
|
ea8268 | 2012-06-25 | Per Hedbor | | }
return;
|
b505a7 | 2012-06-13 | Per Hedbor | | case F_POP_VALUE:
|
6785ae | 2012-06-15 | Per Hedbor | | {
ins_debug_instr_prologue(b, 0, 0);
amd64_load_sp_reg();
amd64_add_sp( -1 );
amd64_free_svalue( sp_reg, 0 );
}
return;
|
2e82fb | 2014-08-31 | Per Hedbor | |
|
eb42a1 | 2011-05-11 | Henrik Grubbström (Grubba) | | case F_CATCH:
|
21b911 | 2011-05-23 | Henrik Grubbström (Grubba) | | {
|
26da46 | 2017-02-21 | Martin Karlgren | | INT32 base_addr = 0;
LABELS();
|
719c3a | 2012-06-12 | Per Hedbor | | mov_rip_imm_reg(0, ARG1_REG);
|
26da46 | 2017-02-21 | Martin Karlgren | | base_addr = PIKE_PC;
amd64_call_c_function (setup_catch_context);
mov_reg_reg(P_REG_RAX, P_REG_RBX);
mov_mem_reg (Pike_interpreter_reg,
OFFSETOF(Pike_interpreter_struct, catch_ctx),
ARG1_REG);
add_reg_imm_reg (ARG1_REG,
OFFSETOF(catch_context, recovery) +
OFFSETOF(JMP_BUF, recovery),
ARG1_REG);
mov_reg_mem (ARG1_REG,
Pike_interpreter_reg,
OFFSETOF(Pike_interpreter_struct, catching_eval_jmpbuf));
amd64_call_c_function (LOW_SETJMP_FUNC);
test_reg (P_REG_RAX);
jnz (&label_A);
jmp (&label_B);
LABEL_A;
amd64_call_c_function (handle_caught_exception);
mov_reg_reg(P_REG_RAX, P_REG_RBX);
mov_mem_reg (Pike_interpreter_reg,
OFFSETOF(Pike_interpreter_struct, catch_ctx),
P_REG_RAX);
test_reg (P_REG_RAX);
jz (&label_B);
add_reg_imm_reg (P_REG_RAX,
OFFSETOF(catch_context, recovery),
P_REG_RAX);
mov_mem_reg (Pike_interpreter_reg,
OFFSETOF(Pike_interpreter_struct, recoveries),
P_REG_RCX);
cmp_reg_reg(P_REG_RAX, P_REG_RCX);
jne (&label_B);
add_reg_imm_reg (P_REG_RAX,
OFFSETOF(JMP_BUF, recovery),
P_REG_RAX);
mov_reg_mem (P_REG_RAX,
Pike_interpreter_reg,
OFFSETOF(Pike_interpreter_struct, catching_eval_jmpbuf));
jmp (&label_C);
LABEL_B;
mov_imm_mem(0,
Pike_interpreter_reg,
OFFSETOF(Pike_interpreter_struct, catching_eval_jmpbuf));
LABEL_C;
jmp_reg(P_REG_RBX);
upd_pointer(base_addr - 4, PIKE_PC - base_addr);
|
21b911 | 2011-05-23 | Henrik Grubbström (Grubba) | | }
|
26da46 | 2017-02-21 | Martin Karlgren | | return;
|
85c1c1 | 2014-08-18 | Per Hedbor | |
case F_UNDEFINEDP:
{
LABELS();
ins_debug_instr_prologue(b, 0, 0);
amd64_load_sp_reg();
mov_mem32_reg( sp_reg, SVAL(-1).type, P_REG_RAX );
cmp_reg32_imm( P_REG_RAX, 1<<16 | PIKE_T_INT );
jne( &label_A );
mov_imm_mem( 1, sp_reg,SVAL(-1).value);
jmp( &label_B );
LABEL_A;
amd64_free_svalue_off( sp_reg, SVAL(-1).off,0 );
mov_imm_mem( 0, sp_reg,SVAL(-1).value);
LABEL_B;
mov_imm_mem( PIKE_T_INT, sp_reg,SVAL(-1).type);
}
return;
|
1af093 | 2012-06-22 | Per Hedbor | | case F_ZERO_TYPE:
{
LABELS();
|
c33ce9 | 2012-06-28 | Per Hedbor | | ins_debug_instr_prologue(b, 0, 0);
|
1af093 | 2012-06-22 | Per Hedbor | | amd64_load_sp_reg();
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem32_reg( sp_reg, -sizeof(struct svalue), P_REG_RAX );
|
1af093 | 2012-06-22 | Per Hedbor | |
|
85c1c1 | 2014-08-18 | Per Hedbor | | mov_reg32_reg( P_REG_RAX, P_REG_RBX );
and_reg32_imm( P_REG_RAX, 0x1f );
|
2fd805 | 2013-10-08 | Per Hedbor | | cmp_reg32_imm( P_REG_RAX, PIKE_T_INT );
|
1af093 | 2012-06-22 | Per Hedbor | | jne( &label_A );
|
2fd805 | 2013-10-08 | Per Hedbor | | shr_reg_imm( P_REG_RBX, 16 );
|
1af093 | 2012-06-22 | Per Hedbor | |
mov_imm_mem( PIKE_T_INT, sp_reg, -sizeof(struct svalue) );
|
545c23 | 2014-08-17 | Per Hedbor | | mov_reg_mem( P_REG_RBX, sp_reg,
|
1af093 | 2012-06-22 | Per Hedbor | | -sizeof(struct svalue)+OFFSETOF(svalue,u.integer) );
jmp( &label_B );
LABEL_A;
amd64_call_c_opcode( addr, flags );
LABEL_B;
}
return;
|
b40c77 | 2014-08-18 | Per Hedbor | |
|
fe5ef3 | 2014-09-14 | Per Hedbor | | case F_EQ:
case F_NE:
case F_LE:
case F_GE:
case F_LT:
case F_GT:
{
LABELS();
ins_debug_instr_prologue(b, 0, 0);
if_not_two_int(&label_A,1);
amd64_add_sp(-1);
clear_reg(P_REG_RCX);
cmp_reg_reg(P_REG_RBX, P_REG_RAX);
switch(b+F_OFFSET)
{
case F_GT: set_if_gt( P_REG_RCX); break;
case F_LT: set_if_lt( P_REG_RCX); break;
case F_LE: set_if_lte(P_REG_RCX );break;
case F_GE: set_if_gte(P_REG_RCX ); break;
case F_EQ: set_if_eq( P_REG_RCX ); break;
case F_NE: set_if_neq(P_REG_RCX ); break;
}
mov_imm_mem(PIKE_T_INT, sp_reg, SVAL(-1).type );
mov_reg_mem(P_REG_RCX, sp_reg, SVAL(-1).value );
jmp(&label_D);
LABEL_A;
amd64_call_c_opcode( addr, flags );
amd64_load_sp_reg();
LABEL_D;
}
return;
|
b40c77 | 2014-08-18 | Per Hedbor | | case F_ADD:
{
addr = f_add;
update_arg1(2);
amd64_call_c_opcode(addr, flags);
amd64_load_sp_reg();
}
return;
|
545c23 | 2014-08-17 | Per Hedbor | | 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 );
|
ad0d7e | 2014-08-28 | Per Hedbor | | add_reg32_reg32(P_REG_RAX,P_REG_RBX);
|
545c23 | 2014-08-17 | Per Hedbor | | 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 );
sub_reg_reg(P_REG_RCX,P_REG_RAX);
jno(&label_B);
LABEL_A;
amd64_call_c_opcode(o_subtract, flags);
amd64_load_sp_reg();
jmp(&label_C);
LABEL_B;
mov_reg_mem( P_REG_RCX, sp_reg,
-2*sizeof(struct svalue)+OFFSETOF(svalue,u.integer));
amd64_add_sp(-1);
LABEL_C;
}
return;
|
b40c77 | 2014-08-18 | Per Hedbor | |
|
eb42a1 | 2011-05-11 | Henrik Grubbström (Grubba) | | case F_UNDEFINED:
ins_debug_instr_prologue(b, 0, 0);
amd64_push_int(0, 1);
return;
case F_CONST0:
ins_debug_instr_prologue(b, 0, 0);
amd64_push_int(0, 0);
return;
case F_CONST1:
ins_debug_instr_prologue(b, 0, 0);
amd64_push_int(1, 0);
return;
case F_CONST_1:
ins_debug_instr_prologue(b, 0, 0);
amd64_push_int(-1, 0);
return;
case F_BIGNUM:
ins_debug_instr_prologue(b, 0, 0);
amd64_push_int(0x7fffffff, 0);
return;
case F_RETURN_1:
ins_f_byte(F_CONST1);
ins_f_byte(F_RETURN);
return;
case F_RETURN_0:
ins_f_byte(F_CONST0);
ins_f_byte(F_RETURN);
return;
|
ab7cf5 | 2011-05-24 | Henrik Grubbström (Grubba) | | case F_MARK:
case F_SYNCH_MARK:
ins_debug_instr_prologue(b, 0, 0);
amd64_mark(0);
return;
case F_MARK2:
ins_f_byte(F_MARK);
ins_f_byte(F_MARK);
return;
|
91080b | 2012-06-15 | Henrik Grubbström (Grubba) | | case F_MARK_AND_CONST0:
ins_f_byte(F_MARK);
ins_f_byte(F_CONST0);
return;
case F_MARK_AND_CONST1:
ins_f_byte(F_MARK);
ins_f_byte(F_CONST1);
return;
|
ab7cf5 | 2011-05-24 | Henrik Grubbström (Grubba) | | case F_POP_MARK:
ins_debug_instr_prologue(b, 0, 0);
amd64_pop_mark();
return;
|
9853bd | 2012-06-13 | Henrik Grubbström (Grubba) | | case F_POP_TO_MARK:
ins_debug_instr_prologue(b, 0, 0);
amd64_load_mark_sp_reg();
amd64_load_sp_reg();
amd64_pop_mark();
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg(mark_sp_reg, 0, P_REG_RBX);
|
9853bd | 2012-06-13 | Henrik Grubbström (Grubba) | | jmp(&label_A);
LABEL_B;
amd64_add_sp( -1 );
amd64_free_svalue( sp_reg, 0 );
|
c33ce9 | 2012-06-28 | Per Hedbor | | amd64_load_sp_reg();
|
9853bd | 2012-06-13 | Henrik Grubbström (Grubba) | | LABEL_A;
|
2fd805 | 2013-10-08 | Per Hedbor | | cmp_reg_reg(P_REG_RBX, sp_reg);
|
9853bd | 2012-06-13 | Henrik Grubbström (Grubba) | | jl(&label_B);
return;
|
6785ae | 2012-06-15 | Per Hedbor | |
|
622ebc | 2012-06-25 | Per Hedbor | |
|
6785ae | 2012-06-15 | Per Hedbor | | case F_RETURN:
case F_DUMB_RETURN:
{
LABELS();
|
c33ce9 | 2012-06-28 | Per Hedbor | | ins_debug_instr_prologue(b, 0, 0);
|
6785ae | 2012-06-15 | Per Hedbor | | amd64_load_fp_reg();
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem32_reg( fp_reg, OFFSETOF(pike_frame, flags), P_REG_RAX );
|
85c1c1 | 2014-08-18 | Per Hedbor | | and_reg32_imm( P_REG_RAX, PIKE_FRAME_RETURN_INTERNAL);
|
6785ae | 2012-06-15 | Per Hedbor | | jnz( &label_A );
LABEL_B;
flush_dirty_regs();
amd64_return_from_function();
|
f7202c | 2013-06-12 | Per Hedbor | |
|
6785ae | 2012-06-15 | Per Hedbor | | LABEL_A;
|
f7202c | 2013-06-12 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem32_reg( fp_reg, OFFSETOF(pike_frame, flags), P_REG_RAX );
|
85c1c1 | 2014-08-18 | Per Hedbor | | and_reg32_imm( P_REG_RAX, PIKE_FRAME_RETURN_POP );
|
f7202c | 2013-06-12 | Per Hedbor | | jnz( &label_C );
amd64_call_c_function( low_return );
jmp( &label_D );
|
6785ae | 2012-06-15 | Per Hedbor | |
|
f7202c | 2013-06-12 | Per Hedbor | | LABEL_C;
amd64_call_c_function( low_return_pop );
LABEL_D;
|
2cbc49 | 2017-02-21 | Martin Karlgren | | #ifdef MACHINE_CODE_STACK_FRAMES
amd64_pop_internal_c_frame();
#endif /* MACHINE_CODE_STACK_FRAMES */
|
f7202c | 2013-06-12 | Per Hedbor | | fp_reg = -1;
amd64_load_fp_reg();
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg( fp_reg, OFFSETOF(pike_frame, return_addr), P_REG_RAX );
jmp_reg( P_REG_RAX );
|
6785ae | 2012-06-15 | Per Hedbor | | }
return;
|
f7202c | 2013-06-12 | Per Hedbor | |
|
91080b | 2012-06-15 | Henrik Grubbström (Grubba) | | case F_CLEAR_STRING_SUBTYPE:
ins_debug_instr_prologue(b, 0, 0);
amd64_load_sp_reg();
|
a5cf65 | 2014-06-24 | Henrik Grubbström (Grubba) | | mov_mem32_reg(sp_reg, OFFSETOF(svalue, tu.t.type) - sizeof(struct svalue),
|
2fd805 | 2013-10-08 | Per Hedbor | | P_REG_RAX);
|
91080b | 2012-06-15 | Henrik Grubbström (Grubba) | |
|
2fd805 | 2013-10-08 | Per Hedbor | | cmp_reg32_imm(P_REG_RAX, (1<<16)|PIKE_T_STRING);
|
91080b | 2012-06-15 | Henrik Grubbström (Grubba) | | jne(&label_A);
|
85c1c1 | 2014-08-18 | Per Hedbor | | and_reg32_imm(P_REG_RAX, 0x1f);
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_reg_mem32(P_REG_RAX,
|
a5cf65 | 2014-06-24 | Henrik Grubbström (Grubba) | | sp_reg, OFFSETOF(svalue, tu.t.type) - sizeof(struct svalue));
|
91080b | 2012-06-15 | Henrik Grubbström (Grubba) | | LABEL_A;
return;
|
eb42a1 | 2011-05-11 | Henrik Grubbström (Grubba) | | }
|
2cbc49 | 2017-02-21 | Martin Karlgren | |
if (instrs[b].flags & I_RETURN) {
#ifdef MACHINE_CODE_STACK_FRAMES
amd64_load_fp_reg();
mov_mem32_reg(fp_reg, OFFSETOF(pike_frame, flags), P_REG_RBX);
#endif /* MACHINE_CODE_STACK_FRAMES */
}
|
719c3a | 2012-06-12 | Per Hedbor | | amd64_call_c_opcode(addr,flags);
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | |
if (instrs[b].flags & I_RETURN) {
|
719c3a | 2012-06-12 | Per Hedbor | | LABELS();
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | if ((b + F_OFFSET) == F_RETURN_IF_TRUE) {
|
719c3a | 2012-06-12 | Per Hedbor | | * PC + JUMP_EPILOGUE_SIZE. */
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_rip_imm_reg(JUMP_EPILOGUE_SIZE, P_REG_RCX);
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | }
|
2fd805 | 2013-10-08 | Per Hedbor | | cmp_reg_imm(P_REG_RAX, -1);
|
2cbc49 | 2017-02-21 | Martin Karlgren | | jne(&label_A);
|
6785ae | 2012-06-15 | Per Hedbor | | amd64_return_from_function();
|
2cbc49 | 2017-02-21 | Martin Karlgren | | LABEL_A;
|
719c3a | 2012-06-12 | Per Hedbor | |
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | if ((b + F_OFFSET) == F_RETURN_IF_TRUE) {
|
2fd805 | 2013-10-08 | Per Hedbor | | cmp_reg_reg( P_REG_RAX, P_REG_RCX );
|
2cbc49 | 2017-02-21 | Martin Karlgren | | je( &label_C );
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | }
|
2cbc49 | 2017-02-21 | Martin Karlgren | |
#ifdef MACHINE_CODE_STACK_FRAMES
and_reg32_imm(P_REG_RBX, PIKE_FRAME_RETURN_INTERNAL);
jz( &label_B );
amd64_pop_internal_c_frame();
LABEL_B;
#endif /* MACHINE_CODE_STACK_FRAMES */
jmp_reg(P_REG_RAX);
LABEL_C;
return;
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | }
|
2cbc49 | 2017-02-21 | Martin Karlgren | |
|
f78425 | 2011-05-11 | Henrik Grubbström (Grubba) | | if (flags & I_JUMP) {
|
2fd805 | 2013-10-08 | Per Hedbor | | jmp_reg(P_REG_RAX);
|
d1fa80 | 2011-05-09 | Henrik Grubbström (Grubba) | | }
|
799039 | 2006-04-27 | Tor Edvardsson | | }
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | int amd64_ins_f_jump(unsigned int op, int backward_jump)
{
int flags;
void *addr;
int off = op - F_OFFSET;
int ret = -1;
|
b505a7 | 2012-06-13 | Per Hedbor | | LABELS();
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | #ifdef PIKE_DEBUG
if(off>255)
Pike_error("Instruction too big %d\n",off);
#endif
flags = instrs[off].flags;
if (!(flags & I_BRANCH)) return -1;
|
6785ae | 2012-06-15 | Per Hedbor | | #define START_JUMP() do{ \
ins_debug_instr_prologue(off, 0, 0); \
if (backward_jump) { \
maybe_update_pc(); \
|
638a2c | 2012-07-16 | Per Hedbor | | amd64_ins_branch_check_threads_etc(0); \
|
6785ae | 2012-06-15 | Per Hedbor | | } \
} while(0)
|
b505a7 | 2012-06-13 | Per Hedbor | | switch( op )
{
|
99c1e9 | 2012-06-20 | Per Hedbor | | case F_QUICK_BRANCH_WHEN_ZERO:
case F_QUICK_BRANCH_WHEN_NON_ZERO:
START_JUMP();
amd64_load_sp_reg();
amd64_add_sp( -1 );
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg( sp_reg, 8, P_REG_RAX );
|
b40c77 | 2014-08-18 | Per Hedbor | | test_reg32(P_REG_RAX);
|
99c1e9 | 2012-06-20 | Per Hedbor | | if( op == F_QUICK_BRANCH_WHEN_ZERO )
return jz_imm_rel32(0);
return jnz_imm_rel32(0);
|
4ceb79 | 2012-06-22 | Per Hedbor | |
|
99c1e9 | 2012-06-20 | Per Hedbor | | case F_BRANCH_WHEN_ZERO:
case F_BRANCH_WHEN_NON_ZERO:
START_JUMP();
amd64_load_sp_reg();
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem8_reg( sp_reg, -sizeof(struct svalue), P_REG_RCX );
cmp_reg32_imm( P_REG_RCX, PIKE_T_INT ); je( &label_C );
mov_imm_reg( 1, P_REG_RAX );
shl_reg32_reg( P_REG_RAX, P_REG_RCX );
and_reg32_imm( P_REG_RAX, BIT_FUNCTION|BIT_OBJECT );
|
378ad0 | 2012-06-25 | Per Hedbor | | jnz( &label_A );
amd64_add_sp(-1);
|
2fd805 | 2013-10-08 | Per Hedbor | | amd64_free_svalue_type( sp_reg, P_REG_RCX, 0 );
mov_imm_reg( 1, P_REG_RBX );
|
378ad0 | 2012-06-25 | Per Hedbor | | jmp( &label_B );
|
4ceb79 | 2012-06-22 | Per Hedbor | | LABEL_A;
|
378ad0 | 2012-06-25 | Per Hedbor | |
|
4ceb79 | 2012-06-22 | Per Hedbor | | add_reg_imm_reg(sp_reg, -sizeof(struct svalue), ARG1_REG );
amd64_call_c_function(svalue_is_true);
|
c33ce9 | 2012-06-28 | Per Hedbor | | amd64_load_sp_reg();
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_reg_reg( P_REG_RAX, P_REG_RBX );
|
378ad0 | 2012-06-25 | Per Hedbor | | amd64_add_sp( -1 );
amd64_free_svalue( sp_reg, 0 );
|
99c1e9 | 2012-06-20 | Per Hedbor | | jmp( &label_B );
|
4ceb79 | 2012-06-22 | Per Hedbor | | LABEL_C;
mov_mem_reg( sp_reg,
-sizeof(struct svalue)+OFFSETOF(svalue,u.integer),
|
2fd805 | 2013-10-08 | Per Hedbor | | P_REG_RBX );
|
4ceb79 | 2012-06-22 | Per Hedbor | | amd64_add_sp(-1);
|
99c1e9 | 2012-06-20 | Per Hedbor | |
|
4ceb79 | 2012-06-22 | Per Hedbor | | LABEL_B;
|
67d80c | 2014-08-18 | Per Hedbor | | test_reg( P_REG_RBX );
|
99c1e9 | 2012-06-20 | Per Hedbor | | if( op == F_BRANCH_WHEN_ZERO )
return jz_imm_rel32(0);
return jnz_imm_rel32(0);
|
4ceb79 | 2012-06-22 | Per Hedbor | |
|
fdb214 | 2012-06-25 | Per Hedbor | | case F_FOREACH:
|
c33ce9 | 2012-06-28 | Per Hedbor | | START_JUMP();
|
fdb214 | 2012-06-25 | Per Hedbor | |
amd64_load_sp_reg();
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem8_reg( sp_reg, -4*sizeof(struct svalue), P_REG_RBX );
cmp_reg32_imm( P_REG_RBX, PIKE_T_ARRAY );
|
0b5735 | 2013-07-06 | Jonas Walldén | | je(&label_D);
amd64_call_c_opcode(instrs[off].address, flags);
|
13670c | 2015-05-25 | Martin Nilsson | |
|
0b5735 | 2013-07-06 | Jonas Walldén | | LABEL_D;
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg( sp_reg, -1*sizeof(struct svalue)+8, P_REG_RAX );
mov_mem_reg( sp_reg, -4*sizeof(struct svalue)+8, P_REG_RBX );
mov_mem32_reg( P_REG_RBX, OFFSETOF(array,size), P_REG_RCX );
cmp_reg_reg( P_REG_RAX, P_REG_RCX );
|
85524c | 2015-02-19 | Henrik Grubbström (Grubba) | | jge(&label_A);
|
fdb214 | 2012-06-25 | Per Hedbor | |
|
638a2c | 2012-07-16 | Per Hedbor | | add_mem_imm( sp_reg, -1*(int)sizeof(struct svalue)+8, 1 );
|
fdb214 | 2012-06-25 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg( P_REG_RBX, OFFSETOF(array,item), P_REG_RBX );
shl_reg_imm( P_REG_RAX, 4 );
add_reg_reg( P_REG_RBX, P_REG_RAX );
|
fdb214 | 2012-06-25 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem8_reg( sp_reg, -3*sizeof(struct svalue), P_REG_RAX );
cmp_reg_imm( P_REG_RAX,T_SVALUE_PTR);
|
fdb214 | 2012-06-25 | Per Hedbor | | jne( &label_C );
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg( sp_reg, -3*sizeof(struct svalue)+8, P_REG_RDX );
push( P_REG_RDX );
|
fdb214 | 2012-06-25 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | amd64_free_svalue( P_REG_RDX, 0 );
pop( P_REG_RDX );
|
fdb214 | 2012-06-25 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg( P_REG_RBX, 0, P_REG_RAX );
mov_mem_reg( P_REG_RBX, 8, P_REG_RCX );
mov_reg_mem( P_REG_RAX, P_REG_RDX, 0 );
mov_reg_mem( P_REG_RCX, P_REG_RDX, 8 );
|
fdb214 | 2012-06-25 | Per Hedbor | |
|
e30594 | 2014-08-08 | Per Hedbor | | and_reg32_imm( P_REG_RAX, MIN_REF_TYPE );
jz( &label_B );
|
2fd805 | 2013-10-08 | Per Hedbor | | add_imm_mem( 1, P_REG_RCX, OFFSETOF(pike_string, refs));
|
fdb214 | 2012-06-25 | Per Hedbor | | jmp( &label_B );
LABEL_C;
add_reg_imm_reg( sp_reg, -3*sizeof(struct svalue), ARG1_REG );
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_reg_reg( P_REG_RBX, ARG2_REG );
|
fdb214 | 2012-06-25 | Per Hedbor | | amd64_call_c_function( assign_lvalue );
jmp(&label_B);
LABEL_A;
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_imm_reg( 0, P_REG_RBX );
|
fdb214 | 2012-06-25 | Per Hedbor | | LABEL_B;
|
67d80c | 2014-08-18 | Per Hedbor | | test_reg(P_REG_RBX);
|
fdb214 | 2012-06-25 | Per Hedbor | | return jnz_imm_rel32(0);
|
b505a7 | 2012-06-13 | Per Hedbor | | case F_LOOP:
|
c33ce9 | 2012-06-28 | Per Hedbor | | START_JUMP();
|
6785ae | 2012-06-15 | Per Hedbor | |
amd64_load_sp_reg();
|
03120f | 2016-01-12 | Per Hedbor | | mov_mem32_reg( sp_reg, SVAL(-1).type, P_REG_RAX );
|
6785ae | 2012-06-15 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | cmp_reg32_imm( P_REG_RAX, PIKE_T_INT );
|
6785ae | 2012-06-15 | Per Hedbor | | jne( &label_A );
|
03120f | 2016-01-12 | Per Hedbor | |
mov_mem_reg( sp_reg, SVAL(-1).value, P_REG_RAX );
cmp_reg_imm(P_REG_RAX,0);
jle(&label_B);
|
6785ae | 2012-06-15 | Per Hedbor | |
|
03120f | 2016-01-12 | Per Hedbor | |
add_mem_imm( sp_reg, SVAL(-1).value, -1 );
|
6785ae | 2012-06-15 | Per Hedbor | |
|
1af093 | 2012-06-22 | Per Hedbor | |
|
6785ae | 2012-06-15 | Per Hedbor | | jmp( &label_C );
|
b505a7 | 2012-06-13 | Per Hedbor | |
LABEL_A;
|
6785ae | 2012-06-15 | Per Hedbor | | amd64_call_c_opcode(instrs[F_LOOP-F_OFFSET].address,
instrs[F_LOOP-F_OFFSET].flags );
|
0dbfff | 2015-07-07 | Arne Goedeke | | amd64_load_sp_reg();
|
6785ae | 2012-06-15 | Per Hedbor | | jmp( &label_C );
|
b505a7 | 2012-06-13 | Per Hedbor | |
|
6785ae | 2012-06-15 | Per Hedbor | |
|
b505a7 | 2012-06-13 | Per Hedbor | | LABEL_B;
|
6785ae | 2012-06-15 | Per Hedbor | | amd64_add_sp( -1 );
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_imm_reg(0, P_REG_RAX );
|
b505a7 | 2012-06-13 | Per Hedbor | |
LABEL_C;
|
2fd805 | 2013-10-08 | Per Hedbor | | test_reg( P_REG_RAX );
|
6785ae | 2012-06-15 | Per Hedbor | | return jnz_imm_rel32(0);
case F_BRANCH_WHEN_EQ:
case F_BRANCH_WHEN_NE:
|
c33ce9 | 2012-06-28 | Per Hedbor | | ins_debug_instr_prologue(op, 0, 0);
|
6785ae | 2012-06-15 | Per Hedbor | | amd64_load_sp_reg();
|
279d75 | 2014-08-11 | Per Hedbor | | mov_mem8_reg( sp_reg, -sizeof(struct svalue), P_REG_RCX );
mov_mem8_reg( sp_reg, -sizeof(struct svalue)*2,P_REG_RBX );
|
2fd805 | 2013-10-08 | Per Hedbor | | cmp_reg_reg( P_REG_RCX, P_REG_RBX );
|
6785ae | 2012-06-15 | Per Hedbor | | jnz( &label_A );
|
13670c | 2015-05-25 | Martin Nilsson | |
|
b01660 | 2012-07-19 | Jonas Walldén | |
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_imm_reg(1, P_REG_RBX);
shl_reg32_reg(P_REG_RBX, P_REG_RCX);
and_reg_imm(P_REG_RBX, (BIT_FUNCTION|BIT_OBJECT|BIT_FLOAT));
|
b01660 | 2012-07-19 | Jonas Walldén | | jnz( &label_A );
|
13670c | 2015-05-25 | Martin Nilsson | |
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg( sp_reg, -sizeof(struct svalue)+8, P_REG_RBX );
sub_reg_mem( P_REG_RBX, sp_reg, -sizeof(struct svalue)*2+8);
|
6785ae | 2012-06-15 | Per Hedbor | |
|
b01660 | 2012-07-19 | Jonas Walldén | | * simplified if they are <= max_ref_type */
|
2fd805 | 2013-10-08 | Per Hedbor | | cmp_reg32_imm( P_REG_RCX,MIN_REF_TYPE);
|
833cae | 2013-06-12 | Henrik Grubbström (Grubba) | | jge( &label_B );
|
b01660 | 2012-07-19 | Jonas Walldén | |
|
6785ae | 2012-06-15 | Per Hedbor | | amd64_add_sp( -2 );
jmp( &label_D );
LABEL_A;
amd64_call_c_opcode( instrs[F_BRANCH_WHEN_NE-F_OFFSET].address,
instrs[F_BRANCH_WHEN_NE-F_OFFSET].flags );
amd64_load_sp_reg();
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_reg_reg(P_REG_RAX, P_REG_RBX);
|
6785ae | 2012-06-15 | Per Hedbor | | jmp(&label_D);
LABEL_B;
amd64_add_sp( -2 );
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg( sp_reg, OFFSETOF(svalue,u.refs), P_REG_RAX );
add_mem32_imm( P_REG_RAX, OFFSETOF(pike_string,refs), -1 );
|
6785ae | 2012-06-15 | Per Hedbor | | jnz( &label_C );
mov_reg_reg( sp_reg, ARG1_REG );
amd64_call_c_function( really_free_svalue );
|
c33ce9 | 2012-06-28 | Per Hedbor | | amd64_load_sp_reg();
|
6785ae | 2012-06-15 | Per Hedbor | | LABEL_C;
add_reg_imm_reg( sp_reg, sizeof(struct svalue), ARG1_REG );
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg( ARG1_REG, OFFSETOF(svalue,u.refs), P_REG_RAX );
add_mem32_imm( P_REG_RAX, OFFSETOF(pike_string,refs), -1 );
|
6785ae | 2012-06-15 | Per Hedbor | | jnz( &label_D );
amd64_call_c_function( really_free_svalue );
LABEL_D;
|
2fd805 | 2013-10-08 | Per Hedbor | | test_reg(P_REG_RBX);
|
6785ae | 2012-06-15 | Per Hedbor | | if( op == F_BRANCH_WHEN_EQ )
return jz_imm_rel32(0);
return jnz_imm_rel32(0);
#if 0
case F_BRANCH_WHEN_LT:
case F_BRANCH_WHEN_GE:
case F_BRANCH_WHEN_GT:
case F_BRANCH_WHEN_LE:
#endif
case F_BRANCH:
START_JUMP();
add_to_program(0xe9);
|
cc7cf4 | 2015-10-14 | Martin Nilsson | | ret=(INT32) PIKE_PC;
|
6785ae | 2012-06-15 | Per Hedbor | | PUSH_INT(0);
return ret;
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | }
|
719c3a | 2012-06-12 | Per Hedbor | | maybe_update_pc();
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | addr=instrs[off].address;
|
719c3a | 2012-06-12 | Per Hedbor | | amd64_call_c_opcode(addr, flags);
|
622ebc | 2012-06-25 | Per Hedbor | |
|
6785ae | 2012-06-15 | Per Hedbor | | amd64_load_sp_reg();
|
2fd805 | 2013-10-08 | Per Hedbor | | test_reg(P_REG_RAX);
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | |
if (backward_jump) {
|
48f597 | 2011-05-23 | Henrik Grubbström (Grubba) | | INT32 skip;
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | add_to_program (0x74);
|
48f597 | 2011-05-23 | Henrik Grubbström (Grubba) | | add_to_program (0);
skip = (INT32)PIKE_PC;
|
638a2c | 2012-07-16 | Per Hedbor | | amd64_ins_branch_check_threads_etc(0);
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | add_to_program (0xe9);
|
cc7cf4 | 2015-10-14 | Martin Nilsson | | ret = (INT32) PIKE_PC;
|
48f597 | 2011-05-23 | Henrik Grubbström (Grubba) | | PUSH_INT (0);
Pike_compiler->new_program->program[skip-1] = ((INT32)PIKE_PC - skip);
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | }
else {
add_to_program (0x0f);
add_to_program (0x85);
|
cc7cf4 | 2015-10-14 | Martin Nilsson | | ret = (INT32) PIKE_PC;
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | PUSH_INT (0);
}
return ret;
}
|
d1fa80 | 2011-05-09 | Henrik Grubbström (Grubba) | | void ins_f_byte_with_arg(unsigned int a, INT32 b)
{
maybe_update_pc();
|
eb42a1 | 2011-05-11 | Henrik Grubbström (Grubba) | | switch(a) {
|
719c3a | 2012-06-12 | Per Hedbor | | case F_THIS_OBJECT:
if( b == 0 )
{
|
c33ce9 | 2012-06-28 | Per Hedbor | | ins_debug_instr_prologue(a-F_OFFSET, b, 0);
|
719c3a | 2012-06-12 | Per Hedbor | | amd64_push_this_object();
return;
}
|
1c1a24 | 2012-06-13 | Henrik Grubbström (Grubba) | | break;
|
2ce89e | 2014-08-31 | Per Hedbor | | case F_POP_N_ELEMS:
{
int i;
LABELS();
ins_debug_instr_prologue(a-F_OFFSET,b, 0);
amd64_load_sp_reg();
if( b < 3 )
{
for(i=0;i<b;i++)
amd64_free_svalue_off( sp_reg, SVAL(-1-i).off, 0 );
amd64_add_sp( -b );
return;
}
break;
}
return;
|
ea8268 | 2012-06-25 | Per Hedbor | | case F_RETURN_LOCAL:
ins_f_byte_with_arg( F_LOCAL, b );
ins_f_byte( F_DUMB_RETURN );
return;
|
888603 | 2012-06-25 | Per Hedbor | | case F_NEG_INT_INDEX:
{
LABELS();
|
c33ce9 | 2012-06-28 | Per Hedbor | | ins_debug_instr_prologue(a-F_OFFSET, b, 0);
|
888603 | 2012-06-25 | Per Hedbor | | amd64_load_sp_reg();
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem8_reg( sp_reg, -1*sizeof(struct svalue), P_REG_RAX );
cmp_reg32_imm( P_REG_RAX, PIKE_T_ARRAY );
|
888603 | 2012-06-25 | Per Hedbor | | jne( &label_A );
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg( sp_reg, -1*sizeof(struct svalue)+8, P_REG_RDX );
|
888603 | 2012-06-25 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem32_reg( P_REG_RDX, OFFSETOF(array,size), P_REG_RBX );
sub_reg_imm( P_REG_RBX, b );
|
888603 | 2012-06-25 | Per Hedbor | | js( &label_A );
|
2fd805 | 2013-10-08 | Per Hedbor | | shl_reg_imm( P_REG_RBX, 4 );
add_reg_mem( P_REG_RBX, P_REG_RDX, OFFSETOF(array,item) );
|
888603 | 2012-06-25 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | amd64_push_svaluep_to( P_REG_RBX, -1 );
|
888603 | 2012-06-25 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | add_mem32_imm( P_REG_RDX, OFFSETOF(array,refs), -1);
|
888603 | 2012-06-25 | Per Hedbor | | jnz( &label_C );
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_reg_reg( P_REG_RDX, ARG1_REG );
|
888603 | 2012-06-25 | Per Hedbor | | amd64_call_c_function(really_free_array);
jmp( &label_C );
LABEL_A;
update_arg1( b );
amd64_call_c_opcode(instrs[a-F_OFFSET].address,
instrs[a-F_OFFSET].flags);
LABEL_C;
}
return;
case F_POS_INT_INDEX:
{
LABELS();
|
c33ce9 | 2012-06-28 | Per Hedbor | | ins_debug_instr_prologue(a-F_OFFSET, b, 0);
|
888603 | 2012-06-25 | Per Hedbor | | amd64_load_sp_reg();
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem8_reg( sp_reg, -1*sizeof(struct svalue), P_REG_RAX );
cmp_reg32_imm( P_REG_RAX, PIKE_T_ARRAY );
|
888603 | 2012-06-25 | Per Hedbor | | jne( &label_A );
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg( sp_reg, -1*sizeof(struct svalue)+8, P_REG_RDX );
|
888603 | 2012-06-25 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem32_reg( P_REG_RDX, OFFSETOF(array,size), P_REG_RCX );
cmp_reg32_imm( P_REG_RCX, b );
|
bfca6c | 2013-06-19 | Henrik Grubbström (Grubba) | | jle( &label_A );
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_imm_reg( b * sizeof(struct svalue), P_REG_RBX);
add_reg_mem( P_REG_RBX, P_REG_RDX, OFFSETOF(array,item) );
|
888603 | 2012-06-25 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | amd64_push_svaluep_to( P_REG_RBX, -1 );
|
888603 | 2012-06-25 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | add_mem32_imm( P_REG_RDX, OFFSETOF(array,refs), -1);
|
888603 | 2012-06-25 | Per Hedbor | | jnz( &label_C );
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_reg_reg( P_REG_RDX, ARG1_REG );
|
888603 | 2012-06-25 | Per Hedbor | | amd64_call_c_function(really_free_array);
jmp( &label_C );
LABEL_A;
update_arg1( b );
amd64_call_c_opcode(instrs[a-F_OFFSET].address,
instrs[a-F_OFFSET].flags);
LABEL_C;
}
return;
case F_LOCAL_INDEX:
{
LABELS();
|
94040e | 2014-08-14 | Per Hedbor | | local[pike_sp[-1]]
|
888603 | 2012-06-25 | Per Hedbor | | */
|
c33ce9 | 2012-06-28 | Per Hedbor | | ins_debug_instr_prologue(a-F_OFFSET, b, 0);
|
888603 | 2012-06-25 | Per Hedbor | | amd64_load_sp_reg();
amd64_load_fp_reg();
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg( fp_reg, OFFSETOF(pike_frame,locals), P_REG_RDX);
add_reg_imm( P_REG_RDX, b*sizeof(struct svalue));
mov_mem8_reg( P_REG_RDX, 0, P_REG_RAX );
mov_mem8_reg( sp_reg, -1*sizeof(struct svalue), P_REG_RBX );
shl_reg_imm( P_REG_RAX, 8 );
add_reg_reg( P_REG_RAX, P_REG_RBX );
mov_mem_reg( sp_reg, -1*sizeof(struct svalue)+8, P_REG_RBX );
mov_mem_reg( P_REG_RDX, 8, P_REG_RCX );
cmp_reg32_imm( P_REG_RAX, (PIKE_T_ARRAY<<8)|PIKE_T_INT );
|
888603 | 2012-06-25 | Per Hedbor | | jne( &label_A );
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem32_reg( P_REG_RCX, OFFSETOF(array,size), P_REG_RDX );
cmp_reg32_imm( P_REG_RBX, 0 ); jge( &label_D );
|
888603 | 2012-06-25 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | add_reg_reg( P_REG_RBX, P_REG_RDX );
|
888603 | 2012-06-25 | Per Hedbor | |
LABEL_D;
|
2fd805 | 2013-10-08 | Per Hedbor | | cmp_reg32_imm( P_REG_RBX, 0 ); jl( &label_B );
cmp_reg_reg( P_REG_RBX, P_REG_RCX); jge( &label_B );
|
888603 | 2012-06-25 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg( P_REG_RCX, OFFSETOF(array,item), P_REG_RCX );
shl_reg_imm( P_REG_RBX, 4 );
add_reg_reg( P_REG_RBX, P_REG_RCX );
amd64_push_svaluep_to( P_REG_RBX, -1 );
|
888603 | 2012-06-25 | Per Hedbor | | jmp( &label_C );
LABEL_A;
#if 0
|
2fd805 | 2013-10-08 | Per Hedbor | | cmp_reg32_imm( P_REG_RAX, (PIKE_T_STRING<<8)|PIKE_T_INT );
|
888603 | 2012-06-25 | Per Hedbor | | jne( &label_B );
#endif
LABEL_B;
update_arg1(b);
amd64_call_c_opcode(instrs[a-F_OFFSET].address,
instrs[a-F_OFFSET].flags);
LABEL_C;
}
return;
|
2e82fb | 2014-08-31 | Per Hedbor | | case F_MULTIPLY_INT:
{
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 );
|
2ce89e | 2014-08-31 | Per Hedbor | | test_reg32(P_REG_RAX);
|
2e82fb | 2014-08-31 | Per Hedbor | | jnz(&label_A);
mov_imm_reg(b, P_REG_RAX);
mov_mem_reg(sp_reg, SVAL(-1).value, P_REG_RBX );
mul_reg_reg(P_REG_RBX,P_REG_RAX);
jo(&label_A);
mov_imm_mem(PIKE_T_INT, sp_reg, SVAL(-1).type);
mov_reg_mem(P_REG_RBX, sp_reg, SVAL(-1).value);
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;
|
ba5fbf | 2014-09-01 | Per Hedbor | |
case F_MOD_INT:
|
da865c | 2014-09-01 | Per Hedbor | | if( b < 0 )
break;
|
233cbc | 2015-04-25 | Henrik Grubbström (Grubba) | |
|
5f5084 | 2018-02-12 | Marcus Comstedt | |
|
233cbc | 2015-04-25 | Henrik Grubbström (Grubba) | |
|
2ce89e | 2014-08-31 | Per Hedbor | | case F_DIVIDE_INT:
{
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 )
{
|
da865c | 2014-09-01 | Per Hedbor | |
cmp_reg_imm(P_REG_RAX,-0x80000000);
jle(&label_A);
|
2ce89e | 2014-08-31 | Per Hedbor | | }
|
da865c | 2014-09-01 | Per Hedbor | |
|
2ce89e | 2014-08-31 | Per Hedbor | | {
|
da865c | 2014-09-01 | Per Hedbor | | cmp_reg_imm(P_REG_RAX, 0);
jl(&label_A);
|
2ce89e | 2014-08-31 | Per Hedbor | | }
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);
else
mov_reg_mem(P_REG_RAX, sp_reg, SVAL(-1).value);
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;
|
2e82fb | 2014-08-31 | Per Hedbor | |
|
156ab0 | 2014-08-31 | Per Hedbor | | case F_AND_INT:
{
LABELS();
|
2e82fb | 2014-08-31 | Per Hedbor | | ins_debug_instr_prologue(a-F_OFFSET,b, 0);
|
156ab0 | 2014-08-31 | Per Hedbor | | amd64_load_sp_reg();
mov_mem8_reg(sp_reg, SVAL(-1).type, P_REG_RAX );
|
2ce89e | 2014-08-31 | Per Hedbor | | test_reg32(P_REG_RAX);
|
156ab0 | 2014-08-31 | Per Hedbor | | jnz(&label_A);
|
13670c | 2015-05-25 | Martin Nilsson | |
|
156ab0 | 2014-08-31 | Per Hedbor | |
mov_mem_reg(sp_reg, SVAL(-1).value, P_REG_RAX );
and_reg_imm(P_REG_RAX,b);
mov_imm_mem(PIKE_T_INT,sp_reg,SVAL(-1).type);
|
36fea0 | 2014-08-31 | Per Hedbor | | mov_reg_mem(P_REG_RAX,sp_reg,SVAL(-1).value);
|
156ab0 | 2014-08-31 | Per Hedbor | | 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;
|
2ce89e | 2014-08-31 | Per Hedbor | | case F_XOR_INT:
{
LABELS();
amd64_load_sp_reg();
ins_debug_instr_prologue(a,b,0);
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);
mov_imm_reg(b,P_REG_RBX);
xor_reg_reg(P_REG_RAX,P_REG_RBX);
mov_imm_mem(PIKE_T_INT,sp_reg,SVAL(-1).type);
mov_reg_mem(P_REG_RBX,sp_reg,SVAL(-1).value);
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;
|
156ab0 | 2014-08-31 | Per Hedbor | | case F_OR_INT:
if( !b )
return;
{
LABELS();
|
2e82fb | 2014-08-31 | Per Hedbor | | ins_debug_instr_prologue(a-F_OFFSET, b, 0);
|
156ab0 | 2014-08-31 | Per Hedbor | | amd64_load_sp_reg();
mov_mem8_reg(sp_reg, SVAL(-1).type, P_REG_RAX );
|
2ce89e | 2014-08-31 | Per Hedbor | | test_reg32(P_REG_RAX);
|
156ab0 | 2014-08-31 | Per Hedbor | | jnz(&label_A);
|
ba5fbf | 2014-09-01 | Per Hedbor | |
|
156ab0 | 2014-08-31 | Per Hedbor | |
mov_mem_reg(sp_reg, SVAL(-1).value, P_REG_RAX );
or_reg_imm(P_REG_RAX,b);
mov_imm_mem(PIKE_T_INT,sp_reg,SVAL(-1).type);
mov_reg_mem(P_REG_RAX,sp_reg,SVAL(-1).value);
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;
|
a4cee8 | 2014-08-31 | Per Hedbor | | case F_LSH_INT:
if( b > 0 && b <= 63 )
{
LABELS();
|
2e82fb | 2014-08-31 | Per Hedbor | | ins_debug_instr_prologue(a-F_OFFSET, b, 0);
|
a4cee8 | 2014-08-31 | Per Hedbor | | amd64_load_sp_reg();
|
d1faf9 | 2014-08-31 | Per Hedbor | | mov_mem8_reg(sp_reg, SVAL(-1).type, P_REG_RAX );
|
a4cee8 | 2014-08-31 | Per Hedbor | | test_reg32(P_REG_RAX);
jz(&label_B);
|
2e82fb | 2014-08-31 | Per Hedbor | | LABEL_A;
|
a4cee8 | 2014-08-31 | Per Hedbor | | update_arg1(b);
amd64_call_c_opcode(instrs[a-F_OFFSET].address,
instrs[a-F_OFFSET].flags);
jmp(&label_C);
LABEL_B;
|
d1faf9 | 2014-08-31 | Per Hedbor | | mov_imm_mem(PIKE_T_INT,sp_reg,SVAL(-1).type);
mov_mem_reg( sp_reg, SVAL(-1).value, P_REG_RBX);
|
a4cee8 | 2014-08-31 | Per Hedbor | |
mov_reg_reg( P_REG_RBX, P_REG_RAX );
|
2e82fb | 2014-08-31 | Per Hedbor | | shl_reg_imm( P_REG_RBX, b);
|
a4cee8 | 2014-08-31 | Per Hedbor | | mov_reg_reg( P_REG_RBX, P_REG_RDX );
|
2e82fb | 2014-08-31 | Per Hedbor | | shr_reg_imm( P_REG_RDX, b );
|
a4cee8 | 2014-08-31 | Per Hedbor | | cmp_reg_reg( P_REG_RDX, P_REG_RAX );
jne( &label_A );
|
d1faf9 | 2014-08-31 | Per Hedbor | | mov_reg_mem( P_REG_RBX, sp_reg, SVAL(-1).value);
|
a4cee8 | 2014-08-31 | Per Hedbor | | LABEL_C;
|
d1faf9 | 2014-08-31 | Per Hedbor | | return;
|
a4cee8 | 2014-08-31 | Per Hedbor | | }
if(!b) return;
if( b < 0 )
yyerror("<< with negative constant\n");
break;
|
156ab0 | 2014-08-31 | Per Hedbor | | case F_RSH_INT:
|
a4cee8 | 2014-08-31 | Per Hedbor | | if( b > 0 && b <= 63 )
|
156ab0 | 2014-08-31 | Per Hedbor | | {
LABELS();
|
2e82fb | 2014-08-31 | Per Hedbor | | ins_debug_instr_prologue(a-F_OFFSET, b, 0);
|
156ab0 | 2014-08-31 | Per Hedbor | | amd64_load_sp_reg();
|
d1faf9 | 2014-08-31 | Per Hedbor | | mov_mem8_reg(sp_reg, SVAL(-1).type, P_REG_RAX );
|
2ce89e | 2014-08-31 | Per Hedbor | | test_reg32(P_REG_RAX);
|
156ab0 | 2014-08-31 | Per Hedbor | | jnz(&label_A);
mov_mem_reg( sp_reg, SVAL(-1).value, P_REG_RAX);
mov_imm_mem(PIKE_T_INT,sp_reg,SVAL(-1).type);
|
d1faf9 | 2014-08-31 | Per Hedbor | | shr_reg_imm( P_REG_RAX, b);
|
156ab0 | 2014-08-31 | Per Hedbor | | mov_reg_mem( P_REG_RAX, sp_reg, SVAL(-1).value);
jmp(&label_B);
LABEL_A;
update_arg1(b);
amd64_call_c_opcode(instrs[a-F_OFFSET].address,
instrs[a-F_OFFSET].flags);
|
1f5f65 | 2014-08-31 | Henrik Grubbström (Grubba) | | LABEL_B;
|
156ab0 | 2014-08-31 | Per Hedbor | | return;
}
if(!b) return;
if( b < 0 )
yyerror(">> with negative constant\n");
|
ba5fbf | 2014-09-01 | Per Hedbor | | break;
|
888603 | 2012-06-25 | Per Hedbor | |
|
156ab0 | 2014-08-31 | Per Hedbor | | case F_SUBTRACT_INT:
|
6785ae | 2012-06-15 | Per Hedbor | | case F_ADD_NEG_INT:
b = -b;
|
233cbc | 2015-04-25 | Henrik Grubbström (Grubba) | |
|
5f5084 | 2018-02-12 | Marcus Comstedt | |
|
233cbc | 2015-04-25 | Henrik Grubbström (Grubba) | |
|
6785ae | 2012-06-15 | Per Hedbor | | case F_ADD_INT:
{
LABELS();
|
c33ce9 | 2012-06-28 | Per Hedbor | | ins_debug_instr_prologue(a-F_OFFSET, b, 0);
|
6785ae | 2012-06-15 | Per Hedbor | | amd64_load_sp_reg();
|
ba5fbf | 2014-09-01 | Per Hedbor | | 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 );
|
2fd805 | 2013-10-08 | Per Hedbor | | add_reg_imm( P_REG_RAX, b );
|
6785ae | 2012-06-15 | Per Hedbor | | jo( &label_A );
|
ba5fbf | 2014-09-01 | Per Hedbor | | mov_imm_mem( PIKE_T_INT, sp_reg, SVAL(-1).type );
mov_reg_mem( P_REG_RAX, sp_reg, SVAL(-1).value );
|
6785ae | 2012-06-15 | Per Hedbor | | jmp(&label_B);
LABEL_A;
amd64_push_int(b,0);
update_arg1(2);
amd64_call_c_opcode( f_add, I_UPDATE_SP );
amd64_load_sp_reg();
LABEL_B;
}
return;
|
eb42a1 | 2011-05-11 | Henrik Grubbström (Grubba) | | case F_NUMBER:
|
ab7cf5 | 2011-05-24 | Henrik Grubbström (Grubba) | | ins_debug_instr_prologue(a-F_OFFSET, b, 0);
|
eb42a1 | 2011-05-11 | Henrik Grubbström (Grubba) | | amd64_push_int(b, 0);
return;
case F_NEG_NUMBER:
|
ab7cf5 | 2011-05-24 | Henrik Grubbström (Grubba) | | ins_debug_instr_prologue(a-F_OFFSET, b, 0);
|
eb42a1 | 2011-05-11 | Henrik Grubbström (Grubba) | | amd64_push_int(-(INT64)b, 0);
return;
|
ab7cf5 | 2011-05-24 | Henrik Grubbström (Grubba) | | case F_STRING:
ins_debug_instr_prologue(a-F_OFFSET, b, 0);
amd64_push_string(b, 0);
return;
case F_ARROW_STRING:
ins_debug_instr_prologue(a-F_OFFSET, b, 0);
amd64_push_string(b, 1);
return;
case F_MARK_AND_CONST0:
ins_f_byte(F_MARK);
ins_f_byte(F_CONST0);
return;
case F_MARK_AND_CONST1:
ins_f_byte(F_MARK);
ins_f_byte(F_CONST0);
return;
case F_MARK_AND_STRING:
ins_f_byte(F_MARK);
ins_f_byte_with_arg(F_STRING, b);
return;
case F_MARK_AND_GLOBAL:
ins_f_byte(F_MARK);
ins_f_byte_with_arg(F_GLOBAL, b);
return;
case F_MARK_AND_LOCAL:
ins_f_byte(F_MARK);
ins_f_byte_with_arg(F_LOCAL, b);
return;
case F_MARK_X:
ins_debug_instr_prologue(a-F_OFFSET, b, 0);
amd64_mark(b);
return;
|
9030f6 | 2011-05-26 | Henrik Grubbström (Grubba) | | case F_LFUN:
ins_debug_instr_prologue(a-F_OFFSET, b, 0);
amd64_push_local_function(b);
return;
|
719c3a | 2012-06-12 | Per Hedbor | |
case F_ASSIGN_LOCAL:
ins_debug_instr_prologue(a-F_OFFSET, b, 0);
|
fd1b5a | 2012-06-19 | Henrik Grubbström (Grubba) | | amd64_load_sp_reg();
|
719c3a | 2012-06-12 | Per Hedbor | | amd64_assign_local(b);
add_reg_imm_reg(sp_reg, -sizeof(struct svalue), ARG1_REG);
|
b505a7 | 2012-06-13 | Per Hedbor | | amd64_ref_svalue(ARG1_REG, 0);
|
719c3a | 2012-06-12 | Per Hedbor | | return;
case F_ASSIGN_LOCAL_AND_POP:
ins_debug_instr_prologue(a-F_OFFSET, b, 0);
amd64_assign_local(b);
amd64_add_sp(-1);
return;
|
83b92e | 2014-08-16 | Per Hedbor | |
|
4ec32c | 2014-08-07 | Per Hedbor | | case F_ASSIGN_PRIVATE_GLOBAL_AND_POP:
case F_ASSIGN_PRIVATE_GLOBAL:
|
2ee7d1 | 2014-08-11 | Per Hedbor | | {
LABELS();
|
4ec32c | 2014-08-07 | Per Hedbor | | ins_debug_instr_prologue(a-F_OFFSET, b, 0);
amd64_get_storage( P_REG_RBX, b );
|
2ee7d1 | 2014-08-11 | Per Hedbor | |
mov_mem_reg( fp_reg, OFFSETOF(pike_frame,current_object), ARG1_REG );
mov_mem_reg( ARG1_REG, OFFSETOF(object,prog), P_REG_RAX );
test_reg(P_REG_RAX);
jnz(&label_A);
|
36e082 | 2014-08-11 | Per Hedbor | | * Note: Only arg1 is correct here (points to the destructed object)
|
2ee7d1 | 2014-08-11 | Per Hedbor | | */
amd64_call_c_function(object_low_set_index);
LABEL_A;
|
4ec32c | 2014-08-07 | Per Hedbor | | amd64_free_svalue( P_REG_RBX, 0 );
amd64_load_sp_reg();
if( a == F_ASSIGN_PRIVATE_GLOBAL_AND_POP )
{
amd64_add_sp(-1);
amd64_assign_svalue_no_free( P_REG_RBX, sp_reg, 0);
}
else
{
amd64_assign_svalue_no_free( P_REG_RBX, sp_reg, -sizeof(struct svalue));
|
2ee7d1 | 2014-08-11 | Per Hedbor | | amd64_ref_svalue(P_REG_RBX,0);
|
4ec32c | 2014-08-07 | Per Hedbor | | }
|
2ee7d1 | 2014-08-11 | Per Hedbor | | }
|
36e082 | 2014-08-11 | Per Hedbor | | return;
|
4ec32c | 2014-08-07 | Per Hedbor | |
|
719c3a | 2012-06-12 | Per Hedbor | | case F_ASSIGN_GLOBAL:
case F_ASSIGN_GLOBAL_AND_POP:
ins_debug_instr_prologue(a-F_OFFSET, b, 0);
amd64_load_fp_reg();
amd64_load_sp_reg();
mov_mem_reg(fp_reg, OFFSETOF(pike_frame, current_object), ARG1_REG);
mov_mem_reg(fp_reg, OFFSETOF(pike_frame,context), ARG2_REG);
mov_mem16_reg(ARG2_REG, OFFSETOF(inherit, identifier_level), ARG2_REG);
add_reg_imm( ARG2_REG, b );
add_reg_imm_reg( sp_reg, -sizeof(struct svalue), ARG3_REG );
amd64_call_c_function( object_low_set_index );
if( a == F_ASSIGN_GLOBAL_AND_POP )
{
|
c33ce9 | 2012-06-28 | Per Hedbor | | amd64_load_sp_reg();
|
719c3a | 2012-06-12 | Per Hedbor | | amd64_add_sp( -1 );
amd64_free_svalue( sp_reg, 1 );
}
return;
case F_SIZEOF_LOCAL:
{
LABELS();
|
5c82f4 | 2012-06-13 | Henrik Grubbström (Grubba) | | ins_debug_instr_prologue(a-F_OFFSET, b, 0);
|
719c3a | 2012-06-12 | Per Hedbor | | amd64_load_fp_reg();
amd64_load_sp_reg();
mov_mem_reg( fp_reg, OFFSETOF(pike_frame,locals), ARG1_REG);
add_reg_imm( ARG1_REG, b*sizeof(struct svalue));
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_sval_type( ARG1_REG, P_REG_RAX );
|
719c3a | 2012-06-12 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | cmp_reg32_imm( P_REG_RAX, PIKE_T_ARRAY );
|
719c3a | 2012-06-12 | Per Hedbor | | jne( &label_A );
mov_mem_reg( ARG1_REG, OFFSETOF(svalue, u.array ), ARG1_REG);
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem32_reg( ARG1_REG,OFFSETOF(array, size), P_REG_RAX );
|
719c3a | 2012-06-12 | Per Hedbor | | jmp( &label_C );
LABEL_A;
|
2fd805 | 2013-10-08 | Per Hedbor | | cmp_reg32_imm( P_REG_RAX, PIKE_T_STRING );
|
719c3a | 2012-06-12 | Per Hedbor | | jne( &label_B );
mov_mem_reg( ARG1_REG, OFFSETOF(svalue, u.string ), ARG1_REG);
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem32_reg( ARG1_REG,OFFSETOF(pike_string, len ), P_REG_RAX );
|
719c3a | 2012-06-12 | Per Hedbor | | jmp( &label_C );
LABEL_B;
amd64_call_c_function( pike_sizeof );
LABEL_C;
|
2fd805 | 2013-10-08 | Per Hedbor | | amd64_push_int_reg( P_REG_RAX );
|
719c3a | 2012-06-12 | Per Hedbor | | }
return;
|
956b12 | 2014-09-23 | Per Hedbor | | case F_SIZEOF_LOCAL_STRING:
{
LABELS();
ins_debug_instr_prologue(a-F_OFFSET, b, 0);
amd64_load_fp_reg();
amd64_load_sp_reg();
mov_mem_reg( fp_reg, OFFSETOF(pike_frame,locals), ARG1_REG);
add_reg_imm( ARG1_REG, b*sizeof(struct svalue));
mov_sval_type( ARG1_REG, P_REG_RAX );
mov_mem_reg( ARG1_REG, OFFSETOF(svalue, u.string ), P_REG_RBX);
cmp_reg32_imm( P_REG_RAX, PIKE_T_STRING );
je( &label_B );
amd64_call_c_function( pike_sizeof );
|
be07b0 | 2014-09-23 | Per Hedbor | | jmp( &label_A );
|
956b12 | 2014-09-23 | Per Hedbor | | LABEL_B;
mov_mem32_reg( P_REG_RBX,OFFSETOF(pike_string, len ), P_REG_RAX );
|
011cb4 | 2014-09-23 | Per Hedbor | | LABEL_A;
|
956b12 | 2014-09-23 | Per Hedbor | | amd64_push_int_reg( P_REG_RAX );
}
return;
|
4ec32c | 2014-08-07 | Per Hedbor | | case F_PRIVATE_GLOBAL:
ins_debug_instr_prologue(a-F_OFFSET, b, 0);
amd64_load_sp_reg();
amd64_get_storage( P_REG_RBX, b );
amd64_push_svaluep( P_REG_RBX );
return;
|
9030f6 | 2011-05-26 | Henrik Grubbström (Grubba) | | case F_GLOBAL:
ins_debug_instr_prologue(a-F_OFFSET, b, 0);
amd64_load_fp_reg();
amd64_load_sp_reg();
|
719c3a | 2012-06-12 | Per Hedbor | | mov_mem_reg(fp_reg, OFFSETOF(pike_frame, context), ARG3_REG);
mov_mem_reg(fp_reg, OFFSETOF(pike_frame, current_object),
|
9030f6 | 2011-05-26 | Henrik Grubbström (Grubba) | | ARG2_REG);
|
719c3a | 2012-06-12 | Per Hedbor | | mov_reg_reg(sp_reg, ARG1_REG);
|
4ceb79 | 2012-06-22 | Per Hedbor | | mov_mem16_reg(ARG3_REG, OFFSETOF(inherit, identifier_level),
|
719c3a | 2012-06-12 | Per Hedbor | | ARG3_REG);
add_reg_imm(ARG3_REG, b);
|
83b92e | 2014-08-16 | Per Hedbor | | amd64_call_c_function(low_object_index_no_free);
|
719c3a | 2012-06-12 | Per Hedbor | | amd64_add_sp(1);
|
9030f6 | 2011-05-26 | Henrik Grubbström (Grubba) | | return;
|
719c3a | 2012-06-12 | Per Hedbor | |
|
9030f6 | 2011-05-26 | Henrik Grubbström (Grubba) | | case F_LOCAL:
ins_debug_instr_prologue(a-F_OFFSET, b, 0);
amd64_load_fp_reg();
amd64_load_sp_reg();
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg(fp_reg, OFFSETOF(pike_frame, locals), P_REG_RCX);
add_reg_imm(P_REG_RCX, b*sizeof(struct svalue));
amd64_push_svaluep(P_REG_RCX);
|
9030f6 | 2011-05-26 | Henrik Grubbström (Grubba) | | return;
|
719c3a | 2012-06-12 | Per Hedbor | |
|
91080b | 2012-06-15 | Henrik Grubbström (Grubba) | | case F_CLEAR_LOCAL:
|
6b2638 | 2014-08-15 | Per Hedbor | | ins_f_byte_with_2_args( F_CLEAR_N_LOCAL, b, 1 );
|
91080b | 2012-06-15 | Henrik Grubbström (Grubba) | | return;
case F_INC_LOCAL_AND_POP:
{
LABELS();
ins_debug_instr_prologue(a-F_OFFSET, b, 0);
amd64_load_fp_reg();
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg(fp_reg, OFFSETOF(pike_frame, locals), P_REG_RCX);
add_reg_imm(P_REG_RCX, b*sizeof(struct svalue));
mov_sval_type(P_REG_RCX, P_REG_RAX);
cmp_reg32_imm(P_REG_RAX, PIKE_T_INT);
|
91080b | 2012-06-15 | Henrik Grubbström (Grubba) | | jne(&label_A);
|
a5cf65 | 2014-06-24 | Henrik Grubbström (Grubba) | | mov_reg_mem32(P_REG_RAX, P_REG_RCX, OFFSETOF(svalue, tu.t.type));
|
2fd805 | 2013-10-08 | Per Hedbor | | add_imm_mem(1, P_REG_RCX, OFFSETOF(svalue, u.integer));
|
ec9691 | 2012-06-17 | Henrik Grubbström (Grubba) | | jno(&label_B);
|
2fd805 | 2013-10-08 | Per Hedbor | | add_imm_mem(-1, P_REG_RCX, OFFSETOF(svalue, u.integer));
|
91080b | 2012-06-15 | Henrik Grubbström (Grubba) | | LABEL_A;
update_arg1(b);
amd64_call_c_opcode(instrs[a-F_OFFSET].address,
instrs[a-F_OFFSET].flags);
LABEL_B;
}
return;
|
b66959 | 2012-06-19 | Henrik Grubbström (Grubba) | | case F_INC_LOCAL:
ins_f_byte_with_arg(F_INC_LOCAL_AND_POP, b);
ins_f_byte_with_arg(F_LOCAL, b);
return;
case F_POST_INC_LOCAL:
ins_f_byte_with_arg(F_LOCAL, b);
ins_f_byte_with_arg(F_INC_LOCAL_AND_POP, b);
return;
|
91080b | 2012-06-15 | Henrik Grubbström (Grubba) | | case F_DEC_LOCAL_AND_POP:
{
LABELS();
ins_debug_instr_prologue(a-F_OFFSET, b, 0);
amd64_load_fp_reg();
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg(fp_reg, OFFSETOF(pike_frame, locals), P_REG_RCX);
add_reg_imm(P_REG_RCX, b*sizeof(struct svalue));
mov_sval_type(P_REG_RCX, P_REG_RAX);
cmp_reg32_imm(P_REG_RAX, PIKE_T_INT);
|
91080b | 2012-06-15 | Henrik Grubbström (Grubba) | | jne(&label_A);
|
a5cf65 | 2014-06-24 | Henrik Grubbström (Grubba) | | mov_reg_mem32(P_REG_RAX, P_REG_RCX, OFFSETOF(svalue, tu.t.type));
|
2fd805 | 2013-10-08 | Per Hedbor | | add_imm_mem(-1, P_REG_RCX, OFFSETOF(svalue, u.integer));
|
ec9691 | 2012-06-17 | Henrik Grubbström (Grubba) | | jno(&label_B);
|
2fd805 | 2013-10-08 | Per Hedbor | | add_imm_mem(1, P_REG_RCX, OFFSETOF(svalue, u.integer));
|
91080b | 2012-06-15 | Henrik Grubbström (Grubba) | | LABEL_A;
update_arg1(b);
amd64_call_c_opcode(instrs[a-F_OFFSET].address,
instrs[a-F_OFFSET].flags);
LABEL_B;
}
return;
|
b66959 | 2012-06-19 | Henrik Grubbström (Grubba) | | case F_DEC_LOCAL:
ins_f_byte_with_arg(F_DEC_LOCAL_AND_POP, b);
ins_f_byte_with_arg(F_LOCAL, b);
return;
case F_POST_DEC_LOCAL:
ins_f_byte_with_arg(F_LOCAL, b);
ins_f_byte_with_arg(F_DEC_LOCAL_AND_POP, b);
return;
|
ea8268 | 2012-06-25 | Per Hedbor | | #if 0
case F_LTOSVAL_CALL_BUILTIN_AND_ASSIGN_POP:
case F_LTOSVAL_CALL_BUILTIN_AND_ASSIGN:
return;
#endif
|
622ebc | 2012-06-25 | Per Hedbor | | case F_CALL_BUILTIN_AND_POP:
ins_f_byte_with_arg( F_CALL_BUILTIN, b );
ins_f_byte( F_POP_VALUE );
return;
case F_MARK_CALL_BUILTIN_AND_RETURN:
ins_f_byte_with_arg( F_MARK_CALL_BUILTIN, b );
ins_f_byte( F_DUMB_RETURN );
return;
case F_MARK_CALL_BUILTIN_AND_POP:
ins_f_byte_with_arg( F_MARK_CALL_BUILTIN, b );
ins_f_byte( F_POP_VALUE );
return;
case F_CALL_BUILTIN1_AND_POP:
ins_f_byte_with_arg( F_CALL_BUILTIN1, b );
ins_f_byte( F_POP_VALUE );
return;
case F_CALL_BUILTIN_AND_RETURN:
ins_f_byte_with_arg( F_CALL_BUILTIN, b );
ins_f_byte( F_DUMB_RETURN );
return;
case F_CALL_BUILTIN:
ins_debug_instr_prologue(a-F_OFFSET, b, 0);
amd64_load_mark_sp_reg();
amd64_load_sp_reg();
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg( mark_sp_reg, -sizeof(struct svalue*), P_REG_RAX );
|
622ebc | 2012-06-25 | Per Hedbor | | amd64_add_mark_sp( -1 );
mov_reg_reg( sp_reg, ARG1_REG );
|
2fd805 | 2013-10-08 | Per Hedbor | | sub_reg_reg( ARG1_REG, P_REG_RAX );
|
622ebc | 2012-06-25 | Per Hedbor | | shr_reg_imm( ARG1_REG, 4 );
|
5f5084 | 2018-02-12 | Marcus Comstedt | |
|
233cbc | 2015-04-25 | Henrik Grubbström (Grubba) | |
|
622ebc | 2012-06-25 | Per Hedbor | | case F_MARK_CALL_BUILTIN:
if(a == F_MARK_CALL_BUILTIN )
{
|
e515b8 | 2014-12-06 | Henrik Grubbström (Grubba) | | ins_debug_instr_prologue(a-F_OFFSET, b, 0);
|
622ebc | 2012-06-25 | Per Hedbor | | mov_imm_reg( 0, ARG1_REG );
}
|
5f5084 | 2018-02-12 | Marcus Comstedt | |
|
233cbc | 2015-04-25 | Henrik Grubbström (Grubba) | |
|
622ebc | 2012-06-25 | Per Hedbor | | case F_CALL_BUILTIN1:
if(a == F_CALL_BUILTIN1 )
{
|
e515b8 | 2014-12-06 | Henrik Grubbström (Grubba) | | ins_debug_instr_prologue(a-F_OFFSET, b, 0);
|
622ebc | 2012-06-25 | Per Hedbor | | mov_imm_reg( 1, ARG1_REG );
}
|
1807c0 | 2014-07-15 | Per Hedbor | |
|
e515b8 | 2014-12-06 | Henrik Grubbström (Grubba) | |
|
622ebc | 2012-06-25 | Per Hedbor | | amd64_call_c_opcode(Pike_compiler->new_program->constants[b].sval.u.efun->function,
I_UPDATE_SP);
return;
|
719c3a | 2012-06-12 | Per Hedbor | | case F_CONSTANT:
|
dca952 | 2015-09-06 | Per Hedbor | | {
struct svalue *cval = &Pike_compiler->new_program->constants[b].sval;
|
2bb787 | 2015-09-07 | Per Hedbor | | ins_debug_instr_prologue(a-F_OFFSET, b, 0);
if( TYPEOF(*cval) == PIKE_T_INT &&
SUBTYPEOF(*cval) == NUMBER_UNDEFINED)
|
dca952 | 2015-09-06 | Per Hedbor | | {
|
2bb787 | 2015-09-07 | Per Hedbor | | amd64_load_fp_reg();
amd64_load_sp_reg();
mov_mem_reg( fp_reg, OFFSETOF(pike_frame,context), P_REG_RCX );
mov_mem_reg( P_REG_RCX, OFFSETOF(inherit,prog), P_REG_RCX );
mov_mem_reg( P_REG_RCX, OFFSETOF(program,constants), P_REG_RCX );
add_reg_imm( P_REG_RCX, b*sizeof(struct program_constant) +
OFFSETOF(program_constant,sval) );
amd64_push_svaluep( P_REG_RCX );
|
dca952 | 2015-09-06 | Per Hedbor | | }
else
{
|
2bb787 | 2015-09-07 | Per Hedbor | | amd64_load_sp_reg();
mov_imm_mem(cval->tu.type_subtype, sp_reg, SVAL(0).type);
if( TYPEOF(*cval) >= MIN_REF_TYPE )
{
mov_imm_reg(cval->u.integer, P_REG_RCX);
mov_reg_mem(P_REG_RCX, sp_reg, SVAL(0).value);
add_imm_mem( 1, P_REG_RCX, OFFSETOF(pike_string, refs));
}
else
{
mov_imm_mem(cval->u.integer, sp_reg, SVAL(0).value);
}
amd64_add_sp(1);
|
dca952 | 2015-09-06 | Per Hedbor | | }
}
|
719c3a | 2012-06-12 | Per Hedbor | | return;
case F_GLOBAL_LVALUE:
ins_debug_instr_prologue(a-F_OFFSET, b, 0);
amd64_load_fp_reg();
amd64_load_sp_reg();
amd64_push_this_object( );
|
a5cf65 | 2014-06-24 | Henrik Grubbström (Grubba) | | mov_imm_mem( T_OBJ_INDEX, sp_reg, OFFSETOF(svalue, tu.t.type));
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg(fp_reg, OFFSETOF(pike_frame, context), P_REG_RAX);
mov_mem16_reg( P_REG_RAX,OFFSETOF(inherit, identifier_level), P_REG_RAX);
add_reg_imm( P_REG_RAX, b );
mov_reg_mem( P_REG_RAX, sp_reg, OFFSETOF(svalue,u.identifier) );
|
719c3a | 2012-06-12 | Per Hedbor | | amd64_add_sp( 1 );
return;
case F_LOCAL_LVALUE:
ins_debug_instr_prologue(a-F_OFFSET, b, 0);
amd64_load_fp_reg();
amd64_load_sp_reg();
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg( fp_reg, OFFSETOF(pike_frame, locals), P_REG_RAX);
add_reg_imm( P_REG_RAX, b*sizeof(struct svalue));
|
719c3a | 2012-06-12 | Per Hedbor | |
|
a5cf65 | 2014-06-24 | Henrik Grubbström (Grubba) | | mov_imm_mem( T_SVALUE_PTR, sp_reg, OFFSETOF(svalue, tu.t.type));
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_reg_mem( P_REG_RAX, sp_reg, OFFSETOF(svalue,u.lval) );
|
a5cf65 | 2014-06-24 | Henrik Grubbström (Grubba) | | mov_imm_mem( T_VOID, sp_reg,
OFFSETOF(svalue, tu.t.type)+sizeof(struct svalue));
|
719c3a | 2012-06-12 | Per Hedbor | | amd64_add_sp( 2 );
return;
|
5151e5 | 2012-06-10 | Henrik Grubbström (Grubba) | | case F_MARK_AT:
ins_debug_instr_prologue(a-F_OFFSET, b, 0);
amd64_load_fp_reg();
amd64_load_mark_sp_reg();
|
719c3a | 2012-06-12 | Per Hedbor | | mov_mem_reg(fp_reg, OFFSETOF(pike_frame, locals), ARG1_REG);
|
5151e5 | 2012-06-10 | Henrik Grubbström (Grubba) | | if (b) {
|
719c3a | 2012-06-12 | Per Hedbor | | add_reg_imm_reg(ARG1_REG, sizeof(struct svalue) * b, ARG1_REG);
|
5151e5 | 2012-06-10 | Henrik Grubbström (Grubba) | | }
|
719c3a | 2012-06-12 | Per Hedbor | | mov_reg_mem(ARG1_REG, mark_sp_reg, 0x00);
|
1af093 | 2012-06-22 | Per Hedbor | | amd64_add_mark_sp( 1 );
|
5151e5 | 2012-06-10 | Henrik Grubbström (Grubba) | | return;
|
eb42a1 | 2011-05-11 | Henrik Grubbström (Grubba) | | }
|
d1fa80 | 2011-05-09 | Henrik Grubbström (Grubba) | | update_arg1(b);
ins_f_byte(a);
|
799039 | 2006-04-27 | Tor Edvardsson | | }
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | int amd64_ins_f_jump_with_arg(unsigned int op, INT32 a, int backward_jump)
{
|
719c3a | 2012-06-12 | Per Hedbor | | LABELS();
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | if (!(instrs[op - F_OFFSET].flags & I_BRANCH)) return -1;
|
719c3a | 2012-06-12 | Per Hedbor | |
switch( op )
{
|
94040e | 2014-08-14 | Per Hedbor | |
|
719c3a | 2012-06-12 | Per Hedbor | | case F_BRANCH_IF_NOT_LOCAL:
case F_BRANCH_IF_LOCAL:
ins_debug_instr_prologue(op-F_OFFSET, a, 0);
amd64_load_fp_reg();
|
4ceb79 | 2012-06-22 | Per Hedbor | | mov_mem_reg( fp_reg, OFFSETOF(pike_frame, locals), ARG1_REG);
add_reg_imm( ARG1_REG, a*sizeof(struct svalue));
|
719c3a | 2012-06-12 | Per Hedbor | | u.integer -> RAX
|
4ceb79 | 2012-06-22 | Per Hedbor | | else if( type == PIKE_T_OBJECT || type == PIKE_T_FUNCTION )
call svalue_is_true(&local)
|
1af093 | 2012-06-22 | Per Hedbor | | else
1 -> RAX
|
4ceb79 | 2012-06-22 | Per Hedbor | |
The tests are ordered assuming integers are most commonly
checked. That is not nessasarily true.
|
719c3a | 2012-06-12 | Per Hedbor | | */
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_sval_type( ARG1_REG, P_REG_RCX );
|
67d80c | 2014-08-18 | Per Hedbor | | cmp_reg32_imm( P_REG_RCX, PIKE_T_INT );
je( &label_C );
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_imm_reg( 1, P_REG_RAX );
shl_reg32_reg( P_REG_RAX, P_REG_RCX );
and_reg32_imm( P_REG_RAX, BIT_FUNCTION|BIT_OBJECT );
|
378ad0 | 2012-06-25 | Per Hedbor | | jnz( &label_A );
|
4ceb79 | 2012-06-22 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_imm_reg( 1, P_REG_RAX );
|
719c3a | 2012-06-12 | Per Hedbor | | jmp( &label_B );
|
378ad0 | 2012-06-25 | Per Hedbor | | LABEL_A;
|
4ceb79 | 2012-06-22 | Per Hedbor | | amd64_call_c_function(svalue_is_true);
jmp( &label_B );
LABEL_C;
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg( ARG1_REG, OFFSETOF(svalue, u.integer ), P_REG_RAX );
|
4ceb79 | 2012-06-22 | Per Hedbor | |
|
719c3a | 2012-06-12 | Per Hedbor | | LABEL_B;
|
2fd805 | 2013-10-08 | Per Hedbor | | test_reg( P_REG_RAX );
|
719c3a | 2012-06-12 | Per Hedbor | | if( op == F_BRANCH_IF_LOCAL )
return jnz_imm_rel32(0);
return jz_imm_rel32(0);
}
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | maybe_update_pc();
update_arg1(a);
return amd64_ins_f_jump(op, backward_jump);
}
|
d1fa80 | 2011-05-09 | Henrik Grubbström (Grubba) | | void ins_f_byte_with_2_args(unsigned int a, INT32 b, INT32 c)
{
maybe_update_pc();
|
eb42a1 | 2011-05-11 | Henrik Grubbström (Grubba) | | switch(a) {
case F_NUMBER64:
|
ab7cf5 | 2011-05-24 | Henrik Grubbström (Grubba) | | ins_debug_instr_prologue(a-F_OFFSET, b, c);
|
30f5b2 | 2016-04-09 | Martin Nilsson | | amd64_push_int((((UINT64)b)<<32)|(unsigned INT32)c, 0);
|
eb42a1 | 2011-05-11 | Henrik Grubbström (Grubba) | | return;
|
ab7cf5 | 2011-05-24 | Henrik Grubbström (Grubba) | | case F_MARK_AND_EXTERNAL:
ins_f_byte(F_MARK);
ins_f_byte_with_2_args(F_EXTERNAL, b, c);
return;
|
6b2638 | 2014-08-15 | Per Hedbor | |
case F_CLEAR_N_LOCAL:
{
LABELS();
|
a92d45 | 2014-08-18 | Per Hedbor | | ins_debug_instr_prologue(a-F_OFFSET, b, c);
|
6b2638 | 2014-08-15 | Per Hedbor | | amd64_load_fp_reg();
mov_mem_reg(fp_reg, OFFSETOF(pike_frame, locals), P_REG_RBX);
add_reg_imm(P_REG_RBX, b*sizeof(struct svalue));
|
2cbc49 | 2017-02-21 | Martin Karlgren | | if( c > 1 ) {
push(P_REG_RBP);
|
6b2638 | 2014-08-15 | Per Hedbor | | add_reg_imm_reg(P_REG_RBX, c*sizeof(struct svalue), P_REG_RBP );
|
2cbc49 | 2017-02-21 | Martin Karlgren | | }
|
6b2638 | 2014-08-15 | Per Hedbor | |
LABEL_A;
amd64_free_svalue(P_REG_RBX, 0);
mov_imm_mem(PIKE_T_INT, P_REG_RBX, OFFSETOF(svalue, tu.t.type));
mov_imm_mem(0, P_REG_RBX, OFFSETOF(svalue, u.integer));
if( c > 1 )
{
add_reg_imm(P_REG_RBX, sizeof(struct svalue ) );
cmp_reg_reg( P_REG_RBX, P_REG_RBP );
jne(&label_A);
|
2cbc49 | 2017-02-21 | Martin Karlgren | | pop(P_REG_RBP);
|
6b2638 | 2014-08-15 | Per Hedbor | | }
}
return;
|
94040e | 2014-08-14 | Per Hedbor | | case F_LOCAL_LOCAL_INDEX:
{
LABELS();
ins_debug_instr_prologue(a-F_OFFSET, b, c);
amd64_load_fp_reg();
mov_mem_reg( fp_reg, OFFSETOF(pike_frame,locals), P_REG_RDX);
add_reg_imm_reg( P_REG_RDX, b*sizeof(struct svalue), P_REG_RBX);
add_reg_imm_reg( P_REG_RDX, c*sizeof(struct svalue), P_REG_RCX);
mov_sval_type( P_REG_RBX, P_REG_RAX );
mov_sval_type( P_REG_RCX, P_REG_RDX );
shl_reg_imm( P_REG_RAX, 8 );
add_reg_reg( P_REG_RAX, P_REG_RDX );
cmp_reg32_imm( P_REG_RAX, (PIKE_T_ARRAY<<8)|PIKE_T_INT );
jne( &label_B );
mov_mem_reg( P_REG_RBX, 8, P_REG_RBX );
mov_mem_reg( P_REG_RCX, 8, P_REG_R9 );
mov_mem32_reg( P_REG_RDX, OFFSETOF(array,size), P_REG_R8 );
cmp_reg32_imm( P_REG_RBX, 0 );
jge( &label_D );
add_reg_reg( P_REG_RBX, P_REG_R8 );
|
da045c | 2014-08-14 | Per Hedbor | |
|
94040e | 2014-08-14 | Per Hedbor | | LABEL_D;
cmp_reg32_imm( P_REG_RBX, 0 );
jl( &label_B );
cmp_reg_reg( P_REG_RBX, P_REG_R8);
jge( &label_B );
mov_mem_reg( P_REG_RDX, OFFSETOF(array,item), P_REG_RCX );
shl_reg_imm( P_REG_RBX, 4 );
add_reg_reg( P_REG_RBX, P_REG_RCX );
amd64_push_svaluep( P_REG_RBX );
jmp( &label_C );
LABEL_B;
update_arg1(b);
update_arg2(c);
amd64_call_c_opcode(instrs[a-F_OFFSET].address,
instrs[a-F_OFFSET].flags);
LABEL_C;
}
return;
|
b40c77 | 2014-08-18 | Per Hedbor | |
|
83b92e | 2014-08-16 | Per Hedbor | | case F_PRIVATE_IF_DIRECT_GLOBAL:
{
LABELS();
amd64_load_sp_reg();
ins_debug_instr_prologue(a-F_OFFSET, b, c);
mov_mem_reg( fp_reg, OFFSETOF(pike_frame,current_object), ARG2_REG );
mov_mem_reg( fp_reg, OFFSETOF(pike_frame,context), ARG3_REG );
mov_mem_reg( ARG3_REG, OFFSETOF(inherit,prog), P_REG_R8 );
mov_mem_reg( ARG2_REG, OFFSETOF(object,prog), P_REG_RAX );
cmp_reg_reg(P_REG_R8,P_REG_RAX);
je(&label_A);
mov_reg_reg(sp_reg, ARG1_REG);
mov_mem16_reg(ARG3_REG, OFFSETOF(inherit, identifier_level),
ARG3_REG);
add_reg_imm(ARG3_REG, c);
amd64_call_c_function(low_object_index_no_free);
amd64_add_sp(1);
jmp(&label_B);
LABEL_A;
mov_mem_reg(ARG2_REG, OFFSETOF(object,storage), P_REG_RBX );
add_reg_mem(P_REG_RBX, ARG3_REG, OFFSETOF(inherit,storage_offset));
add_reg_imm(P_REG_RBX, b );
amd64_push_svaluep( P_REG_RBX );
LABEL_B;
return;
}
case F_ASSIGN_PRIVATE_IF_DIRECT_GLOBAL:
{
LABELS();
amd64_load_sp_reg();
ins_debug_instr_prologue(a-F_OFFSET, b, c);
mov_mem_reg( fp_reg, OFFSETOF(pike_frame,current_object), ARG1_REG );
mov_mem_reg( fp_reg, OFFSETOF(pike_frame,context), ARG2_REG );
mov_mem_reg( ARG1_REG, OFFSETOF(object,prog), P_REG_RAX );
mov_mem_reg( ARG2_REG, OFFSETOF(inherit,prog), P_REG_R8 );
cmp_reg_reg(P_REG_R8,P_REG_RAX);
je(&label_A);
mov_mem16_reg( ARG2_REG, OFFSETOF(inherit,identifier_level), ARG2_REG);
add_reg_imm( ARG2_REG, c );
add_reg_imm_reg( sp_reg, -1*sizeof(struct svalue), ARG3_REG );
amd64_call_c_function(object_low_set_index);
jmp(&label_B);
LABEL_A;
mov_mem_reg(ARG1_REG, OFFSETOF(object,storage), P_REG_RBX );
add_reg_mem(P_REG_RBX, ARG2_REG, OFFSETOF(inherit,storage_offset));
add_reg_imm(P_REG_RBX, b );
amd64_free_svalue( P_REG_RBX, 0 );
amd64_assign_svalue_no_free( P_REG_RBX, sp_reg, -sizeof(struct svalue));
amd64_ref_svalue(P_REG_RBX,0);
LABEL_B;
}
return;
|
a92d45 | 2014-08-18 | Per Hedbor | |
|
da045c | 2014-08-14 | Per Hedbor | | case F_ASSIGN_PRIVATE_TYPED_GLOBAL_AND_POP:
case F_ASSIGN_PRIVATE_TYPED_GLOBAL:
{
LABELS();
amd64_load_sp_reg();
|
a92d45 | 2014-08-18 | Per Hedbor | | ins_debug_instr_prologue(a-F_OFFSET, b, c);
|
da045c | 2014-08-14 | Per Hedbor | |
amd64_get_storage( P_REG_RBX, b );
|
f76ace | 2017-11-05 | Henrik Grubbström (Grubba) | | value includes something with a _destruct that calls destruct on
|
da045c | 2014-08-14 | Per Hedbor | | this object...)
Note that nothing crash if we do the assign. We "just" leak the
variable when the storage is eventually free:d.
The generated code does look sort of silly, however.
*/
mov_mem_reg( fp_reg, OFFSETOF(pike_frame,current_object), ARG1_REG );
mov_mem_reg( ARG1_REG, OFFSETOF(object,prog), P_REG_RAX );
test_reg(P_REG_RAX);
jnz(&label_A);
amd64_call_c_function(object_low_set_index);
LABEL_A;
mov_mem8_reg( sp_reg, -sizeof(struct svalue )+OFFSETOF(svalue,tu.t.type), P_REG_RAX);
cmp_reg32_imm( P_REG_RAX, c );
je( &label_B );
mov_reg_reg( P_REG_RBX, ARG1_REG );
mov_imm_reg( c, ARG2_REG );
add_reg_imm_reg( sp_reg, -sizeof(struct svalue), ARG3_REG );
amd64_call_c_function(assign_to_short_svalue);
|
7af2af | 2014-08-16 | Henrik Grubbström (Grubba) | | if( a == F_ASSIGN_PRIVATE_TYPED_GLOBAL_AND_POP )
|
da045c | 2014-08-14 | Per Hedbor | | {
amd64_add_sp(-1);
amd64_free_svalue( sp_reg, 0 );
}
jmp( &label_E );
LABEL_B;
if( c >= MIN_REF_TYPE )
{
mov_mem_reg( P_REG_RBX, 0, P_REG_RAX );
test_reg(P_REG_RAX);
jz(&label_C);
add_mem32_imm( P_REG_RAX, OFFSETOF(pike_string,refs), -1);
jnz(&label_C);
mov_reg_reg( P_REG_RBX, ARG1_REG );
mov_imm_reg( c, ARG2_REG );
amd64_call_c_function(really_free_short_svalue_ptr);
}
LABEL_C;
mov_mem_reg( sp_reg, -8, P_REG_RAX );
mov_reg_mem( P_REG_RAX, P_REG_RBX, 0 );
|
7af2af | 2014-08-16 | Henrik Grubbström (Grubba) | | if( a == F_ASSIGN_PRIVATE_TYPED_GLOBAL_AND_POP )
|
da045c | 2014-08-14 | Per Hedbor | | amd64_add_sp( -1 );
else if( c >= MIN_REF_TYPE )
add_mem_imm( P_REG_RAX, OFFSETOF(pike_string,refs), 1 );
LABEL_E;
}
return;
|
dc1054 | 2014-08-14 | Per Hedbor | | case F_PRIVATE_TYPED_GLOBAL:
ins_debug_instr_prologue(a-F_OFFSET, b, c);
amd64_load_sp_reg();
if( c < MIN_REF_TYPE )
{
amd64_get_storage( P_REG_RBX, b );
mov_mem_reg( P_REG_RBX, 0, P_REG_RBX );
mov_imm_mem( c, sp_reg, 0 );
mov_reg_mem( P_REG_RBX, sp_reg, 8 );
amd64_add_sp(1);
}
else
{
LABELS();
amd64_get_storage( P_REG_RBX, b );
mov_mem_reg( P_REG_RBX, 0, P_REG_RBX );
test_reg( P_REG_RBX );
jnz(&label_A);
amd64_push_int(0,1);
jmp(&label_B);
LABEL_A;
add_mem_imm( P_REG_RBX, 0, 1 );
mov_imm_mem( c, sp_reg, 0 );
mov_reg_mem( P_REG_RBX, sp_reg, 8 );
amd64_add_sp(1);
LABEL_B;
}
return;
|
1af093 | 2012-06-22 | Per Hedbor | | case F_ADD_LOCAL_INT:
|
f4107d | 2012-06-18 | Per Hedbor | | case F_ADD_LOCAL_INT_AND_POP:
{
LABELS();
|
a92d45 | 2014-08-18 | Per Hedbor | | ins_debug_instr_prologue(a-F_OFFSET, b, c);
|
fd1b5a | 2012-06-19 | Henrik Grubbström (Grubba) | | amd64_load_fp_reg();
|
f4107d | 2012-06-18 | Per Hedbor | | mov_mem_reg( fp_reg, OFFSETOF(pike_frame, locals), ARG1_REG);
add_reg_imm( ARG1_REG, b*sizeof(struct svalue) );
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_sval_type( ARG1_REG, P_REG_RAX );
cmp_reg32_imm( P_REG_RAX, PIKE_T_INT );
|
f4107d | 2012-06-18 | Per Hedbor | | jne(&label_A);
|
a5cf65 | 2014-06-24 | Henrik Grubbström (Grubba) | | mov_imm_mem( PIKE_T_INT, ARG1_REG, OFFSETOF(svalue, tu.t.type));
|
f4107d | 2012-06-18 | Per Hedbor | | add_imm_mem( c, ARG1_REG,OFFSETOF(svalue,u.integer));
jno( &label_B);
add_imm_mem( -c, ARG1_REG,OFFSETOF(svalue,u.integer));
|
1af093 | 2012-06-22 | Per Hedbor | |
|
f4107d | 2012-06-18 | Per Hedbor | | LABEL_A;
update_arg2(c);
update_arg1(b);
|
1af093 | 2012-06-22 | Per Hedbor | | ins_f_byte(a);
if( a == F_ADD_LOCAL_INT )
jmp( &label_C );
|
f4107d | 2012-06-18 | Per Hedbor | | LABEL_B;
|
1af093 | 2012-06-22 | Per Hedbor | | if( a == F_ADD_LOCAL_INT )
{
|
c33ce9 | 2012-06-28 | Per Hedbor | | amd64_load_sp_reg();
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg( ARG1_REG, OFFSETOF(svalue,u.integer), P_REG_RAX );
amd64_push_int_reg( P_REG_RAX );
|
1af093 | 2012-06-22 | Per Hedbor | | }
LABEL_C;
|
f4107d | 2012-06-18 | Per Hedbor | | return;
}
|
1807c0 | 2014-07-15 | Per Hedbor | |
#if 0
|
a92d45 | 2014-08-18 | Per Hedbor | |
|
1807c0 | 2014-07-15 | Per Hedbor | | case F_APPLY_N:
|
a92d45 | 2014-08-18 | Per Hedbor | | ins_debug_instr_prologue(a-F_OFFSET, b, c);
|
1807c0 | 2014-07-15 | Per Hedbor | | mov_imm_reg( APPLY_SVALUE_STRICT, ARG1_REG );
mov_imm_reg( c, ARG2_REG );
mov_ptr_reg( &((Pike_fp->context->prog->constants + b)->sval), ARG3_REG );
clear_reg( ARG4_REG );
amd64_call_c_opcode(mega_apply, I_UPDATE_SP);
return;
#endif
case F_CALL_BUILTIN_N:
|
a92d45 | 2014-08-18 | Per Hedbor | | ins_debug_instr_prologue(a-F_OFFSET, b, c);
|
1807c0 | 2014-07-15 | Per Hedbor | | mov_imm_reg( c, ARG1_REG );
amd64_call_c_opcode(Pike_compiler->new_program->constants[b].sval.u.efun->function,
I_UPDATE_SP);
return;
|
f4107d | 2012-06-18 | Per Hedbor | | case F_ADD_LOCALS_AND_POP:
{
LABELS();
ins_debug_instr_prologue(a-F_OFFSET, b, 0);
|
fd1b5a | 2012-06-19 | Henrik Grubbström (Grubba) | | amd64_load_fp_reg();
|
f4107d | 2012-06-18 | Per Hedbor | | mov_mem_reg( fp_reg, OFFSETOF(pike_frame, locals), ARG1_REG);
add_reg_imm( ARG1_REG, b*sizeof(struct svalue) );
add_reg_imm_reg( ARG1_REG,(c-b)*sizeof(struct svalue), ARG2_REG );
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_sval_type( ARG1_REG, P_REG_RAX );
mov_sval_type( ARG2_REG, P_REG_RBX );
shl_reg_imm( P_REG_RAX, 8 );
add_reg_reg( P_REG_RAX, P_REG_RBX );
cmp_reg32_imm( P_REG_RAX, (PIKE_T_INT<<8) | PIKE_T_INT );
|
f4107d | 2012-06-18 | Per Hedbor | | jne(&label_A);
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg( ARG2_REG, OFFSETOF(svalue,u.integer), P_REG_RAX );
add_reg_mem( P_REG_RAX, ARG1_REG, OFFSETOF(svalue,u.integer));
|
f4107d | 2012-06-18 | Per Hedbor | | jo( &label_A);
|
a5cf65 | 2014-06-24 | Henrik Grubbström (Grubba) | | mov_imm_mem( PIKE_T_INT, ARG1_REG,OFFSETOF(svalue, tu.t.type));
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_reg_mem( P_REG_RAX, ARG1_REG, OFFSETOF(svalue,u.integer));
|
f4107d | 2012-06-18 | Per Hedbor | | jmp( &label_B );
LABEL_A;
update_arg2(c);
update_arg1(b);
ins_f_byte(a);
LABEL_B;
return;
}
case F_ASSIGN_LOCAL_NUMBER_AND_POP:
|
c33ce9 | 2012-06-28 | Per Hedbor | | ins_debug_instr_prologue(a-F_OFFSET, b, c);
|
fd1b5a | 2012-06-19 | Henrik Grubbström (Grubba) | | amd64_load_fp_reg();
|
f4107d | 2012-06-18 | Per Hedbor | | mov_mem_reg( fp_reg, OFFSETOF(pike_frame, locals), ARG1_REG);
add_reg_imm( ARG1_REG,b*sizeof(struct svalue) );
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_reg_reg( ARG1_REG, P_REG_RBX );
|
f4107d | 2012-06-18 | Per Hedbor | | amd64_free_svalue(ARG1_REG, 0);
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_imm_mem(c, P_REG_RBX, OFFSETOF(svalue, u.integer));
|
a5cf65 | 2014-06-24 | Henrik Grubbström (Grubba) | | mov_imm_mem32(PIKE_T_INT, P_REG_RBX, OFFSETOF(svalue, tu.t.type));
|
f4107d | 2012-06-18 | Per Hedbor | | return;
|
f7202c | 2013-06-12 | Per Hedbor | | case F_LOCAL_2_GLOBAL:
ins_debug_instr_prologue(a-F_OFFSET, b, 0);
amd64_load_fp_reg();
amd64_load_sp_reg();
mov_mem_reg( fp_reg, OFFSETOF(pike_frame, locals), ARG3_REG );
add_reg_imm( ARG3_REG, c*sizeof(struct svalue) );
mov_mem_reg(fp_reg, OFFSETOF(pike_frame, current_object), ARG1_REG);
mov_mem_reg(fp_reg, OFFSETOF(pike_frame,context), ARG2_REG);
mov_mem16_reg(ARG2_REG, OFFSETOF(inherit, identifier_level), ARG2_REG);
add_reg_imm( ARG2_REG, b );
amd64_call_c_function( object_low_set_index );
return;
|
7e8ef5 | 2014-08-15 | Per Hedbor | | case F_LEXICAL_LOCAL:
if( c < 5 )
{
|
a92d45 | 2014-08-18 | Per Hedbor | | ins_debug_instr_prologue(a-F_OFFSET, b, c);
|
7e8ef5 | 2014-08-15 | Per Hedbor | | amd64_load_fp_reg();
mov_reg_reg( fp_reg, P_REG_RAX );
while(c--)
mov_mem_reg( P_REG_RAX, OFFSETOF(pike_frame,scope), P_REG_RAX );
mov_mem_reg( P_REG_RAX, OFFSETOF(pike_frame,locals), P_REG_RAX );
add_reg_imm_reg( P_REG_RAX, b*sizeof(struct svalue), P_REG_RBX );
amd64_push_svaluep( P_REG_RBX );
return;
}
break;
|
dbce5f | 2014-08-15 | Per Hedbor | |
case F_LEXICAL_LOCAL_LVALUE:
if( c < 5 )
{
|
a92d45 | 2014-08-18 | Per Hedbor | | ins_debug_instr_prologue(a-F_OFFSET, b, c);
|
dbce5f | 2014-08-15 | Per Hedbor | | amd64_load_fp_reg();
amd64_load_sp_reg();
mov_reg_reg( fp_reg, P_REG_RAX );
while(c--)
mov_mem_reg( P_REG_RAX, OFFSETOF(pike_frame,scope), P_REG_RAX );
mov_mem_reg( P_REG_RAX, OFFSETOF(pike_frame,locals), P_REG_RAX );
add_reg_imm_reg( P_REG_RAX, b*sizeof(struct svalue), P_REG_RAX );
mov_imm_mem( T_SVALUE_PTR, sp_reg, OFFSETOF(svalue, tu.t.type));
mov_reg_mem( P_REG_RAX, sp_reg, OFFSETOF(svalue,u.lval) );
mov_imm_mem( T_VOID, sp_reg,
OFFSETOF(svalue, tu.t.type)+sizeof(struct svalue));
amd64_add_sp( 2 );
return;
}
break;
|
b505a7 | 2012-06-13 | Per Hedbor | | case F_LOCAL_2_LOCAL:
|
5c82f4 | 2012-06-13 | Henrik Grubbström (Grubba) | | ins_debug_instr_prologue(a-F_OFFSET, b, c);
|
b505a7 | 2012-06-13 | Per Hedbor | | if( b != c )
{
amd64_load_fp_reg();
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg( fp_reg, OFFSETOF(pike_frame, locals), P_REG_RBX );
add_reg_imm( P_REG_RBX, b*sizeof(struct svalue) );
|
b505a7 | 2012-06-13 | Per Hedbor | |
|
2fd805 | 2013-10-08 | Per Hedbor | | amd64_free_svalue( P_REG_RBX, 0 );
|
373ff5 | 2012-06-13 | Henrik Grubbström (Grubba) | |
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg( P_REG_RBX, (c-b)*sizeof(struct svalue), P_REG_RAX );
mov_mem_reg( P_REG_RBX, (c-b)*sizeof(struct svalue)+8, P_REG_RCX );
mov_reg_mem( P_REG_RAX, P_REG_RBX, 0 );
mov_reg_mem( P_REG_RCX, P_REG_RBX, 8 );
amd64_ref_svalue( P_REG_RBX, 1 );
|
b505a7 | 2012-06-13 | Per Hedbor | | }
return;
|
9030f6 | 2011-05-26 | Henrik Grubbström (Grubba) | | case F_2_LOCALS:
|
719c3a | 2012-06-12 | Per Hedbor | | #if 1
|
5c82f4 | 2012-06-13 | Henrik Grubbström (Grubba) | | ins_debug_instr_prologue(a-F_OFFSET, b, c);
|
719c3a | 2012-06-12 | Per Hedbor | | amd64_load_fp_reg();
amd64_load_sp_reg();
|
2fd805 | 2013-10-08 | Per Hedbor | | mov_mem_reg(fp_reg, OFFSETOF(pike_frame, locals), P_REG_R8);
add_reg_imm( P_REG_R8, b*sizeof(struct svalue) );
amd64_push_svaluep(P_REG_R8);
add_reg_imm( P_REG_R8, (c-b)*sizeof(struct svalue) );
amd64_push_svaluep(P_REG_R8);
|
719c3a | 2012-06-12 | Per Hedbor | | #else
ins_f_byte_with_arg( F_LOCAL, b );
ins_f_byte_with_arg( F_LOCAL, c );
#endif
|
9030f6 | 2011-05-26 | Henrik Grubbström (Grubba) | | return;
|
719c3a | 2012-06-12 | Per Hedbor | |
|
9853bd | 2012-06-13 | Henrik Grubbström (Grubba) | | case F_FILL_STACK:
{
LABELS();
if (!b) return;
ins_debug_instr_prologue(a-F_OFFSET, b, c);
amd64_load_fp_reg();
amd64_load_sp_reg();
mov_mem_reg(fp_reg, OFFSETOF(pike_frame, locals), ARG1_REG);
add_reg_imm(ARG1_REG, b*sizeof(struct svalue));
jmp(&label_A);
LABEL_B;
amd64_push_int(0, c);
LABEL_A;
cmp_reg_reg(sp_reg, ARG1_REG);
|
996c48 | 2013-06-19 | Henrik Grubbström (Grubba) | | jl(&label_B);
|
9853bd | 2012-06-13 | Henrik Grubbström (Grubba) | | }
return;
|
5151e5 | 2012-06-10 | Henrik Grubbström (Grubba) | | case F_INIT_FRAME:
ins_debug_instr_prologue(a-F_OFFSET, b, c);
amd64_load_fp_reg();
|
719c3a | 2012-06-12 | Per Hedbor | |
if(OFFSETOF(pike_frame, num_locals) != OFFSETOF(pike_frame, num_args)-2 )
Pike_fatal("This code does not with unless num_args\n"
"directly follows num_locals in struct pike_frame\n");
mov_imm_mem32( (b<<16)|c, fp_reg, OFFSETOF(pike_frame, num_locals));
|
5151e5 | 2012-06-10 | Henrik Grubbström (Grubba) | | return;
|
eb42a1 | 2011-05-11 | Henrik Grubbström (Grubba) | | }
|
d1fa80 | 2011-05-09 | Henrik Grubbström (Grubba) | | update_arg2(c);
update_arg1(b);
ins_f_byte(a);
|
799039 | 2006-04-27 | Tor Edvardsson | | }
|
54a26b | 2011-05-11 | Henrik Grubbström (Grubba) | | int amd64_ins_f_jump_with_2_args(unsigned int op, INT32 a, INT32 b,
int backward_jump)
{
if (!(instrs[op - F_OFFSET].flags & I_BRANCH)) return -1;
maybe_update_pc();
update_arg2(b);
update_arg1(a);
return amd64_ins_f_jump(op, backward_jump);
}
void amd64_update_f_jump(INT32 offset, INT32 to_offset)
{
upd_pointer(offset, to_offset - offset - 4);
}
INT32 amd64_read_f_jump(INT32 offset)
{
return read_pointer(offset) + offset + 4;
}
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | |
#define OP_PREFIX 0x10000000UL
#define G1 (OP_PREFIX|0)
#define G2 (OP_PREFIX|1)
#define G3 (OP_PREFIX|2)
#define G4 (OP_PREFIX|3)
|
911e6f | 2017-01-18 | Henrik Grubbström (Grubba) | |
#define OP_MULTIBYTE 0x20000000UL
#define OP_F (OP_MULTIBYTE|0)
#define OP_F_38 (OP_MULTIBYTE|1)
#define OP_F_3A (OP_MULTIBYTE|2)
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | |
#define OP_RM 0x00010000 /* ModR/M */
#define OP_DISPL 0x00020000 /* Displacement */
#define OP_IMM 0x00040000 /* Immediate */
#define OP_PCREL 0x00080000 /* PC-relative */
#define OP_REG 0x00100000 /* Register in low 3 bits. */
#define OP_IMPLICIT_A 0x00200000
#define OP_IMPLICIT_C 0x00800000
#define OP_REG_S 0x00400000
#define OP_B_RM 0x00008000 /* B arg before RM arg. */
#define OP_8 0x01000000 /* 8-bit */
#define OP_S8 0x02000000 /* 8-bit sign extended to 16 */
|
3e3341 | 2017-01-20 | Henrik Grubbström (Grubba) | | #define OP_OPS 0x40000000 /* Lookup in modrm_ops */
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | |
#define OP_S 0
#define REG (OP_REG)
#define RRM8 (OP_8|OP_RM|OP_B_RM)
#define RMR8 (OP_8|OP_RM)
#define RMR (OP_RM)
#define RRM (OP_RM|OP_B_RM)
#define RRMI8 (OP_8|OP_RM|OP_B_RM|OP_IMM)
#define RRMI (OP_RM|OP_B_RM|OP_IMM)
#define SRM (OP_S|OP_RM|OP_B_RM)
#define RMS (OP_S|OP_RM)
#define ALM8 (OP_8|OP_IMPLICIT_A|OP_RM|OP_B_RM)
#define AM (OP_IMPLICIT_A|OP_RM|OP_B_RM)
#define MAL8 (OP_IMPLICIT_A|OP_RM|OP_8)
#define MA (OP_IMPLICIT_A|OP_RM)
#define RI8 (OP_RM|OP_IMM|OP_8)
#define RI (OP_RM|OP_IMM)
#define RMI8OP (OP_RM|OP_IMM|OP_8|OP_OPS)
#define RMSI8OP (OP_RM|OP_IMM|OP_S8|OP_OPS)
#define RMIOP (OP_RM|OP_IMM|OP_OPS)
#define ALI8 (OP_IMPLICIT_A|OP_IMM|OP_8)
#define AI (OP_IMPLICIT_A|OP_IMM)
#define RM8OP (OP_RM|OP_8|OP_OPS)
#define RMOP (OP_RM|OP_OPS)
#define RMC8OP (OP_RM|OP_8|OP_OPS|OP_IMPLICIT_C)
#define RMCOP (OP_RM|OP_OPS|OP_IMPLICIT_C)
#define PCREL (OP_PCREL)
#define PCREL8 (OP_PCREL|OP_8)
#define RM (OP_RM)
|
3e3341 | 2017-01-20 | Henrik Grubbström (Grubba) | | static const char *modrm_ops[6][8] = {
|
2c2219 | 2017-01-18 | Henrik Grubbström (Grubba) | |
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | {
|
bbc633 | 2017-01-21 | Henrik Grubbström (Grubba) | | "add", "or", "adc", NULL,
"and", "sub", NULL, "cmp",
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | },
{
NULL, NULL, NULL, NULL,
"sal", "shr", NULL, "sar",
},
|
2c2219 | 2017-01-18 | Henrik Grubbström (Grubba) | |
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | {
|
2c2219 | 2017-01-18 | Henrik Grubbström (Grubba) | | "test", NULL, NULL, "neg",
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | "imul", NULL, NULL, "idiv",
},
|
2c2219 | 2017-01-18 | Henrik Grubbström (Grubba) | |
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | {
"inc", "dec", "call", "call",
"jmp", "jmp", NULL, NULL,
},
|
2c2219 | 2017-01-18 | Henrik Grubbström (Grubba) | |
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | {
|
2c2219 | 2017-01-18 | Henrik Grubbström (Grubba) | | "mov", NULL, NULL, NULL,
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | NULL, NULL, NULL, NULL,
},
|
2c2219 | 2017-01-18 | Henrik Grubbström (Grubba) | |
{
NULL, NULL, NULL, NULL,
"bt", "bts", "btr", "btc",
},
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | };
struct amd64_opcode {
const char *name;
|
d55914 | 2017-07-17 | Martin Nilsson | | UINT64 flags;
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | };
|
3e3341 | 2017-01-20 | Henrik Grubbström (Grubba) | | static struct amd64_opcode amd64_opcodes[4][256] = {
|
911e6f | 2017-01-18 | Henrik Grubbström (Grubba) | |
{
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | |
{ "add", RMR8, }, { "add", RMR, }, { "add", RRM8, }, { "add", RRM, },
{ "add", ALI8, }, { "add", AI, }, { NULL, 0, }, { NULL, 0, },
{ "or", RMR8, }, { "or", RMR, }, { "or", RRM8, }, { "or", RRM, },
|
911e6f | 2017-01-18 | Henrik Grubbström (Grubba) | | { "or", ALI8, }, { "or", AI, }, { NULL, 0, }, { "F", OP_F, },
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | |
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ "and", RMR8, }, { "and", RMR, }, { "and", RRM8, }, { "and", RRM, },
{ "and", ALI8, }, { "and", AI, }, { "es", G2, }, { NULL, 0, },
{ "sub", RMR8, }, { "sub", RMR, }, { "sub", RRM8, }, { "sub", RRM, },
{ "sub", ALI8, }, { "sub", AI, }, { "cs", G2, }, { NULL, 0, },
{ "xor", RMR8, }, { "xor", RMR, }, { "xor", RRM8, }, { "xor", RRM, },
{ NULL, 0, }, { NULL, 0, }, { "ss", G2, }, { NULL, 0, },
{ "cmp", RMR8, }, { "cmp", RMR, }, { "cmp", RRM8, }, { "cmp", RRM, },
{ "cmp", ALI8, }, { "cmp", AI, }, { "ds", G2, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ "push", REG, }, { "push", REG, }, { "push", REG, }, { "push", REG, },
{ "push", REG, }, { "push", REG, }, { "push", REG, }, { "push", REG, },
{ "pop", REG, }, { "pop", REG, }, { "pop", REG, }, { "pop", REG, },
{ "pop", REG, }, { "pop", REG, }, { "pop", REG, }, { "pop", REG, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ "fs", G2, }, { "gs", G2, }, { "osize", G3, }, { "asize", G4, },
{ NULL, 0, }, { "imul", RRMI, }, { NULL, 0, }, { "imul", RRMI8, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ "jo", PCREL8, }, { "jno", PCREL8, }, { "jb", PCREL8, }, { "jae", PCREL8, },
{ "jz", PCREL8, }, { "jnz", PCREL8, }, { "jbe", PCREL8, }, { "ja", PCREL8, },
{ "js", PCREL8, }, { "jns", PCREL8, }, { "jp", PCREL8, }, { "jpo", PCREL8, },
{ "jnge", PCREL8, }, { "jge", PCREL8, }, { "jle", PCREL8, }, { "jg", PCREL8, },
{ "and", RMI8OP, }, { "and", RMIOP, }, { NULL, 0, }, { "and", RMSI8OP, },
{ "test", RMR8, }, { "test", RMR, }, { NULL, 0, }, { NULL, 0, },
{ "mov", RMR8, }, { "mov", RMR, }, { "mov", RRM8, }, { "mov", RRM, },
{ "mov", RMS, }, { "lea", RRM, }, { "mov", SRM, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ "mov", ALM8, }, { "mov", AM, }, { "mov", MAL8, }, { "mov", MA, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ "test", ALI8, }, { "test", AI, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ "mov", RI8, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ "mov", RI, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ "sal", RMI8OP|1, }, { "sal", RMIOP|1, }, { NULL, 0, }, { "ret", 0, },
|
7cefdc | 2017-01-19 | Henrik Grubbström (Grubba) | | { NULL, 0, }, { NULL, 0, }, { "mov", RMI8OP|4, }, { "mov", RMIOP|4, },
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | { NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ "sal", RM8OP|1, }, { "sal", RMOP|1, }, { "sal", RMC8OP|1, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { "jmp", PCREL, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { "jmp", PCREL8, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { "jcxz", PCREL8, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
|
5b4b21 | 2017-01-15 | Henrik Grubbström (Grubba) | | { "call", PCREL, }, { NULL, 0, }, { NULL, 0, }, { "jmp", PCREL8, },
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | { NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ "lock", G1, }, { NULL, 0, }, { "repne", G1, }, { "rep", G1, },
|
5b4b21 | 2017-01-15 | Henrik Grubbström (Grubba) | | { NULL, 0, }, { "cmc", 0, }, { "neg", RM8OP|2, }, { "neg", RMOP|2, },
{ "clc", 0, }, { NULL, 0, }, { "cli", 0, }, { NULL, 0, },
{ "cld", 0, }, { NULL, 0, }, { "dec", RM8OP|3, }, { "dec", RMOP|3, },
|
911e6f | 2017-01-18 | Henrik Grubbström (Grubba) | | },
{
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | |
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
|
911e6f | 2017-01-18 | Henrik Grubbström (Grubba) | | { "aes|blendvps/d|crc32", OP_F_38, }, { NULL, 0, }, { "aes|blendps/d", OP_F_3A, }, { NULL, 0, },
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | { NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ "cmovo", RRM, }, { "cmovno", RRM, }, { "cmovb", RRM, }, { "cmovae", RRM, },
{ "cmove", RRM, }, { "cmovne", RRM, }, { "cmovbe", RRM, }, { "cmova", RRM, },
{ "cmovs", RRM, }, { "cmovns", RRM, }, { "cmovp", RRM, }, { "cmovnp", RRM, },
{ "cmovel", RRM, }, { "cmovge", RRM, }, { "cmovle", RRM, }, { "cmovg", RRM, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { "movdqa", RRM, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { "movdqa", RMR, },
{ "jo", PCREL, }, { "jno", PCREL, }, { "jb", PCREL, }, { "jae", PCREL, },
{ "je", PCREL, }, { "jne", PCREL, }, { "jbe", PCREL, }, { "ja", PCREL, },
{ "js", PCREL, }, { "jns", PCREL, }, { "jp", PCREL, }, { "jnp", PCREL, },
{ "jl", PCREL, }, { "jge", PCREL, }, { "jle", PCREL, }, { "jg", PCREL, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ "eq", RM, }, { "neq", RM, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ "lt", RM, }, { "gte", RM, }, { "lte", RM, }, { "gt", RM, },
|
911e6f | 2017-01-18 | Henrik Grubbström (Grubba) | | { NULL, 0, }, { NULL, 0, }, { "cpuid", 0, }, { "bt", RMR, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { "bts", RMR, },
{ NULL, 0, }, { NULL, 0, }, { "clflush", RM, }, { "imul", RRM, },
{ "cmpxchg", RMR8, }, { "cmpxchg", RMR, }, { NULL, 0, }, { "btr", RMR, },
{ NULL, 0, }, { NULL, 0, }, { "movzx", RRM, }, { "movzx", RRM, },
|
7cefdc | 2017-01-19 | Henrik Grubbström (Grubba) | | { "bsf", RRM, }, { "bsr", RRM, }, { "bt", RMIOP|5, }, { "btc", RMR, },
|
911e6f | 2017-01-18 | Henrik Grubbström (Grubba) | | { NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { "cmpp/ss/d", RRMI8, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { "cmpxchg8b", RM, },
{ "bswap", REG, }, { "bswap", REG, }, { "bswap", REG, }, { "bswap", REG, },
{ "bswap", REG, }, { "bswap", REG, }, { "bswap", REG, }, { "bswap", REG, },
{ "addsubps/d", RRM, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
},
{
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ "blendvps", RRM, }, { "blendvpd", RRM, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | { NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
|
911e6f | 2017-01-18 | Henrik Grubbström (Grubba) | | { NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | { NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
|
911e6f | 2017-01-18 | Henrik Grubbström (Grubba) | | { NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { "aesimc", RRM, },
{ "aesenc", RRM, }, { "aesenclast", RRM, }, { "aesdec", RRM, }, { "aesdeclast", RRM, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ "crc32", RRM8, }, { "crc32", RRM, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
},
{
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ "blendps", RRMI8, }, { "blendpd", RRMI8, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | { NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
|
911e6f | 2017-01-18 | Henrik Grubbström (Grubba) | | { NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { "aeskeygenassist", RRMI8, },
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | |
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
{ NULL, 0, }, { NULL, 0, }, { NULL, 0, }, { NULL, 0, },
|
911e6f | 2017-01-18 | Henrik Grubbström (Grubba) | | },
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | };
|
035ed6 | 2017-01-29 | Henrik Grubbström (Grubba) | | const char *amd64_registers[5][16] = {
{
"%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
},
{
"%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
"%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b",
},
{
"%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
"%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w",
},
{
"%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
"%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d",
},
{
"%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
"%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15",
},
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | };
|
035ed6 | 2017-01-29 | Henrik Grubbström (Grubba) | | const char *amd64_describe_reg(int byte_mode, const int *legacy_prefix,
int rex, int reg_high, int reg)
{
int reg_bank = 3;
if (byte_mode) {
reg_bank = 0;
if (rex) reg_bank = 1;
} else if (rex & 0x04) {
reg_bank = 4;
} else if (legacy_prefix[2] == 0x66) {
reg_bank = 2;
}
if (reg_high) reg += 8;
return amd64_registers[reg_bank][reg];
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | }
size_t amd64_readint32(PIKE_OPCODE_T *pc, char *buf)
{
unsigned INT32 val = ((unsigned INT32 *)pc)[0];
buf += strlen(buf);
|
ad2b61 | 2017-01-24 | Henrik Grubbström (Grubba) | | sprintf(buf, "0x%08x", val);
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | return 4;
}
|
fe069c | 2017-01-14 | Henrik Grubbström (Grubba) | | size_t amd64_disassemble_sib(PIKE_OPCODE_T *pc,
char *buf,
|
035ed6 | 2017-01-29 | Henrik Grubbström (Grubba) | | int byte_mode,
const int *legacy_prefix,
|
fe069c | 2017-01-14 | Henrik Grubbström (Grubba) | | int modrm,
int rex)
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | {
|
fe069c | 2017-01-14 | Henrik Grubbström (Grubba) | | int sib = pc[0];
int bytes = 1;
buf[0] = 0;
if (((sib & 0x07) == 0x05) && !(rex & 1)) {
switch (modrm & 0xc0) {
case 0x00:
{
INT32 val = ((INT32 *)(pc + 1))[0];
bytes += 4;
if (val < 0) {
sprintf(buf, "-0x%x", -val);
} else {
sprintf(buf, "0x%x", val);
}
}
break;
case 0x40:
{
INT32 val = (pc + 1)[0];
bytes++;
if (val < 0) {
sprintf(buf, "-0x%x(%%rbp)", -val);
} else {
sprintf(buf, "0x%x(%%rbp)", val);
}
}
break;
case 0x80:
{
INT32 val = ((INT32 *)(pc + 1))[0];
bytes += 4;
if (val < 0) {
sprintf(buf, "-0x%x(%%rbp)", -val);
} else {
sprintf(buf, "0x%x(%%rbp)", val);
}
}
break;
}
} else {
|
035ed6 | 2017-01-29 | Henrik Grubbström (Grubba) | | sprintf(buf, "%s", amd64_describe_reg(byte_mode, legacy_prefix, rex,
rex & 1, sib & 0x07));
|
fe069c | 2017-01-14 | Henrik Grubbström (Grubba) | | }
if ((sib & 0x38) != 0x20) {
if (sib & 0xc0) {
sprintf(buf + strlen(buf), "(%s*%d)",
|
035ed6 | 2017-01-29 | Henrik Grubbström (Grubba) | | amd64_describe_reg(byte_mode, legacy_prefix, rex,
rex & 2, (sib>>3) & 0x07),
|
fe069c | 2017-01-14 | Henrik Grubbström (Grubba) | | 1<<((sib>>6) & 3));
} else {
sprintf(buf + strlen(buf), "(%s)",
|
035ed6 | 2017-01-29 | Henrik Grubbström (Grubba) | | amd64_describe_reg(byte_mode, legacy_prefix, rex,
rex & 2, (sib>>3) & 0x07));
|
fe069c | 2017-01-14 | Henrik Grubbström (Grubba) | | }
}
return bytes;
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | }
size_t amd64_disassemble_modrm(PIKE_OPCODE_T *pc,
char *buf,
|
035ed6 | 2017-01-29 | Henrik Grubbström (Grubba) | | int byte_mode,
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | const int *legacy_prefix,
int modrm,
int rex)
{
size_t bytes = 0;
int mod;
|
fe069c | 2017-01-14 | Henrik Grubbström (Grubba) | | char reg_buf[256];
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | |
if (legacy_prefix[3]) {
|
fe069c | 2017-01-14 | Henrik Grubbström (Grubba) | |
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | }
|
fe069c | 2017-01-14 | Henrik Grubbström (Grubba) | | reg_buf[0] = 0;
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | buf[0] = 0;
switch(modrm & 0xc0) {
default:
|
fe069c | 2017-01-14 | Henrik Grubbström (Grubba) | | if ((modrm & 0xc7) == 0x05) {
INT32 val = ((INT32 *)pc)[0];
if (val < 0) {
sprintf(buf, "-0x%x(%%rip)", -val);
} else {
sprintf(buf, "0x%x(%%rip)", val);
}
return 4;
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | }
|
fe069c | 2017-01-14 | Henrik Grubbström (Grubba) | | if ((modrm & 0x07) == 0x04) {
|
035ed6 | 2017-01-29 | Henrik Grubbström (Grubba) | | bytes += amd64_disassemble_sib(pc + bytes, reg_buf, byte_mode,
legacy_prefix, modrm, rex);
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | } else {
|
035ed6 | 2017-01-29 | Henrik Grubbström (Grubba) | | sprintf(reg_buf, "%s", amd64_describe_reg(byte_mode, legacy_prefix, rex,
rex & 1, modrm & 7));
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | }
switch(modrm & 0xc0) {
case 0x00:
|
ad2b61 | 2017-01-24 | Henrik Grubbström (Grubba) | | sprintf(buf, "(%s)", reg_buf);
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | break;
case 0x40:
|
fe069c | 2017-01-14 | Henrik Grubbström (Grubba) | | sprintf(buf, "%d(%s)", ((signed char *)pc)[bytes], reg_buf);
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | bytes++;
break;
case 0x80:
bytes += amd64_readint32(pc + bytes, buf);
|
fe069c | 2017-01-14 | Henrik Grubbström (Grubba) | | sprintf(buf + strlen(buf), "(%s)", reg_buf);
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | break;
}
break;
case 0xc0:
|
035ed6 | 2017-01-29 | Henrik Grubbström (Grubba) | | sprintf(buf, "%s", amd64_describe_reg(byte_mode, legacy_prefix, rex,
rex & 1, modrm & 7));
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | break;
}
return bytes;
}
void amd64_disassemble_code(PIKE_OPCODE_T *pc, size_t len)
{
|
d675c9 | 2017-01-23 | Henrik Grubbström (Grubba) | | struct string_builder buf;
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | size_t pos;
|
d675c9 | 2017-01-23 | Henrik Grubbström (Grubba) | |
init_string_builder(&buf, 0);
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | for (pos = 0; pos < len;) {
size_t op_start = pos;
size_t i;
const char *opcode = NULL;
const char *params[4] = { NULL, NULL, NULL, NULL, };
int legacy_prefix[4] = { 0, 0, 0, 0 };
int byte;
int rex = 0;
int modrm = 0;
|
035ed6 | 2017-01-29 | Henrik Grubbström (Grubba) | | int byte_mode = 0;
|
911e6f | 2017-01-18 | Henrik Grubbström (Grubba) | | struct amd64_opcode *table = amd64_opcodes[0];
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | struct amd64_opcode *op;
char buffers[4][256];
while(1) {
byte = pc[pos++];
op = table + byte;
if (op->flags & OP_PREFIX) {
legacy_prefix[op->flags & 3] = byte;
continue;
}
break;
}
if ((byte & 0xf0) == 0x40) {
rex = byte;
byte = pc[pos++];
op = table + byte;
}
|
911e6f | 2017-01-18 | Henrik Grubbström (Grubba) | | while (op->flags & OP_MULTIBYTE) {
|
ad2b61 | 2017-01-24 | Henrik Grubbström (Grubba) | | table = amd64_opcodes[1 + (op->flags & 0xff)];
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | byte = pc[pos++];
op = table + byte;
}
opcode = op->name;
|
035ed6 | 2017-01-29 | Henrik Grubbström (Grubba) | | byte_mode = op->flags & (OP_8|OP_S8);
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | |
if (op->flags & OP_RM) {
modrm = pc[pos++];
|
035ed6 | 2017-01-29 | Henrik Grubbström (Grubba) | | params[0] = amd64_describe_reg(byte_mode, legacy_prefix, rex,
rex & 4, (modrm>>3) & 0x07);
|
ad2b61 | 2017-01-24 | Henrik Grubbström (Grubba) | | params[1] = buffers[1];
|
035ed6 | 2017-01-29 | Henrik Grubbström (Grubba) | | pos += amd64_disassemble_modrm(pc + pos, buffers[1], byte_mode,
|
ad2b61 | 2017-01-24 | Henrik Grubbström (Grubba) | | legacy_prefix, modrm, rex);
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | if (op->flags & OP_OPS) {
|
ad2b61 | 2017-01-24 | Henrik Grubbström (Grubba) | | params[0] = NULL;
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | opcode = modrm_ops[op->flags & 0x0f][(modrm >> 3) & 0x07];
}
}
if (op->flags & OP_REG) {
int reg = byte & 0x07;
|
035ed6 | 2017-01-29 | Henrik Grubbström (Grubba) | | params[1] = amd64_describe_reg(byte_mode, legacy_prefix, rex,
rex & 1, byte & 0x07);
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | }
if (op->flags & OP_IMM) {
|
ad2b61 | 2017-01-24 | Henrik Grubbström (Grubba) | | if (!params[0]) {
params[0] = buffers[0];
buffers[0][0] = 0;
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | }
if (op->flags & (OP_8|OP_S8)) {
|
ad2b61 | 2017-01-24 | Henrik Grubbström (Grubba) | | sprintf(buffers[0] + strlen(buffers[0]), "$%d", ((signed char *)pc)[pos++]);
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | } else {
|
ad2b61 | 2017-01-24 | Henrik Grubbström (Grubba) | | sprintf(buffers[0] + strlen(buffers[0]), "$");
pos += amd64_readint32(pc + pos, buffers[0] + strlen(buffers[0]));
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | }
|
acfe97 | 2017-01-17 | Henrik Grubbström (Grubba) | | } else if (op->flags & OP_PCREL) {
INT32 val;
|
d675c9 | 2017-01-23 | Henrik Grubbström (Grubba) | | if (!params[0]) {
params[0] = buffers[0];
buffers[0][0] = 0;
|
acfe97 | 2017-01-17 | Henrik Grubbström (Grubba) | | }
if (op->flags & (OP_8|OP_S8)) {
val = ((signed char *)pc)[pos++];
} else {
val = ((INT32 *)(pc + pos))[0];
pos += 4;
}
|
d675c9 | 2017-01-23 | Henrik Grubbström (Grubba) | | sprintf(buffers[0] + strlen(buffers[0]), "%p", pc + (pos + val));
|
acfe97 | 2017-01-17 | Henrik Grubbström (Grubba) | | }
if (op->flags & OP_B_RM) {
const char *tmp = params[0];
params[0] = params[1];
params[1] = tmp;
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | }
|
ad2b61 | 2017-01-24 | Henrik Grubbström (Grubba) | | if (!params[0]) {
params[0] = params[1];
params[1] = NULL;
}
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | |
|
ad2b61 | 2017-01-24 | Henrik Grubbström (Grubba) | | if (!opcode) {
opcode = ".byte";
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | }
|
ad2b61 | 2017-01-24 | Henrik Grubbström (Grubba) | |
if (params[0]) {
if ((params[0][0] == '%') &&
(!strcmp(opcode, "call") || !strcmp(opcode, "jmp"))) {
sprintf(buffers[0], "*%s", params[0]);
params[0] = buffers[0];
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | }
}
|
ad2b61 | 2017-01-24 | Henrik Grubbström (Grubba) | |
string_builder_append_disassembly(&buf, pc + op_start, pc + pos,
opcode, params, NULL);
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | }
|
ad2b61 | 2017-01-24 | Henrik Grubbström (Grubba) | |
|
d675c9 | 2017-01-23 | Henrik Grubbström (Grubba) | | string_builder_putchar(&buf, 0);
fprintf(stderr, "%s", buf.s->str);
free_string_builder(&buf);
|
6e4f29 | 2017-01-13 | Henrik Grubbström (Grubba) | | }
|