blob: 8d2100dd572ebe9ca84ef4adc0fc85078fecb0c2 [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
Sean Risser19e30802022-06-01 10:58:10 -040017#include "Assert.hpp"
Antonio Maioranod1561872020-12-14 14:03:53 -050018#include "CPUID.hpp"
Ben Claytonb16c5862019-05-08 14:01:38 +010019#include "Debug.hpp"
Antonio Maiorano62427e02020-02-13 09:18:05 -050020#include "Print.hpp"
Nicolas Capensb6d4ce32019-03-12 23:00:24 -040021
Antonio Maiorano8cbee412020-06-10 15:59:20 -040022#if defined(_WIN32)
23# ifndef WIN32_LEAN_AND_MEAN
24# define WIN32_LEAN_AND_MEAN
25# endif
26# include <windows.h>
27#endif
28
Nicolas Capens08c62002021-11-17 00:25:05 -050029#include <algorithm>
30#include <cmath>
31
Antonio Maiorano84c61e12020-12-02 12:06:05 -050032// Define REACTOR_MATERIALIZE_LVALUES_ON_DEFINITION to non-zero to ensure all
Nicolas Capens70505b42022-01-31 22:29:48 -050033// variables have a stack location obtained through alloca().
Antonio Maiorano84c61e12020-12-02 12:06:05 -050034#ifndef REACTOR_MATERIALIZE_LVALUES_ON_DEFINITION
35# define REACTOR_MATERIALIZE_LVALUES_ON_DEFINITION 0
36#endif
37
Nicolas Capens157ba262019-12-10 17:49:14 -050038namespace rr {
39
Antonio Maioranof14f6c42020-11-03 16:34:35 -050040thread_local Variable::UnmaterializedVariables *Variable::unmaterializedVariables = nullptr;
41
42void Variable::UnmaterializedVariables::add(const Variable *v)
43{
44 variables.emplace(v, counter++);
45}
46
47void Variable::UnmaterializedVariables::remove(const Variable *v)
48{
49 auto iter = variables.find(v);
50 if(iter != variables.end())
51 {
52 variables.erase(iter);
53 }
54}
55
56void Variable::UnmaterializedVariables::clear()
57{
58 variables.clear();
59}
60
61void Variable::UnmaterializedVariables::materializeAll()
62{
63 // Flatten map of Variable* to monotonically increasing counter to a vector,
64 // then sort it by the counter, so that we materialize in variable usage order.
65 std::vector<std::pair<const Variable *, int>> sorted;
66 sorted.resize(variables.size());
67 std::copy(variables.begin(), variables.end(), sorted.begin());
68 std::sort(sorted.begin(), sorted.end(), [&](auto &lhs, auto &rhs) {
69 return lhs.second < rhs.second;
70 });
71
72 for(auto &v : sorted)
73 {
74 v.first->materialize();
75 }
76
77 variables.clear();
78}
Nicolas Capens157ba262019-12-10 17:49:14 -050079
Antonio Maioranobae138d2020-12-02 14:25:10 -050080Variable::Variable(Type *type, int arraySize)
81 : type(type)
82 , arraySize(arraySize)
Nicolas Capensb6d4ce32019-03-12 23:00:24 -040083{
Antonio Maiorano84c61e12020-12-02 12:06:05 -050084#if REACTOR_MATERIALIZE_LVALUES_ON_DEFINITION
85 materialize();
86#else
Antonio Maioranof14f6c42020-11-03 16:34:35 -050087 unmaterializedVariables->add(this);
Antonio Maiorano84c61e12020-12-02 12:06:05 -050088#endif
Nicolas Capens157ba262019-12-10 17:49:14 -050089}
Ben Clayton55bc37a2019-07-04 12:17:12 +010090
Nicolas Capens157ba262019-12-10 17:49:14 -050091Variable::~Variable()
92{
Nicolas Capens3d26cfc2021-01-22 16:51:00 -050093 // `unmaterializedVariables` can be null at this point due to the function
94 // already having been finalized, while classes derived from `Function<>`
95 // can have member `Variable` fields which are destructed afterwards.
96 if(unmaterializedVariables)
97 {
98 unmaterializedVariables->remove(this);
99 }
Nicolas Capens157ba262019-12-10 17:49:14 -0500100}
Ben Clayton55bc37a2019-07-04 12:17:12 +0100101
Nicolas Capens471c1202020-05-28 09:58:46 -0400102void Variable::materialize() const
103{
104 if(!address)
105 {
Antonio Maiorano84c61e12020-12-02 12:06:05 -0500106 address = Nucleus::allocateStackVariable(getType(), arraySize);
Nicolas Capens471c1202020-05-28 09:58:46 -0400107 RR_DEBUG_INFO_EMIT_VAR(address);
108
109 if(rvalue)
110 {
111 storeValue(rvalue);
112 rvalue = nullptr;
113 }
114 }
115}
116
117Value *Variable::loadValue() const
118{
119 if(rvalue)
120 {
121 return rvalue;
122 }
123
124 if(!address)
125 {
126 // TODO: Return undef instead.
127 materialize();
128 }
129
130 return Nucleus::createLoad(address, getType(), false, 0);
131}
132
133Value *Variable::storeValue(Value *value) const
134{
135 if(address)
136 {
137 return Nucleus::createStore(value, address, getType(), false, 0);
138 }
139
140 rvalue = value;
141
142 return value;
143}
144
145Value *Variable::getBaseAddress() const
146{
147 materialize();
148
149 return address;
150}
151
152Value *Variable::getElementPointer(Value *index, bool unsignedIndex) const
153{
154 return Nucleus::createGEP(getBaseAddress(), getType(), index, unsignedIndex);
155}
156
Nicolas Capens157ba262019-12-10 17:49:14 -0500157void Variable::materializeAll()
158{
Antonio Maioranof14f6c42020-11-03 16:34:35 -0500159 unmaterializedVariables->materializeAll();
Nicolas Capens157ba262019-12-10 17:49:14 -0500160}
Nicolas Capens0192d152019-03-27 14:46:07 -0400161
Nicolas Capens157ba262019-12-10 17:49:14 -0500162void Variable::killUnmaterialized()
163{
Nicolas Capens7d6b5912020-04-28 15:57:57 -0400164 unmaterializedVariables->clear();
Nicolas Capens157ba262019-12-10 17:49:14 -0500165}
Nicolas Capens0192d152019-03-27 14:46:07 -0400166
Nicolas Capens157ba262019-12-10 17:49:14 -0500167// NOTE: Only 12 bits out of 16 of the |select| value are used.
168// More specifically, the value should look like:
169//
170// msb lsb
171// v v
172// [.xxx|.yyy|.zzz|.www] where '.' means an ignored bit
173//
174// This format makes it easy to write calls with hexadecimal select values,
175// since each hex digit is a separate swizzle index.
176//
177// For example:
Nicolas Capensd95467e2020-01-16 01:44:39 -0500178// createShuffle4( [a,b,c,d], [e,f,g,h], 0x0123 ) -> [a,b,c,d]
179// createShuffle4( [a,b,c,d], [e,f,g,h], 0x4567 ) -> [e,f,g,h]
180// createShuffle4( [a,b,c,d], [e,f,g,h], 0x4012 ) -> [e,a,b,c]
Nicolas Capens157ba262019-12-10 17:49:14 -0500181//
Nicolas Capensd95467e2020-01-16 01:44:39 -0500182static Value *createShuffle4(Value *lhs, Value *rhs, uint16_t select)
Nicolas Capens157ba262019-12-10 17:49:14 -0500183{
Nicolas Capens4e7d3102022-06-21 01:42:18 -0400184 std::vector<int> swizzle = {
Nicolas Capens157ba262019-12-10 17:49:14 -0500185 (select >> 12) & 0x07,
Ben Clayton713b8d32019-12-17 20:37:56 +0000186 (select >> 8) & 0x07,
187 (select >> 4) & 0x07,
188 (select >> 0) & 0x07,
Nicolas Capens157ba262019-12-10 17:49:14 -0500189 };
Nicolas Capens0192d152019-03-27 14:46:07 -0400190
Nicolas Capens157ba262019-12-10 17:49:14 -0500191 return Nucleus::createShuffleVector(lhs, rhs, swizzle);
192}
Nicolas Capens0192d152019-03-27 14:46:07 -0400193
Nicolas Capens157ba262019-12-10 17:49:14 -0500194// NOTE: Only 8 bits out of 16 of the |select| value are used.
195// More specifically, the value should look like:
196//
197// msb lsb
198// v v
199// [..xx|..yy|..zz|..ww] where '.' means an ignored bit
200//
201// This format makes it easy to write calls with hexadecimal select values,
202// since each hex digit is a separate swizzle index.
203//
204// For example:
205// createSwizzle4( [a,b,c,d], 0x0123 ) -> [a,b,c,d]
206// createSwizzle4( [a,b,c,d], 0x0033 ) -> [a,a,d,d]
207//
208static Value *createSwizzle4(Value *val, uint16_t select)
209{
Nicolas Capens4e7d3102022-06-21 01:42:18 -0400210 std::vector<int> swizzle = {
Nicolas Capens157ba262019-12-10 17:49:14 -0500211 (select >> 12) & 0x03,
Ben Clayton713b8d32019-12-17 20:37:56 +0000212 (select >> 8) & 0x03,
213 (select >> 4) & 0x03,
214 (select >> 0) & 0x03,
Nicolas Capens157ba262019-12-10 17:49:14 -0500215 };
David 'Digit' Turnerb9f03f42019-12-04 19:32:34 +0100216
Nicolas Capens157ba262019-12-10 17:49:14 -0500217 return Nucleus::createShuffleVector(val, val, swizzle);
218}
David 'Digit' Turnerb9f03f42019-12-04 19:32:34 +0100219
Nicolas Capens157ba262019-12-10 17:49:14 -0500220static Value *createMask4(Value *lhs, Value *rhs, uint16_t select)
221{
Ben Clayton713b8d32019-12-17 20:37:56 +0000222 bool mask[4] = { false, false, false, false };
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400223
Nicolas Capens157ba262019-12-10 17:49:14 -0500224 mask[(select >> 12) & 0x03] = true;
Ben Clayton713b8d32019-12-17 20:37:56 +0000225 mask[(select >> 8) & 0x03] = true;
226 mask[(select >> 4) & 0x03] = true;
227 mask[(select >> 0) & 0x03] = true;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400228
Nicolas Capens4e7d3102022-06-21 01:42:18 -0400229 std::vector<int> swizzle = {
Nicolas Capens157ba262019-12-10 17:49:14 -0500230 mask[0] ? 4 : 0,
231 mask[1] ? 5 : 1,
232 mask[2] ? 6 : 2,
233 mask[3] ? 7 : 3,
234 };
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400235
Nicolas Capens157ba262019-12-10 17:49:14 -0500236 return Nucleus::createShuffleVector(lhs, rhs, swizzle);
237}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400238
Nicolas Capens157ba262019-12-10 17:49:14 -0500239Bool::Bool(Argument<Bool> argument)
240{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400241 store(argument.rvalue());
Nicolas Capens157ba262019-12-10 17:49:14 -0500242}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400243
Nicolas Capens157ba262019-12-10 17:49:14 -0500244Bool::Bool(bool x)
245{
246 storeValue(Nucleus::createConstantBool(x));
247}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400248
Nicolas Capens157ba262019-12-10 17:49:14 -0500249Bool::Bool(RValue<Bool> rhs)
250{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400251 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500252}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400253
Nicolas Capens157ba262019-12-10 17:49:14 -0500254Bool::Bool(const Bool &rhs)
255{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400256 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500257}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400258
Nicolas Capens157ba262019-12-10 17:49:14 -0500259Bool::Bool(const Reference<Bool> &rhs)
260{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400261 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500262}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400263
Nicolas Capens157ba262019-12-10 17:49:14 -0500264RValue<Bool> Bool::operator=(RValue<Bool> rhs)
265{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400266 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500267}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400268
Nicolas Capens157ba262019-12-10 17:49:14 -0500269RValue<Bool> Bool::operator=(const Bool &rhs)
270{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400271 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500272}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400273
Nicolas Capens157ba262019-12-10 17:49:14 -0500274RValue<Bool> Bool::operator=(const Reference<Bool> &rhs)
275{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400276 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500277}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400278
Nicolas Capens157ba262019-12-10 17:49:14 -0500279RValue<Bool> operator!(RValue<Bool> val)
280{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400281 return RValue<Bool>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500282}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400283
Nicolas Capens157ba262019-12-10 17:49:14 -0500284RValue<Bool> operator&&(RValue<Bool> lhs, RValue<Bool> rhs)
285{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400286 return RValue<Bool>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500287}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400288
Nicolas Capens157ba262019-12-10 17:49:14 -0500289RValue<Bool> operator||(RValue<Bool> lhs, RValue<Bool> rhs)
290{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400291 return RValue<Bool>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500292}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400293
Nicolas Capens157ba262019-12-10 17:49:14 -0500294RValue<Bool> operator!=(RValue<Bool> lhs, RValue<Bool> rhs)
295{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400296 return RValue<Bool>(Nucleus::createICmpNE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500297}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400298
Nicolas Capens157ba262019-12-10 17:49:14 -0500299RValue<Bool> operator==(RValue<Bool> lhs, RValue<Bool> rhs)
300{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400301 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500302}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400303
Nicolas Capens157ba262019-12-10 17:49:14 -0500304Byte::Byte(Argument<Byte> argument)
305{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400306 store(argument.rvalue());
Nicolas Capens157ba262019-12-10 17:49:14 -0500307}
Ben Claytonf3b57972019-03-15 09:56:47 +0000308
Nicolas Capens157ba262019-12-10 17:49:14 -0500309Byte::Byte(RValue<Int> cast)
310{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400311 Value *integer = Nucleus::createTrunc(cast.value(), Byte::type());
Ben Claytonf3b57972019-03-15 09:56:47 +0000312
Nicolas Capens157ba262019-12-10 17:49:14 -0500313 storeValue(integer);
314}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400315
Nicolas Capens157ba262019-12-10 17:49:14 -0500316Byte::Byte(RValue<UInt> cast)
317{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400318 Value *integer = Nucleus::createTrunc(cast.value(), Byte::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400319
Nicolas Capens157ba262019-12-10 17:49:14 -0500320 storeValue(integer);
321}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400322
Nicolas Capens157ba262019-12-10 17:49:14 -0500323Byte::Byte(RValue<UShort> cast)
324{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400325 Value *integer = Nucleus::createTrunc(cast.value(), Byte::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400326
Nicolas Capens157ba262019-12-10 17:49:14 -0500327 storeValue(integer);
328}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400329
Nicolas Capens157ba262019-12-10 17:49:14 -0500330Byte::Byte(int x)
331{
332 storeValue(Nucleus::createConstantByte((unsigned char)x));
333}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400334
Nicolas Capens157ba262019-12-10 17:49:14 -0500335Byte::Byte(unsigned char x)
336{
337 storeValue(Nucleus::createConstantByte(x));
338}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400339
Nicolas Capens157ba262019-12-10 17:49:14 -0500340Byte::Byte(RValue<Byte> rhs)
341{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400342 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500343}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400344
Nicolas Capens157ba262019-12-10 17:49:14 -0500345Byte::Byte(const Byte &rhs)
346{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400347 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500348}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400349
Nicolas Capens157ba262019-12-10 17:49:14 -0500350Byte::Byte(const Reference<Byte> &rhs)
351{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400352 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500353}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400354
Nicolas Capens157ba262019-12-10 17:49:14 -0500355RValue<Byte> Byte::operator=(RValue<Byte> rhs)
356{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400357 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500358}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400359
Nicolas Capens157ba262019-12-10 17:49:14 -0500360RValue<Byte> Byte::operator=(const Byte &rhs)
361{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400362 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500363}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400364
Nicolas Capens157ba262019-12-10 17:49:14 -0500365RValue<Byte> Byte::operator=(const Reference<Byte> &rhs)
366{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400367 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500368}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400369
Nicolas Capens157ba262019-12-10 17:49:14 -0500370RValue<Byte> operator+(RValue<Byte> lhs, RValue<Byte> rhs)
371{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400372 return RValue<Byte>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500373}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400374
Nicolas Capens157ba262019-12-10 17:49:14 -0500375RValue<Byte> operator-(RValue<Byte> lhs, RValue<Byte> rhs)
376{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400377 return RValue<Byte>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500378}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400379
Nicolas Capens157ba262019-12-10 17:49:14 -0500380RValue<Byte> operator*(RValue<Byte> lhs, RValue<Byte> rhs)
381{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400382 return RValue<Byte>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500383}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400384
Nicolas Capens157ba262019-12-10 17:49:14 -0500385RValue<Byte> operator/(RValue<Byte> lhs, RValue<Byte> rhs)
386{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400387 return RValue<Byte>(Nucleus::createUDiv(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500388}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400389
Nicolas Capens157ba262019-12-10 17:49:14 -0500390RValue<Byte> operator%(RValue<Byte> lhs, RValue<Byte> rhs)
391{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400392 return RValue<Byte>(Nucleus::createURem(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500393}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400394
Nicolas Capens157ba262019-12-10 17:49:14 -0500395RValue<Byte> operator&(RValue<Byte> lhs, RValue<Byte> rhs)
396{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400397 return RValue<Byte>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500398}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400399
Nicolas Capens157ba262019-12-10 17:49:14 -0500400RValue<Byte> operator|(RValue<Byte> lhs, RValue<Byte> rhs)
401{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400402 return RValue<Byte>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500403}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400404
Nicolas Capens157ba262019-12-10 17:49:14 -0500405RValue<Byte> operator^(RValue<Byte> lhs, RValue<Byte> rhs)
406{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400407 return RValue<Byte>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500408}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400409
Nicolas Capens157ba262019-12-10 17:49:14 -0500410RValue<Byte> operator<<(RValue<Byte> lhs, RValue<Byte> rhs)
411{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400412 return RValue<Byte>(Nucleus::createShl(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500413}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400414
Nicolas Capens157ba262019-12-10 17:49:14 -0500415RValue<Byte> operator>>(RValue<Byte> lhs, RValue<Byte> rhs)
416{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400417 return RValue<Byte>(Nucleus::createLShr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500418}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400419
Nicolas Capens157ba262019-12-10 17:49:14 -0500420RValue<Byte> operator+=(Byte &lhs, RValue<Byte> rhs)
421{
422 return lhs = lhs + rhs;
423}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400424
Nicolas Capens157ba262019-12-10 17:49:14 -0500425RValue<Byte> operator-=(Byte &lhs, RValue<Byte> rhs)
426{
427 return lhs = lhs - rhs;
428}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400429
Nicolas Capens157ba262019-12-10 17:49:14 -0500430RValue<Byte> operator*=(Byte &lhs, RValue<Byte> rhs)
431{
432 return lhs = lhs * rhs;
433}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400434
Nicolas Capens157ba262019-12-10 17:49:14 -0500435RValue<Byte> operator/=(Byte &lhs, RValue<Byte> rhs)
436{
437 return lhs = lhs / rhs;
438}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400439
Nicolas Capens157ba262019-12-10 17:49:14 -0500440RValue<Byte> operator%=(Byte &lhs, RValue<Byte> rhs)
441{
442 return lhs = lhs % rhs;
443}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400444
Nicolas Capens157ba262019-12-10 17:49:14 -0500445RValue<Byte> operator&=(Byte &lhs, RValue<Byte> rhs)
446{
447 return lhs = lhs & rhs;
448}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400449
Nicolas Capens157ba262019-12-10 17:49:14 -0500450RValue<Byte> operator|=(Byte &lhs, RValue<Byte> rhs)
451{
452 return lhs = lhs | rhs;
453}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400454
Nicolas Capens157ba262019-12-10 17:49:14 -0500455RValue<Byte> operator^=(Byte &lhs, RValue<Byte> rhs)
456{
457 return lhs = lhs ^ rhs;
458}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400459
Nicolas Capens157ba262019-12-10 17:49:14 -0500460RValue<Byte> operator<<=(Byte &lhs, RValue<Byte> rhs)
461{
462 return lhs = lhs << rhs;
463}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400464
Nicolas Capens157ba262019-12-10 17:49:14 -0500465RValue<Byte> operator>>=(Byte &lhs, RValue<Byte> rhs)
466{
467 return lhs = lhs >> rhs;
468}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400469
Nicolas Capens157ba262019-12-10 17:49:14 -0500470RValue<Byte> operator+(RValue<Byte> val)
471{
472 return val;
473}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400474
Nicolas Capens157ba262019-12-10 17:49:14 -0500475RValue<Byte> operator-(RValue<Byte> val)
476{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400477 return RValue<Byte>(Nucleus::createNeg(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500478}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400479
Nicolas Capens157ba262019-12-10 17:49:14 -0500480RValue<Byte> operator~(RValue<Byte> val)
481{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400482 return RValue<Byte>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500483}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400484
Ben Clayton713b8d32019-12-17 20:37:56 +0000485RValue<Byte> operator++(Byte &val, int) // Post-increment
Nicolas Capens157ba262019-12-10 17:49:14 -0500486{
487 RValue<Byte> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400488
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400489 Value *inc = Nucleus::createAdd(res.value(), Nucleus::createConstantByte((unsigned char)1));
Nicolas Capens157ba262019-12-10 17:49:14 -0500490 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400491
Nicolas Capens157ba262019-12-10 17:49:14 -0500492 return res;
493}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400494
Ben Clayton713b8d32019-12-17 20:37:56 +0000495const Byte &operator++(Byte &val) // Pre-increment
Nicolas Capens157ba262019-12-10 17:49:14 -0500496{
497 Value *inc = Nucleus::createAdd(val.loadValue(), Nucleus::createConstantByte((unsigned char)1));
498 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400499
Nicolas Capens157ba262019-12-10 17:49:14 -0500500 return val;
501}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400502
Ben Clayton713b8d32019-12-17 20:37:56 +0000503RValue<Byte> operator--(Byte &val, int) // Post-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -0500504{
505 RValue<Byte> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400506
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400507 Value *inc = Nucleus::createSub(res.value(), Nucleus::createConstantByte((unsigned char)1));
Nicolas Capens157ba262019-12-10 17:49:14 -0500508 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400509
Nicolas Capens157ba262019-12-10 17:49:14 -0500510 return res;
511}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400512
Ben Clayton713b8d32019-12-17 20:37:56 +0000513const Byte &operator--(Byte &val) // Pre-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -0500514{
515 Value *inc = Nucleus::createSub(val.loadValue(), Nucleus::createConstantByte((unsigned char)1));
516 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400517
Nicolas Capens157ba262019-12-10 17:49:14 -0500518 return val;
519}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400520
Nicolas Capens157ba262019-12-10 17:49:14 -0500521RValue<Bool> operator<(RValue<Byte> lhs, RValue<Byte> rhs)
522{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400523 return RValue<Bool>(Nucleus::createICmpULT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500524}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400525
Nicolas Capens157ba262019-12-10 17:49:14 -0500526RValue<Bool> operator<=(RValue<Byte> lhs, RValue<Byte> rhs)
527{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400528 return RValue<Bool>(Nucleus::createICmpULE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500529}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400530
Nicolas Capens157ba262019-12-10 17:49:14 -0500531RValue<Bool> operator>(RValue<Byte> lhs, RValue<Byte> rhs)
532{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400533 return RValue<Bool>(Nucleus::createICmpUGT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500534}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400535
Nicolas Capens157ba262019-12-10 17:49:14 -0500536RValue<Bool> operator>=(RValue<Byte> lhs, RValue<Byte> rhs)
537{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400538 return RValue<Bool>(Nucleus::createICmpUGE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500539}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400540
Nicolas Capens157ba262019-12-10 17:49:14 -0500541RValue<Bool> operator!=(RValue<Byte> lhs, RValue<Byte> rhs)
542{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400543 return RValue<Bool>(Nucleus::createICmpNE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500544}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400545
Nicolas Capens157ba262019-12-10 17:49:14 -0500546RValue<Bool> operator==(RValue<Byte> lhs, RValue<Byte> rhs)
547{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400548 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500549}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400550
Nicolas Capens157ba262019-12-10 17:49:14 -0500551SByte::SByte(Argument<SByte> argument)
552{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400553 store(argument.rvalue());
Nicolas Capens157ba262019-12-10 17:49:14 -0500554}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400555
Nicolas Capens157ba262019-12-10 17:49:14 -0500556SByte::SByte(RValue<Int> cast)
557{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400558 Value *integer = Nucleus::createTrunc(cast.value(), SByte::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400559
Nicolas Capens157ba262019-12-10 17:49:14 -0500560 storeValue(integer);
561}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400562
Nicolas Capens157ba262019-12-10 17:49:14 -0500563SByte::SByte(RValue<Short> cast)
564{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400565 Value *integer = Nucleus::createTrunc(cast.value(), SByte::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400566
Nicolas Capens157ba262019-12-10 17:49:14 -0500567 storeValue(integer);
568}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400569
Nicolas Capens157ba262019-12-10 17:49:14 -0500570SByte::SByte(signed char x)
571{
572 storeValue(Nucleus::createConstantByte(x));
573}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400574
Nicolas Capens157ba262019-12-10 17:49:14 -0500575SByte::SByte(RValue<SByte> rhs)
576{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400577 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500578}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400579
Nicolas Capens157ba262019-12-10 17:49:14 -0500580SByte::SByte(const SByte &rhs)
581{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400582 store(rhs.load());
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(const Reference<SByte> &rhs)
586{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400587 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500588}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400589
Nicolas Capens157ba262019-12-10 17:49:14 -0500590RValue<SByte> SByte::operator=(RValue<SByte> rhs)
591{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400592 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500593}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400594
Nicolas Capens157ba262019-12-10 17:49:14 -0500595RValue<SByte> SByte::operator=(const SByte &rhs)
596{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400597 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500598}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400599
Nicolas Capens157ba262019-12-10 17:49:14 -0500600RValue<SByte> SByte::operator=(const Reference<SByte> &rhs)
601{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400602 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500603}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400604
Nicolas Capens157ba262019-12-10 17:49:14 -0500605RValue<SByte> operator+(RValue<SByte> lhs, RValue<SByte> rhs)
606{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400607 return RValue<SByte>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500608}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400609
Nicolas Capens157ba262019-12-10 17:49:14 -0500610RValue<SByte> operator-(RValue<SByte> lhs, RValue<SByte> rhs)
611{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400612 return RValue<SByte>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500613}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400614
Nicolas Capens157ba262019-12-10 17:49:14 -0500615RValue<SByte> operator*(RValue<SByte> lhs, RValue<SByte> rhs)
616{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400617 return RValue<SByte>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500618}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400619
Nicolas Capens157ba262019-12-10 17:49:14 -0500620RValue<SByte> operator/(RValue<SByte> lhs, RValue<SByte> rhs)
621{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400622 return RValue<SByte>(Nucleus::createSDiv(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500623}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400624
Nicolas Capens157ba262019-12-10 17:49:14 -0500625RValue<SByte> operator%(RValue<SByte> lhs, RValue<SByte> rhs)
626{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400627 return RValue<SByte>(Nucleus::createSRem(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500628}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400629
Nicolas Capens157ba262019-12-10 17:49:14 -0500630RValue<SByte> operator&(RValue<SByte> lhs, RValue<SByte> rhs)
631{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400632 return RValue<SByte>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500633}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400634
Nicolas Capens157ba262019-12-10 17:49:14 -0500635RValue<SByte> operator|(RValue<SByte> lhs, RValue<SByte> rhs)
636{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400637 return RValue<SByte>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500638}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400639
Nicolas Capens157ba262019-12-10 17:49:14 -0500640RValue<SByte> operator^(RValue<SByte> lhs, RValue<SByte> rhs)
641{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400642 return RValue<SByte>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500643}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400644
Nicolas Capens157ba262019-12-10 17:49:14 -0500645RValue<SByte> operator<<(RValue<SByte> lhs, RValue<SByte> rhs)
646{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400647 return RValue<SByte>(Nucleus::createShl(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500648}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400649
Nicolas Capens157ba262019-12-10 17:49:14 -0500650RValue<SByte> operator>>(RValue<SByte> lhs, RValue<SByte> rhs)
651{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400652 return RValue<SByte>(Nucleus::createAShr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500653}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400654
Nicolas Capens157ba262019-12-10 17:49:14 -0500655RValue<SByte> operator+=(SByte &lhs, RValue<SByte> rhs)
656{
657 return lhs = lhs + rhs;
658}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400659
Nicolas Capens157ba262019-12-10 17:49:14 -0500660RValue<SByte> operator-=(SByte &lhs, RValue<SByte> rhs)
661{
662 return lhs = lhs - rhs;
663}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400664
Nicolas Capens157ba262019-12-10 17:49:14 -0500665RValue<SByte> operator*=(SByte &lhs, RValue<SByte> rhs)
666{
667 return lhs = lhs * rhs;
668}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400669
Nicolas Capens157ba262019-12-10 17:49:14 -0500670RValue<SByte> operator/=(SByte &lhs, RValue<SByte> rhs)
671{
672 return lhs = lhs / rhs;
673}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400674
Nicolas Capens157ba262019-12-10 17:49:14 -0500675RValue<SByte> operator%=(SByte &lhs, RValue<SByte> rhs)
676{
677 return lhs = lhs % rhs;
678}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400679
Nicolas Capens157ba262019-12-10 17:49:14 -0500680RValue<SByte> operator&=(SByte &lhs, RValue<SByte> rhs)
681{
682 return lhs = lhs & rhs;
683}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400684
Nicolas Capens157ba262019-12-10 17:49:14 -0500685RValue<SByte> operator|=(SByte &lhs, RValue<SByte> rhs)
686{
687 return lhs = lhs | rhs;
688}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400689
Nicolas Capens157ba262019-12-10 17:49:14 -0500690RValue<SByte> operator^=(SByte &lhs, RValue<SByte> rhs)
691{
692 return lhs = lhs ^ rhs;
693}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400694
Nicolas Capens157ba262019-12-10 17:49:14 -0500695RValue<SByte> operator<<=(SByte &lhs, RValue<SByte> rhs)
696{
697 return lhs = lhs << rhs;
698}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400699
Nicolas Capens157ba262019-12-10 17:49:14 -0500700RValue<SByte> operator>>=(SByte &lhs, RValue<SByte> rhs)
701{
702 return lhs = lhs >> rhs;
703}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400704
Nicolas Capens157ba262019-12-10 17:49:14 -0500705RValue<SByte> operator+(RValue<SByte> val)
706{
707 return val;
708}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400709
Nicolas Capens157ba262019-12-10 17:49:14 -0500710RValue<SByte> operator-(RValue<SByte> val)
711{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400712 return RValue<SByte>(Nucleus::createNeg(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500713}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400714
Nicolas Capens157ba262019-12-10 17:49:14 -0500715RValue<SByte> operator~(RValue<SByte> val)
716{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400717 return RValue<SByte>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500718}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400719
Ben Clayton713b8d32019-12-17 20:37:56 +0000720RValue<SByte> operator++(SByte &val, int) // Post-increment
Nicolas Capens157ba262019-12-10 17:49:14 -0500721{
722 RValue<SByte> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400723
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400724 Value *inc = Nucleus::createAdd(res.value(), Nucleus::createConstantByte((signed char)1));
Nicolas Capens157ba262019-12-10 17:49:14 -0500725 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400726
Nicolas Capens157ba262019-12-10 17:49:14 -0500727 return res;
728}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400729
Ben Clayton713b8d32019-12-17 20:37:56 +0000730const SByte &operator++(SByte &val) // Pre-increment
Nicolas Capens157ba262019-12-10 17:49:14 -0500731{
732 Value *inc = Nucleus::createAdd(val.loadValue(), Nucleus::createConstantByte((signed char)1));
733 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400734
Nicolas Capens157ba262019-12-10 17:49:14 -0500735 return val;
736}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400737
Ben Clayton713b8d32019-12-17 20:37:56 +0000738RValue<SByte> operator--(SByte &val, int) // Post-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -0500739{
740 RValue<SByte> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400741
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400742 Value *inc = Nucleus::createSub(res.value(), Nucleus::createConstantByte((signed char)1));
Nicolas Capens157ba262019-12-10 17:49:14 -0500743 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400744
Nicolas Capens157ba262019-12-10 17:49:14 -0500745 return res;
746}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400747
Ben Clayton713b8d32019-12-17 20:37:56 +0000748const SByte &operator--(SByte &val) // Pre-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -0500749{
750 Value *inc = Nucleus::createSub(val.loadValue(), Nucleus::createConstantByte((signed char)1));
751 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400752
Nicolas Capens157ba262019-12-10 17:49:14 -0500753 return val;
754}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400755
Nicolas Capens157ba262019-12-10 17:49:14 -0500756RValue<Bool> operator<(RValue<SByte> lhs, RValue<SByte> rhs)
757{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400758 return RValue<Bool>(Nucleus::createICmpSLT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500759}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400760
Nicolas Capens157ba262019-12-10 17:49:14 -0500761RValue<Bool> operator<=(RValue<SByte> lhs, RValue<SByte> rhs)
762{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400763 return RValue<Bool>(Nucleus::createICmpSLE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500764}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400765
Nicolas Capens157ba262019-12-10 17:49:14 -0500766RValue<Bool> operator>(RValue<SByte> lhs, RValue<SByte> rhs)
767{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400768 return RValue<Bool>(Nucleus::createICmpSGT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500769}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400770
Nicolas Capens157ba262019-12-10 17:49:14 -0500771RValue<Bool> operator>=(RValue<SByte> lhs, RValue<SByte> rhs)
772{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400773 return RValue<Bool>(Nucleus::createICmpSGE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500774}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400775
Nicolas Capens157ba262019-12-10 17:49:14 -0500776RValue<Bool> operator!=(RValue<SByte> lhs, RValue<SByte> rhs)
777{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400778 return RValue<Bool>(Nucleus::createICmpNE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500779}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400780
Nicolas Capens157ba262019-12-10 17:49:14 -0500781RValue<Bool> operator==(RValue<SByte> lhs, RValue<SByte> rhs)
782{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400783 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500784}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400785
Nicolas Capens157ba262019-12-10 17:49:14 -0500786Short::Short(Argument<Short> argument)
787{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400788 store(argument.rvalue());
Nicolas Capens157ba262019-12-10 17:49:14 -0500789}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400790
Nicolas Capens157ba262019-12-10 17:49:14 -0500791Short::Short(RValue<Int> cast)
792{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400793 Value *integer = Nucleus::createTrunc(cast.value(), Short::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400794
Nicolas Capens157ba262019-12-10 17:49:14 -0500795 storeValue(integer);
796}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400797
Nicolas Capens157ba262019-12-10 17:49:14 -0500798Short::Short(short x)
799{
800 storeValue(Nucleus::createConstantShort(x));
801}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400802
Nicolas Capens157ba262019-12-10 17:49:14 -0500803Short::Short(RValue<Short> rhs)
804{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400805 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500806}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400807
Nicolas Capens157ba262019-12-10 17:49:14 -0500808Short::Short(const Short &rhs)
809{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400810 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500811}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400812
Nicolas Capens157ba262019-12-10 17:49:14 -0500813Short::Short(const Reference<Short> &rhs)
814{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400815 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500816}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400817
Nicolas Capens157ba262019-12-10 17:49:14 -0500818RValue<Short> Short::operator=(RValue<Short> rhs)
819{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400820 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500821}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400822
Nicolas Capens157ba262019-12-10 17:49:14 -0500823RValue<Short> Short::operator=(const Short &rhs)
824{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400825 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500826}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400827
Nicolas Capens157ba262019-12-10 17:49:14 -0500828RValue<Short> Short::operator=(const Reference<Short> &rhs)
829{
Nicolas Capensb4e4f112020-05-01 23:06:41 -0400830 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -0500831}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400832
Nicolas Capens157ba262019-12-10 17:49:14 -0500833RValue<Short> operator+(RValue<Short> lhs, RValue<Short> rhs)
834{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400835 return RValue<Short>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500836}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400837
Nicolas Capens157ba262019-12-10 17:49:14 -0500838RValue<Short> operator-(RValue<Short> lhs, RValue<Short> rhs)
839{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400840 return RValue<Short>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500841}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400842
Nicolas Capens157ba262019-12-10 17:49:14 -0500843RValue<Short> operator*(RValue<Short> lhs, RValue<Short> rhs)
844{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400845 return RValue<Short>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500846}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400847
Nicolas Capens157ba262019-12-10 17:49:14 -0500848RValue<Short> operator/(RValue<Short> lhs, RValue<Short> rhs)
849{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400850 return RValue<Short>(Nucleus::createSDiv(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500851}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400852
Nicolas Capens157ba262019-12-10 17:49:14 -0500853RValue<Short> operator%(RValue<Short> lhs, RValue<Short> rhs)
854{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400855 return RValue<Short>(Nucleus::createSRem(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500856}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400857
Nicolas Capens157ba262019-12-10 17:49:14 -0500858RValue<Short> operator&(RValue<Short> lhs, RValue<Short> rhs)
859{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400860 return RValue<Short>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500861}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400862
Nicolas Capens157ba262019-12-10 17:49:14 -0500863RValue<Short> operator|(RValue<Short> lhs, RValue<Short> rhs)
864{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400865 return RValue<Short>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500866}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400867
Nicolas Capens157ba262019-12-10 17:49:14 -0500868RValue<Short> operator^(RValue<Short> lhs, RValue<Short> rhs)
869{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400870 return RValue<Short>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500871}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400872
Nicolas Capens157ba262019-12-10 17:49:14 -0500873RValue<Short> operator<<(RValue<Short> lhs, RValue<Short> rhs)
874{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400875 return RValue<Short>(Nucleus::createShl(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500876}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400877
Nicolas Capens157ba262019-12-10 17:49:14 -0500878RValue<Short> operator>>(RValue<Short> lhs, RValue<Short> rhs)
879{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400880 return RValue<Short>(Nucleus::createAShr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500881}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400882
Nicolas Capens157ba262019-12-10 17:49:14 -0500883RValue<Short> operator+=(Short &lhs, RValue<Short> rhs)
884{
885 return lhs = lhs + rhs;
886}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400887
Nicolas Capens157ba262019-12-10 17:49:14 -0500888RValue<Short> operator-=(Short &lhs, RValue<Short> rhs)
889{
890 return lhs = lhs - rhs;
891}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400892
Nicolas Capens157ba262019-12-10 17:49:14 -0500893RValue<Short> operator*=(Short &lhs, RValue<Short> rhs)
894{
895 return lhs = lhs * rhs;
896}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400897
Nicolas Capens157ba262019-12-10 17:49:14 -0500898RValue<Short> operator/=(Short &lhs, RValue<Short> rhs)
899{
900 return lhs = lhs / rhs;
901}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400902
Nicolas Capens157ba262019-12-10 17:49:14 -0500903RValue<Short> operator%=(Short &lhs, RValue<Short> rhs)
904{
905 return lhs = lhs % rhs;
906}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400907
Nicolas Capens157ba262019-12-10 17:49:14 -0500908RValue<Short> operator&=(Short &lhs, RValue<Short> rhs)
909{
910 return lhs = lhs & rhs;
911}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400912
Nicolas Capens157ba262019-12-10 17:49:14 -0500913RValue<Short> operator|=(Short &lhs, RValue<Short> rhs)
914{
915 return lhs = lhs | rhs;
916}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400917
Nicolas Capens157ba262019-12-10 17:49:14 -0500918RValue<Short> operator^=(Short &lhs, RValue<Short> rhs)
919{
920 return lhs = lhs ^ rhs;
921}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400922
Nicolas Capens157ba262019-12-10 17:49:14 -0500923RValue<Short> operator<<=(Short &lhs, RValue<Short> rhs)
924{
925 return lhs = lhs << rhs;
926}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400927
Nicolas Capens157ba262019-12-10 17:49:14 -0500928RValue<Short> operator>>=(Short &lhs, RValue<Short> rhs)
929{
930 return lhs = lhs >> rhs;
931}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400932
Nicolas Capens157ba262019-12-10 17:49:14 -0500933RValue<Short> operator+(RValue<Short> val)
934{
935 return val;
936}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400937
Nicolas Capens157ba262019-12-10 17:49:14 -0500938RValue<Short> operator-(RValue<Short> val)
939{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400940 return RValue<Short>(Nucleus::createNeg(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500941}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400942
Nicolas Capens157ba262019-12-10 17:49:14 -0500943RValue<Short> operator~(RValue<Short> val)
944{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400945 return RValue<Short>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500946}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400947
Ben Clayton713b8d32019-12-17 20:37:56 +0000948RValue<Short> operator++(Short &val, int) // Post-increment
Nicolas Capens157ba262019-12-10 17:49:14 -0500949{
950 RValue<Short> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400951
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400952 Value *inc = Nucleus::createAdd(res.value(), Nucleus::createConstantShort((short)1));
Nicolas Capens157ba262019-12-10 17:49:14 -0500953 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400954
Nicolas Capens157ba262019-12-10 17:49:14 -0500955 return res;
956}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400957
Ben Clayton713b8d32019-12-17 20:37:56 +0000958const Short &operator++(Short &val) // Pre-increment
Nicolas Capens157ba262019-12-10 17:49:14 -0500959{
960 Value *inc = Nucleus::createAdd(val.loadValue(), Nucleus::createConstantShort((short)1));
961 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400962
Nicolas Capens157ba262019-12-10 17:49:14 -0500963 return val;
964}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400965
Ben Clayton713b8d32019-12-17 20:37:56 +0000966RValue<Short> operator--(Short &val, int) // Post-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -0500967{
968 RValue<Short> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400969
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400970 Value *inc = Nucleus::createSub(res.value(), Nucleus::createConstantShort((short)1));
Nicolas Capens157ba262019-12-10 17:49:14 -0500971 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400972
Nicolas Capens157ba262019-12-10 17:49:14 -0500973 return res;
974}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400975
Ben Clayton713b8d32019-12-17 20:37:56 +0000976const Short &operator--(Short &val) // Pre-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -0500977{
978 Value *inc = Nucleus::createSub(val.loadValue(), Nucleus::createConstantShort((short)1));
979 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400980
Nicolas Capens157ba262019-12-10 17:49:14 -0500981 return val;
982}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400983
Nicolas Capens157ba262019-12-10 17:49:14 -0500984RValue<Bool> operator<(RValue<Short> lhs, RValue<Short> rhs)
985{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400986 return RValue<Bool>(Nucleus::createICmpSLT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500987}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400988
Nicolas Capens157ba262019-12-10 17:49:14 -0500989RValue<Bool> operator<=(RValue<Short> lhs, RValue<Short> rhs)
990{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400991 return RValue<Bool>(Nucleus::createICmpSLE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500992}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400993
Nicolas Capens157ba262019-12-10 17:49:14 -0500994RValue<Bool> operator>(RValue<Short> lhs, RValue<Short> rhs)
995{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -0400996 return RValue<Bool>(Nucleus::createICmpSGT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500997}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400998
Nicolas Capens157ba262019-12-10 17:49:14 -0500999RValue<Bool> operator>=(RValue<Short> lhs, RValue<Short> rhs)
1000{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001001 return RValue<Bool>(Nucleus::createICmpSGE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001002}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001003
Nicolas Capens157ba262019-12-10 17:49:14 -05001004RValue<Bool> operator!=(RValue<Short> lhs, RValue<Short> rhs)
1005{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001006 return RValue<Bool>(Nucleus::createICmpNE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001007}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001008
Nicolas Capens157ba262019-12-10 17:49:14 -05001009RValue<Bool> operator==(RValue<Short> lhs, RValue<Short> rhs)
1010{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001011 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001012}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001013
Nicolas Capens157ba262019-12-10 17:49:14 -05001014UShort::UShort(Argument<UShort> argument)
1015{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001016 store(argument.rvalue());
Nicolas Capens157ba262019-12-10 17:49:14 -05001017}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001018
Nicolas Capens157ba262019-12-10 17:49:14 -05001019UShort::UShort(RValue<UInt> cast)
1020{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001021 Value *integer = Nucleus::createTrunc(cast.value(), UShort::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001022
Nicolas Capens157ba262019-12-10 17:49:14 -05001023 storeValue(integer);
1024}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001025
Nicolas Capens157ba262019-12-10 17:49:14 -05001026UShort::UShort(RValue<Int> cast)
1027{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001028 Value *integer = Nucleus::createTrunc(cast.value(), UShort::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001029
Nicolas Capens157ba262019-12-10 17:49:14 -05001030 storeValue(integer);
1031}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001032
Jason Macnak341ad7e2022-03-16 18:17:57 -07001033UShort::UShort(RValue<Byte> cast)
1034{
1035 Value *integer = Nucleus::createZExt(cast.value(), UShort::type());
1036
1037 storeValue(integer);
1038}
1039
Nicolas Capens157ba262019-12-10 17:49:14 -05001040UShort::UShort(unsigned short x)
1041{
1042 storeValue(Nucleus::createConstantShort(x));
1043}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001044
Nicolas Capens157ba262019-12-10 17:49:14 -05001045UShort::UShort(RValue<UShort> rhs)
1046{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001047 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001048}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001049
Nicolas Capens157ba262019-12-10 17:49:14 -05001050UShort::UShort(const UShort &rhs)
1051{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001052 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001053}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001054
Nicolas Capens157ba262019-12-10 17:49:14 -05001055UShort::UShort(const Reference<UShort> &rhs)
1056{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001057 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001058}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001059
Nicolas Capens157ba262019-12-10 17:49:14 -05001060RValue<UShort> UShort::operator=(RValue<UShort> rhs)
1061{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001062 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001063}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001064
Nicolas Capens157ba262019-12-10 17:49:14 -05001065RValue<UShort> UShort::operator=(const UShort &rhs)
1066{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001067 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001068}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001069
Nicolas Capens157ba262019-12-10 17:49:14 -05001070RValue<UShort> UShort::operator=(const Reference<UShort> &rhs)
1071{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001072 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001073}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001074
Nicolas Capens157ba262019-12-10 17:49:14 -05001075RValue<UShort> operator+(RValue<UShort> lhs, RValue<UShort> rhs)
1076{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001077 return RValue<UShort>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001078}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001079
Nicolas Capens157ba262019-12-10 17:49:14 -05001080RValue<UShort> operator-(RValue<UShort> lhs, RValue<UShort> rhs)
1081{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001082 return RValue<UShort>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001083}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001084
Nicolas Capens157ba262019-12-10 17:49:14 -05001085RValue<UShort> operator*(RValue<UShort> lhs, RValue<UShort> rhs)
1086{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001087 return RValue<UShort>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001088}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001089
Nicolas Capens157ba262019-12-10 17:49:14 -05001090RValue<UShort> operator/(RValue<UShort> lhs, RValue<UShort> rhs)
1091{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001092 return RValue<UShort>(Nucleus::createUDiv(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001093}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001094
Nicolas Capens157ba262019-12-10 17:49:14 -05001095RValue<UShort> operator%(RValue<UShort> lhs, RValue<UShort> rhs)
1096{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001097 return RValue<UShort>(Nucleus::createURem(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001098}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001099
Nicolas Capens157ba262019-12-10 17:49:14 -05001100RValue<UShort> operator&(RValue<UShort> lhs, RValue<UShort> rhs)
1101{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001102 return RValue<UShort>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001103}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001104
Nicolas Capens157ba262019-12-10 17:49:14 -05001105RValue<UShort> operator|(RValue<UShort> lhs, RValue<UShort> rhs)
1106{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001107 return RValue<UShort>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001108}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001109
Nicolas Capens157ba262019-12-10 17:49:14 -05001110RValue<UShort> operator^(RValue<UShort> lhs, RValue<UShort> rhs)
1111{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001112 return RValue<UShort>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001113}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001114
Nicolas Capens157ba262019-12-10 17:49:14 -05001115RValue<UShort> operator<<(RValue<UShort> lhs, RValue<UShort> rhs)
1116{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001117 return RValue<UShort>(Nucleus::createShl(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001118}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001119
Nicolas Capens157ba262019-12-10 17:49:14 -05001120RValue<UShort> operator>>(RValue<UShort> lhs, RValue<UShort> rhs)
1121{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001122 return RValue<UShort>(Nucleus::createLShr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001123}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001124
Nicolas Capens157ba262019-12-10 17:49:14 -05001125RValue<UShort> operator+=(UShort &lhs, RValue<UShort> rhs)
1126{
1127 return lhs = lhs + rhs;
1128}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001129
Nicolas Capens157ba262019-12-10 17:49:14 -05001130RValue<UShort> operator-=(UShort &lhs, RValue<UShort> rhs)
1131{
1132 return lhs = lhs - rhs;
1133}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001134
Nicolas Capens157ba262019-12-10 17:49:14 -05001135RValue<UShort> operator*=(UShort &lhs, RValue<UShort> rhs)
1136{
1137 return lhs = lhs * rhs;
1138}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001139
Nicolas Capens157ba262019-12-10 17:49:14 -05001140RValue<UShort> operator/=(UShort &lhs, RValue<UShort> rhs)
1141{
1142 return lhs = lhs / rhs;
1143}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001144
Nicolas Capens157ba262019-12-10 17:49:14 -05001145RValue<UShort> operator%=(UShort &lhs, RValue<UShort> rhs)
1146{
1147 return lhs = lhs % rhs;
1148}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001149
Nicolas Capens157ba262019-12-10 17:49:14 -05001150RValue<UShort> operator&=(UShort &lhs, RValue<UShort> rhs)
1151{
1152 return lhs = lhs & rhs;
1153}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001154
Nicolas Capens157ba262019-12-10 17:49:14 -05001155RValue<UShort> operator|=(UShort &lhs, RValue<UShort> rhs)
1156{
1157 return lhs = lhs | rhs;
1158}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001159
Nicolas Capens157ba262019-12-10 17:49:14 -05001160RValue<UShort> operator^=(UShort &lhs, RValue<UShort> rhs)
1161{
1162 return lhs = lhs ^ rhs;
1163}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001164
Nicolas Capens157ba262019-12-10 17:49:14 -05001165RValue<UShort> operator<<=(UShort &lhs, RValue<UShort> rhs)
1166{
1167 return lhs = lhs << rhs;
1168}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001169
Nicolas Capens157ba262019-12-10 17:49:14 -05001170RValue<UShort> operator>>=(UShort &lhs, RValue<UShort> rhs)
1171{
1172 return lhs = lhs >> rhs;
1173}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001174
Nicolas Capens157ba262019-12-10 17:49:14 -05001175RValue<UShort> operator+(RValue<UShort> val)
1176{
1177 return val;
1178}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001179
Nicolas Capens157ba262019-12-10 17:49:14 -05001180RValue<UShort> operator-(RValue<UShort> val)
1181{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001182 return RValue<UShort>(Nucleus::createNeg(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001183}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001184
Nicolas Capens157ba262019-12-10 17:49:14 -05001185RValue<UShort> operator~(RValue<UShort> val)
1186{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001187 return RValue<UShort>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001188}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001189
Ben Clayton713b8d32019-12-17 20:37:56 +00001190RValue<UShort> operator++(UShort &val, int) // Post-increment
Nicolas Capens157ba262019-12-10 17:49:14 -05001191{
1192 RValue<UShort> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001193
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001194 Value *inc = Nucleus::createAdd(res.value(), Nucleus::createConstantShort((unsigned short)1));
Nicolas Capens157ba262019-12-10 17:49:14 -05001195 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001196
Nicolas Capens157ba262019-12-10 17:49:14 -05001197 return res;
1198}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001199
Ben Clayton713b8d32019-12-17 20:37:56 +00001200const UShort &operator++(UShort &val) // Pre-increment
Nicolas Capens157ba262019-12-10 17:49:14 -05001201{
1202 Value *inc = Nucleus::createAdd(val.loadValue(), Nucleus::createConstantShort((unsigned short)1));
1203 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001204
Nicolas Capens157ba262019-12-10 17:49:14 -05001205 return val;
1206}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001207
Ben Clayton713b8d32019-12-17 20:37:56 +00001208RValue<UShort> operator--(UShort &val, int) // Post-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -05001209{
1210 RValue<UShort> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001211
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001212 Value *inc = Nucleus::createSub(res.value(), Nucleus::createConstantShort((unsigned short)1));
Nicolas Capens157ba262019-12-10 17:49:14 -05001213 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001214
Nicolas Capens157ba262019-12-10 17:49:14 -05001215 return res;
1216}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001217
Ben Clayton713b8d32019-12-17 20:37:56 +00001218const UShort &operator--(UShort &val) // Pre-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -05001219{
1220 Value *inc = Nucleus::createSub(val.loadValue(), Nucleus::createConstantShort((unsigned short)1));
1221 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001222
Nicolas Capens157ba262019-12-10 17:49:14 -05001223 return val;
1224}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001225
Nicolas Capens157ba262019-12-10 17:49:14 -05001226RValue<Bool> operator<(RValue<UShort> lhs, RValue<UShort> rhs)
1227{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001228 return RValue<Bool>(Nucleus::createICmpULT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001229}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001230
Nicolas Capens157ba262019-12-10 17:49:14 -05001231RValue<Bool> operator<=(RValue<UShort> lhs, RValue<UShort> rhs)
1232{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001233 return RValue<Bool>(Nucleus::createICmpULE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001234}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001235
Nicolas Capens157ba262019-12-10 17:49:14 -05001236RValue<Bool> operator>(RValue<UShort> lhs, RValue<UShort> rhs)
1237{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001238 return RValue<Bool>(Nucleus::createICmpUGT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001239}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001240
Nicolas Capens157ba262019-12-10 17:49:14 -05001241RValue<Bool> operator>=(RValue<UShort> lhs, RValue<UShort> rhs)
1242{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001243 return RValue<Bool>(Nucleus::createICmpUGE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001244}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001245
Nicolas Capens157ba262019-12-10 17:49:14 -05001246RValue<Bool> operator!=(RValue<UShort> lhs, RValue<UShort> rhs)
1247{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001248 return RValue<Bool>(Nucleus::createICmpNE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001249}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001250
Nicolas Capens157ba262019-12-10 17:49:14 -05001251RValue<Bool> operator==(RValue<UShort> lhs, RValue<UShort> rhs)
1252{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001253 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001254}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001255
Nicolas Capens157ba262019-12-10 17:49:14 -05001256Byte4::Byte4(RValue<Byte8> cast)
1257{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001258 storeValue(Nucleus::createBitCast(cast.value(), type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001259}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001260
Nicolas Capens133b87d2020-01-25 16:26:28 -05001261Byte4::Byte4(RValue<UShort4> cast)
1262{
1263 // TODO(b/148379603): Optimize narrowing swizzle.
1264 *this = As<Byte4>(Swizzle(As<Byte8>(cast), 0x0246'0246));
1265}
1266
1267Byte4::Byte4(RValue<Short4> cast)
1268{
1269 // TODO(b/148379603): Optimize narrowing swizzle.
1270 *this = As<Byte4>(Swizzle(As<Byte8>(cast), 0x0246'0246));
1271}
1272
1273Byte4::Byte4(RValue<UInt4> cast)
1274{
1275 // TODO(b/148379603): Optimize narrowing swizzle.
1276 *this = As<Byte4>(Swizzle(As<Byte16>(cast), 0x048C'048C'048C'048C));
1277}
1278
1279Byte4::Byte4(RValue<Int4> cast)
1280{
1281 // TODO(b/148379603): Optimize narrowing swizzle.
1282 *this = As<Byte4>(Swizzle(As<Byte16>(cast), 0x048C'048C'048C'048C));
1283}
1284
1285Byte4::Byte4(RValue<Byte4> rhs)
1286{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001287 store(rhs);
Nicolas Capens133b87d2020-01-25 16:26:28 -05001288}
1289
1290Byte4::Byte4(const Byte4 &rhs)
1291{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001292 store(rhs.load());
Nicolas Capens133b87d2020-01-25 16:26:28 -05001293}
1294
Nicolas Capens157ba262019-12-10 17:49:14 -05001295Byte4::Byte4(const Reference<Byte4> &rhs)
1296{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001297 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001298}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001299
Nicolas Capens133b87d2020-01-25 16:26:28 -05001300RValue<Byte4> Byte4::operator=(RValue<Byte4> rhs)
1301{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001302 return store(rhs);
Nicolas Capens133b87d2020-01-25 16:26:28 -05001303}
1304
1305RValue<Byte4> Byte4::operator=(const Byte4 &rhs)
1306{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001307 return store(rhs.load());
Nicolas Capens133b87d2020-01-25 16:26:28 -05001308}
1309
Jason Macnak341ad7e2022-03-16 18:17:57 -07001310RValue<Byte4> Insert(RValue<Byte4> val, RValue<Byte> element, int i)
1311{
1312 return RValue<Byte4>(Nucleus::createInsertElement(val.value(), element.value(), i));
1313}
1314
Nicolas Capens157ba262019-12-10 17:49:14 -05001315Byte8::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)
1316{
Nicolas Capens4e7d3102022-06-21 01:42:18 -04001317 std::vector<int64_t> constantVector = { x0, x1, x2, x3, x4, x5, x6, x7 };
Nicolas Capens519cf222020-05-08 15:27:19 -04001318 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001319}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001320
Nicolas Capens157ba262019-12-10 17:49:14 -05001321Byte8::Byte8(RValue<Byte8> rhs)
1322{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001323 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001324}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001325
Nicolas Capens157ba262019-12-10 17:49:14 -05001326Byte8::Byte8(const Byte8 &rhs)
1327{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001328 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001329}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001330
Nicolas Capens157ba262019-12-10 17:49:14 -05001331Byte8::Byte8(const Reference<Byte8> &rhs)
1332{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001333 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001334}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001335
Nicolas Capens157ba262019-12-10 17:49:14 -05001336RValue<Byte8> Byte8::operator=(RValue<Byte8> rhs)
1337{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001338 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001339}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001340
Nicolas Capens157ba262019-12-10 17:49:14 -05001341RValue<Byte8> Byte8::operator=(const Byte8 &rhs)
1342{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001343 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001344}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001345
Nicolas Capens157ba262019-12-10 17:49:14 -05001346RValue<Byte8> Byte8::operator=(const Reference<Byte8> &rhs)
1347{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001348 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001349}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001350
Nicolas Capens157ba262019-12-10 17:49:14 -05001351RValue<Byte8> operator+(RValue<Byte8> lhs, RValue<Byte8> rhs)
1352{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001353 return RValue<Byte8>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001354}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001355
Nicolas Capens157ba262019-12-10 17:49:14 -05001356RValue<Byte8> operator-(RValue<Byte8> lhs, RValue<Byte8> rhs)
1357{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001358 return RValue<Byte8>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001359}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001360
1361// RValue<Byte8> operator*(RValue<Byte8> lhs, RValue<Byte8> rhs)
1362// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001363// return RValue<Byte8>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001364// }
1365
1366// RValue<Byte8> operator/(RValue<Byte8> lhs, RValue<Byte8> rhs)
1367// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001368// return RValue<Byte8>(Nucleus::createUDiv(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001369// }
1370
1371// RValue<Byte8> operator%(RValue<Byte8> lhs, RValue<Byte8> rhs)
1372// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001373// return RValue<Byte8>(Nucleus::createURem(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001374// }
1375
Nicolas Capens157ba262019-12-10 17:49:14 -05001376RValue<Byte8> operator&(RValue<Byte8> lhs, RValue<Byte8> rhs)
1377{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001378 return RValue<Byte8>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001379}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001380
Nicolas Capens157ba262019-12-10 17:49:14 -05001381RValue<Byte8> operator|(RValue<Byte8> lhs, RValue<Byte8> rhs)
1382{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001383 return RValue<Byte8>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001384}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001385
Nicolas Capens157ba262019-12-10 17:49:14 -05001386RValue<Byte8> operator^(RValue<Byte8> lhs, RValue<Byte8> rhs)
1387{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001388 return RValue<Byte8>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001389}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001390
1391// RValue<Byte8> operator<<(RValue<Byte8> lhs, unsigned char rhs)
1392// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001393// return RValue<Byte8>(Nucleus::createShl(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001394// }
1395
1396// RValue<Byte8> operator>>(RValue<Byte8> lhs, unsigned char rhs)
1397// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001398// return RValue<Byte8>(Nucleus::createLShr(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001399// }
1400
Nicolas Capens157ba262019-12-10 17:49:14 -05001401RValue<Byte8> operator+=(Byte8 &lhs, RValue<Byte8> rhs)
1402{
1403 return lhs = lhs + rhs;
1404}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001405
Nicolas Capens157ba262019-12-10 17:49:14 -05001406RValue<Byte8> operator-=(Byte8 &lhs, RValue<Byte8> rhs)
1407{
1408 return lhs = lhs - rhs;
1409}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001410
1411// RValue<Byte8> operator*=(Byte8 &lhs, RValue<Byte8> rhs)
1412// {
1413// return lhs = lhs * rhs;
1414// }
1415
1416// RValue<Byte8> operator/=(Byte8 &lhs, RValue<Byte8> rhs)
1417// {
1418// return lhs = lhs / rhs;
1419// }
1420
1421// RValue<Byte8> operator%=(Byte8 &lhs, RValue<Byte8> rhs)
1422// {
1423// return lhs = lhs % rhs;
1424// }
1425
Nicolas Capens157ba262019-12-10 17:49:14 -05001426RValue<Byte8> operator&=(Byte8 &lhs, RValue<Byte8> rhs)
1427{
1428 return lhs = lhs & rhs;
1429}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001430
Nicolas Capens157ba262019-12-10 17:49:14 -05001431RValue<Byte8> operator|=(Byte8 &lhs, RValue<Byte8> rhs)
1432{
1433 return lhs = lhs | rhs;
1434}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001435
Nicolas Capens157ba262019-12-10 17:49:14 -05001436RValue<Byte8> operator^=(Byte8 &lhs, RValue<Byte8> rhs)
1437{
1438 return lhs = lhs ^ rhs;
1439}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001440
1441// RValue<Byte8> operator<<=(Byte8 &lhs, RValue<Byte8> rhs)
1442// {
1443// return lhs = lhs << rhs;
1444// }
1445
1446// RValue<Byte8> operator>>=(Byte8 &lhs, RValue<Byte8> rhs)
1447// {
1448// return lhs = lhs >> rhs;
1449// }
1450
1451// RValue<Byte8> operator+(RValue<Byte8> val)
1452// {
1453// return val;
1454// }
1455
1456// RValue<Byte8> operator-(RValue<Byte8> val)
1457// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001458// return RValue<Byte8>(Nucleus::createNeg(val.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001459// }
1460
Nicolas Capens157ba262019-12-10 17:49:14 -05001461RValue<Byte8> operator~(RValue<Byte8> val)
1462{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001463 return RValue<Byte8>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001464}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001465
Nicolas Capens133b87d2020-01-25 16:26:28 -05001466RValue<Byte8> Swizzle(RValue<Byte8> x, uint32_t select)
1467{
1468 // Real type is v16i8
1469 // TODO(b/148379603): Optimize narrowing swizzle.
Nicolas Capens4e7d3102022-06-21 01:42:18 -04001470 std::vector<int> shuffle = {
Nicolas Capens133b87d2020-01-25 16:26:28 -05001471 static_cast<int>((select >> 28) & 0x07),
1472 static_cast<int>((select >> 24) & 0x07),
1473 static_cast<int>((select >> 20) & 0x07),
1474 static_cast<int>((select >> 16) & 0x07),
1475 static_cast<int>((select >> 12) & 0x07),
1476 static_cast<int>((select >> 8) & 0x07),
1477 static_cast<int>((select >> 4) & 0x07),
1478 static_cast<int>((select >> 0) & 0x07),
1479 static_cast<int>((select >> 28) & 0x07),
1480 static_cast<int>((select >> 24) & 0x07),
1481 static_cast<int>((select >> 20) & 0x07),
1482 static_cast<int>((select >> 16) & 0x07),
1483 static_cast<int>((select >> 12) & 0x07),
1484 static_cast<int>((select >> 8) & 0x07),
1485 static_cast<int>((select >> 4) & 0x07),
1486 static_cast<int>((select >> 0) & 0x07),
1487 };
1488
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001489 return As<Byte8>(Nucleus::createShuffleVector(x.value(), x.value(), shuffle));
Nicolas Capens133b87d2020-01-25 16:26:28 -05001490}
1491
Nicolas Capens157ba262019-12-10 17:49:14 -05001492RValue<Short4> Unpack(RValue<Byte4> x)
1493{
Nicolas Capens133b87d2020-01-25 16:26:28 -05001494 // TODO(b/148379603): Optimize narrowing swizzle.
Nicolas Capens4e7d3102022-06-21 01:42:18 -04001495 std::vector<int> shuffle = { 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 -04001496 return As<Short4>(Nucleus::createShuffleVector(x.value(), x.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05001497}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001498
Nicolas Capens157ba262019-12-10 17:49:14 -05001499RValue<Short4> Unpack(RValue<Byte4> x, RValue<Byte4> y)
1500{
1501 return UnpackLow(As<Byte8>(x), As<Byte8>(y));
1502}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001503
Nicolas Capens157ba262019-12-10 17:49:14 -05001504RValue<Short4> UnpackLow(RValue<Byte8> x, RValue<Byte8> y)
1505{
Nicolas Capens133b87d2020-01-25 16:26:28 -05001506 // TODO(b/148379603): Optimize narrowing swizzle.
Nicolas Capens4e7d3102022-06-21 01:42:18 -04001507 std::vector<int> shuffle = { 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 -04001508 return As<Short4>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05001509}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001510
Nicolas Capens157ba262019-12-10 17:49:14 -05001511RValue<Short4> UnpackHigh(RValue<Byte8> x, RValue<Byte8> y)
1512{
Nicolas Capens133b87d2020-01-25 16:26:28 -05001513 // TODO(b/148379603): Optimize narrowing swizzle.
Nicolas Capens4e7d3102022-06-21 01:42:18 -04001514 std::vector<int> shuffle = { 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 -04001515 auto lowHigh = RValue<Byte16>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05001516 return As<Short4>(Swizzle(As<Int4>(lowHigh), 0x2323));
1517}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001518
Nicolas Capens157ba262019-12-10 17:49:14 -05001519SByte8::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)
1520{
Nicolas Capens4e7d3102022-06-21 01:42:18 -04001521 std::vector<int64_t> constantVector = { x0, x1, x2, x3, x4, x5, x6, x7 };
Nicolas Capens519cf222020-05-08 15:27:19 -04001522 Value *vector = Nucleus::createConstantVector(constantVector, type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001523
Nicolas Capens519cf222020-05-08 15:27:19 -04001524 storeValue(Nucleus::createBitCast(vector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001525}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001526
Nicolas Capens157ba262019-12-10 17:49:14 -05001527SByte8::SByte8(RValue<SByte8> rhs)
1528{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001529 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001530}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001531
Nicolas Capens157ba262019-12-10 17:49:14 -05001532SByte8::SByte8(const SByte8 &rhs)
1533{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001534 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001535}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001536
Nicolas Capens157ba262019-12-10 17:49:14 -05001537SByte8::SByte8(const Reference<SByte8> &rhs)
1538{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001539 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001540}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001541
Nicolas Capens157ba262019-12-10 17:49:14 -05001542RValue<SByte8> SByte8::operator=(RValue<SByte8> rhs)
1543{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001544 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001545}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001546
Nicolas Capens157ba262019-12-10 17:49:14 -05001547RValue<SByte8> SByte8::operator=(const SByte8 &rhs)
1548{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001549 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001550}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001551
Nicolas Capens157ba262019-12-10 17:49:14 -05001552RValue<SByte8> SByte8::operator=(const Reference<SByte8> &rhs)
1553{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001554 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001555}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001556
Nicolas Capens157ba262019-12-10 17:49:14 -05001557RValue<SByte8> operator+(RValue<SByte8> lhs, RValue<SByte8> rhs)
1558{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001559 return RValue<SByte8>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001560}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001561
Nicolas Capens157ba262019-12-10 17:49:14 -05001562RValue<SByte8> operator-(RValue<SByte8> lhs, RValue<SByte8> rhs)
1563{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001564 return RValue<SByte8>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001565}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001566
1567// RValue<SByte8> operator*(RValue<SByte8> lhs, RValue<SByte8> rhs)
1568// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001569// return RValue<SByte8>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001570// }
1571
1572// RValue<SByte8> operator/(RValue<SByte8> lhs, RValue<SByte8> rhs)
1573// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001574// return RValue<SByte8>(Nucleus::createSDiv(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001575// }
1576
1577// RValue<SByte8> operator%(RValue<SByte8> lhs, RValue<SByte8> rhs)
1578// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001579// return RValue<SByte8>(Nucleus::createSRem(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001580// }
1581
Nicolas Capens157ba262019-12-10 17:49:14 -05001582RValue<SByte8> operator&(RValue<SByte8> lhs, RValue<SByte8> rhs)
1583{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001584 return RValue<SByte8>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001585}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001586
Nicolas Capens157ba262019-12-10 17:49:14 -05001587RValue<SByte8> operator|(RValue<SByte8> lhs, RValue<SByte8> rhs)
1588{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001589 return RValue<SByte8>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001590}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001591
Nicolas Capens157ba262019-12-10 17:49:14 -05001592RValue<SByte8> operator^(RValue<SByte8> lhs, RValue<SByte8> rhs)
1593{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001594 return RValue<SByte8>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001595}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001596
1597// RValue<SByte8> operator<<(RValue<SByte8> lhs, unsigned char rhs)
1598// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001599// return RValue<SByte8>(Nucleus::createShl(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001600// }
1601
1602// RValue<SByte8> operator>>(RValue<SByte8> lhs, unsigned char rhs)
1603// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001604// return RValue<SByte8>(Nucleus::createAShr(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001605// }
1606
Nicolas Capens157ba262019-12-10 17:49:14 -05001607RValue<SByte8> operator+=(SByte8 &lhs, RValue<SByte8> rhs)
1608{
1609 return lhs = lhs + rhs;
1610}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001611
Nicolas Capens157ba262019-12-10 17:49:14 -05001612RValue<SByte8> operator-=(SByte8 &lhs, RValue<SByte8> rhs)
1613{
1614 return lhs = lhs - rhs;
1615}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001616
1617// RValue<SByte8> operator*=(SByte8 &lhs, RValue<SByte8> rhs)
1618// {
1619// return lhs = lhs * rhs;
1620// }
1621
1622// RValue<SByte8> operator/=(SByte8 &lhs, RValue<SByte8> rhs)
1623// {
1624// return lhs = lhs / rhs;
1625// }
1626
1627// RValue<SByte8> operator%=(SByte8 &lhs, RValue<SByte8> rhs)
1628// {
1629// return lhs = lhs % rhs;
1630// }
1631
Nicolas Capens157ba262019-12-10 17:49:14 -05001632RValue<SByte8> operator&=(SByte8 &lhs, RValue<SByte8> rhs)
1633{
1634 return lhs = lhs & rhs;
1635}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001636
Nicolas Capens157ba262019-12-10 17:49:14 -05001637RValue<SByte8> operator|=(SByte8 &lhs, RValue<SByte8> rhs)
1638{
1639 return lhs = lhs | rhs;
1640}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001641
Nicolas Capens157ba262019-12-10 17:49:14 -05001642RValue<SByte8> operator^=(SByte8 &lhs, RValue<SByte8> rhs)
1643{
1644 return lhs = lhs ^ rhs;
1645}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001646
1647// RValue<SByte8> operator<<=(SByte8 &lhs, RValue<SByte8> rhs)
1648// {
1649// return lhs = lhs << rhs;
1650// }
1651
1652// RValue<SByte8> operator>>=(SByte8 &lhs, RValue<SByte8> rhs)
1653// {
1654// return lhs = lhs >> rhs;
1655// }
1656
1657// RValue<SByte8> operator+(RValue<SByte8> val)
1658// {
1659// return val;
1660// }
1661
1662// RValue<SByte8> operator-(RValue<SByte8> val)
1663// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001664// return RValue<SByte8>(Nucleus::createNeg(val.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001665// }
1666
Nicolas Capens157ba262019-12-10 17:49:14 -05001667RValue<SByte8> operator~(RValue<SByte8> val)
1668{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001669 return RValue<SByte8>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001670}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001671
Nicolas Capens157ba262019-12-10 17:49:14 -05001672RValue<Short4> UnpackLow(RValue<SByte8> x, RValue<SByte8> y)
1673{
Nicolas Capens133b87d2020-01-25 16:26:28 -05001674 // TODO(b/148379603): Optimize narrowing swizzle.
Nicolas Capens4e7d3102022-06-21 01:42:18 -04001675 std::vector<int> shuffle = { 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 -04001676 return As<Short4>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05001677}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001678
Nicolas Capens157ba262019-12-10 17:49:14 -05001679RValue<Short4> UnpackHigh(RValue<SByte8> x, RValue<SByte8> y)
1680{
Nicolas Capens133b87d2020-01-25 16:26:28 -05001681 // TODO(b/148379603): Optimize narrowing swizzle.
Nicolas Capens4e7d3102022-06-21 01:42:18 -04001682 std::vector<int> shuffle = { 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 -04001683 auto lowHigh = RValue<Byte16>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05001684 return As<Short4>(Swizzle(As<Int4>(lowHigh), 0x2323));
1685}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001686
Nicolas Capens157ba262019-12-10 17:49:14 -05001687Byte16::Byte16(RValue<Byte16> rhs)
1688{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001689 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001690}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001691
Nicolas Capens157ba262019-12-10 17:49:14 -05001692Byte16::Byte16(const Byte16 &rhs)
1693{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001694 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001695}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001696
Nicolas Capens157ba262019-12-10 17:49:14 -05001697Byte16::Byte16(const Reference<Byte16> &rhs)
1698{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001699 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001700}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001701
Nicolas Capens157ba262019-12-10 17:49:14 -05001702RValue<Byte16> Byte16::operator=(RValue<Byte16> rhs)
1703{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001704 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001705}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001706
Nicolas Capens157ba262019-12-10 17:49:14 -05001707RValue<Byte16> Byte16::operator=(const Byte16 &rhs)
1708{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001709 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001710}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001711
Nicolas Capens157ba262019-12-10 17:49:14 -05001712RValue<Byte16> Byte16::operator=(const Reference<Byte16> &rhs)
1713{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001714 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001715}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001716
Nicolas Capens133b87d2020-01-25 16:26:28 -05001717RValue<Byte16> Swizzle(RValue<Byte16> x, uint64_t select)
1718{
Nicolas Capens4e7d3102022-06-21 01:42:18 -04001719 std::vector<int> shuffle = {
Nicolas Capens133b87d2020-01-25 16:26:28 -05001720 static_cast<int>((select >> 60) & 0x0F),
1721 static_cast<int>((select >> 56) & 0x0F),
1722 static_cast<int>((select >> 52) & 0x0F),
1723 static_cast<int>((select >> 48) & 0x0F),
1724 static_cast<int>((select >> 44) & 0x0F),
1725 static_cast<int>((select >> 40) & 0x0F),
1726 static_cast<int>((select >> 36) & 0x0F),
1727 static_cast<int>((select >> 32) & 0x0F),
1728 static_cast<int>((select >> 28) & 0x0F),
1729 static_cast<int>((select >> 24) & 0x0F),
1730 static_cast<int>((select >> 20) & 0x0F),
1731 static_cast<int>((select >> 16) & 0x0F),
1732 static_cast<int>((select >> 12) & 0x0F),
1733 static_cast<int>((select >> 8) & 0x0F),
1734 static_cast<int>((select >> 4) & 0x0F),
1735 static_cast<int>((select >> 0) & 0x0F),
1736 };
1737
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001738 return As<Byte16>(Nucleus::createShuffleVector(x.value(), x.value(), shuffle));
Nicolas Capens133b87d2020-01-25 16:26:28 -05001739}
1740
Nicolas Capens157ba262019-12-10 17:49:14 -05001741Short2::Short2(RValue<Short4> cast)
1742{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001743 storeValue(Nucleus::createBitCast(cast.value(), type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001744}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001745
Nicolas Capens157ba262019-12-10 17:49:14 -05001746UShort2::UShort2(RValue<UShort4> cast)
1747{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001748 storeValue(Nucleus::createBitCast(cast.value(), type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001749}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001750
Nicolas Capens157ba262019-12-10 17:49:14 -05001751Short4::Short4(RValue<Int> cast)
1752{
1753 Value *vector = loadValue();
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001754 Value *element = Nucleus::createTrunc(cast.value(), Short::type());
Nicolas Capens157ba262019-12-10 17:49:14 -05001755 Value *insert = Nucleus::createInsertElement(vector, element, 0);
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001756 Value *swizzle = Swizzle(RValue<Short4>(insert), 0x0000).value();
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001757
Nicolas Capens157ba262019-12-10 17:49:14 -05001758 storeValue(swizzle);
1759}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001760
Nicolas Capens71196862022-01-06 21:31:57 -05001761Short4::Short4(RValue<UInt4> cast)
1762 : Short4(As<Int4>(cast))
1763{
1764}
1765
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001766// Short4::Short4(RValue<Float> cast)
1767// {
1768// }
1769
Nicolas Capens157ba262019-12-10 17:49:14 -05001770Short4::Short4(short xyzw)
1771{
Nicolas Capens4e7d3102022-06-21 01:42:18 -04001772 std::vector<int64_t> constantVector = { xyzw };
Nicolas Capens519cf222020-05-08 15:27:19 -04001773 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001774}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001775
Nicolas Capens157ba262019-12-10 17:49:14 -05001776Short4::Short4(short x, short y, short z, short w)
1777{
Nicolas Capens4e7d3102022-06-21 01:42:18 -04001778 std::vector<int64_t> constantVector = { x, y, z, w };
Nicolas Capens519cf222020-05-08 15:27:19 -04001779 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001780}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001781
Nicolas Capens157ba262019-12-10 17:49:14 -05001782Short4::Short4(RValue<Short4> rhs)
1783{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001784 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001785}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001786
Nicolas Capens157ba262019-12-10 17:49:14 -05001787Short4::Short4(const Short4 &rhs)
1788{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001789 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001790}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001791
Nicolas Capens157ba262019-12-10 17:49:14 -05001792Short4::Short4(const Reference<Short4> &rhs)
1793{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001794 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001795}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001796
Nicolas Capens157ba262019-12-10 17:49:14 -05001797Short4::Short4(RValue<UShort4> rhs)
1798{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001799 storeValue(rhs.value());
Nicolas Capens157ba262019-12-10 17:49:14 -05001800}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001801
Nicolas Capens157ba262019-12-10 17:49:14 -05001802Short4::Short4(const UShort4 &rhs)
1803{
1804 storeValue(rhs.loadValue());
1805}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001806
Nicolas Capens157ba262019-12-10 17:49:14 -05001807Short4::Short4(const Reference<UShort4> &rhs)
1808{
1809 storeValue(rhs.loadValue());
1810}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001811
Nicolas Capens157ba262019-12-10 17:49:14 -05001812RValue<Short4> Short4::operator=(RValue<Short4> rhs)
1813{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001814 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001815}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001816
Nicolas Capens157ba262019-12-10 17:49:14 -05001817RValue<Short4> Short4::operator=(const Short4 &rhs)
1818{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001819 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001820}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001821
Nicolas Capens157ba262019-12-10 17:49:14 -05001822RValue<Short4> Short4::operator=(const Reference<Short4> &rhs)
1823{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04001824 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001825}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001826
Nicolas Capens157ba262019-12-10 17:49:14 -05001827RValue<Short4> Short4::operator=(RValue<UShort4> rhs)
1828{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001829 return RValue<Short4>(storeValue(rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001830}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001831
Nicolas Capens157ba262019-12-10 17:49:14 -05001832RValue<Short4> Short4::operator=(const UShort4 &rhs)
1833{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001834 return RValue<Short4>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001835}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001836
Nicolas Capens157ba262019-12-10 17:49:14 -05001837RValue<Short4> Short4::operator=(const Reference<UShort4> &rhs)
1838{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001839 return RValue<Short4>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001840}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001841
Nicolas Capens157ba262019-12-10 17:49:14 -05001842RValue<Short4> operator+(RValue<Short4> lhs, RValue<Short4> rhs)
1843{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001844 return RValue<Short4>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001845}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001846
Nicolas Capens157ba262019-12-10 17:49:14 -05001847RValue<Short4> operator-(RValue<Short4> lhs, RValue<Short4> rhs)
1848{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001849 return RValue<Short4>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001850}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001851
Nicolas Capens157ba262019-12-10 17:49:14 -05001852RValue<Short4> operator*(RValue<Short4> lhs, RValue<Short4> rhs)
1853{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001854 return RValue<Short4>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001855}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001856
1857// RValue<Short4> operator/(RValue<Short4> lhs, RValue<Short4> rhs)
1858// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001859// return RValue<Short4>(Nucleus::createSDiv(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001860// }
1861
1862// RValue<Short4> operator%(RValue<Short4> lhs, RValue<Short4> rhs)
1863// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001864// return RValue<Short4>(Nucleus::createSRem(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001865// }
1866
Nicolas Capens157ba262019-12-10 17:49:14 -05001867RValue<Short4> operator&(RValue<Short4> lhs, RValue<Short4> rhs)
1868{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001869 return RValue<Short4>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001870}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001871
Nicolas Capens157ba262019-12-10 17:49:14 -05001872RValue<Short4> operator|(RValue<Short4> lhs, RValue<Short4> rhs)
1873{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001874 return RValue<Short4>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001875}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001876
Nicolas Capens157ba262019-12-10 17:49:14 -05001877RValue<Short4> operator^(RValue<Short4> lhs, RValue<Short4> rhs)
1878{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001879 return RValue<Short4>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001880}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001881
Nicolas Capens157ba262019-12-10 17:49:14 -05001882RValue<Short4> operator+=(Short4 &lhs, RValue<Short4> rhs)
1883{
1884 return lhs = lhs + rhs;
1885}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001886
Nicolas Capens157ba262019-12-10 17:49:14 -05001887RValue<Short4> operator-=(Short4 &lhs, RValue<Short4> rhs)
1888{
1889 return lhs = lhs - rhs;
1890}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001891
Nicolas Capens157ba262019-12-10 17:49:14 -05001892RValue<Short4> operator*=(Short4 &lhs, RValue<Short4> rhs)
1893{
1894 return lhs = lhs * rhs;
1895}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001896
1897// RValue<Short4> operator/=(Short4 &lhs, RValue<Short4> rhs)
1898// {
1899// return lhs = lhs / rhs;
1900// }
1901
1902// RValue<Short4> operator%=(Short4 &lhs, RValue<Short4> rhs)
1903// {
1904// return lhs = lhs % rhs;
1905// }
1906
Nicolas Capens157ba262019-12-10 17:49:14 -05001907RValue<Short4> operator&=(Short4 &lhs, RValue<Short4> rhs)
1908{
1909 return lhs = lhs & rhs;
1910}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001911
Nicolas Capens157ba262019-12-10 17:49:14 -05001912RValue<Short4> operator|=(Short4 &lhs, RValue<Short4> rhs)
1913{
1914 return lhs = lhs | rhs;
1915}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001916
Nicolas Capens157ba262019-12-10 17:49:14 -05001917RValue<Short4> operator^=(Short4 &lhs, RValue<Short4> rhs)
1918{
1919 return lhs = lhs ^ rhs;
1920}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001921
Nicolas Capens157ba262019-12-10 17:49:14 -05001922RValue<Short4> operator<<=(Short4 &lhs, unsigned char rhs)
1923{
1924 return lhs = lhs << rhs;
1925}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001926
Nicolas Capens157ba262019-12-10 17:49:14 -05001927RValue<Short4> operator>>=(Short4 &lhs, unsigned char rhs)
1928{
1929 return lhs = lhs >> rhs;
1930}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001931
1932// RValue<Short4> operator+(RValue<Short4> val)
1933// {
1934// return val;
1935// }
1936
Nicolas Capens157ba262019-12-10 17:49:14 -05001937RValue<Short4> operator-(RValue<Short4> val)
1938{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001939 return RValue<Short4>(Nucleus::createNeg(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001940}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001941
Nicolas Capens157ba262019-12-10 17:49:14 -05001942RValue<Short4> operator~(RValue<Short4> val)
1943{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001944 return RValue<Short4>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001945}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001946
Nicolas Capens157ba262019-12-10 17:49:14 -05001947RValue<Short4> RoundShort4(RValue<Float4> cast)
1948{
1949 RValue<Int4> int4 = RoundInt(cast);
1950 return As<Short4>(PackSigned(int4, int4));
1951}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001952
Nicolas Capens157ba262019-12-10 17:49:14 -05001953RValue<Int2> UnpackLow(RValue<Short4> x, RValue<Short4> y)
1954{
Nicolas Capens4e7d3102022-06-21 01:42:18 -04001955 std::vector<int> shuffle = { 0, 8, 1, 9, 2, 10, 3, 11 }; // Real type is v8i16
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001956 return As<Int2>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05001957}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001958
Nicolas Capens157ba262019-12-10 17:49:14 -05001959RValue<Int2> UnpackHigh(RValue<Short4> x, RValue<Short4> y)
1960{
Nicolas Capens133b87d2020-01-25 16:26:28 -05001961 // TODO(b/148379603): Optimize narrowing swizzle.
Nicolas Capens4e7d3102022-06-21 01:42:18 -04001962 std::vector<int> shuffle = { 0, 8, 1, 9, 2, 10, 3, 11 }; // Real type is v8i16
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001963 auto lowHigh = RValue<Short8>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05001964 return As<Int2>(Swizzle(As<Int4>(lowHigh), 0x2323));
1965}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001966
Nicolas Capens157ba262019-12-10 17:49:14 -05001967RValue<Short4> Swizzle(RValue<Short4> x, uint16_t select)
1968{
1969 // Real type is v8i16
Nicolas Capens133b87d2020-01-25 16:26:28 -05001970 // TODO(b/148379603): Optimize narrowing swizzle.
Nicolas Capens4e7d3102022-06-21 01:42:18 -04001971 std::vector<int> shuffle = {
Nicolas Capens157ba262019-12-10 17:49:14 -05001972 (select >> 12) & 0x03,
Ben Clayton713b8d32019-12-17 20:37:56 +00001973 (select >> 8) & 0x03,
1974 (select >> 4) & 0x03,
1975 (select >> 0) & 0x03,
Nicolas Capens157ba262019-12-10 17:49:14 -05001976 (select >> 12) & 0x03,
Ben Clayton713b8d32019-12-17 20:37:56 +00001977 (select >> 8) & 0x03,
1978 (select >> 4) & 0x03,
1979 (select >> 0) & 0x03,
Nicolas Capens157ba262019-12-10 17:49:14 -05001980 };
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001981
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001982 return As<Short4>(Nucleus::createShuffleVector(x.value(), x.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05001983}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001984
Nicolas Capens157ba262019-12-10 17:49:14 -05001985RValue<Short4> Insert(RValue<Short4> val, RValue<Short> element, int i)
1986{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001987 return RValue<Short4>(Nucleus::createInsertElement(val.value(), element.value(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05001988}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001989
Nicolas Capens157ba262019-12-10 17:49:14 -05001990RValue<Short> Extract(RValue<Short4> val, int i)
1991{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04001992 return RValue<Short>(Nucleus::createExtractElement(val.value(), Short::type(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05001993}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001994
Nicolas Capens71196862022-01-06 21:31:57 -05001995UShort4::UShort4(RValue<UInt4> cast)
1996 : UShort4(As<Int4>(cast))
1997{
1998}
1999
Nicolas Capens157ba262019-12-10 17:49:14 -05002000UShort4::UShort4(RValue<Int4> cast)
2001{
2002 *this = Short4(cast);
2003}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002004
Nicolas Capens157ba262019-12-10 17:49:14 -05002005UShort4::UShort4(unsigned short xyzw)
2006{
Nicolas Capens4e7d3102022-06-21 01:42:18 -04002007 std::vector<int64_t> constantVector = { xyzw };
Nicolas Capens519cf222020-05-08 15:27:19 -04002008 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002009}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002010
Nicolas Capens157ba262019-12-10 17:49:14 -05002011UShort4::UShort4(unsigned short x, unsigned short y, unsigned short z, unsigned short w)
2012{
Nicolas Capens4e7d3102022-06-21 01:42:18 -04002013 std::vector<int64_t> constantVector = { x, y, z, w };
Nicolas Capens519cf222020-05-08 15:27:19 -04002014 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002015}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002016
Nicolas Capens157ba262019-12-10 17:49:14 -05002017UShort4::UShort4(RValue<UShort4> rhs)
2018{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002019 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002020}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002021
Nicolas Capens157ba262019-12-10 17:49:14 -05002022UShort4::UShort4(const UShort4 &rhs)
2023{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002024 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002025}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002026
Nicolas Capens157ba262019-12-10 17:49:14 -05002027UShort4::UShort4(const Reference<UShort4> &rhs)
2028{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002029 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002030}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002031
Nicolas Capens157ba262019-12-10 17:49:14 -05002032UShort4::UShort4(RValue<Short4> rhs)
2033{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002034 storeValue(rhs.value());
Nicolas Capens157ba262019-12-10 17:49:14 -05002035}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002036
Nicolas Capens157ba262019-12-10 17:49:14 -05002037UShort4::UShort4(const Short4 &rhs)
2038{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002039 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05002040}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002041
Nicolas Capens157ba262019-12-10 17:49:14 -05002042UShort4::UShort4(const Reference<Short4> &rhs)
2043{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002044 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05002045}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002046
Nicolas Capens157ba262019-12-10 17:49:14 -05002047RValue<UShort4> UShort4::operator=(RValue<UShort4> rhs)
2048{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002049 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002050}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002051
Nicolas Capens157ba262019-12-10 17:49:14 -05002052RValue<UShort4> UShort4::operator=(const UShort4 &rhs)
2053{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002054 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002055}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002056
Nicolas Capens157ba262019-12-10 17:49:14 -05002057RValue<UShort4> UShort4::operator=(const Reference<UShort4> &rhs)
2058{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002059 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002060}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002061
Nicolas Capens157ba262019-12-10 17:49:14 -05002062RValue<UShort4> UShort4::operator=(RValue<Short4> rhs)
2063{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002064 return RValue<UShort4>(storeValue(rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002065}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002066
Nicolas Capens157ba262019-12-10 17:49:14 -05002067RValue<UShort4> UShort4::operator=(const Short4 &rhs)
2068{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002069 return RValue<UShort4>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002070}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002071
Nicolas Capens157ba262019-12-10 17:49:14 -05002072RValue<UShort4> UShort4::operator=(const Reference<Short4> &rhs)
2073{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002074 return RValue<UShort4>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002075}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002076
Nicolas Capens157ba262019-12-10 17:49:14 -05002077RValue<UShort4> operator+(RValue<UShort4> lhs, RValue<UShort4> rhs)
2078{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002079 return RValue<UShort4>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002080}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002081
Nicolas Capens157ba262019-12-10 17:49:14 -05002082RValue<UShort4> operator-(RValue<UShort4> lhs, RValue<UShort4> rhs)
2083{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002084 return RValue<UShort4>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002085}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002086
Nicolas Capens157ba262019-12-10 17:49:14 -05002087RValue<UShort4> operator*(RValue<UShort4> lhs, RValue<UShort4> rhs)
2088{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002089 return RValue<UShort4>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002090}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002091
Nicolas Capens157ba262019-12-10 17:49:14 -05002092RValue<UShort4> operator&(RValue<UShort4> lhs, RValue<UShort4> rhs)
2093{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002094 return RValue<UShort4>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002095}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002096
Nicolas Capens157ba262019-12-10 17:49:14 -05002097RValue<UShort4> operator|(RValue<UShort4> lhs, RValue<UShort4> rhs)
2098{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002099 return RValue<UShort4>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002100}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002101
Nicolas Capens157ba262019-12-10 17:49:14 -05002102RValue<UShort4> operator^(RValue<UShort4> lhs, RValue<UShort4> rhs)
2103{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002104 return RValue<UShort4>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002105}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002106
Nicolas Capens157ba262019-12-10 17:49:14 -05002107RValue<UShort4> operator<<=(UShort4 &lhs, unsigned char rhs)
2108{
2109 return lhs = lhs << rhs;
2110}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002111
Nicolas Capens157ba262019-12-10 17:49:14 -05002112RValue<UShort4> operator>>=(UShort4 &lhs, unsigned char rhs)
2113{
2114 return lhs = lhs >> rhs;
2115}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002116
Nicolas Capens157ba262019-12-10 17:49:14 -05002117RValue<UShort4> operator~(RValue<UShort4> val)
2118{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002119 return RValue<UShort4>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002120}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002121
Jason Macnak0587e072022-02-11 16:49:02 -08002122RValue<UShort4> Insert(RValue<UShort4> val, RValue<UShort> element, int i)
2123{
2124 return RValue<UShort4>(Nucleus::createInsertElement(val.value(), element.value(), i));
2125}
2126
Nicolas Capens157ba262019-12-10 17:49:14 -05002127Short8::Short8(short c)
2128{
Nicolas Capens4e7d3102022-06-21 01:42:18 -04002129 std::vector<int64_t> constantVector = { c };
Nicolas Capens519cf222020-05-08 15:27:19 -04002130 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002131}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002132
Nicolas Capens157ba262019-12-10 17:49:14 -05002133Short8::Short8(short c0, short c1, short c2, short c3, short c4, short c5, short c6, short c7)
2134{
Nicolas Capens4e7d3102022-06-21 01:42:18 -04002135 std::vector<int64_t> constantVector = { c0, c1, c2, c3, c4, c5, c6, c7 };
Nicolas Capens519cf222020-05-08 15:27:19 -04002136 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002137}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002138
Nicolas Capens157ba262019-12-10 17:49:14 -05002139Short8::Short8(RValue<Short8> rhs)
2140{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002141 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002142}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002143
Nicolas Capens157ba262019-12-10 17:49:14 -05002144Short8::Short8(const Reference<Short8> &rhs)
2145{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002146 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002147}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002148
Nicolas Capens157ba262019-12-10 17:49:14 -05002149Short8::Short8(RValue<Short4> lo, RValue<Short4> hi)
2150{
Nicolas Capens4e7d3102022-06-21 01:42:18 -04002151 std::vector<int> shuffle = { 0, 1, 2, 3, 8, 9, 10, 11 }; // Real type is v8i16
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002152 Value *packed = Nucleus::createShuffleVector(lo.value(), hi.value(), shuffle);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002153
Nicolas Capens157ba262019-12-10 17:49:14 -05002154 storeValue(packed);
2155}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002156
Nicolas Capens157ba262019-12-10 17:49:14 -05002157RValue<Short8> Short8::operator=(RValue<Short8> rhs)
2158{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002159 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002160}
Nicolas Capensf1beca42019-03-26 17:18:57 -04002161
Nicolas Capens157ba262019-12-10 17:49:14 -05002162RValue<Short8> Short8::operator=(const Short8 &rhs)
2163{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002164 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002165}
Nicolas Capensf1beca42019-03-26 17:18:57 -04002166
Nicolas Capens157ba262019-12-10 17:49:14 -05002167RValue<Short8> Short8::operator=(const Reference<Short8> &rhs)
2168{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002169 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002170}
Nicolas Capensf1beca42019-03-26 17:18:57 -04002171
Nicolas Capens157ba262019-12-10 17:49:14 -05002172RValue<Short8> operator+(RValue<Short8> lhs, RValue<Short8> rhs)
2173{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002174 return RValue<Short8>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002175}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002176
Nicolas Capens157ba262019-12-10 17:49:14 -05002177RValue<Short8> operator&(RValue<Short8> lhs, RValue<Short8> rhs)
2178{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002179 return RValue<Short8>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002180}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002181
Nicolas Capens157ba262019-12-10 17:49:14 -05002182UShort8::UShort8(unsigned short c)
2183{
Nicolas Capens4e7d3102022-06-21 01:42:18 -04002184 std::vector<int64_t> constantVector = { c };
Nicolas Capens519cf222020-05-08 15:27:19 -04002185 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002186}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002187
Nicolas Capens157ba262019-12-10 17:49:14 -05002188UShort8::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)
2189{
Nicolas Capens4e7d3102022-06-21 01:42:18 -04002190 std::vector<int64_t> constantVector = { c0, c1, c2, c3, c4, c5, c6, c7 };
Nicolas Capens519cf222020-05-08 15:27:19 -04002191 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002192}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002193
Nicolas Capens157ba262019-12-10 17:49:14 -05002194UShort8::UShort8(RValue<UShort8> rhs)
2195{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002196 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002197}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002198
Nicolas Capens157ba262019-12-10 17:49:14 -05002199UShort8::UShort8(const Reference<UShort8> &rhs)
2200{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002201 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002202}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002203
Nicolas Capens157ba262019-12-10 17:49:14 -05002204UShort8::UShort8(RValue<UShort4> lo, RValue<UShort4> hi)
2205{
Nicolas Capens4e7d3102022-06-21 01:42:18 -04002206 std::vector<int> shuffle = { 0, 1, 2, 3, 8, 9, 10, 11 }; // Real type is v8i16
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002207 Value *packed = Nucleus::createShuffleVector(lo.value(), hi.value(), shuffle);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002208
Nicolas Capens157ba262019-12-10 17:49:14 -05002209 storeValue(packed);
2210}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002211
Nicolas Capens157ba262019-12-10 17:49:14 -05002212RValue<UShort8> UShort8::operator=(RValue<UShort8> rhs)
2213{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002214 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002215}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002216
Nicolas Capens157ba262019-12-10 17:49:14 -05002217RValue<UShort8> UShort8::operator=(const UShort8 &rhs)
2218{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002219 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002220}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002221
Nicolas Capens157ba262019-12-10 17:49:14 -05002222RValue<UShort8> UShort8::operator=(const Reference<UShort8> &rhs)
2223{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002224 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002225}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002226
Nicolas Capens157ba262019-12-10 17:49:14 -05002227RValue<UShort8> operator&(RValue<UShort8> lhs, RValue<UShort8> rhs)
2228{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002229 return RValue<UShort8>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002230}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002231
Nicolas Capens157ba262019-12-10 17:49:14 -05002232RValue<UShort8> operator+(RValue<UShort8> lhs, RValue<UShort8> rhs)
2233{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002234 return RValue<UShort8>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002235}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002236
Nicolas Capens157ba262019-12-10 17:49:14 -05002237RValue<UShort8> operator*(RValue<UShort8> lhs, RValue<UShort8> rhs)
2238{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002239 return RValue<UShort8>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002240}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002241
Nicolas Capens157ba262019-12-10 17:49:14 -05002242RValue<UShort8> operator+=(UShort8 &lhs, RValue<UShort8> rhs)
2243{
2244 return lhs = lhs + rhs;
2245}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002246
Nicolas Capens157ba262019-12-10 17:49:14 -05002247RValue<UShort8> operator~(RValue<UShort8> val)
2248{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002249 return RValue<UShort8>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002250}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002251
Nicolas Capens133b87d2020-01-25 16:26:28 -05002252RValue<UShort8> Swizzle(RValue<UShort8> x, uint32_t select)
2253{
Nicolas Capens4e7d3102022-06-21 01:42:18 -04002254 std::vector<int> swizzle = {
Nicolas Capens133b87d2020-01-25 16:26:28 -05002255 static_cast<int>((select >> 28) & 0x07),
2256 static_cast<int>((select >> 24) & 0x07),
2257 static_cast<int>((select >> 20) & 0x07),
2258 static_cast<int>((select >> 16) & 0x07),
2259 static_cast<int>((select >> 12) & 0x07),
2260 static_cast<int>((select >> 8) & 0x07),
2261 static_cast<int>((select >> 4) & 0x07),
2262 static_cast<int>((select >> 0) & 0x07),
2263 };
2264
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002265 return RValue<UShort8>(Nucleus::createShuffleVector(x.value(), x.value(), swizzle));
Nicolas Capens133b87d2020-01-25 16:26:28 -05002266}
2267
Nicolas Capens157ba262019-12-10 17:49:14 -05002268Int::Int(Argument<Int> argument)
2269{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002270 store(argument.rvalue());
Nicolas Capens157ba262019-12-10 17:49:14 -05002271}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002272
Nicolas Capens157ba262019-12-10 17:49:14 -05002273Int::Int(RValue<Byte> cast)
2274{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002275 Value *integer = Nucleus::createZExt(cast.value(), Int::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002276
Nicolas Capens157ba262019-12-10 17:49:14 -05002277 storeValue(integer);
2278}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002279
Nicolas Capens157ba262019-12-10 17:49:14 -05002280Int::Int(RValue<SByte> cast)
2281{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002282 Value *integer = Nucleus::createSExt(cast.value(), Int::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002283
Nicolas Capens157ba262019-12-10 17:49:14 -05002284 storeValue(integer);
2285}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002286
Nicolas Capens157ba262019-12-10 17:49:14 -05002287Int::Int(RValue<Short> cast)
2288{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002289 Value *integer = Nucleus::createSExt(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<UShort> cast)
2295{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002296 Value *integer = Nucleus::createZExt(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<Int2> cast)
2302{
2303 *this = Extract(cast, 0);
2304}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002305
Nicolas Capens157ba262019-12-10 17:49:14 -05002306Int::Int(RValue<Long> cast)
2307{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002308 Value *integer = Nucleus::createTrunc(cast.value(), Int::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002309
Nicolas Capens157ba262019-12-10 17:49:14 -05002310 storeValue(integer);
2311}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002312
Nicolas Capens157ba262019-12-10 17:49:14 -05002313Int::Int(RValue<Float> cast)
2314{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002315 Value *integer = Nucleus::createFPToSI(cast.value(), Int::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002316
Nicolas Capens157ba262019-12-10 17:49:14 -05002317 storeValue(integer);
2318}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002319
Nicolas Capens157ba262019-12-10 17:49:14 -05002320Int::Int(int x)
2321{
2322 storeValue(Nucleus::createConstantInt(x));
2323}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002324
Nicolas Capens157ba262019-12-10 17:49:14 -05002325Int::Int(RValue<Int> rhs)
2326{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002327 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002328}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002329
Nicolas Capens157ba262019-12-10 17:49:14 -05002330Int::Int(RValue<UInt> rhs)
2331{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002332 storeValue(rhs.value());
Nicolas Capens157ba262019-12-10 17:49:14 -05002333}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002334
Nicolas Capens157ba262019-12-10 17:49:14 -05002335Int::Int(const Int &rhs)
2336{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002337 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002338}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002339
Nicolas Capens157ba262019-12-10 17:49:14 -05002340Int::Int(const Reference<Int> &rhs)
2341{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002342 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002343}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002344
Nicolas Capens157ba262019-12-10 17:49:14 -05002345Int::Int(const UInt &rhs)
2346{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002347 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05002348}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002349
Nicolas Capens157ba262019-12-10 17:49:14 -05002350Int::Int(const Reference<UInt> &rhs)
2351{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002352 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05002353}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002354
Nicolas Capens157ba262019-12-10 17:49:14 -05002355RValue<Int> Int::operator=(int rhs)
2356{
2357 return RValue<Int>(storeValue(Nucleus::createConstantInt(rhs)));
2358}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002359
Nicolas Capens157ba262019-12-10 17:49:14 -05002360RValue<Int> Int::operator=(RValue<Int> rhs)
2361{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002362 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002363}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002364
Nicolas Capens157ba262019-12-10 17:49:14 -05002365RValue<Int> Int::operator=(RValue<UInt> rhs)
2366{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002367 storeValue(rhs.value());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002368
Nicolas Capens157ba262019-12-10 17:49:14 -05002369 return RValue<Int>(rhs);
2370}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002371
Nicolas Capens157ba262019-12-10 17:49:14 -05002372RValue<Int> Int::operator=(const Int &rhs)
2373{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002374 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002375}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002376
Nicolas Capens157ba262019-12-10 17:49:14 -05002377RValue<Int> Int::operator=(const Reference<Int> &rhs)
2378{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002379 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002380}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002381
Nicolas Capens157ba262019-12-10 17:49:14 -05002382RValue<Int> Int::operator=(const UInt &rhs)
2383{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002384 return RValue<Int>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002385}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002386
Nicolas Capens157ba262019-12-10 17:49:14 -05002387RValue<Int> Int::operator=(const Reference<UInt> &rhs)
2388{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002389 return RValue<Int>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002390}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002391
Nicolas Capens157ba262019-12-10 17:49:14 -05002392RValue<Int> operator+(RValue<Int> lhs, RValue<Int> rhs)
2393{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002394 return RValue<Int>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002395}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002396
Nicolas Capens157ba262019-12-10 17:49:14 -05002397RValue<Int> operator-(RValue<Int> lhs, RValue<Int> rhs)
2398{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002399 return RValue<Int>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002400}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002401
Nicolas Capens157ba262019-12-10 17:49:14 -05002402RValue<Int> operator*(RValue<Int> lhs, RValue<Int> rhs)
2403{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002404 return RValue<Int>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002405}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002406
Nicolas Capens157ba262019-12-10 17:49:14 -05002407RValue<Int> operator/(RValue<Int> lhs, RValue<Int> rhs)
2408{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002409 return RValue<Int>(Nucleus::createSDiv(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002410}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002411
Nicolas Capens157ba262019-12-10 17:49:14 -05002412RValue<Int> operator%(RValue<Int> lhs, RValue<Int> rhs)
2413{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002414 return RValue<Int>(Nucleus::createSRem(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002415}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002416
Nicolas Capens157ba262019-12-10 17:49:14 -05002417RValue<Int> operator&(RValue<Int> lhs, RValue<Int> rhs)
2418{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002419 return RValue<Int>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002420}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002421
Nicolas Capens157ba262019-12-10 17:49:14 -05002422RValue<Int> operator|(RValue<Int> lhs, RValue<Int> rhs)
2423{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002424 return RValue<Int>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002425}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002426
Nicolas Capens157ba262019-12-10 17:49:14 -05002427RValue<Int> operator^(RValue<Int> lhs, RValue<Int> rhs)
2428{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002429 return RValue<Int>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002430}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002431
Nicolas Capens157ba262019-12-10 17:49:14 -05002432RValue<Int> operator<<(RValue<Int> lhs, RValue<Int> rhs)
2433{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002434 return RValue<Int>(Nucleus::createShl(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002435}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002436
Nicolas Capens157ba262019-12-10 17:49:14 -05002437RValue<Int> operator>>(RValue<Int> lhs, RValue<Int> rhs)
2438{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002439 return RValue<Int>(Nucleus::createAShr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002440}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002441
Nicolas Capens157ba262019-12-10 17:49:14 -05002442RValue<Int> operator+=(Int &lhs, RValue<Int> rhs)
2443{
2444 return lhs = lhs + rhs;
2445}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002446
Nicolas Capens157ba262019-12-10 17:49:14 -05002447RValue<Int> operator-=(Int &lhs, RValue<Int> rhs)
2448{
2449 return lhs = lhs - rhs;
2450}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002451
Nicolas Capens157ba262019-12-10 17:49:14 -05002452RValue<Int> operator*=(Int &lhs, RValue<Int> rhs)
2453{
2454 return lhs = lhs * rhs;
2455}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002456
Nicolas Capens157ba262019-12-10 17:49:14 -05002457RValue<Int> operator/=(Int &lhs, RValue<Int> rhs)
2458{
2459 return lhs = lhs / rhs;
2460}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002461
Nicolas Capens157ba262019-12-10 17:49:14 -05002462RValue<Int> operator%=(Int &lhs, RValue<Int> rhs)
2463{
2464 return lhs = lhs % rhs;
2465}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002466
Nicolas Capens157ba262019-12-10 17:49:14 -05002467RValue<Int> operator&=(Int &lhs, RValue<Int> rhs)
2468{
2469 return lhs = lhs & rhs;
2470}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002471
Nicolas Capens157ba262019-12-10 17:49:14 -05002472RValue<Int> operator|=(Int &lhs, RValue<Int> rhs)
2473{
2474 return lhs = lhs | rhs;
2475}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002476
Nicolas Capens157ba262019-12-10 17:49:14 -05002477RValue<Int> operator^=(Int &lhs, RValue<Int> rhs)
2478{
2479 return lhs = lhs ^ rhs;
2480}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002481
Nicolas Capens157ba262019-12-10 17:49:14 -05002482RValue<Int> operator<<=(Int &lhs, RValue<Int> rhs)
2483{
2484 return lhs = lhs << rhs;
2485}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002486
Nicolas Capens157ba262019-12-10 17:49:14 -05002487RValue<Int> operator>>=(Int &lhs, RValue<Int> rhs)
2488{
2489 return lhs = lhs >> rhs;
2490}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002491
Nicolas Capens157ba262019-12-10 17:49:14 -05002492RValue<Int> operator+(RValue<Int> val)
2493{
2494 return val;
2495}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002496
Nicolas Capens157ba262019-12-10 17:49:14 -05002497RValue<Int> operator-(RValue<Int> val)
2498{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002499 return RValue<Int>(Nucleus::createNeg(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002500}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002501
Nicolas Capens157ba262019-12-10 17:49:14 -05002502RValue<Int> operator~(RValue<Int> val)
2503{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002504 return RValue<Int>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002505}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002506
Nicolas Capens157ba262019-12-10 17:49:14 -05002507RValue<Bool> operator<(RValue<Int> lhs, RValue<Int> rhs)
2508{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002509 return RValue<Bool>(Nucleus::createICmpSLT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002510}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002511
Nicolas Capens157ba262019-12-10 17:49:14 -05002512RValue<Bool> operator<=(RValue<Int> lhs, RValue<Int> rhs)
2513{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002514 return RValue<Bool>(Nucleus::createICmpSLE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002515}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002516
Nicolas Capens157ba262019-12-10 17:49:14 -05002517RValue<Bool> operator>(RValue<Int> lhs, RValue<Int> rhs)
2518{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002519 return RValue<Bool>(Nucleus::createICmpSGT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002520}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002521
Nicolas Capens157ba262019-12-10 17:49:14 -05002522RValue<Bool> operator>=(RValue<Int> lhs, RValue<Int> rhs)
2523{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002524 return RValue<Bool>(Nucleus::createICmpSGE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002525}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002526
Nicolas Capens157ba262019-12-10 17:49:14 -05002527RValue<Bool> operator!=(RValue<Int> lhs, RValue<Int> rhs)
2528{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002529 return RValue<Bool>(Nucleus::createICmpNE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002530}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002531
Nicolas Capens157ba262019-12-10 17:49:14 -05002532RValue<Bool> operator==(RValue<Int> lhs, RValue<Int> rhs)
2533{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002534 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002535}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002536
Nicolas Capens157ba262019-12-10 17:49:14 -05002537RValue<Int> Max(RValue<Int> x, RValue<Int> y)
2538{
2539 return IfThenElse(x > y, x, y);
2540}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002541
Nicolas Capens157ba262019-12-10 17:49:14 -05002542RValue<Int> Min(RValue<Int> x, RValue<Int> y)
2543{
2544 return IfThenElse(x < y, x, y);
2545}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002546
Nicolas Capens157ba262019-12-10 17:49:14 -05002547RValue<Int> Clamp(RValue<Int> x, RValue<Int> min, RValue<Int> max)
2548{
2549 return Min(Max(x, min), max);
2550}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002551
Nicolas Capens157ba262019-12-10 17:49:14 -05002552Long::Long(RValue<Int> cast)
2553{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002554 Value *integer = Nucleus::createSExt(cast.value(), Long::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002555
Nicolas Capens157ba262019-12-10 17:49:14 -05002556 storeValue(integer);
2557}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002558
Nicolas Capens157ba262019-12-10 17:49:14 -05002559Long::Long(RValue<UInt> cast)
2560{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002561 Value *integer = Nucleus::createZExt(cast.value(), Long::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002562
Nicolas Capens157ba262019-12-10 17:49:14 -05002563 storeValue(integer);
2564}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002565
Nicolas Capens157ba262019-12-10 17:49:14 -05002566Long::Long(RValue<Long> rhs)
2567{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002568 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002569}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002570
Nicolas Capens157ba262019-12-10 17:49:14 -05002571RValue<Long> Long::operator=(int64_t rhs)
2572{
2573 return RValue<Long>(storeValue(Nucleus::createConstantLong(rhs)));
2574}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002575
Nicolas Capens157ba262019-12-10 17:49:14 -05002576RValue<Long> Long::operator=(RValue<Long> rhs)
2577{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002578 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002579}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002580
Nicolas Capens157ba262019-12-10 17:49:14 -05002581RValue<Long> Long::operator=(const Long &rhs)
2582{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002583 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002584}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002585
Nicolas Capens157ba262019-12-10 17:49:14 -05002586RValue<Long> Long::operator=(const Reference<Long> &rhs)
2587{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002588 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002589}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002590
Nicolas Capens157ba262019-12-10 17:49:14 -05002591RValue<Long> operator+(RValue<Long> lhs, RValue<Long> rhs)
2592{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002593 return RValue<Long>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002594}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002595
Nicolas Capens157ba262019-12-10 17:49:14 -05002596RValue<Long> operator-(RValue<Long> lhs, RValue<Long> rhs)
2597{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002598 return RValue<Long>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002599}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002600
Nicolas Capens157ba262019-12-10 17:49:14 -05002601RValue<Long> operator*(RValue<Long> lhs, RValue<Long> rhs)
2602{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002603 return RValue<Long>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002604}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002605
Nicolas Capens157ba262019-12-10 17:49:14 -05002606RValue<Long> operator>>(RValue<Long> lhs, RValue<Long> rhs)
2607{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002608 return RValue<Long>(Nucleus::createAShr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002609}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002610
Nicolas Capens157ba262019-12-10 17:49:14 -05002611RValue<Long> operator+=(Long &lhs, RValue<Long> rhs)
2612{
2613 return lhs = lhs + rhs;
2614}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002615
Nicolas Capens157ba262019-12-10 17:49:14 -05002616RValue<Long> operator-=(Long &lhs, RValue<Long> rhs)
2617{
2618 return lhs = lhs - rhs;
2619}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002620
Ben Clayton713b8d32019-12-17 20:37:56 +00002621RValue<Long> AddAtomic(RValue<Pointer<Long>> x, RValue<Long> y)
Nicolas Capens157ba262019-12-10 17:49:14 -05002622{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002623 return RValue<Long>(Nucleus::createAtomicAdd(x.value(), y.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002624}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002625
Ben Clayton713b8d32019-12-17 20:37:56 +00002626RValue<UInt> AddAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
Nicolas Capens157ba262019-12-10 17:49:14 -05002627{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002628 return RValue<UInt>(Nucleus::createAtomicAdd(x.value(), y.value(), memoryOrder));
Nicolas Capens157ba262019-12-10 17:49:14 -05002629}
Chris Forbes17813932019-04-18 11:45:54 -07002630
Ben Clayton713b8d32019-12-17 20:37:56 +00002631RValue<UInt> SubAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
Nicolas Capens157ba262019-12-10 17:49:14 -05002632{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002633 return RValue<UInt>(Nucleus::createAtomicSub(x.value(), y.value(), memoryOrder));
Nicolas Capens157ba262019-12-10 17:49:14 -05002634}
Chris Forbes707ed992019-04-18 18:17:35 -07002635
Ben Clayton713b8d32019-12-17 20:37:56 +00002636RValue<UInt> AndAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
Nicolas Capens157ba262019-12-10 17:49:14 -05002637{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002638 return RValue<UInt>(Nucleus::createAtomicAnd(x.value(), y.value(), memoryOrder));
Nicolas Capens157ba262019-12-10 17:49:14 -05002639}
Chris Forbes17813932019-04-18 11:45:54 -07002640
Ben Clayton713b8d32019-12-17 20:37:56 +00002641RValue<UInt> OrAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
Nicolas Capens157ba262019-12-10 17:49:14 -05002642{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002643 return RValue<UInt>(Nucleus::createAtomicOr(x.value(), y.value(), memoryOrder));
Nicolas Capens157ba262019-12-10 17:49:14 -05002644}
Chris Forbes17813932019-04-18 11:45:54 -07002645
Ben Clayton713b8d32019-12-17 20:37:56 +00002646RValue<UInt> XorAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
Nicolas Capens157ba262019-12-10 17:49:14 -05002647{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002648 return RValue<UInt>(Nucleus::createAtomicXor(x.value(), y.value(), memoryOrder));
Nicolas Capens157ba262019-12-10 17:49:14 -05002649}
Chris Forbes17813932019-04-18 11:45:54 -07002650
Ben Clayton713b8d32019-12-17 20:37:56 +00002651RValue<UInt> ExchangeAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
Nicolas Capens157ba262019-12-10 17:49:14 -05002652{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002653 return RValue<UInt>(Nucleus::createAtomicExchange(x.value(), y.value(), memoryOrder));
Nicolas Capens157ba262019-12-10 17:49:14 -05002654}
Chris Forbes17813932019-04-18 11:45:54 -07002655
Ben Clayton713b8d32019-12-17 20:37:56 +00002656RValue<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 -05002657{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002658 return RValue<UInt>(Nucleus::createAtomicCompareExchange(x.value(), y.value(), compare.value(), memoryOrderEqual, memoryOrderUnequal));
Nicolas Capens157ba262019-12-10 17:49:14 -05002659}
Chris Forbesa16238d2019-04-18 16:31:54 -07002660
Nicolas Capens157ba262019-12-10 17:49:14 -05002661UInt::UInt(Argument<UInt> argument)
2662{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002663 store(argument.rvalue());
Nicolas Capens157ba262019-12-10 17:49:14 -05002664}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002665
Nicolas Capens157ba262019-12-10 17:49:14 -05002666UInt::UInt(RValue<UShort> cast)
2667{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002668 Value *integer = Nucleus::createZExt(cast.value(), UInt::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002669
Nicolas Capens157ba262019-12-10 17:49:14 -05002670 storeValue(integer);
2671}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002672
Nicolas Capens157ba262019-12-10 17:49:14 -05002673UInt::UInt(RValue<Long> cast)
2674{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002675 Value *integer = Nucleus::createTrunc(cast.value(), UInt::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002676
Nicolas Capens157ba262019-12-10 17:49:14 -05002677 storeValue(integer);
2678}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002679
Nicolas Capens157ba262019-12-10 17:49:14 -05002680UInt::UInt(int x)
2681{
2682 storeValue(Nucleus::createConstantInt(x));
2683}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002684
Nicolas Capens157ba262019-12-10 17:49:14 -05002685UInt::UInt(unsigned int x)
2686{
2687 storeValue(Nucleus::createConstantInt(x));
2688}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002689
Nicolas Capens157ba262019-12-10 17:49:14 -05002690UInt::UInt(RValue<UInt> rhs)
2691{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002692 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002693}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002694
Nicolas Capens157ba262019-12-10 17:49:14 -05002695UInt::UInt(RValue<Int> rhs)
2696{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002697 storeValue(rhs.value());
Nicolas Capens157ba262019-12-10 17:49:14 -05002698}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002699
Nicolas Capens157ba262019-12-10 17:49:14 -05002700UInt::UInt(const UInt &rhs)
2701{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002702 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002703}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002704
Nicolas Capens157ba262019-12-10 17:49:14 -05002705UInt::UInt(const Reference<UInt> &rhs)
2706{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002707 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002708}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002709
Nicolas Capens157ba262019-12-10 17:49:14 -05002710UInt::UInt(const Int &rhs)
2711{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002712 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05002713}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002714
Nicolas Capens157ba262019-12-10 17:49:14 -05002715UInt::UInt(const Reference<Int> &rhs)
2716{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002717 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05002718}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002719
Nicolas Capens157ba262019-12-10 17:49:14 -05002720RValue<UInt> UInt::operator=(unsigned int rhs)
2721{
2722 return RValue<UInt>(storeValue(Nucleus::createConstantInt(rhs)));
2723}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002724
Nicolas Capens157ba262019-12-10 17:49:14 -05002725RValue<UInt> UInt::operator=(RValue<UInt> rhs)
2726{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002727 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002728}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002729
Nicolas Capens157ba262019-12-10 17:49:14 -05002730RValue<UInt> UInt::operator=(RValue<Int> rhs)
2731{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002732 storeValue(rhs.value());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002733
Nicolas Capens157ba262019-12-10 17:49:14 -05002734 return RValue<UInt>(rhs);
2735}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002736
Nicolas Capens157ba262019-12-10 17:49:14 -05002737RValue<UInt> UInt::operator=(const UInt &rhs)
2738{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002739 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002740}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002741
Nicolas Capens157ba262019-12-10 17:49:14 -05002742RValue<UInt> UInt::operator=(const Reference<UInt> &rhs)
2743{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002744 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002745}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002746
Nicolas Capens157ba262019-12-10 17:49:14 -05002747RValue<UInt> UInt::operator=(const Int &rhs)
2748{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002749 return RValue<UInt>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002750}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002751
Nicolas Capens157ba262019-12-10 17:49:14 -05002752RValue<UInt> UInt::operator=(const Reference<Int> &rhs)
2753{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002754 return RValue<UInt>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002755}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002756
Nicolas Capens157ba262019-12-10 17:49:14 -05002757RValue<UInt> operator+(RValue<UInt> lhs, RValue<UInt> rhs)
2758{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002759 return RValue<UInt>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002760}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002761
Nicolas Capens157ba262019-12-10 17:49:14 -05002762RValue<UInt> operator-(RValue<UInt> lhs, RValue<UInt> rhs)
2763{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002764 return RValue<UInt>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002765}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002766
Nicolas Capens157ba262019-12-10 17:49:14 -05002767RValue<UInt> operator*(RValue<UInt> lhs, RValue<UInt> rhs)
2768{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002769 return RValue<UInt>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002770}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002771
Nicolas Capens157ba262019-12-10 17:49:14 -05002772RValue<UInt> operator/(RValue<UInt> lhs, RValue<UInt> rhs)
2773{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002774 return RValue<UInt>(Nucleus::createUDiv(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002775}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002776
Nicolas Capens157ba262019-12-10 17:49:14 -05002777RValue<UInt> operator%(RValue<UInt> lhs, RValue<UInt> rhs)
2778{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002779 return RValue<UInt>(Nucleus::createURem(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002780}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002781
Nicolas Capens157ba262019-12-10 17:49:14 -05002782RValue<UInt> operator&(RValue<UInt> lhs, RValue<UInt> rhs)
2783{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002784 return RValue<UInt>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002785}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002786
Nicolas Capens157ba262019-12-10 17:49:14 -05002787RValue<UInt> operator|(RValue<UInt> lhs, RValue<UInt> rhs)
2788{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002789 return RValue<UInt>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002790}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002791
Nicolas Capens157ba262019-12-10 17:49:14 -05002792RValue<UInt> operator^(RValue<UInt> lhs, RValue<UInt> rhs)
2793{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002794 return RValue<UInt>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002795}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002796
Nicolas Capens157ba262019-12-10 17:49:14 -05002797RValue<UInt> operator<<(RValue<UInt> lhs, RValue<UInt> rhs)
2798{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002799 return RValue<UInt>(Nucleus::createShl(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002800}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002801
Nicolas Capens157ba262019-12-10 17:49:14 -05002802RValue<UInt> operator>>(RValue<UInt> lhs, RValue<UInt> rhs)
2803{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002804 return RValue<UInt>(Nucleus::createLShr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002805}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002806
Nicolas Capens157ba262019-12-10 17:49:14 -05002807RValue<UInt> operator+=(UInt &lhs, RValue<UInt> rhs)
2808{
2809 return lhs = lhs + rhs;
2810}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002811
Nicolas Capens157ba262019-12-10 17:49:14 -05002812RValue<UInt> operator-=(UInt &lhs, RValue<UInt> rhs)
2813{
2814 return lhs = lhs - rhs;
2815}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002816
Nicolas Capens157ba262019-12-10 17:49:14 -05002817RValue<UInt> operator*=(UInt &lhs, RValue<UInt> rhs)
2818{
2819 return lhs = lhs * rhs;
2820}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002821
Nicolas Capens157ba262019-12-10 17:49:14 -05002822RValue<UInt> operator/=(UInt &lhs, RValue<UInt> rhs)
2823{
2824 return lhs = lhs / rhs;
2825}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002826
Nicolas Capens157ba262019-12-10 17:49:14 -05002827RValue<UInt> operator%=(UInt &lhs, RValue<UInt> rhs)
2828{
2829 return lhs = lhs % rhs;
2830}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002831
Nicolas Capens157ba262019-12-10 17:49:14 -05002832RValue<UInt> operator&=(UInt &lhs, RValue<UInt> rhs)
2833{
2834 return lhs = lhs & rhs;
2835}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002836
Nicolas Capens157ba262019-12-10 17:49:14 -05002837RValue<UInt> operator|=(UInt &lhs, RValue<UInt> rhs)
2838{
2839 return lhs = lhs | rhs;
2840}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002841
Nicolas Capens157ba262019-12-10 17:49:14 -05002842RValue<UInt> operator^=(UInt &lhs, RValue<UInt> rhs)
2843{
2844 return lhs = lhs ^ rhs;
2845}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002846
Nicolas Capens157ba262019-12-10 17:49:14 -05002847RValue<UInt> operator<<=(UInt &lhs, RValue<UInt> rhs)
2848{
2849 return lhs = lhs << rhs;
2850}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002851
Nicolas Capens157ba262019-12-10 17:49:14 -05002852RValue<UInt> operator>>=(UInt &lhs, RValue<UInt> rhs)
2853{
2854 return lhs = lhs >> rhs;
2855}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002856
Nicolas Capens157ba262019-12-10 17:49:14 -05002857RValue<UInt> operator+(RValue<UInt> val)
2858{
2859 return val;
2860}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002861
Nicolas Capens157ba262019-12-10 17:49:14 -05002862RValue<UInt> operator-(RValue<UInt> val)
2863{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002864 return RValue<UInt>(Nucleus::createNeg(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002865}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002866
Nicolas Capens157ba262019-12-10 17:49:14 -05002867RValue<UInt> operator~(RValue<UInt> val)
2868{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002869 return RValue<UInt>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002870}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002871
Nicolas Capens157ba262019-12-10 17:49:14 -05002872RValue<UInt> Max(RValue<UInt> x, RValue<UInt> y)
2873{
2874 return IfThenElse(x > y, x, y);
2875}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002876
Nicolas Capens157ba262019-12-10 17:49:14 -05002877RValue<UInt> Min(RValue<UInt> x, RValue<UInt> y)
2878{
2879 return IfThenElse(x < y, x, y);
2880}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002881
Nicolas Capens157ba262019-12-10 17:49:14 -05002882RValue<UInt> Clamp(RValue<UInt> x, RValue<UInt> min, RValue<UInt> max)
2883{
2884 return Min(Max(x, min), max);
2885}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002886
Nicolas Capens157ba262019-12-10 17:49:14 -05002887RValue<Bool> operator<(RValue<UInt> lhs, RValue<UInt> rhs)
2888{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002889 return RValue<Bool>(Nucleus::createICmpULT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002890}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002891
Nicolas Capens157ba262019-12-10 17:49:14 -05002892RValue<Bool> operator<=(RValue<UInt> lhs, RValue<UInt> rhs)
2893{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002894 return RValue<Bool>(Nucleus::createICmpULE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002895}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002896
Nicolas Capens157ba262019-12-10 17:49:14 -05002897RValue<Bool> operator>(RValue<UInt> lhs, RValue<UInt> rhs)
2898{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002899 return RValue<Bool>(Nucleus::createICmpUGT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002900}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002901
Nicolas Capens157ba262019-12-10 17:49:14 -05002902RValue<Bool> operator>=(RValue<UInt> lhs, RValue<UInt> rhs)
2903{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002904 return RValue<Bool>(Nucleus::createICmpUGE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002905}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002906
Nicolas Capens157ba262019-12-10 17:49:14 -05002907RValue<Bool> operator!=(RValue<UInt> lhs, RValue<UInt> rhs)
2908{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002909 return RValue<Bool>(Nucleus::createICmpNE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002910}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002911
Nicolas Capens157ba262019-12-10 17:49:14 -05002912RValue<Bool> operator==(RValue<UInt> lhs, RValue<UInt> rhs)
2913{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002914 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002915}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002916
Nicolas Capens157ba262019-12-10 17:49:14 -05002917Int2::Int2(RValue<Int4> cast)
2918{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002919 storeValue(Nucleus::createBitCast(cast.value(), type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002920}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002921
Nicolas Capens157ba262019-12-10 17:49:14 -05002922Int2::Int2(int x, int y)
2923{
Nicolas Capens4e7d3102022-06-21 01:42:18 -04002924 std::vector<int64_t> constantVector = { x, y };
Nicolas Capens519cf222020-05-08 15:27:19 -04002925 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002926}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002927
Nicolas Capens157ba262019-12-10 17:49:14 -05002928Int2::Int2(RValue<Int2> rhs)
2929{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002930 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002931}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002932
Nicolas Capens157ba262019-12-10 17:49:14 -05002933Int2::Int2(const Int2 &rhs)
2934{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002935 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002936}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002937
Nicolas Capens157ba262019-12-10 17:49:14 -05002938Int2::Int2(const Reference<Int2> &rhs)
2939{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002940 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002941}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002942
Nicolas Capens157ba262019-12-10 17:49:14 -05002943Int2::Int2(RValue<Int> lo, RValue<Int> hi)
2944{
Nicolas Capens4e7d3102022-06-21 01:42:18 -04002945 std::vector<int> shuffle = { 0, 4, 1, 5 };
Nicolas Capens157ba262019-12-10 17:49:14 -05002946 Value *packed = Nucleus::createShuffleVector(Int4(lo).loadValue(), Int4(hi).loadValue(), shuffle);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002947
Nicolas Capens519cf222020-05-08 15:27:19 -04002948 storeValue(Nucleus::createBitCast(packed, Int2::type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002949}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002950
Nicolas Capens157ba262019-12-10 17:49:14 -05002951RValue<Int2> Int2::operator=(RValue<Int2> rhs)
2952{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002953 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002954}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002955
Nicolas Capens157ba262019-12-10 17:49:14 -05002956RValue<Int2> Int2::operator=(const Int2 &rhs)
2957{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002958 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002959}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002960
Nicolas Capens157ba262019-12-10 17:49:14 -05002961RValue<Int2> Int2::operator=(const Reference<Int2> &rhs)
2962{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04002963 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05002964}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002965
Nicolas Capens157ba262019-12-10 17:49:14 -05002966RValue<Int2> operator+(RValue<Int2> lhs, RValue<Int2> rhs)
2967{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002968 return RValue<Int2>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002969}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002970
Nicolas Capens157ba262019-12-10 17:49:14 -05002971RValue<Int2> operator-(RValue<Int2> lhs, RValue<Int2> rhs)
2972{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002973 return RValue<Int2>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002974}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002975
2976// RValue<Int2> operator*(RValue<Int2> lhs, RValue<Int2> rhs)
2977// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002978// return RValue<Int2>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002979// }
2980
2981// RValue<Int2> operator/(RValue<Int2> lhs, RValue<Int2> rhs)
2982// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002983// return RValue<Int2>(Nucleus::createSDiv(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002984// }
2985
2986// RValue<Int2> operator%(RValue<Int2> lhs, RValue<Int2> rhs)
2987// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002988// return RValue<Int2>(Nucleus::createSRem(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002989// }
2990
Nicolas Capens157ba262019-12-10 17:49:14 -05002991RValue<Int2> operator&(RValue<Int2> lhs, RValue<Int2> rhs)
2992{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002993 return RValue<Int2>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002994}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002995
Nicolas Capens157ba262019-12-10 17:49:14 -05002996RValue<Int2> operator|(RValue<Int2> lhs, RValue<Int2> rhs)
2997{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04002998 return RValue<Int2>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002999}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003000
Nicolas Capens157ba262019-12-10 17:49:14 -05003001RValue<Int2> operator^(RValue<Int2> lhs, RValue<Int2> rhs)
3002{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003003 return RValue<Int2>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003004}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003005
Nicolas Capens157ba262019-12-10 17:49:14 -05003006RValue<Int2> operator+=(Int2 &lhs, RValue<Int2> rhs)
3007{
3008 return lhs = lhs + rhs;
3009}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003010
Nicolas Capens157ba262019-12-10 17:49:14 -05003011RValue<Int2> operator-=(Int2 &lhs, RValue<Int2> rhs)
3012{
3013 return lhs = lhs - rhs;
3014}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003015
3016// RValue<Int2> operator*=(Int2 &lhs, RValue<Int2> rhs)
3017// {
3018// return lhs = lhs * rhs;
3019// }
3020
3021// RValue<Int2> operator/=(Int2 &lhs, RValue<Int2> rhs)
3022// {
3023// return lhs = lhs / rhs;
3024// }
3025
3026// RValue<Int2> operator%=(Int2 &lhs, RValue<Int2> rhs)
3027// {
3028// return lhs = lhs % rhs;
3029// }
3030
Nicolas Capens157ba262019-12-10 17:49:14 -05003031RValue<Int2> operator&=(Int2 &lhs, RValue<Int2> rhs)
3032{
3033 return lhs = lhs & rhs;
3034}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003035
Nicolas Capens157ba262019-12-10 17:49:14 -05003036RValue<Int2> operator|=(Int2 &lhs, RValue<Int2> rhs)
3037{
3038 return lhs = lhs | rhs;
3039}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003040
Nicolas Capens157ba262019-12-10 17:49:14 -05003041RValue<Int2> operator^=(Int2 &lhs, RValue<Int2> rhs)
3042{
3043 return lhs = lhs ^ rhs;
3044}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003045
Nicolas Capens157ba262019-12-10 17:49:14 -05003046RValue<Int2> operator<<=(Int2 &lhs, unsigned char rhs)
3047{
3048 return lhs = lhs << rhs;
3049}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003050
Nicolas Capens157ba262019-12-10 17:49:14 -05003051RValue<Int2> operator>>=(Int2 &lhs, unsigned char rhs)
3052{
3053 return lhs = lhs >> rhs;
3054}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003055
3056// RValue<Int2> operator+(RValue<Int2> val)
3057// {
3058// return val;
3059// }
3060
3061// RValue<Int2> operator-(RValue<Int2> val)
3062// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003063// return RValue<Int2>(Nucleus::createNeg(val.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003064// }
3065
Nicolas Capens157ba262019-12-10 17:49:14 -05003066RValue<Int2> operator~(RValue<Int2> val)
3067{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003068 return RValue<Int2>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003069}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003070
Nicolas Capens157ba262019-12-10 17:49:14 -05003071RValue<Short4> UnpackLow(RValue<Int2> x, RValue<Int2> y)
3072{
Nicolas Capens133b87d2020-01-25 16:26:28 -05003073 // TODO(b/148379603): Optimize narrowing swizzle.
Nicolas Capens4e7d3102022-06-21 01:42:18 -04003074 std::vector<int> shuffle = { 0, 4, 1, 5 }; // Real type is v4i32
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003075 return As<Short4>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05003076}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003077
Nicolas Capens157ba262019-12-10 17:49:14 -05003078RValue<Short4> UnpackHigh(RValue<Int2> x, RValue<Int2> y)
3079{
Nicolas Capens133b87d2020-01-25 16:26:28 -05003080 // TODO(b/148379603): Optimize narrowing swizzle.
Nicolas Capens4e7d3102022-06-21 01:42:18 -04003081 std::vector<int> shuffle = { 0, 4, 1, 5 }; // Real type is v4i32
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003082 auto lowHigh = RValue<Int4>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05003083 return As<Short4>(Swizzle(lowHigh, 0x2323));
3084}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003085
Nicolas Capens157ba262019-12-10 17:49:14 -05003086RValue<Int> Extract(RValue<Int2> val, int i)
3087{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003088 return RValue<Int>(Nucleus::createExtractElement(val.value(), Int::type(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05003089}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003090
Nicolas Capens157ba262019-12-10 17:49:14 -05003091RValue<Int2> Insert(RValue<Int2> val, RValue<Int> element, int i)
3092{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003093 return RValue<Int2>(Nucleus::createInsertElement(val.value(), element.value(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05003094}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003095
Nicolas Capens157ba262019-12-10 17:49:14 -05003096UInt2::UInt2(unsigned int x, unsigned int y)
3097{
Nicolas Capens4e7d3102022-06-21 01:42:18 -04003098 std::vector<int64_t> constantVector = { x, y };
Nicolas Capens519cf222020-05-08 15:27:19 -04003099 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003100}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003101
Nicolas Capens157ba262019-12-10 17:49:14 -05003102UInt2::UInt2(RValue<UInt2> rhs)
3103{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003104 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05003105}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003106
Nicolas Capens157ba262019-12-10 17:49:14 -05003107UInt2::UInt2(const UInt2 &rhs)
3108{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003109 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003110}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003111
Nicolas Capens157ba262019-12-10 17:49:14 -05003112UInt2::UInt2(const Reference<UInt2> &rhs)
3113{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003114 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003115}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003116
Nicolas Capens157ba262019-12-10 17:49:14 -05003117RValue<UInt2> UInt2::operator=(RValue<UInt2> rhs)
3118{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003119 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05003120}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003121
Nicolas Capens157ba262019-12-10 17:49:14 -05003122RValue<UInt2> UInt2::operator=(const UInt2 &rhs)
3123{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003124 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003125}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003126
Nicolas Capens157ba262019-12-10 17:49:14 -05003127RValue<UInt2> UInt2::operator=(const Reference<UInt2> &rhs)
3128{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003129 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003130}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003131
Nicolas Capens157ba262019-12-10 17:49:14 -05003132RValue<UInt2> operator+(RValue<UInt2> lhs, RValue<UInt2> rhs)
3133{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003134 return RValue<UInt2>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003135}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003136
Nicolas Capens157ba262019-12-10 17:49:14 -05003137RValue<UInt2> operator-(RValue<UInt2> lhs, RValue<UInt2> rhs)
3138{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003139 return RValue<UInt2>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003140}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003141
3142// RValue<UInt2> operator*(RValue<UInt2> lhs, RValue<UInt2> rhs)
3143// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003144// return RValue<UInt2>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003145// }
3146
3147// RValue<UInt2> operator/(RValue<UInt2> lhs, RValue<UInt2> rhs)
3148// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003149// return RValue<UInt2>(Nucleus::createUDiv(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003150// }
3151
3152// RValue<UInt2> operator%(RValue<UInt2> lhs, RValue<UInt2> rhs)
3153// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003154// return RValue<UInt2>(Nucleus::createURem(lhs.value(), rhs.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003155// }
3156
Nicolas Capens157ba262019-12-10 17:49:14 -05003157RValue<UInt2> operator&(RValue<UInt2> lhs, RValue<UInt2> rhs)
3158{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003159 return RValue<UInt2>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003160}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003161
Nicolas Capens157ba262019-12-10 17:49:14 -05003162RValue<UInt2> operator|(RValue<UInt2> lhs, RValue<UInt2> rhs)
3163{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003164 return RValue<UInt2>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003165}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003166
Nicolas Capens157ba262019-12-10 17:49:14 -05003167RValue<UInt2> operator^(RValue<UInt2> lhs, RValue<UInt2> rhs)
3168{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003169 return RValue<UInt2>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003170}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003171
Nicolas Capens157ba262019-12-10 17:49:14 -05003172RValue<UInt2> operator+=(UInt2 &lhs, RValue<UInt2> rhs)
3173{
3174 return lhs = lhs + rhs;
3175}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003176
Nicolas Capens157ba262019-12-10 17:49:14 -05003177RValue<UInt2> operator-=(UInt2 &lhs, RValue<UInt2> rhs)
3178{
3179 return lhs = lhs - rhs;
3180}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003181
3182// RValue<UInt2> operator*=(UInt2 &lhs, RValue<UInt2> rhs)
3183// {
3184// return lhs = lhs * rhs;
3185// }
3186
3187// RValue<UInt2> operator/=(UInt2 &lhs, RValue<UInt2> rhs)
3188// {
3189// return lhs = lhs / rhs;
3190// }
3191
3192// RValue<UInt2> operator%=(UInt2 &lhs, RValue<UInt2> rhs)
3193// {
3194// return lhs = lhs % rhs;
3195// }
3196
Nicolas Capens157ba262019-12-10 17:49:14 -05003197RValue<UInt2> operator&=(UInt2 &lhs, RValue<UInt2> rhs)
3198{
3199 return lhs = lhs & rhs;
3200}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003201
Nicolas Capens157ba262019-12-10 17:49:14 -05003202RValue<UInt2> operator|=(UInt2 &lhs, RValue<UInt2> rhs)
3203{
3204 return lhs = lhs | rhs;
3205}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003206
Nicolas Capens157ba262019-12-10 17:49:14 -05003207RValue<UInt2> operator^=(UInt2 &lhs, RValue<UInt2> rhs)
3208{
3209 return lhs = lhs ^ rhs;
3210}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003211
Nicolas Capens157ba262019-12-10 17:49:14 -05003212RValue<UInt2> operator<<=(UInt2 &lhs, unsigned char rhs)
3213{
3214 return lhs = lhs << rhs;
3215}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003216
Nicolas Capens157ba262019-12-10 17:49:14 -05003217RValue<UInt2> operator>>=(UInt2 &lhs, unsigned char rhs)
3218{
3219 return lhs = lhs >> rhs;
3220}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003221
3222// RValue<UInt2> operator+(RValue<UInt2> val)
3223// {
3224// return val;
3225// }
3226
3227// RValue<UInt2> operator-(RValue<UInt2> val)
3228// {
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003229// return RValue<UInt2>(Nucleus::createNeg(val.value()));
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003230// }
3231
Nicolas Capens157ba262019-12-10 17:49:14 -05003232RValue<UInt2> operator~(RValue<UInt2> val)
3233{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003234 return RValue<UInt2>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003235}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003236
Nicolas Capens157ba262019-12-10 17:49:14 -05003237RValue<UInt> Extract(RValue<UInt2> val, int i)
3238{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003239 return RValue<UInt>(Nucleus::createExtractElement(val.value(), UInt::type(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05003240}
Ben Clayton8ab40532019-05-10 16:23:13 +01003241
Nicolas Capens157ba262019-12-10 17:49:14 -05003242RValue<UInt2> Insert(RValue<UInt2> val, RValue<UInt> element, int i)
3243{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003244 return RValue<UInt2>(Nucleus::createInsertElement(val.value(), element.value(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05003245}
Ben Clayton8ab40532019-05-10 16:23:13 +01003246
Ben Clayton713b8d32019-12-17 20:37:56 +00003247Int4::Int4()
3248 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003249{
3250}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003251
Ben Clayton713b8d32019-12-17 20:37:56 +00003252Int4::Int4(RValue<Float4> cast)
3253 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003254{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003255 Value *xyzw = Nucleus::createFPToSI(cast.value(), Int4::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003256
Nicolas Capens157ba262019-12-10 17:49:14 -05003257 storeValue(xyzw);
3258}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003259
Ben Clayton713b8d32019-12-17 20:37:56 +00003260Int4::Int4(int xyzw)
3261 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003262{
3263 constant(xyzw, xyzw, xyzw, xyzw);
3264}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003265
Ben Clayton713b8d32019-12-17 20:37:56 +00003266Int4::Int4(int x, int yzw)
3267 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003268{
3269 constant(x, yzw, yzw, yzw);
3270}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003271
Ben Clayton713b8d32019-12-17 20:37:56 +00003272Int4::Int4(int x, int y, int zw)
3273 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003274{
3275 constant(x, y, zw, zw);
3276}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003277
Ben Clayton713b8d32019-12-17 20:37:56 +00003278Int4::Int4(int x, int y, int z, int w)
3279 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003280{
3281 constant(x, y, z, w);
3282}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003283
Nicolas Capens157ba262019-12-10 17:49:14 -05003284void Int4::constant(int x, int y, int z, int w)
3285{
Nicolas Capens4e7d3102022-06-21 01:42:18 -04003286 std::vector<int64_t> constantVector = { x, y, z, w };
Nicolas Capens519cf222020-05-08 15:27:19 -04003287 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003288}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003289
Ben Clayton713b8d32019-12-17 20:37:56 +00003290Int4::Int4(RValue<Int4> rhs)
3291 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003292{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003293 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05003294}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003295
Ben Clayton713b8d32019-12-17 20:37:56 +00003296Int4::Int4(const Int4 &rhs)
3297 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003298{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003299 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003300}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003301
Ben Clayton713b8d32019-12-17 20:37:56 +00003302Int4::Int4(const Reference<Int4> &rhs)
3303 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003304{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003305 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003306}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003307
Ben Clayton713b8d32019-12-17 20:37:56 +00003308Int4::Int4(RValue<UInt4> rhs)
3309 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003310{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003311 storeValue(rhs.value());
Nicolas Capens157ba262019-12-10 17:49:14 -05003312}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003313
Ben Clayton713b8d32019-12-17 20:37:56 +00003314Int4::Int4(const UInt4 &rhs)
3315 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003316{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003317 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05003318}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003319
Ben Clayton713b8d32019-12-17 20:37:56 +00003320Int4::Int4(const Reference<UInt4> &rhs)
3321 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003322{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003323 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05003324}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003325
Ben Clayton713b8d32019-12-17 20:37:56 +00003326Int4::Int4(RValue<Int2> lo, RValue<Int2> hi)
3327 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003328{
Nicolas Capens4e7d3102022-06-21 01:42:18 -04003329 std::vector<int> shuffle = { 0, 1, 4, 5 }; // Real type is v4i32
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003330 Value *packed = Nucleus::createShuffleVector(lo.value(), hi.value(), shuffle);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003331
Nicolas Capens157ba262019-12-10 17:49:14 -05003332 storeValue(packed);
3333}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003334
Ben Clayton713b8d32019-12-17 20:37:56 +00003335Int4::Int4(const Int &rhs)
3336 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003337{
3338 *this = RValue<Int>(rhs.loadValue());
3339}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003340
Ben Clayton713b8d32019-12-17 20:37:56 +00003341Int4::Int4(const Reference<Int> &rhs)
3342 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003343{
3344 *this = RValue<Int>(rhs.loadValue());
3345}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003346
Nicolas Capens82d425d2022-03-02 16:35:20 -05003347RValue<Int4> Int4::operator=(int x)
3348{
3349 return *this = Int4(x, x, x, x);
3350}
3351
Nicolas Capens157ba262019-12-10 17:49:14 -05003352RValue<Int4> Int4::operator=(RValue<Int4> rhs)
3353{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003354 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05003355}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003356
Nicolas Capens157ba262019-12-10 17:49:14 -05003357RValue<Int4> Int4::operator=(const Int4 &rhs)
3358{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003359 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003360}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003361
Nicolas Capens157ba262019-12-10 17:49:14 -05003362RValue<Int4> Int4::operator=(const Reference<Int4> &rhs)
3363{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003364 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003365}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003366
Nicolas Capens157ba262019-12-10 17:49:14 -05003367RValue<Int4> operator+(RValue<Int4> lhs, RValue<Int4> rhs)
3368{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003369 return RValue<Int4>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003370}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003371
Nicolas Capens157ba262019-12-10 17:49:14 -05003372RValue<Int4> operator-(RValue<Int4> lhs, RValue<Int4> rhs)
3373{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003374 return RValue<Int4>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003375}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003376
Nicolas Capens157ba262019-12-10 17:49:14 -05003377RValue<Int4> operator*(RValue<Int4> lhs, RValue<Int4> rhs)
3378{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003379 return RValue<Int4>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003380}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003381
Nicolas Capens157ba262019-12-10 17:49:14 -05003382RValue<Int4> operator/(RValue<Int4> lhs, RValue<Int4> rhs)
3383{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003384 return RValue<Int4>(Nucleus::createSDiv(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003385}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003386
Nicolas Capens157ba262019-12-10 17:49:14 -05003387RValue<Int4> operator%(RValue<Int4> lhs, RValue<Int4> rhs)
3388{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003389 return RValue<Int4>(Nucleus::createSRem(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003390}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003391
Nicolas Capens157ba262019-12-10 17:49:14 -05003392RValue<Int4> operator&(RValue<Int4> lhs, RValue<Int4> rhs)
3393{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003394 return RValue<Int4>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003395}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003396
Nicolas Capens157ba262019-12-10 17:49:14 -05003397RValue<Int4> operator|(RValue<Int4> lhs, RValue<Int4> rhs)
3398{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003399 return RValue<Int4>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003400}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003401
Nicolas Capens157ba262019-12-10 17:49:14 -05003402RValue<Int4> operator^(RValue<Int4> lhs, RValue<Int4> rhs)
3403{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003404 return RValue<Int4>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003405}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003406
Nicolas Capens157ba262019-12-10 17:49:14 -05003407RValue<Int4> operator<<(RValue<Int4> lhs, RValue<Int4> rhs)
3408{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003409 return RValue<Int4>(Nucleus::createShl(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003410}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003411
Nicolas Capens157ba262019-12-10 17:49:14 -05003412RValue<Int4> operator>>(RValue<Int4> lhs, RValue<Int4> rhs)
3413{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003414 return RValue<Int4>(Nucleus::createAShr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003415}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003416
Nicolas Capens157ba262019-12-10 17:49:14 -05003417RValue<Int4> operator+=(Int4 &lhs, RValue<Int4> rhs)
3418{
3419 return lhs = lhs + rhs;
3420}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003421
Nicolas Capens157ba262019-12-10 17:49:14 -05003422RValue<Int4> operator-=(Int4 &lhs, RValue<Int4> rhs)
3423{
3424 return lhs = lhs - rhs;
3425}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003426
Nicolas Capens157ba262019-12-10 17:49:14 -05003427RValue<Int4> operator*=(Int4 &lhs, RValue<Int4> rhs)
3428{
3429 return lhs = lhs * rhs;
3430}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003431
3432// RValue<Int4> operator/=(Int4 &lhs, RValue<Int4> rhs)
3433// {
3434// return lhs = lhs / rhs;
3435// }
3436
3437// RValue<Int4> operator%=(Int4 &lhs, RValue<Int4> rhs)
3438// {
3439// return lhs = lhs % rhs;
3440// }
3441
Nicolas Capens157ba262019-12-10 17:49:14 -05003442RValue<Int4> operator&=(Int4 &lhs, RValue<Int4> rhs)
3443{
3444 return lhs = lhs & rhs;
3445}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003446
Nicolas Capens157ba262019-12-10 17:49:14 -05003447RValue<Int4> operator|=(Int4 &lhs, RValue<Int4> rhs)
3448{
3449 return lhs = lhs | rhs;
3450}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003451
Nicolas Capens157ba262019-12-10 17:49:14 -05003452RValue<Int4> operator^=(Int4 &lhs, RValue<Int4> rhs)
3453{
3454 return lhs = lhs ^ rhs;
3455}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003456
Nicolas Capens157ba262019-12-10 17:49:14 -05003457RValue<Int4> operator<<=(Int4 &lhs, unsigned char rhs)
3458{
3459 return lhs = lhs << rhs;
3460}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003461
Nicolas Capens157ba262019-12-10 17:49:14 -05003462RValue<Int4> operator>>=(Int4 &lhs, unsigned char rhs)
3463{
3464 return lhs = lhs >> rhs;
3465}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003466
Nicolas Capens157ba262019-12-10 17:49:14 -05003467RValue<Int4> operator+(RValue<Int4> val)
3468{
3469 return val;
3470}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003471
Nicolas Capens157ba262019-12-10 17:49:14 -05003472RValue<Int4> operator-(RValue<Int4> val)
3473{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003474 return RValue<Int4>(Nucleus::createNeg(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003475}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003476
Nicolas Capens157ba262019-12-10 17:49:14 -05003477RValue<Int4> operator~(RValue<Int4> val)
3478{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003479 return RValue<Int4>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003480}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003481
Nicolas Capens157ba262019-12-10 17:49:14 -05003482RValue<Int> Extract(RValue<Int4> x, int i)
3483{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003484 return RValue<Int>(Nucleus::createExtractElement(x.value(), Int::type(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05003485}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003486
Nicolas Capens157ba262019-12-10 17:49:14 -05003487RValue<Int4> Insert(RValue<Int4> x, RValue<Int> element, int i)
3488{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003489 return RValue<Int4>(Nucleus::createInsertElement(x.value(), element.value(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05003490}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003491
Nicolas Capens157ba262019-12-10 17:49:14 -05003492RValue<Int4> Swizzle(RValue<Int4> x, uint16_t select)
3493{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003494 return RValue<Int4>(createSwizzle4(x.value(), select));
Nicolas Capens157ba262019-12-10 17:49:14 -05003495}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003496
Nicolas Capens157ba262019-12-10 17:49:14 -05003497RValue<Int4> Shuffle(RValue<Int4> x, RValue<Int4> y, unsigned short select)
3498{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003499 return RValue<Int4>(createShuffle4(x.value(), y.value(), select));
Nicolas Capens157ba262019-12-10 17:49:14 -05003500}
David 'Digit' Turnerb9f03f42019-12-04 19:32:34 +01003501
Ben Clayton713b8d32019-12-17 20:37:56 +00003502UInt4::UInt4()
3503 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003504{
3505}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003506
Ben Clayton713b8d32019-12-17 20:37:56 +00003507UInt4::UInt4(int xyzw)
3508 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003509{
3510 constant(xyzw, xyzw, xyzw, xyzw);
3511}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003512
Ben Clayton713b8d32019-12-17 20:37:56 +00003513UInt4::UInt4(int x, int yzw)
3514 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003515{
3516 constant(x, yzw, yzw, yzw);
3517}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003518
Ben Clayton713b8d32019-12-17 20:37:56 +00003519UInt4::UInt4(int x, int y, int zw)
3520 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003521{
3522 constant(x, y, zw, zw);
3523}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003524
Ben Clayton713b8d32019-12-17 20:37:56 +00003525UInt4::UInt4(int x, int y, int z, int w)
3526 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003527{
3528 constant(x, y, z, w);
3529}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003530
Nicolas Capens157ba262019-12-10 17:49:14 -05003531void UInt4::constant(int x, int y, int z, int w)
3532{
Nicolas Capens4e7d3102022-06-21 01:42:18 -04003533 std::vector<int64_t> constantVector = { x, y, z, w };
Nicolas Capens519cf222020-05-08 15:27:19 -04003534 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003535}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003536
Ben Clayton713b8d32019-12-17 20:37:56 +00003537UInt4::UInt4(RValue<UInt4> rhs)
3538 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003539{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003540 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05003541}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003542
Ben Clayton713b8d32019-12-17 20:37:56 +00003543UInt4::UInt4(const UInt4 &rhs)
3544 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003545{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003546 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003547}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003548
Ben Clayton713b8d32019-12-17 20:37:56 +00003549UInt4::UInt4(const Reference<UInt4> &rhs)
3550 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003551{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003552 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003553}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003554
Ben Clayton713b8d32019-12-17 20:37:56 +00003555UInt4::UInt4(RValue<Int4> rhs)
3556 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003557{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003558 storeValue(rhs.value());
Nicolas Capens157ba262019-12-10 17:49:14 -05003559}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003560
Ben Clayton713b8d32019-12-17 20:37:56 +00003561UInt4::UInt4(const Int4 &rhs)
3562 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003563{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003564 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05003565}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003566
Ben Clayton713b8d32019-12-17 20:37:56 +00003567UInt4::UInt4(const Reference<Int4> &rhs)
3568 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003569{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003570 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05003571}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003572
Ben Clayton713b8d32019-12-17 20:37:56 +00003573UInt4::UInt4(RValue<UInt2> lo, RValue<UInt2> hi)
3574 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003575{
Nicolas Capens4e7d3102022-06-21 01:42:18 -04003576 std::vector<int> shuffle = { 0, 1, 4, 5 }; // Real type is v4i32
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003577 Value *packed = Nucleus::createShuffleVector(lo.value(), hi.value(), shuffle);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003578
Nicolas Capens157ba262019-12-10 17:49:14 -05003579 storeValue(packed);
3580}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003581
Ben Clayton713b8d32019-12-17 20:37:56 +00003582UInt4::UInt4(const UInt &rhs)
3583 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003584{
3585 *this = RValue<UInt>(rhs.loadValue());
3586}
Ben Clayton88816fa2019-05-15 17:08:14 +01003587
Ben Clayton713b8d32019-12-17 20:37:56 +00003588UInt4::UInt4(const Reference<UInt> &rhs)
3589 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003590{
3591 *this = RValue<UInt>(rhs.loadValue());
3592}
Ben Clayton88816fa2019-05-15 17:08:14 +01003593
Nicolas Capens157ba262019-12-10 17:49:14 -05003594RValue<UInt4> UInt4::operator=(RValue<UInt4> rhs)
3595{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003596 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05003597}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003598
Nicolas Capens157ba262019-12-10 17:49:14 -05003599RValue<UInt4> UInt4::operator=(const UInt4 &rhs)
3600{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003601 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003602}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003603
Nicolas Capens157ba262019-12-10 17:49:14 -05003604RValue<UInt4> UInt4::operator=(const Reference<UInt4> &rhs)
3605{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003606 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003607}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003608
Nicolas Capens157ba262019-12-10 17:49:14 -05003609RValue<UInt4> operator+(RValue<UInt4> lhs, RValue<UInt4> rhs)
3610{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003611 return RValue<UInt4>(Nucleus::createAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003612}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003613
Nicolas Capens157ba262019-12-10 17:49:14 -05003614RValue<UInt4> operator-(RValue<UInt4> lhs, RValue<UInt4> rhs)
3615{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003616 return RValue<UInt4>(Nucleus::createSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003617}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003618
Nicolas Capens157ba262019-12-10 17:49:14 -05003619RValue<UInt4> operator*(RValue<UInt4> lhs, RValue<UInt4> rhs)
3620{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003621 return RValue<UInt4>(Nucleus::createMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003622}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003623
Nicolas Capens157ba262019-12-10 17:49:14 -05003624RValue<UInt4> operator/(RValue<UInt4> lhs, RValue<UInt4> rhs)
3625{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003626 return RValue<UInt4>(Nucleus::createUDiv(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003627}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003628
Nicolas Capens157ba262019-12-10 17:49:14 -05003629RValue<UInt4> operator%(RValue<UInt4> lhs, RValue<UInt4> rhs)
3630{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003631 return RValue<UInt4>(Nucleus::createURem(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003632}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003633
Nicolas Capens157ba262019-12-10 17:49:14 -05003634RValue<UInt4> operator&(RValue<UInt4> lhs, RValue<UInt4> rhs)
3635{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003636 return RValue<UInt4>(Nucleus::createAnd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003637}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003638
Nicolas Capens157ba262019-12-10 17:49:14 -05003639RValue<UInt4> operator|(RValue<UInt4> lhs, RValue<UInt4> rhs)
3640{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003641 return RValue<UInt4>(Nucleus::createOr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003642}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003643
Nicolas Capens157ba262019-12-10 17:49:14 -05003644RValue<UInt4> operator^(RValue<UInt4> lhs, RValue<UInt4> rhs)
3645{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003646 return RValue<UInt4>(Nucleus::createXor(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003647}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003648
Nicolas Capens157ba262019-12-10 17:49:14 -05003649RValue<UInt4> operator<<(RValue<UInt4> lhs, RValue<UInt4> rhs)
3650{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003651 return RValue<UInt4>(Nucleus::createShl(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003652}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003653
Nicolas Capens157ba262019-12-10 17:49:14 -05003654RValue<UInt4> operator>>(RValue<UInt4> lhs, RValue<UInt4> rhs)
3655{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003656 return RValue<UInt4>(Nucleus::createLShr(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003657}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003658
Nicolas Capens157ba262019-12-10 17:49:14 -05003659RValue<UInt4> operator+=(UInt4 &lhs, RValue<UInt4> rhs)
3660{
3661 return lhs = lhs + rhs;
3662}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003663
Nicolas Capens157ba262019-12-10 17:49:14 -05003664RValue<UInt4> operator-=(UInt4 &lhs, RValue<UInt4> rhs)
3665{
3666 return lhs = lhs - rhs;
3667}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003668
Nicolas Capens157ba262019-12-10 17:49:14 -05003669RValue<UInt4> operator*=(UInt4 &lhs, RValue<UInt4> rhs)
3670{
3671 return lhs = lhs * rhs;
3672}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003673
3674// RValue<UInt4> operator/=(UInt4 &lhs, RValue<UInt4> rhs)
3675// {
3676// return lhs = lhs / rhs;
3677// }
3678
3679// RValue<UInt4> operator%=(UInt4 &lhs, RValue<UInt4> rhs)
3680// {
3681// return lhs = lhs % rhs;
3682// }
3683
Nicolas Capens157ba262019-12-10 17:49:14 -05003684RValue<UInt4> operator&=(UInt4 &lhs, RValue<UInt4> rhs)
3685{
3686 return lhs = lhs & rhs;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003687}
Nicolas Capens157ba262019-12-10 17:49:14 -05003688
3689RValue<UInt4> operator|=(UInt4 &lhs, RValue<UInt4> rhs)
3690{
3691 return lhs = lhs | rhs;
3692}
3693
3694RValue<UInt4> operator^=(UInt4 &lhs, RValue<UInt4> rhs)
3695{
3696 return lhs = lhs ^ rhs;
3697}
3698
3699RValue<UInt4> operator<<=(UInt4 &lhs, unsigned char rhs)
3700{
3701 return lhs = lhs << rhs;
3702}
3703
3704RValue<UInt4> operator>>=(UInt4 &lhs, unsigned char rhs)
3705{
3706 return lhs = lhs >> rhs;
3707}
3708
3709RValue<UInt4> operator+(RValue<UInt4> val)
3710{
3711 return val;
3712}
3713
3714RValue<UInt4> operator-(RValue<UInt4> val)
3715{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003716 return RValue<UInt4>(Nucleus::createNeg(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003717}
3718
3719RValue<UInt4> operator~(RValue<UInt4> val)
3720{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003721 return RValue<UInt4>(Nucleus::createNot(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003722}
3723
3724RValue<UInt> Extract(RValue<UInt4> x, int i)
3725{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003726 return RValue<UInt>(Nucleus::createExtractElement(x.value(), Int::type(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05003727}
3728
3729RValue<UInt4> Insert(RValue<UInt4> x, RValue<UInt> element, int i)
3730{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003731 return RValue<UInt4>(Nucleus::createInsertElement(x.value(), element.value(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05003732}
3733
3734RValue<UInt4> Swizzle(RValue<UInt4> x, uint16_t select)
3735{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003736 return RValue<UInt4>(createSwizzle4(x.value(), select));
Nicolas Capens157ba262019-12-10 17:49:14 -05003737}
3738
3739RValue<UInt4> Shuffle(RValue<UInt4> x, RValue<UInt4> y, unsigned short select)
3740{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003741 return RValue<UInt4>(createShuffle4(x.value(), y.value(), select));
Nicolas Capens157ba262019-12-10 17:49:14 -05003742}
3743
3744Half::Half(RValue<Float> cast)
3745{
3746 UInt fp32i = As<UInt>(cast);
3747 UInt abs = fp32i & 0x7FFFFFFF;
Ben Clayton713b8d32019-12-17 20:37:56 +00003748 UShort fp16i((fp32i & 0x80000000) >> 16); // sign
Nicolas Capens157ba262019-12-10 17:49:14 -05003749
Ben Clayton713b8d32019-12-17 20:37:56 +00003750 If(abs > 0x47FFEFFF) // Infinity
Nicolas Capens157ba262019-12-10 17:49:14 -05003751 {
3752 fp16i |= UShort(0x7FFF);
3753 }
3754 Else
3755 {
Ben Clayton713b8d32019-12-17 20:37:56 +00003756 If(abs < 0x38800000) // Denormal
Nicolas Capens157ba262019-12-10 17:49:14 -05003757 {
3758 Int mantissa = (abs & 0x007FFFFF) | 0x00800000;
3759 Int e = 113 - (abs >> 23);
Nicolas Capens60f8c2e2019-12-12 13:40:15 -05003760 abs = IfThenElse(e < 24, (mantissa >> e), Int(0));
Nicolas Capens157ba262019-12-10 17:49:14 -05003761 fp16i |= UShort((abs + 0x00000FFF + ((abs >> 13) & 1)) >> 13);
3762 }
3763 Else
3764 {
3765 fp16i |= UShort((abs + 0xC8000000 + 0x00000FFF + ((abs >> 13) & 1)) >> 13);
3766 }
3767 }
3768
3769 storeValue(fp16i.loadValue());
3770}
3771
3772Float::Float(RValue<Int> cast)
3773{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003774 Value *integer = Nucleus::createSIToFP(cast.value(), Float::type());
Nicolas Capens157ba262019-12-10 17:49:14 -05003775
3776 storeValue(integer);
3777}
3778
3779Float::Float(RValue<UInt> cast)
3780{
3781 RValue<Float> result = Float(Int(cast & UInt(0x7FFFFFFF))) +
3782 As<Float>((As<Int>(cast) >> 31) & As<Int>(Float(0x80000000u)));
3783
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003784 storeValue(result.value());
Nicolas Capens157ba262019-12-10 17:49:14 -05003785}
3786
3787Float::Float(RValue<Half> cast)
3788{
3789 Int fp16i(As<UShort>(cast));
3790
3791 Int s = (fp16i >> 15) & 0x00000001;
3792 Int e = (fp16i >> 10) & 0x0000001F;
3793 Int m = fp16i & 0x000003FF;
3794
3795 UInt fp32i(s << 31);
3796 If(e == 0)
3797 {
3798 If(m != 0)
3799 {
3800 While((m & 0x00000400) == 0)
3801 {
3802 m <<= 1;
3803 e -= 1;
3804 }
3805
3806 fp32i |= As<UInt>(((e + (127 - 15) + 1) << 23) | ((m & ~0x00000400) << 13));
3807 }
3808 }
3809 Else
3810 {
3811 fp32i |= As<UInt>(((e + (127 - 15)) << 23) | (m << 13));
3812 }
3813
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003814 storeValue(As<Float>(fp32i).value());
Nicolas Capens157ba262019-12-10 17:49:14 -05003815}
3816
3817Float::Float(float x)
3818{
3819 // C++ does not have a way to write an infinite or NaN literal,
3820 // nor does it allow division by zero as a constant expression.
3821 // Thus we should not accept inf or NaN as a Reactor Float constant,
3822 // as this would typically idicate a bug, and avoids undefined
3823 // behavior.
3824 //
3825 // This also prevents the issue of the LLVM JIT only taking double
3826 // values for constructing floating-point constants. During the
3827 // conversion from single-precision to double, a signaling NaN can
3828 // become a quiet NaN, thus altering its bit pattern. Hence this
3829 // assert is also helpful for detecting cases where integers are
3830 // being reinterpreted as float and then bitcast to integer again,
3831 // which does not guarantee preserving the integer value.
3832 //
Nicolas Capense5720882020-01-13 14:10:04 -05003833 // The inifinity() method can be used to obtain positive infinity.
3834 // Should NaN constants be required, methods like quiet_NaN() and
3835 // signaling_NaN() should be added (matching std::numeric_limits).
Nicolas Capens157ba262019-12-10 17:49:14 -05003836 ASSERT(std::isfinite(x));
3837
3838 storeValue(Nucleus::createConstantFloat(x));
3839}
3840
Nicolas Capense5720882020-01-13 14:10:04 -05003841// TODO(b/140302841): Negative infinity can be obtained by using '-infinity()'.
3842// This comes at a minor run-time JIT cost, and the backend may or may not
3843// perform constant folding. This can be optimized by having Reactor perform
3844// the folding, which would still be cheaper than having a capable backend do it.
3845Float Float::infinity()
3846{
3847 Float result;
3848
3849 constexpr double inf = std::numeric_limits<double>::infinity();
3850 result.storeValue(Nucleus::createConstantFloat(inf));
3851
3852 return result;
3853}
3854
Nicolas Capens157ba262019-12-10 17:49:14 -05003855Float::Float(RValue<Float> rhs)
3856{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003857 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05003858}
3859
3860Float::Float(const Float &rhs)
3861{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003862 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003863}
3864
3865Float::Float(const Reference<Float> &rhs)
3866{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003867 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003868}
3869
3870Float::Float(Argument<Float> argument)
3871{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003872 store(argument.rvalue());
Nicolas Capens157ba262019-12-10 17:49:14 -05003873}
3874
Nicolas Capens0aca3ca2020-09-19 23:59:08 -04003875RValue<Float> Float::operator=(float rhs)
3876{
3877 return RValue<Float>(storeValue(Nucleus::createConstantFloat(rhs)));
3878}
3879
Nicolas Capens157ba262019-12-10 17:49:14 -05003880RValue<Float> Float::operator=(RValue<Float> rhs)
3881{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003882 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05003883}
3884
3885RValue<Float> Float::operator=(const Float &rhs)
3886{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003887 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003888}
3889
3890RValue<Float> Float::operator=(const Reference<Float> &rhs)
3891{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04003892 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05003893}
3894
3895RValue<Float> operator+(RValue<Float> lhs, RValue<Float> rhs)
3896{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003897 return RValue<Float>(Nucleus::createFAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003898}
3899
3900RValue<Float> operator-(RValue<Float> lhs, RValue<Float> rhs)
3901{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003902 return RValue<Float>(Nucleus::createFSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003903}
3904
3905RValue<Float> operator*(RValue<Float> lhs, RValue<Float> rhs)
3906{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003907 return RValue<Float>(Nucleus::createFMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003908}
3909
3910RValue<Float> operator/(RValue<Float> lhs, RValue<Float> rhs)
3911{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003912 return RValue<Float>(Nucleus::createFDiv(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003913}
3914
3915RValue<Float> operator+=(Float &lhs, RValue<Float> rhs)
3916{
3917 return lhs = lhs + rhs;
3918}
3919
3920RValue<Float> operator-=(Float &lhs, RValue<Float> rhs)
3921{
3922 return lhs = lhs - rhs;
3923}
3924
3925RValue<Float> operator*=(Float &lhs, RValue<Float> rhs)
3926{
3927 return lhs = lhs * rhs;
3928}
3929
3930RValue<Float> operator/=(Float &lhs, RValue<Float> rhs)
3931{
3932 return lhs = lhs / rhs;
3933}
3934
3935RValue<Float> operator+(RValue<Float> val)
3936{
3937 return val;
3938}
3939
3940RValue<Float> operator-(RValue<Float> val)
3941{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003942 return RValue<Float>(Nucleus::createFNeg(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003943}
3944
3945RValue<Bool> operator<(RValue<Float> lhs, RValue<Float> rhs)
3946{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003947 return RValue<Bool>(Nucleus::createFCmpOLT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003948}
3949
3950RValue<Bool> operator<=(RValue<Float> lhs, RValue<Float> rhs)
3951{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003952 return RValue<Bool>(Nucleus::createFCmpOLE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003953}
3954
3955RValue<Bool> operator>(RValue<Float> lhs, RValue<Float> rhs)
3956{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003957 return RValue<Bool>(Nucleus::createFCmpOGT(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003958}
3959
3960RValue<Bool> operator>=(RValue<Float> lhs, RValue<Float> rhs)
3961{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003962 return RValue<Bool>(Nucleus::createFCmpOGE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003963}
3964
3965RValue<Bool> operator!=(RValue<Float> lhs, RValue<Float> rhs)
3966{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003967 return RValue<Bool>(Nucleus::createFCmpONE(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003968}
3969
3970RValue<Bool> operator==(RValue<Float> lhs, RValue<Float> rhs)
3971{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003972 return RValue<Bool>(Nucleus::createFCmpOEQ(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003973}
3974
3975RValue<Float> Abs(RValue<Float> x)
3976{
3977 return IfThenElse(x > 0.0f, x, -x);
3978}
3979
3980RValue<Float> Max(RValue<Float> x, RValue<Float> y)
3981{
3982 return IfThenElse(x > y, x, y);
3983}
3984
3985RValue<Float> Min(RValue<Float> x, RValue<Float> y)
3986{
3987 return IfThenElse(x < y, x, y);
3988}
3989
3990Float2::Float2(RValue<Float4> cast)
3991{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04003992 storeValue(Nucleus::createBitCast(cast.value(), type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003993}
3994
Ben Clayton713b8d32019-12-17 20:37:56 +00003995Float4::Float4(RValue<Byte4> cast)
3996 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003997{
3998 Value *a = Int4(cast).loadValue();
Nicolas Capens519cf222020-05-08 15:27:19 -04003999 Value *xyzw = Nucleus::createSIToFP(a, Float4::type());
Nicolas Capens157ba262019-12-10 17:49:14 -05004000
4001 storeValue(xyzw);
4002}
4003
Ben Clayton713b8d32019-12-17 20:37:56 +00004004Float4::Float4(RValue<SByte4> 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<Short4> cast)
4014 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004015{
4016 Int4 c(cast);
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004017 storeValue(Nucleus::createSIToFP(RValue<Int4>(c).value(), Float4::type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05004018}
4019
Ben Clayton713b8d32019-12-17 20:37:56 +00004020Float4::Float4(RValue<UShort4> cast)
4021 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004022{
4023 Int4 c(cast);
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004024 storeValue(Nucleus::createSIToFP(RValue<Int4>(c).value(), Float4::type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05004025}
4026
Ben Clayton713b8d32019-12-17 20:37:56 +00004027Float4::Float4(RValue<Int4> cast)
4028 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004029{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004030 Value *xyzw = Nucleus::createSIToFP(cast.value(), Float4::type());
Nicolas Capens157ba262019-12-10 17:49:14 -05004031
4032 storeValue(xyzw);
4033}
4034
Ben Clayton713b8d32019-12-17 20:37:56 +00004035Float4::Float4(RValue<UInt4> cast)
4036 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004037{
4038 RValue<Float4> result = Float4(Int4(cast & UInt4(0x7FFFFFFF))) +
4039 As<Float4>((As<Int4>(cast) >> 31) & As<Int4>(Float4(0x80000000u)));
4040
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004041 storeValue(result.value());
Nicolas Capens157ba262019-12-10 17:49:14 -05004042}
4043
Ben Clayton713b8d32019-12-17 20:37:56 +00004044Float4::Float4()
4045 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004046{
4047}
4048
Ben Clayton713b8d32019-12-17 20:37:56 +00004049Float4::Float4(float xyzw)
4050 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004051{
4052 constant(xyzw, xyzw, xyzw, xyzw);
4053}
4054
Ben Clayton713b8d32019-12-17 20:37:56 +00004055Float4::Float4(float x, float yzw)
4056 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004057{
4058 constant(x, yzw, yzw, yzw);
4059}
4060
Ben Clayton713b8d32019-12-17 20:37:56 +00004061Float4::Float4(float x, float y, float zw)
4062 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004063{
4064 constant(x, y, zw, zw);
4065}
4066
Ben Clayton713b8d32019-12-17 20:37:56 +00004067Float4::Float4(float x, float y, float z, float w)
4068 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004069{
4070 constant(x, y, z, w);
4071}
4072
Nicolas Capense5720882020-01-13 14:10:04 -05004073Float4 Float4::infinity()
Nicolas Capens157ba262019-12-10 17:49:14 -05004074{
4075 Float4 result;
Nicolas Capens157ba262019-12-10 17:49:14 -05004076
Nicolas Capense5720882020-01-13 14:10:04 -05004077 constexpr double inf = std::numeric_limits<double>::infinity();
Nicolas Capens4e7d3102022-06-21 01:42:18 -04004078 std::vector<double> constantVector = { inf };
Nicolas Capens519cf222020-05-08 15:27:19 -04004079 result.storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capense5720882020-01-13 14:10:04 -05004080
4081 return result;
Nicolas Capens157ba262019-12-10 17:49:14 -05004082}
4083
4084void Float4::constant(float x, float y, float z, float w)
4085{
4086 // See Float(float) constructor for the rationale behind this assert.
4087 ASSERT(std::isfinite(x) && std::isfinite(y) && std::isfinite(z) && std::isfinite(w));
4088
Nicolas Capens4e7d3102022-06-21 01:42:18 -04004089 std::vector<double> constantVector = { x, y, z, w };
Nicolas Capens519cf222020-05-08 15:27:19 -04004090 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05004091}
4092
Ben Clayton713b8d32019-12-17 20:37:56 +00004093Float4::Float4(RValue<Float4> rhs)
4094 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004095{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04004096 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05004097}
4098
Ben Clayton713b8d32019-12-17 20:37:56 +00004099Float4::Float4(const Float4 &rhs)
4100 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004101{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04004102 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05004103}
4104
Ben Clayton713b8d32019-12-17 20:37:56 +00004105Float4::Float4(const Reference<Float4> &rhs)
4106 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004107{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04004108 store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05004109}
4110
Ben Clayton713b8d32019-12-17 20:37:56 +00004111Float4::Float4(const Float &rhs)
4112 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004113{
4114 *this = RValue<Float>(rhs.loadValue());
4115}
4116
Ben Clayton713b8d32019-12-17 20:37:56 +00004117Float4::Float4(const Reference<Float> &rhs)
4118 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004119{
4120 *this = RValue<Float>(rhs.loadValue());
4121}
4122
Nicolas Capens419b7d72020-10-02 16:15:34 -04004123Float4::Float4(RValue<Float2> lo, RValue<Float2> hi)
4124 : XYZW(this)
4125{
Nicolas Capens4e7d3102022-06-21 01:42:18 -04004126 std::vector<int> shuffle = { 0, 1, 4, 5 }; // Real type is v4i32
Nicolas Capens419b7d72020-10-02 16:15:34 -04004127 Value *packed = Nucleus::createShuffleVector(lo.value(), hi.value(), shuffle);
4128
4129 storeValue(packed);
4130}
4131
Nicolas Capens157ba262019-12-10 17:49:14 -05004132RValue<Float4> Float4::operator=(float x)
4133{
4134 return *this = Float4(x, x, x, x);
4135}
4136
4137RValue<Float4> Float4::operator=(RValue<Float4> rhs)
4138{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04004139 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05004140}
4141
4142RValue<Float4> Float4::operator=(const Float4 &rhs)
4143{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04004144 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05004145}
4146
4147RValue<Float4> Float4::operator=(const Reference<Float4> &rhs)
4148{
Nicolas Capensb4e4f112020-05-01 23:06:41 -04004149 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05004150}
4151
4152RValue<Float4> Float4::operator=(RValue<Float> rhs)
4153{
4154 return *this = Float4(rhs);
4155}
4156
4157RValue<Float4> Float4::operator=(const Float &rhs)
4158{
4159 return *this = Float4(rhs);
4160}
4161
4162RValue<Float4> Float4::operator=(const Reference<Float> &rhs)
4163{
4164 return *this = Float4(rhs);
4165}
4166
4167RValue<Float4> operator+(RValue<Float4> lhs, RValue<Float4> rhs)
4168{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004169 return RValue<Float4>(Nucleus::createFAdd(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05004170}
4171
4172RValue<Float4> operator-(RValue<Float4> lhs, RValue<Float4> rhs)
4173{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004174 return RValue<Float4>(Nucleus::createFSub(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05004175}
4176
4177RValue<Float4> operator*(RValue<Float4> lhs, RValue<Float4> rhs)
4178{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004179 return RValue<Float4>(Nucleus::createFMul(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05004180}
4181
4182RValue<Float4> operator/(RValue<Float4> lhs, RValue<Float4> rhs)
4183{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004184 return RValue<Float4>(Nucleus::createFDiv(lhs.value(), rhs.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05004185}
4186
Nicolas Capens157ba262019-12-10 17:49:14 -05004187RValue<Float4> operator+=(Float4 &lhs, RValue<Float4> rhs)
4188{
4189 return lhs = lhs + rhs;
4190}
4191
4192RValue<Float4> operator-=(Float4 &lhs, RValue<Float4> rhs)
4193{
4194 return lhs = lhs - rhs;
4195}
4196
4197RValue<Float4> operator*=(Float4 &lhs, RValue<Float4> rhs)
4198{
4199 return lhs = lhs * rhs;
4200}
4201
4202RValue<Float4> operator/=(Float4 &lhs, RValue<Float4> rhs)
4203{
4204 return lhs = lhs / rhs;
4205}
4206
4207RValue<Float4> operator%=(Float4 &lhs, RValue<Float4> rhs)
4208{
4209 return lhs = lhs % rhs;
4210}
4211
4212RValue<Float4> operator+(RValue<Float4> val)
4213{
4214 return val;
4215}
4216
4217RValue<Float4> operator-(RValue<Float4> val)
4218{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004219 return RValue<Float4>(Nucleus::createFNeg(val.value()));
Nicolas Capens157ba262019-12-10 17:49:14 -05004220}
4221
Nicolas Capens157ba262019-12-10 17:49:14 -05004222RValue<Float4> Insert(RValue<Float4> x, RValue<Float> element, int i)
4223{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004224 return RValue<Float4>(Nucleus::createInsertElement(x.value(), element.value(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05004225}
4226
4227RValue<Float> Extract(RValue<Float4> x, int i)
4228{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004229 return RValue<Float>(Nucleus::createExtractElement(x.value(), Float::type(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05004230}
4231
4232RValue<Float4> Swizzle(RValue<Float4> x, uint16_t select)
4233{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004234 return RValue<Float4>(createSwizzle4(x.value(), select));
Nicolas Capens157ba262019-12-10 17:49:14 -05004235}
4236
4237RValue<Float4> Shuffle(RValue<Float4> x, RValue<Float4> y, uint16_t select)
4238{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004239 return RValue<Float4>(createShuffle4(x.value(), y.value(), select));
Nicolas Capens157ba262019-12-10 17:49:14 -05004240}
4241
4242RValue<Float4> ShuffleLowHigh(RValue<Float4> x, RValue<Float4> y, uint16_t imm)
4243{
Nicolas Capens4e7d3102022-06-21 01:42:18 -04004244 std::vector<int> shuffle = {
Nicolas Capens157ba262019-12-10 17:49:14 -05004245 ((imm >> 12) & 0x03) + 0,
Ben Clayton713b8d32019-12-17 20:37:56 +00004246 ((imm >> 8) & 0x03) + 0,
4247 ((imm >> 4) & 0x03) + 4,
4248 ((imm >> 0) & 0x03) + 4,
Nicolas Capens157ba262019-12-10 17:49:14 -05004249 };
4250
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004251 return RValue<Float4>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05004252}
4253
4254RValue<Float4> UnpackLow(RValue<Float4> x, RValue<Float4> y)
4255{
Nicolas Capens4e7d3102022-06-21 01:42:18 -04004256 std::vector<int> shuffle = { 0, 4, 1, 5 };
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004257 return RValue<Float4>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05004258}
4259
4260RValue<Float4> UnpackHigh(RValue<Float4> x, RValue<Float4> y)
4261{
Nicolas Capens4e7d3102022-06-21 01:42:18 -04004262 std::vector<int> shuffle = { 2, 6, 3, 7 };
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004263 return RValue<Float4>(Nucleus::createShuffleVector(x.value(), y.value(), shuffle));
Nicolas Capens157ba262019-12-10 17:49:14 -05004264}
4265
4266RValue<Float4> Mask(Float4 &lhs, RValue<Float4> rhs, uint16_t select)
4267{
4268 Value *vector = lhs.loadValue();
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004269 Value *result = createMask4(vector, rhs.value(), select);
Nicolas Capens157ba262019-12-10 17:49:14 -05004270 lhs.storeValue(result);
4271
4272 return RValue<Float4>(result);
4273}
4274
4275RValue<Int4> IsInf(RValue<Float4> x)
4276{
4277 return CmpEQ(As<Int4>(x) & Int4(0x7FFFFFFF), Int4(0x7F800000));
4278}
4279
4280RValue<Int4> IsNan(RValue<Float4> x)
4281{
4282 return ~CmpEQ(x, x);
4283}
4284
Nicolas Capens442e25b2022-06-22 12:02:52 -04004285RValue<Float> Exp2(RValue<Float> x)
4286{
4287 return Call(exp2f, x);
4288}
4289
4290RValue<Float> Log2(RValue<Float> x)
4291{
4292 return Call(log2f, x);
4293}
4294
4295RValue<Float4> Sin(RValue<Float4> x)
4296{
4297 return ScalarizeCall(sinf, x);
4298}
4299
4300RValue<Float4> Cos(RValue<Float4> x)
4301{
4302 return ScalarizeCall(cosf, x);
4303}
4304
4305RValue<Float4> Tan(RValue<Float4> x)
4306{
4307 return ScalarizeCall(tanf, x);
4308}
4309
4310RValue<Float4> Asin(RValue<Float4> x)
4311{
4312 return ScalarizeCall(asinf, x);
4313}
4314
4315RValue<Float4> Acos(RValue<Float4> x)
4316{
4317 return ScalarizeCall(acosf, x);
4318}
4319
4320RValue<Float4> Atan(RValue<Float4> x)
4321{
4322 return ScalarizeCall(atanf, x);
4323}
4324
4325RValue<Float4> Sinh(RValue<Float4> x)
4326{
4327 return ScalarizeCall(sinhf, x);
4328}
4329
4330RValue<Float4> Cosh(RValue<Float4> x)
4331{
4332 return ScalarizeCall(coshf, x);
4333}
4334
4335RValue<Float4> Tanh(RValue<Float4> x)
4336{
4337 return ScalarizeCall(tanhf, x);
4338}
4339
4340RValue<Float4> Asinh(RValue<Float4> x)
4341{
4342 return ScalarizeCall(asinhf, x);
4343}
4344
4345RValue<Float4> Acosh(RValue<Float4> x)
4346{
4347 return ScalarizeCall(acoshf, x);
4348}
4349
4350RValue<Float4> Atanh(RValue<Float4> x)
4351{
4352 return ScalarizeCall(atanhf, x);
4353}
4354
4355RValue<Float4> Atan2(RValue<Float4> x, RValue<Float4> y)
4356{
4357 return ScalarizeCall(atan2f, x, y);
4358}
4359
4360RValue<Float4> Pow(RValue<Float4> x, RValue<Float4> y)
4361{
4362 return ScalarizeCall(powf, x, y);
4363}
4364
4365RValue<Float4> Exp(RValue<Float4> x)
4366{
4367 return ScalarizeCall(expf, x);
4368}
4369
4370RValue<Float4> Log(RValue<Float4> x)
4371{
4372 return ScalarizeCall(logf, x);
4373}
4374
4375RValue<Float4> Exp2(RValue<Float4> x)
4376{
4377 return ScalarizeCall(exp2f, x);
4378}
4379
4380RValue<Float4> Log2(RValue<Float4> x)
4381{
4382 return ScalarizeCall(log2f, x);
4383}
4384
Nicolas Capens157ba262019-12-10 17:49:14 -05004385RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, int offset)
4386{
4387 return lhs + RValue<Int>(Nucleus::createConstantInt(offset));
4388}
4389
4390RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, RValue<Int> offset)
4391{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004392 return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value(), Byte::type(), offset.value(), false));
Nicolas Capens157ba262019-12-10 17:49:14 -05004393}
4394
4395RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, RValue<UInt> offset)
4396{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004397 return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value(), Byte::type(), offset.value(), true));
Nicolas Capens157ba262019-12-10 17:49:14 -05004398}
4399
4400RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, int offset)
4401{
4402 return lhs = lhs + offset;
4403}
4404
4405RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, RValue<Int> offset)
4406{
4407 return lhs = lhs + offset;
4408}
4409
4410RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, RValue<UInt> offset)
4411{
4412 return lhs = lhs + offset;
4413}
4414
4415RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, int offset)
4416{
4417 return lhs + -offset;
4418}
4419
4420RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, RValue<Int> offset)
4421{
4422 return lhs + -offset;
4423}
4424
4425RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, RValue<UInt> offset)
4426{
4427 return lhs + -offset;
4428}
4429
4430RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, int offset)
4431{
4432 return lhs = lhs - offset;
4433}
4434
4435RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, RValue<Int> offset)
4436{
4437 return lhs = lhs - offset;
4438}
4439
4440RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, RValue<UInt> offset)
4441{
4442 return lhs = lhs - offset;
4443}
4444
Sean Risser19e30802022-06-01 10:58:10 -04004445RValue<Bool> AnyTrue(const RValue<Int4> &bools)
4446{
4447 return SignMask(bools) != 0;
4448}
4449
4450RValue<Bool> AnyFalse(const RValue<Int4> &bools)
4451{
4452 return SignMask(~bools) != 0; // TODO(b/214588983): Compare against mask of 4 1's to avoid bitwise NOT.
4453}
4454
4455RValue<Bool> AllTrue(const RValue<Int4> &bools)
4456{
4457 return SignMask(~bools) == 0; // TODO(b/214588983): Compare against mask of 4 1's to avoid bitwise NOT.
4458}
4459
4460RValue<Bool> AllFalse(const RValue<Int4> &bools)
4461{
4462 return SignMask(bools) == 0;
4463}
4464
4465RValue<Bool> Divergent(const RValue<Int4> &ints)
4466{
4467 auto broadcastFirst = Int4(Extract(ints, 0));
4468 return AnyTrue(CmpNEQ(broadcastFirst, ints));
4469}
4470
4471RValue<Bool> Divergent(const RValue<Float4> &floats)
4472{
4473 auto broadcastFirst = Float4(Extract(floats, 0));
4474 return AnyTrue(CmpNEQ(broadcastFirst, floats));
4475}
4476
4477RValue<Bool> Uniform(const RValue<Int4> &ints)
4478{
4479 auto broadcastFirst = Int4(Extract(ints, 0));
4480 return AllFalse(CmpNEQ(broadcastFirst, ints));
4481}
4482
4483RValue<Bool> Uniform(const RValue<Float4> &floats)
4484{
4485 auto broadcastFirst = Float4(Extract(floats, 0));
4486 return AllFalse(CmpNEQ(broadcastFirst, floats));
4487}
4488
Nicolas Capens157ba262019-12-10 17:49:14 -05004489void Return()
4490{
4491 Nucleus::createRetVoid();
4492 // Place any unreachable instructions in an unreferenced block.
4493 Nucleus::setInsertBlock(Nucleus::createBasicBlock());
4494}
4495
4496void branch(RValue<Bool> cmp, BasicBlock *bodyBB, BasicBlock *endBB)
4497{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004498 Nucleus::createCondBr(cmp.value(), bodyBB, endBB);
Nicolas Capens157ba262019-12-10 17:49:14 -05004499 Nucleus::setInsertBlock(bodyBB);
4500}
4501
4502RValue<Float4> MaskedLoad(RValue<Pointer<Float4>> base, RValue<Int4> mask, unsigned int alignment, bool zeroMaskedLanes /* = false */)
4503{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004504 return RValue<Float4>(Nucleus::createMaskedLoad(base.value(), Float::type(), mask.value(), alignment, zeroMaskedLanes));
Nicolas Capens157ba262019-12-10 17:49:14 -05004505}
4506
4507RValue<Int4> MaskedLoad(RValue<Pointer<Int4>> base, RValue<Int4> mask, unsigned int alignment, bool zeroMaskedLanes /* = false */)
4508{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004509 return RValue<Int4>(Nucleus::createMaskedLoad(base.value(), Int::type(), mask.value(), alignment, zeroMaskedLanes));
Nicolas Capens157ba262019-12-10 17:49:14 -05004510}
4511
4512void MaskedStore(RValue<Pointer<Float4>> base, RValue<Float4> val, RValue<Int4> mask, unsigned int alignment)
4513{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004514 Nucleus::createMaskedStore(base.value(), val.value(), mask.value(), alignment);
Nicolas Capens157ba262019-12-10 17:49:14 -05004515}
4516
4517void MaskedStore(RValue<Pointer<Int4>> base, RValue<Int4> val, RValue<Int4> mask, unsigned int alignment)
4518{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004519 Nucleus::createMaskedStore(base.value(), val.value(), mask.value(), alignment);
Nicolas Capens157ba262019-12-10 17:49:14 -05004520}
4521
4522void Fence(std::memory_order memoryOrder)
4523{
4524 ASSERT_MSG(memoryOrder == std::memory_order_acquire ||
Ben Clayton713b8d32019-12-17 20:37:56 +00004525 memoryOrder == std::memory_order_release ||
4526 memoryOrder == std::memory_order_acq_rel ||
4527 memoryOrder == std::memory_order_seq_cst,
4528 "Unsupported memoryOrder: %d", int(memoryOrder));
Nicolas Capens157ba262019-12-10 17:49:14 -05004529 Nucleus::createFence(memoryOrder);
4530}
4531
Ben Clayton713b8d32019-12-17 20:37:56 +00004532Bool CToReactor<bool>::cast(bool v)
4533{
4534 return type(v);
4535}
4536Byte CToReactor<uint8_t>::cast(uint8_t v)
4537{
4538 return type(v);
4539}
4540SByte CToReactor<int8_t>::cast(int8_t v)
4541{
4542 return type(v);
4543}
4544Short CToReactor<int16_t>::cast(int16_t v)
4545{
4546 return type(v);
4547}
4548UShort CToReactor<uint16_t>::cast(uint16_t v)
4549{
4550 return type(v);
4551}
4552Int CToReactor<int32_t>::cast(int32_t v)
4553{
4554 return type(v);
4555}
4556UInt CToReactor<uint32_t>::cast(uint32_t v)
4557{
4558 return type(v);
4559}
4560Float CToReactor<float>::cast(float v)
4561{
4562 return type(v);
4563}
4564Float4 CToReactor<float[4]>::cast(float v[4])
4565{
4566 return type(v[0], v[1], v[2], v[3]);
4567}
Nicolas Capens157ba262019-12-10 17:49:14 -05004568
4569// TODO: Long has no constructor that takes a uint64_t
4570// Long CToReactor<uint64_t>::cast(uint64_t v) { return type(v); }
4571
Antonio Maiorano62427e02020-02-13 09:18:05 -05004572#ifdef ENABLE_RR_PRINT
4573static std::string replaceAll(std::string str, const std::string &substr, const std::string &replacement)
4574{
4575 size_t pos = 0;
4576 while((pos = str.find(substr, pos)) != std::string::npos)
4577 {
4578 str.replace(pos, substr.length(), replacement);
4579 pos += replacement.length();
4580 }
4581 return str;
4582}
4583
Nicolas Capens90fdde32022-06-27 12:29:57 -04004584// extractAll returns a vector containing the extracted n scalar values of the vector vec.
Antonio Maiorano62427e02020-02-13 09:18:05 -05004585static std::vector<Value *> extractAll(Value *vec, int n)
4586{
4587 Type *elemTy = Nucleus::getContainedType(Nucleus::getType(vec));
4588 std::vector<Value *> elements;
4589 elements.reserve(n);
4590 for(int i = 0; i < n; i++)
4591 {
4592 auto el = Nucleus::createExtractElement(vec, elemTy, i);
4593 elements.push_back(el);
4594 }
4595 return elements;
4596}
4597
4598// toInt returns all the integer values in vals extended to a printf-required storage value
4599static std::vector<Value *> toInt(const std::vector<Value *> &vals, bool isSigned)
4600{
Nicolas Capens519cf222020-05-08 15:27:19 -04004601 auto storageTy = Nucleus::getPrintfStorageType(Int::type());
Antonio Maiorano62427e02020-02-13 09:18:05 -05004602 std::vector<Value *> elements;
4603 elements.reserve(vals.size());
4604 for(auto v : vals)
4605 {
4606 if(isSigned)
4607 {
4608 elements.push_back(Nucleus::createSExt(v, storageTy));
4609 }
4610 else
4611 {
4612 elements.push_back(Nucleus::createZExt(v, storageTy));
4613 }
4614 }
4615 return elements;
4616}
4617
4618// toFloat returns all the float values in vals extended to extended to a printf-required storage value
4619static std::vector<Value *> toFloat(const std::vector<Value *> &vals)
4620{
Nicolas Capens519cf222020-05-08 15:27:19 -04004621 auto storageTy = Nucleus::getPrintfStorageType(Float::type());
Antonio Maiorano62427e02020-02-13 09:18:05 -05004622 std::vector<Value *> elements;
4623 elements.reserve(vals.size());
4624 for(auto v : vals)
4625 {
4626 elements.push_back(Nucleus::createFPExt(v, storageTy));
4627 }
4628 return elements;
4629}
4630
4631std::vector<Value *> PrintValue::Ty<Bool>::val(const RValue<Bool> &v)
4632{
4633 auto t = Nucleus::createConstantString("true");
4634 auto f = Nucleus::createConstantString("false");
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004635 return { Nucleus::createSelect(v.value(), t, f) };
Antonio Maiorano62427e02020-02-13 09:18:05 -05004636}
4637
4638std::vector<Value *> PrintValue::Ty<Byte>::val(const RValue<Byte> &v)
4639{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004640 return toInt({ v.value() }, false);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004641}
4642
4643std::vector<Value *> PrintValue::Ty<Byte4>::val(const RValue<Byte4> &v)
4644{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004645 return toInt(extractAll(v.value(), 4), false);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004646}
4647
4648std::vector<Value *> PrintValue::Ty<Int>::val(const RValue<Int> &v)
4649{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004650 return toInt({ v.value() }, true);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004651}
4652
4653std::vector<Value *> PrintValue::Ty<Int2>::val(const RValue<Int2> &v)
4654{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004655 return toInt(extractAll(v.value(), 2), true);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004656}
4657
4658std::vector<Value *> PrintValue::Ty<Int4>::val(const RValue<Int4> &v)
4659{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004660 return toInt(extractAll(v.value(), 4), true);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004661}
4662
4663std::vector<Value *> PrintValue::Ty<UInt>::val(const RValue<UInt> &v)
4664{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004665 return toInt({ v.value() }, false);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004666}
4667
4668std::vector<Value *> PrintValue::Ty<UInt2>::val(const RValue<UInt2> &v)
4669{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004670 return toInt(extractAll(v.value(), 2), false);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004671}
4672
4673std::vector<Value *> PrintValue::Ty<UInt4>::val(const RValue<UInt4> &v)
4674{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004675 return toInt(extractAll(v.value(), 4), false);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004676}
4677
4678std::vector<Value *> PrintValue::Ty<Short>::val(const RValue<Short> &v)
4679{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004680 return toInt({ v.value() }, true);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004681}
4682
4683std::vector<Value *> PrintValue::Ty<Short4>::val(const RValue<Short4> &v)
4684{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004685 return toInt(extractAll(v.value(), 4), true);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004686}
4687
4688std::vector<Value *> PrintValue::Ty<UShort>::val(const RValue<UShort> &v)
4689{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004690 return toInt({ v.value() }, false);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004691}
4692
4693std::vector<Value *> PrintValue::Ty<UShort4>::val(const RValue<UShort4> &v)
4694{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004695 return toInt(extractAll(v.value(), 4), false);
Antonio Maiorano62427e02020-02-13 09:18:05 -05004696}
4697
4698std::vector<Value *> PrintValue::Ty<Float>::val(const RValue<Float> &v)
4699{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004700 return toFloat({ v.value() });
Antonio Maiorano62427e02020-02-13 09:18:05 -05004701}
4702
4703std::vector<Value *> PrintValue::Ty<Float4>::val(const RValue<Float4> &v)
4704{
Nicolas Capensb6e8c3f2020-05-01 23:28:37 -04004705 return toFloat(extractAll(v.value(), 4));
Antonio Maiorano62427e02020-02-13 09:18:05 -05004706}
4707
Nicolas Capens90fdde32022-06-27 12:29:57 -04004708std::vector<Value *> PrintValue::Ty<SIMD::Int>::val(const RValue<SIMD::Int> &v)
4709{
4710 return toInt(extractAll(v.value(), SIMD::Width), true);
4711}
4712
4713std::vector<Value *> PrintValue::Ty<SIMD::UInt>::val(const RValue<SIMD::UInt> &v)
4714{
4715 return toInt(extractAll(v.value(), SIMD::Width), false);
4716}
4717
4718std::vector<Value *> PrintValue::Ty<SIMD::Float>::val(const RValue<SIMD::Float> &v)
4719{
4720 return toFloat(extractAll(v.value(), SIMD::Width));
4721}
4722
Antonio Maiorano62427e02020-02-13 09:18:05 -05004723std::vector<Value *> PrintValue::Ty<const char *>::val(const char *v)
4724{
4725 return { Nucleus::createConstantString(v) };
4726}
4727
4728void Printv(const char *function, const char *file, int line, const char *fmt, std::initializer_list<PrintValue> args)
4729{
4730 // Build the printf format message string.
4731 std::string str;
4732 if(file != nullptr) { str += (line > 0) ? "%s:%d " : "%s "; }
4733 if(function != nullptr) { str += "%s "; }
4734 str += fmt;
4735
4736 // Perform substitution on all '{n}' bracketed indices in the format
4737 // message.
4738 int i = 0;
4739 for(const PrintValue &arg : args)
4740 {
4741 str = replaceAll(str, "{" + std::to_string(i++) + "}", arg.format);
4742 }
4743
4744 std::vector<Value *> vals;
4745 vals.reserve(8);
4746
4747 // The format message is always the first argument.
4748 vals.push_back(Nucleus::createConstantString(str));
4749
4750 // Add optional file, line and function info if provided.
4751 if(file != nullptr)
4752 {
4753 vals.push_back(Nucleus::createConstantString(file));
4754 if(line > 0)
4755 {
4756 vals.push_back(Nucleus::createConstantInt(line));
4757 }
4758 }
4759 if(function != nullptr)
4760 {
4761 vals.push_back(Nucleus::createConstantString(function));
4762 }
4763
4764 // Add all format arguments.
4765 for(const PrintValue &arg : args)
4766 {
4767 for(auto val : arg.values)
4768 {
4769 vals.push_back(val);
4770 }
4771 }
4772
4773 // This call is implemented by each backend
4774 VPrintf(vals);
4775}
Antonio Maiorano8cbee412020-06-10 15:59:20 -04004776
4777// This is the function that is called by VPrintf from the backends
4778int DebugPrintf(const char *format, ...)
4779{
4780 // Uncomment this to make it so that we do not print, but the call to this function is emitted.
4781 // Useful when debugging emitted code to see the Reactor source location.
Sean Risseree0d0b42022-04-20 16:27:26 -04004782 // # define RR_PRINT_OUTPUT_TYPE_STUB
Antonio Maiorano8cbee412020-06-10 15:59:20 -04004783
4784# if defined(RR_PRINT_OUTPUT_TYPE_STUB)
4785 return 0;
4786# else
4787
4788 int result;
4789 va_list args;
4790
4791 va_start(args, format);
4792 char buffer[2048];
4793 result = vsprintf(buffer, format, args);
4794 va_end(args);
4795
4796 std::fputs(buffer, stdout);
4797# if defined(_WIN32)
4798 OutputDebugString(buffer);
4799# endif
4800
4801 return result;
4802# endif
4803}
4804
Antonio Maiorano62427e02020-02-13 09:18:05 -05004805#endif // ENABLE_RR_PRINT
4806
Antonio Maioranod1561872020-12-14 14:03:53 -05004807// Functions implemented by backends
4808bool HasRcpApprox();
4809RValue<Float4> RcpApprox(RValue<Float4> x, bool exactAtPow2 = false);
4810RValue<Float> RcpApprox(RValue<Float> x, bool exactAtPow2 = false);
4811
4812template<typename T>
Nicolas Capensd04f3f52022-02-05 01:19:14 -05004813static RValue<T> DoRcp(RValue<T> x, bool relaxedPrecision, bool exactAtPow2)
Antonio Maioranod1561872020-12-14 14:03:53 -05004814{
4815#if defined(__i386__) || defined(__x86_64__) // On x86, 1/x is fast enough, except for lower precision
Nicolas Capensd04f3f52022-02-05 01:19:14 -05004816 bool approx = HasRcpApprox() && relaxedPrecision;
Antonio Maioranod1561872020-12-14 14:03:53 -05004817#else
4818 bool approx = HasRcpApprox();
4819#endif
4820
4821 T rcp;
4822
4823 if(approx)
4824 {
4825 rcp = RcpApprox(x, exactAtPow2);
4826
Nicolas Capensd04f3f52022-02-05 01:19:14 -05004827 if(!relaxedPrecision)
Antonio Maioranod1561872020-12-14 14:03:53 -05004828 {
4829 // Perform one more iteration of Newton-Rhapson division to increase precision
4830 rcp = (rcp + rcp) - (x * rcp * rcp);
4831 }
4832 }
4833 else
4834 {
4835 rcp = T(1.0f) / x;
4836 }
4837
Antonio Maioranod1561872020-12-14 14:03:53 -05004838 return rcp;
4839}
4840
Nicolas Capensd04f3f52022-02-05 01:19:14 -05004841RValue<Float4> Rcp(RValue<Float4> x, bool relaxedPrecision, bool exactAtPow2)
Antonio Maioranod1561872020-12-14 14:03:53 -05004842{
4843 RR_DEBUG_INFO_UPDATE_LOC();
Nicolas Capensd04f3f52022-02-05 01:19:14 -05004844 return DoRcp(x, relaxedPrecision, exactAtPow2);
Antonio Maioranod1561872020-12-14 14:03:53 -05004845}
4846
Nicolas Capensd04f3f52022-02-05 01:19:14 -05004847RValue<Float> Rcp(RValue<Float> x, bool relaxedPrecision, bool exactAtPow2)
Antonio Maioranod1561872020-12-14 14:03:53 -05004848{
4849 RR_DEBUG_INFO_UPDATE_LOC();
Nicolas Capensd04f3f52022-02-05 01:19:14 -05004850 return DoRcp(x, relaxedPrecision, exactAtPow2);
Antonio Maioranod1561872020-12-14 14:03:53 -05004851}
4852
Antonio Maiorano1cc5b332020-12-14 16:57:28 -05004853// Functions implemented by backends
4854bool HasRcpSqrtApprox();
4855RValue<Float4> RcpSqrtApprox(RValue<Float4> x);
4856RValue<Float> RcpSqrtApprox(RValue<Float> x);
4857
4858template<typename T>
4859struct CastToIntType;
4860
4861template<>
4862struct CastToIntType<Float4>
4863{
4864 using type = Int4;
4865};
4866
4867template<>
4868struct CastToIntType<Float>
4869{
4870 using type = Int;
4871};
4872
4873// TODO: move to Reactor.hpp?
4874RValue<Int> CmpNEQ(RValue<Int> x, RValue<Int> y)
4875{
4876 return IfThenElse(x != y, Int(~0), Int(0));
4877}
4878
4879template<typename T>
Nicolas Capensd04f3f52022-02-05 01:19:14 -05004880static RValue<T> DoRcpSqrt(RValue<T> x, bool relaxedPrecision)
Antonio Maiorano1cc5b332020-12-14 16:57:28 -05004881{
4882#if defined(__i386__) || defined(__x86_64__) // On x86, 1/x is fast enough, except for lower precision
Nicolas Capensd04f3f52022-02-05 01:19:14 -05004883 bool approx = HasRcpApprox() && relaxedPrecision;
Antonio Maiorano1cc5b332020-12-14 16:57:28 -05004884#else
4885 bool approx = HasRcpApprox();
4886#endif
4887
4888 if(approx)
4889 {
4890 using IntType = typename CastToIntType<T>::type;
4891
4892 T rsq = RcpSqrtApprox(x);
4893
Nicolas Capensd04f3f52022-02-05 01:19:14 -05004894 if(!relaxedPrecision)
Antonio Maiorano1cc5b332020-12-14 16:57:28 -05004895 {
4896 rsq = rsq * (T(3.0f) - rsq * rsq * x) * T(0.5f);
4897 rsq = As<T>(CmpNEQ(As<IntType>(x), IntType(0x7F800000)) & As<IntType>(rsq));
4898 }
4899
4900 return rsq;
4901 }
4902 else
4903 {
4904 return T(1.0f) / Sqrt(x);
4905 }
4906}
4907
Nicolas Capensd04f3f52022-02-05 01:19:14 -05004908RValue<Float4> RcpSqrt(RValue<Float4> x, bool relaxedPrecision)
Antonio Maiorano1cc5b332020-12-14 16:57:28 -05004909{
Nicolas Capensd04f3f52022-02-05 01:19:14 -05004910 return DoRcpSqrt(x, relaxedPrecision);
Antonio Maiorano1cc5b332020-12-14 16:57:28 -05004911}
4912
Nicolas Capensd04f3f52022-02-05 01:19:14 -05004913RValue<Float> RcpSqrt(RValue<Float> x, bool relaxedPrecision)
Antonio Maiorano1cc5b332020-12-14 16:57:28 -05004914{
Nicolas Capensd04f3f52022-02-05 01:19:14 -05004915 return DoRcpSqrt(x, relaxedPrecision);
Antonio Maiorano1cc5b332020-12-14 16:57:28 -05004916}
4917
Nicolas Capens157ba262019-12-10 17:49:14 -05004918} // namespace rr