blob: 8801f2a43d5aaf0cbff914ad495cf32a25a86eec [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 Capens133b87d2020-01-25 16:26:28 -05001253Byte4::Byte4(RValue<UShort4> cast)
1254{
1255 // TODO(b/148379603): Optimize narrowing swizzle.
1256 *this = As<Byte4>(Swizzle(As<Byte8>(cast), 0x0246'0246));
1257}
1258
1259Byte4::Byte4(RValue<Short4> cast)
1260{
1261 // TODO(b/148379603): Optimize narrowing swizzle.
1262 *this = As<Byte4>(Swizzle(As<Byte8>(cast), 0x0246'0246));
1263}
1264
1265Byte4::Byte4(RValue<UInt4> cast)
1266{
1267 // TODO(b/148379603): Optimize narrowing swizzle.
1268 *this = As<Byte4>(Swizzle(As<Byte16>(cast), 0x048C'048C'048C'048C));
1269}
1270
1271Byte4::Byte4(RValue<Int4> cast)
1272{
1273 // TODO(b/148379603): Optimize narrowing swizzle.
1274 *this = As<Byte4>(Swizzle(As<Byte16>(cast), 0x048C'048C'048C'048C));
1275}
1276
1277Byte4::Byte4(RValue<Byte4> rhs)
1278{
1279 storeValue(rhs.value);
1280}
1281
1282Byte4::Byte4(const Byte4 &rhs)
1283{
1284 Value *value = rhs.loadValue();
1285 storeValue(value);
1286}
1287
Nicolas Capens157ba262019-12-10 17:49:14 -05001288Byte4::Byte4(const Reference<Byte4> &rhs)
1289{
1290 Value *value = rhs.loadValue();
1291 storeValue(value);
1292}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001293
Nicolas Capens133b87d2020-01-25 16:26:28 -05001294RValue<Byte4> Byte4::operator=(RValue<Byte4> rhs)
1295{
1296 storeValue(rhs.value);
1297
1298 return rhs;
1299}
1300
1301RValue<Byte4> Byte4::operator=(const Byte4 &rhs)
1302{
1303 Value *value = rhs.loadValue();
1304 storeValue(value);
1305
1306 return RValue<Byte4>(value);
1307}
1308
Nicolas Capens157ba262019-12-10 17:49:14 -05001309Byte8::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)
1310{
Ben Clayton713b8d32019-12-17 20:37:56 +00001311 int64_t constantVector[8] = { x0, x1, x2, x3, x4, x5, x6, x7 };
Nicolas Capens157ba262019-12-10 17:49:14 -05001312 storeValue(Nucleus::createConstantVector(constantVector, getType()));
1313}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001314
Nicolas Capens157ba262019-12-10 17:49:14 -05001315Byte8::Byte8(RValue<Byte8> rhs)
1316{
1317 storeValue(rhs.value);
1318}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001319
Nicolas Capens157ba262019-12-10 17:49:14 -05001320Byte8::Byte8(const Byte8 &rhs)
1321{
1322 Value *value = rhs.loadValue();
1323 storeValue(value);
1324}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001325
Nicolas Capens157ba262019-12-10 17:49:14 -05001326Byte8::Byte8(const Reference<Byte8> &rhs)
1327{
1328 Value *value = rhs.loadValue();
1329 storeValue(value);
1330}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001331
Nicolas Capens157ba262019-12-10 17:49:14 -05001332RValue<Byte8> Byte8::operator=(RValue<Byte8> rhs)
1333{
1334 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001335
Nicolas Capens157ba262019-12-10 17:49:14 -05001336 return rhs;
1337}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001338
Nicolas Capens157ba262019-12-10 17:49:14 -05001339RValue<Byte8> Byte8::operator=(const Byte8 &rhs)
1340{
1341 Value *value = rhs.loadValue();
1342 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001343
Nicolas Capens157ba262019-12-10 17:49:14 -05001344 return RValue<Byte8>(value);
1345}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001346
Nicolas Capens157ba262019-12-10 17:49:14 -05001347RValue<Byte8> Byte8::operator=(const Reference<Byte8> &rhs)
1348{
1349 Value *value = rhs.loadValue();
1350 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001351
Nicolas Capens157ba262019-12-10 17:49:14 -05001352 return RValue<Byte8>(value);
1353}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001354
Nicolas Capens157ba262019-12-10 17:49:14 -05001355RValue<Byte8> operator+(RValue<Byte8> lhs, RValue<Byte8> rhs)
1356{
1357 return RValue<Byte8>(Nucleus::createAdd(lhs.value, rhs.value));
1358}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001359
Nicolas Capens157ba262019-12-10 17:49:14 -05001360RValue<Byte8> operator-(RValue<Byte8> lhs, RValue<Byte8> rhs)
1361{
1362 return RValue<Byte8>(Nucleus::createSub(lhs.value, rhs.value));
1363}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001364
1365// RValue<Byte8> operator*(RValue<Byte8> lhs, RValue<Byte8> rhs)
1366// {
1367// return RValue<Byte8>(Nucleus::createMul(lhs.value, rhs.value));
1368// }
1369
1370// RValue<Byte8> operator/(RValue<Byte8> lhs, RValue<Byte8> rhs)
1371// {
1372// return RValue<Byte8>(Nucleus::createUDiv(lhs.value, rhs.value));
1373// }
1374
1375// RValue<Byte8> operator%(RValue<Byte8> lhs, RValue<Byte8> rhs)
1376// {
1377// return RValue<Byte8>(Nucleus::createURem(lhs.value, rhs.value));
1378// }
1379
Nicolas Capens157ba262019-12-10 17:49:14 -05001380RValue<Byte8> operator&(RValue<Byte8> lhs, RValue<Byte8> rhs)
1381{
1382 return RValue<Byte8>(Nucleus::createAnd(lhs.value, rhs.value));
1383}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001384
Nicolas Capens157ba262019-12-10 17:49:14 -05001385RValue<Byte8> operator|(RValue<Byte8> lhs, RValue<Byte8> rhs)
1386{
1387 return RValue<Byte8>(Nucleus::createOr(lhs.value, rhs.value));
1388}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001389
Nicolas Capens157ba262019-12-10 17:49:14 -05001390RValue<Byte8> operator^(RValue<Byte8> lhs, RValue<Byte8> rhs)
1391{
1392 return RValue<Byte8>(Nucleus::createXor(lhs.value, rhs.value));
1393}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001394
1395// RValue<Byte8> operator<<(RValue<Byte8> lhs, unsigned char rhs)
1396// {
1397// return RValue<Byte8>(Nucleus::createShl(lhs.value, rhs.value));
1398// }
1399
1400// RValue<Byte8> operator>>(RValue<Byte8> lhs, unsigned char rhs)
1401// {
1402// return RValue<Byte8>(Nucleus::createLShr(lhs.value, rhs.value));
1403// }
1404
Nicolas Capens157ba262019-12-10 17:49:14 -05001405RValue<Byte8> operator+=(Byte8 &lhs, RValue<Byte8> rhs)
1406{
1407 return lhs = lhs + rhs;
1408}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001409
Nicolas Capens157ba262019-12-10 17:49:14 -05001410RValue<Byte8> operator-=(Byte8 &lhs, RValue<Byte8> rhs)
1411{
1412 return lhs = lhs - rhs;
1413}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001414
1415// RValue<Byte8> operator*=(Byte8 &lhs, RValue<Byte8> rhs)
1416// {
1417// return lhs = lhs * rhs;
1418// }
1419
1420// RValue<Byte8> operator/=(Byte8 &lhs, RValue<Byte8> rhs)
1421// {
1422// return lhs = lhs / rhs;
1423// }
1424
1425// RValue<Byte8> operator%=(Byte8 &lhs, RValue<Byte8> rhs)
1426// {
1427// return lhs = lhs % rhs;
1428// }
1429
Nicolas Capens157ba262019-12-10 17:49:14 -05001430RValue<Byte8> operator&=(Byte8 &lhs, RValue<Byte8> rhs)
1431{
1432 return lhs = lhs & rhs;
1433}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001434
Nicolas Capens157ba262019-12-10 17:49:14 -05001435RValue<Byte8> operator|=(Byte8 &lhs, RValue<Byte8> rhs)
1436{
1437 return lhs = lhs | rhs;
1438}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001439
Nicolas Capens157ba262019-12-10 17:49:14 -05001440RValue<Byte8> operator^=(Byte8 &lhs, RValue<Byte8> rhs)
1441{
1442 return lhs = lhs ^ rhs;
1443}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001444
1445// RValue<Byte8> operator<<=(Byte8 &lhs, RValue<Byte8> rhs)
1446// {
1447// return lhs = lhs << rhs;
1448// }
1449
1450// RValue<Byte8> operator>>=(Byte8 &lhs, RValue<Byte8> rhs)
1451// {
1452// return lhs = lhs >> rhs;
1453// }
1454
1455// RValue<Byte8> operator+(RValue<Byte8> val)
1456// {
1457// return val;
1458// }
1459
1460// RValue<Byte8> operator-(RValue<Byte8> val)
1461// {
1462// return RValue<Byte8>(Nucleus::createNeg(val.value));
1463// }
1464
Nicolas Capens157ba262019-12-10 17:49:14 -05001465RValue<Byte8> operator~(RValue<Byte8> val)
1466{
1467 return RValue<Byte8>(Nucleus::createNot(val.value));
1468}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001469
Nicolas Capens133b87d2020-01-25 16:26:28 -05001470RValue<Byte8> Swizzle(RValue<Byte8> x, uint32_t select)
1471{
1472 // Real type is v16i8
1473 // TODO(b/148379603): Optimize narrowing swizzle.
1474 int shuffle[16] = {
1475 static_cast<int>((select >> 28) & 0x07),
1476 static_cast<int>((select >> 24) & 0x07),
1477 static_cast<int>((select >> 20) & 0x07),
1478 static_cast<int>((select >> 16) & 0x07),
1479 static_cast<int>((select >> 12) & 0x07),
1480 static_cast<int>((select >> 8) & 0x07),
1481 static_cast<int>((select >> 4) & 0x07),
1482 static_cast<int>((select >> 0) & 0x07),
1483 static_cast<int>((select >> 28) & 0x07),
1484 static_cast<int>((select >> 24) & 0x07),
1485 static_cast<int>((select >> 20) & 0x07),
1486 static_cast<int>((select >> 16) & 0x07),
1487 static_cast<int>((select >> 12) & 0x07),
1488 static_cast<int>((select >> 8) & 0x07),
1489 static_cast<int>((select >> 4) & 0x07),
1490 static_cast<int>((select >> 0) & 0x07),
1491 };
1492
1493 return As<Byte8>(Nucleus::createShuffleVector(x.value, x.value, shuffle));
1494}
1495
Nicolas Capens157ba262019-12-10 17:49:14 -05001496RValue<Short4> Unpack(RValue<Byte4> x)
1497{
Nicolas Capens133b87d2020-01-25 16:26:28 -05001498 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00001499 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 -05001500 return As<Short4>(Nucleus::createShuffleVector(x.value, x.value, shuffle));
1501}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001502
Nicolas Capens157ba262019-12-10 17:49:14 -05001503RValue<Short4> Unpack(RValue<Byte4> x, RValue<Byte4> y)
1504{
1505 return UnpackLow(As<Byte8>(x), As<Byte8>(y));
1506}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001507
Nicolas Capens157ba262019-12-10 17:49:14 -05001508RValue<Short4> UnpackLow(RValue<Byte8> x, RValue<Byte8> y)
1509{
Nicolas Capens133b87d2020-01-25 16:26:28 -05001510 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00001511 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 -05001512 return As<Short4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
1513}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001514
Nicolas Capens157ba262019-12-10 17:49:14 -05001515RValue<Short4> UnpackHigh(RValue<Byte8> x, RValue<Byte8> y)
1516{
Nicolas Capens133b87d2020-01-25 16:26:28 -05001517 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00001518 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 -05001519 auto lowHigh = RValue<Byte16>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
1520 return As<Short4>(Swizzle(As<Int4>(lowHigh), 0x2323));
1521}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001522
Nicolas Capens157ba262019-12-10 17:49:14 -05001523SByte8::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)
1524{
Ben Clayton713b8d32019-12-17 20:37:56 +00001525 int64_t constantVector[8] = { x0, x1, x2, x3, x4, x5, x6, x7 };
Nicolas Capens157ba262019-12-10 17:49:14 -05001526 Value *vector = Nucleus::createConstantVector(constantVector, getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001527
Nicolas Capens157ba262019-12-10 17:49:14 -05001528 storeValue(Nucleus::createBitCast(vector, getType()));
1529}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001530
Nicolas Capens157ba262019-12-10 17:49:14 -05001531SByte8::SByte8(RValue<SByte8> rhs)
1532{
1533 storeValue(rhs.value);
1534}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001535
Nicolas Capens157ba262019-12-10 17:49:14 -05001536SByte8::SByte8(const SByte8 &rhs)
1537{
1538 Value *value = rhs.loadValue();
1539 storeValue(value);
1540}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001541
Nicolas Capens157ba262019-12-10 17:49:14 -05001542SByte8::SByte8(const Reference<SByte8> &rhs)
1543{
1544 Value *value = rhs.loadValue();
1545 storeValue(value);
1546}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001547
Nicolas Capens157ba262019-12-10 17:49:14 -05001548RValue<SByte8> SByte8::operator=(RValue<SByte8> rhs)
1549{
1550 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001551
Nicolas Capens157ba262019-12-10 17:49:14 -05001552 return rhs;
1553}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001554
Nicolas Capens157ba262019-12-10 17:49:14 -05001555RValue<SByte8> SByte8::operator=(const SByte8 &rhs)
1556{
1557 Value *value = rhs.loadValue();
1558 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001559
Nicolas Capens157ba262019-12-10 17:49:14 -05001560 return RValue<SByte8>(value);
1561}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001562
Nicolas Capens157ba262019-12-10 17:49:14 -05001563RValue<SByte8> SByte8::operator=(const Reference<SByte8> &rhs)
1564{
1565 Value *value = rhs.loadValue();
1566 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001567
Nicolas Capens157ba262019-12-10 17:49:14 -05001568 return RValue<SByte8>(value);
1569}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001570
Nicolas Capens157ba262019-12-10 17:49:14 -05001571RValue<SByte8> operator+(RValue<SByte8> lhs, RValue<SByte8> rhs)
1572{
1573 return RValue<SByte8>(Nucleus::createAdd(lhs.value, rhs.value));
1574}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001575
Nicolas Capens157ba262019-12-10 17:49:14 -05001576RValue<SByte8> operator-(RValue<SByte8> lhs, RValue<SByte8> rhs)
1577{
1578 return RValue<SByte8>(Nucleus::createSub(lhs.value, rhs.value));
1579}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001580
1581// RValue<SByte8> operator*(RValue<SByte8> lhs, RValue<SByte8> rhs)
1582// {
1583// return RValue<SByte8>(Nucleus::createMul(lhs.value, rhs.value));
1584// }
1585
1586// RValue<SByte8> operator/(RValue<SByte8> lhs, RValue<SByte8> rhs)
1587// {
1588// return RValue<SByte8>(Nucleus::createSDiv(lhs.value, rhs.value));
1589// }
1590
1591// RValue<SByte8> operator%(RValue<SByte8> lhs, RValue<SByte8> rhs)
1592// {
1593// return RValue<SByte8>(Nucleus::createSRem(lhs.value, rhs.value));
1594// }
1595
Nicolas Capens157ba262019-12-10 17:49:14 -05001596RValue<SByte8> operator&(RValue<SByte8> lhs, RValue<SByte8> rhs)
1597{
1598 return RValue<SByte8>(Nucleus::createAnd(lhs.value, rhs.value));
1599}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001600
Nicolas Capens157ba262019-12-10 17:49:14 -05001601RValue<SByte8> operator|(RValue<SByte8> lhs, RValue<SByte8> rhs)
1602{
1603 return RValue<SByte8>(Nucleus::createOr(lhs.value, rhs.value));
1604}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001605
Nicolas Capens157ba262019-12-10 17:49:14 -05001606RValue<SByte8> operator^(RValue<SByte8> lhs, RValue<SByte8> rhs)
1607{
1608 return RValue<SByte8>(Nucleus::createXor(lhs.value, rhs.value));
1609}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001610
1611// RValue<SByte8> operator<<(RValue<SByte8> lhs, unsigned char rhs)
1612// {
1613// return RValue<SByte8>(Nucleus::createShl(lhs.value, rhs.value));
1614// }
1615
1616// RValue<SByte8> operator>>(RValue<SByte8> lhs, unsigned char rhs)
1617// {
1618// return RValue<SByte8>(Nucleus::createAShr(lhs.value, rhs.value));
1619// }
1620
Nicolas Capens157ba262019-12-10 17:49:14 -05001621RValue<SByte8> operator+=(SByte8 &lhs, RValue<SByte8> rhs)
1622{
1623 return lhs = lhs + rhs;
1624}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001625
Nicolas Capens157ba262019-12-10 17:49:14 -05001626RValue<SByte8> operator-=(SByte8 &lhs, RValue<SByte8> rhs)
1627{
1628 return lhs = lhs - rhs;
1629}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001630
1631// RValue<SByte8> operator*=(SByte8 &lhs, RValue<SByte8> rhs)
1632// {
1633// return lhs = lhs * rhs;
1634// }
1635
1636// RValue<SByte8> operator/=(SByte8 &lhs, RValue<SByte8> rhs)
1637// {
1638// return lhs = lhs / rhs;
1639// }
1640
1641// RValue<SByte8> operator%=(SByte8 &lhs, RValue<SByte8> rhs)
1642// {
1643// return lhs = lhs % rhs;
1644// }
1645
Nicolas Capens157ba262019-12-10 17:49:14 -05001646RValue<SByte8> operator&=(SByte8 &lhs, RValue<SByte8> rhs)
1647{
1648 return lhs = lhs & rhs;
1649}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001650
Nicolas Capens157ba262019-12-10 17:49:14 -05001651RValue<SByte8> operator|=(SByte8 &lhs, RValue<SByte8> rhs)
1652{
1653 return lhs = lhs | rhs;
1654}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001655
Nicolas Capens157ba262019-12-10 17:49:14 -05001656RValue<SByte8> operator^=(SByte8 &lhs, RValue<SByte8> rhs)
1657{
1658 return lhs = lhs ^ rhs;
1659}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001660
1661// RValue<SByte8> operator<<=(SByte8 &lhs, RValue<SByte8> rhs)
1662// {
1663// return lhs = lhs << rhs;
1664// }
1665
1666// RValue<SByte8> operator>>=(SByte8 &lhs, RValue<SByte8> rhs)
1667// {
1668// return lhs = lhs >> rhs;
1669// }
1670
1671// RValue<SByte8> operator+(RValue<SByte8> val)
1672// {
1673// return val;
1674// }
1675
1676// RValue<SByte8> operator-(RValue<SByte8> val)
1677// {
1678// return RValue<SByte8>(Nucleus::createNeg(val.value));
1679// }
1680
Nicolas Capens157ba262019-12-10 17:49:14 -05001681RValue<SByte8> operator~(RValue<SByte8> val)
1682{
1683 return RValue<SByte8>(Nucleus::createNot(val.value));
1684}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001685
Nicolas Capens157ba262019-12-10 17:49:14 -05001686RValue<Short4> UnpackLow(RValue<SByte8> x, RValue<SByte8> y)
1687{
Nicolas Capens133b87d2020-01-25 16:26:28 -05001688 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00001689 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 -05001690 return As<Short4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
1691}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001692
Nicolas Capens157ba262019-12-10 17:49:14 -05001693RValue<Short4> UnpackHigh(RValue<SByte8> x, RValue<SByte8> y)
1694{
Nicolas Capens133b87d2020-01-25 16:26:28 -05001695 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00001696 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 -05001697 auto lowHigh = RValue<Byte16>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
1698 return As<Short4>(Swizzle(As<Int4>(lowHigh), 0x2323));
1699}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001700
Nicolas Capens157ba262019-12-10 17:49:14 -05001701Byte16::Byte16(RValue<Byte16> rhs)
1702{
1703 storeValue(rhs.value);
1704}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001705
Nicolas Capens157ba262019-12-10 17:49:14 -05001706Byte16::Byte16(const Byte16 &rhs)
1707{
1708 Value *value = rhs.loadValue();
1709 storeValue(value);
1710}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001711
Nicolas Capens157ba262019-12-10 17:49:14 -05001712Byte16::Byte16(const Reference<Byte16> &rhs)
1713{
1714 Value *value = rhs.loadValue();
1715 storeValue(value);
1716}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001717
Nicolas Capens157ba262019-12-10 17:49:14 -05001718RValue<Byte16> Byte16::operator=(RValue<Byte16> rhs)
1719{
1720 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001721
Nicolas Capens157ba262019-12-10 17:49:14 -05001722 return rhs;
1723}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001724
Nicolas Capens157ba262019-12-10 17:49:14 -05001725RValue<Byte16> Byte16::operator=(const Byte16 &rhs)
1726{
1727 Value *value = rhs.loadValue();
1728 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001729
Nicolas Capens157ba262019-12-10 17:49:14 -05001730 return RValue<Byte16>(value);
1731}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001732
Nicolas Capens157ba262019-12-10 17:49:14 -05001733RValue<Byte16> Byte16::operator=(const Reference<Byte16> &rhs)
1734{
1735 Value *value = rhs.loadValue();
1736 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001737
Nicolas Capens157ba262019-12-10 17:49:14 -05001738 return RValue<Byte16>(value);
1739}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001740
Nicolas Capens133b87d2020-01-25 16:26:28 -05001741RValue<Byte16> Swizzle(RValue<Byte16> x, uint64_t select)
1742{
1743 int shuffle[16] = {
1744 static_cast<int>((select >> 60) & 0x0F),
1745 static_cast<int>((select >> 56) & 0x0F),
1746 static_cast<int>((select >> 52) & 0x0F),
1747 static_cast<int>((select >> 48) & 0x0F),
1748 static_cast<int>((select >> 44) & 0x0F),
1749 static_cast<int>((select >> 40) & 0x0F),
1750 static_cast<int>((select >> 36) & 0x0F),
1751 static_cast<int>((select >> 32) & 0x0F),
1752 static_cast<int>((select >> 28) & 0x0F),
1753 static_cast<int>((select >> 24) & 0x0F),
1754 static_cast<int>((select >> 20) & 0x0F),
1755 static_cast<int>((select >> 16) & 0x0F),
1756 static_cast<int>((select >> 12) & 0x0F),
1757 static_cast<int>((select >> 8) & 0x0F),
1758 static_cast<int>((select >> 4) & 0x0F),
1759 static_cast<int>((select >> 0) & 0x0F),
1760 };
1761
1762 return As<Byte16>(Nucleus::createShuffleVector(x.value, x.value, shuffle));
1763}
1764
Nicolas Capens157ba262019-12-10 17:49:14 -05001765Short2::Short2(RValue<Short4> cast)
1766{
1767 storeValue(Nucleus::createBitCast(cast.value, getType()));
1768}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001769
Nicolas Capens157ba262019-12-10 17:49:14 -05001770UShort2::UShort2(RValue<UShort4> cast)
1771{
1772 storeValue(Nucleus::createBitCast(cast.value, getType()));
1773}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001774
Nicolas Capens157ba262019-12-10 17:49:14 -05001775Short4::Short4(RValue<Int> cast)
1776{
1777 Value *vector = loadValue();
1778 Value *element = Nucleus::createTrunc(cast.value, Short::getType());
1779 Value *insert = Nucleus::createInsertElement(vector, element, 0);
1780 Value *swizzle = Swizzle(RValue<Short4>(insert), 0x0000).value;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001781
Nicolas Capens157ba262019-12-10 17:49:14 -05001782 storeValue(swizzle);
1783}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001784
1785// Short4::Short4(RValue<Float> cast)
1786// {
1787// }
1788
Nicolas Capens157ba262019-12-10 17:49:14 -05001789Short4::Short4(short xyzw)
1790{
Ben Clayton713b8d32019-12-17 20:37:56 +00001791 int64_t constantVector[4] = { xyzw, xyzw, xyzw, xyzw };
Nicolas Capens157ba262019-12-10 17:49:14 -05001792 storeValue(Nucleus::createConstantVector(constantVector, getType()));
1793}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001794
Nicolas Capens157ba262019-12-10 17:49:14 -05001795Short4::Short4(short x, short y, short z, short w)
1796{
Ben Clayton713b8d32019-12-17 20:37:56 +00001797 int64_t constantVector[4] = { x, y, z, w };
Nicolas Capens157ba262019-12-10 17:49:14 -05001798 storeValue(Nucleus::createConstantVector(constantVector, getType()));
1799}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001800
Nicolas Capens157ba262019-12-10 17:49:14 -05001801Short4::Short4(RValue<Short4> rhs)
1802{
1803 storeValue(rhs.value);
1804}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001805
Nicolas Capens157ba262019-12-10 17:49:14 -05001806Short4::Short4(const Short4 &rhs)
1807{
1808 Value *value = rhs.loadValue();
1809 storeValue(value);
1810}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001811
Nicolas Capens157ba262019-12-10 17:49:14 -05001812Short4::Short4(const Reference<Short4> &rhs)
1813{
1814 Value *value = rhs.loadValue();
1815 storeValue(value);
1816}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001817
Nicolas Capens157ba262019-12-10 17:49:14 -05001818Short4::Short4(RValue<UShort4> rhs)
1819{
1820 storeValue(rhs.value);
1821}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001822
Nicolas Capens157ba262019-12-10 17:49:14 -05001823Short4::Short4(const UShort4 &rhs)
1824{
1825 storeValue(rhs.loadValue());
1826}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001827
Nicolas Capens157ba262019-12-10 17:49:14 -05001828Short4::Short4(const Reference<UShort4> &rhs)
1829{
1830 storeValue(rhs.loadValue());
1831}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001832
Nicolas Capens157ba262019-12-10 17:49:14 -05001833RValue<Short4> Short4::operator=(RValue<Short4> rhs)
1834{
1835 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001836
Nicolas Capens157ba262019-12-10 17:49:14 -05001837 return rhs;
1838}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001839
Nicolas Capens157ba262019-12-10 17:49:14 -05001840RValue<Short4> Short4::operator=(const Short4 &rhs)
1841{
1842 Value *value = rhs.loadValue();
1843 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001844
Nicolas Capens157ba262019-12-10 17:49:14 -05001845 return RValue<Short4>(value);
1846}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001847
Nicolas Capens157ba262019-12-10 17:49:14 -05001848RValue<Short4> Short4::operator=(const Reference<Short4> &rhs)
1849{
1850 Value *value = rhs.loadValue();
1851 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001852
Nicolas Capens157ba262019-12-10 17:49:14 -05001853 return RValue<Short4>(value);
1854}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001855
Nicolas Capens157ba262019-12-10 17:49:14 -05001856RValue<Short4> Short4::operator=(RValue<UShort4> rhs)
1857{
1858 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001859
Nicolas Capens157ba262019-12-10 17:49:14 -05001860 return RValue<Short4>(rhs);
1861}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001862
Nicolas Capens157ba262019-12-10 17:49:14 -05001863RValue<Short4> Short4::operator=(const UShort4 &rhs)
1864{
1865 Value *value = rhs.loadValue();
1866 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001867
Nicolas Capens157ba262019-12-10 17:49:14 -05001868 return RValue<Short4>(value);
1869}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001870
Nicolas Capens157ba262019-12-10 17:49:14 -05001871RValue<Short4> Short4::operator=(const Reference<UShort4> &rhs)
1872{
1873 Value *value = rhs.loadValue();
1874 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001875
Nicolas Capens157ba262019-12-10 17:49:14 -05001876 return RValue<Short4>(value);
1877}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001878
Nicolas Capens157ba262019-12-10 17:49:14 -05001879RValue<Short4> operator+(RValue<Short4> lhs, RValue<Short4> rhs)
1880{
1881 return RValue<Short4>(Nucleus::createAdd(lhs.value, rhs.value));
1882}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001883
Nicolas Capens157ba262019-12-10 17:49:14 -05001884RValue<Short4> operator-(RValue<Short4> lhs, RValue<Short4> rhs)
1885{
1886 return RValue<Short4>(Nucleus::createSub(lhs.value, rhs.value));
1887}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001888
Nicolas Capens157ba262019-12-10 17:49:14 -05001889RValue<Short4> operator*(RValue<Short4> lhs, RValue<Short4> rhs)
1890{
1891 return RValue<Short4>(Nucleus::createMul(lhs.value, rhs.value));
1892}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001893
1894// RValue<Short4> operator/(RValue<Short4> lhs, RValue<Short4> rhs)
1895// {
1896// return RValue<Short4>(Nucleus::createSDiv(lhs.value, rhs.value));
1897// }
1898
1899// RValue<Short4> operator%(RValue<Short4> lhs, RValue<Short4> rhs)
1900// {
1901// return RValue<Short4>(Nucleus::createSRem(lhs.value, rhs.value));
1902// }
1903
Nicolas Capens157ba262019-12-10 17:49:14 -05001904RValue<Short4> operator&(RValue<Short4> lhs, RValue<Short4> rhs)
1905{
1906 return RValue<Short4>(Nucleus::createAnd(lhs.value, rhs.value));
1907}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001908
Nicolas Capens157ba262019-12-10 17:49:14 -05001909RValue<Short4> operator|(RValue<Short4> lhs, RValue<Short4> rhs)
1910{
1911 return RValue<Short4>(Nucleus::createOr(lhs.value, rhs.value));
1912}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001913
Nicolas Capens157ba262019-12-10 17:49:14 -05001914RValue<Short4> operator^(RValue<Short4> lhs, RValue<Short4> rhs)
1915{
1916 return RValue<Short4>(Nucleus::createXor(lhs.value, rhs.value));
1917}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001918
Nicolas Capens157ba262019-12-10 17:49:14 -05001919RValue<Short4> operator+=(Short4 &lhs, RValue<Short4> rhs)
1920{
1921 return lhs = lhs + rhs;
1922}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001923
Nicolas Capens157ba262019-12-10 17:49:14 -05001924RValue<Short4> operator-=(Short4 &lhs, RValue<Short4> rhs)
1925{
1926 return lhs = lhs - rhs;
1927}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001928
Nicolas Capens157ba262019-12-10 17:49:14 -05001929RValue<Short4> operator*=(Short4 &lhs, RValue<Short4> rhs)
1930{
1931 return lhs = lhs * rhs;
1932}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001933
1934// RValue<Short4> operator/=(Short4 &lhs, RValue<Short4> rhs)
1935// {
1936// return lhs = lhs / rhs;
1937// }
1938
1939// RValue<Short4> operator%=(Short4 &lhs, RValue<Short4> rhs)
1940// {
1941// return lhs = lhs % rhs;
1942// }
1943
Nicolas Capens157ba262019-12-10 17:49:14 -05001944RValue<Short4> operator&=(Short4 &lhs, RValue<Short4> rhs)
1945{
1946 return lhs = lhs & rhs;
1947}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001948
Nicolas Capens157ba262019-12-10 17:49:14 -05001949RValue<Short4> operator|=(Short4 &lhs, RValue<Short4> rhs)
1950{
1951 return lhs = lhs | rhs;
1952}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001953
Nicolas Capens157ba262019-12-10 17:49:14 -05001954RValue<Short4> operator^=(Short4 &lhs, RValue<Short4> rhs)
1955{
1956 return lhs = lhs ^ rhs;
1957}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001958
Nicolas Capens157ba262019-12-10 17:49:14 -05001959RValue<Short4> operator<<=(Short4 &lhs, unsigned char rhs)
1960{
1961 return lhs = lhs << rhs;
1962}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001963
Nicolas Capens157ba262019-12-10 17:49:14 -05001964RValue<Short4> operator>>=(Short4 &lhs, unsigned char rhs)
1965{
1966 return lhs = lhs >> rhs;
1967}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001968
1969// RValue<Short4> operator+(RValue<Short4> val)
1970// {
1971// return val;
1972// }
1973
Nicolas Capens157ba262019-12-10 17:49:14 -05001974RValue<Short4> operator-(RValue<Short4> val)
1975{
1976 return RValue<Short4>(Nucleus::createNeg(val.value));
1977}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001978
Nicolas Capens157ba262019-12-10 17:49:14 -05001979RValue<Short4> operator~(RValue<Short4> val)
1980{
1981 return RValue<Short4>(Nucleus::createNot(val.value));
1982}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001983
Nicolas Capens157ba262019-12-10 17:49:14 -05001984RValue<Short4> RoundShort4(RValue<Float4> cast)
1985{
1986 RValue<Int4> int4 = RoundInt(cast);
1987 return As<Short4>(PackSigned(int4, int4));
1988}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001989
Nicolas Capens157ba262019-12-10 17:49:14 -05001990RValue<Int2> UnpackLow(RValue<Short4> x, RValue<Short4> y)
1991{
Ben Clayton713b8d32019-12-17 20:37:56 +00001992 int shuffle[8] = { 0, 8, 1, 9, 2, 10, 3, 11 }; // Real type is v8i16
Nicolas Capens157ba262019-12-10 17:49:14 -05001993 return As<Int2>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
1994}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001995
Nicolas Capens157ba262019-12-10 17:49:14 -05001996RValue<Int2> UnpackHigh(RValue<Short4> x, RValue<Short4> y)
1997{
Nicolas Capens133b87d2020-01-25 16:26:28 -05001998 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00001999 int shuffle[8] = { 0, 8, 1, 9, 2, 10, 3, 11 }; // Real type is v8i16
Nicolas Capens157ba262019-12-10 17:49:14 -05002000 auto lowHigh = RValue<Short8>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
2001 return As<Int2>(Swizzle(As<Int4>(lowHigh), 0x2323));
2002}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002003
Nicolas Capens157ba262019-12-10 17:49:14 -05002004RValue<Short4> Swizzle(RValue<Short4> x, uint16_t select)
2005{
2006 // Real type is v8i16
Nicolas Capens133b87d2020-01-25 16:26:28 -05002007 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00002008 int shuffle[8] = {
Nicolas Capens157ba262019-12-10 17:49:14 -05002009 (select >> 12) & 0x03,
Ben Clayton713b8d32019-12-17 20:37:56 +00002010 (select >> 8) & 0x03,
2011 (select >> 4) & 0x03,
2012 (select >> 0) & 0x03,
Nicolas Capens157ba262019-12-10 17:49:14 -05002013 (select >> 12) & 0x03,
Ben Clayton713b8d32019-12-17 20:37:56 +00002014 (select >> 8) & 0x03,
2015 (select >> 4) & 0x03,
2016 (select >> 0) & 0x03,
Nicolas Capens157ba262019-12-10 17:49:14 -05002017 };
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002018
Nicolas Capens157ba262019-12-10 17:49:14 -05002019 return As<Short4>(Nucleus::createShuffleVector(x.value, x.value, shuffle));
2020}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002021
Nicolas Capens157ba262019-12-10 17:49:14 -05002022RValue<Short4> Insert(RValue<Short4> val, RValue<Short> element, int i)
2023{
2024 return RValue<Short4>(Nucleus::createInsertElement(val.value, element.value, i));
2025}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002026
Nicolas Capens157ba262019-12-10 17:49:14 -05002027RValue<Short> Extract(RValue<Short4> val, int i)
2028{
2029 return RValue<Short>(Nucleus::createExtractElement(val.value, Short::getType(), i));
2030}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002031
Nicolas Capens157ba262019-12-10 17:49:14 -05002032UShort4::UShort4(RValue<Int4> cast)
2033{
2034 *this = Short4(cast);
2035}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002036
Nicolas Capens157ba262019-12-10 17:49:14 -05002037UShort4::UShort4(unsigned short xyzw)
2038{
Ben Clayton713b8d32019-12-17 20:37:56 +00002039 int64_t constantVector[4] = { xyzw, xyzw, xyzw, xyzw };
Nicolas Capens157ba262019-12-10 17:49:14 -05002040 storeValue(Nucleus::createConstantVector(constantVector, getType()));
2041}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002042
Nicolas Capens157ba262019-12-10 17:49:14 -05002043UShort4::UShort4(unsigned short x, unsigned short y, unsigned short z, unsigned short w)
2044{
Ben Clayton713b8d32019-12-17 20:37:56 +00002045 int64_t constantVector[4] = { x, y, z, w };
Nicolas Capens157ba262019-12-10 17:49:14 -05002046 storeValue(Nucleus::createConstantVector(constantVector, getType()));
2047}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002048
Nicolas Capens157ba262019-12-10 17:49:14 -05002049UShort4::UShort4(RValue<UShort4> rhs)
2050{
2051 storeValue(rhs.value);
2052}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002053
Nicolas Capens157ba262019-12-10 17:49:14 -05002054UShort4::UShort4(const UShort4 &rhs)
2055{
2056 Value *value = rhs.loadValue();
2057 storeValue(value);
2058}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002059
Nicolas Capens157ba262019-12-10 17:49:14 -05002060UShort4::UShort4(const Reference<UShort4> &rhs)
2061{
2062 Value *value = rhs.loadValue();
2063 storeValue(value);
2064}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002065
Nicolas Capens157ba262019-12-10 17:49:14 -05002066UShort4::UShort4(RValue<Short4> rhs)
2067{
2068 storeValue(rhs.value);
2069}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002070
Nicolas Capens157ba262019-12-10 17:49:14 -05002071UShort4::UShort4(const Short4 &rhs)
2072{
2073 Value *value = rhs.loadValue();
2074 storeValue(value);
2075}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002076
Nicolas Capens157ba262019-12-10 17:49:14 -05002077UShort4::UShort4(const Reference<Short4> &rhs)
2078{
2079 Value *value = rhs.loadValue();
2080 storeValue(value);
2081}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002082
Nicolas Capens157ba262019-12-10 17:49:14 -05002083RValue<UShort4> UShort4::operator=(RValue<UShort4> rhs)
2084{
2085 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002086
Nicolas Capens157ba262019-12-10 17:49:14 -05002087 return rhs;
2088}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002089
Nicolas Capens157ba262019-12-10 17:49:14 -05002090RValue<UShort4> UShort4::operator=(const UShort4 &rhs)
2091{
2092 Value *value = rhs.loadValue();
2093 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002094
Nicolas Capens157ba262019-12-10 17:49:14 -05002095 return RValue<UShort4>(value);
2096}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002097
Nicolas Capens157ba262019-12-10 17:49:14 -05002098RValue<UShort4> UShort4::operator=(const Reference<UShort4> &rhs)
2099{
2100 Value *value = rhs.loadValue();
2101 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002102
Nicolas Capens157ba262019-12-10 17:49:14 -05002103 return RValue<UShort4>(value);
2104}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002105
Nicolas Capens157ba262019-12-10 17:49:14 -05002106RValue<UShort4> UShort4::operator=(RValue<Short4> rhs)
2107{
2108 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002109
Nicolas Capens157ba262019-12-10 17:49:14 -05002110 return RValue<UShort4>(rhs);
2111}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002112
Nicolas Capens157ba262019-12-10 17:49:14 -05002113RValue<UShort4> UShort4::operator=(const Short4 &rhs)
2114{
2115 Value *value = rhs.loadValue();
2116 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002117
Nicolas Capens157ba262019-12-10 17:49:14 -05002118 return RValue<UShort4>(value);
2119}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002120
Nicolas Capens157ba262019-12-10 17:49:14 -05002121RValue<UShort4> UShort4::operator=(const Reference<Short4> &rhs)
2122{
2123 Value *value = rhs.loadValue();
2124 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002125
Nicolas Capens157ba262019-12-10 17:49:14 -05002126 return RValue<UShort4>(value);
2127}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002128
Nicolas Capens157ba262019-12-10 17:49:14 -05002129RValue<UShort4> operator+(RValue<UShort4> lhs, RValue<UShort4> rhs)
2130{
2131 return RValue<UShort4>(Nucleus::createAdd(lhs.value, rhs.value));
2132}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002133
Nicolas Capens157ba262019-12-10 17:49:14 -05002134RValue<UShort4> operator-(RValue<UShort4> lhs, RValue<UShort4> rhs)
2135{
2136 return RValue<UShort4>(Nucleus::createSub(lhs.value, rhs.value));
2137}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002138
Nicolas Capens157ba262019-12-10 17:49:14 -05002139RValue<UShort4> operator*(RValue<UShort4> lhs, RValue<UShort4> rhs)
2140{
2141 return RValue<UShort4>(Nucleus::createMul(lhs.value, rhs.value));
2142}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002143
Nicolas Capens157ba262019-12-10 17:49:14 -05002144RValue<UShort4> operator&(RValue<UShort4> lhs, RValue<UShort4> rhs)
2145{
2146 return RValue<UShort4>(Nucleus::createAnd(lhs.value, rhs.value));
2147}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002148
Nicolas Capens157ba262019-12-10 17:49:14 -05002149RValue<UShort4> operator|(RValue<UShort4> lhs, RValue<UShort4> rhs)
2150{
2151 return RValue<UShort4>(Nucleus::createOr(lhs.value, rhs.value));
2152}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002153
Nicolas Capens157ba262019-12-10 17:49:14 -05002154RValue<UShort4> operator^(RValue<UShort4> lhs, RValue<UShort4> rhs)
2155{
2156 return RValue<UShort4>(Nucleus::createXor(lhs.value, rhs.value));
2157}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002158
Nicolas Capens157ba262019-12-10 17:49:14 -05002159RValue<UShort4> operator<<=(UShort4 &lhs, unsigned char rhs)
2160{
2161 return lhs = lhs << rhs;
2162}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002163
Nicolas Capens157ba262019-12-10 17:49:14 -05002164RValue<UShort4> operator>>=(UShort4 &lhs, unsigned char rhs)
2165{
2166 return lhs = lhs >> rhs;
2167}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002168
Nicolas Capens157ba262019-12-10 17:49:14 -05002169RValue<UShort4> operator~(RValue<UShort4> val)
2170{
2171 return RValue<UShort4>(Nucleus::createNot(val.value));
2172}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002173
Nicolas Capens157ba262019-12-10 17:49:14 -05002174Short8::Short8(short c)
2175{
Ben Clayton713b8d32019-12-17 20:37:56 +00002176 int64_t constantVector[8] = { c, c, c, c, c, c, c, c };
Nicolas Capens157ba262019-12-10 17:49:14 -05002177 storeValue(Nucleus::createConstantVector(constantVector, getType()));
2178}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002179
Nicolas Capens157ba262019-12-10 17:49:14 -05002180Short8::Short8(short c0, short c1, short c2, short c3, short c4, short c5, short c6, short c7)
2181{
Ben Clayton713b8d32019-12-17 20:37:56 +00002182 int64_t constantVector[8] = { c0, c1, c2, c3, c4, c5, c6, c7 };
Nicolas Capens157ba262019-12-10 17:49:14 -05002183 storeValue(Nucleus::createConstantVector(constantVector, getType()));
2184}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002185
Nicolas Capens157ba262019-12-10 17:49:14 -05002186Short8::Short8(RValue<Short8> rhs)
2187{
2188 storeValue(rhs.value);
2189}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002190
Nicolas Capens157ba262019-12-10 17:49:14 -05002191Short8::Short8(const Reference<Short8> &rhs)
2192{
2193 Value *value = rhs.loadValue();
2194 storeValue(value);
2195}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002196
Nicolas Capens157ba262019-12-10 17:49:14 -05002197Short8::Short8(RValue<Short4> lo, RValue<Short4> hi)
2198{
Ben Clayton713b8d32019-12-17 20:37:56 +00002199 int shuffle[8] = { 0, 1, 2, 3, 8, 9, 10, 11 }; // Real type is v8i16
Nicolas Capens157ba262019-12-10 17:49:14 -05002200 Value *packed = Nucleus::createShuffleVector(lo.value, hi.value, shuffle);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002201
Nicolas Capens157ba262019-12-10 17:49:14 -05002202 storeValue(packed);
2203}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002204
Nicolas Capens157ba262019-12-10 17:49:14 -05002205RValue<Short8> Short8::operator=(RValue<Short8> rhs)
2206{
2207 storeValue(rhs.value);
Nicolas Capensf1beca42019-03-26 17:18:57 -04002208
Nicolas Capens157ba262019-12-10 17:49:14 -05002209 return rhs;
2210}
Nicolas Capensf1beca42019-03-26 17:18:57 -04002211
Nicolas Capens157ba262019-12-10 17:49:14 -05002212RValue<Short8> Short8::operator=(const Short8 &rhs)
2213{
2214 Value *value = rhs.loadValue();
2215 storeValue(value);
Nicolas Capensf1beca42019-03-26 17:18:57 -04002216
Nicolas Capens157ba262019-12-10 17:49:14 -05002217 return RValue<Short8>(value);
2218}
Nicolas Capensf1beca42019-03-26 17:18:57 -04002219
Nicolas Capens157ba262019-12-10 17:49:14 -05002220RValue<Short8> Short8::operator=(const Reference<Short8> &rhs)
2221{
2222 Value *value = rhs.loadValue();
2223 storeValue(value);
Nicolas Capensf1beca42019-03-26 17:18:57 -04002224
Nicolas Capens157ba262019-12-10 17:49:14 -05002225 return RValue<Short8>(value);
2226}
Nicolas Capensf1beca42019-03-26 17:18:57 -04002227
Nicolas Capens157ba262019-12-10 17:49:14 -05002228RValue<Short8> operator+(RValue<Short8> lhs, RValue<Short8> rhs)
2229{
2230 return RValue<Short8>(Nucleus::createAdd(lhs.value, rhs.value));
2231}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002232
Nicolas Capens157ba262019-12-10 17:49:14 -05002233RValue<Short8> operator&(RValue<Short8> lhs, RValue<Short8> rhs)
2234{
2235 return RValue<Short8>(Nucleus::createAnd(lhs.value, rhs.value));
2236}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002237
Nicolas Capens157ba262019-12-10 17:49:14 -05002238RValue<Int4> Abs(RValue<Int4> x)
2239{
2240 // TODO: Optimize.
2241 auto negative = x >> 31;
2242 return (x ^ negative) - negative;
2243}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002244
Nicolas Capens157ba262019-12-10 17:49:14 -05002245UShort8::UShort8(unsigned short c)
2246{
Ben Clayton713b8d32019-12-17 20:37:56 +00002247 int64_t constantVector[8] = { c, c, c, c, c, c, c, c };
Nicolas Capens157ba262019-12-10 17:49:14 -05002248 storeValue(Nucleus::createConstantVector(constantVector, getType()));
2249}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002250
Nicolas Capens157ba262019-12-10 17:49:14 -05002251UShort8::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)
2252{
Ben Clayton713b8d32019-12-17 20:37:56 +00002253 int64_t constantVector[8] = { c0, c1, c2, c3, c4, c5, c6, c7 };
Nicolas Capens157ba262019-12-10 17:49:14 -05002254 storeValue(Nucleus::createConstantVector(constantVector, getType()));
2255}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002256
Nicolas Capens157ba262019-12-10 17:49:14 -05002257UShort8::UShort8(RValue<UShort8> rhs)
2258{
2259 storeValue(rhs.value);
2260}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002261
Nicolas Capens157ba262019-12-10 17:49:14 -05002262UShort8::UShort8(const Reference<UShort8> &rhs)
2263{
2264 Value *value = rhs.loadValue();
2265 storeValue(value);
2266}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002267
Nicolas Capens157ba262019-12-10 17:49:14 -05002268UShort8::UShort8(RValue<UShort4> lo, RValue<UShort4> hi)
2269{
Ben Clayton713b8d32019-12-17 20:37:56 +00002270 int shuffle[8] = { 0, 1, 2, 3, 8, 9, 10, 11 }; // Real type is v8i16
Nicolas Capens157ba262019-12-10 17:49:14 -05002271 Value *packed = Nucleus::createShuffleVector(lo.value, hi.value, shuffle);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002272
Nicolas Capens157ba262019-12-10 17:49:14 -05002273 storeValue(packed);
2274}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002275
Nicolas Capens157ba262019-12-10 17:49:14 -05002276RValue<UShort8> UShort8::operator=(RValue<UShort8> rhs)
2277{
2278 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002279
Nicolas Capens157ba262019-12-10 17:49:14 -05002280 return rhs;
2281}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002282
Nicolas Capens157ba262019-12-10 17:49:14 -05002283RValue<UShort8> UShort8::operator=(const UShort8 &rhs)
2284{
2285 Value *value = rhs.loadValue();
2286 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002287
Nicolas Capens157ba262019-12-10 17:49:14 -05002288 return RValue<UShort8>(value);
2289}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002290
Nicolas Capens157ba262019-12-10 17:49:14 -05002291RValue<UShort8> UShort8::operator=(const Reference<UShort8> &rhs)
2292{
2293 Value *value = rhs.loadValue();
2294 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002295
Nicolas Capens157ba262019-12-10 17:49:14 -05002296 return RValue<UShort8>(value);
2297}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002298
Nicolas Capens157ba262019-12-10 17:49:14 -05002299RValue<UShort8> operator&(RValue<UShort8> lhs, RValue<UShort8> rhs)
2300{
2301 return RValue<UShort8>(Nucleus::createAnd(lhs.value, rhs.value));
2302}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002303
Nicolas Capens157ba262019-12-10 17:49:14 -05002304RValue<UShort8> operator+(RValue<UShort8> lhs, RValue<UShort8> rhs)
2305{
2306 return RValue<UShort8>(Nucleus::createAdd(lhs.value, rhs.value));
2307}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002308
Nicolas Capens157ba262019-12-10 17:49:14 -05002309RValue<UShort8> operator*(RValue<UShort8> lhs, RValue<UShort8> rhs)
2310{
2311 return RValue<UShort8>(Nucleus::createMul(lhs.value, rhs.value));
2312}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002313
Nicolas Capens157ba262019-12-10 17:49:14 -05002314RValue<UShort8> operator+=(UShort8 &lhs, RValue<UShort8> rhs)
2315{
2316 return lhs = lhs + rhs;
2317}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002318
Nicolas Capens157ba262019-12-10 17:49:14 -05002319RValue<UShort8> operator~(RValue<UShort8> val)
2320{
2321 return RValue<UShort8>(Nucleus::createNot(val.value));
2322}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002323
Nicolas Capens133b87d2020-01-25 16:26:28 -05002324RValue<UShort8> Swizzle(RValue<UShort8> x, uint32_t select)
2325{
2326 int swizzle[16] = {
2327 static_cast<int>((select >> 28) & 0x07),
2328 static_cast<int>((select >> 24) & 0x07),
2329 static_cast<int>((select >> 20) & 0x07),
2330 static_cast<int>((select >> 16) & 0x07),
2331 static_cast<int>((select >> 12) & 0x07),
2332 static_cast<int>((select >> 8) & 0x07),
2333 static_cast<int>((select >> 4) & 0x07),
2334 static_cast<int>((select >> 0) & 0x07),
2335 };
2336
2337 return RValue<UShort8>(Nucleus::createShuffleVector(x.value, x.value, swizzle));
2338}
2339
Nicolas Capens157ba262019-12-10 17:49:14 -05002340Int::Int(Argument<Int> argument)
2341{
2342 storeValue(argument.value);
2343}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002344
Nicolas Capens157ba262019-12-10 17:49:14 -05002345Int::Int(RValue<Byte> cast)
2346{
2347 Value *integer = Nucleus::createZExt(cast.value, Int::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002348
Nicolas Capens157ba262019-12-10 17:49:14 -05002349 storeValue(integer);
2350}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002351
Nicolas Capens157ba262019-12-10 17:49:14 -05002352Int::Int(RValue<SByte> cast)
2353{
2354 Value *integer = Nucleus::createSExt(cast.value, Int::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002355
Nicolas Capens157ba262019-12-10 17:49:14 -05002356 storeValue(integer);
2357}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002358
Nicolas Capens157ba262019-12-10 17:49:14 -05002359Int::Int(RValue<Short> cast)
2360{
2361 Value *integer = Nucleus::createSExt(cast.value, Int::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002362
Nicolas Capens157ba262019-12-10 17:49:14 -05002363 storeValue(integer);
2364}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002365
Nicolas Capens157ba262019-12-10 17:49:14 -05002366Int::Int(RValue<UShort> cast)
2367{
2368 Value *integer = Nucleus::createZExt(cast.value, Int::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002369
Nicolas Capens157ba262019-12-10 17:49:14 -05002370 storeValue(integer);
2371}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002372
Nicolas Capens157ba262019-12-10 17:49:14 -05002373Int::Int(RValue<Int2> cast)
2374{
2375 *this = Extract(cast, 0);
2376}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002377
Nicolas Capens157ba262019-12-10 17:49:14 -05002378Int::Int(RValue<Long> cast)
2379{
2380 Value *integer = Nucleus::createTrunc(cast.value, Int::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002381
Nicolas Capens157ba262019-12-10 17:49:14 -05002382 storeValue(integer);
2383}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002384
Nicolas Capens157ba262019-12-10 17:49:14 -05002385Int::Int(RValue<Float> cast)
2386{
2387 Value *integer = Nucleus::createFPToSI(cast.value, Int::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002388
Nicolas Capens157ba262019-12-10 17:49:14 -05002389 storeValue(integer);
2390}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002391
Nicolas Capens157ba262019-12-10 17:49:14 -05002392Int::Int(int x)
2393{
2394 storeValue(Nucleus::createConstantInt(x));
2395}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002396
Nicolas Capens157ba262019-12-10 17:49:14 -05002397Int::Int(RValue<Int> rhs)
2398{
2399 storeValue(rhs.value);
2400}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002401
Nicolas Capens157ba262019-12-10 17:49:14 -05002402Int::Int(RValue<UInt> rhs)
2403{
2404 storeValue(rhs.value);
2405}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002406
Nicolas Capens157ba262019-12-10 17:49:14 -05002407Int::Int(const Int &rhs)
2408{
2409 Value *value = rhs.loadValue();
2410 storeValue(value);
2411}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002412
Nicolas Capens157ba262019-12-10 17:49:14 -05002413Int::Int(const Reference<Int> &rhs)
2414{
2415 Value *value = rhs.loadValue();
2416 storeValue(value);
2417}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002418
Nicolas Capens157ba262019-12-10 17:49:14 -05002419Int::Int(const UInt &rhs)
2420{
2421 Value *value = rhs.loadValue();
2422 storeValue(value);
2423}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002424
Nicolas Capens157ba262019-12-10 17:49:14 -05002425Int::Int(const Reference<UInt> &rhs)
2426{
2427 Value *value = rhs.loadValue();
2428 storeValue(value);
2429}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002430
Nicolas Capens157ba262019-12-10 17:49:14 -05002431RValue<Int> Int::operator=(int rhs)
2432{
2433 return RValue<Int>(storeValue(Nucleus::createConstantInt(rhs)));
2434}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002435
Nicolas Capens157ba262019-12-10 17:49:14 -05002436RValue<Int> Int::operator=(RValue<Int> rhs)
2437{
2438 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002439
Nicolas Capens157ba262019-12-10 17:49:14 -05002440 return rhs;
2441}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002442
Nicolas Capens157ba262019-12-10 17:49:14 -05002443RValue<Int> Int::operator=(RValue<UInt> rhs)
2444{
2445 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002446
Nicolas Capens157ba262019-12-10 17:49:14 -05002447 return RValue<Int>(rhs);
2448}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002449
Nicolas Capens157ba262019-12-10 17:49:14 -05002450RValue<Int> Int::operator=(const Int &rhs)
2451{
2452 Value *value = rhs.loadValue();
2453 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002454
Nicolas Capens157ba262019-12-10 17:49:14 -05002455 return RValue<Int>(value);
2456}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002457
Nicolas Capens157ba262019-12-10 17:49:14 -05002458RValue<Int> Int::operator=(const Reference<Int> &rhs)
2459{
2460 Value *value = rhs.loadValue();
2461 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002462
Nicolas Capens157ba262019-12-10 17:49:14 -05002463 return RValue<Int>(value);
2464}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002465
Nicolas Capens157ba262019-12-10 17:49:14 -05002466RValue<Int> Int::operator=(const UInt &rhs)
2467{
2468 Value *value = rhs.loadValue();
2469 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002470
Nicolas Capens157ba262019-12-10 17:49:14 -05002471 return RValue<Int>(value);
2472}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002473
Nicolas Capens157ba262019-12-10 17:49:14 -05002474RValue<Int> Int::operator=(const Reference<UInt> &rhs)
2475{
2476 Value *value = rhs.loadValue();
2477 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002478
Nicolas Capens157ba262019-12-10 17:49:14 -05002479 return RValue<Int>(value);
2480}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002481
Nicolas Capens157ba262019-12-10 17:49:14 -05002482RValue<Int> operator+(RValue<Int> lhs, RValue<Int> rhs)
2483{
2484 return RValue<Int>(Nucleus::createAdd(lhs.value, rhs.value));
2485}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002486
Nicolas Capens157ba262019-12-10 17:49:14 -05002487RValue<Int> operator-(RValue<Int> lhs, RValue<Int> rhs)
2488{
2489 return RValue<Int>(Nucleus::createSub(lhs.value, rhs.value));
2490}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002491
Nicolas Capens157ba262019-12-10 17:49:14 -05002492RValue<Int> operator*(RValue<Int> lhs, RValue<Int> rhs)
2493{
2494 return RValue<Int>(Nucleus::createMul(lhs.value, rhs.value));
2495}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002496
Nicolas Capens157ba262019-12-10 17:49:14 -05002497RValue<Int> operator/(RValue<Int> lhs, RValue<Int> rhs)
2498{
2499 return RValue<Int>(Nucleus::createSDiv(lhs.value, rhs.value));
2500}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002501
Nicolas Capens157ba262019-12-10 17:49:14 -05002502RValue<Int> operator%(RValue<Int> lhs, RValue<Int> rhs)
2503{
2504 return RValue<Int>(Nucleus::createSRem(lhs.value, rhs.value));
2505}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002506
Nicolas Capens157ba262019-12-10 17:49:14 -05002507RValue<Int> operator&(RValue<Int> lhs, RValue<Int> rhs)
2508{
2509 return RValue<Int>(Nucleus::createAnd(lhs.value, rhs.value));
2510}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002511
Nicolas Capens157ba262019-12-10 17:49:14 -05002512RValue<Int> operator|(RValue<Int> lhs, RValue<Int> rhs)
2513{
2514 return RValue<Int>(Nucleus::createOr(lhs.value, rhs.value));
2515}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002516
Nicolas Capens157ba262019-12-10 17:49:14 -05002517RValue<Int> operator^(RValue<Int> lhs, RValue<Int> rhs)
2518{
2519 return RValue<Int>(Nucleus::createXor(lhs.value, rhs.value));
2520}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002521
Nicolas Capens157ba262019-12-10 17:49:14 -05002522RValue<Int> operator<<(RValue<Int> lhs, RValue<Int> rhs)
2523{
2524 return RValue<Int>(Nucleus::createShl(lhs.value, rhs.value));
2525}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002526
Nicolas Capens157ba262019-12-10 17:49:14 -05002527RValue<Int> operator>>(RValue<Int> lhs, RValue<Int> rhs)
2528{
2529 return RValue<Int>(Nucleus::createAShr(lhs.value, rhs.value));
2530}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002531
Nicolas Capens157ba262019-12-10 17:49:14 -05002532RValue<Int> operator+=(Int &lhs, RValue<Int> rhs)
2533{
2534 return lhs = lhs + rhs;
2535}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002536
Nicolas Capens157ba262019-12-10 17:49:14 -05002537RValue<Int> operator-=(Int &lhs, RValue<Int> rhs)
2538{
2539 return lhs = lhs - rhs;
2540}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002541
Nicolas Capens157ba262019-12-10 17:49:14 -05002542RValue<Int> operator*=(Int &lhs, RValue<Int> rhs)
2543{
2544 return lhs = lhs * rhs;
2545}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002546
Nicolas Capens157ba262019-12-10 17:49:14 -05002547RValue<Int> operator/=(Int &lhs, RValue<Int> rhs)
2548{
2549 return lhs = lhs / rhs;
2550}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002551
Nicolas Capens157ba262019-12-10 17:49:14 -05002552RValue<Int> operator%=(Int &lhs, RValue<Int> rhs)
2553{
2554 return lhs = lhs % rhs;
2555}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002556
Nicolas Capens157ba262019-12-10 17:49:14 -05002557RValue<Int> operator&=(Int &lhs, RValue<Int> rhs)
2558{
2559 return lhs = lhs & rhs;
2560}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002561
Nicolas Capens157ba262019-12-10 17:49:14 -05002562RValue<Int> operator|=(Int &lhs, RValue<Int> rhs)
2563{
2564 return lhs = lhs | rhs;
2565}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002566
Nicolas Capens157ba262019-12-10 17:49:14 -05002567RValue<Int> operator^=(Int &lhs, RValue<Int> rhs)
2568{
2569 return lhs = lhs ^ rhs;
2570}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002571
Nicolas Capens157ba262019-12-10 17:49:14 -05002572RValue<Int> operator<<=(Int &lhs, RValue<Int> rhs)
2573{
2574 return lhs = lhs << rhs;
2575}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002576
Nicolas Capens157ba262019-12-10 17:49:14 -05002577RValue<Int> operator>>=(Int &lhs, RValue<Int> rhs)
2578{
2579 return lhs = lhs >> rhs;
2580}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002581
Nicolas Capens157ba262019-12-10 17:49:14 -05002582RValue<Int> operator+(RValue<Int> val)
2583{
2584 return val;
2585}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002586
Nicolas Capens157ba262019-12-10 17:49:14 -05002587RValue<Int> operator-(RValue<Int> val)
2588{
2589 return RValue<Int>(Nucleus::createNeg(val.value));
2590}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002591
Nicolas Capens157ba262019-12-10 17:49:14 -05002592RValue<Int> operator~(RValue<Int> val)
2593{
2594 return RValue<Int>(Nucleus::createNot(val.value));
2595}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002596
Nicolas Capens157ba262019-12-10 17:49:14 -05002597RValue<Bool> operator<(RValue<Int> lhs, RValue<Int> rhs)
2598{
2599 return RValue<Bool>(Nucleus::createICmpSLT(lhs.value, rhs.value));
2600}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002601
Nicolas Capens157ba262019-12-10 17:49:14 -05002602RValue<Bool> operator<=(RValue<Int> lhs, RValue<Int> rhs)
2603{
2604 return RValue<Bool>(Nucleus::createICmpSLE(lhs.value, rhs.value));
2605}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002606
Nicolas Capens157ba262019-12-10 17:49:14 -05002607RValue<Bool> operator>(RValue<Int> lhs, RValue<Int> rhs)
2608{
2609 return RValue<Bool>(Nucleus::createICmpSGT(lhs.value, rhs.value));
2610}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002611
Nicolas Capens157ba262019-12-10 17:49:14 -05002612RValue<Bool> operator>=(RValue<Int> lhs, RValue<Int> rhs)
2613{
2614 return RValue<Bool>(Nucleus::createICmpSGE(lhs.value, rhs.value));
2615}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002616
Nicolas Capens157ba262019-12-10 17:49:14 -05002617RValue<Bool> operator!=(RValue<Int> lhs, RValue<Int> rhs)
2618{
2619 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
2620}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002621
Nicolas Capens157ba262019-12-10 17:49:14 -05002622RValue<Bool> operator==(RValue<Int> lhs, RValue<Int> rhs)
2623{
2624 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
2625}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002626
Nicolas Capens157ba262019-12-10 17:49:14 -05002627RValue<Int> Max(RValue<Int> x, RValue<Int> y)
2628{
2629 return IfThenElse(x > y, x, y);
2630}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002631
Nicolas Capens157ba262019-12-10 17:49:14 -05002632RValue<Int> Min(RValue<Int> x, RValue<Int> y)
2633{
2634 return IfThenElse(x < y, x, y);
2635}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002636
Nicolas Capens157ba262019-12-10 17:49:14 -05002637RValue<Int> Clamp(RValue<Int> x, RValue<Int> min, RValue<Int> max)
2638{
2639 return Min(Max(x, min), max);
2640}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002641
Nicolas Capens157ba262019-12-10 17:49:14 -05002642Long::Long(RValue<Int> cast)
2643{
2644 Value *integer = Nucleus::createSExt(cast.value, Long::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002645
Nicolas Capens157ba262019-12-10 17:49:14 -05002646 storeValue(integer);
2647}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002648
Nicolas Capens157ba262019-12-10 17:49:14 -05002649Long::Long(RValue<UInt> cast)
2650{
2651 Value *integer = Nucleus::createZExt(cast.value, Long::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002652
Nicolas Capens157ba262019-12-10 17:49:14 -05002653 storeValue(integer);
2654}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002655
Nicolas Capens157ba262019-12-10 17:49:14 -05002656Long::Long(RValue<Long> rhs)
2657{
2658 storeValue(rhs.value);
2659}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002660
Nicolas Capens157ba262019-12-10 17:49:14 -05002661RValue<Long> Long::operator=(int64_t rhs)
2662{
2663 return RValue<Long>(storeValue(Nucleus::createConstantLong(rhs)));
2664}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002665
Nicolas Capens157ba262019-12-10 17:49:14 -05002666RValue<Long> Long::operator=(RValue<Long> rhs)
2667{
2668 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002669
Nicolas Capens157ba262019-12-10 17:49:14 -05002670 return rhs;
2671}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002672
Nicolas Capens157ba262019-12-10 17:49:14 -05002673RValue<Long> Long::operator=(const Long &rhs)
2674{
2675 Value *value = rhs.loadValue();
2676 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002677
Nicolas Capens157ba262019-12-10 17:49:14 -05002678 return RValue<Long>(value);
2679}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002680
Nicolas Capens157ba262019-12-10 17:49:14 -05002681RValue<Long> Long::operator=(const Reference<Long> &rhs)
2682{
2683 Value *value = rhs.loadValue();
2684 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002685
Nicolas Capens157ba262019-12-10 17:49:14 -05002686 return RValue<Long>(value);
2687}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002688
Nicolas Capens157ba262019-12-10 17:49:14 -05002689RValue<Long> operator+(RValue<Long> lhs, RValue<Long> rhs)
2690{
2691 return RValue<Long>(Nucleus::createAdd(lhs.value, rhs.value));
2692}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002693
Nicolas Capens157ba262019-12-10 17:49:14 -05002694RValue<Long> operator-(RValue<Long> lhs, RValue<Long> rhs)
2695{
2696 return RValue<Long>(Nucleus::createSub(lhs.value, rhs.value));
2697}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002698
Nicolas Capens157ba262019-12-10 17:49:14 -05002699RValue<Long> operator*(RValue<Long> lhs, RValue<Long> rhs)
2700{
2701 return RValue<Long>(Nucleus::createMul(lhs.value, rhs.value));
2702}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002703
Nicolas Capens157ba262019-12-10 17:49:14 -05002704RValue<Long> operator>>(RValue<Long> lhs, RValue<Long> rhs)
2705{
2706 return RValue<Long>(Nucleus::createAShr(lhs.value, rhs.value));
2707}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002708
Nicolas Capens157ba262019-12-10 17:49:14 -05002709RValue<Long> operator+=(Long &lhs, RValue<Long> rhs)
2710{
2711 return lhs = lhs + rhs;
2712}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002713
Nicolas Capens157ba262019-12-10 17:49:14 -05002714RValue<Long> operator-=(Long &lhs, RValue<Long> rhs)
2715{
2716 return lhs = lhs - rhs;
2717}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002718
Ben Clayton713b8d32019-12-17 20:37:56 +00002719RValue<Long> AddAtomic(RValue<Pointer<Long>> x, RValue<Long> y)
Nicolas Capens157ba262019-12-10 17:49:14 -05002720{
2721 return RValue<Long>(Nucleus::createAtomicAdd(x.value, y.value));
2722}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002723
Ben Clayton713b8d32019-12-17 20:37:56 +00002724RValue<UInt> AddAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
Nicolas Capens157ba262019-12-10 17:49:14 -05002725{
2726 return RValue<UInt>(Nucleus::createAtomicAdd(x.value, y.value, memoryOrder));
2727}
Chris Forbes17813932019-04-18 11:45:54 -07002728
Ben Clayton713b8d32019-12-17 20:37:56 +00002729RValue<UInt> SubAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
Nicolas Capens157ba262019-12-10 17:49:14 -05002730{
2731 return RValue<UInt>(Nucleus::createAtomicSub(x.value, y.value, memoryOrder));
2732}
Chris Forbes707ed992019-04-18 18:17:35 -07002733
Ben Clayton713b8d32019-12-17 20:37:56 +00002734RValue<UInt> AndAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
Nicolas Capens157ba262019-12-10 17:49:14 -05002735{
2736 return RValue<UInt>(Nucleus::createAtomicAnd(x.value, y.value, memoryOrder));
2737}
Chris Forbes17813932019-04-18 11:45:54 -07002738
Ben Clayton713b8d32019-12-17 20:37:56 +00002739RValue<UInt> OrAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
Nicolas Capens157ba262019-12-10 17:49:14 -05002740{
2741 return RValue<UInt>(Nucleus::createAtomicOr(x.value, y.value, memoryOrder));
2742}
Chris Forbes17813932019-04-18 11:45:54 -07002743
Ben Clayton713b8d32019-12-17 20:37:56 +00002744RValue<UInt> XorAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
Nicolas Capens157ba262019-12-10 17:49:14 -05002745{
2746 return RValue<UInt>(Nucleus::createAtomicXor(x.value, y.value, memoryOrder));
2747}
Chris Forbes17813932019-04-18 11:45:54 -07002748
Ben Clayton713b8d32019-12-17 20:37:56 +00002749RValue<UInt> ExchangeAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
Nicolas Capens157ba262019-12-10 17:49:14 -05002750{
2751 return RValue<UInt>(Nucleus::createAtomicExchange(x.value, y.value, memoryOrder));
2752}
Chris Forbes17813932019-04-18 11:45:54 -07002753
Ben Clayton713b8d32019-12-17 20:37:56 +00002754RValue<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 -05002755{
2756 return RValue<UInt>(Nucleus::createAtomicCompareExchange(x.value, y.value, compare.value, memoryOrderEqual, memoryOrderUnequal));
2757}
Chris Forbesa16238d2019-04-18 16:31:54 -07002758
Nicolas Capens157ba262019-12-10 17:49:14 -05002759UInt::UInt(Argument<UInt> argument)
2760{
2761 storeValue(argument.value);
2762}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002763
Nicolas Capens157ba262019-12-10 17:49:14 -05002764UInt::UInt(RValue<UShort> cast)
2765{
2766 Value *integer = Nucleus::createZExt(cast.value, UInt::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002767
Nicolas Capens157ba262019-12-10 17:49:14 -05002768 storeValue(integer);
2769}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002770
Nicolas Capens157ba262019-12-10 17:49:14 -05002771UInt::UInt(RValue<Long> cast)
2772{
2773 Value *integer = Nucleus::createTrunc(cast.value, UInt::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002774
Nicolas Capens157ba262019-12-10 17:49:14 -05002775 storeValue(integer);
2776}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002777
Nicolas Capens157ba262019-12-10 17:49:14 -05002778UInt::UInt(int x)
2779{
2780 storeValue(Nucleus::createConstantInt(x));
2781}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002782
Nicolas Capens157ba262019-12-10 17:49:14 -05002783UInt::UInt(unsigned int x)
2784{
2785 storeValue(Nucleus::createConstantInt(x));
2786}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002787
Nicolas Capens157ba262019-12-10 17:49:14 -05002788UInt::UInt(RValue<UInt> rhs)
2789{
2790 storeValue(rhs.value);
2791}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002792
Nicolas Capens157ba262019-12-10 17:49:14 -05002793UInt::UInt(RValue<Int> rhs)
2794{
2795 storeValue(rhs.value);
2796}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002797
Nicolas Capens157ba262019-12-10 17:49:14 -05002798UInt::UInt(const UInt &rhs)
2799{
2800 Value *value = rhs.loadValue();
2801 storeValue(value);
2802}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002803
Nicolas Capens157ba262019-12-10 17:49:14 -05002804UInt::UInt(const Reference<UInt> &rhs)
2805{
2806 Value *value = rhs.loadValue();
2807 storeValue(value);
2808}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002809
Nicolas Capens157ba262019-12-10 17:49:14 -05002810UInt::UInt(const Int &rhs)
2811{
2812 Value *value = rhs.loadValue();
2813 storeValue(value);
2814}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002815
Nicolas Capens157ba262019-12-10 17:49:14 -05002816UInt::UInt(const Reference<Int> &rhs)
2817{
2818 Value *value = rhs.loadValue();
2819 storeValue(value);
2820}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002821
Nicolas Capens157ba262019-12-10 17:49:14 -05002822RValue<UInt> UInt::operator=(unsigned int rhs)
2823{
2824 return RValue<UInt>(storeValue(Nucleus::createConstantInt(rhs)));
2825}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002826
Nicolas Capens157ba262019-12-10 17:49:14 -05002827RValue<UInt> UInt::operator=(RValue<UInt> rhs)
2828{
2829 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002830
Nicolas Capens157ba262019-12-10 17:49:14 -05002831 return rhs;
2832}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002833
Nicolas Capens157ba262019-12-10 17:49:14 -05002834RValue<UInt> UInt::operator=(RValue<Int> rhs)
2835{
2836 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002837
Nicolas Capens157ba262019-12-10 17:49:14 -05002838 return RValue<UInt>(rhs);
2839}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002840
Nicolas Capens157ba262019-12-10 17:49:14 -05002841RValue<UInt> UInt::operator=(const UInt &rhs)
2842{
2843 Value *value = rhs.loadValue();
2844 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002845
Nicolas Capens157ba262019-12-10 17:49:14 -05002846 return RValue<UInt>(value);
2847}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002848
Nicolas Capens157ba262019-12-10 17:49:14 -05002849RValue<UInt> UInt::operator=(const Reference<UInt> &rhs)
2850{
2851 Value *value = rhs.loadValue();
2852 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002853
Nicolas Capens157ba262019-12-10 17:49:14 -05002854 return RValue<UInt>(value);
2855}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002856
Nicolas Capens157ba262019-12-10 17:49:14 -05002857RValue<UInt> UInt::operator=(const Int &rhs)
2858{
2859 Value *value = rhs.loadValue();
2860 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002861
Nicolas Capens157ba262019-12-10 17:49:14 -05002862 return RValue<UInt>(value);
2863}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002864
Nicolas Capens157ba262019-12-10 17:49:14 -05002865RValue<UInt> UInt::operator=(const Reference<Int> &rhs)
2866{
2867 Value *value = rhs.loadValue();
2868 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002869
Nicolas Capens157ba262019-12-10 17:49:14 -05002870 return RValue<UInt>(value);
2871}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002872
Nicolas Capens157ba262019-12-10 17:49:14 -05002873RValue<UInt> operator+(RValue<UInt> lhs, RValue<UInt> rhs)
2874{
2875 return RValue<UInt>(Nucleus::createAdd(lhs.value, rhs.value));
2876}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002877
Nicolas Capens157ba262019-12-10 17:49:14 -05002878RValue<UInt> operator-(RValue<UInt> lhs, RValue<UInt> rhs)
2879{
2880 return RValue<UInt>(Nucleus::createSub(lhs.value, rhs.value));
2881}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002882
Nicolas Capens157ba262019-12-10 17:49:14 -05002883RValue<UInt> operator*(RValue<UInt> lhs, RValue<UInt> rhs)
2884{
2885 return RValue<UInt>(Nucleus::createMul(lhs.value, rhs.value));
2886}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002887
Nicolas Capens157ba262019-12-10 17:49:14 -05002888RValue<UInt> operator/(RValue<UInt> lhs, RValue<UInt> rhs)
2889{
2890 return RValue<UInt>(Nucleus::createUDiv(lhs.value, rhs.value));
2891}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002892
Nicolas Capens157ba262019-12-10 17:49:14 -05002893RValue<UInt> operator%(RValue<UInt> lhs, RValue<UInt> rhs)
2894{
2895 return RValue<UInt>(Nucleus::createURem(lhs.value, rhs.value));
2896}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002897
Nicolas Capens157ba262019-12-10 17:49:14 -05002898RValue<UInt> operator&(RValue<UInt> lhs, RValue<UInt> rhs)
2899{
2900 return RValue<UInt>(Nucleus::createAnd(lhs.value, rhs.value));
2901}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002902
Nicolas Capens157ba262019-12-10 17:49:14 -05002903RValue<UInt> operator|(RValue<UInt> lhs, RValue<UInt> rhs)
2904{
2905 return RValue<UInt>(Nucleus::createOr(lhs.value, rhs.value));
2906}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002907
Nicolas Capens157ba262019-12-10 17:49:14 -05002908RValue<UInt> operator^(RValue<UInt> lhs, RValue<UInt> rhs)
2909{
2910 return RValue<UInt>(Nucleus::createXor(lhs.value, rhs.value));
2911}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002912
Nicolas Capens157ba262019-12-10 17:49:14 -05002913RValue<UInt> operator<<(RValue<UInt> lhs, RValue<UInt> rhs)
2914{
2915 return RValue<UInt>(Nucleus::createShl(lhs.value, rhs.value));
2916}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002917
Nicolas Capens157ba262019-12-10 17:49:14 -05002918RValue<UInt> operator>>(RValue<UInt> lhs, RValue<UInt> rhs)
2919{
2920 return RValue<UInt>(Nucleus::createLShr(lhs.value, rhs.value));
2921}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002922
Nicolas Capens157ba262019-12-10 17:49:14 -05002923RValue<UInt> operator+=(UInt &lhs, RValue<UInt> rhs)
2924{
2925 return lhs = lhs + rhs;
2926}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002927
Nicolas Capens157ba262019-12-10 17:49:14 -05002928RValue<UInt> operator-=(UInt &lhs, RValue<UInt> rhs)
2929{
2930 return lhs = lhs - rhs;
2931}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002932
Nicolas Capens157ba262019-12-10 17:49:14 -05002933RValue<UInt> operator*=(UInt &lhs, RValue<UInt> rhs)
2934{
2935 return lhs = lhs * rhs;
2936}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002937
Nicolas Capens157ba262019-12-10 17:49:14 -05002938RValue<UInt> operator/=(UInt &lhs, RValue<UInt> rhs)
2939{
2940 return lhs = lhs / rhs;
2941}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002942
Nicolas Capens157ba262019-12-10 17:49:14 -05002943RValue<UInt> operator%=(UInt &lhs, RValue<UInt> rhs)
2944{
2945 return lhs = lhs % rhs;
2946}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002947
Nicolas Capens157ba262019-12-10 17:49:14 -05002948RValue<UInt> operator&=(UInt &lhs, RValue<UInt> rhs)
2949{
2950 return lhs = lhs & rhs;
2951}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002952
Nicolas Capens157ba262019-12-10 17:49:14 -05002953RValue<UInt> operator|=(UInt &lhs, RValue<UInt> rhs)
2954{
2955 return lhs = lhs | rhs;
2956}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002957
Nicolas Capens157ba262019-12-10 17:49:14 -05002958RValue<UInt> operator^=(UInt &lhs, RValue<UInt> rhs)
2959{
2960 return lhs = lhs ^ rhs;
2961}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002962
Nicolas Capens157ba262019-12-10 17:49:14 -05002963RValue<UInt> operator<<=(UInt &lhs, RValue<UInt> rhs)
2964{
2965 return lhs = lhs << rhs;
2966}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002967
Nicolas Capens157ba262019-12-10 17:49:14 -05002968RValue<UInt> operator>>=(UInt &lhs, RValue<UInt> rhs)
2969{
2970 return lhs = lhs >> rhs;
2971}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002972
Nicolas Capens157ba262019-12-10 17:49:14 -05002973RValue<UInt> operator+(RValue<UInt> val)
2974{
2975 return val;
2976}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002977
Nicolas Capens157ba262019-12-10 17:49:14 -05002978RValue<UInt> operator-(RValue<UInt> val)
2979{
2980 return RValue<UInt>(Nucleus::createNeg(val.value));
2981}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002982
Nicolas Capens157ba262019-12-10 17:49:14 -05002983RValue<UInt> operator~(RValue<UInt> val)
2984{
2985 return RValue<UInt>(Nucleus::createNot(val.value));
2986}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002987
Nicolas Capens157ba262019-12-10 17:49:14 -05002988RValue<UInt> Max(RValue<UInt> x, RValue<UInt> y)
2989{
2990 return IfThenElse(x > y, x, y);
2991}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002992
Nicolas Capens157ba262019-12-10 17:49:14 -05002993RValue<UInt> Min(RValue<UInt> x, RValue<UInt> y)
2994{
2995 return IfThenElse(x < y, x, y);
2996}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002997
Nicolas Capens157ba262019-12-10 17:49:14 -05002998RValue<UInt> Clamp(RValue<UInt> x, RValue<UInt> min, RValue<UInt> max)
2999{
3000 return Min(Max(x, min), max);
3001}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003002
Nicolas Capens157ba262019-12-10 17:49:14 -05003003RValue<Bool> operator<(RValue<UInt> lhs, RValue<UInt> rhs)
3004{
3005 return RValue<Bool>(Nucleus::createICmpULT(lhs.value, rhs.value));
3006}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003007
Nicolas Capens157ba262019-12-10 17:49:14 -05003008RValue<Bool> operator<=(RValue<UInt> lhs, RValue<UInt> rhs)
3009{
3010 return RValue<Bool>(Nucleus::createICmpULE(lhs.value, rhs.value));
3011}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003012
Nicolas Capens157ba262019-12-10 17:49:14 -05003013RValue<Bool> operator>(RValue<UInt> lhs, RValue<UInt> rhs)
3014{
3015 return RValue<Bool>(Nucleus::createICmpUGT(lhs.value, rhs.value));
3016}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003017
Nicolas Capens157ba262019-12-10 17:49:14 -05003018RValue<Bool> operator>=(RValue<UInt> lhs, RValue<UInt> rhs)
3019{
3020 return RValue<Bool>(Nucleus::createICmpUGE(lhs.value, rhs.value));
3021}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003022
Nicolas Capens157ba262019-12-10 17:49:14 -05003023RValue<Bool> operator!=(RValue<UInt> lhs, RValue<UInt> rhs)
3024{
3025 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
3026}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003027
Nicolas Capens157ba262019-12-10 17:49:14 -05003028RValue<Bool> operator==(RValue<UInt> lhs, RValue<UInt> rhs)
3029{
3030 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
3031}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003032
Nicolas Capens157ba262019-12-10 17:49:14 -05003033Int2::Int2(RValue<Int4> cast)
3034{
3035 storeValue(Nucleus::createBitCast(cast.value, getType()));
3036}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003037
Nicolas Capens157ba262019-12-10 17:49:14 -05003038Int2::Int2(int x, int y)
3039{
Ben Clayton713b8d32019-12-17 20:37:56 +00003040 int64_t constantVector[2] = { x, y };
Nicolas Capens157ba262019-12-10 17:49:14 -05003041 storeValue(Nucleus::createConstantVector(constantVector, getType()));
3042}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003043
Nicolas Capens157ba262019-12-10 17:49:14 -05003044Int2::Int2(RValue<Int2> rhs)
3045{
3046 storeValue(rhs.value);
3047}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003048
Nicolas Capens157ba262019-12-10 17:49:14 -05003049Int2::Int2(const Int2 &rhs)
3050{
3051 Value *value = rhs.loadValue();
3052 storeValue(value);
3053}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003054
Nicolas Capens157ba262019-12-10 17:49:14 -05003055Int2::Int2(const Reference<Int2> &rhs)
3056{
3057 Value *value = rhs.loadValue();
3058 storeValue(value);
3059}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003060
Nicolas Capens157ba262019-12-10 17:49:14 -05003061Int2::Int2(RValue<Int> lo, RValue<Int> hi)
3062{
Ben Clayton713b8d32019-12-17 20:37:56 +00003063 int shuffle[4] = { 0, 4, 1, 5 };
Nicolas Capens157ba262019-12-10 17:49:14 -05003064 Value *packed = Nucleus::createShuffleVector(Int4(lo).loadValue(), Int4(hi).loadValue(), shuffle);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003065
Nicolas Capens157ba262019-12-10 17:49:14 -05003066 storeValue(Nucleus::createBitCast(packed, Int2::getType()));
3067}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003068
Nicolas Capens157ba262019-12-10 17:49:14 -05003069RValue<Int2> Int2::operator=(RValue<Int2> rhs)
3070{
3071 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003072
Nicolas Capens157ba262019-12-10 17:49:14 -05003073 return rhs;
3074}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003075
Nicolas Capens157ba262019-12-10 17:49:14 -05003076RValue<Int2> Int2::operator=(const Int2 &rhs)
3077{
3078 Value *value = rhs.loadValue();
3079 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003080
Nicolas Capens157ba262019-12-10 17:49:14 -05003081 return RValue<Int2>(value);
3082}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003083
Nicolas Capens157ba262019-12-10 17:49:14 -05003084RValue<Int2> Int2::operator=(const Reference<Int2> &rhs)
3085{
3086 Value *value = rhs.loadValue();
3087 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003088
Nicolas Capens157ba262019-12-10 17:49:14 -05003089 return RValue<Int2>(value);
3090}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003091
Nicolas Capens157ba262019-12-10 17:49:14 -05003092RValue<Int2> operator+(RValue<Int2> lhs, RValue<Int2> rhs)
3093{
3094 return RValue<Int2>(Nucleus::createAdd(lhs.value, rhs.value));
3095}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003096
Nicolas Capens157ba262019-12-10 17:49:14 -05003097RValue<Int2> operator-(RValue<Int2> lhs, RValue<Int2> rhs)
3098{
3099 return RValue<Int2>(Nucleus::createSub(lhs.value, rhs.value));
3100}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003101
3102// RValue<Int2> operator*(RValue<Int2> lhs, RValue<Int2> rhs)
3103// {
3104// return RValue<Int2>(Nucleus::createMul(lhs.value, rhs.value));
3105// }
3106
3107// RValue<Int2> operator/(RValue<Int2> lhs, RValue<Int2> rhs)
3108// {
3109// return RValue<Int2>(Nucleus::createSDiv(lhs.value, rhs.value));
3110// }
3111
3112// RValue<Int2> operator%(RValue<Int2> lhs, RValue<Int2> rhs)
3113// {
3114// return RValue<Int2>(Nucleus::createSRem(lhs.value, rhs.value));
3115// }
3116
Nicolas Capens157ba262019-12-10 17:49:14 -05003117RValue<Int2> operator&(RValue<Int2> lhs, RValue<Int2> rhs)
3118{
3119 return RValue<Int2>(Nucleus::createAnd(lhs.value, rhs.value));
3120}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003121
Nicolas Capens157ba262019-12-10 17:49:14 -05003122RValue<Int2> operator|(RValue<Int2> lhs, RValue<Int2> rhs)
3123{
3124 return RValue<Int2>(Nucleus::createOr(lhs.value, rhs.value));
3125}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003126
Nicolas Capens157ba262019-12-10 17:49:14 -05003127RValue<Int2> operator^(RValue<Int2> lhs, RValue<Int2> rhs)
3128{
3129 return RValue<Int2>(Nucleus::createXor(lhs.value, rhs.value));
3130}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003131
Nicolas Capens157ba262019-12-10 17:49:14 -05003132RValue<Int2> operator+=(Int2 &lhs, RValue<Int2> rhs)
3133{
3134 return lhs = lhs + rhs;
3135}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003136
Nicolas Capens157ba262019-12-10 17:49:14 -05003137RValue<Int2> operator-=(Int2 &lhs, RValue<Int2> rhs)
3138{
3139 return lhs = lhs - rhs;
3140}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003141
3142// RValue<Int2> operator*=(Int2 &lhs, RValue<Int2> rhs)
3143// {
3144// return lhs = lhs * rhs;
3145// }
3146
3147// RValue<Int2> operator/=(Int2 &lhs, RValue<Int2> rhs)
3148// {
3149// return lhs = lhs / rhs;
3150// }
3151
3152// RValue<Int2> operator%=(Int2 &lhs, RValue<Int2> rhs)
3153// {
3154// return lhs = lhs % rhs;
3155// }
3156
Nicolas Capens157ba262019-12-10 17:49:14 -05003157RValue<Int2> operator&=(Int2 &lhs, RValue<Int2> rhs)
3158{
3159 return lhs = lhs & rhs;
3160}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003161
Nicolas Capens157ba262019-12-10 17:49:14 -05003162RValue<Int2> operator|=(Int2 &lhs, RValue<Int2> rhs)
3163{
3164 return lhs = lhs | rhs;
3165}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003166
Nicolas Capens157ba262019-12-10 17:49:14 -05003167RValue<Int2> operator^=(Int2 &lhs, RValue<Int2> rhs)
3168{
3169 return lhs = lhs ^ rhs;
3170}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003171
Nicolas Capens157ba262019-12-10 17:49:14 -05003172RValue<Int2> operator<<=(Int2 &lhs, unsigned char rhs)
3173{
3174 return lhs = lhs << rhs;
3175}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003176
Nicolas Capens157ba262019-12-10 17:49:14 -05003177RValue<Int2> operator>>=(Int2 &lhs, unsigned char rhs)
3178{
3179 return lhs = lhs >> rhs;
3180}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003181
3182// RValue<Int2> operator+(RValue<Int2> val)
3183// {
3184// return val;
3185// }
3186
3187// RValue<Int2> operator-(RValue<Int2> val)
3188// {
3189// return RValue<Int2>(Nucleus::createNeg(val.value));
3190// }
3191
Nicolas Capens157ba262019-12-10 17:49:14 -05003192RValue<Int2> operator~(RValue<Int2> val)
3193{
3194 return RValue<Int2>(Nucleus::createNot(val.value));
3195}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003196
Nicolas Capens157ba262019-12-10 17:49:14 -05003197RValue<Short4> UnpackLow(RValue<Int2> x, RValue<Int2> y)
3198{
Nicolas Capens133b87d2020-01-25 16:26:28 -05003199 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00003200 int shuffle[4] = { 0, 4, 1, 5 }; // Real type is v4i32
Nicolas Capens157ba262019-12-10 17:49:14 -05003201 return As<Short4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
3202}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003203
Nicolas Capens157ba262019-12-10 17:49:14 -05003204RValue<Short4> UnpackHigh(RValue<Int2> x, RValue<Int2> y)
3205{
Nicolas Capens133b87d2020-01-25 16:26:28 -05003206 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00003207 int shuffle[4] = { 0, 4, 1, 5 }; // Real type is v4i32
Nicolas Capens157ba262019-12-10 17:49:14 -05003208 auto lowHigh = RValue<Int4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
3209 return As<Short4>(Swizzle(lowHigh, 0x2323));
3210}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003211
Nicolas Capens157ba262019-12-10 17:49:14 -05003212RValue<Int> Extract(RValue<Int2> val, int i)
3213{
3214 return RValue<Int>(Nucleus::createExtractElement(val.value, Int::getType(), i));
3215}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003216
Nicolas Capens157ba262019-12-10 17:49:14 -05003217RValue<Int2> Insert(RValue<Int2> val, RValue<Int> element, int i)
3218{
3219 return RValue<Int2>(Nucleus::createInsertElement(val.value, element.value, i));
3220}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003221
Nicolas Capens157ba262019-12-10 17:49:14 -05003222UInt2::UInt2(unsigned int x, unsigned int y)
3223{
Ben Clayton713b8d32019-12-17 20:37:56 +00003224 int64_t constantVector[2] = { x, y };
Nicolas Capens157ba262019-12-10 17:49:14 -05003225 storeValue(Nucleus::createConstantVector(constantVector, getType()));
3226}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003227
Nicolas Capens157ba262019-12-10 17:49:14 -05003228UInt2::UInt2(RValue<UInt2> rhs)
3229{
3230 storeValue(rhs.value);
3231}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003232
Nicolas Capens157ba262019-12-10 17:49:14 -05003233UInt2::UInt2(const UInt2 &rhs)
3234{
3235 Value *value = rhs.loadValue();
3236 storeValue(value);
3237}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003238
Nicolas Capens157ba262019-12-10 17:49:14 -05003239UInt2::UInt2(const Reference<UInt2> &rhs)
3240{
3241 Value *value = rhs.loadValue();
3242 storeValue(value);
3243}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003244
Nicolas Capens157ba262019-12-10 17:49:14 -05003245RValue<UInt2> UInt2::operator=(RValue<UInt2> rhs)
3246{
3247 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003248
Nicolas Capens157ba262019-12-10 17:49:14 -05003249 return rhs;
3250}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003251
Nicolas Capens157ba262019-12-10 17:49:14 -05003252RValue<UInt2> UInt2::operator=(const UInt2 &rhs)
3253{
3254 Value *value = rhs.loadValue();
3255 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003256
Nicolas Capens157ba262019-12-10 17:49:14 -05003257 return RValue<UInt2>(value);
3258}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003259
Nicolas Capens157ba262019-12-10 17:49:14 -05003260RValue<UInt2> UInt2::operator=(const Reference<UInt2> &rhs)
3261{
3262 Value *value = rhs.loadValue();
3263 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003264
Nicolas Capens157ba262019-12-10 17:49:14 -05003265 return RValue<UInt2>(value);
3266}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003267
Nicolas Capens157ba262019-12-10 17:49:14 -05003268RValue<UInt2> operator+(RValue<UInt2> lhs, RValue<UInt2> rhs)
3269{
3270 return RValue<UInt2>(Nucleus::createAdd(lhs.value, rhs.value));
3271}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003272
Nicolas Capens157ba262019-12-10 17:49:14 -05003273RValue<UInt2> operator-(RValue<UInt2> lhs, RValue<UInt2> rhs)
3274{
3275 return RValue<UInt2>(Nucleus::createSub(lhs.value, rhs.value));
3276}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003277
3278// RValue<UInt2> operator*(RValue<UInt2> lhs, RValue<UInt2> rhs)
3279// {
3280// return RValue<UInt2>(Nucleus::createMul(lhs.value, rhs.value));
3281// }
3282
3283// RValue<UInt2> operator/(RValue<UInt2> lhs, RValue<UInt2> rhs)
3284// {
3285// return RValue<UInt2>(Nucleus::createUDiv(lhs.value, rhs.value));
3286// }
3287
3288// RValue<UInt2> operator%(RValue<UInt2> lhs, RValue<UInt2> rhs)
3289// {
3290// return RValue<UInt2>(Nucleus::createURem(lhs.value, rhs.value));
3291// }
3292
Nicolas Capens157ba262019-12-10 17:49:14 -05003293RValue<UInt2> operator&(RValue<UInt2> lhs, RValue<UInt2> rhs)
3294{
3295 return RValue<UInt2>(Nucleus::createAnd(lhs.value, rhs.value));
3296}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003297
Nicolas Capens157ba262019-12-10 17:49:14 -05003298RValue<UInt2> operator|(RValue<UInt2> lhs, RValue<UInt2> rhs)
3299{
3300 return RValue<UInt2>(Nucleus::createOr(lhs.value, rhs.value));
3301}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003302
Nicolas Capens157ba262019-12-10 17:49:14 -05003303RValue<UInt2> operator^(RValue<UInt2> lhs, RValue<UInt2> rhs)
3304{
3305 return RValue<UInt2>(Nucleus::createXor(lhs.value, rhs.value));
3306}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003307
Nicolas Capens157ba262019-12-10 17:49:14 -05003308RValue<UInt2> operator+=(UInt2 &lhs, RValue<UInt2> rhs)
3309{
3310 return lhs = lhs + rhs;
3311}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003312
Nicolas Capens157ba262019-12-10 17:49:14 -05003313RValue<UInt2> operator-=(UInt2 &lhs, RValue<UInt2> rhs)
3314{
3315 return lhs = lhs - rhs;
3316}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003317
3318// RValue<UInt2> operator*=(UInt2 &lhs, RValue<UInt2> rhs)
3319// {
3320// return lhs = lhs * rhs;
3321// }
3322
3323// RValue<UInt2> operator/=(UInt2 &lhs, RValue<UInt2> rhs)
3324// {
3325// return lhs = lhs / rhs;
3326// }
3327
3328// RValue<UInt2> operator%=(UInt2 &lhs, RValue<UInt2> rhs)
3329// {
3330// return lhs = lhs % rhs;
3331// }
3332
Nicolas Capens157ba262019-12-10 17:49:14 -05003333RValue<UInt2> operator&=(UInt2 &lhs, RValue<UInt2> rhs)
3334{
3335 return lhs = lhs & rhs;
3336}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003337
Nicolas Capens157ba262019-12-10 17:49:14 -05003338RValue<UInt2> operator|=(UInt2 &lhs, RValue<UInt2> rhs)
3339{
3340 return lhs = lhs | rhs;
3341}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003342
Nicolas Capens157ba262019-12-10 17:49:14 -05003343RValue<UInt2> operator^=(UInt2 &lhs, RValue<UInt2> rhs)
3344{
3345 return lhs = lhs ^ rhs;
3346}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003347
Nicolas Capens157ba262019-12-10 17:49:14 -05003348RValue<UInt2> operator<<=(UInt2 &lhs, unsigned char rhs)
3349{
3350 return lhs = lhs << rhs;
3351}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003352
Nicolas Capens157ba262019-12-10 17:49:14 -05003353RValue<UInt2> operator>>=(UInt2 &lhs, unsigned char rhs)
3354{
3355 return lhs = lhs >> rhs;
3356}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003357
3358// RValue<UInt2> operator+(RValue<UInt2> val)
3359// {
3360// return val;
3361// }
3362
3363// RValue<UInt2> operator-(RValue<UInt2> val)
3364// {
3365// return RValue<UInt2>(Nucleus::createNeg(val.value));
3366// }
3367
Nicolas Capens157ba262019-12-10 17:49:14 -05003368RValue<UInt2> operator~(RValue<UInt2> val)
3369{
3370 return RValue<UInt2>(Nucleus::createNot(val.value));
3371}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003372
Nicolas Capens157ba262019-12-10 17:49:14 -05003373RValue<UInt> Extract(RValue<UInt2> val, int i)
3374{
3375 return RValue<UInt>(Nucleus::createExtractElement(val.value, UInt::getType(), i));
3376}
Ben Clayton8ab40532019-05-10 16:23:13 +01003377
Nicolas Capens157ba262019-12-10 17:49:14 -05003378RValue<UInt2> Insert(RValue<UInt2> val, RValue<UInt> element, int i)
3379{
3380 return RValue<UInt2>(Nucleus::createInsertElement(val.value, element.value, i));
3381}
Ben Clayton8ab40532019-05-10 16:23:13 +01003382
Ben Clayton713b8d32019-12-17 20:37:56 +00003383Int4::Int4()
3384 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003385{
3386}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003387
Ben Clayton713b8d32019-12-17 20:37:56 +00003388Int4::Int4(RValue<Float4> cast)
3389 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003390{
3391 Value *xyzw = Nucleus::createFPToSI(cast.value, Int4::getType());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003392
Nicolas Capens157ba262019-12-10 17:49:14 -05003393 storeValue(xyzw);
3394}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003395
Ben Clayton713b8d32019-12-17 20:37:56 +00003396Int4::Int4(int xyzw)
3397 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003398{
3399 constant(xyzw, xyzw, xyzw, xyzw);
3400}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003401
Ben Clayton713b8d32019-12-17 20:37:56 +00003402Int4::Int4(int x, int yzw)
3403 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003404{
3405 constant(x, yzw, yzw, yzw);
3406}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003407
Ben Clayton713b8d32019-12-17 20:37:56 +00003408Int4::Int4(int x, int y, int zw)
3409 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003410{
3411 constant(x, y, zw, zw);
3412}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003413
Ben Clayton713b8d32019-12-17 20:37:56 +00003414Int4::Int4(int x, int y, int z, int w)
3415 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003416{
3417 constant(x, y, z, w);
3418}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003419
Nicolas Capens157ba262019-12-10 17:49:14 -05003420void Int4::constant(int x, int y, int z, int w)
3421{
Ben Clayton713b8d32019-12-17 20:37:56 +00003422 int64_t constantVector[4] = { x, y, z, w };
Nicolas Capens157ba262019-12-10 17:49:14 -05003423 storeValue(Nucleus::createConstantVector(constantVector, getType()));
3424}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003425
Ben Clayton713b8d32019-12-17 20:37:56 +00003426Int4::Int4(RValue<Int4> rhs)
3427 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003428{
3429 storeValue(rhs.value);
3430}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003431
Ben Clayton713b8d32019-12-17 20:37:56 +00003432Int4::Int4(const Int4 &rhs)
3433 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003434{
3435 Value *value = rhs.loadValue();
3436 storeValue(value);
3437}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003438
Ben Clayton713b8d32019-12-17 20:37:56 +00003439Int4::Int4(const Reference<Int4> &rhs)
3440 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003441{
3442 Value *value = rhs.loadValue();
3443 storeValue(value);
3444}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003445
Ben Clayton713b8d32019-12-17 20:37:56 +00003446Int4::Int4(RValue<UInt4> rhs)
3447 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003448{
3449 storeValue(rhs.value);
3450}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003451
Ben Clayton713b8d32019-12-17 20:37:56 +00003452Int4::Int4(const UInt4 &rhs)
3453 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003454{
3455 Value *value = rhs.loadValue();
3456 storeValue(value);
3457}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003458
Ben Clayton713b8d32019-12-17 20:37:56 +00003459Int4::Int4(const Reference<UInt4> &rhs)
3460 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003461{
3462 Value *value = rhs.loadValue();
3463 storeValue(value);
3464}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003465
Ben Clayton713b8d32019-12-17 20:37:56 +00003466Int4::Int4(RValue<Int2> lo, RValue<Int2> hi)
3467 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003468{
Ben Clayton713b8d32019-12-17 20:37:56 +00003469 int shuffle[4] = { 0, 1, 4, 5 }; // Real type is v4i32
Nicolas Capens157ba262019-12-10 17:49:14 -05003470 Value *packed = Nucleus::createShuffleVector(lo.value, hi.value, shuffle);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003471
Nicolas Capens157ba262019-12-10 17:49:14 -05003472 storeValue(packed);
3473}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003474
Ben Clayton713b8d32019-12-17 20:37:56 +00003475Int4::Int4(const Int &rhs)
3476 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003477{
3478 *this = RValue<Int>(rhs.loadValue());
3479}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003480
Ben Clayton713b8d32019-12-17 20:37:56 +00003481Int4::Int4(const Reference<Int> &rhs)
3482 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003483{
3484 *this = RValue<Int>(rhs.loadValue());
3485}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003486
Nicolas Capens157ba262019-12-10 17:49:14 -05003487RValue<Int4> Int4::operator=(RValue<Int4> rhs)
3488{
3489 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003490
Nicolas Capens157ba262019-12-10 17:49:14 -05003491 return rhs;
3492}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003493
Nicolas Capens157ba262019-12-10 17:49:14 -05003494RValue<Int4> Int4::operator=(const Int4 &rhs)
3495{
3496 Value *value = rhs.loadValue();
3497 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003498
Nicolas Capens157ba262019-12-10 17:49:14 -05003499 return RValue<Int4>(value);
3500}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003501
Nicolas Capens157ba262019-12-10 17:49:14 -05003502RValue<Int4> Int4::operator=(const Reference<Int4> &rhs)
3503{
3504 Value *value = rhs.loadValue();
3505 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003506
Nicolas Capens157ba262019-12-10 17:49:14 -05003507 return RValue<Int4>(value);
3508}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003509
Nicolas Capens157ba262019-12-10 17:49:14 -05003510RValue<Int4> operator+(RValue<Int4> lhs, RValue<Int4> rhs)
3511{
3512 return RValue<Int4>(Nucleus::createAdd(lhs.value, rhs.value));
3513}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003514
Nicolas Capens157ba262019-12-10 17:49:14 -05003515RValue<Int4> operator-(RValue<Int4> lhs, RValue<Int4> rhs)
3516{
3517 return RValue<Int4>(Nucleus::createSub(lhs.value, rhs.value));
3518}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003519
Nicolas Capens157ba262019-12-10 17:49:14 -05003520RValue<Int4> operator*(RValue<Int4> lhs, RValue<Int4> rhs)
3521{
3522 return RValue<Int4>(Nucleus::createMul(lhs.value, rhs.value));
3523}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003524
Nicolas Capens157ba262019-12-10 17:49:14 -05003525RValue<Int4> operator/(RValue<Int4> lhs, RValue<Int4> rhs)
3526{
3527 return RValue<Int4>(Nucleus::createSDiv(lhs.value, rhs.value));
3528}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003529
Nicolas Capens157ba262019-12-10 17:49:14 -05003530RValue<Int4> operator%(RValue<Int4> lhs, RValue<Int4> rhs)
3531{
3532 return RValue<Int4>(Nucleus::createSRem(lhs.value, rhs.value));
3533}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003534
Nicolas Capens157ba262019-12-10 17:49:14 -05003535RValue<Int4> operator&(RValue<Int4> lhs, RValue<Int4> rhs)
3536{
3537 return RValue<Int4>(Nucleus::createAnd(lhs.value, rhs.value));
3538}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003539
Nicolas Capens157ba262019-12-10 17:49:14 -05003540RValue<Int4> operator|(RValue<Int4> lhs, RValue<Int4> rhs)
3541{
3542 return RValue<Int4>(Nucleus::createOr(lhs.value, rhs.value));
3543}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003544
Nicolas Capens157ba262019-12-10 17:49:14 -05003545RValue<Int4> operator^(RValue<Int4> lhs, RValue<Int4> rhs)
3546{
3547 return RValue<Int4>(Nucleus::createXor(lhs.value, rhs.value));
3548}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003549
Nicolas Capens157ba262019-12-10 17:49:14 -05003550RValue<Int4> operator<<(RValue<Int4> lhs, RValue<Int4> rhs)
3551{
3552 return RValue<Int4>(Nucleus::createShl(lhs.value, rhs.value));
3553}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003554
Nicolas Capens157ba262019-12-10 17:49:14 -05003555RValue<Int4> operator>>(RValue<Int4> lhs, RValue<Int4> rhs)
3556{
3557 return RValue<Int4>(Nucleus::createAShr(lhs.value, rhs.value));
3558}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003559
Nicolas Capens157ba262019-12-10 17:49:14 -05003560RValue<Int4> operator+=(Int4 &lhs, RValue<Int4> rhs)
3561{
3562 return lhs = lhs + rhs;
3563}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003564
Nicolas Capens157ba262019-12-10 17:49:14 -05003565RValue<Int4> operator-=(Int4 &lhs, RValue<Int4> rhs)
3566{
3567 return lhs = lhs - rhs;
3568}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003569
Nicolas Capens157ba262019-12-10 17:49:14 -05003570RValue<Int4> operator*=(Int4 &lhs, RValue<Int4> rhs)
3571{
3572 return lhs = lhs * rhs;
3573}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003574
3575// RValue<Int4> operator/=(Int4 &lhs, RValue<Int4> rhs)
3576// {
3577// return lhs = lhs / rhs;
3578// }
3579
3580// RValue<Int4> operator%=(Int4 &lhs, RValue<Int4> rhs)
3581// {
3582// return lhs = lhs % rhs;
3583// }
3584
Nicolas Capens157ba262019-12-10 17:49:14 -05003585RValue<Int4> operator&=(Int4 &lhs, RValue<Int4> rhs)
3586{
3587 return lhs = lhs & rhs;
3588}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003589
Nicolas Capens157ba262019-12-10 17:49:14 -05003590RValue<Int4> operator|=(Int4 &lhs, RValue<Int4> rhs)
3591{
3592 return lhs = lhs | rhs;
3593}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003594
Nicolas Capens157ba262019-12-10 17:49:14 -05003595RValue<Int4> operator^=(Int4 &lhs, RValue<Int4> rhs)
3596{
3597 return lhs = lhs ^ rhs;
3598}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003599
Nicolas Capens157ba262019-12-10 17:49:14 -05003600RValue<Int4> operator<<=(Int4 &lhs, unsigned char rhs)
3601{
3602 return lhs = lhs << rhs;
3603}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003604
Nicolas Capens157ba262019-12-10 17:49:14 -05003605RValue<Int4> operator>>=(Int4 &lhs, unsigned char rhs)
3606{
3607 return lhs = lhs >> rhs;
3608}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003609
Nicolas Capens157ba262019-12-10 17:49:14 -05003610RValue<Int4> operator+(RValue<Int4> val)
3611{
3612 return val;
3613}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003614
Nicolas Capens157ba262019-12-10 17:49:14 -05003615RValue<Int4> operator-(RValue<Int4> val)
3616{
3617 return RValue<Int4>(Nucleus::createNeg(val.value));
3618}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003619
Nicolas Capens157ba262019-12-10 17:49:14 -05003620RValue<Int4> operator~(RValue<Int4> val)
3621{
3622 return RValue<Int4>(Nucleus::createNot(val.value));
3623}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003624
Nicolas Capens157ba262019-12-10 17:49:14 -05003625RValue<Int> Extract(RValue<Int4> x, int i)
3626{
3627 return RValue<Int>(Nucleus::createExtractElement(x.value, Int::getType(), i));
3628}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003629
Nicolas Capens157ba262019-12-10 17:49:14 -05003630RValue<Int4> Insert(RValue<Int4> x, RValue<Int> element, int i)
3631{
3632 return RValue<Int4>(Nucleus::createInsertElement(x.value, element.value, i));
3633}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003634
Nicolas Capens157ba262019-12-10 17:49:14 -05003635RValue<Int4> Swizzle(RValue<Int4> x, uint16_t select)
3636{
3637 return RValue<Int4>(createSwizzle4(x.value, select));
3638}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003639
Nicolas Capens157ba262019-12-10 17:49:14 -05003640RValue<Int4> Shuffle(RValue<Int4> x, RValue<Int4> y, unsigned short select)
3641{
Nicolas Capensd95467e2020-01-16 01:44:39 -05003642 return RValue<Int4>(createShuffle4(x.value, y.value, select));
Nicolas Capens157ba262019-12-10 17:49:14 -05003643}
David 'Digit' Turnerb9f03f42019-12-04 19:32:34 +01003644
Ben Clayton713b8d32019-12-17 20:37:56 +00003645UInt4::UInt4()
3646 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003647{
3648}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003649
Ben Clayton713b8d32019-12-17 20:37:56 +00003650UInt4::UInt4(int xyzw)
3651 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003652{
3653 constant(xyzw, xyzw, xyzw, xyzw);
3654}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003655
Ben Clayton713b8d32019-12-17 20:37:56 +00003656UInt4::UInt4(int x, int yzw)
3657 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003658{
3659 constant(x, yzw, yzw, yzw);
3660}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003661
Ben Clayton713b8d32019-12-17 20:37:56 +00003662UInt4::UInt4(int x, int y, int zw)
3663 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003664{
3665 constant(x, y, zw, zw);
3666}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003667
Ben Clayton713b8d32019-12-17 20:37:56 +00003668UInt4::UInt4(int x, int y, int z, int w)
3669 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003670{
3671 constant(x, y, z, w);
3672}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003673
Nicolas Capens157ba262019-12-10 17:49:14 -05003674void UInt4::constant(int x, int y, int z, int w)
3675{
Ben Clayton713b8d32019-12-17 20:37:56 +00003676 int64_t constantVector[4] = { x, y, z, w };
Nicolas Capens157ba262019-12-10 17:49:14 -05003677 storeValue(Nucleus::createConstantVector(constantVector, getType()));
3678}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003679
Ben Clayton713b8d32019-12-17 20:37:56 +00003680UInt4::UInt4(RValue<UInt4> rhs)
3681 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003682{
3683 storeValue(rhs.value);
3684}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003685
Ben Clayton713b8d32019-12-17 20:37:56 +00003686UInt4::UInt4(const UInt4 &rhs)
3687 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003688{
3689 Value *value = rhs.loadValue();
3690 storeValue(value);
3691}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003692
Ben Clayton713b8d32019-12-17 20:37:56 +00003693UInt4::UInt4(const Reference<UInt4> &rhs)
3694 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003695{
3696 Value *value = rhs.loadValue();
3697 storeValue(value);
3698}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003699
Ben Clayton713b8d32019-12-17 20:37:56 +00003700UInt4::UInt4(RValue<Int4> rhs)
3701 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003702{
3703 storeValue(rhs.value);
3704}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003705
Ben Clayton713b8d32019-12-17 20:37:56 +00003706UInt4::UInt4(const Int4 &rhs)
3707 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003708{
3709 Value *value = rhs.loadValue();
3710 storeValue(value);
3711}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003712
Ben Clayton713b8d32019-12-17 20:37:56 +00003713UInt4::UInt4(const Reference<Int4> &rhs)
3714 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003715{
3716 Value *value = rhs.loadValue();
3717 storeValue(value);
3718}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003719
Ben Clayton713b8d32019-12-17 20:37:56 +00003720UInt4::UInt4(RValue<UInt2> lo, RValue<UInt2> hi)
3721 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003722{
Ben Clayton713b8d32019-12-17 20:37:56 +00003723 int shuffle[4] = { 0, 1, 4, 5 }; // Real type is v4i32
Nicolas Capens157ba262019-12-10 17:49:14 -05003724 Value *packed = Nucleus::createShuffleVector(lo.value, hi.value, shuffle);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003725
Nicolas Capens157ba262019-12-10 17:49:14 -05003726 storeValue(packed);
3727}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003728
Ben Clayton713b8d32019-12-17 20:37:56 +00003729UInt4::UInt4(const UInt &rhs)
3730 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003731{
3732 *this = RValue<UInt>(rhs.loadValue());
3733}
Ben Clayton88816fa2019-05-15 17:08:14 +01003734
Ben Clayton713b8d32019-12-17 20:37:56 +00003735UInt4::UInt4(const Reference<UInt> &rhs)
3736 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003737{
3738 *this = RValue<UInt>(rhs.loadValue());
3739}
Ben Clayton88816fa2019-05-15 17:08:14 +01003740
Nicolas Capens157ba262019-12-10 17:49:14 -05003741RValue<UInt4> UInt4::operator=(RValue<UInt4> rhs)
3742{
3743 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003744
Nicolas Capens157ba262019-12-10 17:49:14 -05003745 return rhs;
3746}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003747
Nicolas Capens157ba262019-12-10 17:49:14 -05003748RValue<UInt4> UInt4::operator=(const UInt4 &rhs)
3749{
3750 Value *value = rhs.loadValue();
3751 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003752
Nicolas Capens157ba262019-12-10 17:49:14 -05003753 return RValue<UInt4>(value);
3754}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003755
Nicolas Capens157ba262019-12-10 17:49:14 -05003756RValue<UInt4> UInt4::operator=(const Reference<UInt4> &rhs)
3757{
3758 Value *value = rhs.loadValue();
3759 storeValue(value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003760
Nicolas Capens157ba262019-12-10 17:49:14 -05003761 return RValue<UInt4>(value);
3762}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003763
Nicolas Capens157ba262019-12-10 17:49:14 -05003764RValue<UInt4> operator+(RValue<UInt4> lhs, RValue<UInt4> rhs)
3765{
3766 return RValue<UInt4>(Nucleus::createAdd(lhs.value, rhs.value));
3767}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003768
Nicolas Capens157ba262019-12-10 17:49:14 -05003769RValue<UInt4> operator-(RValue<UInt4> lhs, RValue<UInt4> rhs)
3770{
3771 return RValue<UInt4>(Nucleus::createSub(lhs.value, rhs.value));
3772}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003773
Nicolas Capens157ba262019-12-10 17:49:14 -05003774RValue<UInt4> operator*(RValue<UInt4> lhs, RValue<UInt4> rhs)
3775{
3776 return RValue<UInt4>(Nucleus::createMul(lhs.value, rhs.value));
3777}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003778
Nicolas Capens157ba262019-12-10 17:49:14 -05003779RValue<UInt4> operator/(RValue<UInt4> lhs, RValue<UInt4> rhs)
3780{
3781 return RValue<UInt4>(Nucleus::createUDiv(lhs.value, rhs.value));
3782}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003783
Nicolas Capens157ba262019-12-10 17:49:14 -05003784RValue<UInt4> operator%(RValue<UInt4> lhs, RValue<UInt4> rhs)
3785{
3786 return RValue<UInt4>(Nucleus::createURem(lhs.value, rhs.value));
3787}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003788
Nicolas Capens157ba262019-12-10 17:49:14 -05003789RValue<UInt4> operator&(RValue<UInt4> lhs, RValue<UInt4> rhs)
3790{
3791 return RValue<UInt4>(Nucleus::createAnd(lhs.value, rhs.value));
3792}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003793
Nicolas Capens157ba262019-12-10 17:49:14 -05003794RValue<UInt4> operator|(RValue<UInt4> lhs, RValue<UInt4> rhs)
3795{
3796 return RValue<UInt4>(Nucleus::createOr(lhs.value, rhs.value));
3797}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003798
Nicolas Capens157ba262019-12-10 17:49:14 -05003799RValue<UInt4> operator^(RValue<UInt4> lhs, RValue<UInt4> rhs)
3800{
3801 return RValue<UInt4>(Nucleus::createXor(lhs.value, rhs.value));
3802}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003803
Nicolas Capens157ba262019-12-10 17:49:14 -05003804RValue<UInt4> operator<<(RValue<UInt4> lhs, RValue<UInt4> rhs)
3805{
3806 return RValue<UInt4>(Nucleus::createShl(lhs.value, rhs.value));
3807}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003808
Nicolas Capens157ba262019-12-10 17:49:14 -05003809RValue<UInt4> operator>>(RValue<UInt4> lhs, RValue<UInt4> rhs)
3810{
3811 return RValue<UInt4>(Nucleus::createLShr(lhs.value, rhs.value));
3812}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003813
Nicolas Capens157ba262019-12-10 17:49:14 -05003814RValue<UInt4> operator+=(UInt4 &lhs, RValue<UInt4> rhs)
3815{
3816 return lhs = lhs + rhs;
3817}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003818
Nicolas Capens157ba262019-12-10 17:49:14 -05003819RValue<UInt4> operator-=(UInt4 &lhs, RValue<UInt4> rhs)
3820{
3821 return lhs = lhs - rhs;
3822}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003823
Nicolas Capens157ba262019-12-10 17:49:14 -05003824RValue<UInt4> operator*=(UInt4 &lhs, RValue<UInt4> rhs)
3825{
3826 return lhs = lhs * rhs;
3827}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003828
3829// RValue<UInt4> operator/=(UInt4 &lhs, RValue<UInt4> rhs)
3830// {
3831// return lhs = lhs / rhs;
3832// }
3833
3834// RValue<UInt4> operator%=(UInt4 &lhs, RValue<UInt4> rhs)
3835// {
3836// return lhs = lhs % rhs;
3837// }
3838
Nicolas Capens157ba262019-12-10 17:49:14 -05003839RValue<UInt4> operator&=(UInt4 &lhs, RValue<UInt4> rhs)
3840{
3841 return lhs = lhs & rhs;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003842}
Nicolas Capens157ba262019-12-10 17:49:14 -05003843
3844RValue<UInt4> operator|=(UInt4 &lhs, RValue<UInt4> rhs)
3845{
3846 return lhs = lhs | rhs;
3847}
3848
3849RValue<UInt4> operator^=(UInt4 &lhs, RValue<UInt4> rhs)
3850{
3851 return lhs = lhs ^ rhs;
3852}
3853
3854RValue<UInt4> operator<<=(UInt4 &lhs, unsigned char rhs)
3855{
3856 return lhs = lhs << rhs;
3857}
3858
3859RValue<UInt4> operator>>=(UInt4 &lhs, unsigned char rhs)
3860{
3861 return lhs = lhs >> rhs;
3862}
3863
3864RValue<UInt4> operator+(RValue<UInt4> val)
3865{
3866 return val;
3867}
3868
3869RValue<UInt4> operator-(RValue<UInt4> val)
3870{
3871 return RValue<UInt4>(Nucleus::createNeg(val.value));
3872}
3873
3874RValue<UInt4> operator~(RValue<UInt4> val)
3875{
3876 return RValue<UInt4>(Nucleus::createNot(val.value));
3877}
3878
3879RValue<UInt> Extract(RValue<UInt4> x, int i)
3880{
3881 return RValue<UInt>(Nucleus::createExtractElement(x.value, Int::getType(), i));
3882}
3883
3884RValue<UInt4> Insert(RValue<UInt4> x, RValue<UInt> element, int i)
3885{
3886 return RValue<UInt4>(Nucleus::createInsertElement(x.value, element.value, i));
3887}
3888
3889RValue<UInt4> Swizzle(RValue<UInt4> x, uint16_t select)
3890{
3891 return RValue<UInt4>(createSwizzle4(x.value, select));
3892}
3893
3894RValue<UInt4> Shuffle(RValue<UInt4> x, RValue<UInt4> y, unsigned short select)
3895{
Nicolas Capensd95467e2020-01-16 01:44:39 -05003896 return RValue<UInt4>(createShuffle4(x.value, y.value, select));
Nicolas Capens157ba262019-12-10 17:49:14 -05003897}
3898
3899Half::Half(RValue<Float> cast)
3900{
3901 UInt fp32i = As<UInt>(cast);
3902 UInt abs = fp32i & 0x7FFFFFFF;
Ben Clayton713b8d32019-12-17 20:37:56 +00003903 UShort fp16i((fp32i & 0x80000000) >> 16); // sign
Nicolas Capens157ba262019-12-10 17:49:14 -05003904
Ben Clayton713b8d32019-12-17 20:37:56 +00003905 If(abs > 0x47FFEFFF) // Infinity
Nicolas Capens157ba262019-12-10 17:49:14 -05003906 {
3907 fp16i |= UShort(0x7FFF);
3908 }
3909 Else
3910 {
Ben Clayton713b8d32019-12-17 20:37:56 +00003911 If(abs < 0x38800000) // Denormal
Nicolas Capens157ba262019-12-10 17:49:14 -05003912 {
3913 Int mantissa = (abs & 0x007FFFFF) | 0x00800000;
3914 Int e = 113 - (abs >> 23);
Nicolas Capens60f8c2e2019-12-12 13:40:15 -05003915 abs = IfThenElse(e < 24, (mantissa >> e), Int(0));
Nicolas Capens157ba262019-12-10 17:49:14 -05003916 fp16i |= UShort((abs + 0x00000FFF + ((abs >> 13) & 1)) >> 13);
3917 }
3918 Else
3919 {
3920 fp16i |= UShort((abs + 0xC8000000 + 0x00000FFF + ((abs >> 13) & 1)) >> 13);
3921 }
3922 }
3923
3924 storeValue(fp16i.loadValue());
3925}
3926
3927Float::Float(RValue<Int> cast)
3928{
3929 Value *integer = Nucleus::createSIToFP(cast.value, Float::getType());
3930
3931 storeValue(integer);
3932}
3933
3934Float::Float(RValue<UInt> cast)
3935{
3936 RValue<Float> result = Float(Int(cast & UInt(0x7FFFFFFF))) +
3937 As<Float>((As<Int>(cast) >> 31) & As<Int>(Float(0x80000000u)));
3938
3939 storeValue(result.value);
3940}
3941
3942Float::Float(RValue<Half> cast)
3943{
3944 Int fp16i(As<UShort>(cast));
3945
3946 Int s = (fp16i >> 15) & 0x00000001;
3947 Int e = (fp16i >> 10) & 0x0000001F;
3948 Int m = fp16i & 0x000003FF;
3949
3950 UInt fp32i(s << 31);
3951 If(e == 0)
3952 {
3953 If(m != 0)
3954 {
3955 While((m & 0x00000400) == 0)
3956 {
3957 m <<= 1;
3958 e -= 1;
3959 }
3960
3961 fp32i |= As<UInt>(((e + (127 - 15) + 1) << 23) | ((m & ~0x00000400) << 13));
3962 }
3963 }
3964 Else
3965 {
3966 fp32i |= As<UInt>(((e + (127 - 15)) << 23) | (m << 13));
3967 }
3968
3969 storeValue(As<Float>(fp32i).value);
3970}
3971
3972Float::Float(float x)
3973{
3974 // C++ does not have a way to write an infinite or NaN literal,
3975 // nor does it allow division by zero as a constant expression.
3976 // Thus we should not accept inf or NaN as a Reactor Float constant,
3977 // as this would typically idicate a bug, and avoids undefined
3978 // behavior.
3979 //
3980 // This also prevents the issue of the LLVM JIT only taking double
3981 // values for constructing floating-point constants. During the
3982 // conversion from single-precision to double, a signaling NaN can
3983 // become a quiet NaN, thus altering its bit pattern. Hence this
3984 // assert is also helpful for detecting cases where integers are
3985 // being reinterpreted as float and then bitcast to integer again,
3986 // which does not guarantee preserving the integer value.
3987 //
Nicolas Capense5720882020-01-13 14:10:04 -05003988 // The inifinity() method can be used to obtain positive infinity.
3989 // Should NaN constants be required, methods like quiet_NaN() and
3990 // signaling_NaN() should be added (matching std::numeric_limits).
Nicolas Capens157ba262019-12-10 17:49:14 -05003991 ASSERT(std::isfinite(x));
3992
3993 storeValue(Nucleus::createConstantFloat(x));
3994}
3995
Nicolas Capense5720882020-01-13 14:10:04 -05003996// TODO(b/140302841): Negative infinity can be obtained by using '-infinity()'.
3997// This comes at a minor run-time JIT cost, and the backend may or may not
3998// perform constant folding. This can be optimized by having Reactor perform
3999// the folding, which would still be cheaper than having a capable backend do it.
4000Float Float::infinity()
4001{
4002 Float result;
4003
4004 constexpr double inf = std::numeric_limits<double>::infinity();
4005 result.storeValue(Nucleus::createConstantFloat(inf));
4006
4007 return result;
4008}
4009
Nicolas Capens157ba262019-12-10 17:49:14 -05004010Float::Float(RValue<Float> rhs)
4011{
4012 storeValue(rhs.value);
4013}
4014
4015Float::Float(const Float &rhs)
4016{
4017 Value *value = rhs.loadValue();
4018 storeValue(value);
4019}
4020
4021Float::Float(const Reference<Float> &rhs)
4022{
4023 Value *value = rhs.loadValue();
4024 storeValue(value);
4025}
4026
4027Float::Float(Argument<Float> argument)
4028{
4029 storeValue(argument.value);
4030}
4031
4032RValue<Float> Float::operator=(RValue<Float> rhs)
4033{
4034 storeValue(rhs.value);
4035
4036 return rhs;
4037}
4038
4039RValue<Float> Float::operator=(const Float &rhs)
4040{
4041 Value *value = rhs.loadValue();
4042 storeValue(value);
4043
4044 return RValue<Float>(value);
4045}
4046
4047RValue<Float> Float::operator=(const Reference<Float> &rhs)
4048{
4049 Value *value = rhs.loadValue();
4050 storeValue(value);
4051
4052 return RValue<Float>(value);
4053}
4054
4055RValue<Float> operator+(RValue<Float> lhs, RValue<Float> rhs)
4056{
4057 return RValue<Float>(Nucleus::createFAdd(lhs.value, rhs.value));
4058}
4059
4060RValue<Float> operator-(RValue<Float> lhs, RValue<Float> rhs)
4061{
4062 return RValue<Float>(Nucleus::createFSub(lhs.value, rhs.value));
4063}
4064
4065RValue<Float> operator*(RValue<Float> lhs, RValue<Float> rhs)
4066{
4067 return RValue<Float>(Nucleus::createFMul(lhs.value, rhs.value));
4068}
4069
4070RValue<Float> operator/(RValue<Float> lhs, RValue<Float> rhs)
4071{
4072 return RValue<Float>(Nucleus::createFDiv(lhs.value, rhs.value));
4073}
4074
4075RValue<Float> operator+=(Float &lhs, RValue<Float> rhs)
4076{
4077 return lhs = lhs + rhs;
4078}
4079
4080RValue<Float> operator-=(Float &lhs, RValue<Float> rhs)
4081{
4082 return lhs = lhs - rhs;
4083}
4084
4085RValue<Float> operator*=(Float &lhs, RValue<Float> rhs)
4086{
4087 return lhs = lhs * rhs;
4088}
4089
4090RValue<Float> operator/=(Float &lhs, RValue<Float> rhs)
4091{
4092 return lhs = lhs / rhs;
4093}
4094
4095RValue<Float> operator+(RValue<Float> val)
4096{
4097 return val;
4098}
4099
4100RValue<Float> operator-(RValue<Float> val)
4101{
4102 return RValue<Float>(Nucleus::createFNeg(val.value));
4103}
4104
4105RValue<Bool> operator<(RValue<Float> lhs, RValue<Float> rhs)
4106{
4107 return RValue<Bool>(Nucleus::createFCmpOLT(lhs.value, rhs.value));
4108}
4109
4110RValue<Bool> operator<=(RValue<Float> lhs, RValue<Float> rhs)
4111{
4112 return RValue<Bool>(Nucleus::createFCmpOLE(lhs.value, rhs.value));
4113}
4114
4115RValue<Bool> operator>(RValue<Float> lhs, RValue<Float> rhs)
4116{
4117 return RValue<Bool>(Nucleus::createFCmpOGT(lhs.value, rhs.value));
4118}
4119
4120RValue<Bool> operator>=(RValue<Float> lhs, RValue<Float> rhs)
4121{
4122 return RValue<Bool>(Nucleus::createFCmpOGE(lhs.value, rhs.value));
4123}
4124
4125RValue<Bool> operator!=(RValue<Float> lhs, RValue<Float> rhs)
4126{
4127 return RValue<Bool>(Nucleus::createFCmpONE(lhs.value, rhs.value));
4128}
4129
4130RValue<Bool> operator==(RValue<Float> lhs, RValue<Float> rhs)
4131{
4132 return RValue<Bool>(Nucleus::createFCmpOEQ(lhs.value, rhs.value));
4133}
4134
4135RValue<Float> Abs(RValue<Float> x)
4136{
4137 return IfThenElse(x > 0.0f, x, -x);
4138}
4139
4140RValue<Float> Max(RValue<Float> x, RValue<Float> y)
4141{
4142 return IfThenElse(x > y, x, y);
4143}
4144
4145RValue<Float> Min(RValue<Float> x, RValue<Float> y)
4146{
4147 return IfThenElse(x < y, x, y);
4148}
4149
4150Float2::Float2(RValue<Float4> cast)
4151{
4152 storeValue(Nucleus::createBitCast(cast.value, getType()));
4153}
4154
Ben Clayton713b8d32019-12-17 20:37:56 +00004155Float4::Float4(RValue<Byte4> cast)
4156 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004157{
4158 Value *a = Int4(cast).loadValue();
4159 Value *xyzw = Nucleus::createSIToFP(a, Float4::getType());
4160
4161 storeValue(xyzw);
4162}
4163
Ben Clayton713b8d32019-12-17 20:37:56 +00004164Float4::Float4(RValue<SByte4> cast)
4165 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004166{
4167 Value *a = Int4(cast).loadValue();
4168 Value *xyzw = Nucleus::createSIToFP(a, Float4::getType());
4169
4170 storeValue(xyzw);
4171}
4172
Ben Clayton713b8d32019-12-17 20:37:56 +00004173Float4::Float4(RValue<Short4> cast)
4174 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004175{
4176 Int4 c(cast);
4177 storeValue(Nucleus::createSIToFP(RValue<Int4>(c).value, Float4::getType()));
4178}
4179
Ben Clayton713b8d32019-12-17 20:37:56 +00004180Float4::Float4(RValue<UShort4> cast)
4181 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004182{
4183 Int4 c(cast);
4184 storeValue(Nucleus::createSIToFP(RValue<Int4>(c).value, Float4::getType()));
4185}
4186
Ben Clayton713b8d32019-12-17 20:37:56 +00004187Float4::Float4(RValue<Int4> cast)
4188 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004189{
4190 Value *xyzw = Nucleus::createSIToFP(cast.value, Float4::getType());
4191
4192 storeValue(xyzw);
4193}
4194
Ben Clayton713b8d32019-12-17 20:37:56 +00004195Float4::Float4(RValue<UInt4> cast)
4196 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004197{
4198 RValue<Float4> result = Float4(Int4(cast & UInt4(0x7FFFFFFF))) +
4199 As<Float4>((As<Int4>(cast) >> 31) & As<Int4>(Float4(0x80000000u)));
4200
4201 storeValue(result.value);
4202}
4203
Ben Clayton713b8d32019-12-17 20:37:56 +00004204Float4::Float4()
4205 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004206{
4207}
4208
Ben Clayton713b8d32019-12-17 20:37:56 +00004209Float4::Float4(float xyzw)
4210 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004211{
4212 constant(xyzw, xyzw, xyzw, xyzw);
4213}
4214
Ben Clayton713b8d32019-12-17 20:37:56 +00004215Float4::Float4(float x, float yzw)
4216 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004217{
4218 constant(x, yzw, yzw, yzw);
4219}
4220
Ben Clayton713b8d32019-12-17 20:37:56 +00004221Float4::Float4(float x, float y, float zw)
4222 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004223{
4224 constant(x, y, zw, zw);
4225}
4226
Ben Clayton713b8d32019-12-17 20:37:56 +00004227Float4::Float4(float x, float y, float z, float w)
4228 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004229{
4230 constant(x, y, z, w);
4231}
4232
Nicolas Capense5720882020-01-13 14:10:04 -05004233Float4 Float4::infinity()
Nicolas Capens157ba262019-12-10 17:49:14 -05004234{
4235 Float4 result;
Nicolas Capens157ba262019-12-10 17:49:14 -05004236
Nicolas Capense5720882020-01-13 14:10:04 -05004237 constexpr double inf = std::numeric_limits<double>::infinity();
Ben Clayton713b8d32019-12-17 20:37:56 +00004238 double constantVector[4] = { inf, inf, inf, inf };
Nicolas Capense5720882020-01-13 14:10:04 -05004239 result.storeValue(Nucleus::createConstantVector(constantVector, getType()));
4240
4241 return result;
Nicolas Capens157ba262019-12-10 17:49:14 -05004242}
4243
4244void Float4::constant(float x, float y, float z, float w)
4245{
4246 // See Float(float) constructor for the rationale behind this assert.
4247 ASSERT(std::isfinite(x) && std::isfinite(y) && std::isfinite(z) && std::isfinite(w));
4248
Ben Clayton713b8d32019-12-17 20:37:56 +00004249 double constantVector[4] = { x, y, z, w };
Nicolas Capens157ba262019-12-10 17:49:14 -05004250 storeValue(Nucleus::createConstantVector(constantVector, getType()));
4251}
4252
Ben Clayton713b8d32019-12-17 20:37:56 +00004253Float4::Float4(RValue<Float4> rhs)
4254 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004255{
4256 storeValue(rhs.value);
4257}
4258
Ben Clayton713b8d32019-12-17 20:37:56 +00004259Float4::Float4(const Float4 &rhs)
4260 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004261{
4262 Value *value = rhs.loadValue();
4263 storeValue(value);
4264}
4265
Ben Clayton713b8d32019-12-17 20:37:56 +00004266Float4::Float4(const Reference<Float4> &rhs)
4267 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004268{
4269 Value *value = rhs.loadValue();
4270 storeValue(value);
4271}
4272
Ben Clayton713b8d32019-12-17 20:37:56 +00004273Float4::Float4(const Float &rhs)
4274 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004275{
4276 *this = RValue<Float>(rhs.loadValue());
4277}
4278
Ben Clayton713b8d32019-12-17 20:37:56 +00004279Float4::Float4(const Reference<Float> &rhs)
4280 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004281{
4282 *this = RValue<Float>(rhs.loadValue());
4283}
4284
4285RValue<Float4> Float4::operator=(float x)
4286{
4287 return *this = Float4(x, x, x, x);
4288}
4289
4290RValue<Float4> Float4::operator=(RValue<Float4> rhs)
4291{
4292 storeValue(rhs.value);
4293
4294 return rhs;
4295}
4296
4297RValue<Float4> Float4::operator=(const Float4 &rhs)
4298{
4299 Value *value = rhs.loadValue();
4300 storeValue(value);
4301
4302 return RValue<Float4>(value);
4303}
4304
4305RValue<Float4> Float4::operator=(const Reference<Float4> &rhs)
4306{
4307 Value *value = rhs.loadValue();
4308 storeValue(value);
4309
4310 return RValue<Float4>(value);
4311}
4312
4313RValue<Float4> Float4::operator=(RValue<Float> rhs)
4314{
4315 return *this = Float4(rhs);
4316}
4317
4318RValue<Float4> Float4::operator=(const Float &rhs)
4319{
4320 return *this = Float4(rhs);
4321}
4322
4323RValue<Float4> Float4::operator=(const Reference<Float> &rhs)
4324{
4325 return *this = Float4(rhs);
4326}
4327
4328RValue<Float4> operator+(RValue<Float4> lhs, RValue<Float4> rhs)
4329{
4330 return RValue<Float4>(Nucleus::createFAdd(lhs.value, rhs.value));
4331}
4332
4333RValue<Float4> operator-(RValue<Float4> lhs, RValue<Float4> rhs)
4334{
4335 return RValue<Float4>(Nucleus::createFSub(lhs.value, rhs.value));
4336}
4337
4338RValue<Float4> operator*(RValue<Float4> lhs, RValue<Float4> rhs)
4339{
4340 return RValue<Float4>(Nucleus::createFMul(lhs.value, rhs.value));
4341}
4342
4343RValue<Float4> operator/(RValue<Float4> lhs, RValue<Float4> rhs)
4344{
4345 return RValue<Float4>(Nucleus::createFDiv(lhs.value, rhs.value));
4346}
4347
Nicolas Capens157ba262019-12-10 17:49:14 -05004348RValue<Float4> operator+=(Float4 &lhs, RValue<Float4> rhs)
4349{
4350 return lhs = lhs + rhs;
4351}
4352
4353RValue<Float4> operator-=(Float4 &lhs, RValue<Float4> rhs)
4354{
4355 return lhs = lhs - rhs;
4356}
4357
4358RValue<Float4> operator*=(Float4 &lhs, RValue<Float4> rhs)
4359{
4360 return lhs = lhs * rhs;
4361}
4362
4363RValue<Float4> operator/=(Float4 &lhs, RValue<Float4> rhs)
4364{
4365 return lhs = lhs / rhs;
4366}
4367
4368RValue<Float4> operator%=(Float4 &lhs, RValue<Float4> rhs)
4369{
4370 return lhs = lhs % rhs;
4371}
4372
4373RValue<Float4> operator+(RValue<Float4> val)
4374{
4375 return val;
4376}
4377
4378RValue<Float4> operator-(RValue<Float4> val)
4379{
4380 return RValue<Float4>(Nucleus::createFNeg(val.value));
4381}
4382
4383RValue<Float4> Abs(RValue<Float4> x)
4384{
4385 // TODO: Optimize.
4386 Value *vector = Nucleus::createBitCast(x.value, Int4::getType());
Ben Clayton713b8d32019-12-17 20:37:56 +00004387 int64_t constantVector[4] = { 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF };
Nicolas Capens157ba262019-12-10 17:49:14 -05004388 Value *result = Nucleus::createAnd(vector, Nucleus::createConstantVector(constantVector, Int4::getType()));
4389
4390 return As<Float4>(result);
4391}
4392
4393RValue<Float4> Insert(RValue<Float4> x, RValue<Float> element, int i)
4394{
4395 return RValue<Float4>(Nucleus::createInsertElement(x.value, element.value, i));
4396}
4397
4398RValue<Float> Extract(RValue<Float4> x, int i)
4399{
4400 return RValue<Float>(Nucleus::createExtractElement(x.value, Float::getType(), i));
4401}
4402
4403RValue<Float4> Swizzle(RValue<Float4> x, uint16_t select)
4404{
4405 return RValue<Float4>(createSwizzle4(x.value, select));
4406}
4407
4408RValue<Float4> Shuffle(RValue<Float4> x, RValue<Float4> y, uint16_t select)
4409{
Nicolas Capensd95467e2020-01-16 01:44:39 -05004410 return RValue<Float4>(createShuffle4(x.value, y.value, select));
Nicolas Capens157ba262019-12-10 17:49:14 -05004411}
4412
4413RValue<Float4> ShuffleLowHigh(RValue<Float4> x, RValue<Float4> y, uint16_t imm)
4414{
Ben Clayton713b8d32019-12-17 20:37:56 +00004415 int shuffle[4] = {
Nicolas Capens157ba262019-12-10 17:49:14 -05004416 ((imm >> 12) & 0x03) + 0,
Ben Clayton713b8d32019-12-17 20:37:56 +00004417 ((imm >> 8) & 0x03) + 0,
4418 ((imm >> 4) & 0x03) + 4,
4419 ((imm >> 0) & 0x03) + 4,
Nicolas Capens157ba262019-12-10 17:49:14 -05004420 };
4421
4422 return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
4423}
4424
4425RValue<Float4> UnpackLow(RValue<Float4> x, RValue<Float4> y)
4426{
Ben Clayton713b8d32019-12-17 20:37:56 +00004427 int shuffle[4] = { 0, 4, 1, 5 };
Nicolas Capens157ba262019-12-10 17:49:14 -05004428 return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
4429}
4430
4431RValue<Float4> UnpackHigh(RValue<Float4> x, RValue<Float4> y)
4432{
Ben Clayton713b8d32019-12-17 20:37:56 +00004433 int shuffle[4] = { 2, 6, 3, 7 };
Nicolas Capens157ba262019-12-10 17:49:14 -05004434 return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
4435}
4436
4437RValue<Float4> Mask(Float4 &lhs, RValue<Float4> rhs, uint16_t select)
4438{
4439 Value *vector = lhs.loadValue();
4440 Value *result = createMask4(vector, rhs.value, select);
4441 lhs.storeValue(result);
4442
4443 return RValue<Float4>(result);
4444}
4445
4446RValue<Int4> IsInf(RValue<Float4> x)
4447{
4448 return CmpEQ(As<Int4>(x) & Int4(0x7FFFFFFF), Int4(0x7F800000));
4449}
4450
4451RValue<Int4> IsNan(RValue<Float4> x)
4452{
4453 return ~CmpEQ(x, x);
4454}
4455
4456RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, int offset)
4457{
4458 return lhs + RValue<Int>(Nucleus::createConstantInt(offset));
4459}
4460
4461RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, RValue<Int> offset)
4462{
4463 return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value, Byte::getType(), offset.value, false));
4464}
4465
4466RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, RValue<UInt> offset)
4467{
4468 return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value, Byte::getType(), offset.value, true));
4469}
4470
4471RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, int offset)
4472{
4473 return lhs = lhs + offset;
4474}
4475
4476RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, RValue<Int> offset)
4477{
4478 return lhs = lhs + offset;
4479}
4480
4481RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, RValue<UInt> offset)
4482{
4483 return lhs = lhs + offset;
4484}
4485
4486RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, int offset)
4487{
4488 return lhs + -offset;
4489}
4490
4491RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, RValue<Int> offset)
4492{
4493 return lhs + -offset;
4494}
4495
4496RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, RValue<UInt> offset)
4497{
4498 return lhs + -offset;
4499}
4500
4501RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, int offset)
4502{
4503 return lhs = lhs - offset;
4504}
4505
4506RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, RValue<Int> offset)
4507{
4508 return lhs = lhs - offset;
4509}
4510
4511RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, RValue<UInt> offset)
4512{
4513 return lhs = lhs - offset;
4514}
4515
4516void Return()
4517{
4518 Nucleus::createRetVoid();
4519 // Place any unreachable instructions in an unreferenced block.
4520 Nucleus::setInsertBlock(Nucleus::createBasicBlock());
4521}
4522
4523void branch(RValue<Bool> cmp, BasicBlock *bodyBB, BasicBlock *endBB)
4524{
4525 Nucleus::createCondBr(cmp.value, bodyBB, endBB);
4526 Nucleus::setInsertBlock(bodyBB);
4527}
4528
4529RValue<Float4> MaskedLoad(RValue<Pointer<Float4>> base, RValue<Int4> mask, unsigned int alignment, bool zeroMaskedLanes /* = false */)
4530{
4531 return RValue<Float4>(Nucleus::createMaskedLoad(base.value, Float::getType(), mask.value, alignment, zeroMaskedLanes));
4532}
4533
4534RValue<Int4> MaskedLoad(RValue<Pointer<Int4>> base, RValue<Int4> mask, unsigned int alignment, bool zeroMaskedLanes /* = false */)
4535{
4536 return RValue<Int4>(Nucleus::createMaskedLoad(base.value, Int::getType(), mask.value, alignment, zeroMaskedLanes));
4537}
4538
4539void MaskedStore(RValue<Pointer<Float4>> base, RValue<Float4> val, RValue<Int4> mask, unsigned int alignment)
4540{
4541 Nucleus::createMaskedStore(base.value, val.value, mask.value, alignment);
4542}
4543
4544void MaskedStore(RValue<Pointer<Int4>> base, RValue<Int4> val, RValue<Int4> mask, unsigned int alignment)
4545{
4546 Nucleus::createMaskedStore(base.value, val.value, mask.value, alignment);
4547}
4548
4549void Fence(std::memory_order memoryOrder)
4550{
4551 ASSERT_MSG(memoryOrder == std::memory_order_acquire ||
Ben Clayton713b8d32019-12-17 20:37:56 +00004552 memoryOrder == std::memory_order_release ||
4553 memoryOrder == std::memory_order_acq_rel ||
4554 memoryOrder == std::memory_order_seq_cst,
4555 "Unsupported memoryOrder: %d", int(memoryOrder));
Nicolas Capens157ba262019-12-10 17:49:14 -05004556 Nucleus::createFence(memoryOrder);
4557}
4558
Ben Clayton713b8d32019-12-17 20:37:56 +00004559Bool CToReactor<bool>::cast(bool v)
4560{
4561 return type(v);
4562}
4563Byte CToReactor<uint8_t>::cast(uint8_t v)
4564{
4565 return type(v);
4566}
4567SByte CToReactor<int8_t>::cast(int8_t v)
4568{
4569 return type(v);
4570}
4571Short CToReactor<int16_t>::cast(int16_t v)
4572{
4573 return type(v);
4574}
4575UShort CToReactor<uint16_t>::cast(uint16_t v)
4576{
4577 return type(v);
4578}
4579Int CToReactor<int32_t>::cast(int32_t v)
4580{
4581 return type(v);
4582}
4583UInt CToReactor<uint32_t>::cast(uint32_t v)
4584{
4585 return type(v);
4586}
4587Float CToReactor<float>::cast(float v)
4588{
4589 return type(v);
4590}
4591Float4 CToReactor<float[4]>::cast(float v[4])
4592{
4593 return type(v[0], v[1], v[2], v[3]);
4594}
Nicolas Capens157ba262019-12-10 17:49:14 -05004595
4596// TODO: Long has no constructor that takes a uint64_t
4597// Long CToReactor<uint64_t>::cast(uint64_t v) { return type(v); }
4598
4599} // namespace rr