Explorar o código

Move JIT intrisic definitions to a separate file

jonathanvdc %!s(int64=8) %!d(string=hai) anos
pai
achega
1b39be5c4c
Modificáronse 2 ficheiros con 48 adicións e 27 borrados
  1. 46 0
      kernel/modelverse_jit/intrinsics.py
  2. 2 27
      kernel/modelverse_kernel/main.py

+ 46 - 0
kernel/modelverse_jit/intrinsics.py

@@ -0,0 +1,46 @@
+import jit
+import tree_ir
+
+BINARY_INTRINSICS = {
+    'value_eq' : '==',
+    'value_neq' : '!=',
+
+    'bool_and' : 'and',
+    'bool_or' : 'or',
+
+    'integer_addition' : '+',
+    'integer_subtraction' : '-',
+    'integer_multiplication' : '*',
+    'integer_division' : '/',
+    'integer_gt' : '>',
+    'integer_gte' : '>=',
+    'integer_lt' : '<',
+    'integer_lte' : '<=',
+
+    'float_addition' : '+',
+    'float_subtraction' : '-',
+    'float_multiplication' : '*',
+    'float_division' : '/',
+    'float_gt' : '>',
+    'float_gte' : '>=',
+    'float_lt' : '<',
+    'float_lte' : '<='
+}
+
+MISC_INTRINSICS = {
+    'element_eq' : (
+        lambda lhs, rhs:
+        tree_ir.CreateNodeWithValueInstruction(
+            tree_ir.BinaryInstruction(lhs, '==', rhs))),
+    'element_neq' : (
+        lambda lhs, rhs:
+        tree_ir.CreateNodeWithValueInstruction(
+            tree_ir.BinaryInstruction(lhs, '!=', rhs)))
+}
+
+def register_intrinsics(target_jit):
+    """Registers all intrinsics in the module with the given JIT."""
+    for (key, value) in BINARY_INTRINSICS.items():
+        target_jit.register_binary_intrinsic(key, value)
+    for (key, value) in MISC_INTRINSICS.items():
+        target_jit.register_intrinsic(key, value)

+ 2 - 27
kernel/modelverse_kernel/main.py

@@ -1,6 +1,7 @@
 import modelverse_kernel.primitives as primitive_functions
 import modelverse_kernel.compiled as compiled_functions
 import modelverse_jit.jit as jit
+import modelverse_jit.intrinsics as jit_intrinsics
 import sys
 import time
 
@@ -24,38 +25,12 @@ class ModelverseKernel(object):
             self.jit.compiled_function_lookup = lambda func_name: \
                 getattr(compiled_functions, func_name, None)
 
-        self.register_intrinsics()
+        jit_intrinsics.register_intrinsics(self.jit)
 
         # To disable the JIT, uncomment the line below:
         #     self.jit.set_jit_enabled(False)
         self.debug_info = "(no debug information found)"
 
-    def register_intrinsics(self):
-        """Registers intrinsics with the JIT."""
-        self.jit.register_binary_intrinsic('value_eq', '==')
-        self.jit.register_binary_intrinsic('value_neq', '!=')
-
-        self.jit.register_binary_intrinsic('bool_and', 'and')
-        self.jit.register_binary_intrinsic('bool_or', 'or')
-
-        self.jit.register_binary_intrinsic('integer_addition', '+')
-        self.jit.register_binary_intrinsic('integer_subtraction', '-')
-        self.jit.register_binary_intrinsic('integer_multiplication', '*')
-        self.jit.register_binary_intrinsic('integer_division', '/')
-        self.jit.register_binary_intrinsic('integer_gt', '>')
-        self.jit.register_binary_intrinsic('integer_gte', '>=')
-        self.jit.register_binary_intrinsic('integer_lt', '<')
-        self.jit.register_binary_intrinsic('integer_lte', '<=')
-
-        self.jit.register_binary_intrinsic('float_addition', '+')
-        self.jit.register_binary_intrinsic('float_subtraction', '-')
-        self.jit.register_binary_intrinsic('float_multiplication', '*')
-        self.jit.register_binary_intrinsic('float_division', '/')
-        self.jit.register_binary_intrinsic('float_gt', '>')
-        self.jit.register_binary_intrinsic('float_gte', '>=')
-        self.jit.register_binary_intrinsic('float_lt', '<')
-        self.jit.register_binary_intrinsic('float_lte', '<=')
-
     def execute_yields(self, username, operation, params, reply):
         try:
             self.success = True