blob: 3c4a1469133ed2a086d8d5fd7fcaf347cde6232f [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
Ben Clayton983761c2020-04-01 19:49:44 +010021#include <algorithm>
Nicolas Capensd94d6a32019-08-31 04:04:37 +000022#include <cmath>
23
Antonio Maiorano8cbee412020-06-10 15:59:20 -040024#if defined(_WIN32)
25# ifndef WIN32_LEAN_AND_MEAN
26# define WIN32_LEAN_AND_MEAN
27# endif
28# include <windows.h>
29#endif
30
Antonio Maiorano84c61e12020-12-02 12:06:05 -050031// Define REACTOR_MATERIALIZE_LVALUES_ON_DEFINITION to non-zero to ensure all
32// variables have a stack location obtained throuch alloca().
33#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
39const Config::Edit Config::Edit::None = {};
40
41Config Config::Edit::apply(const Config &cfg) const
42{
Nicolas Capens81bc9d92019-12-16 15:05:57 -050043 if(this == &None) { return cfg; }
Nicolas Capens157ba262019-12-10 17:49:14 -050044
45 auto level = optLevelChanged ? optLevel : cfg.optimization.getLevel();
46 auto passes = cfg.optimization.getPasses();
47 apply(optPassEdits, passes);
Ben Clayton713b8d32019-12-17 20:37:56 +000048 return Config{ Optimization{ level, passes } };
Nicolas Capens157ba262019-12-10 17:49:14 -050049}
50
Ben Clayton713b8d32019-12-17 20:37:56 +000051template<typename T>
52void rr::Config::Edit::apply(const std::vector<std::pair<ListEdit, T>> &edits, std::vector<T> &list) const
Nicolas Capens157ba262019-12-10 17:49:14 -050053{
Ben Clayton713b8d32019-12-17 20:37:56 +000054 for(auto &edit : edits)
Nicolas Capens157ba262019-12-10 17:49:14 -050055 {
Nicolas Capens81bc9d92019-12-16 15:05:57 -050056 switch(edit.first)
Nicolas Capens157ba262019-12-10 17:49:14 -050057 {
Ben Clayton713b8d32019-12-17 20:37:56 +000058 case ListEdit::Add:
59 list.push_back(edit.second);
60 break;
61 case ListEdit::Remove:
Ben Clayton983761c2020-04-01 19:49:44 +010062 list.erase(std::remove_if(list.begin(), list.end(), [&](T item) {
63 return item == edit.second;
64 }),
65 list.end());
Ben Clayton713b8d32019-12-17 20:37:56 +000066 break;
67 case ListEdit::Clear:
68 list.clear();
69 break;
Nicolas Capens157ba262019-12-10 17:49:14 -050070 }
Ben Clayton55bc37a2019-07-04 12:17:12 +010071 }
72}
73
Antonio Maioranof14f6c42020-11-03 16:34:35 -050074thread_local Variable::UnmaterializedVariables *Variable::unmaterializedVariables = nullptr;
75
76void Variable::UnmaterializedVariables::add(const Variable *v)
77{
78 variables.emplace(v, counter++);
79}
80
81void Variable::UnmaterializedVariables::remove(const Variable *v)
82{
83 auto iter = variables.find(v);
84 if(iter != variables.end())
85 {
86 variables.erase(iter);
87 }
88}
89
90void Variable::UnmaterializedVariables::clear()
91{
92 variables.clear();
93}
94
95void Variable::UnmaterializedVariables::materializeAll()
96{
97 // Flatten map of Variable* to monotonically increasing counter to a vector,
98 // then sort it by the counter, so that we materialize in variable usage order.
99 std::vector<std::pair<const Variable *, int>> sorted;
100 sorted.resize(variables.size());
101 std::copy(variables.begin(), variables.end(), sorted.begin());
102 std::sort(sorted.begin(), sorted.end(), [&](auto &lhs, auto &rhs) {
103 return lhs.second < rhs.second;
104 });
105
106 for(auto &v : sorted)
107 {
108 v.first->materialize();
109 }
110
111 variables.clear();
112}
Nicolas Capens157ba262019-12-10 17:49:14 -0500113
Antonio Maioranobae138d2020-12-02 14:25:10 -0500114Variable::Variable(Type *type, int arraySize)
115 : type(type)
116 , arraySize(arraySize)
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400117{
Antonio Maiorano84c61e12020-12-02 12:06:05 -0500118#if REACTOR_MATERIALIZE_LVALUES_ON_DEFINITION
119 materialize();
120#else
Antonio Maioranof14f6c42020-11-03 16:34:35 -0500121 unmaterializedVariables->add(this);
Antonio Maiorano84c61e12020-12-02 12:06:05 -0500122#endif
Nicolas Capens157ba262019-12-10 17:49:14 -0500123}
Ben Clayton55bc37a2019-07-04 12:17:12 +0100124
Nicolas Capens157ba262019-12-10 17:49:14 -0500125Variable::~Variable()
126{
Nicolas Capens3d26cfc2021-01-22 16:51:00 -0500127 // `unmaterializedVariables` can be null at this point due to the function
128 // already having been finalized, while classes derived from `Function<>`
129 // can have member `Variable` fields which are destructed afterwards.
130 if(unmaterializedVariables)
131 {
132 unmaterializedVariables->remove(this);
133 }
Nicolas Capens157ba262019-12-10 17:49:14 -0500134}
Ben Clayton55bc37a2019-07-04 12:17:12 +0100135
Nicolas Capens471c1202020-05-28 09:58:46 -0400136void Variable::materialize() const
137{
138 if(!address)
139 {
Antonio Maiorano84c61e12020-12-02 12:06:05 -0500140 address = Nucleus::allocateStackVariable(getType(), arraySize);
Nicolas Capens471c1202020-05-28 09:58:46 -0400141 RR_DEBUG_INFO_EMIT_VAR(address);
142
143 if(rvalue)
144 {
145 storeValue(rvalue);
146 rvalue = nullptr;
147 }
148 }
149}
150
151Value *Variable::loadValue() const
152{
153 if(rvalue)
154 {
155 return rvalue;
156 }
157
158 if(!address)
159 {
160 // TODO: Return undef instead.
161 materialize();
162 }
163
164 return Nucleus::createLoad(address, getType(), false, 0);
165}
166
167Value *Variable::storeValue(Value *value) const
168{
169 if(address)
170 {
171 return Nucleus::createStore(value, address, getType(), false, 0);
172 }
173
174 rvalue = value;
175
176 return value;
177}
178
179Value *Variable::getBaseAddress() const
180{
181 materialize();
182
183 return address;
184}
185
186Value *Variable::getElementPointer(Value *index, bool unsignedIndex) const
187{
188 return Nucleus::createGEP(getBaseAddress(), getType(), index, unsignedIndex);
189}
190
Nicolas Capens157ba262019-12-10 17:49:14 -0500191void Variable::materializeAll()
192{
Antonio Maioranof14f6c42020-11-03 16:34:35 -0500193 unmaterializedVariables->materializeAll();
Nicolas Capens157ba262019-12-10 17:49:14 -0500194}
Nicolas Capens0192d152019-03-27 14:46:07 -0400195
Nicolas Capens157ba262019-12-10 17:49:14 -0500196void Variable::killUnmaterialized()
197{
Nicolas Capens7d6b5912020-04-28 15:57:57 -0400198 unmaterializedVariables->clear();
Nicolas Capens157ba262019-12-10 17:49:14 -0500199}
Nicolas Capens0192d152019-03-27 14:46:07 -0400200
Nicolas Capens157ba262019-12-10 17:49:14 -0500201// NOTE: Only 12 bits out of 16 of the |select| value are used.
202// More specifically, the value should look like:
203//
204// msb lsb
205// v v
206// [.xxx|.yyy|.zzz|.www] where '.' means an ignored bit
207//
208// This format makes it easy to write calls with hexadecimal select values,
209// since each hex digit is a separate swizzle index.
210//
211// For example:
Nicolas Capensd95467e2020-01-16 01:44:39 -0500212// createShuffle4( [a,b,c,d], [e,f,g,h], 0x0123 ) -> [a,b,c,d]
213// createShuffle4( [a,b,c,d], [e,f,g,h], 0x4567 ) -> [e,f,g,h]
214// createShuffle4( [a,b,c,d], [e,f,g,h], 0x4012 ) -> [e,a,b,c]
Nicolas Capens157ba262019-12-10 17:49:14 -0500215//
Nicolas Capensd95467e2020-01-16 01:44:39 -0500216static Value *createShuffle4(Value *lhs, Value *rhs, uint16_t select)
Nicolas Capens157ba262019-12-10 17:49:14 -0500217{
Ben Clayton713b8d32019-12-17 20:37:56 +0000218 int swizzle[4] = {
Nicolas Capens157ba262019-12-10 17:49:14 -0500219 (select >> 12) & 0x07,
Ben Clayton713b8d32019-12-17 20:37:56 +0000220 (select >> 8) & 0x07,
221 (select >> 4) & 0x07,
222 (select >> 0) & 0x07,
Nicolas Capens157ba262019-12-10 17:49:14 -0500223 };
Nicolas Capens0192d152019-03-27 14:46:07 -0400224
Nicolas Capens157ba262019-12-10 17:49:14 -0500225 return Nucleus::createShuffleVector(lhs, rhs, swizzle);
226}
Nicolas Capens0192d152019-03-27 14:46:07 -0400227
Nicolas Capens157ba262019-12-10 17:49:14 -0500228// NOTE: Only 8 bits out of 16 of the |select| value are used.
229// More specifically, the value should look like:
230//
231// msb lsb
232// v v
233// [..xx|..yy|..zz|..ww] where '.' means an ignored bit
234//
235// This format makes it easy to write calls with hexadecimal select values,
236// since each hex digit is a separate swizzle index.
237//
238// For example:
239// createSwizzle4( [a,b,c,d], 0x0123 ) -> [a,b,c,d]
240// createSwizzle4( [a,b,c,d], 0x0033 ) -> [a,a,d,d]
241//
242static Value *createSwizzle4(Value *val, uint16_t select)
243{
Ben Clayton713b8d32019-12-17 20:37:56 +0000244 int swizzle[4] = {
Nicolas Capens157ba262019-12-10 17:49:14 -0500245 (select >> 12) & 0x03,
Ben Clayton713b8d32019-12-17 20:37:56 +0000246 (select >> 8) & 0x03,
247 (select >> 4) & 0x03,
248 (select >> 0) & 0x03,
Nicolas Capens157ba262019-12-10 17:49:14 -0500249 };
David 'Digit' Turnerb9f03f42019-12-04 19:32:34 +0100250
Nicolas Capens157ba262019-12-10 17:49:14 -0500251 return Nucleus::createShuffleVector(val, val, swizzle);
252}
David 'Digit' Turnerb9f03f42019-12-04 19:32:34 +0100253
Nicolas Capens157ba262019-12-10 17:49:14 -0500254static Value *createMask4(Value *lhs, Value *rhs, uint16_t select)
255{
Ben Clayton713b8d32019-12-17 20:37:56 +0000256 bool mask[4] = { false, false, false, false };
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400257
Nicolas Capens157ba262019-12-10 17:49:14 -0500258 mask[(select >> 12) & 0x03] = true;
Ben Clayton713b8d32019-12-17 20:37:56 +0000259 mask[(select >> 8) & 0x03] = true;
260 mask[(select >> 4) & 0x03] = true;
261 mask[(select >> 0) & 0x03] = true;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400262
Ben Clayton713b8d32019-12-17 20:37:56 +0000263 int swizzle[4] = {
Nicolas Capens157ba262019-12-10 17:49:14 -0500264 mask[0] ? 4 : 0,
265 mask[1] ? 5 : 1,
266 mask[2] ? 6 : 2,
267 mask[3] ? 7 : 3,
268 };
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400269
Nicolas Capens157ba262019-12-10 17:49:14 -0500270 return Nucleus::createShuffleVector(lhs, rhs, swizzle);
271}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400272
Nicolas Capens157ba262019-12-10 17:49:14 -0500273Bool::Bool(Argument<Bool> argument)
274{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400275 store(argument.rvalue());
Nicolas Capens157ba262019-12-10 17:49:14 -0500276}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400277
Nicolas Capens157ba262019-12-10 17:49:14 -0500278Bool::Bool(bool x)
279{
280 storeValue(Nucleus::createConstantBool(x));
281}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400282
Nicolas Capens157ba262019-12-10 17:49:14 -0500283Bool::Bool(RValue<Bool> rhs)
284{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400285 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500286}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400287
Nicolas Capens157ba262019-12-10 17:49:14 -0500288Bool::Bool(const Bool &rhs)
289{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400290 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500291}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400292
Nicolas Capens157ba262019-12-10 17:49:14 -0500293Bool::Bool(const Reference<Bool> &rhs)
294{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400295 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500296}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400297
Nicolas Capens157ba262019-12-10 17:49:14 -0500298RValue<Bool> Bool::operator=(RValue<Bool> rhs)
299{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400300 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500301}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400302
Nicolas Capens157ba262019-12-10 17:49:14 -0500303RValue<Bool> Bool::operator=(const Bool &rhs)
304{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400305 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500306}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400307
Nicolas Capens157ba262019-12-10 17:49:14 -0500308RValue<Bool> Bool::operator=(const Reference<Bool> &rhs)
309{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400310 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500311}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400312
Nicolas Capens157ba262019-12-10 17:49:14 -0500313RValue<Bool> operator!(RValue<Bool> val)
314{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400315 return RValue<Bool>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500316}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400317
Nicolas Capens157ba262019-12-10 17:49:14 -0500318RValue<Bool> operator&&(RValue<Bool> lhs, RValue<Bool> rhs)
319{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400320 return RValue<Bool>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500321}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400322
Nicolas Capens157ba262019-12-10 17:49:14 -0500323RValue<Bool> operator||(RValue<Bool> lhs, RValue<Bool> rhs)
324{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400325 return RValue<Bool>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500326}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400327
Nicolas Capens157ba262019-12-10 17:49:14 -0500328RValue<Bool> operator!=(RValue<Bool> lhs, RValue<Bool> rhs)
329{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400330 return RValue<Bool>(Nucleus::createICmpNE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500331}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400332
Nicolas Capens157ba262019-12-10 17:49:14 -0500333RValue<Bool> operator==(RValue<Bool> lhs, RValue<Bool> rhs)
334{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400335 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500336}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400337
Nicolas Capens157ba262019-12-10 17:49:14 -0500338Byte::Byte(Argument<Byte> argument)
339{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400340 store(argument.rvalue());
Nicolas Capens157ba262019-12-10 17:49:14 -0500341}
Ben Claytonf3b57972019-03-15 09:56:47 +0000342
Nicolas Capens157ba262019-12-10 17:49:14 -0500343Byte::Byte(RValue<Int> cast)
344{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400345 Value *integer = Nucleus::createTrunc(cast.value(), Byte::type());
Ben Claytonf3b57972019-03-15 09:56:47 +0000346
Nicolas Capens157ba262019-12-10 17:49:14 -0500347 storeValue(integer);
348}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400349
Nicolas Capens157ba262019-12-10 17:49:14 -0500350Byte::Byte(RValue<UInt> cast)
351{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400352 Value *integer = Nucleus::createTrunc(cast.value(), Byte::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400353
Nicolas Capens157ba262019-12-10 17:49:14 -0500354 storeValue(integer);
355}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400356
Nicolas Capens157ba262019-12-10 17:49:14 -0500357Byte::Byte(RValue<UShort> cast)
358{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400359 Value *integer = Nucleus::createTrunc(cast.value(), Byte::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400360
Nicolas Capens157ba262019-12-10 17:49:14 -0500361 storeValue(integer);
362}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400363
Nicolas Capens157ba262019-12-10 17:49:14 -0500364Byte::Byte(int x)
365{
366 storeValue(Nucleus::createConstantByte((unsigned char)x));
367}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400368
Nicolas Capens157ba262019-12-10 17:49:14 -0500369Byte::Byte(unsigned char x)
370{
371 storeValue(Nucleus::createConstantByte(x));
372}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400373
Nicolas Capens157ba262019-12-10 17:49:14 -0500374Byte::Byte(RValue<Byte> rhs)
375{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400376 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500377}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400378
Nicolas Capens157ba262019-12-10 17:49:14 -0500379Byte::Byte(const Byte &rhs)
380{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400381 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500382}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400383
Nicolas Capens157ba262019-12-10 17:49:14 -0500384Byte::Byte(const Reference<Byte> &rhs)
385{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400386 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500387}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400388
Nicolas Capens157ba262019-12-10 17:49:14 -0500389RValue<Byte> Byte::operator=(RValue<Byte> rhs)
390{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400391 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500392}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400393
Nicolas Capens157ba262019-12-10 17:49:14 -0500394RValue<Byte> Byte::operator=(const Byte &rhs)
395{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400396 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500397}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400398
Nicolas Capens157ba262019-12-10 17:49:14 -0500399RValue<Byte> Byte::operator=(const Reference<Byte> &rhs)
400{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400401 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500402}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400403
Nicolas Capens157ba262019-12-10 17:49:14 -0500404RValue<Byte> operator+(RValue<Byte> lhs, RValue<Byte> rhs)
405{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400406 return RValue<Byte>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500407}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400408
Nicolas Capens157ba262019-12-10 17:49:14 -0500409RValue<Byte> operator-(RValue<Byte> lhs, RValue<Byte> rhs)
410{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400411 return RValue<Byte>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500412}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400413
Nicolas Capens157ba262019-12-10 17:49:14 -0500414RValue<Byte> operator*(RValue<Byte> lhs, RValue<Byte> rhs)
415{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400416 return RValue<Byte>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500417}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400418
Nicolas Capens157ba262019-12-10 17:49:14 -0500419RValue<Byte> operator/(RValue<Byte> lhs, RValue<Byte> rhs)
420{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400421 return RValue<Byte>(Nucleus::createUDiv(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500422}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400423
Nicolas Capens157ba262019-12-10 17:49:14 -0500424RValue<Byte> operator%(RValue<Byte> lhs, RValue<Byte> rhs)
425{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400426 return RValue<Byte>(Nucleus::createURem(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500427}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400428
Nicolas Capens157ba262019-12-10 17:49:14 -0500429RValue<Byte> operator&(RValue<Byte> lhs, RValue<Byte> rhs)
430{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400431 return RValue<Byte>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500432}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400433
Nicolas Capens157ba262019-12-10 17:49:14 -0500434RValue<Byte> operator|(RValue<Byte> lhs, RValue<Byte> rhs)
435{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400436 return RValue<Byte>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500437}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400438
Nicolas Capens157ba262019-12-10 17:49:14 -0500439RValue<Byte> operator^(RValue<Byte> lhs, RValue<Byte> rhs)
440{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400441 return RValue<Byte>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500442}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400443
Nicolas Capens157ba262019-12-10 17:49:14 -0500444RValue<Byte> operator<<(RValue<Byte> lhs, RValue<Byte> rhs)
445{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400446 return RValue<Byte>(Nucleus::createShl(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500447}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400448
Nicolas Capens157ba262019-12-10 17:49:14 -0500449RValue<Byte> operator>>(RValue<Byte> lhs, RValue<Byte> rhs)
450{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400451 return RValue<Byte>(Nucleus::createLShr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500452}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400453
Nicolas Capens157ba262019-12-10 17:49:14 -0500454RValue<Byte> operator+=(Byte &lhs, RValue<Byte> rhs)
455{
456 return lhs = lhs + rhs;
457}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400458
Nicolas Capens157ba262019-12-10 17:49:14 -0500459RValue<Byte> operator-=(Byte &lhs, RValue<Byte> rhs)
460{
461 return lhs = lhs - rhs;
462}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400463
Nicolas Capens157ba262019-12-10 17:49:14 -0500464RValue<Byte> operator*=(Byte &lhs, RValue<Byte> rhs)
465{
466 return lhs = lhs * rhs;
467}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400468
Nicolas Capens157ba262019-12-10 17:49:14 -0500469RValue<Byte> operator/=(Byte &lhs, RValue<Byte> rhs)
470{
471 return lhs = lhs / rhs;
472}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400473
Nicolas Capens157ba262019-12-10 17:49:14 -0500474RValue<Byte> operator%=(Byte &lhs, RValue<Byte> rhs)
475{
476 return lhs = lhs % rhs;
477}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400478
Nicolas Capens157ba262019-12-10 17:49:14 -0500479RValue<Byte> operator&=(Byte &lhs, RValue<Byte> rhs)
480{
481 return lhs = lhs & rhs;
482}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400483
Nicolas Capens157ba262019-12-10 17:49:14 -0500484RValue<Byte> operator|=(Byte &lhs, RValue<Byte> rhs)
485{
486 return lhs = lhs | rhs;
487}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400488
Nicolas Capens157ba262019-12-10 17:49:14 -0500489RValue<Byte> operator^=(Byte &lhs, RValue<Byte> rhs)
490{
491 return lhs = lhs ^ rhs;
492}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400493
Nicolas Capens157ba262019-12-10 17:49:14 -0500494RValue<Byte> operator<<=(Byte &lhs, RValue<Byte> rhs)
495{
496 return lhs = lhs << rhs;
497}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400498
Nicolas Capens157ba262019-12-10 17:49:14 -0500499RValue<Byte> operator>>=(Byte &lhs, RValue<Byte> rhs)
500{
501 return lhs = lhs >> rhs;
502}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400503
Nicolas Capens157ba262019-12-10 17:49:14 -0500504RValue<Byte> operator+(RValue<Byte> val)
505{
506 return val;
507}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400508
Nicolas Capens157ba262019-12-10 17:49:14 -0500509RValue<Byte> operator-(RValue<Byte> val)
510{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400511 return RValue<Byte>(Nucleus::createNeg(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500512}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400513
Nicolas Capens157ba262019-12-10 17:49:14 -0500514RValue<Byte> operator~(RValue<Byte> val)
515{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400516 return RValue<Byte>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500517}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400518
Ben Clayton713b8d32019-12-17 20:37:56 +0000519RValue<Byte> operator++(Byte &val, int) // Post-increment
Nicolas Capens157ba262019-12-10 17:49:14 -0500520{
521 RValue<Byte> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400522
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400523 Value *inc = Nucleus::createAdd(res.value(), Nucleus::createConstantByte((unsigned char)1));
Nicolas Capens157ba262019-12-10 17:49:14 -0500524 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400525
Nicolas Capens157ba262019-12-10 17:49:14 -0500526 return res;
527}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400528
Ben Clayton713b8d32019-12-17 20:37:56 +0000529const Byte &operator++(Byte &val) // Pre-increment
Nicolas Capens157ba262019-12-10 17:49:14 -0500530{
531 Value *inc = Nucleus::createAdd(val.loadValue(), Nucleus::createConstantByte((unsigned char)1));
532 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400533
Nicolas Capens157ba262019-12-10 17:49:14 -0500534 return val;
535}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400536
Ben Clayton713b8d32019-12-17 20:37:56 +0000537RValue<Byte> operator--(Byte &val, int) // Post-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -0500538{
539 RValue<Byte> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400540
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400541 Value *inc = Nucleus::createSub(res.value(), Nucleus::createConstantByte((unsigned char)1));
Nicolas Capens157ba262019-12-10 17:49:14 -0500542 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400543
Nicolas Capens157ba262019-12-10 17:49:14 -0500544 return res;
545}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400546
Ben Clayton713b8d32019-12-17 20:37:56 +0000547const Byte &operator--(Byte &val) // Pre-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -0500548{
549 Value *inc = Nucleus::createSub(val.loadValue(), Nucleus::createConstantByte((unsigned char)1));
550 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400551
Nicolas Capens157ba262019-12-10 17:49:14 -0500552 return val;
553}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400554
Nicolas Capens157ba262019-12-10 17:49:14 -0500555RValue<Bool> operator<(RValue<Byte> lhs, RValue<Byte> rhs)
556{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400557 return RValue<Bool>(Nucleus::createICmpULT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500558}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400559
Nicolas Capens157ba262019-12-10 17:49:14 -0500560RValue<Bool> operator<=(RValue<Byte> lhs, RValue<Byte> rhs)
561{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400562 return RValue<Bool>(Nucleus::createICmpULE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500563}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400564
Nicolas Capens157ba262019-12-10 17:49:14 -0500565RValue<Bool> operator>(RValue<Byte> lhs, RValue<Byte> rhs)
566{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400567 return RValue<Bool>(Nucleus::createICmpUGT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500568}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400569
Nicolas Capens157ba262019-12-10 17:49:14 -0500570RValue<Bool> operator>=(RValue<Byte> lhs, RValue<Byte> rhs)
571{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400572 return RValue<Bool>(Nucleus::createICmpUGE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500573}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400574
Nicolas Capens157ba262019-12-10 17:49:14 -0500575RValue<Bool> operator!=(RValue<Byte> lhs, RValue<Byte> rhs)
576{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400577 return RValue<Bool>(Nucleus::createICmpNE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500578}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400579
Nicolas Capens157ba262019-12-10 17:49:14 -0500580RValue<Bool> operator==(RValue<Byte> lhs, RValue<Byte> rhs)
581{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400582 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500583}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400584
Nicolas Capens157ba262019-12-10 17:49:14 -0500585SByte::SByte(Argument<SByte> argument)
586{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400587 store(argument.rvalue());
Nicolas Capens157ba262019-12-10 17:49:14 -0500588}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400589
Nicolas Capens157ba262019-12-10 17:49:14 -0500590SByte::SByte(RValue<Int> cast)
591{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400592 Value *integer = Nucleus::createTrunc(cast.value(), SByte::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400593
Nicolas Capens157ba262019-12-10 17:49:14 -0500594 storeValue(integer);
595}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400596
Nicolas Capens157ba262019-12-10 17:49:14 -0500597SByte::SByte(RValue<Short> cast)
598{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400599 Value *integer = Nucleus::createTrunc(cast.value(), SByte::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400600
Nicolas Capens157ba262019-12-10 17:49:14 -0500601 storeValue(integer);
602}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400603
Nicolas Capens157ba262019-12-10 17:49:14 -0500604SByte::SByte(signed char x)
605{
606 storeValue(Nucleus::createConstantByte(x));
607}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400608
Nicolas Capens157ba262019-12-10 17:49:14 -0500609SByte::SByte(RValue<SByte> rhs)
610{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400611 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500612}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400613
Nicolas Capens157ba262019-12-10 17:49:14 -0500614SByte::SByte(const SByte &rhs)
615{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400616 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500617}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400618
Nicolas Capens157ba262019-12-10 17:49:14 -0500619SByte::SByte(const Reference<SByte> &rhs)
620{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400621 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500622}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400623
Nicolas Capens157ba262019-12-10 17:49:14 -0500624RValue<SByte> SByte::operator=(RValue<SByte> rhs)
625{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400626 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500627}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400628
Nicolas Capens157ba262019-12-10 17:49:14 -0500629RValue<SByte> SByte::operator=(const SByte &rhs)
630{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400631 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500632}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400633
Nicolas Capens157ba262019-12-10 17:49:14 -0500634RValue<SByte> SByte::operator=(const Reference<SByte> &rhs)
635{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400636 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500637}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400638
Nicolas Capens157ba262019-12-10 17:49:14 -0500639RValue<SByte> operator+(RValue<SByte> lhs, RValue<SByte> rhs)
640{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400641 return RValue<SByte>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500642}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400643
Nicolas Capens157ba262019-12-10 17:49:14 -0500644RValue<SByte> operator-(RValue<SByte> lhs, RValue<SByte> rhs)
645{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400646 return RValue<SByte>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500647}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400648
Nicolas Capens157ba262019-12-10 17:49:14 -0500649RValue<SByte> operator*(RValue<SByte> lhs, RValue<SByte> rhs)
650{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400651 return RValue<SByte>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500652}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400653
Nicolas Capens157ba262019-12-10 17:49:14 -0500654RValue<SByte> operator/(RValue<SByte> lhs, RValue<SByte> rhs)
655{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400656 return RValue<SByte>(Nucleus::createSDiv(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500657}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400658
Nicolas Capens157ba262019-12-10 17:49:14 -0500659RValue<SByte> operator%(RValue<SByte> lhs, RValue<SByte> rhs)
660{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400661 return RValue<SByte>(Nucleus::createSRem(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500662}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400663
Nicolas Capens157ba262019-12-10 17:49:14 -0500664RValue<SByte> operator&(RValue<SByte> lhs, RValue<SByte> rhs)
665{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400666 return RValue<SByte>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500667}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400668
Nicolas Capens157ba262019-12-10 17:49:14 -0500669RValue<SByte> operator|(RValue<SByte> lhs, RValue<SByte> rhs)
670{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400671 return RValue<SByte>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500672}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400673
Nicolas Capens157ba262019-12-10 17:49:14 -0500674RValue<SByte> operator^(RValue<SByte> lhs, RValue<SByte> rhs)
675{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400676 return RValue<SByte>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500677}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400678
Nicolas Capens157ba262019-12-10 17:49:14 -0500679RValue<SByte> operator<<(RValue<SByte> lhs, RValue<SByte> rhs)
680{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400681 return RValue<SByte>(Nucleus::createShl(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500682}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400683
Nicolas Capens157ba262019-12-10 17:49:14 -0500684RValue<SByte> operator>>(RValue<SByte> lhs, RValue<SByte> rhs)
685{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400686 return RValue<SByte>(Nucleus::createAShr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500687}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400688
Nicolas Capens157ba262019-12-10 17:49:14 -0500689RValue<SByte> operator+=(SByte &lhs, RValue<SByte> rhs)
690{
691 return lhs = lhs + rhs;
692}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400693
Nicolas Capens157ba262019-12-10 17:49:14 -0500694RValue<SByte> operator-=(SByte &lhs, RValue<SByte> rhs)
695{
696 return lhs = lhs - rhs;
697}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400698
Nicolas Capens157ba262019-12-10 17:49:14 -0500699RValue<SByte> operator*=(SByte &lhs, RValue<SByte> rhs)
700{
701 return lhs = lhs * rhs;
702}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400703
Nicolas Capens157ba262019-12-10 17:49:14 -0500704RValue<SByte> operator/=(SByte &lhs, RValue<SByte> rhs)
705{
706 return lhs = lhs / rhs;
707}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400708
Nicolas Capens157ba262019-12-10 17:49:14 -0500709RValue<SByte> operator%=(SByte &lhs, RValue<SByte> rhs)
710{
711 return lhs = lhs % rhs;
712}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400713
Nicolas Capens157ba262019-12-10 17:49:14 -0500714RValue<SByte> operator&=(SByte &lhs, RValue<SByte> rhs)
715{
716 return lhs = lhs & rhs;
717}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400718
Nicolas Capens157ba262019-12-10 17:49:14 -0500719RValue<SByte> operator|=(SByte &lhs, RValue<SByte> rhs)
720{
721 return lhs = lhs | rhs;
722}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400723
Nicolas Capens157ba262019-12-10 17:49:14 -0500724RValue<SByte> operator^=(SByte &lhs, RValue<SByte> rhs)
725{
726 return lhs = lhs ^ rhs;
727}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400728
Nicolas Capens157ba262019-12-10 17:49:14 -0500729RValue<SByte> operator<<=(SByte &lhs, RValue<SByte> rhs)
730{
731 return lhs = lhs << rhs;
732}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400733
Nicolas Capens157ba262019-12-10 17:49:14 -0500734RValue<SByte> operator>>=(SByte &lhs, RValue<SByte> rhs)
735{
736 return lhs = lhs >> rhs;
737}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400738
Nicolas Capens157ba262019-12-10 17:49:14 -0500739RValue<SByte> operator+(RValue<SByte> val)
740{
741 return val;
742}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400743
Nicolas Capens157ba262019-12-10 17:49:14 -0500744RValue<SByte> operator-(RValue<SByte> val)
745{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400746 return RValue<SByte>(Nucleus::createNeg(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500747}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400748
Nicolas Capens157ba262019-12-10 17:49:14 -0500749RValue<SByte> operator~(RValue<SByte> val)
750{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400751 return RValue<SByte>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500752}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400753
Ben Clayton713b8d32019-12-17 20:37:56 +0000754RValue<SByte> operator++(SByte &val, int) // Post-increment
Nicolas Capens157ba262019-12-10 17:49:14 -0500755{
756 RValue<SByte> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400757
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400758 Value *inc = Nucleus::createAdd(res.value(), Nucleus::createConstantByte((signed char)1));
Nicolas Capens157ba262019-12-10 17:49:14 -0500759 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400760
Nicolas Capens157ba262019-12-10 17:49:14 -0500761 return res;
762}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400763
Ben Clayton713b8d32019-12-17 20:37:56 +0000764const SByte &operator++(SByte &val) // Pre-increment
Nicolas Capens157ba262019-12-10 17:49:14 -0500765{
766 Value *inc = Nucleus::createAdd(val.loadValue(), Nucleus::createConstantByte((signed char)1));
767 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400768
Nicolas Capens157ba262019-12-10 17:49:14 -0500769 return val;
770}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400771
Ben Clayton713b8d32019-12-17 20:37:56 +0000772RValue<SByte> operator--(SByte &val, int) // Post-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -0500773{
774 RValue<SByte> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400775
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400776 Value *inc = Nucleus::createSub(res.value(), Nucleus::createConstantByte((signed char)1));
Nicolas Capens157ba262019-12-10 17:49:14 -0500777 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400778
Nicolas Capens157ba262019-12-10 17:49:14 -0500779 return res;
780}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400781
Ben Clayton713b8d32019-12-17 20:37:56 +0000782const SByte &operator--(SByte &val) // Pre-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -0500783{
784 Value *inc = Nucleus::createSub(val.loadValue(), Nucleus::createConstantByte((signed char)1));
785 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400786
Nicolas Capens157ba262019-12-10 17:49:14 -0500787 return val;
788}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400789
Nicolas Capens157ba262019-12-10 17:49:14 -0500790RValue<Bool> operator<(RValue<SByte> lhs, RValue<SByte> rhs)
791{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400792 return RValue<Bool>(Nucleus::createICmpSLT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500793}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400794
Nicolas Capens157ba262019-12-10 17:49:14 -0500795RValue<Bool> operator<=(RValue<SByte> lhs, RValue<SByte> rhs)
796{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400797 return RValue<Bool>(Nucleus::createICmpSLE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500798}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400799
Nicolas Capens157ba262019-12-10 17:49:14 -0500800RValue<Bool> operator>(RValue<SByte> lhs, RValue<SByte> rhs)
801{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400802 return RValue<Bool>(Nucleus::createICmpSGT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500803}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400804
Nicolas Capens157ba262019-12-10 17:49:14 -0500805RValue<Bool> operator>=(RValue<SByte> lhs, RValue<SByte> rhs)
806{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400807 return RValue<Bool>(Nucleus::createICmpSGE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500808}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400809
Nicolas Capens157ba262019-12-10 17:49:14 -0500810RValue<Bool> operator!=(RValue<SByte> lhs, RValue<SByte> rhs)
811{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400812 return RValue<Bool>(Nucleus::createICmpNE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500813}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400814
Nicolas Capens157ba262019-12-10 17:49:14 -0500815RValue<Bool> operator==(RValue<SByte> lhs, RValue<SByte> rhs)
816{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400817 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500818}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400819
Nicolas Capens157ba262019-12-10 17:49:14 -0500820Short::Short(Argument<Short> argument)
821{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400822 store(argument.rvalue());
Nicolas Capens157ba262019-12-10 17:49:14 -0500823}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400824
Nicolas Capens157ba262019-12-10 17:49:14 -0500825Short::Short(RValue<Int> cast)
826{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400827 Value *integer = Nucleus::createTrunc(cast.value(), Short::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400828
Nicolas Capens157ba262019-12-10 17:49:14 -0500829 storeValue(integer);
830}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400831
Nicolas Capens157ba262019-12-10 17:49:14 -0500832Short::Short(short x)
833{
834 storeValue(Nucleus::createConstantShort(x));
835}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400836
Nicolas Capens157ba262019-12-10 17:49:14 -0500837Short::Short(RValue<Short> rhs)
838{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400839 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500840}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400841
Nicolas Capens157ba262019-12-10 17:49:14 -0500842Short::Short(const Short &rhs)
843{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400844 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500845}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400846
Nicolas Capens157ba262019-12-10 17:49:14 -0500847Short::Short(const Reference<Short> &rhs)
848{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400849 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500850}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400851
Nicolas Capens157ba262019-12-10 17:49:14 -0500852RValue<Short> Short::operator=(RValue<Short> rhs)
853{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400854 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500855}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400856
Nicolas Capens157ba262019-12-10 17:49:14 -0500857RValue<Short> Short::operator=(const Short &rhs)
858{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400859 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500860}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400861
Nicolas Capens157ba262019-12-10 17:49:14 -0500862RValue<Short> Short::operator=(const Reference<Short> &rhs)
863{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400864 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500865}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400866
Nicolas Capens157ba262019-12-10 17:49:14 -0500867RValue<Short> operator+(RValue<Short> lhs, RValue<Short> rhs)
868{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400869 return RValue<Short>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500870}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400871
Nicolas Capens157ba262019-12-10 17:49:14 -0500872RValue<Short> operator-(RValue<Short> lhs, RValue<Short> rhs)
873{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400874 return RValue<Short>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500875}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400876
Nicolas Capens157ba262019-12-10 17:49:14 -0500877RValue<Short> operator*(RValue<Short> lhs, RValue<Short> rhs)
878{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400879 return RValue<Short>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500880}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400881
Nicolas Capens157ba262019-12-10 17:49:14 -0500882RValue<Short> operator/(RValue<Short> lhs, RValue<Short> rhs)
883{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400884 return RValue<Short>(Nucleus::createSDiv(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500885}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400886
Nicolas Capens157ba262019-12-10 17:49:14 -0500887RValue<Short> operator%(RValue<Short> lhs, RValue<Short> rhs)
888{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400889 return RValue<Short>(Nucleus::createSRem(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500890}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400891
Nicolas Capens157ba262019-12-10 17:49:14 -0500892RValue<Short> operator&(RValue<Short> lhs, RValue<Short> rhs)
893{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400894 return RValue<Short>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500895}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400896
Nicolas Capens157ba262019-12-10 17:49:14 -0500897RValue<Short> operator|(RValue<Short> lhs, RValue<Short> rhs)
898{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400899 return RValue<Short>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500900}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400901
Nicolas Capens157ba262019-12-10 17:49:14 -0500902RValue<Short> operator^(RValue<Short> lhs, RValue<Short> rhs)
903{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400904 return RValue<Short>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500905}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400906
Nicolas Capens157ba262019-12-10 17:49:14 -0500907RValue<Short> operator<<(RValue<Short> lhs, RValue<Short> rhs)
908{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400909 return RValue<Short>(Nucleus::createShl(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500910}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400911
Nicolas Capens157ba262019-12-10 17:49:14 -0500912RValue<Short> operator>>(RValue<Short> lhs, RValue<Short> rhs)
913{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400914 return RValue<Short>(Nucleus::createAShr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500915}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400916
Nicolas Capens157ba262019-12-10 17:49:14 -0500917RValue<Short> operator+=(Short &lhs, RValue<Short> rhs)
918{
919 return lhs = lhs + rhs;
920}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400921
Nicolas Capens157ba262019-12-10 17:49:14 -0500922RValue<Short> operator-=(Short &lhs, RValue<Short> rhs)
923{
924 return lhs = lhs - rhs;
925}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400926
Nicolas Capens157ba262019-12-10 17:49:14 -0500927RValue<Short> operator*=(Short &lhs, RValue<Short> rhs)
928{
929 return lhs = lhs * rhs;
930}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400931
Nicolas Capens157ba262019-12-10 17:49:14 -0500932RValue<Short> operator/=(Short &lhs, RValue<Short> rhs)
933{
934 return lhs = lhs / rhs;
935}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400936
Nicolas Capens157ba262019-12-10 17:49:14 -0500937RValue<Short> operator%=(Short &lhs, RValue<Short> rhs)
938{
939 return lhs = lhs % rhs;
940}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400941
Nicolas Capens157ba262019-12-10 17:49:14 -0500942RValue<Short> operator&=(Short &lhs, RValue<Short> rhs)
943{
944 return lhs = lhs & rhs;
945}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400946
Nicolas Capens157ba262019-12-10 17:49:14 -0500947RValue<Short> operator|=(Short &lhs, RValue<Short> rhs)
948{
949 return lhs = lhs | rhs;
950}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400951
Nicolas Capens157ba262019-12-10 17:49:14 -0500952RValue<Short> operator^=(Short &lhs, RValue<Short> rhs)
953{
954 return lhs = lhs ^ rhs;
955}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400956
Nicolas Capens157ba262019-12-10 17:49:14 -0500957RValue<Short> operator<<=(Short &lhs, RValue<Short> rhs)
958{
959 return lhs = lhs << rhs;
960}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400961
Nicolas Capens157ba262019-12-10 17:49:14 -0500962RValue<Short> operator>>=(Short &lhs, RValue<Short> rhs)
963{
964 return lhs = lhs >> rhs;
965}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400966
Nicolas Capens157ba262019-12-10 17:49:14 -0500967RValue<Short> operator+(RValue<Short> val)
968{
969 return val;
970}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400971
Nicolas Capens157ba262019-12-10 17:49:14 -0500972RValue<Short> operator-(RValue<Short> val)
973{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400974 return RValue<Short>(Nucleus::createNeg(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500975}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400976
Nicolas Capens157ba262019-12-10 17:49:14 -0500977RValue<Short> operator~(RValue<Short> val)
978{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400979 return RValue<Short>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500980}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400981
Ben Clayton713b8d32019-12-17 20:37:56 +0000982RValue<Short> operator++(Short &val, int) // Post-increment
Nicolas Capens157ba262019-12-10 17:49:14 -0500983{
984 RValue<Short> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400985
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400986 Value *inc = Nucleus::createAdd(res.value(), Nucleus::createConstantShort((short)1));
Nicolas Capens157ba262019-12-10 17:49:14 -0500987 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400988
Nicolas Capens157ba262019-12-10 17:49:14 -0500989 return res;
990}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400991
Ben Clayton713b8d32019-12-17 20:37:56 +0000992const Short &operator++(Short &val) // Pre-increment
Nicolas Capens157ba262019-12-10 17:49:14 -0500993{
994 Value *inc = Nucleus::createAdd(val.loadValue(), Nucleus::createConstantShort((short)1));
995 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400996
Nicolas Capens157ba262019-12-10 17:49:14 -0500997 return val;
998}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400999
Ben Clayton713b8d32019-12-17 20:37:56 +00001000RValue<Short> operator--(Short &val, int) // Post-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -05001001{
1002 RValue<Short> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001003
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001004 Value *inc = Nucleus::createSub(res.value(), Nucleus::createConstantShort((short)1));
Nicolas Capens157ba262019-12-10 17:49:14 -05001005 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001006
Nicolas Capens157ba262019-12-10 17:49:14 -05001007 return res;
1008}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001009
Ben Clayton713b8d32019-12-17 20:37:56 +00001010const Short &operator--(Short &val) // Pre-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -05001011{
1012 Value *inc = Nucleus::createSub(val.loadValue(), Nucleus::createConstantShort((short)1));
1013 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001014
Nicolas Capens157ba262019-12-10 17:49:14 -05001015 return val;
1016}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001017
Nicolas Capens157ba262019-12-10 17:49:14 -05001018RValue<Bool> operator<(RValue<Short> lhs, RValue<Short> rhs)
1019{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001020 return RValue<Bool>(Nucleus::createICmpSLT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001021}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001022
Nicolas Capens157ba262019-12-10 17:49:14 -05001023RValue<Bool> operator<=(RValue<Short> lhs, RValue<Short> rhs)
1024{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001025 return RValue<Bool>(Nucleus::createICmpSLE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001026}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001027
Nicolas Capens157ba262019-12-10 17:49:14 -05001028RValue<Bool> operator>(RValue<Short> lhs, RValue<Short> rhs)
1029{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001030 return RValue<Bool>(Nucleus::createICmpSGT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001031}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001032
Nicolas Capens157ba262019-12-10 17:49:14 -05001033RValue<Bool> operator>=(RValue<Short> lhs, RValue<Short> rhs)
1034{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001035 return RValue<Bool>(Nucleus::createICmpSGE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001036}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001037
Nicolas Capens157ba262019-12-10 17:49:14 -05001038RValue<Bool> operator!=(RValue<Short> lhs, RValue<Short> rhs)
1039{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001040 return RValue<Bool>(Nucleus::createICmpNE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001041}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001042
Nicolas Capens157ba262019-12-10 17:49:14 -05001043RValue<Bool> operator==(RValue<Short> lhs, RValue<Short> rhs)
1044{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001045 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001046}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001047
Nicolas Capens157ba262019-12-10 17:49:14 -05001048UShort::UShort(Argument<UShort> argument)
1049{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001050 store(argument.rvalue());
Nicolas Capens157ba262019-12-10 17:49:14 -05001051}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001052
Nicolas Capens157ba262019-12-10 17:49:14 -05001053UShort::UShort(RValue<UInt> cast)
1054{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001055 Value *integer = Nucleus::createTrunc(cast.value(), UShort::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001056
Nicolas Capens157ba262019-12-10 17:49:14 -05001057 storeValue(integer);
1058}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001059
Nicolas Capens157ba262019-12-10 17:49:14 -05001060UShort::UShort(RValue<Int> cast)
1061{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001062 Value *integer = Nucleus::createTrunc(cast.value(), UShort::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001063
Nicolas Capens157ba262019-12-10 17:49:14 -05001064 storeValue(integer);
1065}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001066
Nicolas Capens157ba262019-12-10 17:49:14 -05001067UShort::UShort(unsigned short x)
1068{
1069 storeValue(Nucleus::createConstantShort(x));
1070}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001071
Nicolas Capens157ba262019-12-10 17:49:14 -05001072UShort::UShort(RValue<UShort> rhs)
1073{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001074 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001075}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001076
Nicolas Capens157ba262019-12-10 17:49:14 -05001077UShort::UShort(const UShort &rhs)
1078{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001079 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001080}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001081
Nicolas Capens157ba262019-12-10 17:49:14 -05001082UShort::UShort(const Reference<UShort> &rhs)
1083{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001084 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001085}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001086
Nicolas Capens157ba262019-12-10 17:49:14 -05001087RValue<UShort> UShort::operator=(RValue<UShort> rhs)
1088{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001089 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001090}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001091
Nicolas Capens157ba262019-12-10 17:49:14 -05001092RValue<UShort> UShort::operator=(const UShort &rhs)
1093{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001094 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001095}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001096
Nicolas Capens157ba262019-12-10 17:49:14 -05001097RValue<UShort> UShort::operator=(const Reference<UShort> &rhs)
1098{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001099 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001100}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001101
Nicolas Capens157ba262019-12-10 17:49:14 -05001102RValue<UShort> operator+(RValue<UShort> lhs, RValue<UShort> rhs)
1103{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001104 return RValue<UShort>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001105}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001106
Nicolas Capens157ba262019-12-10 17:49:14 -05001107RValue<UShort> operator-(RValue<UShort> lhs, RValue<UShort> rhs)
1108{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001109 return RValue<UShort>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001110}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001111
Nicolas Capens157ba262019-12-10 17:49:14 -05001112RValue<UShort> operator*(RValue<UShort> lhs, RValue<UShort> rhs)
1113{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001114 return RValue<UShort>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001115}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001116
Nicolas Capens157ba262019-12-10 17:49:14 -05001117RValue<UShort> operator/(RValue<UShort> lhs, RValue<UShort> rhs)
1118{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001119 return RValue<UShort>(Nucleus::createUDiv(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001120}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001121
Nicolas Capens157ba262019-12-10 17:49:14 -05001122RValue<UShort> operator%(RValue<UShort> lhs, RValue<UShort> rhs)
1123{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001124 return RValue<UShort>(Nucleus::createURem(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001125}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001126
Nicolas Capens157ba262019-12-10 17:49:14 -05001127RValue<UShort> operator&(RValue<UShort> lhs, RValue<UShort> rhs)
1128{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001129 return RValue<UShort>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001130}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001131
Nicolas Capens157ba262019-12-10 17:49:14 -05001132RValue<UShort> operator|(RValue<UShort> lhs, RValue<UShort> rhs)
1133{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001134 return RValue<UShort>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001135}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001136
Nicolas Capens157ba262019-12-10 17:49:14 -05001137RValue<UShort> operator^(RValue<UShort> lhs, RValue<UShort> rhs)
1138{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001139 return RValue<UShort>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001140}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001141
Nicolas Capens157ba262019-12-10 17:49:14 -05001142RValue<UShort> operator<<(RValue<UShort> lhs, RValue<UShort> rhs)
1143{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001144 return RValue<UShort>(Nucleus::createShl(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001145}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001146
Nicolas Capens157ba262019-12-10 17:49:14 -05001147RValue<UShort> operator>>(RValue<UShort> lhs, RValue<UShort> rhs)
1148{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001149 return RValue<UShort>(Nucleus::createLShr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001150}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001151
Nicolas Capens157ba262019-12-10 17:49:14 -05001152RValue<UShort> operator+=(UShort &lhs, RValue<UShort> rhs)
1153{
1154 return lhs = lhs + rhs;
1155}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001156
Nicolas Capens157ba262019-12-10 17:49:14 -05001157RValue<UShort> operator-=(UShort &lhs, RValue<UShort> rhs)
1158{
1159 return lhs = lhs - rhs;
1160}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001161
Nicolas Capens157ba262019-12-10 17:49:14 -05001162RValue<UShort> operator*=(UShort &lhs, RValue<UShort> rhs)
1163{
1164 return lhs = lhs * rhs;
1165}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001166
Nicolas Capens157ba262019-12-10 17:49:14 -05001167RValue<UShort> operator/=(UShort &lhs, RValue<UShort> rhs)
1168{
1169 return lhs = lhs / rhs;
1170}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001171
Nicolas Capens157ba262019-12-10 17:49:14 -05001172RValue<UShort> operator%=(UShort &lhs, RValue<UShort> rhs)
1173{
1174 return lhs = lhs % rhs;
1175}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001176
Nicolas Capens157ba262019-12-10 17:49:14 -05001177RValue<UShort> operator&=(UShort &lhs, RValue<UShort> rhs)
1178{
1179 return lhs = lhs & rhs;
1180}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001181
Nicolas Capens157ba262019-12-10 17:49:14 -05001182RValue<UShort> operator|=(UShort &lhs, RValue<UShort> rhs)
1183{
1184 return lhs = lhs | rhs;
1185}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001186
Nicolas Capens157ba262019-12-10 17:49:14 -05001187RValue<UShort> operator^=(UShort &lhs, RValue<UShort> rhs)
1188{
1189 return lhs = lhs ^ rhs;
1190}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001191
Nicolas Capens157ba262019-12-10 17:49:14 -05001192RValue<UShort> operator<<=(UShort &lhs, RValue<UShort> rhs)
1193{
1194 return lhs = lhs << rhs;
1195}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001196
Nicolas Capens157ba262019-12-10 17:49:14 -05001197RValue<UShort> operator>>=(UShort &lhs, RValue<UShort> rhs)
1198{
1199 return lhs = lhs >> rhs;
1200}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001201
Nicolas Capens157ba262019-12-10 17:49:14 -05001202RValue<UShort> operator+(RValue<UShort> val)
1203{
1204 return val;
1205}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001206
Nicolas Capens157ba262019-12-10 17:49:14 -05001207RValue<UShort> operator-(RValue<UShort> val)
1208{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001209 return RValue<UShort>(Nucleus::createNeg(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001210}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001211
Nicolas Capens157ba262019-12-10 17:49:14 -05001212RValue<UShort> operator~(RValue<UShort> val)
1213{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001214 return RValue<UShort>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001215}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001216
Ben Clayton713b8d32019-12-17 20:37:56 +00001217RValue<UShort> operator++(UShort &val, int) // Post-increment
Nicolas Capens157ba262019-12-10 17:49:14 -05001218{
1219 RValue<UShort> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001220
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001221 Value *inc = Nucleus::createAdd(res.value(), Nucleus::createConstantShort((unsigned short)1));
Nicolas Capens157ba262019-12-10 17:49:14 -05001222 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001223
Nicolas Capens157ba262019-12-10 17:49:14 -05001224 return res;
1225}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001226
Ben Clayton713b8d32019-12-17 20:37:56 +00001227const UShort &operator++(UShort &val) // Pre-increment
Nicolas Capens157ba262019-12-10 17:49:14 -05001228{
1229 Value *inc = Nucleus::createAdd(val.loadValue(), Nucleus::createConstantShort((unsigned short)1));
1230 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001231
Nicolas Capens157ba262019-12-10 17:49:14 -05001232 return val;
1233}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001234
Ben Clayton713b8d32019-12-17 20:37:56 +00001235RValue<UShort> operator--(UShort &val, int) // Post-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -05001236{
1237 RValue<UShort> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001238
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001239 Value *inc = Nucleus::createSub(res.value(), Nucleus::createConstantShort((unsigned short)1));
Nicolas Capens157ba262019-12-10 17:49:14 -05001240 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001241
Nicolas Capens157ba262019-12-10 17:49:14 -05001242 return res;
1243}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001244
Ben Clayton713b8d32019-12-17 20:37:56 +00001245const UShort &operator--(UShort &val) // Pre-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -05001246{
1247 Value *inc = Nucleus::createSub(val.loadValue(), Nucleus::createConstantShort((unsigned short)1));
1248 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001249
Nicolas Capens157ba262019-12-10 17:49:14 -05001250 return val;
1251}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001252
Nicolas Capens157ba262019-12-10 17:49:14 -05001253RValue<Bool> operator<(RValue<UShort> lhs, RValue<UShort> rhs)
1254{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001255 return RValue<Bool>(Nucleus::createICmpULT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001256}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001257
Nicolas Capens157ba262019-12-10 17:49:14 -05001258RValue<Bool> operator<=(RValue<UShort> lhs, RValue<UShort> rhs)
1259{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001260 return RValue<Bool>(Nucleus::createICmpULE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001261}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001262
Nicolas Capens157ba262019-12-10 17:49:14 -05001263RValue<Bool> operator>(RValue<UShort> lhs, RValue<UShort> rhs)
1264{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001265 return RValue<Bool>(Nucleus::createICmpUGT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001266}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001267
Nicolas Capens157ba262019-12-10 17:49:14 -05001268RValue<Bool> operator>=(RValue<UShort> lhs, RValue<UShort> rhs)
1269{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001270 return RValue<Bool>(Nucleus::createICmpUGE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001271}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001272
Nicolas Capens157ba262019-12-10 17:49:14 -05001273RValue<Bool> operator!=(RValue<UShort> lhs, RValue<UShort> rhs)
1274{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001275 return RValue<Bool>(Nucleus::createICmpNE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001276}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001277
Nicolas Capens157ba262019-12-10 17:49:14 -05001278RValue<Bool> operator==(RValue<UShort> lhs, RValue<UShort> rhs)
1279{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001280 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001281}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001282
Nicolas Capens157ba262019-12-10 17:49:14 -05001283Byte4::Byte4(RValue<Byte8> cast)
1284{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001285 storeValue(Nucleus::createBitCast(cast.value(), type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001286}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001287
Nicolas Capens133b87d2020-01-25 16:26:28 -05001288Byte4::Byte4(RValue<UShort4> cast)
1289{
1290 // TODO(b/148379603): Optimize narrowing swizzle.
1291 *this = As<Byte4>(Swizzle(As<Byte8>(cast), 0x0246'0246));
1292}
1293
1294Byte4::Byte4(RValue<Short4> cast)
1295{
1296 // TODO(b/148379603): Optimize narrowing swizzle.
1297 *this = As<Byte4>(Swizzle(As<Byte8>(cast), 0x0246'0246));
1298}
1299
1300Byte4::Byte4(RValue<UInt4> cast)
1301{
1302 // TODO(b/148379603): Optimize narrowing swizzle.
1303 *this = As<Byte4>(Swizzle(As<Byte16>(cast), 0x048C'048C'048C'048C));
1304}
1305
1306Byte4::Byte4(RValue<Int4> cast)
1307{
1308 // TODO(b/148379603): Optimize narrowing swizzle.
1309 *this = As<Byte4>(Swizzle(As<Byte16>(cast), 0x048C'048C'048C'048C));
1310}
1311
1312Byte4::Byte4(RValue<Byte4> rhs)
1313{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001314 store(rhs);
Nicolas Capens133b87d2020-01-25 16:26:28 -05001315}
1316
1317Byte4::Byte4(const Byte4 &rhs)
1318{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001319 store(rhs.load());
Nicolas Capens133b87d2020-01-25 16:26:28 -05001320}
1321
Nicolas Capens157ba262019-12-10 17:49:14 -05001322Byte4::Byte4(const Reference<Byte4> &rhs)
1323{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001324 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001325}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001326
Nicolas Capens133b87d2020-01-25 16:26:28 -05001327RValue<Byte4> Byte4::operator=(RValue<Byte4> rhs)
1328{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001329 return store(rhs);
Nicolas Capens133b87d2020-01-25 16:26:28 -05001330}
1331
1332RValue<Byte4> Byte4::operator=(const Byte4 &rhs)
1333{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001334 return store(rhs.load());
Nicolas Capens133b87d2020-01-25 16:26:28 -05001335}
1336
Nicolas Capens157ba262019-12-10 17:49:14 -05001337Byte8::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)
1338{
Ben Clayton713b8d32019-12-17 20:37:56 +00001339 int64_t constantVector[8] = { x0, x1, x2, x3, x4, x5, x6, x7 };
Nicolas Capens519cf222020-05-08 15:27:19 -04001340 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001341}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001342
Nicolas Capens157ba262019-12-10 17:49:14 -05001343Byte8::Byte8(RValue<Byte8> rhs)
1344{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001345 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001346}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001347
Nicolas Capens157ba262019-12-10 17:49:14 -05001348Byte8::Byte8(const Byte8 &rhs)
1349{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001350 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001351}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001352
Nicolas Capens157ba262019-12-10 17:49:14 -05001353Byte8::Byte8(const Reference<Byte8> &rhs)
1354{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001355 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001356}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001357
Nicolas Capens157ba262019-12-10 17:49:14 -05001358RValue<Byte8> Byte8::operator=(RValue<Byte8> rhs)
1359{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001360 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001361}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001362
Nicolas Capens157ba262019-12-10 17:49:14 -05001363RValue<Byte8> Byte8::operator=(const Byte8 &rhs)
1364{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001365 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001366}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001367
Nicolas Capens157ba262019-12-10 17:49:14 -05001368RValue<Byte8> Byte8::operator=(const Reference<Byte8> &rhs)
1369{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001370 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001371}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001372
Nicolas Capens157ba262019-12-10 17:49:14 -05001373RValue<Byte8> operator+(RValue<Byte8> lhs, RValue<Byte8> rhs)
1374{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001375 return RValue<Byte8>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001376}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001377
Nicolas Capens157ba262019-12-10 17:49:14 -05001378RValue<Byte8> operator-(RValue<Byte8> lhs, RValue<Byte8> rhs)
1379{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001380 return RValue<Byte8>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001381}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001382
1383// RValue<Byte8> operator*(RValue<Byte8> lhs, RValue<Byte8> rhs)
1384// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001385// return RValue<Byte8>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001386// }
1387
1388// RValue<Byte8> operator/(RValue<Byte8> lhs, RValue<Byte8> rhs)
1389// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001390// return RValue<Byte8>(Nucleus::createUDiv(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001391// }
1392
1393// RValue<Byte8> operator%(RValue<Byte8> lhs, RValue<Byte8> rhs)
1394// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001395// return RValue<Byte8>(Nucleus::createURem(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001396// }
1397
Nicolas Capens157ba262019-12-10 17:49:14 -05001398RValue<Byte8> operator&(RValue<Byte8> lhs, RValue<Byte8> rhs)
1399{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001400 return RValue<Byte8>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001401}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001402
Nicolas Capens157ba262019-12-10 17:49:14 -05001403RValue<Byte8> operator|(RValue<Byte8> lhs, RValue<Byte8> rhs)
1404{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001405 return RValue<Byte8>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001406}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001407
Nicolas Capens157ba262019-12-10 17:49:14 -05001408RValue<Byte8> operator^(RValue<Byte8> lhs, RValue<Byte8> rhs)
1409{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001410 return RValue<Byte8>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001411}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001412
1413// RValue<Byte8> operator<<(RValue<Byte8> lhs, unsigned char rhs)
1414// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001415// return RValue<Byte8>(Nucleus::createShl(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001416// }
1417
1418// RValue<Byte8> operator>>(RValue<Byte8> lhs, unsigned char rhs)
1419// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001420// return RValue<Byte8>(Nucleus::createLShr(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001421// }
1422
Nicolas Capens157ba262019-12-10 17:49:14 -05001423RValue<Byte8> operator+=(Byte8 &lhs, RValue<Byte8> rhs)
1424{
1425 return lhs = lhs + rhs;
1426}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001427
Nicolas Capens157ba262019-12-10 17:49:14 -05001428RValue<Byte8> operator-=(Byte8 &lhs, RValue<Byte8> rhs)
1429{
1430 return lhs = lhs - rhs;
1431}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001432
1433// RValue<Byte8> operator*=(Byte8 &lhs, RValue<Byte8> rhs)
1434// {
1435// return lhs = lhs * rhs;
1436// }
1437
1438// RValue<Byte8> operator/=(Byte8 &lhs, RValue<Byte8> rhs)
1439// {
1440// return lhs = lhs / rhs;
1441// }
1442
1443// RValue<Byte8> operator%=(Byte8 &lhs, RValue<Byte8> rhs)
1444// {
1445// return lhs = lhs % rhs;
1446// }
1447
Nicolas Capens157ba262019-12-10 17:49:14 -05001448RValue<Byte8> operator&=(Byte8 &lhs, RValue<Byte8> rhs)
1449{
1450 return lhs = lhs & rhs;
1451}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001452
Nicolas Capens157ba262019-12-10 17:49:14 -05001453RValue<Byte8> operator|=(Byte8 &lhs, RValue<Byte8> rhs)
1454{
1455 return lhs = lhs | rhs;
1456}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001457
Nicolas Capens157ba262019-12-10 17:49:14 -05001458RValue<Byte8> operator^=(Byte8 &lhs, RValue<Byte8> rhs)
1459{
1460 return lhs = lhs ^ rhs;
1461}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001462
1463// RValue<Byte8> operator<<=(Byte8 &lhs, RValue<Byte8> rhs)
1464// {
1465// return lhs = lhs << rhs;
1466// }
1467
1468// RValue<Byte8> operator>>=(Byte8 &lhs, RValue<Byte8> rhs)
1469// {
1470// return lhs = lhs >> rhs;
1471// }
1472
1473// RValue<Byte8> operator+(RValue<Byte8> val)
1474// {
1475// return val;
1476// }
1477
1478// RValue<Byte8> operator-(RValue<Byte8> val)
1479// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001480// return RValue<Byte8>(Nucleus::createNeg(val.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001481// }
1482
Nicolas Capens157ba262019-12-10 17:49:14 -05001483RValue<Byte8> operator~(RValue<Byte8> val)
1484{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001485 return RValue<Byte8>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001486}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001487
Nicolas Capens133b87d2020-01-25 16:26:28 -05001488RValue<Byte8> Swizzle(RValue<Byte8> x, uint32_t select)
1489{
1490 // Real type is v16i8
1491 // TODO(b/148379603): Optimize narrowing swizzle.
1492 int shuffle[16] = {
1493 static_cast<int>((select >> 28) & 0x07),
1494 static_cast<int>((select >> 24) & 0x07),
1495 static_cast<int>((select >> 20) & 0x07),
1496 static_cast<int>((select >> 16) & 0x07),
1497 static_cast<int>((select >> 12) & 0x07),
1498 static_cast<int>((select >> 8) & 0x07),
1499 static_cast<int>((select >> 4) & 0x07),
1500 static_cast<int>((select >> 0) & 0x07),
1501 static_cast<int>((select >> 28) & 0x07),
1502 static_cast<int>((select >> 24) & 0x07),
1503 static_cast<int>((select >> 20) & 0x07),
1504 static_cast<int>((select >> 16) & 0x07),
1505 static_cast<int>((select >> 12) & 0x07),
1506 static_cast<int>((select >> 8) & 0x07),
1507 static_cast<int>((select >> 4) & 0x07),
1508 static_cast<int>((select >> 0) & 0x07),
1509 };
1510
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001511 return As<Byte8>(Nucleus::createShuffleVector(x.value(), x.value(), shuffle));
Nicolas Capens133b87d2020-01-25 16:26:28 -05001512}
1513
Nicolas Capens157ba262019-12-10 17:49:14 -05001514RValue<Short4> Unpack(RValue<Byte4> x)
1515{
Nicolas Capens133b87d2020-01-25 16:26:28 -05001516 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00001517 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 -04001518 return As<Short4>(Nucleus::createShuffleVector(x.value(), x.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05001519}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001520
Nicolas Capens157ba262019-12-10 17:49:14 -05001521RValue<Short4> Unpack(RValue<Byte4> x, RValue<Byte4> y)
1522{
1523 return UnpackLow(As<Byte8>(x), As<Byte8>(y));
1524}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001525
Nicolas Capens157ba262019-12-10 17:49:14 -05001526RValue<Short4> UnpackLow(RValue<Byte8> x, RValue<Byte8> y)
1527{
Nicolas Capens133b87d2020-01-25 16:26:28 -05001528 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00001529 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 -04001530 return As<Short4>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05001531}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001532
Nicolas Capens157ba262019-12-10 17:49:14 -05001533RValue<Short4> UnpackHigh(RValue<Byte8> x, RValue<Byte8> y)
1534{
Nicolas Capens133b87d2020-01-25 16:26:28 -05001535 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00001536 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 -04001537 auto lowHigh = RValue<Byte16>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05001538 return As<Short4>(Swizzle(As<Int4>(lowHigh), 0x2323));
1539}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001540
Nicolas Capens157ba262019-12-10 17:49:14 -05001541SByte8::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)
1542{
Ben Clayton713b8d32019-12-17 20:37:56 +00001543 int64_t constantVector[8] = { x0, x1, x2, x3, x4, x5, x6, x7 };
Nicolas Capens519cf222020-05-08 15:27:19 -04001544 Value *vector = Nucleus::createConstantVector(constantVector, type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001545
Nicolas Capens519cf222020-05-08 15:27:19 -04001546 storeValue(Nucleus::createBitCast(vector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001547}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001548
Nicolas Capens157ba262019-12-10 17:49:14 -05001549SByte8::SByte8(RValue<SByte8> rhs)
1550{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001551 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001552}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001553
Nicolas Capens157ba262019-12-10 17:49:14 -05001554SByte8::SByte8(const SByte8 &rhs)
1555{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001556 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001557}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001558
Nicolas Capens157ba262019-12-10 17:49:14 -05001559SByte8::SByte8(const Reference<SByte8> &rhs)
1560{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001561 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001562}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001563
Nicolas Capens157ba262019-12-10 17:49:14 -05001564RValue<SByte8> SByte8::operator=(RValue<SByte8> rhs)
1565{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001566 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001567}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001568
Nicolas Capens157ba262019-12-10 17:49:14 -05001569RValue<SByte8> SByte8::operator=(const SByte8 &rhs)
1570{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001571 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001572}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001573
Nicolas Capens157ba262019-12-10 17:49:14 -05001574RValue<SByte8> SByte8::operator=(const Reference<SByte8> &rhs)
1575{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001576 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001577}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001578
Nicolas Capens157ba262019-12-10 17:49:14 -05001579RValue<SByte8> operator+(RValue<SByte8> lhs, RValue<SByte8> rhs)
1580{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001581 return RValue<SByte8>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001582}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001583
Nicolas Capens157ba262019-12-10 17:49:14 -05001584RValue<SByte8> operator-(RValue<SByte8> lhs, RValue<SByte8> rhs)
1585{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001586 return RValue<SByte8>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001587}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001588
1589// RValue<SByte8> operator*(RValue<SByte8> lhs, RValue<SByte8> rhs)
1590// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001591// return RValue<SByte8>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001592// }
1593
1594// RValue<SByte8> operator/(RValue<SByte8> lhs, RValue<SByte8> rhs)
1595// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001596// return RValue<SByte8>(Nucleus::createSDiv(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001597// }
1598
1599// RValue<SByte8> operator%(RValue<SByte8> lhs, RValue<SByte8> rhs)
1600// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001601// return RValue<SByte8>(Nucleus::createSRem(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001602// }
1603
Nicolas Capens157ba262019-12-10 17:49:14 -05001604RValue<SByte8> operator&(RValue<SByte8> lhs, RValue<SByte8> rhs)
1605{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001606 return RValue<SByte8>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001607}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001608
Nicolas Capens157ba262019-12-10 17:49:14 -05001609RValue<SByte8> operator|(RValue<SByte8> lhs, RValue<SByte8> rhs)
1610{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001611 return RValue<SByte8>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001612}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001613
Nicolas Capens157ba262019-12-10 17:49:14 -05001614RValue<SByte8> operator^(RValue<SByte8> lhs, RValue<SByte8> rhs)
1615{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001616 return RValue<SByte8>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001617}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001618
1619// RValue<SByte8> operator<<(RValue<SByte8> lhs, unsigned char rhs)
1620// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001621// return RValue<SByte8>(Nucleus::createShl(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001622// }
1623
1624// RValue<SByte8> operator>>(RValue<SByte8> lhs, unsigned char rhs)
1625// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001626// return RValue<SByte8>(Nucleus::createAShr(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001627// }
1628
Nicolas Capens157ba262019-12-10 17:49:14 -05001629RValue<SByte8> operator+=(SByte8 &lhs, RValue<SByte8> rhs)
1630{
1631 return lhs = lhs + rhs;
1632}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001633
Nicolas Capens157ba262019-12-10 17:49:14 -05001634RValue<SByte8> operator-=(SByte8 &lhs, RValue<SByte8> rhs)
1635{
1636 return lhs = lhs - rhs;
1637}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001638
1639// RValue<SByte8> operator*=(SByte8 &lhs, RValue<SByte8> rhs)
1640// {
1641// return lhs = lhs * rhs;
1642// }
1643
1644// RValue<SByte8> operator/=(SByte8 &lhs, RValue<SByte8> rhs)
1645// {
1646// return lhs = lhs / rhs;
1647// }
1648
1649// RValue<SByte8> operator%=(SByte8 &lhs, RValue<SByte8> rhs)
1650// {
1651// return lhs = lhs % rhs;
1652// }
1653
Nicolas Capens157ba262019-12-10 17:49:14 -05001654RValue<SByte8> operator&=(SByte8 &lhs, RValue<SByte8> rhs)
1655{
1656 return lhs = lhs & rhs;
1657}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001658
Nicolas Capens157ba262019-12-10 17:49:14 -05001659RValue<SByte8> operator|=(SByte8 &lhs, RValue<SByte8> rhs)
1660{
1661 return lhs = lhs | rhs;
1662}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001663
Nicolas Capens157ba262019-12-10 17:49:14 -05001664RValue<SByte8> operator^=(SByte8 &lhs, RValue<SByte8> rhs)
1665{
1666 return lhs = lhs ^ rhs;
1667}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001668
1669// RValue<SByte8> operator<<=(SByte8 &lhs, RValue<SByte8> rhs)
1670// {
1671// return lhs = lhs << rhs;
1672// }
1673
1674// RValue<SByte8> operator>>=(SByte8 &lhs, RValue<SByte8> rhs)
1675// {
1676// return lhs = lhs >> rhs;
1677// }
1678
1679// RValue<SByte8> operator+(RValue<SByte8> val)
1680// {
1681// return val;
1682// }
1683
1684// RValue<SByte8> operator-(RValue<SByte8> val)
1685// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001686// return RValue<SByte8>(Nucleus::createNeg(val.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001687// }
1688
Nicolas Capens157ba262019-12-10 17:49:14 -05001689RValue<SByte8> operator~(RValue<SByte8> val)
1690{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001691 return RValue<SByte8>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001692}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001693
Nicolas Capens157ba262019-12-10 17:49:14 -05001694RValue<Short4> UnpackLow(RValue<SByte8> x, RValue<SByte8> y)
1695{
Nicolas Capens133b87d2020-01-25 16:26:28 -05001696 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00001697 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 -04001698 return As<Short4>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05001699}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001700
Nicolas Capens157ba262019-12-10 17:49:14 -05001701RValue<Short4> UnpackHigh(RValue<SByte8> x, RValue<SByte8> y)
1702{
Nicolas Capens133b87d2020-01-25 16:26:28 -05001703 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00001704 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 -04001705 auto lowHigh = RValue<Byte16>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05001706 return As<Short4>(Swizzle(As<Int4>(lowHigh), 0x2323));
1707}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001708
Nicolas Capens157ba262019-12-10 17:49:14 -05001709Byte16::Byte16(RValue<Byte16> rhs)
1710{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001711 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001712}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001713
Nicolas Capens157ba262019-12-10 17:49:14 -05001714Byte16::Byte16(const Byte16 &rhs)
1715{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001716 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001717}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001718
Nicolas Capens157ba262019-12-10 17:49:14 -05001719Byte16::Byte16(const Reference<Byte16> &rhs)
1720{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001721 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001722}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001723
Nicolas Capens157ba262019-12-10 17:49:14 -05001724RValue<Byte16> Byte16::operator=(RValue<Byte16> rhs)
1725{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001726 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001727}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001728
Nicolas Capens157ba262019-12-10 17:49:14 -05001729RValue<Byte16> Byte16::operator=(const Byte16 &rhs)
1730{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001731 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001732}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001733
Nicolas Capens157ba262019-12-10 17:49:14 -05001734RValue<Byte16> Byte16::operator=(const Reference<Byte16> &rhs)
1735{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001736 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001737}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001738
Nicolas Capens133b87d2020-01-25 16:26:28 -05001739RValue<Byte16> Swizzle(RValue<Byte16> x, uint64_t select)
1740{
1741 int shuffle[16] = {
1742 static_cast<int>((select >> 60) & 0x0F),
1743 static_cast<int>((select >> 56) & 0x0F),
1744 static_cast<int>((select >> 52) & 0x0F),
1745 static_cast<int>((select >> 48) & 0x0F),
1746 static_cast<int>((select >> 44) & 0x0F),
1747 static_cast<int>((select >> 40) & 0x0F),
1748 static_cast<int>((select >> 36) & 0x0F),
1749 static_cast<int>((select >> 32) & 0x0F),
1750 static_cast<int>((select >> 28) & 0x0F),
1751 static_cast<int>((select >> 24) & 0x0F),
1752 static_cast<int>((select >> 20) & 0x0F),
1753 static_cast<int>((select >> 16) & 0x0F),
1754 static_cast<int>((select >> 12) & 0x0F),
1755 static_cast<int>((select >> 8) & 0x0F),
1756 static_cast<int>((select >> 4) & 0x0F),
1757 static_cast<int>((select >> 0) & 0x0F),
1758 };
1759
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001760 return As<Byte16>(Nucleus::createShuffleVector(x.value(), x.value(), shuffle));
Nicolas Capens133b87d2020-01-25 16:26:28 -05001761}
1762
Nicolas Capens157ba262019-12-10 17:49:14 -05001763Short2::Short2(RValue<Short4> cast)
1764{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001765 storeValue(Nucleus::createBitCast(cast.value(), type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001766}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001767
Nicolas Capens157ba262019-12-10 17:49:14 -05001768UShort2::UShort2(RValue<UShort4> cast)
1769{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001770 storeValue(Nucleus::createBitCast(cast.value(), type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001771}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001772
Nicolas Capens157ba262019-12-10 17:49:14 -05001773Short4::Short4(RValue<Int> cast)
1774{
1775 Value *vector = loadValue();
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001776 Value *element = Nucleus::createTrunc(cast.value(), Short::type());
Nicolas Capens157ba262019-12-10 17:49:14 -05001777 Value *insert = Nucleus::createInsertElement(vector, element, 0);
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001778 Value *swizzle = Swizzle(RValue<Short4>(insert), 0x0000).value();
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001779
Nicolas Capens157ba262019-12-10 17:49:14 -05001780 storeValue(swizzle);
1781}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001782
1783// Short4::Short4(RValue<Float> cast)
1784// {
1785// }
1786
Nicolas Capens157ba262019-12-10 17:49:14 -05001787Short4::Short4(short xyzw)
1788{
Ben Clayton713b8d32019-12-17 20:37:56 +00001789 int64_t constantVector[4] = { xyzw, xyzw, xyzw, xyzw };
Nicolas Capens519cf222020-05-08 15:27:19 -04001790 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001791}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001792
Nicolas Capens157ba262019-12-10 17:49:14 -05001793Short4::Short4(short x, short y, short z, short w)
1794{
Ben Clayton713b8d32019-12-17 20:37:56 +00001795 int64_t constantVector[4] = { x, y, z, w };
Nicolas Capens519cf222020-05-08 15:27:19 -04001796 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001797}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001798
Nicolas Capens157ba262019-12-10 17:49:14 -05001799Short4::Short4(RValue<Short4> rhs)
1800{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001801 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001802}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001803
Nicolas Capens157ba262019-12-10 17:49:14 -05001804Short4::Short4(const Short4 &rhs)
1805{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001806 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001807}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001808
Nicolas Capens157ba262019-12-10 17:49:14 -05001809Short4::Short4(const Reference<Short4> &rhs)
1810{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001811 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001812}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001813
Nicolas Capens157ba262019-12-10 17:49:14 -05001814Short4::Short4(RValue<UShort4> rhs)
1815{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001816 storeValue(rhs.value());
Nicolas Capens157ba262019-12-10 17:49:14 -05001817}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001818
Nicolas Capens157ba262019-12-10 17:49:14 -05001819Short4::Short4(const UShort4 &rhs)
1820{
1821 storeValue(rhs.loadValue());
1822}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001823
Nicolas Capens157ba262019-12-10 17:49:14 -05001824Short4::Short4(const Reference<UShort4> &rhs)
1825{
1826 storeValue(rhs.loadValue());
1827}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001828
Nicolas Capens157ba262019-12-10 17:49:14 -05001829RValue<Short4> Short4::operator=(RValue<Short4> rhs)
1830{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001831 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001832}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001833
Nicolas Capens157ba262019-12-10 17:49:14 -05001834RValue<Short4> Short4::operator=(const Short4 &rhs)
1835{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001836 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001837}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001838
Nicolas Capens157ba262019-12-10 17:49:14 -05001839RValue<Short4> Short4::operator=(const Reference<Short4> &rhs)
1840{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001841 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001842}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001843
Nicolas Capens157ba262019-12-10 17:49:14 -05001844RValue<Short4> Short4::operator=(RValue<UShort4> rhs)
1845{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001846 return RValue<Short4>(storeValue(rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001847}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001848
Nicolas Capens157ba262019-12-10 17:49:14 -05001849RValue<Short4> Short4::operator=(const UShort4 &rhs)
1850{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001851 return RValue<Short4>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001852}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001853
Nicolas Capens157ba262019-12-10 17:49:14 -05001854RValue<Short4> Short4::operator=(const Reference<UShort4> &rhs)
1855{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001856 return RValue<Short4>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001857}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001858
Nicolas Capens157ba262019-12-10 17:49:14 -05001859RValue<Short4> operator+(RValue<Short4> lhs, RValue<Short4> rhs)
1860{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001861 return RValue<Short4>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001862}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001863
Nicolas Capens157ba262019-12-10 17:49:14 -05001864RValue<Short4> operator-(RValue<Short4> lhs, RValue<Short4> rhs)
1865{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001866 return RValue<Short4>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001867}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001868
Nicolas Capens157ba262019-12-10 17:49:14 -05001869RValue<Short4> operator*(RValue<Short4> lhs, RValue<Short4> rhs)
1870{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001871 return RValue<Short4>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001872}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001873
1874// RValue<Short4> operator/(RValue<Short4> lhs, RValue<Short4> rhs)
1875// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001876// return RValue<Short4>(Nucleus::createSDiv(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001877// }
1878
1879// RValue<Short4> operator%(RValue<Short4> lhs, RValue<Short4> rhs)
1880// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001881// return RValue<Short4>(Nucleus::createSRem(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001882// }
1883
Nicolas Capens157ba262019-12-10 17:49:14 -05001884RValue<Short4> operator&(RValue<Short4> lhs, RValue<Short4> rhs)
1885{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001886 return RValue<Short4>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001887}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001888
Nicolas Capens157ba262019-12-10 17:49:14 -05001889RValue<Short4> operator|(RValue<Short4> lhs, RValue<Short4> rhs)
1890{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001891 return RValue<Short4>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001892}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001893
Nicolas Capens157ba262019-12-10 17:49:14 -05001894RValue<Short4> operator^(RValue<Short4> lhs, RValue<Short4> rhs)
1895{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001896 return RValue<Short4>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001897}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001898
Nicolas Capens157ba262019-12-10 17:49:14 -05001899RValue<Short4> operator+=(Short4 &lhs, RValue<Short4> rhs)
1900{
1901 return lhs = lhs + rhs;
1902}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001903
Nicolas Capens157ba262019-12-10 17:49:14 -05001904RValue<Short4> operator-=(Short4 &lhs, RValue<Short4> rhs)
1905{
1906 return lhs = lhs - rhs;
1907}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001908
Nicolas Capens157ba262019-12-10 17:49:14 -05001909RValue<Short4> operator*=(Short4 &lhs, RValue<Short4> rhs)
1910{
1911 return lhs = lhs * rhs;
1912}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001913
1914// RValue<Short4> operator/=(Short4 &lhs, RValue<Short4> rhs)
1915// {
1916// return lhs = lhs / rhs;
1917// }
1918
1919// RValue<Short4> operator%=(Short4 &lhs, RValue<Short4> rhs)
1920// {
1921// return lhs = lhs % rhs;
1922// }
1923
Nicolas Capens157ba262019-12-10 17:49:14 -05001924RValue<Short4> operator&=(Short4 &lhs, RValue<Short4> rhs)
1925{
1926 return lhs = lhs & rhs;
1927}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001928
Nicolas Capens157ba262019-12-10 17:49:14 -05001929RValue<Short4> operator|=(Short4 &lhs, RValue<Short4> rhs)
1930{
1931 return lhs = lhs | rhs;
1932}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001933
Nicolas Capens157ba262019-12-10 17:49:14 -05001934RValue<Short4> operator^=(Short4 &lhs, RValue<Short4> rhs)
1935{
1936 return lhs = lhs ^ rhs;
1937}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001938
Nicolas Capens157ba262019-12-10 17:49:14 -05001939RValue<Short4> operator<<=(Short4 &lhs, unsigned char rhs)
1940{
1941 return lhs = lhs << rhs;
1942}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001943
Nicolas Capens157ba262019-12-10 17:49:14 -05001944RValue<Short4> operator>>=(Short4 &lhs, unsigned char rhs)
1945{
1946 return lhs = lhs >> rhs;
1947}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001948
1949// RValue<Short4> operator+(RValue<Short4> val)
1950// {
1951// return val;
1952// }
1953
Nicolas Capens157ba262019-12-10 17:49:14 -05001954RValue<Short4> operator-(RValue<Short4> val)
1955{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001956 return RValue<Short4>(Nucleus::createNeg(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001957}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001958
Nicolas Capens157ba262019-12-10 17:49:14 -05001959RValue<Short4> operator~(RValue<Short4> val)
1960{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001961 return RValue<Short4>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001962}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001963
Nicolas Capens157ba262019-12-10 17:49:14 -05001964RValue<Short4> RoundShort4(RValue<Float4> cast)
1965{
1966 RValue<Int4> int4 = RoundInt(cast);
1967 return As<Short4>(PackSigned(int4, int4));
1968}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001969
Nicolas Capens157ba262019-12-10 17:49:14 -05001970RValue<Int2> UnpackLow(RValue<Short4> x, RValue<Short4> y)
1971{
Ben Clayton713b8d32019-12-17 20:37:56 +00001972 int shuffle[8] = { 0, 8, 1, 9, 2, 10, 3, 11 }; // Real type is v8i16
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001973 return As<Int2>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05001974}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001975
Nicolas Capens157ba262019-12-10 17:49:14 -05001976RValue<Int2> UnpackHigh(RValue<Short4> x, RValue<Short4> y)
1977{
Nicolas Capens133b87d2020-01-25 16:26:28 -05001978 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00001979 int shuffle[8] = { 0, 8, 1, 9, 2, 10, 3, 11 }; // Real type is v8i16
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001980 auto lowHigh = RValue<Short8>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05001981 return As<Int2>(Swizzle(As<Int4>(lowHigh), 0x2323));
1982}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001983
Nicolas Capens157ba262019-12-10 17:49:14 -05001984RValue<Short4> Swizzle(RValue<Short4> x, uint16_t select)
1985{
1986 // Real type is v8i16
Nicolas Capens133b87d2020-01-25 16:26:28 -05001987 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00001988 int shuffle[8] = {
Nicolas Capens157ba262019-12-10 17:49:14 -05001989 (select >> 12) & 0x03,
Ben Clayton713b8d32019-12-17 20:37:56 +00001990 (select >> 8) & 0x03,
1991 (select >> 4) & 0x03,
1992 (select >> 0) & 0x03,
Nicolas Capens157ba262019-12-10 17:49:14 -05001993 (select >> 12) & 0x03,
Ben Clayton713b8d32019-12-17 20:37:56 +00001994 (select >> 8) & 0x03,
1995 (select >> 4) & 0x03,
1996 (select >> 0) & 0x03,
Nicolas Capens157ba262019-12-10 17:49:14 -05001997 };
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001998
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001999 return As<Short4>(Nucleus::createShuffleVector(x.value(), x.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05002000}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002001
Nicolas Capens157ba262019-12-10 17:49:14 -05002002RValue<Short4> Insert(RValue<Short4> val, RValue<Short> element, int i)
2003{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002004 return RValue<Short4>(Nucleus::createInsertElement(val.value(), element.value(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05002005}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002006
Nicolas Capens157ba262019-12-10 17:49:14 -05002007RValue<Short> Extract(RValue<Short4> val, int i)
2008{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002009 return RValue<Short>(Nucleus::createExtractElement(val.value(), Short::type(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05002010}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002011
Nicolas Capens157ba262019-12-10 17:49:14 -05002012UShort4::UShort4(RValue<Int4> cast)
2013{
2014 *this = Short4(cast);
2015}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002016
Nicolas Capens157ba262019-12-10 17:49:14 -05002017UShort4::UShort4(unsigned short xyzw)
2018{
Ben Clayton713b8d32019-12-17 20:37:56 +00002019 int64_t constantVector[4] = { xyzw, xyzw, xyzw, xyzw };
Nicolas Capens519cf222020-05-08 15:27:19 -04002020 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002021}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002022
Nicolas Capens157ba262019-12-10 17:49:14 -05002023UShort4::UShort4(unsigned short x, unsigned short y, unsigned short z, unsigned short w)
2024{
Ben Clayton713b8d32019-12-17 20:37:56 +00002025 int64_t constantVector[4] = { x, y, z, w };
Nicolas Capens519cf222020-05-08 15:27:19 -04002026 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002027}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002028
Nicolas Capens157ba262019-12-10 17:49:14 -05002029UShort4::UShort4(RValue<UShort4> rhs)
2030{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002031 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002032}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002033
Nicolas Capens157ba262019-12-10 17:49:14 -05002034UShort4::UShort4(const UShort4 &rhs)
2035{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002036 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002037}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002038
Nicolas Capens157ba262019-12-10 17:49:14 -05002039UShort4::UShort4(const Reference<UShort4> &rhs)
2040{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002041 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002042}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002043
Nicolas Capens157ba262019-12-10 17:49:14 -05002044UShort4::UShort4(RValue<Short4> rhs)
2045{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002046 storeValue(rhs.value());
Nicolas Capens157ba262019-12-10 17:49:14 -05002047}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002048
Nicolas Capens157ba262019-12-10 17:49:14 -05002049UShort4::UShort4(const Short4 &rhs)
2050{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002051 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05002052}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002053
Nicolas Capens157ba262019-12-10 17:49:14 -05002054UShort4::UShort4(const Reference<Short4> &rhs)
2055{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002056 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05002057}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002058
Nicolas Capens157ba262019-12-10 17:49:14 -05002059RValue<UShort4> UShort4::operator=(RValue<UShort4> rhs)
2060{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002061 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002062}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002063
Nicolas Capens157ba262019-12-10 17:49:14 -05002064RValue<UShort4> UShort4::operator=(const UShort4 &rhs)
2065{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002066 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002067}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002068
Nicolas Capens157ba262019-12-10 17:49:14 -05002069RValue<UShort4> UShort4::operator=(const Reference<UShort4> &rhs)
2070{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002071 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002072}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002073
Nicolas Capens157ba262019-12-10 17:49:14 -05002074RValue<UShort4> UShort4::operator=(RValue<Short4> rhs)
2075{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002076 return RValue<UShort4>(storeValue(rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002077}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002078
Nicolas Capens157ba262019-12-10 17:49:14 -05002079RValue<UShort4> UShort4::operator=(const Short4 &rhs)
2080{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002081 return RValue<UShort4>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002082}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002083
Nicolas Capens157ba262019-12-10 17:49:14 -05002084RValue<UShort4> UShort4::operator=(const Reference<Short4> &rhs)
2085{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002086 return RValue<UShort4>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002087}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002088
Nicolas Capens157ba262019-12-10 17:49:14 -05002089RValue<UShort4> operator+(RValue<UShort4> lhs, RValue<UShort4> rhs)
2090{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002091 return RValue<UShort4>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002092}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002093
Nicolas Capens157ba262019-12-10 17:49:14 -05002094RValue<UShort4> operator-(RValue<UShort4> lhs, RValue<UShort4> rhs)
2095{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002096 return RValue<UShort4>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002097}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002098
Nicolas Capens157ba262019-12-10 17:49:14 -05002099RValue<UShort4> operator*(RValue<UShort4> lhs, RValue<UShort4> rhs)
2100{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002101 return RValue<UShort4>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002102}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002103
Nicolas Capens157ba262019-12-10 17:49:14 -05002104RValue<UShort4> operator&(RValue<UShort4> lhs, RValue<UShort4> rhs)
2105{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002106 return RValue<UShort4>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002107}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002108
Nicolas Capens157ba262019-12-10 17:49:14 -05002109RValue<UShort4> operator|(RValue<UShort4> lhs, RValue<UShort4> rhs)
2110{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002111 return RValue<UShort4>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002112}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002113
Nicolas Capens157ba262019-12-10 17:49:14 -05002114RValue<UShort4> operator^(RValue<UShort4> lhs, RValue<UShort4> rhs)
2115{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002116 return RValue<UShort4>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002117}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002118
Nicolas Capens157ba262019-12-10 17:49:14 -05002119RValue<UShort4> operator<<=(UShort4 &lhs, unsigned char rhs)
2120{
2121 return lhs = lhs << rhs;
2122}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002123
Nicolas Capens157ba262019-12-10 17:49:14 -05002124RValue<UShort4> operator>>=(UShort4 &lhs, unsigned char rhs)
2125{
2126 return lhs = lhs >> rhs;
2127}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002128
Nicolas Capens157ba262019-12-10 17:49:14 -05002129RValue<UShort4> operator~(RValue<UShort4> val)
2130{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002131 return RValue<UShort4>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002132}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002133
Nicolas Capens157ba262019-12-10 17:49:14 -05002134Short8::Short8(short c)
2135{
Ben Clayton713b8d32019-12-17 20:37:56 +00002136 int64_t constantVector[8] = { c, c, c, c, c, c, c, c };
Nicolas Capens519cf222020-05-08 15:27:19 -04002137 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002138}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002139
Nicolas Capens157ba262019-12-10 17:49:14 -05002140Short8::Short8(short c0, short c1, short c2, short c3, short c4, short c5, short c6, short c7)
2141{
Ben Clayton713b8d32019-12-17 20:37:56 +00002142 int64_t constantVector[8] = { c0, c1, c2, c3, c4, c5, c6, c7 };
Nicolas Capens519cf222020-05-08 15:27:19 -04002143 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002144}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002145
Nicolas Capens157ba262019-12-10 17:49:14 -05002146Short8::Short8(RValue<Short8> rhs)
2147{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002148 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002149}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002150
Nicolas Capens157ba262019-12-10 17:49:14 -05002151Short8::Short8(const Reference<Short8> &rhs)
2152{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002153 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002154}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002155
Nicolas Capens157ba262019-12-10 17:49:14 -05002156Short8::Short8(RValue<Short4> lo, RValue<Short4> hi)
2157{
Ben Clayton713b8d32019-12-17 20:37:56 +00002158 int shuffle[8] = { 0, 1, 2, 3, 8, 9, 10, 11 }; // Real type is v8i16
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002159 Value *packed = Nucleus::createShuffleVector(lo.value(), hi.value(), shuffle);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002160
Nicolas Capens157ba262019-12-10 17:49:14 -05002161 storeValue(packed);
2162}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002163
Nicolas Capens157ba262019-12-10 17:49:14 -05002164RValue<Short8> Short8::operator=(RValue<Short8> rhs)
2165{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002166 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002167}
Nicolas Capensf1beca42019-03-26 17:18:57 -04002168
Nicolas Capens157ba262019-12-10 17:49:14 -05002169RValue<Short8> Short8::operator=(const Short8 &rhs)
2170{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002171 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002172}
Nicolas Capensf1beca42019-03-26 17:18:57 -04002173
Nicolas Capens157ba262019-12-10 17:49:14 -05002174RValue<Short8> Short8::operator=(const Reference<Short8> &rhs)
2175{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002176 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002177}
Nicolas Capensf1beca42019-03-26 17:18:57 -04002178
Nicolas Capens157ba262019-12-10 17:49:14 -05002179RValue<Short8> operator+(RValue<Short8> lhs, RValue<Short8> rhs)
2180{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002181 return RValue<Short8>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002182}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002183
Nicolas Capens157ba262019-12-10 17:49:14 -05002184RValue<Short8> operator&(RValue<Short8> lhs, RValue<Short8> rhs)
2185{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002186 return RValue<Short8>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002187}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002188
Nicolas Capens157ba262019-12-10 17:49:14 -05002189RValue<Int4> Abs(RValue<Int4> x)
2190{
2191 // TODO: Optimize.
2192 auto negative = x >> 31;
2193 return (x ^ negative) - negative;
2194}
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 Capens157ba262019-12-10 17:49:14 -05003361RValue<Int4> Int4::operator=(RValue<Int4> rhs)
3362{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003363 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05003364}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003365
Nicolas Capens157ba262019-12-10 17:49:14 -05003366RValue<Int4> Int4::operator=(const Int4 &rhs)
3367{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003368 return store(rhs.load());
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 Reference<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> operator+(RValue<Int4> lhs, RValue<Int4> rhs)
3377{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003378 return RValue<Int4>(Nucleus::createAdd(lhs.value(), rhs.value()));
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::createSub(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::createMul(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::createSDiv(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::createSRem(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::createAnd(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::createOr(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::createXor(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::createShl(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::createAShr(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+=(Int4 &lhs, RValue<Int4> rhs)
3427{
3428 return lhs = lhs + rhs;
3429}
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
3441// RValue<Int4> operator/=(Int4 &lhs, RValue<Int4> rhs)
3442// {
3443// return lhs = lhs / rhs;
3444// }
3445
3446// RValue<Int4> operator%=(Int4 &lhs, RValue<Int4> rhs)
3447// {
3448// return lhs = lhs % rhs;
3449// }
3450
Nicolas Capens157ba262019-12-10 17:49:14 -05003451RValue<Int4> operator&=(Int4 &lhs, RValue<Int4> rhs)
3452{
3453 return lhs = lhs & rhs;
3454}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003455
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, unsigned char 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+(RValue<Int4> val)
3477{
3478 return val;
3479}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003480
Nicolas Capens157ba262019-12-10 17:49:14 -05003481RValue<Int4> operator-(RValue<Int4> val)
3482{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003483 return RValue<Int4>(Nucleus::createNeg(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003484}
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::createNot(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<Int> Extract(RValue<Int4> x, int i)
3492{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003493 return RValue<Int>(Nucleus::createExtractElement(x.value(), Int::type(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05003494}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003495
Nicolas Capens157ba262019-12-10 17:49:14 -05003496RValue<Int4> Insert(RValue<Int4> x, RValue<Int> element, int i)
3497{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003498 return RValue<Int4>(Nucleus::createInsertElement(x.value(), element.value(), 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> Swizzle(RValue<Int4> x, uint16_t select)
3502{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003503 return RValue<Int4>(createSwizzle4(x.value(), select));
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> Shuffle(RValue<Int4> x, RValue<Int4> y, unsigned short select)
3507{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003508 return RValue<Int4>(createShuffle4(x.value(), y.value(), select));
Nicolas Capens157ba262019-12-10 17:49:14 -05003509}
David 'Digit' Turnerb9f03f42019-12-04 19:32:34 +01003510
Ben Clayton713b8d32019-12-17 20:37:56 +00003511UInt4::UInt4()
3512 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003513{
3514}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003515
Ben Clayton713b8d32019-12-17 20:37:56 +00003516UInt4::UInt4(int xyzw)
3517 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003518{
3519 constant(xyzw, xyzw, xyzw, xyzw);
3520}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003521
Ben Clayton713b8d32019-12-17 20:37:56 +00003522UInt4::UInt4(int x, int yzw)
3523 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003524{
3525 constant(x, yzw, yzw, yzw);
3526}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003527
Ben Clayton713b8d32019-12-17 20:37:56 +00003528UInt4::UInt4(int x, int y, int zw)
3529 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003530{
3531 constant(x, y, zw, zw);
3532}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003533
Ben Clayton713b8d32019-12-17 20:37:56 +00003534UInt4::UInt4(int x, int y, int z, int w)
3535 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003536{
3537 constant(x, y, z, w);
3538}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003539
Nicolas Capens157ba262019-12-10 17:49:14 -05003540void UInt4::constant(int x, int y, int z, int w)
3541{
Ben Clayton713b8d32019-12-17 20:37:56 +00003542 int64_t constantVector[4] = { x, y, z, w };
Nicolas Capens519cf222020-05-08 15:27:19 -04003543 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003544}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003545
Ben Clayton713b8d32019-12-17 20:37:56 +00003546UInt4::UInt4(RValue<UInt4> rhs)
3547 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003548{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003549 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05003550}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003551
Ben Clayton713b8d32019-12-17 20:37:56 +00003552UInt4::UInt4(const UInt4 &rhs)
3553 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003554{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003555 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003556}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003557
Ben Clayton713b8d32019-12-17 20:37:56 +00003558UInt4::UInt4(const Reference<UInt4> &rhs)
3559 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003560{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003561 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003562}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003563
Ben Clayton713b8d32019-12-17 20:37:56 +00003564UInt4::UInt4(RValue<Int4> rhs)
3565 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003566{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003567 storeValue(rhs.value());
Nicolas Capens157ba262019-12-10 17:49:14 -05003568}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003569
Ben Clayton713b8d32019-12-17 20:37:56 +00003570UInt4::UInt4(const Int4 &rhs)
3571 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003572{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003573 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05003574}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003575
Ben Clayton713b8d32019-12-17 20:37:56 +00003576UInt4::UInt4(const Reference<Int4> &rhs)
3577 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003578{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003579 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05003580}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003581
Ben Clayton713b8d32019-12-17 20:37:56 +00003582UInt4::UInt4(RValue<UInt2> lo, RValue<UInt2> hi)
3583 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003584{
Ben Clayton713b8d32019-12-17 20:37:56 +00003585 int shuffle[4] = { 0, 1, 4, 5 }; // Real type is v4i32
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003586 Value *packed = Nucleus::createShuffleVector(lo.value(), hi.value(), shuffle);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003587
Nicolas Capens157ba262019-12-10 17:49:14 -05003588 storeValue(packed);
3589}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003590
Ben Clayton713b8d32019-12-17 20:37:56 +00003591UInt4::UInt4(const UInt &rhs)
3592 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003593{
3594 *this = RValue<UInt>(rhs.loadValue());
3595}
Ben Clayton88816fa2019-05-15 17:08:14 +01003596
Ben Clayton713b8d32019-12-17 20:37:56 +00003597UInt4::UInt4(const Reference<UInt> &rhs)
3598 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003599{
3600 *this = RValue<UInt>(rhs.loadValue());
3601}
Ben Clayton88816fa2019-05-15 17:08:14 +01003602
Nicolas Capens157ba262019-12-10 17:49:14 -05003603RValue<UInt4> UInt4::operator=(RValue<UInt4> rhs)
3604{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003605 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05003606}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003607
Nicolas Capens157ba262019-12-10 17:49:14 -05003608RValue<UInt4> UInt4::operator=(const UInt4 &rhs)
3609{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003610 return store(rhs.load());
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 Reference<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> operator+(RValue<UInt4> lhs, RValue<UInt4> rhs)
3619{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003620 return RValue<UInt4>(Nucleus::createAdd(lhs.value(), rhs.value()));
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::createSub(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::createMul(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::createUDiv(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::createURem(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::createAnd(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::createOr(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::createXor(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::createShl(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::createLShr(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+=(UInt4 &lhs, RValue<UInt4> rhs)
3669{
3670 return lhs = lhs + rhs;
3671}
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
3683// RValue<UInt4> operator/=(UInt4 &lhs, RValue<UInt4> rhs)
3684// {
3685// return lhs = lhs / rhs;
3686// }
3687
3688// RValue<UInt4> operator%=(UInt4 &lhs, RValue<UInt4> rhs)
3689// {
3690// return lhs = lhs % rhs;
3691// }
3692
Nicolas Capens157ba262019-12-10 17:49:14 -05003693RValue<UInt4> operator&=(UInt4 &lhs, RValue<UInt4> rhs)
3694{
3695 return lhs = lhs & rhs;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003696}
Nicolas Capens157ba262019-12-10 17:49:14 -05003697
3698RValue<UInt4> operator|=(UInt4 &lhs, RValue<UInt4> rhs)
3699{
3700 return lhs = lhs | rhs;
3701}
3702
3703RValue<UInt4> operator^=(UInt4 &lhs, RValue<UInt4> rhs)
3704{
3705 return lhs = lhs ^ rhs;
3706}
3707
3708RValue<UInt4> operator<<=(UInt4 &lhs, unsigned char 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+(RValue<UInt4> val)
3719{
3720 return val;
3721}
3722
3723RValue<UInt4> operator-(RValue<UInt4> val)
3724{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003725 return RValue<UInt4>(Nucleus::createNeg(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003726}
3727
3728RValue<UInt4> operator~(RValue<UInt4> val)
3729{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003730 return RValue<UInt4>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003731}
3732
3733RValue<UInt> Extract(RValue<UInt4> x, int i)
3734{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003735 return RValue<UInt>(Nucleus::createExtractElement(x.value(), Int::type(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05003736}
3737
3738RValue<UInt4> Insert(RValue<UInt4> x, RValue<UInt> element, int i)
3739{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003740 return RValue<UInt4>(Nucleus::createInsertElement(x.value(), element.value(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05003741}
3742
3743RValue<UInt4> Swizzle(RValue<UInt4> x, uint16_t select)
3744{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003745 return RValue<UInt4>(createSwizzle4(x.value(), select));
Nicolas Capens157ba262019-12-10 17:49:14 -05003746}
3747
3748RValue<UInt4> Shuffle(RValue<UInt4> x, RValue<UInt4> y, unsigned short select)
3749{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003750 return RValue<UInt4>(createShuffle4(x.value(), y.value(), select));
Nicolas Capens157ba262019-12-10 17:49:14 -05003751}
3752
3753Half::Half(RValue<Float> cast)
3754{
3755 UInt fp32i = As<UInt>(cast);
3756 UInt abs = fp32i & 0x7FFFFFFF;
Ben Clayton713b8d32019-12-17 20:37:56 +00003757 UShort fp16i((fp32i & 0x80000000) >> 16); // sign
Nicolas Capens157ba262019-12-10 17:49:14 -05003758
Ben Clayton713b8d32019-12-17 20:37:56 +00003759 If(abs > 0x47FFEFFF) // Infinity
Nicolas Capens157ba262019-12-10 17:49:14 -05003760 {
3761 fp16i |= UShort(0x7FFF);
3762 }
3763 Else
3764 {
Ben Clayton713b8d32019-12-17 20:37:56 +00003765 If(abs < 0x38800000) // Denormal
Nicolas Capens157ba262019-12-10 17:49:14 -05003766 {
3767 Int mantissa = (abs & 0x007FFFFF) | 0x00800000;
3768 Int e = 113 - (abs >> 23);
Nicolas Capens60f8c2e2019-12-12 13:40:15 -05003769 abs = IfThenElse(e < 24, (mantissa >> e), Int(0));
Nicolas Capens157ba262019-12-10 17:49:14 -05003770 fp16i |= UShort((abs + 0x00000FFF + ((abs >> 13) & 1)) >> 13);
3771 }
3772 Else
3773 {
3774 fp16i |= UShort((abs + 0xC8000000 + 0x00000FFF + ((abs >> 13) & 1)) >> 13);
3775 }
3776 }
3777
3778 storeValue(fp16i.loadValue());
3779}
3780
3781Float::Float(RValue<Int> cast)
3782{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003783 Value *integer = Nucleus::createSIToFP(cast.value(), Float::type());
Nicolas Capens157ba262019-12-10 17:49:14 -05003784
3785 storeValue(integer);
3786}
3787
3788Float::Float(RValue<UInt> cast)
3789{
3790 RValue<Float> result = Float(Int(cast & UInt(0x7FFFFFFF))) +
3791 As<Float>((As<Int>(cast) >> 31) & As<Int>(Float(0x80000000u)));
3792
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003793 storeValue(result.value());
Nicolas Capens157ba262019-12-10 17:49:14 -05003794}
3795
3796Float::Float(RValue<Half> cast)
3797{
3798 Int fp16i(As<UShort>(cast));
3799
3800 Int s = (fp16i >> 15) & 0x00000001;
3801 Int e = (fp16i >> 10) & 0x0000001F;
3802 Int m = fp16i & 0x000003FF;
3803
3804 UInt fp32i(s << 31);
3805 If(e == 0)
3806 {
3807 If(m != 0)
3808 {
3809 While((m & 0x00000400) == 0)
3810 {
3811 m <<= 1;
3812 e -= 1;
3813 }
3814
3815 fp32i |= As<UInt>(((e + (127 - 15) + 1) << 23) | ((m & ~0x00000400) << 13));
3816 }
3817 }
3818 Else
3819 {
3820 fp32i |= As<UInt>(((e + (127 - 15)) << 23) | (m << 13));
3821 }
3822
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003823 storeValue(As<Float>(fp32i).value());
Nicolas Capens157ba262019-12-10 17:49:14 -05003824}
3825
3826Float::Float(float x)
3827{
3828 // C++ does not have a way to write an infinite or NaN literal,
3829 // nor does it allow division by zero as a constant expression.
3830 // Thus we should not accept inf or NaN as a Reactor Float constant,
3831 // as this would typically idicate a bug, and avoids undefined
3832 // behavior.
3833 //
3834 // This also prevents the issue of the LLVM JIT only taking double
3835 // values for constructing floating-point constants. During the
3836 // conversion from single-precision to double, a signaling NaN can
3837 // become a quiet NaN, thus altering its bit pattern. Hence this
3838 // assert is also helpful for detecting cases where integers are
3839 // being reinterpreted as float and then bitcast to integer again,
3840 // which does not guarantee preserving the integer value.
3841 //
Nicolas Capense5720882020-01-13 14:10:04 -05003842 // The inifinity() method can be used to obtain positive infinity.
3843 // Should NaN constants be required, methods like quiet_NaN() and
3844 // signaling_NaN() should be added (matching std::numeric_limits).
Nicolas Capens157ba262019-12-10 17:49:14 -05003845 ASSERT(std::isfinite(x));
3846
3847 storeValue(Nucleus::createConstantFloat(x));
3848}
3849
Nicolas Capense5720882020-01-13 14:10:04 -05003850// TODO(b/140302841): Negative infinity can be obtained by using '-infinity()'.
3851// This comes at a minor run-time JIT cost, and the backend may or may not
3852// perform constant folding. This can be optimized by having Reactor perform
3853// the folding, which would still be cheaper than having a capable backend do it.
3854Float Float::infinity()
3855{
3856 Float result;
3857
3858 constexpr double inf = std::numeric_limits<double>::infinity();
3859 result.storeValue(Nucleus::createConstantFloat(inf));
3860
3861 return result;
3862}
3863
Nicolas Capens157ba262019-12-10 17:49:14 -05003864Float::Float(RValue<Float> rhs)
3865{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003866 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05003867}
3868
3869Float::Float(const Float &rhs)
3870{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003871 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003872}
3873
3874Float::Float(const Reference<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(Argument<Float> argument)
3880{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003881 store(argument.rvalue());
Nicolas Capens157ba262019-12-10 17:49:14 -05003882}
3883
Nicolas Capens0aca3ca2020-09-19 23:59:08 -04003884RValue<Float> Float::operator=(float rhs)
3885{
3886 return RValue<Float>(storeValue(Nucleus::createConstantFloat(rhs)));
3887}
3888
Nicolas Capens157ba262019-12-10 17:49:14 -05003889RValue<Float> Float::operator=(RValue<Float> rhs)
3890{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003891 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05003892}
3893
3894RValue<Float> Float::operator=(const Float &rhs)
3895{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003896 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003897}
3898
3899RValue<Float> Float::operator=(const Reference<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> operator+(RValue<Float> lhs, RValue<Float> rhs)
3905{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003906 return RValue<Float>(Nucleus::createFAdd(lhs.value(), rhs.value()));
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::createFSub(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::createFMul(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::createFDiv(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003922}
3923
3924RValue<Float> operator+=(Float &lhs, RValue<Float> rhs)
3925{
3926 return lhs = lhs + rhs;
3927}
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+(RValue<Float> val)
3945{
3946 return val;
3947}
3948
3949RValue<Float> operator-(RValue<Float> val)
3950{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003951 return RValue<Float>(Nucleus::createFNeg(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003952}
3953
3954RValue<Bool> operator<(RValue<Float> lhs, RValue<Float> rhs)
3955{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003956 return RValue<Bool>(Nucleus::createFCmpOLT(lhs.value(), rhs.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::createFCmpOLE(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::createFCmpOGT(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::createFCmpOGE(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::createFCmpONE(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::createFCmpOEQ(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003982}
3983
3984RValue<Float> Abs(RValue<Float> x)
3985{
3986 return IfThenElse(x > 0.0f, x, -x);
3987}
3988
3989RValue<Float> Max(RValue<Float> x, RValue<Float> y)
3990{
3991 return IfThenElse(x > y, x, y);
3992}
3993
3994RValue<Float> Min(RValue<Float> x, RValue<Float> y)
3995{
3996 return IfThenElse(x < y, x, y);
3997}
3998
3999Float2::Float2(RValue<Float4> cast)
4000{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004001 storeValue(Nucleus::createBitCast(cast.value(), type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05004002}
4003
Ben Clayton713b8d32019-12-17 20:37:56 +00004004Float4::Float4(RValue<Byte4> cast)
4005 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004006{
4007 Value *a = Int4(cast).loadValue();
Nicolas Capens519cf222020-05-08 15:27:19 -04004008 Value *xyzw = Nucleus::createSIToFP(a, Float4::type());
Nicolas Capens157ba262019-12-10 17:49:14 -05004009
4010 storeValue(xyzw);
4011}
4012
Ben Clayton713b8d32019-12-17 20:37:56 +00004013Float4::Float4(RValue<SByte4> cast)
4014 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004015{
4016 Value *a = Int4(cast).loadValue();
Nicolas Capens519cf222020-05-08 15:27:19 -04004017 Value *xyzw = Nucleus::createSIToFP(a, Float4::type());
Nicolas Capens157ba262019-12-10 17:49:14 -05004018
4019 storeValue(xyzw);
4020}
4021
Ben Clayton713b8d32019-12-17 20:37:56 +00004022Float4::Float4(RValue<Short4> cast)
4023 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004024{
4025 Int4 c(cast);
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004026 storeValue(Nucleus::createSIToFP(RValue<Int4>(c).value(), Float4::type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05004027}
4028
Ben Clayton713b8d32019-12-17 20:37:56 +00004029Float4::Float4(RValue<UShort4> cast)
4030 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004031{
4032 Int4 c(cast);
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004033 storeValue(Nucleus::createSIToFP(RValue<Int4>(c).value(), Float4::type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05004034}
4035
Ben Clayton713b8d32019-12-17 20:37:56 +00004036Float4::Float4(RValue<Int4> cast)
4037 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004038{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004039 Value *xyzw = Nucleus::createSIToFP(cast.value(), Float4::type());
Nicolas Capens157ba262019-12-10 17:49:14 -05004040
4041 storeValue(xyzw);
4042}
4043
Ben Clayton713b8d32019-12-17 20:37:56 +00004044Float4::Float4(RValue<UInt4> cast)
4045 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004046{
4047 RValue<Float4> result = Float4(Int4(cast & UInt4(0x7FFFFFFF))) +
4048 As<Float4>((As<Int4>(cast) >> 31) & As<Int4>(Float4(0x80000000u)));
4049
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004050 storeValue(result.value());
Nicolas Capens157ba262019-12-10 17:49:14 -05004051}
4052
Ben Clayton713b8d32019-12-17 20:37:56 +00004053Float4::Float4()
4054 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004055{
4056}
4057
Ben Clayton713b8d32019-12-17 20:37:56 +00004058Float4::Float4(float xyzw)
4059 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004060{
4061 constant(xyzw, xyzw, xyzw, xyzw);
4062}
4063
Ben Clayton713b8d32019-12-17 20:37:56 +00004064Float4::Float4(float x, float yzw)
4065 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004066{
4067 constant(x, yzw, yzw, yzw);
4068}
4069
Ben Clayton713b8d32019-12-17 20:37:56 +00004070Float4::Float4(float x, float y, float zw)
4071 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004072{
4073 constant(x, y, zw, zw);
4074}
4075
Ben Clayton713b8d32019-12-17 20:37:56 +00004076Float4::Float4(float x, float y, float z, float w)
4077 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004078{
4079 constant(x, y, z, w);
4080}
4081
Nicolas Capense5720882020-01-13 14:10:04 -05004082Float4 Float4::infinity()
Nicolas Capens157ba262019-12-10 17:49:14 -05004083{
4084 Float4 result;
Nicolas Capens157ba262019-12-10 17:49:14 -05004085
Nicolas Capense5720882020-01-13 14:10:04 -05004086 constexpr double inf = std::numeric_limits<double>::infinity();
Ben Clayton713b8d32019-12-17 20:37:56 +00004087 double constantVector[4] = { inf, inf, inf, inf };
Nicolas Capens519cf222020-05-08 15:27:19 -04004088 result.storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capense5720882020-01-13 14:10:04 -05004089
4090 return result;
Nicolas Capens157ba262019-12-10 17:49:14 -05004091}
4092
4093void Float4::constant(float x, float y, float z, float w)
4094{
4095 // See Float(float) constructor for the rationale behind this assert.
4096 ASSERT(std::isfinite(x) && std::isfinite(y) && std::isfinite(z) && std::isfinite(w));
4097
Ben Clayton713b8d32019-12-17 20:37:56 +00004098 double constantVector[4] = { x, y, z, w };
Nicolas Capens519cf222020-05-08 15:27:19 -04004099 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05004100}
4101
Ben Clayton713b8d32019-12-17 20:37:56 +00004102Float4::Float4(RValue<Float4> rhs)
4103 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004104{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04004105 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05004106}
4107
Ben Clayton713b8d32019-12-17 20:37:56 +00004108Float4::Float4(const Float4 &rhs)
4109 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004110{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04004111 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05004112}
4113
Ben Clayton713b8d32019-12-17 20:37:56 +00004114Float4::Float4(const Reference<Float4> &rhs)
4115 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004116{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04004117 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05004118}
4119
Ben Clayton713b8d32019-12-17 20:37:56 +00004120Float4::Float4(const Float &rhs)
4121 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004122{
4123 *this = RValue<Float>(rhs.loadValue());
4124}
4125
Ben Clayton713b8d32019-12-17 20:37:56 +00004126Float4::Float4(const Reference<Float> &rhs)
4127 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004128{
4129 *this = RValue<Float>(rhs.loadValue());
4130}
4131
Nicolas Capens419b7d72020-10-02 16:15:34 -04004132Float4::Float4(RValue<Float2> lo, RValue<Float2> hi)
4133 : XYZW(this)
4134{
4135 int shuffle[4] = { 0, 1, 4, 5 }; // Real type is v4i32
4136 Value *packed = Nucleus::createShuffleVector(lo.value(), hi.value(), shuffle);
4137
4138 storeValue(packed);
4139}
4140
Nicolas Capens157ba262019-12-10 17:49:14 -05004141RValue<Float4> Float4::operator=(float x)
4142{
4143 return *this = Float4(x, x, x, x);
4144}
4145
4146RValue<Float4> Float4::operator=(RValue<Float4> rhs)
4147{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04004148 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05004149}
4150
4151RValue<Float4> Float4::operator=(const Float4 &rhs)
4152{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04004153 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05004154}
4155
4156RValue<Float4> Float4::operator=(const Reference<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=(RValue<Float> rhs)
4162{
4163 return *this = Float4(rhs);
4164}
4165
4166RValue<Float4> Float4::operator=(const Float &rhs)
4167{
4168 return *this = Float4(rhs);
4169}
4170
4171RValue<Float4> Float4::operator=(const Reference<Float> &rhs)
4172{
4173 return *this = Float4(rhs);
4174}
4175
4176RValue<Float4> operator+(RValue<Float4> lhs, RValue<Float4> rhs)
4177{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004178 return RValue<Float4>(Nucleus::createFAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05004179}
4180
4181RValue<Float4> operator-(RValue<Float4> lhs, RValue<Float4> rhs)
4182{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004183 return RValue<Float4>(Nucleus::createFSub(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::createFMul(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::createFDiv(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05004194}
4195
Nicolas Capens157ba262019-12-10 17:49:14 -05004196RValue<Float4> operator+=(Float4 &lhs, RValue<Float4> rhs)
4197{
4198 return lhs = lhs + rhs;
4199}
4200
4201RValue<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+(RValue<Float4> val)
4222{
4223 return val;
4224}
4225
4226RValue<Float4> operator-(RValue<Float4> val)
4227{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004228 return RValue<Float4>(Nucleus::createFNeg(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05004229}
4230
4231RValue<Float4> Abs(RValue<Float4> x)
4232{
4233 // TODO: Optimize.
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004234 Value *vector = Nucleus::createBitCast(x.value(), Int4::type());
Ben Clayton713b8d32019-12-17 20:37:56 +00004235 int64_t constantVector[4] = { 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF };
Nicolas Capens519cf222020-05-08 15:27:19 -04004236 Value *result = Nucleus::createAnd(vector, Nucleus::createConstantVector(constantVector, Int4::type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05004237
4238 return As<Float4>(result);
4239}
4240
4241RValue<Float4> Insert(RValue<Float4> x, RValue<Float> element, int i)
4242{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004243 return RValue<Float4>(Nucleus::createInsertElement(x.value(), element.value(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05004244}
4245
4246RValue<Float> Extract(RValue<Float4> x, int i)
4247{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004248 return RValue<Float>(Nucleus::createExtractElement(x.value(), Float::type(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05004249}
4250
4251RValue<Float4> Swizzle(RValue<Float4> x, uint16_t select)
4252{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004253 return RValue<Float4>(createSwizzle4(x.value(), select));
Nicolas Capens157ba262019-12-10 17:49:14 -05004254}
4255
4256RValue<Float4> Shuffle(RValue<Float4> x, RValue<Float4> y, uint16_t select)
4257{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004258 return RValue<Float4>(createShuffle4(x.value(), y.value(), select));
Nicolas Capens157ba262019-12-10 17:49:14 -05004259}
4260
4261RValue<Float4> ShuffleLowHigh(RValue<Float4> x, RValue<Float4> y, uint16_t imm)
4262{
Ben Clayton713b8d32019-12-17 20:37:56 +00004263 int shuffle[4] = {
Nicolas Capens157ba262019-12-10 17:49:14 -05004264 ((imm >> 12) & 0x03) + 0,
Ben Clayton713b8d32019-12-17 20:37:56 +00004265 ((imm >> 8) & 0x03) + 0,
4266 ((imm >> 4) & 0x03) + 4,
4267 ((imm >> 0) & 0x03) + 4,
Nicolas Capens157ba262019-12-10 17:49:14 -05004268 };
4269
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004270 return RValue<Float4>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05004271}
4272
4273RValue<Float4> UnpackLow(RValue<Float4> x, RValue<Float4> y)
4274{
Ben Clayton713b8d32019-12-17 20:37:56 +00004275 int shuffle[4] = { 0, 4, 1, 5 };
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004276 return RValue<Float4>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05004277}
4278
4279RValue<Float4> UnpackHigh(RValue<Float4> x, RValue<Float4> y)
4280{
Ben Clayton713b8d32019-12-17 20:37:56 +00004281 int shuffle[4] = { 2, 6, 3, 7 };
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004282 return RValue<Float4>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05004283}
4284
4285RValue<Float4> Mask(Float4 &lhs, RValue<Float4> rhs, uint16_t select)
4286{
4287 Value *vector = lhs.loadValue();
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004288 Value *result = createMask4(vector, rhs.value(), select);
Nicolas Capens157ba262019-12-10 17:49:14 -05004289 lhs.storeValue(result);
4290
4291 return RValue<Float4>(result);
4292}
4293
4294RValue<Int4> IsInf(RValue<Float4> x)
4295{
4296 return CmpEQ(As<Int4>(x) & Int4(0x7FFFFFFF), Int4(0x7F800000));
4297}
4298
4299RValue<Int4> IsNan(RValue<Float4> x)
4300{
4301 return ~CmpEQ(x, x);
4302}
4303
4304RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, int offset)
4305{
4306 return lhs + RValue<Int>(Nucleus::createConstantInt(offset));
4307}
4308
4309RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, RValue<Int> offset)
4310{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004311 return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value(), Byte::type(), offset.value(), false));
Nicolas Capens157ba262019-12-10 17:49:14 -05004312}
4313
4314RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, RValue<UInt> offset)
4315{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004316 return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value(), Byte::type(), offset.value(), true));
Nicolas Capens157ba262019-12-10 17:49:14 -05004317}
4318
4319RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, int offset)
4320{
4321 return lhs = lhs + offset;
4322}
4323
4324RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, RValue<Int> offset)
4325{
4326 return lhs = lhs + offset;
4327}
4328
4329RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, RValue<UInt> offset)
4330{
4331 return lhs = lhs + offset;
4332}
4333
4334RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, int offset)
4335{
4336 return lhs + -offset;
4337}
4338
4339RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, RValue<Int> offset)
4340{
4341 return lhs + -offset;
4342}
4343
4344RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, RValue<UInt> offset)
4345{
4346 return lhs + -offset;
4347}
4348
4349RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, int offset)
4350{
4351 return lhs = lhs - offset;
4352}
4353
4354RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, RValue<Int> offset)
4355{
4356 return lhs = lhs - offset;
4357}
4358
4359RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, RValue<UInt> offset)
4360{
4361 return lhs = lhs - offset;
4362}
4363
4364void Return()
4365{
4366 Nucleus::createRetVoid();
4367 // Place any unreachable instructions in an unreferenced block.
4368 Nucleus::setInsertBlock(Nucleus::createBasicBlock());
4369}
4370
4371void branch(RValue<Bool> cmp, BasicBlock *bodyBB, BasicBlock *endBB)
4372{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004373 Nucleus::createCondBr(cmp.value(), bodyBB, endBB);
Nicolas Capens157ba262019-12-10 17:49:14 -05004374 Nucleus::setInsertBlock(bodyBB);
4375}
4376
4377RValue<Float4> MaskedLoad(RValue<Pointer<Float4>> base, RValue<Int4> mask, unsigned int alignment, bool zeroMaskedLanes /* = false */)
4378{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004379 return RValue<Float4>(Nucleus::createMaskedLoad(base.value(), Float::type(), mask.value(), alignment, zeroMaskedLanes));
Nicolas Capens157ba262019-12-10 17:49:14 -05004380}
4381
4382RValue<Int4> MaskedLoad(RValue<Pointer<Int4>> base, RValue<Int4> mask, unsigned int alignment, bool zeroMaskedLanes /* = false */)
4383{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004384 return RValue<Int4>(Nucleus::createMaskedLoad(base.value(), Int::type(), mask.value(), alignment, zeroMaskedLanes));
Nicolas Capens157ba262019-12-10 17:49:14 -05004385}
4386
4387void MaskedStore(RValue<Pointer<Float4>> base, RValue<Float4> 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 MaskedStore(RValue<Pointer<Int4>> base, RValue<Int4> val, RValue<Int4> mask, unsigned int alignment)
4393{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004394 Nucleus::createMaskedStore(base.value(), val.value(), mask.value(), alignment);
Nicolas Capens157ba262019-12-10 17:49:14 -05004395}
4396
4397void Fence(std::memory_order memoryOrder)
4398{
4399 ASSERT_MSG(memoryOrder == std::memory_order_acquire ||
Ben Clayton713b8d32019-12-17 20:37:56 +00004400 memoryOrder == std::memory_order_release ||
4401 memoryOrder == std::memory_order_acq_rel ||
4402 memoryOrder == std::memory_order_seq_cst,
4403 "Unsupported memoryOrder: %d", int(memoryOrder));
Nicolas Capens157ba262019-12-10 17:49:14 -05004404 Nucleus::createFence(memoryOrder);
4405}
4406
Ben Clayton713b8d32019-12-17 20:37:56 +00004407Bool CToReactor<bool>::cast(bool v)
4408{
4409 return type(v);
4410}
4411Byte CToReactor<uint8_t>::cast(uint8_t v)
4412{
4413 return type(v);
4414}
4415SByte CToReactor<int8_t>::cast(int8_t v)
4416{
4417 return type(v);
4418}
4419Short CToReactor<int16_t>::cast(int16_t v)
4420{
4421 return type(v);
4422}
4423UShort CToReactor<uint16_t>::cast(uint16_t v)
4424{
4425 return type(v);
4426}
4427Int CToReactor<int32_t>::cast(int32_t v)
4428{
4429 return type(v);
4430}
4431UInt CToReactor<uint32_t>::cast(uint32_t v)
4432{
4433 return type(v);
4434}
4435Float CToReactor<float>::cast(float v)
4436{
4437 return type(v);
4438}
4439Float4 CToReactor<float[4]>::cast(float v[4])
4440{
4441 return type(v[0], v[1], v[2], v[3]);
4442}
Nicolas Capens157ba262019-12-10 17:49:14 -05004443
4444// TODO: Long has no constructor that takes a uint64_t
4445// Long CToReactor<uint64_t>::cast(uint64_t v) { return type(v); }
4446
Antonio Maiorano62427e02020-02-13 09:18:05 -05004447#ifdef ENABLE_RR_PRINT
4448static std::string replaceAll(std::string str, const std::string &substr, const std::string &replacement)
4449{
4450 size_t pos = 0;
4451 while((pos = str.find(substr, pos)) != std::string::npos)
4452 {
4453 str.replace(pos, substr.length(), replacement);
4454 pos += replacement.length();
4455 }
4456 return str;
4457}
4458
4459// extractAll returns a vector containing the extracted n scalar value of
4460// the vector vec.
4461// TODO: Move to Reactor.cpp (LLVMReactor can use this too)
4462static std::vector<Value *> extractAll(Value *vec, int n)
4463{
4464 Type *elemTy = Nucleus::getContainedType(Nucleus::getType(vec));
4465 std::vector<Value *> elements;
4466 elements.reserve(n);
4467 for(int i = 0; i < n; i++)
4468 {
4469 auto el = Nucleus::createExtractElement(vec, elemTy, i);
4470 elements.push_back(el);
4471 }
4472 return elements;
4473}
4474
4475// toInt returns all the integer values in vals extended to a printf-required storage value
4476static std::vector<Value *> toInt(const std::vector<Value *> &vals, bool isSigned)
4477{
Nicolas Capens519cf222020-05-08 15:27:19 -04004478 auto storageTy = Nucleus::getPrintfStorageType(Int::type());
Antonio Maiorano62427e02020-02-13 09:18:05 -05004479 std::vector<Value *> elements;
4480 elements.reserve(vals.size());
4481 for(auto v : vals)
4482 {
4483 if(isSigned)
4484 {
4485 elements.push_back(Nucleus::createSExt(v, storageTy));
4486 }
4487 else
4488 {
4489 elements.push_back(Nucleus::createZExt(v, storageTy));
4490 }
4491 }
4492 return elements;
4493}
4494
4495// toFloat returns all the float values in vals extended to extended to a printf-required storage value
4496static std::vector<Value *> toFloat(const std::vector<Value *> &vals)
4497{
Nicolas Capens519cf222020-05-08 15:27:19 -04004498 auto storageTy = Nucleus::getPrintfStorageType(Float::type());
Antonio Maiorano62427e02020-02-13 09:18:05 -05004499 std::vector<Value *> elements;
4500 elements.reserve(vals.size());
4501 for(auto v : vals)
4502 {
4503 elements.push_back(Nucleus::createFPExt(v, storageTy));
4504 }
4505 return elements;
4506}
4507
4508std::vector<Value *> PrintValue::Ty<Bool>::val(const RValue<Bool> &v)
4509{
4510 auto t = Nucleus::createConstantString("true");
4511 auto f = Nucleus::createConstantString("false");
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004512 return { Nucleus::createSelect(v.value(), t, f) };
Antonio Maiorano62427e02020-02-13 09:18:05 -05004513}
4514
4515std::vector<Value *> PrintValue::Ty<Byte>::val(const RValue<Byte> &v)
4516{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004517 return toInt({ v.value() }, false);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004518}
4519
4520std::vector<Value *> PrintValue::Ty<Byte4>::val(const RValue<Byte4> &v)
4521{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004522 return toInt(extractAll(v.value(), 4), false);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004523}
4524
4525std::vector<Value *> PrintValue::Ty<Int>::val(const RValue<Int> &v)
4526{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004527 return toInt({ v.value() }, true);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004528}
4529
4530std::vector<Value *> PrintValue::Ty<Int2>::val(const RValue<Int2> &v)
4531{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004532 return toInt(extractAll(v.value(), 2), true);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004533}
4534
4535std::vector<Value *> PrintValue::Ty<Int4>::val(const RValue<Int4> &v)
4536{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004537 return toInt(extractAll(v.value(), 4), true);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004538}
4539
4540std::vector<Value *> PrintValue::Ty<UInt>::val(const RValue<UInt> &v)
4541{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004542 return toInt({ v.value() }, false);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004543}
4544
4545std::vector<Value *> PrintValue::Ty<UInt2>::val(const RValue<UInt2> &v)
4546{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004547 return toInt(extractAll(v.value(), 2), false);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004548}
4549
4550std::vector<Value *> PrintValue::Ty<UInt4>::val(const RValue<UInt4> &v)
4551{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004552 return toInt(extractAll(v.value(), 4), false);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004553}
4554
4555std::vector<Value *> PrintValue::Ty<Short>::val(const RValue<Short> &v)
4556{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004557 return toInt({ v.value() }, true);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004558}
4559
4560std::vector<Value *> PrintValue::Ty<Short4>::val(const RValue<Short4> &v)
4561{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004562 return toInt(extractAll(v.value(), 4), true);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004563}
4564
4565std::vector<Value *> PrintValue::Ty<UShort>::val(const RValue<UShort> &v)
4566{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004567 return toInt({ v.value() }, false);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004568}
4569
4570std::vector<Value *> PrintValue::Ty<UShort4>::val(const RValue<UShort4> &v)
4571{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004572 return toInt(extractAll(v.value(), 4), false);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004573}
4574
4575std::vector<Value *> PrintValue::Ty<Float>::val(const RValue<Float> &v)
4576{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004577 return toFloat({ v.value() });
Antonio Maiorano62427e02020-02-13 09:18:05 -05004578}
4579
4580std::vector<Value *> PrintValue::Ty<Float4>::val(const RValue<Float4> &v)
4581{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004582 return toFloat(extractAll(v.value(), 4));
Antonio Maiorano62427e02020-02-13 09:18:05 -05004583}
4584
4585std::vector<Value *> PrintValue::Ty<const char *>::val(const char *v)
4586{
4587 return { Nucleus::createConstantString(v) };
4588}
4589
4590void Printv(const char *function, const char *file, int line, const char *fmt, std::initializer_list<PrintValue> args)
4591{
4592 // Build the printf format message string.
4593 std::string str;
4594 if(file != nullptr) { str += (line > 0) ? "%s:%d " : "%s "; }
4595 if(function != nullptr) { str += "%s "; }
4596 str += fmt;
4597
4598 // Perform substitution on all '{n}' bracketed indices in the format
4599 // message.
4600 int i = 0;
4601 for(const PrintValue &arg : args)
4602 {
4603 str = replaceAll(str, "{" + std::to_string(i++) + "}", arg.format);
4604 }
4605
4606 std::vector<Value *> vals;
4607 vals.reserve(8);
4608
4609 // The format message is always the first argument.
4610 vals.push_back(Nucleus::createConstantString(str));
4611
4612 // Add optional file, line and function info if provided.
4613 if(file != nullptr)
4614 {
4615 vals.push_back(Nucleus::createConstantString(file));
4616 if(line > 0)
4617 {
4618 vals.push_back(Nucleus::createConstantInt(line));
4619 }
4620 }
4621 if(function != nullptr)
4622 {
4623 vals.push_back(Nucleus::createConstantString(function));
4624 }
4625
4626 // Add all format arguments.
4627 for(const PrintValue &arg : args)
4628 {
4629 for(auto val : arg.values)
4630 {
4631 vals.push_back(val);
4632 }
4633 }
4634
4635 // This call is implemented by each backend
4636 VPrintf(vals);
4637}
Antonio Maiorano8cbee412020-06-10 15:59:20 -04004638
4639// This is the function that is called by VPrintf from the backends
4640int DebugPrintf(const char *format, ...)
4641{
4642 // Uncomment this to make it so that we do not print, but the call to this function is emitted.
4643 // Useful when debugging emitted code to see the Reactor source location.
4644 //# define RR_PRINT_OUTPUT_TYPE_STUB
4645
4646# if defined(RR_PRINT_OUTPUT_TYPE_STUB)
4647 return 0;
4648# else
4649
4650 int result;
4651 va_list args;
4652
4653 va_start(args, format);
4654 char buffer[2048];
4655 result = vsprintf(buffer, format, args);
4656 va_end(args);
4657
4658 std::fputs(buffer, stdout);
4659# if defined(_WIN32)
4660 OutputDebugString(buffer);
4661# endif
4662
4663 return result;
4664# endif
4665}
4666
Antonio Maiorano62427e02020-02-13 09:18:05 -05004667#endif // ENABLE_RR_PRINT
4668
Antonio Maioranod1561872020-12-14 14:03:53 -05004669// Functions implemented by backends
4670bool HasRcpApprox();
4671RValue<Float4> RcpApprox(RValue<Float4> x, bool exactAtPow2 = false);
4672RValue<Float> RcpApprox(RValue<Float> x, bool exactAtPow2 = false);
4673
4674template<typename T>
4675static RValue<T> DoRcp(RValue<T> x, Precision p, bool finite, bool exactAtPow2)
4676{
4677#if defined(__i386__) || defined(__x86_64__) // On x86, 1/x is fast enough, except for lower precision
4678 bool approx = HasRcpApprox() && (p != Precision::Full);
4679#else
4680 bool approx = HasRcpApprox();
4681#endif
4682
4683 T rcp;
4684
4685 if(approx)
4686 {
4687 rcp = RcpApprox(x, exactAtPow2);
4688
4689 if(p == Precision::Full)
4690 {
4691 // Perform one more iteration of Newton-Rhapson division to increase precision
4692 rcp = (rcp + rcp) - (x * rcp * rcp);
4693 }
4694 }
4695 else
4696 {
4697 rcp = T(1.0f) / x;
4698 }
4699
4700 if(finite)
4701 {
4702 constexpr int big = 0x7F7FFFFF;
4703 rcp = Min(rcp, T((float &)big));
4704 }
4705
4706 return rcp;
4707}
4708
4709RValue<Float4> Rcp(RValue<Float4> x, Precision p, bool finite, bool exactAtPow2)
4710{
4711 RR_DEBUG_INFO_UPDATE_LOC();
4712 return DoRcp(x, p, finite, exactAtPow2);
4713}
4714
4715RValue<Float> Rcp(RValue<Float> x, Precision p, bool finite, bool exactAtPow2)
4716{
4717 RR_DEBUG_INFO_UPDATE_LOC();
4718 return DoRcp(x, p, finite, exactAtPow2);
4719}
4720
Antonio Maiorano1cc5b332020-12-14 16:57:28 -05004721// Functions implemented by backends
4722bool HasRcpSqrtApprox();
4723RValue<Float4> RcpSqrtApprox(RValue<Float4> x);
4724RValue<Float> RcpSqrtApprox(RValue<Float> x);
4725
4726template<typename T>
4727struct CastToIntType;
4728
4729template<>
4730struct CastToIntType<Float4>
4731{
4732 using type = Int4;
4733};
4734
4735template<>
4736struct CastToIntType<Float>
4737{
4738 using type = Int;
4739};
4740
4741// TODO: move to Reactor.hpp?
4742RValue<Int> CmpNEQ(RValue<Int> x, RValue<Int> y)
4743{
4744 return IfThenElse(x != y, Int(~0), Int(0));
4745}
4746
4747template<typename T>
4748static RValue<T> DoRcpSqrt(RValue<T> x, Precision p)
4749{
4750#if defined(__i386__) || defined(__x86_64__) // On x86, 1/x is fast enough, except for lower precision
4751 bool approx = HasRcpApprox() && (p != Precision::Full);
4752#else
4753 bool approx = HasRcpApprox();
4754#endif
4755
4756 if(approx)
4757 {
4758 using IntType = typename CastToIntType<T>::type;
4759
4760 T rsq = RcpSqrtApprox(x);
4761
4762 if(p == Precision::Full)
4763 {
4764 rsq = rsq * (T(3.0f) - rsq * rsq * x) * T(0.5f);
4765 rsq = As<T>(CmpNEQ(As<IntType>(x), IntType(0x7F800000)) & As<IntType>(rsq));
4766 }
4767
4768 return rsq;
4769 }
4770 else
4771 {
4772 return T(1.0f) / Sqrt(x);
4773 }
4774}
4775
4776RValue<Float4> RcpSqrt(RValue<Float4> x, Precision p)
4777{
4778 return DoRcpSqrt(x, p);
4779}
4780
4781RValue<Float> RcpSqrt(RValue<Float> x, Precision p)
4782{
4783 return DoRcpSqrt(x, p);
4784}
4785
Nicolas Capens157ba262019-12-10 17:49:14 -05004786} // namespace rr