1 // Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //    http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #ifndef sw_Reactor_hpp
16 #define sw_Reactor_hpp
17 
18 #include "Nucleus.hpp"
19 #include "Routine.hpp"
20 
21 #include <cassert>
22 #include <cstddef>
23 #include <cwchar>
24 #undef Bool
25 
26 namespace sw
27 {
28 	class Bool;
29 	class Byte;
30 	class SByte;
31 	class Byte4;
32 	class SByte4;
33 	class Byte8;
34 	class SByte8;
35 	class Byte16;
36 	class SByte16;
37 	class Short;
38 	class UShort;
39 	class Short2;
40 	class UShort2;
41 	class Short4;
42 	class UShort4;
43 	class Short8;
44 	class UShort8;
45 	class Int;
46 	class UInt;
47 	class Int2;
48 	class UInt2;
49 	class Int4;
50 	class UInt4;
51 	class Long;
52 	class Float;
53 	class Float2;
54 	class Float4;
55 
56 	class Void
57 	{
58 	public:
59 		static Type *getType();
60 
isVoid()61 		static bool isVoid()
62 		{
63 			return true;
64 		}
65 	};
66 
67 	template<class T>
68 	class RValue;
69 
70 	template<class T>
71 	class Pointer;
72 
73 	class Variable
74 	{
75 	protected:
76 		Value *address;
77 	};
78 
79 	template<class T>
80 	class LValue : public Variable
81 	{
82 	public:
83 		LValue(int arraySize = 0);
84 
85 		RValue<Pointer<T>> operator&();
86 
isVoid()87 		static bool isVoid()
88 		{
89 			return false;
90 		}
91 
92 		Value *loadValue() const;
93 		Value *storeValue(Value *value) const;
94 		Value *getAddress(Value *index, bool unsignedIndex) const;
95 	};
96 
97 	template<class T>
98 	class Reference
99 	{
100 	public:
101 		explicit Reference(Value *pointer, int alignment = 1);
102 
103 		RValue<T> operator=(RValue<T> rhs) const;
104 		RValue<T> operator=(const Reference<T> &ref) const;
105 
106 		RValue<T> operator+=(RValue<T> rhs) const;
107 
108 		Value *loadValue() const;
109 		int getAlignment() const;
110 
111 	private:
112 		Value *address;
113 
114 		const int alignment;
115 	};
116 
117 	template<class T>
118 	struct IntLiteral
119 	{
120 		struct type;
121 	};
122 
123 	template<>
124 	struct IntLiteral<Bool>
125 	{
126 		typedef bool type;
127 	};
128 
129 	template<>
130 	struct IntLiteral<Int>
131 	{
132 		typedef int type;
133 	};
134 
135 	template<>
136 	struct IntLiteral<UInt>
137 	{
138 		typedef unsigned int type;
139 	};
140 
141 	template<>
142 	struct IntLiteral<Long>
143 	{
144 		typedef int64_t type;
145 	};
146 
147 	template<class T>
148 	struct FloatLiteral
149 	{
150 		struct type;
151 	};
152 
153 	template<>
154 	struct FloatLiteral<Float>
155 	{
156 		typedef float type;
157 	};
158 
159 	template<class T>
160 	class RValue
161 	{
162 	public:
163 		explicit RValue(Value *rvalue);
164 
165 		RValue(const T &lvalue);
166 		RValue(typename IntLiteral<T>::type i);
167 		RValue(typename FloatLiteral<T>::type f);
168 		RValue(const Reference<T> &rhs);
169 
170 		RValue<T> &operator=(const RValue<T>&) = delete;
171 
172 		Value *value;   // FIXME: Make private
173 	};
174 
175 	template<typename T>
176 	struct Argument
177 	{
Argumentsw::Argument178 		explicit Argument(Value *value) : value(value) {}
179 
180 		Value *value;
181 	};
182 
183 	class Bool : public LValue<Bool>
184 	{
185 	public:
186 		Bool(Argument<Bool> argument);
187 
188 		Bool() = default;
189 		Bool(bool x);
190 		Bool(RValue<Bool> rhs);
191 		Bool(const Bool &rhs);
192 		Bool(const Reference<Bool> &rhs);
193 
194 	//	RValue<Bool> operator=(bool rhs);   // FIXME: Implement
195 		RValue<Bool> operator=(RValue<Bool> rhs);
196 		RValue<Bool> operator=(const Bool &rhs);
197 		RValue<Bool> operator=(const Reference<Bool> &rhs);
198 
199 		static Type *getType();
200 	};
201 
202 	RValue<Bool> operator!(RValue<Bool> val);
203 	RValue<Bool> operator&&(RValue<Bool> lhs, RValue<Bool> rhs);
204 	RValue<Bool> operator||(RValue<Bool> lhs, RValue<Bool> rhs);
205 
206 	class Byte : public LValue<Byte>
207 	{
208 	public:
209 		Byte(Argument<Byte> argument);
210 
211 		explicit Byte(RValue<Int> cast);
212 		explicit Byte(RValue<UInt> cast);
213 		explicit Byte(RValue<UShort> cast);
214 
215 		Byte() = default;
216 		Byte(int x);
217 		Byte(unsigned char x);
218 		Byte(RValue<Byte> rhs);
219 		Byte(const Byte &rhs);
220 		Byte(const Reference<Byte> &rhs);
221 
222 	//	RValue<Byte> operator=(unsigned char rhs);   // FIXME: Implement
223 		RValue<Byte> operator=(RValue<Byte> rhs);
224 		RValue<Byte> operator=(const Byte &rhs);
225 		RValue<Byte> operator=(const Reference<Byte> &rhs);
226 
227 		static Type *getType();
228 	};
229 
230 	RValue<Byte> operator+(RValue<Byte> lhs, RValue<Byte> rhs);
231 	RValue<Byte> operator-(RValue<Byte> lhs, RValue<Byte> rhs);
232 	RValue<Byte> operator*(RValue<Byte> lhs, RValue<Byte> rhs);
233 	RValue<Byte> operator/(RValue<Byte> lhs, RValue<Byte> rhs);
234 	RValue<Byte> operator%(RValue<Byte> lhs, RValue<Byte> rhs);
235 	RValue<Byte> operator&(RValue<Byte> lhs, RValue<Byte> rhs);
236 	RValue<Byte> operator|(RValue<Byte> lhs, RValue<Byte> rhs);
237 	RValue<Byte> operator^(RValue<Byte> lhs, RValue<Byte> rhs);
238 	RValue<Byte> operator<<(RValue<Byte> lhs, RValue<Byte> rhs);
239 	RValue<Byte> operator>>(RValue<Byte> lhs, RValue<Byte> rhs);
240 	RValue<Byte> operator+=(Byte &lhs, RValue<Byte> rhs);
241 	RValue<Byte> operator-=(Byte &lhs, RValue<Byte> rhs);
242 	RValue<Byte> operator*=(Byte &lhs, RValue<Byte> rhs);
243 	RValue<Byte> operator/=(Byte &lhs, RValue<Byte> rhs);
244 	RValue<Byte> operator%=(Byte &lhs, RValue<Byte> rhs);
245 	RValue<Byte> operator&=(Byte &lhs, RValue<Byte> rhs);
246 	RValue<Byte> operator|=(Byte &lhs, RValue<Byte> rhs);
247 	RValue<Byte> operator^=(Byte &lhs, RValue<Byte> rhs);
248 	RValue<Byte> operator<<=(Byte &lhs, RValue<Byte> rhs);
249 	RValue<Byte> operator>>=(Byte &lhs, RValue<Byte> rhs);
250 	RValue<Byte> operator+(RValue<Byte> val);
251 	RValue<Byte> operator-(RValue<Byte> val);
252 	RValue<Byte> operator~(RValue<Byte> val);
253 	RValue<Byte> operator++(Byte &val, int);   // Post-increment
254 	const Byte &operator++(Byte &val);   // Pre-increment
255 	RValue<Byte> operator--(Byte &val, int);   // Post-decrement
256 	const Byte &operator--(Byte &val);   // Pre-decrement
257 	RValue<Bool> operator<(RValue<Byte> lhs, RValue<Byte> rhs);
258 	RValue<Bool> operator<=(RValue<Byte> lhs, RValue<Byte> rhs);
259 	RValue<Bool> operator>(RValue<Byte> lhs, RValue<Byte> rhs);
260 	RValue<Bool> operator>=(RValue<Byte> lhs, RValue<Byte> rhs);
261 	RValue<Bool> operator!=(RValue<Byte> lhs, RValue<Byte> rhs);
262 	RValue<Bool> operator==(RValue<Byte> lhs, RValue<Byte> rhs);
263 
264 	class SByte : public LValue<SByte>
265 	{
266 	public:
267 		SByte(Argument<SByte> argument);
268 
269 		explicit SByte(RValue<Int> cast);
270 		explicit SByte(RValue<Short> cast);
271 
272 		SByte() = default;
273 		SByte(signed char x);
274 		SByte(RValue<SByte> rhs);
275 		SByte(const SByte &rhs);
276 		SByte(const Reference<SByte> &rhs);
277 
278 	//	RValue<SByte> operator=(signed char rhs);   // FIXME: Implement
279 		RValue<SByte> operator=(RValue<SByte> rhs);
280 		RValue<SByte> operator=(const SByte &rhs);
281 		RValue<SByte> operator=(const Reference<SByte> &rhs);
282 
283 		static Type *getType();
284 	};
285 
286 	RValue<SByte> operator+(RValue<SByte> lhs, RValue<SByte> rhs);
287 	RValue<SByte> operator-(RValue<SByte> lhs, RValue<SByte> rhs);
288 	RValue<SByte> operator*(RValue<SByte> lhs, RValue<SByte> rhs);
289 	RValue<SByte> operator/(RValue<SByte> lhs, RValue<SByte> rhs);
290 	RValue<SByte> operator%(RValue<SByte> lhs, RValue<SByte> rhs);
291 	RValue<SByte> operator&(RValue<SByte> lhs, RValue<SByte> rhs);
292 	RValue<SByte> operator|(RValue<SByte> lhs, RValue<SByte> rhs);
293 	RValue<SByte> operator^(RValue<SByte> lhs, RValue<SByte> rhs);
294 	RValue<SByte> operator<<(RValue<SByte> lhs, RValue<SByte> rhs);
295 	RValue<SByte> operator>>(RValue<SByte> lhs, RValue<SByte> rhs);
296 	RValue<SByte> operator+=(SByte &lhs, RValue<SByte> rhs);
297 	RValue<SByte> operator-=(SByte &lhs, RValue<SByte> rhs);
298 	RValue<SByte> operator*=(SByte &lhs, RValue<SByte> rhs);
299 	RValue<SByte> operator/=(SByte &lhs, RValue<SByte> rhs);
300 	RValue<SByte> operator%=(SByte &lhs, RValue<SByte> rhs);
301 	RValue<SByte> operator&=(SByte &lhs, RValue<SByte> rhs);
302 	RValue<SByte> operator|=(SByte &lhs, RValue<SByte> rhs);
303 	RValue<SByte> operator^=(SByte &lhs, RValue<SByte> rhs);
304 	RValue<SByte> operator<<=(SByte &lhs, RValue<SByte> rhs);
305 	RValue<SByte> operator>>=(SByte &lhs, RValue<SByte> rhs);
306 	RValue<SByte> operator+(RValue<SByte> val);
307 	RValue<SByte> operator-(RValue<SByte> val);
308 	RValue<SByte> operator~(RValue<SByte> val);
309 	RValue<SByte> operator++(SByte &val, int);   // Post-increment
310 	const SByte &operator++(SByte &val);   // Pre-increment
311 	RValue<SByte> operator--(SByte &val, int);   // Post-decrement
312 	const SByte &operator--(SByte &val);   // Pre-decrement
313 	RValue<Bool> operator<(RValue<SByte> lhs, RValue<SByte> rhs);
314 	RValue<Bool> operator<=(RValue<SByte> lhs, RValue<SByte> rhs);
315 	RValue<Bool> operator>(RValue<SByte> lhs, RValue<SByte> rhs);
316 	RValue<Bool> operator>=(RValue<SByte> lhs, RValue<SByte> rhs);
317 	RValue<Bool> operator!=(RValue<SByte> lhs, RValue<SByte> rhs);
318 	RValue<Bool> operator==(RValue<SByte> lhs, RValue<SByte> rhs);
319 
320 	class Short : public LValue<Short>
321 	{
322 	public:
323 		Short(Argument<Short> argument);
324 
325 		explicit Short(RValue<Int> cast);
326 
327 		Short() = default;
328 		Short(short x);
329 		Short(RValue<Short> rhs);
330 		Short(const Short &rhs);
331 		Short(const Reference<Short> &rhs);
332 
333 	//	RValue<Short> operator=(short rhs);   // FIXME: Implement
334 		RValue<Short> operator=(RValue<Short> rhs);
335 		RValue<Short> operator=(const Short &rhs);
336 		RValue<Short> operator=(const Reference<Short> &rhs);
337 
338 		static Type *getType();
339 	};
340 
341 	RValue<Short> operator+(RValue<Short> lhs, RValue<Short> rhs);
342 	RValue<Short> operator-(RValue<Short> lhs, RValue<Short> rhs);
343 	RValue<Short> operator*(RValue<Short> lhs, RValue<Short> rhs);
344 	RValue<Short> operator/(RValue<Short> lhs, RValue<Short> rhs);
345 	RValue<Short> operator%(RValue<Short> lhs, RValue<Short> rhs);
346 	RValue<Short> operator&(RValue<Short> lhs, RValue<Short> rhs);
347 	RValue<Short> operator|(RValue<Short> lhs, RValue<Short> rhs);
348 	RValue<Short> operator^(RValue<Short> lhs, RValue<Short> rhs);
349 	RValue<Short> operator<<(RValue<Short> lhs, RValue<Short> rhs);
350 	RValue<Short> operator>>(RValue<Short> lhs, RValue<Short> rhs);
351 	RValue<Short> operator+=(Short &lhs, RValue<Short> rhs);
352 	RValue<Short> operator-=(Short &lhs, RValue<Short> rhs);
353 	RValue<Short> operator*=(Short &lhs, RValue<Short> rhs);
354 	RValue<Short> operator/=(Short &lhs, RValue<Short> rhs);
355 	RValue<Short> operator%=(Short &lhs, RValue<Short> rhs);
356 	RValue<Short> operator&=(Short &lhs, RValue<Short> rhs);
357 	RValue<Short> operator|=(Short &lhs, RValue<Short> rhs);
358 	RValue<Short> operator^=(Short &lhs, RValue<Short> rhs);
359 	RValue<Short> operator<<=(Short &lhs, RValue<Short> rhs);
360 	RValue<Short> operator>>=(Short &lhs, RValue<Short> rhs);
361 	RValue<Short> operator+(RValue<Short> val);
362 	RValue<Short> operator-(RValue<Short> val);
363 	RValue<Short> operator~(RValue<Short> val);
364 	RValue<Short> operator++(Short &val, int);   // Post-increment
365 	const Short &operator++(Short &val);   // Pre-increment
366 	RValue<Short> operator--(Short &val, int);   // Post-decrement
367 	const Short &operator--(Short &val);   // Pre-decrement
368 	RValue<Bool> operator<(RValue<Short> lhs, RValue<Short> rhs);
369 	RValue<Bool> operator<=(RValue<Short> lhs, RValue<Short> rhs);
370 	RValue<Bool> operator>(RValue<Short> lhs, RValue<Short> rhs);
371 	RValue<Bool> operator>=(RValue<Short> lhs, RValue<Short> rhs);
372 	RValue<Bool> operator!=(RValue<Short> lhs, RValue<Short> rhs);
373 	RValue<Bool> operator==(RValue<Short> lhs, RValue<Short> rhs);
374 
375 	class UShort : public LValue<UShort>
376 	{
377 	public:
378 		UShort(Argument<UShort> argument);
379 
380 		explicit UShort(RValue<UInt> cast);
381 		explicit UShort(RValue<Int> cast);
382 
383 		UShort() = default;
384 		UShort(unsigned short x);
385 		UShort(RValue<UShort> rhs);
386 		UShort(const UShort &rhs);
387 		UShort(const Reference<UShort> &rhs);
388 
389 	//	RValue<UShort> operator=(unsigned short rhs);   // FIXME: Implement
390 		RValue<UShort> operator=(RValue<UShort> rhs);
391 		RValue<UShort> operator=(const UShort &rhs);
392 		RValue<UShort> operator=(const Reference<UShort> &rhs);
393 
394 		static Type *getType();
395 	};
396 
397 	RValue<UShort> operator+(RValue<UShort> lhs, RValue<UShort> rhs);
398 	RValue<UShort> operator-(RValue<UShort> lhs, RValue<UShort> rhs);
399 	RValue<UShort> operator*(RValue<UShort> lhs, RValue<UShort> rhs);
400 	RValue<UShort> operator/(RValue<UShort> lhs, RValue<UShort> rhs);
401 	RValue<UShort> operator%(RValue<UShort> lhs, RValue<UShort> rhs);
402 	RValue<UShort> operator&(RValue<UShort> lhs, RValue<UShort> rhs);
403 	RValue<UShort> operator|(RValue<UShort> lhs, RValue<UShort> rhs);
404 	RValue<UShort> operator^(RValue<UShort> lhs, RValue<UShort> rhs);
405 	RValue<UShort> operator<<(RValue<UShort> lhs, RValue<UShort> rhs);
406 	RValue<UShort> operator>>(RValue<UShort> lhs, RValue<UShort> rhs);
407 	RValue<UShort> operator+=(UShort &lhs, RValue<UShort> rhs);
408 	RValue<UShort> operator-=(UShort &lhs, RValue<UShort> rhs);
409 	RValue<UShort> operator*=(UShort &lhs, RValue<UShort> rhs);
410 	RValue<UShort> operator/=(UShort &lhs, RValue<UShort> rhs);
411 	RValue<UShort> operator%=(UShort &lhs, RValue<UShort> rhs);
412 	RValue<UShort> operator&=(UShort &lhs, RValue<UShort> rhs);
413 	RValue<UShort> operator|=(UShort &lhs, RValue<UShort> rhs);
414 	RValue<UShort> operator^=(UShort &lhs, RValue<UShort> rhs);
415 	RValue<UShort> operator<<=(UShort &lhs, RValue<UShort> rhs);
416 	RValue<UShort> operator>>=(UShort &lhs, RValue<UShort> rhs);
417 	RValue<UShort> operator+(RValue<UShort> val);
418 	RValue<UShort> operator-(RValue<UShort> val);
419 	RValue<UShort> operator~(RValue<UShort> val);
420 	RValue<UShort> operator++(UShort &val, int);   // Post-increment
421 	const UShort &operator++(UShort &val);   // Pre-increment
422 	RValue<UShort> operator--(UShort &val, int);   // Post-decrement
423 	const UShort &operator--(UShort &val);   // Pre-decrement
424 	RValue<Bool> operator<(RValue<UShort> lhs, RValue<UShort> rhs);
425 	RValue<Bool> operator<=(RValue<UShort> lhs, RValue<UShort> rhs);
426 	RValue<Bool> operator>(RValue<UShort> lhs, RValue<UShort> rhs);
427 	RValue<Bool> operator>=(RValue<UShort> lhs, RValue<UShort> rhs);
428 	RValue<Bool> operator!=(RValue<UShort> lhs, RValue<UShort> rhs);
429 	RValue<Bool> operator==(RValue<UShort> lhs, RValue<UShort> rhs);
430 
431 	class Byte4 : public LValue<Byte4>
432 	{
433 	public:
434 		explicit Byte4(RValue<Byte8> cast);
435 
436 		Byte4() = default;
437 	//	Byte4(int x, int y, int z, int w);
438 	//	Byte4(RValue<Byte4> rhs);
439 	//	Byte4(const Byte4 &rhs);
440 		Byte4(const Reference<Byte4> &rhs);
441 
442 	//	RValue<Byte4> operator=(RValue<Byte4> rhs);
443 	//	RValue<Byte4> operator=(const Byte4 &rhs);
444 	//	RValue<Byte4> operator=(const Reference<Byte4> &rhs);
445 
446 		static Type *getType();
447 	};
448 
449 //	RValue<Byte4> operator+(RValue<Byte4> lhs, RValue<Byte4> rhs);
450 //	RValue<Byte4> operator-(RValue<Byte4> lhs, RValue<Byte4> rhs);
451 //	RValue<Byte4> operator*(RValue<Byte4> lhs, RValue<Byte4> rhs);
452 //	RValue<Byte4> operator/(RValue<Byte4> lhs, RValue<Byte4> rhs);
453 //	RValue<Byte4> operator%(RValue<Byte4> lhs, RValue<Byte4> rhs);
454 //	RValue<Byte4> operator&(RValue<Byte4> lhs, RValue<Byte4> rhs);
455 //	RValue<Byte4> operator|(RValue<Byte4> lhs, RValue<Byte4> rhs);
456 //	RValue<Byte4> operator^(RValue<Byte4> lhs, RValue<Byte4> rhs);
457 //	RValue<Byte4> operator<<(RValue<Byte4> lhs, RValue<Byte4> rhs);
458 //	RValue<Byte4> operator>>(RValue<Byte4> lhs, RValue<Byte4> rhs);
459 //	RValue<Byte4> operator+=(Byte4 &lhs, RValue<Byte4> rhs);
460 //	RValue<Byte4> operator-=(Byte4 &lhs, RValue<Byte4> rhs);
461 //	RValue<Byte4> operator*=(Byte4 &lhs, RValue<Byte4> rhs);
462 //	RValue<Byte4> operator/=(Byte4 &lhs, RValue<Byte4> rhs);
463 //	RValue<Byte4> operator%=(Byte4 &lhs, RValue<Byte4> rhs);
464 //	RValue<Byte4> operator&=(Byte4 &lhs, RValue<Byte4> rhs);
465 //	RValue<Byte4> operator|=(Byte4 &lhs, RValue<Byte4> rhs);
466 //	RValue<Byte4> operator^=(Byte4 &lhs, RValue<Byte4> rhs);
467 //	RValue<Byte4> operator<<=(Byte4 &lhs, RValue<Byte4> rhs);
468 //	RValue<Byte4> operator>>=(Byte4 &lhs, RValue<Byte4> rhs);
469 //	RValue<Byte4> operator+(RValue<Byte4> val);
470 //	RValue<Byte4> operator-(RValue<Byte4> val);
471 //	RValue<Byte4> operator~(RValue<Byte4> val);
472 //	RValue<Byte4> operator++(Byte4 &val, int);   // Post-increment
473 //	const Byte4 &operator++(Byte4 &val);   // Pre-increment
474 //	RValue<Byte4> operator--(Byte4 &val, int);   // Post-decrement
475 //	const Byte4 &operator--(Byte4 &val);   // Pre-decrement
476 
477 	class SByte4 : public LValue<SByte4>
478 	{
479 	public:
480 		SByte4() = default;
481 	//	SByte4(int x, int y, int z, int w);
482 	//	SByte4(RValue<SByte4> rhs);
483 	//	SByte4(const SByte4 &rhs);
484 	//	SByte4(const Reference<SByte4> &rhs);
485 
486 	//	RValue<SByte4> operator=(RValue<SByte4> rhs);
487 	//	RValue<SByte4> operator=(const SByte4 &rhs);
488 	//	RValue<SByte4> operator=(const Reference<SByte4> &rhs);
489 
490 		static Type *getType();
491 	};
492 
493 //	RValue<SByte4> operator+(RValue<SByte4> lhs, RValue<SByte4> rhs);
494 //	RValue<SByte4> operator-(RValue<SByte4> lhs, RValue<SByte4> rhs);
495 //	RValue<SByte4> operator*(RValue<SByte4> lhs, RValue<SByte4> rhs);
496 //	RValue<SByte4> operator/(RValue<SByte4> lhs, RValue<SByte4> rhs);
497 //	RValue<SByte4> operator%(RValue<SByte4> lhs, RValue<SByte4> rhs);
498 //	RValue<SByte4> operator&(RValue<SByte4> lhs, RValue<SByte4> rhs);
499 //	RValue<SByte4> operator|(RValue<SByte4> lhs, RValue<SByte4> rhs);
500 //	RValue<SByte4> operator^(RValue<SByte4> lhs, RValue<SByte4> rhs);
501 //	RValue<SByte4> operator<<(RValue<SByte4> lhs, RValue<SByte4> rhs);
502 //	RValue<SByte4> operator>>(RValue<SByte4> lhs, RValue<SByte4> rhs);
503 //	RValue<SByte4> operator+=(SByte4 &lhs, RValue<SByte4> rhs);
504 //	RValue<SByte4> operator-=(SByte4 &lhs, RValue<SByte4> rhs);
505 //	RValue<SByte4> operator*=(SByte4 &lhs, RValue<SByte4> rhs);
506 //	RValue<SByte4> operator/=(SByte4 &lhs, RValue<SByte4> rhs);
507 //	RValue<SByte4> operator%=(SByte4 &lhs, RValue<SByte4> rhs);
508 //	RValue<SByte4> operator&=(SByte4 &lhs, RValue<SByte4> rhs);
509 //	RValue<SByte4> operator|=(SByte4 &lhs, RValue<SByte4> rhs);
510 //	RValue<SByte4> operator^=(SByte4 &lhs, RValue<SByte4> rhs);
511 //	RValue<SByte4> operator<<=(SByte4 &lhs, RValue<SByte4> rhs);
512 //	RValue<SByte4> operator>>=(SByte4 &lhs, RValue<SByte4> rhs);
513 //	RValue<SByte4> operator+(RValue<SByte4> val);
514 //	RValue<SByte4> operator-(RValue<SByte4> val);
515 //	RValue<SByte4> operator~(RValue<SByte4> val);
516 //	RValue<SByte4> operator++(SByte4 &val, int);   // Post-increment
517 //	const SByte4 &operator++(SByte4 &val);   // Pre-increment
518 //	RValue<SByte4> operator--(SByte4 &val, int);   // Post-decrement
519 //	const SByte4 &operator--(SByte4 &val);   // Pre-decrement
520 
521 	class Byte8 : public LValue<Byte8>
522 	{
523 	public:
524 		Byte8() = default;
525 		Byte8(uint8_t x0, uint8_t x1, uint8_t x2, uint8_t x3, uint8_t x4, uint8_t x5, uint8_t x6, uint8_t x7);
526 		Byte8(RValue<Byte8> rhs);
527 		Byte8(const Byte8 &rhs);
528 		Byte8(const Reference<Byte8> &rhs);
529 
530 		RValue<Byte8> operator=(RValue<Byte8> rhs);
531 		RValue<Byte8> operator=(const Byte8 &rhs);
532 		RValue<Byte8> operator=(const Reference<Byte8> &rhs);
533 
534 		static Type *getType();
535 	};
536 
537 	RValue<Byte8> operator+(RValue<Byte8> lhs, RValue<Byte8> rhs);
538 	RValue<Byte8> operator-(RValue<Byte8> lhs, RValue<Byte8> rhs);
539 //	RValue<Byte8> operator*(RValue<Byte8> lhs, RValue<Byte8> rhs);
540 //	RValue<Byte8> operator/(RValue<Byte8> lhs, RValue<Byte8> rhs);
541 //	RValue<Byte8> operator%(RValue<Byte8> lhs, RValue<Byte8> rhs);
542 	RValue<Byte8> operator&(RValue<Byte8> lhs, RValue<Byte8> rhs);
543 	RValue<Byte8> operator|(RValue<Byte8> lhs, RValue<Byte8> rhs);
544 	RValue<Byte8> operator^(RValue<Byte8> lhs, RValue<Byte8> rhs);
545 //	RValue<Byte8> operator<<(RValue<Byte8> lhs, RValue<Byte8> rhs);
546 //	RValue<Byte8> operator>>(RValue<Byte8> lhs, RValue<Byte8> rhs);
547 	RValue<Byte8> operator+=(Byte8 &lhs, RValue<Byte8> rhs);
548 	RValue<Byte8> operator-=(Byte8 &lhs, RValue<Byte8> rhs);
549 //	RValue<Byte8> operator*=(Byte8 &lhs, RValue<Byte8> rhs);
550 //	RValue<Byte8> operator/=(Byte8 &lhs, RValue<Byte8> rhs);
551 //	RValue<Byte8> operator%=(Byte8 &lhs, RValue<Byte8> rhs);
552 	RValue<Byte8> operator&=(Byte8 &lhs, RValue<Byte8> rhs);
553 	RValue<Byte8> operator|=(Byte8 &lhs, RValue<Byte8> rhs);
554 	RValue<Byte8> operator^=(Byte8 &lhs, RValue<Byte8> rhs);
555 //	RValue<Byte8> operator<<=(Byte8 &lhs, RValue<Byte8> rhs);
556 //	RValue<Byte8> operator>>=(Byte8 &lhs, RValue<Byte8> rhs);
557 //	RValue<Byte8> operator+(RValue<Byte8> val);
558 //	RValue<Byte8> operator-(RValue<Byte8> val);
559 	RValue<Byte8> operator~(RValue<Byte8> val);
560 //	RValue<Byte8> operator++(Byte8 &val, int);   // Post-increment
561 //	const Byte8 &operator++(Byte8 &val);   // Pre-increment
562 //	RValue<Byte8> operator--(Byte8 &val, int);   // Post-decrement
563 //	const Byte8 &operator--(Byte8 &val);   // Pre-decrement
564 
565 	RValue<Byte8> AddSat(RValue<Byte8> x, RValue<Byte8> y);
566 	RValue<Byte8> SubSat(RValue<Byte8> x, RValue<Byte8> y);
567 	RValue<Short4> Unpack(RValue<Byte4> x);
568 	RValue<Short4> Unpack(RValue<Byte4> x, RValue<Byte4> y);
569 	RValue<Short4> UnpackLow(RValue<Byte8> x, RValue<Byte8> y);
570 	RValue<Short4> UnpackHigh(RValue<Byte8> x, RValue<Byte8> y);
571 	RValue<Int> SignMask(RValue<Byte8> x);
572 //	RValue<Byte8> CmpGT(RValue<Byte8> x, RValue<Byte8> y);
573 	RValue<Byte8> CmpEQ(RValue<Byte8> x, RValue<Byte8> y);
574 
575 	class SByte8 : public LValue<SByte8>
576 	{
577 	public:
578 		SByte8() = default;
579 		SByte8(uint8_t x0, uint8_t x1, uint8_t x2, uint8_t x3, uint8_t x4, uint8_t x5, uint8_t x6, uint8_t x7);
580 		SByte8(RValue<SByte8> rhs);
581 		SByte8(const SByte8 &rhs);
582 		SByte8(const Reference<SByte8> &rhs);
583 
584 		RValue<SByte8> operator=(RValue<SByte8> rhs);
585 		RValue<SByte8> operator=(const SByte8 &rhs);
586 		RValue<SByte8> operator=(const Reference<SByte8> &rhs);
587 
588 		static Type *getType();
589 	};
590 
591 	RValue<SByte8> operator+(RValue<SByte8> lhs, RValue<SByte8> rhs);
592 	RValue<SByte8> operator-(RValue<SByte8> lhs, RValue<SByte8> rhs);
593 //	RValue<SByte8> operator*(RValue<SByte8> lhs, RValue<SByte8> rhs);
594 //	RValue<SByte8> operator/(RValue<SByte8> lhs, RValue<SByte8> rhs);
595 //	RValue<SByte8> operator%(RValue<SByte8> lhs, RValue<SByte8> rhs);
596 	RValue<SByte8> operator&(RValue<SByte8> lhs, RValue<SByte8> rhs);
597 	RValue<SByte8> operator|(RValue<SByte8> lhs, RValue<SByte8> rhs);
598 	RValue<SByte8> operator^(RValue<SByte8> lhs, RValue<SByte8> rhs);
599 //	RValue<SByte8> operator<<(RValue<SByte8> lhs, RValue<SByte8> rhs);
600 //	RValue<SByte8> operator>>(RValue<SByte8> lhs, RValue<SByte8> rhs);
601 	RValue<SByte8> operator+=(SByte8 &lhs, RValue<SByte8> rhs);
602 	RValue<SByte8> operator-=(SByte8 &lhs, RValue<SByte8> rhs);
603 //	RValue<SByte8> operator*=(SByte8 &lhs, RValue<SByte8> rhs);
604 //	RValue<SByte8> operator/=(SByte8 &lhs, RValue<SByte8> rhs);
605 //	RValue<SByte8> operator%=(SByte8 &lhs, RValue<SByte8> rhs);
606 	RValue<SByte8> operator&=(SByte8 &lhs, RValue<SByte8> rhs);
607 	RValue<SByte8> operator|=(SByte8 &lhs, RValue<SByte8> rhs);
608 	RValue<SByte8> operator^=(SByte8 &lhs, RValue<SByte8> rhs);
609 //	RValue<SByte8> operator<<=(SByte8 &lhs, RValue<SByte8> rhs);
610 //	RValue<SByte8> operator>>=(SByte8 &lhs, RValue<SByte8> rhs);
611 //	RValue<SByte8> operator+(RValue<SByte8> val);
612 //	RValue<SByte8> operator-(RValue<SByte8> val);
613 	RValue<SByte8> operator~(RValue<SByte8> val);
614 //	RValue<SByte8> operator++(SByte8 &val, int);   // Post-increment
615 //	const SByte8 &operator++(SByte8 &val);   // Pre-increment
616 //	RValue<SByte8> operator--(SByte8 &val, int);   // Post-decrement
617 //	const SByte8 &operator--(SByte8 &val);   // Pre-decrement
618 
619 	RValue<SByte8> AddSat(RValue<SByte8> x, RValue<SByte8> y);
620 	RValue<SByte8> SubSat(RValue<SByte8> x, RValue<SByte8> y);
621 	RValue<Short4> UnpackLow(RValue<SByte8> x, RValue<SByte8> y);
622 	RValue<Short4> UnpackHigh(RValue<SByte8> x, RValue<SByte8> y);
623 	RValue<Int> SignMask(RValue<SByte8> x);
624 	RValue<Byte8> CmpGT(RValue<SByte8> x, RValue<SByte8> y);
625 	RValue<Byte8> CmpEQ(RValue<SByte8> x, RValue<SByte8> y);
626 
627 	class Byte16 : public LValue<Byte16>
628 	{
629 	public:
630 		Byte16() = default;
631 	//	Byte16(int x, int y, int z, int w);
632 		Byte16(RValue<Byte16> rhs);
633 		Byte16(const Byte16 &rhs);
634 		Byte16(const Reference<Byte16> &rhs);
635 
636 		RValue<Byte16> operator=(RValue<Byte16> rhs);
637 		RValue<Byte16> operator=(const Byte16 &rhs);
638 		RValue<Byte16> operator=(const Reference<Byte16> &rhs);
639 
640 		static Type *getType();
641 	};
642 
643 //	RValue<Byte16> operator+(RValue<Byte16> lhs, RValue<Byte16> rhs);
644 //	RValue<Byte16> operator-(RValue<Byte16> lhs, RValue<Byte16> rhs);
645 //	RValue<Byte16> operator*(RValue<Byte16> lhs, RValue<Byte16> rhs);
646 //	RValue<Byte16> operator/(RValue<Byte16> lhs, RValue<Byte16> rhs);
647 //	RValue<Byte16> operator%(RValue<Byte16> lhs, RValue<Byte16> rhs);
648 //	RValue<Byte16> operator&(RValue<Byte16> lhs, RValue<Byte16> rhs);
649 //	RValue<Byte16> operator|(RValue<Byte16> lhs, RValue<Byte16> rhs);
650 //	RValue<Byte16> operator^(RValue<Byte16> lhs, RValue<Byte16> rhs);
651 //	RValue<Byte16> operator<<(RValue<Byte16> lhs, RValue<Byte16> rhs);
652 //	RValue<Byte16> operator>>(RValue<Byte16> lhs, RValue<Byte16> rhs);
653 //	RValue<Byte16> operator+=(Byte16 &lhs, RValue<Byte16> rhs);
654 //	RValue<Byte16> operator-=(Byte16 &lhs, RValue<Byte16> rhs);
655 //	RValue<Byte16> operator*=(Byte16 &lhs, RValue<Byte16> rhs);
656 //	RValue<Byte16> operator/=(Byte16 &lhs, RValue<Byte16> rhs);
657 //	RValue<Byte16> operator%=(Byte16 &lhs, RValue<Byte16> rhs);
658 //	RValue<Byte16> operator&=(Byte16 &lhs, RValue<Byte16> rhs);
659 //	RValue<Byte16> operator|=(Byte16 &lhs, RValue<Byte16> rhs);
660 //	RValue<Byte16> operator^=(Byte16 &lhs, RValue<Byte16> rhs);
661 //	RValue<Byte16> operator<<=(Byte16 &lhs, RValue<Byte16> rhs);
662 //	RValue<Byte16> operator>>=(Byte16 &lhs, RValue<Byte16> rhs);
663 //	RValue<Byte16> operator+(RValue<Byte16> val);
664 //	RValue<Byte16> operator-(RValue<Byte16> val);
665 //	RValue<Byte16> operator~(RValue<Byte16> val);
666 //	RValue<Byte16> operator++(Byte16 &val, int);   // Post-increment
667 //	const Byte16 &operator++(Byte16 &val);   // Pre-increment
668 //	RValue<Byte16> operator--(Byte16 &val, int);   // Post-decrement
669 //	const Byte16 &operator--(Byte16 &val);   // Pre-decrement
670 
671 	class SByte16 : public LValue<SByte16>
672 	{
673 	public:
674 		SByte16() = default;
675 	//	SByte16(int x, int y, int z, int w);
676 	//	SByte16(RValue<SByte16> rhs);
677 	//	SByte16(const SByte16 &rhs);
678 	//	SByte16(const Reference<SByte16> &rhs);
679 
680 	//	RValue<SByte16> operator=(RValue<SByte16> rhs);
681 	//	RValue<SByte16> operator=(const SByte16 &rhs);
682 	//	RValue<SByte16> operator=(const Reference<SByte16> &rhs);
683 
684 		static Type *getType();
685 	};
686 
687 //	RValue<SByte16> operator+(RValue<SByte16> lhs, RValue<SByte16> rhs);
688 //	RValue<SByte16> operator-(RValue<SByte16> lhs, RValue<SByte16> rhs);
689 //	RValue<SByte16> operator*(RValue<SByte16> lhs, RValue<SByte16> rhs);
690 //	RValue<SByte16> operator/(RValue<SByte16> lhs, RValue<SByte16> rhs);
691 //	RValue<SByte16> operator%(RValue<SByte16> lhs, RValue<SByte16> rhs);
692 //	RValue<SByte16> operator&(RValue<SByte16> lhs, RValue<SByte16> rhs);
693 //	RValue<SByte16> operator|(RValue<SByte16> lhs, RValue<SByte16> rhs);
694 //	RValue<SByte16> operator^(RValue<SByte16> lhs, RValue<SByte16> rhs);
695 //	RValue<SByte16> operator<<(RValue<SByte16> lhs, RValue<SByte16> rhs);
696 //	RValue<SByte16> operator>>(RValue<SByte16> lhs, RValue<SByte16> rhs);
697 //	RValue<SByte16> operator+=(SByte16 &lhs, RValue<SByte16> rhs);
698 //	RValue<SByte16> operator-=(SByte16 &lhs, RValue<SByte16> rhs);
699 //	RValue<SByte16> operator*=(SByte16 &lhs, RValue<SByte16> rhs);
700 //	RValue<SByte16> operator/=(SByte16 &lhs, RValue<SByte16> rhs);
701 //	RValue<SByte16> operator%=(SByte16 &lhs, RValue<SByte16> rhs);
702 //	RValue<SByte16> operator&=(SByte16 &lhs, RValue<SByte16> rhs);
703 //	RValue<SByte16> operator|=(SByte16 &lhs, RValue<SByte16> rhs);
704 //	RValue<SByte16> operator^=(SByte16 &lhs, RValue<SByte16> rhs);
705 //	RValue<SByte16> operator<<=(SByte16 &lhs, RValue<SByte16> rhs);
706 //	RValue<SByte16> operator>>=(SByte16 &lhs, RValue<SByte16> rhs);
707 //	RValue<SByte16> operator+(RValue<SByte16> val);
708 //	RValue<SByte16> operator-(RValue<SByte16> val);
709 //	RValue<SByte16> operator~(RValue<SByte16> val);
710 //	RValue<SByte16> operator++(SByte16 &val, int);   // Post-increment
711 //	const SByte16 &operator++(SByte16 &val);   // Pre-increment
712 //	RValue<SByte16> operator--(SByte16 &val, int);   // Post-decrement
713 //	const SByte16 &operator--(SByte16 &val);   // Pre-decrement
714 
715 	class Short2 : public LValue<Short2>
716 	{
717 	public:
718 		explicit Short2(RValue<Short4> cast);
719 
720 		static Type *getType();
721 	};
722 
723 	class UShort2 : public LValue<UShort2>
724 	{
725 	public:
726 		explicit UShort2(RValue<UShort4> cast);
727 
728 		static Type *getType();
729 	};
730 
731 	class Short4 : public LValue<Short4>
732 	{
733 	public:
734 		explicit Short4(RValue<Int> cast);
735 		explicit Short4(RValue<Int4> cast);
736 	//	explicit Short4(RValue<Float> cast);
737 		explicit Short4(RValue<Float4> cast);
738 
739 		Short4() = default;
740 		Short4(short xyzw);
741 		Short4(short x, short y, short z, short w);
742 		Short4(RValue<Short4> rhs);
743 		Short4(const Short4 &rhs);
744 		Short4(const Reference<Short4> &rhs);
745 		Short4(RValue<UShort4> rhs);
746 		Short4(const UShort4 &rhs);
747 		Short4(const Reference<UShort4> &rhs);
748 
749 		RValue<Short4> operator=(RValue<Short4> rhs);
750 		RValue<Short4> operator=(const Short4 &rhs);
751 		RValue<Short4> operator=(const Reference<Short4> &rhs);
752 		RValue<Short4> operator=(RValue<UShort4> rhs);
753 		RValue<Short4> operator=(const UShort4 &rhs);
754 		RValue<Short4> operator=(const Reference<UShort4> &rhs);
755 
756 		static Type *getType();
757 	};
758 
759 	RValue<Short4> operator+(RValue<Short4> lhs, RValue<Short4> rhs);
760 	RValue<Short4> operator-(RValue<Short4> lhs, RValue<Short4> rhs);
761 	RValue<Short4> operator*(RValue<Short4> lhs, RValue<Short4> rhs);
762 //	RValue<Short4> operator/(RValue<Short4> lhs, RValue<Short4> rhs);
763 //	RValue<Short4> operator%(RValue<Short4> lhs, RValue<Short4> rhs);
764 	RValue<Short4> operator&(RValue<Short4> lhs, RValue<Short4> rhs);
765 	RValue<Short4> operator|(RValue<Short4> lhs, RValue<Short4> rhs);
766 	RValue<Short4> operator^(RValue<Short4> lhs, RValue<Short4> rhs);
767 	RValue<Short4> operator<<(RValue<Short4> lhs, unsigned char rhs);
768 	RValue<Short4> operator>>(RValue<Short4> lhs, unsigned char rhs);
769 	RValue<Short4> operator+=(Short4 &lhs, RValue<Short4> rhs);
770 	RValue<Short4> operator-=(Short4 &lhs, RValue<Short4> rhs);
771 	RValue<Short4> operator*=(Short4 &lhs, RValue<Short4> rhs);
772 //	RValue<Short4> operator/=(Short4 &lhs, RValue<Short4> rhs);
773 //	RValue<Short4> operator%=(Short4 &lhs, RValue<Short4> rhs);
774 	RValue<Short4> operator&=(Short4 &lhs, RValue<Short4> rhs);
775 	RValue<Short4> operator|=(Short4 &lhs, RValue<Short4> rhs);
776 	RValue<Short4> operator^=(Short4 &lhs, RValue<Short4> rhs);
777 	RValue<Short4> operator<<=(Short4 &lhs, unsigned char rhs);
778 	RValue<Short4> operator>>=(Short4 &lhs, unsigned char rhs);
779 //	RValue<Short4> operator+(RValue<Short4> val);
780 	RValue<Short4> operator-(RValue<Short4> val);
781 	RValue<Short4> operator~(RValue<Short4> val);
782 //	RValue<Short4> operator++(Short4 &val, int);   // Post-increment
783 //	const Short4 &operator++(Short4 &val);   // Pre-increment
784 //	RValue<Short4> operator--(Short4 &val, int);   // Post-decrement
785 //	const Short4 &operator--(Short4 &val);   // Pre-decrement
786 //	RValue<Bool> operator<(RValue<Short4> lhs, RValue<Short4> rhs);
787 //	RValue<Bool> operator<=(RValue<Short4> lhs, RValue<Short4> rhs);
788 //	RValue<Bool> operator>(RValue<Short4> lhs, RValue<Short4> rhs);
789 //	RValue<Bool> operator>=(RValue<Short4> lhs, RValue<Short4> rhs);
790 //	RValue<Bool> operator!=(RValue<Short4> lhs, RValue<Short4> rhs);
791 //	RValue<Bool> operator==(RValue<Short4> lhs, RValue<Short4> rhs);
792 
793 	RValue<Short4> RoundShort4(RValue<Float4> cast);
794 	RValue<Short4> Max(RValue<Short4> x, RValue<Short4> y);
795 	RValue<Short4> Min(RValue<Short4> x, RValue<Short4> y);
796 	RValue<Short4> AddSat(RValue<Short4> x, RValue<Short4> y);
797 	RValue<Short4> SubSat(RValue<Short4> x, RValue<Short4> y);
798 	RValue<Short4> MulHigh(RValue<Short4> x, RValue<Short4> y);
799 	RValue<Int2> MulAdd(RValue<Short4> x, RValue<Short4> y);
800 	RValue<SByte8> PackSigned(RValue<Short4> x, RValue<Short4> y);
801 	RValue<Byte8> PackUnsigned(RValue<Short4> x, RValue<Short4> y);
802 	RValue<Int2> UnpackLow(RValue<Short4> x, RValue<Short4> y);
803 	RValue<Int2> UnpackHigh(RValue<Short4> x, RValue<Short4> y);
804 	RValue<Short4> Swizzle(RValue<Short4> x, unsigned char select);
805 	RValue<Short4> Insert(RValue<Short4> val, RValue<Short> element, int i);
806 	RValue<Short> Extract(RValue<Short4> val, int i);
807 	RValue<Short4> CmpGT(RValue<Short4> x, RValue<Short4> y);
808 	RValue<Short4> CmpEQ(RValue<Short4> x, RValue<Short4> y);
809 
810 	class UShort4 : public LValue<UShort4>
811 	{
812 	public:
813 		explicit UShort4(RValue<Int4> cast);
814 		explicit UShort4(RValue<Float4> cast, bool saturate = false);
815 
816 		UShort4() = default;
817 		UShort4(unsigned short xyzw);
818 		UShort4(unsigned short x, unsigned short y, unsigned short z, unsigned short w);
819 		UShort4(RValue<UShort4> rhs);
820 		UShort4(const UShort4 &rhs);
821 		UShort4(const Reference<UShort4> &rhs);
822 		UShort4(RValue<Short4> rhs);
823 		UShort4(const Short4 &rhs);
824 		UShort4(const Reference<Short4> &rhs);
825 
826 		RValue<UShort4> operator=(RValue<UShort4> rhs);
827 		RValue<UShort4> operator=(const UShort4 &rhs);
828 		RValue<UShort4> operator=(const Reference<UShort4> &rhs);
829 		RValue<UShort4> operator=(RValue<Short4> rhs);
830 		RValue<UShort4> operator=(const Short4 &rhs);
831 		RValue<UShort4> operator=(const Reference<Short4> &rhs);
832 
833 		static Type *getType();
834 	};
835 
836 	RValue<UShort4> operator+(RValue<UShort4> lhs, RValue<UShort4> rhs);
837 	RValue<UShort4> operator-(RValue<UShort4> lhs, RValue<UShort4> rhs);
838 	RValue<UShort4> operator*(RValue<UShort4> lhs, RValue<UShort4> rhs);
839 //	RValue<UShort4> operator/(RValue<UShort4> lhs, RValue<UShort4> rhs);
840 //	RValue<UShort4> operator%(RValue<UShort4> lhs, RValue<UShort4> rhs);
841 	RValue<UShort4> operator&(RValue<UShort4> lhs, RValue<UShort4> rhs);
842 	RValue<UShort4> operator|(RValue<UShort4> lhs, RValue<UShort4> rhs);
843 	RValue<UShort4> operator^(RValue<UShort4> lhs, RValue<UShort4> rhs);
844 	RValue<UShort4> operator<<(RValue<UShort4> lhs, unsigned char rhs);
845 	RValue<UShort4> operator>>(RValue<UShort4> lhs, unsigned char rhs);
846 //	RValue<UShort4> operator+=(UShort4 &lhs, RValue<UShort4> rhs);
847 //	RValue<UShort4> operator-=(UShort4 &lhs, RValue<UShort4> rhs);
848 //	RValue<UShort4> operator*=(UShort4 &lhs, RValue<UShort4> rhs);
849 //	RValue<UShort4> operator/=(UShort4 &lhs, RValue<UShort4> rhs);
850 //	RValue<UShort4> operator%=(UShort4 &lhs, RValue<UShort4> rhs);
851 //	RValue<UShort4> operator&=(UShort4 &lhs, RValue<UShort4> rhs);
852 //	RValue<UShort4> operator|=(UShort4 &lhs, RValue<UShort4> rhs);
853 //	RValue<UShort4> operator^=(UShort4 &lhs, RValue<UShort4> rhs);
854 	RValue<UShort4> operator<<=(UShort4 &lhs, unsigned char rhs);
855 	RValue<UShort4> operator>>=(UShort4 &lhs, unsigned char rhs);
856 //	RValue<UShort4> operator+(RValue<UShort4> val);
857 //	RValue<UShort4> operator-(RValue<UShort4> val);
858 	RValue<UShort4> operator~(RValue<UShort4> val);
859 //	RValue<UShort4> operator++(UShort4 &val, int);   // Post-increment
860 //	const UShort4 &operator++(UShort4 &val);   // Pre-increment
861 //	RValue<UShort4> operator--(UShort4 &val, int);   // Post-decrement
862 //	const UShort4 &operator--(UShort4 &val);   // Pre-decrement
863 
864 	RValue<UShort4> Max(RValue<UShort4> x, RValue<UShort4> y);
865 	RValue<UShort4> Min(RValue<UShort4> x, RValue<UShort4> y);
866 	RValue<UShort4> AddSat(RValue<UShort4> x, RValue<UShort4> y);
867 	RValue<UShort4> SubSat(RValue<UShort4> x, RValue<UShort4> y);
868 	RValue<UShort4> MulHigh(RValue<UShort4> x, RValue<UShort4> y);
869 	RValue<UShort4> Average(RValue<UShort4> x, RValue<UShort4> y);
870 
871 	class Short8 : public LValue<Short8>
872 	{
873 	public:
874 		Short8() = default;
875 		Short8(short c);
876 		Short8(short c0, short c1, short c2, short c3, short c4, short c5, short c6, short c7);
877 		Short8(RValue<Short8> rhs);
878 	//	Short8(const Short8 &rhs);
879 		Short8(const Reference<Short8> &rhs);
880 		Short8(RValue<Short4> lo, RValue<Short4> hi);
881 
882 	//	RValue<Short8> operator=(RValue<Short8> rhs);
883 	//	RValue<Short8> operator=(const Short8 &rhs);
884 	//	RValue<Short8> operator=(const Reference<Short8> &rhs);
885 
886 		static Type *getType();
887 	};
888 
889 	RValue<Short8> operator+(RValue<Short8> lhs, RValue<Short8> rhs);
890 //	RValue<Short8> operator-(RValue<Short8> lhs, RValue<Short8> rhs);
891 //	RValue<Short8> operator*(RValue<Short8> lhs, RValue<Short8> rhs);
892 //	RValue<Short8> operator/(RValue<Short8> lhs, RValue<Short8> rhs);
893 //	RValue<Short8> operator%(RValue<Short8> lhs, RValue<Short8> rhs);
894 	RValue<Short8> operator&(RValue<Short8> lhs, RValue<Short8> rhs);
895 //	RValue<Short8> operator|(RValue<Short8> lhs, RValue<Short8> rhs);
896 //	RValue<Short8> operator^(RValue<Short8> lhs, RValue<Short8> rhs);
897 	RValue<Short8> operator<<(RValue<Short8> lhs, unsigned char rhs);
898 	RValue<Short8> operator>>(RValue<Short8> lhs, unsigned char rhs);
899 //	RValue<Short8> operator<<(RValue<Short8> lhs, RValue<Short8> rhs);
900 //	RValue<Short8> operator>>(RValue<Short8> lhs, RValue<Short8> rhs);
901 //	RValue<Short8> operator+=(Short8 &lhs, RValue<Short8> rhs);
902 //	RValue<Short8> operator-=(Short8 &lhs, RValue<Short8> rhs);
903 //	RValue<Short8> operator*=(Short8 &lhs, RValue<Short8> rhs);
904 //	RValue<Short8> operator/=(Short8 &lhs, RValue<Short8> rhs);
905 //	RValue<Short8> operator%=(Short8 &lhs, RValue<Short8> rhs);
906 //	RValue<Short8> operator&=(Short8 &lhs, RValue<Short8> rhs);
907 //	RValue<Short8> operator|=(Short8 &lhs, RValue<Short8> rhs);
908 //	RValue<Short8> operator^=(Short8 &lhs, RValue<Short8> rhs);
909 //	RValue<Short8> operator<<=(Short8 &lhs, RValue<Short8> rhs);
910 //	RValue<Short8> operator>>=(Short8 &lhs, RValue<Short8> rhs);
911 //	RValue<Short8> operator+(RValue<Short8> val);
912 //	RValue<Short8> operator-(RValue<Short8> val);
913 //	RValue<Short8> operator~(RValue<Short8> val);
914 //	RValue<Short8> operator++(Short8 &val, int);   // Post-increment
915 //	const Short8 &operator++(Short8 &val);   // Pre-increment
916 //	RValue<Short8> operator--(Short8 &val, int);   // Post-decrement
917 //	const Short8 &operator--(Short8 &val);   // Pre-decrement
918 //	RValue<Bool> operator<(RValue<Short8> lhs, RValue<Short8> rhs);
919 //	RValue<Bool> operator<=(RValue<Short8> lhs, RValue<Short8> rhs);
920 //	RValue<Bool> operator>(RValue<Short8> lhs, RValue<Short8> rhs);
921 //	RValue<Bool> operator>=(RValue<Short8> lhs, RValue<Short8> rhs);
922 //	RValue<Bool> operator!=(RValue<Short8> lhs, RValue<Short8> rhs);
923 //	RValue<Bool> operator==(RValue<Short8> lhs, RValue<Short8> rhs);
924 
925 	RValue<Short8> MulHigh(RValue<Short8> x, RValue<Short8> y);
926 	RValue<Int4> MulAdd(RValue<Short8> x, RValue<Short8> y);
927 	RValue<Int4> Abs(RValue<Int4> x);
928 
929 	class UShort8 : public LValue<UShort8>
930 	{
931 	public:
932 		UShort8() = default;
933 		UShort8(unsigned short c);
934 		UShort8(unsigned short c0, unsigned short c1, unsigned short c2, unsigned short c3, unsigned short c4, unsigned short c5, unsigned short c6, unsigned short c7);
935 		UShort8(RValue<UShort8> rhs);
936 	//	UShort8(const UShort8 &rhs);
937 		UShort8(const Reference<UShort8> &rhs);
938 		UShort8(RValue<UShort4> lo, RValue<UShort4> hi);
939 
940 		RValue<UShort8> operator=(RValue<UShort8> rhs);
941 		RValue<UShort8> operator=(const UShort8 &rhs);
942 		RValue<UShort8> operator=(const Reference<UShort8> &rhs);
943 
944 		static Type *getType();
945 	};
946 
947 	RValue<UShort8> operator+(RValue<UShort8> lhs, RValue<UShort8> rhs);
948 //	RValue<UShort8> operator-(RValue<UShort8> lhs, RValue<UShort8> rhs);
949 	RValue<UShort8> operator*(RValue<UShort8> lhs, RValue<UShort8> rhs);
950 //	RValue<UShort8> operator/(RValue<UShort8> lhs, RValue<UShort8> rhs);
951 //	RValue<UShort8> operator%(RValue<UShort8> lhs, RValue<UShort8> rhs);
952 	RValue<UShort8> operator&(RValue<UShort8> lhs, RValue<UShort8> rhs);
953 //	RValue<UShort8> operator|(RValue<UShort8> lhs, RValue<UShort8> rhs);
954 //	RValue<UShort8> operator^(RValue<UShort8> lhs, RValue<UShort8> rhs);
955 	RValue<UShort8> operator<<(RValue<UShort8> lhs, unsigned char rhs);
956 	RValue<UShort8> operator>>(RValue<UShort8> lhs, unsigned char rhs);
957 //	RValue<UShort8> operator<<(RValue<UShort8> lhs, RValue<UShort8> rhs);
958 //	RValue<UShort8> operator>>(RValue<UShort8> lhs, RValue<UShort8> rhs);
959 	RValue<UShort8> operator+=(UShort8 &lhs, RValue<UShort8> rhs);
960 //	RValue<UShort8> operator-=(UShort8 &lhs, RValue<UShort8> rhs);
961 //	RValue<UShort8> operator*=(UShort8 &lhs, RValue<UShort8> rhs);
962 //	RValue<UShort8> operator/=(UShort8 &lhs, RValue<UShort8> rhs);
963 //	RValue<UShort8> operator%=(UShort8 &lhs, RValue<UShort8> rhs);
964 //	RValue<UShort8> operator&=(UShort8 &lhs, RValue<UShort8> rhs);
965 //	RValue<UShort8> operator|=(UShort8 &lhs, RValue<UShort8> rhs);
966 //	RValue<UShort8> operator^=(UShort8 &lhs, RValue<UShort8> rhs);
967 //	RValue<UShort8> operator<<=(UShort8 &lhs, RValue<UShort8> rhs);
968 //	RValue<UShort8> operator>>=(UShort8 &lhs, RValue<UShort8> rhs);
969 //	RValue<UShort8> operator+(RValue<UShort8> val);
970 //	RValue<UShort8> operator-(RValue<UShort8> val);
971 	RValue<UShort8> operator~(RValue<UShort8> val);
972 //	RValue<UShort8> operator++(UShort8 &val, int);   // Post-increment
973 //	const UShort8 &operator++(UShort8 &val);   // Pre-increment
974 //	RValue<UShort8> operator--(UShort8 &val, int);   // Post-decrement
975 //	const UShort8 &operator--(UShort8 &val);   // Pre-decrement
976 //	RValue<Bool> operator<(RValue<UShort8> lhs, RValue<UShort8> rhs);
977 //	RValue<Bool> operator<=(RValue<UShort8> lhs, RValue<UShort8> rhs);
978 //	RValue<Bool> operator>(RValue<UShort8> lhs, RValue<UShort8> rhs);
979 //	RValue<Bool> operator>=(RValue<UShort8> lhs, RValue<UShort8> rhs);
980 //	RValue<Bool> operator!=(RValue<UShort8> lhs, RValue<UShort8> rhs);
981 //	RValue<Bool> operator==(RValue<UShort8> lhs, RValue<UShort8> rhs);
982 
983 	RValue<UShort8> Swizzle(RValue<UShort8> x, char select0, char select1, char select2, char select3, char select4, char select5, char select6, char select7);
984 	RValue<UShort8> MulHigh(RValue<UShort8> x, RValue<UShort8> y);
985 
986 	class Int : public LValue<Int>
987 	{
988 	public:
989 		Int(Argument<Int> argument);
990 
991 		explicit Int(RValue<Byte> cast);
992 		explicit Int(RValue<SByte> cast);
993 		explicit Int(RValue<Short> cast);
994 		explicit Int(RValue<UShort> cast);
995 		explicit Int(RValue<Int2> cast);
996 		explicit Int(RValue<Long> cast);
997 		explicit Int(RValue<Float> cast);
998 
999 		Int() = default;
1000 		Int(int x);
1001 		Int(RValue<Int> rhs);
1002 		Int(RValue<UInt> rhs);
1003 		Int(const Int &rhs);
1004 		Int(const UInt &rhs);
1005 		Int(const Reference<Int> &rhs);
1006 		Int(const Reference<UInt> &rhs);
1007 
1008 		RValue<Int> operator=(int rhs);
1009 		RValue<Int> operator=(RValue<Int> rhs);
1010 		RValue<Int> operator=(RValue<UInt> rhs);
1011 		RValue<Int> operator=(const Int &rhs);
1012 		RValue<Int> operator=(const UInt &rhs);
1013 		RValue<Int> operator=(const Reference<Int> &rhs);
1014 		RValue<Int> operator=(const Reference<UInt> &rhs);
1015 
1016 		static Type *getType();
1017 	};
1018 
1019 	RValue<Int> operator+(RValue<Int> lhs, RValue<Int> rhs);
1020 	RValue<Int> operator-(RValue<Int> lhs, RValue<Int> rhs);
1021 	RValue<Int> operator*(RValue<Int> lhs, RValue<Int> rhs);
1022 	RValue<Int> operator/(RValue<Int> lhs, RValue<Int> rhs);
1023 	RValue<Int> operator%(RValue<Int> lhs, RValue<Int> rhs);
1024 	RValue<Int> operator&(RValue<Int> lhs, RValue<Int> rhs);
1025 	RValue<Int> operator|(RValue<Int> lhs, RValue<Int> rhs);
1026 	RValue<Int> operator^(RValue<Int> lhs, RValue<Int> rhs);
1027 	RValue<Int> operator<<(RValue<Int> lhs, RValue<Int> rhs);
1028 	RValue<Int> operator>>(RValue<Int> lhs, RValue<Int> rhs);
1029 	RValue<Int> operator+=(Int &lhs, RValue<Int> rhs);
1030 	RValue<Int> operator-=(Int &lhs, RValue<Int> rhs);
1031 	RValue<Int> operator*=(Int &lhs, RValue<Int> rhs);
1032 	RValue<Int> operator/=(Int &lhs, RValue<Int> rhs);
1033 	RValue<Int> operator%=(Int &lhs, RValue<Int> rhs);
1034 	RValue<Int> operator&=(Int &lhs, RValue<Int> rhs);
1035 	RValue<Int> operator|=(Int &lhs, RValue<Int> rhs);
1036 	RValue<Int> operator^=(Int &lhs, RValue<Int> rhs);
1037 	RValue<Int> operator<<=(Int &lhs, RValue<Int> rhs);
1038 	RValue<Int> operator>>=(Int &lhs, RValue<Int> rhs);
1039 	RValue<Int> operator+(RValue<Int> val);
1040 	RValue<Int> operator-(RValue<Int> val);
1041 	RValue<Int> operator~(RValue<Int> val);
1042 	RValue<Int> operator++(Int &val, int);   // Post-increment
1043 	const Int &operator++(Int &val);   // Pre-increment
1044 	RValue<Int> operator--(Int &val, int);   // Post-decrement
1045 	const Int &operator--(Int &val);   // Pre-decrement
1046 	RValue<Bool> operator<(RValue<Int> lhs, RValue<Int> rhs);
1047 	RValue<Bool> operator<=(RValue<Int> lhs, RValue<Int> rhs);
1048 	RValue<Bool> operator>(RValue<Int> lhs, RValue<Int> rhs);
1049 	RValue<Bool> operator>=(RValue<Int> lhs, RValue<Int> rhs);
1050 	RValue<Bool> operator!=(RValue<Int> lhs, RValue<Int> rhs);
1051 	RValue<Bool> operator==(RValue<Int> lhs, RValue<Int> rhs);
1052 
1053 	RValue<Int> Max(RValue<Int> x, RValue<Int> y);
1054 	RValue<Int> Min(RValue<Int> x, RValue<Int> y);
1055 	RValue<Int> Clamp(RValue<Int> x, RValue<Int> min, RValue<Int> max);
1056 	RValue<Int> RoundInt(RValue<Float> cast);
1057 
1058 	class Long : public LValue<Long>
1059 	{
1060 	public:
1061 	//	Long(Argument<Long> argument);
1062 
1063 	//	explicit Long(RValue<Short> cast);
1064 	//	explicit Long(RValue<UShort> cast);
1065 		explicit Long(RValue<Int> cast);
1066 		explicit Long(RValue<UInt> cast);
1067 	//	explicit Long(RValue<Float> cast);
1068 
1069 		Long() = default;
1070 	//	Long(qword x);
1071 		Long(RValue<Long> rhs);
1072 	//	Long(RValue<ULong> rhs);
1073 	//	Long(const Long &rhs);
1074 	//	Long(const Reference<Long> &rhs);
1075 	//	Long(const ULong &rhs);
1076 	//	Long(const Reference<ULong> &rhs);
1077 
1078 		RValue<Long> operator=(int64_t rhs);
1079 		RValue<Long> operator=(RValue<Long> rhs);
1080 	//	RValue<Long> operator=(RValue<ULong> rhs);
1081 		RValue<Long> operator=(const Long &rhs);
1082 		RValue<Long> operator=(const Reference<Long> &rhs);
1083 	//	RValue<Long> operator=(const ULong &rhs);
1084 	//	RValue<Long> operator=(const Reference<ULong> &rhs);
1085 
1086 		static Type *getType();
1087 	};
1088 
1089 	RValue<Long> operator+(RValue<Long> lhs, RValue<Long> rhs);
1090 	RValue<Long> operator-(RValue<Long> lhs, RValue<Long> rhs);
1091 //	RValue<Long> operator*(RValue<Long> lhs, RValue<Long> rhs);
1092 //	RValue<Long> operator/(RValue<Long> lhs, RValue<Long> rhs);
1093 //	RValue<Long> operator%(RValue<Long> lhs, RValue<Long> rhs);
1094 //	RValue<Long> operator&(RValue<Long> lhs, RValue<Long> rhs);
1095 //	RValue<Long> operator|(RValue<Long> lhs, RValue<Long> rhs);
1096 //	RValue<Long> operator^(RValue<Long> lhs, RValue<Long> rhs);
1097 //	RValue<Long> operator<<(RValue<Long> lhs, RValue<Long> rhs);
1098 //	RValue<Long> operator>>(RValue<Long> lhs, RValue<Long> rhs);
1099 	RValue<Long> operator+=(Long &lhs, RValue<Long> rhs);
1100 	RValue<Long> operator-=(Long &lhs, RValue<Long> rhs);
1101 //	RValue<Long> operator*=(Long &lhs, RValue<Long> rhs);
1102 //	RValue<Long> operator/=(Long &lhs, RValue<Long> rhs);
1103 //	RValue<Long> operator%=(Long &lhs, RValue<Long> rhs);
1104 //	RValue<Long> operator&=(Long &lhs, RValue<Long> rhs);
1105 //	RValue<Long> operator|=(Long &lhs, RValue<Long> rhs);
1106 //	RValue<Long> operator^=(Long &lhs, RValue<Long> rhs);
1107 //	RValue<Long> operator<<=(Long &lhs, RValue<Long> rhs);
1108 //	RValue<Long> operator>>=(Long &lhs, RValue<Long> rhs);
1109 //	RValue<Long> operator+(RValue<Long> val);
1110 //	RValue<Long> operator-(RValue<Long> val);
1111 //	RValue<Long> operator~(RValue<Long> val);
1112 //	RValue<Long> operator++(Long &val, int);   // Post-increment
1113 //	const Long &operator++(Long &val);   // Pre-increment
1114 //	RValue<Long> operator--(Long &val, int);   // Post-decrement
1115 //	const Long &operator--(Long &val);   // Pre-decrement
1116 //	RValue<Bool> operator<(RValue<Long> lhs, RValue<Long> rhs);
1117 //	RValue<Bool> operator<=(RValue<Long> lhs, RValue<Long> rhs);
1118 //	RValue<Bool> operator>(RValue<Long> lhs, RValue<Long> rhs);
1119 //	RValue<Bool> operator>=(RValue<Long> lhs, RValue<Long> rhs);
1120 //	RValue<Bool> operator!=(RValue<Long> lhs, RValue<Long> rhs);
1121 //	RValue<Bool> operator==(RValue<Long> lhs, RValue<Long> rhs);
1122 
1123 //	RValue<Long> RoundLong(RValue<Float> cast);
1124 	RValue<Long> AddAtomic( RValue<Pointer<Long>> x, RValue<Long> y);
1125 
1126 	class UInt : public LValue<UInt>
1127 	{
1128 	public:
1129 		UInt(Argument<UInt> argument);
1130 
1131 		explicit UInt(RValue<UShort> cast);
1132 		explicit UInt(RValue<Long> cast);
1133 		explicit UInt(RValue<Float> cast);
1134 
1135 		UInt() = default;
1136 		UInt(int x);
1137 		UInt(unsigned int x);
1138 		UInt(RValue<UInt> rhs);
1139 		UInt(RValue<Int> rhs);
1140 		UInt(const UInt &rhs);
1141 		UInt(const Int &rhs);
1142 		UInt(const Reference<UInt> &rhs);
1143 		UInt(const Reference<Int> &rhs);
1144 
1145 		RValue<UInt> operator=(unsigned int rhs);
1146 		RValue<UInt> operator=(RValue<UInt> rhs);
1147 		RValue<UInt> operator=(RValue<Int> rhs);
1148 		RValue<UInt> operator=(const UInt &rhs);
1149 		RValue<UInt> operator=(const Int &rhs);
1150 		RValue<UInt> operator=(const Reference<UInt> &rhs);
1151 		RValue<UInt> operator=(const Reference<Int> &rhs);
1152 
1153 		static Type *getType();
1154 	};
1155 
1156 	RValue<UInt> operator+(RValue<UInt> lhs, RValue<UInt> rhs);
1157 	RValue<UInt> operator-(RValue<UInt> lhs, RValue<UInt> rhs);
1158 	RValue<UInt> operator*(RValue<UInt> lhs, RValue<UInt> rhs);
1159 	RValue<UInt> operator/(RValue<UInt> lhs, RValue<UInt> rhs);
1160 	RValue<UInt> operator%(RValue<UInt> lhs, RValue<UInt> rhs);
1161 	RValue<UInt> operator&(RValue<UInt> lhs, RValue<UInt> rhs);
1162 	RValue<UInt> operator|(RValue<UInt> lhs, RValue<UInt> rhs);
1163 	RValue<UInt> operator^(RValue<UInt> lhs, RValue<UInt> rhs);
1164 	RValue<UInt> operator<<(RValue<UInt> lhs, RValue<UInt> rhs);
1165 	RValue<UInt> operator>>(RValue<UInt> lhs, RValue<UInt> rhs);
1166 	RValue<UInt> operator+=(UInt &lhs, RValue<UInt> rhs);
1167 	RValue<UInt> operator-=(UInt &lhs, RValue<UInt> rhs);
1168 	RValue<UInt> operator*=(UInt &lhs, RValue<UInt> rhs);
1169 	RValue<UInt> operator/=(UInt &lhs, RValue<UInt> rhs);
1170 	RValue<UInt> operator%=(UInt &lhs, RValue<UInt> rhs);
1171 	RValue<UInt> operator&=(UInt &lhs, RValue<UInt> rhs);
1172 	RValue<UInt> operator|=(UInt &lhs, RValue<UInt> rhs);
1173 	RValue<UInt> operator^=(UInt &lhs, RValue<UInt> rhs);
1174 	RValue<UInt> operator<<=(UInt &lhs, RValue<UInt> rhs);
1175 	RValue<UInt> operator>>=(UInt &lhs, RValue<UInt> rhs);
1176 	RValue<UInt> operator+(RValue<UInt> val);
1177 	RValue<UInt> operator-(RValue<UInt> val);
1178 	RValue<UInt> operator~(RValue<UInt> val);
1179 	RValue<UInt> operator++(UInt &val, int);   // Post-increment
1180 	const UInt &operator++(UInt &val);   // Pre-increment
1181 	RValue<UInt> operator--(UInt &val, int);   // Post-decrement
1182 	const UInt &operator--(UInt &val);   // Pre-decrement
1183 	RValue<Bool> operator<(RValue<UInt> lhs, RValue<UInt> rhs);
1184 	RValue<Bool> operator<=(RValue<UInt> lhs, RValue<UInt> rhs);
1185 	RValue<Bool> operator>(RValue<UInt> lhs, RValue<UInt> rhs);
1186 	RValue<Bool> operator>=(RValue<UInt> lhs, RValue<UInt> rhs);
1187 	RValue<Bool> operator!=(RValue<UInt> lhs, RValue<UInt> rhs);
1188 	RValue<Bool> operator==(RValue<UInt> lhs, RValue<UInt> rhs);
1189 
1190 	RValue<UInt> Max(RValue<UInt> x, RValue<UInt> y);
1191 	RValue<UInt> Min(RValue<UInt> x, RValue<UInt> y);
1192 	RValue<UInt> Clamp(RValue<UInt> x, RValue<UInt> min, RValue<UInt> max);
1193 //	RValue<UInt> RoundUInt(RValue<Float> cast);
1194 
1195 	class Int2 : public LValue<Int2>
1196 	{
1197 	public:
1198 	//	explicit Int2(RValue<Int> cast);
1199 		explicit Int2(RValue<Int4> cast);
1200 
1201 		Int2() = default;
1202 		Int2(int x, int y);
1203 		Int2(RValue<Int2> rhs);
1204 		Int2(const Int2 &rhs);
1205 		Int2(const Reference<Int2> &rhs);
1206 		Int2(RValue<Int> lo, RValue<Int> hi);
1207 
1208 		RValue<Int2> operator=(RValue<Int2> rhs);
1209 		RValue<Int2> operator=(const Int2 &rhs);
1210 		RValue<Int2> operator=(const Reference<Int2> &rhs);
1211 
1212 		static Type *getType();
1213 	};
1214 
1215 	RValue<Int2> operator+(RValue<Int2> lhs, RValue<Int2> rhs);
1216 	RValue<Int2> operator-(RValue<Int2> lhs, RValue<Int2> rhs);
1217 //	RValue<Int2> operator*(RValue<Int2> lhs, RValue<Int2> rhs);
1218 //	RValue<Int2> operator/(RValue<Int2> lhs, RValue<Int2> rhs);
1219 //	RValue<Int2> operator%(RValue<Int2> lhs, RValue<Int2> rhs);
1220 	RValue<Int2> operator&(RValue<Int2> lhs, RValue<Int2> rhs);
1221 	RValue<Int2> operator|(RValue<Int2> lhs, RValue<Int2> rhs);
1222 	RValue<Int2> operator^(RValue<Int2> lhs, RValue<Int2> rhs);
1223 	RValue<Int2> operator<<(RValue<Int2> lhs, unsigned char rhs);
1224 	RValue<Int2> operator>>(RValue<Int2> lhs, unsigned char rhs);
1225 	RValue<Int2> operator+=(Int2 &lhs, RValue<Int2> rhs);
1226 	RValue<Int2> operator-=(Int2 &lhs, RValue<Int2> rhs);
1227 //	RValue<Int2> operator*=(Int2 &lhs, RValue<Int2> rhs);
1228 //	RValue<Int2> operator/=(Int2 &lhs, RValue<Int2> rhs);
1229 //	RValue<Int2> operator%=(Int2 &lhs, RValue<Int2> rhs);
1230 	RValue<Int2> operator&=(Int2 &lhs, RValue<Int2> rhs);
1231 	RValue<Int2> operator|=(Int2 &lhs, RValue<Int2> rhs);
1232 	RValue<Int2> operator^=(Int2 &lhs, RValue<Int2> rhs);
1233 	RValue<Int2> operator<<=(Int2 &lhs, unsigned char rhs);
1234 	RValue<Int2> operator>>=(Int2 &lhs, unsigned char rhs);
1235 //	RValue<Int2> operator+(RValue<Int2> val);
1236 //	RValue<Int2> operator-(RValue<Int2> val);
1237 	RValue<Int2> operator~(RValue<Int2> val);
1238 //	RValue<Int2> operator++(Int2 &val, int);   // Post-increment
1239 //	const Int2 &operator++(Int2 &val);   // Pre-increment
1240 //	RValue<Int2> operator--(Int2 &val, int);   // Post-decrement
1241 //	const Int2 &operator--(Int2 &val);   // Pre-decrement
1242 //	RValue<Bool> operator<(RValue<Int2> lhs, RValue<Int2> rhs);
1243 //	RValue<Bool> operator<=(RValue<Int2> lhs, RValue<Int2> rhs);
1244 //	RValue<Bool> operator>(RValue<Int2> lhs, RValue<Int2> rhs);
1245 //	RValue<Bool> operator>=(RValue<Int2> lhs, RValue<Int2> rhs);
1246 //	RValue<Bool> operator!=(RValue<Int2> lhs, RValue<Int2> rhs);
1247 //	RValue<Bool> operator==(RValue<Int2> lhs, RValue<Int2> rhs);
1248 
1249 //	RValue<Int2> RoundInt(RValue<Float4> cast);
1250 	RValue<Short4> UnpackLow(RValue<Int2> x, RValue<Int2> y);
1251 	RValue<Short4> UnpackHigh(RValue<Int2> x, RValue<Int2> y);
1252 	RValue<Int> Extract(RValue<Int2> val, int i);
1253 	RValue<Int2> Insert(RValue<Int2> val, RValue<Int> element, int i);
1254 
1255 	class UInt2 : public LValue<UInt2>
1256 	{
1257 	public:
1258 		UInt2() = default;
1259 		UInt2(unsigned int x, unsigned int y);
1260 		UInt2(RValue<UInt2> rhs);
1261 		UInt2(const UInt2 &rhs);
1262 		UInt2(const Reference<UInt2> &rhs);
1263 
1264 		RValue<UInt2> operator=(RValue<UInt2> rhs);
1265 		RValue<UInt2> operator=(const UInt2 &rhs);
1266 		RValue<UInt2> operator=(const Reference<UInt2> &rhs);
1267 
1268 		static Type *getType();
1269 	};
1270 
1271 	RValue<UInt2> operator+(RValue<UInt2> lhs, RValue<UInt2> rhs);
1272 	RValue<UInt2> operator-(RValue<UInt2> lhs, RValue<UInt2> rhs);
1273 //	RValue<UInt2> operator*(RValue<UInt2> lhs, RValue<UInt2> rhs);
1274 //	RValue<UInt2> operator/(RValue<UInt2> lhs, RValue<UInt2> rhs);
1275 //	RValue<UInt2> operator%(RValue<UInt2> lhs, RValue<UInt2> rhs);
1276 	RValue<UInt2> operator&(RValue<UInt2> lhs, RValue<UInt2> rhs);
1277 	RValue<UInt2> operator|(RValue<UInt2> lhs, RValue<UInt2> rhs);
1278 	RValue<UInt2> operator^(RValue<UInt2> lhs, RValue<UInt2> rhs);
1279 	RValue<UInt2> operator<<(RValue<UInt2> lhs, unsigned char rhs);
1280 	RValue<UInt2> operator>>(RValue<UInt2> lhs, unsigned char rhs);
1281 	RValue<UInt2> operator+=(UInt2 &lhs, RValue<UInt2> rhs);
1282 	RValue<UInt2> operator-=(UInt2 &lhs, RValue<UInt2> rhs);
1283 //	RValue<UInt2> operator*=(UInt2 &lhs, RValue<UInt2> rhs);
1284 //	RValue<UInt2> operator/=(UInt2 &lhs, RValue<UInt2> rhs);
1285 //	RValue<UInt2> operator%=(UInt2 &lhs, RValue<UInt2> rhs);
1286 	RValue<UInt2> operator&=(UInt2 &lhs, RValue<UInt2> rhs);
1287 	RValue<UInt2> operator|=(UInt2 &lhs, RValue<UInt2> rhs);
1288 	RValue<UInt2> operator^=(UInt2 &lhs, RValue<UInt2> rhs);
1289 	RValue<UInt2> operator<<=(UInt2 &lhs, unsigned char rhs);
1290 	RValue<UInt2> operator>>=(UInt2 &lhs, unsigned char rhs);
1291 //	RValue<UInt2> operator+(RValue<UInt2> val);
1292 //	RValue<UInt2> operator-(RValue<UInt2> val);
1293 	RValue<UInt2> operator~(RValue<UInt2> val);
1294 //	RValue<UInt2> operator++(UInt2 &val, int);   // Post-increment
1295 //	const UInt2 &operator++(UInt2 &val);   // Pre-increment
1296 //	RValue<UInt2> operator--(UInt2 &val, int);   // Post-decrement
1297 //	const UInt2 &operator--(UInt2 &val);   // Pre-decrement
1298 //	RValue<Bool> operator<(RValue<UInt2> lhs, RValue<UInt2> rhs);
1299 //	RValue<Bool> operator<=(RValue<UInt2> lhs, RValue<UInt2> rhs);
1300 //	RValue<Bool> operator>(RValue<UInt2> lhs, RValue<UInt2> rhs);
1301 //	RValue<Bool> operator>=(RValue<UInt2> lhs, RValue<UInt2> rhs);
1302 //	RValue<Bool> operator!=(RValue<UInt2> lhs, RValue<UInt2> rhs);
1303 //	RValue<Bool> operator==(RValue<UInt2> lhs, RValue<UInt2> rhs);
1304 
1305 //	RValue<UInt2> RoundInt(RValue<Float4> cast);
1306 
1307 	template<class T>
1308 	struct Scalar;
1309 
1310 	template<class Vector4>
1311 	struct XYZW;
1312 
1313 	template<class Vector4, int T>
1314 	class Swizzle2
1315 	{
1316 		friend Vector4;
1317 
1318 	public:
1319 		operator RValue<Vector4>() const;
1320 
1321 	private:
1322 		Vector4 *parent;
1323 	};
1324 
1325 	template<class Vector4, int T>
1326 	class Swizzle4
1327 	{
1328 	public:
1329 		operator RValue<Vector4>() const;
1330 
1331 	private:
1332 		Vector4 *parent;
1333 	};
1334 
1335 	template<class Vector4, int T>
1336 	class SwizzleMask4
1337 	{
1338 		friend XYZW<Vector4>;
1339 
1340 	public:
1341 		operator RValue<Vector4>() const;
1342 
1343 		RValue<Vector4> operator=(RValue<Vector4> rhs);
1344 		RValue<Vector4> operator=(RValue<typename Scalar<Vector4>::Type> rhs);
1345 
1346 	private:
1347 		Vector4 *parent;
1348 	};
1349 
1350 	template<>
1351 	struct Scalar<Float4>
1352 	{
1353 		using Type = Float;
1354 	};
1355 
1356 	template<>
1357 	struct Scalar<Int4>
1358 	{
1359 		using Type = Int;
1360 	};
1361 
1362 	template<>
1363 	struct Scalar<UInt4>
1364 	{
1365 		using Type = UInt;
1366 	};
1367 
1368 	template<class Vector4, int T>
1369 	class SwizzleMask1
1370 	{
1371 	public:
1372 		operator RValue<typename Scalar<Vector4>::Type>() const;
1373 		operator RValue<Vector4>() const;
1374 
1375 		RValue<Vector4> operator=(float x);
1376 		RValue<Vector4> operator=(RValue<Vector4> rhs);
1377 		RValue<Vector4> operator=(RValue<typename Scalar<Vector4>::Type> rhs);
1378 
1379 	private:
1380 		Float4 *parent;
1381 	};
1382 
1383 	template<class Vector4, int T>
1384 	class SwizzleMask2
1385 	{
1386 		friend class Float4;
1387 
1388 	public:
1389 		operator RValue<Vector4>() const;
1390 
1391 		RValue<Vector4> operator=(RValue<Vector4> rhs);
1392 
1393 	private:
1394 		Float4 *parent;
1395 	};
1396 
1397 	template<class Vector4>
1398 	struct XYZW
1399 	{
1400 		friend Vector4;
1401 
1402 	private:
XYZWsw::XYZW1403 		XYZW(Vector4 *parent)
1404 		{
1405 			xyzw.parent = parent;
1406 		}
1407 
1408 	public:
1409 		union
1410 		{
1411 			SwizzleMask1<Vector4, 0x00> x;
1412 			SwizzleMask1<Vector4, 0x55> y;
1413 			SwizzleMask1<Vector4, 0xAA> z;
1414 			SwizzleMask1<Vector4, 0xFF> w;
1415 			Swizzle2<Vector4, 0x00>     xx;
1416 			Swizzle2<Vector4, 0x01>     yx;
1417 			Swizzle2<Vector4, 0x02>     zx;
1418 			Swizzle2<Vector4, 0x03>     wx;
1419 			SwizzleMask2<Vector4, 0x54> xy;
1420 			Swizzle2<Vector4, 0x55>     yy;
1421 			Swizzle2<Vector4, 0x56>     zy;
1422 			Swizzle2<Vector4, 0x57>     wy;
1423 			SwizzleMask2<Vector4, 0xA8> xz;
1424 			SwizzleMask2<Vector4, 0xA9> yz;
1425 			Swizzle2<Vector4, 0xAA>     zz;
1426 			Swizzle2<Vector4, 0xAB>     wz;
1427 			SwizzleMask2<Vector4, 0xFC> xw;
1428 			SwizzleMask2<Vector4, 0xFD> yw;
1429 			SwizzleMask2<Vector4, 0xFE> zw;
1430 			Swizzle2<Vector4, 0xFF>     ww;
1431 			Swizzle4<Vector4, 0x00>     xxx;
1432 			Swizzle4<Vector4, 0x01>     yxx;
1433 			Swizzle4<Vector4, 0x02>     zxx;
1434 			Swizzle4<Vector4, 0x03>     wxx;
1435 			Swizzle4<Vector4, 0x04>     xyx;
1436 			Swizzle4<Vector4, 0x05>     yyx;
1437 			Swizzle4<Vector4, 0x06>     zyx;
1438 			Swizzle4<Vector4, 0x07>     wyx;
1439 			Swizzle4<Vector4, 0x08>     xzx;
1440 			Swizzle4<Vector4, 0x09>     yzx;
1441 			Swizzle4<Vector4, 0x0A>     zzx;
1442 			Swizzle4<Vector4, 0x0B>     wzx;
1443 			Swizzle4<Vector4, 0x0C>     xwx;
1444 			Swizzle4<Vector4, 0x0D>     ywx;
1445 			Swizzle4<Vector4, 0x0E>     zwx;
1446 			Swizzle4<Vector4, 0x0F>     wwx;
1447 			Swizzle4<Vector4, 0x50>     xxy;
1448 			Swizzle4<Vector4, 0x51>     yxy;
1449 			Swizzle4<Vector4, 0x52>     zxy;
1450 			Swizzle4<Vector4, 0x53>     wxy;
1451 			Swizzle4<Vector4, 0x54>     xyy;
1452 			Swizzle4<Vector4, 0x55>     yyy;
1453 			Swizzle4<Vector4, 0x56>     zyy;
1454 			Swizzle4<Vector4, 0x57>     wyy;
1455 			Swizzle4<Vector4, 0x58>     xzy;
1456 			Swizzle4<Vector4, 0x59>     yzy;
1457 			Swizzle4<Vector4, 0x5A>     zzy;
1458 			Swizzle4<Vector4, 0x5B>     wzy;
1459 			Swizzle4<Vector4, 0x5C>     xwy;
1460 			Swizzle4<Vector4, 0x5D>     ywy;
1461 			Swizzle4<Vector4, 0x5E>     zwy;
1462 			Swizzle4<Vector4, 0x5F>     wwy;
1463 			Swizzle4<Vector4, 0xA0>     xxz;
1464 			Swizzle4<Vector4, 0xA1>     yxz;
1465 			Swizzle4<Vector4, 0xA2>     zxz;
1466 			Swizzle4<Vector4, 0xA3>     wxz;
1467 			SwizzleMask4<Vector4, 0xA4> xyz;
1468 			Swizzle4<Vector4, 0xA5>     yyz;
1469 			Swizzle4<Vector4, 0xA6>     zyz;
1470 			Swizzle4<Vector4, 0xA7>     wyz;
1471 			Swizzle4<Vector4, 0xA8>     xzz;
1472 			Swizzle4<Vector4, 0xA9>     yzz;
1473 			Swizzle4<Vector4, 0xAA>     zzz;
1474 			Swizzle4<Vector4, 0xAB>     wzz;
1475 			Swizzle4<Vector4, 0xAC>     xwz;
1476 			Swizzle4<Vector4, 0xAD>     ywz;
1477 			Swizzle4<Vector4, 0xAE>     zwz;
1478 			Swizzle4<Vector4, 0xAF>     wwz;
1479 			Swizzle4<Vector4, 0xF0>     xxw;
1480 			Swizzle4<Vector4, 0xF1>     yxw;
1481 			Swizzle4<Vector4, 0xF2>     zxw;
1482 			Swizzle4<Vector4, 0xF3>     wxw;
1483 			SwizzleMask4<Vector4, 0xF4> xyw;
1484 			Swizzle4<Vector4, 0xF5>     yyw;
1485 			Swizzle4<Vector4, 0xF6>     zyw;
1486 			Swizzle4<Vector4, 0xF7>     wyw;
1487 			SwizzleMask4<Vector4, 0xF8> xzw;
1488 			SwizzleMask4<Vector4, 0xF9> yzw;
1489 			Swizzle4<Vector4, 0xFA>     zzw;
1490 			Swizzle4<Vector4, 0xFB>     wzw;
1491 			Swizzle4<Vector4, 0xFC>     xww;
1492 			Swizzle4<Vector4, 0xFD>     yww;
1493 			Swizzle4<Vector4, 0xFE>     zww;
1494 			Swizzle4<Vector4, 0xFF>     www;
1495 			Swizzle4<Vector4, 0x00>     xxxx;
1496 			Swizzle4<Vector4, 0x01>     yxxx;
1497 			Swizzle4<Vector4, 0x02>     zxxx;
1498 			Swizzle4<Vector4, 0x03>     wxxx;
1499 			Swizzle4<Vector4, 0x04>     xyxx;
1500 			Swizzle4<Vector4, 0x05>     yyxx;
1501 			Swizzle4<Vector4, 0x06>     zyxx;
1502 			Swizzle4<Vector4, 0x07>     wyxx;
1503 			Swizzle4<Vector4, 0x08>     xzxx;
1504 			Swizzle4<Vector4, 0x09>     yzxx;
1505 			Swizzle4<Vector4, 0x0A>     zzxx;
1506 			Swizzle4<Vector4, 0x0B>     wzxx;
1507 			Swizzle4<Vector4, 0x0C>     xwxx;
1508 			Swizzle4<Vector4, 0x0D>     ywxx;
1509 			Swizzle4<Vector4, 0x0E>     zwxx;
1510 			Swizzle4<Vector4, 0x0F>     wwxx;
1511 			Swizzle4<Vector4, 0x10>     xxyx;
1512 			Swizzle4<Vector4, 0x11>     yxyx;
1513 			Swizzle4<Vector4, 0x12>     zxyx;
1514 			Swizzle4<Vector4, 0x13>     wxyx;
1515 			Swizzle4<Vector4, 0x14>     xyyx;
1516 			Swizzle4<Vector4, 0x15>     yyyx;
1517 			Swizzle4<Vector4, 0x16>     zyyx;
1518 			Swizzle4<Vector4, 0x17>     wyyx;
1519 			Swizzle4<Vector4, 0x18>     xzyx;
1520 			Swizzle4<Vector4, 0x19>     yzyx;
1521 			Swizzle4<Vector4, 0x1A>     zzyx;
1522 			Swizzle4<Vector4, 0x1B>     wzyx;
1523 			Swizzle4<Vector4, 0x1C>     xwyx;
1524 			Swizzle4<Vector4, 0x1D>     ywyx;
1525 			Swizzle4<Vector4, 0x1E>     zwyx;
1526 			Swizzle4<Vector4, 0x1F>     wwyx;
1527 			Swizzle4<Vector4, 0x20>     xxzx;
1528 			Swizzle4<Vector4, 0x21>     yxzx;
1529 			Swizzle4<Vector4, 0x22>     zxzx;
1530 			Swizzle4<Vector4, 0x23>     wxzx;
1531 			Swizzle4<Vector4, 0x24>     xyzx;
1532 			Swizzle4<Vector4, 0x25>     yyzx;
1533 			Swizzle4<Vector4, 0x26>     zyzx;
1534 			Swizzle4<Vector4, 0x27>     wyzx;
1535 			Swizzle4<Vector4, 0x28>     xzzx;
1536 			Swizzle4<Vector4, 0x29>     yzzx;
1537 			Swizzle4<Vector4, 0x2A>     zzzx;
1538 			Swizzle4<Vector4, 0x2B>     wzzx;
1539 			Swizzle4<Vector4, 0x2C>     xwzx;
1540 			Swizzle4<Vector4, 0x2D>     ywzx;
1541 			Swizzle4<Vector4, 0x2E>     zwzx;
1542 			Swizzle4<Vector4, 0x2F>     wwzx;
1543 			Swizzle4<Vector4, 0x30>     xxwx;
1544 			Swizzle4<Vector4, 0x31>     yxwx;
1545 			Swizzle4<Vector4, 0x32>     zxwx;
1546 			Swizzle4<Vector4, 0x33>     wxwx;
1547 			Swizzle4<Vector4, 0x34>     xywx;
1548 			Swizzle4<Vector4, 0x35>     yywx;
1549 			Swizzle4<Vector4, 0x36>     zywx;
1550 			Swizzle4<Vector4, 0x37>     wywx;
1551 			Swizzle4<Vector4, 0x38>     xzwx;
1552 			Swizzle4<Vector4, 0x39>     yzwx;
1553 			Swizzle4<Vector4, 0x3A>     zzwx;
1554 			Swizzle4<Vector4, 0x3B>     wzwx;
1555 			Swizzle4<Vector4, 0x3C>     xwwx;
1556 			Swizzle4<Vector4, 0x3D>     ywwx;
1557 			Swizzle4<Vector4, 0x3E>     zwwx;
1558 			Swizzle4<Vector4, 0x3F>     wwwx;
1559 			Swizzle4<Vector4, 0x40>     xxxy;
1560 			Swizzle4<Vector4, 0x41>     yxxy;
1561 			Swizzle4<Vector4, 0x42>     zxxy;
1562 			Swizzle4<Vector4, 0x43>     wxxy;
1563 			Swizzle4<Vector4, 0x44>     xyxy;
1564 			Swizzle4<Vector4, 0x45>     yyxy;
1565 			Swizzle4<Vector4, 0x46>     zyxy;
1566 			Swizzle4<Vector4, 0x47>     wyxy;
1567 			Swizzle4<Vector4, 0x48>     xzxy;
1568 			Swizzle4<Vector4, 0x49>     yzxy;
1569 			Swizzle4<Vector4, 0x4A>     zzxy;
1570 			Swizzle4<Vector4, 0x4B>     wzxy;
1571 			Swizzle4<Vector4, 0x4C>     xwxy;
1572 			Swizzle4<Vector4, 0x4D>     ywxy;
1573 			Swizzle4<Vector4, 0x4E>     zwxy;
1574 			Swizzle4<Vector4, 0x4F>     wwxy;
1575 			Swizzle4<Vector4, 0x50>     xxyy;
1576 			Swizzle4<Vector4, 0x51>     yxyy;
1577 			Swizzle4<Vector4, 0x52>     zxyy;
1578 			Swizzle4<Vector4, 0x53>     wxyy;
1579 			Swizzle4<Vector4, 0x54>     xyyy;
1580 			Swizzle4<Vector4, 0x55>     yyyy;
1581 			Swizzle4<Vector4, 0x56>     zyyy;
1582 			Swizzle4<Vector4, 0x57>     wyyy;
1583 			Swizzle4<Vector4, 0x58>     xzyy;
1584 			Swizzle4<Vector4, 0x59>     yzyy;
1585 			Swizzle4<Vector4, 0x5A>     zzyy;
1586 			Swizzle4<Vector4, 0x5B>     wzyy;
1587 			Swizzle4<Vector4, 0x5C>     xwyy;
1588 			Swizzle4<Vector4, 0x5D>     ywyy;
1589 			Swizzle4<Vector4, 0x5E>     zwyy;
1590 			Swizzle4<Vector4, 0x5F>     wwyy;
1591 			Swizzle4<Vector4, 0x60>     xxzy;
1592 			Swizzle4<Vector4, 0x61>     yxzy;
1593 			Swizzle4<Vector4, 0x62>     zxzy;
1594 			Swizzle4<Vector4, 0x63>     wxzy;
1595 			Swizzle4<Vector4, 0x64>     xyzy;
1596 			Swizzle4<Vector4, 0x65>     yyzy;
1597 			Swizzle4<Vector4, 0x66>     zyzy;
1598 			Swizzle4<Vector4, 0x67>     wyzy;
1599 			Swizzle4<Vector4, 0x68>     xzzy;
1600 			Swizzle4<Vector4, 0x69>     yzzy;
1601 			Swizzle4<Vector4, 0x6A>     zzzy;
1602 			Swizzle4<Vector4, 0x6B>     wzzy;
1603 			Swizzle4<Vector4, 0x6C>     xwzy;
1604 			Swizzle4<Vector4, 0x6D>     ywzy;
1605 			Swizzle4<Vector4, 0x6E>     zwzy;
1606 			Swizzle4<Vector4, 0x6F>     wwzy;
1607 			Swizzle4<Vector4, 0x70>     xxwy;
1608 			Swizzle4<Vector4, 0x71>     yxwy;
1609 			Swizzle4<Vector4, 0x72>     zxwy;
1610 			Swizzle4<Vector4, 0x73>     wxwy;
1611 			Swizzle4<Vector4, 0x74>     xywy;
1612 			Swizzle4<Vector4, 0x75>     yywy;
1613 			Swizzle4<Vector4, 0x76>     zywy;
1614 			Swizzle4<Vector4, 0x77>     wywy;
1615 			Swizzle4<Vector4, 0x78>     xzwy;
1616 			Swizzle4<Vector4, 0x79>     yzwy;
1617 			Swizzle4<Vector4, 0x7A>     zzwy;
1618 			Swizzle4<Vector4, 0x7B>     wzwy;
1619 			Swizzle4<Vector4, 0x7C>     xwwy;
1620 			Swizzle4<Vector4, 0x7D>     ywwy;
1621 			Swizzle4<Vector4, 0x7E>     zwwy;
1622 			Swizzle4<Vector4, 0x7F>     wwwy;
1623 			Swizzle4<Vector4, 0x80>     xxxz;
1624 			Swizzle4<Vector4, 0x81>     yxxz;
1625 			Swizzle4<Vector4, 0x82>     zxxz;
1626 			Swizzle4<Vector4, 0x83>     wxxz;
1627 			Swizzle4<Vector4, 0x84>     xyxz;
1628 			Swizzle4<Vector4, 0x85>     yyxz;
1629 			Swizzle4<Vector4, 0x86>     zyxz;
1630 			Swizzle4<Vector4, 0x87>     wyxz;
1631 			Swizzle4<Vector4, 0x88>     xzxz;
1632 			Swizzle4<Vector4, 0x89>     yzxz;
1633 			Swizzle4<Vector4, 0x8A>     zzxz;
1634 			Swizzle4<Vector4, 0x8B>     wzxz;
1635 			Swizzle4<Vector4, 0x8C>     xwxz;
1636 			Swizzle4<Vector4, 0x8D>     ywxz;
1637 			Swizzle4<Vector4, 0x8E>     zwxz;
1638 			Swizzle4<Vector4, 0x8F>     wwxz;
1639 			Swizzle4<Vector4, 0x90>     xxyz;
1640 			Swizzle4<Vector4, 0x91>     yxyz;
1641 			Swizzle4<Vector4, 0x92>     zxyz;
1642 			Swizzle4<Vector4, 0x93>     wxyz;
1643 			Swizzle4<Vector4, 0x94>     xyyz;
1644 			Swizzle4<Vector4, 0x95>     yyyz;
1645 			Swizzle4<Vector4, 0x96>     zyyz;
1646 			Swizzle4<Vector4, 0x97>     wyyz;
1647 			Swizzle4<Vector4, 0x98>     xzyz;
1648 			Swizzle4<Vector4, 0x99>     yzyz;
1649 			Swizzle4<Vector4, 0x9A>     zzyz;
1650 			Swizzle4<Vector4, 0x9B>     wzyz;
1651 			Swizzle4<Vector4, 0x9C>     xwyz;
1652 			Swizzle4<Vector4, 0x9D>     ywyz;
1653 			Swizzle4<Vector4, 0x9E>     zwyz;
1654 			Swizzle4<Vector4, 0x9F>     wwyz;
1655 			Swizzle4<Vector4, 0xA0>     xxzz;
1656 			Swizzle4<Vector4, 0xA1>     yxzz;
1657 			Swizzle4<Vector4, 0xA2>     zxzz;
1658 			Swizzle4<Vector4, 0xA3>     wxzz;
1659 			Swizzle4<Vector4, 0xA4>     xyzz;
1660 			Swizzle4<Vector4, 0xA5>     yyzz;
1661 			Swizzle4<Vector4, 0xA6>     zyzz;
1662 			Swizzle4<Vector4, 0xA7>     wyzz;
1663 			Swizzle4<Vector4, 0xA8>     xzzz;
1664 			Swizzle4<Vector4, 0xA9>     yzzz;
1665 			Swizzle4<Vector4, 0xAA>     zzzz;
1666 			Swizzle4<Vector4, 0xAB>     wzzz;
1667 			Swizzle4<Vector4, 0xAC>     xwzz;
1668 			Swizzle4<Vector4, 0xAD>     ywzz;
1669 			Swizzle4<Vector4, 0xAE>     zwzz;
1670 			Swizzle4<Vector4, 0xAF>     wwzz;
1671 			Swizzle4<Vector4, 0xB0>     xxwz;
1672 			Swizzle4<Vector4, 0xB1>     yxwz;
1673 			Swizzle4<Vector4, 0xB2>     zxwz;
1674 			Swizzle4<Vector4, 0xB3>     wxwz;
1675 			Swizzle4<Vector4, 0xB4>     xywz;
1676 			Swizzle4<Vector4, 0xB5>     yywz;
1677 			Swizzle4<Vector4, 0xB6>     zywz;
1678 			Swizzle4<Vector4, 0xB7>     wywz;
1679 			Swizzle4<Vector4, 0xB8>     xzwz;
1680 			Swizzle4<Vector4, 0xB9>     yzwz;
1681 			Swizzle4<Vector4, 0xBA>     zzwz;
1682 			Swizzle4<Vector4, 0xBB>     wzwz;
1683 			Swizzle4<Vector4, 0xBC>     xwwz;
1684 			Swizzle4<Vector4, 0xBD>     ywwz;
1685 			Swizzle4<Vector4, 0xBE>     zwwz;
1686 			Swizzle4<Vector4, 0xBF>     wwwz;
1687 			Swizzle4<Vector4, 0xC0>     xxxw;
1688 			Swizzle4<Vector4, 0xC1>     yxxw;
1689 			Swizzle4<Vector4, 0xC2>     zxxw;
1690 			Swizzle4<Vector4, 0xC3>     wxxw;
1691 			Swizzle4<Vector4, 0xC4>     xyxw;
1692 			Swizzle4<Vector4, 0xC5>     yyxw;
1693 			Swizzle4<Vector4, 0xC6>     zyxw;
1694 			Swizzle4<Vector4, 0xC7>     wyxw;
1695 			Swizzle4<Vector4, 0xC8>     xzxw;
1696 			Swizzle4<Vector4, 0xC9>     yzxw;
1697 			Swizzle4<Vector4, 0xCA>     zzxw;
1698 			Swizzle4<Vector4, 0xCB>     wzxw;
1699 			Swizzle4<Vector4, 0xCC>     xwxw;
1700 			Swizzle4<Vector4, 0xCD>     ywxw;
1701 			Swizzle4<Vector4, 0xCE>     zwxw;
1702 			Swizzle4<Vector4, 0xCF>     wwxw;
1703 			Swizzle4<Vector4, 0xD0>     xxyw;
1704 			Swizzle4<Vector4, 0xD1>     yxyw;
1705 			Swizzle4<Vector4, 0xD2>     zxyw;
1706 			Swizzle4<Vector4, 0xD3>     wxyw;
1707 			Swizzle4<Vector4, 0xD4>     xyyw;
1708 			Swizzle4<Vector4, 0xD5>     yyyw;
1709 			Swizzle4<Vector4, 0xD6>     zyyw;
1710 			Swizzle4<Vector4, 0xD7>     wyyw;
1711 			Swizzle4<Vector4, 0xD8>     xzyw;
1712 			Swizzle4<Vector4, 0xD9>     yzyw;
1713 			Swizzle4<Vector4, 0xDA>     zzyw;
1714 			Swizzle4<Vector4, 0xDB>     wzyw;
1715 			Swizzle4<Vector4, 0xDC>     xwyw;
1716 			Swizzle4<Vector4, 0xDD>     ywyw;
1717 			Swizzle4<Vector4, 0xDE>     zwyw;
1718 			Swizzle4<Vector4, 0xDF>     wwyw;
1719 			Swizzle4<Vector4, 0xE0>     xxzw;
1720 			Swizzle4<Vector4, 0xE1>     yxzw;
1721 			Swizzle4<Vector4, 0xE2>     zxzw;
1722 			Swizzle4<Vector4, 0xE3>     wxzw;
1723 			SwizzleMask4<Vector4, 0xE4> xyzw;
1724 			Swizzle4<Vector4, 0xE5>     yyzw;
1725 			Swizzle4<Vector4, 0xE6>     zyzw;
1726 			Swizzle4<Vector4, 0xE7>     wyzw;
1727 			Swizzle4<Vector4, 0xE8>     xzzw;
1728 			Swizzle4<Vector4, 0xE9>     yzzw;
1729 			Swizzle4<Vector4, 0xEA>     zzzw;
1730 			Swizzle4<Vector4, 0xEB>     wzzw;
1731 			Swizzle4<Vector4, 0xEC>     xwzw;
1732 			Swizzle4<Vector4, 0xED>     ywzw;
1733 			Swizzle4<Vector4, 0xEE>     zwzw;
1734 			Swizzle4<Vector4, 0xEF>     wwzw;
1735 			Swizzle4<Vector4, 0xF0>     xxww;
1736 			Swizzle4<Vector4, 0xF1>     yxww;
1737 			Swizzle4<Vector4, 0xF2>     zxww;
1738 			Swizzle4<Vector4, 0xF3>     wxww;
1739 			Swizzle4<Vector4, 0xF4>     xyww;
1740 			Swizzle4<Vector4, 0xF5>     yyww;
1741 			Swizzle4<Vector4, 0xF6>     zyww;
1742 			Swizzle4<Vector4, 0xF7>     wyww;
1743 			Swizzle4<Vector4, 0xF8>     xzww;
1744 			Swizzle4<Vector4, 0xF9>     yzww;
1745 			Swizzle4<Vector4, 0xFA>     zzww;
1746 			Swizzle4<Vector4, 0xFB>     wzww;
1747 			Swizzle4<Vector4, 0xFC>     xwww;
1748 			Swizzle4<Vector4, 0xFD>     ywww;
1749 			Swizzle4<Vector4, 0xFE>     zwww;
1750 			Swizzle4<Vector4, 0xFF>     wwww;
1751 		};
1752 	};
1753 
1754 	class Int4 : public LValue<Int4>, public XYZW<Int4>
1755 	{
1756 	public:
1757 		explicit Int4(RValue<Byte4> cast);
1758 		explicit Int4(RValue<SByte4> cast);
1759 		explicit Int4(RValue<Float4> cast);
1760 		explicit Int4(RValue<Short4> cast);
1761 		explicit Int4(RValue<UShort4> cast);
1762 
1763 		Int4();
1764 		Int4(int xyzw);
1765 		Int4(int x, int yzw);
1766 		Int4(int x, int y, int zw);
1767 		Int4(int x, int y, int z, int w);
1768 		Int4(RValue<Int4> rhs);
1769 		Int4(const Int4 &rhs);
1770 		Int4(const Reference<Int4> &rhs);
1771 		Int4(RValue<UInt4> rhs);
1772 		Int4(const UInt4 &rhs);
1773 		Int4(const Reference<UInt4> &rhs);
1774 		Int4(RValue<Int2> lo, RValue<Int2> hi);
1775 		Int4(RValue<Int> rhs);
1776 		Int4(const Int &rhs);
1777 		Int4(const Reference<Int> &rhs);
1778 
1779 		RValue<Int4> operator=(RValue<Int4> rhs);
1780 		RValue<Int4> operator=(const Int4 &rhs);
1781 		RValue<Int4> operator=(const Reference<Int4> &rhs);
1782 
1783 		static Type *getType();
1784 
1785 	private:
1786 		void constant(int x, int y, int z, int w);
1787 	};
1788 
1789 	RValue<Int4> operator+(RValue<Int4> lhs, RValue<Int4> rhs);
1790 	RValue<Int4> operator-(RValue<Int4> lhs, RValue<Int4> rhs);
1791 	RValue<Int4> operator*(RValue<Int4> lhs, RValue<Int4> rhs);
1792 	RValue<Int4> operator/(RValue<Int4> lhs, RValue<Int4> rhs);
1793 	RValue<Int4> operator%(RValue<Int4> lhs, RValue<Int4> rhs);
1794 	RValue<Int4> operator&(RValue<Int4> lhs, RValue<Int4> rhs);
1795 	RValue<Int4> operator|(RValue<Int4> lhs, RValue<Int4> rhs);
1796 	RValue<Int4> operator^(RValue<Int4> lhs, RValue<Int4> rhs);
1797 	RValue<Int4> operator<<(RValue<Int4> lhs, unsigned char rhs);
1798 	RValue<Int4> operator>>(RValue<Int4> lhs, unsigned char rhs);
1799 	RValue<Int4> operator<<(RValue<Int4> lhs, RValue<Int4> rhs);
1800 	RValue<Int4> operator>>(RValue<Int4> lhs, RValue<Int4> rhs);
1801 	RValue<Int4> operator+=(Int4 &lhs, RValue<Int4> rhs);
1802 	RValue<Int4> operator-=(Int4 &lhs, RValue<Int4> rhs);
1803 	RValue<Int4> operator*=(Int4 &lhs, RValue<Int4> rhs);
1804 //	RValue<Int4> operator/=(Int4 &lhs, RValue<Int4> rhs);
1805 //	RValue<Int4> operator%=(Int4 &lhs, RValue<Int4> rhs);
1806 	RValue<Int4> operator&=(Int4 &lhs, RValue<Int4> rhs);
1807 	RValue<Int4> operator|=(Int4 &lhs, RValue<Int4> rhs);
1808 	RValue<Int4> operator^=(Int4 &lhs, RValue<Int4> rhs);
1809 	RValue<Int4> operator<<=(Int4 &lhs, unsigned char rhs);
1810 	RValue<Int4> operator>>=(Int4 &lhs, unsigned char rhs);
1811 	RValue<Int4> operator+(RValue<Int4> val);
1812 	RValue<Int4> operator-(RValue<Int4> val);
1813 	RValue<Int4> operator~(RValue<Int4> val);
1814 //	RValue<Int4> operator++(Int4 &val, int);   // Post-increment
1815 //	const Int4 &operator++(Int4 &val);   // Pre-increment
1816 //	RValue<Int4> operator--(Int4 &val, int);   // Post-decrement
1817 //	const Int4 &operator--(Int4 &val);   // Pre-decrement
1818 //	RValue<Bool> operator<(RValue<Int4> lhs, RValue<Int4> rhs);
1819 //	RValue<Bool> operator<=(RValue<Int4> lhs, RValue<Int4> rhs);
1820 //	RValue<Bool> operator>(RValue<Int4> lhs, RValue<Int4> rhs);
1821 //	RValue<Bool> operator>=(RValue<Int4> lhs, RValue<Int4> rhs);
1822 //	RValue<Bool> operator!=(RValue<Int4> lhs, RValue<Int4> rhs);
1823 //	RValue<Bool> operator==(RValue<Int4> lhs, RValue<Int4> rhs);
1824 
1825 	RValue<Int4> CmpEQ(RValue<Int4> x, RValue<Int4> y);
1826 	RValue<Int4> CmpLT(RValue<Int4> x, RValue<Int4> y);
1827 	RValue<Int4> CmpLE(RValue<Int4> x, RValue<Int4> y);
1828 	RValue<Int4> CmpNEQ(RValue<Int4> x, RValue<Int4> y);
1829 	RValue<Int4> CmpNLT(RValue<Int4> x, RValue<Int4> y);
1830 	RValue<Int4> CmpNLE(RValue<Int4> x, RValue<Int4> y);
1831 	RValue<Int4> Max(RValue<Int4> x, RValue<Int4> y);
1832 	RValue<Int4> Min(RValue<Int4> x, RValue<Int4> y);
1833 	RValue<Int4> RoundInt(RValue<Float4> cast);
1834 	RValue<Short8> PackSigned(RValue<Int4> x, RValue<Int4> y);
1835 	RValue<UShort8> PackUnsigned(RValue<Int4> x, RValue<Int4> y);
1836 	RValue<Int> Extract(RValue<Int4> val, int i);
1837 	RValue<Int4> Insert(RValue<Int4> val, RValue<Int> element, int i);
1838 	RValue<Int> SignMask(RValue<Int4> x);
1839 	RValue<Int4> Swizzle(RValue<Int4> x, unsigned char select);
1840 
1841 	class UInt4 : public LValue<UInt4>, public XYZW<UInt4>
1842 	{
1843 	public:
1844 		explicit UInt4(RValue<Float4> cast);
1845 
1846 		UInt4();
1847 		UInt4(int xyzw);
1848 		UInt4(int x, int yzw);
1849 		UInt4(int x, int y, int zw);
1850 		UInt4(int x, int y, int z, int w);
1851 		UInt4(unsigned int x, unsigned int y, unsigned int z, unsigned int w);
1852 		UInt4(RValue<UInt4> rhs);
1853 		UInt4(const UInt4 &rhs);
1854 		UInt4(const Reference<UInt4> &rhs);
1855 		UInt4(RValue<Int4> rhs);
1856 		UInt4(const Int4 &rhs);
1857 		UInt4(const Reference<Int4> &rhs);
1858 		UInt4(RValue<UInt2> lo, RValue<UInt2> hi);
1859 
1860 		RValue<UInt4> operator=(RValue<UInt4> rhs);
1861 		RValue<UInt4> operator=(const UInt4 &rhs);
1862 		RValue<UInt4> operator=(const Reference<UInt4> &rhs);
1863 
1864 		static Type *getType();
1865 
1866 	private:
1867 		void constant(int x, int y, int z, int w);
1868 	};
1869 
1870 	RValue<UInt4> operator+(RValue<UInt4> lhs, RValue<UInt4> rhs);
1871 	RValue<UInt4> operator-(RValue<UInt4> lhs, RValue<UInt4> rhs);
1872 	RValue<UInt4> operator*(RValue<UInt4> lhs, RValue<UInt4> rhs);
1873 	RValue<UInt4> operator/(RValue<UInt4> lhs, RValue<UInt4> rhs);
1874 	RValue<UInt4> operator%(RValue<UInt4> lhs, RValue<UInt4> rhs);
1875 	RValue<UInt4> operator&(RValue<UInt4> lhs, RValue<UInt4> rhs);
1876 	RValue<UInt4> operator|(RValue<UInt4> lhs, RValue<UInt4> rhs);
1877 	RValue<UInt4> operator^(RValue<UInt4> lhs, RValue<UInt4> rhs);
1878 	RValue<UInt4> operator<<(RValue<UInt4> lhs, unsigned char rhs);
1879 	RValue<UInt4> operator>>(RValue<UInt4> lhs, unsigned char rhs);
1880 	RValue<UInt4> operator<<(RValue<UInt4> lhs, RValue<UInt4> rhs);
1881 	RValue<UInt4> operator>>(RValue<UInt4> lhs, RValue<UInt4> rhs);
1882 	RValue<UInt4> operator+=(UInt4 &lhs, RValue<UInt4> rhs);
1883 	RValue<UInt4> operator-=(UInt4 &lhs, RValue<UInt4> rhs);
1884 	RValue<UInt4> operator*=(UInt4 &lhs, RValue<UInt4> rhs);
1885 //	RValue<UInt4> operator/=(UInt4 &lhs, RValue<UInt4> rhs);
1886 //	RValue<UInt4> operator%=(UInt4 &lhs, RValue<UInt4> rhs);
1887 	RValue<UInt4> operator&=(UInt4 &lhs, RValue<UInt4> rhs);
1888 	RValue<UInt4> operator|=(UInt4 &lhs, RValue<UInt4> rhs);
1889 	RValue<UInt4> operator^=(UInt4 &lhs, RValue<UInt4> rhs);
1890 	RValue<UInt4> operator<<=(UInt4 &lhs, unsigned char rhs);
1891 	RValue<UInt4> operator>>=(UInt4 &lhs, unsigned char rhs);
1892 	RValue<UInt4> operator+(RValue<UInt4> val);
1893 	RValue<UInt4> operator-(RValue<UInt4> val);
1894 	RValue<UInt4> operator~(RValue<UInt4> val);
1895 //	RValue<UInt4> operator++(UInt4 &val, int);   // Post-increment
1896 //	const UInt4 &operator++(UInt4 &val);   // Pre-increment
1897 //	RValue<UInt4> operator--(UInt4 &val, int);   // Post-decrement
1898 //	const UInt4 &operator--(UInt4 &val);   // Pre-decrement
1899 //	RValue<Bool> operator<(RValue<UInt4> lhs, RValue<UInt4> rhs);
1900 //	RValue<Bool> operator<=(RValue<UInt4> lhs, RValue<UInt4> rhs);
1901 //	RValue<Bool> operator>(RValue<UInt4> lhs, RValue<UInt4> rhs);
1902 //	RValue<Bool> operator>=(RValue<UInt4> lhs, RValue<UInt4> rhs);
1903 //	RValue<Bool> operator!=(RValue<UInt4> lhs, RValue<UInt4> rhs);
1904 //	RValue<Bool> operator==(RValue<UInt4> lhs, RValue<UInt4> rhs);
1905 
1906 	RValue<UInt4> CmpEQ(RValue<UInt4> x, RValue<UInt4> y);
1907 	RValue<UInt4> CmpLT(RValue<UInt4> x, RValue<UInt4> y);
1908 	RValue<UInt4> CmpLE(RValue<UInt4> x, RValue<UInt4> y);
1909 	RValue<UInt4> CmpNEQ(RValue<UInt4> x, RValue<UInt4> y);
1910 	RValue<UInt4> CmpNLT(RValue<UInt4> x, RValue<UInt4> y);
1911 	RValue<UInt4> CmpNLE(RValue<UInt4> x, RValue<UInt4> y);
1912 	RValue<UInt4> Max(RValue<UInt4> x, RValue<UInt4> y);
1913 	RValue<UInt4> Min(RValue<UInt4> x, RValue<UInt4> y);
1914 //	RValue<UInt4> RoundInt(RValue<Float4> cast);
1915 
1916 	class Float : public LValue<Float>
1917 	{
1918 	public:
1919 		explicit Float(RValue<Int> cast);
1920 		explicit Float(RValue<UInt> cast);
1921 
1922 		Float() = default;
1923 		Float(float x);
1924 		Float(RValue<Float> rhs);
1925 		Float(const Float &rhs);
1926 		Float(const Reference<Float> &rhs);
1927 
1928 		template<int T>
1929 		Float(const SwizzleMask1<Float4, T> &rhs);
1930 
1931 	//	RValue<Float> operator=(float rhs);   // FIXME: Implement
1932 		RValue<Float> operator=(RValue<Float> rhs);
1933 		RValue<Float> operator=(const Float &rhs);
1934 		RValue<Float> operator=(const Reference<Float> &rhs);
1935 
1936 		template<int T>
1937 		RValue<Float> operator=(const SwizzleMask1<Float4, T> &rhs);
1938 
1939 		static Type *getType();
1940 	};
1941 
1942 	RValue<Float> operator+(RValue<Float> lhs, RValue<Float> rhs);
1943 	RValue<Float> operator-(RValue<Float> lhs, RValue<Float> rhs);
1944 	RValue<Float> operator*(RValue<Float> lhs, RValue<Float> rhs);
1945 	RValue<Float> operator/(RValue<Float> lhs, RValue<Float> rhs);
1946 	RValue<Float> operator+=(Float &lhs, RValue<Float> rhs);
1947 	RValue<Float> operator-=(Float &lhs, RValue<Float> rhs);
1948 	RValue<Float> operator*=(Float &lhs, RValue<Float> rhs);
1949 	RValue<Float> operator/=(Float &lhs, RValue<Float> rhs);
1950 	RValue<Float> operator+(RValue<Float> val);
1951 	RValue<Float> operator-(RValue<Float> val);
1952 	RValue<Bool> operator<(RValue<Float> lhs, RValue<Float> rhs);
1953 	RValue<Bool> operator<=(RValue<Float> lhs, RValue<Float> rhs);
1954 	RValue<Bool> operator>(RValue<Float> lhs, RValue<Float> rhs);
1955 	RValue<Bool> operator>=(RValue<Float> lhs, RValue<Float> rhs);
1956 	RValue<Bool> operator!=(RValue<Float> lhs, RValue<Float> rhs);
1957 	RValue<Bool> operator==(RValue<Float> lhs, RValue<Float> rhs);
1958 
1959 	RValue<Float> Abs(RValue<Float> x);
1960 	RValue<Float> Max(RValue<Float> x, RValue<Float> y);
1961 	RValue<Float> Min(RValue<Float> x, RValue<Float> y);
1962 	RValue<Float> Rcp_pp(RValue<Float> val, bool exactAtPow2 = false);
1963 	RValue<Float> RcpSqrt_pp(RValue<Float> val);
1964 	RValue<Float> Sqrt(RValue<Float> x);
1965 	RValue<Float> Round(RValue<Float> val);
1966 	RValue<Float> Trunc(RValue<Float> val);
1967 	RValue<Float> Frac(RValue<Float> val);
1968 	RValue<Float> Floor(RValue<Float> val);
1969 	RValue<Float> Ceil(RValue<Float> val);
1970 
1971 	class Float2 : public LValue<Float2>
1972 	{
1973 	public:
1974 	//	explicit Float2(RValue<Byte2> cast);
1975 	//	explicit Float2(RValue<Short2> cast);
1976 	//	explicit Float2(RValue<UShort2> cast);
1977 	//	explicit Float2(RValue<Int2> cast);
1978 	//	explicit Float2(RValue<UInt2> cast);
1979 		explicit Float2(RValue<Float4> cast);
1980 
1981 		Float2() = default;
1982 	//	Float2(float x, float y);
1983 	//	Float2(RValue<Float2> rhs);
1984 	//	Float2(const Float2 &rhs);
1985 	//	Float2(const Reference<Float2> &rhs);
1986 	//	Float2(RValue<Float> rhs);
1987 	//	Float2(const Float &rhs);
1988 	//	Float2(const Reference<Float> &rhs);
1989 
1990 	//	template<int T>
1991 	//	Float2(const SwizzleMask1<T> &rhs);
1992 
1993 	//	RValue<Float2> operator=(float replicate);
1994 	//	RValue<Float2> operator=(RValue<Float2> rhs);
1995 	//	RValue<Float2> operator=(const Float2 &rhs);
1996 	//	RValue<Float2> operator=(const Reference<Float2> &rhs);
1997 	//	RValue<Float2> operator=(RValue<Float> rhs);
1998 	//	RValue<Float2> operator=(const Float &rhs);
1999 	//	RValue<Float2> operator=(const Reference<Float> &rhs);
2000 
2001 	//	template<int T>
2002 	//	RValue<Float2> operator=(const SwizzleMask1<T> &rhs);
2003 
2004 		static Type *getType();
2005 	};
2006 
2007 //	RValue<Float2> operator+(RValue<Float2> lhs, RValue<Float2> rhs);
2008 //	RValue<Float2> operator-(RValue<Float2> lhs, RValue<Float2> rhs);
2009 //	RValue<Float2> operator*(RValue<Float2> lhs, RValue<Float2> rhs);
2010 //	RValue<Float2> operator/(RValue<Float2> lhs, RValue<Float2> rhs);
2011 //	RValue<Float2> operator%(RValue<Float2> lhs, RValue<Float2> rhs);
2012 //	RValue<Float2> operator+=(Float2 &lhs, RValue<Float2> rhs);
2013 //	RValue<Float2> operator-=(Float2 &lhs, RValue<Float2> rhs);
2014 //	RValue<Float2> operator*=(Float2 &lhs, RValue<Float2> rhs);
2015 //	RValue<Float2> operator/=(Float2 &lhs, RValue<Float2> rhs);
2016 //	RValue<Float2> operator%=(Float2 &lhs, RValue<Float2> rhs);
2017 //	RValue<Float2> operator+(RValue<Float2> val);
2018 //	RValue<Float2> operator-(RValue<Float2> val);
2019 
2020 //	RValue<Float2> Abs(RValue<Float2> x);
2021 //	RValue<Float2> Max(RValue<Float2> x, RValue<Float2> y);
2022 //	RValue<Float2> Min(RValue<Float2> x, RValue<Float2> y);
2023 //	RValue<Float2> Swizzle(RValue<Float2> x, unsigned char select);
2024 //	RValue<Float2> Mask(Float2 &lhs, RValue<Float2> rhs, unsigned char select);
2025 
2026 	class Float4 : public LValue<Float4>, public XYZW<Float4>
2027 	{
2028 	public:
2029 		explicit Float4(RValue<Byte4> cast);
2030 		explicit Float4(RValue<SByte4> cast);
2031 		explicit Float4(RValue<Short4> cast);
2032 		explicit Float4(RValue<UShort4> cast);
2033 		explicit Float4(RValue<Int4> cast);
2034 		explicit Float4(RValue<UInt4> cast);
2035 
2036 		Float4();
2037 		Float4(float xyzw);
2038 		Float4(float x, float yzw);
2039 		Float4(float x, float y, float zw);
2040 		Float4(float x, float y, float z, float w);
2041 		Float4(RValue<Float4> rhs);
2042 		Float4(const Float4 &rhs);
2043 		Float4(const Reference<Float4> &rhs);
2044 		Float4(RValue<Float> rhs);
2045 		Float4(const Float &rhs);
2046 		Float4(const Reference<Float> &rhs);
2047 
2048 		template<int T>
2049 		Float4(const SwizzleMask1<Float4, T> &rhs);
2050 		template<int T>
2051 		Float4(const Swizzle4<Float4, T> &rhs);
2052 		template<int X, int Y>
2053 		Float4(const Swizzle2<Float4, X> &x, const Swizzle2<Float4, Y> &y);
2054 		template<int X, int Y>
2055 		Float4(const SwizzleMask2<Float4, X> &x, const Swizzle2<Float4, Y> &y);
2056 		template<int X, int Y>
2057 		Float4(const Swizzle2<Float4, X> &x, const SwizzleMask2<Float4, Y> &y);
2058 		template<int X, int Y>
2059 		Float4(const SwizzleMask2<Float4, X> &x, const SwizzleMask2<Float4, Y> &y);
2060 
2061 		RValue<Float4> operator=(float replicate);
2062 		RValue<Float4> operator=(RValue<Float4> rhs);
2063 		RValue<Float4> operator=(const Float4 &rhs);
2064 		RValue<Float4> operator=(const Reference<Float4> &rhs);
2065 		RValue<Float4> operator=(RValue<Float> rhs);
2066 		RValue<Float4> operator=(const Float &rhs);
2067 		RValue<Float4> operator=(const Reference<Float> &rhs);
2068 
2069 		template<int T>
2070 		RValue<Float4> operator=(const SwizzleMask1<Float4, T> &rhs);
2071 		template<int T>
2072 		RValue<Float4> operator=(const Swizzle4<Float4, T> &rhs);
2073 
2074 		static Type *getType();
2075 
2076 	private:
2077 		void constant(float x, float y, float z, float w);
2078 	};
2079 
2080 	RValue<Float4> operator+(RValue<Float4> lhs, RValue<Float4> rhs);
2081 	RValue<Float4> operator-(RValue<Float4> lhs, RValue<Float4> rhs);
2082 	RValue<Float4> operator*(RValue<Float4> lhs, RValue<Float4> rhs);
2083 	RValue<Float4> operator/(RValue<Float4> lhs, RValue<Float4> rhs);
2084 	RValue<Float4> operator%(RValue<Float4> lhs, RValue<Float4> rhs);
2085 	RValue<Float4> operator+=(Float4 &lhs, RValue<Float4> rhs);
2086 	RValue<Float4> operator-=(Float4 &lhs, RValue<Float4> rhs);
2087 	RValue<Float4> operator*=(Float4 &lhs, RValue<Float4> rhs);
2088 	RValue<Float4> operator/=(Float4 &lhs, RValue<Float4> rhs);
2089 	RValue<Float4> operator%=(Float4 &lhs, RValue<Float4> rhs);
2090 	RValue<Float4> operator+(RValue<Float4> val);
2091 	RValue<Float4> operator-(RValue<Float4> val);
2092 
2093 	RValue<Float4> Abs(RValue<Float4> x);
2094 	RValue<Float4> Max(RValue<Float4> x, RValue<Float4> y);
2095 	RValue<Float4> Min(RValue<Float4> x, RValue<Float4> y);
2096 	RValue<Float4> Rcp_pp(RValue<Float4> val, bool exactAtPow2 = false);
2097 	RValue<Float4> RcpSqrt_pp(RValue<Float4> val);
2098 	RValue<Float4> Sqrt(RValue<Float4> x);
2099 	RValue<Float4> Insert(RValue<Float4> val, RValue<Float> element, int i);
2100 	RValue<Float> Extract(RValue<Float4> x, int i);
2101 	RValue<Float4> Swizzle(RValue<Float4> x, unsigned char select);
2102 	RValue<Float4> ShuffleLowHigh(RValue<Float4> x, RValue<Float4> y, unsigned char imm);
2103 	RValue<Float4> UnpackLow(RValue<Float4> x, RValue<Float4> y);
2104 	RValue<Float4> UnpackHigh(RValue<Float4> x, RValue<Float4> y);
2105 	RValue<Float4> Mask(Float4 &lhs, RValue<Float4> rhs, unsigned char select);
2106 	RValue<Int> SignMask(RValue<Float4> x);
2107 	RValue<Int4> CmpEQ(RValue<Float4> x, RValue<Float4> y);
2108 	RValue<Int4> CmpLT(RValue<Float4> x, RValue<Float4> y);
2109 	RValue<Int4> CmpLE(RValue<Float4> x, RValue<Float4> y);
2110 	RValue<Int4> CmpNEQ(RValue<Float4> x, RValue<Float4> y);
2111 	RValue<Int4> CmpNLT(RValue<Float4> x, RValue<Float4> y);
2112 	RValue<Int4> CmpNLE(RValue<Float4> x, RValue<Float4> y);
2113 	RValue<Int4> IsInf(RValue<Float4> x);
2114 	RValue<Int4> IsNan(RValue<Float4> x);
2115 	RValue<Float4> Round(RValue<Float4> x);
2116 	RValue<Float4> Trunc(RValue<Float4> x);
2117 	RValue<Float4> Frac(RValue<Float4> x);
2118 	RValue<Float4> Floor(RValue<Float4> x);
2119 	RValue<Float4> Ceil(RValue<Float4> x);
2120 
2121 	template<class T>
2122 	class Pointer : public LValue<Pointer<T>>
2123 	{
2124 	public:
2125 		template<class S>
Pointer(RValue<Pointer<S>> pointerS,int alignment=1)2126 		Pointer(RValue<Pointer<S>> pointerS, int alignment = 1) : alignment(alignment)
2127 		{
2128 			Value *pointerT = Nucleus::createBitCast(pointerS.value, Nucleus::getPointerType(T::getType()));
2129 			LValue<Pointer<T>>::storeValue(pointerT);
2130 		}
2131 
2132 		template<class S>
Pointer(const Pointer<S> & pointer,int alignment=1)2133 		Pointer(const Pointer<S> &pointer, int alignment = 1) : alignment(alignment)
2134 		{
2135 			Value *pointerS = pointer.loadValue();
2136 			Value *pointerT = Nucleus::createBitCast(pointerS, Nucleus::getPointerType(T::getType()));
2137 			LValue<Pointer<T>>::storeValue(pointerT);
2138 		}
2139 
2140 		Pointer(Argument<Pointer<T>> argument);
2141 
2142 		Pointer();
2143 		Pointer(RValue<Pointer<T>> rhs);
2144 		Pointer(const Pointer<T> &rhs);
2145 		Pointer(const Reference<Pointer<T>> &rhs);
2146 
2147 		RValue<Pointer<T>> operator=(RValue<Pointer<T>> rhs);
2148 		RValue<Pointer<T>> operator=(const Pointer<T> &rhs);
2149 		RValue<Pointer<T>> operator=(const Reference<Pointer<T>> &rhs);
2150 
2151 		Reference<T> operator*();
2152 		Reference<T> operator[](int index);
2153 		Reference<T> operator[](unsigned int index);
2154 		Reference<T> operator[](RValue<Int> index);
2155 		Reference<T> operator[](RValue<UInt> index);
2156 
2157 		static Type *getType();
2158 
2159 	private:
2160 		const int alignment;
2161 	};
2162 
2163 	RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, int offset);
2164 	RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, RValue<Int> offset);
2165 	RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, RValue<UInt> offset);
2166 	RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, int offset);
2167 	RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, RValue<Int> offset);
2168 	RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, RValue<UInt> offset);
2169 
2170 	RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, int offset);
2171 	RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, RValue<Int> offset);
2172 	RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, RValue<UInt> offset);
2173 	RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, int offset);
2174 	RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, RValue<Int> offset);
2175 	RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, RValue<UInt> offset);
2176 
2177 	template<class T, int S = 1>
2178 	class Array : public LValue<T>
2179 	{
2180 	public:
2181 		Array(int size = S);
2182 
2183 		Reference<T> operator[](int index);
2184 		Reference<T> operator[](unsigned int index);
2185 		Reference<T> operator[](RValue<Int> index);
2186 		Reference<T> operator[](RValue<UInt> index);
2187 	};
2188 
2189 //	RValue<Array<T>> operator++(Array<T> &val, int);   // Post-increment
2190 //	const Array<T> &operator++(Array<T> &val);   // Pre-increment
2191 //	RValue<Array<T>> operator--(Array<T> &val, int);   // Post-decrement
2192 //	const Array<T> &operator--(Array<T> &val);   // Pre-decrement
2193 
2194 	void branch(RValue<Bool> cmp, BasicBlock *bodyBB, BasicBlock *endBB);
2195 
2196 	void Return();
2197 	void Return(RValue<Int> ret);
2198 
2199 	template<class T>
2200 	void Return(const Pointer<T> &ret);
2201 
2202 	template<class T>
2203 	void Return(RValue<Pointer<T>> ret);
2204 
2205 	template<unsigned int index, typename... Arguments>
2206 	struct ArgI;
2207 
2208 	template<typename Arg0, typename... Arguments>
2209 	struct ArgI<0, Arg0, Arguments...>
2210 	{
2211 		typedef Arg0 Type;
2212 	};
2213 
2214 	template<unsigned int index, typename Arg0, typename... Arguments>
2215 	struct ArgI<index, Arg0, Arguments...>
2216 	{
2217 		typedef typename ArgI<index - 1, Arguments...>::Type Type;
2218 	};
2219 
2220 	// Generic template, leave undefined!
2221 	template<typename FunctionType>
2222 	class Function;
2223 
2224 	// Specialized for function types
2225 	template<typename Return, typename... Arguments>
2226 	class Function<Return(Arguments...)>
2227 	{
2228 	public:
2229 		Function();
2230 
2231 		virtual ~Function();
2232 
2233 		template<int index>
Arg() const2234 		Argument<typename ArgI<index, Arguments...>::Type> Arg() const
2235 		{
2236 			Value *arg = Nucleus::getArgument(index);
2237 			return Argument<typename ArgI<index, Arguments...>::Type>(arg);
2238 		}
2239 
2240 		Routine *operator()(const wchar_t *name, ...);
2241 
2242 	protected:
2243 		Nucleus *core;
2244 		std::vector<Type*> arguments;
2245 	};
2246 
2247 	template<typename Return>
2248 	class Function<Return()> : public Function<Return(Void)>
2249 	{
2250 	};
2251 
2252 	template<int index, typename Return, typename... Arguments>
Arg(Function<Return (Arguments...)> & function)2253 	Argument<typename ArgI<index, Arguments...>::Type> Arg(Function<Return(Arguments...)> &function)
2254 	{
2255 		return Argument<typename ArgI<index, Arguments...>::Type>(function.arg(index));
2256 	}
2257 
2258 	RValue<Long> Ticks();
2259 }
2260 
2261 namespace sw
2262 {
2263 	template<class T>
LValue(int arraySize)2264 	LValue<T>::LValue(int arraySize)
2265 	{
2266 		address = Nucleus::allocateStackVariable(T::getType(), arraySize);
2267 	}
2268 
2269 	template<class T>
loadValue() const2270 	Value *LValue<T>::loadValue() const
2271 	{
2272 		return Nucleus::createLoad(address, T::getType(), false, 0);
2273 	}
2274 
2275 	template<class T>
storeValue(Value * value) const2276 	Value *LValue<T>::storeValue(Value *value) const
2277 	{
2278 		return Nucleus::createStore(value, address, T::getType(), false, 0);
2279 	}
2280 
2281 	template<class T>
getAddress(Value * index,bool unsignedIndex) const2282 	Value *LValue<T>::getAddress(Value *index, bool unsignedIndex) const
2283 	{
2284 		return Nucleus::createGEP(address, T::getType(), index, unsignedIndex);
2285 	}
2286 
2287 	template<class T>
operator &()2288 	RValue<Pointer<T>> LValue<T>::operator&()
2289 	{
2290 		return RValue<Pointer<T>>(address);
2291 	}
2292 
2293 	template<class T>
Reference(Value * pointer,int alignment)2294 	Reference<T>::Reference(Value *pointer, int alignment) : alignment(alignment)
2295 	{
2296 		address = pointer;
2297 	}
2298 
2299 	template<class T>
operator =(RValue<T> rhs) const2300 	RValue<T> Reference<T>::operator=(RValue<T> rhs) const
2301 	{
2302 		Nucleus::createStore(rhs.value, address, T::getType(), false, alignment);
2303 
2304 		return rhs;
2305 	}
2306 
2307 	template<class T>
operator =(const Reference<T> & ref) const2308 	RValue<T> Reference<T>::operator=(const Reference<T> &ref) const
2309 	{
2310 		Value *tmp = Nucleus::createLoad(ref.address, T::getType(), false, ref.alignment);
2311 		Nucleus::createStore(tmp, address, T::getType(), false, alignment);
2312 
2313 		return RValue<T>(tmp);
2314 	}
2315 
2316 	template<class T>
operator +=(RValue<T> rhs) const2317 	RValue<T> Reference<T>::operator+=(RValue<T> rhs) const
2318 	{
2319 		return *this = *this + rhs;
2320 	}
2321 
2322 	template<class T>
loadValue() const2323 	Value *Reference<T>::loadValue() const
2324 	{
2325 		return Nucleus::createLoad(address, T::getType(), false, alignment);
2326 	}
2327 
2328 	template<class T>
getAlignment() const2329 	int Reference<T>::getAlignment() const
2330 	{
2331 		return alignment;
2332 	}
2333 
2334 	template<class T>
RValue(Value * rvalue)2335 	RValue<T>::RValue(Value *rvalue)
2336 	{
2337 		assert(Nucleus::createBitCast(rvalue, T::getType()) == rvalue);   // Run-time type should match T, so bitcast is no-op.
2338 
2339 		value = rvalue;
2340 	}
2341 
2342 	template<class T>
RValue(const T & lvalue)2343 	RValue<T>::RValue(const T &lvalue)
2344 	{
2345 		value = lvalue.loadValue();
2346 	}
2347 
2348 	template<class T>
RValue(typename IntLiteral<T>::type i)2349 	RValue<T>::RValue(typename IntLiteral<T>::type i)
2350 	{
2351 		value = Nucleus::createConstantInt(i);
2352 	}
2353 
2354 	template<class T>
RValue(typename FloatLiteral<T>::type f)2355 	RValue<T>::RValue(typename FloatLiteral<T>::type f)
2356 	{
2357 		value = Nucleus::createConstantFloat(f);
2358 	}
2359 
2360 	template<class T>
RValue(const Reference<T> & ref)2361 	RValue<T>::RValue(const Reference<T> &ref)
2362 	{
2363 		value = ref.loadValue();
2364 	}
2365 
2366 	template<class Vector4, int T>
operator RValue<Vector4>() const2367 	Swizzle2<Vector4, T>::operator RValue<Vector4>() const
2368 	{
2369 		Value *vector = parent->loadValue();
2370 
2371 		return Swizzle(RValue<Vector4>(vector), T);
2372 	}
2373 
2374 	template<class Vector4, int T>
operator RValue<Vector4>() const2375 	Swizzle4<Vector4, T>::operator RValue<Vector4>() const
2376 	{
2377 		Value *vector = parent->loadValue();
2378 
2379 		return Swizzle(RValue<Vector4>(vector), T);
2380 	}
2381 
2382 	template<class Vector4, int T>
operator RValue<Vector4>() const2383 	SwizzleMask4<Vector4, T>::operator RValue<Vector4>() const
2384 	{
2385 		Value *vector = parent->loadValue();
2386 
2387 		return Swizzle(RValue<Vector4>(vector), T);
2388 	}
2389 
2390 	template<class Vector4, int T>
operator =(RValue<Vector4> rhs)2391 	RValue<Vector4> SwizzleMask4<Vector4, T>::operator=(RValue<Vector4> rhs)
2392 	{
2393 		return Mask(*parent, rhs, T);
2394 	}
2395 
2396 	template<class Vector4, int T>
operator =(RValue<typename Scalar<Vector4>::Type> rhs)2397 	RValue<Vector4> SwizzleMask4<Vector4, T>::operator=(RValue<typename Scalar<Vector4>::Type> rhs)
2398 	{
2399 		return Mask(*parent, Vector4(rhs), T);
2400 	}
2401 
2402 	template<class Vector4, int T>
operator RValue<typename Scalar<Vector4>::Type>() const2403 	SwizzleMask1<Vector4, T>::operator RValue<typename Scalar<Vector4>::Type>() const   // FIXME: Call a non-template function
2404 	{
2405 		return Extract(*parent, T & 0x3);
2406 	}
2407 
2408 	template<class Vector4, int T>
operator RValue<Vector4>() const2409 	SwizzleMask1<Vector4, T>::operator RValue<Vector4>() const
2410 	{
2411 		Value *vector = parent->loadValue();
2412 
2413 		return Swizzle(RValue<Vector4>(vector), T);
2414 	}
2415 
2416 	template<class Vector4, int T>
operator =(float x)2417 	RValue<Vector4> SwizzleMask1<Vector4, T>::operator=(float x)
2418 	{
2419 		return *parent = Insert(*parent, Float(x), T & 0x3);
2420 	}
2421 
2422 	template<class Vector4, int T>
operator =(RValue<Vector4> rhs)2423 	RValue<Vector4> SwizzleMask1<Vector4, T>::operator=(RValue<Vector4> rhs)
2424 	{
2425 		return Mask(*parent, Float4(rhs), T);
2426 	}
2427 
2428 	template<class Vector4, int T>
operator =(RValue<typename Scalar<Vector4>::Type> rhs)2429 	RValue<Vector4> SwizzleMask1<Vector4, T>::operator=(RValue<typename Scalar<Vector4>::Type> rhs)   // FIXME: Call a non-template function
2430 	{
2431 		return *parent = Insert(*parent, rhs, T & 0x3);
2432 	}
2433 
2434 	template<class Vector4, int T>
operator RValue<Vector4>() const2435 	SwizzleMask2<Vector4, T>::operator RValue<Vector4>() const
2436 	{
2437 		Value *vector = parent->loadValue();
2438 
2439 		return Swizzle(RValue<Float4>(vector), T);
2440 	}
2441 
2442 	template<class Vector4, int T>
operator =(RValue<Vector4> rhs)2443 	RValue<Vector4> SwizzleMask2<Vector4, T>::operator=(RValue<Vector4> rhs)
2444 	{
2445 		return Mask(*parent, Float4(rhs), T);
2446 	}
2447 
2448 	template<int T>
Float(const SwizzleMask1<Float4,T> & rhs)2449 	Float::Float(const SwizzleMask1<Float4, T> &rhs)
2450 	{
2451 		*this = rhs.operator RValue<Float>();
2452 	}
2453 
2454 	template<int T>
operator =(const SwizzleMask1<Float4,T> & rhs)2455 	RValue<Float> Float::operator=(const SwizzleMask1<Float4, T> &rhs)
2456 	{
2457 		return *this = rhs.operator RValue<Float>();
2458 	}
2459 
2460 	template<int T>
Float4(const SwizzleMask1<Float4,T> & rhs)2461 	Float4::Float4(const SwizzleMask1<Float4, T> &rhs) : XYZW(this)
2462 	{
2463 		*this = rhs.operator RValue<Float4>();
2464 	}
2465 
2466 	template<int T>
Float4(const Swizzle4<Float4,T> & rhs)2467 	Float4::Float4(const Swizzle4<Float4, T> &rhs) : XYZW(this)
2468 	{
2469 		*this = rhs.operator RValue<Float4>();
2470 	}
2471 
2472 	template<int X, int Y>
Float4(const Swizzle2<Float4,X> & x,const Swizzle2<Float4,Y> & y)2473 	Float4::Float4(const Swizzle2<Float4, X> &x, const Swizzle2<Float4, Y> &y) : XYZW(this)
2474 	{
2475 		*this = ShuffleLowHigh(*x.parent, *y.parent, (X & 0xF) | (Y & 0xF) << 4);
2476 	}
2477 
2478 	template<int X, int Y>
Float4(const SwizzleMask2<Float4,X> & x,const Swizzle2<Float4,Y> & y)2479 	Float4::Float4(const SwizzleMask2<Float4, X> &x, const Swizzle2<Float4, Y> &y) : XYZW(this)
2480 	{
2481 		*this = ShuffleLowHigh(*x.parent, *y.parent, (X & 0xF) | (Y & 0xF) << 4);
2482 	}
2483 
2484 	template<int X, int Y>
Float4(const Swizzle2<Float4,X> & x,const SwizzleMask2<Float4,Y> & y)2485 	Float4::Float4(const Swizzle2<Float4, X> &x, const SwizzleMask2<Float4, Y> &y) : XYZW(this)
2486 	{
2487 		*this = ShuffleLowHigh(*x.parent, *y.parent, (X & 0xF) | (Y & 0xF) << 4);
2488 	}
2489 
2490 	template<int X, int Y>
Float4(const SwizzleMask2<Float4,X> & x,const SwizzleMask2<Float4,Y> & y)2491 	Float4::Float4(const SwizzleMask2<Float4, X> &x, const SwizzleMask2<Float4, Y> &y) : XYZW(this)
2492 	{
2493 		*this = ShuffleLowHigh(*x.parent, *y.parent, (X & 0xF) | (Y & 0xF) << 4);
2494 	}
2495 
2496 	template<int T>
operator =(const SwizzleMask1<Float4,T> & rhs)2497 	RValue<Float4> Float4::operator=(const SwizzleMask1<Float4, T> &rhs)
2498 	{
2499 		return *this = rhs.operator RValue<Float4>();
2500 	}
2501 
2502 	template<int T>
operator =(const Swizzle4<Float4,T> & rhs)2503 	RValue<Float4> Float4::operator=(const Swizzle4<Float4, T> &rhs)
2504 	{
2505 		return *this = rhs.operator RValue<Float4>();
2506 	}
2507 
2508 	template<class T>
Pointer(Argument<Pointer<T>> argument)2509 	Pointer<T>::Pointer(Argument<Pointer<T>> argument) : alignment(1)
2510 	{
2511 		LValue<Pointer<T>>::storeValue(argument.value);
2512 	}
2513 
2514 	template<class T>
Pointer()2515 	Pointer<T>::Pointer() : alignment(1)
2516 	{
2517 		LValue<Pointer<T>>::storeValue(Nucleus::createNullPointer(T::getType()));
2518 	}
2519 
2520 	template<class T>
Pointer(RValue<Pointer<T>> rhs)2521 	Pointer<T>::Pointer(RValue<Pointer<T>> rhs) : alignment(1)
2522 	{
2523 		LValue<Pointer<T>>::storeValue(rhs.value);
2524 	}
2525 
2526 	template<class T>
Pointer(const Pointer<T> & rhs)2527 	Pointer<T>::Pointer(const Pointer<T> &rhs) : alignment(rhs.alignment)
2528 	{
2529 		Value *value = rhs.loadValue();
2530 		LValue<Pointer<T>>::storeValue(value);
2531 	}
2532 
2533 	template<class T>
Pointer(const Reference<Pointer<T>> & rhs)2534 	Pointer<T>::Pointer(const Reference<Pointer<T>> &rhs) : alignment(rhs.getAlignment())
2535 	{
2536 		Value *value = rhs.loadValue();
2537 		LValue<Pointer<T>>::storeValue(value);
2538 	}
2539 
2540 	template<class T>
operator =(RValue<Pointer<T>> rhs)2541 	RValue<Pointer<T>> Pointer<T>::operator=(RValue<Pointer<T>> rhs)
2542 	{
2543 		LValue<Pointer<T>>::storeValue(rhs.value);
2544 
2545 		return rhs;
2546 	}
2547 
2548 	template<class T>
operator =(const Pointer<T> & rhs)2549 	RValue<Pointer<T>> Pointer<T>::operator=(const Pointer<T> &rhs)
2550 	{
2551 		Value *value = rhs.loadValue();
2552 		LValue<Pointer<T>>::storeValue(value);
2553 
2554 		return RValue<Pointer<T>>(value);
2555 	}
2556 
2557 	template<class T>
operator =(const Reference<Pointer<T>> & rhs)2558 	RValue<Pointer<T>> Pointer<T>::operator=(const Reference<Pointer<T>> &rhs)
2559 	{
2560 		Value *value = rhs.loadValue();
2561 		LValue<Pointer<T>>::storeValue(value);
2562 
2563 		return RValue<Pointer<T>>(value);
2564 	}
2565 
2566 	template<class T>
operator *()2567 	Reference<T> Pointer<T>::operator*()
2568 	{
2569 		return Reference<T>(LValue<Pointer<T>>::loadValue(), alignment);
2570 	}
2571 
2572 	template<class T>
operator [](int index)2573 	Reference<T> Pointer<T>::operator[](int index)
2574 	{
2575 		Value *element = Nucleus::createGEP(LValue<Pointer<T>>::loadValue(), T::getType(), Nucleus::createConstantInt(index), false);
2576 
2577 		return Reference<T>(element, alignment);
2578 	}
2579 
2580 	template<class T>
operator [](unsigned int index)2581 	Reference<T> Pointer<T>::operator[](unsigned int index)
2582 	{
2583 		Value *element = Nucleus::createGEP(LValue<Pointer<T>>::loadValue(), T::getType(), Nucleus::createConstantInt(index), true);
2584 
2585 		return Reference<T>(element, alignment);
2586 	}
2587 
2588 	template<class T>
operator [](RValue<Int> index)2589 	Reference<T> Pointer<T>::operator[](RValue<Int> index)
2590 	{
2591 		Value *element = Nucleus::createGEP(LValue<Pointer<T>>::loadValue(), T::getType(), index.value, false);
2592 
2593 		return Reference<T>(element, alignment);
2594 	}
2595 
2596 	template<class T>
operator [](RValue<UInt> index)2597 	Reference<T> Pointer<T>::operator[](RValue<UInt> index)
2598 	{
2599 		Value *element = Nucleus::createGEP(LValue<Pointer<T>>::loadValue(), T::getType(), index.value, true);
2600 
2601 		return Reference<T>(element, alignment);
2602 	}
2603 
2604 	template<class T>
getType()2605 	Type *Pointer<T>::getType()
2606 	{
2607 		return Nucleus::getPointerType(T::getType());
2608 	}
2609 
2610 	template<class T, int S>
Array(int size)2611 	Array<T, S>::Array(int size) : LValue<T>(size)
2612 	{
2613 	}
2614 
2615 	template<class T, int S>
operator [](int index)2616 	Reference<T> Array<T, S>::operator[](int index)
2617 	{
2618 		Value *element = LValue<T>::getAddress(Nucleus::createConstantInt(index), false);
2619 
2620 		return Reference<T>(element);
2621 	}
2622 
2623 	template<class T, int S>
operator [](unsigned int index)2624 	Reference<T> Array<T, S>::operator[](unsigned int index)
2625 	{
2626 		Value *element = LValue<T>::getAddress(Nucleus::createConstantInt(index), true);
2627 
2628 		return Reference<T>(element);
2629 	}
2630 
2631 	template<class T, int S>
operator [](RValue<Int> index)2632 	Reference<T> Array<T, S>::operator[](RValue<Int> index)
2633 	{
2634 		Value *element = LValue<T>::getAddress(index.value, false);
2635 
2636 		return Reference<T>(element);
2637 	}
2638 
2639 	template<class T, int S>
operator [](RValue<UInt> index)2640 	Reference<T> Array<T, S>::operator[](RValue<UInt> index)
2641 	{
2642 		Value *element = LValue<T>::getAddress(index.value, true);
2643 
2644 		return Reference<T>(element);
2645 	}
2646 
2647 //	template<class T>
2648 //	RValue<Array<T>> operator++(Array<T> &val, int)
2649 //	{
2650 //		// FIXME: Requires storing the address of the array
2651 //	}
2652 
2653 //	template<class T>
2654 //	const Array<T> &operator++(Array<T> &val)
2655 //	{
2656 //		// FIXME: Requires storing the address of the array
2657 //	}
2658 
2659 //	template<class T>
2660 //	RValue<Array<T>> operator--(Array<T> &val, int)
2661 //	{
2662 //		// FIXME: Requires storing the address of the array
2663 //	}
2664 
2665 //	template<class T>
2666 //	const Array<T> &operator--(Array<T> &val)
2667 //	{
2668 //		// FIXME: Requires storing the address of the array
2669 //	}
2670 
2671 	template<class T>
IfThenElse(RValue<Bool> condition,RValue<T> ifTrue,RValue<T> ifFalse)2672 	RValue<T> IfThenElse(RValue<Bool> condition, RValue<T> ifTrue, RValue<T> ifFalse)
2673 	{
2674 		return RValue<T>(Nucleus::createSelect(condition.value, ifTrue.value, ifFalse.value));
2675 	}
2676 
2677 	template<class T>
IfThenElse(RValue<Bool> condition,const T & ifTrue,RValue<T> ifFalse)2678 	RValue<T> IfThenElse(RValue<Bool> condition, const T &ifTrue, RValue<T> ifFalse)
2679 	{
2680 		Value *trueValue = ifTrue.loadValue();
2681 
2682 		return RValue<T>(Nucleus::createSelect(condition.value, trueValue, ifFalse.value));
2683 	}
2684 
2685 	template<class T>
IfThenElse(RValue<Bool> condition,RValue<T> ifTrue,const T & ifFalse)2686 	RValue<T> IfThenElse(RValue<Bool> condition, RValue<T> ifTrue, const T &ifFalse)
2687 	{
2688 		Value *falseValue = ifFalse.loadValue();
2689 
2690 		return RValue<T>(Nucleus::createSelect(condition.value, ifTrue.value, falseValue));
2691 	}
2692 
2693 	template<class T>
IfThenElse(RValue<Bool> condition,const T & ifTrue,const T & ifFalse)2694 	RValue<T> IfThenElse(RValue<Bool> condition, const T &ifTrue, const T &ifFalse)
2695 	{
2696 		Value *trueValue = ifTrue.loadValue();
2697 		Value *falseValue = ifFalse.loadValue();
2698 
2699 		return RValue<T>(Nucleus::createSelect(condition.value, trueValue, falseValue));
2700 	}
2701 
2702 	template<class T>
Return(const Pointer<T> & ret)2703 	void Return(const Pointer<T> &ret)
2704 	{
2705 		Nucleus::createRet(Nucleus::createLoad(ret.address, Pointer<T>::getType()));
2706 		Nucleus::setInsertBlock(Nucleus::createBasicBlock());
2707 	}
2708 
2709 	template<class T>
Return(RValue<Pointer<T>> ret)2710 	void Return(RValue<Pointer<T>> ret)
2711 	{
2712 		Nucleus::createRet(ret.value);
2713 		Nucleus::setInsertBlock(Nucleus::createBasicBlock());
2714 	}
2715 
2716 	template<typename Return, typename... Arguments>
Function()2717 	Function<Return(Arguments...)>::Function()
2718 	{
2719 		core = new Nucleus();
2720 
2721 		Type *types[] = {Arguments::getType()...};
2722 		for(Type *type : types)
2723 		{
2724 			if(type != Void::getType())
2725 			{
2726 				arguments.push_back(type);
2727 			}
2728 		}
2729 
2730 		Nucleus::createFunction(Return::getType(), arguments);
2731 	}
2732 
2733 	template<typename Return, typename... Arguments>
~Function()2734 	Function<Return(Arguments...)>::~Function()
2735 	{
2736 		delete core;
2737 	}
2738 
2739 	template<typename Return, typename... Arguments>
operator ()(const wchar_t * name,...)2740 	Routine *Function<Return(Arguments...)>::operator()(const wchar_t *name, ...)
2741 	{
2742 		wchar_t fullName[1024 + 1];
2743 
2744 		va_list vararg;
2745 		va_start(vararg, name);
2746 		vswprintf(fullName, 1024, name, vararg);
2747 		va_end(vararg);
2748 
2749 		return core->acquireRoutine(fullName, true);
2750 	}
2751 
2752 	template<class T, class S>
ReinterpretCast(RValue<S> val)2753 	RValue<T> ReinterpretCast(RValue<S> val)
2754 	{
2755 		return RValue<T>(Nucleus::createBitCast(val.value, T::getType()));
2756 	}
2757 
2758 	template<class T, class S>
ReinterpretCast(const LValue<S> & var)2759 	RValue<T> ReinterpretCast(const LValue<S> &var)
2760 	{
2761 		Value *val = var.loadValue();
2762 
2763 		return RValue<T>(Nucleus::createBitCast(val, T::getType()));
2764 	}
2765 
2766 	template<class T, class S>
ReinterpretCast(const Reference<S> & var)2767 	RValue<T> ReinterpretCast(const Reference<S> &var)
2768 	{
2769 		return ReinterpretCast<T>(RValue<S>(var));
2770 	}
2771 
2772 	template<class T>
As(Value * val)2773 	RValue<T> As(Value *val)
2774 	{
2775 		return RValue<T>(Nucleus::createBitCast(val, T::getType()));
2776 	}
2777 
2778 	template<class T, class S>
As(RValue<S> val)2779 	RValue<T> As(RValue<S> val)
2780 	{
2781 		return ReinterpretCast<T>(val);
2782 	}
2783 
2784 	template<class T, class S>
As(const LValue<S> & var)2785 	RValue<T> As(const LValue<S> &var)
2786 	{
2787 		return ReinterpretCast<T>(var);
2788 	}
2789 
2790 	template<class T, class S>
As(const Reference<S> & val)2791 	RValue<T> As(const Reference<S> &val)
2792 	{
2793 		return ReinterpretCast<T>(val);
2794 	}
2795 
2796 	class ForData
2797 	{
2798 	public:
ForData(bool init)2799 		ForData(bool init) : loopOnce(init)
2800 		{
2801 		}
2802 
operator bool()2803 		operator bool()
2804 		{
2805 			return loopOnce;
2806 		}
2807 
operator =(bool value)2808 		bool operator=(bool value)
2809 		{
2810 			return loopOnce = value;
2811 		}
2812 
setup()2813 		bool setup()
2814 		{
2815 			if(Nucleus::getInsertBlock() != endBB)
2816 			{
2817 				testBB = Nucleus::createBasicBlock();
2818 
2819 				Nucleus::createBr(testBB);
2820 				Nucleus::setInsertBlock(testBB);
2821 
2822 				return true;
2823 			}
2824 
2825 			return false;
2826 		}
2827 
test(RValue<Bool> cmp)2828 		bool test(RValue<Bool> cmp)
2829 		{
2830 			BasicBlock *bodyBB = Nucleus::createBasicBlock();
2831 			endBB = Nucleus::createBasicBlock();
2832 
2833 			Nucleus::createCondBr(cmp.value, bodyBB, endBB);
2834 			Nucleus::setInsertBlock(bodyBB);
2835 
2836 			return true;
2837 		}
2838 
end()2839 		void end()
2840 		{
2841 			Nucleus::createBr(testBB);
2842 			Nucleus::setInsertBlock(endBB);
2843 		}
2844 
2845 	private:
2846 		BasicBlock *testBB = nullptr;
2847 		BasicBlock *endBB = nullptr;
2848 		bool loopOnce = true;
2849 	};
2850 
2851 	class IfElseData
2852 	{
2853 	public:
IfElseData(RValue<Bool> cmp)2854 		IfElseData(RValue<Bool> cmp) : iteration(0)
2855 		{
2856 			condition = cmp.value;
2857 
2858 			beginBB = Nucleus::getInsertBlock();
2859 			trueBB = Nucleus::createBasicBlock();
2860 			falseBB = nullptr;
2861 			endBB = Nucleus::createBasicBlock();
2862 
2863 			Nucleus::setInsertBlock(trueBB);
2864 		}
2865 
~IfElseData()2866 		~IfElseData()
2867 		{
2868 			Nucleus::createBr(endBB);
2869 
2870 			Nucleus::setInsertBlock(beginBB);
2871 			Nucleus::createCondBr(condition, trueBB, falseBB ? falseBB : endBB);
2872 
2873 			Nucleus::setInsertBlock(endBB);
2874 		}
2875 
operator int()2876 		operator int()
2877 		{
2878 			return iteration;
2879 		}
2880 
operator ++()2881 		IfElseData &operator++()
2882 		{
2883 			++iteration;
2884 
2885 			return *this;
2886 		}
2887 
elseClause()2888 		void elseClause()
2889 		{
2890 			Nucleus::createBr(endBB);
2891 
2892 			falseBB = Nucleus::createBasicBlock();
2893 			Nucleus::setInsertBlock(falseBB);
2894 		}
2895 
2896 	private:
2897 		Value *condition;
2898 		BasicBlock *beginBB;
2899 		BasicBlock *trueBB;
2900 		BasicBlock *falseBB;
2901 		BasicBlock *endBB;
2902 		int iteration;
2903 	};
2904 
2905 	#define For(init, cond, inc) \
2906 	for(ForData for__ = true; for__; for__ = false) \
2907 	for(init; for__.setup() && for__.test(cond); inc, for__.end())
2908 
2909 	#define While(cond) For((void)0, cond, (void)0)
2910 
2911 	#define Do                                            \
2912 	{                                                     \
2913 		BasicBlock *body__ = Nucleus::createBasicBlock(); \
2914 		Nucleus::createBr(body__);                        \
2915 		Nucleus::setInsertBlock(body__);
2916 
2917 	#define Until(cond)                                     \
2918 		BasicBlock *end__ = Nucleus::createBasicBlock();    \
2919 		Nucleus::createCondBr((cond).value, end__, body__); \
2920 		Nucleus::setInsertBlock(end__);                     \
2921 	}
2922 
2923 	enum {IF_BLOCK__, ELSE_CLAUSE__, ELSE_BLOCK__, IFELSE_NUM__};
2924 
2925 	#define If(cond)                                                    \
2926 	for(IfElseData ifElse__(cond); ifElse__ < IFELSE_NUM__; ++ifElse__) \
2927 	if(ifElse__ == IF_BLOCK__)
2928 
2929 	#define Else                       \
2930 	else if(ifElse__ == ELSE_CLAUSE__) \
2931 	{                                  \
2932 		 ifElse__.elseClause();        \
2933 	}                                  \
2934 	else   // ELSE_BLOCK__
2935 }
2936 
2937 #endif   // sw_Reactor_hpp
2938