1 /* 2 * Copyright (c) 2017 Lima Project 3 * Copyright (c) 2013 Ben Brewer (ben.brewer@codethink.co.uk) 4 * Copyright (c) 2013 Connor Abbott (connor@abbott.cx) 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the "Software"), 8 * to deal in the Software without restriction, including without limitation 9 * the rights to use, copy, modify, merge, publish, distribute, sub license, 10 * and/or sell copies of the Software, and to permit persons to whom the 11 * Software is furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice (including the 14 * next paragraph) shall be included in all copies or substantial portions 15 * of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 23 * DEALINGS IN THE SOFTWARE. 24 * 25 */ 26 27 #ifndef LIMA_IR_GP_CODEGEN_H 28 #define LIMA_IR_GP_CODEGEN_H 29 30 typedef enum { 31 gpir_codegen_src_attrib_x = 0, 32 gpir_codegen_src_attrib_y = 1, 33 gpir_codegen_src_attrib_z = 2, 34 gpir_codegen_src_attrib_w = 3, 35 gpir_codegen_src_register_x = 4, 36 gpir_codegen_src_register_y = 5, 37 gpir_codegen_src_register_z = 6, 38 gpir_codegen_src_register_w = 7, 39 gpir_codegen_src_unknown_0 = 8, 40 gpir_codegen_src_unknown_1 = 9, 41 gpir_codegen_src_unknown_2 = 10, 42 gpir_codegen_src_unknown_3 = 11, 43 gpir_codegen_src_load_x = 12, 44 gpir_codegen_src_load_y = 13, 45 gpir_codegen_src_load_z = 14, 46 gpir_codegen_src_load_w = 15, 47 gpir_codegen_src_p1_acc_0 = 16, 48 gpir_codegen_src_p1_acc_1 = 17, 49 gpir_codegen_src_p1_mul_0 = 18, 50 gpir_codegen_src_p1_mul_1 = 19, 51 gpir_codegen_src_p1_pass = 20, 52 gpir_codegen_src_unused = 21, 53 gpir_codegen_src_ident = 22, 54 gpir_codegen_src_p1_complex = 22, 55 gpir_codegen_src_p2_pass = 23, 56 gpir_codegen_src_p2_acc_0 = 24, 57 gpir_codegen_src_p2_acc_1 = 25, 58 gpir_codegen_src_p2_mul_0 = 26, 59 gpir_codegen_src_p2_mul_1 = 27, 60 gpir_codegen_src_p1_attrib_x = 28, 61 gpir_codegen_src_p1_attrib_y = 29, 62 gpir_codegen_src_p1_attrib_z = 30, 63 gpir_codegen_src_p1_attrib_w = 31, 64 } gpir_codegen_src; 65 66 typedef enum { 67 gpir_codegen_load_off_ld_addr_0 = 1, 68 gpir_codegen_load_off_ld_addr_1 = 2, 69 gpir_codegen_load_off_ld_addr_2 = 3, 70 gpir_codegen_load_off_none = 7, 71 } gpir_codegen_load_off; 72 73 typedef enum { 74 gpir_codegen_store_src_acc_0 = 0, 75 gpir_codegen_store_src_acc_1 = 1, 76 gpir_codegen_store_src_mul_0 = 2, 77 gpir_codegen_store_src_mul_1 = 3, 78 gpir_codegen_store_src_pass = 4, 79 gpir_codegen_store_src_unknown = 5, 80 gpir_codegen_store_src_complex = 6, 81 gpir_codegen_store_src_none = 7, 82 } gpir_codegen_store_src; 83 84 typedef enum { 85 gpir_codegen_acc_op_add = 0, 86 gpir_codegen_acc_op_floor = 1, 87 gpir_codegen_acc_op_sign = 2, 88 gpir_codegen_acc_op_ge = 4, 89 gpir_codegen_acc_op_lt = 5, 90 gpir_codegen_acc_op_min = 6, 91 gpir_codegen_acc_op_max = 7, 92 } gpir_codegen_acc_op; 93 94 typedef enum { 95 gpir_codegen_complex_op_nop = 0, 96 gpir_codegen_complex_op_exp2 = 2, 97 gpir_codegen_complex_op_log2 = 3, 98 gpir_codegen_complex_op_rsqrt = 4, 99 gpir_codegen_complex_op_rcp = 5, 100 gpir_codegen_complex_op_pass = 9, 101 gpir_codegen_complex_op_temp_store_addr = 12, 102 gpir_codegen_complex_op_temp_load_addr_0 = 13, 103 gpir_codegen_complex_op_temp_load_addr_1 = 14, 104 gpir_codegen_complex_op_temp_load_addr_2 = 15, 105 } gpir_codegen_complex_op; 106 107 typedef enum { 108 gpir_codegen_mul_op_mul = 0, 109 gpir_codegen_mul_op_complex1 = 1, 110 gpir_codegen_mul_op_complex2 = 3, 111 gpir_codegen_mul_op_select = 4, 112 } gpir_codegen_mul_op; 113 114 typedef enum { 115 gpir_codegen_pass_op_pass = 2, 116 gpir_codegen_pass_op_preexp2 = 4, 117 gpir_codegen_pass_op_postlog2 = 5, 118 gpir_codegen_pass_op_clamp = 6, 119 } gpir_codegen_pass_op; 120 121 122 typedef struct __attribute__((__packed__)) { 123 gpir_codegen_src mul0_src0 : 5; 124 gpir_codegen_src mul0_src1 : 5; 125 gpir_codegen_src mul1_src0 : 5; 126 gpir_codegen_src mul1_src1 : 5; 127 bool mul0_neg : 1; 128 bool mul1_neg : 1; 129 gpir_codegen_src acc0_src0 : 5; 130 gpir_codegen_src acc0_src1 : 5; 131 gpir_codegen_src acc1_src0 : 5; 132 gpir_codegen_src acc1_src1 : 5; 133 bool acc0_src0_neg : 1; 134 bool acc0_src1_neg : 1; 135 bool acc1_src0_neg : 1; 136 bool acc1_src1_neg : 1; 137 unsigned load_addr : 9; 138 gpir_codegen_load_off load_offset : 3; 139 unsigned register0_addr : 4; 140 bool register0_attribute : 1; 141 unsigned register1_addr : 4; 142 bool store0_temporary : 1; 143 bool store1_temporary : 1; 144 bool branch : 1; 145 bool branch_target_lo : 1; 146 gpir_codegen_store_src store0_src_x : 3; 147 gpir_codegen_store_src store0_src_y : 3; 148 gpir_codegen_store_src store1_src_z : 3; 149 gpir_codegen_store_src store1_src_w : 3; 150 gpir_codegen_acc_op acc_op : 3; 151 gpir_codegen_complex_op complex_op : 4; 152 unsigned store0_addr : 4; 153 bool store0_varying : 1; 154 unsigned store1_addr : 4; 155 bool store1_varying : 1; 156 gpir_codegen_mul_op mul_op : 3; 157 gpir_codegen_pass_op pass_op : 3; 158 gpir_codegen_src complex_src : 5; 159 gpir_codegen_src pass_src : 5; 160 unsigned unknown_1 : 4; /* 12: tmp_st, 13: branch */ 161 unsigned branch_target : 8; 162 } gpir_codegen_instr; 163 164 void gpir_disassemble_program(gpir_codegen_instr *code, unsigned num_instr, FILE *fp); 165 166 #endif 167