Use scaled indexing mode n=4 for addressing opStack, this way we can use the 8 bit offset value in %%bl to address an OPSTACK_SIZE of 1024 which was the old value.

This commit is contained in:
Thilo Schulz 2011-05-18 00:17:02 +00:00
parent 3f9ec83ce0
commit 61d6e6eb68
2 changed files with 84 additions and 84 deletions

View file

@ -24,7 +24,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
// don't change, this is hardcoded into x86 VMs, opStack protection relies // don't change, this is hardcoded into x86 VMs, opStack protection relies
// on this // on this
#define OPSTACK_SIZE 256 #define OPSTACK_SIZE 1024
#define OPSTACK_MASK (OPSTACK_SIZE-1) #define OPSTACK_MASK (OPSTACK_SIZE-1)
// don't change // don't change

View file

@ -77,7 +77,7 @@ static void VM_Destroy_Compiled(vm_t* self);
rsi scratch rsi scratch
rdi program frame pointer (programStack) rdi program frame pointer (programStack)
r8 pointer data (vm->dataBase) r8 pointer data (vm->dataBase)
r9 opStack data base (opStack) r9 opStack base (opStack)
r10 start of generated code r10 start of generated code
*/ */
@ -257,10 +257,10 @@ void emit(const char* fmt, ...)
#endif #endif
#define STACK_PUSH(bytes) \ #define STACK_PUSH(bytes) \
emit("addb $0x%x, %%bl", bytes); \ emit("addb $0x%x, %%bl", bytes >> 2); \
#define STACK_POP(bytes) \ #define STACK_POP(bytes) \
emit("subb $0x%x, %%bl", bytes); \ emit("subb $0x%x, %%bl", bytes >> 2); \
#define CHECK_INSTR_REG(reg) \ #define CHECK_INSTR_REG(reg) \
emit("cmpl $%u, %%"#reg, header->instructionCount); \ emit("cmpl $%u, %%"#reg, header->instructionCount); \
@ -295,7 +295,7 @@ void emit(const char* fmt, ...)
got_const = 0; \ got_const = 0; \
vm->instructionPointers[instruction-1] = assembler_get_code_size(); \ vm->instructionPointers[instruction-1] = assembler_get_code_size(); \
STACK_PUSH(4); \ STACK_PUSH(4); \
emit("movl $%d, (%%r9, %%rbx, 1)", const_value); \ emit("movl $%d, (%%r9, %%rbx, 4)", const_value); \
} }
#else #else
#define MAYBE_EMIT_CONST() #define MAYBE_EMIT_CONST()
@ -305,8 +305,8 @@ void emit(const char* fmt, ...)
#define IJ(op) \ #define IJ(op) \
MAYBE_EMIT_CONST(); \ MAYBE_EMIT_CONST(); \
STACK_POP(8); \ STACK_POP(8); \
emit("movl 4(%%r9, %%rbx, 1), %%eax"); \ emit("movl 4(%%r9, %%rbx, 4), %%eax"); \
emit("cmpl 8(%%r9, %%rbx, 1), %%eax"); \ emit("cmpl 8(%%r9, %%rbx, 4), %%eax"); \
emit(op " i_%08x", instruction+1); \ emit(op " i_%08x", instruction+1); \
JMPIARG(); \ JMPIARG(); \
neednilabel = 1 neednilabel = 1
@ -315,8 +315,8 @@ void emit(const char* fmt, ...)
#define FJ(bits, op) \ #define FJ(bits, op) \
MAYBE_EMIT_CONST(); \ MAYBE_EMIT_CONST(); \
STACK_POP(8); \ STACK_POP(8); \
emit("flds 4(%%r9, %%rbx, 1)");\ emit("flds 4(%%r9, %%rbx, 4)");\
emit("fcomps 8(%%r9, %%rbx, 1)");\ emit("fcomps 8(%%r9, %%rbx, 4)");\
emit("fnstsw %%ax");\ emit("fnstsw %%ax");\
emit("testb $" #bits ", %%ah");\ emit("testb $" #bits ", %%ah");\
emit(op " i_%08x", instruction+1);\ emit(op " i_%08x", instruction+1);\
@ -328,8 +328,8 @@ void emit(const char* fmt, ...)
#define XJ(op) \ #define XJ(op) \
MAYBE_EMIT_CONST(); \ MAYBE_EMIT_CONST(); \
STACK_POP(8); \ STACK_POP(8); \
emit("movss 4(%%r9, %%rbx, 1), %%xmm0");\ emit("movss 4(%%r9, %%rbx, 4), %%xmm0");\
emit("ucomiss 8(%%r9, %%rbx, 1), %%xmm0");\ emit("ucomiss 8(%%r9, %%rbx, 4), %%xmm0");\
emit("jp i_%08x", instruction+1);\ emit("jp i_%08x", instruction+1);\
emit(op " i_%08x", instruction+1);\ emit(op " i_%08x", instruction+1);\
JMPIARG(); \ JMPIARG(); \
@ -338,35 +338,35 @@ void emit(const char* fmt, ...)
#define SIMPLE(op) \ #define SIMPLE(op) \
MAYBE_EMIT_CONST(); \ MAYBE_EMIT_CONST(); \
emit("movl (%%r9, %%rbx, 1), %%eax"); \ emit("movl (%%r9, %%rbx, 4), %%eax"); \
STACK_POP(4); \ STACK_POP(4); \
emit(op " %%eax, (%%r9, %%rbx, 1)") emit(op " %%eax, (%%r9, %%rbx, 4)")
#ifdef USE_X87 #ifdef USE_X87
#define FSIMPLE(op) \ #define FSIMPLE(op) \
MAYBE_EMIT_CONST(); \ MAYBE_EMIT_CONST(); \
STACK_POP(4); \ STACK_POP(4); \
emit("flds (%%r9, %%rbx, 1)"); \ emit("flds (%%r9, %%rbx, 4)"); \
emit(op " 4(%%r9, %%rbx, 1)"); \ emit(op " 4(%%r9, %%rbx, 4)"); \
emit("fstps (%%r9, %%rbx, 1)") emit("fstps (%%r9, %%rbx, 4)")
#define XSIMPLE(op) #define XSIMPLE(op)
#else #else
#define FSIMPLE(op) #define FSIMPLE(op)
#define XSIMPLE(op) \ #define XSIMPLE(op) \
MAYBE_EMIT_CONST(); \ MAYBE_EMIT_CONST(); \
STACK_POP(4); \ STACK_POP(4); \
emit("movss (%%r9, %%rbx, 1), %%xmm0"); \ emit("movss (%%r9, %%rbx, 4), %%xmm0"); \
emit(op " 4(%%r9, %%rbx, 1), %%xmm0"); \ emit(op " 4(%%r9, %%rbx, 4), %%xmm0"); \
emit("movss %%xmm0, (%%r9, %%rbx, 1)") emit("movss %%xmm0, (%%r9, %%rbx, 4)")
#endif #endif
#define SHIFT(op) \ #define SHIFT(op) \
MAYBE_EMIT_CONST(); \ MAYBE_EMIT_CONST(); \
STACK_POP(4); \ STACK_POP(4); \
emit("movl 4(%%r9, %%rbx, 1), %%ecx"); \ emit("movl 4(%%r9, %%rbx, 4), %%ecx"); \
emit("movl (%%r9, %%rbx, 1), %%eax"); \ emit("movl (%%r9, %%rbx, 4), %%eax"); \
emit(op " %%cl, %%eax"); \ emit(op " %%cl, %%eax"); \
emit("movl %%eax, (%%r9, %%rbx, 1)") emit("movl %%eax, (%%r9, %%rbx, 4)")
#ifdef DEBUG_VM #ifdef DEBUG_VM
#define NOTIMPL(x) \ #define NOTIMPL(x) \
@ -564,7 +564,7 @@ void VM_Compile( vm_t *vm, vmHeader_t *header ) {
else else
{ {
MAYBE_EMIT_CONST(); MAYBE_EMIT_CONST();
emit("movl (%%r9, %%rbx, 1), %%eax"); // get instr from stack emit("movl (%%r9, %%rbx, 4), %%eax"); // get instr from stack
STACK_POP(4); STACK_POP(4);
emit("orl %%eax, %%eax"); emit("orl %%eax, %%eax");
@ -605,7 +605,7 @@ void VM_Compile( vm_t *vm, vmHeader_t *header ) {
emit("pop %%rdi"); emit("pop %%rdi");
// emit("frstor 4(%%r9, %%rsi, 1)"); // emit("frstor 4(%%r9, %%rsi, 1)");
STACK_PUSH(4); STACK_PUSH(4);
emit("movl %%eax, (%%r9, %%rbx, 1)"); // store return value emit("movl %%eax, (%%r9, %%rbx, 4)"); // store return value
neednilabel = 1; neednilabel = 1;
break; break;
case OP_PUSH: case OP_PUSH:
@ -623,7 +623,7 @@ void VM_Compile( vm_t *vm, vmHeader_t *header ) {
const_value = iarg; const_value = iarg;
#else #else
STACK_PUSH(4); STACK_PUSH(4);
emit("movl $%d, (%%r9, %%rbx, 1)", iarg); emit("movl $%d, (%%r9, %%rbx, 4)", iarg);
#endif #endif
break; break;
case OP_LOCAL: case OP_LOCAL:
@ -631,7 +631,7 @@ void VM_Compile( vm_t *vm, vmHeader_t *header ) {
emit("movl %%edi, %%esi"); emit("movl %%edi, %%esi");
emit("addl $%d,%%esi", iarg); emit("addl $%d,%%esi", iarg);
STACK_PUSH(4); STACK_PUSH(4);
emit("movl %%esi, (%%r9, %%rbx, 1)"); emit("movl %%esi, (%%r9, %%rbx, 4)");
break; break;
case OP_JUMP: case OP_JUMP:
if(got_const) { if(got_const) {
@ -639,7 +639,7 @@ void VM_Compile( vm_t *vm, vmHeader_t *header ) {
got_const = 0; got_const = 0;
JMPIARG(); JMPIARG();
} else { } else {
emit("movl (%%r9, %%rbx, 1), %%eax"); // get instr from stack emit("movl (%%r9, %%rbx, 4), %%eax"); // get instr from stack
STACK_POP(4); STACK_POP(4);
PREPARE_JMP(eax); PREPARE_JMP(eax);
@ -685,8 +685,8 @@ void VM_Compile( vm_t *vm, vmHeader_t *header ) {
#ifndef USE_X87 #ifndef USE_X87
MAYBE_EMIT_CONST(); MAYBE_EMIT_CONST();
STACK_POP(8); STACK_POP(8);
emit("movss 4(%%r9, %%rbx, 1), %%xmm0"); emit("movss 4(%%r9, %%rbx, 4), %%xmm0");
emit("ucomiss 8(%%r9, %%rbx, 1), %%xmm0"); emit("ucomiss 8(%%r9, %%rbx, 4), %%xmm0");
emit("jp dojump_i_%08x", instruction); emit("jp dojump_i_%08x", instruction);
emit("jz i_%08x", instruction+1); emit("jz i_%08x", instruction+1);
emit("dojump_i_%08x:", instruction); emit("dojump_i_%08x:", instruction);
@ -712,54 +712,54 @@ void VM_Compile( vm_t *vm, vmHeader_t *header ) {
break; break;
case OP_LOAD1: case OP_LOAD1:
MAYBE_EMIT_CONST(); MAYBE_EMIT_CONST();
emit("movl (%%r9, %%rbx, 1), %%eax"); // get value from stack emit("movl (%%r9, %%rbx, 4), %%eax"); // get value from stack
RANGECHECK(eax, 1); RANGECHECK(eax, 1);
emit("movb (%%r8, %%rax, 1), %%al"); // deref into eax emit("movb (%%r8, %%rax, 1), %%al"); // deref into eax
emit("andq $255, %%rax"); emit("andq $255, %%rax");
emit("movl %%eax, (%%r9, %%rbx, 1)"); // store on stack emit("movl %%eax, (%%r9, %%rbx, 4)"); // store on stack
break; break;
case OP_LOAD2: case OP_LOAD2:
MAYBE_EMIT_CONST(); MAYBE_EMIT_CONST();
emit("movl (%%r9, %%rbx, 1), %%eax"); // get value from stack emit("movl (%%r9, %%rbx, 4), %%eax"); // get value from stack
RANGECHECK(eax, 2); RANGECHECK(eax, 2);
emit("movw (%%r8, %%rax, 1), %%ax"); // deref into eax emit("movw (%%r8, %%rax, 1), %%ax"); // deref into eax
emit("movl %%eax, (%%r9, %%rbx, 1)"); // store on stack emit("movl %%eax, (%%r9, %%rbx, 4)"); // store on stack
break; break;
case OP_LOAD4: case OP_LOAD4:
MAYBE_EMIT_CONST(); MAYBE_EMIT_CONST();
emit("movl (%%r9, %%rbx, 1), %%eax"); // get value from stack emit("movl (%%r9, %%rbx, 4), %%eax"); // get value from stack
RANGECHECK(eax, 4); // not a pointer!? RANGECHECK(eax, 4); // not a pointer!?
emit("movl (%%r8, %%rax, 1), %%eax"); // deref into eax emit("movl (%%r8, %%rax, 1), %%eax"); // deref into eax
emit("movl %%eax, (%%r9, %%rbx, 1)"); // store on stack emit("movl %%eax, (%%r9, %%rbx, 4)"); // store on stack
break; break;
case OP_STORE1: case OP_STORE1:
MAYBE_EMIT_CONST(); MAYBE_EMIT_CONST();
emit("movl (%%r9, %%rbx, 1), %%eax"); // get value from stack emit("movl (%%r9, %%rbx, 4), %%eax"); // get value from stack
STACK_POP(8); STACK_POP(8);
emit("andq $255, %%rax"); emit("andq $255, %%rax");
emit("movl 4(%%r9, %%rbx, 1), %%esi"); // get pointer from stack emit("movl 4(%%r9, %%rbx, 4), %%esi"); // get pointer from stack
RANGECHECK(esi, 1); RANGECHECK(esi, 1);
emit("movb %%al, (%%r8, %%rsi, 1)"); // store in memory emit("movb %%al, (%%r8, %%rsi, 1)"); // store in memory
break; break;
case OP_STORE2: case OP_STORE2:
MAYBE_EMIT_CONST(); MAYBE_EMIT_CONST();
emit("movl (%%r9, %%rbx, 1), %%eax"); // get value from stack emit("movl (%%r9, %%rbx, 4), %%eax"); // get value from stack
STACK_POP(8); STACK_POP(8);
emit("movl 4(%%r9, %%rbx, 1), %%esi"); // get pointer from stack emit("movl 4(%%r9, %%rbx, 4), %%esi"); // get pointer from stack
RANGECHECK(esi, 2); RANGECHECK(esi, 2);
emit("movw %%ax, (%%r8, %%rsi, 1)"); // store in memory emit("movw %%ax, (%%r8, %%rsi, 1)"); // store in memory
break; break;
case OP_STORE4: case OP_STORE4:
MAYBE_EMIT_CONST(); MAYBE_EMIT_CONST();
emit("movl (%%r9, %%rbx, 1), %%eax"); // get value from stack emit("movl (%%r9, %%rbx, 4), %%eax"); // get value from stack
STACK_POP(8); STACK_POP(8);
emit("movl 4(%%r9, %%rbx, 1), %%esi"); // get pointer from stack emit("movl 4(%%r9, %%rbx, 4), %%esi"); // get pointer from stack
RANGECHECK(esi, 4); RANGECHECK(esi, 4);
emit("movl %%eax, (%%r8, %%rsi, 1)"); // store in memory emit("movl %%eax, (%%r8, %%rsi, 1)"); // store in memory
break; break;
case OP_ARG: case OP_ARG:
MAYBE_EMIT_CONST(); MAYBE_EMIT_CONST();
emit("movl (%%r9, %%rbx, 1), %%eax"); // get value from stack emit("movl (%%r9, %%rbx, 4), %%eax"); // get value from stack
STACK_POP(4); STACK_POP(4);
emit("movl $0x%hx, %%esi", barg); emit("movl $0x%hx, %%esi", barg);
emit("addl %%edi, %%esi"); emit("addl %%edi, %%esi");
@ -779,8 +779,8 @@ void VM_Compile( vm_t *vm, vmHeader_t *header ) {
emit("andq $127, %%rsi"); // | emit("andq $127, %%rsi"); // |
emit("subq %%rsi, %%rsp"); // <-+ emit("subq %%rsi, %%rsp"); // <-+
emit("push %%rsi"); emit("push %%rsi");
emit("movl 4(%%r9, %%rbx, 1), %%edi"); // 1st argument dest emit("movl 4(%%r9, %%rbx, 4), %%edi"); // 1st argument dest
emit("movl 8(%%r9, %%rbx, 1), %%rsi"); // 2nd argument src emit("movl 8(%%r9, %%rbx, 4), %%rsi"); // 2nd argument src
emit("movl $%d, %%edx", iarg); // 3rd argument count emit("movl $%d, %%edx", iarg); // 3rd argument count
emit("movq $%"PRIu64", %%rax", (intptr_t) block_copy_vm); emit("movq $%"PRIu64", %%rax", (intptr_t) block_copy_vm);
emit("callq *%%rax"); emit("callq *%%rax");
@ -794,21 +794,21 @@ void VM_Compile( vm_t *vm, vmHeader_t *header ) {
break; break;
case OP_SEX8: case OP_SEX8:
MAYBE_EMIT_CONST(); MAYBE_EMIT_CONST();
emit("movw (%%r9, %%rbx, 1), %%ax"); emit("movw (%%r9, %%rbx, 4), %%ax");
emit("andq $255, %%rax"); emit("andq $255, %%rax");
emit("cbw"); emit("cbw");
emit("cwde"); emit("cwde");
emit("movl %%eax, (%%r9, %%rbx, 1)"); emit("movl %%eax, (%%r9, %%rbx, 4)");
break; break;
case OP_SEX16: case OP_SEX16:
MAYBE_EMIT_CONST(); MAYBE_EMIT_CONST();
emit("movw (%%r9, %%rbx, 1), %%ax"); emit("movw (%%r9, %%rbx, 4), %%ax");
emit("cwde"); emit("cwde");
emit("movl %%eax, (%%r9, %%rbx, 1)"); emit("movl %%eax, (%%r9, %%rbx, 4)");
break; break;
case OP_NEGI: case OP_NEGI:
MAYBE_EMIT_CONST(); MAYBE_EMIT_CONST();
emit("negl (%%r9, %%rbx, 1)"); emit("negl (%%r9, %%rbx, 4)");
break; break;
case OP_ADD: case OP_ADD:
SIMPLE("addl"); SIMPLE("addl");
@ -819,49 +819,49 @@ void VM_Compile( vm_t *vm, vmHeader_t *header ) {
case OP_DIVI: case OP_DIVI:
MAYBE_EMIT_CONST(); MAYBE_EMIT_CONST();
STACK_POP(4); STACK_POP(4);
emit("movl (%%r9, %%rbx, 1), %%eax"); emit("movl (%%r9, %%rbx, 4), %%eax");
emit("cdq"); emit("cdq");
emit("idivl 4(%%r9, %%rbx, 1)"); emit("idivl 4(%%r9, %%rbx, 4)");
emit("movl %%eax, (%%r9, %%rbx, 1)"); emit("movl %%eax, (%%r9, %%rbx, 4)");
break; break;
case OP_DIVU: case OP_DIVU:
MAYBE_EMIT_CONST(); MAYBE_EMIT_CONST();
STACK_POP(4); STACK_POP(4);
emit("movl (%%r9, %%rbx, 1), %%eax"); emit("movl (%%r9, %%rbx, 4), %%eax");
emit("xorq %%rdx, %%rdx"); emit("xorq %%rdx, %%rdx");
emit("divl 4(%%r9, %%rbx, 1)"); emit("divl 4(%%r9, %%rbx, 4)");
emit("movl %%eax, (%%r9, %%rbx, 1)"); emit("movl %%eax, (%%r9, %%rbx, 4)");
break; break;
case OP_MODI: case OP_MODI:
MAYBE_EMIT_CONST(); MAYBE_EMIT_CONST();
STACK_POP(4); STACK_POP(4);
emit("movl (%%r9, %%rbx, 1), %%eax"); emit("movl (%%r9, %%rbx, 4), %%eax");
emit("xorl %%edx, %%edx"); emit("xorl %%edx, %%edx");
emit("cdq"); emit("cdq");
emit("idivl 4(%%r9, %%rbx, 1)"); emit("idivl 4(%%r9, %%rbx, 4)");
emit("movl %%edx, (%%r9, %%rbx, 1)"); emit("movl %%edx, (%%r9, %%rbx, 4)");
break; break;
case OP_MODU: case OP_MODU:
MAYBE_EMIT_CONST(); MAYBE_EMIT_CONST();
STACK_POP(4); STACK_POP(4);
emit("movl (%%r9, %%rbx, 1), %%eax"); emit("movl (%%r9, %%rbx, 4), %%eax");
emit("xorl %%edx, %%edx"); emit("xorl %%edx, %%edx");
emit("divl 4(%%r9, %%rbx, 1)"); emit("divl 4(%%r9, %%rbx, 4)");
emit("movl %%edx, (%%r9, %%rbx, 1)"); emit("movl %%edx, (%%r9, %%rbx, 4)");
break; break;
case OP_MULI: case OP_MULI:
MAYBE_EMIT_CONST(); MAYBE_EMIT_CONST();
STACK_POP(4); STACK_POP(4);
emit("movl (%%r9, %%rbx, 1), %%eax"); emit("movl (%%r9, %%rbx, 4), %%eax");
emit("imull 4(%%r9, %%rbx, 1)"); emit("imull 4(%%r9, %%rbx, 4)");
emit("movl %%eax, (%%r9, %%rbx, 1)"); emit("movl %%eax, (%%r9, %%rbx, 4)");
break; break;
case OP_MULU: case OP_MULU:
MAYBE_EMIT_CONST(); MAYBE_EMIT_CONST();
STACK_POP(4); STACK_POP(4);
emit("movl (%%r9, %%rbx, 1), %%eax"); emit("movl (%%r9, %%rbx, 4), %%eax");
emit("mull 4(%%r9, %%rbx, 1)"); emit("mull 4(%%r9, %%rbx, 4)");
emit("movl %%eax, (%%r9, %%rbx, 1)"); emit("movl %%eax, (%%r9, %%rbx, 4)");
break; break;
case OP_BAND: case OP_BAND:
SIMPLE("andl"); SIMPLE("andl");
@ -874,7 +874,7 @@ void VM_Compile( vm_t *vm, vmHeader_t *header ) {
break; break;
case OP_BCOM: case OP_BCOM:
MAYBE_EMIT_CONST(); MAYBE_EMIT_CONST();
emit("notl (%%r9, %%rbx, 1)"); emit("notl (%%r9, %%rbx, 4)");
break; break;
case OP_LSH: case OP_LSH:
SHIFT("shl"); SHIFT("shl");
@ -888,12 +888,12 @@ void VM_Compile( vm_t *vm, vmHeader_t *header ) {
case OP_NEGF: case OP_NEGF:
MAYBE_EMIT_CONST(); MAYBE_EMIT_CONST();
#ifdef USE_X87 #ifdef USE_X87
emit("flds (%%r9, %%rbx, 1)"); emit("flds (%%r9, %%rbx, 4)");
emit("fchs"); emit("fchs");
emit("fstps (%%r9, %%rbx, 1)"); emit("fstps (%%r9, %%rbx, 4)");
#else #else
emit("movl $0x80000000, %%eax"); emit("movl $0x80000000, %%eax");
emit("xorl %%eax, (%%r9, %%rbx, 1)"); emit("xorl %%eax, (%%r9, %%rbx, 4)");
#endif #endif
break; break;
case OP_ADDF: case OP_ADDF:
@ -915,27 +915,27 @@ void VM_Compile( vm_t *vm, vmHeader_t *header ) {
case OP_CVIF: case OP_CVIF:
MAYBE_EMIT_CONST(); MAYBE_EMIT_CONST();
#ifdef USE_X87 #ifdef USE_X87
emit("filds (%%r9, %%rbx, 1)"); emit("filds (%%r9, %%rbx, 4)");
emit("fstps (%%r9, %%rbx, 1)"); emit("fstps (%%r9, %%rbx, 4)");
#else #else
emit("movl (%%r9, %%rbx, 1), %%eax"); emit("movl (%%r9, %%rbx, 4), %%eax");
emit("cvtsi2ss %%eax, %%xmm0"); emit("cvtsi2ss %%eax, %%xmm0");
emit("movss %%xmm0, (%%r9, %%rbx, 1)"); emit("movss %%xmm0, (%%r9, %%rbx, 4)");
#endif #endif
break; break;
case OP_CVFI: case OP_CVFI:
MAYBE_EMIT_CONST(); MAYBE_EMIT_CONST();
#ifdef USE_X87 #ifdef USE_X87
emit("flds (%%r9, %%rbx, 1)"); emit("flds (%%r9, %%rbx, 4)");
emit("fnstcw 4(%%r9, %%rbx, 1)"); emit("fnstcw 4(%%r9, %%rbx, 4)");
emit("movw $0x0F7F, 8(%%r9, %%rbx, 1)"); // round toward zero emit("movw $0x0F7F, 8(%%r9, %%rbx, 4)"); // round toward zero
emit("fldcw 8(%%r9, %%rbx, 1)"); emit("fldcw 8(%%r9, %%rbx, 4)");
emit("fistpl (%%r9, %%rbx, 1)"); emit("fistpl (%%r9, %%rbx, 4)");
emit("fldcw 4(%%r9, %%rbx, 1)"); emit("fldcw 4(%%r9, %%rbx, 4)");
#else #else
emit("movss (%%r9, %%rbx, 1), %%xmm0"); emit("movss (%%r9, %%rbx, 4), %%xmm0");
emit("cvttss2si %%xmm0, %%eax"); emit("cvttss2si %%xmm0, %%eax");
emit("movl %%eax, (%%r9, %%rbx, 1)"); emit("movl %%eax, (%%r9, %%rbx, 4)");
#endif #endif
break; break;
default: default:
@ -1094,7 +1094,7 @@ int VM_CallCompiled( vm_t *vm, int *args ) {
: "g" (entryPoint), "g" (opStack), "g" (vm->dataBase), "g" (programStack) : "g" (entryPoint), "g" (opStack), "g" (vm->dataBase), "g" (programStack)
: "%rsi", "%rdi", "%rax", "%rbx", "%rcx", "%rdx", "%r8", "%r9", "%r10", "%r15", "%xmm0" : "%rsi", "%rdi", "%rax", "%rbx", "%rcx", "%rdx", "%r8", "%r9", "%r10", "%r15", "%xmm0"
); );
if(opStackRet != 4 || *opStack != 0xDEADBEEF) if(opStackRet != 1 || *opStack != 0xDEADBEEF)
Com_Error(ERR_DROP, "opStack corrupted in compiled code (offset %ld)", opStackRet); Com_Error(ERR_DROP, "opStack corrupted in compiled code (offset %ld)", opStackRet);
if ( programStack != stackOnEntry - 48 ) { if ( programStack != stackOnEntry - 48 ) {