Browse Source

more 16 bits support

Nicolas Cannasse 9 years ago
parent
commit
a635074f39
1 changed files with 28 additions and 14 deletions
  1. 28 14
      src/jit.c

+ 28 - 14
src/jit.c

@@ -85,10 +85,11 @@ typedef enum {
 	CVTSI2SD,
 	CVTSD2SI,
 	CVTPD2PS,
-	// 8 bits
+	// 8-16 bits
 	MOV8,
 	CMP8,
 	TEST8,
+	MOV16,
 	// --
 	_CPU_LAST
 } CpuOp;
@@ -379,6 +380,7 @@ static opform OP_FORMS[_CPU_LAST] = {
 	{ "MOV8", 0x8A, 0x88, 0, 0xB0, RM(0xC6,0) },
 	{ "CMP8", 0x3A, 0x38, 0, RM(0x80,7) },
 	{ "TEST8", 0x84, 0x84, RM(0xF6,0) },
+	{ "MOV16", LONG_OP(0x668B), LONG_OP(0x6689), LONG_OP(0x66B8) },
 };
 
 #ifdef OP_LOG
@@ -834,6 +836,7 @@ static void scratch( preg *r ) {
 	if( r && r->holds ) {
 		r->holds->current = NULL;
 		r->holds = NULL;
+		r->lock = 0;
 	}
 }
 
@@ -913,21 +916,11 @@ static preg *copy( jit_ctx *ctx, preg *to, preg *from, int size ) {
 				preg rtmp;
 				switch( ID2(to->kind,from->kind) ) {
 				case ID2(RCPU,RSTACK):
-					BREAK();
 					op32(ctx,MOV,to,from);
 					op32(ctx,AND,to,pconst(&rtmp,0xFFFF));
 					break;
 				case ID2(RSTACK,RCPU):
-					BREAK();
-					op32(ctx,MOV8,to,from);
-					{
-						preg *r = alloc_reg(ctx,RCPU);
-						op32(ctx,MOV,r,from);
-						op32(ctx,SAR,r,pconst(&rtmp,8));
-						R(to->id)->stackPos++;
-						op32(ctx,MOV8,to,r);
-						R(to->id)->stackPos--;
-					}
+					op32(ctx,MOV16,to,from);
 					break;
 				default:
 					ASSERT(size);
@@ -1134,7 +1127,9 @@ static int prepare_call_args( jit_ctx *ctx, int count, int *args, vreg *vregs, b
 			RUNLOCK(r->current);
 			break;
 		case 2:
-			BREAK();
+			op64(ctx,SUB,PESP,pconst(&p,2));
+			op32(ctx,MOV16,pmem(&p,Esp,0),alloc_cpu(ctx,r,true));
+			RUNLOCK(r->current);
 			break;
 		case 4:
 			if( !IS_64 ) {
@@ -1179,6 +1174,17 @@ static void call_native( jit_ctx *ctx, void *nativeFun, int size ) {
 	// MSVC requires 32bytes of free space here
 	op64(ctx,SUB,PESP,pconst(&p,32));
 	size += 32;
+#	endif
+#	ifdef HL_DEBUG
+	if( nativeFun != on_jit_error && ctx->f->findex != 0x29D && ctx->f->findex != 0x3A && ctx->f->findex != 0x3E5 && ctx->f->findex != 0x2C6 && ctx->f->findex != 0xA57 ) {
+		int j;
+		op64(ctx,MOV,PEAX,PESP);
+		op64(ctx,AND,PEAX,pconst(&p,15));
+		op64(ctx,TEST,PEAX,PEAX);
+		XJump_small(JZero,j);
+		jit_error("ESP % 16 != 0 in native call");
+		patch_jump(ctx,j);
+	}
 #	endif
 	// native function, already resolved
 	op64(ctx,MOV,PEAX,pconst64(&p,(int_val)nativeFun));
@@ -2186,6 +2192,7 @@ int hl_jit_function( jit_ctx *ctx, hl_module *m, hl_function *f ) {
 				preg *tmp = alloc_reg(ctx, RCPU);
 				op64(ctx,MOV,tmp,pmem(&p,r->id,HL_WSIZE*2));
 				op64(ctx,TEST,tmp,tmp);
+				scratch(tmp);
 				XJump_small(JNotZero,jhasvalue);
 				size = prepare_call_args(ctx,o->p3,o->extra,ctx->vregs,false,0);
 				if( r->holds != ra ) r = alloc_cpu(ctx, ra, true);
@@ -2195,7 +2202,6 @@ int hl_jit_function( jit_ctx *ctx, hl_module *m, hl_function *f ) {
 #				ifdef HL_64
 				jit_error("TODO");
 #				else
-				scratch(tmp);
 				size = prepare_call_args(ctx,o->p3,o->extra,ctx->vregs,false,4);
 				if( r->holds != ra ) r = alloc_cpu(ctx, ra, true);
 				op64(ctx, PUSH,pmem(&p,r->id,HL_WSIZE*3),UNUSED); // push closure value
@@ -2468,6 +2474,14 @@ int hl_jit_function( jit_ctx *ctx, hl_module *m, hl_function *f ) {
 				op32(ctx,MOV8,pmem2(&p,base->id,offset->id,1,0),value);
 			}
 			break;
+		case OSetI16:
+			{
+				preg *base = alloc_cpu(ctx, dst, true);
+				preg *offset = alloc_cpu(ctx, ra, true);
+				preg *value = alloc_cpu(ctx, rb, true);
+				op32(ctx,MOV16,pmem2(&p,base->id,offset->id,1,0),value);
+			}
+			break;
 		case OSetI32:
 			{
 				preg *base = alloc_cpu(ctx, dst, true);