1 // Copyright 2019 The SwiftShader Authors. All Rights Reserved.
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
7 // http://www.apache.org/licenses/LICENSE-2.0
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.
15 #include "Reactor.hpp"
17 // Define REACTOR_MATERIALIZE_LVALUES_ON_DEFINITION to non-zero to ensure all
18 // variables have a stack location obtained throuch alloca().
19 #ifndef REACTOR_MATERIALIZE_LVALUES_ON_DEFINITION
20 #define REACTOR_MATERIALIZE_LVALUES_ON_DEFINITION 0
25 // Set of variables that do not have a stack location yet.
26 std::unordered_set<Variable*> Variable::unmaterializedVariables;
28 Variable::Variable(Type *type, int arraySize) : type(type), arraySize(arraySize)
30 #if REACTOR_MATERIALIZE_LVALUES_ON_DEFINITION
33 unmaterializedVariables.emplace(this);
39 unmaterializedVariables.erase(this);
42 void Variable::materializeAll()
44 for(auto *var : unmaterializedVariables)
49 unmaterializedVariables.clear();
52 void Variable::killUnmaterialized()
54 unmaterializedVariables.clear();
57 static Value *createSwizzle4(Value *val, unsigned char select)
67 return Nucleus::createShuffleVector(val, val, swizzle);
70 static Value *createMask4(Value *lhs, Value *rhs, unsigned char select)
72 bool mask[4] = {false, false, false, false};
74 mask[(select >> 0) & 0x03] = true;
75 mask[(select >> 2) & 0x03] = true;
76 mask[(select >> 4) & 0x03] = true;
77 mask[(select >> 6) & 0x03] = true;
87 return Nucleus::createShuffleVector(lhs, rhs, swizzle);
90 Bool::Bool(Argument<Bool> argument)
92 storeValue(argument.value);
97 storeValue(Nucleus::createConstantBool(x));
100 Bool::Bool(RValue<Bool> rhs)
102 storeValue(rhs.value);
105 Bool::Bool(const Bool &rhs)
107 Value *value = rhs.loadValue();
111 Bool::Bool(const Reference<Bool> &rhs)
113 Value *value = rhs.loadValue();
117 RValue<Bool> Bool::operator=(RValue<Bool> rhs)
119 storeValue(rhs.value);
124 RValue<Bool> Bool::operator=(const Bool &rhs)
126 Value *value = rhs.loadValue();
129 return RValue<Bool>(value);
132 RValue<Bool> Bool::operator=(const Reference<Bool> &rhs)
134 Value *value = rhs.loadValue();
137 return RValue<Bool>(value);
140 RValue<Bool> operator!(RValue<Bool> val)
142 return RValue<Bool>(Nucleus::createNot(val.value));
145 RValue<Bool> operator&&(RValue<Bool> lhs, RValue<Bool> rhs)
147 return RValue<Bool>(Nucleus::createAnd(lhs.value, rhs.value));
150 RValue<Bool> operator||(RValue<Bool> lhs, RValue<Bool> rhs)
152 return RValue<Bool>(Nucleus::createOr(lhs.value, rhs.value));
155 RValue<Bool> operator!=(RValue<Bool> lhs, RValue<Bool> rhs)
157 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
160 RValue<Bool> operator==(RValue<Bool> lhs, RValue<Bool> rhs)
162 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
165 Byte::Byte(Argument<Byte> argument)
167 storeValue(argument.value);
170 Byte::Byte(RValue<Int> cast)
172 Value *integer = Nucleus::createTrunc(cast.value, Byte::getType());
177 Byte::Byte(RValue<UInt> cast)
179 Value *integer = Nucleus::createTrunc(cast.value, Byte::getType());
184 Byte::Byte(RValue<UShort> cast)
186 Value *integer = Nucleus::createTrunc(cast.value, Byte::getType());
193 storeValue(Nucleus::createConstantByte((unsigned char)x));
196 Byte::Byte(unsigned char x)
198 storeValue(Nucleus::createConstantByte(x));
201 Byte::Byte(RValue<Byte> rhs)
203 storeValue(rhs.value);
206 Byte::Byte(const Byte &rhs)
208 Value *value = rhs.loadValue();
212 Byte::Byte(const Reference<Byte> &rhs)
214 Value *value = rhs.loadValue();
218 RValue<Byte> Byte::operator=(RValue<Byte> rhs)
220 storeValue(rhs.value);
225 RValue<Byte> Byte::operator=(const Byte &rhs)
227 Value *value = rhs.loadValue();
230 return RValue<Byte>(value);
233 RValue<Byte> Byte::operator=(const Reference<Byte> &rhs)
235 Value *value = rhs.loadValue();
238 return RValue<Byte>(value);
241 RValue<Byte> operator+(RValue<Byte> lhs, RValue<Byte> rhs)
243 return RValue<Byte>(Nucleus::createAdd(lhs.value, rhs.value));
246 RValue<Byte> operator-(RValue<Byte> lhs, RValue<Byte> rhs)
248 return RValue<Byte>(Nucleus::createSub(lhs.value, rhs.value));
251 RValue<Byte> operator*(RValue<Byte> lhs, RValue<Byte> rhs)
253 return RValue<Byte>(Nucleus::createMul(lhs.value, rhs.value));
256 RValue<Byte> operator/(RValue<Byte> lhs, RValue<Byte> rhs)
258 return RValue<Byte>(Nucleus::createUDiv(lhs.value, rhs.value));
261 RValue<Byte> operator%(RValue<Byte> lhs, RValue<Byte> rhs)
263 return RValue<Byte>(Nucleus::createURem(lhs.value, rhs.value));
266 RValue<Byte> operator&(RValue<Byte> lhs, RValue<Byte> rhs)
268 return RValue<Byte>(Nucleus::createAnd(lhs.value, rhs.value));
271 RValue<Byte> operator|(RValue<Byte> lhs, RValue<Byte> rhs)
273 return RValue<Byte>(Nucleus::createOr(lhs.value, rhs.value));
276 RValue<Byte> operator^(RValue<Byte> lhs, RValue<Byte> rhs)
278 return RValue<Byte>(Nucleus::createXor(lhs.value, rhs.value));
281 RValue<Byte> operator<<(RValue<Byte> lhs, RValue<Byte> rhs)
283 return RValue<Byte>(Nucleus::createShl(lhs.value, rhs.value));
286 RValue<Byte> operator>>(RValue<Byte> lhs, RValue<Byte> rhs)
288 return RValue<Byte>(Nucleus::createLShr(lhs.value, rhs.value));
291 RValue<Byte> operator+=(Byte &lhs, RValue<Byte> rhs)
293 return lhs = lhs + rhs;
296 RValue<Byte> operator-=(Byte &lhs, RValue<Byte> rhs)
298 return lhs = lhs - rhs;
301 RValue<Byte> operator*=(Byte &lhs, RValue<Byte> rhs)
303 return lhs = lhs * rhs;
306 RValue<Byte> operator/=(Byte &lhs, RValue<Byte> rhs)
308 return lhs = lhs / rhs;
311 RValue<Byte> operator%=(Byte &lhs, RValue<Byte> rhs)
313 return lhs = lhs % rhs;
316 RValue<Byte> operator&=(Byte &lhs, RValue<Byte> rhs)
318 return lhs = lhs & rhs;
321 RValue<Byte> operator|=(Byte &lhs, RValue<Byte> rhs)
323 return lhs = lhs | rhs;
326 RValue<Byte> operator^=(Byte &lhs, RValue<Byte> rhs)
328 return lhs = lhs ^ rhs;
331 RValue<Byte> operator<<=(Byte &lhs, RValue<Byte> rhs)
333 return lhs = lhs << rhs;
336 RValue<Byte> operator>>=(Byte &lhs, RValue<Byte> rhs)
338 return lhs = lhs >> rhs;
341 RValue<Byte> operator+(RValue<Byte> val)
346 RValue<Byte> operator-(RValue<Byte> val)
348 return RValue<Byte>(Nucleus::createNeg(val.value));
351 RValue<Byte> operator~(RValue<Byte> val)
353 return RValue<Byte>(Nucleus::createNot(val.value));
356 RValue<Byte> operator++(Byte &val, int) // Post-increment
358 RValue<Byte> res = val;
360 Value *inc = Nucleus::createAdd(res.value, Nucleus::createConstantByte((unsigned char)1));
366 const Byte &operator++(Byte &val) // Pre-increment
368 Value *inc = Nucleus::createAdd(val.loadValue(), Nucleus::createConstantByte((unsigned char)1));
374 RValue<Byte> operator--(Byte &val, int) // Post-decrement
376 RValue<Byte> res = val;
378 Value *inc = Nucleus::createSub(res.value, Nucleus::createConstantByte((unsigned char)1));
384 const Byte &operator--(Byte &val) // Pre-decrement
386 Value *inc = Nucleus::createSub(val.loadValue(), Nucleus::createConstantByte((unsigned char)1));
392 RValue<Bool> operator<(RValue<Byte> lhs, RValue<Byte> rhs)
394 return RValue<Bool>(Nucleus::createICmpULT(lhs.value, rhs.value));
397 RValue<Bool> operator<=(RValue<Byte> lhs, RValue<Byte> rhs)
399 return RValue<Bool>(Nucleus::createICmpULE(lhs.value, rhs.value));
402 RValue<Bool> operator>(RValue<Byte> lhs, RValue<Byte> rhs)
404 return RValue<Bool>(Nucleus::createICmpUGT(lhs.value, rhs.value));
407 RValue<Bool> operator>=(RValue<Byte> lhs, RValue<Byte> rhs)
409 return RValue<Bool>(Nucleus::createICmpUGE(lhs.value, rhs.value));
412 RValue<Bool> operator!=(RValue<Byte> lhs, RValue<Byte> rhs)
414 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
417 RValue<Bool> operator==(RValue<Byte> lhs, RValue<Byte> rhs)
419 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
422 SByte::SByte(Argument<SByte> argument)
424 storeValue(argument.value);
427 SByte::SByte(RValue<Int> cast)
429 Value *integer = Nucleus::createTrunc(cast.value, SByte::getType());
434 SByte::SByte(RValue<Short> cast)
436 Value *integer = Nucleus::createTrunc(cast.value, SByte::getType());
441 SByte::SByte(signed char x)
443 storeValue(Nucleus::createConstantByte(x));
446 SByte::SByte(RValue<SByte> rhs)
448 storeValue(rhs.value);
451 SByte::SByte(const SByte &rhs)
453 Value *value = rhs.loadValue();
457 SByte::SByte(const Reference<SByte> &rhs)
459 Value *value = rhs.loadValue();
463 RValue<SByte> SByte::operator=(RValue<SByte> rhs)
465 storeValue(rhs.value);
470 RValue<SByte> SByte::operator=(const SByte &rhs)
472 Value *value = rhs.loadValue();
475 return RValue<SByte>(value);
478 RValue<SByte> SByte::operator=(const Reference<SByte> &rhs)
480 Value *value = rhs.loadValue();
483 return RValue<SByte>(value);
486 RValue<SByte> operator+(RValue<SByte> lhs, RValue<SByte> rhs)
488 return RValue<SByte>(Nucleus::createAdd(lhs.value, rhs.value));
491 RValue<SByte> operator-(RValue<SByte> lhs, RValue<SByte> rhs)
493 return RValue<SByte>(Nucleus::createSub(lhs.value, rhs.value));
496 RValue<SByte> operator*(RValue<SByte> lhs, RValue<SByte> rhs)
498 return RValue<SByte>(Nucleus::createMul(lhs.value, rhs.value));
501 RValue<SByte> operator/(RValue<SByte> lhs, RValue<SByte> rhs)
503 return RValue<SByte>(Nucleus::createSDiv(lhs.value, rhs.value));
506 RValue<SByte> operator%(RValue<SByte> lhs, RValue<SByte> rhs)
508 return RValue<SByte>(Nucleus::createSRem(lhs.value, rhs.value));
511 RValue<SByte> operator&(RValue<SByte> lhs, RValue<SByte> rhs)
513 return RValue<SByte>(Nucleus::createAnd(lhs.value, rhs.value));
516 RValue<SByte> operator|(RValue<SByte> lhs, RValue<SByte> rhs)
518 return RValue<SByte>(Nucleus::createOr(lhs.value, rhs.value));
521 RValue<SByte> operator^(RValue<SByte> lhs, RValue<SByte> rhs)
523 return RValue<SByte>(Nucleus::createXor(lhs.value, rhs.value));
526 RValue<SByte> operator<<(RValue<SByte> lhs, RValue<SByte> rhs)
528 return RValue<SByte>(Nucleus::createShl(lhs.value, rhs.value));
531 RValue<SByte> operator>>(RValue<SByte> lhs, RValue<SByte> rhs)
533 return RValue<SByte>(Nucleus::createAShr(lhs.value, rhs.value));
536 RValue<SByte> operator+=(SByte &lhs, RValue<SByte> rhs)
538 return lhs = lhs + rhs;
541 RValue<SByte> operator-=(SByte &lhs, RValue<SByte> rhs)
543 return lhs = lhs - rhs;
546 RValue<SByte> operator*=(SByte &lhs, RValue<SByte> rhs)
548 return lhs = lhs * rhs;
551 RValue<SByte> operator/=(SByte &lhs, RValue<SByte> rhs)
553 return lhs = lhs / rhs;
556 RValue<SByte> operator%=(SByte &lhs, RValue<SByte> rhs)
558 return lhs = lhs % rhs;
561 RValue<SByte> operator&=(SByte &lhs, RValue<SByte> rhs)
563 return lhs = lhs & rhs;
566 RValue<SByte> operator|=(SByte &lhs, RValue<SByte> rhs)
568 return lhs = lhs | rhs;
571 RValue<SByte> operator^=(SByte &lhs, RValue<SByte> rhs)
573 return lhs = lhs ^ rhs;
576 RValue<SByte> operator<<=(SByte &lhs, RValue<SByte> rhs)
578 return lhs = lhs << rhs;
581 RValue<SByte> operator>>=(SByte &lhs, RValue<SByte> rhs)
583 return lhs = lhs >> rhs;
586 RValue<SByte> operator+(RValue<SByte> val)
591 RValue<SByte> operator-(RValue<SByte> val)
593 return RValue<SByte>(Nucleus::createNeg(val.value));
596 RValue<SByte> operator~(RValue<SByte> val)
598 return RValue<SByte>(Nucleus::createNot(val.value));
601 RValue<SByte> operator++(SByte &val, int) // Post-increment
603 RValue<SByte> res = val;
605 Value *inc = Nucleus::createAdd(res.value, Nucleus::createConstantByte((signed char)1));
611 const SByte &operator++(SByte &val) // Pre-increment
613 Value *inc = Nucleus::createAdd(val.loadValue(), Nucleus::createConstantByte((signed char)1));
619 RValue<SByte> operator--(SByte &val, int) // Post-decrement
621 RValue<SByte> res = val;
623 Value *inc = Nucleus::createSub(res.value, Nucleus::createConstantByte((signed char)1));
629 const SByte &operator--(SByte &val) // Pre-decrement
631 Value *inc = Nucleus::createSub(val.loadValue(), Nucleus::createConstantByte((signed char)1));
637 RValue<Bool> operator<(RValue<SByte> lhs, RValue<SByte> rhs)
639 return RValue<Bool>(Nucleus::createICmpSLT(lhs.value, rhs.value));
642 RValue<Bool> operator<=(RValue<SByte> lhs, RValue<SByte> rhs)
644 return RValue<Bool>(Nucleus::createICmpSLE(lhs.value, rhs.value));
647 RValue<Bool> operator>(RValue<SByte> lhs, RValue<SByte> rhs)
649 return RValue<Bool>(Nucleus::createICmpSGT(lhs.value, rhs.value));
652 RValue<Bool> operator>=(RValue<SByte> lhs, RValue<SByte> rhs)
654 return RValue<Bool>(Nucleus::createICmpSGE(lhs.value, rhs.value));
657 RValue<Bool> operator!=(RValue<SByte> lhs, RValue<SByte> rhs)
659 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
662 RValue<Bool> operator==(RValue<SByte> lhs, RValue<SByte> rhs)
664 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
667 Short::Short(Argument<Short> argument)
669 storeValue(argument.value);
672 Short::Short(RValue<Int> cast)
674 Value *integer = Nucleus::createTrunc(cast.value, Short::getType());
679 Short::Short(short x)
681 storeValue(Nucleus::createConstantShort(x));
684 Short::Short(RValue<Short> rhs)
686 storeValue(rhs.value);
689 Short::Short(const Short &rhs)
691 Value *value = rhs.loadValue();
695 Short::Short(const Reference<Short> &rhs)
697 Value *value = rhs.loadValue();
701 RValue<Short> Short::operator=(RValue<Short> rhs)
703 storeValue(rhs.value);
708 RValue<Short> Short::operator=(const Short &rhs)
710 Value *value = rhs.loadValue();
713 return RValue<Short>(value);
716 RValue<Short> Short::operator=(const Reference<Short> &rhs)
718 Value *value = rhs.loadValue();
721 return RValue<Short>(value);
724 RValue<Short> operator+(RValue<Short> lhs, RValue<Short> rhs)
726 return RValue<Short>(Nucleus::createAdd(lhs.value, rhs.value));
729 RValue<Short> operator-(RValue<Short> lhs, RValue<Short> rhs)
731 return RValue<Short>(Nucleus::createSub(lhs.value, rhs.value));
734 RValue<Short> operator*(RValue<Short> lhs, RValue<Short> rhs)
736 return RValue<Short>(Nucleus::createMul(lhs.value, rhs.value));
739 RValue<Short> operator/(RValue<Short> lhs, RValue<Short> rhs)
741 return RValue<Short>(Nucleus::createSDiv(lhs.value, rhs.value));
744 RValue<Short> operator%(RValue<Short> lhs, RValue<Short> rhs)
746 return RValue<Short>(Nucleus::createSRem(lhs.value, rhs.value));
749 RValue<Short> operator&(RValue<Short> lhs, RValue<Short> rhs)
751 return RValue<Short>(Nucleus::createAnd(lhs.value, rhs.value));
754 RValue<Short> operator|(RValue<Short> lhs, RValue<Short> rhs)
756 return RValue<Short>(Nucleus::createOr(lhs.value, rhs.value));
759 RValue<Short> operator^(RValue<Short> lhs, RValue<Short> rhs)
761 return RValue<Short>(Nucleus::createXor(lhs.value, rhs.value));
764 RValue<Short> operator<<(RValue<Short> lhs, RValue<Short> rhs)
766 return RValue<Short>(Nucleus::createShl(lhs.value, rhs.value));
769 RValue<Short> operator>>(RValue<Short> lhs, RValue<Short> rhs)
771 return RValue<Short>(Nucleus::createAShr(lhs.value, rhs.value));
774 RValue<Short> operator+=(Short &lhs, RValue<Short> rhs)
776 return lhs = lhs + rhs;
779 RValue<Short> operator-=(Short &lhs, RValue<Short> rhs)
781 return lhs = lhs - rhs;
784 RValue<Short> operator*=(Short &lhs, RValue<Short> rhs)
786 return lhs = lhs * rhs;
789 RValue<Short> operator/=(Short &lhs, RValue<Short> rhs)
791 return lhs = lhs / rhs;
794 RValue<Short> operator%=(Short &lhs, RValue<Short> rhs)
796 return lhs = lhs % rhs;
799 RValue<Short> operator&=(Short &lhs, RValue<Short> rhs)
801 return lhs = lhs & rhs;
804 RValue<Short> operator|=(Short &lhs, RValue<Short> rhs)
806 return lhs = lhs | rhs;
809 RValue<Short> operator^=(Short &lhs, RValue<Short> rhs)
811 return lhs = lhs ^ rhs;
814 RValue<Short> operator<<=(Short &lhs, RValue<Short> rhs)
816 return lhs = lhs << rhs;
819 RValue<Short> operator>>=(Short &lhs, RValue<Short> rhs)
821 return lhs = lhs >> rhs;
824 RValue<Short> operator+(RValue<Short> val)
829 RValue<Short> operator-(RValue<Short> val)
831 return RValue<Short>(Nucleus::createNeg(val.value));
834 RValue<Short> operator~(RValue<Short> val)
836 return RValue<Short>(Nucleus::createNot(val.value));
839 RValue<Short> operator++(Short &val, int) // Post-increment
841 RValue<Short> res = val;
843 Value *inc = Nucleus::createAdd(res.value, Nucleus::createConstantShort((short)1));
849 const Short &operator++(Short &val) // Pre-increment
851 Value *inc = Nucleus::createAdd(val.loadValue(), Nucleus::createConstantShort((short)1));
857 RValue<Short> operator--(Short &val, int) // Post-decrement
859 RValue<Short> res = val;
861 Value *inc = Nucleus::createSub(res.value, Nucleus::createConstantShort((short)1));
867 const Short &operator--(Short &val) // Pre-decrement
869 Value *inc = Nucleus::createSub(val.loadValue(), Nucleus::createConstantShort((short)1));
875 RValue<Bool> operator<(RValue<Short> lhs, RValue<Short> rhs)
877 return RValue<Bool>(Nucleus::createICmpSLT(lhs.value, rhs.value));
880 RValue<Bool> operator<=(RValue<Short> lhs, RValue<Short> rhs)
882 return RValue<Bool>(Nucleus::createICmpSLE(lhs.value, rhs.value));
885 RValue<Bool> operator>(RValue<Short> lhs, RValue<Short> rhs)
887 return RValue<Bool>(Nucleus::createICmpSGT(lhs.value, rhs.value));
890 RValue<Bool> operator>=(RValue<Short> lhs, RValue<Short> rhs)
892 return RValue<Bool>(Nucleus::createICmpSGE(lhs.value, rhs.value));
895 RValue<Bool> operator!=(RValue<Short> lhs, RValue<Short> rhs)
897 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
900 RValue<Bool> operator==(RValue<Short> lhs, RValue<Short> rhs)
902 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
905 UShort::UShort(Argument<UShort> argument)
907 storeValue(argument.value);
910 UShort::UShort(RValue<UInt> cast)
912 Value *integer = Nucleus::createTrunc(cast.value, UShort::getType());
917 UShort::UShort(RValue<Int> cast)
919 Value *integer = Nucleus::createTrunc(cast.value, UShort::getType());
924 UShort::UShort(unsigned short x)
926 storeValue(Nucleus::createConstantShort(x));
929 UShort::UShort(RValue<UShort> rhs)
931 storeValue(rhs.value);
934 UShort::UShort(const UShort &rhs)
936 Value *value = rhs.loadValue();
940 UShort::UShort(const Reference<UShort> &rhs)
942 Value *value = rhs.loadValue();
946 RValue<UShort> UShort::operator=(RValue<UShort> rhs)
948 storeValue(rhs.value);
953 RValue<UShort> UShort::operator=(const UShort &rhs)
955 Value *value = rhs.loadValue();
958 return RValue<UShort>(value);
961 RValue<UShort> UShort::operator=(const Reference<UShort> &rhs)
963 Value *value = rhs.loadValue();
966 return RValue<UShort>(value);
969 RValue<UShort> operator+(RValue<UShort> lhs, RValue<UShort> rhs)
971 return RValue<UShort>(Nucleus::createAdd(lhs.value, rhs.value));
974 RValue<UShort> operator-(RValue<UShort> lhs, RValue<UShort> rhs)
976 return RValue<UShort>(Nucleus::createSub(lhs.value, rhs.value));
979 RValue<UShort> operator*(RValue<UShort> lhs, RValue<UShort> rhs)
981 return RValue<UShort>(Nucleus::createMul(lhs.value, rhs.value));
984 RValue<UShort> operator/(RValue<UShort> lhs, RValue<UShort> rhs)
986 return RValue<UShort>(Nucleus::createUDiv(lhs.value, rhs.value));
989 RValue<UShort> operator%(RValue<UShort> lhs, RValue<UShort> rhs)
991 return RValue<UShort>(Nucleus::createURem(lhs.value, rhs.value));
994 RValue<UShort> operator&(RValue<UShort> lhs, RValue<UShort> rhs)
996 return RValue<UShort>(Nucleus::createAnd(lhs.value, rhs.value));
999 RValue<UShort> operator|(RValue<UShort> lhs, RValue<UShort> rhs)
1001 return RValue<UShort>(Nucleus::createOr(lhs.value, rhs.value));
1004 RValue<UShort> operator^(RValue<UShort> lhs, RValue<UShort> rhs)
1006 return RValue<UShort>(Nucleus::createXor(lhs.value, rhs.value));
1009 RValue<UShort> operator<<(RValue<UShort> lhs, RValue<UShort> rhs)
1011 return RValue<UShort>(Nucleus::createShl(lhs.value, rhs.value));
1014 RValue<UShort> operator>>(RValue<UShort> lhs, RValue<UShort> rhs)
1016 return RValue<UShort>(Nucleus::createLShr(lhs.value, rhs.value));
1019 RValue<UShort> operator+=(UShort &lhs, RValue<UShort> rhs)
1021 return lhs = lhs + rhs;
1024 RValue<UShort> operator-=(UShort &lhs, RValue<UShort> rhs)
1026 return lhs = lhs - rhs;
1029 RValue<UShort> operator*=(UShort &lhs, RValue<UShort> rhs)
1031 return lhs = lhs * rhs;
1034 RValue<UShort> operator/=(UShort &lhs, RValue<UShort> rhs)
1036 return lhs = lhs / rhs;
1039 RValue<UShort> operator%=(UShort &lhs, RValue<UShort> rhs)
1041 return lhs = lhs % rhs;
1044 RValue<UShort> operator&=(UShort &lhs, RValue<UShort> rhs)
1046 return lhs = lhs & rhs;
1049 RValue<UShort> operator|=(UShort &lhs, RValue<UShort> rhs)
1051 return lhs = lhs | rhs;
1054 RValue<UShort> operator^=(UShort &lhs, RValue<UShort> rhs)
1056 return lhs = lhs ^ rhs;
1059 RValue<UShort> operator<<=(UShort &lhs, RValue<UShort> rhs)
1061 return lhs = lhs << rhs;
1064 RValue<UShort> operator>>=(UShort &lhs, RValue<UShort> rhs)
1066 return lhs = lhs >> rhs;
1069 RValue<UShort> operator+(RValue<UShort> val)
1074 RValue<UShort> operator-(RValue<UShort> val)
1076 return RValue<UShort>(Nucleus::createNeg(val.value));
1079 RValue<UShort> operator~(RValue<UShort> val)
1081 return RValue<UShort>(Nucleus::createNot(val.value));
1084 RValue<UShort> operator++(UShort &val, int) // Post-increment
1086 RValue<UShort> res = val;
1088 Value *inc = Nucleus::createAdd(res.value, Nucleus::createConstantShort((unsigned short)1));
1089 val.storeValue(inc);
1094 const UShort &operator++(UShort &val) // Pre-increment
1096 Value *inc = Nucleus::createAdd(val.loadValue(), Nucleus::createConstantShort((unsigned short)1));
1097 val.storeValue(inc);
1102 RValue<UShort> operator--(UShort &val, int) // Post-decrement
1104 RValue<UShort> res = val;
1106 Value *inc = Nucleus::createSub(res.value, Nucleus::createConstantShort((unsigned short)1));
1107 val.storeValue(inc);
1112 const UShort &operator--(UShort &val) // Pre-decrement
1114 Value *inc = Nucleus::createSub(val.loadValue(), Nucleus::createConstantShort((unsigned short)1));
1115 val.storeValue(inc);
1120 RValue<Bool> operator<(RValue<UShort> lhs, RValue<UShort> rhs)
1122 return RValue<Bool>(Nucleus::createICmpULT(lhs.value, rhs.value));
1125 RValue<Bool> operator<=(RValue<UShort> lhs, RValue<UShort> rhs)
1127 return RValue<Bool>(Nucleus::createICmpULE(lhs.value, rhs.value));
1130 RValue<Bool> operator>(RValue<UShort> lhs, RValue<UShort> rhs)
1132 return RValue<Bool>(Nucleus::createICmpUGT(lhs.value, rhs.value));
1135 RValue<Bool> operator>=(RValue<UShort> lhs, RValue<UShort> rhs)
1137 return RValue<Bool>(Nucleus::createICmpUGE(lhs.value, rhs.value));
1140 RValue<Bool> operator!=(RValue<UShort> lhs, RValue<UShort> rhs)
1142 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
1145 RValue<Bool> operator==(RValue<UShort> lhs, RValue<UShort> rhs)
1147 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
1150 Byte4::Byte4(RValue<Byte8> cast)
1152 storeValue(Nucleus::createBitCast(cast.value, getType()));
1155 Byte4::Byte4(const Reference<Byte4> &rhs)
1157 Value *value = rhs.loadValue();
1161 Byte8::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)
1163 int64_t constantVector[8] = {x0, x1, x2, x3, x4, x5, x6, x7};
1164 storeValue(Nucleus::createConstantVector(constantVector, getType()));
1167 Byte8::Byte8(RValue<Byte8> rhs)
1169 storeValue(rhs.value);
1172 Byte8::Byte8(const Byte8 &rhs)
1174 Value *value = rhs.loadValue();
1178 Byte8::Byte8(const Reference<Byte8> &rhs)
1180 Value *value = rhs.loadValue();
1184 RValue<Byte8> Byte8::operator=(RValue<Byte8> rhs)
1186 storeValue(rhs.value);
1191 RValue<Byte8> Byte8::operator=(const Byte8 &rhs)
1193 Value *value = rhs.loadValue();
1196 return RValue<Byte8>(value);
1199 RValue<Byte8> Byte8::operator=(const Reference<Byte8> &rhs)
1201 Value *value = rhs.loadValue();
1204 return RValue<Byte8>(value);
1207 RValue<Byte8> operator+(RValue<Byte8> lhs, RValue<Byte8> rhs)
1209 return RValue<Byte8>(Nucleus::createAdd(lhs.value, rhs.value));
1212 RValue<Byte8> operator-(RValue<Byte8> lhs, RValue<Byte8> rhs)
1214 return RValue<Byte8>(Nucleus::createSub(lhs.value, rhs.value));
1217 // RValue<Byte8> operator*(RValue<Byte8> lhs, RValue<Byte8> rhs)
1219 // return RValue<Byte8>(Nucleus::createMul(lhs.value, rhs.value));
1222 // RValue<Byte8> operator/(RValue<Byte8> lhs, RValue<Byte8> rhs)
1224 // return RValue<Byte8>(Nucleus::createUDiv(lhs.value, rhs.value));
1227 // RValue<Byte8> operator%(RValue<Byte8> lhs, RValue<Byte8> rhs)
1229 // return RValue<Byte8>(Nucleus::createURem(lhs.value, rhs.value));
1232 RValue<Byte8> operator&(RValue<Byte8> lhs, RValue<Byte8> rhs)
1234 return RValue<Byte8>(Nucleus::createAnd(lhs.value, rhs.value));
1237 RValue<Byte8> operator|(RValue<Byte8> lhs, RValue<Byte8> rhs)
1239 return RValue<Byte8>(Nucleus::createOr(lhs.value, rhs.value));
1242 RValue<Byte8> operator^(RValue<Byte8> lhs, RValue<Byte8> rhs)
1244 return RValue<Byte8>(Nucleus::createXor(lhs.value, rhs.value));
1247 // RValue<Byte8> operator<<(RValue<Byte8> lhs, unsigned char rhs)
1249 // return RValue<Byte8>(Nucleus::createShl(lhs.value, rhs.value));
1252 // RValue<Byte8> operator>>(RValue<Byte8> lhs, unsigned char rhs)
1254 // return RValue<Byte8>(Nucleus::createLShr(lhs.value, rhs.value));
1257 RValue<Byte8> operator+=(Byte8 &lhs, RValue<Byte8> rhs)
1259 return lhs = lhs + rhs;
1262 RValue<Byte8> operator-=(Byte8 &lhs, RValue<Byte8> rhs)
1264 return lhs = lhs - rhs;
1267 // RValue<Byte8> operator*=(Byte8 &lhs, RValue<Byte8> rhs)
1269 // return lhs = lhs * rhs;
1272 // RValue<Byte8> operator/=(Byte8 &lhs, RValue<Byte8> rhs)
1274 // return lhs = lhs / rhs;
1277 // RValue<Byte8> operator%=(Byte8 &lhs, RValue<Byte8> rhs)
1279 // return lhs = lhs % rhs;
1282 RValue<Byte8> operator&=(Byte8 &lhs, RValue<Byte8> rhs)
1284 return lhs = lhs & rhs;
1287 RValue<Byte8> operator|=(Byte8 &lhs, RValue<Byte8> rhs)
1289 return lhs = lhs | rhs;
1292 RValue<Byte8> operator^=(Byte8 &lhs, RValue<Byte8> rhs)
1294 return lhs = lhs ^ rhs;
1297 // RValue<Byte8> operator<<=(Byte8 &lhs, RValue<Byte8> rhs)
1299 // return lhs = lhs << rhs;
1302 // RValue<Byte8> operator>>=(Byte8 &lhs, RValue<Byte8> rhs)
1304 // return lhs = lhs >> rhs;
1307 // RValue<Byte8> operator+(RValue<Byte8> val)
1312 // RValue<Byte8> operator-(RValue<Byte8> val)
1314 // return RValue<Byte8>(Nucleus::createNeg(val.value));
1317 RValue<Byte8> operator~(RValue<Byte8> val)
1319 return RValue<Byte8>(Nucleus::createNot(val.value));
1322 RValue<Short4> Unpack(RValue<Byte4> x)
1324 int shuffle[16] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7}; // Real type is v16i8
1325 return As<Short4>(Nucleus::createShuffleVector(x.value, x.value, shuffle));
1328 RValue<Short4> Unpack(RValue<Byte4> x, RValue<Byte4> y)
1330 return UnpackLow(As<Byte8>(x), As<Byte8>(y));
1333 RValue<Short4> UnpackLow(RValue<Byte8> x, RValue<Byte8> y)
1335 int shuffle[16] = {0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23}; // Real type is v16i8
1336 return As<Short4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
1339 RValue<Short4> UnpackHigh(RValue<Byte8> x, RValue<Byte8> y)
1341 int shuffle[16] = {0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23}; // Real type is v16i8
1342 auto lowHigh = RValue<Byte16>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
1343 return As<Short4>(Swizzle(As<Int4>(lowHigh), 0xEE));
1346 SByte8::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)
1348 int64_t constantVector[8] = {x0, x1, x2, x3, x4, x5, x6, x7};
1349 Value *vector = Nucleus::createConstantVector(constantVector, getType());
1351 storeValue(Nucleus::createBitCast(vector, getType()));
1354 SByte8::SByte8(RValue<SByte8> rhs)
1356 storeValue(rhs.value);
1359 SByte8::SByte8(const SByte8 &rhs)
1361 Value *value = rhs.loadValue();
1365 SByte8::SByte8(const Reference<SByte8> &rhs)
1367 Value *value = rhs.loadValue();
1371 RValue<SByte8> SByte8::operator=(RValue<SByte8> rhs)
1373 storeValue(rhs.value);
1378 RValue<SByte8> SByte8::operator=(const SByte8 &rhs)
1380 Value *value = rhs.loadValue();
1383 return RValue<SByte8>(value);
1386 RValue<SByte8> SByte8::operator=(const Reference<SByte8> &rhs)
1388 Value *value = rhs.loadValue();
1391 return RValue<SByte8>(value);
1394 RValue<SByte8> operator+(RValue<SByte8> lhs, RValue<SByte8> rhs)
1396 return RValue<SByte8>(Nucleus::createAdd(lhs.value, rhs.value));
1399 RValue<SByte8> operator-(RValue<SByte8> lhs, RValue<SByte8> rhs)
1401 return RValue<SByte8>(Nucleus::createSub(lhs.value, rhs.value));
1404 // RValue<SByte8> operator*(RValue<SByte8> lhs, RValue<SByte8> rhs)
1406 // return RValue<SByte8>(Nucleus::createMul(lhs.value, rhs.value));
1409 // RValue<SByte8> operator/(RValue<SByte8> lhs, RValue<SByte8> rhs)
1411 // return RValue<SByte8>(Nucleus::createSDiv(lhs.value, rhs.value));
1414 // RValue<SByte8> operator%(RValue<SByte8> lhs, RValue<SByte8> rhs)
1416 // return RValue<SByte8>(Nucleus::createSRem(lhs.value, rhs.value));
1419 RValue<SByte8> operator&(RValue<SByte8> lhs, RValue<SByte8> rhs)
1421 return RValue<SByte8>(Nucleus::createAnd(lhs.value, rhs.value));
1424 RValue<SByte8> operator|(RValue<SByte8> lhs, RValue<SByte8> rhs)
1426 return RValue<SByte8>(Nucleus::createOr(lhs.value, rhs.value));
1429 RValue<SByte8> operator^(RValue<SByte8> lhs, RValue<SByte8> rhs)
1431 return RValue<SByte8>(Nucleus::createXor(lhs.value, rhs.value));
1434 // RValue<SByte8> operator<<(RValue<SByte8> lhs, unsigned char rhs)
1436 // return RValue<SByte8>(Nucleus::createShl(lhs.value, rhs.value));
1439 // RValue<SByte8> operator>>(RValue<SByte8> lhs, unsigned char rhs)
1441 // return RValue<SByte8>(Nucleus::createAShr(lhs.value, rhs.value));
1444 RValue<SByte8> operator+=(SByte8 &lhs, RValue<SByte8> rhs)
1446 return lhs = lhs + rhs;
1449 RValue<SByte8> operator-=(SByte8 &lhs, RValue<SByte8> rhs)
1451 return lhs = lhs - rhs;
1454 // RValue<SByte8> operator*=(SByte8 &lhs, RValue<SByte8> rhs)
1456 // return lhs = lhs * rhs;
1459 // RValue<SByte8> operator/=(SByte8 &lhs, RValue<SByte8> rhs)
1461 // return lhs = lhs / rhs;
1464 // RValue<SByte8> operator%=(SByte8 &lhs, RValue<SByte8> rhs)
1466 // return lhs = lhs % rhs;
1469 RValue<SByte8> operator&=(SByte8 &lhs, RValue<SByte8> rhs)
1471 return lhs = lhs & rhs;
1474 RValue<SByte8> operator|=(SByte8 &lhs, RValue<SByte8> rhs)
1476 return lhs = lhs | rhs;
1479 RValue<SByte8> operator^=(SByte8 &lhs, RValue<SByte8> rhs)
1481 return lhs = lhs ^ rhs;
1484 // RValue<SByte8> operator<<=(SByte8 &lhs, RValue<SByte8> rhs)
1486 // return lhs = lhs << rhs;
1489 // RValue<SByte8> operator>>=(SByte8 &lhs, RValue<SByte8> rhs)
1491 // return lhs = lhs >> rhs;
1494 // RValue<SByte8> operator+(RValue<SByte8> val)
1499 // RValue<SByte8> operator-(RValue<SByte8> val)
1501 // return RValue<SByte8>(Nucleus::createNeg(val.value));
1504 RValue<SByte8> operator~(RValue<SByte8> val)
1506 return RValue<SByte8>(Nucleus::createNot(val.value));
1509 RValue<Short4> UnpackLow(RValue<SByte8> x, RValue<SByte8> y)
1511 int shuffle[16] = {0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23}; // Real type is v16i8
1512 return As<Short4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
1515 RValue<Short4> UnpackHigh(RValue<SByte8> x, RValue<SByte8> y)
1517 int shuffle[16] = {0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23}; // Real type is v16i8
1518 auto lowHigh = RValue<Byte16>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
1519 return As<Short4>(Swizzle(As<Int4>(lowHigh), 0xEE));
1522 Byte16::Byte16(RValue<Byte16> rhs)
1524 storeValue(rhs.value);
1527 Byte16::Byte16(const Byte16 &rhs)
1529 Value *value = rhs.loadValue();
1533 Byte16::Byte16(const Reference<Byte16> &rhs)
1535 Value *value = rhs.loadValue();
1539 RValue<Byte16> Byte16::operator=(RValue<Byte16> rhs)
1541 storeValue(rhs.value);
1546 RValue<Byte16> Byte16::operator=(const Byte16 &rhs)
1548 Value *value = rhs.loadValue();
1551 return RValue<Byte16>(value);
1554 RValue<Byte16> Byte16::operator=(const Reference<Byte16> &rhs)
1556 Value *value = rhs.loadValue();
1559 return RValue<Byte16>(value);
1562 Short2::Short2(RValue<Short4> cast)
1564 storeValue(Nucleus::createBitCast(cast.value, getType()));
1567 UShort2::UShort2(RValue<UShort4> cast)
1569 storeValue(Nucleus::createBitCast(cast.value, getType()));
1572 Short4::Short4(RValue<Int> cast)
1574 Value *vector = loadValue();
1575 Value *element = Nucleus::createTrunc(cast.value, Short::getType());
1576 Value *insert = Nucleus::createInsertElement(vector, element, 0);
1577 Value *swizzle = Swizzle(RValue<Short4>(insert), 0x00).value;
1579 storeValue(swizzle);
1582 // Short4::Short4(RValue<Float> cast)
1586 Short4::Short4(short xyzw)
1588 int64_t constantVector[4] = {xyzw, xyzw, xyzw, xyzw};
1589 storeValue(Nucleus::createConstantVector(constantVector, getType()));
1592 Short4::Short4(short x, short y, short z, short w)
1594 int64_t constantVector[4] = {x, y, z, w};
1595 storeValue(Nucleus::createConstantVector(constantVector, getType()));
1598 Short4::Short4(RValue<Short4> rhs)
1600 storeValue(rhs.value);
1603 Short4::Short4(const Short4 &rhs)
1605 Value *value = rhs.loadValue();
1609 Short4::Short4(const Reference<Short4> &rhs)
1611 Value *value = rhs.loadValue();
1615 Short4::Short4(RValue<UShort4> rhs)
1617 storeValue(rhs.value);
1620 Short4::Short4(const UShort4 &rhs)
1622 storeValue(rhs.loadValue());
1625 Short4::Short4(const Reference<UShort4> &rhs)
1627 storeValue(rhs.loadValue());
1630 RValue<Short4> Short4::operator=(RValue<Short4> rhs)
1632 storeValue(rhs.value);
1637 RValue<Short4> Short4::operator=(const Short4 &rhs)
1639 Value *value = rhs.loadValue();
1642 return RValue<Short4>(value);
1645 RValue<Short4> Short4::operator=(const Reference<Short4> &rhs)
1647 Value *value = rhs.loadValue();
1650 return RValue<Short4>(value);
1653 RValue<Short4> Short4::operator=(RValue<UShort4> rhs)
1655 storeValue(rhs.value);
1657 return RValue<Short4>(rhs);
1660 RValue<Short4> Short4::operator=(const UShort4 &rhs)
1662 Value *value = rhs.loadValue();
1665 return RValue<Short4>(value);
1668 RValue<Short4> Short4::operator=(const Reference<UShort4> &rhs)
1670 Value *value = rhs.loadValue();
1673 return RValue<Short4>(value);
1676 RValue<Short4> operator+(RValue<Short4> lhs, RValue<Short4> rhs)
1678 return RValue<Short4>(Nucleus::createAdd(lhs.value, rhs.value));
1681 RValue<Short4> operator-(RValue<Short4> lhs, RValue<Short4> rhs)
1683 return RValue<Short4>(Nucleus::createSub(lhs.value, rhs.value));
1686 RValue<Short4> operator*(RValue<Short4> lhs, RValue<Short4> rhs)
1688 return RValue<Short4>(Nucleus::createMul(lhs.value, rhs.value));
1691 // RValue<Short4> operator/(RValue<Short4> lhs, RValue<Short4> rhs)
1693 // return RValue<Short4>(Nucleus::createSDiv(lhs.value, rhs.value));
1696 // RValue<Short4> operator%(RValue<Short4> lhs, RValue<Short4> rhs)
1698 // return RValue<Short4>(Nucleus::createSRem(lhs.value, rhs.value));
1701 RValue<Short4> operator&(RValue<Short4> lhs, RValue<Short4> rhs)
1703 return RValue<Short4>(Nucleus::createAnd(lhs.value, rhs.value));
1706 RValue<Short4> operator|(RValue<Short4> lhs, RValue<Short4> rhs)
1708 return RValue<Short4>(Nucleus::createOr(lhs.value, rhs.value));
1711 RValue<Short4> operator^(RValue<Short4> lhs, RValue<Short4> rhs)
1713 return RValue<Short4>(Nucleus::createXor(lhs.value, rhs.value));
1716 RValue<Short4> operator+=(Short4 &lhs, RValue<Short4> rhs)
1718 return lhs = lhs + rhs;
1721 RValue<Short4> operator-=(Short4 &lhs, RValue<Short4> rhs)
1723 return lhs = lhs - rhs;
1726 RValue<Short4> operator*=(Short4 &lhs, RValue<Short4> rhs)
1728 return lhs = lhs * rhs;
1731 // RValue<Short4> operator/=(Short4 &lhs, RValue<Short4> rhs)
1733 // return lhs = lhs / rhs;
1736 // RValue<Short4> operator%=(Short4 &lhs, RValue<Short4> rhs)
1738 // return lhs = lhs % rhs;
1741 RValue<Short4> operator&=(Short4 &lhs, RValue<Short4> rhs)
1743 return lhs = lhs & rhs;
1746 RValue<Short4> operator|=(Short4 &lhs, RValue<Short4> rhs)
1748 return lhs = lhs | rhs;
1751 RValue<Short4> operator^=(Short4 &lhs, RValue<Short4> rhs)
1753 return lhs = lhs ^ rhs;
1756 RValue<Short4> operator<<=(Short4 &lhs, unsigned char rhs)
1758 return lhs = lhs << rhs;
1761 RValue<Short4> operator>>=(Short4 &lhs, unsigned char rhs)
1763 return lhs = lhs >> rhs;
1766 // RValue<Short4> operator+(RValue<Short4> val)
1771 RValue<Short4> operator-(RValue<Short4> val)
1773 return RValue<Short4>(Nucleus::createNeg(val.value));
1776 RValue<Short4> operator~(RValue<Short4> val)
1778 return RValue<Short4>(Nucleus::createNot(val.value));
1781 RValue<Short4> RoundShort4(RValue<Float4> cast)
1783 RValue<Int4> int4 = RoundInt(cast);
1784 return As<Short4>(PackSigned(int4, int4));
1787 RValue<Int2> UnpackLow(RValue<Short4> x, RValue<Short4> y)
1789 int shuffle[8] = {0, 8, 1, 9, 2, 10, 3, 11}; // Real type is v8i16
1790 return As<Int2>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
1793 RValue<Int2> UnpackHigh(RValue<Short4> x, RValue<Short4> y)
1795 int shuffle[8] = {0, 8, 1, 9, 2, 10, 3, 11}; // Real type is v8i16
1796 auto lowHigh = RValue<Short8>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
1797 return As<Int2>(Swizzle(As<Int4>(lowHigh), 0xEE));
1800 RValue<Short4> Swizzle(RValue<Short4> x, unsigned char select)
1802 // Real type is v8i16
1805 (select >> 0) & 0x03,
1806 (select >> 2) & 0x03,
1807 (select >> 4) & 0x03,
1808 (select >> 6) & 0x03,
1809 (select >> 0) & 0x03,
1810 (select >> 2) & 0x03,
1811 (select >> 4) & 0x03,
1812 (select >> 6) & 0x03,
1815 return As<Short4>(Nucleus::createShuffleVector(x.value, x.value, shuffle));
1818 RValue<Short4> Insert(RValue<Short4> val, RValue<Short> element, int i)
1820 return RValue<Short4>(Nucleus::createInsertElement(val.value, element.value, i));
1823 RValue<Short> Extract(RValue<Short4> val, int i)
1825 return RValue<Short>(Nucleus::createExtractElement(val.value, Short::getType(), i));
1828 UShort4::UShort4(RValue<Int4> cast)
1830 *this = Short4(cast);
1833 UShort4::UShort4(unsigned short xyzw)
1835 int64_t constantVector[4] = {xyzw, xyzw, xyzw, xyzw};
1836 storeValue(Nucleus::createConstantVector(constantVector, getType()));
1839 UShort4::UShort4(unsigned short x, unsigned short y, unsigned short z, unsigned short w)
1841 int64_t constantVector[4] = {x, y, z, w};
1842 storeValue(Nucleus::createConstantVector(constantVector, getType()));
1845 UShort4::UShort4(RValue<UShort4> rhs)
1847 storeValue(rhs.value);
1850 UShort4::UShort4(const UShort4 &rhs)
1852 Value *value = rhs.loadValue();
1856 UShort4::UShort4(const Reference<UShort4> &rhs)
1858 Value *value = rhs.loadValue();
1862 UShort4::UShort4(RValue<Short4> rhs)
1864 storeValue(rhs.value);
1867 UShort4::UShort4(const Short4 &rhs)
1869 Value *value = rhs.loadValue();
1873 UShort4::UShort4(const Reference<Short4> &rhs)
1875 Value *value = rhs.loadValue();
1879 RValue<UShort4> UShort4::operator=(RValue<UShort4> rhs)
1881 storeValue(rhs.value);
1886 RValue<UShort4> UShort4::operator=(const UShort4 &rhs)
1888 Value *value = rhs.loadValue();
1891 return RValue<UShort4>(value);
1894 RValue<UShort4> UShort4::operator=(const Reference<UShort4> &rhs)
1896 Value *value = rhs.loadValue();
1899 return RValue<UShort4>(value);
1902 RValue<UShort4> UShort4::operator=(RValue<Short4> rhs)
1904 storeValue(rhs.value);
1906 return RValue<UShort4>(rhs);
1909 RValue<UShort4> UShort4::operator=(const Short4 &rhs)
1911 Value *value = rhs.loadValue();
1914 return RValue<UShort4>(value);
1917 RValue<UShort4> UShort4::operator=(const Reference<Short4> &rhs)
1919 Value *value = rhs.loadValue();
1922 return RValue<UShort4>(value);
1925 RValue<UShort4> operator+(RValue<UShort4> lhs, RValue<UShort4> rhs)
1927 return RValue<UShort4>(Nucleus::createAdd(lhs.value, rhs.value));
1930 RValue<UShort4> operator-(RValue<UShort4> lhs, RValue<UShort4> rhs)
1932 return RValue<UShort4>(Nucleus::createSub(lhs.value, rhs.value));
1935 RValue<UShort4> operator*(RValue<UShort4> lhs, RValue<UShort4> rhs)
1937 return RValue<UShort4>(Nucleus::createMul(lhs.value, rhs.value));
1940 RValue<UShort4> operator&(RValue<UShort4> lhs, RValue<UShort4> rhs)
1942 return RValue<UShort4>(Nucleus::createAnd(lhs.value, rhs.value));
1945 RValue<UShort4> operator|(RValue<UShort4> lhs, RValue<UShort4> rhs)
1947 return RValue<UShort4>(Nucleus::createOr(lhs.value, rhs.value));
1950 RValue<UShort4> operator^(RValue<UShort4> lhs, RValue<UShort4> rhs)
1952 return RValue<UShort4>(Nucleus::createXor(lhs.value, rhs.value));
1955 RValue<UShort4> operator<<=(UShort4 &lhs, unsigned char rhs)
1957 return lhs = lhs << rhs;
1960 RValue<UShort4> operator>>=(UShort4 &lhs, unsigned char rhs)
1962 return lhs = lhs >> rhs;
1965 RValue<UShort4> operator~(RValue<UShort4> val)
1967 return RValue<UShort4>(Nucleus::createNot(val.value));
1970 Short8::Short8(short c)
1972 int64_t constantVector[8] = {c, c, c, c, c, c, c, c};
1973 storeValue(Nucleus::createConstantVector(constantVector, getType()));
1976 Short8::Short8(short c0, short c1, short c2, short c3, short c4, short c5, short c6, short c7)
1978 int64_t constantVector[8] = {c0, c1, c2, c3, c4, c5, c6, c7};
1979 storeValue(Nucleus::createConstantVector(constantVector, getType()));
1982 Short8::Short8(RValue<Short8> rhs)
1984 storeValue(rhs.value);
1987 Short8::Short8(const Reference<Short8> &rhs)
1989 Value *value = rhs.loadValue();
1993 Short8::Short8(RValue<Short4> lo, RValue<Short4> hi)
1995 int shuffle[8] = {0, 1, 2, 3, 8, 9, 10, 11}; // Real type is v8i16
1996 Value *packed = Nucleus::createShuffleVector(lo.value, hi.value, shuffle);
2001 RValue<Short8> Short8::operator=(RValue<Short8> rhs)
2003 storeValue(rhs.value);
2008 RValue<Short8> Short8::operator=(const Short8 &rhs)
2010 Value *value = rhs.loadValue();
2013 return RValue<Short8>(value);
2016 RValue<Short8> Short8::operator=(const Reference<Short8> &rhs)
2018 Value *value = rhs.loadValue();
2021 return RValue<Short8>(value);
2024 RValue<Short8> operator+(RValue<Short8> lhs, RValue<Short8> rhs)
2026 return RValue<Short8>(Nucleus::createAdd(lhs.value, rhs.value));
2029 RValue<Short8> operator&(RValue<Short8> lhs, RValue<Short8> rhs)
2031 return RValue<Short8>(Nucleus::createAnd(lhs.value, rhs.value));
2034 RValue<Int4> Abs(RValue<Int4> x)
2037 auto negative = x >> 31;
2038 return (x ^ negative) - negative;
2041 UShort8::UShort8(unsigned short c)
2043 int64_t constantVector[8] = {c, c, c, c, c, c, c, c};
2044 storeValue(Nucleus::createConstantVector(constantVector, getType()));
2047 UShort8::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)
2049 int64_t constantVector[8] = {c0, c1, c2, c3, c4, c5, c6, c7};
2050 storeValue(Nucleus::createConstantVector(constantVector, getType()));
2053 UShort8::UShort8(RValue<UShort8> rhs)
2055 storeValue(rhs.value);
2058 UShort8::UShort8(const Reference<UShort8> &rhs)
2060 Value *value = rhs.loadValue();
2064 UShort8::UShort8(RValue<UShort4> lo, RValue<UShort4> hi)
2066 int shuffle[8] = {0, 1, 2, 3, 8, 9, 10, 11}; // Real type is v8i16
2067 Value *packed = Nucleus::createShuffleVector(lo.value, hi.value, shuffle);
2072 RValue<UShort8> UShort8::operator=(RValue<UShort8> rhs)
2074 storeValue(rhs.value);
2079 RValue<UShort8> UShort8::operator=(const UShort8 &rhs)
2081 Value *value = rhs.loadValue();
2084 return RValue<UShort8>(value);
2087 RValue<UShort8> UShort8::operator=(const Reference<UShort8> &rhs)
2089 Value *value = rhs.loadValue();
2092 return RValue<UShort8>(value);
2095 RValue<UShort8> operator&(RValue<UShort8> lhs, RValue<UShort8> rhs)
2097 return RValue<UShort8>(Nucleus::createAnd(lhs.value, rhs.value));
2100 RValue<UShort8> operator+(RValue<UShort8> lhs, RValue<UShort8> rhs)
2102 return RValue<UShort8>(Nucleus::createAdd(lhs.value, rhs.value));
2105 RValue<UShort8> operator*(RValue<UShort8> lhs, RValue<UShort8> rhs)
2107 return RValue<UShort8>(Nucleus::createMul(lhs.value, rhs.value));
2110 RValue<UShort8> operator+=(UShort8 &lhs, RValue<UShort8> rhs)
2112 return lhs = lhs + rhs;
2115 RValue<UShort8> operator~(RValue<UShort8> val)
2117 return RValue<UShort8>(Nucleus::createNot(val.value));
2120 Int::Int(Argument<Int> argument)
2122 storeValue(argument.value);
2125 Int::Int(RValue<Byte> cast)
2127 Value *integer = Nucleus::createZExt(cast.value, Int::getType());
2129 storeValue(integer);
2132 Int::Int(RValue<SByte> cast)
2134 Value *integer = Nucleus::createSExt(cast.value, Int::getType());
2136 storeValue(integer);
2139 Int::Int(RValue<Short> cast)
2141 Value *integer = Nucleus::createSExt(cast.value, Int::getType());
2143 storeValue(integer);
2146 Int::Int(RValue<UShort> cast)
2148 Value *integer = Nucleus::createZExt(cast.value, Int::getType());
2150 storeValue(integer);
2153 Int::Int(RValue<Int2> cast)
2155 *this = Extract(cast, 0);
2158 Int::Int(RValue<Long> cast)
2160 Value *integer = Nucleus::createTrunc(cast.value, Int::getType());
2162 storeValue(integer);
2165 Int::Int(RValue<Float> cast)
2167 Value *integer = Nucleus::createFPToSI(cast.value, Int::getType());
2169 storeValue(integer);
2174 storeValue(Nucleus::createConstantInt(x));
2177 Int::Int(RValue<Int> rhs)
2179 storeValue(rhs.value);
2182 Int::Int(RValue<UInt> rhs)
2184 storeValue(rhs.value);
2187 Int::Int(const Int &rhs)
2189 Value *value = rhs.loadValue();
2193 Int::Int(const Reference<Int> &rhs)
2195 Value *value = rhs.loadValue();
2199 Int::Int(const UInt &rhs)
2201 Value *value = rhs.loadValue();
2205 Int::Int(const Reference<UInt> &rhs)
2207 Value *value = rhs.loadValue();
2211 RValue<Int> Int::operator=(int rhs)
2213 return RValue<Int>(storeValue(Nucleus::createConstantInt(rhs)));
2216 RValue<Int> Int::operator=(RValue<Int> rhs)
2218 storeValue(rhs.value);
2223 RValue<Int> Int::operator=(RValue<UInt> rhs)
2225 storeValue(rhs.value);
2227 return RValue<Int>(rhs);
2230 RValue<Int> Int::operator=(const Int &rhs)
2232 Value *value = rhs.loadValue();
2235 return RValue<Int>(value);
2238 RValue<Int> Int::operator=(const Reference<Int> &rhs)
2240 Value *value = rhs.loadValue();
2243 return RValue<Int>(value);
2246 RValue<Int> Int::operator=(const UInt &rhs)
2248 Value *value = rhs.loadValue();
2251 return RValue<Int>(value);
2254 RValue<Int> Int::operator=(const Reference<UInt> &rhs)
2256 Value *value = rhs.loadValue();
2259 return RValue<Int>(value);
2262 RValue<Int> operator+(RValue<Int> lhs, RValue<Int> rhs)
2264 return RValue<Int>(Nucleus::createAdd(lhs.value, rhs.value));
2267 RValue<Int> operator-(RValue<Int> lhs, RValue<Int> rhs)
2269 return RValue<Int>(Nucleus::createSub(lhs.value, rhs.value));
2272 RValue<Int> operator*(RValue<Int> lhs, RValue<Int> rhs)
2274 return RValue<Int>(Nucleus::createMul(lhs.value, rhs.value));
2277 RValue<Int> operator/(RValue<Int> lhs, RValue<Int> rhs)
2279 return RValue<Int>(Nucleus::createSDiv(lhs.value, rhs.value));
2282 RValue<Int> operator%(RValue<Int> lhs, RValue<Int> rhs)
2284 return RValue<Int>(Nucleus::createSRem(lhs.value, rhs.value));
2287 RValue<Int> operator&(RValue<Int> lhs, RValue<Int> rhs)
2289 return RValue<Int>(Nucleus::createAnd(lhs.value, rhs.value));
2292 RValue<Int> operator|(RValue<Int> lhs, RValue<Int> rhs)
2294 return RValue<Int>(Nucleus::createOr(lhs.value, rhs.value));
2297 RValue<Int> operator^(RValue<Int> lhs, RValue<Int> rhs)
2299 return RValue<Int>(Nucleus::createXor(lhs.value, rhs.value));
2302 RValue<Int> operator<<(RValue<Int> lhs, RValue<Int> rhs)
2304 return RValue<Int>(Nucleus::createShl(lhs.value, rhs.value));
2307 RValue<Int> operator>>(RValue<Int> lhs, RValue<Int> rhs)
2309 return RValue<Int>(Nucleus::createAShr(lhs.value, rhs.value));
2312 RValue<Int> operator+=(Int &lhs, RValue<Int> rhs)
2314 return lhs = lhs + rhs;
2317 RValue<Int> operator-=(Int &lhs, RValue<Int> rhs)
2319 return lhs = lhs - rhs;
2322 RValue<Int> operator*=(Int &lhs, RValue<Int> rhs)
2324 return lhs = lhs * rhs;
2327 RValue<Int> operator/=(Int &lhs, RValue<Int> rhs)
2329 return lhs = lhs / rhs;
2332 RValue<Int> operator%=(Int &lhs, RValue<Int> rhs)
2334 return lhs = lhs % rhs;
2337 RValue<Int> operator&=(Int &lhs, RValue<Int> rhs)
2339 return lhs = lhs & rhs;
2342 RValue<Int> operator|=(Int &lhs, RValue<Int> rhs)
2344 return lhs = lhs | rhs;
2347 RValue<Int> operator^=(Int &lhs, RValue<Int> rhs)
2349 return lhs = lhs ^ rhs;
2352 RValue<Int> operator<<=(Int &lhs, RValue<Int> rhs)
2354 return lhs = lhs << rhs;
2357 RValue<Int> operator>>=(Int &lhs, RValue<Int> rhs)
2359 return lhs = lhs >> rhs;
2362 RValue<Int> operator+(RValue<Int> val)
2367 RValue<Int> operator-(RValue<Int> val)
2369 return RValue<Int>(Nucleus::createNeg(val.value));
2372 RValue<Int> operator~(RValue<Int> val)
2374 return RValue<Int>(Nucleus::createNot(val.value));
2377 RValue<Bool> operator<(RValue<Int> lhs, RValue<Int> rhs)
2379 return RValue<Bool>(Nucleus::createICmpSLT(lhs.value, rhs.value));
2382 RValue<Bool> operator<=(RValue<Int> lhs, RValue<Int> rhs)
2384 return RValue<Bool>(Nucleus::createICmpSLE(lhs.value, rhs.value));
2387 RValue<Bool> operator>(RValue<Int> lhs, RValue<Int> rhs)
2389 return RValue<Bool>(Nucleus::createICmpSGT(lhs.value, rhs.value));
2392 RValue<Bool> operator>=(RValue<Int> lhs, RValue<Int> rhs)
2394 return RValue<Bool>(Nucleus::createICmpSGE(lhs.value, rhs.value));
2397 RValue<Bool> operator!=(RValue<Int> lhs, RValue<Int> rhs)
2399 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
2402 RValue<Bool> operator==(RValue<Int> lhs, RValue<Int> rhs)
2404 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
2407 RValue<Int> Max(RValue<Int> x, RValue<Int> y)
2409 return IfThenElse(x > y, x, y);
2412 RValue<Int> Min(RValue<Int> x, RValue<Int> y)
2414 return IfThenElse(x < y, x, y);
2417 RValue<Int> Clamp(RValue<Int> x, RValue<Int> min, RValue<Int> max)
2419 return Min(Max(x, min), max);
2422 Long::Long(RValue<Int> cast)
2424 Value *integer = Nucleus::createSExt(cast.value, Long::getType());
2426 storeValue(integer);
2429 Long::Long(RValue<UInt> cast)
2431 Value *integer = Nucleus::createZExt(cast.value, Long::getType());
2433 storeValue(integer);
2436 Long::Long(RValue<Long> rhs)
2438 storeValue(rhs.value);
2441 RValue<Long> Long::operator=(int64_t rhs)
2443 return RValue<Long>(storeValue(Nucleus::createConstantLong(rhs)));
2446 RValue<Long> Long::operator=(RValue<Long> rhs)
2448 storeValue(rhs.value);
2453 RValue<Long> Long::operator=(const Long &rhs)
2455 Value *value = rhs.loadValue();
2458 return RValue<Long>(value);
2461 RValue<Long> Long::operator=(const Reference<Long> &rhs)
2463 Value *value = rhs.loadValue();
2466 return RValue<Long>(value);
2469 RValue<Long> operator+(RValue<Long> lhs, RValue<Long> rhs)
2471 return RValue<Long>(Nucleus::createAdd(lhs.value, rhs.value));
2474 RValue<Long> operator-(RValue<Long> lhs, RValue<Long> rhs)
2476 return RValue<Long>(Nucleus::createSub(lhs.value, rhs.value));
2479 RValue<Long> operator*(RValue<Long> lhs, RValue<Long> rhs)
2481 return RValue<Long>(Nucleus::createMul(lhs.value, rhs.value));
2484 RValue<Long> operator>>(RValue<Long> lhs, RValue<Long> rhs)
2486 return RValue<Long>(Nucleus::createAShr(lhs.value, rhs.value));
2489 RValue<Long> operator+=(Long &lhs, RValue<Long> rhs)
2491 return lhs = lhs + rhs;
2494 RValue<Long> operator-=(Long &lhs, RValue<Long> rhs)
2496 return lhs = lhs - rhs;
2499 RValue<Long> AddAtomic(RValue<Pointer<Long> > x, RValue<Long> y)
2501 return RValue<Long>(Nucleus::createAtomicAdd(x.value, y.value));
2504 UInt::UInt(Argument<UInt> argument)
2506 storeValue(argument.value);
2509 UInt::UInt(RValue<UShort> cast)
2511 Value *integer = Nucleus::createZExt(cast.value, UInt::getType());
2513 storeValue(integer);
2516 UInt::UInt(RValue<Long> cast)
2518 Value *integer = Nucleus::createTrunc(cast.value, UInt::getType());
2520 storeValue(integer);
2525 storeValue(Nucleus::createConstantInt(x));
2528 UInt::UInt(unsigned int x)
2530 storeValue(Nucleus::createConstantInt(x));
2533 UInt::UInt(RValue<UInt> rhs)
2535 storeValue(rhs.value);
2538 UInt::UInt(RValue<Int> rhs)
2540 storeValue(rhs.value);
2543 UInt::UInt(const UInt &rhs)
2545 Value *value = rhs.loadValue();
2549 UInt::UInt(const Reference<UInt> &rhs)
2551 Value *value = rhs.loadValue();
2555 UInt::UInt(const Int &rhs)
2557 Value *value = rhs.loadValue();
2561 UInt::UInt(const Reference<Int> &rhs)
2563 Value *value = rhs.loadValue();
2567 RValue<UInt> UInt::operator=(unsigned int rhs)
2569 return RValue<UInt>(storeValue(Nucleus::createConstantInt(rhs)));
2572 RValue<UInt> UInt::operator=(RValue<UInt> rhs)
2574 storeValue(rhs.value);
2579 RValue<UInt> UInt::operator=(RValue<Int> rhs)
2581 storeValue(rhs.value);
2583 return RValue<UInt>(rhs);
2586 RValue<UInt> UInt::operator=(const UInt &rhs)
2588 Value *value = rhs.loadValue();
2591 return RValue<UInt>(value);
2594 RValue<UInt> UInt::operator=(const Reference<UInt> &rhs)
2596 Value *value = rhs.loadValue();
2599 return RValue<UInt>(value);
2602 RValue<UInt> UInt::operator=(const Int &rhs)
2604 Value *value = rhs.loadValue();
2607 return RValue<UInt>(value);
2610 RValue<UInt> UInt::operator=(const Reference<Int> &rhs)
2612 Value *value = rhs.loadValue();
2615 return RValue<UInt>(value);
2618 RValue<UInt> operator+(RValue<UInt> lhs, RValue<UInt> rhs)
2620 return RValue<UInt>(Nucleus::createAdd(lhs.value, rhs.value));
2623 RValue<UInt> operator-(RValue<UInt> lhs, RValue<UInt> rhs)
2625 return RValue<UInt>(Nucleus::createSub(lhs.value, rhs.value));
2628 RValue<UInt> operator*(RValue<UInt> lhs, RValue<UInt> rhs)
2630 return RValue<UInt>(Nucleus::createMul(lhs.value, rhs.value));
2633 RValue<UInt> operator/(RValue<UInt> lhs, RValue<UInt> rhs)
2635 return RValue<UInt>(Nucleus::createUDiv(lhs.value, rhs.value));
2638 RValue<UInt> operator%(RValue<UInt> lhs, RValue<UInt> rhs)
2640 return RValue<UInt>(Nucleus::createURem(lhs.value, rhs.value));
2643 RValue<UInt> operator&(RValue<UInt> lhs, RValue<UInt> rhs)
2645 return RValue<UInt>(Nucleus::createAnd(lhs.value, rhs.value));
2648 RValue<UInt> operator|(RValue<UInt> lhs, RValue<UInt> rhs)
2650 return RValue<UInt>(Nucleus::createOr(lhs.value, rhs.value));
2653 RValue<UInt> operator^(RValue<UInt> lhs, RValue<UInt> rhs)
2655 return RValue<UInt>(Nucleus::createXor(lhs.value, rhs.value));
2658 RValue<UInt> operator<<(RValue<UInt> lhs, RValue<UInt> rhs)
2660 return RValue<UInt>(Nucleus::createShl(lhs.value, rhs.value));
2663 RValue<UInt> operator>>(RValue<UInt> lhs, RValue<UInt> rhs)
2665 return RValue<UInt>(Nucleus::createLShr(lhs.value, rhs.value));
2668 RValue<UInt> operator+=(UInt &lhs, RValue<UInt> rhs)
2670 return lhs = lhs + rhs;
2673 RValue<UInt> operator-=(UInt &lhs, RValue<UInt> rhs)
2675 return lhs = lhs - rhs;
2678 RValue<UInt> operator*=(UInt &lhs, RValue<UInt> rhs)
2680 return lhs = lhs * rhs;
2683 RValue<UInt> operator/=(UInt &lhs, RValue<UInt> rhs)
2685 return lhs = lhs / rhs;
2688 RValue<UInt> operator%=(UInt &lhs, RValue<UInt> rhs)
2690 return lhs = lhs % rhs;
2693 RValue<UInt> operator&=(UInt &lhs, RValue<UInt> rhs)
2695 return lhs = lhs & rhs;
2698 RValue<UInt> operator|=(UInt &lhs, RValue<UInt> rhs)
2700 return lhs = lhs | rhs;
2703 RValue<UInt> operator^=(UInt &lhs, RValue<UInt> rhs)
2705 return lhs = lhs ^ rhs;
2708 RValue<UInt> operator<<=(UInt &lhs, RValue<UInt> rhs)
2710 return lhs = lhs << rhs;
2713 RValue<UInt> operator>>=(UInt &lhs, RValue<UInt> rhs)
2715 return lhs = lhs >> rhs;
2718 RValue<UInt> operator+(RValue<UInt> val)
2723 RValue<UInt> operator-(RValue<UInt> val)
2725 return RValue<UInt>(Nucleus::createNeg(val.value));
2728 RValue<UInt> operator~(RValue<UInt> val)
2730 return RValue<UInt>(Nucleus::createNot(val.value));
2733 RValue<UInt> Max(RValue<UInt> x, RValue<UInt> y)
2735 return IfThenElse(x > y, x, y);
2738 RValue<UInt> Min(RValue<UInt> x, RValue<UInt> y)
2740 return IfThenElse(x < y, x, y);
2743 RValue<UInt> Clamp(RValue<UInt> x, RValue<UInt> min, RValue<UInt> max)
2745 return Min(Max(x, min), max);
2748 RValue<Bool> operator<(RValue<UInt> lhs, RValue<UInt> rhs)
2750 return RValue<Bool>(Nucleus::createICmpULT(lhs.value, rhs.value));
2753 RValue<Bool> operator<=(RValue<UInt> lhs, RValue<UInt> rhs)
2755 return RValue<Bool>(Nucleus::createICmpULE(lhs.value, rhs.value));
2758 RValue<Bool> operator>(RValue<UInt> lhs, RValue<UInt> rhs)
2760 return RValue<Bool>(Nucleus::createICmpUGT(lhs.value, rhs.value));
2763 RValue<Bool> operator>=(RValue<UInt> lhs, RValue<UInt> rhs)
2765 return RValue<Bool>(Nucleus::createICmpUGE(lhs.value, rhs.value));
2768 RValue<Bool> operator!=(RValue<UInt> lhs, RValue<UInt> rhs)
2770 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
2773 RValue<Bool> operator==(RValue<UInt> lhs, RValue<UInt> rhs)
2775 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
2778 Int2::Int2(RValue<Int4> cast)
2780 storeValue(Nucleus::createBitCast(cast.value, getType()));
2783 Int2::Int2(int x, int y)
2785 int64_t constantVector[2] = {x, y};
2786 storeValue(Nucleus::createConstantVector(constantVector, getType()));
2789 Int2::Int2(RValue<Int2> rhs)
2791 storeValue(rhs.value);
2794 Int2::Int2(const Int2 &rhs)
2796 Value *value = rhs.loadValue();
2800 Int2::Int2(const Reference<Int2> &rhs)
2802 Value *value = rhs.loadValue();
2806 Int2::Int2(RValue<Int> lo, RValue<Int> hi)
2808 int shuffle[4] = {0, 4, 1, 5};
2809 Value *packed = Nucleus::createShuffleVector(Int4(lo).loadValue(), Int4(hi).loadValue(), shuffle);
2811 storeValue(Nucleus::createBitCast(packed, Int2::getType()));
2814 RValue<Int2> Int2::operator=(RValue<Int2> rhs)
2816 storeValue(rhs.value);
2821 RValue<Int2> Int2::operator=(const Int2 &rhs)
2823 Value *value = rhs.loadValue();
2826 return RValue<Int2>(value);
2829 RValue<Int2> Int2::operator=(const Reference<Int2> &rhs)
2831 Value *value = rhs.loadValue();
2834 return RValue<Int2>(value);
2837 RValue<Int2> operator+(RValue<Int2> lhs, RValue<Int2> rhs)
2839 return RValue<Int2>(Nucleus::createAdd(lhs.value, rhs.value));
2842 RValue<Int2> operator-(RValue<Int2> lhs, RValue<Int2> rhs)
2844 return RValue<Int2>(Nucleus::createSub(lhs.value, rhs.value));
2847 // RValue<Int2> operator*(RValue<Int2> lhs, RValue<Int2> rhs)
2849 // return RValue<Int2>(Nucleus::createMul(lhs.value, rhs.value));
2852 // RValue<Int2> operator/(RValue<Int2> lhs, RValue<Int2> rhs)
2854 // return RValue<Int2>(Nucleus::createSDiv(lhs.value, rhs.value));
2857 // RValue<Int2> operator%(RValue<Int2> lhs, RValue<Int2> rhs)
2859 // return RValue<Int2>(Nucleus::createSRem(lhs.value, rhs.value));
2862 RValue<Int2> operator&(RValue<Int2> lhs, RValue<Int2> rhs)
2864 return RValue<Int2>(Nucleus::createAnd(lhs.value, rhs.value));
2867 RValue<Int2> operator|(RValue<Int2> lhs, RValue<Int2> rhs)
2869 return RValue<Int2>(Nucleus::createOr(lhs.value, rhs.value));
2872 RValue<Int2> operator^(RValue<Int2> lhs, RValue<Int2> rhs)
2874 return RValue<Int2>(Nucleus::createXor(lhs.value, rhs.value));
2877 RValue<Int2> operator+=(Int2 &lhs, RValue<Int2> rhs)
2879 return lhs = lhs + rhs;
2882 RValue<Int2> operator-=(Int2 &lhs, RValue<Int2> rhs)
2884 return lhs = lhs - rhs;
2887 // RValue<Int2> operator*=(Int2 &lhs, RValue<Int2> rhs)
2889 // return lhs = lhs * rhs;
2892 // RValue<Int2> operator/=(Int2 &lhs, RValue<Int2> rhs)
2894 // return lhs = lhs / rhs;
2897 // RValue<Int2> operator%=(Int2 &lhs, RValue<Int2> rhs)
2899 // return lhs = lhs % rhs;
2902 RValue<Int2> operator&=(Int2 &lhs, RValue<Int2> rhs)
2904 return lhs = lhs & rhs;
2907 RValue<Int2> operator|=(Int2 &lhs, RValue<Int2> rhs)
2909 return lhs = lhs | rhs;
2912 RValue<Int2> operator^=(Int2 &lhs, RValue<Int2> rhs)
2914 return lhs = lhs ^ rhs;
2917 RValue<Int2> operator<<=(Int2 &lhs, unsigned char rhs)
2919 return lhs = lhs << rhs;
2922 RValue<Int2> operator>>=(Int2 &lhs, unsigned char rhs)
2924 return lhs = lhs >> rhs;
2927 // RValue<Int2> operator+(RValue<Int2> val)
2932 // RValue<Int2> operator-(RValue<Int2> val)
2934 // return RValue<Int2>(Nucleus::createNeg(val.value));
2937 RValue<Int2> operator~(RValue<Int2> val)
2939 return RValue<Int2>(Nucleus::createNot(val.value));
2942 RValue<Short4> UnpackLow(RValue<Int2> x, RValue<Int2> y)
2944 int shuffle[4] = {0, 4, 1, 5}; // Real type is v4i32
2945 return As<Short4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
2948 RValue<Short4> UnpackHigh(RValue<Int2> x, RValue<Int2> y)
2950 int shuffle[4] = {0, 4, 1, 5}; // Real type is v4i32
2951 auto lowHigh = RValue<Int4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
2952 return As<Short4>(Swizzle(lowHigh, 0xEE));
2955 RValue<Int> Extract(RValue<Int2> val, int i)
2957 return RValue<Int>(Nucleus::createExtractElement(val.value, Int::getType(), i));
2960 RValue<Int2> Insert(RValue<Int2> val, RValue<Int> element, int i)
2962 return RValue<Int2>(Nucleus::createInsertElement(val.value, element.value, i));
2965 UInt2::UInt2(unsigned int x, unsigned int y)
2967 int64_t constantVector[2] = {x, y};
2968 storeValue(Nucleus::createConstantVector(constantVector, getType()));
2971 UInt2::UInt2(RValue<UInt2> rhs)
2973 storeValue(rhs.value);
2976 UInt2::UInt2(const UInt2 &rhs)
2978 Value *value = rhs.loadValue();
2982 UInt2::UInt2(const Reference<UInt2> &rhs)
2984 Value *value = rhs.loadValue();
2988 RValue<UInt2> UInt2::operator=(RValue<UInt2> rhs)
2990 storeValue(rhs.value);
2995 RValue<UInt2> UInt2::operator=(const UInt2 &rhs)
2997 Value *value = rhs.loadValue();
3000 return RValue<UInt2>(value);
3003 RValue<UInt2> UInt2::operator=(const Reference<UInt2> &rhs)
3005 Value *value = rhs.loadValue();
3008 return RValue<UInt2>(value);
3011 RValue<UInt2> operator+(RValue<UInt2> lhs, RValue<UInt2> rhs)
3013 return RValue<UInt2>(Nucleus::createAdd(lhs.value, rhs.value));
3016 RValue<UInt2> operator-(RValue<UInt2> lhs, RValue<UInt2> rhs)
3018 return RValue<UInt2>(Nucleus::createSub(lhs.value, rhs.value));
3021 // RValue<UInt2> operator*(RValue<UInt2> lhs, RValue<UInt2> rhs)
3023 // return RValue<UInt2>(Nucleus::createMul(lhs.value, rhs.value));
3026 // RValue<UInt2> operator/(RValue<UInt2> lhs, RValue<UInt2> rhs)
3028 // return RValue<UInt2>(Nucleus::createUDiv(lhs.value, rhs.value));
3031 // RValue<UInt2> operator%(RValue<UInt2> lhs, RValue<UInt2> rhs)
3033 // return RValue<UInt2>(Nucleus::createURem(lhs.value, rhs.value));
3036 RValue<UInt2> operator&(RValue<UInt2> lhs, RValue<UInt2> rhs)
3038 return RValue<UInt2>(Nucleus::createAnd(lhs.value, rhs.value));
3041 RValue<UInt2> operator|(RValue<UInt2> lhs, RValue<UInt2> rhs)
3043 return RValue<UInt2>(Nucleus::createOr(lhs.value, rhs.value));
3046 RValue<UInt2> operator^(RValue<UInt2> lhs, RValue<UInt2> rhs)
3048 return RValue<UInt2>(Nucleus::createXor(lhs.value, rhs.value));
3051 RValue<UInt2> operator+=(UInt2 &lhs, RValue<UInt2> rhs)
3053 return lhs = lhs + rhs;
3056 RValue<UInt2> operator-=(UInt2 &lhs, RValue<UInt2> rhs)
3058 return lhs = lhs - rhs;
3061 // RValue<UInt2> operator*=(UInt2 &lhs, RValue<UInt2> rhs)
3063 // return lhs = lhs * rhs;
3066 // RValue<UInt2> operator/=(UInt2 &lhs, RValue<UInt2> rhs)
3068 // return lhs = lhs / rhs;
3071 // RValue<UInt2> operator%=(UInt2 &lhs, RValue<UInt2> rhs)
3073 // return lhs = lhs % rhs;
3076 RValue<UInt2> operator&=(UInt2 &lhs, RValue<UInt2> rhs)
3078 return lhs = lhs & rhs;
3081 RValue<UInt2> operator|=(UInt2 &lhs, RValue<UInt2> rhs)
3083 return lhs = lhs | rhs;
3086 RValue<UInt2> operator^=(UInt2 &lhs, RValue<UInt2> rhs)
3088 return lhs = lhs ^ rhs;
3091 RValue<UInt2> operator<<=(UInt2 &lhs, unsigned char rhs)
3093 return lhs = lhs << rhs;
3096 RValue<UInt2> operator>>=(UInt2 &lhs, unsigned char rhs)
3098 return lhs = lhs >> rhs;
3101 // RValue<UInt2> operator+(RValue<UInt2> val)
3106 // RValue<UInt2> operator-(RValue<UInt2> val)
3108 // return RValue<UInt2>(Nucleus::createNeg(val.value));
3111 RValue<UInt2> operator~(RValue<UInt2> val)
3113 return RValue<UInt2>(Nucleus::createNot(val.value));
3116 Int4::Int4() : XYZW(this)
3120 Int4::Int4(RValue<Float4> cast) : XYZW(this)
3122 Value *xyzw = Nucleus::createFPToSI(cast.value, Int4::getType());
3127 Int4::Int4(int xyzw) : XYZW(this)
3129 constant(xyzw, xyzw, xyzw, xyzw);
3132 Int4::Int4(int x, int yzw) : XYZW(this)
3134 constant(x, yzw, yzw, yzw);
3137 Int4::Int4(int x, int y, int zw) : XYZW(this)
3139 constant(x, y, zw, zw);
3142 Int4::Int4(int x, int y, int z, int w) : XYZW(this)
3144 constant(x, y, z, w);
3147 void Int4::constant(int x, int y, int z, int w)
3149 int64_t constantVector[4] = {x, y, z, w};
3150 storeValue(Nucleus::createConstantVector(constantVector, getType()));
3153 Int4::Int4(RValue<Int4> rhs) : XYZW(this)
3155 storeValue(rhs.value);
3158 Int4::Int4(const Int4 &rhs) : XYZW(this)
3160 Value *value = rhs.loadValue();
3164 Int4::Int4(const Reference<Int4> &rhs) : XYZW(this)
3166 Value *value = rhs.loadValue();
3170 Int4::Int4(RValue<UInt4> rhs) : XYZW(this)
3172 storeValue(rhs.value);
3175 Int4::Int4(const UInt4 &rhs) : XYZW(this)
3177 Value *value = rhs.loadValue();
3181 Int4::Int4(const Reference<UInt4> &rhs) : XYZW(this)
3183 Value *value = rhs.loadValue();
3187 Int4::Int4(RValue<Int2> lo, RValue<Int2> hi) : XYZW(this)
3189 int shuffle[4] = {0, 1, 4, 5}; // Real type is v4i32
3190 Value *packed = Nucleus::createShuffleVector(lo.value, hi.value, shuffle);
3195 Int4::Int4(const Int &rhs) : XYZW(this)
3197 *this = RValue<Int>(rhs.loadValue());
3200 Int4::Int4(const Reference<Int> &rhs) : XYZW(this)
3202 *this = RValue<Int>(rhs.loadValue());
3205 RValue<Int4> Int4::operator=(RValue<Int4> rhs)
3207 storeValue(rhs.value);
3212 RValue<Int4> Int4::operator=(const Int4 &rhs)
3214 Value *value = rhs.loadValue();
3217 return RValue<Int4>(value);
3220 RValue<Int4> Int4::operator=(const Reference<Int4> &rhs)
3222 Value *value = rhs.loadValue();
3225 return RValue<Int4>(value);
3228 RValue<Int4> operator+(RValue<Int4> lhs, RValue<Int4> rhs)
3230 return RValue<Int4>(Nucleus::createAdd(lhs.value, rhs.value));
3233 RValue<Int4> operator-(RValue<Int4> lhs, RValue<Int4> rhs)
3235 return RValue<Int4>(Nucleus::createSub(lhs.value, rhs.value));
3238 RValue<Int4> operator*(RValue<Int4> lhs, RValue<Int4> rhs)
3240 return RValue<Int4>(Nucleus::createMul(lhs.value, rhs.value));
3243 RValue<Int4> operator/(RValue<Int4> lhs, RValue<Int4> rhs)
3245 return RValue<Int4>(Nucleus::createSDiv(lhs.value, rhs.value));
3248 RValue<Int4> operator%(RValue<Int4> lhs, RValue<Int4> rhs)
3250 return RValue<Int4>(Nucleus::createSRem(lhs.value, rhs.value));
3253 RValue<Int4> operator&(RValue<Int4> lhs, RValue<Int4> rhs)
3255 return RValue<Int4>(Nucleus::createAnd(lhs.value, rhs.value));
3258 RValue<Int4> operator|(RValue<Int4> lhs, RValue<Int4> rhs)
3260 return RValue<Int4>(Nucleus::createOr(lhs.value, rhs.value));
3263 RValue<Int4> operator^(RValue<Int4> lhs, RValue<Int4> rhs)
3265 return RValue<Int4>(Nucleus::createXor(lhs.value, rhs.value));
3268 RValue<Int4> operator<<(RValue<Int4> lhs, RValue<Int4> rhs)
3270 return RValue<Int4>(Nucleus::createShl(lhs.value, rhs.value));
3273 RValue<Int4> operator>>(RValue<Int4> lhs, RValue<Int4> rhs)
3275 return RValue<Int4>(Nucleus::createAShr(lhs.value, rhs.value));
3278 RValue<Int4> operator+=(Int4 &lhs, RValue<Int4> rhs)
3280 return lhs = lhs + rhs;
3283 RValue<Int4> operator-=(Int4 &lhs, RValue<Int4> rhs)
3285 return lhs = lhs - rhs;
3288 RValue<Int4> operator*=(Int4 &lhs, RValue<Int4> rhs)
3290 return lhs = lhs * rhs;
3293 // RValue<Int4> operator/=(Int4 &lhs, RValue<Int4> rhs)
3295 // return lhs = lhs / rhs;
3298 // RValue<Int4> operator%=(Int4 &lhs, RValue<Int4> rhs)
3300 // return lhs = lhs % rhs;
3303 RValue<Int4> operator&=(Int4 &lhs, RValue<Int4> rhs)
3305 return lhs = lhs & rhs;
3308 RValue<Int4> operator|=(Int4 &lhs, RValue<Int4> rhs)
3310 return lhs = lhs | rhs;
3313 RValue<Int4> operator^=(Int4 &lhs, RValue<Int4> rhs)
3315 return lhs = lhs ^ rhs;
3318 RValue<Int4> operator<<=(Int4 &lhs, unsigned char rhs)
3320 return lhs = lhs << rhs;
3323 RValue<Int4> operator>>=(Int4 &lhs, unsigned char rhs)
3325 return lhs = lhs >> rhs;
3328 RValue<Int4> operator+(RValue<Int4> val)
3333 RValue<Int4> operator-(RValue<Int4> val)
3335 return RValue<Int4>(Nucleus::createNeg(val.value));
3338 RValue<Int4> operator~(RValue<Int4> val)
3340 return RValue<Int4>(Nucleus::createNot(val.value));
3343 RValue<Int> Extract(RValue<Int4> x, int i)
3345 return RValue<Int>(Nucleus::createExtractElement(x.value, Int::getType(), i));
3348 RValue<Int4> Insert(RValue<Int4> x, RValue<Int> element, int i)
3350 return RValue<Int4>(Nucleus::createInsertElement(x.value, element.value, i));
3353 RValue<Int4> Swizzle(RValue<Int4> x, unsigned char select)
3355 return RValue<Int4>(createSwizzle4(x.value, select));
3358 UInt4::UInt4() : XYZW(this)
3362 UInt4::UInt4(int xyzw) : XYZW(this)
3364 constant(xyzw, xyzw, xyzw, xyzw);
3367 UInt4::UInt4(int x, int yzw) : XYZW(this)
3369 constant(x, yzw, yzw, yzw);
3372 UInt4::UInt4(int x, int y, int zw) : XYZW(this)
3374 constant(x, y, zw, zw);
3377 UInt4::UInt4(int x, int y, int z, int w) : XYZW(this)
3379 constant(x, y, z, w);
3382 void UInt4::constant(int x, int y, int z, int w)
3384 int64_t constantVector[4] = {x, y, z, w};
3385 storeValue(Nucleus::createConstantVector(constantVector, getType()));
3388 UInt4::UInt4(RValue<UInt4> rhs) : XYZW(this)
3390 storeValue(rhs.value);
3393 UInt4::UInt4(const UInt4 &rhs) : XYZW(this)
3395 Value *value = rhs.loadValue();
3399 UInt4::UInt4(const Reference<UInt4> &rhs) : XYZW(this)
3401 Value *value = rhs.loadValue();
3405 UInt4::UInt4(RValue<Int4> rhs) : XYZW(this)
3407 storeValue(rhs.value);
3410 UInt4::UInt4(const Int4 &rhs) : XYZW(this)
3412 Value *value = rhs.loadValue();
3416 UInt4::UInt4(const Reference<Int4> &rhs) : XYZW(this)
3418 Value *value = rhs.loadValue();
3422 UInt4::UInt4(RValue<UInt2> lo, RValue<UInt2> hi) : XYZW(this)
3424 int shuffle[4] = {0, 1, 4, 5}; // Real type is v4i32
3425 Value *packed = Nucleus::createShuffleVector(lo.value, hi.value, shuffle);
3430 RValue<UInt4> UInt4::operator=(RValue<UInt4> rhs)
3432 storeValue(rhs.value);
3437 RValue<UInt4> UInt4::operator=(const UInt4 &rhs)
3439 Value *value = rhs.loadValue();
3442 return RValue<UInt4>(value);
3445 RValue<UInt4> UInt4::operator=(const Reference<UInt4> &rhs)
3447 Value *value = rhs.loadValue();
3450 return RValue<UInt4>(value);
3453 RValue<UInt4> operator+(RValue<UInt4> lhs, RValue<UInt4> rhs)
3455 return RValue<UInt4>(Nucleus::createAdd(lhs.value, rhs.value));
3458 RValue<UInt4> operator-(RValue<UInt4> lhs, RValue<UInt4> rhs)
3460 return RValue<UInt4>(Nucleus::createSub(lhs.value, rhs.value));
3463 RValue<UInt4> operator*(RValue<UInt4> lhs, RValue<UInt4> rhs)
3465 return RValue<UInt4>(Nucleus::createMul(lhs.value, rhs.value));
3468 RValue<UInt4> operator/(RValue<UInt4> lhs, RValue<UInt4> rhs)
3470 return RValue<UInt4>(Nucleus::createUDiv(lhs.value, rhs.value));
3473 RValue<UInt4> operator%(RValue<UInt4> lhs, RValue<UInt4> rhs)
3475 return RValue<UInt4>(Nucleus::createURem(lhs.value, rhs.value));
3478 RValue<UInt4> operator&(RValue<UInt4> lhs, RValue<UInt4> rhs)
3480 return RValue<UInt4>(Nucleus::createAnd(lhs.value, rhs.value));
3483 RValue<UInt4> operator|(RValue<UInt4> lhs, RValue<UInt4> rhs)
3485 return RValue<UInt4>(Nucleus::createOr(lhs.value, rhs.value));
3488 RValue<UInt4> operator^(RValue<UInt4> lhs, RValue<UInt4> rhs)
3490 return RValue<UInt4>(Nucleus::createXor(lhs.value, rhs.value));
3493 RValue<UInt4> operator<<(RValue<UInt4> lhs, RValue<UInt4> rhs)
3495 return RValue<UInt4>(Nucleus::createShl(lhs.value, rhs.value));
3498 RValue<UInt4> operator>>(RValue<UInt4> lhs, RValue<UInt4> rhs)
3500 return RValue<UInt4>(Nucleus::createLShr(lhs.value, rhs.value));
3503 RValue<UInt4> operator+=(UInt4 &lhs, RValue<UInt4> rhs)
3505 return lhs = lhs + rhs;
3508 RValue<UInt4> operator-=(UInt4 &lhs, RValue<UInt4> rhs)
3510 return lhs = lhs - rhs;
3513 RValue<UInt4> operator*=(UInt4 &lhs, RValue<UInt4> rhs)
3515 return lhs = lhs * rhs;
3518 // RValue<UInt4> operator/=(UInt4 &lhs, RValue<UInt4> rhs)
3520 // return lhs = lhs / rhs;
3523 // RValue<UInt4> operator%=(UInt4 &lhs, RValue<UInt4> rhs)
3525 // return lhs = lhs % rhs;
3528 RValue<UInt4> operator&=(UInt4 &lhs, RValue<UInt4> rhs)
3530 return lhs = lhs & rhs;
3533 RValue<UInt4> operator|=(UInt4 &lhs, RValue<UInt4> rhs)
3535 return lhs = lhs | rhs;
3538 RValue<UInt4> operator^=(UInt4 &lhs, RValue<UInt4> rhs)
3540 return lhs = lhs ^ rhs;
3543 RValue<UInt4> operator<<=(UInt4 &lhs, unsigned char rhs)
3545 return lhs = lhs << rhs;
3548 RValue<UInt4> operator>>=(UInt4 &lhs, unsigned char rhs)
3550 return lhs = lhs >> rhs;
3553 RValue<UInt4> operator+(RValue<UInt4> val)
3558 RValue<UInt4> operator-(RValue<UInt4> val)
3560 return RValue<UInt4>(Nucleus::createNeg(val.value));
3563 RValue<UInt4> operator~(RValue<UInt4> val)
3565 return RValue<UInt4>(Nucleus::createNot(val.value));
3568 Half::Half(RValue<Float> cast)
3570 UInt fp32i = As<UInt>(cast);
3571 UInt abs = fp32i & 0x7FFFFFFF;
3572 UShort fp16i((fp32i & 0x80000000) >> 16); // sign
3574 If(abs > 0x47FFEFFF) // Infinity
3576 fp16i |= UShort(0x7FFF);
3580 If(abs < 0x38800000) // Denormal
3582 Int mantissa = (abs & 0x007FFFFF) | 0x00800000;
3583 Int e = 113 - (abs >> 23);
3584 abs = IfThenElse(e < 24, mantissa >> e, Int(0));
3585 fp16i |= UShort((abs + 0x00000FFF + ((abs >> 13) & 1)) >> 13);
3589 fp16i |= UShort((abs + 0xC8000000 + 0x00000FFF + ((abs >> 13) & 1)) >> 13);
3593 storeValue(fp16i.loadValue());
3596 Float::Float(RValue<Int> cast)
3598 Value *integer = Nucleus::createSIToFP(cast.value, Float::getType());
3600 storeValue(integer);
3603 Float::Float(RValue<UInt> cast)
3605 RValue<Float> result = Float(Int(cast & UInt(0x7FFFFFFF))) +
3606 As<Float>((As<Int>(cast) >> 31) & As<Int>(Float(0x80000000u)));
3608 storeValue(result.value);
3611 Float::Float(RValue<Half> cast)
3613 Int fp16i(As<UShort>(cast));
3615 Int s = (fp16i >> 15) & 0x00000001;
3616 Int e = (fp16i >> 10) & 0x0000001F;
3617 Int m = fp16i & 0x000003FF;
3619 UInt fp32i(s << 31);
3624 While((m & 0x00000400) == 0)
3630 fp32i |= As<UInt>(((e + (127 - 15) + 1) << 23) | ((m & ~0x00000400) << 13));
3635 fp32i |= As<UInt>(((e + (127 - 15)) << 23) | (m << 13));
3638 storeValue(As<Float>(fp32i).value);
3641 Float::Float(float x)
3643 storeValue(Nucleus::createConstantFloat(x));
3646 Float::Float(RValue<Float> rhs)
3648 storeValue(rhs.value);
3651 Float::Float(const Float &rhs)
3653 Value *value = rhs.loadValue();
3657 Float::Float(const Reference<Float> &rhs)
3659 Value *value = rhs.loadValue();
3663 Float::Float(Argument<Float> argument)
3665 storeValue(argument.value);
3668 RValue<Float> Float::operator=(RValue<Float> rhs)
3670 storeValue(rhs.value);
3675 RValue<Float> Float::operator=(const Float &rhs)
3677 Value *value = rhs.loadValue();
3680 return RValue<Float>(value);
3683 RValue<Float> Float::operator=(const Reference<Float> &rhs)
3685 Value *value = rhs.loadValue();
3688 return RValue<Float>(value);
3691 RValue<Float> operator+(RValue<Float> lhs, RValue<Float> rhs)
3693 return RValue<Float>(Nucleus::createFAdd(lhs.value, rhs.value));
3696 RValue<Float> operator-(RValue<Float> lhs, RValue<Float> rhs)
3698 return RValue<Float>(Nucleus::createFSub(lhs.value, rhs.value));
3701 RValue<Float> operator*(RValue<Float> lhs, RValue<Float> rhs)
3703 return RValue<Float>(Nucleus::createFMul(lhs.value, rhs.value));
3706 RValue<Float> operator/(RValue<Float> lhs, RValue<Float> rhs)
3708 return RValue<Float>(Nucleus::createFDiv(lhs.value, rhs.value));
3711 RValue<Float> operator+=(Float &lhs, RValue<Float> rhs)
3713 return lhs = lhs + rhs;
3716 RValue<Float> operator-=(Float &lhs, RValue<Float> rhs)
3718 return lhs = lhs - rhs;
3721 RValue<Float> operator*=(Float &lhs, RValue<Float> rhs)
3723 return lhs = lhs * rhs;
3726 RValue<Float> operator/=(Float &lhs, RValue<Float> rhs)
3728 return lhs = lhs / rhs;
3731 RValue<Float> operator+(RValue<Float> val)
3736 RValue<Float> operator-(RValue<Float> val)
3738 return RValue<Float>(Nucleus::createFNeg(val.value));
3741 RValue<Bool> operator<(RValue<Float> lhs, RValue<Float> rhs)
3743 return RValue<Bool>(Nucleus::createFCmpOLT(lhs.value, rhs.value));
3746 RValue<Bool> operator<=(RValue<Float> lhs, RValue<Float> rhs)
3748 return RValue<Bool>(Nucleus::createFCmpOLE(lhs.value, rhs.value));
3751 RValue<Bool> operator>(RValue<Float> lhs, RValue<Float> rhs)
3753 return RValue<Bool>(Nucleus::createFCmpOGT(lhs.value, rhs.value));
3756 RValue<Bool> operator>=(RValue<Float> lhs, RValue<Float> rhs)
3758 return RValue<Bool>(Nucleus::createFCmpOGE(lhs.value, rhs.value));
3761 RValue<Bool> operator!=(RValue<Float> lhs, RValue<Float> rhs)
3763 return RValue<Bool>(Nucleus::createFCmpONE(lhs.value, rhs.value));
3766 RValue<Bool> operator==(RValue<Float> lhs, RValue<Float> rhs)
3768 return RValue<Bool>(Nucleus::createFCmpOEQ(lhs.value, rhs.value));
3771 RValue<Float> Abs(RValue<Float> x)
3773 return IfThenElse(x > 0.0f, x, -x);
3776 RValue<Float> Max(RValue<Float> x, RValue<Float> y)
3778 return IfThenElse(x > y, x, y);
3781 RValue<Float> Min(RValue<Float> x, RValue<Float> y)
3783 return IfThenElse(x < y, x, y);
3786 Float2::Float2(RValue<Float4> cast)
3788 storeValue(Nucleus::createBitCast(cast.value, getType()));
3791 Float4::Float4(RValue<Byte4> cast) : XYZW(this)
3793 Value *a = Int4(cast).loadValue();
3794 Value *xyzw = Nucleus::createSIToFP(a, Float4::getType());
3799 Float4::Float4(RValue<SByte4> cast) : XYZW(this)
3801 Value *a = Int4(cast).loadValue();
3802 Value *xyzw = Nucleus::createSIToFP(a, Float4::getType());
3807 Float4::Float4(RValue<Short4> cast) : XYZW(this)
3810 storeValue(Nucleus::createSIToFP(RValue<Int4>(c).value, Float4::getType()));
3813 Float4::Float4(RValue<UShort4> cast) : XYZW(this)
3816 storeValue(Nucleus::createSIToFP(RValue<Int4>(c).value, Float4::getType()));
3819 Float4::Float4(RValue<Int4> cast) : XYZW(this)
3821 Value *xyzw = Nucleus::createSIToFP(cast.value, Float4::getType());
3826 Float4::Float4(RValue<UInt4> cast) : XYZW(this)
3828 RValue<Float4> result = Float4(Int4(cast & UInt4(0x7FFFFFFF))) +
3829 As<Float4>((As<Int4>(cast) >> 31) & As<Int4>(Float4(0x80000000u)));
3831 storeValue(result.value);
3834 Float4::Float4() : XYZW(this)
3838 Float4::Float4(float xyzw) : XYZW(this)
3840 constant(xyzw, xyzw, xyzw, xyzw);
3843 Float4::Float4(float x, float yzw) : XYZW(this)
3845 constant(x, yzw, yzw, yzw);
3848 Float4::Float4(float x, float y, float zw) : XYZW(this)
3850 constant(x, y, zw, zw);
3853 Float4::Float4(float x, float y, float z, float w) : XYZW(this)
3855 constant(x, y, z, w);
3858 void Float4::constant(float x, float y, float z, float w)
3860 double constantVector[4] = {x, y, z, w};
3861 storeValue(Nucleus::createConstantVector(constantVector, getType()));
3864 Float4::Float4(RValue<Float4> rhs) : XYZW(this)
3866 storeValue(rhs.value);
3869 Float4::Float4(const Float4 &rhs) : XYZW(this)
3871 Value *value = rhs.loadValue();
3875 Float4::Float4(const Reference<Float4> &rhs) : XYZW(this)
3877 Value *value = rhs.loadValue();
3881 Float4::Float4(const Float &rhs) : XYZW(this)
3883 *this = RValue<Float>(rhs.loadValue());
3886 Float4::Float4(const Reference<Float> &rhs) : XYZW(this)
3888 *this = RValue<Float>(rhs.loadValue());
3891 RValue<Float4> Float4::operator=(float x)
3893 return *this = Float4(x, x, x, x);
3896 RValue<Float4> Float4::operator=(RValue<Float4> rhs)
3898 storeValue(rhs.value);
3903 RValue<Float4> Float4::operator=(const Float4 &rhs)
3905 Value *value = rhs.loadValue();
3908 return RValue<Float4>(value);
3911 RValue<Float4> Float4::operator=(const Reference<Float4> &rhs)
3913 Value *value = rhs.loadValue();
3916 return RValue<Float4>(value);
3919 RValue<Float4> Float4::operator=(RValue<Float> rhs)
3921 return *this = Float4(rhs);
3924 RValue<Float4> Float4::operator=(const Float &rhs)
3926 return *this = Float4(rhs);
3929 RValue<Float4> Float4::operator=(const Reference<Float> &rhs)
3931 return *this = Float4(rhs);
3934 RValue<Float4> operator+(RValue<Float4> lhs, RValue<Float4> rhs)
3936 return RValue<Float4>(Nucleus::createFAdd(lhs.value, rhs.value));
3939 RValue<Float4> operator-(RValue<Float4> lhs, RValue<Float4> rhs)
3941 return RValue<Float4>(Nucleus::createFSub(lhs.value, rhs.value));
3944 RValue<Float4> operator*(RValue<Float4> lhs, RValue<Float4> rhs)
3946 return RValue<Float4>(Nucleus::createFMul(lhs.value, rhs.value));
3949 RValue<Float4> operator/(RValue<Float4> lhs, RValue<Float4> rhs)
3951 return RValue<Float4>(Nucleus::createFDiv(lhs.value, rhs.value));
3954 RValue<Float4> operator%(RValue<Float4> lhs, RValue<Float4> rhs)
3956 return RValue<Float4>(Nucleus::createFRem(lhs.value, rhs.value));
3959 RValue<Float4> operator+=(Float4 &lhs, RValue<Float4> rhs)
3961 return lhs = lhs + rhs;
3964 RValue<Float4> operator-=(Float4 &lhs, RValue<Float4> rhs)
3966 return lhs = lhs - rhs;
3969 RValue<Float4> operator*=(Float4 &lhs, RValue<Float4> rhs)
3971 return lhs = lhs * rhs;
3974 RValue<Float4> operator/=(Float4 &lhs, RValue<Float4> rhs)
3976 return lhs = lhs / rhs;
3979 RValue<Float4> operator%=(Float4 &lhs, RValue<Float4> rhs)
3981 return lhs = lhs % rhs;
3984 RValue<Float4> operator+(RValue<Float4> val)
3989 RValue<Float4> operator-(RValue<Float4> val)
3991 return RValue<Float4>(Nucleus::createFNeg(val.value));
3994 RValue<Float4> Abs(RValue<Float4> x)
3997 Value *vector = Nucleus::createBitCast(x.value, Int4::getType());
3998 int64_t constantVector[4] = {0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF};
3999 Value *result = Nucleus::createAnd(vector, Nucleus::createConstantVector(constantVector, Int4::getType()));
4001 return As<Float4>(result);
4004 RValue<Float4> Insert(RValue<Float4> x, RValue<Float> element, int i)
4006 return RValue<Float4>(Nucleus::createInsertElement(x.value, element.value, i));
4009 RValue<Float> Extract(RValue<Float4> x, int i)
4011 return RValue<Float>(Nucleus::createExtractElement(x.value, Float::getType(), i));
4014 RValue<Float4> Swizzle(RValue<Float4> x, unsigned char select)
4016 return RValue<Float4>(createSwizzle4(x.value, select));
4019 RValue<Float4> ShuffleLowHigh(RValue<Float4> x, RValue<Float4> y, unsigned char imm)
4023 ((imm >> 0) & 0x03) + 0,
4024 ((imm >> 2) & 0x03) + 0,
4025 ((imm >> 4) & 0x03) + 4,
4026 ((imm >> 6) & 0x03) + 4,
4029 return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
4032 RValue<Float4> UnpackLow(RValue<Float4> x, RValue<Float4> y)
4034 int shuffle[4] = {0, 4, 1, 5};
4035 return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
4038 RValue<Float4> UnpackHigh(RValue<Float4> x, RValue<Float4> y)
4040 int shuffle[4] = {2, 6, 3, 7};
4041 return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
4044 RValue<Float4> Mask(Float4 &lhs, RValue<Float4> rhs, unsigned char select)
4046 Value *vector = lhs.loadValue();
4047 Value *result = createMask4(vector, rhs.value, select);
4048 lhs.storeValue(result);
4050 return RValue<Float4>(result);
4053 RValue<Int4> IsInf(RValue<Float4> x)
4055 return CmpEQ(As<Int4>(x) & Int4(0x7FFFFFFF), Int4(0x7F800000));
4058 RValue<Int4> IsNan(RValue<Float4> x)
4060 return ~CmpEQ(x, x);
4063 RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, int offset)
4065 return lhs + RValue<Int>(Nucleus::createConstantInt(offset));
4068 RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, RValue<Int> offset)
4070 return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value, Byte::getType(), offset.value, false));
4073 RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, RValue<UInt> offset)
4075 return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value, Byte::getType(), offset.value, true));
4078 RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, int offset)
4080 return lhs = lhs + offset;
4083 RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, RValue<Int> offset)
4085 return lhs = lhs + offset;
4088 RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, RValue<UInt> offset)
4090 return lhs = lhs + offset;
4093 RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, int offset)
4095 return lhs + -offset;
4098 RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, RValue<Int> offset)
4100 return lhs + -offset;
4103 RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, RValue<UInt> offset)
4105 return lhs + -offset;
4108 RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, int offset)
4110 return lhs = lhs - offset;
4113 RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, RValue<Int> offset)
4115 return lhs = lhs - offset;
4118 RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, RValue<UInt> offset)
4120 return lhs = lhs - offset;
4125 Nucleus::createRetVoid();
4126 Nucleus::setInsertBlock(Nucleus::createBasicBlock());
4127 Nucleus::createUnreachable();
4130 void Return(RValue<Int> ret)
4132 Nucleus::createRet(ret.value);
4133 Nucleus::setInsertBlock(Nucleus::createBasicBlock());
4134 Nucleus::createUnreachable();
4137 void branch(RValue<Bool> cmp, BasicBlock *bodyBB, BasicBlock *endBB)
4139 Nucleus::createCondBr(cmp.value, bodyBB, endBB);
4140 Nucleus::setInsertBlock(bodyBB);