vua: Re-insert LJ STATIC_ASSERTS for bytecode relationships
authorJack Miller <jack@codezen.org>
Sun, 21 Aug 2016 04:20:47 +0000 (23:20 -0500)
committerJack Miller <jack@codezen.org>
Sun, 21 Aug 2016 07:02:49 +0000 (02:02 -0500)
include/test.h
vua/vua_bc.h

index 72a3e65..3261728 100644 (file)
@@ -1,4 +1,11 @@
 /* vim: set ts=4 sw=4 sts=4 et : */
 #pragma once
 
-#define assert(x) if(!(x)) { printk("%s ln %d: %s\n", __FILE__, __LINE__, #x); asm volatile("hlt"); }  
+#define assert(x) if(!(x)) { printk("%s ln %d: %s\n", __FILE__, __LINE__, #x); asm volatile("hlt"); }
+
+#define GLUE(a,b) __GLUE(a,b)
+#define __GLUE(a,b) a ## b
+
+#define __STATIC_ASSERT(x, name) typedef char GLUE (static_assert_, name) [(x) ? 1 : (-1)]
+
+#define STATIC_ASSERT(x) __STATIC_ASSERT (x, __LINE__)
index ff5de42..c823140 100644 (file)
@@ -205,33 +205,40 @@ BCDEF(BCENUM)
   BC__MAX
 } BCOp;
 
-/*
-LJ_STATIC_ASSERT((int)BC_ISEQV+1 == (int)BC_ISNEV);
-LJ_STATIC_ASSERT(((int)BC_ISEQV^1) == (int)BC_ISNEV);
-LJ_STATIC_ASSERT(((int)BC_ISEQS^1) == (int)BC_ISNES);
-LJ_STATIC_ASSERT(((int)BC_ISEQN^1) == (int)BC_ISNEN);
-LJ_STATIC_ASSERT(((int)BC_ISEQP^1) == (int)BC_ISNEP);
-LJ_STATIC_ASSERT(((int)BC_ISLT^1) == (int)BC_ISGE);
-LJ_STATIC_ASSERT(((int)BC_ISLE^1) == (int)BC_ISGT);
-LJ_STATIC_ASSERT(((int)BC_ISLT^3) == (int)BC_ISGT);
-LJ_STATIC_ASSERT((int)BC_IST-(int)BC_ISTC == (int)BC_ISF-(int)BC_ISFC);
-LJ_STATIC_ASSERT((int)BC_CALLT-(int)BC_CALL == (int)BC_CALLMT-(int)BC_CALLM);
-LJ_STATIC_ASSERT((int)BC_CALLMT + 1 == (int)BC_CALLT);
-LJ_STATIC_ASSERT((int)BC_RETM + 1 == (int)BC_RET);
-LJ_STATIC_ASSERT((int)BC_FORL + 1 == (int)BC_IFORL);
-LJ_STATIC_ASSERT((int)BC_FORL + 2 == (int)BC_JFORL);
-LJ_STATIC_ASSERT((int)BC_ITERL + 1 == (int)BC_IITERL);
-LJ_STATIC_ASSERT((int)BC_ITERL + 2 == (int)BC_JITERL);
-LJ_STATIC_ASSERT((int)BC_LOOP + 1 == (int)BC_ILOOP);
-LJ_STATIC_ASSERT((int)BC_LOOP + 2 == (int)BC_JLOOP);
-LJ_STATIC_ASSERT((int)BC_FUNCF + 1 == (int)BC_IFUNCF);
-LJ_STATIC_ASSERT((int)BC_FUNCF + 2 == (int)BC_JFUNCF);
-LJ_STATIC_ASSERT((int)BC_FUNCV + 1 == (int)BC_IFUNCV);
-LJ_STATIC_ASSERT((int)BC_FUNCV + 2 == (int)BC_JFUNCV);
-*/
+/* Ensure that we can't build if we violate any of the relationships we rely on
+ * in the bytecode generator to quickly output instructions
+ */
+
+STATIC_ASSERT((int)BC_ISEQV+1 == (int)BC_ISNEV);
+STATIC_ASSERT(((int)BC_ISEQV^1) == (int)BC_ISNEV);
+STATIC_ASSERT(((int)BC_ISEQS^1) == (int)BC_ISNES);
+STATIC_ASSERT(((int)BC_ISEQN^1) == (int)BC_ISNEN);
+STATIC_ASSERT(((int)BC_ISEQP^1) == (int)BC_ISNEP);
+STATIC_ASSERT(((int)BC_ISLT^1) == (int)BC_ISGE);
+STATIC_ASSERT(((int)BC_ISLE^1) == (int)BC_ISGT);
+STATIC_ASSERT(((int)BC_ISLT^3) == (int)BC_ISGT);
+STATIC_ASSERT((int)BC_IST-(int)BC_ISTC == (int)BC_ISF-(int)BC_ISFC);
+STATIC_ASSERT((int)BC_CALLT-(int)BC_CALL == (int)BC_CALLMT-(int)BC_CALLM);
+STATIC_ASSERT((int)BC_CALLMT + 1 == (int)BC_CALLT);
+STATIC_ASSERT((int)BC_RETM + 1 == (int)BC_RET);
+STATIC_ASSERT((int)BC_FORL + 1 == (int)BC_IFORL);
+STATIC_ASSERT((int)BC_FORL + 2 == (int)BC_JFORL);
+STATIC_ASSERT((int)BC_ITERL + 1 == (int)BC_IITERL);
+STATIC_ASSERT((int)BC_ITERL + 2 == (int)BC_JITERL);
+STATIC_ASSERT((int)BC_LOOP + 1 == (int)BC_ILOOP);
+STATIC_ASSERT((int)BC_LOOP + 2 == (int)BC_JLOOP);
+STATIC_ASSERT((int)BC_FUNCF + 1 == (int)BC_IFUNCF);
+STATIC_ASSERT((int)BC_FUNCF + 2 == (int)BC_JFUNCF);
+STATIC_ASSERT((int)BC_FUNCV + 1 == (int)BC_IFUNCV);
+STATIC_ASSERT((int)BC_FUNCV + 2 == (int)BC_JFUNCV);
 
-/* This solves a circular dependency problem, change as needed. */
-#define FF_next_N      4
+STATIC_ASSERT((int)BC_ISGE-(int)BC_ISLT == (int)OPR_GE-(int)OPR_LT);
+STATIC_ASSERT((int)BC_ISLE-(int)BC_ISLT == (int)OPR_LE-(int)OPR_LT);
+STATIC_ASSERT((int)BC_ISGT-(int)BC_ISLT == (int)OPR_GT-(int)OPR_LT);
+STATIC_ASSERT((int)BC_SUBVV-(int)BC_ADDVV == (int)OPR_SUB-(int)OPR_ADD);
+STATIC_ASSERT((int)BC_MULVV-(int)BC_ADDVV == (int)OPR_MUL-(int)OPR_ADD);
+STATIC_ASSERT((int)BC_DIVVV-(int)BC_ADDVV == (int)OPR_DIV-(int)OPR_ADD);
+STATIC_ASSERT((int)BC_MODVV-(int)BC_ADDVV == (int)OPR_MOD-(int)OPR_ADD);
 
 /* Stack slots used by FORI/FORL, relative to operand A. */
 enum {