blob: b3ce60795b7f6bd4b4e7ba49101ebcd7cfad5094 [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
Ben Clayton713b8d32019-12-17 20:37:56 +000023# define REACTOR_MATERIALIZE_LVALUES_ON_DEFINITION 0
Nicolas Capens0192d152019-03-27 14:46:07 -040024#endif
25
Nicolas Capens157ba262019-12-10 17:49:14 -050026namespace {
27
28// Introduced in C++20.
Ben Clayton713b8d32019-12-17 20:37:56 +000029template<class ForwardIterator, class UnaryPredicate>
Nicolas Capens157ba262019-12-10 17:49:14 -050030ForwardIterator remove_if(ForwardIterator first, ForwardIterator last,
Ben Clayton713b8d32019-12-17 20:37:56 +000031 UnaryPredicate pred)
Ben Clayton55bc37a2019-07-04 12:17:12 +010032{
Nicolas Capens157ba262019-12-10 17:49:14 -050033 ForwardIterator result = first;
Ben Clayton713b8d32019-12-17 20:37:56 +000034 while(first != last)
35 {
36 if(!pred(*first))
37 {
Nicolas Capens157ba262019-12-10 17:49:14 -050038 *result = std::move(*first);
39 ++result;
Ben Clayton55bc37a2019-07-04 12:17:12 +010040 }
Nicolas Capens157ba262019-12-10 17:49:14 -050041 ++first;
42 }
43 return result;
44}
45
46} // anonymous namespace
47
48namespace rr {
49
50const Config::Edit Config::Edit::None = {};
51
52Config Config::Edit::apply(const Config &cfg) const
53{
Nicolas Capens81bc9d92019-12-16 15:05:57 -050054 if(this == &None) { return cfg; }
Nicolas Capens157ba262019-12-10 17:49:14 -050055
56 auto level = optLevelChanged ? optLevel : cfg.optimization.getLevel();
57 auto passes = cfg.optimization.getPasses();
58 apply(optPassEdits, passes);
Ben Clayton713b8d32019-12-17 20:37:56 +000059 return Config{ Optimization{ level, passes } };
Nicolas Capens157ba262019-12-10 17:49:14 -050060}
61
Ben Clayton713b8d32019-12-17 20:37:56 +000062template<typename T>
63void rr::Config::Edit::apply(const std::vector<std::pair<ListEdit, T>> &edits, std::vector<T> &list) const
Nicolas Capens157ba262019-12-10 17:49:14 -050064{
Ben Clayton713b8d32019-12-17 20:37:56 +000065 for(auto &edit : edits)
Nicolas Capens157ba262019-12-10 17:49:14 -050066 {
Nicolas Capens81bc9d92019-12-16 15:05:57 -050067 switch(edit.first)
Nicolas Capens157ba262019-12-10 17:49:14 -050068 {
Ben Clayton713b8d32019-12-17 20:37:56 +000069 case ListEdit::Add:
70 list.push_back(edit.second);
71 break;
72 case ListEdit::Remove:
73 ::remove_if(list.begin(), list.end(), [&](T item) { return item == edit.second; });
74 break;
75 case ListEdit::Clear:
76 list.clear();
77 break;
Nicolas Capens157ba262019-12-10 17:49:14 -050078 }
Ben Clayton55bc37a2019-07-04 12:17:12 +010079 }
80}
81
Nicolas Capens157ba262019-12-10 17:49:14 -050082// Set of variables that do not have a stack location yet.
Ben Clayton713b8d32019-12-17 20:37:56 +000083std::unordered_set<Variable *> Variable::unmaterializedVariables;
Nicolas Capens157ba262019-12-10 17:49:14 -050084
Ben Clayton713b8d32019-12-17 20:37:56 +000085Variable::Variable(Type *type, int arraySize)
86 : arraySize(arraySize)
87 , type(type)
Nicolas Capensb6d4ce32019-03-12 23:00:24 -040088{
Ben Clayton713b8d32019-12-17 20:37:56 +000089#if REACTOR_MATERIALIZE_LVALUES_ON_DEFINITION
90 materialize();
91#else
92 unmaterializedVariables.emplace(this);
93#endif
Nicolas Capens157ba262019-12-10 17:49:14 -050094}
Ben Clayton55bc37a2019-07-04 12:17:12 +010095
Nicolas Capens157ba262019-12-10 17:49:14 -050096Variable::~Variable()
97{
98 unmaterializedVariables.erase(this);
99}
Ben Clayton55bc37a2019-07-04 12:17:12 +0100100
Nicolas Capens157ba262019-12-10 17:49:14 -0500101void Variable::materializeAll()
102{
103 for(auto *var : unmaterializedVariables)
Ben Clayton55bc37a2019-07-04 12:17:12 +0100104 {
Nicolas Capens157ba262019-12-10 17:49:14 -0500105 var->materialize();
Ben Clayton55bc37a2019-07-04 12:17:12 +0100106 }
107
Nicolas Capens157ba262019-12-10 17:49:14 -0500108 unmaterializedVariables.clear();
109}
Nicolas Capens0192d152019-03-27 14:46:07 -0400110
Nicolas Capens157ba262019-12-10 17:49:14 -0500111void Variable::killUnmaterialized()
112{
113 unmaterializedVariables.clear();
114}
Nicolas Capens0192d152019-03-27 14:46:07 -0400115
Nicolas Capens157ba262019-12-10 17:49:14 -0500116// NOTE: Only 12 bits out of 16 of the |select| value are used.
117// More specifically, the value should look like:
118//
119// msb lsb
120// v v
121// [.xxx|.yyy|.zzz|.www] where '.' means an ignored bit
122//
123// This format makes it easy to write calls with hexadecimal select values,
124// since each hex digit is a separate swizzle index.
125//
126// For example:
Nicolas Capensd95467e2020-01-16 01:44:39 -0500127// createShuffle4( [a,b,c,d], [e,f,g,h], 0x0123 ) -> [a,b,c,d]
128// createShuffle4( [a,b,c,d], [e,f,g,h], 0x4567 ) -> [e,f,g,h]
129// createShuffle4( [a,b,c,d], [e,f,g,h], 0x4012 ) -> [e,a,b,c]
Nicolas Capens157ba262019-12-10 17:49:14 -0500130//
Nicolas Capensd95467e2020-01-16 01:44:39 -0500131static Value *createShuffle4(Value *lhs, Value *rhs, uint16_t select)
Nicolas Capens157ba262019-12-10 17:49:14 -0500132{
Ben Clayton713b8d32019-12-17 20:37:56 +0000133 int swizzle[4] = {
Nicolas Capens157ba262019-12-10 17:49:14 -0500134 (select >> 12) & 0x07,
Ben Clayton713b8d32019-12-17 20:37:56 +0000135 (select >> 8) & 0x07,
136 (select >> 4) & 0x07,
137 (select >> 0) & 0x07,
Nicolas Capens157ba262019-12-10 17:49:14 -0500138 };
Nicolas Capens0192d152019-03-27 14:46:07 -0400139
Nicolas Capens157ba262019-12-10 17:49:14 -0500140 return Nucleus::createShuffleVector(lhs, rhs, swizzle);
141}
Nicolas Capens0192d152019-03-27 14:46:07 -0400142
Nicolas Capens157ba262019-12-10 17:49:14 -0500143// NOTE: Only 8 bits out of 16 of the |select| value are used.
144// More specifically, the value should look like:
145//
146// msb lsb
147// v v
148// [..xx|..yy|..zz|..ww] where '.' means an ignored bit
149//
150// This format makes it easy to write calls with hexadecimal select values,
151// since each hex digit is a separate swizzle index.
152//
153// For example:
154// createSwizzle4( [a,b,c,d], 0x0123 ) -> [a,b,c,d]
155// createSwizzle4( [a,b,c,d], 0x0033 ) -> [a,a,d,d]
156//
157static Value *createSwizzle4(Value *val, uint16_t select)
158{
Ben Clayton713b8d32019-12-17 20:37:56 +0000159 int swizzle[4] = {
Nicolas Capens157ba262019-12-10 17:49:14 -0500160 (select >> 12) & 0x03,
Ben Clayton713b8d32019-12-17 20:37:56 +0000161 (select >> 8) & 0x03,
162 (select >> 4) & 0x03,
163 (select >> 0) & 0x03,
Nicolas Capens157ba262019-12-10 17:49:14 -0500164 };
David 'Digit' Turnerb9f03f42019-12-04 19:32:34 +0100165
Nicolas Capens157ba262019-12-10 17:49:14 -0500166 return Nucleus::createShuffleVector(val, val, swizzle);
167}
David 'Digit' Turnerb9f03f42019-12-04 19:32:34 +0100168
Nicolas Capens157ba262019-12-10 17:49:14 -0500169static Value *createMask4(Value *lhs, Value *rhs, uint16_t select)
170{
Ben Clayton713b8d32019-12-17 20:37:56 +0000171 bool mask[4] = { false, false, false, false };
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400172
Nicolas Capens157ba262019-12-10 17:49:14 -0500173 mask[(select >> 12) & 0x03] = true;
Ben Clayton713b8d32019-12-17 20:37:56 +0000174 mask[(select >> 8) & 0x03] = true;
175 mask[(select >> 4) & 0x03] = true;
176 mask[(select >> 0) & 0x03] = true;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400177
Ben Clayton713b8d32019-12-17 20:37:56 +0000178 int swizzle[4] = {
Nicolas Capens157ba262019-12-10 17:49:14 -0500179 mask[0] ? 4 : 0,
180 mask[1] ? 5 : 1,
181 mask[2] ? 6 : 2,
182 mask[3] ? 7 : 3,
183 };
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400184
Nicolas Capens157ba262019-12-10 17:49:14 -0500185 return Nucleus::createShuffleVector(lhs, rhs, swizzle);
186}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400187
Nicolas Capens157ba262019-12-10 17:49:14 -0500188Bool::Bool(Argument<Bool> argument)
189{
190 storeValue(argument.value);
191}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400192
Nicolas Capens157ba262019-12-10 17:49:14 -0500193Bool::Bool(bool x)
194{
195 storeValue(Nucleus::createConstantBool(x));
196}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400197
Nicolas Capens157ba262019-12-10 17:49:14 -0500198Bool::Bool(RValue<Bool> rhs)
199{
200 storeValue(rhs.value);
201}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400202
Nicolas Capens157ba262019-12-10 17:49:14 -0500203Bool::Bool(const Bool &rhs)
204{
205 Value *value = rhs.loadValue();
206 storeValue(value);
207}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400208
Nicolas Capens157ba262019-12-10 17:49:14 -0500209Bool::Bool(const Reference<Bool> &rhs)
210{
211 Value *value = rhs.loadValue();
212 storeValue(value);
213}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400214
Nicolas Capens157ba262019-12-10 17:49:14 -0500215RValue<Bool> Bool::operator=(RValue<Bool> rhs)
216{
217 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400218
Nicolas Capens157ba262019-12-10 17:49:14 -0500219 return rhs;
220}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400221
Nicolas Capens157ba262019-12-10 17:49:14 -0500222RValue<Bool> Bool::operator=(const Bool &rhs)
223{
224 Value *value = rhs.loadValue();
225 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400226
Nicolas Capens157ba262019-12-10 17:49:14 -0500227 return RValue<Bool>(value);
228}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400229
Nicolas Capens157ba262019-12-10 17:49:14 -0500230RValue<Bool> Bool::operator=(const Reference<Bool> &rhs)
231{
232 Value *value = rhs.loadValue();
233 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400234
Nicolas Capens157ba262019-12-10 17:49:14 -0500235 return RValue<Bool>(value);
236}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400237
Nicolas Capens157ba262019-12-10 17:49:14 -0500238RValue<Bool> operator!(RValue<Bool> val)
239{
240 return RValue<Bool>(Nucleus::createNot(val.value));
241}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400242
Nicolas Capens157ba262019-12-10 17:49:14 -0500243RValue<Bool> operator&&(RValue<Bool> lhs, RValue<Bool> rhs)
244{
245 return RValue<Bool>(Nucleus::createAnd(lhs.value, rhs.value));
246}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400247
Nicolas Capens157ba262019-12-10 17:49:14 -0500248RValue<Bool> operator||(RValue<Bool> lhs, RValue<Bool> rhs)
249{
250 return RValue<Bool>(Nucleus::createOr(lhs.value, rhs.value));
251}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400252
Nicolas Capens157ba262019-12-10 17:49:14 -0500253RValue<Bool> operator!=(RValue<Bool> lhs, RValue<Bool> rhs)
254{
255 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
256}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400257
Nicolas Capens157ba262019-12-10 17:49:14 -0500258RValue<Bool> operator==(RValue<Bool> lhs, RValue<Bool> rhs)
259{
260 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
261}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400262
Nicolas Capens157ba262019-12-10 17:49:14 -0500263Byte::Byte(Argument<Byte> argument)
264{
265 storeValue(argument.value);
266}
Ben Claytonf3b57972019-03-15 09:56:47 +0000267
Nicolas Capens157ba262019-12-10 17:49:14 -0500268Byte::Byte(RValue<Int> cast)
269{
270 Value *integer = Nucleus::createTrunc(cast.value, Byte::getType());
Ben Claytonf3b57972019-03-15 09:56:47 +0000271
Nicolas Capens157ba262019-12-10 17:49:14 -0500272 storeValue(integer);
273}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400274
Nicolas Capens157ba262019-12-10 17:49:14 -0500275Byte::Byte(RValue<UInt> cast)
276{
277 Value *integer = Nucleus::createTrunc(cast.value, Byte::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400278
Nicolas Capens157ba262019-12-10 17:49:14 -0500279 storeValue(integer);
280}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400281
Nicolas Capens157ba262019-12-10 17:49:14 -0500282Byte::Byte(RValue<UShort> cast)
283{
284 Value *integer = Nucleus::createTrunc(cast.value, Byte::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400285
Nicolas Capens157ba262019-12-10 17:49:14 -0500286 storeValue(integer);
287}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400288
Nicolas Capens157ba262019-12-10 17:49:14 -0500289Byte::Byte(int x)
290{
291 storeValue(Nucleus::createConstantByte((unsigned char)x));
292}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400293
Nicolas Capens157ba262019-12-10 17:49:14 -0500294Byte::Byte(unsigned char x)
295{
296 storeValue(Nucleus::createConstantByte(x));
297}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400298
Nicolas Capens157ba262019-12-10 17:49:14 -0500299Byte::Byte(RValue<Byte> rhs)
300{
301 storeValue(rhs.value);
302}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400303
Nicolas Capens157ba262019-12-10 17:49:14 -0500304Byte::Byte(const Byte &rhs)
305{
306 Value *value = rhs.loadValue();
307 storeValue(value);
308}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400309
Nicolas Capens157ba262019-12-10 17:49:14 -0500310Byte::Byte(const Reference<Byte> &rhs)
311{
312 Value *value = rhs.loadValue();
313 storeValue(value);
314}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400315
Nicolas Capens157ba262019-12-10 17:49:14 -0500316RValue<Byte> Byte::operator=(RValue<Byte> rhs)
317{
318 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400319
Nicolas Capens157ba262019-12-10 17:49:14 -0500320 return rhs;
321}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400322
Nicolas Capens157ba262019-12-10 17:49:14 -0500323RValue<Byte> Byte::operator=(const Byte &rhs)
324{
325 Value *value = rhs.loadValue();
326 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400327
Nicolas Capens157ba262019-12-10 17:49:14 -0500328 return RValue<Byte>(value);
329}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400330
Nicolas Capens157ba262019-12-10 17:49:14 -0500331RValue<Byte> Byte::operator=(const Reference<Byte> &rhs)
332{
333 Value *value = rhs.loadValue();
334 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400335
Nicolas Capens157ba262019-12-10 17:49:14 -0500336 return RValue<Byte>(value);
337}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400338
Nicolas Capens157ba262019-12-10 17:49:14 -0500339RValue<Byte> operator+(RValue<Byte> lhs, RValue<Byte> rhs)
340{
341 return RValue<Byte>(Nucleus::createAdd(lhs.value, rhs.value));
342}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400343
Nicolas Capens157ba262019-12-10 17:49:14 -0500344RValue<Byte> operator-(RValue<Byte> lhs, RValue<Byte> rhs)
345{
346 return RValue<Byte>(Nucleus::createSub(lhs.value, rhs.value));
347}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400348
Nicolas Capens157ba262019-12-10 17:49:14 -0500349RValue<Byte> operator*(RValue<Byte> lhs, RValue<Byte> rhs)
350{
351 return RValue<Byte>(Nucleus::createMul(lhs.value, rhs.value));
352}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400353
Nicolas Capens157ba262019-12-10 17:49:14 -0500354RValue<Byte> operator/(RValue<Byte> lhs, RValue<Byte> rhs)
355{
356 return RValue<Byte>(Nucleus::createUDiv(lhs.value, rhs.value));
357}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400358
Nicolas Capens157ba262019-12-10 17:49:14 -0500359RValue<Byte> operator%(RValue<Byte> lhs, RValue<Byte> rhs)
360{
361 return RValue<Byte>(Nucleus::createURem(lhs.value, rhs.value));
362}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400363
Nicolas Capens157ba262019-12-10 17:49:14 -0500364RValue<Byte> operator&(RValue<Byte> lhs, RValue<Byte> rhs)
365{
366 return RValue<Byte>(Nucleus::createAnd(lhs.value, rhs.value));
367}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400368
Nicolas Capens157ba262019-12-10 17:49:14 -0500369RValue<Byte> operator|(RValue<Byte> lhs, RValue<Byte> rhs)
370{
371 return RValue<Byte>(Nucleus::createOr(lhs.value, rhs.value));
372}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400373
Nicolas Capens157ba262019-12-10 17:49:14 -0500374RValue<Byte> operator^(RValue<Byte> lhs, RValue<Byte> rhs)
375{
376 return RValue<Byte>(Nucleus::createXor(lhs.value, rhs.value));
377}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400378
Nicolas Capens157ba262019-12-10 17:49:14 -0500379RValue<Byte> operator<<(RValue<Byte> lhs, RValue<Byte> rhs)
380{
381 return RValue<Byte>(Nucleus::createShl(lhs.value, rhs.value));
382}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400383
Nicolas Capens157ba262019-12-10 17:49:14 -0500384RValue<Byte> operator>>(RValue<Byte> lhs, RValue<Byte> rhs)
385{
386 return RValue<Byte>(Nucleus::createLShr(lhs.value, rhs.value));
387}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400388
Nicolas Capens157ba262019-12-10 17:49:14 -0500389RValue<Byte> operator+=(Byte &lhs, RValue<Byte> rhs)
390{
391 return lhs = lhs + rhs;
392}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400393
Nicolas Capens157ba262019-12-10 17:49:14 -0500394RValue<Byte> operator-=(Byte &lhs, RValue<Byte> rhs)
395{
396 return lhs = lhs - rhs;
397}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400398
Nicolas Capens157ba262019-12-10 17:49:14 -0500399RValue<Byte> operator*=(Byte &lhs, RValue<Byte> rhs)
400{
401 return lhs = lhs * rhs;
402}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400403
Nicolas Capens157ba262019-12-10 17:49:14 -0500404RValue<Byte> operator/=(Byte &lhs, RValue<Byte> rhs)
405{
406 return lhs = lhs / rhs;
407}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400408
Nicolas Capens157ba262019-12-10 17:49:14 -0500409RValue<Byte> operator%=(Byte &lhs, RValue<Byte> rhs)
410{
411 return lhs = lhs % rhs;
412}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400413
Nicolas Capens157ba262019-12-10 17:49:14 -0500414RValue<Byte> operator&=(Byte &lhs, RValue<Byte> rhs)
415{
416 return lhs = lhs & rhs;
417}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400418
Nicolas Capens157ba262019-12-10 17:49:14 -0500419RValue<Byte> operator|=(Byte &lhs, RValue<Byte> rhs)
420{
421 return lhs = lhs | rhs;
422}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400423
Nicolas Capens157ba262019-12-10 17:49:14 -0500424RValue<Byte> operator^=(Byte &lhs, RValue<Byte> rhs)
425{
426 return lhs = lhs ^ rhs;
427}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400428
Nicolas Capens157ba262019-12-10 17:49:14 -0500429RValue<Byte> operator<<=(Byte &lhs, RValue<Byte> rhs)
430{
431 return lhs = lhs << rhs;
432}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400433
Nicolas Capens157ba262019-12-10 17:49:14 -0500434RValue<Byte> operator>>=(Byte &lhs, RValue<Byte> rhs)
435{
436 return lhs = lhs >> rhs;
437}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400438
Nicolas Capens157ba262019-12-10 17:49:14 -0500439RValue<Byte> operator+(RValue<Byte> val)
440{
441 return val;
442}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400443
Nicolas Capens157ba262019-12-10 17:49:14 -0500444RValue<Byte> operator-(RValue<Byte> val)
445{
446 return RValue<Byte>(Nucleus::createNeg(val.value));
447}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400448
Nicolas Capens157ba262019-12-10 17:49:14 -0500449RValue<Byte> operator~(RValue<Byte> val)
450{
451 return RValue<Byte>(Nucleus::createNot(val.value));
452}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400453
Ben Clayton713b8d32019-12-17 20:37:56 +0000454RValue<Byte> operator++(Byte &val, int) // Post-increment
Nicolas Capens157ba262019-12-10 17:49:14 -0500455{
456 RValue<Byte> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400457
Nicolas Capens157ba262019-12-10 17:49:14 -0500458 Value *inc = Nucleus::createAdd(res.value, Nucleus::createConstantByte((unsigned char)1));
459 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400460
Nicolas Capens157ba262019-12-10 17:49:14 -0500461 return res;
462}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400463
Ben Clayton713b8d32019-12-17 20:37:56 +0000464const Byte &operator++(Byte &val) // Pre-increment
Nicolas Capens157ba262019-12-10 17:49:14 -0500465{
466 Value *inc = Nucleus::createAdd(val.loadValue(), Nucleus::createConstantByte((unsigned char)1));
467 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400468
Nicolas Capens157ba262019-12-10 17:49:14 -0500469 return val;
470}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400471
Ben Clayton713b8d32019-12-17 20:37:56 +0000472RValue<Byte> operator--(Byte &val, int) // Post-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -0500473{
474 RValue<Byte> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400475
Nicolas Capens157ba262019-12-10 17:49:14 -0500476 Value *inc = Nucleus::createSub(res.value, Nucleus::createConstantByte((unsigned char)1));
477 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400478
Nicolas Capens157ba262019-12-10 17:49:14 -0500479 return res;
480}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400481
Ben Clayton713b8d32019-12-17 20:37:56 +0000482const Byte &operator--(Byte &val) // Pre-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -0500483{
484 Value *inc = Nucleus::createSub(val.loadValue(), Nucleus::createConstantByte((unsigned char)1));
485 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400486
Nicolas Capens157ba262019-12-10 17:49:14 -0500487 return val;
488}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400489
Nicolas Capens157ba262019-12-10 17:49:14 -0500490RValue<Bool> operator<(RValue<Byte> lhs, RValue<Byte> rhs)
491{
492 return RValue<Bool>(Nucleus::createICmpULT(lhs.value, rhs.value));
493}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400494
Nicolas Capens157ba262019-12-10 17:49:14 -0500495RValue<Bool> operator<=(RValue<Byte> lhs, RValue<Byte> rhs)
496{
497 return RValue<Bool>(Nucleus::createICmpULE(lhs.value, rhs.value));
498}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400499
Nicolas Capens157ba262019-12-10 17:49:14 -0500500RValue<Bool> operator>(RValue<Byte> lhs, RValue<Byte> rhs)
501{
502 return RValue<Bool>(Nucleus::createICmpUGT(lhs.value, rhs.value));
503}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400504
Nicolas Capens157ba262019-12-10 17:49:14 -0500505RValue<Bool> operator>=(RValue<Byte> lhs, RValue<Byte> rhs)
506{
507 return RValue<Bool>(Nucleus::createICmpUGE(lhs.value, rhs.value));
508}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400509
Nicolas Capens157ba262019-12-10 17:49:14 -0500510RValue<Bool> operator!=(RValue<Byte> lhs, RValue<Byte> rhs)
511{
512 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
513}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400514
Nicolas Capens157ba262019-12-10 17:49:14 -0500515RValue<Bool> operator==(RValue<Byte> lhs, RValue<Byte> rhs)
516{
517 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
518}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400519
Nicolas Capens157ba262019-12-10 17:49:14 -0500520SByte::SByte(Argument<SByte> argument)
521{
522 storeValue(argument.value);
523}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400524
Nicolas Capens157ba262019-12-10 17:49:14 -0500525SByte::SByte(RValue<Int> cast)
526{
527 Value *integer = Nucleus::createTrunc(cast.value, SByte::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400528
Nicolas Capens157ba262019-12-10 17:49:14 -0500529 storeValue(integer);
530}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400531
Nicolas Capens157ba262019-12-10 17:49:14 -0500532SByte::SByte(RValue<Short> cast)
533{
534 Value *integer = Nucleus::createTrunc(cast.value, SByte::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400535
Nicolas Capens157ba262019-12-10 17:49:14 -0500536 storeValue(integer);
537}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400538
Nicolas Capens157ba262019-12-10 17:49:14 -0500539SByte::SByte(signed char x)
540{
541 storeValue(Nucleus::createConstantByte(x));
542}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400543
Nicolas Capens157ba262019-12-10 17:49:14 -0500544SByte::SByte(RValue<SByte> rhs)
545{
546 storeValue(rhs.value);
547}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400548
Nicolas Capens157ba262019-12-10 17:49:14 -0500549SByte::SByte(const SByte &rhs)
550{
551 Value *value = rhs.loadValue();
552 storeValue(value);
553}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400554
Nicolas Capens157ba262019-12-10 17:49:14 -0500555SByte::SByte(const Reference<SByte> &rhs)
556{
557 Value *value = rhs.loadValue();
558 storeValue(value);
559}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400560
Nicolas Capens157ba262019-12-10 17:49:14 -0500561RValue<SByte> SByte::operator=(RValue<SByte> rhs)
562{
563 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400564
Nicolas Capens157ba262019-12-10 17:49:14 -0500565 return rhs;
566}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400567
Nicolas Capens157ba262019-12-10 17:49:14 -0500568RValue<SByte> SByte::operator=(const SByte &rhs)
569{
570 Value *value = rhs.loadValue();
571 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400572
Nicolas Capens157ba262019-12-10 17:49:14 -0500573 return RValue<SByte>(value);
574}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400575
Nicolas Capens157ba262019-12-10 17:49:14 -0500576RValue<SByte> SByte::operator=(const Reference<SByte> &rhs)
577{
578 Value *value = rhs.loadValue();
579 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400580
Nicolas Capens157ba262019-12-10 17:49:14 -0500581 return RValue<SByte>(value);
582}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400583
Nicolas Capens157ba262019-12-10 17:49:14 -0500584RValue<SByte> operator+(RValue<SByte> lhs, RValue<SByte> rhs)
585{
586 return RValue<SByte>(Nucleus::createAdd(lhs.value, rhs.value));
587}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400588
Nicolas Capens157ba262019-12-10 17:49:14 -0500589RValue<SByte> operator-(RValue<SByte> lhs, RValue<SByte> rhs)
590{
591 return RValue<SByte>(Nucleus::createSub(lhs.value, rhs.value));
592}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400593
Nicolas Capens157ba262019-12-10 17:49:14 -0500594RValue<SByte> operator*(RValue<SByte> lhs, RValue<SByte> rhs)
595{
596 return RValue<SByte>(Nucleus::createMul(lhs.value, rhs.value));
597}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400598
Nicolas Capens157ba262019-12-10 17:49:14 -0500599RValue<SByte> operator/(RValue<SByte> lhs, RValue<SByte> rhs)
600{
601 return RValue<SByte>(Nucleus::createSDiv(lhs.value, rhs.value));
602}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400603
Nicolas Capens157ba262019-12-10 17:49:14 -0500604RValue<SByte> operator%(RValue<SByte> lhs, RValue<SByte> rhs)
605{
606 return RValue<SByte>(Nucleus::createSRem(lhs.value, rhs.value));
607}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400608
Nicolas Capens157ba262019-12-10 17:49:14 -0500609RValue<SByte> operator&(RValue<SByte> lhs, RValue<SByte> rhs)
610{
611 return RValue<SByte>(Nucleus::createAnd(lhs.value, rhs.value));
612}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400613
Nicolas Capens157ba262019-12-10 17:49:14 -0500614RValue<SByte> operator|(RValue<SByte> lhs, RValue<SByte> rhs)
615{
616 return RValue<SByte>(Nucleus::createOr(lhs.value, rhs.value));
617}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400618
Nicolas Capens157ba262019-12-10 17:49:14 -0500619RValue<SByte> operator^(RValue<SByte> lhs, RValue<SByte> rhs)
620{
621 return RValue<SByte>(Nucleus::createXor(lhs.value, rhs.value));
622}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400623
Nicolas Capens157ba262019-12-10 17:49:14 -0500624RValue<SByte> operator<<(RValue<SByte> lhs, RValue<SByte> rhs)
625{
626 return RValue<SByte>(Nucleus::createShl(lhs.value, rhs.value));
627}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400628
Nicolas Capens157ba262019-12-10 17:49:14 -0500629RValue<SByte> operator>>(RValue<SByte> lhs, RValue<SByte> rhs)
630{
631 return RValue<SByte>(Nucleus::createAShr(lhs.value, rhs.value));
632}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400633
Nicolas Capens157ba262019-12-10 17:49:14 -0500634RValue<SByte> operator+=(SByte &lhs, RValue<SByte> rhs)
635{
636 return lhs = lhs + rhs;
637}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400638
Nicolas Capens157ba262019-12-10 17:49:14 -0500639RValue<SByte> operator-=(SByte &lhs, RValue<SByte> rhs)
640{
641 return lhs = lhs - rhs;
642}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400643
Nicolas Capens157ba262019-12-10 17:49:14 -0500644RValue<SByte> operator*=(SByte &lhs, RValue<SByte> rhs)
645{
646 return lhs = lhs * rhs;
647}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400648
Nicolas Capens157ba262019-12-10 17:49:14 -0500649RValue<SByte> operator/=(SByte &lhs, RValue<SByte> rhs)
650{
651 return lhs = lhs / rhs;
652}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400653
Nicolas Capens157ba262019-12-10 17:49:14 -0500654RValue<SByte> operator%=(SByte &lhs, RValue<SByte> rhs)
655{
656 return lhs = lhs % rhs;
657}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400658
Nicolas Capens157ba262019-12-10 17:49:14 -0500659RValue<SByte> operator&=(SByte &lhs, RValue<SByte> rhs)
660{
661 return lhs = lhs & rhs;
662}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400663
Nicolas Capens157ba262019-12-10 17:49:14 -0500664RValue<SByte> operator|=(SByte &lhs, RValue<SByte> rhs)
665{
666 return lhs = lhs | rhs;
667}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400668
Nicolas Capens157ba262019-12-10 17:49:14 -0500669RValue<SByte> operator^=(SByte &lhs, RValue<SByte> rhs)
670{
671 return lhs = lhs ^ rhs;
672}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400673
Nicolas Capens157ba262019-12-10 17:49:14 -0500674RValue<SByte> operator<<=(SByte &lhs, RValue<SByte> rhs)
675{
676 return lhs = lhs << rhs;
677}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400678
Nicolas Capens157ba262019-12-10 17:49:14 -0500679RValue<SByte> operator>>=(SByte &lhs, RValue<SByte> rhs)
680{
681 return lhs = lhs >> rhs;
682}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400683
Nicolas Capens157ba262019-12-10 17:49:14 -0500684RValue<SByte> operator+(RValue<SByte> val)
685{
686 return val;
687}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400688
Nicolas Capens157ba262019-12-10 17:49:14 -0500689RValue<SByte> operator-(RValue<SByte> val)
690{
691 return RValue<SByte>(Nucleus::createNeg(val.value));
692}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400693
Nicolas Capens157ba262019-12-10 17:49:14 -0500694RValue<SByte> operator~(RValue<SByte> val)
695{
696 return RValue<SByte>(Nucleus::createNot(val.value));
697}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400698
Ben Clayton713b8d32019-12-17 20:37:56 +0000699RValue<SByte> operator++(SByte &val, int) // Post-increment
Nicolas Capens157ba262019-12-10 17:49:14 -0500700{
701 RValue<SByte> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400702
Nicolas Capens157ba262019-12-10 17:49:14 -0500703 Value *inc = Nucleus::createAdd(res.value, Nucleus::createConstantByte((signed char)1));
704 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400705
Nicolas Capens157ba262019-12-10 17:49:14 -0500706 return res;
707}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400708
Ben Clayton713b8d32019-12-17 20:37:56 +0000709const SByte &operator++(SByte &val) // Pre-increment
Nicolas Capens157ba262019-12-10 17:49:14 -0500710{
711 Value *inc = Nucleus::createAdd(val.loadValue(), Nucleus::createConstantByte((signed char)1));
712 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400713
Nicolas Capens157ba262019-12-10 17:49:14 -0500714 return val;
715}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400716
Ben Clayton713b8d32019-12-17 20:37:56 +0000717RValue<SByte> operator--(SByte &val, int) // Post-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -0500718{
719 RValue<SByte> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400720
Nicolas Capens157ba262019-12-10 17:49:14 -0500721 Value *inc = Nucleus::createSub(res.value, Nucleus::createConstantByte((signed char)1));
722 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400723
Nicolas Capens157ba262019-12-10 17:49:14 -0500724 return res;
725}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400726
Ben Clayton713b8d32019-12-17 20:37:56 +0000727const SByte &operator--(SByte &val) // Pre-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -0500728{
729 Value *inc = Nucleus::createSub(val.loadValue(), Nucleus::createConstantByte((signed char)1));
730 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400731
Nicolas Capens157ba262019-12-10 17:49:14 -0500732 return val;
733}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400734
Nicolas Capens157ba262019-12-10 17:49:14 -0500735RValue<Bool> operator<(RValue<SByte> lhs, RValue<SByte> rhs)
736{
737 return RValue<Bool>(Nucleus::createICmpSLT(lhs.value, rhs.value));
738}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400739
Nicolas Capens157ba262019-12-10 17:49:14 -0500740RValue<Bool> operator<=(RValue<SByte> lhs, RValue<SByte> rhs)
741{
742 return RValue<Bool>(Nucleus::createICmpSLE(lhs.value, rhs.value));
743}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400744
Nicolas Capens157ba262019-12-10 17:49:14 -0500745RValue<Bool> operator>(RValue<SByte> lhs, RValue<SByte> rhs)
746{
747 return RValue<Bool>(Nucleus::createICmpSGT(lhs.value, rhs.value));
748}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400749
Nicolas Capens157ba262019-12-10 17:49:14 -0500750RValue<Bool> operator>=(RValue<SByte> lhs, RValue<SByte> rhs)
751{
752 return RValue<Bool>(Nucleus::createICmpSGE(lhs.value, rhs.value));
753}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400754
Nicolas Capens157ba262019-12-10 17:49:14 -0500755RValue<Bool> operator!=(RValue<SByte> lhs, RValue<SByte> rhs)
756{
757 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
758}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400759
Nicolas Capens157ba262019-12-10 17:49:14 -0500760RValue<Bool> operator==(RValue<SByte> lhs, RValue<SByte> rhs)
761{
762 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
763}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400764
Nicolas Capens157ba262019-12-10 17:49:14 -0500765Short::Short(Argument<Short> argument)
766{
767 storeValue(argument.value);
768}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400769
Nicolas Capens157ba262019-12-10 17:49:14 -0500770Short::Short(RValue<Int> cast)
771{
772 Value *integer = Nucleus::createTrunc(cast.value, Short::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400773
Nicolas Capens157ba262019-12-10 17:49:14 -0500774 storeValue(integer);
775}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400776
Nicolas Capens157ba262019-12-10 17:49:14 -0500777Short::Short(short x)
778{
779 storeValue(Nucleus::createConstantShort(x));
780}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400781
Nicolas Capens157ba262019-12-10 17:49:14 -0500782Short::Short(RValue<Short> rhs)
783{
784 storeValue(rhs.value);
785}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400786
Nicolas Capens157ba262019-12-10 17:49:14 -0500787Short::Short(const Short &rhs)
788{
789 Value *value = rhs.loadValue();
790 storeValue(value);
791}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400792
Nicolas Capens157ba262019-12-10 17:49:14 -0500793Short::Short(const Reference<Short> &rhs)
794{
795 Value *value = rhs.loadValue();
796 storeValue(value);
797}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400798
Nicolas Capens157ba262019-12-10 17:49:14 -0500799RValue<Short> Short::operator=(RValue<Short> rhs)
800{
801 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400802
Nicolas Capens157ba262019-12-10 17:49:14 -0500803 return rhs;
804}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400805
Nicolas Capens157ba262019-12-10 17:49:14 -0500806RValue<Short> Short::operator=(const Short &rhs)
807{
808 Value *value = rhs.loadValue();
809 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400810
Nicolas Capens157ba262019-12-10 17:49:14 -0500811 return RValue<Short>(value);
812}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400813
Nicolas Capens157ba262019-12-10 17:49:14 -0500814RValue<Short> Short::operator=(const Reference<Short> &rhs)
815{
816 Value *value = rhs.loadValue();
817 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400818
Nicolas Capens157ba262019-12-10 17:49:14 -0500819 return RValue<Short>(value);
820}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400821
Nicolas Capens157ba262019-12-10 17:49:14 -0500822RValue<Short> operator+(RValue<Short> lhs, RValue<Short> rhs)
823{
824 return RValue<Short>(Nucleus::createAdd(lhs.value, rhs.value));
825}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400826
Nicolas Capens157ba262019-12-10 17:49:14 -0500827RValue<Short> operator-(RValue<Short> lhs, RValue<Short> rhs)
828{
829 return RValue<Short>(Nucleus::createSub(lhs.value, rhs.value));
830}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400831
Nicolas Capens157ba262019-12-10 17:49:14 -0500832RValue<Short> operator*(RValue<Short> lhs, RValue<Short> rhs)
833{
834 return RValue<Short>(Nucleus::createMul(lhs.value, rhs.value));
835}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400836
Nicolas Capens157ba262019-12-10 17:49:14 -0500837RValue<Short> operator/(RValue<Short> lhs, RValue<Short> rhs)
838{
839 return RValue<Short>(Nucleus::createSDiv(lhs.value, rhs.value));
840}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400841
Nicolas Capens157ba262019-12-10 17:49:14 -0500842RValue<Short> operator%(RValue<Short> lhs, RValue<Short> rhs)
843{
844 return RValue<Short>(Nucleus::createSRem(lhs.value, rhs.value));
845}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400846
Nicolas Capens157ba262019-12-10 17:49:14 -0500847RValue<Short> operator&(RValue<Short> lhs, RValue<Short> rhs)
848{
849 return RValue<Short>(Nucleus::createAnd(lhs.value, rhs.value));
850}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400851
Nicolas Capens157ba262019-12-10 17:49:14 -0500852RValue<Short> operator|(RValue<Short> lhs, RValue<Short> rhs)
853{
854 return RValue<Short>(Nucleus::createOr(lhs.value, rhs.value));
855}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400856
Nicolas Capens157ba262019-12-10 17:49:14 -0500857RValue<Short> operator^(RValue<Short> lhs, RValue<Short> rhs)
858{
859 return RValue<Short>(Nucleus::createXor(lhs.value, rhs.value));
860}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400861
Nicolas Capens157ba262019-12-10 17:49:14 -0500862RValue<Short> operator<<(RValue<Short> lhs, RValue<Short> rhs)
863{
864 return RValue<Short>(Nucleus::createShl(lhs.value, rhs.value));
865}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400866
Nicolas Capens157ba262019-12-10 17:49:14 -0500867RValue<Short> operator>>(RValue<Short> lhs, RValue<Short> rhs)
868{
869 return RValue<Short>(Nucleus::createAShr(lhs.value, rhs.value));
870}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400871
Nicolas Capens157ba262019-12-10 17:49:14 -0500872RValue<Short> operator+=(Short &lhs, RValue<Short> rhs)
873{
874 return lhs = lhs + rhs;
875}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400876
Nicolas Capens157ba262019-12-10 17:49:14 -0500877RValue<Short> operator-=(Short &lhs, RValue<Short> rhs)
878{
879 return lhs = lhs - rhs;
880}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400881
Nicolas Capens157ba262019-12-10 17:49:14 -0500882RValue<Short> operator*=(Short &lhs, RValue<Short> rhs)
883{
884 return lhs = lhs * rhs;
885}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400886
Nicolas Capens157ba262019-12-10 17:49:14 -0500887RValue<Short> operator/=(Short &lhs, RValue<Short> rhs)
888{
889 return lhs = lhs / rhs;
890}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400891
Nicolas Capens157ba262019-12-10 17:49:14 -0500892RValue<Short> operator%=(Short &lhs, RValue<Short> rhs)
893{
894 return lhs = lhs % rhs;
895}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400896
Nicolas Capens157ba262019-12-10 17:49:14 -0500897RValue<Short> operator&=(Short &lhs, RValue<Short> rhs)
898{
899 return lhs = lhs & rhs;
900}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400901
Nicolas Capens157ba262019-12-10 17:49:14 -0500902RValue<Short> operator|=(Short &lhs, RValue<Short> rhs)
903{
904 return lhs = lhs | rhs;
905}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400906
Nicolas Capens157ba262019-12-10 17:49:14 -0500907RValue<Short> operator^=(Short &lhs, RValue<Short> rhs)
908{
909 return lhs = lhs ^ rhs;
910}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400911
Nicolas Capens157ba262019-12-10 17:49:14 -0500912RValue<Short> operator<<=(Short &lhs, RValue<Short> rhs)
913{
914 return lhs = lhs << rhs;
915}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400916
Nicolas Capens157ba262019-12-10 17:49:14 -0500917RValue<Short> operator>>=(Short &lhs, RValue<Short> rhs)
918{
919 return lhs = lhs >> rhs;
920}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400921
Nicolas Capens157ba262019-12-10 17:49:14 -0500922RValue<Short> operator+(RValue<Short> val)
923{
924 return val;
925}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400926
Nicolas Capens157ba262019-12-10 17:49:14 -0500927RValue<Short> operator-(RValue<Short> val)
928{
929 return RValue<Short>(Nucleus::createNeg(val.value));
930}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400931
Nicolas Capens157ba262019-12-10 17:49:14 -0500932RValue<Short> operator~(RValue<Short> val)
933{
934 return RValue<Short>(Nucleus::createNot(val.value));
935}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400936
Ben Clayton713b8d32019-12-17 20:37:56 +0000937RValue<Short> operator++(Short &val, int) // Post-increment
Nicolas Capens157ba262019-12-10 17:49:14 -0500938{
939 RValue<Short> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400940
Nicolas Capens157ba262019-12-10 17:49:14 -0500941 Value *inc = Nucleus::createAdd(res.value, Nucleus::createConstantShort((short)1));
942 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400943
Nicolas Capens157ba262019-12-10 17:49:14 -0500944 return res;
945}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400946
Ben Clayton713b8d32019-12-17 20:37:56 +0000947const Short &operator++(Short &val) // Pre-increment
Nicolas Capens157ba262019-12-10 17:49:14 -0500948{
949 Value *inc = Nucleus::createAdd(val.loadValue(), Nucleus::createConstantShort((short)1));
950 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400951
Nicolas Capens157ba262019-12-10 17:49:14 -0500952 return val;
953}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400954
Ben Clayton713b8d32019-12-17 20:37:56 +0000955RValue<Short> operator--(Short &val, int) // Post-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -0500956{
957 RValue<Short> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400958
Nicolas Capens157ba262019-12-10 17:49:14 -0500959 Value *inc = Nucleus::createSub(res.value, Nucleus::createConstantShort((short)1));
960 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400961
Nicolas Capens157ba262019-12-10 17:49:14 -0500962 return res;
963}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400964
Ben Clayton713b8d32019-12-17 20:37:56 +0000965const Short &operator--(Short &val) // Pre-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -0500966{
967 Value *inc = Nucleus::createSub(val.loadValue(), Nucleus::createConstantShort((short)1));
968 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400969
Nicolas Capens157ba262019-12-10 17:49:14 -0500970 return val;
971}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400972
Nicolas Capens157ba262019-12-10 17:49:14 -0500973RValue<Bool> operator<(RValue<Short> lhs, RValue<Short> rhs)
974{
975 return RValue<Bool>(Nucleus::createICmpSLT(lhs.value, rhs.value));
976}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400977
Nicolas Capens157ba262019-12-10 17:49:14 -0500978RValue<Bool> operator<=(RValue<Short> lhs, RValue<Short> rhs)
979{
980 return RValue<Bool>(Nucleus::createICmpSLE(lhs.value, rhs.value));
981}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400982
Nicolas Capens157ba262019-12-10 17:49:14 -0500983RValue<Bool> operator>(RValue<Short> lhs, RValue<Short> rhs)
984{
985 return RValue<Bool>(Nucleus::createICmpSGT(lhs.value, rhs.value));
986}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400987
Nicolas Capens157ba262019-12-10 17:49:14 -0500988RValue<Bool> operator>=(RValue<Short> lhs, RValue<Short> rhs)
989{
990 return RValue<Bool>(Nucleus::createICmpSGE(lhs.value, rhs.value));
991}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400992
Nicolas Capens157ba262019-12-10 17:49:14 -0500993RValue<Bool> operator!=(RValue<Short> lhs, RValue<Short> rhs)
994{
995 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
996}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400997
Nicolas Capens157ba262019-12-10 17:49:14 -0500998RValue<Bool> operator==(RValue<Short> lhs, RValue<Short> rhs)
999{
1000 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
1001}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001002
Nicolas Capens157ba262019-12-10 17:49:14 -05001003UShort::UShort(Argument<UShort> argument)
1004{
1005 storeValue(argument.value);
1006}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001007
Nicolas Capens157ba262019-12-10 17:49:14 -05001008UShort::UShort(RValue<UInt> cast)
1009{
1010 Value *integer = Nucleus::createTrunc(cast.value, UShort::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001011
Nicolas Capens157ba262019-12-10 17:49:14 -05001012 storeValue(integer);
1013}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001014
Nicolas Capens157ba262019-12-10 17:49:14 -05001015UShort::UShort(RValue<Int> cast)
1016{
1017 Value *integer = Nucleus::createTrunc(cast.value, UShort::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001018
Nicolas Capens157ba262019-12-10 17:49:14 -05001019 storeValue(integer);
1020}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001021
Nicolas Capens157ba262019-12-10 17:49:14 -05001022UShort::UShort(unsigned short x)
1023{
1024 storeValue(Nucleus::createConstantShort(x));
1025}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001026
Nicolas Capens157ba262019-12-10 17:49:14 -05001027UShort::UShort(RValue<UShort> rhs)
1028{
1029 storeValue(rhs.value);
1030}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001031
Nicolas Capens157ba262019-12-10 17:49:14 -05001032UShort::UShort(const UShort &rhs)
1033{
1034 Value *value = rhs.loadValue();
1035 storeValue(value);
1036}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001037
Nicolas Capens157ba262019-12-10 17:49:14 -05001038UShort::UShort(const Reference<UShort> &rhs)
1039{
1040 Value *value = rhs.loadValue();
1041 storeValue(value);
1042}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001043
Nicolas Capens157ba262019-12-10 17:49:14 -05001044RValue<UShort> UShort::operator=(RValue<UShort> rhs)
1045{
1046 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001047
Nicolas Capens157ba262019-12-10 17:49:14 -05001048 return rhs;
1049}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001050
Nicolas Capens157ba262019-12-10 17:49:14 -05001051RValue<UShort> UShort::operator=(const UShort &rhs)
1052{
1053 Value *value = rhs.loadValue();
1054 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001055
Nicolas Capens157ba262019-12-10 17:49:14 -05001056 return RValue<UShort>(value);
1057}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001058
Nicolas Capens157ba262019-12-10 17:49:14 -05001059RValue<UShort> UShort::operator=(const Reference<UShort> &rhs)
1060{
1061 Value *value = rhs.loadValue();
1062 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001063
Nicolas Capens157ba262019-12-10 17:49:14 -05001064 return RValue<UShort>(value);
1065}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001066
Nicolas Capens157ba262019-12-10 17:49:14 -05001067RValue<UShort> operator+(RValue<UShort> lhs, RValue<UShort> rhs)
1068{
1069 return RValue<UShort>(Nucleus::createAdd(lhs.value, rhs.value));
1070}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001071
Nicolas Capens157ba262019-12-10 17:49:14 -05001072RValue<UShort> operator-(RValue<UShort> lhs, RValue<UShort> rhs)
1073{
1074 return RValue<UShort>(Nucleus::createSub(lhs.value, rhs.value));
1075}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001076
Nicolas Capens157ba262019-12-10 17:49:14 -05001077RValue<UShort> operator*(RValue<UShort> lhs, RValue<UShort> rhs)
1078{
1079 return RValue<UShort>(Nucleus::createMul(lhs.value, rhs.value));
1080}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001081
Nicolas Capens157ba262019-12-10 17:49:14 -05001082RValue<UShort> operator/(RValue<UShort> lhs, RValue<UShort> rhs)
1083{
1084 return RValue<UShort>(Nucleus::createUDiv(lhs.value, rhs.value));
1085}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001086
Nicolas Capens157ba262019-12-10 17:49:14 -05001087RValue<UShort> operator%(RValue<UShort> lhs, RValue<UShort> rhs)
1088{
1089 return RValue<UShort>(Nucleus::createURem(lhs.value, rhs.value));
1090}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001091
Nicolas Capens157ba262019-12-10 17:49:14 -05001092RValue<UShort> operator&(RValue<UShort> lhs, RValue<UShort> rhs)
1093{
1094 return RValue<UShort>(Nucleus::createAnd(lhs.value, rhs.value));
1095}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001096
Nicolas Capens157ba262019-12-10 17:49:14 -05001097RValue<UShort> operator|(RValue<UShort> lhs, RValue<UShort> rhs)
1098{
1099 return RValue<UShort>(Nucleus::createOr(lhs.value, rhs.value));
1100}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001101
Nicolas Capens157ba262019-12-10 17:49:14 -05001102RValue<UShort> operator^(RValue<UShort> lhs, RValue<UShort> rhs)
1103{
1104 return RValue<UShort>(Nucleus::createXor(lhs.value, rhs.value));
1105}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001106
Nicolas Capens157ba262019-12-10 17:49:14 -05001107RValue<UShort> operator<<(RValue<UShort> lhs, RValue<UShort> rhs)
1108{
1109 return RValue<UShort>(Nucleus::createShl(lhs.value, rhs.value));
1110}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001111
Nicolas Capens157ba262019-12-10 17:49:14 -05001112RValue<UShort> operator>>(RValue<UShort> lhs, RValue<UShort> rhs)
1113{
1114 return RValue<UShort>(Nucleus::createLShr(lhs.value, rhs.value));
1115}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001116
Nicolas Capens157ba262019-12-10 17:49:14 -05001117RValue<UShort> operator+=(UShort &lhs, RValue<UShort> rhs)
1118{
1119 return lhs = lhs + rhs;
1120}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001121
Nicolas Capens157ba262019-12-10 17:49:14 -05001122RValue<UShort> operator-=(UShort &lhs, RValue<UShort> rhs)
1123{
1124 return lhs = lhs - rhs;
1125}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001126
Nicolas Capens157ba262019-12-10 17:49:14 -05001127RValue<UShort> operator*=(UShort &lhs, RValue<UShort> rhs)
1128{
1129 return lhs = lhs * rhs;
1130}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001131
Nicolas Capens157ba262019-12-10 17:49:14 -05001132RValue<UShort> operator/=(UShort &lhs, RValue<UShort> rhs)
1133{
1134 return lhs = lhs / rhs;
1135}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001136
Nicolas Capens157ba262019-12-10 17:49:14 -05001137RValue<UShort> operator%=(UShort &lhs, RValue<UShort> rhs)
1138{
1139 return lhs = lhs % rhs;
1140}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001141
Nicolas Capens157ba262019-12-10 17:49:14 -05001142RValue<UShort> operator&=(UShort &lhs, RValue<UShort> rhs)
1143{
1144 return lhs = lhs & rhs;
1145}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001146
Nicolas Capens157ba262019-12-10 17:49:14 -05001147RValue<UShort> operator|=(UShort &lhs, RValue<UShort> rhs)
1148{
1149 return lhs = lhs | rhs;
1150}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001151
Nicolas Capens157ba262019-12-10 17:49:14 -05001152RValue<UShort> operator^=(UShort &lhs, RValue<UShort> rhs)
1153{
1154 return lhs = lhs ^ rhs;
1155}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001156
Nicolas Capens157ba262019-12-10 17:49:14 -05001157RValue<UShort> operator<<=(UShort &lhs, RValue<UShort> rhs)
1158{
1159 return lhs = lhs << rhs;
1160}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001161
Nicolas Capens157ba262019-12-10 17:49:14 -05001162RValue<UShort> operator>>=(UShort &lhs, RValue<UShort> rhs)
1163{
1164 return lhs = lhs >> rhs;
1165}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001166
Nicolas Capens157ba262019-12-10 17:49:14 -05001167RValue<UShort> operator+(RValue<UShort> val)
1168{
1169 return val;
1170}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001171
Nicolas Capens157ba262019-12-10 17:49:14 -05001172RValue<UShort> operator-(RValue<UShort> val)
1173{
1174 return RValue<UShort>(Nucleus::createNeg(val.value));
1175}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001176
Nicolas Capens157ba262019-12-10 17:49:14 -05001177RValue<UShort> operator~(RValue<UShort> val)
1178{
1179 return RValue<UShort>(Nucleus::createNot(val.value));
1180}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001181
Ben Clayton713b8d32019-12-17 20:37:56 +00001182RValue<UShort> operator++(UShort &val, int) // Post-increment
Nicolas Capens157ba262019-12-10 17:49:14 -05001183{
1184 RValue<UShort> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001185
Nicolas Capens157ba262019-12-10 17:49:14 -05001186 Value *inc = Nucleus::createAdd(res.value, Nucleus::createConstantShort((unsigned short)1));
1187 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001188
Nicolas Capens157ba262019-12-10 17:49:14 -05001189 return res;
1190}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001191
Ben Clayton713b8d32019-12-17 20:37:56 +00001192const UShort &operator++(UShort &val) // Pre-increment
Nicolas Capens157ba262019-12-10 17:49:14 -05001193{
1194 Value *inc = Nucleus::createAdd(val.loadValue(), Nucleus::createConstantShort((unsigned short)1));
1195 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001196
Nicolas Capens157ba262019-12-10 17:49:14 -05001197 return val;
1198}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001199
Ben Clayton713b8d32019-12-17 20:37:56 +00001200RValue<UShort> operator--(UShort &val, int) // Post-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -05001201{
1202 RValue<UShort> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001203
Nicolas Capens157ba262019-12-10 17:49:14 -05001204 Value *inc = Nucleus::createSub(res.value, Nucleus::createConstantShort((unsigned short)1));
1205 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001206
Nicolas Capens157ba262019-12-10 17:49:14 -05001207 return res;
1208}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001209
Ben Clayton713b8d32019-12-17 20:37:56 +00001210const UShort &operator--(UShort &val) // Pre-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -05001211{
1212 Value *inc = Nucleus::createSub(val.loadValue(), Nucleus::createConstantShort((unsigned short)1));
1213 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001214
Nicolas Capens157ba262019-12-10 17:49:14 -05001215 return val;
1216}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001217
Nicolas Capens157ba262019-12-10 17:49:14 -05001218RValue<Bool> operator<(RValue<UShort> lhs, RValue<UShort> rhs)
1219{
1220 return RValue<Bool>(Nucleus::createICmpULT(lhs.value, rhs.value));
1221}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001222
Nicolas Capens157ba262019-12-10 17:49:14 -05001223RValue<Bool> operator<=(RValue<UShort> lhs, RValue<UShort> rhs)
1224{
1225 return RValue<Bool>(Nucleus::createICmpULE(lhs.value, rhs.value));
1226}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001227
Nicolas Capens157ba262019-12-10 17:49:14 -05001228RValue<Bool> operator>(RValue<UShort> lhs, RValue<UShort> rhs)
1229{
1230 return RValue<Bool>(Nucleus::createICmpUGT(lhs.value, rhs.value));
1231}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001232
Nicolas Capens157ba262019-12-10 17:49:14 -05001233RValue<Bool> operator>=(RValue<UShort> lhs, RValue<UShort> rhs)
1234{
1235 return RValue<Bool>(Nucleus::createICmpUGE(lhs.value, rhs.value));
1236}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001237
Nicolas Capens157ba262019-12-10 17:49:14 -05001238RValue<Bool> operator!=(RValue<UShort> lhs, RValue<UShort> rhs)
1239{
1240 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
1241}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001242
Nicolas Capens157ba262019-12-10 17:49:14 -05001243RValue<Bool> operator==(RValue<UShort> lhs, RValue<UShort> rhs)
1244{
1245 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
1246}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001247
Nicolas Capens157ba262019-12-10 17:49:14 -05001248Byte4::Byte4(RValue<Byte8> cast)
1249{
1250 storeValue(Nucleus::createBitCast(cast.value, getType()));
1251}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001252
Nicolas Capens157ba262019-12-10 17:49:14 -05001253Byte4::Byte4(const Reference<Byte4> &rhs)
1254{
1255 Value *value = rhs.loadValue();
1256 storeValue(value);
1257}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001258
Nicolas Capens157ba262019-12-10 17:49:14 -05001259Byte8::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)
1260{
Ben Clayton713b8d32019-12-17 20:37:56 +00001261 int64_t constantVector[8] = { x0, x1, x2, x3, x4, x5, x6, x7 };
Nicolas Capens157ba262019-12-10 17:49:14 -05001262 storeValue(Nucleus::createConstantVector(constantVector, getType()));
1263}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001264
Nicolas Capens157ba262019-12-10 17:49:14 -05001265Byte8::Byte8(RValue<Byte8> rhs)
1266{
1267 storeValue(rhs.value);
1268}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001269
Nicolas Capens157ba262019-12-10 17:49:14 -05001270Byte8::Byte8(const Byte8 &rhs)
1271{
1272 Value *value = rhs.loadValue();
1273 storeValue(value);
1274}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001275
Nicolas Capens157ba262019-12-10 17:49:14 -05001276Byte8::Byte8(const Reference<Byte8> &rhs)
1277{
1278 Value *value = rhs.loadValue();
1279 storeValue(value);
1280}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001281
Nicolas Capens157ba262019-12-10 17:49:14 -05001282RValue<Byte8> Byte8::operator=(RValue<Byte8> rhs)
1283{
1284 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001285
Nicolas Capens157ba262019-12-10 17:49:14 -05001286 return rhs;
1287}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001288
Nicolas Capens157ba262019-12-10 17:49:14 -05001289RValue<Byte8> Byte8::operator=(const Byte8 &rhs)
1290{
1291 Value *value = rhs.loadValue();
1292 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001293
Nicolas Capens157ba262019-12-10 17:49:14 -05001294 return RValue<Byte8>(value);
1295}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001296
Nicolas Capens157ba262019-12-10 17:49:14 -05001297RValue<Byte8> Byte8::operator=(const Reference<Byte8> &rhs)
1298{
1299 Value *value = rhs.loadValue();
1300 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001301
Nicolas Capens157ba262019-12-10 17:49:14 -05001302 return RValue<Byte8>(value);
1303}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001304
Nicolas Capens157ba262019-12-10 17:49:14 -05001305RValue<Byte8> operator+(RValue<Byte8> lhs, RValue<Byte8> rhs)
1306{
1307 return RValue<Byte8>(Nucleus::createAdd(lhs.value, rhs.value));
1308}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001309
Nicolas Capens157ba262019-12-10 17:49:14 -05001310RValue<Byte8> operator-(RValue<Byte8> lhs, RValue<Byte8> rhs)
1311{
1312 return RValue<Byte8>(Nucleus::createSub(lhs.value, rhs.value));
1313}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001314
1315// RValue<Byte8> operator*(RValue<Byte8> lhs, RValue<Byte8> rhs)
1316// {
1317// return RValue<Byte8>(Nucleus::createMul(lhs.value, rhs.value));
1318// }
1319
1320// RValue<Byte8> operator/(RValue<Byte8> lhs, RValue<Byte8> rhs)
1321// {
1322// return RValue<Byte8>(Nucleus::createUDiv(lhs.value, rhs.value));
1323// }
1324
1325// RValue<Byte8> operator%(RValue<Byte8> lhs, RValue<Byte8> rhs)
1326// {
1327// return RValue<Byte8>(Nucleus::createURem(lhs.value, rhs.value));
1328// }
1329
Nicolas Capens157ba262019-12-10 17:49:14 -05001330RValue<Byte8> operator&(RValue<Byte8> lhs, RValue<Byte8> rhs)
1331{
1332 return RValue<Byte8>(Nucleus::createAnd(lhs.value, rhs.value));
1333}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001334
Nicolas Capens157ba262019-12-10 17:49:14 -05001335RValue<Byte8> operator|(RValue<Byte8> lhs, RValue<Byte8> rhs)
1336{
1337 return RValue<Byte8>(Nucleus::createOr(lhs.value, rhs.value));
1338}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001339
Nicolas Capens157ba262019-12-10 17:49:14 -05001340RValue<Byte8> operator^(RValue<Byte8> lhs, RValue<Byte8> rhs)
1341{
1342 return RValue<Byte8>(Nucleus::createXor(lhs.value, rhs.value));
1343}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001344
1345// RValue<Byte8> operator<<(RValue<Byte8> lhs, unsigned char rhs)
1346// {
1347// return RValue<Byte8>(Nucleus::createShl(lhs.value, rhs.value));
1348// }
1349
1350// RValue<Byte8> operator>>(RValue<Byte8> lhs, unsigned char rhs)
1351// {
1352// return RValue<Byte8>(Nucleus::createLShr(lhs.value, rhs.value));
1353// }
1354
Nicolas Capens157ba262019-12-10 17:49:14 -05001355RValue<Byte8> operator+=(Byte8 &lhs, RValue<Byte8> rhs)
1356{
1357 return lhs = lhs + rhs;
1358}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001359
Nicolas Capens157ba262019-12-10 17:49:14 -05001360RValue<Byte8> operator-=(Byte8 &lhs, RValue<Byte8> rhs)
1361{
1362 return lhs = lhs - rhs;
1363}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001364
1365// RValue<Byte8> operator*=(Byte8 &lhs, RValue<Byte8> rhs)
1366// {
1367// return lhs = lhs * rhs;
1368// }
1369
1370// RValue<Byte8> operator/=(Byte8 &lhs, RValue<Byte8> rhs)
1371// {
1372// return lhs = lhs / rhs;
1373// }
1374
1375// RValue<Byte8> operator%=(Byte8 &lhs, RValue<Byte8> rhs)
1376// {
1377// return lhs = lhs % rhs;
1378// }
1379
Nicolas Capens157ba262019-12-10 17:49:14 -05001380RValue<Byte8> operator&=(Byte8 &lhs, RValue<Byte8> rhs)
1381{
1382 return lhs = lhs & rhs;
1383}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001384
Nicolas Capens157ba262019-12-10 17:49:14 -05001385RValue<Byte8> operator|=(Byte8 &lhs, RValue<Byte8> rhs)
1386{
1387 return lhs = lhs | rhs;
1388}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001389
Nicolas Capens157ba262019-12-10 17:49:14 -05001390RValue<Byte8> operator^=(Byte8 &lhs, RValue<Byte8> rhs)
1391{
1392 return lhs = lhs ^ rhs;
1393}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001394
1395// RValue<Byte8> operator<<=(Byte8 &lhs, RValue<Byte8> rhs)
1396// {
1397// return lhs = lhs << rhs;
1398// }
1399
1400// RValue<Byte8> operator>>=(Byte8 &lhs, RValue<Byte8> rhs)
1401// {
1402// return lhs = lhs >> rhs;
1403// }
1404
1405// RValue<Byte8> operator+(RValue<Byte8> val)
1406// {
1407// return val;
1408// }
1409
1410// RValue<Byte8> operator-(RValue<Byte8> val)
1411// {
1412// return RValue<Byte8>(Nucleus::createNeg(val.value));
1413// }
1414
Nicolas Capens157ba262019-12-10 17:49:14 -05001415RValue<Byte8> operator~(RValue<Byte8> val)
1416{
1417 return RValue<Byte8>(Nucleus::createNot(val.value));
1418}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001419
Nicolas Capens157ba262019-12-10 17:49:14 -05001420RValue<Short4> Unpack(RValue<Byte4> x)
1421{
Ben Clayton713b8d32019-12-17 20:37:56 +00001422 int shuffle[16] = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7 }; // Real type is v16i8
Nicolas Capens157ba262019-12-10 17:49:14 -05001423 return As<Short4>(Nucleus::createShuffleVector(x.value, x.value, shuffle));
1424}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001425
Nicolas Capens157ba262019-12-10 17:49:14 -05001426RValue<Short4> Unpack(RValue<Byte4> x, RValue<Byte4> y)
1427{
1428 return UnpackLow(As<Byte8>(x), As<Byte8>(y));
1429}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001430
Nicolas Capens157ba262019-12-10 17:49:14 -05001431RValue<Short4> UnpackLow(RValue<Byte8> x, RValue<Byte8> y)
1432{
Ben Clayton713b8d32019-12-17 20:37:56 +00001433 int shuffle[16] = { 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23 }; // Real type is v16i8
Nicolas Capens157ba262019-12-10 17:49:14 -05001434 return As<Short4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
1435}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001436
Nicolas Capens157ba262019-12-10 17:49:14 -05001437RValue<Short4> UnpackHigh(RValue<Byte8> x, RValue<Byte8> y)
1438{
Ben Clayton713b8d32019-12-17 20:37:56 +00001439 int shuffle[16] = { 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23 }; // Real type is v16i8
Nicolas Capens157ba262019-12-10 17:49:14 -05001440 auto lowHigh = RValue<Byte16>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
1441 return As<Short4>(Swizzle(As<Int4>(lowHigh), 0x2323));
1442}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001443
Nicolas Capens157ba262019-12-10 17:49:14 -05001444SByte8::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)
1445{
Ben Clayton713b8d32019-12-17 20:37:56 +00001446 int64_t constantVector[8] = { x0, x1, x2, x3, x4, x5, x6, x7 };
Nicolas Capens157ba262019-12-10 17:49:14 -05001447 Value *vector = Nucleus::createConstantVector(constantVector, getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001448
Nicolas Capens157ba262019-12-10 17:49:14 -05001449 storeValue(Nucleus::createBitCast(vector, getType()));
1450}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001451
Nicolas Capens157ba262019-12-10 17:49:14 -05001452SByte8::SByte8(RValue<SByte8> rhs)
1453{
1454 storeValue(rhs.value);
1455}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001456
Nicolas Capens157ba262019-12-10 17:49:14 -05001457SByte8::SByte8(const SByte8 &rhs)
1458{
1459 Value *value = rhs.loadValue();
1460 storeValue(value);
1461}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001462
Nicolas Capens157ba262019-12-10 17:49:14 -05001463SByte8::SByte8(const Reference<SByte8> &rhs)
1464{
1465 Value *value = rhs.loadValue();
1466 storeValue(value);
1467}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001468
Nicolas Capens157ba262019-12-10 17:49:14 -05001469RValue<SByte8> SByte8::operator=(RValue<SByte8> rhs)
1470{
1471 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001472
Nicolas Capens157ba262019-12-10 17:49:14 -05001473 return rhs;
1474}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001475
Nicolas Capens157ba262019-12-10 17:49:14 -05001476RValue<SByte8> SByte8::operator=(const SByte8 &rhs)
1477{
1478 Value *value = rhs.loadValue();
1479 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001480
Nicolas Capens157ba262019-12-10 17:49:14 -05001481 return RValue<SByte8>(value);
1482}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001483
Nicolas Capens157ba262019-12-10 17:49:14 -05001484RValue<SByte8> SByte8::operator=(const Reference<SByte8> &rhs)
1485{
1486 Value *value = rhs.loadValue();
1487 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001488
Nicolas Capens157ba262019-12-10 17:49:14 -05001489 return RValue<SByte8>(value);
1490}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001491
Nicolas Capens157ba262019-12-10 17:49:14 -05001492RValue<SByte8> operator+(RValue<SByte8> lhs, RValue<SByte8> rhs)
1493{
1494 return RValue<SByte8>(Nucleus::createAdd(lhs.value, rhs.value));
1495}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001496
Nicolas Capens157ba262019-12-10 17:49:14 -05001497RValue<SByte8> operator-(RValue<SByte8> lhs, RValue<SByte8> rhs)
1498{
1499 return RValue<SByte8>(Nucleus::createSub(lhs.value, rhs.value));
1500}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001501
1502// RValue<SByte8> operator*(RValue<SByte8> lhs, RValue<SByte8> rhs)
1503// {
1504// return RValue<SByte8>(Nucleus::createMul(lhs.value, rhs.value));
1505// }
1506
1507// RValue<SByte8> operator/(RValue<SByte8> lhs, RValue<SByte8> rhs)
1508// {
1509// return RValue<SByte8>(Nucleus::createSDiv(lhs.value, rhs.value));
1510// }
1511
1512// RValue<SByte8> operator%(RValue<SByte8> lhs, RValue<SByte8> rhs)
1513// {
1514// return RValue<SByte8>(Nucleus::createSRem(lhs.value, rhs.value));
1515// }
1516
Nicolas Capens157ba262019-12-10 17:49:14 -05001517RValue<SByte8> operator&(RValue<SByte8> lhs, RValue<SByte8> rhs)
1518{
1519 return RValue<SByte8>(Nucleus::createAnd(lhs.value, rhs.value));
1520}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001521
Nicolas Capens157ba262019-12-10 17:49:14 -05001522RValue<SByte8> operator|(RValue<SByte8> lhs, RValue<SByte8> rhs)
1523{
1524 return RValue<SByte8>(Nucleus::createOr(lhs.value, rhs.value));
1525}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001526
Nicolas Capens157ba262019-12-10 17:49:14 -05001527RValue<SByte8> operator^(RValue<SByte8> lhs, RValue<SByte8> rhs)
1528{
1529 return RValue<SByte8>(Nucleus::createXor(lhs.value, rhs.value));
1530}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001531
1532// RValue<SByte8> operator<<(RValue<SByte8> lhs, unsigned char rhs)
1533// {
1534// return RValue<SByte8>(Nucleus::createShl(lhs.value, rhs.value));
1535// }
1536
1537// RValue<SByte8> operator>>(RValue<SByte8> lhs, unsigned char rhs)
1538// {
1539// return RValue<SByte8>(Nucleus::createAShr(lhs.value, rhs.value));
1540// }
1541
Nicolas Capens157ba262019-12-10 17:49:14 -05001542RValue<SByte8> operator+=(SByte8 &lhs, RValue<SByte8> rhs)
1543{
1544 return lhs = lhs + rhs;
1545}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001546
Nicolas Capens157ba262019-12-10 17:49:14 -05001547RValue<SByte8> operator-=(SByte8 &lhs, RValue<SByte8> rhs)
1548{
1549 return lhs = lhs - rhs;
1550}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001551
1552// RValue<SByte8> operator*=(SByte8 &lhs, RValue<SByte8> rhs)
1553// {
1554// return lhs = lhs * rhs;
1555// }
1556
1557// RValue<SByte8> operator/=(SByte8 &lhs, RValue<SByte8> rhs)
1558// {
1559// return lhs = lhs / rhs;
1560// }
1561
1562// RValue<SByte8> operator%=(SByte8 &lhs, RValue<SByte8> rhs)
1563// {
1564// return lhs = lhs % rhs;
1565// }
1566
Nicolas Capens157ba262019-12-10 17:49:14 -05001567RValue<SByte8> operator&=(SByte8 &lhs, RValue<SByte8> rhs)
1568{
1569 return lhs = lhs & rhs;
1570}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001571
Nicolas Capens157ba262019-12-10 17:49:14 -05001572RValue<SByte8> operator|=(SByte8 &lhs, RValue<SByte8> rhs)
1573{
1574 return lhs = lhs | rhs;
1575}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001576
Nicolas Capens157ba262019-12-10 17:49:14 -05001577RValue<SByte8> operator^=(SByte8 &lhs, RValue<SByte8> rhs)
1578{
1579 return lhs = lhs ^ rhs;
1580}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001581
1582// RValue<SByte8> operator<<=(SByte8 &lhs, RValue<SByte8> rhs)
1583// {
1584// return lhs = lhs << rhs;
1585// }
1586
1587// RValue<SByte8> operator>>=(SByte8 &lhs, RValue<SByte8> rhs)
1588// {
1589// return lhs = lhs >> rhs;
1590// }
1591
1592// RValue<SByte8> operator+(RValue<SByte8> val)
1593// {
1594// return val;
1595// }
1596
1597// RValue<SByte8> operator-(RValue<SByte8> val)
1598// {
1599// return RValue<SByte8>(Nucleus::createNeg(val.value));
1600// }
1601
Nicolas Capens157ba262019-12-10 17:49:14 -05001602RValue<SByte8> operator~(RValue<SByte8> val)
1603{
1604 return RValue<SByte8>(Nucleus::createNot(val.value));
1605}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001606
Nicolas Capens157ba262019-12-10 17:49:14 -05001607RValue<Short4> UnpackLow(RValue<SByte8> x, RValue<SByte8> y)
1608{
Ben Clayton713b8d32019-12-17 20:37:56 +00001609 int shuffle[16] = { 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23 }; // Real type is v16i8
Nicolas Capens157ba262019-12-10 17:49:14 -05001610 return As<Short4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
1611}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001612
Nicolas Capens157ba262019-12-10 17:49:14 -05001613RValue<Short4> UnpackHigh(RValue<SByte8> x, RValue<SByte8> y)
1614{
Ben Clayton713b8d32019-12-17 20:37:56 +00001615 int shuffle[16] = { 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23 }; // Real type is v16i8
Nicolas Capens157ba262019-12-10 17:49:14 -05001616 auto lowHigh = RValue<Byte16>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
1617 return As<Short4>(Swizzle(As<Int4>(lowHigh), 0x2323));
1618}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001619
Nicolas Capens157ba262019-12-10 17:49:14 -05001620Byte16::Byte16(RValue<Byte16> rhs)
1621{
1622 storeValue(rhs.value);
1623}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001624
Nicolas Capens157ba262019-12-10 17:49:14 -05001625Byte16::Byte16(const Byte16 &rhs)
1626{
1627 Value *value = rhs.loadValue();
1628 storeValue(value);
1629}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001630
Nicolas Capens157ba262019-12-10 17:49:14 -05001631Byte16::Byte16(const Reference<Byte16> &rhs)
1632{
1633 Value *value = rhs.loadValue();
1634 storeValue(value);
1635}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001636
Nicolas Capens157ba262019-12-10 17:49:14 -05001637RValue<Byte16> Byte16::operator=(RValue<Byte16> rhs)
1638{
1639 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001640
Nicolas Capens157ba262019-12-10 17:49:14 -05001641 return rhs;
1642}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001643
Nicolas Capens157ba262019-12-10 17:49:14 -05001644RValue<Byte16> Byte16::operator=(const Byte16 &rhs)
1645{
1646 Value *value = rhs.loadValue();
1647 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001648
Nicolas Capens157ba262019-12-10 17:49:14 -05001649 return RValue<Byte16>(value);
1650}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001651
Nicolas Capens157ba262019-12-10 17:49:14 -05001652RValue<Byte16> Byte16::operator=(const Reference<Byte16> &rhs)
1653{
1654 Value *value = rhs.loadValue();
1655 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001656
Nicolas Capens157ba262019-12-10 17:49:14 -05001657 return RValue<Byte16>(value);
1658}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001659
Nicolas Capens157ba262019-12-10 17:49:14 -05001660Short2::Short2(RValue<Short4> cast)
1661{
1662 storeValue(Nucleus::createBitCast(cast.value, getType()));
1663}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001664
Nicolas Capens157ba262019-12-10 17:49:14 -05001665UShort2::UShort2(RValue<UShort4> cast)
1666{
1667 storeValue(Nucleus::createBitCast(cast.value, getType()));
1668}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001669
Nicolas Capens157ba262019-12-10 17:49:14 -05001670Short4::Short4(RValue<Int> cast)
1671{
1672 Value *vector = loadValue();
1673 Value *element = Nucleus::createTrunc(cast.value, Short::getType());
1674 Value *insert = Nucleus::createInsertElement(vector, element, 0);
1675 Value *swizzle = Swizzle(RValue<Short4>(insert), 0x0000).value;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001676
Nicolas Capens157ba262019-12-10 17:49:14 -05001677 storeValue(swizzle);
1678}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001679
1680// Short4::Short4(RValue<Float> cast)
1681// {
1682// }
1683
Nicolas Capens157ba262019-12-10 17:49:14 -05001684Short4::Short4(short xyzw)
1685{
Ben Clayton713b8d32019-12-17 20:37:56 +00001686 int64_t constantVector[4] = { xyzw, xyzw, xyzw, xyzw };
Nicolas Capens157ba262019-12-10 17:49:14 -05001687 storeValue(Nucleus::createConstantVector(constantVector, getType()));
1688}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001689
Nicolas Capens157ba262019-12-10 17:49:14 -05001690Short4::Short4(short x, short y, short z, short w)
1691{
Ben Clayton713b8d32019-12-17 20:37:56 +00001692 int64_t constantVector[4] = { x, y, z, w };
Nicolas Capens157ba262019-12-10 17:49:14 -05001693 storeValue(Nucleus::createConstantVector(constantVector, getType()));
1694}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001695
Nicolas Capens157ba262019-12-10 17:49:14 -05001696Short4::Short4(RValue<Short4> rhs)
1697{
1698 storeValue(rhs.value);
1699}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001700
Nicolas Capens157ba262019-12-10 17:49:14 -05001701Short4::Short4(const Short4 &rhs)
1702{
1703 Value *value = rhs.loadValue();
1704 storeValue(value);
1705}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001706
Nicolas Capens157ba262019-12-10 17:49:14 -05001707Short4::Short4(const Reference<Short4> &rhs)
1708{
1709 Value *value = rhs.loadValue();
1710 storeValue(value);
1711}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001712
Nicolas Capens157ba262019-12-10 17:49:14 -05001713Short4::Short4(RValue<UShort4> rhs)
1714{
1715 storeValue(rhs.value);
1716}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001717
Nicolas Capens157ba262019-12-10 17:49:14 -05001718Short4::Short4(const UShort4 &rhs)
1719{
1720 storeValue(rhs.loadValue());
1721}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001722
Nicolas Capens157ba262019-12-10 17:49:14 -05001723Short4::Short4(const Reference<UShort4> &rhs)
1724{
1725 storeValue(rhs.loadValue());
1726}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001727
Nicolas Capens157ba262019-12-10 17:49:14 -05001728RValue<Short4> Short4::operator=(RValue<Short4> rhs)
1729{
1730 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001731
Nicolas Capens157ba262019-12-10 17:49:14 -05001732 return rhs;
1733}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001734
Nicolas Capens157ba262019-12-10 17:49:14 -05001735RValue<Short4> Short4::operator=(const Short4 &rhs)
1736{
1737 Value *value = rhs.loadValue();
1738 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001739
Nicolas Capens157ba262019-12-10 17:49:14 -05001740 return RValue<Short4>(value);
1741}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001742
Nicolas Capens157ba262019-12-10 17:49:14 -05001743RValue<Short4> Short4::operator=(const Reference<Short4> &rhs)
1744{
1745 Value *value = rhs.loadValue();
1746 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001747
Nicolas Capens157ba262019-12-10 17:49:14 -05001748 return RValue<Short4>(value);
1749}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001750
Nicolas Capens157ba262019-12-10 17:49:14 -05001751RValue<Short4> Short4::operator=(RValue<UShort4> rhs)
1752{
1753 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001754
Nicolas Capens157ba262019-12-10 17:49:14 -05001755 return RValue<Short4>(rhs);
1756}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001757
Nicolas Capens157ba262019-12-10 17:49:14 -05001758RValue<Short4> Short4::operator=(const UShort4 &rhs)
1759{
1760 Value *value = rhs.loadValue();
1761 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001762
Nicolas Capens157ba262019-12-10 17:49:14 -05001763 return RValue<Short4>(value);
1764}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001765
Nicolas Capens157ba262019-12-10 17:49:14 -05001766RValue<Short4> Short4::operator=(const Reference<UShort4> &rhs)
1767{
1768 Value *value = rhs.loadValue();
1769 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001770
Nicolas Capens157ba262019-12-10 17:49:14 -05001771 return RValue<Short4>(value);
1772}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001773
Nicolas Capens157ba262019-12-10 17:49:14 -05001774RValue<Short4> operator+(RValue<Short4> lhs, RValue<Short4> rhs)
1775{
1776 return RValue<Short4>(Nucleus::createAdd(lhs.value, rhs.value));
1777}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001778
Nicolas Capens157ba262019-12-10 17:49:14 -05001779RValue<Short4> operator-(RValue<Short4> lhs, RValue<Short4> rhs)
1780{
1781 return RValue<Short4>(Nucleus::createSub(lhs.value, rhs.value));
1782}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001783
Nicolas Capens157ba262019-12-10 17:49:14 -05001784RValue<Short4> operator*(RValue<Short4> lhs, RValue<Short4> rhs)
1785{
1786 return RValue<Short4>(Nucleus::createMul(lhs.value, rhs.value));
1787}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001788
1789// RValue<Short4> operator/(RValue<Short4> lhs, RValue<Short4> rhs)
1790// {
1791// return RValue<Short4>(Nucleus::createSDiv(lhs.value, rhs.value));
1792// }
1793
1794// RValue<Short4> operator%(RValue<Short4> lhs, RValue<Short4> rhs)
1795// {
1796// return RValue<Short4>(Nucleus::createSRem(lhs.value, rhs.value));
1797// }
1798
Nicolas Capens157ba262019-12-10 17:49:14 -05001799RValue<Short4> operator&(RValue<Short4> lhs, RValue<Short4> rhs)
1800{
1801 return RValue<Short4>(Nucleus::createAnd(lhs.value, rhs.value));
1802}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001803
Nicolas Capens157ba262019-12-10 17:49:14 -05001804RValue<Short4> operator|(RValue<Short4> lhs, RValue<Short4> rhs)
1805{
1806 return RValue<Short4>(Nucleus::createOr(lhs.value, rhs.value));
1807}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001808
Nicolas Capens157ba262019-12-10 17:49:14 -05001809RValue<Short4> operator^(RValue<Short4> lhs, RValue<Short4> rhs)
1810{
1811 return RValue<Short4>(Nucleus::createXor(lhs.value, rhs.value));
1812}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001813
Nicolas Capens157ba262019-12-10 17:49:14 -05001814RValue<Short4> operator+=(Short4 &lhs, RValue<Short4> rhs)
1815{
1816 return lhs = lhs + rhs;
1817}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001818
Nicolas Capens157ba262019-12-10 17:49:14 -05001819RValue<Short4> operator-=(Short4 &lhs, RValue<Short4> rhs)
1820{
1821 return lhs = lhs - rhs;
1822}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001823
Nicolas Capens157ba262019-12-10 17:49:14 -05001824RValue<Short4> operator*=(Short4 &lhs, RValue<Short4> rhs)
1825{
1826 return lhs = lhs * rhs;
1827}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001828
1829// RValue<Short4> operator/=(Short4 &lhs, RValue<Short4> rhs)
1830// {
1831// return lhs = lhs / rhs;
1832// }
1833
1834// RValue<Short4> operator%=(Short4 &lhs, RValue<Short4> rhs)
1835// {
1836// return lhs = lhs % rhs;
1837// }
1838
Nicolas Capens157ba262019-12-10 17:49:14 -05001839RValue<Short4> operator&=(Short4 &lhs, RValue<Short4> rhs)
1840{
1841 return lhs = lhs & rhs;
1842}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001843
Nicolas Capens157ba262019-12-10 17:49:14 -05001844RValue<Short4> operator|=(Short4 &lhs, RValue<Short4> rhs)
1845{
1846 return lhs = lhs | rhs;
1847}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001848
Nicolas Capens157ba262019-12-10 17:49:14 -05001849RValue<Short4> operator^=(Short4 &lhs, RValue<Short4> rhs)
1850{
1851 return lhs = lhs ^ rhs;
1852}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001853
Nicolas Capens157ba262019-12-10 17:49:14 -05001854RValue<Short4> operator<<=(Short4 &lhs, unsigned char rhs)
1855{
1856 return lhs = lhs << rhs;
1857}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001858
Nicolas Capens157ba262019-12-10 17:49:14 -05001859RValue<Short4> operator>>=(Short4 &lhs, unsigned char rhs)
1860{
1861 return lhs = lhs >> rhs;
1862}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001863
1864// RValue<Short4> operator+(RValue<Short4> val)
1865// {
1866// return val;
1867// }
1868
Nicolas Capens157ba262019-12-10 17:49:14 -05001869RValue<Short4> operator-(RValue<Short4> val)
1870{
1871 return RValue<Short4>(Nucleus::createNeg(val.value));
1872}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001873
Nicolas Capens157ba262019-12-10 17:49:14 -05001874RValue<Short4> operator~(RValue<Short4> val)
1875{
1876 return RValue<Short4>(Nucleus::createNot(val.value));
1877}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001878
Nicolas Capens157ba262019-12-10 17:49:14 -05001879RValue<Short4> RoundShort4(RValue<Float4> cast)
1880{
1881 RValue<Int4> int4 = RoundInt(cast);
1882 return As<Short4>(PackSigned(int4, int4));
1883}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001884
Nicolas Capens157ba262019-12-10 17:49:14 -05001885RValue<Int2> UnpackLow(RValue<Short4> x, RValue<Short4> y)
1886{
Ben Clayton713b8d32019-12-17 20:37:56 +00001887 int shuffle[8] = { 0, 8, 1, 9, 2, 10, 3, 11 }; // Real type is v8i16
Nicolas Capens157ba262019-12-10 17:49:14 -05001888 return As<Int2>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
1889}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001890
Nicolas Capens157ba262019-12-10 17:49:14 -05001891RValue<Int2> UnpackHigh(RValue<Short4> x, RValue<Short4> y)
1892{
Ben Clayton713b8d32019-12-17 20:37:56 +00001893 int shuffle[8] = { 0, 8, 1, 9, 2, 10, 3, 11 }; // Real type is v8i16
Nicolas Capens157ba262019-12-10 17:49:14 -05001894 auto lowHigh = RValue<Short8>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
1895 return As<Int2>(Swizzle(As<Int4>(lowHigh), 0x2323));
1896}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001897
Nicolas Capens157ba262019-12-10 17:49:14 -05001898RValue<Short4> Swizzle(RValue<Short4> x, uint16_t select)
1899{
1900 // Real type is v8i16
Ben Clayton713b8d32019-12-17 20:37:56 +00001901 int shuffle[8] = {
Nicolas Capens157ba262019-12-10 17:49:14 -05001902 (select >> 12) & 0x03,
Ben Clayton713b8d32019-12-17 20:37:56 +00001903 (select >> 8) & 0x03,
1904 (select >> 4) & 0x03,
1905 (select >> 0) & 0x03,
Nicolas Capens157ba262019-12-10 17:49:14 -05001906 (select >> 12) & 0x03,
Ben Clayton713b8d32019-12-17 20:37:56 +00001907 (select >> 8) & 0x03,
1908 (select >> 4) & 0x03,
1909 (select >> 0) & 0x03,
Nicolas Capens157ba262019-12-10 17:49:14 -05001910 };
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{
Ben Clayton713b8d32019-12-17 20:37:56 +00001932 int64_t constantVector[4] = { xyzw, xyzw, xyzw, xyzw };
Nicolas Capens157ba262019-12-10 17:49:14 -05001933 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{
Ben Clayton713b8d32019-12-17 20:37:56 +00001938 int64_t constantVector[4] = { x, y, z, w };
Nicolas Capens157ba262019-12-10 17:49:14 -05001939 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{
Ben Clayton713b8d32019-12-17 20:37:56 +00002069 int64_t constantVector[8] = { c, c, c, c, c, c, c, c };
Nicolas Capens157ba262019-12-10 17:49:14 -05002070 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{
Ben Clayton713b8d32019-12-17 20:37:56 +00002075 int64_t constantVector[8] = { c0, c1, c2, c3, c4, c5, c6, c7 };
Nicolas Capens157ba262019-12-10 17:49:14 -05002076 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{
Ben Clayton713b8d32019-12-17 20:37:56 +00002092 int shuffle[8] = { 0, 1, 2, 3, 8, 9, 10, 11 }; // Real type is v8i16
Nicolas Capens157ba262019-12-10 17:49:14 -05002093 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{
Ben Clayton713b8d32019-12-17 20:37:56 +00002140 int64_t constantVector[8] = { c, c, c, c, c, c, c, c };
Nicolas Capens157ba262019-12-10 17:49:14 -05002141 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{
Ben Clayton713b8d32019-12-17 20:37:56 +00002146 int64_t constantVector[8] = { c0, c1, c2, c3, c4, c5, c6, c7 };
Nicolas Capens157ba262019-12-10 17:49:14 -05002147 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{
Ben Clayton713b8d32019-12-17 20:37:56 +00002163 int shuffle[8] = { 0, 1, 2, 3, 8, 9, 10, 11 }; // Real type is v8i16
Nicolas Capens157ba262019-12-10 17:49:14 -05002164 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
Ben Clayton713b8d32019-12-17 20:37:56 +00002596RValue<Long> AddAtomic(RValue<Pointer<Long>> x, RValue<Long> y)
Nicolas Capens157ba262019-12-10 17:49:14 -05002597{
2598 return RValue<Long>(Nucleus::createAtomicAdd(x.value, y.value));
2599}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002600
Ben Clayton713b8d32019-12-17 20:37:56 +00002601RValue<UInt> AddAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
Nicolas Capens157ba262019-12-10 17:49:14 -05002602{
2603 return RValue<UInt>(Nucleus::createAtomicAdd(x.value, y.value, memoryOrder));
2604}
Chris Forbes17813932019-04-18 11:45:54 -07002605
Ben Clayton713b8d32019-12-17 20:37:56 +00002606RValue<UInt> SubAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
Nicolas Capens157ba262019-12-10 17:49:14 -05002607{
2608 return RValue<UInt>(Nucleus::createAtomicSub(x.value, y.value, memoryOrder));
2609}
Chris Forbes707ed992019-04-18 18:17:35 -07002610
Ben Clayton713b8d32019-12-17 20:37:56 +00002611RValue<UInt> AndAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
Nicolas Capens157ba262019-12-10 17:49:14 -05002612{
2613 return RValue<UInt>(Nucleus::createAtomicAnd(x.value, y.value, memoryOrder));
2614}
Chris Forbes17813932019-04-18 11:45:54 -07002615
Ben Clayton713b8d32019-12-17 20:37:56 +00002616RValue<UInt> OrAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
Nicolas Capens157ba262019-12-10 17:49:14 -05002617{
2618 return RValue<UInt>(Nucleus::createAtomicOr(x.value, y.value, memoryOrder));
2619}
Chris Forbes17813932019-04-18 11:45:54 -07002620
Ben Clayton713b8d32019-12-17 20:37:56 +00002621RValue<UInt> XorAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
Nicolas Capens157ba262019-12-10 17:49:14 -05002622{
2623 return RValue<UInt>(Nucleus::createAtomicXor(x.value, y.value, memoryOrder));
2624}
Chris Forbes17813932019-04-18 11:45:54 -07002625
Ben Clayton713b8d32019-12-17 20:37:56 +00002626RValue<UInt> ExchangeAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
Nicolas Capens157ba262019-12-10 17:49:14 -05002627{
2628 return RValue<UInt>(Nucleus::createAtomicExchange(x.value, y.value, memoryOrder));
2629}
Chris Forbes17813932019-04-18 11:45:54 -07002630
Ben Clayton713b8d32019-12-17 20:37:56 +00002631RValue<UInt> CompareExchangeAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, RValue<UInt> compare, std::memory_order memoryOrderEqual, std::memory_order memoryOrderUnequal)
Nicolas Capens157ba262019-12-10 17:49:14 -05002632{
2633 return RValue<UInt>(Nucleus::createAtomicCompareExchange(x.value, y.value, compare.value, memoryOrderEqual, memoryOrderUnequal));
2634}
Chris Forbesa16238d2019-04-18 16:31:54 -07002635
Nicolas Capens157ba262019-12-10 17:49:14 -05002636UInt::UInt(Argument<UInt> argument)
2637{
2638 storeValue(argument.value);
2639}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002640
Nicolas Capens157ba262019-12-10 17:49:14 -05002641UInt::UInt(RValue<UShort> cast)
2642{
2643 Value *integer = Nucleus::createZExt(cast.value, UInt::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002644
Nicolas Capens157ba262019-12-10 17:49:14 -05002645 storeValue(integer);
2646}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002647
Nicolas Capens157ba262019-12-10 17:49:14 -05002648UInt::UInt(RValue<Long> cast)
2649{
2650 Value *integer = Nucleus::createTrunc(cast.value, UInt::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002651
Nicolas Capens157ba262019-12-10 17:49:14 -05002652 storeValue(integer);
2653}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002654
Nicolas Capens157ba262019-12-10 17:49:14 -05002655UInt::UInt(int x)
2656{
2657 storeValue(Nucleus::createConstantInt(x));
2658}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002659
Nicolas Capens157ba262019-12-10 17:49:14 -05002660UInt::UInt(unsigned int x)
2661{
2662 storeValue(Nucleus::createConstantInt(x));
2663}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002664
Nicolas Capens157ba262019-12-10 17:49:14 -05002665UInt::UInt(RValue<UInt> rhs)
2666{
2667 storeValue(rhs.value);
2668}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002669
Nicolas Capens157ba262019-12-10 17:49:14 -05002670UInt::UInt(RValue<Int> rhs)
2671{
2672 storeValue(rhs.value);
2673}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002674
Nicolas Capens157ba262019-12-10 17:49:14 -05002675UInt::UInt(const UInt &rhs)
2676{
2677 Value *value = rhs.loadValue();
2678 storeValue(value);
2679}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002680
Nicolas Capens157ba262019-12-10 17:49:14 -05002681UInt::UInt(const Reference<UInt> &rhs)
2682{
2683 Value *value = rhs.loadValue();
2684 storeValue(value);
2685}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002686
Nicolas Capens157ba262019-12-10 17:49:14 -05002687UInt::UInt(const Int &rhs)
2688{
2689 Value *value = rhs.loadValue();
2690 storeValue(value);
2691}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002692
Nicolas Capens157ba262019-12-10 17:49:14 -05002693UInt::UInt(const Reference<Int> &rhs)
2694{
2695 Value *value = rhs.loadValue();
2696 storeValue(value);
2697}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002698
Nicolas Capens157ba262019-12-10 17:49:14 -05002699RValue<UInt> UInt::operator=(unsigned int rhs)
2700{
2701 return RValue<UInt>(storeValue(Nucleus::createConstantInt(rhs)));
2702}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002703
Nicolas Capens157ba262019-12-10 17:49:14 -05002704RValue<UInt> UInt::operator=(RValue<UInt> rhs)
2705{
2706 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002707
Nicolas Capens157ba262019-12-10 17:49:14 -05002708 return rhs;
2709}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002710
Nicolas Capens157ba262019-12-10 17:49:14 -05002711RValue<UInt> UInt::operator=(RValue<Int> rhs)
2712{
2713 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002714
Nicolas Capens157ba262019-12-10 17:49:14 -05002715 return RValue<UInt>(rhs);
2716}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002717
Nicolas Capens157ba262019-12-10 17:49:14 -05002718RValue<UInt> UInt::operator=(const UInt &rhs)
2719{
2720 Value *value = rhs.loadValue();
2721 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002722
Nicolas Capens157ba262019-12-10 17:49:14 -05002723 return RValue<UInt>(value);
2724}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002725
Nicolas Capens157ba262019-12-10 17:49:14 -05002726RValue<UInt> UInt::operator=(const Reference<UInt> &rhs)
2727{
2728 Value *value = rhs.loadValue();
2729 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002730
Nicolas Capens157ba262019-12-10 17:49:14 -05002731 return RValue<UInt>(value);
2732}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002733
Nicolas Capens157ba262019-12-10 17:49:14 -05002734RValue<UInt> UInt::operator=(const Int &rhs)
2735{
2736 Value *value = rhs.loadValue();
2737 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002738
Nicolas Capens157ba262019-12-10 17:49:14 -05002739 return RValue<UInt>(value);
2740}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002741
Nicolas Capens157ba262019-12-10 17:49:14 -05002742RValue<UInt> UInt::operator=(const Reference<Int> &rhs)
2743{
2744 Value *value = rhs.loadValue();
2745 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002746
Nicolas Capens157ba262019-12-10 17:49:14 -05002747 return RValue<UInt>(value);
2748}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002749
Nicolas Capens157ba262019-12-10 17:49:14 -05002750RValue<UInt> operator+(RValue<UInt> lhs, RValue<UInt> rhs)
2751{
2752 return RValue<UInt>(Nucleus::createAdd(lhs.value, rhs.value));
2753}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002754
Nicolas Capens157ba262019-12-10 17:49:14 -05002755RValue<UInt> operator-(RValue<UInt> lhs, RValue<UInt> rhs)
2756{
2757 return RValue<UInt>(Nucleus::createSub(lhs.value, rhs.value));
2758}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002759
Nicolas Capens157ba262019-12-10 17:49:14 -05002760RValue<UInt> operator*(RValue<UInt> lhs, RValue<UInt> rhs)
2761{
2762 return RValue<UInt>(Nucleus::createMul(lhs.value, rhs.value));
2763}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002764
Nicolas Capens157ba262019-12-10 17:49:14 -05002765RValue<UInt> operator/(RValue<UInt> lhs, RValue<UInt> rhs)
2766{
2767 return RValue<UInt>(Nucleus::createUDiv(lhs.value, rhs.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::createURem(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::createAnd(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::createOr(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::createXor(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::createShl(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::createLShr(lhs.value, rhs.value));
2798}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002799
Nicolas Capens157ba262019-12-10 17:49:14 -05002800RValue<UInt> operator+=(UInt &lhs, RValue<UInt> rhs)
2801{
2802 return lhs = lhs + rhs;
2803}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002804
Nicolas Capens157ba262019-12-10 17:49:14 -05002805RValue<UInt> operator-=(UInt &lhs, RValue<UInt> rhs)
2806{
2807 return lhs = lhs - rhs;
2808}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002809
Nicolas Capens157ba262019-12-10 17:49:14 -05002810RValue<UInt> operator*=(UInt &lhs, RValue<UInt> rhs)
2811{
2812 return lhs = lhs * rhs;
2813}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002814
Nicolas Capens157ba262019-12-10 17:49:14 -05002815RValue<UInt> operator/=(UInt &lhs, RValue<UInt> rhs)
2816{
2817 return lhs = lhs / rhs;
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+(RValue<UInt> val)
2851{
2852 return val;
2853}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002854
Nicolas Capens157ba262019-12-10 17:49:14 -05002855RValue<UInt> operator-(RValue<UInt> val)
2856{
2857 return RValue<UInt>(Nucleus::createNeg(val.value));
2858}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002859
Nicolas Capens157ba262019-12-10 17:49:14 -05002860RValue<UInt> operator~(RValue<UInt> val)
2861{
2862 return RValue<UInt>(Nucleus::createNot(val.value));
2863}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002864
Nicolas Capens157ba262019-12-10 17:49:14 -05002865RValue<UInt> Max(RValue<UInt> x, RValue<UInt> y)
2866{
2867 return IfThenElse(x > y, x, y);
2868}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002869
Nicolas Capens157ba262019-12-10 17:49:14 -05002870RValue<UInt> Min(RValue<UInt> x, RValue<UInt> y)
2871{
2872 return IfThenElse(x < y, x, y);
2873}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002874
Nicolas Capens157ba262019-12-10 17:49:14 -05002875RValue<UInt> Clamp(RValue<UInt> x, RValue<UInt> min, RValue<UInt> max)
2876{
2877 return Min(Max(x, min), max);
2878}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002879
Nicolas Capens157ba262019-12-10 17:49:14 -05002880RValue<Bool> operator<(RValue<UInt> lhs, RValue<UInt> rhs)
2881{
2882 return RValue<Bool>(Nucleus::createICmpULT(lhs.value, rhs.value));
2883}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002884
Nicolas Capens157ba262019-12-10 17:49:14 -05002885RValue<Bool> operator<=(RValue<UInt> lhs, RValue<UInt> rhs)
2886{
2887 return RValue<Bool>(Nucleus::createICmpULE(lhs.value, rhs.value));
2888}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002889
Nicolas Capens157ba262019-12-10 17:49:14 -05002890RValue<Bool> operator>(RValue<UInt> lhs, RValue<UInt> rhs)
2891{
2892 return RValue<Bool>(Nucleus::createICmpUGT(lhs.value, rhs.value));
2893}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002894
Nicolas Capens157ba262019-12-10 17:49:14 -05002895RValue<Bool> operator>=(RValue<UInt> lhs, RValue<UInt> rhs)
2896{
2897 return RValue<Bool>(Nucleus::createICmpUGE(lhs.value, rhs.value));
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::createICmpNE(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::createICmpEQ(lhs.value, rhs.value));
2908}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002909
Nicolas Capens157ba262019-12-10 17:49:14 -05002910Int2::Int2(RValue<Int4> cast)
2911{
2912 storeValue(Nucleus::createBitCast(cast.value, getType()));
2913}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002914
Nicolas Capens157ba262019-12-10 17:49:14 -05002915Int2::Int2(int x, int y)
2916{
Ben Clayton713b8d32019-12-17 20:37:56 +00002917 int64_t constantVector[2] = { x, y };
Nicolas Capens157ba262019-12-10 17:49:14 -05002918 storeValue(Nucleus::createConstantVector(constantVector, getType()));
2919}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002920
Nicolas Capens157ba262019-12-10 17:49:14 -05002921Int2::Int2(RValue<Int2> rhs)
2922{
2923 storeValue(rhs.value);
2924}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002925
Nicolas Capens157ba262019-12-10 17:49:14 -05002926Int2::Int2(const Int2 &rhs)
2927{
2928 Value *value = rhs.loadValue();
2929 storeValue(value);
2930}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002931
Nicolas Capens157ba262019-12-10 17:49:14 -05002932Int2::Int2(const Reference<Int2> &rhs)
2933{
2934 Value *value = rhs.loadValue();
2935 storeValue(value);
2936}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002937
Nicolas Capens157ba262019-12-10 17:49:14 -05002938Int2::Int2(RValue<Int> lo, RValue<Int> hi)
2939{
Ben Clayton713b8d32019-12-17 20:37:56 +00002940 int shuffle[4] = { 0, 4, 1, 5 };
Nicolas Capens157ba262019-12-10 17:49:14 -05002941 Value *packed = Nucleus::createShuffleVector(Int4(lo).loadValue(), Int4(hi).loadValue(), shuffle);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002942
Nicolas Capens157ba262019-12-10 17:49:14 -05002943 storeValue(Nucleus::createBitCast(packed, Int2::getType()));
2944}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002945
Nicolas Capens157ba262019-12-10 17:49:14 -05002946RValue<Int2> Int2::operator=(RValue<Int2> rhs)
2947{
2948 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002949
Nicolas Capens157ba262019-12-10 17:49:14 -05002950 return rhs;
2951}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002952
Nicolas Capens157ba262019-12-10 17:49:14 -05002953RValue<Int2> Int2::operator=(const Int2 &rhs)
2954{
2955 Value *value = rhs.loadValue();
2956 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002957
Nicolas Capens157ba262019-12-10 17:49:14 -05002958 return RValue<Int2>(value);
2959}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002960
Nicolas Capens157ba262019-12-10 17:49:14 -05002961RValue<Int2> Int2::operator=(const Reference<Int2> &rhs)
2962{
2963 Value *value = rhs.loadValue();
2964 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002965
Nicolas Capens157ba262019-12-10 17:49:14 -05002966 return RValue<Int2>(value);
2967}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002968
Nicolas Capens157ba262019-12-10 17:49:14 -05002969RValue<Int2> operator+(RValue<Int2> lhs, RValue<Int2> rhs)
2970{
2971 return RValue<Int2>(Nucleus::createAdd(lhs.value, rhs.value));
2972}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002973
Nicolas Capens157ba262019-12-10 17:49:14 -05002974RValue<Int2> operator-(RValue<Int2> lhs, RValue<Int2> rhs)
2975{
2976 return RValue<Int2>(Nucleus::createSub(lhs.value, rhs.value));
2977}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002978
2979// RValue<Int2> operator*(RValue<Int2> lhs, RValue<Int2> rhs)
2980// {
2981// return RValue<Int2>(Nucleus::createMul(lhs.value, rhs.value));
2982// }
2983
2984// RValue<Int2> operator/(RValue<Int2> lhs, RValue<Int2> rhs)
2985// {
2986// return RValue<Int2>(Nucleus::createSDiv(lhs.value, rhs.value));
2987// }
2988
2989// RValue<Int2> operator%(RValue<Int2> lhs, RValue<Int2> rhs)
2990// {
2991// return RValue<Int2>(Nucleus::createSRem(lhs.value, rhs.value));
2992// }
2993
Nicolas Capens157ba262019-12-10 17:49:14 -05002994RValue<Int2> operator&(RValue<Int2> lhs, RValue<Int2> rhs)
2995{
2996 return RValue<Int2>(Nucleus::createAnd(lhs.value, rhs.value));
2997}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002998
Nicolas Capens157ba262019-12-10 17:49:14 -05002999RValue<Int2> operator|(RValue<Int2> lhs, RValue<Int2> rhs)
3000{
3001 return RValue<Int2>(Nucleus::createOr(lhs.value, rhs.value));
3002}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003003
Nicolas Capens157ba262019-12-10 17:49:14 -05003004RValue<Int2> operator^(RValue<Int2> lhs, RValue<Int2> rhs)
3005{
3006 return RValue<Int2>(Nucleus::createXor(lhs.value, rhs.value));
3007}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003008
Nicolas Capens157ba262019-12-10 17:49:14 -05003009RValue<Int2> operator+=(Int2 &lhs, RValue<Int2> rhs)
3010{
3011 return lhs = lhs + rhs;
3012}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003013
Nicolas Capens157ba262019-12-10 17:49:14 -05003014RValue<Int2> operator-=(Int2 &lhs, RValue<Int2> rhs)
3015{
3016 return lhs = lhs - rhs;
3017}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003018
3019// RValue<Int2> operator*=(Int2 &lhs, RValue<Int2> rhs)
3020// {
3021// return lhs = lhs * rhs;
3022// }
3023
3024// RValue<Int2> operator/=(Int2 &lhs, RValue<Int2> rhs)
3025// {
3026// return lhs = lhs / rhs;
3027// }
3028
3029// RValue<Int2> operator%=(Int2 &lhs, RValue<Int2> rhs)
3030// {
3031// return lhs = lhs % rhs;
3032// }
3033
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
Nicolas Capens157ba262019-12-10 17:49:14 -05003039RValue<Int2> operator|=(Int2 &lhs, RValue<Int2> rhs)
3040{
3041 return lhs = lhs | rhs;
3042}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003043
Nicolas Capens157ba262019-12-10 17:49:14 -05003044RValue<Int2> operator^=(Int2 &lhs, RValue<Int2> rhs)
3045{
3046 return lhs = lhs ^ rhs;
3047}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003048
Nicolas Capens157ba262019-12-10 17:49:14 -05003049RValue<Int2> operator<<=(Int2 &lhs, unsigned char rhs)
3050{
3051 return lhs = lhs << rhs;
3052}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003053
Nicolas Capens157ba262019-12-10 17:49:14 -05003054RValue<Int2> operator>>=(Int2 &lhs, unsigned char rhs)
3055{
3056 return lhs = lhs >> rhs;
3057}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003058
3059// RValue<Int2> operator+(RValue<Int2> val)
3060// {
3061// return val;
3062// }
3063
3064// RValue<Int2> operator-(RValue<Int2> val)
3065// {
3066// return RValue<Int2>(Nucleus::createNeg(val.value));
3067// }
3068
Nicolas Capens157ba262019-12-10 17:49:14 -05003069RValue<Int2> operator~(RValue<Int2> val)
3070{
3071 return RValue<Int2>(Nucleus::createNot(val.value));
3072}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003073
Nicolas Capens157ba262019-12-10 17:49:14 -05003074RValue<Short4> UnpackLow(RValue<Int2> x, RValue<Int2> y)
3075{
Ben Clayton713b8d32019-12-17 20:37:56 +00003076 int shuffle[4] = { 0, 4, 1, 5 }; // Real type is v4i32
Nicolas Capens157ba262019-12-10 17:49:14 -05003077 return As<Short4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
3078}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003079
Nicolas Capens157ba262019-12-10 17:49:14 -05003080RValue<Short4> UnpackHigh(RValue<Int2> x, RValue<Int2> y)
3081{
Ben Clayton713b8d32019-12-17 20:37:56 +00003082 int shuffle[4] = { 0, 4, 1, 5 }; // Real type is v4i32
Nicolas Capens157ba262019-12-10 17:49:14 -05003083 auto lowHigh = RValue<Int4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
3084 return As<Short4>(Swizzle(lowHigh, 0x2323));
3085}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003086
Nicolas Capens157ba262019-12-10 17:49:14 -05003087RValue<Int> Extract(RValue<Int2> val, int i)
3088{
3089 return RValue<Int>(Nucleus::createExtractElement(val.value, Int::getType(), i));
3090}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003091
Nicolas Capens157ba262019-12-10 17:49:14 -05003092RValue<Int2> Insert(RValue<Int2> val, RValue<Int> element, int i)
3093{
3094 return RValue<Int2>(Nucleus::createInsertElement(val.value, element.value, i));
3095}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003096
Nicolas Capens157ba262019-12-10 17:49:14 -05003097UInt2::UInt2(unsigned int x, unsigned int y)
3098{
Ben Clayton713b8d32019-12-17 20:37:56 +00003099 int64_t constantVector[2] = { x, y };
Nicolas Capens157ba262019-12-10 17:49:14 -05003100 storeValue(Nucleus::createConstantVector(constantVector, getType()));
3101}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003102
Nicolas Capens157ba262019-12-10 17:49:14 -05003103UInt2::UInt2(RValue<UInt2> rhs)
3104{
3105 storeValue(rhs.value);
3106}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003107
Nicolas Capens157ba262019-12-10 17:49:14 -05003108UInt2::UInt2(const UInt2 &rhs)
3109{
3110 Value *value = rhs.loadValue();
3111 storeValue(value);
3112}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003113
Nicolas Capens157ba262019-12-10 17:49:14 -05003114UInt2::UInt2(const Reference<UInt2> &rhs)
3115{
3116 Value *value = rhs.loadValue();
3117 storeValue(value);
3118}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003119
Nicolas Capens157ba262019-12-10 17:49:14 -05003120RValue<UInt2> UInt2::operator=(RValue<UInt2> rhs)
3121{
3122 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003123
Nicolas Capens157ba262019-12-10 17:49:14 -05003124 return rhs;
3125}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003126
Nicolas Capens157ba262019-12-10 17:49:14 -05003127RValue<UInt2> UInt2::operator=(const UInt2 &rhs)
3128{
3129 Value *value = rhs.loadValue();
3130 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003131
Nicolas Capens157ba262019-12-10 17:49:14 -05003132 return RValue<UInt2>(value);
3133}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003134
Nicolas Capens157ba262019-12-10 17:49:14 -05003135RValue<UInt2> UInt2::operator=(const Reference<UInt2> &rhs)
3136{
3137 Value *value = rhs.loadValue();
3138 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003139
Nicolas Capens157ba262019-12-10 17:49:14 -05003140 return RValue<UInt2>(value);
3141}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003142
Nicolas Capens157ba262019-12-10 17:49:14 -05003143RValue<UInt2> operator+(RValue<UInt2> lhs, RValue<UInt2> rhs)
3144{
3145 return RValue<UInt2>(Nucleus::createAdd(lhs.value, rhs.value));
3146}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003147
Nicolas Capens157ba262019-12-10 17:49:14 -05003148RValue<UInt2> operator-(RValue<UInt2> lhs, RValue<UInt2> rhs)
3149{
3150 return RValue<UInt2>(Nucleus::createSub(lhs.value, rhs.value));
3151}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003152
3153// RValue<UInt2> operator*(RValue<UInt2> lhs, RValue<UInt2> rhs)
3154// {
3155// return RValue<UInt2>(Nucleus::createMul(lhs.value, rhs.value));
3156// }
3157
3158// RValue<UInt2> operator/(RValue<UInt2> lhs, RValue<UInt2> rhs)
3159// {
3160// return RValue<UInt2>(Nucleus::createUDiv(lhs.value, rhs.value));
3161// }
3162
3163// RValue<UInt2> operator%(RValue<UInt2> lhs, RValue<UInt2> rhs)
3164// {
3165// return RValue<UInt2>(Nucleus::createURem(lhs.value, rhs.value));
3166// }
3167
Nicolas Capens157ba262019-12-10 17:49:14 -05003168RValue<UInt2> operator&(RValue<UInt2> lhs, RValue<UInt2> rhs)
3169{
3170 return RValue<UInt2>(Nucleus::createAnd(lhs.value, rhs.value));
3171}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003172
Nicolas Capens157ba262019-12-10 17:49:14 -05003173RValue<UInt2> operator|(RValue<UInt2> lhs, RValue<UInt2> rhs)
3174{
3175 return RValue<UInt2>(Nucleus::createOr(lhs.value, rhs.value));
3176}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003177
Nicolas Capens157ba262019-12-10 17:49:14 -05003178RValue<UInt2> operator^(RValue<UInt2> lhs, RValue<UInt2> rhs)
3179{
3180 return RValue<UInt2>(Nucleus::createXor(lhs.value, rhs.value));
3181}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003182
Nicolas Capens157ba262019-12-10 17:49:14 -05003183RValue<UInt2> operator+=(UInt2 &lhs, RValue<UInt2> rhs)
3184{
3185 return lhs = lhs + rhs;
3186}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003187
Nicolas Capens157ba262019-12-10 17:49:14 -05003188RValue<UInt2> operator-=(UInt2 &lhs, RValue<UInt2> rhs)
3189{
3190 return lhs = lhs - rhs;
3191}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003192
3193// RValue<UInt2> operator*=(UInt2 &lhs, RValue<UInt2> rhs)
3194// {
3195// return lhs = lhs * rhs;
3196// }
3197
3198// RValue<UInt2> operator/=(UInt2 &lhs, RValue<UInt2> rhs)
3199// {
3200// return lhs = lhs / rhs;
3201// }
3202
3203// RValue<UInt2> operator%=(UInt2 &lhs, RValue<UInt2> rhs)
3204// {
3205// return lhs = lhs % rhs;
3206// }
3207
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
Nicolas Capens157ba262019-12-10 17:49:14 -05003213RValue<UInt2> operator|=(UInt2 &lhs, RValue<UInt2> rhs)
3214{
3215 return lhs = lhs | rhs;
3216}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003217
Nicolas Capens157ba262019-12-10 17:49:14 -05003218RValue<UInt2> operator^=(UInt2 &lhs, RValue<UInt2> rhs)
3219{
3220 return lhs = lhs ^ rhs;
3221}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003222
Nicolas Capens157ba262019-12-10 17:49:14 -05003223RValue<UInt2> operator<<=(UInt2 &lhs, unsigned char rhs)
3224{
3225 return lhs = lhs << rhs;
3226}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003227
Nicolas Capens157ba262019-12-10 17:49:14 -05003228RValue<UInt2> operator>>=(UInt2 &lhs, unsigned char rhs)
3229{
3230 return lhs = lhs >> rhs;
3231}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003232
3233// RValue<UInt2> operator+(RValue<UInt2> val)
3234// {
3235// return val;
3236// }
3237
3238// RValue<UInt2> operator-(RValue<UInt2> val)
3239// {
3240// return RValue<UInt2>(Nucleus::createNeg(val.value));
3241// }
3242
Nicolas Capens157ba262019-12-10 17:49:14 -05003243RValue<UInt2> operator~(RValue<UInt2> val)
3244{
3245 return RValue<UInt2>(Nucleus::createNot(val.value));
3246}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003247
Nicolas Capens157ba262019-12-10 17:49:14 -05003248RValue<UInt> Extract(RValue<UInt2> val, int i)
3249{
3250 return RValue<UInt>(Nucleus::createExtractElement(val.value, UInt::getType(), i));
3251}
Ben Clayton8ab40532019-05-10 16:23:13 +01003252
Nicolas Capens157ba262019-12-10 17:49:14 -05003253RValue<UInt2> Insert(RValue<UInt2> val, RValue<UInt> element, int i)
3254{
3255 return RValue<UInt2>(Nucleus::createInsertElement(val.value, element.value, i));
3256}
Ben Clayton8ab40532019-05-10 16:23:13 +01003257
Ben Clayton713b8d32019-12-17 20:37:56 +00003258Int4::Int4()
3259 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003260{
3261}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003262
Ben Clayton713b8d32019-12-17 20:37:56 +00003263Int4::Int4(RValue<Float4> cast)
3264 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003265{
3266 Value *xyzw = Nucleus::createFPToSI(cast.value, Int4::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003267
Nicolas Capens157ba262019-12-10 17:49:14 -05003268 storeValue(xyzw);
3269}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003270
Ben Clayton713b8d32019-12-17 20:37:56 +00003271Int4::Int4(int xyzw)
3272 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003273{
3274 constant(xyzw, xyzw, xyzw, xyzw);
3275}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003276
Ben Clayton713b8d32019-12-17 20:37:56 +00003277Int4::Int4(int x, int yzw)
3278 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003279{
3280 constant(x, yzw, yzw, yzw);
3281}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003282
Ben Clayton713b8d32019-12-17 20:37:56 +00003283Int4::Int4(int x, int y, int zw)
3284 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003285{
3286 constant(x, y, zw, zw);
3287}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003288
Ben Clayton713b8d32019-12-17 20:37:56 +00003289Int4::Int4(int x, int y, int z, int w)
3290 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003291{
3292 constant(x, y, z, w);
3293}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003294
Nicolas Capens157ba262019-12-10 17:49:14 -05003295void Int4::constant(int x, int y, int z, int w)
3296{
Ben Clayton713b8d32019-12-17 20:37:56 +00003297 int64_t constantVector[4] = { x, y, z, w };
Nicolas Capens157ba262019-12-10 17:49:14 -05003298 storeValue(Nucleus::createConstantVector(constantVector, getType()));
3299}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003300
Ben Clayton713b8d32019-12-17 20:37:56 +00003301Int4::Int4(RValue<Int4> rhs)
3302 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003303{
3304 storeValue(rhs.value);
3305}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003306
Ben Clayton713b8d32019-12-17 20:37:56 +00003307Int4::Int4(const Int4 &rhs)
3308 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003309{
3310 Value *value = rhs.loadValue();
3311 storeValue(value);
3312}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003313
Ben Clayton713b8d32019-12-17 20:37:56 +00003314Int4::Int4(const Reference<Int4> &rhs)
3315 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003316{
3317 Value *value = rhs.loadValue();
3318 storeValue(value);
3319}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003320
Ben Clayton713b8d32019-12-17 20:37:56 +00003321Int4::Int4(RValue<UInt4> rhs)
3322 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003323{
3324 storeValue(rhs.value);
3325}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003326
Ben Clayton713b8d32019-12-17 20:37:56 +00003327Int4::Int4(const UInt4 &rhs)
3328 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003329{
3330 Value *value = rhs.loadValue();
3331 storeValue(value);
3332}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003333
Ben Clayton713b8d32019-12-17 20:37:56 +00003334Int4::Int4(const Reference<UInt4> &rhs)
3335 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003336{
3337 Value *value = rhs.loadValue();
3338 storeValue(value);
3339}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003340
Ben Clayton713b8d32019-12-17 20:37:56 +00003341Int4::Int4(RValue<Int2> lo, RValue<Int2> hi)
3342 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003343{
Ben Clayton713b8d32019-12-17 20:37:56 +00003344 int shuffle[4] = { 0, 1, 4, 5 }; // Real type is v4i32
Nicolas Capens157ba262019-12-10 17:49:14 -05003345 Value *packed = Nucleus::createShuffleVector(lo.value, hi.value, shuffle);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003346
Nicolas Capens157ba262019-12-10 17:49:14 -05003347 storeValue(packed);
3348}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003349
Ben Clayton713b8d32019-12-17 20:37:56 +00003350Int4::Int4(const Int &rhs)
3351 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003352{
3353 *this = RValue<Int>(rhs.loadValue());
3354}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003355
Ben Clayton713b8d32019-12-17 20:37:56 +00003356Int4::Int4(const Reference<Int> &rhs)
3357 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003358{
3359 *this = RValue<Int>(rhs.loadValue());
3360}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003361
Nicolas Capens157ba262019-12-10 17:49:14 -05003362RValue<Int4> Int4::operator=(RValue<Int4> rhs)
3363{
3364 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003365
Nicolas Capens157ba262019-12-10 17:49:14 -05003366 return rhs;
3367}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003368
Nicolas Capens157ba262019-12-10 17:49:14 -05003369RValue<Int4> Int4::operator=(const Int4 &rhs)
3370{
3371 Value *value = rhs.loadValue();
3372 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003373
Nicolas Capens157ba262019-12-10 17:49:14 -05003374 return RValue<Int4>(value);
3375}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003376
Nicolas Capens157ba262019-12-10 17:49:14 -05003377RValue<Int4> Int4::operator=(const Reference<Int4> &rhs)
3378{
3379 Value *value = rhs.loadValue();
3380 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003381
Nicolas Capens157ba262019-12-10 17:49:14 -05003382 return RValue<Int4>(value);
3383}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003384
Nicolas Capens157ba262019-12-10 17:49:14 -05003385RValue<Int4> operator+(RValue<Int4> lhs, RValue<Int4> rhs)
3386{
3387 return RValue<Int4>(Nucleus::createAdd(lhs.value, rhs.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::createSub(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::createMul(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::createSDiv(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::createSRem(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::createAnd(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::createOr(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::createXor(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::createShl(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::createAShr(lhs.value, rhs.value));
3433}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003434
Nicolas Capens157ba262019-12-10 17:49:14 -05003435RValue<Int4> operator+=(Int4 &lhs, RValue<Int4> rhs)
3436{
3437 return lhs = lhs + rhs;
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
3450// RValue<Int4> operator/=(Int4 &lhs, RValue<Int4> rhs)
3451// {
3452// return lhs = lhs / rhs;
3453// }
3454
3455// RValue<Int4> operator%=(Int4 &lhs, RValue<Int4> rhs)
3456// {
3457// return lhs = lhs % rhs;
3458// }
3459
Nicolas Capens157ba262019-12-10 17:49:14 -05003460RValue<Int4> operator&=(Int4 &lhs, RValue<Int4> rhs)
3461{
3462 return lhs = lhs & rhs;
3463}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003464
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, unsigned char 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+(RValue<Int4> val)
3486{
3487 return val;
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 RValue<Int4>(Nucleus::createNeg(val.value));
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::createNot(val.value));
3498}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003499
Nicolas Capens157ba262019-12-10 17:49:14 -05003500RValue<Int> Extract(RValue<Int4> x, int i)
3501{
3502 return RValue<Int>(Nucleus::createExtractElement(x.value, Int::getType(), i));
3503}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003504
Nicolas Capens157ba262019-12-10 17:49:14 -05003505RValue<Int4> Insert(RValue<Int4> x, RValue<Int> element, int i)
3506{
3507 return RValue<Int4>(Nucleus::createInsertElement(x.value, element.value, i));
3508}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003509
Nicolas Capens157ba262019-12-10 17:49:14 -05003510RValue<Int4> Swizzle(RValue<Int4> x, uint16_t select)
3511{
3512 return RValue<Int4>(createSwizzle4(x.value, select));
3513}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003514
Nicolas Capens157ba262019-12-10 17:49:14 -05003515RValue<Int4> Shuffle(RValue<Int4> x, RValue<Int4> y, unsigned short select)
3516{
Nicolas Capensd95467e2020-01-16 01:44:39 -05003517 return RValue<Int4>(createShuffle4(x.value, y.value, select));
Nicolas Capens157ba262019-12-10 17:49:14 -05003518}
David 'Digit' Turnerb9f03f42019-12-04 19:32:34 +01003519
Ben Clayton713b8d32019-12-17 20:37:56 +00003520UInt4::UInt4()
3521 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003522{
3523}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003524
Ben Clayton713b8d32019-12-17 20:37:56 +00003525UInt4::UInt4(int xyzw)
3526 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003527{
3528 constant(xyzw, xyzw, xyzw, xyzw);
3529}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003530
Ben Clayton713b8d32019-12-17 20:37:56 +00003531UInt4::UInt4(int x, int yzw)
3532 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003533{
3534 constant(x, yzw, yzw, yzw);
3535}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003536
Ben Clayton713b8d32019-12-17 20:37:56 +00003537UInt4::UInt4(int x, int y, int zw)
3538 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003539{
3540 constant(x, y, zw, zw);
3541}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003542
Ben Clayton713b8d32019-12-17 20:37:56 +00003543UInt4::UInt4(int x, int y, int z, int w)
3544 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003545{
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{
Ben Clayton713b8d32019-12-17 20:37:56 +00003551 int64_t constantVector[4] = { x, y, z, w };
Nicolas Capens157ba262019-12-10 17:49:14 -05003552 storeValue(Nucleus::createConstantVector(constantVector, getType()));
3553}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003554
Ben Clayton713b8d32019-12-17 20:37:56 +00003555UInt4::UInt4(RValue<UInt4> rhs)
3556 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003557{
3558 storeValue(rhs.value);
3559}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003560
Ben Clayton713b8d32019-12-17 20:37:56 +00003561UInt4::UInt4(const UInt4 &rhs)
3562 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003563{
3564 Value *value = rhs.loadValue();
3565 storeValue(value);
3566}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003567
Ben Clayton713b8d32019-12-17 20:37:56 +00003568UInt4::UInt4(const Reference<UInt4> &rhs)
3569 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003570{
3571 Value *value = rhs.loadValue();
3572 storeValue(value);
3573}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003574
Ben Clayton713b8d32019-12-17 20:37:56 +00003575UInt4::UInt4(RValue<Int4> rhs)
3576 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003577{
3578 storeValue(rhs.value);
3579}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003580
Ben Clayton713b8d32019-12-17 20:37:56 +00003581UInt4::UInt4(const Int4 &rhs)
3582 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003583{
3584 Value *value = rhs.loadValue();
3585 storeValue(value);
3586}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003587
Ben Clayton713b8d32019-12-17 20:37:56 +00003588UInt4::UInt4(const Reference<Int4> &rhs)
3589 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003590{
3591 Value *value = rhs.loadValue();
3592 storeValue(value);
3593}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003594
Ben Clayton713b8d32019-12-17 20:37:56 +00003595UInt4::UInt4(RValue<UInt2> lo, RValue<UInt2> hi)
3596 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003597{
Ben Clayton713b8d32019-12-17 20:37:56 +00003598 int shuffle[4] = { 0, 1, 4, 5 }; // Real type is v4i32
Nicolas Capens157ba262019-12-10 17:49:14 -05003599 Value *packed = Nucleus::createShuffleVector(lo.value, hi.value, shuffle);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003600
Nicolas Capens157ba262019-12-10 17:49:14 -05003601 storeValue(packed);
3602}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003603
Ben Clayton713b8d32019-12-17 20:37:56 +00003604UInt4::UInt4(const UInt &rhs)
3605 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003606{
3607 *this = RValue<UInt>(rhs.loadValue());
3608}
Ben Clayton88816fa2019-05-15 17:08:14 +01003609
Ben Clayton713b8d32019-12-17 20:37:56 +00003610UInt4::UInt4(const Reference<UInt> &rhs)
3611 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003612{
3613 *this = RValue<UInt>(rhs.loadValue());
3614}
Ben Clayton88816fa2019-05-15 17:08:14 +01003615
Nicolas Capens157ba262019-12-10 17:49:14 -05003616RValue<UInt4> UInt4::operator=(RValue<UInt4> rhs)
3617{
3618 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003619
Nicolas Capens157ba262019-12-10 17:49:14 -05003620 return rhs;
3621}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003622
Nicolas Capens157ba262019-12-10 17:49:14 -05003623RValue<UInt4> UInt4::operator=(const UInt4 &rhs)
3624{
3625 Value *value = rhs.loadValue();
3626 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003627
Nicolas Capens157ba262019-12-10 17:49:14 -05003628 return RValue<UInt4>(value);
3629}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003630
Nicolas Capens157ba262019-12-10 17:49:14 -05003631RValue<UInt4> UInt4::operator=(const Reference<UInt4> &rhs)
3632{
3633 Value *value = rhs.loadValue();
3634 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003635
Nicolas Capens157ba262019-12-10 17:49:14 -05003636 return RValue<UInt4>(value);
3637}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003638
Nicolas Capens157ba262019-12-10 17:49:14 -05003639RValue<UInt4> operator+(RValue<UInt4> lhs, RValue<UInt4> rhs)
3640{
3641 return RValue<UInt4>(Nucleus::createAdd(lhs.value, rhs.value));
3642}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003643
Nicolas Capens157ba262019-12-10 17:49:14 -05003644RValue<UInt4> operator-(RValue<UInt4> lhs, RValue<UInt4> rhs)
3645{
3646 return RValue<UInt4>(Nucleus::createSub(lhs.value, rhs.value));
3647}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003648
Nicolas Capens157ba262019-12-10 17:49:14 -05003649RValue<UInt4> operator*(RValue<UInt4> lhs, RValue<UInt4> rhs)
3650{
3651 return RValue<UInt4>(Nucleus::createMul(lhs.value, rhs.value));
3652}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003653
Nicolas Capens157ba262019-12-10 17:49:14 -05003654RValue<UInt4> operator/(RValue<UInt4> lhs, RValue<UInt4> rhs)
3655{
3656 return RValue<UInt4>(Nucleus::createUDiv(lhs.value, rhs.value));
3657}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003658
Nicolas Capens157ba262019-12-10 17:49:14 -05003659RValue<UInt4> operator%(RValue<UInt4> lhs, RValue<UInt4> rhs)
3660{
3661 return RValue<UInt4>(Nucleus::createURem(lhs.value, rhs.value));
3662}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003663
Nicolas Capens157ba262019-12-10 17:49:14 -05003664RValue<UInt4> operator&(RValue<UInt4> lhs, RValue<UInt4> rhs)
3665{
3666 return RValue<UInt4>(Nucleus::createAnd(lhs.value, rhs.value));
3667}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003668
Nicolas Capens157ba262019-12-10 17:49:14 -05003669RValue<UInt4> operator|(RValue<UInt4> lhs, RValue<UInt4> rhs)
3670{
3671 return RValue<UInt4>(Nucleus::createOr(lhs.value, rhs.value));
3672}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003673
Nicolas Capens157ba262019-12-10 17:49:14 -05003674RValue<UInt4> operator^(RValue<UInt4> lhs, RValue<UInt4> rhs)
3675{
3676 return RValue<UInt4>(Nucleus::createXor(lhs.value, rhs.value));
3677}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003678
Nicolas Capens157ba262019-12-10 17:49:14 -05003679RValue<UInt4> operator<<(RValue<UInt4> lhs, RValue<UInt4> rhs)
3680{
3681 return RValue<UInt4>(Nucleus::createShl(lhs.value, rhs.value));
3682}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003683
Nicolas Capens157ba262019-12-10 17:49:14 -05003684RValue<UInt4> operator>>(RValue<UInt4> lhs, RValue<UInt4> rhs)
3685{
3686 return RValue<UInt4>(Nucleus::createLShr(lhs.value, rhs.value));
3687}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003688
Nicolas Capens157ba262019-12-10 17:49:14 -05003689RValue<UInt4> operator+=(UInt4 &lhs, RValue<UInt4> rhs)
3690{
3691 return lhs = lhs + rhs;
3692}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003693
Nicolas Capens157ba262019-12-10 17:49:14 -05003694RValue<UInt4> operator-=(UInt4 &lhs, RValue<UInt4> rhs)
3695{
3696 return lhs = lhs - rhs;
3697}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003698
Nicolas Capens157ba262019-12-10 17:49:14 -05003699RValue<UInt4> operator*=(UInt4 &lhs, RValue<UInt4> rhs)
3700{
3701 return lhs = lhs * rhs;
3702}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003703
3704// RValue<UInt4> operator/=(UInt4 &lhs, RValue<UInt4> rhs)
3705// {
3706// return lhs = lhs / rhs;
3707// }
3708
3709// RValue<UInt4> operator%=(UInt4 &lhs, RValue<UInt4> rhs)
3710// {
3711// return lhs = lhs % rhs;
3712// }
3713
Nicolas Capens157ba262019-12-10 17:49:14 -05003714RValue<UInt4> operator&=(UInt4 &lhs, RValue<UInt4> rhs)
3715{
3716 return lhs = lhs & rhs;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003717}
Nicolas Capens157ba262019-12-10 17:49:14 -05003718
3719RValue<UInt4> operator|=(UInt4 &lhs, RValue<UInt4> rhs)
3720{
3721 return lhs = lhs | rhs;
3722}
3723
3724RValue<UInt4> operator^=(UInt4 &lhs, RValue<UInt4> rhs)
3725{
3726 return lhs = lhs ^ rhs;
3727}
3728
3729RValue<UInt4> operator<<=(UInt4 &lhs, unsigned char rhs)
3730{
3731 return lhs = lhs << rhs;
3732}
3733
3734RValue<UInt4> operator>>=(UInt4 &lhs, unsigned char rhs)
3735{
3736 return lhs = lhs >> rhs;
3737}
3738
3739RValue<UInt4> operator+(RValue<UInt4> val)
3740{
3741 return val;
3742}
3743
3744RValue<UInt4> operator-(RValue<UInt4> val)
3745{
3746 return RValue<UInt4>(Nucleus::createNeg(val.value));
3747}
3748
3749RValue<UInt4> operator~(RValue<UInt4> val)
3750{
3751 return RValue<UInt4>(Nucleus::createNot(val.value));
3752}
3753
3754RValue<UInt> Extract(RValue<UInt4> x, int i)
3755{
3756 return RValue<UInt>(Nucleus::createExtractElement(x.value, Int::getType(), i));
3757}
3758
3759RValue<UInt4> Insert(RValue<UInt4> x, RValue<UInt> element, int i)
3760{
3761 return RValue<UInt4>(Nucleus::createInsertElement(x.value, element.value, i));
3762}
3763
3764RValue<UInt4> Swizzle(RValue<UInt4> x, uint16_t select)
3765{
3766 return RValue<UInt4>(createSwizzle4(x.value, select));
3767}
3768
3769RValue<UInt4> Shuffle(RValue<UInt4> x, RValue<UInt4> y, unsigned short select)
3770{
Nicolas Capensd95467e2020-01-16 01:44:39 -05003771 return RValue<UInt4>(createShuffle4(x.value, y.value, select));
Nicolas Capens157ba262019-12-10 17:49:14 -05003772}
3773
3774Half::Half(RValue<Float> cast)
3775{
3776 UInt fp32i = As<UInt>(cast);
3777 UInt abs = fp32i & 0x7FFFFFFF;
Ben Clayton713b8d32019-12-17 20:37:56 +00003778 UShort fp16i((fp32i & 0x80000000) >> 16); // sign
Nicolas Capens157ba262019-12-10 17:49:14 -05003779
Ben Clayton713b8d32019-12-17 20:37:56 +00003780 If(abs > 0x47FFEFFF) // Infinity
Nicolas Capens157ba262019-12-10 17:49:14 -05003781 {
3782 fp16i |= UShort(0x7FFF);
3783 }
3784 Else
3785 {
Ben Clayton713b8d32019-12-17 20:37:56 +00003786 If(abs < 0x38800000) // Denormal
Nicolas Capens157ba262019-12-10 17:49:14 -05003787 {
3788 Int mantissa = (abs & 0x007FFFFF) | 0x00800000;
3789 Int e = 113 - (abs >> 23);
Nicolas Capens60f8c2e2019-12-12 13:40:15 -05003790 abs = IfThenElse(e < 24, (mantissa >> e), Int(0));
Nicolas Capens157ba262019-12-10 17:49:14 -05003791 fp16i |= UShort((abs + 0x00000FFF + ((abs >> 13) & 1)) >> 13);
3792 }
3793 Else
3794 {
3795 fp16i |= UShort((abs + 0xC8000000 + 0x00000FFF + ((abs >> 13) & 1)) >> 13);
3796 }
3797 }
3798
3799 storeValue(fp16i.loadValue());
3800}
3801
3802Float::Float(RValue<Int> cast)
3803{
3804 Value *integer = Nucleus::createSIToFP(cast.value, Float::getType());
3805
3806 storeValue(integer);
3807}
3808
3809Float::Float(RValue<UInt> cast)
3810{
3811 RValue<Float> result = Float(Int(cast & UInt(0x7FFFFFFF))) +
3812 As<Float>((As<Int>(cast) >> 31) & As<Int>(Float(0x80000000u)));
3813
3814 storeValue(result.value);
3815}
3816
3817Float::Float(RValue<Half> cast)
3818{
3819 Int fp16i(As<UShort>(cast));
3820
3821 Int s = (fp16i >> 15) & 0x00000001;
3822 Int e = (fp16i >> 10) & 0x0000001F;
3823 Int m = fp16i & 0x000003FF;
3824
3825 UInt fp32i(s << 31);
3826 If(e == 0)
3827 {
3828 If(m != 0)
3829 {
3830 While((m & 0x00000400) == 0)
3831 {
3832 m <<= 1;
3833 e -= 1;
3834 }
3835
3836 fp32i |= As<UInt>(((e + (127 - 15) + 1) << 23) | ((m & ~0x00000400) << 13));
3837 }
3838 }
3839 Else
3840 {
3841 fp32i |= As<UInt>(((e + (127 - 15)) << 23) | (m << 13));
3842 }
3843
3844 storeValue(As<Float>(fp32i).value);
3845}
3846
3847Float::Float(float x)
3848{
3849 // C++ does not have a way to write an infinite or NaN literal,
3850 // nor does it allow division by zero as a constant expression.
3851 // Thus we should not accept inf or NaN as a Reactor Float constant,
3852 // as this would typically idicate a bug, and avoids undefined
3853 // behavior.
3854 //
3855 // This also prevents the issue of the LLVM JIT only taking double
3856 // values for constructing floating-point constants. During the
3857 // conversion from single-precision to double, a signaling NaN can
3858 // become a quiet NaN, thus altering its bit pattern. Hence this
3859 // assert is also helpful for detecting cases where integers are
3860 // being reinterpreted as float and then bitcast to integer again,
3861 // which does not guarantee preserving the integer value.
3862 //
Nicolas Capense5720882020-01-13 14:10:04 -05003863 // The inifinity() method can be used to obtain positive infinity.
3864 // Should NaN constants be required, methods like quiet_NaN() and
3865 // signaling_NaN() should be added (matching std::numeric_limits).
Nicolas Capens157ba262019-12-10 17:49:14 -05003866 ASSERT(std::isfinite(x));
3867
3868 storeValue(Nucleus::createConstantFloat(x));
3869}
3870
Nicolas Capense5720882020-01-13 14:10:04 -05003871// TODO(b/140302841): Negative infinity can be obtained by using '-infinity()'.
3872// This comes at a minor run-time JIT cost, and the backend may or may not
3873// perform constant folding. This can be optimized by having Reactor perform
3874// the folding, which would still be cheaper than having a capable backend do it.
3875Float Float::infinity()
3876{
3877 Float result;
3878
3879 constexpr double inf = std::numeric_limits<double>::infinity();
3880 result.storeValue(Nucleus::createConstantFloat(inf));
3881
3882 return result;
3883}
3884
Nicolas Capens157ba262019-12-10 17:49:14 -05003885Float::Float(RValue<Float> rhs)
3886{
3887 storeValue(rhs.value);
3888}
3889
3890Float::Float(const Float &rhs)
3891{
3892 Value *value = rhs.loadValue();
3893 storeValue(value);
3894}
3895
3896Float::Float(const Reference<Float> &rhs)
3897{
3898 Value *value = rhs.loadValue();
3899 storeValue(value);
3900}
3901
3902Float::Float(Argument<Float> argument)
3903{
3904 storeValue(argument.value);
3905}
3906
3907RValue<Float> Float::operator=(RValue<Float> rhs)
3908{
3909 storeValue(rhs.value);
3910
3911 return rhs;
3912}
3913
3914RValue<Float> Float::operator=(const Float &rhs)
3915{
3916 Value *value = rhs.loadValue();
3917 storeValue(value);
3918
3919 return RValue<Float>(value);
3920}
3921
3922RValue<Float> Float::operator=(const Reference<Float> &rhs)
3923{
3924 Value *value = rhs.loadValue();
3925 storeValue(value);
3926
3927 return RValue<Float>(value);
3928}
3929
3930RValue<Float> operator+(RValue<Float> lhs, RValue<Float> rhs)
3931{
3932 return RValue<Float>(Nucleus::createFAdd(lhs.value, rhs.value));
3933}
3934
3935RValue<Float> operator-(RValue<Float> lhs, RValue<Float> rhs)
3936{
3937 return RValue<Float>(Nucleus::createFSub(lhs.value, rhs.value));
3938}
3939
3940RValue<Float> operator*(RValue<Float> lhs, RValue<Float> rhs)
3941{
3942 return RValue<Float>(Nucleus::createFMul(lhs.value, rhs.value));
3943}
3944
3945RValue<Float> operator/(RValue<Float> lhs, RValue<Float> rhs)
3946{
3947 return RValue<Float>(Nucleus::createFDiv(lhs.value, rhs.value));
3948}
3949
3950RValue<Float> operator+=(Float &lhs, RValue<Float> rhs)
3951{
3952 return lhs = lhs + rhs;
3953}
3954
3955RValue<Float> operator-=(Float &lhs, RValue<Float> rhs)
3956{
3957 return lhs = lhs - rhs;
3958}
3959
3960RValue<Float> operator*=(Float &lhs, RValue<Float> rhs)
3961{
3962 return lhs = lhs * rhs;
3963}
3964
3965RValue<Float> operator/=(Float &lhs, RValue<Float> rhs)
3966{
3967 return lhs = lhs / rhs;
3968}
3969
3970RValue<Float> operator+(RValue<Float> val)
3971{
3972 return val;
3973}
3974
3975RValue<Float> operator-(RValue<Float> val)
3976{
3977 return RValue<Float>(Nucleus::createFNeg(val.value));
3978}
3979
3980RValue<Bool> operator<(RValue<Float> lhs, RValue<Float> rhs)
3981{
3982 return RValue<Bool>(Nucleus::createFCmpOLT(lhs.value, rhs.value));
3983}
3984
3985RValue<Bool> operator<=(RValue<Float> lhs, RValue<Float> rhs)
3986{
3987 return RValue<Bool>(Nucleus::createFCmpOLE(lhs.value, rhs.value));
3988}
3989
3990RValue<Bool> operator>(RValue<Float> lhs, RValue<Float> rhs)
3991{
3992 return RValue<Bool>(Nucleus::createFCmpOGT(lhs.value, rhs.value));
3993}
3994
3995RValue<Bool> operator>=(RValue<Float> lhs, RValue<Float> rhs)
3996{
3997 return RValue<Bool>(Nucleus::createFCmpOGE(lhs.value, rhs.value));
3998}
3999
4000RValue<Bool> operator!=(RValue<Float> lhs, RValue<Float> rhs)
4001{
4002 return RValue<Bool>(Nucleus::createFCmpONE(lhs.value, rhs.value));
4003}
4004
4005RValue<Bool> operator==(RValue<Float> lhs, RValue<Float> rhs)
4006{
4007 return RValue<Bool>(Nucleus::createFCmpOEQ(lhs.value, rhs.value));
4008}
4009
4010RValue<Float> Abs(RValue<Float> x)
4011{
4012 return IfThenElse(x > 0.0f, x, -x);
4013}
4014
4015RValue<Float> Max(RValue<Float> x, RValue<Float> y)
4016{
4017 return IfThenElse(x > y, x, y);
4018}
4019
4020RValue<Float> Min(RValue<Float> x, RValue<Float> y)
4021{
4022 return IfThenElse(x < y, x, y);
4023}
4024
4025Float2::Float2(RValue<Float4> cast)
4026{
4027 storeValue(Nucleus::createBitCast(cast.value, getType()));
4028}
4029
Ben Clayton713b8d32019-12-17 20:37:56 +00004030Float4::Float4(RValue<Byte4> cast)
4031 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004032{
4033 Value *a = Int4(cast).loadValue();
4034 Value *xyzw = Nucleus::createSIToFP(a, Float4::getType());
4035
4036 storeValue(xyzw);
4037}
4038
Ben Clayton713b8d32019-12-17 20:37:56 +00004039Float4::Float4(RValue<SByte4> cast)
4040 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004041{
4042 Value *a = Int4(cast).loadValue();
4043 Value *xyzw = Nucleus::createSIToFP(a, Float4::getType());
4044
4045 storeValue(xyzw);
4046}
4047
Ben Clayton713b8d32019-12-17 20:37:56 +00004048Float4::Float4(RValue<Short4> cast)
4049 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004050{
4051 Int4 c(cast);
4052 storeValue(Nucleus::createSIToFP(RValue<Int4>(c).value, Float4::getType()));
4053}
4054
Ben Clayton713b8d32019-12-17 20:37:56 +00004055Float4::Float4(RValue<UShort4> cast)
4056 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004057{
4058 Int4 c(cast);
4059 storeValue(Nucleus::createSIToFP(RValue<Int4>(c).value, Float4::getType()));
4060}
4061
Ben Clayton713b8d32019-12-17 20:37:56 +00004062Float4::Float4(RValue<Int4> cast)
4063 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004064{
4065 Value *xyzw = Nucleus::createSIToFP(cast.value, Float4::getType());
4066
4067 storeValue(xyzw);
4068}
4069
Ben Clayton713b8d32019-12-17 20:37:56 +00004070Float4::Float4(RValue<UInt4> cast)
4071 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004072{
4073 RValue<Float4> result = Float4(Int4(cast & UInt4(0x7FFFFFFF))) +
4074 As<Float4>((As<Int4>(cast) >> 31) & As<Int4>(Float4(0x80000000u)));
4075
4076 storeValue(result.value);
4077}
4078
Ben Clayton713b8d32019-12-17 20:37:56 +00004079Float4::Float4()
4080 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004081{
4082}
4083
Ben Clayton713b8d32019-12-17 20:37:56 +00004084Float4::Float4(float xyzw)
4085 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004086{
4087 constant(xyzw, xyzw, xyzw, xyzw);
4088}
4089
Ben Clayton713b8d32019-12-17 20:37:56 +00004090Float4::Float4(float x, float yzw)
4091 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004092{
4093 constant(x, yzw, yzw, yzw);
4094}
4095
Ben Clayton713b8d32019-12-17 20:37:56 +00004096Float4::Float4(float x, float y, float zw)
4097 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004098{
4099 constant(x, y, zw, zw);
4100}
4101
Ben Clayton713b8d32019-12-17 20:37:56 +00004102Float4::Float4(float x, float y, float z, float w)
4103 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004104{
4105 constant(x, y, z, w);
4106}
4107
Nicolas Capense5720882020-01-13 14:10:04 -05004108Float4 Float4::infinity()
Nicolas Capens157ba262019-12-10 17:49:14 -05004109{
4110 Float4 result;
Nicolas Capens157ba262019-12-10 17:49:14 -05004111
Nicolas Capense5720882020-01-13 14:10:04 -05004112 constexpr double inf = std::numeric_limits<double>::infinity();
Ben Clayton713b8d32019-12-17 20:37:56 +00004113 double constantVector[4] = { inf, inf, inf, inf };
Nicolas Capense5720882020-01-13 14:10:04 -05004114 result.storeValue(Nucleus::createConstantVector(constantVector, getType()));
4115
4116 return result;
Nicolas Capens157ba262019-12-10 17:49:14 -05004117}
4118
4119void Float4::constant(float x, float y, float z, float w)
4120{
4121 // See Float(float) constructor for the rationale behind this assert.
4122 ASSERT(std::isfinite(x) && std::isfinite(y) && std::isfinite(z) && std::isfinite(w));
4123
Ben Clayton713b8d32019-12-17 20:37:56 +00004124 double constantVector[4] = { x, y, z, w };
Nicolas Capens157ba262019-12-10 17:49:14 -05004125 storeValue(Nucleus::createConstantVector(constantVector, getType()));
4126}
4127
Ben Clayton713b8d32019-12-17 20:37:56 +00004128Float4::Float4(RValue<Float4> rhs)
4129 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004130{
4131 storeValue(rhs.value);
4132}
4133
Ben Clayton713b8d32019-12-17 20:37:56 +00004134Float4::Float4(const Float4 &rhs)
4135 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004136{
4137 Value *value = rhs.loadValue();
4138 storeValue(value);
4139}
4140
Ben Clayton713b8d32019-12-17 20:37:56 +00004141Float4::Float4(const Reference<Float4> &rhs)
4142 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004143{
4144 Value *value = rhs.loadValue();
4145 storeValue(value);
4146}
4147
Ben Clayton713b8d32019-12-17 20:37:56 +00004148Float4::Float4(const Float &rhs)
4149 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004150{
4151 *this = RValue<Float>(rhs.loadValue());
4152}
4153
Ben Clayton713b8d32019-12-17 20:37:56 +00004154Float4::Float4(const Reference<Float> &rhs)
4155 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004156{
4157 *this = RValue<Float>(rhs.loadValue());
4158}
4159
4160RValue<Float4> Float4::operator=(float x)
4161{
4162 return *this = Float4(x, x, x, x);
4163}
4164
4165RValue<Float4> Float4::operator=(RValue<Float4> rhs)
4166{
4167 storeValue(rhs.value);
4168
4169 return rhs;
4170}
4171
4172RValue<Float4> Float4::operator=(const Float4 &rhs)
4173{
4174 Value *value = rhs.loadValue();
4175 storeValue(value);
4176
4177 return RValue<Float4>(value);
4178}
4179
4180RValue<Float4> Float4::operator=(const Reference<Float4> &rhs)
4181{
4182 Value *value = rhs.loadValue();
4183 storeValue(value);
4184
4185 return RValue<Float4>(value);
4186}
4187
4188RValue<Float4> Float4::operator=(RValue<Float> rhs)
4189{
4190 return *this = Float4(rhs);
4191}
4192
4193RValue<Float4> Float4::operator=(const Float &rhs)
4194{
4195 return *this = Float4(rhs);
4196}
4197
4198RValue<Float4> Float4::operator=(const Reference<Float> &rhs)
4199{
4200 return *this = Float4(rhs);
4201}
4202
4203RValue<Float4> operator+(RValue<Float4> lhs, RValue<Float4> rhs)
4204{
4205 return RValue<Float4>(Nucleus::createFAdd(lhs.value, rhs.value));
4206}
4207
4208RValue<Float4> operator-(RValue<Float4> lhs, RValue<Float4> rhs)
4209{
4210 return RValue<Float4>(Nucleus::createFSub(lhs.value, rhs.value));
4211}
4212
4213RValue<Float4> operator*(RValue<Float4> lhs, RValue<Float4> rhs)
4214{
4215 return RValue<Float4>(Nucleus::createFMul(lhs.value, rhs.value));
4216}
4217
4218RValue<Float4> operator/(RValue<Float4> lhs, RValue<Float4> rhs)
4219{
4220 return RValue<Float4>(Nucleus::createFDiv(lhs.value, rhs.value));
4221}
4222
Nicolas Capens157ba262019-12-10 17:49:14 -05004223RValue<Float4> operator+=(Float4 &lhs, RValue<Float4> rhs)
4224{
4225 return lhs = lhs + rhs;
4226}
4227
4228RValue<Float4> operator-=(Float4 &lhs, RValue<Float4> rhs)
4229{
4230 return lhs = lhs - rhs;
4231}
4232
4233RValue<Float4> operator*=(Float4 &lhs, RValue<Float4> rhs)
4234{
4235 return lhs = lhs * rhs;
4236}
4237
4238RValue<Float4> operator/=(Float4 &lhs, RValue<Float4> rhs)
4239{
4240 return lhs = lhs / rhs;
4241}
4242
4243RValue<Float4> operator%=(Float4 &lhs, RValue<Float4> rhs)
4244{
4245 return lhs = lhs % rhs;
4246}
4247
4248RValue<Float4> operator+(RValue<Float4> val)
4249{
4250 return val;
4251}
4252
4253RValue<Float4> operator-(RValue<Float4> val)
4254{
4255 return RValue<Float4>(Nucleus::createFNeg(val.value));
4256}
4257
4258RValue<Float4> Abs(RValue<Float4> x)
4259{
4260 // TODO: Optimize.
4261 Value *vector = Nucleus::createBitCast(x.value, Int4::getType());
Ben Clayton713b8d32019-12-17 20:37:56 +00004262 int64_t constantVector[4] = { 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF };
Nicolas Capens157ba262019-12-10 17:49:14 -05004263 Value *result = Nucleus::createAnd(vector, Nucleus::createConstantVector(constantVector, Int4::getType()));
4264
4265 return As<Float4>(result);
4266}
4267
4268RValue<Float4> Insert(RValue<Float4> x, RValue<Float> element, int i)
4269{
4270 return RValue<Float4>(Nucleus::createInsertElement(x.value, element.value, i));
4271}
4272
4273RValue<Float> Extract(RValue<Float4> x, int i)
4274{
4275 return RValue<Float>(Nucleus::createExtractElement(x.value, Float::getType(), i));
4276}
4277
4278RValue<Float4> Swizzle(RValue<Float4> x, uint16_t select)
4279{
4280 return RValue<Float4>(createSwizzle4(x.value, select));
4281}
4282
4283RValue<Float4> Shuffle(RValue<Float4> x, RValue<Float4> y, uint16_t select)
4284{
Nicolas Capensd95467e2020-01-16 01:44:39 -05004285 return RValue<Float4>(createShuffle4(x.value, y.value, select));
Nicolas Capens157ba262019-12-10 17:49:14 -05004286}
4287
4288RValue<Float4> ShuffleLowHigh(RValue<Float4> x, RValue<Float4> y, uint16_t imm)
4289{
Ben Clayton713b8d32019-12-17 20:37:56 +00004290 int shuffle[4] = {
Nicolas Capens157ba262019-12-10 17:49:14 -05004291 ((imm >> 12) & 0x03) + 0,
Ben Clayton713b8d32019-12-17 20:37:56 +00004292 ((imm >> 8) & 0x03) + 0,
4293 ((imm >> 4) & 0x03) + 4,
4294 ((imm >> 0) & 0x03) + 4,
Nicolas Capens157ba262019-12-10 17:49:14 -05004295 };
4296
4297 return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
4298}
4299
4300RValue<Float4> UnpackLow(RValue<Float4> x, RValue<Float4> y)
4301{
Ben Clayton713b8d32019-12-17 20:37:56 +00004302 int shuffle[4] = { 0, 4, 1, 5 };
Nicolas Capens157ba262019-12-10 17:49:14 -05004303 return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
4304}
4305
4306RValue<Float4> UnpackHigh(RValue<Float4> x, RValue<Float4> y)
4307{
Ben Clayton713b8d32019-12-17 20:37:56 +00004308 int shuffle[4] = { 2, 6, 3, 7 };
Nicolas Capens157ba262019-12-10 17:49:14 -05004309 return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
4310}
4311
4312RValue<Float4> Mask(Float4 &lhs, RValue<Float4> rhs, uint16_t select)
4313{
4314 Value *vector = lhs.loadValue();
4315 Value *result = createMask4(vector, rhs.value, select);
4316 lhs.storeValue(result);
4317
4318 return RValue<Float4>(result);
4319}
4320
4321RValue<Int4> IsInf(RValue<Float4> x)
4322{
4323 return CmpEQ(As<Int4>(x) & Int4(0x7FFFFFFF), Int4(0x7F800000));
4324}
4325
4326RValue<Int4> IsNan(RValue<Float4> x)
4327{
4328 return ~CmpEQ(x, x);
4329}
4330
4331RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, int offset)
4332{
4333 return lhs + RValue<Int>(Nucleus::createConstantInt(offset));
4334}
4335
4336RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, RValue<Int> offset)
4337{
4338 return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value, Byte::getType(), offset.value, false));
4339}
4340
4341RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, RValue<UInt> offset)
4342{
4343 return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value, Byte::getType(), offset.value, true));
4344}
4345
4346RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, int offset)
4347{
4348 return lhs = lhs + offset;
4349}
4350
4351RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, RValue<Int> offset)
4352{
4353 return lhs = lhs + offset;
4354}
4355
4356RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, RValue<UInt> offset)
4357{
4358 return lhs = lhs + offset;
4359}
4360
4361RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, int offset)
4362{
4363 return lhs + -offset;
4364}
4365
4366RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, RValue<Int> offset)
4367{
4368 return lhs + -offset;
4369}
4370
4371RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, RValue<UInt> offset)
4372{
4373 return lhs + -offset;
4374}
4375
4376RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, int offset)
4377{
4378 return lhs = lhs - offset;
4379}
4380
4381RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, RValue<Int> offset)
4382{
4383 return lhs = lhs - offset;
4384}
4385
4386RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, RValue<UInt> offset)
4387{
4388 return lhs = lhs - offset;
4389}
4390
4391void Return()
4392{
4393 Nucleus::createRetVoid();
4394 // Place any unreachable instructions in an unreferenced block.
4395 Nucleus::setInsertBlock(Nucleus::createBasicBlock());
4396}
4397
4398void branch(RValue<Bool> cmp, BasicBlock *bodyBB, BasicBlock *endBB)
4399{
4400 Nucleus::createCondBr(cmp.value, bodyBB, endBB);
4401 Nucleus::setInsertBlock(bodyBB);
4402}
4403
4404RValue<Float4> MaskedLoad(RValue<Pointer<Float4>> base, RValue<Int4> mask, unsigned int alignment, bool zeroMaskedLanes /* = false */)
4405{
4406 return RValue<Float4>(Nucleus::createMaskedLoad(base.value, Float::getType(), mask.value, alignment, zeroMaskedLanes));
4407}
4408
4409RValue<Int4> MaskedLoad(RValue<Pointer<Int4>> base, RValue<Int4> mask, unsigned int alignment, bool zeroMaskedLanes /* = false */)
4410{
4411 return RValue<Int4>(Nucleus::createMaskedLoad(base.value, Int::getType(), mask.value, alignment, zeroMaskedLanes));
4412}
4413
4414void MaskedStore(RValue<Pointer<Float4>> base, RValue<Float4> val, RValue<Int4> mask, unsigned int alignment)
4415{
4416 Nucleus::createMaskedStore(base.value, val.value, mask.value, alignment);
4417}
4418
4419void MaskedStore(RValue<Pointer<Int4>> base, RValue<Int4> val, RValue<Int4> mask, unsigned int alignment)
4420{
4421 Nucleus::createMaskedStore(base.value, val.value, mask.value, alignment);
4422}
4423
4424void Fence(std::memory_order memoryOrder)
4425{
4426 ASSERT_MSG(memoryOrder == std::memory_order_acquire ||
Ben Clayton713b8d32019-12-17 20:37:56 +00004427 memoryOrder == std::memory_order_release ||
4428 memoryOrder == std::memory_order_acq_rel ||
4429 memoryOrder == std::memory_order_seq_cst,
4430 "Unsupported memoryOrder: %d", int(memoryOrder));
Nicolas Capens157ba262019-12-10 17:49:14 -05004431 Nucleus::createFence(memoryOrder);
4432}
4433
Ben Clayton713b8d32019-12-17 20:37:56 +00004434Bool CToReactor<bool>::cast(bool v)
4435{
4436 return type(v);
4437}
4438Byte CToReactor<uint8_t>::cast(uint8_t v)
4439{
4440 return type(v);
4441}
4442SByte CToReactor<int8_t>::cast(int8_t v)
4443{
4444 return type(v);
4445}
4446Short CToReactor<int16_t>::cast(int16_t v)
4447{
4448 return type(v);
4449}
4450UShort CToReactor<uint16_t>::cast(uint16_t v)
4451{
4452 return type(v);
4453}
4454Int CToReactor<int32_t>::cast(int32_t v)
4455{
4456 return type(v);
4457}
4458UInt CToReactor<uint32_t>::cast(uint32_t v)
4459{
4460 return type(v);
4461}
4462Float CToReactor<float>::cast(float v)
4463{
4464 return type(v);
4465}
4466Float4 CToReactor<float[4]>::cast(float v[4])
4467{
4468 return type(v[0], v[1], v[2], v[3]);
4469}
Nicolas Capens157ba262019-12-10 17:49:14 -05004470
4471// TODO: Long has no constructor that takes a uint64_t
4472// Long CToReactor<uint64_t>::cast(uint64_t v) { return type(v); }
4473
4474} // namespace rr