Преглед изворни кода

changed i8 to ui8 and i16 to ui16

Nicolas Cannasse пре 9 година
родитељ
комит
6d1e33383f
8 измењених фајлова са 112 додато и 103 уклоњено
  1. 17 23
      src/callback.c
  2. 4 4
      src/hl.h
  3. 27 17
      src/jit.c
  4. 8 8
      src/std/buffer.c
  5. 33 28
      src/std/cast.c
  6. 6 6
      src/std/fun.c
  7. 13 13
      src/std/obj.c
  8. 4 4
      src/std/types.c

+ 17 - 23
src/callback.c

@@ -26,13 +26,7 @@
 static void *hl_callback_entry = NULL;
 
 void *hl_callback( void *f, hl_type *t, void **args, vdynamic *ret ) {
-	union {
-		unsigned char b[MAX_ARGS * 8];
-		unsigned short s[MAX_ARGS * 4];
-		int i[MAX_ARGS * 2];
-		double d[MAX_ARGS];
-		void *p[MAX_ARGS * 8 / HL_WSIZE];
-	} stack;	
+	unsigned char stack[MAX_ARGS * 8];	
 	/*
 		Same as jit(prepare_call_args) but writes values to the stack var
 	*/
@@ -51,37 +45,37 @@ void *hl_callback( void *f, hl_type *t, void **args, vdynamic *ret ) {
 		void *v = args[j];
 		int tsize = hl_stack_size(at);
 		if( hl_is_ptr(at) )
-			*(void**)&stack.b[pos] = v;
+			*(void**)&stack[pos] = v;
 		else switch( tsize ) {
 		case 0:
 			continue;
 		case 1:
-			stack.b[pos] = *(char*)v;
+			stack[pos] = *(unsigned char*)v;
 			break;
 		case 2:
-			*(short*)&stack.b[pos] = *(short*)v;
+			*(unsigned short*)&stack[pos] = *(unsigned short*)v;
 			break;
 		case 4:
 			switch( at->kind ) {
 			case HBOOL:
-			case HI8:
-				*(int*)&stack.b[pos] = *(unsigned char*)v;
+			case HUI8:
+				*(int*)&stack[pos] = *(unsigned char*)v;
 				break;
-			case HI16:
-				*(int*)&stack.b[pos] = *(unsigned short*)v;
+			case HUI16:
+				*(int*)&stack[pos] = *(unsigned short*)v;
 				break;
 			default:
-				*(int*)&stack.b[pos] = *(int*)v;
+				*(int*)&stack[pos] = *(int*)v;
 				break;
 			}
 			break;
 		case 8:
-			*(double*)&stack.b[pos] = *(double*)v;
+			*(double*)&stack[pos] = *(double*)v;
 			{
 				// SWAP (we push in reverse order in hl_callback_entry !
-				int i = *(int*)&stack.b[pos];
-				*(int*)&stack.b[pos] = *(int*)&stack.b[pos + 4];
-				*(int*)&stack.b[pos + 4] = i;
+				int i = *(int*)&stack[pos];
+				*(int*)&stack[pos] = *(int*)&stack[pos + 4];
+				*(int*)&stack[pos + 4] = i;
 			}
 			break;
 		default:
@@ -90,8 +84,8 @@ void *hl_callback( void *f, hl_type *t, void **args, vdynamic *ret ) {
 		pos += tsize;
 	}
 	switch( t->fun->ret->kind ) {
-	case HI8:
-	case HI16:
+	case HUI8:
+	case HUI16:
 	case HI32:
 	case HBOOL:
 		ret->v.i = ((int (*)(void *, void *, int, bool))hl_callback_entry)(f, &stack, (IS_64?pos>>3:pos>>2), false);
@@ -130,8 +124,8 @@ static void *hl_call_wrapper_ptr( vclosure_wrapper *c ) {
 	switch( tret->kind ) {
 	case HVOID:
 		return NULL;
-	case HI8:
-	case HI16:
+	case HUI8:
+	case HUI16:
 	case HI32:
 	case HBOOL:
 		return (void*)(int_val)hl_dyn_casti(ret,&hlt_dyn,tret);

+ 4 - 4
src/hl.h

@@ -184,8 +184,8 @@ HL_API void uprintf( const uchar *fmt, const uchar *str );
 
 typedef enum {
 	HVOID	= 0,
-	HI8		= 1,
-	HI16	= 2,
+	HUI8	= 1,
+	HUI16	= 2,
 	HI32	= 3,
 	HF32	= 4,
 	HF64	= 5,
@@ -318,8 +318,8 @@ typedef struct {
 #	endif
 	union {
 		bool b;
-		char c;
-		short s;
+		unsigned char ui8;
+		unsigned short ui16;
 		int i;
 		float f;
 		double d;

+ 27 - 17
src/jit.c

@@ -96,6 +96,7 @@ typedef enum {
 	CMP8,
 	TEST8,
 	MOV16,
+	CMP16,
 	// --
 	_CPU_LAST
 } CpuOp;
@@ -403,6 +404,7 @@ static opform OP_FORMS[_CPU_LAST] = {
 	{ "CMP8", 0x3A, 0x38, 0, RM(0x80,7) },
 	{ "TEST8", 0x84, 0x84, RM(0xF6,0) },
 	{ "MOV16", LONG_OP(0x668B), LONG_OP(0x6689), LONG_OP(0x66B8) },
+	{ "CMP16", LONG_OP(0x663B), LONG_OP(0x6639) },
 };
 
 #ifdef OP_LOG
@@ -1423,10 +1425,13 @@ static preg *op_binop( jit_ctx *ctx, vreg *dst, vreg *a, vreg *b, hl_opcode *op
 		case OJEq:
 		case OJNotEq:
 			switch( a->t->kind ) {
-			case HI8:
+			case HUI8:
 			case HBOOL:
 				o = CMP8;
 				break;
+			case HUI16:
+				o = CMP16;
+				break;
 			default:
 				o = CMP;
 				break;
@@ -1439,8 +1444,8 @@ static preg *op_binop( jit_ctx *ctx, vreg *dst, vreg *a, vreg *b, hl_opcode *op
 	}
 	switch( RTYPE(a) ) {
 	case HI32:
-	case HI16:
-	case HI8:
+	case HUI8:
+	case HUI16:
 	case HBOOL:
 #	ifndef HL_64
 	case HDYNOBJ:
@@ -1589,14 +1594,16 @@ static void register_jump( jit_ctx *ctx, int pos, int target ) {
 static void dyn_value_compare( jit_ctx *ctx, preg *a, preg *b, hl_type *t ) {
 	preg p;
 	switch( t->kind ) {
-	case HI8:
+	case HUI8:
 	case HBOOL:
 		op32(ctx,MOV8,a,pmem(&p,a->id,8));
 		op32(ctx,MOV8,b,pmem(&p,b->id,8));
 		op64(ctx,CMP8,a,b);
 		break;
-	case HI16:
-		jit_error("TODO");
+	case HUI16:
+		op32(ctx,MOV16,a,pmem(&p,a->id,8));
+		op32(ctx,MOV16,b,pmem(&p,b->id,8));
+		op64(ctx,CMP16,a,b);
 		break;
 	case HI32:
 		op32(ctx,MOV,a,pmem(&p,a->id,8));
@@ -1632,15 +1639,18 @@ static void op_jump( jit_ctx *ctx, vreg *a, vreg *b, hl_opcode *op, int targetPo
 		int args[] = { a->stack.id, b->stack.id };
 		int size = prepare_call_args(ctx,2,args,ctx->vregs,true,0);
 		call_native(ctx,hl_dyn_compare,size);
-		op32(ctx,TEST,PEAX,PEAX);
 		if( op->op == OJSGt || op->op == OJSGte ) {
-			jit_error("TODO");
+			preg p;
+			int jinvalid;
+			op32(ctx,CMP,PEAX,pconst(&p,hl_invalid_comparison));
+			XJump_small(JEq,jinvalid);
+			op32(ctx,TEST,PEAX,PEAX);
+			register_jump(ctx,do_jump(ctx,op->op, IS_FLOAT(a)),targetPos);
+			patch_jump(ctx,jinvalid);
 			return;
 		}
+		op32(ctx,TEST,PEAX,PEAX);
 	} else switch( a->t->kind ) {
-	case HI16:
-		jit_error("TODO");
-		return;
 	case HTYPE:
 		{
 			int args[] = { a->stack.id, b->stack.id };
@@ -1874,8 +1884,8 @@ static void *get_dyncast( hl_type *t ) {
 	case HF64:
 		return hl_dyn_castd;
 	case HI32:
-	case HI16:
-	case HI8:
+	case HUI16:
+	case HUI8:
 	case HBOOL:
 		return hl_dyn_casti;
 	default:
@@ -1890,8 +1900,8 @@ static void *get_dynset( hl_type *t ) {
 	case HF64:
 		return hl_dyn_setd;
 	case HI32:
-	case HI16:
-	case HI8:
+	case HUI16:
+	case HUI8:
 	case HBOOL:
 		return hl_dyn_seti;
 	default:
@@ -1906,8 +1916,8 @@ static void *get_dynget( hl_type *t ) {
 	case HF64:
 		return hl_dyn_getd;
 	case HI32:
-	case HI16:
-	case HI8:
+	case HUI16:
+	case HUI8:
 	case HBOOL:
 		return hl_dyn_geti;
 	default:

+ 8 - 8
src/std/buffer.c

@@ -134,11 +134,11 @@ static void hl_buffer_rec( hl_buffer *b, vdynamic *v, vlist *stack );
 static void hl_buffer_addr( hl_buffer *b, void *data, hl_type *t, vlist *stack ) {
 	uchar buf[32];
 	switch( t->kind ) {
-	case HI8:
-		hl_buffer_str_sub(b,buf,usprintf(buf,32,USTR("%d"),(int)*(char*)data));
+	case HUI8:
+		hl_buffer_str_sub(b,buf,usprintf(buf,32,USTR("%d"),(int)*(unsigned char*)data));
 		break;
-	case HI16:
-		hl_buffer_str_sub(b,buf,usprintf(buf,32,USTR("%d"),(int)*(short*)data));
+	case HUI16:
+		hl_buffer_str_sub(b,buf,usprintf(buf,32,USTR("%d"),(int)*(unsigned short*)data));
 		break;
 	case HI32:
 		hl_buffer_str_sub(b,buf,usprintf(buf,32,USTR("%d"),*(int*)data));
@@ -185,11 +185,11 @@ static void hl_buffer_rec( hl_buffer *b, vdynamic *v, vlist *stack ) {
 	case HVOID:
 		hl_buffer_str_sub(b,USTR("void"),4);
 		break;
-	case HI8:
-		hl_buffer_str_sub(b,buf,usprintf(buf,32,USTR("%d"),v->v.c));
+	case HUI8:
+		hl_buffer_str_sub(b,buf,usprintf(buf,32,USTR("%d"),v->v.ui8));
 		break;
-	case HI16:
-		hl_buffer_str_sub(b,buf,usprintf(buf,32,USTR("%d"),v->v.s));
+	case HUI16:
+		hl_buffer_str_sub(b,buf,usprintf(buf,32,USTR("%d"),v->v.ui16));
 		break;
 	case HI32:
 		hl_buffer_str_sub(b,buf,usprintf(buf,32,USTR("%d"),v->v.i));

+ 33 - 28
src/std/cast.c

@@ -26,15 +26,15 @@
 HL_PRIM vdynamic *hl_make_dyn( void *data, hl_type *t ) {
 	vdynamic *v;
 	switch( t->kind ) {
-	case HI8:
+	case HUI8:
 		v = (vdynamic*)hl_gc_alloc_noptr(sizeof(vdynamic));
 		v->t = t;
-		v->v.c = *(char*)data;
+		v->v.ui8 = *(unsigned char*)data;
 		return v;
-	case HI16:
+	case HUI16:
 		v = (vdynamic*)hl_gc_alloc_noptr(sizeof(vdynamic));
 		v->t = t;
-		v->v.s = *(short*)data;
+		v->v.ui16 = *(unsigned short*)data;
 		return v;
 	case HI32:
 		v = (vdynamic*)hl_gc_alloc_noptr(sizeof(vdynamic));
@@ -83,10 +83,10 @@ HL_PRIM int hl_dyn_casti( void *data, hl_type *t, hl_type *to ) {
 		if( !hl_is_dynamic(t) ) data = &v->v;
 	}
 	switch( t->kind ) {
-	case HI8:
-		return *(char*)data;
-	case HI16:
-		return *(short*)data;
+	case HUI8:
+		return *(unsigned char*)data;
+	case HUI16:
+		return *(unsigned short*)data;
 	case HI32:
 		return *(int*)data;
 	case HF32:
@@ -170,8 +170,8 @@ HL_PRIM void *hl_dyn_castp( void *data, hl_type *t, hl_type *to ) {
 		if( to->tparam->kind == t->kind )
 			return hl_make_dyn(data,t);
 		switch( to->tparam->kind ) {
-		case HI8:
-		case HI16:
+		case HUI8:
+		case HUI16:
 		case HI32:
 		case HBOOL:
 			{
@@ -208,10 +208,10 @@ HL_PRIM double hl_dyn_castd( void *data, hl_type *t ) {
 		return *(float*)data;
 	case HF64:
 		return *(double*)data;
-	case HI8:
-		return *(char*)data;
-	case HI16:
-		return *(short*)data;
+	case HUI8:
+		return *(unsigned char*)data;
+	case HUI16:
+		return *(unsigned short*)data;
 	case HI32:
 		return *(int*)data;
 	case HBOOL:
@@ -240,10 +240,10 @@ HL_PRIM float hl_dyn_castf( void *data, hl_type *t ) {
 		return *(float*)data;
 	case HF64:
 		return (float)*(double*)data;
-	case HI8:
-		return *(char*)data;
-	case HI16:
-		return *(short*)data;
+	case HUI8:
+		return *(unsigned char*)data;
+	case HUI16:
+		return *(unsigned short*)data;
 	case HI32:
 		return (float)*(int*)data;
 	case HBOOL:
@@ -282,18 +282,21 @@ HL_PRIM int hl_dyn_compare( vdynamic *a, vdynamic *b ) {
 	if( b == NULL )
 		return 1;
 	switch( TK2(a->t->kind,b->t->kind) ) {
-	case TK2(HI8,HI8):
-		return a->v.c - b->v.c;
-	case TK2(HI16,HI16):
-		return a->v.s - b->v.s;
+	case TK2(HUI8,HUI8):
+		return (int)a->v.ui8 - (int)b->v.ui8;
+	case TK2(HUI16,HUI16):
+		return (int)a->v.ui16 - (int)b->v.ui16;
 	case TK2(HI32,HI32):
-		return a->v.i - b->v.i;
+		{
+			int d = a->v.i - b->v.i;
+			return d == hl_invalid_comparison ? -1 : d;
+		}
 	case TK2(HF32,HF32):
 		return fcompare(a->v.f,b->v.f);
 	case TK2(HF64,HF64):
 		return dcompare(a->v.d,b->v.d);
 	case TK2(HBOOL,HBOOL):
-		return a->v.b - b->v.b;
+		return (int)a->v.b - (int)b->v.b;
 	case TK2(HF64, HI32):
 		return dcompare(a->v.d,(double)b->v.i);
 	case TK2(HI32, HF64):
@@ -318,12 +321,14 @@ HL_PRIM int hl_dyn_compare( vdynamic *a, vdynamic *b ) {
 
 HL_PRIM void hl_write_dyn( void *data, hl_type *t, vdynamic *v ) {
 	switch( t->kind ) {
-	case HI8:
+	case HUI8:
+		*(unsigned char*)data = (unsigned char)hl_dyn_casti(&v,&hlt_dyn,t);
+		break;
 	case HBOOL:
-		*(char*)data = (char)hl_dyn_casti(&v,&hlt_dyn,t);
+		*(bool*)data = hl_dyn_casti(&v,&hlt_dyn,t) != 0;
 		break;
-	case HI16:
-		*(short*)data = (short)hl_dyn_casti(&v,&hlt_dyn,t);
+	case HUI16:
+		*(unsigned short*)data = (unsigned short)hl_dyn_casti(&v,&hlt_dyn,t);
 		break;
 	case HI32:
 		*(int*)data = hl_dyn_casti(&v,&hlt_dyn,t);

+ 6 - 6
src/std/fun.c

@@ -140,8 +140,8 @@ HL_PRIM vdynamic* hl_call_method( vdynamic *c, varray *args ) {
 			}
 		} else switch( t->kind ) {
 		case HBOOL:
-		case HI8:
-		case HI16:
+		case HUI8:
+		case HUI16:
 		case HI32:
 			tmp[i].i = hl_dyn_casti(vargs + i, &hlt_dyn,t);
 			p = &tmp[i].i;
@@ -237,8 +237,8 @@ HL_PRIM void *hl_wrapper_call( void *_c, void **args, vdynamic *ret ) {
 			hl_type *to = w->t->fun->args[i];
 			void *v = hl_is_ptr(t) ? args + i : args[i];
 			switch( to->kind ) {
-			case HI8:
-			case HI16:
+			case HUI8:
+			case HUI16:
 			case HI32:
 			case HBOOL:
 				tmp[i].i = hl_dyn_casti(v,t,to);
@@ -265,8 +265,8 @@ HL_PRIM void *hl_wrapper_call( void *_c, void **args, vdynamic *ret ) {
 	switch( tfun->ret->kind ) {
 	case HVOID:
 		return NULL;
-	case HI8:
-	case HI16:
+	case HUI8:
+	case HUI16:
 	case HI32:
 	case HBOOL:
 		ret->v.i = hl_dyn_casti(aret,w->t->fun->ret,tfun->ret);

+ 13 - 13
src/std/obj.c

@@ -531,10 +531,10 @@ HL_PRIM int hl_dyn_geti( vdynamic *d, int hfield, hl_type *t ) {
 	void *addr = hl_obj_lookup(d,hfield,&ft);
 	if( !addr ) return 0;
 	switch( ft->kind ) {
-	case HI8:
-		return *(char*)addr;
-	case HI16:
-		return *(short*)addr;
+	case HUI8:
+		return *(unsigned char*)addr;
+	case HUI16:
+		return *(unsigned short*)addr;
 	case HI32:
 		return *(int*)addr;
 	case HF32:
@@ -618,17 +618,17 @@ HL_PRIM void hl_dyn_seti( vdynamic *d, int hfield, hl_type *t, int value ) {
 	hl_type *ft;
 	void *addr = hl_obj_lookup_set(d,hfield,t,&ft);
 	switch( ft->kind ) {
-	case HI8:
-		*(char*)addr = (char)value;
+	case HUI8:
+		*(unsigned char*)addr = (unsigned char)value;
 		break;
-	case HI16:
-		*(short*)addr = (short)value;
+	case HUI16:
+		*(unsigned short*)addr = (unsigned short)value;
 		break;
 	case HI32:
 		*(int*)addr = value;
 		break;
 	case HBOOL:
-		*(bool*)addr = (bool)value;
+		*(bool*)addr = value != 0;
 		break;
 	case HF32:
 		*(float*)addr = (float)value;
@@ -709,11 +709,11 @@ HL_PRIM void hl_obj_set_field( vdynamic *obj, int hfield, vdynamic *v ) {
 		return;
 	}
 	switch( v->t->kind ) {
-	case HI8:
-		hl_dyn_seti(obj,hfield,v->t,v->v.c);
+	case HUI8:
+		hl_dyn_seti(obj,hfield,v->t,v->v.ui8);
 		break;
-	case HI16:
-		hl_dyn_seti(obj,hfield,v->t,v->v.s);
+	case HUI16:
+		hl_dyn_seti(obj,hfield,v->t,v->v.ui16);
 		break;
 	case HI32:
 		hl_dyn_seti(obj,hfield,v->t,v->v.i);

+ 4 - 4
src/std/types.c

@@ -65,8 +65,8 @@ HL_PRIM int hl_type_size( hl_type *t ) {
 
 HL_PRIM int hl_stack_size( hl_type *t ) {
 	switch( t->kind ) {
-	case HI8:
-	case HI16:
+	case HUI8:
+	case HUI16:
 	case HBOOL:
 		return sizeof(int);
 	default:
@@ -90,8 +90,8 @@ HL_PRIM bool hl_same_type( hl_type *a, hl_type *b ) {
 		return false;
 	switch( a->kind ) {
 	case HVOID:
-	case HI8:
-	case HI16:
+	case HUI8:
+	case HUI16:
 	case HI32:
 	case HF32:
 	case HF64: