1 /* -*- mesa-c++ -*- 2 * 3 * Copyright (c) 2019 Collabora LTD 4 * 5 * Author: Gert Wollny <gert.wollny@collabora.com> 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a 8 * copy of this software and associated documentation files (the "Software"), 9 * to deal in the Software without restriction, including without limitation 10 * on the rights to use, copy, modify, merge, publish, distribute, sub 11 * license, and/or sell copies of the Software, and to permit persons to whom 12 * the Software is furnished to do so, subject to the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the next 15 * paragraph) shall be included in all copies or substantial portions of the 16 * Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 21 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 22 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 23 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 24 * USE OR OTHER DEALINGS IN THE SOFTWARE. 25 */ 26 27 #ifndef SFN_EXPORTINSTRUCTION_H 28 #define SFN_EXPORTINSTRUCTION_H 29 30 #include "sfn_instruction_base.h" 31 32 namespace r600 { 33 34 class WriteoutInstruction: public Instruction { 35 public: 36 void replace_values(const ValueSet& candiates, PValue new_value) override; gpr()37 const GPRVector& gpr() const {return m_value;} gpr_ptr()38 const GPRVector *gpr_ptr() const {return &m_value;} 39 protected: 40 WriteoutInstruction(instr_type t, const GPRVector& value); 41 private: 42 virtual void replace_values_child(const ValueSet& candiates, PValue new_value); 43 virtual void remap_registers_child(std::vector<rename_reg_pair>& map, 44 ValueMap& values); 45 46 GPRVector m_value; 47 }; 48 49 class ExportInstruction : public WriteoutInstruction { 50 public: 51 enum ExportType { 52 et_pixel, 53 et_pos, 54 et_param 55 }; 56 57 ExportInstruction(unsigned loc, const GPRVector& value, ExportType type); 58 void set_last(); 59 export_type()60 ExportType export_type() const {return m_type;} 61 location()62 unsigned location() const {return m_loc;} is_last_export()63 bool is_last_export() const {return m_is_last;} 64 65 void update_output_map(OutputRegisterMap& map) const; 66 67 private: 68 bool is_equal_to(const Instruction& lhs) const override; 69 void do_print(std::ostream& os) const override; 70 71 ExportType m_type; 72 unsigned m_loc; 73 bool m_is_last; 74 }; 75 76 class WriteScratchInstruction : public WriteoutInstruction { 77 public: 78 79 WriteScratchInstruction(unsigned loc, const GPRVector& value, int align, 80 int align_offset, int writemask); 81 WriteScratchInstruction(const PValue& address, const GPRVector& value, 82 int align, int align_offset, int writemask, int array_size); location()83 unsigned location() const {return m_loc;} 84 write_mask()85 int write_mask() const { return m_writemask;} address()86 int address() const { assert(m_address); return m_address->sel();} indirect()87 bool indirect() const { return !!m_address;} array_size()88 int array_size() const { return m_array_size;} 89 90 private: 91 bool is_equal_to(const Instruction& lhs) const override; 92 void do_print(std::ostream& os) const override; 93 94 void replace_values_child(const ValueSet& candiates, PValue new_value) override; 95 void remap_registers_child(std::vector<rename_reg_pair>& map, 96 ValueMap& values)override; 97 98 unsigned m_loc; 99 PValue m_address; 100 unsigned m_align; 101 unsigned m_align_offset; 102 unsigned m_writemask; 103 int m_array_size; 104 }; 105 106 107 class StreamOutIntruction: public WriteoutInstruction { 108 public: 109 StreamOutIntruction(const GPRVector& value, int num_components, 110 int array_base, int comp_mask, int out_buffer, 111 int stream); element_size()112 int element_size() const { return m_element_size;} burst_count()113 int burst_count() const { return m_burst_count;} array_base()114 int array_base() const { return m_array_base;} array_size()115 int array_size() const { return m_array_size;} comp_mask()116 int comp_mask() const { return m_writemask;} 117 unsigned op() const; 118 119 private: 120 bool is_equal_to(const Instruction& lhs) const override; 121 void do_print(std::ostream& os) const override; 122 123 int m_element_size; 124 int m_burst_count; 125 int m_array_base; 126 int m_array_size; 127 int m_writemask; 128 int m_output_buffer; 129 int m_stream; 130 }; 131 132 enum EMemWriteType { 133 mem_write = 0, 134 mem_write_ind = 1, 135 mem_write_ack = 2, 136 mem_write_ind_ack = 3, 137 }; 138 139 class MemRingOutIntruction: public WriteoutInstruction { 140 public: 141 142 MemRingOutIntruction(ECFOpCode ring, EMemWriteType type, 143 const GPRVector& value, unsigned base_addr, 144 unsigned ncomp, PValue m_index); 145 op()146 unsigned op() const{return m_ring_op;} 147 unsigned ncomp() const; addr()148 unsigned addr() const {return m_base_address;} type()149 EMemWriteType type() const {return m_type;} index_reg()150 unsigned index_reg() const {return m_index->sel();} array_base()151 unsigned array_base() const {return m_base_address; } 152 void replace_values_child(const ValueSet& candiates, PValue new_value) override; 153 void remap_registers_child(std::vector<rename_reg_pair>& map, 154 ValueMap& values) override; 155 void patch_ring(int stream); 156 private: 157 bool is_equal_to(const Instruction& lhs) const override; 158 void do_print(std::ostream& os) const override; 159 160 ECFOpCode m_ring_op; 161 EMemWriteType m_type; 162 unsigned m_base_address; 163 unsigned m_num_comp; 164 PValue m_index; 165 166 }; 167 168 } 169 170 171 #endif // SFN_EXPORTINSTRUCTION_H