44 lines
1.1 KiB
C
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
|