compiler

Unnamed Compiled Systems Language Project
git clone http://frotz.net/git/compiler.git
Log | Files | Refs

ir.h (2450B)


      1 // Copyright 2021, Brian Swetland <swetland@frotz.net>
      2 // Licensed under the Apache License, Version 2.0.
      3 
      4 enum {
      5 	// arg c is imm, for ALU and Bcc ops
      6 	INF_C_IMM =    0x0100,
      7 
      8 	// size flags for LD/ST ops
      9 	INF_SZ_U8 =    0x0000,
     10 	INF_SZ_U16 =   0x0040,
     11 	INF_SZ_U32 =   0x0080,
     12 	INF_SZ_MASK =  0x00C0,
     13 	INF_SZ_SHIFT = 6,
     14 
     15 	// property bits
     16 	INF_IS_B_UC  = 0x0200, // is uncondition branch
     17 	INF_IS_B_CC  = 0x0400, // is conditional branch
     18 	INF_IS_B     = 0x0600, // is any kind of branch
     19 	INF_IS_RET   = 0x0800, // is a return op
     20 	INF_IS_EOBB  = 0x0E00, // is a branch or return (end of bb)
     21 	INF_IS_LABEL = 0x1000, // is a label (start of bb)
     22 	INF_IS_ALU   = 0x2000, // add, sub, and, ...
     23 	INF_IS_MEM   = 0x4000, // load or store
     24 	INF_IS_PHI   = 0x8000,
     25 };
     26 
     27 enum {
     28 	INS_ADD,    // ADD Ra, Rb, Rc       Ra = Rb + Rc
     29 	INS_SUB,    // SUBI Ra, Rb, IMMc    Ra = Rb + IMMc
     30 	INS_MUL,    // ...
     31 	INS_UDIV,
     32 	INS_SDIV,
     33 	INS_UREM,
     34 	INS_SREM,
     35 
     36 	INS_LSL,
     37 	INS_LSR,
     38 	INS_ASR,
     39 	INS_AND,
     40 	INS_OR,
     41 	INS_XOR,
     42 
     43 	INS_MOV,   // MOV Ra, Rc           Ra = Rc
     44 
     45 	INS_LD,    // LDW Ra, Rb, Rc       Ra = MEM[Rb + Rc]
     46 	INS_ST,    // STBI Ra, Rb, IMMc    MEM[Rb + IMMc] = Ra
     47 
     48 	INS_PHI,
     49 
     50 	INS_LABEL, // La:
     51 
     52 	INS_B,     // B La
     53 	INS_BEQ,   // BEQ La, Ra, Rb   BEQI La, Rb, IMMc
     54 	INS_BNE,   // ...
     55 	INS_BLT,
     56 	INS_BLE,
     57 	INS_BGT,
     58 	INS_BGE,
     59 	INS_CALL,  // CALL Global
     60 	INS_RET,
     61 
     62 	INS_DEAD,
     63 
     64 	INS_COUNT, // total unique instructions
     65 
     66 	INS_OP_MASK = 0x3F,
     67 };
     68 
     69 i32 ins_props[INS_COUNT] = {
     70 	INF_IS_ALU, INF_IS_ALU, INF_IS_ALU, INF_IS_ALU, INF_IS_ALU, INF_IS_ALU, INF_IS_ALU,
     71 	INF_IS_ALU, INF_IS_ALU, INF_IS_ALU, INF_IS_ALU, INF_IS_ALU, INF_IS_ALU,
     72 	0, INF_IS_MEM, INF_IS_MEM, INF_IS_PHI, INF_IS_LABEL,
     73 	INF_IS_B_UC, INF_IS_B_CC, INF_IS_B_CC, INF_IS_B_CC, INF_IS_B_CC, INF_IS_B_CC, INF_IS_B_CC,
     74 	0, INF_IS_RET, 0,
     75 };
     76 
     77 str ins_name[INS_COUNT] = {
     78 	"add", "sub", "mul", "udiv", "sdiv", "urem", "srem",
     79 	"lsl", "lsr", "asr", "and", "or", "xor",
     80 	"mov", "ld", "st", "phi", "label",
     81 	"b", "beq", "bne", "blt", "ble", "bgt", "bge", "call", "ret",
     82 	"dead",
     83 };
     84 str isz_name[4] = {
     85 	"b", "h", "w", "d"
     86 };
     87 
     88 typedef struct InstRec InstRec;
     89 typedef struct BBlockRec BBlockRec;
     90 typedef struct InstRec* Inst;
     91 typedef struct BBlockRec* BBlock;
     92 
     93 struct InstRec {
     94 	Inst next;
     95 	Inst prev;
     96 	i32 op;
     97 	i32 a;
     98 	i32 b;
     99 	i32 c;
    100 };
    101 
    102 enum {
    103 	BB_FIRST = 0x0001,
    104 	BB_LAST = 0x0002,
    105 };
    106 
    107 struct BBlockRec {
    108 	Inst first;
    109 	Inst last;
    110 	i32 flags;
    111 	i32 id;
    112 
    113 	i32 pcount;
    114 	BBlock list;
    115 	BBlock next[2];
    116 	BBlock prev[0];
    117 };