#ifndef FLAT_REGISTER_H #define FLAT_REGISTER_H /// An IR with flat (i.e. non-recursive) syntax and types. /// Registers only contain bitvectors. Memory layout (size and offsets) are explicit. #include #include typedef size_t fr_label; typedef size_t fr_var; #define MAX_LABELS 4096 #define MAX_VARS 4096 #define MAX_ARGS 32 enum fr_type_tag { FR_UINT, FR_BOX, FR_REF, }; typedef struct fr_type { enum fr_type_tag tag; uint32_t size; } fr_type; typedef enum fr_cond { FR_EQ, FR_NE, } fr_cond; fr_label fr_declare(size_t typec, fr_type* types); void fr_define(fr_label label, fr_var* vars); fr_var fr_lit(fr_type type, uint64_t val); fr_var fr_index(fr_var box, fr_var index); void fr_set(fr_var box, fr_var index, fr_var ref); fr_var fr_load(fr_var box, fr_type type, uint32_t offset); fr_var fr_struct(uint32_t memberc, fr_var* members); void fr_if(fr_cond cond, fr_var x, fr_var y, fr_label ifl, fr_label elsel, size_t argc, fr_var* args); void fr_switch(fr_var index, size_t labelc, fr_label* labels, size_t argc, fr_var* args); void fr_jump(fr_label label, size_t argc, fr_var* args); #endif