pass-lang/src/ir/flat_register.h

44 lines
1.1 KiB
C

#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 <stddef.h>
#include <stdint.h>
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