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 };