[quake3-commits] r1981 - in trunk/code: game qcommon

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Sat May 14 10:34:19 EDT 2011


Author: thilo
Date: 2011-05-14 10:34:18 -0400 (Sat, 14 May 2011)
New Revision: 1981

Modified:
   trunk/code/game/g_main.c
   trunk/code/game/g_spawn.c
   trunk/code/qcommon/vm_x86.c
   trunk/code/qcommon/vm_x86_64.c
Log:
ensure that ent->classname is always non-null (for entity numbers up to level.num_entities-1, and ENTITYNUM_WORLD and ENTITYNUM_NONE), for player entities and #ENTITYNUM_NONE in particular, patch by DevHC


Modified: trunk/code/game/g_main.c
===================================================================
--- trunk/code/game/g_main.c	2011-05-14 14:32:43 UTC (rev 1980)
+++ trunk/code/game/g_main.c	2011-05-14 14:34:18 UTC (rev 1981)
@@ -466,6 +466,10 @@
 	// range are NEVER anything but clients
 	level.num_entities = MAX_CLIENTS;
 
+	for ( i=0 ; i<MAX_CLIENTS ; i++ ) {
+		g_entities[i].classname = "clientslot";
+	}
+
 	// let the server system know where the entites are
 	trap_LocateGameData( level.gentities, level.num_entities, sizeof( gentity_t ), 
 		&level.clients[0].ps, sizeof( level.clients[0] ) );

Modified: trunk/code/game/g_spawn.c
===================================================================
--- trunk/code/game/g_spawn.c	2011-05-14 14:32:43 UTC (rev 1980)
+++ trunk/code/game/g_spawn.c	2011-05-14 14:34:18 UTC (rev 1981)
@@ -582,8 +582,13 @@
 	trap_Cvar_Set( "g_enableBreath", s );
 
 	g_entities[ENTITYNUM_WORLD].s.number = ENTITYNUM_WORLD;
+	g_entities[ENTITYNUM_WORLD].r.ownerNum = ENTITYNUM_NONE;
 	g_entities[ENTITYNUM_WORLD].classname = "worldspawn";
 
