summaryrefslogtreecommitdiffstats
path: root/byterun/interp.c
diff options
context:
space:
mode:
Diffstat (limited to 'byterun/interp.c')
-rw-r--r--byterun/interp.c88
1 files changed, 44 insertions, 44 deletions
diff --git a/byterun/interp.c b/byterun/interp.c
index ed6b154c1..e19d537ed 100644
--- a/byterun/interp.c
+++ b/byterun/interp.c
@@ -179,13 +179,13 @@ sp is a local copy of the global variable caml_extern_sp. */
/* Division and modulus madness */
#ifdef NONSTANDARD_DIV_MOD
-extern long caml_safe_div(long p, long q);
-extern long caml_safe_mod(long p, long q);
+extern intnat caml_safe_div(intnat p, intnat q);
+extern intnat caml_safe_mod(intnat p, intnat q);
#endif
#ifdef DEBUG
-static long caml_bcodcount;
+static intnat caml_bcodcount;
#endif
/* The interpreter itself */
@@ -209,7 +209,7 @@ value caml_interprete(code_t prog, asize_t prog_size)
#endif
#endif
value env;
- long extra_args;
+ intnat extra_args;
struct longjmp_buffer * initial_external_raise;
int initial_sp_offset;
/* volatile ensures that initial_local_roots and saved_pc
@@ -779,13 +779,12 @@ value caml_interprete(code_t prog, asize_t prog_size)
Instruct(SWITCH): {
uint32 sizes = *pc++;
if (Is_block(accu)) {
- long index = Tag_val(accu);
- Assert (index >= 0);
- Assert (index < (sizes >> 16));
+ intnat index = Tag_val(accu);
+ Assert ((uintnat) index < (sizes >> 16));
pc += pc[(sizes & 0xFFFF) + index];
} else {
- long index = Long_val(accu);
- Assert ((unsigned long) index < (sizes & 0xFFFF)) ;
+ intnat index = Long_val(accu);
+ Assert ((uintnat) index < (sizes & 0xFFFF)) ;
pc += pc[index];
}
Next;
@@ -939,16 +938,16 @@ value caml_interprete(code_t prog, asize_t prog_size)
/* Integer arithmetic */
Instruct(NEGINT):
- accu = (value)(2 - (long)accu); Next;
+ accu = (value)(2 - (intnat)accu); Next;
Instruct(ADDINT):
- accu = (value)((long) accu + (long) *sp++ - 1); Next;
+ accu = (value)((intnat) accu + (intnat) *sp++ - 1); Next;
Instruct(SUBINT):
- accu = (value)((long) accu - (long) *sp++ + 1); Next;
+ accu = (value)((intnat) accu - (intnat) *sp++ + 1); Next;
Instruct(MULINT):
accu = Val_long(Long_val(accu) * Long_val(*sp++)); Next;
Instruct(DIVINT): {
- long divisor = Long_val(*sp++);
+ intnat divisor = Long_val(*sp++);
if (divisor == 0) { Setup_for_c_call; caml_raise_zero_divide(); }
#ifdef NONSTANDARD_DIV_MOD
accu = Val_long(caml_safe_div(Long_val(accu), divisor));
@@ -958,7 +957,7 @@ value caml_interprete(code_t prog, asize_t prog_size)
Next;
}
Instruct(MODINT): {
- long divisor = Long_val(*sp++);
+ intnat divisor = Long_val(*sp++);
if (divisor == 0) { Setup_for_c_call; caml_raise_zero_divide(); }
#ifdef NONSTANDARD_DIV_MOD
accu = Val_long(caml_safe_mod(Long_val(accu), divisor));
@@ -968,48 +967,48 @@ value caml_interprete(code_t prog, asize_t prog_size)
Next;
}
Instruct(ANDINT):
- accu = (value)((long) accu & (long) *sp++); Next;
+ accu = (value)((intnat) accu & (intnat) *sp++); Next;
Instruct(ORINT):
- accu = (value)((long) accu | (long) *sp++); Next;
+ accu = (value)((intnat) accu | (intnat) *sp++); Next;
Instruct(XORINT):
- accu = (value)(((long) accu ^ (long) *sp++) | 1); Next;
+ accu = (value)(((intnat) accu ^ (intnat) *sp++) | 1); Next;
Instruct(LSLINT):
- accu = (value)((((long) accu - 1) << Long_val(*sp++)) + 1); Next;
+ accu = (value)((((intnat) accu - 1) << Long_val(*sp++)) + 1); Next;
Instruct(LSRINT):
- accu = (value)((((unsigned long) accu - 1) >> Long_val(*sp++)) | 1);
+ accu = (value)((((uintnat) accu - 1) >> Long_val(*sp++)) | 1);
Next;
Instruct(ASRINT):
- accu = (value)((((long) accu - 1) >> Long_val(*sp++)) | 1); Next;
+ accu = (value)((((intnat) accu - 1) >> Long_val(*sp++)) | 1); Next;
-#define Integer_comparison(sign,opname,tst) \
+#define Integer_comparison(typ,opname,tst) \
Instruct(opname): \
- accu = Val_int((sign long) accu tst (sign long) *sp++); Next;
-
- Integer_comparison(signed,EQ, ==)
- Integer_comparison(signed,NEQ, !=)
- Integer_comparison(signed,LTINT, <)
- Integer_comparison(signed,LEINT, <=)
- Integer_comparison(signed,GTINT, >)
- Integer_comparison(signed,GEINT, >=)
- Integer_comparison(unsigned,ULTINT, <)
- Integer_comparison(unsigned,UGEINT, >=)
-
-#define Integer_branch_comparison(sign,opname,tst,debug) \
+ accu = Val_int((typ) accu tst (typ) *sp++); Next;
+
+ Integer_comparison(intnat,EQ, ==)
+ Integer_comparison(intnat,NEQ, !=)
+ Integer_comparison(intnat,LTINT, <)
+ Integer_comparison(intnat,LEINT, <=)
+ Integer_comparison(intnat,GTINT, >)
+ Integer_comparison(intnat,GEINT, >=)
+ Integer_comparison(uintnat,ULTINT, <)
+ Integer_comparison(uintnat,UGEINT, >=)
+
+#define Integer_branch_comparison(typ,opname,tst,debug) \
Instruct(opname): \
- if ( *pc++ tst ((sign long)Long_val(accu))) { \
+ if ( *pc++ tst (typ) Long_val(accu)) { \
pc += *pc ; \
} else { \
pc++ ; \
} ; Next;
- Integer_branch_comparison(signed,BEQ, ==, "==")
- Integer_branch_comparison(signed,BNEQ, !=, "!=")
- Integer_branch_comparison(signed,BLTINT, <, "<")
- Integer_branch_comparison(signed,BLEINT, <=, "<=")
- Integer_branch_comparison(signed,BGTINT, >, ">")
- Integer_branch_comparison(signed,BGEINT, >=, ">=")
- Integer_branch_comparison(unsigned,BULTINT, <, "<")
- Integer_branch_comparison(unsigned,BUGEINT, >=, ">=")
+ Integer_branch_comparison(intnat,BEQ, ==, "==")
+ Integer_branch_comparison(intnat,BNEQ, !=, "!=")
+ Integer_branch_comparison(intnat,BLTINT, <, "<")
+ Integer_branch_comparison(intnat,BLEINT, <=, "<=")
+ Integer_branch_comparison(intnat,BGTINT, >, ">")
+ Integer_branch_comparison(intnat,BGEINT, >=, ">=")
+ Integer_branch_comparison(uintnat,BULTINT, <, "<")
+ Integer_branch_comparison(uintnat,BUGEINT, >=, ">=")
Instruct(OFFSETINT):
accu += *pc << 1;
@@ -1120,8 +1119,9 @@ value caml_interprete(code_t prog, asize_t prog_size)
#if _MSC_VER >= 1200
__assume(0);
#else
- caml_fatal_error_arg("Fatal error: bad opcode (%lx)\n",
- (char *)(long)(*(pc-1)));
+ caml_fatal_error_arg("Fatal error: bad opcode (%"
+ ARCH_INTNAT_PRINTF_FORMAT "x)\n",
+ (uintnat)(*(pc-1)));
#endif
}
}