3 * Copyright (c) 2019 Collabora LTD
5 * Author: Gert Wollny <gert.wollny@collabora.com>
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:
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
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.
27 #ifndef SFN_GPRARRAY_H
28 #define SFN_GPRARRAY_H
30 #include "sfn_value.h"
38 class LiverangeEvaluator
;
40 class GPRValue
: public Value
{
43 GPRValue(GPRValue
&& orig
) = default;
44 GPRValue(const GPRValue
& orig
) = default;
46 GPRValue(uint32_t sel
, uint32_t chan
, int base_offset
);
48 GPRValue(uint32_t sel
, uint32_t chan
);
50 GPRValue
& operator = (const GPRValue
& orig
) = default;
51 GPRValue
& operator = (GPRValue
&& orig
) = default;
53 uint32_t sel() const override final
;
55 void set_as_input(){ m_input
= true; }
56 bool is_input() const {return m_input
; }
57 void set_pin_to_channel() { m_pin_to_channel
= true;}
58 bool pin_to_channel() const { return m_pin_to_channel
;}
61 void do_print(std::ostream
& os
) const override
;
62 void do_print(std::ostream
& os
, const PrintFlags
& flags
) const override
;
63 bool is_equal_to(const Value
& other
) const override
;
67 bool m_pin_to_channel
;
70 class GPRVector
: public Value
{
72 using Swizzle
= std::array
<uint32_t,4>;
73 using Values
= std::array
<PValue
,4>;
74 GPRVector() = default;
75 GPRVector(GPRVector
&& orig
) = default;
76 GPRVector(const GPRVector
& orig
);
78 GPRVector(const GPRVector
& orig
, const std::array
<uint8_t, 4>& swizzle
);
79 GPRVector(std::array
<PValue
,4> elms
);
80 GPRVector(uint32_t sel
, std::array
<uint32_t,4> swizzle
);
82 GPRVector
& operator = (const GPRVector
& orig
) = default;
83 GPRVector
& operator = (GPRVector
&& orig
) = default;
85 void swizzle(const Swizzle
& swz
);
87 uint32_t sel() const override final
;
89 void set_reg_i(int i
, PValue reg
);
91 unsigned chan_i(int i
) const {return m_elms
[i
]->chan();}
92 PValue
reg_i(int i
) const {return m_elms
[i
];}
93 PValue
operator [] (int i
) const {return m_elms
[i
];}
94 PValue
& operator [] (int i
) {return m_elms
[i
];}
96 void pin_to_channel(int i
);
98 PValue
x() const {return m_elms
[0];}
99 PValue
y() const {return m_elms
[1];}
100 PValue
z() const {return m_elms
[2];}
101 PValue
w() const {return m_elms
[3];}
105 void do_print(std::ostream
& os
) const override
;
106 bool is_equal_to(const Value
& other
) const override
;
107 void validate() const;
110 mutable bool m_valid
;
114 class GPRArray
: public Value
117 using Pointer
= std::shared_ptr
<GPRArray
>;
119 GPRArray(int base
, int size
, int comp_mask
, int frac
);
121 uint32_t sel() const override
;
123 size_t size() const {return m_values
.size();}
125 PValue
get_indirect(unsigned index
, PValue indirect
, unsigned component
);
127 void record_read(LiverangeEvaluator
& ev
, int chan
)const;
128 void record_write(LiverangeEvaluator
& ev
, int chan
)const;
130 void collect_registers(ValueMap
& output
) const;
133 void do_print(std::ostream
& os
) const override
;
135 bool is_equal_to(const Value
& other
) const override
;
138 int m_component_mask
;
141 std::vector
<GPRVector
> m_values
;
144 using PGPRArray
= GPRArray::Pointer
;
146 class GPRArrayValue
:public Value
{
148 GPRArrayValue(PValue value
, GPRArray
*array
);
149 GPRArrayValue(PValue value
, PValue index
, GPRArray
*array
);
151 void record_read(LiverangeEvaluator
& ev
) const;
152 void record_write(LiverangeEvaluator
& ev
) const;
154 size_t array_size() const;
155 uint32_t sel() const override
;
157 PValue
value() {return m_value
;}
159 void reset_value(PValue new_value
);
160 void reset_addr(PValue new_addr
);
162 Value::Pointer
indirect() const {return m_addr
;}
166 void do_print(std::ostream
& os
) const override
;
168 bool is_equal_to(const Value
& other
) const override
;
175 inline size_t GPRArrayValue::array_size() const
177 return m_array
->size();
180 inline GPRVector::Swizzle
swizzle_from_mask(unsigned ncomp
)
182 GPRVector::Swizzle swz
= {0,1,2,3};
183 for (int i
= ncomp
; i
< 4; ++i
)
191 #endif // SFN_GPRARRAY_H