blob: 2f2b3363bc9b82ac71ac04313c40c3a4e9fd5c81 [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"
Nicolas Capensc7d5ec32020-04-22 01:11:37 -040016
Antonio Maioranod1561872020-12-14 14:03:53 -050017#include "CPUID.hpp"
Ben Claytonb16c5862019-05-08 14:01:38 +010018#include "Debug.hpp"
Antonio Maiorano62427e02020-02-13 09:18:05 -050019#include "Print.hpp"
Nicolas Capensb6d4ce32019-03-12 23:00:24 -040020
Antonio Maiorano8cbee412020-06-10 15:59:20 -040021#if defined(_WIN32)
22# ifndef WIN32_LEAN_AND_MEAN
23# define WIN32_LEAN_AND_MEAN
24# endif
25# include <windows.h>
26#endif
27
Nicolas Capens08c62002021-11-17 00:25:05 -050028#include <algorithm>
29#include <cmath>
30
Antonio Maiorano84c61e12020-12-02 12:06:05 -050031// Define REACTOR_MATERIALIZE_LVALUES_ON_DEFINITION to non-zero to ensure all
Nicolas Capens70505b42022-01-31 22:29:48 -050032// variables have a stack location obtained through alloca().
Antonio Maiorano84c61e12020-12-02 12:06:05 -050033#ifndef REACTOR_MATERIALIZE_LVALUES_ON_DEFINITION
34# define REACTOR_MATERIALIZE_LVALUES_ON_DEFINITION 0
35#endif
36
Nicolas Capens157ba262019-12-10 17:49:14 -050037namespace rr {
38
Nicolas Capens157ba262019-12-10 17:49:14 -050039Config Config::Edit::apply(const Config &cfg) const
40{
Daniele Vettorel45f7fdc2022-02-04 20:09:08 +000041 auto newDebugCfg = debugCfgChanged ? debugCfg : cfg.debugCfg;
Nicolas Capens157ba262019-12-10 17:49:14 -050042 auto level = optLevelChanged ? optLevel : cfg.optimization.getLevel();
43 auto passes = cfg.optimization.getPasses();
44 apply(optPassEdits, passes);
Daniele Vettorel45f7fdc2022-02-04 20:09:08 +000045 return Config{ Optimization{ level, passes }, newDebugCfg };
Nicolas Capens157ba262019-12-10 17:49:14 -050046}
47
Ben Clayton713b8d32019-12-17 20:37:56 +000048template<typename T>
49void rr::Config::Edit::apply(const std::vector<std::pair<ListEdit, T>> &edits, std::vector<T> &list) const
Nicolas Capens157ba262019-12-10 17:49:14 -050050{
Ben Clayton713b8d32019-12-17 20:37:56 +000051 for(auto &edit : edits)
Nicolas Capens157ba262019-12-10 17:49:14 -050052 {
Nicolas Capens81bc9d92019-12-16 15:05:57 -050053 switch(edit.first)
Nicolas Capens157ba262019-12-10 17:49:14 -050054 {
Nicolas Capens112faf42019-12-13 17:32:26 -050055 case ListEdit::Add:
56 list.push_back(edit.second);
57 break;
58 case ListEdit::Remove:
59 list.erase(std::remove_if(list.begin(), list.end(), [&](T item) {
60 return item == edit.second;
61 }),
62 list.end());
63 break;
64 case ListEdit::Clear:
65 list.clear();
66 break;
Nicolas Capens157ba262019-12-10 17:49:14 -050067 }
Ben Clayton55bc37a2019-07-04 12:17:12 +010068 }
69}
70
Antonio Maioranof14f6c42020-11-03 16:34:35 -050071thread_local Variable::UnmaterializedVariables *Variable::unmaterializedVariables = nullptr;
72
73void Variable::UnmaterializedVariables::add(const Variable *v)
74{
75 variables.emplace(v, counter++);
76}
77
78void Variable::UnmaterializedVariables::remove(const Variable *v)
79{
80 auto iter = variables.find(v);
81 if(iter != variables.end())
82 {
83 variables.erase(iter);
84 }
85}
86
87void Variable::UnmaterializedVariables::clear()
88{
89 variables.clear();
90}
91
92void Variable::UnmaterializedVariables::materializeAll()
93{
94 // Flatten map of Variable* to monotonically increasing counter to a vector,
95 // then sort it by the counter, so that we materialize in variable usage order.
96 std::vector<std::pair<const Variable *, int>> sorted;
97 sorted.resize(variables.size());
98 std::copy(variables.begin(), variables.end(), sorted.begin());
99 std::sort(sorted.begin(), sorted.end(), [&](auto &lhs, auto &rhs) {
100 return lhs.second < rhs.second;
101 });
102
103 for(auto &v : sorted)
104 {
105 v.first->materialize();
106 }
107
108 variables.clear();
109}
Nicolas Capens157ba262019-12-10 17:49:14 -0500110
Antonio Maioranobae138d2020-12-02 14:25:10 -0500111Variable::Variable(Type *type, int arraySize)
112 : type(type)
113 , arraySize(arraySize)
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400114{
Antonio Maiorano84c61e12020-12-02 12:06:05 -0500115#if REACTOR_MATERIALIZE_LVALUES_ON_DEFINITION
116 materialize();
117#else
Antonio Maioranof14f6c42020-11-03 16:34:35 -0500118 unmaterializedVariables->add(this);
Antonio Maiorano84c61e12020-12-02 12:06:05 -0500119#endif
Nicolas Capens157ba262019-12-10 17:49:14 -0500120}
Ben Clayton55bc37a2019-07-04 12:17:12 +0100121
Nicolas Capens157ba262019-12-10 17:49:14 -0500122Variable::~Variable()
123{
Nicolas Capens3d26cfc2021-01-22 16:51:00 -0500124 // `unmaterializedVariables` can be null at this point due to the function
125 // already having been finalized, while classes derived from `Function<>`
126 // can have member `Variable` fields which are destructed afterwards.
127 if(unmaterializedVariables)
128 {
129 unmaterializedVariables->remove(this);
130 }
Nicolas Capens157ba262019-12-10 17:49:14 -0500131}
Ben Clayton55bc37a2019-07-04 12:17:12 +0100132
Nicolas Capens471c1202020-05-28 09:58:46 -0400133void Variable::materialize() const
134{
135 if(!address)
136 {
Antonio Maiorano84c61e12020-12-02 12:06:05 -0500137 address = Nucleus::allocateStackVariable(getType(), arraySize);
Nicolas Capens471c1202020-05-28 09:58:46 -0400138 RR_DEBUG_INFO_EMIT_VAR(address);
139
140 if(rvalue)
141 {
142 storeValue(rvalue);
143 rvalue = nullptr;
144 }
145 }
146}
147
148Value *Variable::loadValue() const
149{
150 if(rvalue)
151 {
152 return rvalue;
153 }
154
155 if(!address)
156 {
157 // TODO: Return undef instead.
158 materialize();
159 }
160
161 return Nucleus::createLoad(address, getType(), false, 0);
162}
163
164Value *Variable::storeValue(Value *value) const
165{
166 if(address)
167 {
168 return Nucleus::createStore(value, address, getType(), false, 0);
169 }
170
171 rvalue = value;
172
173 return value;
174}
175
176Value *Variable::getBaseAddress() const
177{
178 materialize();
179
180 return address;
181}
182
183Value *Variable::getElementPointer(Value *index, bool unsignedIndex) const
184{
185 return Nucleus::createGEP(getBaseAddress(), getType(), index, unsignedIndex);
186}
187
Nicolas Capens157ba262019-12-10 17:49:14 -0500188void Variable::materializeAll()
189{
Antonio Maioranof14f6c42020-11-03 16:34:35 -0500190 unmaterializedVariables->materializeAll();
Nicolas Capens157ba262019-12-10 17:49:14 -0500191}
Nicolas Capens0192d152019-03-27 14:46:07 -0400192
Nicolas Capens157ba262019-12-10 17:49:14 -0500193void Variable::killUnmaterialized()
194{
Nicolas Capens7d6b5912020-04-28 15:57:57 -0400195 unmaterializedVariables->clear();
Nicolas Capens157ba262019-12-10 17:49:14 -0500196}
Nicolas Capens0192d152019-03-27 14:46:07 -0400197
Nicolas Capens157ba262019-12-10 17:49:14 -0500198// NOTE: Only 12 bits out of 16 of the |select| value are used.
199// More specifically, the value should look like:
200//
201// msb lsb
202// v v
203// [.xxx|.yyy|.zzz|.www] where '.' means an ignored bit
204//
205// This format makes it easy to write calls with hexadecimal select values,
206// since each hex digit is a separate swizzle index.
207//
208// For example:
Nicolas Capensd95467e2020-01-16 01:44:39 -0500209// createShuffle4( [a,b,c,d], [e,f,g,h], 0x0123 ) -> [a,b,c,d]
210// createShuffle4( [a,b,c,d], [e,f,g,h], 0x4567 ) -> [e,f,g,h]
211// createShuffle4( [a,b,c,d], [e,f,g,h], 0x4012 ) -> [e,a,b,c]
Nicolas Capens157ba262019-12-10 17:49:14 -0500212//
Nicolas Capensd95467e2020-01-16 01:44:39 -0500213static Value *createShuffle4(Value *lhs, Value *rhs, uint16_t select)
Nicolas Capens157ba262019-12-10 17:49:14 -0500214{
Ben Clayton713b8d32019-12-17 20:37:56 +0000215 int swizzle[4] = {
Nicolas Capens157ba262019-12-10 17:49:14 -0500216 (select >> 12) & 0x07,
Ben Clayton713b8d32019-12-17 20:37:56 +0000217 (select >> 8) & 0x07,
218 (select >> 4) & 0x07,
219 (select >> 0) & 0x07,
Nicolas Capens157ba262019-12-10 17:49:14 -0500220 };
Nicolas Capens0192d152019-03-27 14:46:07 -0400221
Nicolas Capens157ba262019-12-10 17:49:14 -0500222 return Nucleus::createShuffleVector(lhs, rhs, swizzle);
223}
Nicolas Capens0192d152019-03-27 14:46:07 -0400224
Nicolas Capens157ba262019-12-10 17:49:14 -0500225// NOTE: Only 8 bits out of 16 of the |select| value are used.
226// More specifically, the value should look like:
227//
228// msb lsb
229// v v
230// [..xx|..yy|..zz|..ww] where '.' means an ignored bit
231//
232// This format makes it easy to write calls with hexadecimal select values,
233// since each hex digit is a separate swizzle index.
234//
235// For example:
236// createSwizzle4( [a,b,c,d], 0x0123 ) -> [a,b,c,d]
237// createSwizzle4( [a,b,c,d], 0x0033 ) -> [a,a,d,d]
238//
239static Value *createSwizzle4(Value *val, uint16_t select)
240{
Ben Clayton713b8d32019-12-17 20:37:56 +0000241 int swizzle[4] = {
Nicolas Capens157ba262019-12-10 17:49:14 -0500242 (select >> 12) & 0x03,
Ben Clayton713b8d32019-12-17 20:37:56 +0000243 (select >> 8) & 0x03,
244 (select >> 4) & 0x03,
245 (select >> 0) & 0x03,
Nicolas Capens157ba262019-12-10 17:49:14 -0500246 };
David 'Digit' Turnerb9f03f42019-12-04 19:32:34 +0100247
Nicolas Capens157ba262019-12-10 17:49:14 -0500248 return Nucleus::createShuffleVector(val, val, swizzle);
249}
David 'Digit' Turnerb9f03f42019-12-04 19:32:34 +0100250
Nicolas Capens157ba262019-12-10 17:49:14 -0500251static Value *createMask4(Value *lhs, Value *rhs, uint16_t select)
252{
Ben Clayton713b8d32019-12-17 20:37:56 +0000253 bool mask[4] = { false, false, false, false };
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400254
Nicolas Capens157ba262019-12-10 17:49:14 -0500255 mask[(select >> 12) & 0x03] = true;
Ben Clayton713b8d32019-12-17 20:37:56 +0000256 mask[(select >> 8) & 0x03] = true;
257 mask[(select >> 4) & 0x03] = true;
258 mask[(select >> 0) & 0x03] = true;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400259
Ben Clayton713b8d32019-12-17 20:37:56 +0000260 int swizzle[4] = {
Nicolas Capens157ba262019-12-10 17:49:14 -0500261 mask[0] ? 4 : 0,
262 mask[1] ? 5 : 1,
263 mask[2] ? 6 : 2,
264 mask[3] ? 7 : 3,
265 };
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400266
Nicolas Capens157ba262019-12-10 17:49:14 -0500267 return Nucleus::createShuffleVector(lhs, rhs, swizzle);
268}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400269
Nicolas Capens157ba262019-12-10 17:49:14 -0500270Bool::Bool(Argument<Bool> argument)
271{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400272 store(argument.rvalue());
Nicolas Capens157ba262019-12-10 17:49:14 -0500273}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400274
Nicolas Capens157ba262019-12-10 17:49:14 -0500275Bool::Bool(bool x)
276{
277 storeValue(Nucleus::createConstantBool(x));
278}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400279
Nicolas Capens157ba262019-12-10 17:49:14 -0500280Bool::Bool(RValue<Bool> rhs)
281{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400282 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500283}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400284
Nicolas Capens157ba262019-12-10 17:49:14 -0500285Bool::Bool(const Bool &rhs)
286{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400287 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500288}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400289
Nicolas Capens157ba262019-12-10 17:49:14 -0500290Bool::Bool(const Reference<Bool> &rhs)
291{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400292 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500293}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400294
Nicolas Capens157ba262019-12-10 17:49:14 -0500295RValue<Bool> Bool::operator=(RValue<Bool> rhs)
296{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400297 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500298}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400299
Nicolas Capens157ba262019-12-10 17:49:14 -0500300RValue<Bool> Bool::operator=(const Bool &rhs)
301{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400302 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500303}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400304
Nicolas Capens157ba262019-12-10 17:49:14 -0500305RValue<Bool> Bool::operator=(const Reference<Bool> &rhs)
306{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400307 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500308}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400309
Nicolas Capens157ba262019-12-10 17:49:14 -0500310RValue<Bool> operator!(RValue<Bool> val)
311{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400312 return RValue<Bool>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500313}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400314
Nicolas Capens157ba262019-12-10 17:49:14 -0500315RValue<Bool> operator&&(RValue<Bool> lhs, RValue<Bool> rhs)
316{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400317 return RValue<Bool>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500318}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400319
Nicolas Capens157ba262019-12-10 17:49:14 -0500320RValue<Bool> operator||(RValue<Bool> lhs, RValue<Bool> rhs)
321{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400322 return RValue<Bool>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500323}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400324
Nicolas Capens157ba262019-12-10 17:49:14 -0500325RValue<Bool> operator!=(RValue<Bool> lhs, RValue<Bool> rhs)
326{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400327 return RValue<Bool>(Nucleus::createICmpNE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500328}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400329
Nicolas Capens157ba262019-12-10 17:49:14 -0500330RValue<Bool> operator==(RValue<Bool> lhs, RValue<Bool> rhs)
331{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400332 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500333}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400334
Nicolas Capens157ba262019-12-10 17:49:14 -0500335Byte::Byte(Argument<Byte> argument)
336{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400337 store(argument.rvalue());
Nicolas Capens157ba262019-12-10 17:49:14 -0500338}
Ben Claytonf3b57972019-03-15 09:56:47 +0000339
Nicolas Capens157ba262019-12-10 17:49:14 -0500340Byte::Byte(RValue<Int> cast)
341{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400342 Value *integer = Nucleus::createTrunc(cast.value(), Byte::type());
Ben Claytonf3b57972019-03-15 09:56:47 +0000343
Nicolas Capens157ba262019-12-10 17:49:14 -0500344 storeValue(integer);
345}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400346
Nicolas Capens157ba262019-12-10 17:49:14 -0500347Byte::Byte(RValue<UInt> cast)
348{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400349 Value *integer = Nucleus::createTrunc(cast.value(), Byte::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400350
Nicolas Capens157ba262019-12-10 17:49:14 -0500351 storeValue(integer);
352}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400353
Nicolas Capens157ba262019-12-10 17:49:14 -0500354Byte::Byte(RValue<UShort> cast)
355{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400356 Value *integer = Nucleus::createTrunc(cast.value(), Byte::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400357
Nicolas Capens157ba262019-12-10 17:49:14 -0500358 storeValue(integer);
359}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400360
Nicolas Capens157ba262019-12-10 17:49:14 -0500361Byte::Byte(int x)
362{
363 storeValue(Nucleus::createConstantByte((unsigned char)x));
364}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400365
Nicolas Capens157ba262019-12-10 17:49:14 -0500366Byte::Byte(unsigned char x)
367{
368 storeValue(Nucleus::createConstantByte(x));
369}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400370
Nicolas Capens157ba262019-12-10 17:49:14 -0500371Byte::Byte(RValue<Byte> rhs)
372{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400373 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500374}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400375
Nicolas Capens157ba262019-12-10 17:49:14 -0500376Byte::Byte(const Byte &rhs)
377{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400378 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500379}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400380
Nicolas Capens157ba262019-12-10 17:49:14 -0500381Byte::Byte(const Reference<Byte> &rhs)
382{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400383 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500384}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400385
Nicolas Capens157ba262019-12-10 17:49:14 -0500386RValue<Byte> Byte::operator=(RValue<Byte> rhs)
387{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400388 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500389}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400390
Nicolas Capens157ba262019-12-10 17:49:14 -0500391RValue<Byte> Byte::operator=(const Byte &rhs)
392{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400393 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500394}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400395
Nicolas Capens157ba262019-12-10 17:49:14 -0500396RValue<Byte> Byte::operator=(const Reference<Byte> &rhs)
397{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400398 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500399}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400400
Nicolas Capens157ba262019-12-10 17:49:14 -0500401RValue<Byte> operator+(RValue<Byte> lhs, RValue<Byte> rhs)
402{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400403 return RValue<Byte>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500404}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400405
Nicolas Capens157ba262019-12-10 17:49:14 -0500406RValue<Byte> operator-(RValue<Byte> lhs, RValue<Byte> rhs)
407{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400408 return RValue<Byte>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500409}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400410
Nicolas Capens157ba262019-12-10 17:49:14 -0500411RValue<Byte> operator*(RValue<Byte> lhs, RValue<Byte> rhs)
412{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400413 return RValue<Byte>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500414}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400415
Nicolas Capens157ba262019-12-10 17:49:14 -0500416RValue<Byte> operator/(RValue<Byte> lhs, RValue<Byte> rhs)
417{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400418 return RValue<Byte>(Nucleus::createUDiv(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500419}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400420
Nicolas Capens157ba262019-12-10 17:49:14 -0500421RValue<Byte> operator%(RValue<Byte> lhs, RValue<Byte> rhs)
422{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400423 return RValue<Byte>(Nucleus::createURem(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500424}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400425
Nicolas Capens157ba262019-12-10 17:49:14 -0500426RValue<Byte> operator&(RValue<Byte> lhs, RValue<Byte> rhs)
427{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400428 return RValue<Byte>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500429}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400430
Nicolas Capens157ba262019-12-10 17:49:14 -0500431RValue<Byte> operator|(RValue<Byte> lhs, RValue<Byte> rhs)
432{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400433 return RValue<Byte>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500434}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400435
Nicolas Capens157ba262019-12-10 17:49:14 -0500436RValue<Byte> operator^(RValue<Byte> lhs, RValue<Byte> rhs)
437{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400438 return RValue<Byte>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500439}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400440
Nicolas Capens157ba262019-12-10 17:49:14 -0500441RValue<Byte> operator<<(RValue<Byte> lhs, RValue<Byte> rhs)
442{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400443 return RValue<Byte>(Nucleus::createShl(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500444}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400445
Nicolas Capens157ba262019-12-10 17:49:14 -0500446RValue<Byte> operator>>(RValue<Byte> lhs, RValue<Byte> rhs)
447{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400448 return RValue<Byte>(Nucleus::createLShr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500449}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400450
Nicolas Capens157ba262019-12-10 17:49:14 -0500451RValue<Byte> operator+=(Byte &lhs, RValue<Byte> rhs)
452{
453 return lhs = lhs + rhs;
454}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400455
Nicolas Capens157ba262019-12-10 17:49:14 -0500456RValue<Byte> operator-=(Byte &lhs, RValue<Byte> rhs)
457{
458 return lhs = lhs - rhs;
459}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400460
Nicolas Capens157ba262019-12-10 17:49:14 -0500461RValue<Byte> operator*=(Byte &lhs, RValue<Byte> rhs)
462{
463 return lhs = lhs * rhs;
464}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400465
Nicolas Capens157ba262019-12-10 17:49:14 -0500466RValue<Byte> operator/=(Byte &lhs, RValue<Byte> rhs)
467{
468 return lhs = lhs / rhs;
469}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400470
Nicolas Capens157ba262019-12-10 17:49:14 -0500471RValue<Byte> operator%=(Byte &lhs, RValue<Byte> rhs)
472{
473 return lhs = lhs % rhs;
474}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400475
Nicolas Capens157ba262019-12-10 17:49:14 -0500476RValue<Byte> operator&=(Byte &lhs, RValue<Byte> rhs)
477{
478 return lhs = lhs & rhs;
479}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400480
Nicolas Capens157ba262019-12-10 17:49:14 -0500481RValue<Byte> operator|=(Byte &lhs, RValue<Byte> rhs)
482{
483 return lhs = lhs | rhs;
484}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400485
Nicolas Capens157ba262019-12-10 17:49:14 -0500486RValue<Byte> operator^=(Byte &lhs, RValue<Byte> rhs)
487{
488 return lhs = lhs ^ rhs;
489}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400490
Nicolas Capens157ba262019-12-10 17:49:14 -0500491RValue<Byte> operator<<=(Byte &lhs, RValue<Byte> rhs)
492{
493 return lhs = lhs << rhs;
494}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400495
Nicolas Capens157ba262019-12-10 17:49:14 -0500496RValue<Byte> operator>>=(Byte &lhs, RValue<Byte> rhs)
497{
498 return lhs = lhs >> rhs;
499}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400500
Nicolas Capens157ba262019-12-10 17:49:14 -0500501RValue<Byte> operator+(RValue<Byte> val)
502{
503 return val;
504}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400505
Nicolas Capens157ba262019-12-10 17:49:14 -0500506RValue<Byte> operator-(RValue<Byte> val)
507{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400508 return RValue<Byte>(Nucleus::createNeg(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500509}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400510
Nicolas Capens157ba262019-12-10 17:49:14 -0500511RValue<Byte> operator~(RValue<Byte> val)
512{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400513 return RValue<Byte>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500514}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400515
Ben Clayton713b8d32019-12-17 20:37:56 +0000516RValue<Byte> operator++(Byte &val, int) // Post-increment
Nicolas Capens157ba262019-12-10 17:49:14 -0500517{
518 RValue<Byte> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400519
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400520 Value *inc = Nucleus::createAdd(res.value(), Nucleus::createConstantByte((unsigned char)1));
Nicolas Capens157ba262019-12-10 17:49:14 -0500521 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400522
Nicolas Capens157ba262019-12-10 17:49:14 -0500523 return res;
524}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400525
Ben Clayton713b8d32019-12-17 20:37:56 +0000526const Byte &operator++(Byte &val) // Pre-increment
Nicolas Capens157ba262019-12-10 17:49:14 -0500527{
528 Value *inc = Nucleus::createAdd(val.loadValue(), Nucleus::createConstantByte((unsigned char)1));
529 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400530
Nicolas Capens157ba262019-12-10 17:49:14 -0500531 return val;
532}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400533
Ben Clayton713b8d32019-12-17 20:37:56 +0000534RValue<Byte> operator--(Byte &val, int) // Post-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -0500535{
536 RValue<Byte> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400537
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400538 Value *inc = Nucleus::createSub(res.value(), Nucleus::createConstantByte((unsigned char)1));
Nicolas Capens157ba262019-12-10 17:49:14 -0500539 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400540
Nicolas Capens157ba262019-12-10 17:49:14 -0500541 return res;
542}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400543
Ben Clayton713b8d32019-12-17 20:37:56 +0000544const Byte &operator--(Byte &val) // Pre-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -0500545{
546 Value *inc = Nucleus::createSub(val.loadValue(), Nucleus::createConstantByte((unsigned char)1));
547 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400548
Nicolas Capens157ba262019-12-10 17:49:14 -0500549 return val;
550}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400551
Nicolas Capens157ba262019-12-10 17:49:14 -0500552RValue<Bool> operator<(RValue<Byte> lhs, RValue<Byte> rhs)
553{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400554 return RValue<Bool>(Nucleus::createICmpULT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500555}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400556
Nicolas Capens157ba262019-12-10 17:49:14 -0500557RValue<Bool> operator<=(RValue<Byte> lhs, RValue<Byte> rhs)
558{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400559 return RValue<Bool>(Nucleus::createICmpULE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500560}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400561
Nicolas Capens157ba262019-12-10 17:49:14 -0500562RValue<Bool> operator>(RValue<Byte> lhs, RValue<Byte> rhs)
563{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400564 return RValue<Bool>(Nucleus::createICmpUGT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500565}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400566
Nicolas Capens157ba262019-12-10 17:49:14 -0500567RValue<Bool> operator>=(RValue<Byte> lhs, RValue<Byte> rhs)
568{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400569 return RValue<Bool>(Nucleus::createICmpUGE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500570}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400571
Nicolas Capens157ba262019-12-10 17:49:14 -0500572RValue<Bool> operator!=(RValue<Byte> lhs, RValue<Byte> rhs)
573{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400574 return RValue<Bool>(Nucleus::createICmpNE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500575}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400576
Nicolas Capens157ba262019-12-10 17:49:14 -0500577RValue<Bool> operator==(RValue<Byte> lhs, RValue<Byte> rhs)
578{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400579 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500580}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400581
Nicolas Capens157ba262019-12-10 17:49:14 -0500582SByte::SByte(Argument<SByte> argument)
583{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400584 store(argument.rvalue());
Nicolas Capens157ba262019-12-10 17:49:14 -0500585}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400586
Nicolas Capens157ba262019-12-10 17:49:14 -0500587SByte::SByte(RValue<Int> cast)
588{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400589 Value *integer = Nucleus::createTrunc(cast.value(), SByte::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400590
Nicolas Capens157ba262019-12-10 17:49:14 -0500591 storeValue(integer);
592}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400593
Nicolas Capens157ba262019-12-10 17:49:14 -0500594SByte::SByte(RValue<Short> cast)
595{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400596 Value *integer = Nucleus::createTrunc(cast.value(), SByte::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400597
Nicolas Capens157ba262019-12-10 17:49:14 -0500598 storeValue(integer);
599}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400600
Nicolas Capens157ba262019-12-10 17:49:14 -0500601SByte::SByte(signed char x)
602{
603 storeValue(Nucleus::createConstantByte(x));
604}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400605
Nicolas Capens157ba262019-12-10 17:49:14 -0500606SByte::SByte(RValue<SByte> rhs)
607{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400608 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500609}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400610
Nicolas Capens157ba262019-12-10 17:49:14 -0500611SByte::SByte(const SByte &rhs)
612{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400613 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500614}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400615
Nicolas Capens157ba262019-12-10 17:49:14 -0500616SByte::SByte(const Reference<SByte> &rhs)
617{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400618 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500619}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400620
Nicolas Capens157ba262019-12-10 17:49:14 -0500621RValue<SByte> SByte::operator=(RValue<SByte> rhs)
622{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400623 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500624}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400625
Nicolas Capens157ba262019-12-10 17:49:14 -0500626RValue<SByte> SByte::operator=(const SByte &rhs)
627{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400628 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500629}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400630
Nicolas Capens157ba262019-12-10 17:49:14 -0500631RValue<SByte> SByte::operator=(const Reference<SByte> &rhs)
632{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400633 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500634}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400635
Nicolas Capens157ba262019-12-10 17:49:14 -0500636RValue<SByte> operator+(RValue<SByte> lhs, RValue<SByte> rhs)
637{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400638 return RValue<SByte>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500639}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400640
Nicolas Capens157ba262019-12-10 17:49:14 -0500641RValue<SByte> operator-(RValue<SByte> lhs, RValue<SByte> rhs)
642{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400643 return RValue<SByte>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500644}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400645
Nicolas Capens157ba262019-12-10 17:49:14 -0500646RValue<SByte> operator*(RValue<SByte> lhs, RValue<SByte> rhs)
647{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400648 return RValue<SByte>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500649}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400650
Nicolas Capens157ba262019-12-10 17:49:14 -0500651RValue<SByte> operator/(RValue<SByte> lhs, RValue<SByte> rhs)
652{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400653 return RValue<SByte>(Nucleus::createSDiv(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500654}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400655
Nicolas Capens157ba262019-12-10 17:49:14 -0500656RValue<SByte> operator%(RValue<SByte> lhs, RValue<SByte> rhs)
657{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400658 return RValue<SByte>(Nucleus::createSRem(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500659}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400660
Nicolas Capens157ba262019-12-10 17:49:14 -0500661RValue<SByte> operator&(RValue<SByte> lhs, RValue<SByte> rhs)
662{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400663 return RValue<SByte>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500664}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400665
Nicolas Capens157ba262019-12-10 17:49:14 -0500666RValue<SByte> operator|(RValue<SByte> lhs, RValue<SByte> rhs)
667{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400668 return RValue<SByte>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500669}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400670
Nicolas Capens157ba262019-12-10 17:49:14 -0500671RValue<SByte> operator^(RValue<SByte> lhs, RValue<SByte> rhs)
672{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400673 return RValue<SByte>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500674}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400675
Nicolas Capens157ba262019-12-10 17:49:14 -0500676RValue<SByte> operator<<(RValue<SByte> lhs, RValue<SByte> rhs)
677{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400678 return RValue<SByte>(Nucleus::createShl(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500679}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400680
Nicolas Capens157ba262019-12-10 17:49:14 -0500681RValue<SByte> operator>>(RValue<SByte> lhs, RValue<SByte> rhs)
682{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400683 return RValue<SByte>(Nucleus::createAShr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500684}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400685
Nicolas Capens157ba262019-12-10 17:49:14 -0500686RValue<SByte> operator+=(SByte &lhs, RValue<SByte> rhs)
687{
688 return lhs = lhs + rhs;
689}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400690
Nicolas Capens157ba262019-12-10 17:49:14 -0500691RValue<SByte> operator-=(SByte &lhs, RValue<SByte> rhs)
692{
693 return lhs = lhs - rhs;
694}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400695
Nicolas Capens157ba262019-12-10 17:49:14 -0500696RValue<SByte> operator*=(SByte &lhs, RValue<SByte> rhs)
697{
698 return lhs = lhs * rhs;
699}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400700
Nicolas Capens157ba262019-12-10 17:49:14 -0500701RValue<SByte> operator/=(SByte &lhs, RValue<SByte> rhs)
702{
703 return lhs = lhs / rhs;
704}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400705
Nicolas Capens157ba262019-12-10 17:49:14 -0500706RValue<SByte> operator%=(SByte &lhs, RValue<SByte> rhs)
707{
708 return lhs = lhs % rhs;
709}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400710
Nicolas Capens157ba262019-12-10 17:49:14 -0500711RValue<SByte> operator&=(SByte &lhs, RValue<SByte> rhs)
712{
713 return lhs = lhs & rhs;
714}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400715
Nicolas Capens157ba262019-12-10 17:49:14 -0500716RValue<SByte> operator|=(SByte &lhs, RValue<SByte> rhs)
717{
718 return lhs = lhs | rhs;
719}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400720
Nicolas Capens157ba262019-12-10 17:49:14 -0500721RValue<SByte> operator^=(SByte &lhs, RValue<SByte> rhs)
722{
723 return lhs = lhs ^ rhs;
724}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400725
Nicolas Capens157ba262019-12-10 17:49:14 -0500726RValue<SByte> operator<<=(SByte &lhs, RValue<SByte> rhs)
727{
728 return lhs = lhs << rhs;
729}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400730
Nicolas Capens157ba262019-12-10 17:49:14 -0500731RValue<SByte> operator>>=(SByte &lhs, RValue<SByte> rhs)
732{
733 return lhs = lhs >> rhs;
734}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400735
Nicolas Capens157ba262019-12-10 17:49:14 -0500736RValue<SByte> operator+(RValue<SByte> val)
737{
738 return val;
739}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400740
Nicolas Capens157ba262019-12-10 17:49:14 -0500741RValue<SByte> operator-(RValue<SByte> val)
742{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400743 return RValue<SByte>(Nucleus::createNeg(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500744}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400745
Nicolas Capens157ba262019-12-10 17:49:14 -0500746RValue<SByte> operator~(RValue<SByte> val)
747{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400748 return RValue<SByte>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500749}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400750
Ben Clayton713b8d32019-12-17 20:37:56 +0000751RValue<SByte> operator++(SByte &val, int) // Post-increment
Nicolas Capens157ba262019-12-10 17:49:14 -0500752{
753 RValue<SByte> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400754
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400755 Value *inc = Nucleus::createAdd(res.value(), Nucleus::createConstantByte((signed char)1));
Nicolas Capens157ba262019-12-10 17:49:14 -0500756 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400757
Nicolas Capens157ba262019-12-10 17:49:14 -0500758 return res;
759}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400760
Ben Clayton713b8d32019-12-17 20:37:56 +0000761const SByte &operator++(SByte &val) // Pre-increment
Nicolas Capens157ba262019-12-10 17:49:14 -0500762{
763 Value *inc = Nucleus::createAdd(val.loadValue(), Nucleus::createConstantByte((signed char)1));
764 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400765
Nicolas Capens157ba262019-12-10 17:49:14 -0500766 return val;
767}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400768
Ben Clayton713b8d32019-12-17 20:37:56 +0000769RValue<SByte> operator--(SByte &val, int) // Post-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -0500770{
771 RValue<SByte> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400772
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400773 Value *inc = Nucleus::createSub(res.value(), Nucleus::createConstantByte((signed char)1));
Nicolas Capens157ba262019-12-10 17:49:14 -0500774 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400775
Nicolas Capens157ba262019-12-10 17:49:14 -0500776 return res;
777}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400778
Ben Clayton713b8d32019-12-17 20:37:56 +0000779const SByte &operator--(SByte &val) // Pre-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -0500780{
781 Value *inc = Nucleus::createSub(val.loadValue(), Nucleus::createConstantByte((signed char)1));
782 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400783
Nicolas Capens157ba262019-12-10 17:49:14 -0500784 return val;
785}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400786
Nicolas Capens157ba262019-12-10 17:49:14 -0500787RValue<Bool> operator<(RValue<SByte> lhs, RValue<SByte> rhs)
788{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400789 return RValue<Bool>(Nucleus::createICmpSLT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500790}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400791
Nicolas Capens157ba262019-12-10 17:49:14 -0500792RValue<Bool> operator<=(RValue<SByte> lhs, RValue<SByte> rhs)
793{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400794 return RValue<Bool>(Nucleus::createICmpSLE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500795}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400796
Nicolas Capens157ba262019-12-10 17:49:14 -0500797RValue<Bool> operator>(RValue<SByte> lhs, RValue<SByte> rhs)
798{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400799 return RValue<Bool>(Nucleus::createICmpSGT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500800}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400801
Nicolas Capens157ba262019-12-10 17:49:14 -0500802RValue<Bool> operator>=(RValue<SByte> lhs, RValue<SByte> rhs)
803{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400804 return RValue<Bool>(Nucleus::createICmpSGE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500805}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400806
Nicolas Capens157ba262019-12-10 17:49:14 -0500807RValue<Bool> operator!=(RValue<SByte> lhs, RValue<SByte> rhs)
808{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400809 return RValue<Bool>(Nucleus::createICmpNE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500810}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400811
Nicolas Capens157ba262019-12-10 17:49:14 -0500812RValue<Bool> operator==(RValue<SByte> lhs, RValue<SByte> rhs)
813{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400814 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500815}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400816
Nicolas Capens157ba262019-12-10 17:49:14 -0500817Short::Short(Argument<Short> argument)
818{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400819 store(argument.rvalue());
Nicolas Capens157ba262019-12-10 17:49:14 -0500820}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400821
Nicolas Capens157ba262019-12-10 17:49:14 -0500822Short::Short(RValue<Int> cast)
823{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400824 Value *integer = Nucleus::createTrunc(cast.value(), Short::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400825
Nicolas Capens157ba262019-12-10 17:49:14 -0500826 storeValue(integer);
827}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400828
Nicolas Capens157ba262019-12-10 17:49:14 -0500829Short::Short(short x)
830{
831 storeValue(Nucleus::createConstantShort(x));
832}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400833
Nicolas Capens157ba262019-12-10 17:49:14 -0500834Short::Short(RValue<Short> rhs)
835{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400836 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500837}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400838
Nicolas Capens157ba262019-12-10 17:49:14 -0500839Short::Short(const Short &rhs)
840{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400841 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500842}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400843
Nicolas Capens157ba262019-12-10 17:49:14 -0500844Short::Short(const Reference<Short> &rhs)
845{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400846 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500847}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400848
Nicolas Capens157ba262019-12-10 17:49:14 -0500849RValue<Short> Short::operator=(RValue<Short> rhs)
850{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400851 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500852}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400853
Nicolas Capens157ba262019-12-10 17:49:14 -0500854RValue<Short> Short::operator=(const Short &rhs)
855{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400856 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500857}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400858
Nicolas Capens157ba262019-12-10 17:49:14 -0500859RValue<Short> Short::operator=(const Reference<Short> &rhs)
860{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400861 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500862}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400863
Nicolas Capens157ba262019-12-10 17:49:14 -0500864RValue<Short> operator+(RValue<Short> lhs, RValue<Short> rhs)
865{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400866 return RValue<Short>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500867}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400868
Nicolas Capens157ba262019-12-10 17:49:14 -0500869RValue<Short> operator-(RValue<Short> lhs, RValue<Short> rhs)
870{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400871 return RValue<Short>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500872}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400873
Nicolas Capens157ba262019-12-10 17:49:14 -0500874RValue<Short> operator*(RValue<Short> lhs, RValue<Short> rhs)
875{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400876 return RValue<Short>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500877}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400878
Nicolas Capens157ba262019-12-10 17:49:14 -0500879RValue<Short> operator/(RValue<Short> lhs, RValue<Short> rhs)
880{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400881 return RValue<Short>(Nucleus::createSDiv(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500882}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400883
Nicolas Capens157ba262019-12-10 17:49:14 -0500884RValue<Short> operator%(RValue<Short> lhs, RValue<Short> rhs)
885{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400886 return RValue<Short>(Nucleus::createSRem(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500887}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400888
Nicolas Capens157ba262019-12-10 17:49:14 -0500889RValue<Short> operator&(RValue<Short> lhs, RValue<Short> rhs)
890{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400891 return RValue<Short>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500892}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400893
Nicolas Capens157ba262019-12-10 17:49:14 -0500894RValue<Short> operator|(RValue<Short> lhs, RValue<Short> rhs)
895{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400896 return RValue<Short>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500897}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400898
Nicolas Capens157ba262019-12-10 17:49:14 -0500899RValue<Short> operator^(RValue<Short> lhs, RValue<Short> rhs)
900{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400901 return RValue<Short>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500902}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400903
Nicolas Capens157ba262019-12-10 17:49:14 -0500904RValue<Short> operator<<(RValue<Short> lhs, RValue<Short> rhs)
905{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400906 return RValue<Short>(Nucleus::createShl(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500907}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400908
Nicolas Capens157ba262019-12-10 17:49:14 -0500909RValue<Short> operator>>(RValue<Short> lhs, RValue<Short> rhs)
910{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400911 return RValue<Short>(Nucleus::createAShr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500912}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400913
Nicolas Capens157ba262019-12-10 17:49:14 -0500914RValue<Short> operator+=(Short &lhs, RValue<Short> rhs)
915{
916 return lhs = lhs + rhs;
917}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400918
Nicolas Capens157ba262019-12-10 17:49:14 -0500919RValue<Short> operator-=(Short &lhs, RValue<Short> rhs)
920{
921 return lhs = lhs - rhs;
922}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400923
Nicolas Capens157ba262019-12-10 17:49:14 -0500924RValue<Short> operator*=(Short &lhs, RValue<Short> rhs)
925{
926 return lhs = lhs * rhs;
927}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400928
Nicolas Capens157ba262019-12-10 17:49:14 -0500929RValue<Short> operator/=(Short &lhs, RValue<Short> rhs)
930{
931 return lhs = lhs / rhs;
932}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400933
Nicolas Capens157ba262019-12-10 17:49:14 -0500934RValue<Short> operator%=(Short &lhs, RValue<Short> rhs)
935{
936 return lhs = lhs % rhs;
937}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400938
Nicolas Capens157ba262019-12-10 17:49:14 -0500939RValue<Short> operator&=(Short &lhs, RValue<Short> rhs)
940{
941 return lhs = lhs & rhs;
942}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400943
Nicolas Capens157ba262019-12-10 17:49:14 -0500944RValue<Short> operator|=(Short &lhs, RValue<Short> rhs)
945{
946 return lhs = lhs | rhs;
947}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400948
Nicolas Capens157ba262019-12-10 17:49:14 -0500949RValue<Short> operator^=(Short &lhs, RValue<Short> rhs)
950{
951 return lhs = lhs ^ rhs;
952}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400953
Nicolas Capens157ba262019-12-10 17:49:14 -0500954RValue<Short> operator<<=(Short &lhs, RValue<Short> rhs)
955{
956 return lhs = lhs << rhs;
957}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400958
Nicolas Capens157ba262019-12-10 17:49:14 -0500959RValue<Short> operator>>=(Short &lhs, RValue<Short> rhs)
960{
961 return lhs = lhs >> rhs;
962}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400963
Nicolas Capens157ba262019-12-10 17:49:14 -0500964RValue<Short> operator+(RValue<Short> val)
965{
966 return val;
967}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400968
Nicolas Capens157ba262019-12-10 17:49:14 -0500969RValue<Short> operator-(RValue<Short> val)
970{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400971 return RValue<Short>(Nucleus::createNeg(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500972}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400973
Nicolas Capens157ba262019-12-10 17:49:14 -0500974RValue<Short> operator~(RValue<Short> val)
975{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400976 return RValue<Short>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500977}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400978
Ben Clayton713b8d32019-12-17 20:37:56 +0000979RValue<Short> operator++(Short &val, int) // Post-increment
Nicolas Capens157ba262019-12-10 17:49:14 -0500980{
981 RValue<Short> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400982
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400983 Value *inc = Nucleus::createAdd(res.value(), Nucleus::createConstantShort((short)1));
Nicolas Capens157ba262019-12-10 17:49:14 -0500984 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400985
Nicolas Capens157ba262019-12-10 17:49:14 -0500986 return res;
987}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400988
Ben Clayton713b8d32019-12-17 20:37:56 +0000989const Short &operator++(Short &val) // Pre-increment
Nicolas Capens157ba262019-12-10 17:49:14 -0500990{
991 Value *inc = Nucleus::createAdd(val.loadValue(), Nucleus::createConstantShort((short)1));
992 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400993
Nicolas Capens157ba262019-12-10 17:49:14 -0500994 return val;
995}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400996
Ben Clayton713b8d32019-12-17 20:37:56 +0000997RValue<Short> operator--(Short &val, int) // Post-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -0500998{
999 RValue<Short> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001000
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001001 Value *inc = Nucleus::createSub(res.value(), Nucleus::createConstantShort((short)1));
Nicolas Capens157ba262019-12-10 17:49:14 -05001002 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001003
Nicolas Capens157ba262019-12-10 17:49:14 -05001004 return res;
1005}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001006
Ben Clayton713b8d32019-12-17 20:37:56 +00001007const Short &operator--(Short &val) // Pre-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -05001008{
1009 Value *inc = Nucleus::createSub(val.loadValue(), Nucleus::createConstantShort((short)1));
1010 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001011
Nicolas Capens157ba262019-12-10 17:49:14 -05001012 return val;
1013}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001014
Nicolas Capens157ba262019-12-10 17:49:14 -05001015RValue<Bool> operator<(RValue<Short> lhs, RValue<Short> rhs)
1016{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001017 return RValue<Bool>(Nucleus::createICmpSLT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001018}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001019
Nicolas Capens157ba262019-12-10 17:49:14 -05001020RValue<Bool> operator<=(RValue<Short> lhs, RValue<Short> rhs)
1021{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001022 return RValue<Bool>(Nucleus::createICmpSLE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001023}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001024
Nicolas Capens157ba262019-12-10 17:49:14 -05001025RValue<Bool> operator>(RValue<Short> lhs, RValue<Short> rhs)
1026{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001027 return RValue<Bool>(Nucleus::createICmpSGT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001028}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001029
Nicolas Capens157ba262019-12-10 17:49:14 -05001030RValue<Bool> operator>=(RValue<Short> lhs, RValue<Short> rhs)
1031{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001032 return RValue<Bool>(Nucleus::createICmpSGE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001033}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001034
Nicolas Capens157ba262019-12-10 17:49:14 -05001035RValue<Bool> operator!=(RValue<Short> lhs, RValue<Short> rhs)
1036{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001037 return RValue<Bool>(Nucleus::createICmpNE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001038}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001039
Nicolas Capens157ba262019-12-10 17:49:14 -05001040RValue<Bool> operator==(RValue<Short> lhs, RValue<Short> rhs)
1041{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001042 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001043}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001044
Nicolas Capens157ba262019-12-10 17:49:14 -05001045UShort::UShort(Argument<UShort> argument)
1046{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001047 store(argument.rvalue());
Nicolas Capens157ba262019-12-10 17:49:14 -05001048}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001049
Nicolas Capens157ba262019-12-10 17:49:14 -05001050UShort::UShort(RValue<UInt> cast)
1051{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001052 Value *integer = Nucleus::createTrunc(cast.value(), UShort::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001053
Nicolas Capens157ba262019-12-10 17:49:14 -05001054 storeValue(integer);
1055}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001056
Nicolas Capens157ba262019-12-10 17:49:14 -05001057UShort::UShort(RValue<Int> cast)
1058{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001059 Value *integer = Nucleus::createTrunc(cast.value(), UShort::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001060
Nicolas Capens157ba262019-12-10 17:49:14 -05001061 storeValue(integer);
1062}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001063
Nicolas Capens157ba262019-12-10 17:49:14 -05001064UShort::UShort(unsigned short x)
1065{
1066 storeValue(Nucleus::createConstantShort(x));
1067}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001068
Nicolas Capens157ba262019-12-10 17:49:14 -05001069UShort::UShort(RValue<UShort> rhs)
1070{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001071 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001072}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001073
Nicolas Capens157ba262019-12-10 17:49:14 -05001074UShort::UShort(const UShort &rhs)
1075{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001076 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001077}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001078
Nicolas Capens157ba262019-12-10 17:49:14 -05001079UShort::UShort(const Reference<UShort> &rhs)
1080{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001081 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001082}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001083
Nicolas Capens157ba262019-12-10 17:49:14 -05001084RValue<UShort> UShort::operator=(RValue<UShort> rhs)
1085{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001086 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001087}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001088
Nicolas Capens157ba262019-12-10 17:49:14 -05001089RValue<UShort> UShort::operator=(const UShort &rhs)
1090{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001091 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001092}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001093
Nicolas Capens157ba262019-12-10 17:49:14 -05001094RValue<UShort> UShort::operator=(const Reference<UShort> &rhs)
1095{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001096 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001097}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001098
Nicolas Capens157ba262019-12-10 17:49:14 -05001099RValue<UShort> operator+(RValue<UShort> lhs, RValue<UShort> rhs)
1100{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001101 return RValue<UShort>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001102}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001103
Nicolas Capens157ba262019-12-10 17:49:14 -05001104RValue<UShort> operator-(RValue<UShort> lhs, RValue<UShort> rhs)
1105{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001106 return RValue<UShort>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001107}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001108
Nicolas Capens157ba262019-12-10 17:49:14 -05001109RValue<UShort> operator*(RValue<UShort> lhs, RValue<UShort> rhs)
1110{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001111 return RValue<UShort>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001112}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001113
Nicolas Capens157ba262019-12-10 17:49:14 -05001114RValue<UShort> operator/(RValue<UShort> lhs, RValue<UShort> rhs)
1115{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001116 return RValue<UShort>(Nucleus::createUDiv(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001117}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001118
Nicolas Capens157ba262019-12-10 17:49:14 -05001119RValue<UShort> operator%(RValue<UShort> lhs, RValue<UShort> rhs)
1120{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001121 return RValue<UShort>(Nucleus::createURem(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001122}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001123
Nicolas Capens157ba262019-12-10 17:49:14 -05001124RValue<UShort> operator&(RValue<UShort> lhs, RValue<UShort> rhs)
1125{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001126 return RValue<UShort>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001127}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001128
Nicolas Capens157ba262019-12-10 17:49:14 -05001129RValue<UShort> operator|(RValue<UShort> lhs, RValue<UShort> rhs)
1130{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001131 return RValue<UShort>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001132}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001133
Nicolas Capens157ba262019-12-10 17:49:14 -05001134RValue<UShort> operator^(RValue<UShort> lhs, RValue<UShort> rhs)
1135{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001136 return RValue<UShort>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001137}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001138
Nicolas Capens157ba262019-12-10 17:49:14 -05001139RValue<UShort> operator<<(RValue<UShort> lhs, RValue<UShort> rhs)
1140{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001141 return RValue<UShort>(Nucleus::createShl(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001142}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001143
Nicolas Capens157ba262019-12-10 17:49:14 -05001144RValue<UShort> operator>>(RValue<UShort> lhs, RValue<UShort> rhs)
1145{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001146 return RValue<UShort>(Nucleus::createLShr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001147}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001148
Nicolas Capens157ba262019-12-10 17:49:14 -05001149RValue<UShort> operator+=(UShort &lhs, RValue<UShort> rhs)
1150{
1151 return lhs = lhs + rhs;
1152}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001153
Nicolas Capens157ba262019-12-10 17:49:14 -05001154RValue<UShort> operator-=(UShort &lhs, RValue<UShort> rhs)
1155{
1156 return lhs = lhs - rhs;
1157}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001158
Nicolas Capens157ba262019-12-10 17:49:14 -05001159RValue<UShort> operator*=(UShort &lhs, RValue<UShort> rhs)
1160{
1161 return lhs = lhs * rhs;
1162}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001163
Nicolas Capens157ba262019-12-10 17:49:14 -05001164RValue<UShort> operator/=(UShort &lhs, RValue<UShort> rhs)
1165{
1166 return lhs = lhs / rhs;
1167}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001168
Nicolas Capens157ba262019-12-10 17:49:14 -05001169RValue<UShort> operator%=(UShort &lhs, RValue<UShort> rhs)
1170{
1171 return lhs = lhs % rhs;
1172}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001173
Nicolas Capens157ba262019-12-10 17:49:14 -05001174RValue<UShort> operator&=(UShort &lhs, RValue<UShort> rhs)
1175{
1176 return lhs = lhs & rhs;
1177}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001178
Nicolas Capens157ba262019-12-10 17:49:14 -05001179RValue<UShort> operator|=(UShort &lhs, RValue<UShort> rhs)
1180{
1181 return lhs = lhs | rhs;
1182}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001183
Nicolas Capens157ba262019-12-10 17:49:14 -05001184RValue<UShort> operator^=(UShort &lhs, RValue<UShort> rhs)
1185{
1186 return lhs = lhs ^ rhs;
1187}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001188
Nicolas Capens157ba262019-12-10 17:49:14 -05001189RValue<UShort> operator<<=(UShort &lhs, RValue<UShort> rhs)
1190{
1191 return lhs = lhs << rhs;
1192}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001193
Nicolas Capens157ba262019-12-10 17:49:14 -05001194RValue<UShort> operator>>=(UShort &lhs, RValue<UShort> rhs)
1195{
1196 return lhs = lhs >> rhs;
1197}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001198
Nicolas Capens157ba262019-12-10 17:49:14 -05001199RValue<UShort> operator+(RValue<UShort> val)
1200{
1201 return val;
1202}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001203
Nicolas Capens157ba262019-12-10 17:49:14 -05001204RValue<UShort> operator-(RValue<UShort> val)
1205{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001206 return RValue<UShort>(Nucleus::createNeg(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001207}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001208
Nicolas Capens157ba262019-12-10 17:49:14 -05001209RValue<UShort> operator~(RValue<UShort> val)
1210{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001211 return RValue<UShort>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001212}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001213
Ben Clayton713b8d32019-12-17 20:37:56 +00001214RValue<UShort> operator++(UShort &val, int) // Post-increment
Nicolas Capens157ba262019-12-10 17:49:14 -05001215{
1216 RValue<UShort> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001217
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001218 Value *inc = Nucleus::createAdd(res.value(), Nucleus::createConstantShort((unsigned short)1));
Nicolas Capens157ba262019-12-10 17:49:14 -05001219 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001220
Nicolas Capens157ba262019-12-10 17:49:14 -05001221 return res;
1222}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001223
Ben Clayton713b8d32019-12-17 20:37:56 +00001224const UShort &operator++(UShort &val) // Pre-increment
Nicolas Capens157ba262019-12-10 17:49:14 -05001225{
1226 Value *inc = Nucleus::createAdd(val.loadValue(), Nucleus::createConstantShort((unsigned short)1));
1227 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001228
Nicolas Capens157ba262019-12-10 17:49:14 -05001229 return val;
1230}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001231
Ben Clayton713b8d32019-12-17 20:37:56 +00001232RValue<UShort> operator--(UShort &val, int) // Post-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -05001233{
1234 RValue<UShort> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001235
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001236 Value *inc = Nucleus::createSub(res.value(), Nucleus::createConstantShort((unsigned short)1));
Nicolas Capens157ba262019-12-10 17:49:14 -05001237 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001238
Nicolas Capens157ba262019-12-10 17:49:14 -05001239 return res;
1240}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001241
Ben Clayton713b8d32019-12-17 20:37:56 +00001242const UShort &operator--(UShort &val) // Pre-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -05001243{
1244 Value *inc = Nucleus::createSub(val.loadValue(), Nucleus::createConstantShort((unsigned short)1));
1245 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001246
Nicolas Capens157ba262019-12-10 17:49:14 -05001247 return val;
1248}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001249
Nicolas Capens157ba262019-12-10 17:49:14 -05001250RValue<Bool> operator<(RValue<UShort> lhs, RValue<UShort> rhs)
1251{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001252 return RValue<Bool>(Nucleus::createICmpULT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001253}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001254
Nicolas Capens157ba262019-12-10 17:49:14 -05001255RValue<Bool> operator<=(RValue<UShort> lhs, RValue<UShort> rhs)
1256{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001257 return RValue<Bool>(Nucleus::createICmpULE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001258}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001259
Nicolas Capens157ba262019-12-10 17:49:14 -05001260RValue<Bool> operator>(RValue<UShort> lhs, RValue<UShort> rhs)
1261{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001262 return RValue<Bool>(Nucleus::createICmpUGT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001263}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001264
Nicolas Capens157ba262019-12-10 17:49:14 -05001265RValue<Bool> operator>=(RValue<UShort> lhs, RValue<UShort> rhs)
1266{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001267 return RValue<Bool>(Nucleus::createICmpUGE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001268}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001269
Nicolas Capens157ba262019-12-10 17:49:14 -05001270RValue<Bool> operator!=(RValue<UShort> lhs, RValue<UShort> rhs)
1271{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001272 return RValue<Bool>(Nucleus::createICmpNE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001273}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001274
Nicolas Capens157ba262019-12-10 17:49:14 -05001275RValue<Bool> operator==(RValue<UShort> lhs, RValue<UShort> rhs)
1276{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001277 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001278}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001279
Nicolas Capens157ba262019-12-10 17:49:14 -05001280Byte4::Byte4(RValue<Byte8> cast)
1281{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001282 storeValue(Nucleus::createBitCast(cast.value(), type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001283}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001284
Nicolas Capens133b87d2020-01-25 16:26:28 -05001285Byte4::Byte4(RValue<UShort4> cast)
1286{
1287 // TODO(b/148379603): Optimize narrowing swizzle.
1288 *this = As<Byte4>(Swizzle(As<Byte8>(cast), 0x0246'0246));
1289}
1290
1291Byte4::Byte4(RValue<Short4> cast)
1292{
1293 // TODO(b/148379603): Optimize narrowing swizzle.
1294 *this = As<Byte4>(Swizzle(As<Byte8>(cast), 0x0246'0246));
1295}
1296
1297Byte4::Byte4(RValue<UInt4> cast)
1298{
1299 // TODO(b/148379603): Optimize narrowing swizzle.
1300 *this = As<Byte4>(Swizzle(As<Byte16>(cast), 0x048C'048C'048C'048C));
1301}
1302
1303Byte4::Byte4(RValue<Int4> cast)
1304{
1305 // TODO(b/148379603): Optimize narrowing swizzle.
1306 *this = As<Byte4>(Swizzle(As<Byte16>(cast), 0x048C'048C'048C'048C));
1307}
1308
1309Byte4::Byte4(RValue<Byte4> rhs)
1310{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001311 store(rhs);
Nicolas Capens133b87d2020-01-25 16:26:28 -05001312}
1313
1314Byte4::Byte4(const Byte4 &rhs)
1315{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001316 store(rhs.load());
Nicolas Capens133b87d2020-01-25 16:26:28 -05001317}
1318
Nicolas Capens157ba262019-12-10 17:49:14 -05001319Byte4::Byte4(const Reference<Byte4> &rhs)
1320{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001321 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001322}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001323
Nicolas Capens133b87d2020-01-25 16:26:28 -05001324RValue<Byte4> Byte4::operator=(RValue<Byte4> rhs)
1325{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001326 return store(rhs);
Nicolas Capens133b87d2020-01-25 16:26:28 -05001327}
1328
1329RValue<Byte4> Byte4::operator=(const Byte4 &rhs)
1330{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001331 return store(rhs.load());
Nicolas Capens133b87d2020-01-25 16:26:28 -05001332}
1333
Nicolas Capens157ba262019-12-10 17:49:14 -05001334Byte8::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)
1335{
Ben Clayton713b8d32019-12-17 20:37:56 +00001336 int64_t constantVector[8] = { x0, x1, x2, x3, x4, x5, x6, x7 };
Nicolas Capens519cf222020-05-08 15:27:19 -04001337 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001338}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001339
Nicolas Capens157ba262019-12-10 17:49:14 -05001340Byte8::Byte8(RValue<Byte8> rhs)
1341{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001342 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001343}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001344
Nicolas Capens157ba262019-12-10 17:49:14 -05001345Byte8::Byte8(const Byte8 &rhs)
1346{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001347 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001348}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001349
Nicolas Capens157ba262019-12-10 17:49:14 -05001350Byte8::Byte8(const Reference<Byte8> &rhs)
1351{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001352 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001353}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001354
Nicolas Capens157ba262019-12-10 17:49:14 -05001355RValue<Byte8> Byte8::operator=(RValue<Byte8> rhs)
1356{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001357 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001358}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001359
Nicolas Capens157ba262019-12-10 17:49:14 -05001360RValue<Byte8> Byte8::operator=(const Byte8 &rhs)
1361{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001362 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001363}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001364
Nicolas Capens157ba262019-12-10 17:49:14 -05001365RValue<Byte8> Byte8::operator=(const Reference<Byte8> &rhs)
1366{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001367 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001368}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001369
Nicolas Capens157ba262019-12-10 17:49:14 -05001370RValue<Byte8> operator+(RValue<Byte8> lhs, RValue<Byte8> rhs)
1371{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001372 return RValue<Byte8>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001373}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001374
Nicolas Capens157ba262019-12-10 17:49:14 -05001375RValue<Byte8> operator-(RValue<Byte8> lhs, RValue<Byte8> rhs)
1376{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001377 return RValue<Byte8>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001378}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001379
1380// RValue<Byte8> operator*(RValue<Byte8> lhs, RValue<Byte8> rhs)
1381// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001382// return RValue<Byte8>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001383// }
1384
1385// RValue<Byte8> operator/(RValue<Byte8> lhs, RValue<Byte8> rhs)
1386// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001387// return RValue<Byte8>(Nucleus::createUDiv(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001388// }
1389
1390// RValue<Byte8> operator%(RValue<Byte8> lhs, RValue<Byte8> rhs)
1391// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001392// return RValue<Byte8>(Nucleus::createURem(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001393// }
1394
Nicolas Capens157ba262019-12-10 17:49:14 -05001395RValue<Byte8> operator&(RValue<Byte8> lhs, RValue<Byte8> rhs)
1396{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001397 return RValue<Byte8>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001398}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001399
Nicolas Capens157ba262019-12-10 17:49:14 -05001400RValue<Byte8> operator|(RValue<Byte8> lhs, RValue<Byte8> rhs)
1401{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001402 return RValue<Byte8>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001403}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001404
Nicolas Capens157ba262019-12-10 17:49:14 -05001405RValue<Byte8> operator^(RValue<Byte8> lhs, RValue<Byte8> rhs)
1406{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001407 return RValue<Byte8>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001408}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001409
1410// RValue<Byte8> operator<<(RValue<Byte8> lhs, unsigned char rhs)
1411// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001412// return RValue<Byte8>(Nucleus::createShl(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001413// }
1414
1415// RValue<Byte8> operator>>(RValue<Byte8> lhs, unsigned char rhs)
1416// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001417// return RValue<Byte8>(Nucleus::createLShr(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001418// }
1419
Nicolas Capens157ba262019-12-10 17:49:14 -05001420RValue<Byte8> operator+=(Byte8 &lhs, RValue<Byte8> rhs)
1421{
1422 return lhs = lhs + rhs;
1423}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001424
Nicolas Capens157ba262019-12-10 17:49:14 -05001425RValue<Byte8> operator-=(Byte8 &lhs, RValue<Byte8> rhs)
1426{
1427 return lhs = lhs - rhs;
1428}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001429
1430// RValue<Byte8> operator*=(Byte8 &lhs, RValue<Byte8> rhs)
1431// {
1432// return lhs = lhs * rhs;
1433// }
1434
1435// RValue<Byte8> operator/=(Byte8 &lhs, RValue<Byte8> rhs)
1436// {
1437// return lhs = lhs / rhs;
1438// }
1439
1440// RValue<Byte8> operator%=(Byte8 &lhs, RValue<Byte8> rhs)
1441// {
1442// return lhs = lhs % rhs;
1443// }
1444
Nicolas Capens157ba262019-12-10 17:49:14 -05001445RValue<Byte8> operator&=(Byte8 &lhs, RValue<Byte8> rhs)
1446{
1447 return lhs = lhs & rhs;
1448}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001449
Nicolas Capens157ba262019-12-10 17:49:14 -05001450RValue<Byte8> operator|=(Byte8 &lhs, RValue<Byte8> rhs)
1451{
1452 return lhs = lhs | rhs;
1453}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001454
Nicolas Capens157ba262019-12-10 17:49:14 -05001455RValue<Byte8> operator^=(Byte8 &lhs, RValue<Byte8> rhs)
1456{
1457 return lhs = lhs ^ rhs;
1458}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001459
1460// RValue<Byte8> operator<<=(Byte8 &lhs, RValue<Byte8> rhs)
1461// {
1462// return lhs = lhs << rhs;
1463// }
1464
1465// RValue<Byte8> operator>>=(Byte8 &lhs, RValue<Byte8> rhs)
1466// {
1467// return lhs = lhs >> rhs;
1468// }
1469
1470// RValue<Byte8> operator+(RValue<Byte8> val)
1471// {
1472// return val;
1473// }
1474
1475// RValue<Byte8> operator-(RValue<Byte8> val)
1476// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001477// return RValue<Byte8>(Nucleus::createNeg(val.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001478// }
1479
Nicolas Capens157ba262019-12-10 17:49:14 -05001480RValue<Byte8> operator~(RValue<Byte8> val)
1481{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001482 return RValue<Byte8>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001483}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001484
Nicolas Capens133b87d2020-01-25 16:26:28 -05001485RValue<Byte8> Swizzle(RValue<Byte8> x, uint32_t select)
1486{
1487 // Real type is v16i8
1488 // TODO(b/148379603): Optimize narrowing swizzle.
1489 int shuffle[16] = {
1490 static_cast<int>((select >> 28) & 0x07),
1491 static_cast<int>((select >> 24) & 0x07),
1492 static_cast<int>((select >> 20) & 0x07),
1493 static_cast<int>((select >> 16) & 0x07),
1494 static_cast<int>((select >> 12) & 0x07),
1495 static_cast<int>((select >> 8) & 0x07),
1496 static_cast<int>((select >> 4) & 0x07),
1497 static_cast<int>((select >> 0) & 0x07),
1498 static_cast<int>((select >> 28) & 0x07),
1499 static_cast<int>((select >> 24) & 0x07),
1500 static_cast<int>((select >> 20) & 0x07),
1501 static_cast<int>((select >> 16) & 0x07),
1502 static_cast<int>((select >> 12) & 0x07),
1503 static_cast<int>((select >> 8) & 0x07),
1504 static_cast<int>((select >> 4) & 0x07),
1505 static_cast<int>((select >> 0) & 0x07),
1506 };
1507
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001508 return As<Byte8>(Nucleus::createShuffleVector(x.value(), x.value(), shuffle));
Nicolas Capens133b87d2020-01-25 16:26:28 -05001509}
1510
Nicolas Capens157ba262019-12-10 17:49:14 -05001511RValue<Short4> Unpack(RValue<Byte4> x)
1512{
Nicolas Capens133b87d2020-01-25 16:26:28 -05001513 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00001514 int shuffle[16] = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7 }; // Real type is v16i8
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001515 return As<Short4>(Nucleus::createShuffleVector(x.value(), x.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05001516}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001517
Nicolas Capens157ba262019-12-10 17:49:14 -05001518RValue<Short4> Unpack(RValue<Byte4> x, RValue<Byte4> y)
1519{
1520 return UnpackLow(As<Byte8>(x), As<Byte8>(y));
1521}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001522
Nicolas Capens157ba262019-12-10 17:49:14 -05001523RValue<Short4> UnpackLow(RValue<Byte8> x, RValue<Byte8> y)
1524{
Nicolas Capens133b87d2020-01-25 16:26:28 -05001525 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00001526 int shuffle[16] = { 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23 }; // Real type is v16i8
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001527 return As<Short4>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05001528}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001529
Nicolas Capens157ba262019-12-10 17:49:14 -05001530RValue<Short4> UnpackHigh(RValue<Byte8> x, RValue<Byte8> y)
1531{
Nicolas Capens133b87d2020-01-25 16:26:28 -05001532 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00001533 int shuffle[16] = { 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23 }; // Real type is v16i8
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001534 auto lowHigh = RValue<Byte16>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05001535 return As<Short4>(Swizzle(As<Int4>(lowHigh), 0x2323));
1536}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001537
Nicolas Capens157ba262019-12-10 17:49:14 -05001538SByte8::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)
1539{
Ben Clayton713b8d32019-12-17 20:37:56 +00001540 int64_t constantVector[8] = { x0, x1, x2, x3, x4, x5, x6, x7 };
Nicolas Capens519cf222020-05-08 15:27:19 -04001541 Value *vector = Nucleus::createConstantVector(constantVector, type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001542
Nicolas Capens519cf222020-05-08 15:27:19 -04001543 storeValue(Nucleus::createBitCast(vector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001544}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001545
Nicolas Capens157ba262019-12-10 17:49:14 -05001546SByte8::SByte8(RValue<SByte8> rhs)
1547{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001548 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001549}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001550
Nicolas Capens157ba262019-12-10 17:49:14 -05001551SByte8::SByte8(const SByte8 &rhs)
1552{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001553 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001554}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001555
Nicolas Capens157ba262019-12-10 17:49:14 -05001556SByte8::SByte8(const Reference<SByte8> &rhs)
1557{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001558 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001559}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001560
Nicolas Capens157ba262019-12-10 17:49:14 -05001561RValue<SByte8> SByte8::operator=(RValue<SByte8> rhs)
1562{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001563 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001564}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001565
Nicolas Capens157ba262019-12-10 17:49:14 -05001566RValue<SByte8> SByte8::operator=(const SByte8 &rhs)
1567{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001568 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001569}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001570
Nicolas Capens157ba262019-12-10 17:49:14 -05001571RValue<SByte8> SByte8::operator=(const Reference<SByte8> &rhs)
1572{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001573 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001574}
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{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001578 return RValue<SByte8>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001579}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001580
Nicolas Capens157ba262019-12-10 17:49:14 -05001581RValue<SByte8> operator-(RValue<SByte8> lhs, RValue<SByte8> rhs)
1582{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001583 return RValue<SByte8>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001584}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001585
1586// RValue<SByte8> operator*(RValue<SByte8> lhs, RValue<SByte8> rhs)
1587// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001588// return RValue<SByte8>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001589// }
1590
1591// RValue<SByte8> operator/(RValue<SByte8> lhs, RValue<SByte8> rhs)
1592// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001593// return RValue<SByte8>(Nucleus::createSDiv(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001594// }
1595
1596// RValue<SByte8> operator%(RValue<SByte8> lhs, RValue<SByte8> rhs)
1597// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001598// return RValue<SByte8>(Nucleus::createSRem(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001599// }
1600
Nicolas Capens157ba262019-12-10 17:49:14 -05001601RValue<SByte8> operator&(RValue<SByte8> lhs, RValue<SByte8> rhs)
1602{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001603 return RValue<SByte8>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001604}
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{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001608 return RValue<SByte8>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001609}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001610
Nicolas Capens157ba262019-12-10 17:49:14 -05001611RValue<SByte8> operator^(RValue<SByte8> lhs, RValue<SByte8> rhs)
1612{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001613 return RValue<SByte8>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001614}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001615
1616// RValue<SByte8> operator<<(RValue<SByte8> lhs, unsigned char rhs)
1617// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001618// return RValue<SByte8>(Nucleus::createShl(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001619// }
1620
1621// RValue<SByte8> operator>>(RValue<SByte8> lhs, unsigned char rhs)
1622// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001623// return RValue<SByte8>(Nucleus::createAShr(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001624// }
1625
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
Nicolas Capens157ba262019-12-10 17:49:14 -05001631RValue<SByte8> operator-=(SByte8 &lhs, RValue<SByte8> rhs)
1632{
1633 return lhs = lhs - rhs;
1634}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001635
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
1646// RValue<SByte8> operator%=(SByte8 &lhs, RValue<SByte8> rhs)
1647// {
1648// return lhs = lhs % rhs;
1649// }
1650
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
Nicolas Capens157ba262019-12-10 17:49:14 -05001661RValue<SByte8> operator^=(SByte8 &lhs, RValue<SByte8> rhs)
1662{
1663 return lhs = lhs ^ rhs;
1664}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001665
1666// RValue<SByte8> operator<<=(SByte8 &lhs, RValue<SByte8> rhs)
1667// {
1668// return lhs = lhs << rhs;
1669// }
1670
1671// RValue<SByte8> operator>>=(SByte8 &lhs, RValue<SByte8> rhs)
1672// {
1673// return lhs = lhs >> rhs;
1674// }
1675
1676// RValue<SByte8> operator+(RValue<SByte8> val)
1677// {
1678// return val;
1679// }
1680
1681// RValue<SByte8> operator-(RValue<SByte8> val)
1682// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001683// return RValue<SByte8>(Nucleus::createNeg(val.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001684// }
1685
Nicolas Capens157ba262019-12-10 17:49:14 -05001686RValue<SByte8> operator~(RValue<SByte8> val)
1687{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001688 return RValue<SByte8>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001689}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001690
Nicolas Capens157ba262019-12-10 17:49:14 -05001691RValue<Short4> UnpackLow(RValue<SByte8> x, RValue<SByte8> y)
1692{
Nicolas Capens133b87d2020-01-25 16:26:28 -05001693 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00001694 int shuffle[16] = { 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23 }; // Real type is v16i8
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001695 return As<Short4>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05001696}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001697
Nicolas Capens157ba262019-12-10 17:49:14 -05001698RValue<Short4> UnpackHigh(RValue<SByte8> x, RValue<SByte8> y)
1699{
Nicolas Capens133b87d2020-01-25 16:26:28 -05001700 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00001701 int shuffle[16] = { 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23 }; // Real type is v16i8
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001702 auto lowHigh = RValue<Byte16>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05001703 return As<Short4>(Swizzle(As<Int4>(lowHigh), 0x2323));
1704}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001705
Nicolas Capens157ba262019-12-10 17:49:14 -05001706Byte16::Byte16(RValue<Byte16> rhs)
1707{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001708 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001709}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001710
Nicolas Capens157ba262019-12-10 17:49:14 -05001711Byte16::Byte16(const Byte16 &rhs)
1712{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001713 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001714}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001715
Nicolas Capens157ba262019-12-10 17:49:14 -05001716Byte16::Byte16(const Reference<Byte16> &rhs)
1717{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001718 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001719}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001720
Nicolas Capens157ba262019-12-10 17:49:14 -05001721RValue<Byte16> Byte16::operator=(RValue<Byte16> rhs)
1722{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001723 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001724}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001725
Nicolas Capens157ba262019-12-10 17:49:14 -05001726RValue<Byte16> Byte16::operator=(const Byte16 &rhs)
1727{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001728 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001729}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001730
Nicolas Capens157ba262019-12-10 17:49:14 -05001731RValue<Byte16> Byte16::operator=(const Reference<Byte16> &rhs)
1732{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001733 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001734}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001735
Nicolas Capens133b87d2020-01-25 16:26:28 -05001736RValue<Byte16> Swizzle(RValue<Byte16> x, uint64_t select)
1737{
1738 int shuffle[16] = {
1739 static_cast<int>((select >> 60) & 0x0F),
1740 static_cast<int>((select >> 56) & 0x0F),
1741 static_cast<int>((select >> 52) & 0x0F),
1742 static_cast<int>((select >> 48) & 0x0F),
1743 static_cast<int>((select >> 44) & 0x0F),
1744 static_cast<int>((select >> 40) & 0x0F),
1745 static_cast<int>((select >> 36) & 0x0F),
1746 static_cast<int>((select >> 32) & 0x0F),
1747 static_cast<int>((select >> 28) & 0x0F),
1748 static_cast<int>((select >> 24) & 0x0F),
1749 static_cast<int>((select >> 20) & 0x0F),
1750 static_cast<int>((select >> 16) & 0x0F),
1751 static_cast<int>((select >> 12) & 0x0F),
1752 static_cast<int>((select >> 8) & 0x0F),
1753 static_cast<int>((select >> 4) & 0x0F),
1754 static_cast<int>((select >> 0) & 0x0F),
1755 };
1756
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001757 return As<Byte16>(Nucleus::createShuffleVector(x.value(), x.value(), shuffle));
Nicolas Capens133b87d2020-01-25 16:26:28 -05001758}
1759
Nicolas Capens157ba262019-12-10 17:49:14 -05001760Short2::Short2(RValue<Short4> cast)
1761{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001762 storeValue(Nucleus::createBitCast(cast.value(), type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001763}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001764
Nicolas Capens157ba262019-12-10 17:49:14 -05001765UShort2::UShort2(RValue<UShort4> cast)
1766{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001767 storeValue(Nucleus::createBitCast(cast.value(), type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001768}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001769
Nicolas Capens157ba262019-12-10 17:49:14 -05001770Short4::Short4(RValue<Int> cast)
1771{
1772 Value *vector = loadValue();
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001773 Value *element = Nucleus::createTrunc(cast.value(), Short::type());
Nicolas Capens157ba262019-12-10 17:49:14 -05001774 Value *insert = Nucleus::createInsertElement(vector, element, 0);
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001775 Value *swizzle = Swizzle(RValue<Short4>(insert), 0x0000).value();
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001776
Nicolas Capens157ba262019-12-10 17:49:14 -05001777 storeValue(swizzle);
1778}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001779
Nicolas Capens71196862022-01-06 21:31:57 -05001780Short4::Short4(RValue<UInt4> cast)
1781 : Short4(As<Int4>(cast))
1782{
1783}
1784
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001785// 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 Capens519cf222020-05-08 15:27:19 -04001792 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001793}
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 Capens519cf222020-05-08 15:27:19 -04001798 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001799}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001800
Nicolas Capens157ba262019-12-10 17:49:14 -05001801Short4::Short4(RValue<Short4> rhs)
1802{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001803 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001804}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001805
Nicolas Capens157ba262019-12-10 17:49:14 -05001806Short4::Short4(const Short4 &rhs)
1807{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001808 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001809}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001810
Nicolas Capens157ba262019-12-10 17:49:14 -05001811Short4::Short4(const Reference<Short4> &rhs)
1812{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001813 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001814}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001815
Nicolas Capens157ba262019-12-10 17:49:14 -05001816Short4::Short4(RValue<UShort4> rhs)
1817{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001818 storeValue(rhs.value());
Nicolas Capens157ba262019-12-10 17:49:14 -05001819}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001820
Nicolas Capens157ba262019-12-10 17:49:14 -05001821Short4::Short4(const UShort4 &rhs)
1822{
1823 storeValue(rhs.loadValue());
1824}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001825
Nicolas Capens157ba262019-12-10 17:49:14 -05001826Short4::Short4(const Reference<UShort4> &rhs)
1827{
1828 storeValue(rhs.loadValue());
1829}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001830
Nicolas Capens157ba262019-12-10 17:49:14 -05001831RValue<Short4> Short4::operator=(RValue<Short4> rhs)
1832{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001833 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001834}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001835
Nicolas Capens157ba262019-12-10 17:49:14 -05001836RValue<Short4> Short4::operator=(const Short4 &rhs)
1837{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001838 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001839}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001840
Nicolas Capens157ba262019-12-10 17:49:14 -05001841RValue<Short4> Short4::operator=(const Reference<Short4> &rhs)
1842{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001843 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001844}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001845
Nicolas Capens157ba262019-12-10 17:49:14 -05001846RValue<Short4> Short4::operator=(RValue<UShort4> rhs)
1847{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001848 return RValue<Short4>(storeValue(rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001849}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001850
Nicolas Capens157ba262019-12-10 17:49:14 -05001851RValue<Short4> Short4::operator=(const UShort4 &rhs)
1852{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001853 return RValue<Short4>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001854}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001855
Nicolas Capens157ba262019-12-10 17:49:14 -05001856RValue<Short4> Short4::operator=(const Reference<UShort4> &rhs)
1857{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001858 return RValue<Short4>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001859}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001860
Nicolas Capens157ba262019-12-10 17:49:14 -05001861RValue<Short4> operator+(RValue<Short4> lhs, RValue<Short4> rhs)
1862{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001863 return RValue<Short4>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001864}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001865
Nicolas Capens157ba262019-12-10 17:49:14 -05001866RValue<Short4> operator-(RValue<Short4> lhs, RValue<Short4> rhs)
1867{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001868 return RValue<Short4>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001869}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001870
Nicolas Capens157ba262019-12-10 17:49:14 -05001871RValue<Short4> operator*(RValue<Short4> lhs, RValue<Short4> rhs)
1872{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001873 return RValue<Short4>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001874}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001875
1876// RValue<Short4> operator/(RValue<Short4> lhs, RValue<Short4> rhs)
1877// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001878// return RValue<Short4>(Nucleus::createSDiv(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001879// }
1880
1881// RValue<Short4> operator%(RValue<Short4> lhs, RValue<Short4> rhs)
1882// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001883// return RValue<Short4>(Nucleus::createSRem(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001884// }
1885
Nicolas Capens157ba262019-12-10 17:49:14 -05001886RValue<Short4> operator&(RValue<Short4> lhs, RValue<Short4> rhs)
1887{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001888 return RValue<Short4>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001889}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001890
Nicolas Capens157ba262019-12-10 17:49:14 -05001891RValue<Short4> operator|(RValue<Short4> lhs, RValue<Short4> rhs)
1892{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001893 return RValue<Short4>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001894}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001895
Nicolas Capens157ba262019-12-10 17:49:14 -05001896RValue<Short4> operator^(RValue<Short4> lhs, RValue<Short4> rhs)
1897{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001898 return RValue<Short4>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001899}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001900
Nicolas Capens157ba262019-12-10 17:49:14 -05001901RValue<Short4> operator+=(Short4 &lhs, RValue<Short4> rhs)
1902{
1903 return lhs = lhs + rhs;
1904}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001905
Nicolas Capens157ba262019-12-10 17:49:14 -05001906RValue<Short4> operator-=(Short4 &lhs, RValue<Short4> rhs)
1907{
1908 return lhs = lhs - rhs;
1909}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001910
Nicolas Capens157ba262019-12-10 17:49:14 -05001911RValue<Short4> operator*=(Short4 &lhs, RValue<Short4> rhs)
1912{
1913 return lhs = lhs * rhs;
1914}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001915
1916// RValue<Short4> operator/=(Short4 &lhs, RValue<Short4> rhs)
1917// {
1918// return lhs = lhs / rhs;
1919// }
1920
1921// RValue<Short4> operator%=(Short4 &lhs, RValue<Short4> rhs)
1922// {
1923// return lhs = lhs % rhs;
1924// }
1925
Nicolas Capens157ba262019-12-10 17:49:14 -05001926RValue<Short4> operator&=(Short4 &lhs, RValue<Short4> rhs)
1927{
1928 return lhs = lhs & rhs;
1929}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001930
Nicolas Capens157ba262019-12-10 17:49:14 -05001931RValue<Short4> operator|=(Short4 &lhs, RValue<Short4> rhs)
1932{
1933 return lhs = lhs | rhs;
1934}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001935
Nicolas Capens157ba262019-12-10 17:49:14 -05001936RValue<Short4> operator^=(Short4 &lhs, RValue<Short4> rhs)
1937{
1938 return lhs = lhs ^ rhs;
1939}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001940
Nicolas Capens157ba262019-12-10 17:49:14 -05001941RValue<Short4> operator<<=(Short4 &lhs, unsigned char rhs)
1942{
1943 return lhs = lhs << rhs;
1944}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001945
Nicolas Capens157ba262019-12-10 17:49:14 -05001946RValue<Short4> operator>>=(Short4 &lhs, unsigned char rhs)
1947{
1948 return lhs = lhs >> rhs;
1949}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001950
1951// RValue<Short4> operator+(RValue<Short4> val)
1952// {
1953// return val;
1954// }
1955
Nicolas Capens157ba262019-12-10 17:49:14 -05001956RValue<Short4> operator-(RValue<Short4> val)
1957{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001958 return RValue<Short4>(Nucleus::createNeg(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001959}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001960
Nicolas Capens157ba262019-12-10 17:49:14 -05001961RValue<Short4> operator~(RValue<Short4> val)
1962{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001963 return RValue<Short4>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001964}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001965
Nicolas Capens157ba262019-12-10 17:49:14 -05001966RValue<Short4> RoundShort4(RValue<Float4> cast)
1967{
1968 RValue<Int4> int4 = RoundInt(cast);
1969 return As<Short4>(PackSigned(int4, int4));
1970}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001971
Nicolas Capens157ba262019-12-10 17:49:14 -05001972RValue<Int2> UnpackLow(RValue<Short4> x, RValue<Short4> y)
1973{
Ben Clayton713b8d32019-12-17 20:37:56 +00001974 int shuffle[8] = { 0, 8, 1, 9, 2, 10, 3, 11 }; // Real type is v8i16
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001975 return As<Int2>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05001976}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001977
Nicolas Capens157ba262019-12-10 17:49:14 -05001978RValue<Int2> UnpackHigh(RValue<Short4> x, RValue<Short4> y)
1979{
Nicolas Capens133b87d2020-01-25 16:26:28 -05001980 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00001981 int shuffle[8] = { 0, 8, 1, 9, 2, 10, 3, 11 }; // Real type is v8i16
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001982 auto lowHigh = RValue<Short8>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05001983 return As<Int2>(Swizzle(As<Int4>(lowHigh), 0x2323));
1984}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001985
Nicolas Capens157ba262019-12-10 17:49:14 -05001986RValue<Short4> Swizzle(RValue<Short4> x, uint16_t select)
1987{
1988 // Real type is v8i16
Nicolas Capens133b87d2020-01-25 16:26:28 -05001989 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00001990 int shuffle[8] = {
Nicolas Capens157ba262019-12-10 17:49:14 -05001991 (select >> 12) & 0x03,
Ben Clayton713b8d32019-12-17 20:37:56 +00001992 (select >> 8) & 0x03,
1993 (select >> 4) & 0x03,
1994 (select >> 0) & 0x03,
Nicolas Capens157ba262019-12-10 17:49:14 -05001995 (select >> 12) & 0x03,
Ben Clayton713b8d32019-12-17 20:37:56 +00001996 (select >> 8) & 0x03,
1997 (select >> 4) & 0x03,
1998 (select >> 0) & 0x03,
Nicolas Capens157ba262019-12-10 17:49:14 -05001999 };
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002000
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002001 return As<Short4>(Nucleus::createShuffleVector(x.value(), x.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05002002}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002003
Nicolas Capens157ba262019-12-10 17:49:14 -05002004RValue<Short4> Insert(RValue<Short4> val, RValue<Short> element, int i)
2005{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002006 return RValue<Short4>(Nucleus::createInsertElement(val.value(), element.value(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05002007}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002008
Nicolas Capens157ba262019-12-10 17:49:14 -05002009RValue<Short> Extract(RValue<Short4> val, int i)
2010{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002011 return RValue<Short>(Nucleus::createExtractElement(val.value(), Short::type(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05002012}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002013
Nicolas Capens71196862022-01-06 21:31:57 -05002014UShort4::UShort4(RValue<UInt4> cast)
2015 : UShort4(As<Int4>(cast))
2016{
2017}
2018
Nicolas Capens157ba262019-12-10 17:49:14 -05002019UShort4::UShort4(RValue<Int4> cast)
2020{
2021 *this = Short4(cast);
2022}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002023
Nicolas Capens157ba262019-12-10 17:49:14 -05002024UShort4::UShort4(unsigned short xyzw)
2025{
Ben Clayton713b8d32019-12-17 20:37:56 +00002026 int64_t constantVector[4] = { xyzw, xyzw, xyzw, xyzw };
Nicolas Capens519cf222020-05-08 15:27:19 -04002027 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002028}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002029
Nicolas Capens157ba262019-12-10 17:49:14 -05002030UShort4::UShort4(unsigned short x, unsigned short y, unsigned short z, unsigned short w)
2031{
Ben Clayton713b8d32019-12-17 20:37:56 +00002032 int64_t constantVector[4] = { x, y, z, w };
Nicolas Capens519cf222020-05-08 15:27:19 -04002033 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002034}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002035
Nicolas Capens157ba262019-12-10 17:49:14 -05002036UShort4::UShort4(RValue<UShort4> rhs)
2037{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002038 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002039}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002040
Nicolas Capens157ba262019-12-10 17:49:14 -05002041UShort4::UShort4(const UShort4 &rhs)
2042{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002043 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002044}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002045
Nicolas Capens157ba262019-12-10 17:49:14 -05002046UShort4::UShort4(const Reference<UShort4> &rhs)
2047{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002048 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002049}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002050
Nicolas Capens157ba262019-12-10 17:49:14 -05002051UShort4::UShort4(RValue<Short4> rhs)
2052{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002053 storeValue(rhs.value());
Nicolas Capens157ba262019-12-10 17:49:14 -05002054}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002055
Nicolas Capens157ba262019-12-10 17:49:14 -05002056UShort4::UShort4(const Short4 &rhs)
2057{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002058 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05002059}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002060
Nicolas Capens157ba262019-12-10 17:49:14 -05002061UShort4::UShort4(const Reference<Short4> &rhs)
2062{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002063 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05002064}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002065
Nicolas Capens157ba262019-12-10 17:49:14 -05002066RValue<UShort4> UShort4::operator=(RValue<UShort4> rhs)
2067{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002068 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002069}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002070
Nicolas Capens157ba262019-12-10 17:49:14 -05002071RValue<UShort4> UShort4::operator=(const UShort4 &rhs)
2072{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002073 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002074}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002075
Nicolas Capens157ba262019-12-10 17:49:14 -05002076RValue<UShort4> UShort4::operator=(const Reference<UShort4> &rhs)
2077{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002078 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002079}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002080
Nicolas Capens157ba262019-12-10 17:49:14 -05002081RValue<UShort4> UShort4::operator=(RValue<Short4> rhs)
2082{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002083 return RValue<UShort4>(storeValue(rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002084}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002085
Nicolas Capens157ba262019-12-10 17:49:14 -05002086RValue<UShort4> UShort4::operator=(const Short4 &rhs)
2087{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002088 return RValue<UShort4>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002089}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002090
Nicolas Capens157ba262019-12-10 17:49:14 -05002091RValue<UShort4> UShort4::operator=(const Reference<Short4> &rhs)
2092{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002093 return RValue<UShort4>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002094}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002095
Nicolas Capens157ba262019-12-10 17:49:14 -05002096RValue<UShort4> operator+(RValue<UShort4> lhs, RValue<UShort4> rhs)
2097{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002098 return RValue<UShort4>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002099}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002100
Nicolas Capens157ba262019-12-10 17:49:14 -05002101RValue<UShort4> operator-(RValue<UShort4> lhs, RValue<UShort4> rhs)
2102{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002103 return RValue<UShort4>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002104}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002105
Nicolas Capens157ba262019-12-10 17:49:14 -05002106RValue<UShort4> operator*(RValue<UShort4> lhs, RValue<UShort4> rhs)
2107{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002108 return RValue<UShort4>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002109}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002110
Nicolas Capens157ba262019-12-10 17:49:14 -05002111RValue<UShort4> operator&(RValue<UShort4> lhs, RValue<UShort4> rhs)
2112{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002113 return RValue<UShort4>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002114}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002115
Nicolas Capens157ba262019-12-10 17:49:14 -05002116RValue<UShort4> operator|(RValue<UShort4> lhs, RValue<UShort4> rhs)
2117{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002118 return RValue<UShort4>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002119}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002120
Nicolas Capens157ba262019-12-10 17:49:14 -05002121RValue<UShort4> operator^(RValue<UShort4> lhs, RValue<UShort4> rhs)
2122{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002123 return RValue<UShort4>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002124}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002125
Nicolas Capens157ba262019-12-10 17:49:14 -05002126RValue<UShort4> operator<<=(UShort4 &lhs, unsigned char rhs)
2127{
2128 return lhs = lhs << rhs;
2129}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002130
Nicolas Capens157ba262019-12-10 17:49:14 -05002131RValue<UShort4> operator>>=(UShort4 &lhs, unsigned char rhs)
2132{
2133 return lhs = lhs >> rhs;
2134}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002135
Nicolas Capens157ba262019-12-10 17:49:14 -05002136RValue<UShort4> operator~(RValue<UShort4> val)
2137{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002138 return RValue<UShort4>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002139}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002140
Nicolas Capens157ba262019-12-10 17:49:14 -05002141Short8::Short8(short c)
2142{
Ben Clayton713b8d32019-12-17 20:37:56 +00002143 int64_t constantVector[8] = { c, c, c, c, c, c, c, c };
Nicolas Capens519cf222020-05-08 15:27:19 -04002144 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002145}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002146
Nicolas Capens157ba262019-12-10 17:49:14 -05002147Short8::Short8(short c0, short c1, short c2, short c3, short c4, short c5, short c6, short c7)
2148{
Ben Clayton713b8d32019-12-17 20:37:56 +00002149 int64_t constantVector[8] = { c0, c1, c2, c3, c4, c5, c6, c7 };
Nicolas Capens519cf222020-05-08 15:27:19 -04002150 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002151}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002152
Nicolas Capens157ba262019-12-10 17:49:14 -05002153Short8::Short8(RValue<Short8> rhs)
2154{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002155 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002156}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002157
Nicolas Capens157ba262019-12-10 17:49:14 -05002158Short8::Short8(const Reference<Short8> &rhs)
2159{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002160 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002161}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002162
Nicolas Capens157ba262019-12-10 17:49:14 -05002163Short8::Short8(RValue<Short4> lo, RValue<Short4> hi)
2164{
Ben Clayton713b8d32019-12-17 20:37:56 +00002165 int shuffle[8] = { 0, 1, 2, 3, 8, 9, 10, 11 }; // Real type is v8i16
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002166 Value *packed = Nucleus::createShuffleVector(lo.value(), hi.value(), shuffle);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002167
Nicolas Capens157ba262019-12-10 17:49:14 -05002168 storeValue(packed);
2169}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002170
Nicolas Capens157ba262019-12-10 17:49:14 -05002171RValue<Short8> Short8::operator=(RValue<Short8> rhs)
2172{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002173 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002174}
Nicolas Capensf1beca42019-03-26 17:18:57 -04002175
Nicolas Capens157ba262019-12-10 17:49:14 -05002176RValue<Short8> Short8::operator=(const Short8 &rhs)
2177{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002178 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002179}
Nicolas Capensf1beca42019-03-26 17:18:57 -04002180
Nicolas Capens157ba262019-12-10 17:49:14 -05002181RValue<Short8> Short8::operator=(const Reference<Short8> &rhs)
2182{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002183 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002184}
Nicolas Capensf1beca42019-03-26 17:18:57 -04002185
Nicolas Capens157ba262019-12-10 17:49:14 -05002186RValue<Short8> operator+(RValue<Short8> lhs, RValue<Short8> rhs)
2187{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002188 return RValue<Short8>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002189}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002190
Nicolas Capens157ba262019-12-10 17:49:14 -05002191RValue<Short8> operator&(RValue<Short8> lhs, RValue<Short8> rhs)
2192{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002193 return RValue<Short8>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002194}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002195
Nicolas Capens157ba262019-12-10 17:49:14 -05002196UShort8::UShort8(unsigned short c)
2197{
Ben Clayton713b8d32019-12-17 20:37:56 +00002198 int64_t constantVector[8] = { c, c, c, c, c, c, c, c };
Nicolas Capens519cf222020-05-08 15:27:19 -04002199 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002200}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002201
Nicolas Capens157ba262019-12-10 17:49:14 -05002202UShort8::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)
2203{
Ben Clayton713b8d32019-12-17 20:37:56 +00002204 int64_t constantVector[8] = { c0, c1, c2, c3, c4, c5, c6, c7 };
Nicolas Capens519cf222020-05-08 15:27:19 -04002205 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002206}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002207
Nicolas Capens157ba262019-12-10 17:49:14 -05002208UShort8::UShort8(RValue<UShort8> rhs)
2209{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002210 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002211}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002212
Nicolas Capens157ba262019-12-10 17:49:14 -05002213UShort8::UShort8(const Reference<UShort8> &rhs)
2214{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002215 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002216}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002217
Nicolas Capens157ba262019-12-10 17:49:14 -05002218UShort8::UShort8(RValue<UShort4> lo, RValue<UShort4> hi)
2219{
Ben Clayton713b8d32019-12-17 20:37:56 +00002220 int shuffle[8] = { 0, 1, 2, 3, 8, 9, 10, 11 }; // Real type is v8i16
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002221 Value *packed = Nucleus::createShuffleVector(lo.value(), hi.value(), shuffle);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002222
Nicolas Capens157ba262019-12-10 17:49:14 -05002223 storeValue(packed);
2224}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002225
Nicolas Capens157ba262019-12-10 17:49:14 -05002226RValue<UShort8> UShort8::operator=(RValue<UShort8> rhs)
2227{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002228 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002229}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002230
Nicolas Capens157ba262019-12-10 17:49:14 -05002231RValue<UShort8> UShort8::operator=(const UShort8 &rhs)
2232{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002233 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002234}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002235
Nicolas Capens157ba262019-12-10 17:49:14 -05002236RValue<UShort8> UShort8::operator=(const Reference<UShort8> &rhs)
2237{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002238 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002239}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002240
Nicolas Capens157ba262019-12-10 17:49:14 -05002241RValue<UShort8> operator&(RValue<UShort8> lhs, RValue<UShort8> rhs)
2242{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002243 return RValue<UShort8>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002244}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002245
Nicolas Capens157ba262019-12-10 17:49:14 -05002246RValue<UShort8> operator+(RValue<UShort8> lhs, RValue<UShort8> rhs)
2247{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002248 return RValue<UShort8>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002249}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002250
Nicolas Capens157ba262019-12-10 17:49:14 -05002251RValue<UShort8> operator*(RValue<UShort8> lhs, RValue<UShort8> rhs)
2252{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002253 return RValue<UShort8>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002254}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002255
Nicolas Capens157ba262019-12-10 17:49:14 -05002256RValue<UShort8> operator+=(UShort8 &lhs, RValue<UShort8> rhs)
2257{
2258 return lhs = lhs + rhs;
2259}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002260
Nicolas Capens157ba262019-12-10 17:49:14 -05002261RValue<UShort8> operator~(RValue<UShort8> val)
2262{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002263 return RValue<UShort8>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002264}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002265
Nicolas Capens133b87d2020-01-25 16:26:28 -05002266RValue<UShort8> Swizzle(RValue<UShort8> x, uint32_t select)
2267{
2268 int swizzle[16] = {
2269 static_cast<int>((select >> 28) & 0x07),
2270 static_cast<int>((select >> 24) & 0x07),
2271 static_cast<int>((select >> 20) & 0x07),
2272 static_cast<int>((select >> 16) & 0x07),
2273 static_cast<int>((select >> 12) & 0x07),
2274 static_cast<int>((select >> 8) & 0x07),
2275 static_cast<int>((select >> 4) & 0x07),
2276 static_cast<int>((select >> 0) & 0x07),
2277 };
2278
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002279 return RValue<UShort8>(Nucleus::createShuffleVector(x.value(), x.value(), swizzle));
Nicolas Capens133b87d2020-01-25 16:26:28 -05002280}
2281
Nicolas Capens157ba262019-12-10 17:49:14 -05002282Int::Int(Argument<Int> argument)
2283{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002284 store(argument.rvalue());
Nicolas Capens157ba262019-12-10 17:49:14 -05002285}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002286
Nicolas Capens157ba262019-12-10 17:49:14 -05002287Int::Int(RValue<Byte> cast)
2288{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002289 Value *integer = Nucleus::createZExt(cast.value(), Int::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002290
Nicolas Capens157ba262019-12-10 17:49:14 -05002291 storeValue(integer);
2292}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002293
Nicolas Capens157ba262019-12-10 17:49:14 -05002294Int::Int(RValue<SByte> cast)
2295{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002296 Value *integer = Nucleus::createSExt(cast.value(), Int::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002297
Nicolas Capens157ba262019-12-10 17:49:14 -05002298 storeValue(integer);
2299}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002300
Nicolas Capens157ba262019-12-10 17:49:14 -05002301Int::Int(RValue<Short> cast)
2302{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002303 Value *integer = Nucleus::createSExt(cast.value(), Int::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002304
Nicolas Capens157ba262019-12-10 17:49:14 -05002305 storeValue(integer);
2306}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002307
Nicolas Capens157ba262019-12-10 17:49:14 -05002308Int::Int(RValue<UShort> cast)
2309{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002310 Value *integer = Nucleus::createZExt(cast.value(), Int::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002311
Nicolas Capens157ba262019-12-10 17:49:14 -05002312 storeValue(integer);
2313}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002314
Nicolas Capens157ba262019-12-10 17:49:14 -05002315Int::Int(RValue<Int2> cast)
2316{
2317 *this = Extract(cast, 0);
2318}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002319
Nicolas Capens157ba262019-12-10 17:49:14 -05002320Int::Int(RValue<Long> cast)
2321{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002322 Value *integer = Nucleus::createTrunc(cast.value(), Int::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002323
Nicolas Capens157ba262019-12-10 17:49:14 -05002324 storeValue(integer);
2325}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002326
Nicolas Capens157ba262019-12-10 17:49:14 -05002327Int::Int(RValue<Float> cast)
2328{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002329 Value *integer = Nucleus::createFPToSI(cast.value(), Int::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002330
Nicolas Capens157ba262019-12-10 17:49:14 -05002331 storeValue(integer);
2332}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002333
Nicolas Capens157ba262019-12-10 17:49:14 -05002334Int::Int(int x)
2335{
2336 storeValue(Nucleus::createConstantInt(x));
2337}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002338
Nicolas Capens157ba262019-12-10 17:49:14 -05002339Int::Int(RValue<Int> rhs)
2340{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002341 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002342}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002343
Nicolas Capens157ba262019-12-10 17:49:14 -05002344Int::Int(RValue<UInt> rhs)
2345{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002346 storeValue(rhs.value());
Nicolas Capens157ba262019-12-10 17:49:14 -05002347}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002348
Nicolas Capens157ba262019-12-10 17:49:14 -05002349Int::Int(const Int &rhs)
2350{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002351 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002352}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002353
Nicolas Capens157ba262019-12-10 17:49:14 -05002354Int::Int(const Reference<Int> &rhs)
2355{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002356 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002357}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002358
Nicolas Capens157ba262019-12-10 17:49:14 -05002359Int::Int(const UInt &rhs)
2360{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002361 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05002362}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002363
Nicolas Capens157ba262019-12-10 17:49:14 -05002364Int::Int(const Reference<UInt> &rhs)
2365{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002366 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05002367}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002368
Nicolas Capens157ba262019-12-10 17:49:14 -05002369RValue<Int> Int::operator=(int rhs)
2370{
2371 return RValue<Int>(storeValue(Nucleus::createConstantInt(rhs)));
2372}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002373
Nicolas Capens157ba262019-12-10 17:49:14 -05002374RValue<Int> Int::operator=(RValue<Int> rhs)
2375{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002376 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002377}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002378
Nicolas Capens157ba262019-12-10 17:49:14 -05002379RValue<Int> Int::operator=(RValue<UInt> rhs)
2380{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002381 storeValue(rhs.value());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002382
Nicolas Capens157ba262019-12-10 17:49:14 -05002383 return RValue<Int>(rhs);
2384}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002385
Nicolas Capens157ba262019-12-10 17:49:14 -05002386RValue<Int> Int::operator=(const Int &rhs)
2387{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002388 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002389}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002390
Nicolas Capens157ba262019-12-10 17:49:14 -05002391RValue<Int> Int::operator=(const Reference<Int> &rhs)
2392{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002393 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002394}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002395
Nicolas Capens157ba262019-12-10 17:49:14 -05002396RValue<Int> Int::operator=(const UInt &rhs)
2397{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002398 return RValue<Int>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002399}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002400
Nicolas Capens157ba262019-12-10 17:49:14 -05002401RValue<Int> Int::operator=(const Reference<UInt> &rhs)
2402{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002403 return RValue<Int>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002404}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002405
Nicolas Capens157ba262019-12-10 17:49:14 -05002406RValue<Int> operator+(RValue<Int> lhs, RValue<Int> rhs)
2407{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002408 return RValue<Int>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002409}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002410
Nicolas Capens157ba262019-12-10 17:49:14 -05002411RValue<Int> operator-(RValue<Int> lhs, RValue<Int> rhs)
2412{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002413 return RValue<Int>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002414}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002415
Nicolas Capens157ba262019-12-10 17:49:14 -05002416RValue<Int> operator*(RValue<Int> lhs, RValue<Int> rhs)
2417{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002418 return RValue<Int>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002419}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002420
Nicolas Capens157ba262019-12-10 17:49:14 -05002421RValue<Int> operator/(RValue<Int> lhs, RValue<Int> rhs)
2422{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002423 return RValue<Int>(Nucleus::createSDiv(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002424}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002425
Nicolas Capens157ba262019-12-10 17:49:14 -05002426RValue<Int> operator%(RValue<Int> lhs, RValue<Int> rhs)
2427{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002428 return RValue<Int>(Nucleus::createSRem(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002429}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002430
Nicolas Capens157ba262019-12-10 17:49:14 -05002431RValue<Int> operator&(RValue<Int> lhs, RValue<Int> rhs)
2432{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002433 return RValue<Int>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002434}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002435
Nicolas Capens157ba262019-12-10 17:49:14 -05002436RValue<Int> operator|(RValue<Int> lhs, RValue<Int> rhs)
2437{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002438 return RValue<Int>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002439}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002440
Nicolas Capens157ba262019-12-10 17:49:14 -05002441RValue<Int> operator^(RValue<Int> lhs, RValue<Int> rhs)
2442{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002443 return RValue<Int>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002444}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002445
Nicolas Capens157ba262019-12-10 17:49:14 -05002446RValue<Int> operator<<(RValue<Int> lhs, RValue<Int> rhs)
2447{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002448 return RValue<Int>(Nucleus::createShl(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002449}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002450
Nicolas Capens157ba262019-12-10 17:49:14 -05002451RValue<Int> operator>>(RValue<Int> lhs, RValue<Int> rhs)
2452{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002453 return RValue<Int>(Nucleus::createAShr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002454}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002455
Nicolas Capens157ba262019-12-10 17:49:14 -05002456RValue<Int> operator+=(Int &lhs, RValue<Int> rhs)
2457{
2458 return lhs = lhs + rhs;
2459}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002460
Nicolas Capens157ba262019-12-10 17:49:14 -05002461RValue<Int> operator-=(Int &lhs, RValue<Int> rhs)
2462{
2463 return lhs = lhs - rhs;
2464}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002465
Nicolas Capens157ba262019-12-10 17:49:14 -05002466RValue<Int> operator*=(Int &lhs, RValue<Int> rhs)
2467{
2468 return lhs = lhs * rhs;
2469}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002470
Nicolas Capens157ba262019-12-10 17:49:14 -05002471RValue<Int> operator/=(Int &lhs, RValue<Int> rhs)
2472{
2473 return lhs = lhs / rhs;
2474}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002475
Nicolas Capens157ba262019-12-10 17:49:14 -05002476RValue<Int> operator%=(Int &lhs, RValue<Int> rhs)
2477{
2478 return lhs = lhs % rhs;
2479}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002480
Nicolas Capens157ba262019-12-10 17:49:14 -05002481RValue<Int> operator&=(Int &lhs, RValue<Int> rhs)
2482{
2483 return lhs = lhs & rhs;
2484}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002485
Nicolas Capens157ba262019-12-10 17:49:14 -05002486RValue<Int> operator|=(Int &lhs, RValue<Int> rhs)
2487{
2488 return lhs = lhs | rhs;
2489}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002490
Nicolas Capens157ba262019-12-10 17:49:14 -05002491RValue<Int> operator^=(Int &lhs, RValue<Int> rhs)
2492{
2493 return lhs = lhs ^ rhs;
2494}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002495
Nicolas Capens157ba262019-12-10 17:49:14 -05002496RValue<Int> operator<<=(Int &lhs, RValue<Int> rhs)
2497{
2498 return lhs = lhs << rhs;
2499}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002500
Nicolas Capens157ba262019-12-10 17:49:14 -05002501RValue<Int> operator>>=(Int &lhs, RValue<Int> rhs)
2502{
2503 return lhs = lhs >> rhs;
2504}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002505
Nicolas Capens157ba262019-12-10 17:49:14 -05002506RValue<Int> operator+(RValue<Int> val)
2507{
2508 return val;
2509}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002510
Nicolas Capens157ba262019-12-10 17:49:14 -05002511RValue<Int> operator-(RValue<Int> val)
2512{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002513 return RValue<Int>(Nucleus::createNeg(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002514}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002515
Nicolas Capens157ba262019-12-10 17:49:14 -05002516RValue<Int> operator~(RValue<Int> val)
2517{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002518 return RValue<Int>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002519}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002520
Nicolas Capens157ba262019-12-10 17:49:14 -05002521RValue<Bool> operator<(RValue<Int> lhs, RValue<Int> rhs)
2522{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002523 return RValue<Bool>(Nucleus::createICmpSLT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002524}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002525
Nicolas Capens157ba262019-12-10 17:49:14 -05002526RValue<Bool> operator<=(RValue<Int> lhs, RValue<Int> rhs)
2527{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002528 return RValue<Bool>(Nucleus::createICmpSLE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002529}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002530
Nicolas Capens157ba262019-12-10 17:49:14 -05002531RValue<Bool> operator>(RValue<Int> lhs, RValue<Int> rhs)
2532{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002533 return RValue<Bool>(Nucleus::createICmpSGT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002534}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002535
Nicolas Capens157ba262019-12-10 17:49:14 -05002536RValue<Bool> operator>=(RValue<Int> lhs, RValue<Int> rhs)
2537{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002538 return RValue<Bool>(Nucleus::createICmpSGE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002539}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002540
Nicolas Capens157ba262019-12-10 17:49:14 -05002541RValue<Bool> operator!=(RValue<Int> lhs, RValue<Int> rhs)
2542{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002543 return RValue<Bool>(Nucleus::createICmpNE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002544}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002545
Nicolas Capens157ba262019-12-10 17:49:14 -05002546RValue<Bool> operator==(RValue<Int> lhs, RValue<Int> rhs)
2547{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002548 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002549}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002550
Nicolas Capens157ba262019-12-10 17:49:14 -05002551RValue<Int> Max(RValue<Int> x, RValue<Int> y)
2552{
2553 return IfThenElse(x > y, x, y);
2554}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002555
Nicolas Capens157ba262019-12-10 17:49:14 -05002556RValue<Int> Min(RValue<Int> x, RValue<Int> y)
2557{
2558 return IfThenElse(x < y, x, y);
2559}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002560
Nicolas Capens157ba262019-12-10 17:49:14 -05002561RValue<Int> Clamp(RValue<Int> x, RValue<Int> min, RValue<Int> max)
2562{
2563 return Min(Max(x, min), max);
2564}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002565
Nicolas Capens157ba262019-12-10 17:49:14 -05002566Long::Long(RValue<Int> cast)
2567{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002568 Value *integer = Nucleus::createSExt(cast.value(), Long::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002569
Nicolas Capens157ba262019-12-10 17:49:14 -05002570 storeValue(integer);
2571}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002572
Nicolas Capens157ba262019-12-10 17:49:14 -05002573Long::Long(RValue<UInt> cast)
2574{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002575 Value *integer = Nucleus::createZExt(cast.value(), Long::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002576
Nicolas Capens157ba262019-12-10 17:49:14 -05002577 storeValue(integer);
2578}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002579
Nicolas Capens157ba262019-12-10 17:49:14 -05002580Long::Long(RValue<Long> rhs)
2581{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002582 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002583}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002584
Nicolas Capens157ba262019-12-10 17:49:14 -05002585RValue<Long> Long::operator=(int64_t rhs)
2586{
2587 return RValue<Long>(storeValue(Nucleus::createConstantLong(rhs)));
2588}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002589
Nicolas Capens157ba262019-12-10 17:49:14 -05002590RValue<Long> Long::operator=(RValue<Long> rhs)
2591{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002592 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002593}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002594
Nicolas Capens157ba262019-12-10 17:49:14 -05002595RValue<Long> Long::operator=(const Long &rhs)
2596{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002597 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002598}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002599
Nicolas Capens157ba262019-12-10 17:49:14 -05002600RValue<Long> Long::operator=(const Reference<Long> &rhs)
2601{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002602 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002603}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002604
Nicolas Capens157ba262019-12-10 17:49:14 -05002605RValue<Long> operator+(RValue<Long> lhs, RValue<Long> rhs)
2606{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002607 return RValue<Long>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002608}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002609
Nicolas Capens157ba262019-12-10 17:49:14 -05002610RValue<Long> operator-(RValue<Long> lhs, RValue<Long> rhs)
2611{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002612 return RValue<Long>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002613}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002614
Nicolas Capens157ba262019-12-10 17:49:14 -05002615RValue<Long> operator*(RValue<Long> lhs, RValue<Long> rhs)
2616{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002617 return RValue<Long>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002618}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002619
Nicolas Capens157ba262019-12-10 17:49:14 -05002620RValue<Long> operator>>(RValue<Long> lhs, RValue<Long> rhs)
2621{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002622 return RValue<Long>(Nucleus::createAShr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002623}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002624
Nicolas Capens157ba262019-12-10 17:49:14 -05002625RValue<Long> operator+=(Long &lhs, RValue<Long> rhs)
2626{
2627 return lhs = lhs + rhs;
2628}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002629
Nicolas Capens157ba262019-12-10 17:49:14 -05002630RValue<Long> operator-=(Long &lhs, RValue<Long> rhs)
2631{
2632 return lhs = lhs - rhs;
2633}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002634
Ben Clayton713b8d32019-12-17 20:37:56 +00002635RValue<Long> AddAtomic(RValue<Pointer<Long>> x, RValue<Long> y)
Nicolas Capens157ba262019-12-10 17:49:14 -05002636{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002637 return RValue<Long>(Nucleus::createAtomicAdd(x.value(), y.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002638}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002639
Ben Clayton713b8d32019-12-17 20:37:56 +00002640RValue<UInt> AddAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
Nicolas Capens157ba262019-12-10 17:49:14 -05002641{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002642 return RValue<UInt>(Nucleus::createAtomicAdd(x.value(), y.value(), memoryOrder));
Nicolas Capens157ba262019-12-10 17:49:14 -05002643}
Chris Forbes17813932019-04-18 11:45:54 -07002644
Ben Clayton713b8d32019-12-17 20:37:56 +00002645RValue<UInt> SubAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
Nicolas Capens157ba262019-12-10 17:49:14 -05002646{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002647 return RValue<UInt>(Nucleus::createAtomicSub(x.value(), y.value(), memoryOrder));
Nicolas Capens157ba262019-12-10 17:49:14 -05002648}
Chris Forbes707ed992019-04-18 18:17:35 -07002649
Ben Clayton713b8d32019-12-17 20:37:56 +00002650RValue<UInt> AndAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
Nicolas Capens157ba262019-12-10 17:49:14 -05002651{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002652 return RValue<UInt>(Nucleus::createAtomicAnd(x.value(), y.value(), memoryOrder));
Nicolas Capens157ba262019-12-10 17:49:14 -05002653}
Chris Forbes17813932019-04-18 11:45:54 -07002654
Ben Clayton713b8d32019-12-17 20:37:56 +00002655RValue<UInt> OrAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
Nicolas Capens157ba262019-12-10 17:49:14 -05002656{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002657 return RValue<UInt>(Nucleus::createAtomicOr(x.value(), y.value(), memoryOrder));
Nicolas Capens157ba262019-12-10 17:49:14 -05002658}
Chris Forbes17813932019-04-18 11:45:54 -07002659
Ben Clayton713b8d32019-12-17 20:37:56 +00002660RValue<UInt> XorAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
Nicolas Capens157ba262019-12-10 17:49:14 -05002661{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002662 return RValue<UInt>(Nucleus::createAtomicXor(x.value(), y.value(), memoryOrder));
Nicolas Capens157ba262019-12-10 17:49:14 -05002663}
Chris Forbes17813932019-04-18 11:45:54 -07002664
Ben Clayton713b8d32019-12-17 20:37:56 +00002665RValue<UInt> ExchangeAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
Nicolas Capens157ba262019-12-10 17:49:14 -05002666{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002667 return RValue<UInt>(Nucleus::createAtomicExchange(x.value(), y.value(), memoryOrder));
Nicolas Capens157ba262019-12-10 17:49:14 -05002668}
Chris Forbes17813932019-04-18 11:45:54 -07002669
Ben Clayton713b8d32019-12-17 20:37:56 +00002670RValue<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 -05002671{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002672 return RValue<UInt>(Nucleus::createAtomicCompareExchange(x.value(), y.value(), compare.value(), memoryOrderEqual, memoryOrderUnequal));
Nicolas Capens157ba262019-12-10 17:49:14 -05002673}
Chris Forbesa16238d2019-04-18 16:31:54 -07002674
Nicolas Capens157ba262019-12-10 17:49:14 -05002675UInt::UInt(Argument<UInt> argument)
2676{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002677 store(argument.rvalue());
Nicolas Capens157ba262019-12-10 17:49:14 -05002678}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002679
Nicolas Capens157ba262019-12-10 17:49:14 -05002680UInt::UInt(RValue<UShort> cast)
2681{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002682 Value *integer = Nucleus::createZExt(cast.value(), UInt::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002683
Nicolas Capens157ba262019-12-10 17:49:14 -05002684 storeValue(integer);
2685}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002686
Nicolas Capens157ba262019-12-10 17:49:14 -05002687UInt::UInt(RValue<Long> cast)
2688{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002689 Value *integer = Nucleus::createTrunc(cast.value(), UInt::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002690
Nicolas Capens157ba262019-12-10 17:49:14 -05002691 storeValue(integer);
2692}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002693
Nicolas Capens157ba262019-12-10 17:49:14 -05002694UInt::UInt(int x)
2695{
2696 storeValue(Nucleus::createConstantInt(x));
2697}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002698
Nicolas Capens157ba262019-12-10 17:49:14 -05002699UInt::UInt(unsigned int x)
2700{
2701 storeValue(Nucleus::createConstantInt(x));
2702}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002703
Nicolas Capens157ba262019-12-10 17:49:14 -05002704UInt::UInt(RValue<UInt> rhs)
2705{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002706 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002707}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002708
Nicolas Capens157ba262019-12-10 17:49:14 -05002709UInt::UInt(RValue<Int> rhs)
2710{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002711 storeValue(rhs.value());
Nicolas Capens157ba262019-12-10 17:49:14 -05002712}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002713
Nicolas Capens157ba262019-12-10 17:49:14 -05002714UInt::UInt(const UInt &rhs)
2715{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002716 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002717}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002718
Nicolas Capens157ba262019-12-10 17:49:14 -05002719UInt::UInt(const Reference<UInt> &rhs)
2720{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002721 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002722}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002723
Nicolas Capens157ba262019-12-10 17:49:14 -05002724UInt::UInt(const Int &rhs)
2725{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002726 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05002727}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002728
Nicolas Capens157ba262019-12-10 17:49:14 -05002729UInt::UInt(const Reference<Int> &rhs)
2730{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002731 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05002732}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002733
Nicolas Capens157ba262019-12-10 17:49:14 -05002734RValue<UInt> UInt::operator=(unsigned int rhs)
2735{
2736 return RValue<UInt>(storeValue(Nucleus::createConstantInt(rhs)));
2737}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002738
Nicolas Capens157ba262019-12-10 17:49:14 -05002739RValue<UInt> UInt::operator=(RValue<UInt> rhs)
2740{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002741 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002742}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002743
Nicolas Capens157ba262019-12-10 17:49:14 -05002744RValue<UInt> UInt::operator=(RValue<Int> rhs)
2745{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002746 storeValue(rhs.value());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002747
Nicolas Capens157ba262019-12-10 17:49:14 -05002748 return RValue<UInt>(rhs);
2749}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002750
Nicolas Capens157ba262019-12-10 17:49:14 -05002751RValue<UInt> UInt::operator=(const UInt &rhs)
2752{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002753 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002754}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002755
Nicolas Capens157ba262019-12-10 17:49:14 -05002756RValue<UInt> UInt::operator=(const Reference<UInt> &rhs)
2757{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002758 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002759}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002760
Nicolas Capens157ba262019-12-10 17:49:14 -05002761RValue<UInt> UInt::operator=(const Int &rhs)
2762{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002763 return RValue<UInt>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002764}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002765
Nicolas Capens157ba262019-12-10 17:49:14 -05002766RValue<UInt> UInt::operator=(const Reference<Int> &rhs)
2767{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002768 return RValue<UInt>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002769}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002770
Nicolas Capens157ba262019-12-10 17:49:14 -05002771RValue<UInt> operator+(RValue<UInt> lhs, RValue<UInt> rhs)
2772{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002773 return RValue<UInt>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002774}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002775
Nicolas Capens157ba262019-12-10 17:49:14 -05002776RValue<UInt> operator-(RValue<UInt> lhs, RValue<UInt> rhs)
2777{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002778 return RValue<UInt>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002779}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002780
Nicolas Capens157ba262019-12-10 17:49:14 -05002781RValue<UInt> operator*(RValue<UInt> lhs, RValue<UInt> rhs)
2782{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002783 return RValue<UInt>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002784}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002785
Nicolas Capens157ba262019-12-10 17:49:14 -05002786RValue<UInt> operator/(RValue<UInt> lhs, RValue<UInt> rhs)
2787{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002788 return RValue<UInt>(Nucleus::createUDiv(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002789}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002790
Nicolas Capens157ba262019-12-10 17:49:14 -05002791RValue<UInt> operator%(RValue<UInt> lhs, RValue<UInt> rhs)
2792{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002793 return RValue<UInt>(Nucleus::createURem(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002794}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002795
Nicolas Capens157ba262019-12-10 17:49:14 -05002796RValue<UInt> operator&(RValue<UInt> lhs, RValue<UInt> rhs)
2797{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002798 return RValue<UInt>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002799}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002800
Nicolas Capens157ba262019-12-10 17:49:14 -05002801RValue<UInt> operator|(RValue<UInt> lhs, RValue<UInt> rhs)
2802{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002803 return RValue<UInt>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002804}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002805
Nicolas Capens157ba262019-12-10 17:49:14 -05002806RValue<UInt> operator^(RValue<UInt> lhs, RValue<UInt> rhs)
2807{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002808 return RValue<UInt>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002809}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002810
Nicolas Capens157ba262019-12-10 17:49:14 -05002811RValue<UInt> operator<<(RValue<UInt> lhs, RValue<UInt> rhs)
2812{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002813 return RValue<UInt>(Nucleus::createShl(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002814}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002815
Nicolas Capens157ba262019-12-10 17:49:14 -05002816RValue<UInt> operator>>(RValue<UInt> lhs, RValue<UInt> rhs)
2817{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002818 return RValue<UInt>(Nucleus::createLShr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002819}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002820
Nicolas Capens157ba262019-12-10 17:49:14 -05002821RValue<UInt> operator+=(UInt &lhs, RValue<UInt> rhs)
2822{
2823 return lhs = lhs + rhs;
2824}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002825
Nicolas Capens157ba262019-12-10 17:49:14 -05002826RValue<UInt> operator-=(UInt &lhs, RValue<UInt> rhs)
2827{
2828 return lhs = lhs - rhs;
2829}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002830
Nicolas Capens157ba262019-12-10 17:49:14 -05002831RValue<UInt> operator*=(UInt &lhs, RValue<UInt> rhs)
2832{
2833 return lhs = lhs * rhs;
2834}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002835
Nicolas Capens157ba262019-12-10 17:49:14 -05002836RValue<UInt> operator/=(UInt &lhs, RValue<UInt> rhs)
2837{
2838 return lhs = lhs / rhs;
2839}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002840
Nicolas Capens157ba262019-12-10 17:49:14 -05002841RValue<UInt> operator%=(UInt &lhs, RValue<UInt> rhs)
2842{
2843 return lhs = lhs % rhs;
2844}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002845
Nicolas Capens157ba262019-12-10 17:49:14 -05002846RValue<UInt> operator&=(UInt &lhs, RValue<UInt> rhs)
2847{
2848 return lhs = lhs & rhs;
2849}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002850
Nicolas Capens157ba262019-12-10 17:49:14 -05002851RValue<UInt> operator|=(UInt &lhs, RValue<UInt> rhs)
2852{
2853 return lhs = lhs | rhs;
2854}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002855
Nicolas Capens157ba262019-12-10 17:49:14 -05002856RValue<UInt> operator^=(UInt &lhs, RValue<UInt> rhs)
2857{
2858 return lhs = lhs ^ rhs;
2859}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002860
Nicolas Capens157ba262019-12-10 17:49:14 -05002861RValue<UInt> operator<<=(UInt &lhs, RValue<UInt> rhs)
2862{
2863 return lhs = lhs << rhs;
2864}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002865
Nicolas Capens157ba262019-12-10 17:49:14 -05002866RValue<UInt> operator>>=(UInt &lhs, RValue<UInt> rhs)
2867{
2868 return lhs = lhs >> rhs;
2869}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002870
Nicolas Capens157ba262019-12-10 17:49:14 -05002871RValue<UInt> operator+(RValue<UInt> val)
2872{
2873 return val;
2874}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002875
Nicolas Capens157ba262019-12-10 17:49:14 -05002876RValue<UInt> operator-(RValue<UInt> val)
2877{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002878 return RValue<UInt>(Nucleus::createNeg(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002879}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002880
Nicolas Capens157ba262019-12-10 17:49:14 -05002881RValue<UInt> operator~(RValue<UInt> val)
2882{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002883 return RValue<UInt>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002884}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002885
Nicolas Capens157ba262019-12-10 17:49:14 -05002886RValue<UInt> Max(RValue<UInt> x, RValue<UInt> y)
2887{
2888 return IfThenElse(x > y, x, y);
2889}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002890
Nicolas Capens157ba262019-12-10 17:49:14 -05002891RValue<UInt> Min(RValue<UInt> x, RValue<UInt> y)
2892{
2893 return IfThenElse(x < y, x, y);
2894}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002895
Nicolas Capens157ba262019-12-10 17:49:14 -05002896RValue<UInt> Clamp(RValue<UInt> x, RValue<UInt> min, RValue<UInt> max)
2897{
2898 return Min(Max(x, min), max);
2899}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002900
Nicolas Capens157ba262019-12-10 17:49:14 -05002901RValue<Bool> operator<(RValue<UInt> lhs, RValue<UInt> rhs)
2902{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002903 return RValue<Bool>(Nucleus::createICmpULT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002904}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002905
Nicolas Capens157ba262019-12-10 17:49:14 -05002906RValue<Bool> operator<=(RValue<UInt> lhs, RValue<UInt> rhs)
2907{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002908 return RValue<Bool>(Nucleus::createICmpULE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002909}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002910
Nicolas Capens157ba262019-12-10 17:49:14 -05002911RValue<Bool> operator>(RValue<UInt> lhs, RValue<UInt> rhs)
2912{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002913 return RValue<Bool>(Nucleus::createICmpUGT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002914}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002915
Nicolas Capens157ba262019-12-10 17:49:14 -05002916RValue<Bool> operator>=(RValue<UInt> lhs, RValue<UInt> rhs)
2917{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002918 return RValue<Bool>(Nucleus::createICmpUGE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002919}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002920
Nicolas Capens157ba262019-12-10 17:49:14 -05002921RValue<Bool> operator!=(RValue<UInt> lhs, RValue<UInt> rhs)
2922{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002923 return RValue<Bool>(Nucleus::createICmpNE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002924}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002925
Nicolas Capens157ba262019-12-10 17:49:14 -05002926RValue<Bool> operator==(RValue<UInt> lhs, RValue<UInt> rhs)
2927{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002928 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002929}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002930
Nicolas Capens157ba262019-12-10 17:49:14 -05002931Int2::Int2(RValue<Int4> cast)
2932{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002933 storeValue(Nucleus::createBitCast(cast.value(), type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002934}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002935
Nicolas Capens157ba262019-12-10 17:49:14 -05002936Int2::Int2(int x, int y)
2937{
Ben Clayton713b8d32019-12-17 20:37:56 +00002938 int64_t constantVector[2] = { x, y };
Nicolas Capens519cf222020-05-08 15:27:19 -04002939 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002940}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002941
Nicolas Capens157ba262019-12-10 17:49:14 -05002942Int2::Int2(RValue<Int2> rhs)
2943{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002944 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002945}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002946
Nicolas Capens157ba262019-12-10 17:49:14 -05002947Int2::Int2(const Int2 &rhs)
2948{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002949 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002950}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002951
Nicolas Capens157ba262019-12-10 17:49:14 -05002952Int2::Int2(const Reference<Int2> &rhs)
2953{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002954 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002955}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002956
Nicolas Capens157ba262019-12-10 17:49:14 -05002957Int2::Int2(RValue<Int> lo, RValue<Int> hi)
2958{
Ben Clayton713b8d32019-12-17 20:37:56 +00002959 int shuffle[4] = { 0, 4, 1, 5 };
Nicolas Capens157ba262019-12-10 17:49:14 -05002960 Value *packed = Nucleus::createShuffleVector(Int4(lo).loadValue(), Int4(hi).loadValue(), shuffle);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002961
Nicolas Capens519cf222020-05-08 15:27:19 -04002962 storeValue(Nucleus::createBitCast(packed, Int2::type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002963}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002964
Nicolas Capens157ba262019-12-10 17:49:14 -05002965RValue<Int2> Int2::operator=(RValue<Int2> rhs)
2966{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002967 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002968}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002969
Nicolas Capens157ba262019-12-10 17:49:14 -05002970RValue<Int2> Int2::operator=(const Int2 &rhs)
2971{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002972 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002973}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002974
Nicolas Capens157ba262019-12-10 17:49:14 -05002975RValue<Int2> Int2::operator=(const Reference<Int2> &rhs)
2976{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002977 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002978}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002979
Nicolas Capens157ba262019-12-10 17:49:14 -05002980RValue<Int2> operator+(RValue<Int2> lhs, RValue<Int2> rhs)
2981{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002982 return RValue<Int2>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002983}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002984
Nicolas Capens157ba262019-12-10 17:49:14 -05002985RValue<Int2> operator-(RValue<Int2> lhs, RValue<Int2> rhs)
2986{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002987 return RValue<Int2>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002988}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002989
2990// RValue<Int2> operator*(RValue<Int2> lhs, RValue<Int2> rhs)
2991// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002992// return RValue<Int2>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002993// }
2994
2995// RValue<Int2> operator/(RValue<Int2> lhs, RValue<Int2> rhs)
2996// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002997// return RValue<Int2>(Nucleus::createSDiv(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002998// }
2999
3000// RValue<Int2> operator%(RValue<Int2> lhs, RValue<Int2> rhs)
3001// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003002// return RValue<Int2>(Nucleus::createSRem(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003003// }
3004
Nicolas Capens157ba262019-12-10 17:49:14 -05003005RValue<Int2> operator&(RValue<Int2> lhs, RValue<Int2> rhs)
3006{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003007 return RValue<Int2>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003008}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003009
Nicolas Capens157ba262019-12-10 17:49:14 -05003010RValue<Int2> operator|(RValue<Int2> lhs, RValue<Int2> rhs)
3011{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003012 return RValue<Int2>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003013}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003014
Nicolas Capens157ba262019-12-10 17:49:14 -05003015RValue<Int2> operator^(RValue<Int2> lhs, RValue<Int2> rhs)
3016{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003017 return RValue<Int2>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003018}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003019
Nicolas Capens157ba262019-12-10 17:49:14 -05003020RValue<Int2> operator+=(Int2 &lhs, RValue<Int2> rhs)
3021{
3022 return lhs = lhs + rhs;
3023}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003024
Nicolas Capens157ba262019-12-10 17:49:14 -05003025RValue<Int2> operator-=(Int2 &lhs, RValue<Int2> rhs)
3026{
3027 return lhs = lhs - rhs;
3028}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003029
3030// RValue<Int2> operator*=(Int2 &lhs, RValue<Int2> rhs)
3031// {
3032// return lhs = lhs * rhs;
3033// }
3034
3035// RValue<Int2> operator/=(Int2 &lhs, RValue<Int2> rhs)
3036// {
3037// return lhs = lhs / rhs;
3038// }
3039
3040// RValue<Int2> operator%=(Int2 &lhs, RValue<Int2> rhs)
3041// {
3042// return lhs = lhs % rhs;
3043// }
3044
Nicolas Capens157ba262019-12-10 17:49:14 -05003045RValue<Int2> operator&=(Int2 &lhs, RValue<Int2> rhs)
3046{
3047 return lhs = lhs & rhs;
3048}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003049
Nicolas Capens157ba262019-12-10 17:49:14 -05003050RValue<Int2> operator|=(Int2 &lhs, RValue<Int2> rhs)
3051{
3052 return lhs = lhs | rhs;
3053}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003054
Nicolas Capens157ba262019-12-10 17:49:14 -05003055RValue<Int2> operator^=(Int2 &lhs, RValue<Int2> rhs)
3056{
3057 return lhs = lhs ^ rhs;
3058}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003059
Nicolas Capens157ba262019-12-10 17:49:14 -05003060RValue<Int2> operator<<=(Int2 &lhs, unsigned char rhs)
3061{
3062 return lhs = lhs << rhs;
3063}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003064
Nicolas Capens157ba262019-12-10 17:49:14 -05003065RValue<Int2> operator>>=(Int2 &lhs, unsigned char rhs)
3066{
3067 return lhs = lhs >> rhs;
3068}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003069
3070// RValue<Int2> operator+(RValue<Int2> val)
3071// {
3072// return val;
3073// }
3074
3075// RValue<Int2> operator-(RValue<Int2> val)
3076// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003077// return RValue<Int2>(Nucleus::createNeg(val.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003078// }
3079
Nicolas Capens157ba262019-12-10 17:49:14 -05003080RValue<Int2> operator~(RValue<Int2> val)
3081{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003082 return RValue<Int2>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003083}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003084
Nicolas Capens157ba262019-12-10 17:49:14 -05003085RValue<Short4> UnpackLow(RValue<Int2> x, RValue<Int2> y)
3086{
Nicolas Capens133b87d2020-01-25 16:26:28 -05003087 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00003088 int shuffle[4] = { 0, 4, 1, 5 }; // Real type is v4i32
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003089 return As<Short4>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05003090}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003091
Nicolas Capens157ba262019-12-10 17:49:14 -05003092RValue<Short4> UnpackHigh(RValue<Int2> x, RValue<Int2> y)
3093{
Nicolas Capens133b87d2020-01-25 16:26:28 -05003094 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00003095 int shuffle[4] = { 0, 4, 1, 5 }; // Real type is v4i32
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003096 auto lowHigh = RValue<Int4>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05003097 return As<Short4>(Swizzle(lowHigh, 0x2323));
3098}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003099
Nicolas Capens157ba262019-12-10 17:49:14 -05003100RValue<Int> Extract(RValue<Int2> val, int i)
3101{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003102 return RValue<Int>(Nucleus::createExtractElement(val.value(), Int::type(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05003103}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003104
Nicolas Capens157ba262019-12-10 17:49:14 -05003105RValue<Int2> Insert(RValue<Int2> val, RValue<Int> element, int i)
3106{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003107 return RValue<Int2>(Nucleus::createInsertElement(val.value(), element.value(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05003108}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003109
Nicolas Capens157ba262019-12-10 17:49:14 -05003110UInt2::UInt2(unsigned int x, unsigned int y)
3111{
Ben Clayton713b8d32019-12-17 20:37:56 +00003112 int64_t constantVector[2] = { x, y };
Nicolas Capens519cf222020-05-08 15:27:19 -04003113 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003114}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003115
Nicolas Capens157ba262019-12-10 17:49:14 -05003116UInt2::UInt2(RValue<UInt2> rhs)
3117{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003118 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05003119}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003120
Nicolas Capens157ba262019-12-10 17:49:14 -05003121UInt2::UInt2(const UInt2 &rhs)
3122{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003123 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003124}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003125
Nicolas Capens157ba262019-12-10 17:49:14 -05003126UInt2::UInt2(const Reference<UInt2> &rhs)
3127{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003128 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003129}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003130
Nicolas Capens157ba262019-12-10 17:49:14 -05003131RValue<UInt2> UInt2::operator=(RValue<UInt2> rhs)
3132{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003133 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05003134}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003135
Nicolas Capens157ba262019-12-10 17:49:14 -05003136RValue<UInt2> UInt2::operator=(const UInt2 &rhs)
3137{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003138 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003139}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003140
Nicolas Capens157ba262019-12-10 17:49:14 -05003141RValue<UInt2> UInt2::operator=(const Reference<UInt2> &rhs)
3142{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003143 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003144}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003145
Nicolas Capens157ba262019-12-10 17:49:14 -05003146RValue<UInt2> operator+(RValue<UInt2> lhs, RValue<UInt2> rhs)
3147{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003148 return RValue<UInt2>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003149}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003150
Nicolas Capens157ba262019-12-10 17:49:14 -05003151RValue<UInt2> operator-(RValue<UInt2> lhs, RValue<UInt2> rhs)
3152{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003153 return RValue<UInt2>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003154}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003155
3156// RValue<UInt2> operator*(RValue<UInt2> lhs, RValue<UInt2> rhs)
3157// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003158// return RValue<UInt2>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003159// }
3160
3161// RValue<UInt2> operator/(RValue<UInt2> lhs, RValue<UInt2> rhs)
3162// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003163// return RValue<UInt2>(Nucleus::createUDiv(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003164// }
3165
3166// RValue<UInt2> operator%(RValue<UInt2> lhs, RValue<UInt2> rhs)
3167// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003168// return RValue<UInt2>(Nucleus::createURem(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003169// }
3170
Nicolas Capens157ba262019-12-10 17:49:14 -05003171RValue<UInt2> operator&(RValue<UInt2> lhs, RValue<UInt2> rhs)
3172{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003173 return RValue<UInt2>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003174}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003175
Nicolas Capens157ba262019-12-10 17:49:14 -05003176RValue<UInt2> operator|(RValue<UInt2> lhs, RValue<UInt2> rhs)
3177{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003178 return RValue<UInt2>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003179}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003180
Nicolas Capens157ba262019-12-10 17:49:14 -05003181RValue<UInt2> operator^(RValue<UInt2> lhs, RValue<UInt2> rhs)
3182{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003183 return RValue<UInt2>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003184}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003185
Nicolas Capens157ba262019-12-10 17:49:14 -05003186RValue<UInt2> operator+=(UInt2 &lhs, RValue<UInt2> rhs)
3187{
3188 return lhs = lhs + rhs;
3189}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003190
Nicolas Capens157ba262019-12-10 17:49:14 -05003191RValue<UInt2> operator-=(UInt2 &lhs, RValue<UInt2> rhs)
3192{
3193 return lhs = lhs - rhs;
3194}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003195
3196// RValue<UInt2> operator*=(UInt2 &lhs, RValue<UInt2> rhs)
3197// {
3198// return lhs = lhs * rhs;
3199// }
3200
3201// RValue<UInt2> operator/=(UInt2 &lhs, RValue<UInt2> rhs)
3202// {
3203// return lhs = lhs / rhs;
3204// }
3205
3206// RValue<UInt2> operator%=(UInt2 &lhs, RValue<UInt2> rhs)
3207// {
3208// return lhs = lhs % rhs;
3209// }
3210
Nicolas Capens157ba262019-12-10 17:49:14 -05003211RValue<UInt2> operator&=(UInt2 &lhs, RValue<UInt2> rhs)
3212{
3213 return lhs = lhs & rhs;
3214}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003215
Nicolas Capens157ba262019-12-10 17:49:14 -05003216RValue<UInt2> operator|=(UInt2 &lhs, RValue<UInt2> rhs)
3217{
3218 return lhs = lhs | rhs;
3219}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003220
Nicolas Capens157ba262019-12-10 17:49:14 -05003221RValue<UInt2> operator^=(UInt2 &lhs, RValue<UInt2> rhs)
3222{
3223 return lhs = lhs ^ rhs;
3224}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003225
Nicolas Capens157ba262019-12-10 17:49:14 -05003226RValue<UInt2> operator<<=(UInt2 &lhs, unsigned char rhs)
3227{
3228 return lhs = lhs << rhs;
3229}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003230
Nicolas Capens157ba262019-12-10 17:49:14 -05003231RValue<UInt2> operator>>=(UInt2 &lhs, unsigned char rhs)
3232{
3233 return lhs = lhs >> rhs;
3234}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003235
3236// RValue<UInt2> operator+(RValue<UInt2> val)
3237// {
3238// return val;
3239// }
3240
3241// RValue<UInt2> operator-(RValue<UInt2> val)
3242// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003243// return RValue<UInt2>(Nucleus::createNeg(val.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003244// }
3245
Nicolas Capens157ba262019-12-10 17:49:14 -05003246RValue<UInt2> operator~(RValue<UInt2> val)
3247{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003248 return RValue<UInt2>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003249}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003250
Nicolas Capens157ba262019-12-10 17:49:14 -05003251RValue<UInt> Extract(RValue<UInt2> val, int i)
3252{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003253 return RValue<UInt>(Nucleus::createExtractElement(val.value(), UInt::type(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05003254}
Ben Clayton8ab40532019-05-10 16:23:13 +01003255
Nicolas Capens157ba262019-12-10 17:49:14 -05003256RValue<UInt2> Insert(RValue<UInt2> val, RValue<UInt> element, int i)
3257{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003258 return RValue<UInt2>(Nucleus::createInsertElement(val.value(), element.value(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05003259}
Ben Clayton8ab40532019-05-10 16:23:13 +01003260
Ben Clayton713b8d32019-12-17 20:37:56 +00003261Int4::Int4()
3262 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003263{
3264}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003265
Ben Clayton713b8d32019-12-17 20:37:56 +00003266Int4::Int4(RValue<Float4> cast)
3267 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003268{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003269 Value *xyzw = Nucleus::createFPToSI(cast.value(), Int4::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003270
Nicolas Capens157ba262019-12-10 17:49:14 -05003271 storeValue(xyzw);
3272}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003273
Ben Clayton713b8d32019-12-17 20:37:56 +00003274Int4::Int4(int xyzw)
3275 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003276{
3277 constant(xyzw, xyzw, xyzw, xyzw);
3278}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003279
Ben Clayton713b8d32019-12-17 20:37:56 +00003280Int4::Int4(int x, int yzw)
3281 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003282{
3283 constant(x, yzw, yzw, yzw);
3284}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003285
Ben Clayton713b8d32019-12-17 20:37:56 +00003286Int4::Int4(int x, int y, int zw)
3287 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003288{
3289 constant(x, y, zw, zw);
3290}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003291
Ben Clayton713b8d32019-12-17 20:37:56 +00003292Int4::Int4(int x, int y, int z, int w)
3293 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003294{
3295 constant(x, y, z, w);
3296}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003297
Nicolas Capens157ba262019-12-10 17:49:14 -05003298void Int4::constant(int x, int y, int z, int w)
3299{
Ben Clayton713b8d32019-12-17 20:37:56 +00003300 int64_t constantVector[4] = { x, y, z, w };
Nicolas Capens519cf222020-05-08 15:27:19 -04003301 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003302}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003303
Ben Clayton713b8d32019-12-17 20:37:56 +00003304Int4::Int4(RValue<Int4> rhs)
3305 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003306{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003307 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05003308}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003309
Ben Clayton713b8d32019-12-17 20:37:56 +00003310Int4::Int4(const Int4 &rhs)
3311 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003312{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003313 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003314}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003315
Ben Clayton713b8d32019-12-17 20:37:56 +00003316Int4::Int4(const Reference<Int4> &rhs)
3317 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003318{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003319 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003320}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003321
Ben Clayton713b8d32019-12-17 20:37:56 +00003322Int4::Int4(RValue<UInt4> rhs)
3323 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003324{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003325 storeValue(rhs.value());
Nicolas Capens157ba262019-12-10 17:49:14 -05003326}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003327
Ben Clayton713b8d32019-12-17 20:37:56 +00003328Int4::Int4(const UInt4 &rhs)
3329 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003330{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003331 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05003332}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003333
Ben Clayton713b8d32019-12-17 20:37:56 +00003334Int4::Int4(const Reference<UInt4> &rhs)
3335 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003336{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003337 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05003338}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003339
Ben Clayton713b8d32019-12-17 20:37:56 +00003340Int4::Int4(RValue<Int2> lo, RValue<Int2> hi)
3341 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003342{
Ben Clayton713b8d32019-12-17 20:37:56 +00003343 int shuffle[4] = { 0, 1, 4, 5 }; // Real type is v4i32
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003344 Value *packed = Nucleus::createShuffleVector(lo.value(), hi.value(), shuffle);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003345
Nicolas Capens157ba262019-12-10 17:49:14 -05003346 storeValue(packed);
3347}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003348
Ben Clayton713b8d32019-12-17 20:37:56 +00003349Int4::Int4(const Int &rhs)
3350 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003351{
3352 *this = RValue<Int>(rhs.loadValue());
3353}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003354
Ben Clayton713b8d32019-12-17 20:37:56 +00003355Int4::Int4(const Reference<Int> &rhs)
3356 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003357{
3358 *this = RValue<Int>(rhs.loadValue());
3359}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003360
Nicolas Capens82d425d2022-03-02 16:35:20 -05003361RValue<Int4> Int4::operator=(int x)
3362{
3363 return *this = Int4(x, x, x, x);
3364}
3365
Nicolas Capens157ba262019-12-10 17:49:14 -05003366RValue<Int4> Int4::operator=(RValue<Int4> rhs)
3367{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003368 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05003369}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003370
Nicolas Capens157ba262019-12-10 17:49:14 -05003371RValue<Int4> Int4::operator=(const Int4 &rhs)
3372{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003373 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003374}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003375
Nicolas Capens157ba262019-12-10 17:49:14 -05003376RValue<Int4> Int4::operator=(const Reference<Int4> &rhs)
3377{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003378 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003379}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003380
Nicolas Capens157ba262019-12-10 17:49:14 -05003381RValue<Int4> operator+(RValue<Int4> lhs, RValue<Int4> rhs)
3382{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003383 return RValue<Int4>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003384}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003385
Nicolas Capens157ba262019-12-10 17:49:14 -05003386RValue<Int4> operator-(RValue<Int4> lhs, RValue<Int4> rhs)
3387{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003388 return RValue<Int4>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003389}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003390
Nicolas Capens157ba262019-12-10 17:49:14 -05003391RValue<Int4> operator*(RValue<Int4> lhs, RValue<Int4> rhs)
3392{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003393 return RValue<Int4>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003394}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003395
Nicolas Capens157ba262019-12-10 17:49:14 -05003396RValue<Int4> operator/(RValue<Int4> lhs, RValue<Int4> rhs)
3397{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003398 return RValue<Int4>(Nucleus::createSDiv(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003399}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003400
Nicolas Capens157ba262019-12-10 17:49:14 -05003401RValue<Int4> operator%(RValue<Int4> lhs, RValue<Int4> rhs)
3402{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003403 return RValue<Int4>(Nucleus::createSRem(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003404}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003405
Nicolas Capens157ba262019-12-10 17:49:14 -05003406RValue<Int4> operator&(RValue<Int4> lhs, RValue<Int4> rhs)
3407{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003408 return RValue<Int4>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003409}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003410
Nicolas Capens157ba262019-12-10 17:49:14 -05003411RValue<Int4> operator|(RValue<Int4> lhs, RValue<Int4> rhs)
3412{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003413 return RValue<Int4>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003414}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003415
Nicolas Capens157ba262019-12-10 17:49:14 -05003416RValue<Int4> operator^(RValue<Int4> lhs, RValue<Int4> rhs)
3417{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003418 return RValue<Int4>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003419}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003420
Nicolas Capens157ba262019-12-10 17:49:14 -05003421RValue<Int4> operator<<(RValue<Int4> lhs, RValue<Int4> rhs)
3422{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003423 return RValue<Int4>(Nucleus::createShl(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003424}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003425
Nicolas Capens157ba262019-12-10 17:49:14 -05003426RValue<Int4> operator>>(RValue<Int4> lhs, RValue<Int4> rhs)
3427{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003428 return RValue<Int4>(Nucleus::createAShr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003429}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003430
Nicolas Capens157ba262019-12-10 17:49:14 -05003431RValue<Int4> operator+=(Int4 &lhs, RValue<Int4> rhs)
3432{
3433 return lhs = lhs + rhs;
3434}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003435
Nicolas Capens157ba262019-12-10 17:49:14 -05003436RValue<Int4> operator-=(Int4 &lhs, RValue<Int4> rhs)
3437{
3438 return lhs = lhs - rhs;
3439}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003440
Nicolas Capens157ba262019-12-10 17:49:14 -05003441RValue<Int4> operator*=(Int4 &lhs, RValue<Int4> rhs)
3442{
3443 return lhs = lhs * rhs;
3444}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003445
3446// RValue<Int4> operator/=(Int4 &lhs, RValue<Int4> rhs)
3447// {
3448// return lhs = lhs / rhs;
3449// }
3450
3451// RValue<Int4> operator%=(Int4 &lhs, RValue<Int4> rhs)
3452// {
3453// return lhs = lhs % rhs;
3454// }
3455
Nicolas Capens157ba262019-12-10 17:49:14 -05003456RValue<Int4> operator&=(Int4 &lhs, RValue<Int4> rhs)
3457{
3458 return lhs = lhs & rhs;
3459}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003460
Nicolas Capens157ba262019-12-10 17:49:14 -05003461RValue<Int4> operator|=(Int4 &lhs, RValue<Int4> rhs)
3462{
3463 return lhs = lhs | rhs;
3464}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003465
Nicolas Capens157ba262019-12-10 17:49:14 -05003466RValue<Int4> operator^=(Int4 &lhs, RValue<Int4> rhs)
3467{
3468 return lhs = lhs ^ rhs;
3469}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003470
Nicolas Capens157ba262019-12-10 17:49:14 -05003471RValue<Int4> operator<<=(Int4 &lhs, unsigned char rhs)
3472{
3473 return lhs = lhs << rhs;
3474}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003475
Nicolas Capens157ba262019-12-10 17:49:14 -05003476RValue<Int4> operator>>=(Int4 &lhs, unsigned char rhs)
3477{
3478 return lhs = lhs >> rhs;
3479}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003480
Nicolas Capens157ba262019-12-10 17:49:14 -05003481RValue<Int4> operator+(RValue<Int4> val)
3482{
3483 return val;
3484}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003485
Nicolas Capens157ba262019-12-10 17:49:14 -05003486RValue<Int4> operator-(RValue<Int4> val)
3487{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003488 return RValue<Int4>(Nucleus::createNeg(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003489}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003490
Nicolas Capens157ba262019-12-10 17:49:14 -05003491RValue<Int4> operator~(RValue<Int4> val)
3492{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003493 return RValue<Int4>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003494}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003495
Nicolas Capens157ba262019-12-10 17:49:14 -05003496RValue<Int> Extract(RValue<Int4> x, int i)
3497{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003498 return RValue<Int>(Nucleus::createExtractElement(x.value(), Int::type(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05003499}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003500
Nicolas Capens157ba262019-12-10 17:49:14 -05003501RValue<Int4> Insert(RValue<Int4> x, RValue<Int> element, int i)
3502{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003503 return RValue<Int4>(Nucleus::createInsertElement(x.value(), element.value(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05003504}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003505
Nicolas Capens157ba262019-12-10 17:49:14 -05003506RValue<Int4> Swizzle(RValue<Int4> x, uint16_t select)
3507{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003508 return RValue<Int4>(createSwizzle4(x.value(), select));
Nicolas Capens157ba262019-12-10 17:49:14 -05003509}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003510
Nicolas Capens157ba262019-12-10 17:49:14 -05003511RValue<Int4> Shuffle(RValue<Int4> x, RValue<Int4> y, unsigned short select)
3512{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003513 return RValue<Int4>(createShuffle4(x.value(), y.value(), select));
Nicolas Capens157ba262019-12-10 17:49:14 -05003514}
David 'Digit' Turnerb9f03f42019-12-04 19:32:34 +01003515
Ben Clayton713b8d32019-12-17 20:37:56 +00003516UInt4::UInt4()
3517 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003518{
3519}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003520
Ben Clayton713b8d32019-12-17 20:37:56 +00003521UInt4::UInt4(int xyzw)
3522 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003523{
3524 constant(xyzw, xyzw, xyzw, xyzw);
3525}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003526
Ben Clayton713b8d32019-12-17 20:37:56 +00003527UInt4::UInt4(int x, int yzw)
3528 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003529{
3530 constant(x, yzw, yzw, yzw);
3531}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003532
Ben Clayton713b8d32019-12-17 20:37:56 +00003533UInt4::UInt4(int x, int y, int zw)
3534 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003535{
3536 constant(x, y, zw, zw);
3537}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003538
Ben Clayton713b8d32019-12-17 20:37:56 +00003539UInt4::UInt4(int x, int y, int z, int w)
3540 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003541{
3542 constant(x, y, z, w);
3543}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003544
Nicolas Capens157ba262019-12-10 17:49:14 -05003545void UInt4::constant(int x, int y, int z, int w)
3546{
Ben Clayton713b8d32019-12-17 20:37:56 +00003547 int64_t constantVector[4] = { x, y, z, w };
Nicolas Capens519cf222020-05-08 15:27:19 -04003548 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003549}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003550
Ben Clayton713b8d32019-12-17 20:37:56 +00003551UInt4::UInt4(RValue<UInt4> rhs)
3552 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003553{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003554 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05003555}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003556
Ben Clayton713b8d32019-12-17 20:37:56 +00003557UInt4::UInt4(const UInt4 &rhs)
3558 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003559{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003560 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003561}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003562
Ben Clayton713b8d32019-12-17 20:37:56 +00003563UInt4::UInt4(const Reference<UInt4> &rhs)
3564 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003565{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003566 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003567}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003568
Ben Clayton713b8d32019-12-17 20:37:56 +00003569UInt4::UInt4(RValue<Int4> rhs)
3570 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003571{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003572 storeValue(rhs.value());
Nicolas Capens157ba262019-12-10 17:49:14 -05003573}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003574
Ben Clayton713b8d32019-12-17 20:37:56 +00003575UInt4::UInt4(const Int4 &rhs)
3576 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003577{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003578 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05003579}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003580
Ben Clayton713b8d32019-12-17 20:37:56 +00003581UInt4::UInt4(const Reference<Int4> &rhs)
3582 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003583{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003584 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05003585}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003586
Ben Clayton713b8d32019-12-17 20:37:56 +00003587UInt4::UInt4(RValue<UInt2> lo, RValue<UInt2> hi)
3588 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003589{
Ben Clayton713b8d32019-12-17 20:37:56 +00003590 int shuffle[4] = { 0, 1, 4, 5 }; // Real type is v4i32
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003591 Value *packed = Nucleus::createShuffleVector(lo.value(), hi.value(), shuffle);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003592
Nicolas Capens157ba262019-12-10 17:49:14 -05003593 storeValue(packed);
3594}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003595
Ben Clayton713b8d32019-12-17 20:37:56 +00003596UInt4::UInt4(const UInt &rhs)
3597 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003598{
3599 *this = RValue<UInt>(rhs.loadValue());
3600}
Ben Clayton88816fa2019-05-15 17:08:14 +01003601
Ben Clayton713b8d32019-12-17 20:37:56 +00003602UInt4::UInt4(const Reference<UInt> &rhs)
3603 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003604{
3605 *this = RValue<UInt>(rhs.loadValue());
3606}
Ben Clayton88816fa2019-05-15 17:08:14 +01003607
Nicolas Capens157ba262019-12-10 17:49:14 -05003608RValue<UInt4> UInt4::operator=(RValue<UInt4> rhs)
3609{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003610 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05003611}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003612
Nicolas Capens157ba262019-12-10 17:49:14 -05003613RValue<UInt4> UInt4::operator=(const UInt4 &rhs)
3614{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003615 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003616}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003617
Nicolas Capens157ba262019-12-10 17:49:14 -05003618RValue<UInt4> UInt4::operator=(const Reference<UInt4> &rhs)
3619{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003620 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003621}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003622
Nicolas Capens157ba262019-12-10 17:49:14 -05003623RValue<UInt4> operator+(RValue<UInt4> lhs, RValue<UInt4> rhs)
3624{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003625 return RValue<UInt4>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003626}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003627
Nicolas Capens157ba262019-12-10 17:49:14 -05003628RValue<UInt4> operator-(RValue<UInt4> lhs, RValue<UInt4> rhs)
3629{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003630 return RValue<UInt4>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003631}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003632
Nicolas Capens157ba262019-12-10 17:49:14 -05003633RValue<UInt4> operator*(RValue<UInt4> lhs, RValue<UInt4> rhs)
3634{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003635 return RValue<UInt4>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003636}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003637
Nicolas Capens157ba262019-12-10 17:49:14 -05003638RValue<UInt4> operator/(RValue<UInt4> lhs, RValue<UInt4> rhs)
3639{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003640 return RValue<UInt4>(Nucleus::createUDiv(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003641}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003642
Nicolas Capens157ba262019-12-10 17:49:14 -05003643RValue<UInt4> operator%(RValue<UInt4> lhs, RValue<UInt4> rhs)
3644{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003645 return RValue<UInt4>(Nucleus::createURem(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003646}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003647
Nicolas Capens157ba262019-12-10 17:49:14 -05003648RValue<UInt4> operator&(RValue<UInt4> lhs, RValue<UInt4> rhs)
3649{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003650 return RValue<UInt4>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003651}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003652
Nicolas Capens157ba262019-12-10 17:49:14 -05003653RValue<UInt4> operator|(RValue<UInt4> lhs, RValue<UInt4> rhs)
3654{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003655 return RValue<UInt4>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003656}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003657
Nicolas Capens157ba262019-12-10 17:49:14 -05003658RValue<UInt4> operator^(RValue<UInt4> lhs, RValue<UInt4> rhs)
3659{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003660 return RValue<UInt4>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003661}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003662
Nicolas Capens157ba262019-12-10 17:49:14 -05003663RValue<UInt4> operator<<(RValue<UInt4> lhs, RValue<UInt4> rhs)
3664{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003665 return RValue<UInt4>(Nucleus::createShl(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003666}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003667
Nicolas Capens157ba262019-12-10 17:49:14 -05003668RValue<UInt4> operator>>(RValue<UInt4> lhs, RValue<UInt4> rhs)
3669{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003670 return RValue<UInt4>(Nucleus::createLShr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003671}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003672
Nicolas Capens157ba262019-12-10 17:49:14 -05003673RValue<UInt4> operator+=(UInt4 &lhs, RValue<UInt4> rhs)
3674{
3675 return lhs = lhs + rhs;
3676}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003677
Nicolas Capens157ba262019-12-10 17:49:14 -05003678RValue<UInt4> operator-=(UInt4 &lhs, RValue<UInt4> rhs)
3679{
3680 return lhs = lhs - rhs;
3681}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003682
Nicolas Capens157ba262019-12-10 17:49:14 -05003683RValue<UInt4> operator*=(UInt4 &lhs, RValue<UInt4> rhs)
3684{
3685 return lhs = lhs * rhs;
3686}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003687
3688// RValue<UInt4> operator/=(UInt4 &lhs, RValue<UInt4> rhs)
3689// {
3690// return lhs = lhs / rhs;
3691// }
3692
3693// RValue<UInt4> operator%=(UInt4 &lhs, RValue<UInt4> rhs)
3694// {
3695// return lhs = lhs % rhs;
3696// }
3697
Nicolas Capens157ba262019-12-10 17:49:14 -05003698RValue<UInt4> operator&=(UInt4 &lhs, RValue<UInt4> rhs)
3699{
3700 return lhs = lhs & rhs;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003701}
Nicolas Capens157ba262019-12-10 17:49:14 -05003702
3703RValue<UInt4> operator|=(UInt4 &lhs, RValue<UInt4> rhs)
3704{
3705 return lhs = lhs | rhs;
3706}
3707
3708RValue<UInt4> operator^=(UInt4 &lhs, RValue<UInt4> rhs)
3709{
3710 return lhs = lhs ^ rhs;
3711}
3712
3713RValue<UInt4> operator<<=(UInt4 &lhs, unsigned char rhs)
3714{
3715 return lhs = lhs << rhs;
3716}
3717
3718RValue<UInt4> operator>>=(UInt4 &lhs, unsigned char rhs)
3719{
3720 return lhs = lhs >> rhs;
3721}
3722
3723RValue<UInt4> operator+(RValue<UInt4> val)
3724{
3725 return val;
3726}
3727
3728RValue<UInt4> operator-(RValue<UInt4> val)
3729{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003730 return RValue<UInt4>(Nucleus::createNeg(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003731}
3732
3733RValue<UInt4> operator~(RValue<UInt4> val)
3734{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003735 return RValue<UInt4>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003736}
3737
3738RValue<UInt> Extract(RValue<UInt4> x, int i)
3739{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003740 return RValue<UInt>(Nucleus::createExtractElement(x.value(), Int::type(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05003741}
3742
3743RValue<UInt4> Insert(RValue<UInt4> x, RValue<UInt> element, int i)
3744{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003745 return RValue<UInt4>(Nucleus::createInsertElement(x.value(), element.value(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05003746}
3747
3748RValue<UInt4> Swizzle(RValue<UInt4> x, uint16_t select)
3749{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003750 return RValue<UInt4>(createSwizzle4(x.value(), select));
Nicolas Capens157ba262019-12-10 17:49:14 -05003751}
3752
3753RValue<UInt4> Shuffle(RValue<UInt4> x, RValue<UInt4> y, unsigned short select)
3754{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003755 return RValue<UInt4>(createShuffle4(x.value(), y.value(), select));
Nicolas Capens157ba262019-12-10 17:49:14 -05003756}
3757
3758Half::Half(RValue<Float> cast)
3759{
3760 UInt fp32i = As<UInt>(cast);
3761 UInt abs = fp32i & 0x7FFFFFFF;
Ben Clayton713b8d32019-12-17 20:37:56 +00003762 UShort fp16i((fp32i & 0x80000000) >> 16); // sign
Nicolas Capens157ba262019-12-10 17:49:14 -05003763
Ben Clayton713b8d32019-12-17 20:37:56 +00003764 If(abs > 0x47FFEFFF) // Infinity
Nicolas Capens157ba262019-12-10 17:49:14 -05003765 {
3766 fp16i |= UShort(0x7FFF);
3767 }
3768 Else
3769 {
Ben Clayton713b8d32019-12-17 20:37:56 +00003770 If(abs < 0x38800000) // Denormal
Nicolas Capens157ba262019-12-10 17:49:14 -05003771 {
3772 Int mantissa = (abs & 0x007FFFFF) | 0x00800000;
3773 Int e = 113 - (abs >> 23);
Nicolas Capens60f8c2e2019-12-12 13:40:15 -05003774 abs = IfThenElse(e < 24, (mantissa >> e), Int(0));
Nicolas Capens157ba262019-12-10 17:49:14 -05003775 fp16i |= UShort((abs + 0x00000FFF + ((abs >> 13) & 1)) >> 13);
3776 }
3777 Else
3778 {
3779 fp16i |= UShort((abs + 0xC8000000 + 0x00000FFF + ((abs >> 13) & 1)) >> 13);
3780 }
3781 }
3782
3783 storeValue(fp16i.loadValue());
3784}
3785
3786Float::Float(RValue<Int> cast)
3787{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003788 Value *integer = Nucleus::createSIToFP(cast.value(), Float::type());
Nicolas Capens157ba262019-12-10 17:49:14 -05003789
3790 storeValue(integer);
3791}
3792
3793Float::Float(RValue<UInt> cast)
3794{
3795 RValue<Float> result = Float(Int(cast & UInt(0x7FFFFFFF))) +
3796 As<Float>((As<Int>(cast) >> 31) & As<Int>(Float(0x80000000u)));
3797
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003798 storeValue(result.value());
Nicolas Capens157ba262019-12-10 17:49:14 -05003799}
3800
3801Float::Float(RValue<Half> cast)
3802{
3803 Int fp16i(As<UShort>(cast));
3804
3805 Int s = (fp16i >> 15) & 0x00000001;
3806 Int e = (fp16i >> 10) & 0x0000001F;
3807 Int m = fp16i & 0x000003FF;
3808
3809 UInt fp32i(s << 31);
3810 If(e == 0)
3811 {
3812 If(m != 0)
3813 {
3814 While((m & 0x00000400) == 0)
3815 {
3816 m <<= 1;
3817 e -= 1;
3818 }
3819
3820 fp32i |= As<UInt>(((e + (127 - 15) + 1) << 23) | ((m & ~0x00000400) << 13));
3821 }
3822 }
3823 Else
3824 {
3825 fp32i |= As<UInt>(((e + (127 - 15)) << 23) | (m << 13));
3826 }
3827
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003828 storeValue(As<Float>(fp32i).value());
Nicolas Capens157ba262019-12-10 17:49:14 -05003829}
3830
3831Float::Float(float x)
3832{
3833 // C++ does not have a way to write an infinite or NaN literal,
3834 // nor does it allow division by zero as a constant expression.
3835 // Thus we should not accept inf or NaN as a Reactor Float constant,
3836 // as this would typically idicate a bug, and avoids undefined
3837 // behavior.
3838 //
3839 // This also prevents the issue of the LLVM JIT only taking double
3840 // values for constructing floating-point constants. During the
3841 // conversion from single-precision to double, a signaling NaN can
3842 // become a quiet NaN, thus altering its bit pattern. Hence this
3843 // assert is also helpful for detecting cases where integers are
3844 // being reinterpreted as float and then bitcast to integer again,
3845 // which does not guarantee preserving the integer value.
3846 //
Nicolas Capense5720882020-01-13 14:10:04 -05003847 // The inifinity() method can be used to obtain positive infinity.
3848 // Should NaN constants be required, methods like quiet_NaN() and
3849 // signaling_NaN() should be added (matching std::numeric_limits).
Nicolas Capens157ba262019-12-10 17:49:14 -05003850 ASSERT(std::isfinite(x));
3851
3852 storeValue(Nucleus::createConstantFloat(x));
3853}
3854
Nicolas Capense5720882020-01-13 14:10:04 -05003855// TODO(b/140302841): Negative infinity can be obtained by using '-infinity()'.
3856// This comes at a minor run-time JIT cost, and the backend may or may not
3857// perform constant folding. This can be optimized by having Reactor perform
3858// the folding, which would still be cheaper than having a capable backend do it.
3859Float Float::infinity()
3860{
3861 Float result;
3862
3863 constexpr double inf = std::numeric_limits<double>::infinity();
3864 result.storeValue(Nucleus::createConstantFloat(inf));
3865
3866 return result;
3867}
3868
Nicolas Capens157ba262019-12-10 17:49:14 -05003869Float::Float(RValue<Float> rhs)
3870{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003871 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05003872}
3873
3874Float::Float(const Float &rhs)
3875{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003876 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003877}
3878
3879Float::Float(const Reference<Float> &rhs)
3880{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003881 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003882}
3883
3884Float::Float(Argument<Float> argument)
3885{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003886 store(argument.rvalue());
Nicolas Capens157ba262019-12-10 17:49:14 -05003887}
3888
Nicolas Capens0aca3ca2020-09-19 23:59:08 -04003889RValue<Float> Float::operator=(float rhs)
3890{
3891 return RValue<Float>(storeValue(Nucleus::createConstantFloat(rhs)));
3892}
3893
Nicolas Capens157ba262019-12-10 17:49:14 -05003894RValue<Float> Float::operator=(RValue<Float> rhs)
3895{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003896 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05003897}
3898
3899RValue<Float> Float::operator=(const Float &rhs)
3900{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003901 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003902}
3903
3904RValue<Float> Float::operator=(const Reference<Float> &rhs)
3905{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003906 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003907}
3908
3909RValue<Float> operator+(RValue<Float> lhs, RValue<Float> rhs)
3910{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003911 return RValue<Float>(Nucleus::createFAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003912}
3913
3914RValue<Float> operator-(RValue<Float> lhs, RValue<Float> rhs)
3915{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003916 return RValue<Float>(Nucleus::createFSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003917}
3918
3919RValue<Float> operator*(RValue<Float> lhs, RValue<Float> rhs)
3920{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003921 return RValue<Float>(Nucleus::createFMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003922}
3923
3924RValue<Float> operator/(RValue<Float> lhs, RValue<Float> rhs)
3925{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003926 return RValue<Float>(Nucleus::createFDiv(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003927}
3928
3929RValue<Float> operator+=(Float &lhs, RValue<Float> rhs)
3930{
3931 return lhs = lhs + rhs;
3932}
3933
3934RValue<Float> operator-=(Float &lhs, RValue<Float> rhs)
3935{
3936 return lhs = lhs - rhs;
3937}
3938
3939RValue<Float> operator*=(Float &lhs, RValue<Float> rhs)
3940{
3941 return lhs = lhs * rhs;
3942}
3943
3944RValue<Float> operator/=(Float &lhs, RValue<Float> rhs)
3945{
3946 return lhs = lhs / rhs;
3947}
3948
3949RValue<Float> operator+(RValue<Float> val)
3950{
3951 return val;
3952}
3953
3954RValue<Float> operator-(RValue<Float> val)
3955{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003956 return RValue<Float>(Nucleus::createFNeg(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003957}
3958
3959RValue<Bool> operator<(RValue<Float> lhs, RValue<Float> rhs)
3960{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003961 return RValue<Bool>(Nucleus::createFCmpOLT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003962}
3963
3964RValue<Bool> operator<=(RValue<Float> lhs, RValue<Float> rhs)
3965{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003966 return RValue<Bool>(Nucleus::createFCmpOLE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003967}
3968
3969RValue<Bool> operator>(RValue<Float> lhs, RValue<Float> rhs)
3970{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003971 return RValue<Bool>(Nucleus::createFCmpOGT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003972}
3973
3974RValue<Bool> operator>=(RValue<Float> lhs, RValue<Float> rhs)
3975{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003976 return RValue<Bool>(Nucleus::createFCmpOGE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003977}
3978
3979RValue<Bool> operator!=(RValue<Float> lhs, RValue<Float> rhs)
3980{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003981 return RValue<Bool>(Nucleus::createFCmpONE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003982}
3983
3984RValue<Bool> operator==(RValue<Float> lhs, RValue<Float> rhs)
3985{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003986 return RValue<Bool>(Nucleus::createFCmpOEQ(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003987}
3988
3989RValue<Float> Abs(RValue<Float> x)
3990{
3991 return IfThenElse(x > 0.0f, x, -x);
3992}
3993
3994RValue<Float> Max(RValue<Float> x, RValue<Float> y)
3995{
3996 return IfThenElse(x > y, x, y);
3997}
3998
3999RValue<Float> Min(RValue<Float> x, RValue<Float> y)
4000{
4001 return IfThenElse(x < y, x, y);
4002}
4003
4004Float2::Float2(RValue<Float4> cast)
4005{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004006 storeValue(Nucleus::createBitCast(cast.value(), type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05004007}
4008
Ben Clayton713b8d32019-12-17 20:37:56 +00004009Float4::Float4(RValue<Byte4> cast)
4010 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004011{
4012 Value *a = Int4(cast).loadValue();
Nicolas Capens519cf222020-05-08 15:27:19 -04004013 Value *xyzw = Nucleus::createSIToFP(a, Float4::type());
Nicolas Capens157ba262019-12-10 17:49:14 -05004014
4015 storeValue(xyzw);
4016}
4017
Ben Clayton713b8d32019-12-17 20:37:56 +00004018Float4::Float4(RValue<SByte4> cast)
4019 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004020{
4021 Value *a = Int4(cast).loadValue();
Nicolas Capens519cf222020-05-08 15:27:19 -04004022 Value *xyzw = Nucleus::createSIToFP(a, Float4::type());
Nicolas Capens157ba262019-12-10 17:49:14 -05004023
4024 storeValue(xyzw);
4025}
4026
Ben Clayton713b8d32019-12-17 20:37:56 +00004027Float4::Float4(RValue<Short4> cast)
4028 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004029{
4030 Int4 c(cast);
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004031 storeValue(Nucleus::createSIToFP(RValue<Int4>(c).value(), Float4::type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05004032}
4033
Ben Clayton713b8d32019-12-17 20:37:56 +00004034Float4::Float4(RValue<UShort4> cast)
4035 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004036{
4037 Int4 c(cast);
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004038 storeValue(Nucleus::createSIToFP(RValue<Int4>(c).value(), Float4::type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05004039}
4040
Ben Clayton713b8d32019-12-17 20:37:56 +00004041Float4::Float4(RValue<Int4> cast)
4042 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004043{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004044 Value *xyzw = Nucleus::createSIToFP(cast.value(), Float4::type());
Nicolas Capens157ba262019-12-10 17:49:14 -05004045
4046 storeValue(xyzw);
4047}
4048
Ben Clayton713b8d32019-12-17 20:37:56 +00004049Float4::Float4(RValue<UInt4> cast)
4050 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004051{
4052 RValue<Float4> result = Float4(Int4(cast & UInt4(0x7FFFFFFF))) +
4053 As<Float4>((As<Int4>(cast) >> 31) & As<Int4>(Float4(0x80000000u)));
4054
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004055 storeValue(result.value());
Nicolas Capens157ba262019-12-10 17:49:14 -05004056}
4057
Ben Clayton713b8d32019-12-17 20:37:56 +00004058Float4::Float4()
4059 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004060{
4061}
4062
Ben Clayton713b8d32019-12-17 20:37:56 +00004063Float4::Float4(float xyzw)
4064 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004065{
4066 constant(xyzw, xyzw, xyzw, xyzw);
4067}
4068
Ben Clayton713b8d32019-12-17 20:37:56 +00004069Float4::Float4(float x, float yzw)
4070 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004071{
4072 constant(x, yzw, yzw, yzw);
4073}
4074
Ben Clayton713b8d32019-12-17 20:37:56 +00004075Float4::Float4(float x, float y, float zw)
4076 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004077{
4078 constant(x, y, zw, zw);
4079}
4080
Ben Clayton713b8d32019-12-17 20:37:56 +00004081Float4::Float4(float x, float y, float z, float w)
4082 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004083{
4084 constant(x, y, z, w);
4085}
4086
Nicolas Capense5720882020-01-13 14:10:04 -05004087Float4 Float4::infinity()
Nicolas Capens157ba262019-12-10 17:49:14 -05004088{
4089 Float4 result;
Nicolas Capens157ba262019-12-10 17:49:14 -05004090
Nicolas Capense5720882020-01-13 14:10:04 -05004091 constexpr double inf = std::numeric_limits<double>::infinity();
Ben Clayton713b8d32019-12-17 20:37:56 +00004092 double constantVector[4] = { inf, inf, inf, inf };
Nicolas Capens519cf222020-05-08 15:27:19 -04004093 result.storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capense5720882020-01-13 14:10:04 -05004094
4095 return result;
Nicolas Capens157ba262019-12-10 17:49:14 -05004096}
4097
4098void Float4::constant(float x, float y, float z, float w)
4099{
4100 // See Float(float) constructor for the rationale behind this assert.
4101 ASSERT(std::isfinite(x) && std::isfinite(y) && std::isfinite(z) && std::isfinite(w));
4102
Ben Clayton713b8d32019-12-17 20:37:56 +00004103 double constantVector[4] = { x, y, z, w };
Nicolas Capens519cf222020-05-08 15:27:19 -04004104 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05004105}
4106
Ben Clayton713b8d32019-12-17 20:37:56 +00004107Float4::Float4(RValue<Float4> rhs)
4108 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004109{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04004110 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05004111}
4112
Ben Clayton713b8d32019-12-17 20:37:56 +00004113Float4::Float4(const Float4 &rhs)
4114 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004115{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04004116 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05004117}
4118
Ben Clayton713b8d32019-12-17 20:37:56 +00004119Float4::Float4(const Reference<Float4> &rhs)
4120 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004121{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04004122 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05004123}
4124
Ben Clayton713b8d32019-12-17 20:37:56 +00004125Float4::Float4(const Float &rhs)
4126 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004127{
4128 *this = RValue<Float>(rhs.loadValue());
4129}
4130
Ben Clayton713b8d32019-12-17 20:37:56 +00004131Float4::Float4(const Reference<Float> &rhs)
4132 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004133{
4134 *this = RValue<Float>(rhs.loadValue());
4135}
4136
Nicolas Capens419b7d72020-10-02 16:15:34 -04004137Float4::Float4(RValue<Float2> lo, RValue<Float2> hi)
4138 : XYZW(this)
4139{
4140 int shuffle[4] = { 0, 1, 4, 5 }; // Real type is v4i32
4141 Value *packed = Nucleus::createShuffleVector(lo.value(), hi.value(), shuffle);
4142
4143 storeValue(packed);
4144}
4145
Nicolas Capens157ba262019-12-10 17:49:14 -05004146RValue<Float4> Float4::operator=(float x)
4147{
4148 return *this = Float4(x, x, x, x);
4149}
4150
4151RValue<Float4> Float4::operator=(RValue<Float4> rhs)
4152{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04004153 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05004154}
4155
4156RValue<Float4> Float4::operator=(const Float4 &rhs)
4157{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04004158 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05004159}
4160
4161RValue<Float4> Float4::operator=(const Reference<Float4> &rhs)
4162{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04004163 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05004164}
4165
4166RValue<Float4> Float4::operator=(RValue<Float> rhs)
4167{
4168 return *this = Float4(rhs);
4169}
4170
4171RValue<Float4> Float4::operator=(const Float &rhs)
4172{
4173 return *this = Float4(rhs);
4174}
4175
4176RValue<Float4> Float4::operator=(const Reference<Float> &rhs)
4177{
4178 return *this = Float4(rhs);
4179}
4180
4181RValue<Float4> operator+(RValue<Float4> lhs, RValue<Float4> rhs)
4182{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004183 return RValue<Float4>(Nucleus::createFAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05004184}
4185
4186RValue<Float4> operator-(RValue<Float4> lhs, RValue<Float4> rhs)
4187{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004188 return RValue<Float4>(Nucleus::createFSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05004189}
4190
4191RValue<Float4> operator*(RValue<Float4> lhs, RValue<Float4> rhs)
4192{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004193 return RValue<Float4>(Nucleus::createFMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05004194}
4195
4196RValue<Float4> operator/(RValue<Float4> lhs, RValue<Float4> rhs)
4197{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004198 return RValue<Float4>(Nucleus::createFDiv(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05004199}
4200
Nicolas Capens157ba262019-12-10 17:49:14 -05004201RValue<Float4> operator+=(Float4 &lhs, RValue<Float4> rhs)
4202{
4203 return lhs = lhs + rhs;
4204}
4205
4206RValue<Float4> operator-=(Float4 &lhs, RValue<Float4> rhs)
4207{
4208 return lhs = lhs - rhs;
4209}
4210
4211RValue<Float4> operator*=(Float4 &lhs, RValue<Float4> rhs)
4212{
4213 return lhs = lhs * rhs;
4214}
4215
4216RValue<Float4> operator/=(Float4 &lhs, RValue<Float4> rhs)
4217{
4218 return lhs = lhs / rhs;
4219}
4220
4221RValue<Float4> operator%=(Float4 &lhs, RValue<Float4> rhs)
4222{
4223 return lhs = lhs % rhs;
4224}
4225
4226RValue<Float4> operator+(RValue<Float4> val)
4227{
4228 return val;
4229}
4230
4231RValue<Float4> operator-(RValue<Float4> val)
4232{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004233 return RValue<Float4>(Nucleus::createFNeg(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05004234}
4235
Nicolas Capens157ba262019-12-10 17:49:14 -05004236RValue<Float4> Insert(RValue<Float4> x, RValue<Float> element, int i)
4237{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004238 return RValue<Float4>(Nucleus::createInsertElement(x.value(), element.value(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05004239}
4240
4241RValue<Float> Extract(RValue<Float4> x, int i)
4242{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004243 return RValue<Float>(Nucleus::createExtractElement(x.value(), Float::type(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05004244}
4245
4246RValue<Float4> Swizzle(RValue<Float4> x, uint16_t select)
4247{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004248 return RValue<Float4>(createSwizzle4(x.value(), select));
Nicolas Capens157ba262019-12-10 17:49:14 -05004249}
4250
4251RValue<Float4> Shuffle(RValue<Float4> x, RValue<Float4> y, uint16_t select)
4252{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004253 return RValue<Float4>(createShuffle4(x.value(), y.value(), select));
Nicolas Capens157ba262019-12-10 17:49:14 -05004254}
4255
4256RValue<Float4> ShuffleLowHigh(RValue<Float4> x, RValue<Float4> y, uint16_t imm)
4257{
Ben Clayton713b8d32019-12-17 20:37:56 +00004258 int shuffle[4] = {
Nicolas Capens157ba262019-12-10 17:49:14 -05004259 ((imm >> 12) & 0x03) + 0,
Ben Clayton713b8d32019-12-17 20:37:56 +00004260 ((imm >> 8) & 0x03) + 0,
4261 ((imm >> 4) & 0x03) + 4,
4262 ((imm >> 0) & 0x03) + 4,
Nicolas Capens157ba262019-12-10 17:49:14 -05004263 };
4264
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004265 return RValue<Float4>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05004266}
4267
4268RValue<Float4> UnpackLow(RValue<Float4> x, RValue<Float4> y)
4269{
Ben Clayton713b8d32019-12-17 20:37:56 +00004270 int shuffle[4] = { 0, 4, 1, 5 };
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004271 return RValue<Float4>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05004272}
4273
4274RValue<Float4> UnpackHigh(RValue<Float4> x, RValue<Float4> y)
4275{
Ben Clayton713b8d32019-12-17 20:37:56 +00004276 int shuffle[4] = { 2, 6, 3, 7 };
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004277 return RValue<Float4>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05004278}
4279
4280RValue<Float4> Mask(Float4 &lhs, RValue<Float4> rhs, uint16_t select)
4281{
4282 Value *vector = lhs.loadValue();
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004283 Value *result = createMask4(vector, rhs.value(), select);
Nicolas Capens157ba262019-12-10 17:49:14 -05004284 lhs.storeValue(result);
4285
4286 return RValue<Float4>(result);
4287}
4288
4289RValue<Int4> IsInf(RValue<Float4> x)
4290{
4291 return CmpEQ(As<Int4>(x) & Int4(0x7FFFFFFF), Int4(0x7F800000));
4292}
4293
4294RValue<Int4> IsNan(RValue<Float4> x)
4295{
4296 return ~CmpEQ(x, x);
4297}
4298
4299RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, int offset)
4300{
4301 return lhs + RValue<Int>(Nucleus::createConstantInt(offset));
4302}
4303
4304RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, RValue<Int> offset)
4305{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004306 return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value(), Byte::type(), offset.value(), false));
Nicolas Capens157ba262019-12-10 17:49:14 -05004307}
4308
4309RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, RValue<UInt> offset)
4310{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004311 return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value(), Byte::type(), offset.value(), true));
Nicolas Capens157ba262019-12-10 17:49:14 -05004312}
4313
4314RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, int offset)
4315{
4316 return lhs = lhs + offset;
4317}
4318
4319RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, RValue<Int> offset)
4320{
4321 return lhs = lhs + offset;
4322}
4323
4324RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, RValue<UInt> offset)
4325{
4326 return lhs = lhs + offset;
4327}
4328
4329RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, int offset)
4330{
4331 return lhs + -offset;
4332}
4333
4334RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, RValue<Int> offset)
4335{
4336 return lhs + -offset;
4337}
4338
4339RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, RValue<UInt> offset)
4340{
4341 return lhs + -offset;
4342}
4343
4344RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, int offset)
4345{
4346 return lhs = lhs - offset;
4347}
4348
4349RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, RValue<Int> offset)
4350{
4351 return lhs = lhs - offset;
4352}
4353
4354RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, RValue<UInt> offset)
4355{
4356 return lhs = lhs - offset;
4357}
4358
4359void Return()
4360{
4361 Nucleus::createRetVoid();
4362 // Place any unreachable instructions in an unreferenced block.
4363 Nucleus::setInsertBlock(Nucleus::createBasicBlock());
4364}
4365
4366void branch(RValue<Bool> cmp, BasicBlock *bodyBB, BasicBlock *endBB)
4367{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004368 Nucleus::createCondBr(cmp.value(), bodyBB, endBB);
Nicolas Capens157ba262019-12-10 17:49:14 -05004369 Nucleus::setInsertBlock(bodyBB);
4370}
4371
4372RValue<Float4> MaskedLoad(RValue<Pointer<Float4>> base, RValue<Int4> mask, unsigned int alignment, bool zeroMaskedLanes /* = false */)
4373{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004374 return RValue<Float4>(Nucleus::createMaskedLoad(base.value(), Float::type(), mask.value(), alignment, zeroMaskedLanes));
Nicolas Capens157ba262019-12-10 17:49:14 -05004375}
4376
4377RValue<Int4> MaskedLoad(RValue<Pointer<Int4>> base, RValue<Int4> mask, unsigned int alignment, bool zeroMaskedLanes /* = false */)
4378{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004379 return RValue<Int4>(Nucleus::createMaskedLoad(base.value(), Int::type(), mask.value(), alignment, zeroMaskedLanes));
Nicolas Capens157ba262019-12-10 17:49:14 -05004380}
4381
4382void MaskedStore(RValue<Pointer<Float4>> base, RValue<Float4> val, RValue<Int4> mask, unsigned int alignment)
4383{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004384 Nucleus::createMaskedStore(base.value(), val.value(), mask.value(), alignment);
Nicolas Capens157ba262019-12-10 17:49:14 -05004385}
4386
4387void MaskedStore(RValue<Pointer<Int4>> base, RValue<Int4> val, RValue<Int4> mask, unsigned int alignment)
4388{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004389 Nucleus::createMaskedStore(base.value(), val.value(), mask.value(), alignment);
Nicolas Capens157ba262019-12-10 17:49:14 -05004390}
4391
4392void Fence(std::memory_order memoryOrder)
4393{
4394 ASSERT_MSG(memoryOrder == std::memory_order_acquire ||
Ben Clayton713b8d32019-12-17 20:37:56 +00004395 memoryOrder == std::memory_order_release ||
4396 memoryOrder == std::memory_order_acq_rel ||
4397 memoryOrder == std::memory_order_seq_cst,
4398 "Unsupported memoryOrder: %d", int(memoryOrder));
Nicolas Capens157ba262019-12-10 17:49:14 -05004399 Nucleus::createFence(memoryOrder);
4400}
4401
Ben Clayton713b8d32019-12-17 20:37:56 +00004402Bool CToReactor<bool>::cast(bool v)
4403{
4404 return type(v);
4405}
4406Byte CToReactor<uint8_t>::cast(uint8_t v)
4407{
4408 return type(v);
4409}
4410SByte CToReactor<int8_t>::cast(int8_t v)
4411{
4412 return type(v);
4413}
4414Short CToReactor<int16_t>::cast(int16_t v)
4415{
4416 return type(v);
4417}
4418UShort CToReactor<uint16_t>::cast(uint16_t v)
4419{
4420 return type(v);
4421}
4422Int CToReactor<int32_t>::cast(int32_t v)
4423{
4424 return type(v);
4425}
4426UInt CToReactor<uint32_t>::cast(uint32_t v)
4427{
4428 return type(v);
4429}
4430Float CToReactor<float>::cast(float v)
4431{
4432 return type(v);
4433}
4434Float4 CToReactor<float[4]>::cast(float v[4])
4435{
4436 return type(v[0], v[1], v[2], v[3]);
4437}
Nicolas Capens157ba262019-12-10 17:49:14 -05004438
4439// TODO: Long has no constructor that takes a uint64_t
4440// Long CToReactor<uint64_t>::cast(uint64_t v) { return type(v); }
4441
Antonio Maiorano62427e02020-02-13 09:18:05 -05004442#ifdef ENABLE_RR_PRINT
4443static std::string replaceAll(std::string str, const std::string &substr, const std::string &replacement)
4444{
4445 size_t pos = 0;
4446 while((pos = str.find(substr, pos)) != std::string::npos)
4447 {
4448 str.replace(pos, substr.length(), replacement);
4449 pos += replacement.length();
4450 }
4451 return str;
4452}
4453
4454// extractAll returns a vector containing the extracted n scalar value of
4455// the vector vec.
4456// TODO: Move to Reactor.cpp (LLVMReactor can use this too)
4457static std::vector<Value *> extractAll(Value *vec, int n)
4458{
4459 Type *elemTy = Nucleus::getContainedType(Nucleus::getType(vec));
4460 std::vector<Value *> elements;
4461 elements.reserve(n);
4462 for(int i = 0; i < n; i++)
4463 {
4464 auto el = Nucleus::createExtractElement(vec, elemTy, i);
4465 elements.push_back(el);
4466 }
4467 return elements;
4468}
4469
4470// toInt returns all the integer values in vals extended to a printf-required storage value
4471static std::vector<Value *> toInt(const std::vector<Value *> &vals, bool isSigned)
4472{
Nicolas Capens519cf222020-05-08 15:27:19 -04004473 auto storageTy = Nucleus::getPrintfStorageType(Int::type());
Antonio Maiorano62427e02020-02-13 09:18:05 -05004474 std::vector<Value *> elements;
4475 elements.reserve(vals.size());
4476 for(auto v : vals)
4477 {
4478 if(isSigned)
4479 {
4480 elements.push_back(Nucleus::createSExt(v, storageTy));
4481 }
4482 else
4483 {
4484 elements.push_back(Nucleus::createZExt(v, storageTy));
4485 }
4486 }
4487 return elements;
4488}
4489
4490// toFloat returns all the float values in vals extended to extended to a printf-required storage value
4491static std::vector<Value *> toFloat(const std::vector<Value *> &vals)
4492{
Nicolas Capens519cf222020-05-08 15:27:19 -04004493 auto storageTy = Nucleus::getPrintfStorageType(Float::type());
Antonio Maiorano62427e02020-02-13 09:18:05 -05004494 std::vector<Value *> elements;
4495 elements.reserve(vals.size());
4496 for(auto v : vals)
4497 {
4498 elements.push_back(Nucleus::createFPExt(v, storageTy));
4499 }
4500 return elements;
4501}
4502
4503std::vector<Value *> PrintValue::Ty<Bool>::val(const RValue<Bool> &v)
4504{
4505 auto t = Nucleus::createConstantString("true");
4506 auto f = Nucleus::createConstantString("false");
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004507 return { Nucleus::createSelect(v.value(), t, f) };
Antonio Maiorano62427e02020-02-13 09:18:05 -05004508}
4509
4510std::vector<Value *> PrintValue::Ty<Byte>::val(const RValue<Byte> &v)
4511{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004512 return toInt({ v.value() }, false);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004513}
4514
4515std::vector<Value *> PrintValue::Ty<Byte4>::val(const RValue<Byte4> &v)
4516{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004517 return toInt(extractAll(v.value(), 4), false);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004518}
4519
4520std::vector<Value *> PrintValue::Ty<Int>::val(const RValue<Int> &v)
4521{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004522 return toInt({ v.value() }, true);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004523}
4524
4525std::vector<Value *> PrintValue::Ty<Int2>::val(const RValue<Int2> &v)
4526{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004527 return toInt(extractAll(v.value(), 2), true);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004528}
4529
4530std::vector<Value *> PrintValue::Ty<Int4>::val(const RValue<Int4> &v)
4531{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004532 return toInt(extractAll(v.value(), 4), true);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004533}
4534
4535std::vector<Value *> PrintValue::Ty<UInt>::val(const RValue<UInt> &v)
4536{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004537 return toInt({ v.value() }, false);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004538}
4539
4540std::vector<Value *> PrintValue::Ty<UInt2>::val(const RValue<UInt2> &v)
4541{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004542 return toInt(extractAll(v.value(), 2), false);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004543}
4544
4545std::vector<Value *> PrintValue::Ty<UInt4>::val(const RValue<UInt4> &v)
4546{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004547 return toInt(extractAll(v.value(), 4), false);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004548}
4549
4550std::vector<Value *> PrintValue::Ty<Short>::val(const RValue<Short> &v)
4551{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004552 return toInt({ v.value() }, true);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004553}
4554
4555std::vector<Value *> PrintValue::Ty<Short4>::val(const RValue<Short4> &v)
4556{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004557 return toInt(extractAll(v.value(), 4), true);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004558}
4559
4560std::vector<Value *> PrintValue::Ty<UShort>::val(const RValue<UShort> &v)
4561{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004562 return toInt({ v.value() }, false);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004563}
4564
4565std::vector<Value *> PrintValue::Ty<UShort4>::val(const RValue<UShort4> &v)
4566{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004567 return toInt(extractAll(v.value(), 4), false);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004568}
4569
4570std::vector<Value *> PrintValue::Ty<Float>::val(const RValue<Float> &v)
4571{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004572 return toFloat({ v.value() });
Antonio Maiorano62427e02020-02-13 09:18:05 -05004573}
4574
4575std::vector<Value *> PrintValue::Ty<Float4>::val(const RValue<Float4> &v)
4576{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004577 return toFloat(extractAll(v.value(), 4));
Antonio Maiorano62427e02020-02-13 09:18:05 -05004578}
4579
4580std::vector<Value *> PrintValue::Ty<const char *>::val(const char *v)
4581{
4582 return { Nucleus::createConstantString(v) };
4583}
4584
4585void Printv(const char *function, const char *file, int line, const char *fmt, std::initializer_list<PrintValue> args)
4586{
4587 // Build the printf format message string.
4588 std::string str;
4589 if(file != nullptr) { str += (line > 0) ? "%s:%d " : "%s "; }
4590 if(function != nullptr) { str += "%s "; }
4591 str += fmt;
4592
4593 // Perform substitution on all '{n}' bracketed indices in the format
4594 // message.
4595 int i = 0;
4596 for(const PrintValue &arg : args)
4597 {
4598 str = replaceAll(str, "{" + std::to_string(i++) + "}", arg.format);
4599 }
4600
4601 std::vector<Value *> vals;
4602 vals.reserve(8);
4603
4604 // The format message is always the first argument.
4605 vals.push_back(Nucleus::createConstantString(str));
4606
4607 // Add optional file, line and function info if provided.
4608 if(file != nullptr)
4609 {
4610 vals.push_back(Nucleus::createConstantString(file));
4611 if(line > 0)
4612 {
4613 vals.push_back(Nucleus::createConstantInt(line));
4614 }
4615 }
4616 if(function != nullptr)
4617 {
4618 vals.push_back(Nucleus::createConstantString(function));
4619 }
4620
4621 // Add all format arguments.
4622 for(const PrintValue &arg : args)
4623 {
4624 for(auto val : arg.values)
4625 {
4626 vals.push_back(val);
4627 }
4628 }
4629
4630 // This call is implemented by each backend
4631 VPrintf(vals);
4632}
Antonio Maiorano8cbee412020-06-10 15:59:20 -04004633
4634// This is the function that is called by VPrintf from the backends
4635int DebugPrintf(const char *format, ...)
4636{
4637 // Uncomment this to make it so that we do not print, but the call to this function is emitted.
4638 // Useful when debugging emitted code to see the Reactor source location.
4639 //# define RR_PRINT_OUTPUT_TYPE_STUB
4640
4641# if defined(RR_PRINT_OUTPUT_TYPE_STUB)
4642 return 0;
4643# else
4644
4645 int result;
4646 va_list args;
4647
4648 va_start(args, format);
4649 char buffer[2048];
4650 result = vsprintf(buffer, format, args);
4651 va_end(args);
4652
4653 std::fputs(buffer, stdout);
4654# if defined(_WIN32)
4655 OutputDebugString(buffer);
4656# endif
4657
4658 return result;
4659# endif
4660}
4661
Antonio Maiorano62427e02020-02-13 09:18:05 -05004662#endif // ENABLE_RR_PRINT
4663
Antonio Maioranod1561872020-12-14 14:03:53 -05004664// Functions implemented by backends
4665bool HasRcpApprox();
4666RValue<Float4> RcpApprox(RValue<Float4> x, bool exactAtPow2 = false);
4667RValue<Float> RcpApprox(RValue<Float> x, bool exactAtPow2 = false);
4668
4669template<typename T>
Nicolas Capensd04f3f52022-02-05 01:19:14 -05004670static RValue<T> DoRcp(RValue<T> x, bool relaxedPrecision, bool exactAtPow2)
Antonio Maioranod1561872020-12-14 14:03:53 -05004671{
4672#if defined(__i386__) || defined(__x86_64__) // On x86, 1/x is fast enough, except for lower precision
Nicolas Capensd04f3f52022-02-05 01:19:14 -05004673 bool approx = HasRcpApprox() && relaxedPrecision;
Antonio Maioranod1561872020-12-14 14:03:53 -05004674#else
4675 bool approx = HasRcpApprox();
4676#endif
4677
4678 T rcp;
4679
4680 if(approx)
4681 {
4682 rcp = RcpApprox(x, exactAtPow2);
4683
Nicolas Capensd04f3f52022-02-05 01:19:14 -05004684 if(!relaxedPrecision)
Antonio Maioranod1561872020-12-14 14:03:53 -05004685 {
4686 // Perform one more iteration of Newton-Rhapson division to increase precision
4687 rcp = (rcp + rcp) - (x * rcp * rcp);
4688 }
4689 }
4690 else
4691 {
4692 rcp = T(1.0f) / x;
4693 }
4694
Antonio Maioranod1561872020-12-14 14:03:53 -05004695 return rcp;
4696}
4697
Nicolas Capensd04f3f52022-02-05 01:19:14 -05004698RValue<Float4> Rcp(RValue<Float4> x, bool relaxedPrecision, bool exactAtPow2)
Antonio Maioranod1561872020-12-14 14:03:53 -05004699{
4700 RR_DEBUG_INFO_UPDATE_LOC();
Nicolas Capensd04f3f52022-02-05 01:19:14 -05004701 return DoRcp(x, relaxedPrecision, exactAtPow2);
Antonio Maioranod1561872020-12-14 14:03:53 -05004702}
4703
Nicolas Capensd04f3f52022-02-05 01:19:14 -05004704RValue<Float> Rcp(RValue<Float> x, bool relaxedPrecision, bool exactAtPow2)
Antonio Maioranod1561872020-12-14 14:03:53 -05004705{
4706 RR_DEBUG_INFO_UPDATE_LOC();
Nicolas Capensd04f3f52022-02-05 01:19:14 -05004707 return DoRcp(x, relaxedPrecision, exactAtPow2);
Antonio Maioranod1561872020-12-14 14:03:53 -05004708}
4709
Antonio Maiorano1cc5b332020-12-14 16:57:28 -05004710// Functions implemented by backends
4711bool HasRcpSqrtApprox();
4712RValue<Float4> RcpSqrtApprox(RValue<Float4> x);
4713RValue<Float> RcpSqrtApprox(RValue<Float> x);
4714
4715template<typename T>
4716struct CastToIntType;
4717
4718template<>
4719struct CastToIntType<Float4>
4720{
4721 using type = Int4;
4722};
4723
4724template<>
4725struct CastToIntType<Float>
4726{
4727 using type = Int;
4728};
4729
4730// TODO: move to Reactor.hpp?
4731RValue<Int> CmpNEQ(RValue<Int> x, RValue<Int> y)
4732{
4733 return IfThenElse(x != y, Int(~0), Int(0));
4734}
4735
4736template<typename T>
Nicolas Capensd04f3f52022-02-05 01:19:14 -05004737static RValue<T> DoRcpSqrt(RValue<T> x, bool relaxedPrecision)
Antonio Maiorano1cc5b332020-12-14 16:57:28 -05004738{
4739#if defined(__i386__) || defined(__x86_64__) // On x86, 1/x is fast enough, except for lower precision
Nicolas Capensd04f3f52022-02-05 01:19:14 -05004740 bool approx = HasRcpApprox() && relaxedPrecision;
Antonio Maiorano1cc5b332020-12-14 16:57:28 -05004741#else
4742 bool approx = HasRcpApprox();
4743#endif
4744
4745 if(approx)
4746 {
4747 using IntType = typename CastToIntType<T>::type;
4748
4749 T rsq = RcpSqrtApprox(x);
4750
Nicolas Capensd04f3f52022-02-05 01:19:14 -05004751 if(!relaxedPrecision)
Antonio Maiorano1cc5b332020-12-14 16:57:28 -05004752 {
4753 rsq = rsq * (T(3.0f) - rsq * rsq * x) * T(0.5f);
4754 rsq = As<T>(CmpNEQ(As<IntType>(x), IntType(0x7F800000)) & As<IntType>(rsq));
4755 }
4756
4757 return rsq;
4758 }
4759 else
4760 {
4761 return T(1.0f) / Sqrt(x);
4762 }
4763}
4764
Nicolas Capensd04f3f52022-02-05 01:19:14 -05004765RValue<Float4> RcpSqrt(RValue<Float4> x, bool relaxedPrecision)
Antonio Maiorano1cc5b332020-12-14 16:57:28 -05004766{
Nicolas Capensd04f3f52022-02-05 01:19:14 -05004767 return DoRcpSqrt(x, relaxedPrecision);
Antonio Maiorano1cc5b332020-12-14 16:57:28 -05004768}
4769
Nicolas Capensd04f3f52022-02-05 01:19:14 -05004770RValue<Float> RcpSqrt(RValue<Float> x, bool relaxedPrecision)
Antonio Maiorano1cc5b332020-12-14 16:57:28 -05004771{
Nicolas Capensd04f3f52022-02-05 01:19:14 -05004772 return DoRcpSqrt(x, relaxedPrecision);
Antonio Maiorano1cc5b332020-12-14 16:57:28 -05004773}
4774
Nicolas Capens157ba262019-12-10 17:49:14 -05004775} // namespace rr