separated conversion instructions; bugfix with iter.take
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Fri, 16 Dec 2022 19:15:48 +0000 (13:15 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Fri, 16 Dec 2022 19:15:48 +0000 (13:15 -0600)
core/container/iter.onyx
interpreter/src/vm/vm.c
shared/lib/linux_x86_64/lib/libovmwasm.so

index 160b02d78f5677e1c421bd43b2f1bd930d3819b7..869c4de5e931ea8b76af1e367058b9dd91150c47 100644 (file)
@@ -232,7 +232,7 @@ take :: (it: Iterator($T), count: u32, allocator := context.temp_allocator) -> I
     }
 
     close :: ($T: type_expr, ti: ^TakeIterator(T)) {
-        ti.iterator.close(ti.iterator.data);
+        if ti.iterator.close != null_proc do ti.iterator.close(ti.iterator.data);
         raw_free(ti.allocator, ti);
     }
 
index 1c4c4d72e38ca058cd38db033adbd8eeb90c8210..b367d7450d62f0e56509f7a5562a5cc66a818e2c 100644 (file)
@@ -1076,90 +1076,85 @@ OVMI_INSTR_EXEC(ovmi_exec_bri_z)  { if (VAL(instr->b).i32 == 0) state->pc += VAL
 
 
 //
-// Conversion (make this better!)
+// Conversion
 //
 
-OVMI_INSTR_EXEC(ovmi_exec_cvt) {
-    ovm_value_t tmp_val;
-
-    switch (instr->full_instr) {
-
-#define CVT(stype, dtype, otype, ctype) \
-    tmp_val.dtype = (ctype) VAL(instr->a).stype; \
-    tmp_val.type = otype; \
-    VAL(instr->r) = tmp_val; \
-    break
-
-        case OVM_TYPED_INSTR(OVMI_CVT_I8,   OVM_TYPE_I16): CVT(u8, u16, OVM_TYPE_I16, u16);
-        case OVM_TYPED_INSTR(OVMI_CVT_I8,   OVM_TYPE_I32): CVT(u8, u32, OVM_TYPE_I32, u32);
-        case OVM_TYPED_INSTR(OVMI_CVT_I8,   OVM_TYPE_I64): CVT(u8, u64, OVM_TYPE_I64, u64);
-        case OVM_TYPED_INSTR(OVMI_CVT_I8_S, OVM_TYPE_I16): CVT(i8, i16, OVM_TYPE_I16, i16);
-        case OVM_TYPED_INSTR(OVMI_CVT_I8_S, OVM_TYPE_I32): CVT(i8, i32, OVM_TYPE_I32, i32);
-        case OVM_TYPED_INSTR(OVMI_CVT_I8_S, OVM_TYPE_I64): CVT(i8, i64, OVM_TYPE_I64, i64);
-
-        case OVM_TYPED_INSTR(OVMI_CVT_I16,   OVM_TYPE_I8):  CVT(u16, u8,  OVM_TYPE_I8, u8);
-        case OVM_TYPED_INSTR(OVMI_CVT_I16,   OVM_TYPE_I32): CVT(u16, u32, OVM_TYPE_I32, u32);
-        case OVM_TYPED_INSTR(OVMI_CVT_I16,   OVM_TYPE_I64): CVT(u16, u64, OVM_TYPE_I64, u64);
-        case OVM_TYPED_INSTR(OVMI_CVT_I16_S, OVM_TYPE_I8):  CVT(i16, i8,  OVM_TYPE_I8, i8);
-        case OVM_TYPED_INSTR(OVMI_CVT_I16_S, OVM_TYPE_I32): CVT(i16, i32, OVM_TYPE_I32, i32);
-        case OVM_TYPED_INSTR(OVMI_CVT_I16_S, OVM_TYPE_I64): CVT(i16, i64, OVM_TYPE_I64, i64);
-
-        case OVM_TYPED_INSTR(OVMI_CVT_I32,   OVM_TYPE_I8):  CVT(u32, u8,  OVM_TYPE_I8,  u8);
-        case OVM_TYPED_INSTR(OVMI_CVT_I32,   OVM_TYPE_I16): CVT(u32, u16, OVM_TYPE_I16, u16);
-        case OVM_TYPED_INSTR(OVMI_CVT_I32,   OVM_TYPE_I64): CVT(u32, u64, OVM_TYPE_I64, u64);
-        case OVM_TYPED_INSTR(OVMI_CVT_I32_S, OVM_TYPE_I8):  CVT(i32, i8,  OVM_TYPE_I8,  i8);
-        case OVM_TYPED_INSTR(OVMI_CVT_I32_S, OVM_TYPE_I16): CVT(i32, i16, OVM_TYPE_I16, i16);
-        case OVM_TYPED_INSTR(OVMI_CVT_I32_S, OVM_TYPE_I64): CVT(i32, i64, OVM_TYPE_I64, i64);
-
-        case OVM_TYPED_INSTR(OVMI_CVT_I32,   OVM_TYPE_F32): CVT(u32, f32, OVM_TYPE_F32, f32);
-        case OVM_TYPED_INSTR(OVMI_CVT_I32_S, OVM_TYPE_F32): CVT(i32, f32, OVM_TYPE_F32, f32);
-        case OVM_TYPED_INSTR(OVMI_CVT_I32,   OVM_TYPE_F64): CVT(u32, f64, OVM_TYPE_F64, f64);
-        case OVM_TYPED_INSTR(OVMI_CVT_I32_S, OVM_TYPE_F64): CVT(i32, f64, OVM_TYPE_F64, f64);
-
-        case OVM_TYPED_INSTR(OVMI_CVT_I64,   OVM_TYPE_I8):  CVT(u64, u8,  OVM_TYPE_I8,  u8);
-        case OVM_TYPED_INSTR(OVMI_CVT_I64,   OVM_TYPE_I16): CVT(u64, u16, OVM_TYPE_I16, u16);
-        case OVM_TYPED_INSTR(OVMI_CVT_I64,   OVM_TYPE_I32): CVT(u64, u32, OVM_TYPE_I32, u32);
-        case OVM_TYPED_INSTR(OVMI_CVT_I64_S, OVM_TYPE_I8):  CVT(i64, i8,  OVM_TYPE_I8,  i8);
-        case OVM_TYPED_INSTR(OVMI_CVT_I64_S, OVM_TYPE_I16): CVT(i64, i16, OVM_TYPE_I16, i16);
-        case OVM_TYPED_INSTR(OVMI_CVT_I64_S, OVM_TYPE_I32): CVT(i64, i32, OVM_TYPE_I32, i32);
-
-        case OVM_TYPED_INSTR(OVMI_CVT_I64,   OVM_TYPE_F32): CVT(u64, f32, OVM_TYPE_F32, f32);
-        case OVM_TYPED_INSTR(OVMI_CVT_I64_S, OVM_TYPE_F32): CVT(i64, f32, OVM_TYPE_F32, f32);
-        case OVM_TYPED_INSTR(OVMI_CVT_I64,   OVM_TYPE_F64): CVT(u64, f64, OVM_TYPE_F64, f64);
-        case OVM_TYPED_INSTR(OVMI_CVT_I64_S, OVM_TYPE_F64): CVT(i64, f64, OVM_TYPE_F64, f64);
-
-        case OVM_TYPED_INSTR(OVMI_CVT_F32,   OVM_TYPE_I32): CVT(f32, u32, OVM_TYPE_I32, u32);
-        case OVM_TYPED_INSTR(OVMI_CVT_F32,   OVM_TYPE_I64): CVT(f32, u64, OVM_TYPE_I64, u64);
-        case OVM_TYPED_INSTR(OVMI_CVT_F32,   OVM_TYPE_F64): CVT(f32, f64, OVM_TYPE_F64, f64);
-        case OVM_TYPED_INSTR(OVMI_CVT_F32_S, OVM_TYPE_I32): CVT(f32, i32, OVM_TYPE_I32, i32);
-        case OVM_TYPED_INSTR(OVMI_CVT_F32_S, OVM_TYPE_I64): CVT(f32, i64, OVM_TYPE_I64, i64);
-        case OVM_TYPED_INSTR(OVMI_CVT_F32_S, OVM_TYPE_F64): CVT(f32, f64, OVM_TYPE_F64, f64);
-
-        case OVM_TYPED_INSTR(OVMI_CVT_F64,   OVM_TYPE_I32): CVT(f64, u32, OVM_TYPE_I32, u32);
-        case OVM_TYPED_INSTR(OVMI_CVT_F64,   OVM_TYPE_I64): CVT(f64, u64, OVM_TYPE_I64, u64);
-        case OVM_TYPED_INSTR(OVMI_CVT_F64,   OVM_TYPE_F32): CVT(f64, f32, OVM_TYPE_F32, f32);
-        case OVM_TYPED_INSTR(OVMI_CVT_F64_S, OVM_TYPE_I32): CVT(f64, i32, OVM_TYPE_I32, i32);
-        case OVM_TYPED_INSTR(OVMI_CVT_F64_S, OVM_TYPE_I64): CVT(f64, i64, OVM_TYPE_I64, i64);
-        case OVM_TYPED_INSTR(OVMI_CVT_F64_S, OVM_TYPE_F32): CVT(f64, f32, OVM_TYPE_F32, f32);
-
-#undef CVT
+#define OVM_CVT(n1, n2, stype, dtype, otype, ctype) \
+    OVMI_INSTR_EXEC(ovmi_exec_cvt_##n1##_##n2) { \
+        ovm_value_t tmp_val; \
+        tmp_val.dtype = (ctype) VAL(instr->a).stype; \
+        tmp_val.type = otype; \
+        VAL(instr->r) = tmp_val; \
+        NEXT_OP; \
+    }
 
-#define CVT(stype, dtype, otype, ctype) \
-    tmp_val.type = otype; \
-    tmp_val.dtype = *(ctype *) &VAL(instr->a).stype; \
-    VAL(instr->r) = tmp_val; \
-    break
+OVM_CVT(i8, i16,   u8, u16, OVM_TYPE_I16, u16);
+OVM_CVT(i8, i32,   u8, u32, OVM_TYPE_I32, u32);
+OVM_CVT(i8, i64,   u8, u64, OVM_TYPE_I64, u64);
+OVM_CVT(i8_s, i16, i8, i16, OVM_TYPE_I16, i16);
+OVM_CVT(i8_s, i32, i8, i32, OVM_TYPE_I32, i32);
+OVM_CVT(i8_s, i64, i8, i64, OVM_TYPE_I64, i64);
+
+OVM_CVT(i16,   i8,  u16, u8,  OVM_TYPE_I8, u8);
+OVM_CVT(i16,   i32, u16, u32, OVM_TYPE_I32, u32);
+OVM_CVT(i16,   i64, u16, u64, OVM_TYPE_I64, u64);
+OVM_CVT(i16_s, i8,  i16, i8,  OVM_TYPE_I8, i8);
+OVM_CVT(i16_s, i32, i16, i32, OVM_TYPE_I32, i32);
+OVM_CVT(i16_s, i64, i16, i64, OVM_TYPE_I64, i64);
+
+OVM_CVT(i32,   i8,  u32, u8,  OVM_TYPE_I8,  u8);
+OVM_CVT(i32,   i16, u32, u16, OVM_TYPE_I16, u16);
+OVM_CVT(i32,   i64, u32, u64, OVM_TYPE_I64, u64);
+OVM_CVT(i32_s, i8,  i32, i8,  OVM_TYPE_I8,  i8);
+OVM_CVT(i32_s, i16, i32, i16, OVM_TYPE_I16, i16);
+OVM_CVT(i32_s, i64, i32, i64, OVM_TYPE_I64, i64);
+OVM_CVT(i32,   f32, u32, f32, OVM_TYPE_F32, f32);
+OVM_CVT(i32_s, f32, i32, f32, OVM_TYPE_F32, f32);
+OVM_CVT(i32,   f64, u32, f64, OVM_TYPE_F64, f64);
+OVM_CVT(i32_s, f64, i32, f64, OVM_TYPE_F64, f64);
+
+OVM_CVT(i64,   i8,  u64, u8,  OVM_TYPE_I8,  u8);
+OVM_CVT(i64,   i16, u64, u16, OVM_TYPE_I16, u16);
+OVM_CVT(i64,   i32, u64, u32, OVM_TYPE_I32, u32);
+OVM_CVT(i64_s, i8,  i64, i8,  OVM_TYPE_I8,  i8);
+OVM_CVT(i64_s, i16, i64, i16, OVM_TYPE_I16, i16);
+OVM_CVT(i64_s, i32, i64, i32, OVM_TYPE_I32, i32);
+OVM_CVT(i64,   f32, u64, f32, OVM_TYPE_F32, f32);
+OVM_CVT(i64_s, f32, i64, f32, OVM_TYPE_F32, f32);
+OVM_CVT(i64,   f64, u64, f64, OVM_TYPE_F64, f64);
+OVM_CVT(i64_s, f64, i64, f64, OVM_TYPE_F64, f64);
+
+OVM_CVT(f32,   i32, f32, u32, OVM_TYPE_I32, u32);
+OVM_CVT(f32,   i64, f32, u64, OVM_TYPE_I64, u64);
+OVM_CVT(f32,   f64, f32, f64, OVM_TYPE_F64, f64);
+OVM_CVT(f32_s, i32, f32, i32, OVM_TYPE_I32, i32);
+OVM_CVT(f32_s, i64, f32, i64, OVM_TYPE_I64, i64);
+OVM_CVT(f32_s, f64, f32, f64, OVM_TYPE_F64, f64);
+
+OVM_CVT(f64,   i32, f64, u32, OVM_TYPE_I32, u32);
+OVM_CVT(f64,   i64, f64, u64, OVM_TYPE_I64, u64);
+OVM_CVT(f64,   f32, f64, f32, OVM_TYPE_F32, f32);
+OVM_CVT(f64_s, i32, f64, i32, OVM_TYPE_I32, i32);
+OVM_CVT(f64_s, i64, f64, i64, OVM_TYPE_I64, i64);
+OVM_CVT(f64_s, f32, f64, f32, OVM_TYPE_F32, f32);
+
+#undef OVM_CVT
+
+#define OVM_CVT(n1, n2, stype, dtype, otype, ctype) \
+    OVMI_INSTR_EXEC(ovmi_exec_transmute_##n1##_##n2) { \
+        ovm_value_t tmp_val; \
+        tmp_val.dtype = *(ctype *) &VAL(instr->a).stype; \
+        tmp_val.type = otype; \
+        VAL(instr->r) = tmp_val; \
+        NEXT_OP; \
+    }
 
-        case OVM_TYPED_INSTR(OVMI_TRANSMUTE_I32, OVM_TYPE_F32): CVT(u32, f32, OVM_TYPE_F32, f32);
-        case OVM_TYPED_INSTR(OVMI_TRANSMUTE_I64, OVM_TYPE_F64): CVT(u64, f64, OVM_TYPE_F64, f64);
-        case OVM_TYPED_INSTR(OVMI_TRANSMUTE_F32, OVM_TYPE_I32): CVT(f32, u32, OVM_TYPE_I32, u32);
-        case OVM_TYPED_INSTR(OVMI_TRANSMUTE_F64, OVM_TYPE_I64): CVT(f64, u64, OVM_TYPE_I64, u64);
+OVM_CVT(i32, f32, u32, f32, OVM_TYPE_F32, f32);
+OVM_CVT(i64, f64, u64, f64, OVM_TYPE_F64, f64);
+OVM_CVT(f32, i32, f32, u32, OVM_TYPE_I32, u32);
+OVM_CVT(f64, i64, f64, u64, OVM_TYPE_I64, u64);
 
 #undef CVT
-    }
-
-    NEXT_OP;
-}
 
 
 //
@@ -1264,22 +1259,22 @@ static ovmi_instr_exec_t ovmi_dispatch[] = {
     IROW_FLOAT(min)
     IROW_FLOAT(max)
     IROW_FLOAT(copysign)
-    IROW_SAME(cvt)
-    IROW_SAME(cvt)
-    IROW_SAME(cvt)
-    IROW_SAME(cvt)
-    IROW_SAME(cvt) // 0x40
-    IROW_SAME(cvt)
-    IROW_SAME(cvt)
-    IROW_SAME(cvt)
-    IROW_SAME(cvt)
-    IROW_SAME(cvt)
-    IROW_SAME(cvt)
-    IROW_SAME(cvt)
-    IROW_SAME(cvt)
-    IROW_SAME(cvt)
-    IROW_SAME(cvt)
-    IROW_SAME(cvt)
+    NULL, NULL, ovmi_exec_cvt_i8_i16, ovmi_exec_cvt_i8_i32, ovmi_exec_cvt_i8_i64, NULL, NULL, NULL,
+    NULL, NULL, ovmi_exec_cvt_i8_s_i16, ovmi_exec_cvt_i8_s_i32, ovmi_exec_cvt_i8_s_i64, NULL, NULL, NULL,
+    NULL, ovmi_exec_cvt_i16_i8,   NULL, ovmi_exec_cvt_i16_i32, ovmi_exec_cvt_i16_i64, NULL, NULL, NULL,
+    NULL, ovmi_exec_cvt_i16_s_i8, NULL, ovmi_exec_cvt_i16_s_i32, ovmi_exec_cvt_i16_s_i64, NULL, NULL, NULL,
+    NULL, ovmi_exec_cvt_i32_i8,   ovmi_exec_cvt_i32_i16,   NULL, ovmi_exec_cvt_i32_i64, ovmi_exec_cvt_i32_f32, ovmi_exec_cvt_i32_f64, NULL,  // 0x40
+    NULL, ovmi_exec_cvt_i32_s_i8, ovmi_exec_cvt_i32_s_i16, NULL, ovmi_exec_cvt_i32_s_i64, ovmi_exec_cvt_i32_s_f32, ovmi_exec_cvt_i32_s_f64, NULL,
+    NULL, ovmi_exec_cvt_i64_i8,   ovmi_exec_cvt_i64_i16,   ovmi_exec_cvt_i64_i32,   NULL, ovmi_exec_cvt_i64_f32, ovmi_exec_cvt_i64_f64, NULL,
+    NULL, ovmi_exec_cvt_i64_s_i8, ovmi_exec_cvt_i64_s_i16, ovmi_exec_cvt_i64_s_i32, NULL, ovmi_exec_cvt_i64_s_f32, ovmi_exec_cvt_i64_s_f64, NULL,
+    NULL, NULL, NULL, ovmi_exec_cvt_f32_i32, ovmi_exec_cvt_f32_i64, NULL, ovmi_exec_cvt_f32_f64, NULL,
+    NULL, NULL, NULL, ovmi_exec_cvt_f32_s_i32, ovmi_exec_cvt_f32_s_i64, NULL, ovmi_exec_cvt_f32_s_f64, NULL,
+    NULL, NULL, NULL, ovmi_exec_cvt_f64_i32, ovmi_exec_cvt_f64_i64, ovmi_exec_cvt_f64_f32, NULL, NULL,
+    NULL, NULL, NULL, ovmi_exec_cvt_f64_s_i32, ovmi_exec_cvt_f64_s_i64, ovmi_exec_cvt_f64_s_f32, NULL, NULL,
+    NULL, NULL, NULL, ovmi_exec_transmute_i32_f32, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, ovmi_exec_transmute_i64_f64, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, ovmi_exec_transmute_f32_i32, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, ovmi_exec_transmute_f64_i64, NULL,
     IROW_INT(cmpxchg)
     IROW_SAME(illegal)
 };
index eb055686ed7786936dbac85973d90f5bed61406d..f0890f0c485d942b485bc34db53422e43c18eac2 100755 (executable)
Binary files a/shared/lib/linux_x86_64/lib/libovmwasm.so and b/shared/lib/linux_x86_64/lib/libovmwasm.so differ