blob: 7767c0fd572bb3bb79685354e86ec5277e2f8703 [file] [log] [blame]
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001// Copyright 2019 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#include "Reactor.hpp"
Ben Claytonb16c5862019-05-08 14:01:38 +010016#include "Debug.hpp"
Nicolas Capensb6d4ce32019-03-12 23:00:24 -040017
Nicolas Capensd94d6a32019-08-31 04:04:37 +000018#include <cmath>
19
Nicolas Capens0192d152019-03-27 14:46:07 -040020// Define REACTOR_MATERIALIZE_LVALUES_ON_DEFINITION to non-zero to ensure all
21// variables have a stack location obtained throuch alloca().
22#ifndef REACTOR_MATERIALIZE_LVALUES_ON_DEFINITION
23#define REACTOR_MATERIALIZE_LVALUES_ON_DEFINITION 0
24#endif
25
Nicolas Capens157ba262019-12-10 17:49:14 -050026namespace {
27
28// Introduced in C++20.
29template <class ForwardIterator, class UnaryPredicate>
30ForwardIterator remove_if(ForwardIterator first, ForwardIterator last,
31 UnaryPredicate pred)
Ben Clayton55bc37a2019-07-04 12:17:12 +010032{
Nicolas Capens157ba262019-12-10 17:49:14 -050033 ForwardIterator result = first;
34 while (first!=last) {
35 if (!pred(*first)) {
36 *result = std::move(*first);
37 ++result;
Ben Clayton55bc37a2019-07-04 12:17:12 +010038 }
Nicolas Capens157ba262019-12-10 17:49:14 -050039 ++first;
40 }
41 return result;
42}
43
44} // anonymous namespace
45
46namespace rr {
47
48const Config::Edit Config::Edit::None = {};
49
50Config Config::Edit::apply(const Config &cfg) const
51{
52 if (this == &None) { return cfg; }
53
54 auto level = optLevelChanged ? optLevel : cfg.optimization.getLevel();
55 auto passes = cfg.optimization.getPasses();
56 apply(optPassEdits, passes);
57 return Config{ Optimization{level, passes} };
58}
59
60template <typename T>
61void rr::Config::Edit::apply(const std::vector<std::pair<ListEdit, T>> & edits, std::vector<T>& list) const
62{
63 for (auto & edit : edits)
64 {
65 switch (edit.first)
66 {
67 case ListEdit::Add:
68 list.push_back(edit.second);
69 break;
70 case ListEdit::Remove:
71 ::remove_if(list.begin(), list.end(), [&](T item) { return item == edit.second; });
72 break;
73 case ListEdit::Clear:
74 list.clear();
75 break;
76 }
Ben Clayton55bc37a2019-07-04 12:17:12 +010077 }
78}
79
Nicolas Capens157ba262019-12-10 17:49:14 -050080// Set of variables that do not have a stack location yet.
81std::unordered_set<Variable*> Variable::unmaterializedVariables;
82
83Variable::Variable(Type *type, int arraySize) : arraySize(arraySize), type(type)
Nicolas Capensb6d4ce32019-03-12 23:00:24 -040084{
Nicolas Capens157ba262019-12-10 17:49:14 -050085 #if REACTOR_MATERIALIZE_LVALUES_ON_DEFINITION
86 materialize();
87 #else
88 unmaterializedVariables.emplace(this);
89 #endif
90}
Ben Clayton55bc37a2019-07-04 12:17:12 +010091
Nicolas Capens157ba262019-12-10 17:49:14 -050092Variable::~Variable()
93{
94 unmaterializedVariables.erase(this);
95}
Ben Clayton55bc37a2019-07-04 12:17:12 +010096
Nicolas Capens157ba262019-12-10 17:49:14 -050097void Variable::materializeAll()
98{
99 for(auto *var : unmaterializedVariables)
Ben Clayton55bc37a2019-07-04 12:17:12 +0100100 {
Nicolas Capens157ba262019-12-10 17:49:14 -0500101 var->materialize();
Ben Clayton55bc37a2019-07-04 12:17:12 +0100102 }
103
Nicolas Capens157ba262019-12-10 17:49:14 -0500104 unmaterializedVariables.clear();
105}
Nicolas Capens0192d152019-03-27 14:46:07 -0400106
Nicolas Capens157ba262019-12-10 17:49:14 -0500107void Variable::killUnmaterialized()
108{
109 unmaterializedVariables.clear();
110}
Nicolas Capens0192d152019-03-27 14:46:07 -0400111
Nicolas Capens157ba262019-12-10 17:49:14 -0500112// NOTE: Only 12 bits out of 16 of the |select| value are used.
113// More specifically, the value should look like:
114//
115// msb lsb
116// v v
117// [.xxx|.yyy|.zzz|.www] where '.' means an ignored bit
118//
119// This format makes it easy to write calls with hexadecimal select values,
120// since each hex digit is a separate swizzle index.
121//
122// For example:
123// createBlend4( [a,b,c,d], [e,f,g,h], 0x0123 ) -> [a,b,c,d]
124// createBlend4( [a,b,c,d], [e,f,g,h], 0x4567 ) -> [e,f,g,h]
125// createBlend4( [a,b,c,d], [e,f,g,h], 0x4012 ) -> [e,a,b,c]
126//
127static Value *createBlend4(Value *lhs, Value *rhs, uint16_t select)
128{
129 int swizzle[4] =
Nicolas Capens0192d152019-03-27 14:46:07 -0400130 {
Nicolas Capens157ba262019-12-10 17:49:14 -0500131 (select >> 12) & 0x07,
132 (select >> 8) & 0x07,
133 (select >> 4) & 0x07,
134 (select >> 0) & 0x07,
135 };
Nicolas Capens0192d152019-03-27 14:46:07 -0400136
Nicolas Capens157ba262019-12-10 17:49:14 -0500137 return Nucleus::createShuffleVector(lhs, rhs, swizzle);
138}
Nicolas Capens0192d152019-03-27 14:46:07 -0400139
Nicolas Capens157ba262019-12-10 17:49:14 -0500140// NOTE: Only 8 bits out of 16 of the |select| value are used.
141// More specifically, the value should look like:
142//
143// msb lsb
144// v v
145// [..xx|..yy|..zz|..ww] where '.' means an ignored bit
146//
147// This format makes it easy to write calls with hexadecimal select values,
148// since each hex digit is a separate swizzle index.
149//
150// For example:
151// createSwizzle4( [a,b,c,d], 0x0123 ) -> [a,b,c,d]
152// createSwizzle4( [a,b,c,d], 0x0033 ) -> [a,a,d,d]
153//
154static Value *createSwizzle4(Value *val, uint16_t select)
155{
156 int swizzle[4] =
Nicolas Capens0192d152019-03-27 14:46:07 -0400157 {
Nicolas Capens157ba262019-12-10 17:49:14 -0500158 (select >> 12) & 0x03,
159 (select >> 8) & 0x03,
160 (select >> 4) & 0x03,
161 (select >> 0) & 0x03,
162 };
David 'Digit' Turnerb9f03f42019-12-04 19:32:34 +0100163
Nicolas Capens157ba262019-12-10 17:49:14 -0500164 return Nucleus::createShuffleVector(val, val, swizzle);
165}
David 'Digit' Turnerb9f03f42019-12-04 19:32:34 +0100166
Nicolas Capens157ba262019-12-10 17:49:14 -0500167static Value *createMask4(Value *lhs, Value *rhs, uint16_t select)
168{
169 bool mask[4] = {false, false, false, false};
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400170
Nicolas Capens157ba262019-12-10 17:49:14 -0500171 mask[(select >> 12) & 0x03] = true;
172 mask[(select >> 8) & 0x03] = true;
173 mask[(select >> 4) & 0x03] = true;
174 mask[(select >> 0) & 0x03] = true;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400175
Nicolas Capens157ba262019-12-10 17:49:14 -0500176 int swizzle[4] =
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400177 {
Nicolas Capens157ba262019-12-10 17:49:14 -0500178 mask[0] ? 4 : 0,
179 mask[1] ? 5 : 1,
180 mask[2] ? 6 : 2,
181 mask[3] ? 7 : 3,
182 };
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400183
Nicolas Capens157ba262019-12-10 17:49:14 -0500184 return Nucleus::createShuffleVector(lhs, rhs, swizzle);
185}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400186
Nicolas Capens157ba262019-12-10 17:49:14 -0500187Bool::Bool(Argument<Bool> argument)
188{
189 storeValue(argument.value);
190}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400191
Nicolas Capens157ba262019-12-10 17:49:14 -0500192Bool::Bool(bool x)
193{
194 storeValue(Nucleus::createConstantBool(x));
195}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400196
Nicolas Capens157ba262019-12-10 17:49:14 -0500197Bool::Bool(RValue<Bool> rhs)
198{
199 storeValue(rhs.value);
200}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400201
Nicolas Capens157ba262019-12-10 17:49:14 -0500202Bool::Bool(const Bool &rhs)
203{
204 Value *value = rhs.loadValue();
205 storeValue(value);
206}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400207
Nicolas Capens157ba262019-12-10 17:49:14 -0500208Bool::Bool(const Reference<Bool> &rhs)
209{
210 Value *value = rhs.loadValue();
211 storeValue(value);
212}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400213
Nicolas Capens157ba262019-12-10 17:49:14 -0500214RValue<Bool> Bool::operator=(RValue<Bool> rhs)
215{
216 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400217
Nicolas Capens157ba262019-12-10 17:49:14 -0500218 return rhs;
219}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400220
Nicolas Capens157ba262019-12-10 17:49:14 -0500221RValue<Bool> Bool::operator=(const Bool &rhs)
222{
223 Value *value = rhs.loadValue();
224 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400225
Nicolas Capens157ba262019-12-10 17:49:14 -0500226 return RValue<Bool>(value);
227}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400228
Nicolas Capens157ba262019-12-10 17:49:14 -0500229RValue<Bool> Bool::operator=(const Reference<Bool> &rhs)
230{
231 Value *value = rhs.loadValue();
232 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400233
Nicolas Capens157ba262019-12-10 17:49:14 -0500234 return RValue<Bool>(value);
235}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400236
Nicolas Capens157ba262019-12-10 17:49:14 -0500237RValue<Bool> operator!(RValue<Bool> val)
238{
239 return RValue<Bool>(Nucleus::createNot(val.value));
240}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400241
Nicolas Capens157ba262019-12-10 17:49:14 -0500242RValue<Bool> operator&&(RValue<Bool> lhs, RValue<Bool> rhs)
243{
244 return RValue<Bool>(Nucleus::createAnd(lhs.value, rhs.value));
245}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400246
Nicolas Capens157ba262019-12-10 17:49:14 -0500247RValue<Bool> operator||(RValue<Bool> lhs, RValue<Bool> rhs)
248{
249 return RValue<Bool>(Nucleus::createOr(lhs.value, rhs.value));
250}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400251
Nicolas Capens157ba262019-12-10 17:49:14 -0500252RValue<Bool> operator!=(RValue<Bool> lhs, RValue<Bool> rhs)
253{
254 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
255}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400256
Nicolas Capens157ba262019-12-10 17:49:14 -0500257RValue<Bool> operator==(RValue<Bool> lhs, RValue<Bool> rhs)
258{
259 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
260}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400261
Nicolas Capens157ba262019-12-10 17:49:14 -0500262Byte::Byte(Argument<Byte> argument)
263{
264 storeValue(argument.value);
265}
Ben Claytonf3b57972019-03-15 09:56:47 +0000266
Nicolas Capens157ba262019-12-10 17:49:14 -0500267Byte::Byte(RValue<Int> cast)
268{
269 Value *integer = Nucleus::createTrunc(cast.value, Byte::getType());
Ben Claytonf3b57972019-03-15 09:56:47 +0000270
Nicolas Capens157ba262019-12-10 17:49:14 -0500271 storeValue(integer);
272}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400273
Nicolas Capens157ba262019-12-10 17:49:14 -0500274Byte::Byte(RValue<UInt> cast)
275{
276 Value *integer = Nucleus::createTrunc(cast.value, Byte::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400277
Nicolas Capens157ba262019-12-10 17:49:14 -0500278 storeValue(integer);
279}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400280
Nicolas Capens157ba262019-12-10 17:49:14 -0500281Byte::Byte(RValue<UShort> cast)
282{
283 Value *integer = Nucleus::createTrunc(cast.value, Byte::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400284
Nicolas Capens157ba262019-12-10 17:49:14 -0500285 storeValue(integer);
286}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400287
Nicolas Capens157ba262019-12-10 17:49:14 -0500288Byte::Byte(int x)
289{
290 storeValue(Nucleus::createConstantByte((unsigned char)x));
291}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400292
Nicolas Capens157ba262019-12-10 17:49:14 -0500293Byte::Byte(unsigned char x)
294{
295 storeValue(Nucleus::createConstantByte(x));
296}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400297
Nicolas Capens157ba262019-12-10 17:49:14 -0500298Byte::Byte(RValue<Byte> rhs)
299{
300 storeValue(rhs.value);
301}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400302
Nicolas Capens157ba262019-12-10 17:49:14 -0500303Byte::Byte(const Byte &rhs)
304{
305 Value *value = rhs.loadValue();
306 storeValue(value);
307}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400308
Nicolas Capens157ba262019-12-10 17:49:14 -0500309Byte::Byte(const Reference<Byte> &rhs)
310{
311 Value *value = rhs.loadValue();
312 storeValue(value);
313}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400314
Nicolas Capens157ba262019-12-10 17:49:14 -0500315RValue<Byte> Byte::operator=(RValue<Byte> rhs)
316{
317 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400318
Nicolas Capens157ba262019-12-10 17:49:14 -0500319 return rhs;
320}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400321
Nicolas Capens157ba262019-12-10 17:49:14 -0500322RValue<Byte> Byte::operator=(const Byte &rhs)
323{
324 Value *value = rhs.loadValue();
325 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400326
Nicolas Capens157ba262019-12-10 17:49:14 -0500327 return RValue<Byte>(value);
328}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400329
Nicolas Capens157ba262019-12-10 17:49:14 -0500330RValue<Byte> Byte::operator=(const Reference<Byte> &rhs)
331{
332 Value *value = rhs.loadValue();
333 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400334
Nicolas Capens157ba262019-12-10 17:49:14 -0500335 return RValue<Byte>(value);
336}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400337
Nicolas Capens157ba262019-12-10 17:49:14 -0500338RValue<Byte> operator+(RValue<Byte> lhs, RValue<Byte> rhs)
339{
340 return RValue<Byte>(Nucleus::createAdd(lhs.value, rhs.value));
341}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400342
Nicolas Capens157ba262019-12-10 17:49:14 -0500343RValue<Byte> operator-(RValue<Byte> lhs, RValue<Byte> rhs)
344{
345 return RValue<Byte>(Nucleus::createSub(lhs.value, rhs.value));
346}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400347
Nicolas Capens157ba262019-12-10 17:49:14 -0500348RValue<Byte> operator*(RValue<Byte> lhs, RValue<Byte> rhs)
349{
350 return RValue<Byte>(Nucleus::createMul(lhs.value, rhs.value));
351}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400352
Nicolas Capens157ba262019-12-10 17:49:14 -0500353RValue<Byte> operator/(RValue<Byte> lhs, RValue<Byte> rhs)
354{
355 return RValue<Byte>(Nucleus::createUDiv(lhs.value, rhs.value));
356}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400357
Nicolas Capens157ba262019-12-10 17:49:14 -0500358RValue<Byte> operator%(RValue<Byte> lhs, RValue<Byte> rhs)
359{
360 return RValue<Byte>(Nucleus::createURem(lhs.value, rhs.value));
361}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400362
Nicolas Capens157ba262019-12-10 17:49:14 -0500363RValue<Byte> operator&(RValue<Byte> lhs, RValue<Byte> rhs)
364{
365 return RValue<Byte>(Nucleus::createAnd(lhs.value, rhs.value));
366}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400367
Nicolas Capens157ba262019-12-10 17:49:14 -0500368RValue<Byte> operator|(RValue<Byte> lhs, RValue<Byte> rhs)
369{
370 return RValue<Byte>(Nucleus::createOr(lhs.value, rhs.value));
371}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400372
Nicolas Capens157ba262019-12-10 17:49:14 -0500373RValue<Byte> operator^(RValue<Byte> lhs, RValue<Byte> rhs)
374{
375 return RValue<Byte>(Nucleus::createXor(lhs.value, rhs.value));
376}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400377
Nicolas Capens157ba262019-12-10 17:49:14 -0500378RValue<Byte> operator<<(RValue<Byte> lhs, RValue<Byte> rhs)
379{
380 return RValue<Byte>(Nucleus::createShl(lhs.value, rhs.value));
381}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400382
Nicolas Capens157ba262019-12-10 17:49:14 -0500383RValue<Byte> operator>>(RValue<Byte> lhs, RValue<Byte> rhs)
384{
385 return RValue<Byte>(Nucleus::createLShr(lhs.value, rhs.value));
386}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400387
Nicolas Capens157ba262019-12-10 17:49:14 -0500388RValue<Byte> operator+=(Byte &lhs, RValue<Byte> rhs)
389{
390 return lhs = lhs + rhs;
391}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400392
Nicolas Capens157ba262019-12-10 17:49:14 -0500393RValue<Byte> operator-=(Byte &lhs, RValue<Byte> rhs)
394{
395 return lhs = lhs - rhs;
396}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400397
Nicolas Capens157ba262019-12-10 17:49:14 -0500398RValue<Byte> operator*=(Byte &lhs, RValue<Byte> rhs)
399{
400 return lhs = lhs * rhs;
401}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400402
Nicolas Capens157ba262019-12-10 17:49:14 -0500403RValue<Byte> operator/=(Byte &lhs, RValue<Byte> rhs)
404{
405 return lhs = lhs / rhs;
406}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400407
Nicolas Capens157ba262019-12-10 17:49:14 -0500408RValue<Byte> operator%=(Byte &lhs, RValue<Byte> rhs)
409{
410 return lhs = lhs % rhs;
411}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400412
Nicolas Capens157ba262019-12-10 17:49:14 -0500413RValue<Byte> operator&=(Byte &lhs, RValue<Byte> rhs)
414{
415 return lhs = lhs & rhs;
416}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400417
Nicolas Capens157ba262019-12-10 17:49:14 -0500418RValue<Byte> operator|=(Byte &lhs, RValue<Byte> rhs)
419{
420 return lhs = lhs | rhs;
421}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400422
Nicolas Capens157ba262019-12-10 17:49:14 -0500423RValue<Byte> operator^=(Byte &lhs, RValue<Byte> rhs)
424{
425 return lhs = lhs ^ rhs;
426}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400427
Nicolas Capens157ba262019-12-10 17:49:14 -0500428RValue<Byte> operator<<=(Byte &lhs, RValue<Byte> rhs)
429{
430 return lhs = lhs << rhs;
431}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400432
Nicolas Capens157ba262019-12-10 17:49:14 -0500433RValue<Byte> operator>>=(Byte &lhs, RValue<Byte> rhs)
434{
435 return lhs = lhs >> rhs;
436}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400437
Nicolas Capens157ba262019-12-10 17:49:14 -0500438RValue<Byte> operator+(RValue<Byte> val)
439{
440 return val;
441}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400442
Nicolas Capens157ba262019-12-10 17:49:14 -0500443RValue<Byte> operator-(RValue<Byte> val)
444{
445 return RValue<Byte>(Nucleus::createNeg(val.value));
446}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400447
Nicolas Capens157ba262019-12-10 17:49:14 -0500448RValue<Byte> operator~(RValue<Byte> val)
449{
450 return RValue<Byte>(Nucleus::createNot(val.value));
451}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400452
Nicolas Capens157ba262019-12-10 17:49:14 -0500453RValue<Byte> operator++(Byte &val, int) // Post-increment
454{
455 RValue<Byte> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400456
Nicolas Capens157ba262019-12-10 17:49:14 -0500457 Value *inc = Nucleus::createAdd(res.value, Nucleus::createConstantByte((unsigned char)1));
458 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400459
Nicolas Capens157ba262019-12-10 17:49:14 -0500460 return res;
461}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400462
Nicolas Capens157ba262019-12-10 17:49:14 -0500463const Byte &operator++(Byte &val) // Pre-increment
464{
465 Value *inc = Nucleus::createAdd(val.loadValue(), Nucleus::createConstantByte((unsigned char)1));
466 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400467
Nicolas Capens157ba262019-12-10 17:49:14 -0500468 return val;
469}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400470
Nicolas Capens157ba262019-12-10 17:49:14 -0500471RValue<Byte> operator--(Byte &val, int) // Post-decrement
472{
473 RValue<Byte> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400474
Nicolas Capens157ba262019-12-10 17:49:14 -0500475 Value *inc = Nucleus::createSub(res.value, Nucleus::createConstantByte((unsigned char)1));
476 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400477
Nicolas Capens157ba262019-12-10 17:49:14 -0500478 return res;
479}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400480
Nicolas Capens157ba262019-12-10 17:49:14 -0500481const Byte &operator--(Byte &val) // Pre-decrement
482{
483 Value *inc = Nucleus::createSub(val.loadValue(), Nucleus::createConstantByte((unsigned char)1));
484 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400485
Nicolas Capens157ba262019-12-10 17:49:14 -0500486 return val;
487}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400488
Nicolas Capens157ba262019-12-10 17:49:14 -0500489RValue<Bool> operator<(RValue<Byte> lhs, RValue<Byte> rhs)
490{
491 return RValue<Bool>(Nucleus::createICmpULT(lhs.value, rhs.value));
492}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400493
Nicolas Capens157ba262019-12-10 17:49:14 -0500494RValue<Bool> operator<=(RValue<Byte> lhs, RValue<Byte> rhs)
495{
496 return RValue<Bool>(Nucleus::createICmpULE(lhs.value, rhs.value));
497}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400498
Nicolas Capens157ba262019-12-10 17:49:14 -0500499RValue<Bool> operator>(RValue<Byte> lhs, RValue<Byte> rhs)
500{
501 return RValue<Bool>(Nucleus::createICmpUGT(lhs.value, rhs.value));
502}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400503
Nicolas Capens157ba262019-12-10 17:49:14 -0500504RValue<Bool> operator>=(RValue<Byte> lhs, RValue<Byte> rhs)
505{
506 return RValue<Bool>(Nucleus::createICmpUGE(lhs.value, rhs.value));
507}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400508
Nicolas Capens157ba262019-12-10 17:49:14 -0500509RValue<Bool> operator!=(RValue<Byte> lhs, RValue<Byte> rhs)
510{
511 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
512}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400513
Nicolas Capens157ba262019-12-10 17:49:14 -0500514RValue<Bool> operator==(RValue<Byte> lhs, RValue<Byte> rhs)
515{
516 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
517}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400518
Nicolas Capens157ba262019-12-10 17:49:14 -0500519SByte::SByte(Argument<SByte> argument)
520{
521 storeValue(argument.value);
522}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400523
Nicolas Capens157ba262019-12-10 17:49:14 -0500524SByte::SByte(RValue<Int> cast)
525{
526 Value *integer = Nucleus::createTrunc(cast.value, SByte::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400527
Nicolas Capens157ba262019-12-10 17:49:14 -0500528 storeValue(integer);
529}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400530
Nicolas Capens157ba262019-12-10 17:49:14 -0500531SByte::SByte(RValue<Short> cast)
532{
533 Value *integer = Nucleus::createTrunc(cast.value, SByte::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400534
Nicolas Capens157ba262019-12-10 17:49:14 -0500535 storeValue(integer);
536}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400537
Nicolas Capens157ba262019-12-10 17:49:14 -0500538SByte::SByte(signed char x)
539{
540 storeValue(Nucleus::createConstantByte(x));
541}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400542
Nicolas Capens157ba262019-12-10 17:49:14 -0500543SByte::SByte(RValue<SByte> rhs)
544{
545 storeValue(rhs.value);
546}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400547
Nicolas Capens157ba262019-12-10 17:49:14 -0500548SByte::SByte(const SByte &rhs)
549{
550 Value *value = rhs.loadValue();
551 storeValue(value);
552}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400553
Nicolas Capens157ba262019-12-10 17:49:14 -0500554SByte::SByte(const Reference<SByte> &rhs)
555{
556 Value *value = rhs.loadValue();
557 storeValue(value);
558}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400559
Nicolas Capens157ba262019-12-10 17:49:14 -0500560RValue<SByte> SByte::operator=(RValue<SByte> rhs)
561{
562 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400563
Nicolas Capens157ba262019-12-10 17:49:14 -0500564 return rhs;
565}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400566
Nicolas Capens157ba262019-12-10 17:49:14 -0500567RValue<SByte> SByte::operator=(const SByte &rhs)
568{
569 Value *value = rhs.loadValue();
570 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400571
Nicolas Capens157ba262019-12-10 17:49:14 -0500572 return RValue<SByte>(value);
573}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400574
Nicolas Capens157ba262019-12-10 17:49:14 -0500575RValue<SByte> SByte::operator=(const Reference<SByte> &rhs)
576{
577 Value *value = rhs.loadValue();
578 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400579
Nicolas Capens157ba262019-12-10 17:49:14 -0500580 return RValue<SByte>(value);
581}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400582
Nicolas Capens157ba262019-12-10 17:49:14 -0500583RValue<SByte> operator+(RValue<SByte> lhs, RValue<SByte> rhs)
584{
585 return RValue<SByte>(Nucleus::createAdd(lhs.value, rhs.value));
586}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400587
Nicolas Capens157ba262019-12-10 17:49:14 -0500588RValue<SByte> operator-(RValue<SByte> lhs, RValue<SByte> rhs)
589{
590 return RValue<SByte>(Nucleus::createSub(lhs.value, rhs.value));
591}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400592
Nicolas Capens157ba262019-12-10 17:49:14 -0500593RValue<SByte> operator*(RValue<SByte> lhs, RValue<SByte> rhs)
594{
595 return RValue<SByte>(Nucleus::createMul(lhs.value, rhs.value));
596}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400597
Nicolas Capens157ba262019-12-10 17:49:14 -0500598RValue<SByte> operator/(RValue<SByte> lhs, RValue<SByte> rhs)
599{
600 return RValue<SByte>(Nucleus::createSDiv(lhs.value, rhs.value));
601}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400602
Nicolas Capens157ba262019-12-10 17:49:14 -0500603RValue<SByte> operator%(RValue<SByte> lhs, RValue<SByte> rhs)
604{
605 return RValue<SByte>(Nucleus::createSRem(lhs.value, rhs.value));
606}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400607
Nicolas Capens157ba262019-12-10 17:49:14 -0500608RValue<SByte> operator&(RValue<SByte> lhs, RValue<SByte> rhs)
609{
610 return RValue<SByte>(Nucleus::createAnd(lhs.value, rhs.value));
611}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400612
Nicolas Capens157ba262019-12-10 17:49:14 -0500613RValue<SByte> operator|(RValue<SByte> lhs, RValue<SByte> rhs)
614{
615 return RValue<SByte>(Nucleus::createOr(lhs.value, rhs.value));
616}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400617
Nicolas Capens157ba262019-12-10 17:49:14 -0500618RValue<SByte> operator^(RValue<SByte> lhs, RValue<SByte> rhs)
619{
620 return RValue<SByte>(Nucleus::createXor(lhs.value, rhs.value));
621}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400622
Nicolas Capens157ba262019-12-10 17:49:14 -0500623RValue<SByte> operator<<(RValue<SByte> lhs, RValue<SByte> rhs)
624{
625 return RValue<SByte>(Nucleus::createShl(lhs.value, rhs.value));
626}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400627
Nicolas Capens157ba262019-12-10 17:49:14 -0500628RValue<SByte> operator>>(RValue<SByte> lhs, RValue<SByte> rhs)
629{
630 return RValue<SByte>(Nucleus::createAShr(lhs.value, rhs.value));
631}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400632
Nicolas Capens157ba262019-12-10 17:49:14 -0500633RValue<SByte> operator+=(SByte &lhs, RValue<SByte> rhs)
634{
635 return lhs = lhs + rhs;
636}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400637
Nicolas Capens157ba262019-12-10 17:49:14 -0500638RValue<SByte> operator-=(SByte &lhs, RValue<SByte> rhs)
639{
640 return lhs = lhs - rhs;
641}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400642
Nicolas Capens157ba262019-12-10 17:49:14 -0500643RValue<SByte> operator*=(SByte &lhs, RValue<SByte> rhs)
644{
645 return lhs = lhs * rhs;
646}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400647
Nicolas Capens157ba262019-12-10 17:49:14 -0500648RValue<SByte> operator/=(SByte &lhs, RValue<SByte> rhs)
649{
650 return lhs = lhs / rhs;
651}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400652
Nicolas Capens157ba262019-12-10 17:49:14 -0500653RValue<SByte> operator%=(SByte &lhs, RValue<SByte> rhs)
654{
655 return lhs = lhs % rhs;
656}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400657
Nicolas Capens157ba262019-12-10 17:49:14 -0500658RValue<SByte> operator&=(SByte &lhs, RValue<SByte> rhs)
659{
660 return lhs = lhs & rhs;
661}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400662
Nicolas Capens157ba262019-12-10 17:49:14 -0500663RValue<SByte> operator|=(SByte &lhs, RValue<SByte> rhs)
664{
665 return lhs = lhs | rhs;
666}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400667
Nicolas Capens157ba262019-12-10 17:49:14 -0500668RValue<SByte> operator^=(SByte &lhs, RValue<SByte> rhs)
669{
670 return lhs = lhs ^ rhs;
671}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400672
Nicolas Capens157ba262019-12-10 17:49:14 -0500673RValue<SByte> operator<<=(SByte &lhs, RValue<SByte> rhs)
674{
675 return lhs = lhs << rhs;
676}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400677
Nicolas Capens157ba262019-12-10 17:49:14 -0500678RValue<SByte> operator>>=(SByte &lhs, RValue<SByte> rhs)
679{
680 return lhs = lhs >> rhs;
681}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400682
Nicolas Capens157ba262019-12-10 17:49:14 -0500683RValue<SByte> operator+(RValue<SByte> val)
684{
685 return val;
686}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400687
Nicolas Capens157ba262019-12-10 17:49:14 -0500688RValue<SByte> operator-(RValue<SByte> val)
689{
690 return RValue<SByte>(Nucleus::createNeg(val.value));
691}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400692
Nicolas Capens157ba262019-12-10 17:49:14 -0500693RValue<SByte> operator~(RValue<SByte> val)
694{
695 return RValue<SByte>(Nucleus::createNot(val.value));
696}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400697
Nicolas Capens157ba262019-12-10 17:49:14 -0500698RValue<SByte> operator++(SByte &val, int) // Post-increment
699{
700 RValue<SByte> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400701
Nicolas Capens157ba262019-12-10 17:49:14 -0500702 Value *inc = Nucleus::createAdd(res.value, Nucleus::createConstantByte((signed char)1));
703 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400704
Nicolas Capens157ba262019-12-10 17:49:14 -0500705 return res;
706}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400707
Nicolas Capens157ba262019-12-10 17:49:14 -0500708const SByte &operator++(SByte &val) // Pre-increment
709{
710 Value *inc = Nucleus::createAdd(val.loadValue(), Nucleus::createConstantByte((signed char)1));
711 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400712
Nicolas Capens157ba262019-12-10 17:49:14 -0500713 return val;
714}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400715
Nicolas Capens157ba262019-12-10 17:49:14 -0500716RValue<SByte> operator--(SByte &val, int) // Post-decrement
717{
718 RValue<SByte> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400719
Nicolas Capens157ba262019-12-10 17:49:14 -0500720 Value *inc = Nucleus::createSub(res.value, Nucleus::createConstantByte((signed char)1));
721 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400722
Nicolas Capens157ba262019-12-10 17:49:14 -0500723 return res;
724}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400725
Nicolas Capens157ba262019-12-10 17:49:14 -0500726const SByte &operator--(SByte &val) // Pre-decrement
727{
728 Value *inc = Nucleus::createSub(val.loadValue(), Nucleus::createConstantByte((signed char)1));
729 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400730
Nicolas Capens157ba262019-12-10 17:49:14 -0500731 return val;
732}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400733
Nicolas Capens157ba262019-12-10 17:49:14 -0500734RValue<Bool> operator<(RValue<SByte> lhs, RValue<SByte> rhs)
735{
736 return RValue<Bool>(Nucleus::createICmpSLT(lhs.value, rhs.value));
737}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400738
Nicolas Capens157ba262019-12-10 17:49:14 -0500739RValue<Bool> operator<=(RValue<SByte> lhs, RValue<SByte> rhs)
740{
741 return RValue<Bool>(Nucleus::createICmpSLE(lhs.value, rhs.value));
742}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400743
Nicolas Capens157ba262019-12-10 17:49:14 -0500744RValue<Bool> operator>(RValue<SByte> lhs, RValue<SByte> rhs)
745{
746 return RValue<Bool>(Nucleus::createICmpSGT(lhs.value, rhs.value));
747}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400748
Nicolas Capens157ba262019-12-10 17:49:14 -0500749RValue<Bool> operator>=(RValue<SByte> lhs, RValue<SByte> rhs)
750{
751 return RValue<Bool>(Nucleus::createICmpSGE(lhs.value, rhs.value));
752}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400753
Nicolas Capens157ba262019-12-10 17:49:14 -0500754RValue<Bool> operator!=(RValue<SByte> lhs, RValue<SByte> rhs)
755{
756 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
757}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400758
Nicolas Capens157ba262019-12-10 17:49:14 -0500759RValue<Bool> operator==(RValue<SByte> lhs, RValue<SByte> rhs)
760{
761 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
762}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400763
Nicolas Capens157ba262019-12-10 17:49:14 -0500764Short::Short(Argument<Short> argument)
765{
766 storeValue(argument.value);
767}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400768
Nicolas Capens157ba262019-12-10 17:49:14 -0500769Short::Short(RValue<Int> cast)
770{
771 Value *integer = Nucleus::createTrunc(cast.value, Short::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400772
Nicolas Capens157ba262019-12-10 17:49:14 -0500773 storeValue(integer);
774}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400775
Nicolas Capens157ba262019-12-10 17:49:14 -0500776Short::Short(short x)
777{
778 storeValue(Nucleus::createConstantShort(x));
779}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400780
Nicolas Capens157ba262019-12-10 17:49:14 -0500781Short::Short(RValue<Short> rhs)
782{
783 storeValue(rhs.value);
784}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400785
Nicolas Capens157ba262019-12-10 17:49:14 -0500786Short::Short(const Short &rhs)
787{
788 Value *value = rhs.loadValue();
789 storeValue(value);
790}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400791
Nicolas Capens157ba262019-12-10 17:49:14 -0500792Short::Short(const Reference<Short> &rhs)
793{
794 Value *value = rhs.loadValue();
795 storeValue(value);
796}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400797
Nicolas Capens157ba262019-12-10 17:49:14 -0500798RValue<Short> Short::operator=(RValue<Short> rhs)
799{
800 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400801
Nicolas Capens157ba262019-12-10 17:49:14 -0500802 return rhs;
803}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400804
Nicolas Capens157ba262019-12-10 17:49:14 -0500805RValue<Short> Short::operator=(const Short &rhs)
806{
807 Value *value = rhs.loadValue();
808 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400809
Nicolas Capens157ba262019-12-10 17:49:14 -0500810 return RValue<Short>(value);
811}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400812
Nicolas Capens157ba262019-12-10 17:49:14 -0500813RValue<Short> Short::operator=(const Reference<Short> &rhs)
814{
815 Value *value = rhs.loadValue();
816 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400817
Nicolas Capens157ba262019-12-10 17:49:14 -0500818 return RValue<Short>(value);
819}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400820
Nicolas Capens157ba262019-12-10 17:49:14 -0500821RValue<Short> operator+(RValue<Short> lhs, RValue<Short> rhs)
822{
823 return RValue<Short>(Nucleus::createAdd(lhs.value, rhs.value));
824}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400825
Nicolas Capens157ba262019-12-10 17:49:14 -0500826RValue<Short> operator-(RValue<Short> lhs, RValue<Short> rhs)
827{
828 return RValue<Short>(Nucleus::createSub(lhs.value, rhs.value));
829}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400830
Nicolas Capens157ba262019-12-10 17:49:14 -0500831RValue<Short> operator*(RValue<Short> lhs, RValue<Short> rhs)
832{
833 return RValue<Short>(Nucleus::createMul(lhs.value, rhs.value));
834}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400835
Nicolas Capens157ba262019-12-10 17:49:14 -0500836RValue<Short> operator/(RValue<Short> lhs, RValue<Short> rhs)
837{
838 return RValue<Short>(Nucleus::createSDiv(lhs.value, rhs.value));
839}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400840
Nicolas Capens157ba262019-12-10 17:49:14 -0500841RValue<Short> operator%(RValue<Short> lhs, RValue<Short> rhs)
842{
843 return RValue<Short>(Nucleus::createSRem(lhs.value, rhs.value));
844}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400845
Nicolas Capens157ba262019-12-10 17:49:14 -0500846RValue<Short> operator&(RValue<Short> lhs, RValue<Short> rhs)
847{
848 return RValue<Short>(Nucleus::createAnd(lhs.value, rhs.value));
849}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400850
Nicolas Capens157ba262019-12-10 17:49:14 -0500851RValue<Short> operator|(RValue<Short> lhs, RValue<Short> rhs)
852{
853 return RValue<Short>(Nucleus::createOr(lhs.value, rhs.value));
854}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400855
Nicolas Capens157ba262019-12-10 17:49:14 -0500856RValue<Short> operator^(RValue<Short> lhs, RValue<Short> rhs)
857{
858 return RValue<Short>(Nucleus::createXor(lhs.value, rhs.value));
859}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400860
Nicolas Capens157ba262019-12-10 17:49:14 -0500861RValue<Short> operator<<(RValue<Short> lhs, RValue<Short> rhs)
862{
863 return RValue<Short>(Nucleus::createShl(lhs.value, rhs.value));
864}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400865
Nicolas Capens157ba262019-12-10 17:49:14 -0500866RValue<Short> operator>>(RValue<Short> lhs, RValue<Short> rhs)
867{
868 return RValue<Short>(Nucleus::createAShr(lhs.value, rhs.value));
869}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400870
Nicolas Capens157ba262019-12-10 17:49:14 -0500871RValue<Short> operator+=(Short &lhs, RValue<Short> rhs)
872{
873 return lhs = lhs + rhs;
874}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400875
Nicolas Capens157ba262019-12-10 17:49:14 -0500876RValue<Short> operator-=(Short &lhs, RValue<Short> rhs)
877{
878 return lhs = lhs - rhs;
879}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400880
Nicolas Capens157ba262019-12-10 17:49:14 -0500881RValue<Short> operator*=(Short &lhs, RValue<Short> rhs)
882{
883 return lhs = lhs * rhs;
884}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400885
Nicolas Capens157ba262019-12-10 17:49:14 -0500886RValue<Short> operator/=(Short &lhs, RValue<Short> rhs)
887{
888 return lhs = lhs / rhs;
889}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400890
Nicolas Capens157ba262019-12-10 17:49:14 -0500891RValue<Short> operator%=(Short &lhs, RValue<Short> rhs)
892{
893 return lhs = lhs % rhs;
894}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400895
Nicolas Capens157ba262019-12-10 17:49:14 -0500896RValue<Short> operator&=(Short &lhs, RValue<Short> rhs)
897{
898 return lhs = lhs & rhs;
899}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400900
Nicolas Capens157ba262019-12-10 17:49:14 -0500901RValue<Short> operator|=(Short &lhs, RValue<Short> rhs)
902{
903 return lhs = lhs | rhs;
904}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400905
Nicolas Capens157ba262019-12-10 17:49:14 -0500906RValue<Short> operator^=(Short &lhs, RValue<Short> rhs)
907{
908 return lhs = lhs ^ rhs;
909}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400910
Nicolas Capens157ba262019-12-10 17:49:14 -0500911RValue<Short> operator<<=(Short &lhs, RValue<Short> rhs)
912{
913 return lhs = lhs << rhs;
914}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400915
Nicolas Capens157ba262019-12-10 17:49:14 -0500916RValue<Short> operator>>=(Short &lhs, RValue<Short> rhs)
917{
918 return lhs = lhs >> rhs;
919}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400920
Nicolas Capens157ba262019-12-10 17:49:14 -0500921RValue<Short> operator+(RValue<Short> val)
922{
923 return val;
924}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400925
Nicolas Capens157ba262019-12-10 17:49:14 -0500926RValue<Short> operator-(RValue<Short> val)
927{
928 return RValue<Short>(Nucleus::createNeg(val.value));
929}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400930
Nicolas Capens157ba262019-12-10 17:49:14 -0500931RValue<Short> operator~(RValue<Short> val)
932{
933 return RValue<Short>(Nucleus::createNot(val.value));
934}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400935
Nicolas Capens157ba262019-12-10 17:49:14 -0500936RValue<Short> operator++(Short &val, int) // Post-increment
937{
938 RValue<Short> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400939
Nicolas Capens157ba262019-12-10 17:49:14 -0500940 Value *inc = Nucleus::createAdd(res.value, Nucleus::createConstantShort((short)1));
941 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400942
Nicolas Capens157ba262019-12-10 17:49:14 -0500943 return res;
944}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400945
Nicolas Capens157ba262019-12-10 17:49:14 -0500946const Short &operator++(Short &val) // Pre-increment
947{
948 Value *inc = Nucleus::createAdd(val.loadValue(), Nucleus::createConstantShort((short)1));
949 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400950
Nicolas Capens157ba262019-12-10 17:49:14 -0500951 return val;
952}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400953
Nicolas Capens157ba262019-12-10 17:49:14 -0500954RValue<Short> operator--(Short &val, int) // Post-decrement
955{
956 RValue<Short> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400957
Nicolas Capens157ba262019-12-10 17:49:14 -0500958 Value *inc = Nucleus::createSub(res.value, Nucleus::createConstantShort((short)1));
959 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400960
Nicolas Capens157ba262019-12-10 17:49:14 -0500961 return res;
962}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400963
Nicolas Capens157ba262019-12-10 17:49:14 -0500964const Short &operator--(Short &val) // Pre-decrement
965{
966 Value *inc = Nucleus::createSub(val.loadValue(), Nucleus::createConstantShort((short)1));
967 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400968
Nicolas Capens157ba262019-12-10 17:49:14 -0500969 return val;
970}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400971
Nicolas Capens157ba262019-12-10 17:49:14 -0500972RValue<Bool> operator<(RValue<Short> lhs, RValue<Short> rhs)
973{
974 return RValue<Bool>(Nucleus::createICmpSLT(lhs.value, rhs.value));
975}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400976
Nicolas Capens157ba262019-12-10 17:49:14 -0500977RValue<Bool> operator<=(RValue<Short> lhs, RValue<Short> rhs)
978{
979 return RValue<Bool>(Nucleus::createICmpSLE(lhs.value, rhs.value));
980}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400981
Nicolas Capens157ba262019-12-10 17:49:14 -0500982RValue<Bool> operator>(RValue<Short> lhs, RValue<Short> rhs)
983{
984 return RValue<Bool>(Nucleus::createICmpSGT(lhs.value, rhs.value));
985}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400986
Nicolas Capens157ba262019-12-10 17:49:14 -0500987RValue<Bool> operator>=(RValue<Short> lhs, RValue<Short> rhs)
988{
989 return RValue<Bool>(Nucleus::createICmpSGE(lhs.value, rhs.value));
990}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400991
Nicolas Capens157ba262019-12-10 17:49:14 -0500992RValue<Bool> operator!=(RValue<Short> lhs, RValue<Short> rhs)
993{
994 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
995}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400996
Nicolas Capens157ba262019-12-10 17:49:14 -0500997RValue<Bool> operator==(RValue<Short> lhs, RValue<Short> rhs)
998{
999 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
1000}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001001
Nicolas Capens157ba262019-12-10 17:49:14 -05001002UShort::UShort(Argument<UShort> argument)
1003{
1004 storeValue(argument.value);
1005}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001006
Nicolas Capens157ba262019-12-10 17:49:14 -05001007UShort::UShort(RValue<UInt> cast)
1008{
1009 Value *integer = Nucleus::createTrunc(cast.value, UShort::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001010
Nicolas Capens157ba262019-12-10 17:49:14 -05001011 storeValue(integer);
1012}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001013
Nicolas Capens157ba262019-12-10 17:49:14 -05001014UShort::UShort(RValue<Int> cast)
1015{
1016 Value *integer = Nucleus::createTrunc(cast.value, UShort::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001017
Nicolas Capens157ba262019-12-10 17:49:14 -05001018 storeValue(integer);
1019}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001020
Nicolas Capens157ba262019-12-10 17:49:14 -05001021UShort::UShort(unsigned short x)
1022{
1023 storeValue(Nucleus::createConstantShort(x));
1024}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001025
Nicolas Capens157ba262019-12-10 17:49:14 -05001026UShort::UShort(RValue<UShort> rhs)
1027{
1028 storeValue(rhs.value);
1029}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001030
Nicolas Capens157ba262019-12-10 17:49:14 -05001031UShort::UShort(const UShort &rhs)
1032{
1033 Value *value = rhs.loadValue();
1034 storeValue(value);
1035}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001036
Nicolas Capens157ba262019-12-10 17:49:14 -05001037UShort::UShort(const Reference<UShort> &rhs)
1038{
1039 Value *value = rhs.loadValue();
1040 storeValue(value);
1041}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001042
Nicolas Capens157ba262019-12-10 17:49:14 -05001043RValue<UShort> UShort::operator=(RValue<UShort> rhs)
1044{
1045 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001046
Nicolas Capens157ba262019-12-10 17:49:14 -05001047 return rhs;
1048}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001049
Nicolas Capens157ba262019-12-10 17:49:14 -05001050RValue<UShort> UShort::operator=(const UShort &rhs)
1051{
1052 Value *value = rhs.loadValue();
1053 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001054
Nicolas Capens157ba262019-12-10 17:49:14 -05001055 return RValue<UShort>(value);
1056}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001057
Nicolas Capens157ba262019-12-10 17:49:14 -05001058RValue<UShort> UShort::operator=(const Reference<UShort> &rhs)
1059{
1060 Value *value = rhs.loadValue();
1061 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001062
Nicolas Capens157ba262019-12-10 17:49:14 -05001063 return RValue<UShort>(value);
1064}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001065
Nicolas Capens157ba262019-12-10 17:49:14 -05001066RValue<UShort> operator+(RValue<UShort> lhs, RValue<UShort> rhs)
1067{
1068 return RValue<UShort>(Nucleus::createAdd(lhs.value, rhs.value));
1069}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001070
Nicolas Capens157ba262019-12-10 17:49:14 -05001071RValue<UShort> operator-(RValue<UShort> lhs, RValue<UShort> rhs)
1072{
1073 return RValue<UShort>(Nucleus::createSub(lhs.value, rhs.value));
1074}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001075
Nicolas Capens157ba262019-12-10 17:49:14 -05001076RValue<UShort> operator*(RValue<UShort> lhs, RValue<UShort> rhs)
1077{
1078 return RValue<UShort>(Nucleus::createMul(lhs.value, rhs.value));
1079}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001080
Nicolas Capens157ba262019-12-10 17:49:14 -05001081RValue<UShort> operator/(RValue<UShort> lhs, RValue<UShort> rhs)
1082{
1083 return RValue<UShort>(Nucleus::createUDiv(lhs.value, rhs.value));
1084}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001085
Nicolas Capens157ba262019-12-10 17:49:14 -05001086RValue<UShort> operator%(RValue<UShort> lhs, RValue<UShort> rhs)
1087{
1088 return RValue<UShort>(Nucleus::createURem(lhs.value, rhs.value));
1089}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001090
Nicolas Capens157ba262019-12-10 17:49:14 -05001091RValue<UShort> operator&(RValue<UShort> lhs, RValue<UShort> rhs)
1092{
1093 return RValue<UShort>(Nucleus::createAnd(lhs.value, rhs.value));
1094}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001095
Nicolas Capens157ba262019-12-10 17:49:14 -05001096RValue<UShort> operator|(RValue<UShort> lhs, RValue<UShort> rhs)
1097{
1098 return RValue<UShort>(Nucleus::createOr(lhs.value, rhs.value));
1099}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001100
Nicolas Capens157ba262019-12-10 17:49:14 -05001101RValue<UShort> operator^(RValue<UShort> lhs, RValue<UShort> rhs)
1102{
1103 return RValue<UShort>(Nucleus::createXor(lhs.value, rhs.value));
1104}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001105
Nicolas Capens157ba262019-12-10 17:49:14 -05001106RValue<UShort> operator<<(RValue<UShort> lhs, RValue<UShort> rhs)
1107{
1108 return RValue<UShort>(Nucleus::createShl(lhs.value, rhs.value));
1109}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001110
Nicolas Capens157ba262019-12-10 17:49:14 -05001111RValue<UShort> operator>>(RValue<UShort> lhs, RValue<UShort> rhs)
1112{
1113 return RValue<UShort>(Nucleus::createLShr(lhs.value, rhs.value));
1114}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001115
Nicolas Capens157ba262019-12-10 17:49:14 -05001116RValue<UShort> operator+=(UShort &lhs, RValue<UShort> rhs)
1117{
1118 return lhs = lhs + rhs;
1119}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001120
Nicolas Capens157ba262019-12-10 17:49:14 -05001121RValue<UShort> operator-=(UShort &lhs, RValue<UShort> rhs)
1122{
1123 return lhs = lhs - rhs;
1124}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001125
Nicolas Capens157ba262019-12-10 17:49:14 -05001126RValue<UShort> operator*=(UShort &lhs, RValue<UShort> rhs)
1127{
1128 return lhs = lhs * rhs;
1129}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001130
Nicolas Capens157ba262019-12-10 17:49:14 -05001131RValue<UShort> operator/=(UShort &lhs, RValue<UShort> rhs)
1132{
1133 return lhs = lhs / rhs;
1134}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001135
Nicolas Capens157ba262019-12-10 17:49:14 -05001136RValue<UShort> operator%=(UShort &lhs, RValue<UShort> rhs)
1137{
1138 return lhs = lhs % rhs;
1139}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001140
Nicolas Capens157ba262019-12-10 17:49:14 -05001141RValue<UShort> operator&=(UShort &lhs, RValue<UShort> rhs)
1142{
1143 return lhs = lhs & rhs;
1144}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001145
Nicolas Capens157ba262019-12-10 17:49:14 -05001146RValue<UShort> operator|=(UShort &lhs, RValue<UShort> rhs)
1147{
1148 return lhs = lhs | rhs;
1149}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001150
Nicolas Capens157ba262019-12-10 17:49:14 -05001151RValue<UShort> operator^=(UShort &lhs, RValue<UShort> rhs)
1152{
1153 return lhs = lhs ^ rhs;
1154}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001155
Nicolas Capens157ba262019-12-10 17:49:14 -05001156RValue<UShort> operator<<=(UShort &lhs, RValue<UShort> rhs)
1157{
1158 return lhs = lhs << rhs;
1159}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001160
Nicolas Capens157ba262019-12-10 17:49:14 -05001161RValue<UShort> operator>>=(UShort &lhs, RValue<UShort> rhs)
1162{
1163 return lhs = lhs >> rhs;
1164}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001165
Nicolas Capens157ba262019-12-10 17:49:14 -05001166RValue<UShort> operator+(RValue<UShort> val)
1167{
1168 return val;
1169}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001170
Nicolas Capens157ba262019-12-10 17:49:14 -05001171RValue<UShort> operator-(RValue<UShort> val)
1172{
1173 return RValue<UShort>(Nucleus::createNeg(val.value));
1174}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001175
Nicolas Capens157ba262019-12-10 17:49:14 -05001176RValue<UShort> operator~(RValue<UShort> val)
1177{
1178 return RValue<UShort>(Nucleus::createNot(val.value));
1179}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001180
Nicolas Capens157ba262019-12-10 17:49:14 -05001181RValue<UShort> operator++(UShort &val, int) // Post-increment
1182{
1183 RValue<UShort> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001184
Nicolas Capens157ba262019-12-10 17:49:14 -05001185 Value *inc = Nucleus::createAdd(res.value, Nucleus::createConstantShort((unsigned short)1));
1186 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001187
Nicolas Capens157ba262019-12-10 17:49:14 -05001188 return res;
1189}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001190
Nicolas Capens157ba262019-12-10 17:49:14 -05001191const UShort &operator++(UShort &val) // Pre-increment
1192{
1193 Value *inc = Nucleus::createAdd(val.loadValue(), Nucleus::createConstantShort((unsigned short)1));
1194 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001195
Nicolas Capens157ba262019-12-10 17:49:14 -05001196 return val;
1197}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001198
Nicolas Capens157ba262019-12-10 17:49:14 -05001199RValue<UShort> operator--(UShort &val, int) // Post-decrement
1200{
1201 RValue<UShort> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001202
Nicolas Capens157ba262019-12-10 17:49:14 -05001203 Value *inc = Nucleus::createSub(res.value, Nucleus::createConstantShort((unsigned short)1));
1204 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001205
Nicolas Capens157ba262019-12-10 17:49:14 -05001206 return res;
1207}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001208
Nicolas Capens157ba262019-12-10 17:49:14 -05001209const UShort &operator--(UShort &val) // Pre-decrement
1210{
1211 Value *inc = Nucleus::createSub(val.loadValue(), Nucleus::createConstantShort((unsigned short)1));
1212 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001213
Nicolas Capens157ba262019-12-10 17:49:14 -05001214 return val;
1215}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001216
Nicolas Capens157ba262019-12-10 17:49:14 -05001217RValue<Bool> operator<(RValue<UShort> lhs, RValue<UShort> rhs)
1218{
1219 return RValue<Bool>(Nucleus::createICmpULT(lhs.value, rhs.value));
1220}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001221
Nicolas Capens157ba262019-12-10 17:49:14 -05001222RValue<Bool> operator<=(RValue<UShort> lhs, RValue<UShort> rhs)
1223{
1224 return RValue<Bool>(Nucleus::createICmpULE(lhs.value, rhs.value));
1225}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001226
Nicolas Capens157ba262019-12-10 17:49:14 -05001227RValue<Bool> operator>(RValue<UShort> lhs, RValue<UShort> rhs)
1228{
1229 return RValue<Bool>(Nucleus::createICmpUGT(lhs.value, rhs.value));
1230}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001231
Nicolas Capens157ba262019-12-10 17:49:14 -05001232RValue<Bool> operator>=(RValue<UShort> lhs, RValue<UShort> rhs)
1233{
1234 return RValue<Bool>(Nucleus::createICmpUGE(lhs.value, rhs.value));
1235}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001236
Nicolas Capens157ba262019-12-10 17:49:14 -05001237RValue<Bool> operator!=(RValue<UShort> lhs, RValue<UShort> rhs)
1238{
1239 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
1240}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001241
Nicolas Capens157ba262019-12-10 17:49:14 -05001242RValue<Bool> operator==(RValue<UShort> lhs, RValue<UShort> rhs)
1243{
1244 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
1245}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001246
Nicolas Capens157ba262019-12-10 17:49:14 -05001247Byte4::Byte4(RValue<Byte8> cast)
1248{
1249 storeValue(Nucleus::createBitCast(cast.value, getType()));
1250}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001251
Nicolas Capens157ba262019-12-10 17:49:14 -05001252Byte4::Byte4(const Reference<Byte4> &rhs)
1253{
1254 Value *value = rhs.loadValue();
1255 storeValue(value);
1256}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001257
Nicolas Capens157ba262019-12-10 17:49:14 -05001258Byte8::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)
1259{
1260 int64_t constantVector[8] = {x0, x1, x2, x3, x4, x5, x6, x7};
1261 storeValue(Nucleus::createConstantVector(constantVector, getType()));
1262}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001263
Nicolas Capens157ba262019-12-10 17:49:14 -05001264Byte8::Byte8(RValue<Byte8> rhs)
1265{
1266 storeValue(rhs.value);
1267}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001268
Nicolas Capens157ba262019-12-10 17:49:14 -05001269Byte8::Byte8(const Byte8 &rhs)
1270{
1271 Value *value = rhs.loadValue();
1272 storeValue(value);
1273}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001274
Nicolas Capens157ba262019-12-10 17:49:14 -05001275Byte8::Byte8(const Reference<Byte8> &rhs)
1276{
1277 Value *value = rhs.loadValue();
1278 storeValue(value);
1279}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001280
Nicolas Capens157ba262019-12-10 17:49:14 -05001281RValue<Byte8> Byte8::operator=(RValue<Byte8> rhs)
1282{
1283 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001284
Nicolas Capens157ba262019-12-10 17:49:14 -05001285 return rhs;
1286}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001287
Nicolas Capens157ba262019-12-10 17:49:14 -05001288RValue<Byte8> Byte8::operator=(const Byte8 &rhs)
1289{
1290 Value *value = rhs.loadValue();
1291 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001292
Nicolas Capens157ba262019-12-10 17:49:14 -05001293 return RValue<Byte8>(value);
1294}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001295
Nicolas Capens157ba262019-12-10 17:49:14 -05001296RValue<Byte8> Byte8::operator=(const Reference<Byte8> &rhs)
1297{
1298 Value *value = rhs.loadValue();
1299 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001300
Nicolas Capens157ba262019-12-10 17:49:14 -05001301 return RValue<Byte8>(value);
1302}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001303
Nicolas Capens157ba262019-12-10 17:49:14 -05001304RValue<Byte8> operator+(RValue<Byte8> lhs, RValue<Byte8> rhs)
1305{
1306 return RValue<Byte8>(Nucleus::createAdd(lhs.value, rhs.value));
1307}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001308
Nicolas Capens157ba262019-12-10 17:49:14 -05001309RValue<Byte8> operator-(RValue<Byte8> lhs, RValue<Byte8> rhs)
1310{
1311 return RValue<Byte8>(Nucleus::createSub(lhs.value, rhs.value));
1312}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001313
1314// RValue<Byte8> operator*(RValue<Byte8> lhs, RValue<Byte8> rhs)
1315// {
1316// return RValue<Byte8>(Nucleus::createMul(lhs.value, rhs.value));
1317// }
1318
1319// RValue<Byte8> operator/(RValue<Byte8> lhs, RValue<Byte8> rhs)
1320// {
1321// return RValue<Byte8>(Nucleus::createUDiv(lhs.value, rhs.value));
1322// }
1323
1324// RValue<Byte8> operator%(RValue<Byte8> lhs, RValue<Byte8> rhs)
1325// {
1326// return RValue<Byte8>(Nucleus::createURem(lhs.value, rhs.value));
1327// }
1328
Nicolas Capens157ba262019-12-10 17:49:14 -05001329RValue<Byte8> operator&(RValue<Byte8> lhs, RValue<Byte8> rhs)
1330{
1331 return RValue<Byte8>(Nucleus::createAnd(lhs.value, rhs.value));
1332}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001333
Nicolas Capens157ba262019-12-10 17:49:14 -05001334RValue<Byte8> operator|(RValue<Byte8> lhs, RValue<Byte8> rhs)
1335{
1336 return RValue<Byte8>(Nucleus::createOr(lhs.value, rhs.value));
1337}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001338
Nicolas Capens157ba262019-12-10 17:49:14 -05001339RValue<Byte8> operator^(RValue<Byte8> lhs, RValue<Byte8> rhs)
1340{
1341 return RValue<Byte8>(Nucleus::createXor(lhs.value, rhs.value));
1342}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001343
1344// RValue<Byte8> operator<<(RValue<Byte8> lhs, unsigned char rhs)
1345// {
1346// return RValue<Byte8>(Nucleus::createShl(lhs.value, rhs.value));
1347// }
1348
1349// RValue<Byte8> operator>>(RValue<Byte8> lhs, unsigned char rhs)
1350// {
1351// return RValue<Byte8>(Nucleus::createLShr(lhs.value, rhs.value));
1352// }
1353
Nicolas Capens157ba262019-12-10 17:49:14 -05001354RValue<Byte8> operator+=(Byte8 &lhs, RValue<Byte8> rhs)
1355{
1356 return lhs = lhs + rhs;
1357}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001358
Nicolas Capens157ba262019-12-10 17:49:14 -05001359RValue<Byte8> operator-=(Byte8 &lhs, RValue<Byte8> rhs)
1360{
1361 return lhs = lhs - rhs;
1362}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001363
1364// RValue<Byte8> operator*=(Byte8 &lhs, RValue<Byte8> rhs)
1365// {
1366// return lhs = lhs * rhs;
1367// }
1368
1369// RValue<Byte8> operator/=(Byte8 &lhs, RValue<Byte8> rhs)
1370// {
1371// return lhs = lhs / rhs;
1372// }
1373
1374// RValue<Byte8> operator%=(Byte8 &lhs, RValue<Byte8> rhs)
1375// {
1376// return lhs = lhs % rhs;
1377// }
1378
Nicolas Capens157ba262019-12-10 17:49:14 -05001379RValue<Byte8> operator&=(Byte8 &lhs, RValue<Byte8> rhs)
1380{
1381 return lhs = lhs & rhs;
1382}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001383
Nicolas Capens157ba262019-12-10 17:49:14 -05001384RValue<Byte8> operator|=(Byte8 &lhs, RValue<Byte8> rhs)
1385{
1386 return lhs = lhs | rhs;
1387}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001388
Nicolas Capens157ba262019-12-10 17:49:14 -05001389RValue<Byte8> operator^=(Byte8 &lhs, RValue<Byte8> rhs)
1390{
1391 return lhs = lhs ^ rhs;
1392}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001393
1394// RValue<Byte8> operator<<=(Byte8 &lhs, RValue<Byte8> rhs)
1395// {
1396// return lhs = lhs << rhs;
1397// }
1398
1399// RValue<Byte8> operator>>=(Byte8 &lhs, RValue<Byte8> rhs)
1400// {
1401// return lhs = lhs >> rhs;
1402// }
1403
1404// RValue<Byte8> operator+(RValue<Byte8> val)
1405// {
1406// return val;
1407// }
1408
1409// RValue<Byte8> operator-(RValue<Byte8> val)
1410// {
1411// return RValue<Byte8>(Nucleus::createNeg(val.value));
1412// }
1413
Nicolas Capens157ba262019-12-10 17:49:14 -05001414RValue<Byte8> operator~(RValue<Byte8> val)
1415{
1416 return RValue<Byte8>(Nucleus::createNot(val.value));
1417}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001418
Nicolas Capens157ba262019-12-10 17:49:14 -05001419RValue<Short4> Unpack(RValue<Byte4> x)
1420{
1421 int shuffle[16] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7}; // Real type is v16i8
1422 return As<Short4>(Nucleus::createShuffleVector(x.value, x.value, shuffle));
1423}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001424
Nicolas Capens157ba262019-12-10 17:49:14 -05001425RValue<Short4> Unpack(RValue<Byte4> x, RValue<Byte4> y)
1426{
1427 return UnpackLow(As<Byte8>(x), As<Byte8>(y));
1428}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001429
Nicolas Capens157ba262019-12-10 17:49:14 -05001430RValue<Short4> UnpackLow(RValue<Byte8> x, RValue<Byte8> y)
1431{
1432 int shuffle[16] = {0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23}; // Real type is v16i8
1433 return As<Short4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
1434}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001435
Nicolas Capens157ba262019-12-10 17:49:14 -05001436RValue<Short4> UnpackHigh(RValue<Byte8> x, RValue<Byte8> y)
1437{
1438 int shuffle[16] = {0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23}; // Real type is v16i8
1439 auto lowHigh = RValue<Byte16>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
1440 return As<Short4>(Swizzle(As<Int4>(lowHigh), 0x2323));
1441}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001442
Nicolas Capens157ba262019-12-10 17:49:14 -05001443SByte8::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)
1444{
1445 int64_t constantVector[8] = {x0, x1, x2, x3, x4, x5, x6, x7};
1446 Value *vector = Nucleus::createConstantVector(constantVector, getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001447
Nicolas Capens157ba262019-12-10 17:49:14 -05001448 storeValue(Nucleus::createBitCast(vector, getType()));
1449}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001450
Nicolas Capens157ba262019-12-10 17:49:14 -05001451SByte8::SByte8(RValue<SByte8> rhs)
1452{
1453 storeValue(rhs.value);
1454}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001455
Nicolas Capens157ba262019-12-10 17:49:14 -05001456SByte8::SByte8(const SByte8 &rhs)
1457{
1458 Value *value = rhs.loadValue();
1459 storeValue(value);
1460}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001461
Nicolas Capens157ba262019-12-10 17:49:14 -05001462SByte8::SByte8(const Reference<SByte8> &rhs)
1463{
1464 Value *value = rhs.loadValue();
1465 storeValue(value);
1466}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001467
Nicolas Capens157ba262019-12-10 17:49:14 -05001468RValue<SByte8> SByte8::operator=(RValue<SByte8> rhs)
1469{
1470 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001471
Nicolas Capens157ba262019-12-10 17:49:14 -05001472 return rhs;
1473}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001474
Nicolas Capens157ba262019-12-10 17:49:14 -05001475RValue<SByte8> SByte8::operator=(const SByte8 &rhs)
1476{
1477 Value *value = rhs.loadValue();
1478 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001479
Nicolas Capens157ba262019-12-10 17:49:14 -05001480 return RValue<SByte8>(value);
1481}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001482
Nicolas Capens157ba262019-12-10 17:49:14 -05001483RValue<SByte8> SByte8::operator=(const Reference<SByte8> &rhs)
1484{
1485 Value *value = rhs.loadValue();
1486 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001487
Nicolas Capens157ba262019-12-10 17:49:14 -05001488 return RValue<SByte8>(value);
1489}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001490
Nicolas Capens157ba262019-12-10 17:49:14 -05001491RValue<SByte8> operator+(RValue<SByte8> lhs, RValue<SByte8> rhs)
1492{
1493 return RValue<SByte8>(Nucleus::createAdd(lhs.value, rhs.value));
1494}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001495
Nicolas Capens157ba262019-12-10 17:49:14 -05001496RValue<SByte8> operator-(RValue<SByte8> lhs, RValue<SByte8> rhs)
1497{
1498 return RValue<SByte8>(Nucleus::createSub(lhs.value, rhs.value));
1499}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001500
1501// RValue<SByte8> operator*(RValue<SByte8> lhs, RValue<SByte8> rhs)
1502// {
1503// return RValue<SByte8>(Nucleus::createMul(lhs.value, rhs.value));
1504// }
1505
1506// RValue<SByte8> operator/(RValue<SByte8> lhs, RValue<SByte8> rhs)
1507// {
1508// return RValue<SByte8>(Nucleus::createSDiv(lhs.value, rhs.value));
1509// }
1510
1511// RValue<SByte8> operator%(RValue<SByte8> lhs, RValue<SByte8> rhs)
1512// {
1513// return RValue<SByte8>(Nucleus::createSRem(lhs.value, rhs.value));
1514// }
1515
Nicolas Capens157ba262019-12-10 17:49:14 -05001516RValue<SByte8> operator&(RValue<SByte8> lhs, RValue<SByte8> rhs)
1517{
1518 return RValue<SByte8>(Nucleus::createAnd(lhs.value, rhs.value));
1519}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001520
Nicolas Capens157ba262019-12-10 17:49:14 -05001521RValue<SByte8> operator|(RValue<SByte8> lhs, RValue<SByte8> rhs)
1522{
1523 return RValue<SByte8>(Nucleus::createOr(lhs.value, rhs.value));
1524}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001525
Nicolas Capens157ba262019-12-10 17:49:14 -05001526RValue<SByte8> operator^(RValue<SByte8> lhs, RValue<SByte8> rhs)
1527{
1528 return RValue<SByte8>(Nucleus::createXor(lhs.value, rhs.value));
1529}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001530
1531// RValue<SByte8> operator<<(RValue<SByte8> lhs, unsigned char rhs)
1532// {
1533// return RValue<SByte8>(Nucleus::createShl(lhs.value, rhs.value));
1534// }
1535
1536// RValue<SByte8> operator>>(RValue<SByte8> lhs, unsigned char rhs)
1537// {
1538// return RValue<SByte8>(Nucleus::createAShr(lhs.value, rhs.value));
1539// }
1540
Nicolas Capens157ba262019-12-10 17:49:14 -05001541RValue<SByte8> operator+=(SByte8 &lhs, RValue<SByte8> rhs)
1542{
1543 return lhs = lhs + rhs;
1544}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001545
Nicolas Capens157ba262019-12-10 17:49:14 -05001546RValue<SByte8> operator-=(SByte8 &lhs, RValue<SByte8> rhs)
1547{
1548 return lhs = lhs - rhs;
1549}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001550
1551// RValue<SByte8> operator*=(SByte8 &lhs, RValue<SByte8> rhs)
1552// {
1553// return lhs = lhs * rhs;
1554// }
1555
1556// RValue<SByte8> operator/=(SByte8 &lhs, RValue<SByte8> rhs)
1557// {
1558// return lhs = lhs / rhs;
1559// }
1560
1561// RValue<SByte8> operator%=(SByte8 &lhs, RValue<SByte8> rhs)
1562// {
1563// return lhs = lhs % rhs;
1564// }
1565
Nicolas Capens157ba262019-12-10 17:49:14 -05001566RValue<SByte8> operator&=(SByte8 &lhs, RValue<SByte8> rhs)
1567{
1568 return lhs = lhs & rhs;
1569}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001570
Nicolas Capens157ba262019-12-10 17:49:14 -05001571RValue<SByte8> operator|=(SByte8 &lhs, RValue<SByte8> rhs)
1572{
1573 return lhs = lhs | rhs;
1574}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001575
Nicolas Capens157ba262019-12-10 17:49:14 -05001576RValue<SByte8> operator^=(SByte8 &lhs, RValue<SByte8> rhs)
1577{
1578 return lhs = lhs ^ rhs;
1579}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001580
1581// RValue<SByte8> operator<<=(SByte8 &lhs, RValue<SByte8> rhs)
1582// {
1583// return lhs = lhs << rhs;
1584// }
1585
1586// RValue<SByte8> operator>>=(SByte8 &lhs, RValue<SByte8> rhs)
1587// {
1588// return lhs = lhs >> rhs;
1589// }
1590
1591// RValue<SByte8> operator+(RValue<SByte8> val)
1592// {
1593// return val;
1594// }
1595
1596// RValue<SByte8> operator-(RValue<SByte8> val)
1597// {
1598// return RValue<SByte8>(Nucleus::createNeg(val.value));
1599// }
1600
Nicolas Capens157ba262019-12-10 17:49:14 -05001601RValue<SByte8> operator~(RValue<SByte8> val)
1602{
1603 return RValue<SByte8>(Nucleus::createNot(val.value));
1604}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001605
Nicolas Capens157ba262019-12-10 17:49:14 -05001606RValue<Short4> UnpackLow(RValue<SByte8> x, RValue<SByte8> y)
1607{
1608 int shuffle[16] = {0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23}; // Real type is v16i8
1609 return As<Short4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
1610}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001611
Nicolas Capens157ba262019-12-10 17:49:14 -05001612RValue<Short4> UnpackHigh(RValue<SByte8> x, RValue<SByte8> y)
1613{
1614 int shuffle[16] = {0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23}; // Real type is v16i8
1615 auto lowHigh = RValue<Byte16>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
1616 return As<Short4>(Swizzle(As<Int4>(lowHigh), 0x2323));
1617}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001618
Nicolas Capens157ba262019-12-10 17:49:14 -05001619Byte16::Byte16(RValue<Byte16> rhs)
1620{
1621 storeValue(rhs.value);
1622}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001623
Nicolas Capens157ba262019-12-10 17:49:14 -05001624Byte16::Byte16(const Byte16 &rhs)
1625{
1626 Value *value = rhs.loadValue();
1627 storeValue(value);
1628}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001629
Nicolas Capens157ba262019-12-10 17:49:14 -05001630Byte16::Byte16(const Reference<Byte16> &rhs)
1631{
1632 Value *value = rhs.loadValue();
1633 storeValue(value);
1634}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001635
Nicolas Capens157ba262019-12-10 17:49:14 -05001636RValue<Byte16> Byte16::operator=(RValue<Byte16> rhs)
1637{
1638 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001639
Nicolas Capens157ba262019-12-10 17:49:14 -05001640 return rhs;
1641}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001642
Nicolas Capens157ba262019-12-10 17:49:14 -05001643RValue<Byte16> Byte16::operator=(const Byte16 &rhs)
1644{
1645 Value *value = rhs.loadValue();
1646 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001647
Nicolas Capens157ba262019-12-10 17:49:14 -05001648 return RValue<Byte16>(value);
1649}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001650
Nicolas Capens157ba262019-12-10 17:49:14 -05001651RValue<Byte16> Byte16::operator=(const Reference<Byte16> &rhs)
1652{
1653 Value *value = rhs.loadValue();
1654 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001655
Nicolas Capens157ba262019-12-10 17:49:14 -05001656 return RValue<Byte16>(value);
1657}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001658
Nicolas Capens157ba262019-12-10 17:49:14 -05001659Short2::Short2(RValue<Short4> cast)
1660{
1661 storeValue(Nucleus::createBitCast(cast.value, getType()));
1662}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001663
Nicolas Capens157ba262019-12-10 17:49:14 -05001664UShort2::UShort2(RValue<UShort4> cast)
1665{
1666 storeValue(Nucleus::createBitCast(cast.value, getType()));
1667}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001668
Nicolas Capens157ba262019-12-10 17:49:14 -05001669Short4::Short4(RValue<Int> cast)
1670{
1671 Value *vector = loadValue();
1672 Value *element = Nucleus::createTrunc(cast.value, Short::getType());
1673 Value *insert = Nucleus::createInsertElement(vector, element, 0);
1674 Value *swizzle = Swizzle(RValue<Short4>(insert), 0x0000).value;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001675
Nicolas Capens157ba262019-12-10 17:49:14 -05001676 storeValue(swizzle);
1677}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001678
1679// Short4::Short4(RValue<Float> cast)
1680// {
1681// }
1682
Nicolas Capens157ba262019-12-10 17:49:14 -05001683Short4::Short4(short xyzw)
1684{
1685 int64_t constantVector[4] = {xyzw, xyzw, xyzw, xyzw};
1686 storeValue(Nucleus::createConstantVector(constantVector, getType()));
1687}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001688
Nicolas Capens157ba262019-12-10 17:49:14 -05001689Short4::Short4(short x, short y, short z, short w)
1690{
1691 int64_t constantVector[4] = {x, y, z, w};
1692 storeValue(Nucleus::createConstantVector(constantVector, getType()));
1693}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001694
Nicolas Capens157ba262019-12-10 17:49:14 -05001695Short4::Short4(RValue<Short4> rhs)
1696{
1697 storeValue(rhs.value);
1698}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001699
Nicolas Capens157ba262019-12-10 17:49:14 -05001700Short4::Short4(const Short4 &rhs)
1701{
1702 Value *value = rhs.loadValue();
1703 storeValue(value);
1704}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001705
Nicolas Capens157ba262019-12-10 17:49:14 -05001706Short4::Short4(const Reference<Short4> &rhs)
1707{
1708 Value *value = rhs.loadValue();
1709 storeValue(value);
1710}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001711
Nicolas Capens157ba262019-12-10 17:49:14 -05001712Short4::Short4(RValue<UShort4> rhs)
1713{
1714 storeValue(rhs.value);
1715}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001716
Nicolas Capens157ba262019-12-10 17:49:14 -05001717Short4::Short4(const UShort4 &rhs)
1718{
1719 storeValue(rhs.loadValue());
1720}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001721
Nicolas Capens157ba262019-12-10 17:49:14 -05001722Short4::Short4(const Reference<UShort4> &rhs)
1723{
1724 storeValue(rhs.loadValue());
1725}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001726
Nicolas Capens157ba262019-12-10 17:49:14 -05001727RValue<Short4> Short4::operator=(RValue<Short4> rhs)
1728{
1729 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001730
Nicolas Capens157ba262019-12-10 17:49:14 -05001731 return rhs;
1732}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001733
Nicolas Capens157ba262019-12-10 17:49:14 -05001734RValue<Short4> Short4::operator=(const Short4 &rhs)
1735{
1736 Value *value = rhs.loadValue();
1737 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001738
Nicolas Capens157ba262019-12-10 17:49:14 -05001739 return RValue<Short4>(value);
1740}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001741
Nicolas Capens157ba262019-12-10 17:49:14 -05001742RValue<Short4> Short4::operator=(const Reference<Short4> &rhs)
1743{
1744 Value *value = rhs.loadValue();
1745 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001746
Nicolas Capens157ba262019-12-10 17:49:14 -05001747 return RValue<Short4>(value);
1748}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001749
Nicolas Capens157ba262019-12-10 17:49:14 -05001750RValue<Short4> Short4::operator=(RValue<UShort4> rhs)
1751{
1752 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001753
Nicolas Capens157ba262019-12-10 17:49:14 -05001754 return RValue<Short4>(rhs);
1755}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001756
Nicolas Capens157ba262019-12-10 17:49:14 -05001757RValue<Short4> Short4::operator=(const UShort4 &rhs)
1758{
1759 Value *value = rhs.loadValue();
1760 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001761
Nicolas Capens157ba262019-12-10 17:49:14 -05001762 return RValue<Short4>(value);
1763}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001764
Nicolas Capens157ba262019-12-10 17:49:14 -05001765RValue<Short4> Short4::operator=(const Reference<UShort4> &rhs)
1766{
1767 Value *value = rhs.loadValue();
1768 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001769
Nicolas Capens157ba262019-12-10 17:49:14 -05001770 return RValue<Short4>(value);
1771}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001772
Nicolas Capens157ba262019-12-10 17:49:14 -05001773RValue<Short4> operator+(RValue<Short4> lhs, RValue<Short4> rhs)
1774{
1775 return RValue<Short4>(Nucleus::createAdd(lhs.value, rhs.value));
1776}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001777
Nicolas Capens157ba262019-12-10 17:49:14 -05001778RValue<Short4> operator-(RValue<Short4> lhs, RValue<Short4> rhs)
1779{
1780 return RValue<Short4>(Nucleus::createSub(lhs.value, rhs.value));
1781}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001782
Nicolas Capens157ba262019-12-10 17:49:14 -05001783RValue<Short4> operator*(RValue<Short4> lhs, RValue<Short4> rhs)
1784{
1785 return RValue<Short4>(Nucleus::createMul(lhs.value, rhs.value));
1786}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001787
1788// RValue<Short4> operator/(RValue<Short4> lhs, RValue<Short4> rhs)
1789// {
1790// return RValue<Short4>(Nucleus::createSDiv(lhs.value, rhs.value));
1791// }
1792
1793// RValue<Short4> operator%(RValue<Short4> lhs, RValue<Short4> rhs)
1794// {
1795// return RValue<Short4>(Nucleus::createSRem(lhs.value, rhs.value));
1796// }
1797
Nicolas Capens157ba262019-12-10 17:49:14 -05001798RValue<Short4> operator&(RValue<Short4> lhs, RValue<Short4> rhs)
1799{
1800 return RValue<Short4>(Nucleus::createAnd(lhs.value, rhs.value));
1801}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001802
Nicolas Capens157ba262019-12-10 17:49:14 -05001803RValue<Short4> operator|(RValue<Short4> lhs, RValue<Short4> rhs)
1804{
1805 return RValue<Short4>(Nucleus::createOr(lhs.value, rhs.value));
1806}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001807
Nicolas Capens157ba262019-12-10 17:49:14 -05001808RValue<Short4> operator^(RValue<Short4> lhs, RValue<Short4> rhs)
1809{
1810 return RValue<Short4>(Nucleus::createXor(lhs.value, rhs.value));
1811}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001812
Nicolas Capens157ba262019-12-10 17:49:14 -05001813RValue<Short4> operator+=(Short4 &lhs, RValue<Short4> rhs)
1814{
1815 return lhs = lhs + rhs;
1816}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001817
Nicolas Capens157ba262019-12-10 17:49:14 -05001818RValue<Short4> operator-=(Short4 &lhs, RValue<Short4> rhs)
1819{
1820 return lhs = lhs - rhs;
1821}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001822
Nicolas Capens157ba262019-12-10 17:49:14 -05001823RValue<Short4> operator*=(Short4 &lhs, RValue<Short4> rhs)
1824{
1825 return lhs = lhs * rhs;
1826}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001827
1828// RValue<Short4> operator/=(Short4 &lhs, RValue<Short4> rhs)
1829// {
1830// return lhs = lhs / rhs;
1831// }
1832
1833// RValue<Short4> operator%=(Short4 &lhs, RValue<Short4> rhs)
1834// {
1835// return lhs = lhs % rhs;
1836// }
1837
Nicolas Capens157ba262019-12-10 17:49:14 -05001838RValue<Short4> operator&=(Short4 &lhs, RValue<Short4> rhs)
1839{
1840 return lhs = lhs & rhs;
1841}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001842
Nicolas Capens157ba262019-12-10 17:49:14 -05001843RValue<Short4> operator|=(Short4 &lhs, RValue<Short4> rhs)
1844{
1845 return lhs = lhs | rhs;
1846}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001847
Nicolas Capens157ba262019-12-10 17:49:14 -05001848RValue<Short4> operator^=(Short4 &lhs, RValue<Short4> rhs)
1849{
1850 return lhs = lhs ^ rhs;
1851}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001852
Nicolas Capens157ba262019-12-10 17:49:14 -05001853RValue<Short4> operator<<=(Short4 &lhs, unsigned char rhs)
1854{
1855 return lhs = lhs << rhs;
1856}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001857
Nicolas Capens157ba262019-12-10 17:49:14 -05001858RValue<Short4> operator>>=(Short4 &lhs, unsigned char rhs)
1859{
1860 return lhs = lhs >> rhs;
1861}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001862
1863// RValue<Short4> operator+(RValue<Short4> val)
1864// {
1865// return val;
1866// }
1867
Nicolas Capens157ba262019-12-10 17:49:14 -05001868RValue<Short4> operator-(RValue<Short4> val)
1869{
1870 return RValue<Short4>(Nucleus::createNeg(val.value));
1871}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001872
Nicolas Capens157ba262019-12-10 17:49:14 -05001873RValue<Short4> operator~(RValue<Short4> val)
1874{
1875 return RValue<Short4>(Nucleus::createNot(val.value));
1876}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001877
Nicolas Capens157ba262019-12-10 17:49:14 -05001878RValue<Short4> RoundShort4(RValue<Float4> cast)
1879{
1880 RValue<Int4> int4 = RoundInt(cast);
1881 return As<Short4>(PackSigned(int4, int4));
1882}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001883
Nicolas Capens157ba262019-12-10 17:49:14 -05001884RValue<Int2> UnpackLow(RValue<Short4> x, RValue<Short4> y)
1885{
1886 int shuffle[8] = {0, 8, 1, 9, 2, 10, 3, 11}; // Real type is v8i16
1887 return As<Int2>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
1888}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001889
Nicolas Capens157ba262019-12-10 17:49:14 -05001890RValue<Int2> UnpackHigh(RValue<Short4> x, RValue<Short4> y)
1891{
1892 int shuffle[8] = {0, 8, 1, 9, 2, 10, 3, 11}; // Real type is v8i16
1893 auto lowHigh = RValue<Short8>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
1894 return As<Int2>(Swizzle(As<Int4>(lowHigh), 0x2323));
1895}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001896
Nicolas Capens157ba262019-12-10 17:49:14 -05001897RValue<Short4> Swizzle(RValue<Short4> x, uint16_t select)
1898{
1899 // Real type is v8i16
1900 int shuffle[8] =
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001901 {
Nicolas Capens157ba262019-12-10 17:49:14 -05001902 (select >> 12) & 0x03,
1903 (select >> 8) & 0x03,
1904 (select >> 4) & 0x03,
1905 (select >> 0) & 0x03,
1906 (select >> 12) & 0x03,
1907 (select >> 8) & 0x03,
1908 (select >> 4) & 0x03,
1909 (select >> 0) & 0x03,
1910 };
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001911
Nicolas Capens157ba262019-12-10 17:49:14 -05001912 return As<Short4>(Nucleus::createShuffleVector(x.value, x.value, shuffle));
1913}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001914
Nicolas Capens157ba262019-12-10 17:49:14 -05001915RValue<Short4> Insert(RValue<Short4> val, RValue<Short> element, int i)
1916{
1917 return RValue<Short4>(Nucleus::createInsertElement(val.value, element.value, i));
1918}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001919
Nicolas Capens157ba262019-12-10 17:49:14 -05001920RValue<Short> Extract(RValue<Short4> val, int i)
1921{
1922 return RValue<Short>(Nucleus::createExtractElement(val.value, Short::getType(), i));
1923}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001924
Nicolas Capens157ba262019-12-10 17:49:14 -05001925UShort4::UShort4(RValue<Int4> cast)
1926{
1927 *this = Short4(cast);
1928}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001929
Nicolas Capens157ba262019-12-10 17:49:14 -05001930UShort4::UShort4(unsigned short xyzw)
1931{
1932 int64_t constantVector[4] = {xyzw, xyzw, xyzw, xyzw};
1933 storeValue(Nucleus::createConstantVector(constantVector, getType()));
1934}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001935
Nicolas Capens157ba262019-12-10 17:49:14 -05001936UShort4::UShort4(unsigned short x, unsigned short y, unsigned short z, unsigned short w)
1937{
1938 int64_t constantVector[4] = {x, y, z, w};
1939 storeValue(Nucleus::createConstantVector(constantVector, getType()));
1940}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001941
Nicolas Capens157ba262019-12-10 17:49:14 -05001942UShort4::UShort4(RValue<UShort4> rhs)
1943{
1944 storeValue(rhs.value);
1945}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001946
Nicolas Capens157ba262019-12-10 17:49:14 -05001947UShort4::UShort4(const UShort4 &rhs)
1948{
1949 Value *value = rhs.loadValue();
1950 storeValue(value);
1951}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001952
Nicolas Capens157ba262019-12-10 17:49:14 -05001953UShort4::UShort4(const Reference<UShort4> &rhs)
1954{
1955 Value *value = rhs.loadValue();
1956 storeValue(value);
1957}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001958
Nicolas Capens157ba262019-12-10 17:49:14 -05001959UShort4::UShort4(RValue<Short4> rhs)
1960{
1961 storeValue(rhs.value);
1962}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001963
Nicolas Capens157ba262019-12-10 17:49:14 -05001964UShort4::UShort4(const Short4 &rhs)
1965{
1966 Value *value = rhs.loadValue();
1967 storeValue(value);
1968}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001969
Nicolas Capens157ba262019-12-10 17:49:14 -05001970UShort4::UShort4(const Reference<Short4> &rhs)
1971{
1972 Value *value = rhs.loadValue();
1973 storeValue(value);
1974}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001975
Nicolas Capens157ba262019-12-10 17:49:14 -05001976RValue<UShort4> UShort4::operator=(RValue<UShort4> rhs)
1977{
1978 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001979
Nicolas Capens157ba262019-12-10 17:49:14 -05001980 return rhs;
1981}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001982
Nicolas Capens157ba262019-12-10 17:49:14 -05001983RValue<UShort4> UShort4::operator=(const UShort4 &rhs)
1984{
1985 Value *value = rhs.loadValue();
1986 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001987
Nicolas Capens157ba262019-12-10 17:49:14 -05001988 return RValue<UShort4>(value);
1989}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001990
Nicolas Capens157ba262019-12-10 17:49:14 -05001991RValue<UShort4> UShort4::operator=(const Reference<UShort4> &rhs)
1992{
1993 Value *value = rhs.loadValue();
1994 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001995
Nicolas Capens157ba262019-12-10 17:49:14 -05001996 return RValue<UShort4>(value);
1997}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001998
Nicolas Capens157ba262019-12-10 17:49:14 -05001999RValue<UShort4> UShort4::operator=(RValue<Short4> rhs)
2000{
2001 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002002
Nicolas Capens157ba262019-12-10 17:49:14 -05002003 return RValue<UShort4>(rhs);
2004}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002005
Nicolas Capens157ba262019-12-10 17:49:14 -05002006RValue<UShort4> UShort4::operator=(const Short4 &rhs)
2007{
2008 Value *value = rhs.loadValue();
2009 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002010
Nicolas Capens157ba262019-12-10 17:49:14 -05002011 return RValue<UShort4>(value);
2012}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002013
Nicolas Capens157ba262019-12-10 17:49:14 -05002014RValue<UShort4> UShort4::operator=(const Reference<Short4> &rhs)
2015{
2016 Value *value = rhs.loadValue();
2017 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002018
Nicolas Capens157ba262019-12-10 17:49:14 -05002019 return RValue<UShort4>(value);
2020}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002021
Nicolas Capens157ba262019-12-10 17:49:14 -05002022RValue<UShort4> operator+(RValue<UShort4> lhs, RValue<UShort4> rhs)
2023{
2024 return RValue<UShort4>(Nucleus::createAdd(lhs.value, rhs.value));
2025}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002026
Nicolas Capens157ba262019-12-10 17:49:14 -05002027RValue<UShort4> operator-(RValue<UShort4> lhs, RValue<UShort4> rhs)
2028{
2029 return RValue<UShort4>(Nucleus::createSub(lhs.value, rhs.value));
2030}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002031
Nicolas Capens157ba262019-12-10 17:49:14 -05002032RValue<UShort4> operator*(RValue<UShort4> lhs, RValue<UShort4> rhs)
2033{
2034 return RValue<UShort4>(Nucleus::createMul(lhs.value, rhs.value));
2035}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002036
Nicolas Capens157ba262019-12-10 17:49:14 -05002037RValue<UShort4> operator&(RValue<UShort4> lhs, RValue<UShort4> rhs)
2038{
2039 return RValue<UShort4>(Nucleus::createAnd(lhs.value, rhs.value));
2040}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002041
Nicolas Capens157ba262019-12-10 17:49:14 -05002042RValue<UShort4> operator|(RValue<UShort4> lhs, RValue<UShort4> rhs)
2043{
2044 return RValue<UShort4>(Nucleus::createOr(lhs.value, rhs.value));
2045}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002046
Nicolas Capens157ba262019-12-10 17:49:14 -05002047RValue<UShort4> operator^(RValue<UShort4> lhs, RValue<UShort4> rhs)
2048{
2049 return RValue<UShort4>(Nucleus::createXor(lhs.value, rhs.value));
2050}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002051
Nicolas Capens157ba262019-12-10 17:49:14 -05002052RValue<UShort4> operator<<=(UShort4 &lhs, unsigned char rhs)
2053{
2054 return lhs = lhs << rhs;
2055}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002056
Nicolas Capens157ba262019-12-10 17:49:14 -05002057RValue<UShort4> operator>>=(UShort4 &lhs, unsigned char rhs)
2058{
2059 return lhs = lhs >> rhs;
2060}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002061
Nicolas Capens157ba262019-12-10 17:49:14 -05002062RValue<UShort4> operator~(RValue<UShort4> val)
2063{
2064 return RValue<UShort4>(Nucleus::createNot(val.value));
2065}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002066
Nicolas Capens157ba262019-12-10 17:49:14 -05002067Short8::Short8(short c)
2068{
2069 int64_t constantVector[8] = {c, c, c, c, c, c, c, c};
2070 storeValue(Nucleus::createConstantVector(constantVector, getType()));
2071}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002072
Nicolas Capens157ba262019-12-10 17:49:14 -05002073Short8::Short8(short c0, short c1, short c2, short c3, short c4, short c5, short c6, short c7)
2074{
2075 int64_t constantVector[8] = {c0, c1, c2, c3, c4, c5, c6, c7};
2076 storeValue(Nucleus::createConstantVector(constantVector, getType()));
2077}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002078
Nicolas Capens157ba262019-12-10 17:49:14 -05002079Short8::Short8(RValue<Short8> rhs)
2080{
2081 storeValue(rhs.value);
2082}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002083
Nicolas Capens157ba262019-12-10 17:49:14 -05002084Short8::Short8(const Reference<Short8> &rhs)
2085{
2086 Value *value = rhs.loadValue();
2087 storeValue(value);
2088}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002089
Nicolas Capens157ba262019-12-10 17:49:14 -05002090Short8::Short8(RValue<Short4> lo, RValue<Short4> hi)
2091{
2092 int shuffle[8] = {0, 1, 2, 3, 8, 9, 10, 11}; // Real type is v8i16
2093 Value *packed = Nucleus::createShuffleVector(lo.value, hi.value, shuffle);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002094
Nicolas Capens157ba262019-12-10 17:49:14 -05002095 storeValue(packed);
2096}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002097
Nicolas Capens157ba262019-12-10 17:49:14 -05002098RValue<Short8> Short8::operator=(RValue<Short8> rhs)
2099{
2100 storeValue(rhs.value);
Nicolas Capensf1beca42019-03-26 17:18:57 -04002101
Nicolas Capens157ba262019-12-10 17:49:14 -05002102 return rhs;
2103}
Nicolas Capensf1beca42019-03-26 17:18:57 -04002104
Nicolas Capens157ba262019-12-10 17:49:14 -05002105RValue<Short8> Short8::operator=(const Short8 &rhs)
2106{
2107 Value *value = rhs.loadValue();
2108 storeValue(value);
Nicolas Capensf1beca42019-03-26 17:18:57 -04002109
Nicolas Capens157ba262019-12-10 17:49:14 -05002110 return RValue<Short8>(value);
2111}
Nicolas Capensf1beca42019-03-26 17:18:57 -04002112
Nicolas Capens157ba262019-12-10 17:49:14 -05002113RValue<Short8> Short8::operator=(const Reference<Short8> &rhs)
2114{
2115 Value *value = rhs.loadValue();
2116 storeValue(value);
Nicolas Capensf1beca42019-03-26 17:18:57 -04002117
Nicolas Capens157ba262019-12-10 17:49:14 -05002118 return RValue<Short8>(value);
2119}
Nicolas Capensf1beca42019-03-26 17:18:57 -04002120
Nicolas Capens157ba262019-12-10 17:49:14 -05002121RValue<Short8> operator+(RValue<Short8> lhs, RValue<Short8> rhs)
2122{
2123 return RValue<Short8>(Nucleus::createAdd(lhs.value, rhs.value));
2124}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002125
Nicolas Capens157ba262019-12-10 17:49:14 -05002126RValue<Short8> operator&(RValue<Short8> lhs, RValue<Short8> rhs)
2127{
2128 return RValue<Short8>(Nucleus::createAnd(lhs.value, rhs.value));
2129}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002130
Nicolas Capens157ba262019-12-10 17:49:14 -05002131RValue<Int4> Abs(RValue<Int4> x)
2132{
2133 // TODO: Optimize.
2134 auto negative = x >> 31;
2135 return (x ^ negative) - negative;
2136}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002137
Nicolas Capens157ba262019-12-10 17:49:14 -05002138UShort8::UShort8(unsigned short c)
2139{
2140 int64_t constantVector[8] = {c, c, c, c, c, c, c, c};
2141 storeValue(Nucleus::createConstantVector(constantVector, getType()));
2142}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002143
Nicolas Capens157ba262019-12-10 17:49:14 -05002144UShort8::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)
2145{
2146 int64_t constantVector[8] = {c0, c1, c2, c3, c4, c5, c6, c7};
2147 storeValue(Nucleus::createConstantVector(constantVector, getType()));
2148}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002149
Nicolas Capens157ba262019-12-10 17:49:14 -05002150UShort8::UShort8(RValue<UShort8> rhs)
2151{
2152 storeValue(rhs.value);
2153}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002154
Nicolas Capens157ba262019-12-10 17:49:14 -05002155UShort8::UShort8(const Reference<UShort8> &rhs)
2156{
2157 Value *value = rhs.loadValue();
2158 storeValue(value);
2159}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002160
Nicolas Capens157ba262019-12-10 17:49:14 -05002161UShort8::UShort8(RValue<UShort4> lo, RValue<UShort4> hi)
2162{
2163 int shuffle[8] = {0, 1, 2, 3, 8, 9, 10, 11}; // Real type is v8i16
2164 Value *packed = Nucleus::createShuffleVector(lo.value, hi.value, shuffle);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002165
Nicolas Capens157ba262019-12-10 17:49:14 -05002166 storeValue(packed);
2167}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002168
Nicolas Capens157ba262019-12-10 17:49:14 -05002169RValue<UShort8> UShort8::operator=(RValue<UShort8> rhs)
2170{
2171 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002172
Nicolas Capens157ba262019-12-10 17:49:14 -05002173 return rhs;
2174}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002175
Nicolas Capens157ba262019-12-10 17:49:14 -05002176RValue<UShort8> UShort8::operator=(const UShort8 &rhs)
2177{
2178 Value *value = rhs.loadValue();
2179 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002180
Nicolas Capens157ba262019-12-10 17:49:14 -05002181 return RValue<UShort8>(value);
2182}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002183
Nicolas Capens157ba262019-12-10 17:49:14 -05002184RValue<UShort8> UShort8::operator=(const Reference<UShort8> &rhs)
2185{
2186 Value *value = rhs.loadValue();
2187 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002188
Nicolas Capens157ba262019-12-10 17:49:14 -05002189 return RValue<UShort8>(value);
2190}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002191
Nicolas Capens157ba262019-12-10 17:49:14 -05002192RValue<UShort8> operator&(RValue<UShort8> lhs, RValue<UShort8> rhs)
2193{
2194 return RValue<UShort8>(Nucleus::createAnd(lhs.value, rhs.value));
2195}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002196
Nicolas Capens157ba262019-12-10 17:49:14 -05002197RValue<UShort8> operator+(RValue<UShort8> lhs, RValue<UShort8> rhs)
2198{
2199 return RValue<UShort8>(Nucleus::createAdd(lhs.value, rhs.value));
2200}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002201
Nicolas Capens157ba262019-12-10 17:49:14 -05002202RValue<UShort8> operator*(RValue<UShort8> lhs, RValue<UShort8> rhs)
2203{
2204 return RValue<UShort8>(Nucleus::createMul(lhs.value, rhs.value));
2205}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002206
Nicolas Capens157ba262019-12-10 17:49:14 -05002207RValue<UShort8> operator+=(UShort8 &lhs, RValue<UShort8> rhs)
2208{
2209 return lhs = lhs + rhs;
2210}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002211
Nicolas Capens157ba262019-12-10 17:49:14 -05002212RValue<UShort8> operator~(RValue<UShort8> val)
2213{
2214 return RValue<UShort8>(Nucleus::createNot(val.value));
2215}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002216
Nicolas Capens157ba262019-12-10 17:49:14 -05002217Int::Int(Argument<Int> argument)
2218{
2219 storeValue(argument.value);
2220}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002221
Nicolas Capens157ba262019-12-10 17:49:14 -05002222Int::Int(RValue<Byte> cast)
2223{
2224 Value *integer = Nucleus::createZExt(cast.value, Int::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002225
Nicolas Capens157ba262019-12-10 17:49:14 -05002226 storeValue(integer);
2227}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002228
Nicolas Capens157ba262019-12-10 17:49:14 -05002229Int::Int(RValue<SByte> cast)
2230{
2231 Value *integer = Nucleus::createSExt(cast.value, Int::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002232
Nicolas Capens157ba262019-12-10 17:49:14 -05002233 storeValue(integer);
2234}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002235
Nicolas Capens157ba262019-12-10 17:49:14 -05002236Int::Int(RValue<Short> cast)
2237{
2238 Value *integer = Nucleus::createSExt(cast.value, Int::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002239
Nicolas Capens157ba262019-12-10 17:49:14 -05002240 storeValue(integer);
2241}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002242
Nicolas Capens157ba262019-12-10 17:49:14 -05002243Int::Int(RValue<UShort> cast)
2244{
2245 Value *integer = Nucleus::createZExt(cast.value, Int::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002246
Nicolas Capens157ba262019-12-10 17:49:14 -05002247 storeValue(integer);
2248}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002249
Nicolas Capens157ba262019-12-10 17:49:14 -05002250Int::Int(RValue<Int2> cast)
2251{
2252 *this = Extract(cast, 0);
2253}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002254
Nicolas Capens157ba262019-12-10 17:49:14 -05002255Int::Int(RValue<Long> cast)
2256{
2257 Value *integer = Nucleus::createTrunc(cast.value, Int::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002258
Nicolas Capens157ba262019-12-10 17:49:14 -05002259 storeValue(integer);
2260}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002261
Nicolas Capens157ba262019-12-10 17:49:14 -05002262Int::Int(RValue<Float> cast)
2263{
2264 Value *integer = Nucleus::createFPToSI(cast.value, Int::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002265
Nicolas Capens157ba262019-12-10 17:49:14 -05002266 storeValue(integer);
2267}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002268
Nicolas Capens157ba262019-12-10 17:49:14 -05002269Int::Int(int x)
2270{
2271 storeValue(Nucleus::createConstantInt(x));
2272}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002273
Nicolas Capens157ba262019-12-10 17:49:14 -05002274Int::Int(RValue<Int> rhs)
2275{
2276 storeValue(rhs.value);
2277}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002278
Nicolas Capens157ba262019-12-10 17:49:14 -05002279Int::Int(RValue<UInt> rhs)
2280{
2281 storeValue(rhs.value);
2282}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002283
Nicolas Capens157ba262019-12-10 17:49:14 -05002284Int::Int(const Int &rhs)
2285{
2286 Value *value = rhs.loadValue();
2287 storeValue(value);
2288}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002289
Nicolas Capens157ba262019-12-10 17:49:14 -05002290Int::Int(const Reference<Int> &rhs)
2291{
2292 Value *value = rhs.loadValue();
2293 storeValue(value);
2294}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002295
Nicolas Capens157ba262019-12-10 17:49:14 -05002296Int::Int(const UInt &rhs)
2297{
2298 Value *value = rhs.loadValue();
2299 storeValue(value);
2300}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002301
Nicolas Capens157ba262019-12-10 17:49:14 -05002302Int::Int(const Reference<UInt> &rhs)
2303{
2304 Value *value = rhs.loadValue();
2305 storeValue(value);
2306}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002307
Nicolas Capens157ba262019-12-10 17:49:14 -05002308RValue<Int> Int::operator=(int rhs)
2309{
2310 return RValue<Int>(storeValue(Nucleus::createConstantInt(rhs)));
2311}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002312
Nicolas Capens157ba262019-12-10 17:49:14 -05002313RValue<Int> Int::operator=(RValue<Int> rhs)
2314{
2315 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002316
Nicolas Capens157ba262019-12-10 17:49:14 -05002317 return rhs;
2318}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002319
Nicolas Capens157ba262019-12-10 17:49:14 -05002320RValue<Int> Int::operator=(RValue<UInt> rhs)
2321{
2322 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002323
Nicolas Capens157ba262019-12-10 17:49:14 -05002324 return RValue<Int>(rhs);
2325}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002326
Nicolas Capens157ba262019-12-10 17:49:14 -05002327RValue<Int> Int::operator=(const Int &rhs)
2328{
2329 Value *value = rhs.loadValue();
2330 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002331
Nicolas Capens157ba262019-12-10 17:49:14 -05002332 return RValue<Int>(value);
2333}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002334
Nicolas Capens157ba262019-12-10 17:49:14 -05002335RValue<Int> Int::operator=(const Reference<Int> &rhs)
2336{
2337 Value *value = rhs.loadValue();
2338 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002339
Nicolas Capens157ba262019-12-10 17:49:14 -05002340 return RValue<Int>(value);
2341}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002342
Nicolas Capens157ba262019-12-10 17:49:14 -05002343RValue<Int> Int::operator=(const UInt &rhs)
2344{
2345 Value *value = rhs.loadValue();
2346 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002347
Nicolas Capens157ba262019-12-10 17:49:14 -05002348 return RValue<Int>(value);
2349}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002350
Nicolas Capens157ba262019-12-10 17:49:14 -05002351RValue<Int> Int::operator=(const Reference<UInt> &rhs)
2352{
2353 Value *value = rhs.loadValue();
2354 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002355
Nicolas Capens157ba262019-12-10 17:49:14 -05002356 return RValue<Int>(value);
2357}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002358
Nicolas Capens157ba262019-12-10 17:49:14 -05002359RValue<Int> operator+(RValue<Int> lhs, RValue<Int> rhs)
2360{
2361 return RValue<Int>(Nucleus::createAdd(lhs.value, rhs.value));
2362}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002363
Nicolas Capens157ba262019-12-10 17:49:14 -05002364RValue<Int> operator-(RValue<Int> lhs, RValue<Int> rhs)
2365{
2366 return RValue<Int>(Nucleus::createSub(lhs.value, rhs.value));
2367}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002368
Nicolas Capens157ba262019-12-10 17:49:14 -05002369RValue<Int> operator*(RValue<Int> lhs, RValue<Int> rhs)
2370{
2371 return RValue<Int>(Nucleus::createMul(lhs.value, rhs.value));
2372}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002373
Nicolas Capens157ba262019-12-10 17:49:14 -05002374RValue<Int> operator/(RValue<Int> lhs, RValue<Int> rhs)
2375{
2376 return RValue<Int>(Nucleus::createSDiv(lhs.value, rhs.value));
2377}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002378
Nicolas Capens157ba262019-12-10 17:49:14 -05002379RValue<Int> operator%(RValue<Int> lhs, RValue<Int> rhs)
2380{
2381 return RValue<Int>(Nucleus::createSRem(lhs.value, rhs.value));
2382}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002383
Nicolas Capens157ba262019-12-10 17:49:14 -05002384RValue<Int> operator&(RValue<Int> lhs, RValue<Int> rhs)
2385{
2386 return RValue<Int>(Nucleus::createAnd(lhs.value, rhs.value));
2387}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002388
Nicolas Capens157ba262019-12-10 17:49:14 -05002389RValue<Int> operator|(RValue<Int> lhs, RValue<Int> rhs)
2390{
2391 return RValue<Int>(Nucleus::createOr(lhs.value, rhs.value));
2392}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002393
Nicolas Capens157ba262019-12-10 17:49:14 -05002394RValue<Int> operator^(RValue<Int> lhs, RValue<Int> rhs)
2395{
2396 return RValue<Int>(Nucleus::createXor(lhs.value, rhs.value));
2397}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002398
Nicolas Capens157ba262019-12-10 17:49:14 -05002399RValue<Int> operator<<(RValue<Int> lhs, RValue<Int> rhs)
2400{
2401 return RValue<Int>(Nucleus::createShl(lhs.value, rhs.value));
2402}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002403
Nicolas Capens157ba262019-12-10 17:49:14 -05002404RValue<Int> operator>>(RValue<Int> lhs, RValue<Int> rhs)
2405{
2406 return RValue<Int>(Nucleus::createAShr(lhs.value, rhs.value));
2407}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002408
Nicolas Capens157ba262019-12-10 17:49:14 -05002409RValue<Int> operator+=(Int &lhs, RValue<Int> rhs)
2410{
2411 return lhs = lhs + rhs;
2412}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002413
Nicolas Capens157ba262019-12-10 17:49:14 -05002414RValue<Int> operator-=(Int &lhs, RValue<Int> rhs)
2415{
2416 return lhs = lhs - rhs;
2417}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002418
Nicolas Capens157ba262019-12-10 17:49:14 -05002419RValue<Int> operator*=(Int &lhs, RValue<Int> rhs)
2420{
2421 return lhs = lhs * rhs;
2422}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002423
Nicolas Capens157ba262019-12-10 17:49:14 -05002424RValue<Int> operator/=(Int &lhs, RValue<Int> rhs)
2425{
2426 return lhs = lhs / rhs;
2427}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002428
Nicolas Capens157ba262019-12-10 17:49:14 -05002429RValue<Int> operator%=(Int &lhs, RValue<Int> rhs)
2430{
2431 return lhs = lhs % rhs;
2432}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002433
Nicolas Capens157ba262019-12-10 17:49:14 -05002434RValue<Int> operator&=(Int &lhs, RValue<Int> rhs)
2435{
2436 return lhs = lhs & rhs;
2437}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002438
Nicolas Capens157ba262019-12-10 17:49:14 -05002439RValue<Int> operator|=(Int &lhs, RValue<Int> rhs)
2440{
2441 return lhs = lhs | rhs;
2442}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002443
Nicolas Capens157ba262019-12-10 17:49:14 -05002444RValue<Int> operator^=(Int &lhs, RValue<Int> rhs)
2445{
2446 return lhs = lhs ^ rhs;
2447}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002448
Nicolas Capens157ba262019-12-10 17:49:14 -05002449RValue<Int> operator<<=(Int &lhs, RValue<Int> rhs)
2450{
2451 return lhs = lhs << rhs;
2452}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002453
Nicolas Capens157ba262019-12-10 17:49:14 -05002454RValue<Int> operator>>=(Int &lhs, RValue<Int> rhs)
2455{
2456 return lhs = lhs >> rhs;
2457}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002458
Nicolas Capens157ba262019-12-10 17:49:14 -05002459RValue<Int> operator+(RValue<Int> val)
2460{
2461 return val;
2462}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002463
Nicolas Capens157ba262019-12-10 17:49:14 -05002464RValue<Int> operator-(RValue<Int> val)
2465{
2466 return RValue<Int>(Nucleus::createNeg(val.value));
2467}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002468
Nicolas Capens157ba262019-12-10 17:49:14 -05002469RValue<Int> operator~(RValue<Int> val)
2470{
2471 return RValue<Int>(Nucleus::createNot(val.value));
2472}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002473
Nicolas Capens157ba262019-12-10 17:49:14 -05002474RValue<Bool> operator<(RValue<Int> lhs, RValue<Int> rhs)
2475{
2476 return RValue<Bool>(Nucleus::createICmpSLT(lhs.value, rhs.value));
2477}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002478
Nicolas Capens157ba262019-12-10 17:49:14 -05002479RValue<Bool> operator<=(RValue<Int> lhs, RValue<Int> rhs)
2480{
2481 return RValue<Bool>(Nucleus::createICmpSLE(lhs.value, rhs.value));
2482}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002483
Nicolas Capens157ba262019-12-10 17:49:14 -05002484RValue<Bool> operator>(RValue<Int> lhs, RValue<Int> rhs)
2485{
2486 return RValue<Bool>(Nucleus::createICmpSGT(lhs.value, rhs.value));
2487}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002488
Nicolas Capens157ba262019-12-10 17:49:14 -05002489RValue<Bool> operator>=(RValue<Int> lhs, RValue<Int> rhs)
2490{
2491 return RValue<Bool>(Nucleus::createICmpSGE(lhs.value, rhs.value));
2492}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002493
Nicolas Capens157ba262019-12-10 17:49:14 -05002494RValue<Bool> operator!=(RValue<Int> lhs, RValue<Int> rhs)
2495{
2496 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
2497}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002498
Nicolas Capens157ba262019-12-10 17:49:14 -05002499RValue<Bool> operator==(RValue<Int> lhs, RValue<Int> rhs)
2500{
2501 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
2502}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002503
Nicolas Capens157ba262019-12-10 17:49:14 -05002504RValue<Int> Max(RValue<Int> x, RValue<Int> y)
2505{
2506 return IfThenElse(x > y, x, y);
2507}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002508
Nicolas Capens157ba262019-12-10 17:49:14 -05002509RValue<Int> Min(RValue<Int> x, RValue<Int> y)
2510{
2511 return IfThenElse(x < y, x, y);
2512}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002513
Nicolas Capens157ba262019-12-10 17:49:14 -05002514RValue<Int> Clamp(RValue<Int> x, RValue<Int> min, RValue<Int> max)
2515{
2516 return Min(Max(x, min), max);
2517}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002518
Nicolas Capens157ba262019-12-10 17:49:14 -05002519Long::Long(RValue<Int> cast)
2520{
2521 Value *integer = Nucleus::createSExt(cast.value, Long::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002522
Nicolas Capens157ba262019-12-10 17:49:14 -05002523 storeValue(integer);
2524}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002525
Nicolas Capens157ba262019-12-10 17:49:14 -05002526Long::Long(RValue<UInt> cast)
2527{
2528 Value *integer = Nucleus::createZExt(cast.value, Long::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002529
Nicolas Capens157ba262019-12-10 17:49:14 -05002530 storeValue(integer);
2531}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002532
Nicolas Capens157ba262019-12-10 17:49:14 -05002533Long::Long(RValue<Long> rhs)
2534{
2535 storeValue(rhs.value);
2536}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002537
Nicolas Capens157ba262019-12-10 17:49:14 -05002538RValue<Long> Long::operator=(int64_t rhs)
2539{
2540 return RValue<Long>(storeValue(Nucleus::createConstantLong(rhs)));
2541}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002542
Nicolas Capens157ba262019-12-10 17:49:14 -05002543RValue<Long> Long::operator=(RValue<Long> rhs)
2544{
2545 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002546
Nicolas Capens157ba262019-12-10 17:49:14 -05002547 return rhs;
2548}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002549
Nicolas Capens157ba262019-12-10 17:49:14 -05002550RValue<Long> Long::operator=(const Long &rhs)
2551{
2552 Value *value = rhs.loadValue();
2553 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002554
Nicolas Capens157ba262019-12-10 17:49:14 -05002555 return RValue<Long>(value);
2556}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002557
Nicolas Capens157ba262019-12-10 17:49:14 -05002558RValue<Long> Long::operator=(const Reference<Long> &rhs)
2559{
2560 Value *value = rhs.loadValue();
2561 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002562
Nicolas Capens157ba262019-12-10 17:49:14 -05002563 return RValue<Long>(value);
2564}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002565
Nicolas Capens157ba262019-12-10 17:49:14 -05002566RValue<Long> operator+(RValue<Long> lhs, RValue<Long> rhs)
2567{
2568 return RValue<Long>(Nucleus::createAdd(lhs.value, rhs.value));
2569}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002570
Nicolas Capens157ba262019-12-10 17:49:14 -05002571RValue<Long> operator-(RValue<Long> lhs, RValue<Long> rhs)
2572{
2573 return RValue<Long>(Nucleus::createSub(lhs.value, rhs.value));
2574}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002575
Nicolas Capens157ba262019-12-10 17:49:14 -05002576RValue<Long> operator*(RValue<Long> lhs, RValue<Long> rhs)
2577{
2578 return RValue<Long>(Nucleus::createMul(lhs.value, rhs.value));
2579}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002580
Nicolas Capens157ba262019-12-10 17:49:14 -05002581RValue<Long> operator>>(RValue<Long> lhs, RValue<Long> rhs)
2582{
2583 return RValue<Long>(Nucleus::createAShr(lhs.value, rhs.value));
2584}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002585
Nicolas Capens157ba262019-12-10 17:49:14 -05002586RValue<Long> operator+=(Long &lhs, RValue<Long> rhs)
2587{
2588 return lhs = lhs + rhs;
2589}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002590
Nicolas Capens157ba262019-12-10 17:49:14 -05002591RValue<Long> operator-=(Long &lhs, RValue<Long> rhs)
2592{
2593 return lhs = lhs - rhs;
2594}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002595
Nicolas Capens157ba262019-12-10 17:49:14 -05002596RValue<Long> AddAtomic(RValue<Pointer<Long> > x, RValue<Long> y)
2597{
2598 return RValue<Long>(Nucleus::createAtomicAdd(x.value, y.value));
2599}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002600
Nicolas Capens157ba262019-12-10 17:49:14 -05002601RValue<UInt> AddAtomic(RValue<Pointer<UInt> > x, RValue<UInt> y, std::memory_order memoryOrder)
2602{
2603 return RValue<UInt>(Nucleus::createAtomicAdd(x.value, y.value, memoryOrder));
2604}
Chris Forbes17813932019-04-18 11:45:54 -07002605
Nicolas Capens157ba262019-12-10 17:49:14 -05002606RValue<UInt> SubAtomic(RValue<Pointer<UInt> > x, RValue<UInt> y, std::memory_order memoryOrder)
2607{
2608 return RValue<UInt>(Nucleus::createAtomicSub(x.value, y.value, memoryOrder));
2609}
Chris Forbes707ed992019-04-18 18:17:35 -07002610
Nicolas Capens157ba262019-12-10 17:49:14 -05002611RValue<UInt> AndAtomic(RValue<Pointer<UInt> > x, RValue<UInt> y, std::memory_order memoryOrder)
2612{
2613 return RValue<UInt>(Nucleus::createAtomicAnd(x.value, y.value, memoryOrder));
2614}
Chris Forbes17813932019-04-18 11:45:54 -07002615
Nicolas Capens157ba262019-12-10 17:49:14 -05002616RValue<UInt> OrAtomic(RValue<Pointer<UInt> > x, RValue<UInt> y, std::memory_order memoryOrder)
2617{
2618 return RValue<UInt>(Nucleus::createAtomicOr(x.value, y.value, memoryOrder));
2619}
Chris Forbes17813932019-04-18 11:45:54 -07002620
Nicolas Capens157ba262019-12-10 17:49:14 -05002621RValue<UInt> XorAtomic(RValue<Pointer<UInt> > x, RValue<UInt> y, std::memory_order memoryOrder)
2622{
2623 return RValue<UInt>(Nucleus::createAtomicXor(x.value, y.value, memoryOrder));
2624}
Chris Forbes17813932019-04-18 11:45:54 -07002625
Nicolas Capens157ba262019-12-10 17:49:14 -05002626RValue<Int> MinAtomic(RValue<Pointer<Int> > x, RValue<Int> y, std::memory_order memoryOrder)
2627{
2628 return RValue<Int>(Nucleus::createAtomicMin(x.value, y.value, memoryOrder));
2629}
Chris Forbes17813932019-04-18 11:45:54 -07002630
Nicolas Capens157ba262019-12-10 17:49:14 -05002631RValue<UInt> MinAtomic(RValue<Pointer<UInt> > x, RValue<UInt> y, std::memory_order memoryOrder)
2632{
2633 return RValue<UInt>(Nucleus::createAtomicUMin(x.value, y.value, memoryOrder));
2634}
Chris Forbes17813932019-04-18 11:45:54 -07002635
Nicolas Capens157ba262019-12-10 17:49:14 -05002636RValue<Int> MaxAtomic(RValue<Pointer<Int> > x, RValue<Int> y, std::memory_order memoryOrder)
2637{
2638 return RValue<Int>(Nucleus::createAtomicMax(x.value, y.value, memoryOrder));
2639}
Chris Forbes17813932019-04-18 11:45:54 -07002640
Nicolas Capens157ba262019-12-10 17:49:14 -05002641RValue<UInt> MaxAtomic(RValue<Pointer<UInt> > x, RValue<UInt> y, std::memory_order memoryOrder)
2642{
2643 return RValue<UInt>(Nucleus::createAtomicUMax(x.value, y.value, memoryOrder));
2644}
Chris Forbes17813932019-04-18 11:45:54 -07002645
Nicolas Capens157ba262019-12-10 17:49:14 -05002646RValue<UInt> ExchangeAtomic(RValue<Pointer<UInt> > x, RValue<UInt> y, std::memory_order memoryOrder)
2647{
2648 return RValue<UInt>(Nucleus::createAtomicExchange(x.value, y.value, memoryOrder));
2649}
Chris Forbes17813932019-04-18 11:45:54 -07002650
Nicolas Capens157ba262019-12-10 17:49:14 -05002651RValue<UInt> CompareExchangeAtomic(RValue<Pointer<UInt> > x, RValue<UInt> y, RValue<UInt> compare, std::memory_order memoryOrderEqual, std::memory_order memoryOrderUnequal)
2652{
2653 return RValue<UInt>(Nucleus::createAtomicCompareExchange(x.value, y.value, compare.value, memoryOrderEqual, memoryOrderUnequal));
2654}
Chris Forbesa16238d2019-04-18 16:31:54 -07002655
Nicolas Capens157ba262019-12-10 17:49:14 -05002656UInt::UInt(Argument<UInt> argument)
2657{
2658 storeValue(argument.value);
2659}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002660
Nicolas Capens157ba262019-12-10 17:49:14 -05002661UInt::UInt(RValue<UShort> cast)
2662{
2663 Value *integer = Nucleus::createZExt(cast.value, UInt::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002664
Nicolas Capens157ba262019-12-10 17:49:14 -05002665 storeValue(integer);
2666}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002667
Nicolas Capens157ba262019-12-10 17:49:14 -05002668UInt::UInt(RValue<Long> cast)
2669{
2670 Value *integer = Nucleus::createTrunc(cast.value, UInt::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002671
Nicolas Capens157ba262019-12-10 17:49:14 -05002672 storeValue(integer);
2673}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002674
Nicolas Capens157ba262019-12-10 17:49:14 -05002675UInt::UInt(int x)
2676{
2677 storeValue(Nucleus::createConstantInt(x));
2678}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002679
Nicolas Capens157ba262019-12-10 17:49:14 -05002680UInt::UInt(unsigned int x)
2681{
2682 storeValue(Nucleus::createConstantInt(x));
2683}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002684
Nicolas Capens157ba262019-12-10 17:49:14 -05002685UInt::UInt(RValue<UInt> rhs)
2686{
2687 storeValue(rhs.value);
2688}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002689
Nicolas Capens157ba262019-12-10 17:49:14 -05002690UInt::UInt(RValue<Int> rhs)
2691{
2692 storeValue(rhs.value);
2693}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002694
Nicolas Capens157ba262019-12-10 17:49:14 -05002695UInt::UInt(const UInt &rhs)
2696{
2697 Value *value = rhs.loadValue();
2698 storeValue(value);
2699}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002700
Nicolas Capens157ba262019-12-10 17:49:14 -05002701UInt::UInt(const Reference<UInt> &rhs)
2702{
2703 Value *value = rhs.loadValue();
2704 storeValue(value);
2705}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002706
Nicolas Capens157ba262019-12-10 17:49:14 -05002707UInt::UInt(const Int &rhs)
2708{
2709 Value *value = rhs.loadValue();
2710 storeValue(value);
2711}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002712
Nicolas Capens157ba262019-12-10 17:49:14 -05002713UInt::UInt(const Reference<Int> &rhs)
2714{
2715 Value *value = rhs.loadValue();
2716 storeValue(value);
2717}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002718
Nicolas Capens157ba262019-12-10 17:49:14 -05002719RValue<UInt> UInt::operator=(unsigned int rhs)
2720{
2721 return RValue<UInt>(storeValue(Nucleus::createConstantInt(rhs)));
2722}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002723
Nicolas Capens157ba262019-12-10 17:49:14 -05002724RValue<UInt> UInt::operator=(RValue<UInt> rhs)
2725{
2726 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002727
Nicolas Capens157ba262019-12-10 17:49:14 -05002728 return rhs;
2729}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002730
Nicolas Capens157ba262019-12-10 17:49:14 -05002731RValue<UInt> UInt::operator=(RValue<Int> rhs)
2732{
2733 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002734
Nicolas Capens157ba262019-12-10 17:49:14 -05002735 return RValue<UInt>(rhs);
2736}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002737
Nicolas Capens157ba262019-12-10 17:49:14 -05002738RValue<UInt> UInt::operator=(const UInt &rhs)
2739{
2740 Value *value = rhs.loadValue();
2741 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002742
Nicolas Capens157ba262019-12-10 17:49:14 -05002743 return RValue<UInt>(value);
2744}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002745
Nicolas Capens157ba262019-12-10 17:49:14 -05002746RValue<UInt> UInt::operator=(const Reference<UInt> &rhs)
2747{
2748 Value *value = rhs.loadValue();
2749 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002750
Nicolas Capens157ba262019-12-10 17:49:14 -05002751 return RValue<UInt>(value);
2752}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002753
Nicolas Capens157ba262019-12-10 17:49:14 -05002754RValue<UInt> UInt::operator=(const Int &rhs)
2755{
2756 Value *value = rhs.loadValue();
2757 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002758
Nicolas Capens157ba262019-12-10 17:49:14 -05002759 return RValue<UInt>(value);
2760}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002761
Nicolas Capens157ba262019-12-10 17:49:14 -05002762RValue<UInt> UInt::operator=(const Reference<Int> &rhs)
2763{
2764 Value *value = rhs.loadValue();
2765 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002766
Nicolas Capens157ba262019-12-10 17:49:14 -05002767 return RValue<UInt>(value);
2768}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002769
Nicolas Capens157ba262019-12-10 17:49:14 -05002770RValue<UInt> operator+(RValue<UInt> lhs, RValue<UInt> rhs)
2771{
2772 return RValue<UInt>(Nucleus::createAdd(lhs.value, rhs.value));
2773}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002774
Nicolas Capens157ba262019-12-10 17:49:14 -05002775RValue<UInt> operator-(RValue<UInt> lhs, RValue<UInt> rhs)
2776{
2777 return RValue<UInt>(Nucleus::createSub(lhs.value, rhs.value));
2778}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002779
Nicolas Capens157ba262019-12-10 17:49:14 -05002780RValue<UInt> operator*(RValue<UInt> lhs, RValue<UInt> rhs)
2781{
2782 return RValue<UInt>(Nucleus::createMul(lhs.value, rhs.value));
2783}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002784
Nicolas Capens157ba262019-12-10 17:49:14 -05002785RValue<UInt> operator/(RValue<UInt> lhs, RValue<UInt> rhs)
2786{
2787 return RValue<UInt>(Nucleus::createUDiv(lhs.value, rhs.value));
2788}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002789
Nicolas Capens157ba262019-12-10 17:49:14 -05002790RValue<UInt> operator%(RValue<UInt> lhs, RValue<UInt> rhs)
2791{
2792 return RValue<UInt>(Nucleus::createURem(lhs.value, rhs.value));
2793}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002794
Nicolas Capens157ba262019-12-10 17:49:14 -05002795RValue<UInt> operator&(RValue<UInt> lhs, RValue<UInt> rhs)
2796{
2797 return RValue<UInt>(Nucleus::createAnd(lhs.value, rhs.value));
2798}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002799
Nicolas Capens157ba262019-12-10 17:49:14 -05002800RValue<UInt> operator|(RValue<UInt> lhs, RValue<UInt> rhs)
2801{
2802 return RValue<UInt>(Nucleus::createOr(lhs.value, rhs.value));
2803}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002804
Nicolas Capens157ba262019-12-10 17:49:14 -05002805RValue<UInt> operator^(RValue<UInt> lhs, RValue<UInt> rhs)
2806{
2807 return RValue<UInt>(Nucleus::createXor(lhs.value, rhs.value));
2808}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002809
Nicolas Capens157ba262019-12-10 17:49:14 -05002810RValue<UInt> operator<<(RValue<UInt> lhs, RValue<UInt> rhs)
2811{
2812 return RValue<UInt>(Nucleus::createShl(lhs.value, rhs.value));
2813}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002814
Nicolas Capens157ba262019-12-10 17:49:14 -05002815RValue<UInt> operator>>(RValue<UInt> lhs, RValue<UInt> rhs)
2816{
2817 return RValue<UInt>(Nucleus::createLShr(lhs.value, rhs.value));
2818}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002819
Nicolas Capens157ba262019-12-10 17:49:14 -05002820RValue<UInt> operator+=(UInt &lhs, RValue<UInt> rhs)
2821{
2822 return lhs = lhs + rhs;
2823}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002824
Nicolas Capens157ba262019-12-10 17:49:14 -05002825RValue<UInt> operator-=(UInt &lhs, RValue<UInt> rhs)
2826{
2827 return lhs = lhs - rhs;
2828}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002829
Nicolas Capens157ba262019-12-10 17:49:14 -05002830RValue<UInt> operator*=(UInt &lhs, RValue<UInt> rhs)
2831{
2832 return lhs = lhs * rhs;
2833}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002834
Nicolas Capens157ba262019-12-10 17:49:14 -05002835RValue<UInt> operator/=(UInt &lhs, RValue<UInt> rhs)
2836{
2837 return lhs = lhs / rhs;
2838}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002839
Nicolas Capens157ba262019-12-10 17:49:14 -05002840RValue<UInt> operator%=(UInt &lhs, RValue<UInt> rhs)
2841{
2842 return lhs = lhs % rhs;
2843}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002844
Nicolas Capens157ba262019-12-10 17:49:14 -05002845RValue<UInt> operator&=(UInt &lhs, RValue<UInt> rhs)
2846{
2847 return lhs = lhs & rhs;
2848}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002849
Nicolas Capens157ba262019-12-10 17:49:14 -05002850RValue<UInt> operator|=(UInt &lhs, RValue<UInt> rhs)
2851{
2852 return lhs = lhs | rhs;
2853}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002854
Nicolas Capens157ba262019-12-10 17:49:14 -05002855RValue<UInt> operator^=(UInt &lhs, RValue<UInt> rhs)
2856{
2857 return lhs = lhs ^ rhs;
2858}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002859
Nicolas Capens157ba262019-12-10 17:49:14 -05002860RValue<UInt> operator<<=(UInt &lhs, RValue<UInt> rhs)
2861{
2862 return lhs = lhs << rhs;
2863}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002864
Nicolas Capens157ba262019-12-10 17:49:14 -05002865RValue<UInt> operator>>=(UInt &lhs, RValue<UInt> rhs)
2866{
2867 return lhs = lhs >> rhs;
2868}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002869
Nicolas Capens157ba262019-12-10 17:49:14 -05002870RValue<UInt> operator+(RValue<UInt> val)
2871{
2872 return val;
2873}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002874
Nicolas Capens157ba262019-12-10 17:49:14 -05002875RValue<UInt> operator-(RValue<UInt> val)
2876{
2877 return RValue<UInt>(Nucleus::createNeg(val.value));
2878}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002879
Nicolas Capens157ba262019-12-10 17:49:14 -05002880RValue<UInt> operator~(RValue<UInt> val)
2881{
2882 return RValue<UInt>(Nucleus::createNot(val.value));
2883}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002884
Nicolas Capens157ba262019-12-10 17:49:14 -05002885RValue<UInt> Max(RValue<UInt> x, RValue<UInt> y)
2886{
2887 return IfThenElse(x > y, x, y);
2888}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002889
Nicolas Capens157ba262019-12-10 17:49:14 -05002890RValue<UInt> Min(RValue<UInt> x, RValue<UInt> y)
2891{
2892 return IfThenElse(x < y, x, y);
2893}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002894
Nicolas Capens157ba262019-12-10 17:49:14 -05002895RValue<UInt> Clamp(RValue<UInt> x, RValue<UInt> min, RValue<UInt> max)
2896{
2897 return Min(Max(x, min), max);
2898}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002899
Nicolas Capens157ba262019-12-10 17:49:14 -05002900RValue<Bool> operator<(RValue<UInt> lhs, RValue<UInt> rhs)
2901{
2902 return RValue<Bool>(Nucleus::createICmpULT(lhs.value, rhs.value));
2903}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002904
Nicolas Capens157ba262019-12-10 17:49:14 -05002905RValue<Bool> operator<=(RValue<UInt> lhs, RValue<UInt> rhs)
2906{
2907 return RValue<Bool>(Nucleus::createICmpULE(lhs.value, rhs.value));
2908}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002909
Nicolas Capens157ba262019-12-10 17:49:14 -05002910RValue<Bool> operator>(RValue<UInt> lhs, RValue<UInt> rhs)
2911{
2912 return RValue<Bool>(Nucleus::createICmpUGT(lhs.value, rhs.value));
2913}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002914
Nicolas Capens157ba262019-12-10 17:49:14 -05002915RValue<Bool> operator>=(RValue<UInt> lhs, RValue<UInt> rhs)
2916{
2917 return RValue<Bool>(Nucleus::createICmpUGE(lhs.value, rhs.value));
2918}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002919
Nicolas Capens157ba262019-12-10 17:49:14 -05002920RValue<Bool> operator!=(RValue<UInt> lhs, RValue<UInt> rhs)
2921{
2922 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
2923}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002924
Nicolas Capens157ba262019-12-10 17:49:14 -05002925RValue<Bool> operator==(RValue<UInt> lhs, RValue<UInt> rhs)
2926{
2927 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
2928}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002929
Nicolas Capens157ba262019-12-10 17:49:14 -05002930Int2::Int2(RValue<Int4> cast)
2931{
2932 storeValue(Nucleus::createBitCast(cast.value, getType()));
2933}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002934
Nicolas Capens157ba262019-12-10 17:49:14 -05002935Int2::Int2(int x, int y)
2936{
2937 int64_t constantVector[2] = {x, y};
2938 storeValue(Nucleus::createConstantVector(constantVector, getType()));
2939}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002940
Nicolas Capens157ba262019-12-10 17:49:14 -05002941Int2::Int2(RValue<Int2> rhs)
2942{
2943 storeValue(rhs.value);
2944}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002945
Nicolas Capens157ba262019-12-10 17:49:14 -05002946Int2::Int2(const Int2 &rhs)
2947{
2948 Value *value = rhs.loadValue();
2949 storeValue(value);
2950}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002951
Nicolas Capens157ba262019-12-10 17:49:14 -05002952Int2::Int2(const Reference<Int2> &rhs)
2953{
2954 Value *value = rhs.loadValue();
2955 storeValue(value);
2956}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002957
Nicolas Capens157ba262019-12-10 17:49:14 -05002958Int2::Int2(RValue<Int> lo, RValue<Int> hi)
2959{
2960 int shuffle[4] = {0, 4, 1, 5};
2961 Value *packed = Nucleus::createShuffleVector(Int4(lo).loadValue(), Int4(hi).loadValue(), shuffle);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002962
Nicolas Capens157ba262019-12-10 17:49:14 -05002963 storeValue(Nucleus::createBitCast(packed, Int2::getType()));
2964}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002965
Nicolas Capens157ba262019-12-10 17:49:14 -05002966RValue<Int2> Int2::operator=(RValue<Int2> rhs)
2967{
2968 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002969
Nicolas Capens157ba262019-12-10 17:49:14 -05002970 return rhs;
2971}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002972
Nicolas Capens157ba262019-12-10 17:49:14 -05002973RValue<Int2> Int2::operator=(const Int2 &rhs)
2974{
2975 Value *value = rhs.loadValue();
2976 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002977
Nicolas Capens157ba262019-12-10 17:49:14 -05002978 return RValue<Int2>(value);
2979}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002980
Nicolas Capens157ba262019-12-10 17:49:14 -05002981RValue<Int2> Int2::operator=(const Reference<Int2> &rhs)
2982{
2983 Value *value = rhs.loadValue();
2984 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002985
Nicolas Capens157ba262019-12-10 17:49:14 -05002986 return RValue<Int2>(value);
2987}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002988
Nicolas Capens157ba262019-12-10 17:49:14 -05002989RValue<Int2> operator+(RValue<Int2> lhs, RValue<Int2> rhs)
2990{
2991 return RValue<Int2>(Nucleus::createAdd(lhs.value, rhs.value));
2992}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002993
Nicolas Capens157ba262019-12-10 17:49:14 -05002994RValue<Int2> operator-(RValue<Int2> lhs, RValue<Int2> rhs)
2995{
2996 return RValue<Int2>(Nucleus::createSub(lhs.value, rhs.value));
2997}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002998
2999// RValue<Int2> operator*(RValue<Int2> lhs, RValue<Int2> rhs)
3000// {
3001// return RValue<Int2>(Nucleus::createMul(lhs.value, rhs.value));
3002// }
3003
3004// RValue<Int2> operator/(RValue<Int2> lhs, RValue<Int2> rhs)
3005// {
3006// return RValue<Int2>(Nucleus::createSDiv(lhs.value, rhs.value));
3007// }
3008
3009// RValue<Int2> operator%(RValue<Int2> lhs, RValue<Int2> rhs)
3010// {
3011// return RValue<Int2>(Nucleus::createSRem(lhs.value, rhs.value));
3012// }
3013
Nicolas Capens157ba262019-12-10 17:49:14 -05003014RValue<Int2> operator&(RValue<Int2> lhs, RValue<Int2> rhs)
3015{
3016 return RValue<Int2>(Nucleus::createAnd(lhs.value, rhs.value));
3017}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003018
Nicolas Capens157ba262019-12-10 17:49:14 -05003019RValue<Int2> operator|(RValue<Int2> lhs, RValue<Int2> rhs)
3020{
3021 return RValue<Int2>(Nucleus::createOr(lhs.value, rhs.value));
3022}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003023
Nicolas Capens157ba262019-12-10 17:49:14 -05003024RValue<Int2> operator^(RValue<Int2> lhs, RValue<Int2> rhs)
3025{
3026 return RValue<Int2>(Nucleus::createXor(lhs.value, rhs.value));
3027}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003028
Nicolas Capens157ba262019-12-10 17:49:14 -05003029RValue<Int2> operator+=(Int2 &lhs, RValue<Int2> rhs)
3030{
3031 return lhs = lhs + rhs;
3032}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003033
Nicolas Capens157ba262019-12-10 17:49:14 -05003034RValue<Int2> operator-=(Int2 &lhs, RValue<Int2> rhs)
3035{
3036 return lhs = lhs - rhs;
3037}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003038
3039// RValue<Int2> operator*=(Int2 &lhs, RValue<Int2> rhs)
3040// {
3041// return lhs = lhs * rhs;
3042// }
3043
3044// RValue<Int2> operator/=(Int2 &lhs, RValue<Int2> rhs)
3045// {
3046// return lhs = lhs / rhs;
3047// }
3048
3049// RValue<Int2> operator%=(Int2 &lhs, RValue<Int2> rhs)
3050// {
3051// return lhs = lhs % rhs;
3052// }
3053
Nicolas Capens157ba262019-12-10 17:49:14 -05003054RValue<Int2> operator&=(Int2 &lhs, RValue<Int2> rhs)
3055{
3056 return lhs = lhs & rhs;
3057}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003058
Nicolas Capens157ba262019-12-10 17:49:14 -05003059RValue<Int2> operator|=(Int2 &lhs, RValue<Int2> rhs)
3060{
3061 return lhs = lhs | rhs;
3062}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003063
Nicolas Capens157ba262019-12-10 17:49:14 -05003064RValue<Int2> operator^=(Int2 &lhs, RValue<Int2> rhs)
3065{
3066 return lhs = lhs ^ rhs;
3067}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003068
Nicolas Capens157ba262019-12-10 17:49:14 -05003069RValue<Int2> operator<<=(Int2 &lhs, unsigned char rhs)
3070{
3071 return lhs = lhs << rhs;
3072}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003073
Nicolas Capens157ba262019-12-10 17:49:14 -05003074RValue<Int2> operator>>=(Int2 &lhs, unsigned char rhs)
3075{
3076 return lhs = lhs >> rhs;
3077}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003078
3079// RValue<Int2> operator+(RValue<Int2> val)
3080// {
3081// return val;
3082// }
3083
3084// RValue<Int2> operator-(RValue<Int2> val)
3085// {
3086// return RValue<Int2>(Nucleus::createNeg(val.value));
3087// }
3088
Nicolas Capens157ba262019-12-10 17:49:14 -05003089RValue<Int2> operator~(RValue<Int2> val)
3090{
3091 return RValue<Int2>(Nucleus::createNot(val.value));
3092}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003093
Nicolas Capens157ba262019-12-10 17:49:14 -05003094RValue<Short4> UnpackLow(RValue<Int2> x, RValue<Int2> y)
3095{
3096 int shuffle[4] = {0, 4, 1, 5}; // Real type is v4i32
3097 return As<Short4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
3098}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003099
Nicolas Capens157ba262019-12-10 17:49:14 -05003100RValue<Short4> UnpackHigh(RValue<Int2> x, RValue<Int2> y)
3101{
3102 int shuffle[4] = {0, 4, 1, 5}; // Real type is v4i32
3103 auto lowHigh = RValue<Int4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
3104 return As<Short4>(Swizzle(lowHigh, 0x2323));
3105}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003106
Nicolas Capens157ba262019-12-10 17:49:14 -05003107RValue<Int> Extract(RValue<Int2> val, int i)
3108{
3109 return RValue<Int>(Nucleus::createExtractElement(val.value, Int::getType(), i));
3110}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003111
Nicolas Capens157ba262019-12-10 17:49:14 -05003112RValue<Int2> Insert(RValue<Int2> val, RValue<Int> element, int i)
3113{
3114 return RValue<Int2>(Nucleus::createInsertElement(val.value, element.value, i));
3115}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003116
Nicolas Capens157ba262019-12-10 17:49:14 -05003117UInt2::UInt2(unsigned int x, unsigned int y)
3118{
3119 int64_t constantVector[2] = {x, y};
3120 storeValue(Nucleus::createConstantVector(constantVector, getType()));
3121}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003122
Nicolas Capens157ba262019-12-10 17:49:14 -05003123UInt2::UInt2(RValue<UInt2> rhs)
3124{
3125 storeValue(rhs.value);
3126}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003127
Nicolas Capens157ba262019-12-10 17:49:14 -05003128UInt2::UInt2(const UInt2 &rhs)
3129{
3130 Value *value = rhs.loadValue();
3131 storeValue(value);
3132}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003133
Nicolas Capens157ba262019-12-10 17:49:14 -05003134UInt2::UInt2(const Reference<UInt2> &rhs)
3135{
3136 Value *value = rhs.loadValue();
3137 storeValue(value);
3138}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003139
Nicolas Capens157ba262019-12-10 17:49:14 -05003140RValue<UInt2> UInt2::operator=(RValue<UInt2> rhs)
3141{
3142 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003143
Nicolas Capens157ba262019-12-10 17:49:14 -05003144 return rhs;
3145}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003146
Nicolas Capens157ba262019-12-10 17:49:14 -05003147RValue<UInt2> UInt2::operator=(const UInt2 &rhs)
3148{
3149 Value *value = rhs.loadValue();
3150 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003151
Nicolas Capens157ba262019-12-10 17:49:14 -05003152 return RValue<UInt2>(value);
3153}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003154
Nicolas Capens157ba262019-12-10 17:49:14 -05003155RValue<UInt2> UInt2::operator=(const Reference<UInt2> &rhs)
3156{
3157 Value *value = rhs.loadValue();
3158 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003159
Nicolas Capens157ba262019-12-10 17:49:14 -05003160 return RValue<UInt2>(value);
3161}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003162
Nicolas Capens157ba262019-12-10 17:49:14 -05003163RValue<UInt2> operator+(RValue<UInt2> lhs, RValue<UInt2> rhs)
3164{
3165 return RValue<UInt2>(Nucleus::createAdd(lhs.value, rhs.value));
3166}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003167
Nicolas Capens157ba262019-12-10 17:49:14 -05003168RValue<UInt2> operator-(RValue<UInt2> lhs, RValue<UInt2> rhs)
3169{
3170 return RValue<UInt2>(Nucleus::createSub(lhs.value, rhs.value));
3171}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003172
3173// RValue<UInt2> operator*(RValue<UInt2> lhs, RValue<UInt2> rhs)
3174// {
3175// return RValue<UInt2>(Nucleus::createMul(lhs.value, rhs.value));
3176// }
3177
3178// RValue<UInt2> operator/(RValue<UInt2> lhs, RValue<UInt2> rhs)
3179// {
3180// return RValue<UInt2>(Nucleus::createUDiv(lhs.value, rhs.value));
3181// }
3182
3183// RValue<UInt2> operator%(RValue<UInt2> lhs, RValue<UInt2> rhs)
3184// {
3185// return RValue<UInt2>(Nucleus::createURem(lhs.value, rhs.value));
3186// }
3187
Nicolas Capens157ba262019-12-10 17:49:14 -05003188RValue<UInt2> operator&(RValue<UInt2> lhs, RValue<UInt2> rhs)
3189{
3190 return RValue<UInt2>(Nucleus::createAnd(lhs.value, rhs.value));
3191}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003192
Nicolas Capens157ba262019-12-10 17:49:14 -05003193RValue<UInt2> operator|(RValue<UInt2> lhs, RValue<UInt2> rhs)
3194{
3195 return RValue<UInt2>(Nucleus::createOr(lhs.value, rhs.value));
3196}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003197
Nicolas Capens157ba262019-12-10 17:49:14 -05003198RValue<UInt2> operator^(RValue<UInt2> lhs, RValue<UInt2> rhs)
3199{
3200 return RValue<UInt2>(Nucleus::createXor(lhs.value, rhs.value));
3201}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003202
Nicolas Capens157ba262019-12-10 17:49:14 -05003203RValue<UInt2> operator+=(UInt2 &lhs, RValue<UInt2> rhs)
3204{
3205 return lhs = lhs + rhs;
3206}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003207
Nicolas Capens157ba262019-12-10 17:49:14 -05003208RValue<UInt2> operator-=(UInt2 &lhs, RValue<UInt2> rhs)
3209{
3210 return lhs = lhs - rhs;
3211}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003212
3213// RValue<UInt2> operator*=(UInt2 &lhs, RValue<UInt2> rhs)
3214// {
3215// return lhs = lhs * rhs;
3216// }
3217
3218// RValue<UInt2> operator/=(UInt2 &lhs, RValue<UInt2> rhs)
3219// {
3220// return lhs = lhs / rhs;
3221// }
3222
3223// RValue<UInt2> operator%=(UInt2 &lhs, RValue<UInt2> rhs)
3224// {
3225// return lhs = lhs % rhs;
3226// }
3227
Nicolas Capens157ba262019-12-10 17:49:14 -05003228RValue<UInt2> operator&=(UInt2 &lhs, RValue<UInt2> rhs)
3229{
3230 return lhs = lhs & rhs;
3231}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003232
Nicolas Capens157ba262019-12-10 17:49:14 -05003233RValue<UInt2> operator|=(UInt2 &lhs, RValue<UInt2> rhs)
3234{
3235 return lhs = lhs | rhs;
3236}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003237
Nicolas Capens157ba262019-12-10 17:49:14 -05003238RValue<UInt2> operator^=(UInt2 &lhs, RValue<UInt2> rhs)
3239{
3240 return lhs = lhs ^ rhs;
3241}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003242
Nicolas Capens157ba262019-12-10 17:49:14 -05003243RValue<UInt2> operator<<=(UInt2 &lhs, unsigned char rhs)
3244{
3245 return lhs = lhs << rhs;
3246}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003247
Nicolas Capens157ba262019-12-10 17:49:14 -05003248RValue<UInt2> operator>>=(UInt2 &lhs, unsigned char rhs)
3249{
3250 return lhs = lhs >> rhs;
3251}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003252
3253// RValue<UInt2> operator+(RValue<UInt2> val)
3254// {
3255// return val;
3256// }
3257
3258// RValue<UInt2> operator-(RValue<UInt2> val)
3259// {
3260// return RValue<UInt2>(Nucleus::createNeg(val.value));
3261// }
3262
Nicolas Capens157ba262019-12-10 17:49:14 -05003263RValue<UInt2> operator~(RValue<UInt2> val)
3264{
3265 return RValue<UInt2>(Nucleus::createNot(val.value));
3266}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003267
Nicolas Capens157ba262019-12-10 17:49:14 -05003268RValue<UInt> Extract(RValue<UInt2> val, int i)
3269{
3270 return RValue<UInt>(Nucleus::createExtractElement(val.value, UInt::getType(), i));
3271}
Ben Clayton8ab40532019-05-10 16:23:13 +01003272
Nicolas Capens157ba262019-12-10 17:49:14 -05003273RValue<UInt2> Insert(RValue<UInt2> val, RValue<UInt> element, int i)
3274{
3275 return RValue<UInt2>(Nucleus::createInsertElement(val.value, element.value, i));
3276}
Ben Clayton8ab40532019-05-10 16:23:13 +01003277
Nicolas Capens157ba262019-12-10 17:49:14 -05003278Int4::Int4() : XYZW(this)
3279{
3280}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003281
Nicolas Capens157ba262019-12-10 17:49:14 -05003282Int4::Int4(RValue<Float4> cast) : XYZW(this)
3283{
3284 Value *xyzw = Nucleus::createFPToSI(cast.value, Int4::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003285
Nicolas Capens157ba262019-12-10 17:49:14 -05003286 storeValue(xyzw);
3287}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003288
Nicolas Capens157ba262019-12-10 17:49:14 -05003289Int4::Int4(int xyzw) : XYZW(this)
3290{
3291 constant(xyzw, xyzw, xyzw, xyzw);
3292}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003293
Nicolas Capens157ba262019-12-10 17:49:14 -05003294Int4::Int4(int x, int yzw) : XYZW(this)
3295{
3296 constant(x, yzw, yzw, yzw);
3297}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003298
Nicolas Capens157ba262019-12-10 17:49:14 -05003299Int4::Int4(int x, int y, int zw) : XYZW(this)
3300{
3301 constant(x, y, zw, zw);
3302}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003303
Nicolas Capens157ba262019-12-10 17:49:14 -05003304Int4::Int4(int x, int y, int z, int w) : XYZW(this)
3305{
3306 constant(x, y, z, w);
3307}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003308
Nicolas Capens157ba262019-12-10 17:49:14 -05003309void Int4::constant(int x, int y, int z, int w)
3310{
3311 int64_t constantVector[4] = {x, y, z, w};
3312 storeValue(Nucleus::createConstantVector(constantVector, getType()));
3313}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003314
Nicolas Capens157ba262019-12-10 17:49:14 -05003315Int4::Int4(RValue<Int4> rhs) : XYZW(this)
3316{
3317 storeValue(rhs.value);
3318}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003319
Nicolas Capens157ba262019-12-10 17:49:14 -05003320Int4::Int4(const Int4 &rhs) : XYZW(this)
3321{
3322 Value *value = rhs.loadValue();
3323 storeValue(value);
3324}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003325
Nicolas Capens157ba262019-12-10 17:49:14 -05003326Int4::Int4(const Reference<Int4> &rhs) : XYZW(this)
3327{
3328 Value *value = rhs.loadValue();
3329 storeValue(value);
3330}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003331
Nicolas Capens157ba262019-12-10 17:49:14 -05003332Int4::Int4(RValue<UInt4> rhs) : XYZW(this)
3333{
3334 storeValue(rhs.value);
3335}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003336
Nicolas Capens157ba262019-12-10 17:49:14 -05003337Int4::Int4(const UInt4 &rhs) : XYZW(this)
3338{
3339 Value *value = rhs.loadValue();
3340 storeValue(value);
3341}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003342
Nicolas Capens157ba262019-12-10 17:49:14 -05003343Int4::Int4(const Reference<UInt4> &rhs) : XYZW(this)
3344{
3345 Value *value = rhs.loadValue();
3346 storeValue(value);
3347}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003348
Nicolas Capens157ba262019-12-10 17:49:14 -05003349Int4::Int4(RValue<Int2> lo, RValue<Int2> hi) : XYZW(this)
3350{
3351 int shuffle[4] = {0, 1, 4, 5}; // Real type is v4i32
3352 Value *packed = Nucleus::createShuffleVector(lo.value, hi.value, shuffle);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003353
Nicolas Capens157ba262019-12-10 17:49:14 -05003354 storeValue(packed);
3355}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003356
Nicolas Capens157ba262019-12-10 17:49:14 -05003357Int4::Int4(const Int &rhs) : XYZW(this)
3358{
3359 *this = RValue<Int>(rhs.loadValue());
3360}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003361
Nicolas Capens157ba262019-12-10 17:49:14 -05003362Int4::Int4(const Reference<Int> &rhs) : XYZW(this)
3363{
3364 *this = RValue<Int>(rhs.loadValue());
3365}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003366
Nicolas Capens157ba262019-12-10 17:49:14 -05003367RValue<Int4> Int4::operator=(RValue<Int4> rhs)
3368{
3369 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003370
Nicolas Capens157ba262019-12-10 17:49:14 -05003371 return rhs;
3372}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003373
Nicolas Capens157ba262019-12-10 17:49:14 -05003374RValue<Int4> Int4::operator=(const Int4 &rhs)
3375{
3376 Value *value = rhs.loadValue();
3377 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003378
Nicolas Capens157ba262019-12-10 17:49:14 -05003379 return RValue<Int4>(value);
3380}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003381
Nicolas Capens157ba262019-12-10 17:49:14 -05003382RValue<Int4> Int4::operator=(const Reference<Int4> &rhs)
3383{
3384 Value *value = rhs.loadValue();
3385 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003386
Nicolas Capens157ba262019-12-10 17:49:14 -05003387 return RValue<Int4>(value);
3388}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003389
Nicolas Capens157ba262019-12-10 17:49:14 -05003390RValue<Int4> operator+(RValue<Int4> lhs, RValue<Int4> rhs)
3391{
3392 return RValue<Int4>(Nucleus::createAdd(lhs.value, rhs.value));
3393}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003394
Nicolas Capens157ba262019-12-10 17:49:14 -05003395RValue<Int4> operator-(RValue<Int4> lhs, RValue<Int4> rhs)
3396{
3397 return RValue<Int4>(Nucleus::createSub(lhs.value, rhs.value));
3398}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003399
Nicolas Capens157ba262019-12-10 17:49:14 -05003400RValue<Int4> operator*(RValue<Int4> lhs, RValue<Int4> rhs)
3401{
3402 return RValue<Int4>(Nucleus::createMul(lhs.value, rhs.value));
3403}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003404
Nicolas Capens157ba262019-12-10 17:49:14 -05003405RValue<Int4> operator/(RValue<Int4> lhs, RValue<Int4> rhs)
3406{
3407 return RValue<Int4>(Nucleus::createSDiv(lhs.value, rhs.value));
3408}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003409
Nicolas Capens157ba262019-12-10 17:49:14 -05003410RValue<Int4> operator%(RValue<Int4> lhs, RValue<Int4> rhs)
3411{
3412 return RValue<Int4>(Nucleus::createSRem(lhs.value, rhs.value));
3413}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003414
Nicolas Capens157ba262019-12-10 17:49:14 -05003415RValue<Int4> operator&(RValue<Int4> lhs, RValue<Int4> rhs)
3416{
3417 return RValue<Int4>(Nucleus::createAnd(lhs.value, rhs.value));
3418}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003419
Nicolas Capens157ba262019-12-10 17:49:14 -05003420RValue<Int4> operator|(RValue<Int4> lhs, RValue<Int4> rhs)
3421{
3422 return RValue<Int4>(Nucleus::createOr(lhs.value, rhs.value));
3423}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003424
Nicolas Capens157ba262019-12-10 17:49:14 -05003425RValue<Int4> operator^(RValue<Int4> lhs, RValue<Int4> rhs)
3426{
3427 return RValue<Int4>(Nucleus::createXor(lhs.value, rhs.value));
3428}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003429
Nicolas Capens157ba262019-12-10 17:49:14 -05003430RValue<Int4> operator<<(RValue<Int4> lhs, RValue<Int4> rhs)
3431{
3432 return RValue<Int4>(Nucleus::createShl(lhs.value, rhs.value));
3433}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003434
Nicolas Capens157ba262019-12-10 17:49:14 -05003435RValue<Int4> operator>>(RValue<Int4> lhs, RValue<Int4> rhs)
3436{
3437 return RValue<Int4>(Nucleus::createAShr(lhs.value, rhs.value));
3438}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003439
Nicolas Capens157ba262019-12-10 17:49:14 -05003440RValue<Int4> operator+=(Int4 &lhs, RValue<Int4> rhs)
3441{
3442 return lhs = lhs + rhs;
3443}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003444
Nicolas Capens157ba262019-12-10 17:49:14 -05003445RValue<Int4> operator-=(Int4 &lhs, RValue<Int4> rhs)
3446{
3447 return lhs = lhs - rhs;
3448}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003449
Nicolas Capens157ba262019-12-10 17:49:14 -05003450RValue<Int4> operator*=(Int4 &lhs, RValue<Int4> rhs)
3451{
3452 return lhs = lhs * rhs;
3453}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003454
3455// RValue<Int4> operator/=(Int4 &lhs, RValue<Int4> rhs)
3456// {
3457// return lhs = lhs / rhs;
3458// }
3459
3460// RValue<Int4> operator%=(Int4 &lhs, RValue<Int4> rhs)
3461// {
3462// return lhs = lhs % rhs;
3463// }
3464
Nicolas Capens157ba262019-12-10 17:49:14 -05003465RValue<Int4> operator&=(Int4 &lhs, RValue<Int4> rhs)
3466{
3467 return lhs = lhs & rhs;
3468}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003469
Nicolas Capens157ba262019-12-10 17:49:14 -05003470RValue<Int4> operator|=(Int4 &lhs, RValue<Int4> rhs)
3471{
3472 return lhs = lhs | rhs;
3473}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003474
Nicolas Capens157ba262019-12-10 17:49:14 -05003475RValue<Int4> operator^=(Int4 &lhs, RValue<Int4> rhs)
3476{
3477 return lhs = lhs ^ rhs;
3478}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003479
Nicolas Capens157ba262019-12-10 17:49:14 -05003480RValue<Int4> operator<<=(Int4 &lhs, unsigned char rhs)
3481{
3482 return lhs = lhs << rhs;
3483}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003484
Nicolas Capens157ba262019-12-10 17:49:14 -05003485RValue<Int4> operator>>=(Int4 &lhs, unsigned char rhs)
3486{
3487 return lhs = lhs >> rhs;
3488}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003489
Nicolas Capens157ba262019-12-10 17:49:14 -05003490RValue<Int4> operator+(RValue<Int4> val)
3491{
3492 return val;
3493}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003494
Nicolas Capens157ba262019-12-10 17:49:14 -05003495RValue<Int4> operator-(RValue<Int4> val)
3496{
3497 return RValue<Int4>(Nucleus::createNeg(val.value));
3498}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003499
Nicolas Capens157ba262019-12-10 17:49:14 -05003500RValue<Int4> operator~(RValue<Int4> val)
3501{
3502 return RValue<Int4>(Nucleus::createNot(val.value));
3503}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003504
Nicolas Capens157ba262019-12-10 17:49:14 -05003505RValue<Int> Extract(RValue<Int4> x, int i)
3506{
3507 return RValue<Int>(Nucleus::createExtractElement(x.value, Int::getType(), i));
3508}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003509
Nicolas Capens157ba262019-12-10 17:49:14 -05003510RValue<Int4> Insert(RValue<Int4> x, RValue<Int> element, int i)
3511{
3512 return RValue<Int4>(Nucleus::createInsertElement(x.value, element.value, i));
3513}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003514
Nicolas Capens157ba262019-12-10 17:49:14 -05003515RValue<Int4> Swizzle(RValue<Int4> x, uint16_t select)
3516{
3517 return RValue<Int4>(createSwizzle4(x.value, select));
3518}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003519
Nicolas Capens157ba262019-12-10 17:49:14 -05003520RValue<Int4> Shuffle(RValue<Int4> x, RValue<Int4> y, unsigned short select)
3521{
3522 return RValue<Int4>(createBlend4(x.value, y.value, select));
3523}
David 'Digit' Turnerb9f03f42019-12-04 19:32:34 +01003524
Nicolas Capens157ba262019-12-10 17:49:14 -05003525UInt4::UInt4() : XYZW(this)
3526{
3527}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003528
Nicolas Capens157ba262019-12-10 17:49:14 -05003529UInt4::UInt4(int xyzw) : XYZW(this)
3530{
3531 constant(xyzw, xyzw, xyzw, xyzw);
3532}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003533
Nicolas Capens157ba262019-12-10 17:49:14 -05003534UInt4::UInt4(int x, int yzw) : XYZW(this)
3535{
3536 constant(x, yzw, yzw, yzw);
3537}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003538
Nicolas Capens157ba262019-12-10 17:49:14 -05003539UInt4::UInt4(int x, int y, int zw) : XYZW(this)
3540{
3541 constant(x, y, zw, zw);
3542}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003543
Nicolas Capens157ba262019-12-10 17:49:14 -05003544UInt4::UInt4(int x, int y, int z, int w) : XYZW(this)
3545{
3546 constant(x, y, z, w);
3547}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003548
Nicolas Capens157ba262019-12-10 17:49:14 -05003549void UInt4::constant(int x, int y, int z, int w)
3550{
3551 int64_t constantVector[4] = {x, y, z, w};
3552 storeValue(Nucleus::createConstantVector(constantVector, getType()));
3553}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003554
Nicolas Capens157ba262019-12-10 17:49:14 -05003555UInt4::UInt4(RValue<UInt4> rhs) : XYZW(this)
3556{
3557 storeValue(rhs.value);
3558}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003559
Nicolas Capens157ba262019-12-10 17:49:14 -05003560UInt4::UInt4(const UInt4 &rhs) : XYZW(this)
3561{
3562 Value *value = rhs.loadValue();
3563 storeValue(value);
3564}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003565
Nicolas Capens157ba262019-12-10 17:49:14 -05003566UInt4::UInt4(const Reference<UInt4> &rhs) : XYZW(this)
3567{
3568 Value *value = rhs.loadValue();
3569 storeValue(value);
3570}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003571
Nicolas Capens157ba262019-12-10 17:49:14 -05003572UInt4::UInt4(RValue<Int4> rhs) : XYZW(this)
3573{
3574 storeValue(rhs.value);
3575}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003576
Nicolas Capens157ba262019-12-10 17:49:14 -05003577UInt4::UInt4(const Int4 &rhs) : XYZW(this)
3578{
3579 Value *value = rhs.loadValue();
3580 storeValue(value);
3581}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003582
Nicolas Capens157ba262019-12-10 17:49:14 -05003583UInt4::UInt4(const Reference<Int4> &rhs) : XYZW(this)
3584{
3585 Value *value = rhs.loadValue();
3586 storeValue(value);
3587}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003588
Nicolas Capens157ba262019-12-10 17:49:14 -05003589UInt4::UInt4(RValue<UInt2> lo, RValue<UInt2> hi) : XYZW(this)
3590{
3591 int shuffle[4] = {0, 1, 4, 5}; // Real type is v4i32
3592 Value *packed = Nucleus::createShuffleVector(lo.value, hi.value, shuffle);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003593
Nicolas Capens157ba262019-12-10 17:49:14 -05003594 storeValue(packed);
3595}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003596
Nicolas Capens157ba262019-12-10 17:49:14 -05003597UInt4::UInt4(const UInt &rhs) : XYZW(this)
3598{
3599 *this = RValue<UInt>(rhs.loadValue());
3600}
Ben Clayton88816fa2019-05-15 17:08:14 +01003601
Nicolas Capens157ba262019-12-10 17:49:14 -05003602UInt4::UInt4(const Reference<UInt> &rhs) : XYZW(this)
3603{
3604 *this = RValue<UInt>(rhs.loadValue());
3605}
Ben Clayton88816fa2019-05-15 17:08:14 +01003606
Nicolas Capens157ba262019-12-10 17:49:14 -05003607RValue<UInt4> UInt4::operator=(RValue<UInt4> rhs)
3608{
3609 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003610
Nicolas Capens157ba262019-12-10 17:49:14 -05003611 return rhs;
3612}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003613
Nicolas Capens157ba262019-12-10 17:49:14 -05003614RValue<UInt4> UInt4::operator=(const UInt4 &rhs)
3615{
3616 Value *value = rhs.loadValue();
3617 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003618
Nicolas Capens157ba262019-12-10 17:49:14 -05003619 return RValue<UInt4>(value);
3620}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003621
Nicolas Capens157ba262019-12-10 17:49:14 -05003622RValue<UInt4> UInt4::operator=(const Reference<UInt4> &rhs)
3623{
3624 Value *value = rhs.loadValue();
3625 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003626
Nicolas Capens157ba262019-12-10 17:49:14 -05003627 return RValue<UInt4>(value);
3628}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003629
Nicolas Capens157ba262019-12-10 17:49:14 -05003630RValue<UInt4> operator+(RValue<UInt4> lhs, RValue<UInt4> rhs)
3631{
3632 return RValue<UInt4>(Nucleus::createAdd(lhs.value, rhs.value));
3633}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003634
Nicolas Capens157ba262019-12-10 17:49:14 -05003635RValue<UInt4> operator-(RValue<UInt4> lhs, RValue<UInt4> rhs)
3636{
3637 return RValue<UInt4>(Nucleus::createSub(lhs.value, rhs.value));
3638}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003639
Nicolas Capens157ba262019-12-10 17:49:14 -05003640RValue<UInt4> operator*(RValue<UInt4> lhs, RValue<UInt4> rhs)
3641{
3642 return RValue<UInt4>(Nucleus::createMul(lhs.value, rhs.value));
3643}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003644
Nicolas Capens157ba262019-12-10 17:49:14 -05003645RValue<UInt4> operator/(RValue<UInt4> lhs, RValue<UInt4> rhs)
3646{
3647 return RValue<UInt4>(Nucleus::createUDiv(lhs.value, rhs.value));
3648}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003649
Nicolas Capens157ba262019-12-10 17:49:14 -05003650RValue<UInt4> operator%(RValue<UInt4> lhs, RValue<UInt4> rhs)
3651{
3652 return RValue<UInt4>(Nucleus::createURem(lhs.value, rhs.value));
3653}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003654
Nicolas Capens157ba262019-12-10 17:49:14 -05003655RValue<UInt4> operator&(RValue<UInt4> lhs, RValue<UInt4> rhs)
3656{
3657 return RValue<UInt4>(Nucleus::createAnd(lhs.value, rhs.value));
3658}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003659
Nicolas Capens157ba262019-12-10 17:49:14 -05003660RValue<UInt4> operator|(RValue<UInt4> lhs, RValue<UInt4> rhs)
3661{
3662 return RValue<UInt4>(Nucleus::createOr(lhs.value, rhs.value));
3663}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003664
Nicolas Capens157ba262019-12-10 17:49:14 -05003665RValue<UInt4> operator^(RValue<UInt4> lhs, RValue<UInt4> rhs)
3666{
3667 return RValue<UInt4>(Nucleus::createXor(lhs.value, rhs.value));
3668}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003669
Nicolas Capens157ba262019-12-10 17:49:14 -05003670RValue<UInt4> operator<<(RValue<UInt4> lhs, RValue<UInt4> rhs)
3671{
3672 return RValue<UInt4>(Nucleus::createShl(lhs.value, rhs.value));
3673}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003674
Nicolas Capens157ba262019-12-10 17:49:14 -05003675RValue<UInt4> operator>>(RValue<UInt4> lhs, RValue<UInt4> rhs)
3676{
3677 return RValue<UInt4>(Nucleus::createLShr(lhs.value, rhs.value));
3678}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003679
Nicolas Capens157ba262019-12-10 17:49:14 -05003680RValue<UInt4> operator+=(UInt4 &lhs, RValue<UInt4> rhs)
3681{
3682 return lhs = lhs + rhs;
3683}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003684
Nicolas Capens157ba262019-12-10 17:49:14 -05003685RValue<UInt4> operator-=(UInt4 &lhs, RValue<UInt4> rhs)
3686{
3687 return lhs = lhs - rhs;
3688}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003689
Nicolas Capens157ba262019-12-10 17:49:14 -05003690RValue<UInt4> operator*=(UInt4 &lhs, RValue<UInt4> rhs)
3691{
3692 return lhs = lhs * rhs;
3693}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003694
3695// RValue<UInt4> operator/=(UInt4 &lhs, RValue<UInt4> rhs)
3696// {
3697// return lhs = lhs / rhs;
3698// }
3699
3700// RValue<UInt4> operator%=(UInt4 &lhs, RValue<UInt4> rhs)
3701// {
3702// return lhs = lhs % rhs;
3703// }
3704
Nicolas Capens157ba262019-12-10 17:49:14 -05003705RValue<UInt4> operator&=(UInt4 &lhs, RValue<UInt4> rhs)
3706{
3707 return lhs = lhs & rhs;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003708}
Nicolas Capens157ba262019-12-10 17:49:14 -05003709
3710RValue<UInt4> operator|=(UInt4 &lhs, RValue<UInt4> rhs)
3711{
3712 return lhs = lhs | rhs;
3713}
3714
3715RValue<UInt4> operator^=(UInt4 &lhs, RValue<UInt4> rhs)
3716{
3717 return lhs = lhs ^ rhs;
3718}
3719
3720RValue<UInt4> operator<<=(UInt4 &lhs, unsigned char rhs)
3721{
3722 return lhs = lhs << rhs;
3723}
3724
3725RValue<UInt4> operator>>=(UInt4 &lhs, unsigned char rhs)
3726{
3727 return lhs = lhs >> rhs;
3728}
3729
3730RValue<UInt4> operator+(RValue<UInt4> val)
3731{
3732 return val;
3733}
3734
3735RValue<UInt4> operator-(RValue<UInt4> val)
3736{
3737 return RValue<UInt4>(Nucleus::createNeg(val.value));
3738}
3739
3740RValue<UInt4> operator~(RValue<UInt4> val)
3741{
3742 return RValue<UInt4>(Nucleus::createNot(val.value));
3743}
3744
3745RValue<UInt> Extract(RValue<UInt4> x, int i)
3746{
3747 return RValue<UInt>(Nucleus::createExtractElement(x.value, Int::getType(), i));
3748}
3749
3750RValue<UInt4> Insert(RValue<UInt4> x, RValue<UInt> element, int i)
3751{
3752 return RValue<UInt4>(Nucleus::createInsertElement(x.value, element.value, i));
3753}
3754
3755RValue<UInt4> Swizzle(RValue<UInt4> x, uint16_t select)
3756{
3757 return RValue<UInt4>(createSwizzle4(x.value, select));
3758}
3759
3760RValue<UInt4> Shuffle(RValue<UInt4> x, RValue<UInt4> y, unsigned short select)
3761{
3762 return RValue<UInt4>(createBlend4(x.value, y.value, select));
3763}
3764
3765Half::Half(RValue<Float> cast)
3766{
3767 UInt fp32i = As<UInt>(cast);
3768 UInt abs = fp32i & 0x7FFFFFFF;
3769 UShort fp16i((fp32i & 0x80000000) >> 16); // sign
3770
3771 If(abs > 0x47FFEFFF) // Infinity
3772 {
3773 fp16i |= UShort(0x7FFF);
3774 }
3775 Else
3776 {
3777 If(abs < 0x38800000) // Denormal
3778 {
3779 Int mantissa = (abs & 0x007FFFFF) | 0x00800000;
3780 Int e = 113 - (abs >> 23);
Nicolas Capens60f8c2e2019-12-12 13:40:15 -05003781 abs = IfThenElse(e < 24, (mantissa >> e), Int(0));
Nicolas Capens157ba262019-12-10 17:49:14 -05003782 fp16i |= UShort((abs + 0x00000FFF + ((abs >> 13) & 1)) >> 13);
3783 }
3784 Else
3785 {
3786 fp16i |= UShort((abs + 0xC8000000 + 0x00000FFF + ((abs >> 13) & 1)) >> 13);
3787 }
3788 }
3789
3790 storeValue(fp16i.loadValue());
3791}
3792
3793Float::Float(RValue<Int> cast)
3794{
3795 Value *integer = Nucleus::createSIToFP(cast.value, Float::getType());
3796
3797 storeValue(integer);
3798}
3799
3800Float::Float(RValue<UInt> cast)
3801{
3802 RValue<Float> result = Float(Int(cast & UInt(0x7FFFFFFF))) +
3803 As<Float>((As<Int>(cast) >> 31) & As<Int>(Float(0x80000000u)));
3804
3805 storeValue(result.value);
3806}
3807
3808Float::Float(RValue<Half> cast)
3809{
3810 Int fp16i(As<UShort>(cast));
3811
3812 Int s = (fp16i >> 15) & 0x00000001;
3813 Int e = (fp16i >> 10) & 0x0000001F;
3814 Int m = fp16i & 0x000003FF;
3815
3816 UInt fp32i(s << 31);
3817 If(e == 0)
3818 {
3819 If(m != 0)
3820 {
3821 While((m & 0x00000400) == 0)
3822 {
3823 m <<= 1;
3824 e -= 1;
3825 }
3826
3827 fp32i |= As<UInt>(((e + (127 - 15) + 1) << 23) | ((m & ~0x00000400) << 13));
3828 }
3829 }
3830 Else
3831 {
3832 fp32i |= As<UInt>(((e + (127 - 15)) << 23) | (m << 13));
3833 }
3834
3835 storeValue(As<Float>(fp32i).value);
3836}
3837
3838Float::Float(float x)
3839{
3840 // C++ does not have a way to write an infinite or NaN literal,
3841 // nor does it allow division by zero as a constant expression.
3842 // Thus we should not accept inf or NaN as a Reactor Float constant,
3843 // as this would typically idicate a bug, and avoids undefined
3844 // behavior.
3845 //
3846 // This also prevents the issue of the LLVM JIT only taking double
3847 // values for constructing floating-point constants. During the
3848 // conversion from single-precision to double, a signaling NaN can
3849 // become a quiet NaN, thus altering its bit pattern. Hence this
3850 // assert is also helpful for detecting cases where integers are
3851 // being reinterpreted as float and then bitcast to integer again,
3852 // which does not guarantee preserving the integer value.
3853 //
3854 // Should infinity and NaN constants be required, methods like
3855 // infinity(), quiet_NaN(), and signaling_NaN() should be added
3856 // to the Float class.
3857 ASSERT(std::isfinite(x));
3858
3859 storeValue(Nucleus::createConstantFloat(x));
3860}
3861
3862Float::Float(RValue<Float> rhs)
3863{
3864 storeValue(rhs.value);
3865}
3866
3867Float::Float(const Float &rhs)
3868{
3869 Value *value = rhs.loadValue();
3870 storeValue(value);
3871}
3872
3873Float::Float(const Reference<Float> &rhs)
3874{
3875 Value *value = rhs.loadValue();
3876 storeValue(value);
3877}
3878
3879Float::Float(Argument<Float> argument)
3880{
3881 storeValue(argument.value);
3882}
3883
3884RValue<Float> Float::operator=(RValue<Float> rhs)
3885{
3886 storeValue(rhs.value);
3887
3888 return rhs;
3889}
3890
3891RValue<Float> Float::operator=(const Float &rhs)
3892{
3893 Value *value = rhs.loadValue();
3894 storeValue(value);
3895
3896 return RValue<Float>(value);
3897}
3898
3899RValue<Float> Float::operator=(const Reference<Float> &rhs)
3900{
3901 Value *value = rhs.loadValue();
3902 storeValue(value);
3903
3904 return RValue<Float>(value);
3905}
3906
3907RValue<Float> operator+(RValue<Float> lhs, RValue<Float> rhs)
3908{
3909 return RValue<Float>(Nucleus::createFAdd(lhs.value, rhs.value));
3910}
3911
3912RValue<Float> operator-(RValue<Float> lhs, RValue<Float> rhs)
3913{
3914 return RValue<Float>(Nucleus::createFSub(lhs.value, rhs.value));
3915}
3916
3917RValue<Float> operator*(RValue<Float> lhs, RValue<Float> rhs)
3918{
3919 return RValue<Float>(Nucleus::createFMul(lhs.value, rhs.value));
3920}
3921
3922RValue<Float> operator/(RValue<Float> lhs, RValue<Float> rhs)
3923{
3924 return RValue<Float>(Nucleus::createFDiv(lhs.value, rhs.value));
3925}
3926
3927RValue<Float> operator+=(Float &lhs, RValue<Float> rhs)
3928{
3929 return lhs = lhs + rhs;
3930}
3931
3932RValue<Float> operator-=(Float &lhs, RValue<Float> rhs)
3933{
3934 return lhs = lhs - rhs;
3935}
3936
3937RValue<Float> operator*=(Float &lhs, RValue<Float> rhs)
3938{
3939 return lhs = lhs * rhs;
3940}
3941
3942RValue<Float> operator/=(Float &lhs, RValue<Float> rhs)
3943{
3944 return lhs = lhs / rhs;
3945}
3946
3947RValue<Float> operator+(RValue<Float> val)
3948{
3949 return val;
3950}
3951
3952RValue<Float> operator-(RValue<Float> val)
3953{
3954 return RValue<Float>(Nucleus::createFNeg(val.value));
3955}
3956
3957RValue<Bool> operator<(RValue<Float> lhs, RValue<Float> rhs)
3958{
3959 return RValue<Bool>(Nucleus::createFCmpOLT(lhs.value, rhs.value));
3960}
3961
3962RValue<Bool> operator<=(RValue<Float> lhs, RValue<Float> rhs)
3963{
3964 return RValue<Bool>(Nucleus::createFCmpOLE(lhs.value, rhs.value));
3965}
3966
3967RValue<Bool> operator>(RValue<Float> lhs, RValue<Float> rhs)
3968{
3969 return RValue<Bool>(Nucleus::createFCmpOGT(lhs.value, rhs.value));
3970}
3971
3972RValue<Bool> operator>=(RValue<Float> lhs, RValue<Float> rhs)
3973{
3974 return RValue<Bool>(Nucleus::createFCmpOGE(lhs.value, rhs.value));
3975}
3976
3977RValue<Bool> operator!=(RValue<Float> lhs, RValue<Float> rhs)
3978{
3979 return RValue<Bool>(Nucleus::createFCmpONE(lhs.value, rhs.value));
3980}
3981
3982RValue<Bool> operator==(RValue<Float> lhs, RValue<Float> rhs)
3983{
3984 return RValue<Bool>(Nucleus::createFCmpOEQ(lhs.value, rhs.value));
3985}
3986
3987RValue<Float> Abs(RValue<Float> x)
3988{
3989 return IfThenElse(x > 0.0f, x, -x);
3990}
3991
3992RValue<Float> Max(RValue<Float> x, RValue<Float> y)
3993{
3994 return IfThenElse(x > y, x, y);
3995}
3996
3997RValue<Float> Min(RValue<Float> x, RValue<Float> y)
3998{
3999 return IfThenElse(x < y, x, y);
4000}
4001
4002Float2::Float2(RValue<Float4> cast)
4003{
4004 storeValue(Nucleus::createBitCast(cast.value, getType()));
4005}
4006
4007Float4::Float4(RValue<Byte4> cast) : XYZW(this)
4008{
4009 Value *a = Int4(cast).loadValue();
4010 Value *xyzw = Nucleus::createSIToFP(a, Float4::getType());
4011
4012 storeValue(xyzw);
4013}
4014
4015Float4::Float4(RValue<SByte4> cast) : XYZW(this)
4016{
4017 Value *a = Int4(cast).loadValue();
4018 Value *xyzw = Nucleus::createSIToFP(a, Float4::getType());
4019
4020 storeValue(xyzw);
4021}
4022
4023Float4::Float4(RValue<Short4> cast) : XYZW(this)
4024{
4025 Int4 c(cast);
4026 storeValue(Nucleus::createSIToFP(RValue<Int4>(c).value, Float4::getType()));
4027}
4028
4029Float4::Float4(RValue<UShort4> cast) : XYZW(this)
4030{
4031 Int4 c(cast);
4032 storeValue(Nucleus::createSIToFP(RValue<Int4>(c).value, Float4::getType()));
4033}
4034
4035Float4::Float4(RValue<Int4> cast) : XYZW(this)
4036{
4037 Value *xyzw = Nucleus::createSIToFP(cast.value, Float4::getType());
4038
4039 storeValue(xyzw);
4040}
4041
4042Float4::Float4(RValue<UInt4> cast) : XYZW(this)
4043{
4044 RValue<Float4> result = Float4(Int4(cast & UInt4(0x7FFFFFFF))) +
4045 As<Float4>((As<Int4>(cast) >> 31) & As<Int4>(Float4(0x80000000u)));
4046
4047 storeValue(result.value);
4048}
4049
4050Float4::Float4() : XYZW(this)
4051{
4052}
4053
4054Float4::Float4(float xyzw) : XYZW(this)
4055{
4056 constant(xyzw, xyzw, xyzw, xyzw);
4057}
4058
4059Float4::Float4(float x, float yzw) : XYZW(this)
4060{
4061 constant(x, yzw, yzw, yzw);
4062}
4063
4064Float4::Float4(float x, float y, float zw) : XYZW(this)
4065{
4066 constant(x, y, zw, zw);
4067}
4068
4069Float4::Float4(float x, float y, float z, float w) : XYZW(this)
4070{
4071 constant(x, y, z, w);
4072}
4073
4074Float4 Float4::positive_inf()
4075{
4076 Float4 result;
4077 result.infinity_constant(false);
4078 return result;
4079}
4080
4081Float4 Float4::negative_inf()
4082{
4083 Float4 result;
4084 result.infinity_constant(true);
4085 return result;
4086}
4087
4088void Float4::infinity_constant(bool negative)
4089{
4090 double inf = negative ? -INFINITY : INFINITY;
4091 double constantVector[4] = {inf, inf, inf, inf};
4092 storeValue(Nucleus::createConstantVector(constantVector, getType()));
4093}
4094
4095void Float4::constant(float x, float y, float z, float w)
4096{
4097 // See Float(float) constructor for the rationale behind this assert.
4098 ASSERT(std::isfinite(x) && std::isfinite(y) && std::isfinite(z) && std::isfinite(w));
4099
4100 double constantVector[4] = {x, y, z, w};
4101 storeValue(Nucleus::createConstantVector(constantVector, getType()));
4102}
4103
4104Float4::Float4(RValue<Float4> rhs) : XYZW(this)
4105{
4106 storeValue(rhs.value);
4107}
4108
4109Float4::Float4(const Float4 &rhs) : XYZW(this)
4110{
4111 Value *value = rhs.loadValue();
4112 storeValue(value);
4113}
4114
4115Float4::Float4(const Reference<Float4> &rhs) : XYZW(this)
4116{
4117 Value *value = rhs.loadValue();
4118 storeValue(value);
4119}
4120
4121Float4::Float4(const Float &rhs) : XYZW(this)
4122{
4123 *this = RValue<Float>(rhs.loadValue());
4124}
4125
4126Float4::Float4(const Reference<Float> &rhs) : XYZW(this)
4127{
4128 *this = RValue<Float>(rhs.loadValue());
4129}
4130
4131RValue<Float4> Float4::operator=(float x)
4132{
4133 return *this = Float4(x, x, x, x);
4134}
4135
4136RValue<Float4> Float4::operator=(RValue<Float4> rhs)
4137{
4138 storeValue(rhs.value);
4139
4140 return rhs;
4141}
4142
4143RValue<Float4> Float4::operator=(const Float4 &rhs)
4144{
4145 Value *value = rhs.loadValue();
4146 storeValue(value);
4147
4148 return RValue<Float4>(value);
4149}
4150
4151RValue<Float4> Float4::operator=(const Reference<Float4> &rhs)
4152{
4153 Value *value = rhs.loadValue();
4154 storeValue(value);
4155
4156 return RValue<Float4>(value);
4157}
4158
4159RValue<Float4> Float4::operator=(RValue<Float> rhs)
4160{
4161 return *this = Float4(rhs);
4162}
4163
4164RValue<Float4> Float4::operator=(const Float &rhs)
4165{
4166 return *this = Float4(rhs);
4167}
4168
4169RValue<Float4> Float4::operator=(const Reference<Float> &rhs)
4170{
4171 return *this = Float4(rhs);
4172}
4173
4174RValue<Float4> operator+(RValue<Float4> lhs, RValue<Float4> rhs)
4175{
4176 return RValue<Float4>(Nucleus::createFAdd(lhs.value, rhs.value));
4177}
4178
4179RValue<Float4> operator-(RValue<Float4> lhs, RValue<Float4> rhs)
4180{
4181 return RValue<Float4>(Nucleus::createFSub(lhs.value, rhs.value));
4182}
4183
4184RValue<Float4> operator*(RValue<Float4> lhs, RValue<Float4> rhs)
4185{
4186 return RValue<Float4>(Nucleus::createFMul(lhs.value, rhs.value));
4187}
4188
4189RValue<Float4> operator/(RValue<Float4> lhs, RValue<Float4> rhs)
4190{
4191 return RValue<Float4>(Nucleus::createFDiv(lhs.value, rhs.value));
4192}
4193
4194RValue<Float4> operator%(RValue<Float4> lhs, RValue<Float4> rhs)
4195{
4196 return RValue<Float4>(Nucleus::createFRem(lhs.value, rhs.value));
4197}
4198
4199RValue<Float4> operator+=(Float4 &lhs, RValue<Float4> rhs)
4200{
4201 return lhs = lhs + rhs;
4202}
4203
4204RValue<Float4> operator-=(Float4 &lhs, RValue<Float4> rhs)
4205{
4206 return lhs = lhs - rhs;
4207}
4208
4209RValue<Float4> operator*=(Float4 &lhs, RValue<Float4> rhs)
4210{
4211 return lhs = lhs * rhs;
4212}
4213
4214RValue<Float4> operator/=(Float4 &lhs, RValue<Float4> rhs)
4215{
4216 return lhs = lhs / rhs;
4217}
4218
4219RValue<Float4> operator%=(Float4 &lhs, RValue<Float4> rhs)
4220{
4221 return lhs = lhs % rhs;
4222}
4223
4224RValue<Float4> operator+(RValue<Float4> val)
4225{
4226 return val;
4227}
4228
4229RValue<Float4> operator-(RValue<Float4> val)
4230{
4231 return RValue<Float4>(Nucleus::createFNeg(val.value));
4232}
4233
4234RValue<Float4> Abs(RValue<Float4> x)
4235{
4236 // TODO: Optimize.
4237 Value *vector = Nucleus::createBitCast(x.value, Int4::getType());
4238 int64_t constantVector[4] = {0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF};
4239 Value *result = Nucleus::createAnd(vector, Nucleus::createConstantVector(constantVector, Int4::getType()));
4240
4241 return As<Float4>(result);
4242}
4243
4244RValue<Float4> Insert(RValue<Float4> x, RValue<Float> element, int i)
4245{
4246 return RValue<Float4>(Nucleus::createInsertElement(x.value, element.value, i));
4247}
4248
4249RValue<Float> Extract(RValue<Float4> x, int i)
4250{
4251 return RValue<Float>(Nucleus::createExtractElement(x.value, Float::getType(), i));
4252}
4253
4254RValue<Float4> Swizzle(RValue<Float4> x, uint16_t select)
4255{
4256 return RValue<Float4>(createSwizzle4(x.value, select));
4257}
4258
4259RValue<Float4> Shuffle(RValue<Float4> x, RValue<Float4> y, uint16_t select)
4260{
4261 return RValue<Float4>(createBlend4(x.value, y.value, select));
4262}
4263
4264RValue<Float4> ShuffleLowHigh(RValue<Float4> x, RValue<Float4> y, uint16_t imm)
4265{
4266 int shuffle[4] =
4267 {
4268 ((imm >> 12) & 0x03) + 0,
4269 ((imm >> 8) & 0x03) + 0,
4270 ((imm >> 4) & 0x03) + 4,
4271 ((imm >> 0) & 0x03) + 4,
4272 };
4273
4274 return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
4275}
4276
4277RValue<Float4> UnpackLow(RValue<Float4> x, RValue<Float4> y)
4278{
4279 int shuffle[4] = {0, 4, 1, 5};
4280 return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
4281}
4282
4283RValue<Float4> UnpackHigh(RValue<Float4> x, RValue<Float4> y)
4284{
4285 int shuffle[4] = {2, 6, 3, 7};
4286 return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
4287}
4288
4289RValue<Float4> Mask(Float4 &lhs, RValue<Float4> rhs, uint16_t select)
4290{
4291 Value *vector = lhs.loadValue();
4292 Value *result = createMask4(vector, rhs.value, select);
4293 lhs.storeValue(result);
4294
4295 return RValue<Float4>(result);
4296}
4297
4298RValue<Int4> IsInf(RValue<Float4> x)
4299{
4300 return CmpEQ(As<Int4>(x) & Int4(0x7FFFFFFF), Int4(0x7F800000));
4301}
4302
4303RValue<Int4> IsNan(RValue<Float4> x)
4304{
4305 return ~CmpEQ(x, x);
4306}
4307
4308RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, int offset)
4309{
4310 return lhs + RValue<Int>(Nucleus::createConstantInt(offset));
4311}
4312
4313RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, RValue<Int> offset)
4314{
4315 return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value, Byte::getType(), offset.value, false));
4316}
4317
4318RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, RValue<UInt> offset)
4319{
4320 return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value, Byte::getType(), offset.value, true));
4321}
4322
4323RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, int offset)
4324{
4325 return lhs = lhs + offset;
4326}
4327
4328RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, RValue<Int> offset)
4329{
4330 return lhs = lhs + offset;
4331}
4332
4333RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, RValue<UInt> offset)
4334{
4335 return lhs = lhs + offset;
4336}
4337
4338RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, int offset)
4339{
4340 return lhs + -offset;
4341}
4342
4343RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, RValue<Int> offset)
4344{
4345 return lhs + -offset;
4346}
4347
4348RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, RValue<UInt> offset)
4349{
4350 return lhs + -offset;
4351}
4352
4353RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, int offset)
4354{
4355 return lhs = lhs - offset;
4356}
4357
4358RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, RValue<Int> offset)
4359{
4360 return lhs = lhs - offset;
4361}
4362
4363RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, RValue<UInt> offset)
4364{
4365 return lhs = lhs - offset;
4366}
4367
4368void Return()
4369{
4370 Nucleus::createRetVoid();
4371 // Place any unreachable instructions in an unreferenced block.
4372 Nucleus::setInsertBlock(Nucleus::createBasicBlock());
4373}
4374
4375void branch(RValue<Bool> cmp, BasicBlock *bodyBB, BasicBlock *endBB)
4376{
4377 Nucleus::createCondBr(cmp.value, bodyBB, endBB);
4378 Nucleus::setInsertBlock(bodyBB);
4379}
4380
4381RValue<Float4> MaskedLoad(RValue<Pointer<Float4>> base, RValue<Int4> mask, unsigned int alignment, bool zeroMaskedLanes /* = false */)
4382{
4383 return RValue<Float4>(Nucleus::createMaskedLoad(base.value, Float::getType(), mask.value, alignment, zeroMaskedLanes));
4384}
4385
4386RValue<Int4> MaskedLoad(RValue<Pointer<Int4>> base, RValue<Int4> mask, unsigned int alignment, bool zeroMaskedLanes /* = false */)
4387{
4388 return RValue<Int4>(Nucleus::createMaskedLoad(base.value, Int::getType(), mask.value, alignment, zeroMaskedLanes));
4389}
4390
4391void MaskedStore(RValue<Pointer<Float4>> base, RValue<Float4> val, RValue<Int4> mask, unsigned int alignment)
4392{
4393 Nucleus::createMaskedStore(base.value, val.value, mask.value, alignment);
4394}
4395
4396void MaskedStore(RValue<Pointer<Int4>> base, RValue<Int4> val, RValue<Int4> mask, unsigned int alignment)
4397{
4398 Nucleus::createMaskedStore(base.value, val.value, mask.value, alignment);
4399}
4400
4401void Fence(std::memory_order memoryOrder)
4402{
4403 ASSERT_MSG(memoryOrder == std::memory_order_acquire ||
4404 memoryOrder == std::memory_order_release ||
4405 memoryOrder == std::memory_order_acq_rel ||
4406 memoryOrder == std::memory_order_seq_cst,
4407 "Unsupported memoryOrder: %d", int(memoryOrder));
4408 Nucleus::createFence(memoryOrder);
4409}
4410
4411Bool CToReactor<bool>::cast(bool v) { return type(v); }
4412Byte CToReactor<uint8_t>::cast(uint8_t v) { return type(v); }
4413SByte CToReactor<int8_t>::cast(int8_t v) { return type(v); }
4414Short CToReactor<int16_t>::cast(int16_t v) { return type(v); }
4415UShort CToReactor<uint16_t>::cast(uint16_t v) { return type(v); }
4416Int CToReactor<int32_t>::cast(int32_t v) { return type(v); }
4417UInt CToReactor<uint32_t>::cast(uint32_t v) { return type(v); }
4418Float CToReactor<float>::cast(float v) { return type(v); }
4419Float4 CToReactor<float[4]>::cast(float v[4]) { return type(v[0], v[1], v[2], v[3]); }
4420
4421// TODO: Long has no constructor that takes a uint64_t
4422// Long CToReactor<uint64_t>::cast(uint64_t v) { return type(v); }
4423
4424} // namespace rr