浏览代码

more jit x64 fixes

Nicolas Cannasse 7 年之前
父节点
当前提交
8be3e80d3c
共有 1 个文件被更改,包括 31 次插入14 次删除
  1. 31 14
      src/jit.c

+ 31 - 14
src/jit.c

@@ -2168,7 +2168,7 @@ static void op_jump( jit_ctx *ctx, vreg *a, vreg *b, hl_opcode *op, int targetPo
 				op64(ctx,TEST,pb,pb);
 				XJump_small(JZero,jb);
 				op_call_fun(ctx,NULL,(int)(int_val)a->t->obj->rt->compareFun,2,args);
-				op64(ctx,CMP,PEAX,pconst(&p,0));
+				op32(ctx,CMP,PEAX,pconst(&p,0));
 				register_jump(ctx,do_jump(ctx,op->op,false),targetPos);
 				patch_jump(ctx,ja);
 				patch_jump(ctx,jb);
@@ -2274,6 +2274,12 @@ static void *callback_c2hl( void *f, hl_type *t, void **args, vdynamic *ret ) {
 					*(double*)store = d;
 				}
 				break;
+			case HF64:
+				*(double*)store = *(double*)v;
+				break;
+			case HI64:
+				*(int64*)store = *(int64*)v;
+				break;
 			default:
 				*(void**)store = v;
 				break;
@@ -2299,6 +2305,7 @@ static void *callback_c2hl( void *f, hl_type *t, void **args, vdynamic *ret ) {
 				break;
 #			ifndef HL_64
 			case HF64:
+			case HI64:
 				// will be reversed when pushed back
 				*(int*)store = *((int*)v + 1);
 				*((int*)store + 1) = *(int*)v;
@@ -2412,26 +2419,32 @@ static void jit_c2hl( jit_ctx *ctx ) {
 	op64(ctx,RET,UNUSED,UNUSED);
 }
 
-static vdynamic *jit_wrapper_call( vclosure_wrapper *c, char *stack_args, void **call_regs ) {
+static vdynamic *jit_wrapper_call( vclosure_wrapper *c, char *stack_args, void **regs ) {
 	vdynamic *args[MAX_ARGS];
 	int i;
 	int nargs = c->cl.t->fun->nargs;
-#	ifdef JIT_DEBUG
-	if( nargs > 0 && IS_64 )
-		hl_error("TODO!"); // read call_regs
-#	endif
+	call_regs cregs = {0};
 	if( nargs > MAX_ARGS )
 		hl_error("Too many arguments for wrapped call");
 	for(i=0;i<nargs;i++) {
 		hl_type *t = c->cl.t->fun->args[i];
-		args[i] = hl_is_dynamic(t) ? *(vdynamic**)stack_args : hl_make_dyn(stack_args,t);
-		stack_args += stack_size(t);
+		int creg = select_call_reg(&cregs,t,i);
+		if( creg < 0 ) {
+			args[i] = hl_is_dynamic(t) ? *(vdynamic**)stack_args : hl_make_dyn(stack_args,t);
+			stack_args += stack_size(t);
+		} else if( hl_is_dynamic(t) ) {
+			args[i] = *(vdynamic**)(regs + call_reg_index(creg) + 1);
+		} else if( t->kind == HF32 || t->kind == HF64 ) {
+			args[i] = hl_make_dyn(regs + CALL_NREGS + creg - XMM(0),&hlt_f64);
+		} else {
+			args[i] = hl_make_dyn(regs + call_reg_index(creg) + 1,t);
+		}
 	}
 	return hl_dyn_call(c->wrappedFun,args,nargs);
 }
 
-static void *jit_wrapper_ptr( vclosure_wrapper *c, char *stack_args, void **call_regs ) {
-	vdynamic *ret = jit_wrapper_call(c, stack_args, call_regs);
+static void *jit_wrapper_ptr( vclosure_wrapper *c, char *stack_args, void **regs ) {
+	vdynamic *ret = jit_wrapper_call(c, stack_args, regs);
 	hl_type *tret = c->cl.t->fun->ret;
 	switch( tret->kind ) {
 	case HVOID:
@@ -2446,8 +2459,8 @@ static void *jit_wrapper_ptr( vclosure_wrapper *c, char *stack_args, void **call
 	}
 }
 
-static double jit_wrapper_d( vclosure_wrapper *c, char *stack_args, void **call_regs ) {
-	vdynamic *ret = jit_wrapper_call(c, stack_args, call_regs);
+static double jit_wrapper_d( vclosure_wrapper *c, char *stack_args, void **regs ) {
+	vdynamic *ret = jit_wrapper_call(c, stack_args, regs);
 	return hl_dyn_castd(&ret,&hlt_dyn);
 }
 
@@ -2497,8 +2510,9 @@ static void jit_hl2c( jit_ctx *ctx ) {
 	XJump_small(JEq,jfloat2);
 
 	size = begin_native_call(ctx,3);
+	op64(ctx, LEA, tmp, pmem(&p,Ebp,-HL_WSIZE*CALL_NREGS*2));
+	set_native_arg(ctx, tmp);
 	op64(ctx, LEA, tmp, pmem(&p,Ebp,HL_WSIZE*3));
-	set_native_arg(ctx, PEBP);
 	set_native_arg(ctx, tmp);
 	set_native_arg(ctx, cl);
 	call_native(ctx, jit_wrapper_ptr, size);
@@ -2506,6 +2520,9 @@ static void jit_hl2c( jit_ctx *ctx ) {
 
 	patch_jump(ctx,jfloat1);
 	patch_jump(ctx,jfloat2);
+	size = begin_native_call(ctx,3);
+	op64(ctx, LEA, tmp, pmem(&p,Ebp,-HL_WSIZE*CALL_NREGS*2));
+	set_native_arg(ctx, tmp);
 	op64(ctx, LEA, tmp, pmem(&p,Ebp,HL_WSIZE*3));
 	set_native_arg(ctx, tmp);
 	set_native_arg(ctx, cl);
@@ -2751,7 +2768,7 @@ int hl_jit_function( jit_ctx *ctx, hl_module *m, hl_function *f ) {
 			int reg = mapped_reg(&cregs, i);
 			if( reg < 0 ) continue;
 			p = REG_AT(reg);
-			op64(ctx,MOV,fetch(r),p);
+			op64(ctx,IS_FLOAT(r) ? MOVSD : MOV,fetch(r),p);
 			p->holds = r;
 			r->current = p;
 		}