+	g_entities[ENTITYNUM_NONE].s.number = ENTITYNUM_NONE;
+	g_entities[ENTITYNUM_NONE].r.ownerNum = ENTITYNUM_NONE;
+	g_entities[ENTITYNUM_NONE].classname = "nothing";
+
 	// see if we want a warmup time
 	trap_SetConfigstring( CS_WARMUP, "" );
 	if ( g_restarted.integer ) {

Modified: trunk/code/qcommon/vm_x86.c
===================================================================
--- trunk/code/qcommon/vm_x86.c	2011-05-14 14:32:43 UTC (rev 1980)
+++ trunk/code/qcommon/vm_x86.c	2011-05-14 14:34:18 UTC (rev 1981)
@@ -56,12 +56,11 @@
 #define VMFREE_BUFFERS() do {Z_Free(buf); Z_Free(jused);} while(0)
 static	byte	*buf = NULL;
 static	byte	*jused = NULL;
+static	int		jusedSize = 0;
 static	int		compiledOfs = 0;
 static	byte	*code = NULL;
 static	int		pc = 0;
 
-static	int		*instructionPointers = NULL;
-
 #define FTOL_PTR
 
 #ifdef _MSC_VER
@@ -91,8 +90,6 @@
 static void (*const asmCallPtr)(void) = AsmCall;
 
 
-static	int		callMask = 0;
-
 static	int	instruction, pass;
 static	int	lastConst = 0;
 static	int	oc0, oc1, pop0, pop1;
@@ -107,6 +104,14 @@
 
 static	ELastCommand	LastCommand;
 
+static void ErrJump(void)
+{
+        Com_Error(ERR_DROP, "program tried to execute code outside VM");
+        exit(1);
+}
+
+static void (*const errJumpPtr)(void) = ErrJump;
+
 /*
 =================
 AsmCall
@@ -124,13 +129,21 @@
 	sub		edi, 4
 	test	eax,eax
 	jl		systemCall
+	cmp		eax, [currentVM->instructionCount]
+	jae		badAddr
 	// calling another vm function
 	shl		eax,2
-	add		eax, dword ptr [instructionPointers]
+	add		eax, dword ptr [currentVM->instructionPointers]
 	call	dword ptr [eax]
 	mov		eax, dword ptr [edi]
-	and		eax, [callMask]
 	ret
+badAddr:
+	call	ErrJump
+	// leave something on the opstack
+	//add		edi, 4
+	//mov		dword ptr [edi], 0
+	//ret
+
 systemCall:
 
 	// convert negative num to system call number
@@ -201,44 +214,61 @@
 	currentVM = vm;
 }
 
-__asm__(
-	".text\n\t"
-	".p2align 4,,15\n\t"
-#if defined __ELF__
-	".type " CMANGFUNC(AsmCall) ", @function\n"
-#endif
-	CMANGFUNC(AsmCall) ":\n\t"
-	"movl  (%edi), %eax\n\t"
-	"subl  $4, %edi\n\t"
-	"testl %eax, %eax\n\t"
+void AsmCall(void)
+{
+__asm__ __volatile__(
+//	".text\n\t"
+//	".p2align 4,,15\n\t"
+// #if defined __ELF__
+//	".type " CMANGFUNC(AsmCall) ", @function\n"
+// #endif
+//	CMANGFUNC(AsmCall) ":\n\t"
+	"movl  (%%edi), %%eax\n\t"
+	"subl  $4, %%edi\n\t"
+//	"movl  " CMANGVAR(currentVM) ", %ebx\n\t"
+	"testl %%eax, %%eax\n\t"
 	"jl    0f\n\t"
-	"shll  $2, %eax\n\t"
-	"addl  " CMANGVAR(instructionPointers) ", %eax\n\t"
-	"call  *(%eax)\n\t"
-	"movl  (%edi), %eax\n\t"
-	"andl  " CMANGVAR(callMask) ", %eax\n\t"
-	"ret\n"
+	"cmpl  %0, %%eax\n\t"
+//	"cmpl  0x68(%ebx), %eax\n\t"
+	"jae   1f\n\t"
+	"shll  $2, %%eax\n\t"
+	"addl  %1, %%eax\n\t"
+//	"addl  0x64(%ebx), %eax\n\t"
+	"call  *(%%eax)\n\t"
+	"movl  (%%edi), %%eax\n\t"
+	"jmp   2f\n\t"
+	"1:\n\t" // bad address, leave something on the opstack
+	"call  " CMANGFUNC(ErrJump) "\n\t"
+	//"addl  $4, %edi\n\t"
+	//"movl  $0, (%edi)\n\t"
+	//"ret\n\t"
 	"0:\n\t" // system call
-	"notl  %eax\n\t"
-	"pushl %ebp\n\t"
-	"movl  %esp, %ebp\n\t"
-	"andl $-16, %esp\n\t" // align the stack so engine can use sse
-	"pushl %ecx\n\t"
-	"pushl %edi\n\t" // opStack
-	"pushl %esi\n\t" // programStack
-	"pushl %eax\n\t" // syscallNum
+	"notl  %%eax\n\t"
+	"pushl %%ebp\n\t"
+	"movl  %%esp, %%ebp\n\t"
+
+	"andl $-16, %%esp\n\t" // align the stack so engine can use sse
+	"addl  $4, %%esp\n\t"
+	"pushl %%edi\n\t" // opStack
+	"pushl %%esi\n\t" // programStack
+	"pushl %%eax\n\t" // syscallNum
 	"call  " CMANGFUNC(CallAsmCall) "\n\t"
-	"addl  $12, %esp\n\t"
-	"popl  %ecx\n\t"
-	"movl  %ebp, %esp\n\t"
-	"popl  %ebp\n\t"
-	"addl  $4, %edi\n\t"
-	"ret\n\t"
+//	"addl  $12, %%esp\n\t"
+	"movl  %%ebp, %%esp\n\t"
+	"popl  %%ebp\n\t"
+	"addl  $4, %%edi\n\t"
+	"2:\n\t"
+//	"ret\n\t"
 #if defined __ELF__
-	".size " CMANGFUNC(AsmCall)", .-" CMANGFUNC(AsmCall)
+//	".size " CMANGFUNC(AsmCall)", .-" CMANGFUNC(AsmCall)
 #endif
+        :
+        : "g" (currentVM->instructionCount), "g" (currentVM->instructionPointers)
+        : "%eax"
 );
 
+}
+
 #endif
 
 static int	Constant4( void ) {
@@ -249,6 +279,11 @@
 	return v;
 }
 
+static int	NextConstant4( void ) {
+	return (code[pc] | (code[pc+1]<<8) | (code[pc+2]<<16) | (code[pc+3]<<24));
+}
+
+
 static int	Constant1( void ) {
 	int		v;
 
@@ -419,24 +454,151 @@
 
 /*
 =================
+DoSyscall
+Uses asm to get arguments from stack to work around different calling conventions
+=================
+*/
+
+static void DoSyscall(void)
+{
+        vm_t *savedVM;
+	int *data;
+
+	int syscallNum;
+	int programStack;
+	int *opStack;
+	
+	// Get arguments directly from registers to work around different calling conventions
+#ifdef _MSC_VER
+	__asm
+	{
+		mov		dword ptr syscallNum, eax
+		mov		dword ptr programStack, esi
+		mov		dword ptr opStack, edi
+	}
+#else
+	__asm__ volatile(
+		""
+		: "=a" (syscallNum), "=S" (programStack), "=D" (opStack)
+		:
+		: "memory"
+		);
+#endif
+
+	// save currentVM allow for recursive VM entry
+	savedVM = currentVM;
+	data = (int *) (savedVM->dataBase + programStack + 4);
+
+	// modify VM stack pointer for recursive VM entry
+	savedVM->programStack = programStack - 4;
+	*data = syscallNum;
+	opStack[1] = savedVM->systemCall(data);
+
+	currentVM = savedVM;
+}
+
+/*
+=================
+EmitVMCall
+=================
+*/
+
+void EmitVMCall(void)
+{
+	EmitString("FF 25");    // jmp dword ptr [instructionPointers + 0x12345678]
+	Emit4((intptr_t) vm->instructionPointers + v*4);
+}
+
+/*
+=================
+EmitSysCall
+=================
+*/
+
+void EmitSysCall(void)
+{
+	EmitString("F7 D0");	// not eax
+
+	// use ecx register to store DoSyscall address
+	EmitString("51");		// push ecx
+	EmitString("B1");		// mov ecx, [DoSyscall]
+	Emit4((intptr_t) DoSyscall);
+
+	// align the stack pointer to a 16-byte-boundary
+	EmitString("55");		// push ebp
+	EmitString("89 E5");		// mov ebp, esp
+	EmitString("83 E4 F0");		// and esp, 0xFFFFFFF0
+			
+	// call the syscall wrapper function
+	EmitString("FF D1");		// call ecx
+
+	// reset the stack pointer to its previous value
+	EmitString("89 EC");		// mov esp, ebp
+	EmitString("5D");		// pop ebp
+	EmitString("59");		// pop ecx
+
+	// have opStack reg point at return value
+	EmitString("83 C7 04");		// add edi, 4
+}
+
+/*
+=================
+EmitCall
+=================
+*/
+
+void EmitCall(qboolean got_const, int cdest)
+{
+	if(got_const)
+	{
+		EmitString("B8");	// mov eax, cdest
+		Emit4(cdest);
+
+		if(cdest < 0)
+			EmitSysCall();
+		else
+		{
+		        JUSED(cdest);
+		        EmitVMCall();
+		}
+	}
+	else
+	{
+//		EmitString();
+	}
+
+}
+
+/*
+=================
 VM_Compile
 =================
 */
 void VM_Compile( vm_t *vm, vmHeader_t *header ) {
 	int		op;
+	int		op1;
 	int		maxLength;
 	int		v;
 	int		i;
 	qboolean opt;
-	int jusedSize = header->instructionCount + 2;
+	
+	jusedSize = header->instructionCount + 2;
 
 	// allocate a very large temp buffer, we will shrink it later
 	maxLength = header->codeLength * 8;
 	buf = Z_Malloc(maxLength);
 	jused = Z_Malloc(jusedSize);
+	code = Z_Malloc(header->codeLength+32);
 	
 	Com_Memset(jused, 0, jusedSize);
+	Com_Memset(buf, 0, maxLength);
 
+	// copy code in larger buffer and put some zeros at the end
+	// so we can safely look ahead for a few instructions in it
+	// without a chance to get false-positive because of some garbage bytes
+	Com_Memset(code, 0, header->codeLength+32);
+	Com_Memcpy(code, (byte *)header + header->codeOffset, header->codeLength );
+
 	// ensure that the optimisation pass knows about all the jump
 	// table targets
 	for( i = 0; i < vm->numJumpTableTargets; i++ ) {
@@ -452,7 +614,7 @@
 	// translate all instructions
 	pc = 0;
 	instruction = 0;
-	code = (byte *)header + header->codeOffset;
+	//code = (byte *)header + header->codeOffset;
 	compiledOfs = 0;
 
 	LastCommand = LAST_COMMAND_NONE;
@@ -487,7 +649,14 @@
 			Emit4( Constant4() );
 			break;
 		case OP_CONST:
-			if (code[pc+4] == OP_LOAD4) {
+			// we can safely perform optimizations only in case if 
+			// we are 100% sure that next instruction is not a jump label
+			if ( !jused[instruction] && vm->jumpTableTargets )
+				op1 = code[pc+4];
+			else
+				op1 = OP_UNDEF;
+
+			if ( op1 == OP_LOAD4 ) {
 				EmitAddEDI4(vm);
 				EmitString( "BB" );		// mov	ebx, 0x12345678
 				Emit4( (Constant4()&vm->dataMask) + (int)vm->dataBase);
@@ -497,7 +666,7 @@
 				instruction += 1;
 				break;
 			}
-			if (code[pc+4] == OP_LOAD2) {
+			if ( op1 == OP_LOAD2 ) {
 				EmitAddEDI4(vm);
 				EmitString( "BB" );		// mov	ebx, 0x12345678
 				Emit4( (Constant4()&vm->dataMask) + (int)vm->dataBase);
@@ -507,7 +676,7 @@
 				instruction += 1;
 				break;
 			}
-			if (code[pc+4] == OP_LOAD1) {
+			if ( op1 == OP_LOAD1 ) {
 				EmitAddEDI4(vm);
 				EmitString( "BB" );		// mov	ebx, 0x12345678
 				Emit4( (Constant4()&vm->dataMask) + (int)vm->dataBase);
@@ -517,7 +686,7 @@
 				instruction += 1;
 				break;
 			}
-			if (code[pc+4] == OP_STORE4) {
+			if ( op1 == OP_STORE4 ) {
 				opt = EmitMovEBXEDI(vm, (vm->dataMask & ~3));
 				EmitString( "B8" );			// mov	eax, 0x12345678
 				Emit4( Constant4() );
@@ -532,7 +701,7 @@
 				instruction += 1;
 				break;
 			}
-			if (code[pc+4] == OP_STORE2) {
+			if ( op1 == OP_STORE2 ) {
 				opt = EmitMovEBXEDI(vm, (vm->dataMask & ~1));
 				EmitString( "B8" );			// mov	eax, 0x12345678
 				Emit4( Constant4() );
@@ -547,7 +716,7 @@
 				instruction += 1;
 				break;
 			}
-			if (code[pc+4] == OP_STORE1) {
+			if ( op1 == OP_STORE1 ) {
 				opt = EmitMovEBXEDI(vm, vm->dataMask);
 				EmitString( "B8" );			// mov	eax, 0x12345678
 				Emit4( Constant4() );
@@ -562,20 +731,113 @@
 				instruction += 1;
 				break;
 			}
-			if (code[pc+4] == OP_ADD) {
+			if ( op1 == OP_ADD ) {
+				v = NextConstant4();
+				if ( v == 1 ) {
+					EmitString( "FF 07" );	// inc dword ptr [edi]
+					pc += 5;				// OP_CONST + OP_ADD
+					instruction += 1;
+					break;
+				}
 				EmitString( "81 07" );		// add dword ptr [edi], 0x1234567
 				Emit4( Constant4() );
 				pc++;						// OP_ADD
 				instruction += 1;
 				break;
 			}
-			if (code[pc+4] == OP_SUB) {
+			if ( op1 == OP_SUB ) {
+				v = NextConstant4();
+				if ( v == 1 ) {
+					EmitString( "FF 0F" );	// dec dword ptr [edi]
+					pc += 5;				// OP_CONST + OP_SUB
+					instruction += 1;
+					break;
+				}
 				EmitString( "81 2F" );		// sub dword ptr [edi], 0x1234567
 				Emit4( Constant4() );
 				pc++;						// OP_ADD
 				instruction += 1;
 				break;
 			}
+			if ( op1 == OP_LSH ) {
+				v = NextConstant4();
+				if ( v >=1 && v <= 31 ) {
+					EmitString( "C1 27" );	// shl dword ptr [edi], 0x12
+					Emit1( v );
+					pc += 5;				// OP_CONST + OP_LSH
+					instruction += 1;
+					break;
+				}
+			}
+			if ( op1 == OP_RSHI ) {
+				v = NextConstant4();
+				if ( v >=1 && v <= 31 ) {
+					EmitString( "C1 3F" );	// sar dword ptr [edi], 0x12
+					Emit1( v );
+					pc += 5;				// OP_CONST + OP_RSHI
+					instruction += 1;
+					break;
+				}
+			}
+			if ( op1 == OP_RSHU ) {
+				v = NextConstant4();
+				if ( v >=1 && v <= 31 ) {
+					EmitString( "C1 2F" );	// shr dword ptr [edi], 0x12
+					Emit1( v );
+					pc += 5;				// OP_CONST + OP_RSHU
+					instruction += 1;
+					break;
+				}
+			}
+			if ( op1 == OP_BAND ) {
+				v = NextConstant4();
+				// try to generate shorter version
+				if ( v >= 0 && v <= 127 ) {
+					EmitString( "83 27" ); // and dword ptr[edi], 0x7F
+					Emit1( v );
+				} else {
+					EmitString( "81 27" ); // and dword ptr[edi], 0x7FFFF
+					Emit4( v );
+				}
+				pc += 5;				   // OP_CONST + OP_BAND
+				instruction += 1;
+				break;
+			}
+			if ( op1 == OP_BOR ) {
+				v = NextConstant4();
+				// try to generate shorter version
+				if ( v >= 0 && v <= 127 ) {
+					EmitString( "83 0F" ); // or dword ptr[edi], 0x7F
+					Emit1( v );
+				} else {
+					EmitString( "81 0F" ); // or dword ptr[edi], 0x7FFFF
+					Emit4( v );
+				}
+				pc += 5;				   // OP_CONST + OP_BOR
+				instruction += 1;
+				break;
+			}
+			if ( op1 == OP_JUMP ) {
+				v = Constant4();
+				JUSED(v);
+				EmitString( "FF 25" );    // jmp dword ptr [instructionPointers + 0x12345678]
+				Emit4( (intptr_t) vm->instructionPointers + v*4 );
+				pc += 1;                  // OP_JUMP
+				instruction += 1;
+				break;
+			}
+
+			if ( op1 == OP_CALL && NextConstant4() >= 0 ) {
+				v = Constant4();
+				JUSED(v);
+				EmitString( "FF 15" );    // call dword ptr [instructionPointers + 0x12345678]
+				Emit4( (intptr_t) vm->instructionPointers + v*4 );
+				EmitString( "8B 07" );    // mov eax, dword ptr [edi]
+				pc += 1;                  // OP_CALL
+				instruction += 1;
+				break;
+			}
+
 			EmitAddEDI4(vm);
 			EmitString( "C7 07" );		// mov	dword ptr [edi], 0x12345678
 			lastConst = Constant4();
@@ -595,14 +857,10 @@
 		case OP_ARG:
 			EmitMovEAXEDI(vm);			// mov	eax,dword ptr [edi]
 			EmitString( "89 86" );		// mov	dword ptr [esi+database],eax
-			// FIXME: range check
-			Emit4( Constant1() + (int)vm->dataBase );
+			Emit4((Constant1() & vm->dataMask & 0xFF) + (int)vm->dataBase);
 			EmitCommand(LAST_COMMAND_SUB_DI_4);		// sub edi, 4
 			break;
 		case OP_CALL:
-			EmitString( "C7 86" );		// mov dword ptr [esi+database],0x12345678
-			Emit4( (int)vm->dataBase );
-			Emit4( pc );
 			EmitString( "FF 15" );		// call asmCallPtr
 			Emit4( (int)&asmCallPtr );
 			break;
@@ -1076,11 +1334,15 @@
 			break;
 
 		case OP_JUMP:
-			EmitCommand(LAST_COMMAND_SUB_DI_4);		// sub edi, 4
-			EmitString( "8B 47 04" );	// mov eax,dword ptr [edi+4]
-			// FIXME: range check
-			EmitString( "FF 24 85" );	// jmp dword ptr [instructionPointers + eax * 4]
+			EmitCommand(LAST_COMMAND_SUB_DI_4); // sub edi, 4
+			EmitString( "8B 47 04" );           // mov eax,dword ptr [edi+4]
+			EmitString( "3B 05" );              // cmp eax,[callMask]
+			Emit4( (int)&vm->instructionCount );
+			EmitString( "73 07" );              // jae +7
+			EmitString( "FF 24 85" );           // jmp dword ptr [instructionPointers + eax * 4]
 			Emit4( (int)vm->instructionPointers );
+			EmitString( "FF 15" );              // call errJumpPtr
+			Emit4( (int)&errJumpPtr );
 			break;
 		default:
 		        VMFREE_BUFFERS();
@@ -1091,7 +1353,7 @@
 	}
 	}
 
-	// copy to an exact size buffer on the hunk
+	// copy to an exact sized buffer with the appropriate permission bits
 	vm->codeLength = compiledOfs;
 #ifdef VM_X86_MMAP
 	vm->codeBase = mmap(NULL, compiledOfs, PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
@@ -1123,6 +1385,7 @@
 	}
 #endif
 
+	Z_Free( code );
 	Z_Free( buf );
 	Z_Free( jused );
 	Com_Printf( "VM file %s compiled to %i bytes of code\n", vm->name, compiledOfs );
@@ -1160,18 +1423,12 @@
 	int		stackOnEntry;
 	byte	*image;
 	void	*opStack;
-	int		*oldInstructionPointers;
 
-	oldInstructionPointers = instructionPointers;
-
 	currentVM = vm;
-	instructionPointers = vm->instructionPointers;
 
 	// interpret the code
 	vm->currentlyInterpreting = qtrue;
 
-	callMask = vm->dataMask;
-
 	// we might be called recursively, so this might not be the very top
 	programStack = vm->programStack;
 	stackOnEntry = programStack;
@@ -1239,8 +1496,5 @@
 
 	vm->programStack = stackOnEntry;
 
-	// in case we were recursively called by another vm
-	instructionPointers = oldInstructionPointers;
-
 	return *(int *)opStack;
 }

Modified: trunk/code/qcommon/vm_x86_64.c
===================================================================
--- trunk/code/qcommon/vm_x86_64.c	2011-05-14 14:32:43 UTC (rev 1980)
+++ trunk/code/qcommon/vm_x86_64.c	2011-05-14 14:34:18 UTC (rev 1981)
@@ -82,11 +82,11 @@
 */
 
 
-static int64_t CROSSCALL callAsmCall(int64_t callProgramStack, int64_t callSyscallNum)
+static intptr_t CROSSCALL callAsmCall(intptr_t callProgramStack, int64_t callSyscallNum)
 {
 	vm_t *savedVM;
-	int64_t ret = 0x77;
-	int64_t args[11];
+	intptr_t ret = 0x77;
+	intptr_t args[11];
 //	int iargs[11];
 	int i;
 
@@ -245,7 +245,7 @@
 	emit("andl $0x%x, %%ecx", vm->dataMask &~(bytes-1)); \
 	emit("cmpl %%" #reg ", %%ecx"); \
 	emit("jz rc_ok_i_%08x", instruction); \
-	emit("movq $%"PRIu64", %%rax", (uint64_t) memviolation); \
+	emit("movq $%"PRIu64", %%rax", (intptr_t) memviolation); \
 	emit("callq *%%rax"); \
 	emit("rc_ok_i_%08x:", instruction)
 
@@ -254,7 +254,7 @@
 	emit("andl $0x%x, %%ecx", OPSTACK_MASK & ~0x03); \
 	emit("cmpl %%esi, %%ecx"); \
 	emit("jz oc_ok_i_%08x", instruction); \
-	emit("movq $%"PRIu64", %%rax", (uint64_t) opstackviolation); \
+	emit("movq $%"PRIu64", %%rax", (intptr_t) opstackviolation); \
 	emit("callq *%%rax"); \
 	emit("oc_ok_i_%08x:", instruction)
 #elif 1
@@ -279,13 +279,13 @@
 #define CHECK_INSTR_REG(reg) \
 	emit("cmpl $%u, %%"#reg, header->instructionCount); \
 	emit("jb jmp_ok_i_%08x", instruction); \
-	emit("movq $%"PRIu64", %%rax", (uint64_t)jmpviolation); \
+	emit("movq $%"PRIu64", %%rax", (intptr_t)jmpviolation); \
 	emit("callq *%%rax"); \
 	emit("jmp_ok_i_%08x:", instruction)
 
 #define PREPARE_JMP(reg) \
 	CHECK_INSTR_REG(reg); \
-	emit("movq $%"PRIu64", %%rbx", (uint64_t)vm->instructionPointers); \
+	emit("movq $%"PRIu64", %%rbx", (intptr_t)vm->instructionPointers); \
 	emit("movl (%%rbx, %%rax, 4), %%eax"); \
 	emit("addq %%r10, %%rax")
 
@@ -606,12 +606,11 @@
 					got_const = 0;
 					emit("movq $%u, %%rsi", -1-const_value); // second argument in rsi
 				} else {
-					emit("negl %%eax");        // convert to actual number
-					emit("decl %%eax");
+					emit("notl %%eax");        // convert to actual number
 					// first argument already in rdi
 					emit("movq %%rax, %%rsi"); // second argument in rsi
 				}
-				emit("movq $%"PRIu64", %%rax", (uint64_t)callAsmCall);
+				emit("movq $%"PRIu64", %%rax", (intptr_t) callAsmCall);
 				emit("callq *%%rax");
 				emit("pop %%rbx");
 				emit("addq %%rbx, %%rsp");
@@ -800,7 +799,7 @@
 				emit("movl 4(%%r9, %%rsi, 1), %%edi");  // 1st argument dest
 				emit("movl 8(%%r9, %%rsi, 1), %%esi");  // 2nd argument src
 				emit("movl $%d, %%edx", iarg); // 3rd argument count
-				emit("movq $%"PRIu64", %%rax", (uint64_t)block_copy_vm);
+				emit("movq $%"PRIu64", %%rax", (intptr_t) block_copy_vm);
 				emit("callq *%%rax");
 				emit("pop %%rbx");
 				emit("addq %%rbx, %%rsp");
@@ -971,7 +970,7 @@
 		Com_Error(ERR_DROP, "leftover const");
 	}
 
-	emit("movq $%"PRIu64", %%rax", (uint64_t)eop);
+	emit("movq $%"PRIu64", %%rax", (intptr_t) eop);
 	emit("callq *%%rax");
 
 	} // pass loop
@@ -1106,7 +1105,7 @@
 		"	movq %2,%%r10		\r\n" \
 		"       subq $24, %%rsp # fix alignment as call pushes one value \r\n" \
 		"	callq *%%r10		\r\n" \
-		"       addq $24, %%rsp          \r\n" \
+		"       addq $24, %%rsp         \r\n" \
 		"	movl %%edi, %0		\r\n" \
 		"	movl %%esi, %1		\r\n" \
 		: "=m" (programStack), "=m" (opStackRet)



More information about the quake3-commits mailing list