blob: 5c0ff6cffc64486023bfaf8932ef86c8322f0a9a [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
Ben Claytonb16c5862019-05-08 14:01:38 +010017#include "Debug.hpp"
Antonio Maiorano62427e02020-02-13 09:18:05 -050018#include "Print.hpp"
Nicolas Capensb6d4ce32019-03-12 23:00:24 -040019
Ben Clayton983761c2020-04-01 19:49:44 +010020#include <algorithm>
Nicolas Capensd94d6a32019-08-31 04:04:37 +000021#include <cmath>
22
Nicolas Capens0192d152019-03-27 14:46:07 -040023// Define REACTOR_MATERIALIZE_LVALUES_ON_DEFINITION to non-zero to ensure all
24// variables have a stack location obtained throuch alloca().
25#ifndef REACTOR_MATERIALIZE_LVALUES_ON_DEFINITION
Ben Clayton713b8d32019-12-17 20:37:56 +000026# define REACTOR_MATERIALIZE_LVALUES_ON_DEFINITION 0
Nicolas Capens0192d152019-03-27 14:46:07 -040027#endif
28
Nicolas Capens157ba262019-12-10 17:49:14 -050029namespace rr {
30
31const Config::Edit Config::Edit::None = {};
32
33Config Config::Edit::apply(const Config &cfg) const
34{
Nicolas Capens81bc9d92019-12-16 15:05:57 -050035 if(this == &None) { return cfg; }
Nicolas Capens157ba262019-12-10 17:49:14 -050036
37 auto level = optLevelChanged ? optLevel : cfg.optimization.getLevel();
38 auto passes = cfg.optimization.getPasses();
39 apply(optPassEdits, passes);
Ben Clayton713b8d32019-12-17 20:37:56 +000040 return Config{ Optimization{ level, passes } };
Nicolas Capens157ba262019-12-10 17:49:14 -050041}
42
Ben Clayton713b8d32019-12-17 20:37:56 +000043template<typename T>
44void rr::Config::Edit::apply(const std::vector<std::pair<ListEdit, T>> &edits, std::vector<T> &list) const
Nicolas Capens157ba262019-12-10 17:49:14 -050045{
Ben Clayton713b8d32019-12-17 20:37:56 +000046 for(auto &edit : edits)
Nicolas Capens157ba262019-12-10 17:49:14 -050047 {
Nicolas Capens81bc9d92019-12-16 15:05:57 -050048 switch(edit.first)
Nicolas Capens157ba262019-12-10 17:49:14 -050049 {
Ben Clayton713b8d32019-12-17 20:37:56 +000050 case ListEdit::Add:
51 list.push_back(edit.second);
52 break;
53 case ListEdit::Remove:
Ben Clayton983761c2020-04-01 19:49:44 +010054 list.erase(std::remove_if(list.begin(), list.end(), [&](T item) {
55 return item == edit.second;
56 }),
57 list.end());
Ben Clayton713b8d32019-12-17 20:37:56 +000058 break;
59 case ListEdit::Clear:
60 list.clear();
61 break;
Nicolas Capens157ba262019-12-10 17:49:14 -050062 }
Ben Clayton55bc37a2019-07-04 12:17:12 +010063 }
64}
65
Nicolas Capens157ba262019-12-10 17:49:14 -050066// Set of variables that do not have a stack location yet.
Nicolas Capens67cdce92020-05-01 21:37:20 -040067thread_local std::unordered_set<const Variable *> *Variable::unmaterializedVariables = nullptr;
Nicolas Capens157ba262019-12-10 17:49:14 -050068
Nicolas Capens67cdce92020-05-01 21:37:20 -040069Variable::Variable(int arraySize)
Ben Clayton713b8d32019-12-17 20:37:56 +000070 : arraySize(arraySize)
Nicolas Capensb6d4ce32019-03-12 23:00:24 -040071{
Ben Clayton713b8d32019-12-17 20:37:56 +000072#if REACTOR_MATERIALIZE_LVALUES_ON_DEFINITION
73 materialize();
74#else
Nicolas Capens7d6b5912020-04-28 15:57:57 -040075 unmaterializedVariables->emplace(this);
Ben Clayton713b8d32019-12-17 20:37:56 +000076#endif
Nicolas Capens157ba262019-12-10 17:49:14 -050077}
Ben Clayton55bc37a2019-07-04 12:17:12 +010078
Nicolas Capens157ba262019-12-10 17:49:14 -050079Variable::~Variable()
80{
Nicolas Capens7d6b5912020-04-28 15:57:57 -040081 unmaterializedVariables->erase(this);
Nicolas Capens157ba262019-12-10 17:49:14 -050082}
Ben Clayton55bc37a2019-07-04 12:17:12 +010083
Nicolas Capens157ba262019-12-10 17:49:14 -050084void Variable::materializeAll()
85{
Nicolas Capens7d6b5912020-04-28 15:57:57 -040086 for(auto *var : *unmaterializedVariables)
Ben Clayton55bc37a2019-07-04 12:17:12 +010087 {
Nicolas Capens157ba262019-12-10 17:49:14 -050088 var->materialize();
Ben Clayton55bc37a2019-07-04 12:17:12 +010089 }
90
Nicolas Capens7d6b5912020-04-28 15:57:57 -040091 unmaterializedVariables->clear();
Nicolas Capens157ba262019-12-10 17:49:14 -050092}
Nicolas Capens0192d152019-03-27 14:46:07 -040093
Nicolas Capens157ba262019-12-10 17:49:14 -050094void Variable::killUnmaterialized()
95{
Nicolas Capens7d6b5912020-04-28 15:57:57 -040096 unmaterializedVariables->clear();
Nicolas Capens157ba262019-12-10 17:49:14 -050097}
Nicolas Capens0192d152019-03-27 14:46:07 -040098
Nicolas Capens157ba262019-12-10 17:49:14 -050099// NOTE: Only 12 bits out of 16 of the |select| value are used.
100// More specifically, the value should look like:
101//
102// msb lsb
103// v v
104// [.xxx|.yyy|.zzz|.www] where '.' means an ignored bit
105//
106// This format makes it easy to write calls with hexadecimal select values,
107// since each hex digit is a separate swizzle index.
108//
109// For example:
Nicolas Capensd95467e2020-01-16 01:44:39 -0500110// createShuffle4( [a,b,c,d], [e,f,g,h], 0x0123 ) -> [a,b,c,d]
111// createShuffle4( [a,b,c,d], [e,f,g,h], 0x4567 ) -> [e,f,g,h]
112// createShuffle4( [a,b,c,d], [e,f,g,h], 0x4012 ) -> [e,a,b,c]
Nicolas Capens157ba262019-12-10 17:49:14 -0500113//
Nicolas Capensd95467e2020-01-16 01:44:39 -0500114static Value *createShuffle4(Value *lhs, Value *rhs, uint16_t select)
Nicolas Capens157ba262019-12-10 17:49:14 -0500115{
Ben Clayton713b8d32019-12-17 20:37:56 +0000116 int swizzle[4] = {
Nicolas Capens157ba262019-12-10 17:49:14 -0500117 (select >> 12) & 0x07,
Ben Clayton713b8d32019-12-17 20:37:56 +0000118 (select >> 8) & 0x07,
119 (select >> 4) & 0x07,
120 (select >> 0) & 0x07,
Nicolas Capens157ba262019-12-10 17:49:14 -0500121 };
Nicolas Capens0192d152019-03-27 14:46:07 -0400122
Nicolas Capens157ba262019-12-10 17:49:14 -0500123 return Nucleus::createShuffleVector(lhs, rhs, swizzle);
124}
Nicolas Capens0192d152019-03-27 14:46:07 -0400125
Nicolas Capens157ba262019-12-10 17:49:14 -0500126// NOTE: Only 8 bits out of 16 of the |select| value are used.
127// More specifically, the value should look like:
128//
129// msb lsb
130// v v
131// [..xx|..yy|..zz|..ww] where '.' means an ignored bit
132//
133// This format makes it easy to write calls with hexadecimal select values,
134// since each hex digit is a separate swizzle index.
135//
136// For example:
137// createSwizzle4( [a,b,c,d], 0x0123 ) -> [a,b,c,d]
138// createSwizzle4( [a,b,c,d], 0x0033 ) -> [a,a,d,d]
139//
140static Value *createSwizzle4(Value *val, uint16_t select)
141{
Ben Clayton713b8d32019-12-17 20:37:56 +0000142 int swizzle[4] = {
Nicolas Capens157ba262019-12-10 17:49:14 -0500143 (select >> 12) & 0x03,
Ben Clayton713b8d32019-12-17 20:37:56 +0000144 (select >> 8) & 0x03,
145 (select >> 4) & 0x03,
146 (select >> 0) & 0x03,
Nicolas Capens157ba262019-12-10 17:49:14 -0500147 };
David 'Digit' Turnerb9f03f42019-12-04 19:32:34 +0100148
Nicolas Capens157ba262019-12-10 17:49:14 -0500149 return Nucleus::createShuffleVector(val, val, swizzle);
150}
David 'Digit' Turnerb9f03f42019-12-04 19:32:34 +0100151
Nicolas Capens157ba262019-12-10 17:49:14 -0500152static Value *createMask4(Value *lhs, Value *rhs, uint16_t select)
153{
Ben Clayton713b8d32019-12-17 20:37:56 +0000154 bool mask[4] = { false, false, false, false };
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400155
Nicolas Capens157ba262019-12-10 17:49:14 -0500156 mask[(select >> 12) & 0x03] = true;
Ben Clayton713b8d32019-12-17 20:37:56 +0000157 mask[(select >> 8) & 0x03] = true;
158 mask[(select >> 4) & 0x03] = true;
159 mask[(select >> 0) & 0x03] = true;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400160
Ben Clayton713b8d32019-12-17 20:37:56 +0000161 int swizzle[4] = {
Nicolas Capens157ba262019-12-10 17:49:14 -0500162 mask[0] ? 4 : 0,
163 mask[1] ? 5 : 1,
164 mask[2] ? 6 : 2,
165 mask[3] ? 7 : 3,
166 };
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400167
Nicolas Capens157ba262019-12-10 17:49:14 -0500168 return Nucleus::createShuffleVector(lhs, rhs, swizzle);
169}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400170
Nicolas Capens157ba262019-12-10 17:49:14 -0500171Bool::Bool(Argument<Bool> argument)
172{
173 storeValue(argument.value);
174}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400175
Nicolas Capens157ba262019-12-10 17:49:14 -0500176Bool::Bool(bool x)
177{
178 storeValue(Nucleus::createConstantBool(x));
179}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400180
Nicolas Capens157ba262019-12-10 17:49:14 -0500181Bool::Bool(RValue<Bool> rhs)
182{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400183 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500184}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400185
Nicolas Capens157ba262019-12-10 17:49:14 -0500186Bool::Bool(const Bool &rhs)
187{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400188 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -0500189}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400190
Nicolas Capens157ba262019-12-10 17:49:14 -0500191Bool::Bool(const Reference<Bool> &rhs)
192{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400193 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -0500194}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400195
Nicolas Capens157ba262019-12-10 17:49:14 -0500196RValue<Bool> Bool::operator=(RValue<Bool> rhs)
197{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400198 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500199}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400200
Nicolas Capens157ba262019-12-10 17:49:14 -0500201RValue<Bool> Bool::operator=(const Bool &rhs)
202{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400203 return RValue<Bool>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500204}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400205
Nicolas Capens157ba262019-12-10 17:49:14 -0500206RValue<Bool> Bool::operator=(const Reference<Bool> &rhs)
207{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400208 return RValue<Bool>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500209}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400210
Nicolas Capens157ba262019-12-10 17:49:14 -0500211RValue<Bool> operator!(RValue<Bool> val)
212{
213 return RValue<Bool>(Nucleus::createNot(val.value));
214}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400215
Nicolas Capens157ba262019-12-10 17:49:14 -0500216RValue<Bool> operator&&(RValue<Bool> lhs, RValue<Bool> rhs)
217{
218 return RValue<Bool>(Nucleus::createAnd(lhs.value, rhs.value));
219}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400220
Nicolas Capens157ba262019-12-10 17:49:14 -0500221RValue<Bool> operator||(RValue<Bool> lhs, RValue<Bool> rhs)
222{
223 return RValue<Bool>(Nucleus::createOr(lhs.value, rhs.value));
224}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400225
Nicolas Capens157ba262019-12-10 17:49:14 -0500226RValue<Bool> operator!=(RValue<Bool> lhs, RValue<Bool> rhs)
227{
228 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
229}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400230
Nicolas Capens157ba262019-12-10 17:49:14 -0500231RValue<Bool> operator==(RValue<Bool> lhs, RValue<Bool> rhs)
232{
233 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
234}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400235
Nicolas Capens157ba262019-12-10 17:49:14 -0500236Byte::Byte(Argument<Byte> argument)
237{
238 storeValue(argument.value);
239}
Ben Claytonf3b57972019-03-15 09:56:47 +0000240
Nicolas Capens157ba262019-12-10 17:49:14 -0500241Byte::Byte(RValue<Int> cast)
242{
Nicolas Capens519cf222020-05-08 15:27:19 -0400243 Value *integer = Nucleus::createTrunc(cast.value, Byte::type());
Ben Claytonf3b57972019-03-15 09:56:47 +0000244
Nicolas Capens157ba262019-12-10 17:49:14 -0500245 storeValue(integer);
246}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400247
Nicolas Capens157ba262019-12-10 17:49:14 -0500248Byte::Byte(RValue<UInt> cast)
249{
Nicolas Capens519cf222020-05-08 15:27:19 -0400250 Value *integer = Nucleus::createTrunc(cast.value, Byte::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400251
Nicolas Capens157ba262019-12-10 17:49:14 -0500252 storeValue(integer);
253}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400254
Nicolas Capens157ba262019-12-10 17:49:14 -0500255Byte::Byte(RValue<UShort> cast)
256{
Nicolas Capens519cf222020-05-08 15:27:19 -0400257 Value *integer = Nucleus::createTrunc(cast.value, Byte::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400258
Nicolas Capens157ba262019-12-10 17:49:14 -0500259 storeValue(integer);
260}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400261
Nicolas Capens157ba262019-12-10 17:49:14 -0500262Byte::Byte(int x)
263{
264 storeValue(Nucleus::createConstantByte((unsigned char)x));
265}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400266
Nicolas Capens157ba262019-12-10 17:49:14 -0500267Byte::Byte(unsigned char x)
268{
269 storeValue(Nucleus::createConstantByte(x));
270}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400271
Nicolas Capens157ba262019-12-10 17:49:14 -0500272Byte::Byte(RValue<Byte> rhs)
273{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400274 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500275}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400276
Nicolas Capens157ba262019-12-10 17:49:14 -0500277Byte::Byte(const Byte &rhs)
278{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400279 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -0500280}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400281
Nicolas Capens157ba262019-12-10 17:49:14 -0500282Byte::Byte(const Reference<Byte> &rhs)
283{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400284 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -0500285}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400286
Nicolas Capens157ba262019-12-10 17:49:14 -0500287RValue<Byte> Byte::operator=(RValue<Byte> rhs)
288{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400289 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500290}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400291
Nicolas Capens157ba262019-12-10 17:49:14 -0500292RValue<Byte> Byte::operator=(const Byte &rhs)
293{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400294 return RValue<Byte>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500295}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400296
Nicolas Capens157ba262019-12-10 17:49:14 -0500297RValue<Byte> Byte::operator=(const Reference<Byte> &rhs)
298{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400299 return RValue<Byte>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500300}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400301
Nicolas Capens157ba262019-12-10 17:49:14 -0500302RValue<Byte> operator+(RValue<Byte> lhs, RValue<Byte> rhs)
303{
304 return RValue<Byte>(Nucleus::createAdd(lhs.value, rhs.value));
305}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400306
Nicolas Capens157ba262019-12-10 17:49:14 -0500307RValue<Byte> operator-(RValue<Byte> lhs, RValue<Byte> rhs)
308{
309 return RValue<Byte>(Nucleus::createSub(lhs.value, rhs.value));
310}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400311
Nicolas Capens157ba262019-12-10 17:49:14 -0500312RValue<Byte> operator*(RValue<Byte> lhs, RValue<Byte> rhs)
313{
314 return RValue<Byte>(Nucleus::createMul(lhs.value, rhs.value));
315}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400316
Nicolas Capens157ba262019-12-10 17:49:14 -0500317RValue<Byte> operator/(RValue<Byte> lhs, RValue<Byte> rhs)
318{
319 return RValue<Byte>(Nucleus::createUDiv(lhs.value, rhs.value));
320}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400321
Nicolas Capens157ba262019-12-10 17:49:14 -0500322RValue<Byte> operator%(RValue<Byte> lhs, RValue<Byte> rhs)
323{
324 return RValue<Byte>(Nucleus::createURem(lhs.value, rhs.value));
325}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400326
Nicolas Capens157ba262019-12-10 17:49:14 -0500327RValue<Byte> operator&(RValue<Byte> lhs, RValue<Byte> rhs)
328{
329 return RValue<Byte>(Nucleus::createAnd(lhs.value, rhs.value));
330}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400331
Nicolas Capens157ba262019-12-10 17:49:14 -0500332RValue<Byte> operator|(RValue<Byte> lhs, RValue<Byte> rhs)
333{
334 return RValue<Byte>(Nucleus::createOr(lhs.value, rhs.value));
335}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400336
Nicolas Capens157ba262019-12-10 17:49:14 -0500337RValue<Byte> operator^(RValue<Byte> lhs, RValue<Byte> rhs)
338{
339 return RValue<Byte>(Nucleus::createXor(lhs.value, rhs.value));
340}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400341
Nicolas Capens157ba262019-12-10 17:49:14 -0500342RValue<Byte> operator<<(RValue<Byte> lhs, RValue<Byte> rhs)
343{
344 return RValue<Byte>(Nucleus::createShl(lhs.value, rhs.value));
345}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400346
Nicolas Capens157ba262019-12-10 17:49:14 -0500347RValue<Byte> operator>>(RValue<Byte> lhs, RValue<Byte> rhs)
348{
349 return RValue<Byte>(Nucleus::createLShr(lhs.value, rhs.value));
350}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400351
Nicolas Capens157ba262019-12-10 17:49:14 -0500352RValue<Byte> operator+=(Byte &lhs, RValue<Byte> rhs)
353{
354 return lhs = lhs + rhs;
355}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400356
Nicolas Capens157ba262019-12-10 17:49:14 -0500357RValue<Byte> operator-=(Byte &lhs, RValue<Byte> rhs)
358{
359 return lhs = lhs - rhs;
360}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400361
Nicolas Capens157ba262019-12-10 17:49:14 -0500362RValue<Byte> operator*=(Byte &lhs, RValue<Byte> rhs)
363{
364 return lhs = lhs * rhs;
365}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400366
Nicolas Capens157ba262019-12-10 17:49:14 -0500367RValue<Byte> operator/=(Byte &lhs, RValue<Byte> rhs)
368{
369 return lhs = lhs / rhs;
370}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400371
Nicolas Capens157ba262019-12-10 17:49:14 -0500372RValue<Byte> operator%=(Byte &lhs, RValue<Byte> rhs)
373{
374 return lhs = lhs % rhs;
375}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400376
Nicolas Capens157ba262019-12-10 17:49:14 -0500377RValue<Byte> operator&=(Byte &lhs, RValue<Byte> rhs)
378{
379 return lhs = lhs & rhs;
380}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400381
Nicolas Capens157ba262019-12-10 17:49:14 -0500382RValue<Byte> operator|=(Byte &lhs, RValue<Byte> rhs)
383{
384 return lhs = lhs | rhs;
385}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400386
Nicolas Capens157ba262019-12-10 17:49:14 -0500387RValue<Byte> operator^=(Byte &lhs, RValue<Byte> rhs)
388{
389 return lhs = lhs ^ rhs;
390}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400391
Nicolas Capens157ba262019-12-10 17:49:14 -0500392RValue<Byte> operator<<=(Byte &lhs, RValue<Byte> rhs)
393{
394 return lhs = lhs << rhs;
395}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400396
Nicolas Capens157ba262019-12-10 17:49:14 -0500397RValue<Byte> operator>>=(Byte &lhs, RValue<Byte> rhs)
398{
399 return lhs = lhs >> rhs;
400}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400401
Nicolas Capens157ba262019-12-10 17:49:14 -0500402RValue<Byte> operator+(RValue<Byte> val)
403{
404 return val;
405}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400406
Nicolas Capens157ba262019-12-10 17:49:14 -0500407RValue<Byte> operator-(RValue<Byte> val)
408{
409 return RValue<Byte>(Nucleus::createNeg(val.value));
410}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400411
Nicolas Capens157ba262019-12-10 17:49:14 -0500412RValue<Byte> operator~(RValue<Byte> val)
413{
414 return RValue<Byte>(Nucleus::createNot(val.value));
415}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400416
Ben Clayton713b8d32019-12-17 20:37:56 +0000417RValue<Byte> operator++(Byte &val, int) // Post-increment
Nicolas Capens157ba262019-12-10 17:49:14 -0500418{
419 RValue<Byte> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400420
Nicolas Capens157ba262019-12-10 17:49:14 -0500421 Value *inc = Nucleus::createAdd(res.value, Nucleus::createConstantByte((unsigned char)1));
422 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400423
Nicolas Capens157ba262019-12-10 17:49:14 -0500424 return res;
425}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400426
Ben Clayton713b8d32019-12-17 20:37:56 +0000427const Byte &operator++(Byte &val) // Pre-increment
Nicolas Capens157ba262019-12-10 17:49:14 -0500428{
429 Value *inc = Nucleus::createAdd(val.loadValue(), Nucleus::createConstantByte((unsigned char)1));
430 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400431
Nicolas Capens157ba262019-12-10 17:49:14 -0500432 return val;
433}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400434
Ben Clayton713b8d32019-12-17 20:37:56 +0000435RValue<Byte> operator--(Byte &val, int) // Post-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -0500436{
437 RValue<Byte> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400438
Nicolas Capens157ba262019-12-10 17:49:14 -0500439 Value *inc = Nucleus::createSub(res.value, Nucleus::createConstantByte((unsigned char)1));
440 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400441
Nicolas Capens157ba262019-12-10 17:49:14 -0500442 return res;
443}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400444
Ben Clayton713b8d32019-12-17 20:37:56 +0000445const Byte &operator--(Byte &val) // Pre-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -0500446{
447 Value *inc = Nucleus::createSub(val.loadValue(), Nucleus::createConstantByte((unsigned char)1));
448 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400449
Nicolas Capens157ba262019-12-10 17:49:14 -0500450 return val;
451}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400452
Nicolas Capens157ba262019-12-10 17:49:14 -0500453RValue<Bool> operator<(RValue<Byte> lhs, RValue<Byte> rhs)
454{
455 return RValue<Bool>(Nucleus::createICmpULT(lhs.value, rhs.value));
456}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400457
Nicolas Capens157ba262019-12-10 17:49:14 -0500458RValue<Bool> operator<=(RValue<Byte> lhs, RValue<Byte> rhs)
459{
460 return RValue<Bool>(Nucleus::createICmpULE(lhs.value, rhs.value));
461}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400462
Nicolas Capens157ba262019-12-10 17:49:14 -0500463RValue<Bool> operator>(RValue<Byte> lhs, RValue<Byte> rhs)
464{
465 return RValue<Bool>(Nucleus::createICmpUGT(lhs.value, rhs.value));
466}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400467
Nicolas Capens157ba262019-12-10 17:49:14 -0500468RValue<Bool> operator>=(RValue<Byte> lhs, RValue<Byte> rhs)
469{
470 return RValue<Bool>(Nucleus::createICmpUGE(lhs.value, rhs.value));
471}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400472
Nicolas Capens157ba262019-12-10 17:49:14 -0500473RValue<Bool> operator!=(RValue<Byte> lhs, RValue<Byte> rhs)
474{
475 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
476}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400477
Nicolas Capens157ba262019-12-10 17:49:14 -0500478RValue<Bool> operator==(RValue<Byte> lhs, RValue<Byte> rhs)
479{
480 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
481}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400482
Nicolas Capens157ba262019-12-10 17:49:14 -0500483SByte::SByte(Argument<SByte> argument)
484{
485 storeValue(argument.value);
486}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400487
Nicolas Capens157ba262019-12-10 17:49:14 -0500488SByte::SByte(RValue<Int> cast)
489{
Nicolas Capens519cf222020-05-08 15:27:19 -0400490 Value *integer = Nucleus::createTrunc(cast.value, SByte::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400491
Nicolas Capens157ba262019-12-10 17:49:14 -0500492 storeValue(integer);
493}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400494
Nicolas Capens157ba262019-12-10 17:49:14 -0500495SByte::SByte(RValue<Short> cast)
496{
Nicolas Capens519cf222020-05-08 15:27:19 -0400497 Value *integer = Nucleus::createTrunc(cast.value, SByte::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400498
Nicolas Capens157ba262019-12-10 17:49:14 -0500499 storeValue(integer);
500}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400501
Nicolas Capens157ba262019-12-10 17:49:14 -0500502SByte::SByte(signed char x)
503{
504 storeValue(Nucleus::createConstantByte(x));
505}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400506
Nicolas Capens157ba262019-12-10 17:49:14 -0500507SByte::SByte(RValue<SByte> rhs)
508{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400509 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500510}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400511
Nicolas Capens157ba262019-12-10 17:49:14 -0500512SByte::SByte(const SByte &rhs)
513{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400514 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -0500515}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400516
Nicolas Capens157ba262019-12-10 17:49:14 -0500517SByte::SByte(const Reference<SByte> &rhs)
518{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400519 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -0500520}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400521
Nicolas Capens157ba262019-12-10 17:49:14 -0500522RValue<SByte> SByte::operator=(RValue<SByte> rhs)
523{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400524 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500525}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400526
Nicolas Capens157ba262019-12-10 17:49:14 -0500527RValue<SByte> SByte::operator=(const SByte &rhs)
528{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400529 return RValue<SByte>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500530}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400531
Nicolas Capens157ba262019-12-10 17:49:14 -0500532RValue<SByte> SByte::operator=(const Reference<SByte> &rhs)
533{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400534 return RValue<SByte>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500535}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400536
Nicolas Capens157ba262019-12-10 17:49:14 -0500537RValue<SByte> operator+(RValue<SByte> lhs, RValue<SByte> rhs)
538{
539 return RValue<SByte>(Nucleus::createAdd(lhs.value, rhs.value));
540}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400541
Nicolas Capens157ba262019-12-10 17:49:14 -0500542RValue<SByte> operator-(RValue<SByte> lhs, RValue<SByte> rhs)
543{
544 return RValue<SByte>(Nucleus::createSub(lhs.value, rhs.value));
545}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400546
Nicolas Capens157ba262019-12-10 17:49:14 -0500547RValue<SByte> operator*(RValue<SByte> lhs, RValue<SByte> rhs)
548{
549 return RValue<SByte>(Nucleus::createMul(lhs.value, rhs.value));
550}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400551
Nicolas Capens157ba262019-12-10 17:49:14 -0500552RValue<SByte> operator/(RValue<SByte> lhs, RValue<SByte> rhs)
553{
554 return RValue<SByte>(Nucleus::createSDiv(lhs.value, rhs.value));
555}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400556
Nicolas Capens157ba262019-12-10 17:49:14 -0500557RValue<SByte> operator%(RValue<SByte> lhs, RValue<SByte> rhs)
558{
559 return RValue<SByte>(Nucleus::createSRem(lhs.value, rhs.value));
560}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400561
Nicolas Capens157ba262019-12-10 17:49:14 -0500562RValue<SByte> operator&(RValue<SByte> lhs, RValue<SByte> rhs)
563{
564 return RValue<SByte>(Nucleus::createAnd(lhs.value, rhs.value));
565}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400566
Nicolas Capens157ba262019-12-10 17:49:14 -0500567RValue<SByte> operator|(RValue<SByte> lhs, RValue<SByte> rhs)
568{
569 return RValue<SByte>(Nucleus::createOr(lhs.value, rhs.value));
570}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400571
Nicolas Capens157ba262019-12-10 17:49:14 -0500572RValue<SByte> operator^(RValue<SByte> lhs, RValue<SByte> rhs)
573{
574 return RValue<SByte>(Nucleus::createXor(lhs.value, rhs.value));
575}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400576
Nicolas Capens157ba262019-12-10 17:49:14 -0500577RValue<SByte> operator<<(RValue<SByte> lhs, RValue<SByte> rhs)
578{
579 return RValue<SByte>(Nucleus::createShl(lhs.value, rhs.value));
580}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400581
Nicolas Capens157ba262019-12-10 17:49:14 -0500582RValue<SByte> operator>>(RValue<SByte> lhs, RValue<SByte> rhs)
583{
584 return RValue<SByte>(Nucleus::createAShr(lhs.value, rhs.value));
585}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400586
Nicolas Capens157ba262019-12-10 17:49:14 -0500587RValue<SByte> operator+=(SByte &lhs, RValue<SByte> rhs)
588{
589 return lhs = lhs + rhs;
590}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400591
Nicolas Capens157ba262019-12-10 17:49:14 -0500592RValue<SByte> operator-=(SByte &lhs, RValue<SByte> rhs)
593{
594 return lhs = lhs - rhs;
595}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400596
Nicolas Capens157ba262019-12-10 17:49:14 -0500597RValue<SByte> operator*=(SByte &lhs, RValue<SByte> rhs)
598{
599 return lhs = lhs * rhs;
600}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400601
Nicolas Capens157ba262019-12-10 17:49:14 -0500602RValue<SByte> operator/=(SByte &lhs, RValue<SByte> rhs)
603{
604 return lhs = lhs / rhs;
605}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400606
Nicolas Capens157ba262019-12-10 17:49:14 -0500607RValue<SByte> operator%=(SByte &lhs, RValue<SByte> rhs)
608{
609 return lhs = lhs % rhs;
610}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400611
Nicolas Capens157ba262019-12-10 17:49:14 -0500612RValue<SByte> operator&=(SByte &lhs, RValue<SByte> rhs)
613{
614 return lhs = lhs & rhs;
615}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400616
Nicolas Capens157ba262019-12-10 17:49:14 -0500617RValue<SByte> operator|=(SByte &lhs, RValue<SByte> rhs)
618{
619 return lhs = lhs | rhs;
620}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400621
Nicolas Capens157ba262019-12-10 17:49:14 -0500622RValue<SByte> operator^=(SByte &lhs, RValue<SByte> rhs)
623{
624 return lhs = lhs ^ rhs;
625}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400626
Nicolas Capens157ba262019-12-10 17:49:14 -0500627RValue<SByte> operator<<=(SByte &lhs, RValue<SByte> rhs)
628{
629 return lhs = lhs << rhs;
630}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400631
Nicolas Capens157ba262019-12-10 17:49:14 -0500632RValue<SByte> operator>>=(SByte &lhs, RValue<SByte> rhs)
633{
634 return lhs = lhs >> rhs;
635}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400636
Nicolas Capens157ba262019-12-10 17:49:14 -0500637RValue<SByte> operator+(RValue<SByte> val)
638{
639 return val;
640}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400641
Nicolas Capens157ba262019-12-10 17:49:14 -0500642RValue<SByte> operator-(RValue<SByte> val)
643{
644 return RValue<SByte>(Nucleus::createNeg(val.value));
645}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400646
Nicolas Capens157ba262019-12-10 17:49:14 -0500647RValue<SByte> operator~(RValue<SByte> val)
648{
649 return RValue<SByte>(Nucleus::createNot(val.value));
650}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400651
Ben Clayton713b8d32019-12-17 20:37:56 +0000652RValue<SByte> operator++(SByte &val, int) // Post-increment
Nicolas Capens157ba262019-12-10 17:49:14 -0500653{
654 RValue<SByte> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400655
Nicolas Capens157ba262019-12-10 17:49:14 -0500656 Value *inc = Nucleus::createAdd(res.value, Nucleus::createConstantByte((signed char)1));
657 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400658
Nicolas Capens157ba262019-12-10 17:49:14 -0500659 return res;
660}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400661
Ben Clayton713b8d32019-12-17 20:37:56 +0000662const SByte &operator++(SByte &val) // Pre-increment
Nicolas Capens157ba262019-12-10 17:49:14 -0500663{
664 Value *inc = Nucleus::createAdd(val.loadValue(), Nucleus::createConstantByte((signed char)1));
665 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400666
Nicolas Capens157ba262019-12-10 17:49:14 -0500667 return val;
668}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400669
Ben Clayton713b8d32019-12-17 20:37:56 +0000670RValue<SByte> operator--(SByte &val, int) // Post-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -0500671{
672 RValue<SByte> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400673
Nicolas Capens157ba262019-12-10 17:49:14 -0500674 Value *inc = Nucleus::createSub(res.value, Nucleus::createConstantByte((signed char)1));
675 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400676
Nicolas Capens157ba262019-12-10 17:49:14 -0500677 return res;
678}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400679
Ben Clayton713b8d32019-12-17 20:37:56 +0000680const SByte &operator--(SByte &val) // Pre-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -0500681{
682 Value *inc = Nucleus::createSub(val.loadValue(), Nucleus::createConstantByte((signed char)1));
683 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400684
Nicolas Capens157ba262019-12-10 17:49:14 -0500685 return val;
686}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400687
Nicolas Capens157ba262019-12-10 17:49:14 -0500688RValue<Bool> operator<(RValue<SByte> lhs, RValue<SByte> rhs)
689{
690 return RValue<Bool>(Nucleus::createICmpSLT(lhs.value, rhs.value));
691}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400692
Nicolas Capens157ba262019-12-10 17:49:14 -0500693RValue<Bool> operator<=(RValue<SByte> lhs, RValue<SByte> rhs)
694{
695 return RValue<Bool>(Nucleus::createICmpSLE(lhs.value, rhs.value));
696}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400697
Nicolas Capens157ba262019-12-10 17:49:14 -0500698RValue<Bool> operator>(RValue<SByte> lhs, RValue<SByte> rhs)
699{
700 return RValue<Bool>(Nucleus::createICmpSGT(lhs.value, rhs.value));
701}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400702
Nicolas Capens157ba262019-12-10 17:49:14 -0500703RValue<Bool> operator>=(RValue<SByte> lhs, RValue<SByte> rhs)
704{
705 return RValue<Bool>(Nucleus::createICmpSGE(lhs.value, rhs.value));
706}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400707
Nicolas Capens157ba262019-12-10 17:49:14 -0500708RValue<Bool> operator!=(RValue<SByte> lhs, RValue<SByte> rhs)
709{
710 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
711}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400712
Nicolas Capens157ba262019-12-10 17:49:14 -0500713RValue<Bool> operator==(RValue<SByte> lhs, RValue<SByte> rhs)
714{
715 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
716}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400717
Nicolas Capens157ba262019-12-10 17:49:14 -0500718Short::Short(Argument<Short> argument)
719{
720 storeValue(argument.value);
721}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400722
Nicolas Capens157ba262019-12-10 17:49:14 -0500723Short::Short(RValue<Int> cast)
724{
Nicolas Capens519cf222020-05-08 15:27:19 -0400725 Value *integer = Nucleus::createTrunc(cast.value, Short::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400726
Nicolas Capens157ba262019-12-10 17:49:14 -0500727 storeValue(integer);
728}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400729
Nicolas Capens157ba262019-12-10 17:49:14 -0500730Short::Short(short x)
731{
732 storeValue(Nucleus::createConstantShort(x));
733}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400734
Nicolas Capens157ba262019-12-10 17:49:14 -0500735Short::Short(RValue<Short> rhs)
736{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400737 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500738}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400739
Nicolas Capens157ba262019-12-10 17:49:14 -0500740Short::Short(const Short &rhs)
741{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400742 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -0500743}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400744
Nicolas Capens157ba262019-12-10 17:49:14 -0500745Short::Short(const Reference<Short> &rhs)
746{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400747 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -0500748}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400749
Nicolas Capens157ba262019-12-10 17:49:14 -0500750RValue<Short> Short::operator=(RValue<Short> rhs)
751{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400752 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500753}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400754
Nicolas Capens157ba262019-12-10 17:49:14 -0500755RValue<Short> Short::operator=(const Short &rhs)
756{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400757 return RValue<Short>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500758}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400759
Nicolas Capens157ba262019-12-10 17:49:14 -0500760RValue<Short> Short::operator=(const Reference<Short> &rhs)
761{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400762 return RValue<Short>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500763}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400764
Nicolas Capens157ba262019-12-10 17:49:14 -0500765RValue<Short> operator+(RValue<Short> lhs, RValue<Short> rhs)
766{
767 return RValue<Short>(Nucleus::createAdd(lhs.value, rhs.value));
768}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400769
Nicolas Capens157ba262019-12-10 17:49:14 -0500770RValue<Short> operator-(RValue<Short> lhs, RValue<Short> rhs)
771{
772 return RValue<Short>(Nucleus::createSub(lhs.value, rhs.value));
773}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400774
Nicolas Capens157ba262019-12-10 17:49:14 -0500775RValue<Short> operator*(RValue<Short> lhs, RValue<Short> rhs)
776{
777 return RValue<Short>(Nucleus::createMul(lhs.value, rhs.value));
778}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400779
Nicolas Capens157ba262019-12-10 17:49:14 -0500780RValue<Short> operator/(RValue<Short> lhs, RValue<Short> rhs)
781{
782 return RValue<Short>(Nucleus::createSDiv(lhs.value, rhs.value));
783}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400784
Nicolas Capens157ba262019-12-10 17:49:14 -0500785RValue<Short> operator%(RValue<Short> lhs, RValue<Short> rhs)
786{
787 return RValue<Short>(Nucleus::createSRem(lhs.value, rhs.value));
788}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400789
Nicolas Capens157ba262019-12-10 17:49:14 -0500790RValue<Short> operator&(RValue<Short> lhs, RValue<Short> rhs)
791{
792 return RValue<Short>(Nucleus::createAnd(lhs.value, rhs.value));
793}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400794
Nicolas Capens157ba262019-12-10 17:49:14 -0500795RValue<Short> operator|(RValue<Short> lhs, RValue<Short> rhs)
796{
797 return RValue<Short>(Nucleus::createOr(lhs.value, rhs.value));
798}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400799
Nicolas Capens157ba262019-12-10 17:49:14 -0500800RValue<Short> operator^(RValue<Short> lhs, RValue<Short> rhs)
801{
802 return RValue<Short>(Nucleus::createXor(lhs.value, rhs.value));
803}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400804
Nicolas Capens157ba262019-12-10 17:49:14 -0500805RValue<Short> operator<<(RValue<Short> lhs, RValue<Short> rhs)
806{
807 return RValue<Short>(Nucleus::createShl(lhs.value, rhs.value));
808}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400809
Nicolas Capens157ba262019-12-10 17:49:14 -0500810RValue<Short> operator>>(RValue<Short> lhs, RValue<Short> rhs)
811{
812 return RValue<Short>(Nucleus::createAShr(lhs.value, rhs.value));
813}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400814
Nicolas Capens157ba262019-12-10 17:49:14 -0500815RValue<Short> operator+=(Short &lhs, RValue<Short> rhs)
816{
817 return lhs = lhs + rhs;
818}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400819
Nicolas Capens157ba262019-12-10 17:49:14 -0500820RValue<Short> operator-=(Short &lhs, RValue<Short> rhs)
821{
822 return lhs = lhs - rhs;
823}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400824
Nicolas Capens157ba262019-12-10 17:49:14 -0500825RValue<Short> operator*=(Short &lhs, RValue<Short> rhs)
826{
827 return lhs = lhs * rhs;
828}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400829
Nicolas Capens157ba262019-12-10 17:49:14 -0500830RValue<Short> operator/=(Short &lhs, RValue<Short> rhs)
831{
832 return lhs = lhs / rhs;
833}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400834
Nicolas Capens157ba262019-12-10 17:49:14 -0500835RValue<Short> operator%=(Short &lhs, RValue<Short> rhs)
836{
837 return lhs = lhs % rhs;
838}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400839
Nicolas Capens157ba262019-12-10 17:49:14 -0500840RValue<Short> operator&=(Short &lhs, RValue<Short> rhs)
841{
842 return lhs = lhs & rhs;
843}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400844
Nicolas Capens157ba262019-12-10 17:49:14 -0500845RValue<Short> operator|=(Short &lhs, RValue<Short> rhs)
846{
847 return lhs = lhs | rhs;
848}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400849
Nicolas Capens157ba262019-12-10 17:49:14 -0500850RValue<Short> operator^=(Short &lhs, RValue<Short> rhs)
851{
852 return lhs = lhs ^ rhs;
853}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400854
Nicolas Capens157ba262019-12-10 17:49:14 -0500855RValue<Short> operator<<=(Short &lhs, RValue<Short> rhs)
856{
857 return lhs = lhs << rhs;
858}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400859
Nicolas Capens157ba262019-12-10 17:49:14 -0500860RValue<Short> operator>>=(Short &lhs, RValue<Short> rhs)
861{
862 return lhs = lhs >> rhs;
863}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400864
Nicolas Capens157ba262019-12-10 17:49:14 -0500865RValue<Short> operator+(RValue<Short> val)
866{
867 return val;
868}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400869
Nicolas Capens157ba262019-12-10 17:49:14 -0500870RValue<Short> operator-(RValue<Short> val)
871{
872 return RValue<Short>(Nucleus::createNeg(val.value));
873}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400874
Nicolas Capens157ba262019-12-10 17:49:14 -0500875RValue<Short> operator~(RValue<Short> val)
876{
877 return RValue<Short>(Nucleus::createNot(val.value));
878}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400879
Ben Clayton713b8d32019-12-17 20:37:56 +0000880RValue<Short> operator++(Short &val, int) // Post-increment
Nicolas Capens157ba262019-12-10 17:49:14 -0500881{
882 RValue<Short> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400883
Nicolas Capens157ba262019-12-10 17:49:14 -0500884 Value *inc = Nucleus::createAdd(res.value, Nucleus::createConstantShort((short)1));
885 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400886
Nicolas Capens157ba262019-12-10 17:49:14 -0500887 return res;
888}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400889
Ben Clayton713b8d32019-12-17 20:37:56 +0000890const Short &operator++(Short &val) // Pre-increment
Nicolas Capens157ba262019-12-10 17:49:14 -0500891{
892 Value *inc = Nucleus::createAdd(val.loadValue(), Nucleus::createConstantShort((short)1));
893 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400894
Nicolas Capens157ba262019-12-10 17:49:14 -0500895 return val;
896}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400897
Ben Clayton713b8d32019-12-17 20:37:56 +0000898RValue<Short> operator--(Short &val, int) // Post-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -0500899{
900 RValue<Short> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400901
Nicolas Capens157ba262019-12-10 17:49:14 -0500902 Value *inc = Nucleus::createSub(res.value, Nucleus::createConstantShort((short)1));
903 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400904
Nicolas Capens157ba262019-12-10 17:49:14 -0500905 return res;
906}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400907
Ben Clayton713b8d32019-12-17 20:37:56 +0000908const Short &operator--(Short &val) // Pre-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -0500909{
910 Value *inc = Nucleus::createSub(val.loadValue(), Nucleus::createConstantShort((short)1));
911 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400912
Nicolas Capens157ba262019-12-10 17:49:14 -0500913 return val;
914}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400915
Nicolas Capens157ba262019-12-10 17:49:14 -0500916RValue<Bool> operator<(RValue<Short> lhs, RValue<Short> rhs)
917{
918 return RValue<Bool>(Nucleus::createICmpSLT(lhs.value, rhs.value));
919}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400920
Nicolas Capens157ba262019-12-10 17:49:14 -0500921RValue<Bool> operator<=(RValue<Short> lhs, RValue<Short> rhs)
922{
923 return RValue<Bool>(Nucleus::createICmpSLE(lhs.value, rhs.value));
924}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400925
Nicolas Capens157ba262019-12-10 17:49:14 -0500926RValue<Bool> operator>(RValue<Short> lhs, RValue<Short> rhs)
927{
928 return RValue<Bool>(Nucleus::createICmpSGT(lhs.value, rhs.value));
929}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400930
Nicolas Capens157ba262019-12-10 17:49:14 -0500931RValue<Bool> operator>=(RValue<Short> lhs, RValue<Short> rhs)
932{
933 return RValue<Bool>(Nucleus::createICmpSGE(lhs.value, rhs.value));
934}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400935
Nicolas Capens157ba262019-12-10 17:49:14 -0500936RValue<Bool> operator!=(RValue<Short> lhs, RValue<Short> rhs)
937{
938 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
939}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400940
Nicolas Capens157ba262019-12-10 17:49:14 -0500941RValue<Bool> operator==(RValue<Short> lhs, RValue<Short> rhs)
942{
943 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
944}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400945
Nicolas Capens157ba262019-12-10 17:49:14 -0500946UShort::UShort(Argument<UShort> argument)
947{
948 storeValue(argument.value);
949}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400950
Nicolas Capens157ba262019-12-10 17:49:14 -0500951UShort::UShort(RValue<UInt> cast)
952{
Nicolas Capens519cf222020-05-08 15:27:19 -0400953 Value *integer = Nucleus::createTrunc(cast.value, UShort::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400954
Nicolas Capens157ba262019-12-10 17:49:14 -0500955 storeValue(integer);
956}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400957
Nicolas Capens157ba262019-12-10 17:49:14 -0500958UShort::UShort(RValue<Int> cast)
959{
Nicolas Capens519cf222020-05-08 15:27:19 -0400960 Value *integer = Nucleus::createTrunc(cast.value, UShort::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400961
Nicolas Capens157ba262019-12-10 17:49:14 -0500962 storeValue(integer);
963}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400964
Nicolas Capens157ba262019-12-10 17:49:14 -0500965UShort::UShort(unsigned short x)
966{
967 storeValue(Nucleus::createConstantShort(x));
968}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400969
Nicolas Capens157ba262019-12-10 17:49:14 -0500970UShort::UShort(RValue<UShort> rhs)
971{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400972 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500973}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400974
Nicolas Capens157ba262019-12-10 17:49:14 -0500975UShort::UShort(const UShort &rhs)
976{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400977 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -0500978}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400979
Nicolas Capens157ba262019-12-10 17:49:14 -0500980UShort::UShort(const Reference<UShort> &rhs)
981{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400982 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -0500983}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400984
Nicolas Capens157ba262019-12-10 17:49:14 -0500985RValue<UShort> UShort::operator=(RValue<UShort> rhs)
986{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400987 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500988}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400989
Nicolas Capens157ba262019-12-10 17:49:14 -0500990RValue<UShort> UShort::operator=(const UShort &rhs)
991{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400992 return RValue<UShort>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500993}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400994
Nicolas Capens157ba262019-12-10 17:49:14 -0500995RValue<UShort> UShort::operator=(const Reference<UShort> &rhs)
996{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -0400997 return RValue<UShort>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -0500998}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -0400999
Nicolas Capens157ba262019-12-10 17:49:14 -05001000RValue<UShort> operator+(RValue<UShort> lhs, RValue<UShort> rhs)
1001{
1002 return RValue<UShort>(Nucleus::createAdd(lhs.value, rhs.value));
1003}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001004
Nicolas Capens157ba262019-12-10 17:49:14 -05001005RValue<UShort> operator-(RValue<UShort> lhs, RValue<UShort> rhs)
1006{
1007 return RValue<UShort>(Nucleus::createSub(lhs.value, rhs.value));
1008}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001009
Nicolas Capens157ba262019-12-10 17:49:14 -05001010RValue<UShort> operator*(RValue<UShort> lhs, RValue<UShort> rhs)
1011{
1012 return RValue<UShort>(Nucleus::createMul(lhs.value, rhs.value));
1013}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001014
Nicolas Capens157ba262019-12-10 17:49:14 -05001015RValue<UShort> operator/(RValue<UShort> lhs, RValue<UShort> rhs)
1016{
1017 return RValue<UShort>(Nucleus::createUDiv(lhs.value, rhs.value));
1018}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001019
Nicolas Capens157ba262019-12-10 17:49:14 -05001020RValue<UShort> operator%(RValue<UShort> lhs, RValue<UShort> rhs)
1021{
1022 return RValue<UShort>(Nucleus::createURem(lhs.value, rhs.value));
1023}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001024
Nicolas Capens157ba262019-12-10 17:49:14 -05001025RValue<UShort> operator&(RValue<UShort> lhs, RValue<UShort> rhs)
1026{
1027 return RValue<UShort>(Nucleus::createAnd(lhs.value, rhs.value));
1028}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001029
Nicolas Capens157ba262019-12-10 17:49:14 -05001030RValue<UShort> operator|(RValue<UShort> lhs, RValue<UShort> rhs)
1031{
1032 return RValue<UShort>(Nucleus::createOr(lhs.value, rhs.value));
1033}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001034
Nicolas Capens157ba262019-12-10 17:49:14 -05001035RValue<UShort> operator^(RValue<UShort> lhs, RValue<UShort> rhs)
1036{
1037 return RValue<UShort>(Nucleus::createXor(lhs.value, rhs.value));
1038}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001039
Nicolas Capens157ba262019-12-10 17:49:14 -05001040RValue<UShort> operator<<(RValue<UShort> lhs, RValue<UShort> rhs)
1041{
1042 return RValue<UShort>(Nucleus::createShl(lhs.value, rhs.value));
1043}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001044
Nicolas Capens157ba262019-12-10 17:49:14 -05001045RValue<UShort> operator>>(RValue<UShort> lhs, RValue<UShort> rhs)
1046{
1047 return RValue<UShort>(Nucleus::createLShr(lhs.value, rhs.value));
1048}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001049
Nicolas Capens157ba262019-12-10 17:49:14 -05001050RValue<UShort> operator+=(UShort &lhs, RValue<UShort> rhs)
1051{
1052 return lhs = lhs + rhs;
1053}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001054
Nicolas Capens157ba262019-12-10 17:49:14 -05001055RValue<UShort> operator-=(UShort &lhs, RValue<UShort> rhs)
1056{
1057 return lhs = lhs - rhs;
1058}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001059
Nicolas Capens157ba262019-12-10 17:49:14 -05001060RValue<UShort> operator*=(UShort &lhs, RValue<UShort> rhs)
1061{
1062 return lhs = lhs * rhs;
1063}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001064
Nicolas Capens157ba262019-12-10 17:49:14 -05001065RValue<UShort> operator/=(UShort &lhs, RValue<UShort> rhs)
1066{
1067 return lhs = lhs / rhs;
1068}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001069
Nicolas Capens157ba262019-12-10 17:49:14 -05001070RValue<UShort> operator%=(UShort &lhs, RValue<UShort> rhs)
1071{
1072 return lhs = lhs % rhs;
1073}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001074
Nicolas Capens157ba262019-12-10 17:49:14 -05001075RValue<UShort> operator&=(UShort &lhs, RValue<UShort> rhs)
1076{
1077 return lhs = lhs & rhs;
1078}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001079
Nicolas Capens157ba262019-12-10 17:49:14 -05001080RValue<UShort> operator|=(UShort &lhs, RValue<UShort> rhs)
1081{
1082 return lhs = lhs | rhs;
1083}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001084
Nicolas Capens157ba262019-12-10 17:49:14 -05001085RValue<UShort> operator^=(UShort &lhs, RValue<UShort> rhs)
1086{
1087 return lhs = lhs ^ rhs;
1088}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001089
Nicolas Capens157ba262019-12-10 17:49:14 -05001090RValue<UShort> operator<<=(UShort &lhs, RValue<UShort> rhs)
1091{
1092 return lhs = lhs << rhs;
1093}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001094
Nicolas Capens157ba262019-12-10 17:49:14 -05001095RValue<UShort> operator>>=(UShort &lhs, RValue<UShort> rhs)
1096{
1097 return lhs = lhs >> rhs;
1098}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001099
Nicolas Capens157ba262019-12-10 17:49:14 -05001100RValue<UShort> operator+(RValue<UShort> val)
1101{
1102 return val;
1103}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001104
Nicolas Capens157ba262019-12-10 17:49:14 -05001105RValue<UShort> operator-(RValue<UShort> val)
1106{
1107 return RValue<UShort>(Nucleus::createNeg(val.value));
1108}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001109
Nicolas Capens157ba262019-12-10 17:49:14 -05001110RValue<UShort> operator~(RValue<UShort> val)
1111{
1112 return RValue<UShort>(Nucleus::createNot(val.value));
1113}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001114
Ben Clayton713b8d32019-12-17 20:37:56 +00001115RValue<UShort> operator++(UShort &val, int) // Post-increment
Nicolas Capens157ba262019-12-10 17:49:14 -05001116{
1117 RValue<UShort> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001118
Nicolas Capens157ba262019-12-10 17:49:14 -05001119 Value *inc = Nucleus::createAdd(res.value, Nucleus::createConstantShort((unsigned short)1));
1120 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001121
Nicolas Capens157ba262019-12-10 17:49:14 -05001122 return res;
1123}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001124
Ben Clayton713b8d32019-12-17 20:37:56 +00001125const UShort &operator++(UShort &val) // Pre-increment
Nicolas Capens157ba262019-12-10 17:49:14 -05001126{
1127 Value *inc = Nucleus::createAdd(val.loadValue(), Nucleus::createConstantShort((unsigned short)1));
1128 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001129
Nicolas Capens157ba262019-12-10 17:49:14 -05001130 return val;
1131}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001132
Ben Clayton713b8d32019-12-17 20:37:56 +00001133RValue<UShort> operator--(UShort &val, int) // Post-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -05001134{
1135 RValue<UShort> res = val;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001136
Nicolas Capens157ba262019-12-10 17:49:14 -05001137 Value *inc = Nucleus::createSub(res.value, Nucleus::createConstantShort((unsigned short)1));
1138 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001139
Nicolas Capens157ba262019-12-10 17:49:14 -05001140 return res;
1141}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001142
Ben Clayton713b8d32019-12-17 20:37:56 +00001143const UShort &operator--(UShort &val) // Pre-decrement
Nicolas Capens157ba262019-12-10 17:49:14 -05001144{
1145 Value *inc = Nucleus::createSub(val.loadValue(), Nucleus::createConstantShort((unsigned short)1));
1146 val.storeValue(inc);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001147
Nicolas Capens157ba262019-12-10 17:49:14 -05001148 return val;
1149}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001150
Nicolas Capens157ba262019-12-10 17:49:14 -05001151RValue<Bool> operator<(RValue<UShort> lhs, RValue<UShort> rhs)
1152{
1153 return RValue<Bool>(Nucleus::createICmpULT(lhs.value, rhs.value));
1154}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001155
Nicolas Capens157ba262019-12-10 17:49:14 -05001156RValue<Bool> operator<=(RValue<UShort> lhs, RValue<UShort> rhs)
1157{
1158 return RValue<Bool>(Nucleus::createICmpULE(lhs.value, rhs.value));
1159}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001160
Nicolas Capens157ba262019-12-10 17:49:14 -05001161RValue<Bool> operator>(RValue<UShort> lhs, RValue<UShort> rhs)
1162{
1163 return RValue<Bool>(Nucleus::createICmpUGT(lhs.value, rhs.value));
1164}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001165
Nicolas Capens157ba262019-12-10 17:49:14 -05001166RValue<Bool> operator>=(RValue<UShort> lhs, RValue<UShort> rhs)
1167{
1168 return RValue<Bool>(Nucleus::createICmpUGE(lhs.value, rhs.value));
1169}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001170
Nicolas Capens157ba262019-12-10 17:49:14 -05001171RValue<Bool> operator!=(RValue<UShort> lhs, RValue<UShort> rhs)
1172{
1173 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
1174}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001175
Nicolas Capens157ba262019-12-10 17:49:14 -05001176RValue<Bool> operator==(RValue<UShort> lhs, RValue<UShort> rhs)
1177{
1178 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
1179}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001180
Nicolas Capens157ba262019-12-10 17:49:14 -05001181Byte4::Byte4(RValue<Byte8> cast)
1182{
Nicolas Capens519cf222020-05-08 15:27:19 -04001183 storeValue(Nucleus::createBitCast(cast.value, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001184}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001185
Nicolas Capens133b87d2020-01-25 16:26:28 -05001186Byte4::Byte4(RValue<UShort4> cast)
1187{
1188 // TODO(b/148379603): Optimize narrowing swizzle.
1189 *this = As<Byte4>(Swizzle(As<Byte8>(cast), 0x0246'0246));
1190}
1191
1192Byte4::Byte4(RValue<Short4> cast)
1193{
1194 // TODO(b/148379603): Optimize narrowing swizzle.
1195 *this = As<Byte4>(Swizzle(As<Byte8>(cast), 0x0246'0246));
1196}
1197
1198Byte4::Byte4(RValue<UInt4> cast)
1199{
1200 // TODO(b/148379603): Optimize narrowing swizzle.
1201 *this = As<Byte4>(Swizzle(As<Byte16>(cast), 0x048C'048C'048C'048C));
1202}
1203
1204Byte4::Byte4(RValue<Int4> cast)
1205{
1206 // TODO(b/148379603): Optimize narrowing swizzle.
1207 *this = As<Byte4>(Swizzle(As<Byte16>(cast), 0x048C'048C'048C'048C));
1208}
1209
1210Byte4::Byte4(RValue<Byte4> rhs)
1211{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001212 store(rhs);
Nicolas Capens133b87d2020-01-25 16:26:28 -05001213}
1214
1215Byte4::Byte4(const Byte4 &rhs)
1216{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001217 storeValue(rhs.loadValue());
Nicolas Capens133b87d2020-01-25 16:26:28 -05001218}
1219
Nicolas Capens157ba262019-12-10 17:49:14 -05001220Byte4::Byte4(const Reference<Byte4> &rhs)
1221{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001222 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05001223}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001224
Nicolas Capens133b87d2020-01-25 16:26:28 -05001225RValue<Byte4> Byte4::operator=(RValue<Byte4> rhs)
1226{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001227 return store(rhs);
Nicolas Capens133b87d2020-01-25 16:26:28 -05001228}
1229
1230RValue<Byte4> Byte4::operator=(const Byte4 &rhs)
1231{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001232 return RValue<Byte4>(storeValue(rhs.loadValue()));
Nicolas Capens133b87d2020-01-25 16:26:28 -05001233}
1234
Nicolas Capens157ba262019-12-10 17:49:14 -05001235Byte8::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)
1236{
Ben Clayton713b8d32019-12-17 20:37:56 +00001237 int64_t constantVector[8] = { x0, x1, x2, x3, x4, x5, x6, x7 };
Nicolas Capens519cf222020-05-08 15:27:19 -04001238 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001239}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001240
Nicolas Capens157ba262019-12-10 17:49:14 -05001241Byte8::Byte8(RValue<Byte8> rhs)
1242{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001243 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001244}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001245
Nicolas Capens157ba262019-12-10 17:49:14 -05001246Byte8::Byte8(const Byte8 &rhs)
1247{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001248 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05001249}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001250
Nicolas Capens157ba262019-12-10 17:49:14 -05001251Byte8::Byte8(const Reference<Byte8> &rhs)
1252{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001253 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05001254}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001255
Nicolas Capens157ba262019-12-10 17:49:14 -05001256RValue<Byte8> Byte8::operator=(RValue<Byte8> rhs)
1257{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001258 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001259}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001260
Nicolas Capens157ba262019-12-10 17:49:14 -05001261RValue<Byte8> Byte8::operator=(const Byte8 &rhs)
1262{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001263 return RValue<Byte8>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001264}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001265
Nicolas Capens157ba262019-12-10 17:49:14 -05001266RValue<Byte8> Byte8::operator=(const Reference<Byte8> &rhs)
1267{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001268 return RValue<Byte8>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001269}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001270
Nicolas Capens157ba262019-12-10 17:49:14 -05001271RValue<Byte8> operator+(RValue<Byte8> lhs, RValue<Byte8> rhs)
1272{
1273 return RValue<Byte8>(Nucleus::createAdd(lhs.value, rhs.value));
1274}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001275
Nicolas Capens157ba262019-12-10 17:49:14 -05001276RValue<Byte8> operator-(RValue<Byte8> lhs, RValue<Byte8> rhs)
1277{
1278 return RValue<Byte8>(Nucleus::createSub(lhs.value, rhs.value));
1279}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001280
1281// RValue<Byte8> operator*(RValue<Byte8> lhs, RValue<Byte8> rhs)
1282// {
1283// return RValue<Byte8>(Nucleus::createMul(lhs.value, rhs.value));
1284// }
1285
1286// RValue<Byte8> operator/(RValue<Byte8> lhs, RValue<Byte8> rhs)
1287// {
1288// return RValue<Byte8>(Nucleus::createUDiv(lhs.value, rhs.value));
1289// }
1290
1291// RValue<Byte8> operator%(RValue<Byte8> lhs, RValue<Byte8> rhs)
1292// {
1293// return RValue<Byte8>(Nucleus::createURem(lhs.value, rhs.value));
1294// }
1295
Nicolas Capens157ba262019-12-10 17:49:14 -05001296RValue<Byte8> operator&(RValue<Byte8> lhs, RValue<Byte8> rhs)
1297{
1298 return RValue<Byte8>(Nucleus::createAnd(lhs.value, rhs.value));
1299}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001300
Nicolas Capens157ba262019-12-10 17:49:14 -05001301RValue<Byte8> operator|(RValue<Byte8> lhs, RValue<Byte8> rhs)
1302{
1303 return RValue<Byte8>(Nucleus::createOr(lhs.value, rhs.value));
1304}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001305
Nicolas Capens157ba262019-12-10 17:49:14 -05001306RValue<Byte8> operator^(RValue<Byte8> lhs, RValue<Byte8> rhs)
1307{
1308 return RValue<Byte8>(Nucleus::createXor(lhs.value, rhs.value));
1309}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001310
1311// RValue<Byte8> operator<<(RValue<Byte8> lhs, unsigned char rhs)
1312// {
1313// return RValue<Byte8>(Nucleus::createShl(lhs.value, rhs.value));
1314// }
1315
1316// RValue<Byte8> operator>>(RValue<Byte8> lhs, unsigned char rhs)
1317// {
1318// return RValue<Byte8>(Nucleus::createLShr(lhs.value, rhs.value));
1319// }
1320
Nicolas Capens157ba262019-12-10 17:49:14 -05001321RValue<Byte8> operator+=(Byte8 &lhs, RValue<Byte8> rhs)
1322{
1323 return lhs = lhs + rhs;
1324}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001325
Nicolas Capens157ba262019-12-10 17:49:14 -05001326RValue<Byte8> operator-=(Byte8 &lhs, RValue<Byte8> rhs)
1327{
1328 return lhs = lhs - rhs;
1329}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001330
1331// RValue<Byte8> operator*=(Byte8 &lhs, RValue<Byte8> rhs)
1332// {
1333// return lhs = lhs * rhs;
1334// }
1335
1336// RValue<Byte8> operator/=(Byte8 &lhs, RValue<Byte8> rhs)
1337// {
1338// return lhs = lhs / rhs;
1339// }
1340
1341// RValue<Byte8> operator%=(Byte8 &lhs, RValue<Byte8> rhs)
1342// {
1343// return lhs = lhs % rhs;
1344// }
1345
Nicolas Capens157ba262019-12-10 17:49:14 -05001346RValue<Byte8> operator&=(Byte8 &lhs, RValue<Byte8> rhs)
1347{
1348 return lhs = lhs & rhs;
1349}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001350
Nicolas Capens157ba262019-12-10 17:49:14 -05001351RValue<Byte8> operator|=(Byte8 &lhs, RValue<Byte8> rhs)
1352{
1353 return lhs = lhs | rhs;
1354}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001355
Nicolas Capens157ba262019-12-10 17:49:14 -05001356RValue<Byte8> operator^=(Byte8 &lhs, RValue<Byte8> rhs)
1357{
1358 return lhs = lhs ^ rhs;
1359}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001360
1361// RValue<Byte8> operator<<=(Byte8 &lhs, RValue<Byte8> rhs)
1362// {
1363// return lhs = lhs << rhs;
1364// }
1365
1366// RValue<Byte8> operator>>=(Byte8 &lhs, RValue<Byte8> rhs)
1367// {
1368// return lhs = lhs >> rhs;
1369// }
1370
1371// RValue<Byte8> operator+(RValue<Byte8> val)
1372// {
1373// return val;
1374// }
1375
1376// RValue<Byte8> operator-(RValue<Byte8> val)
1377// {
1378// return RValue<Byte8>(Nucleus::createNeg(val.value));
1379// }
1380
Nicolas Capens157ba262019-12-10 17:49:14 -05001381RValue<Byte8> operator~(RValue<Byte8> val)
1382{
1383 return RValue<Byte8>(Nucleus::createNot(val.value));
1384}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001385
Nicolas Capens133b87d2020-01-25 16:26:28 -05001386RValue<Byte8> Swizzle(RValue<Byte8> x, uint32_t select)
1387{
1388 // Real type is v16i8
1389 // TODO(b/148379603): Optimize narrowing swizzle.
1390 int shuffle[16] = {
1391 static_cast<int>((select >> 28) & 0x07),
1392 static_cast<int>((select >> 24) & 0x07),
1393 static_cast<int>((select >> 20) & 0x07),
1394 static_cast<int>((select >> 16) & 0x07),
1395 static_cast<int>((select >> 12) & 0x07),
1396 static_cast<int>((select >> 8) & 0x07),
1397 static_cast<int>((select >> 4) & 0x07),
1398 static_cast<int>((select >> 0) & 0x07),
1399 static_cast<int>((select >> 28) & 0x07),
1400 static_cast<int>((select >> 24) & 0x07),
1401 static_cast<int>((select >> 20) & 0x07),
1402 static_cast<int>((select >> 16) & 0x07),
1403 static_cast<int>((select >> 12) & 0x07),
1404 static_cast<int>((select >> 8) & 0x07),
1405 static_cast<int>((select >> 4) & 0x07),
1406 static_cast<int>((select >> 0) & 0x07),
1407 };
1408
1409 return As<Byte8>(Nucleus::createShuffleVector(x.value, x.value, shuffle));
1410}
1411
Nicolas Capens157ba262019-12-10 17:49:14 -05001412RValue<Short4> Unpack(RValue<Byte4> x)
1413{
Nicolas Capens133b87d2020-01-25 16:26:28 -05001414 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00001415 int shuffle[16] = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7 }; // Real type is v16i8
Nicolas Capens157ba262019-12-10 17:49:14 -05001416 return As<Short4>(Nucleus::createShuffleVector(x.value, x.value, shuffle));
1417}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001418
Nicolas Capens157ba262019-12-10 17:49:14 -05001419RValue<Short4> Unpack(RValue<Byte4> x, RValue<Byte4> y)
1420{
1421 return UnpackLow(As<Byte8>(x), As<Byte8>(y));
1422}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001423
Nicolas Capens157ba262019-12-10 17:49:14 -05001424RValue<Short4> UnpackLow(RValue<Byte8> x, RValue<Byte8> y)
1425{
Nicolas Capens133b87d2020-01-25 16:26:28 -05001426 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00001427 int shuffle[16] = { 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23 }; // Real type is v16i8
Nicolas Capens157ba262019-12-10 17:49:14 -05001428 return As<Short4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
1429}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001430
Nicolas Capens157ba262019-12-10 17:49:14 -05001431RValue<Short4> UnpackHigh(RValue<Byte8> x, RValue<Byte8> y)
1432{
Nicolas Capens133b87d2020-01-25 16:26:28 -05001433 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00001434 int shuffle[16] = { 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23 }; // Real type is v16i8
Nicolas Capens157ba262019-12-10 17:49:14 -05001435 auto lowHigh = RValue<Byte16>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
1436 return As<Short4>(Swizzle(As<Int4>(lowHigh), 0x2323));
1437}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001438
Nicolas Capens157ba262019-12-10 17:49:14 -05001439SByte8::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)
1440{
Ben Clayton713b8d32019-12-17 20:37:56 +00001441 int64_t constantVector[8] = { x0, x1, x2, x3, x4, x5, x6, x7 };
Nicolas Capens519cf222020-05-08 15:27:19 -04001442 Value *vector = Nucleus::createConstantVector(constantVector, type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001443
Nicolas Capens519cf222020-05-08 15:27:19 -04001444 storeValue(Nucleus::createBitCast(vector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001445}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001446
Nicolas Capens157ba262019-12-10 17:49:14 -05001447SByte8::SByte8(RValue<SByte8> rhs)
1448{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001449 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001450}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001451
Nicolas Capens157ba262019-12-10 17:49:14 -05001452SByte8::SByte8(const SByte8 &rhs)
1453{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001454 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05001455}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001456
Nicolas Capens157ba262019-12-10 17:49:14 -05001457SByte8::SByte8(const Reference<SByte8> &rhs)
1458{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001459 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05001460}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001461
Nicolas Capens157ba262019-12-10 17:49:14 -05001462RValue<SByte8> SByte8::operator=(RValue<SByte8> rhs)
1463{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001464 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001465}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001466
Nicolas Capens157ba262019-12-10 17:49:14 -05001467RValue<SByte8> SByte8::operator=(const SByte8 &rhs)
1468{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001469 return RValue<SByte8>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001470}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001471
Nicolas Capens157ba262019-12-10 17:49:14 -05001472RValue<SByte8> SByte8::operator=(const Reference<SByte8> &rhs)
1473{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001474 return RValue<SByte8>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001475}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001476
Nicolas Capens157ba262019-12-10 17:49:14 -05001477RValue<SByte8> operator+(RValue<SByte8> lhs, RValue<SByte8> rhs)
1478{
1479 return RValue<SByte8>(Nucleus::createAdd(lhs.value, rhs.value));
1480}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001481
Nicolas Capens157ba262019-12-10 17:49:14 -05001482RValue<SByte8> operator-(RValue<SByte8> lhs, RValue<SByte8> rhs)
1483{
1484 return RValue<SByte8>(Nucleus::createSub(lhs.value, rhs.value));
1485}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001486
1487// RValue<SByte8> operator*(RValue<SByte8> lhs, RValue<SByte8> rhs)
1488// {
1489// return RValue<SByte8>(Nucleus::createMul(lhs.value, rhs.value));
1490// }
1491
1492// RValue<SByte8> operator/(RValue<SByte8> lhs, RValue<SByte8> rhs)
1493// {
1494// return RValue<SByte8>(Nucleus::createSDiv(lhs.value, rhs.value));
1495// }
1496
1497// RValue<SByte8> operator%(RValue<SByte8> lhs, RValue<SByte8> rhs)
1498// {
1499// return RValue<SByte8>(Nucleus::createSRem(lhs.value, rhs.value));
1500// }
1501
Nicolas Capens157ba262019-12-10 17:49:14 -05001502RValue<SByte8> operator&(RValue<SByte8> lhs, RValue<SByte8> rhs)
1503{
1504 return RValue<SByte8>(Nucleus::createAnd(lhs.value, rhs.value));
1505}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001506
Nicolas Capens157ba262019-12-10 17:49:14 -05001507RValue<SByte8> operator|(RValue<SByte8> lhs, RValue<SByte8> rhs)
1508{
1509 return RValue<SByte8>(Nucleus::createOr(lhs.value, rhs.value));
1510}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001511
Nicolas Capens157ba262019-12-10 17:49:14 -05001512RValue<SByte8> operator^(RValue<SByte8> lhs, RValue<SByte8> rhs)
1513{
1514 return RValue<SByte8>(Nucleus::createXor(lhs.value, rhs.value));
1515}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001516
1517// RValue<SByte8> operator<<(RValue<SByte8> lhs, unsigned char rhs)
1518// {
1519// return RValue<SByte8>(Nucleus::createShl(lhs.value, rhs.value));
1520// }
1521
1522// RValue<SByte8> operator>>(RValue<SByte8> lhs, unsigned char rhs)
1523// {
1524// return RValue<SByte8>(Nucleus::createAShr(lhs.value, rhs.value));
1525// }
1526
Nicolas Capens157ba262019-12-10 17:49:14 -05001527RValue<SByte8> operator+=(SByte8 &lhs, RValue<SByte8> rhs)
1528{
1529 return lhs = lhs + rhs;
1530}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001531
Nicolas Capens157ba262019-12-10 17:49:14 -05001532RValue<SByte8> operator-=(SByte8 &lhs, RValue<SByte8> rhs)
1533{
1534 return lhs = lhs - rhs;
1535}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001536
1537// RValue<SByte8> operator*=(SByte8 &lhs, RValue<SByte8> rhs)
1538// {
1539// return lhs = lhs * rhs;
1540// }
1541
1542// RValue<SByte8> operator/=(SByte8 &lhs, RValue<SByte8> rhs)
1543// {
1544// return lhs = lhs / rhs;
1545// }
1546
1547// RValue<SByte8> operator%=(SByte8 &lhs, RValue<SByte8> rhs)
1548// {
1549// return lhs = lhs % rhs;
1550// }
1551
Nicolas Capens157ba262019-12-10 17:49:14 -05001552RValue<SByte8> operator&=(SByte8 &lhs, RValue<SByte8> rhs)
1553{
1554 return lhs = lhs & rhs;
1555}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001556
Nicolas Capens157ba262019-12-10 17:49:14 -05001557RValue<SByte8> operator|=(SByte8 &lhs, RValue<SByte8> rhs)
1558{
1559 return lhs = lhs | rhs;
1560}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001561
Nicolas Capens157ba262019-12-10 17:49:14 -05001562RValue<SByte8> operator^=(SByte8 &lhs, RValue<SByte8> rhs)
1563{
1564 return lhs = lhs ^ rhs;
1565}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001566
1567// RValue<SByte8> operator<<=(SByte8 &lhs, RValue<SByte8> rhs)
1568// {
1569// return lhs = lhs << rhs;
1570// }
1571
1572// RValue<SByte8> operator>>=(SByte8 &lhs, RValue<SByte8> rhs)
1573// {
1574// return lhs = lhs >> rhs;
1575// }
1576
1577// RValue<SByte8> operator+(RValue<SByte8> val)
1578// {
1579// return val;
1580// }
1581
1582// RValue<SByte8> operator-(RValue<SByte8> val)
1583// {
1584// return RValue<SByte8>(Nucleus::createNeg(val.value));
1585// }
1586
Nicolas Capens157ba262019-12-10 17:49:14 -05001587RValue<SByte8> operator~(RValue<SByte8> val)
1588{
1589 return RValue<SByte8>(Nucleus::createNot(val.value));
1590}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001591
Nicolas Capens157ba262019-12-10 17:49:14 -05001592RValue<Short4> UnpackLow(RValue<SByte8> x, RValue<SByte8> y)
1593{
Nicolas Capens133b87d2020-01-25 16:26:28 -05001594 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00001595 int shuffle[16] = { 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23 }; // Real type is v16i8
Nicolas Capens157ba262019-12-10 17:49:14 -05001596 return As<Short4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
1597}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001598
Nicolas Capens157ba262019-12-10 17:49:14 -05001599RValue<Short4> UnpackHigh(RValue<SByte8> x, RValue<SByte8> y)
1600{
Nicolas Capens133b87d2020-01-25 16:26:28 -05001601 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00001602 int shuffle[16] = { 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23 }; // Real type is v16i8
Nicolas Capens157ba262019-12-10 17:49:14 -05001603 auto lowHigh = RValue<Byte16>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
1604 return As<Short4>(Swizzle(As<Int4>(lowHigh), 0x2323));
1605}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001606
Nicolas Capens157ba262019-12-10 17:49:14 -05001607Byte16::Byte16(RValue<Byte16> rhs)
1608{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001609 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001610}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001611
Nicolas Capens157ba262019-12-10 17:49:14 -05001612Byte16::Byte16(const Byte16 &rhs)
1613{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001614 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05001615}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001616
Nicolas Capens157ba262019-12-10 17:49:14 -05001617Byte16::Byte16(const Reference<Byte16> &rhs)
1618{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001619 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05001620}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001621
Nicolas Capens157ba262019-12-10 17:49:14 -05001622RValue<Byte16> Byte16::operator=(RValue<Byte16> rhs)
1623{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001624 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001625}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001626
Nicolas Capens157ba262019-12-10 17:49:14 -05001627RValue<Byte16> Byte16::operator=(const Byte16 &rhs)
1628{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001629 return RValue<Byte16>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001630}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001631
Nicolas Capens157ba262019-12-10 17:49:14 -05001632RValue<Byte16> Byte16::operator=(const Reference<Byte16> &rhs)
1633{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001634 return RValue<Byte16>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001635}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001636
Nicolas Capens133b87d2020-01-25 16:26:28 -05001637RValue<Byte16> Swizzle(RValue<Byte16> x, uint64_t select)
1638{
1639 int shuffle[16] = {
1640 static_cast<int>((select >> 60) & 0x0F),
1641 static_cast<int>((select >> 56) & 0x0F),
1642 static_cast<int>((select >> 52) & 0x0F),
1643 static_cast<int>((select >> 48) & 0x0F),
1644 static_cast<int>((select >> 44) & 0x0F),
1645 static_cast<int>((select >> 40) & 0x0F),
1646 static_cast<int>((select >> 36) & 0x0F),
1647 static_cast<int>((select >> 32) & 0x0F),
1648 static_cast<int>((select >> 28) & 0x0F),
1649 static_cast<int>((select >> 24) & 0x0F),
1650 static_cast<int>((select >> 20) & 0x0F),
1651 static_cast<int>((select >> 16) & 0x0F),
1652 static_cast<int>((select >> 12) & 0x0F),
1653 static_cast<int>((select >> 8) & 0x0F),
1654 static_cast<int>((select >> 4) & 0x0F),
1655 static_cast<int>((select >> 0) & 0x0F),
1656 };
1657
1658 return As<Byte16>(Nucleus::createShuffleVector(x.value, x.value, shuffle));
1659}
1660
Nicolas Capens157ba262019-12-10 17:49:14 -05001661Short2::Short2(RValue<Short4> cast)
1662{
Nicolas Capens519cf222020-05-08 15:27:19 -04001663 storeValue(Nucleus::createBitCast(cast.value, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001664}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001665
Nicolas Capens157ba262019-12-10 17:49:14 -05001666UShort2::UShort2(RValue<UShort4> cast)
1667{
Nicolas Capens519cf222020-05-08 15:27:19 -04001668 storeValue(Nucleus::createBitCast(cast.value, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001669}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001670
Nicolas Capens157ba262019-12-10 17:49:14 -05001671Short4::Short4(RValue<Int> cast)
1672{
1673 Value *vector = loadValue();
Nicolas Capens519cf222020-05-08 15:27:19 -04001674 Value *element = Nucleus::createTrunc(cast.value, Short::type());
Nicolas Capens157ba262019-12-10 17:49:14 -05001675 Value *insert = Nucleus::createInsertElement(vector, element, 0);
1676 Value *swizzle = Swizzle(RValue<Short4>(insert), 0x0000).value;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001677
Nicolas Capens157ba262019-12-10 17:49:14 -05001678 storeValue(swizzle);
1679}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001680
1681// Short4::Short4(RValue<Float> cast)
1682// {
1683// }
1684
Nicolas Capens157ba262019-12-10 17:49:14 -05001685Short4::Short4(short xyzw)
1686{
Ben Clayton713b8d32019-12-17 20:37:56 +00001687 int64_t constantVector[4] = { xyzw, xyzw, xyzw, xyzw };
Nicolas Capens519cf222020-05-08 15:27:19 -04001688 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001689}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001690
Nicolas Capens157ba262019-12-10 17:49:14 -05001691Short4::Short4(short x, short y, short z, short w)
1692{
Ben Clayton713b8d32019-12-17 20:37:56 +00001693 int64_t constantVector[4] = { x, y, z, w };
Nicolas Capens519cf222020-05-08 15:27:19 -04001694 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001695}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001696
Nicolas Capens157ba262019-12-10 17:49:14 -05001697Short4::Short4(RValue<Short4> rhs)
1698{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001699 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001700}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001701
Nicolas Capens157ba262019-12-10 17:49:14 -05001702Short4::Short4(const Short4 &rhs)
1703{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001704 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05001705}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001706
Nicolas Capens157ba262019-12-10 17:49:14 -05001707Short4::Short4(const Reference<Short4> &rhs)
1708{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001709 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05001710}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001711
Nicolas Capens157ba262019-12-10 17:49:14 -05001712Short4::Short4(RValue<UShort4> rhs)
1713{
1714 storeValue(rhs.value);
1715}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001716
Nicolas Capens157ba262019-12-10 17:49:14 -05001717Short4::Short4(const UShort4 &rhs)
1718{
1719 storeValue(rhs.loadValue());
1720}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001721
Nicolas Capens157ba262019-12-10 17:49:14 -05001722Short4::Short4(const Reference<UShort4> &rhs)
1723{
1724 storeValue(rhs.loadValue());
1725}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001726
Nicolas Capens157ba262019-12-10 17:49:14 -05001727RValue<Short4> Short4::operator=(RValue<Short4> rhs)
1728{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001729 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001730}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001731
Nicolas Capens157ba262019-12-10 17:49:14 -05001732RValue<Short4> Short4::operator=(const Short4 &rhs)
1733{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001734 return RValue<Short4>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001735}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001736
Nicolas Capens157ba262019-12-10 17:49:14 -05001737RValue<Short4> Short4::operator=(const Reference<Short4> &rhs)
1738{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001739 return RValue<Short4>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001740}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001741
Nicolas Capens157ba262019-12-10 17:49:14 -05001742RValue<Short4> Short4::operator=(RValue<UShort4> rhs)
1743{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001744 return RValue<Short4>(storeValue(rhs.value));
Nicolas Capens157ba262019-12-10 17:49:14 -05001745}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001746
Nicolas Capens157ba262019-12-10 17:49:14 -05001747RValue<Short4> Short4::operator=(const UShort4 &rhs)
1748{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001749 return RValue<Short4>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001750}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001751
Nicolas Capens157ba262019-12-10 17:49:14 -05001752RValue<Short4> Short4::operator=(const Reference<UShort4> &rhs)
1753{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001754 return RValue<Short4>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001755}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001756
Nicolas Capens157ba262019-12-10 17:49:14 -05001757RValue<Short4> operator+(RValue<Short4> lhs, RValue<Short4> rhs)
1758{
1759 return RValue<Short4>(Nucleus::createAdd(lhs.value, rhs.value));
1760}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001761
Nicolas Capens157ba262019-12-10 17:49:14 -05001762RValue<Short4> operator-(RValue<Short4> lhs, RValue<Short4> rhs)
1763{
1764 return RValue<Short4>(Nucleus::createSub(lhs.value, rhs.value));
1765}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001766
Nicolas Capens157ba262019-12-10 17:49:14 -05001767RValue<Short4> operator*(RValue<Short4> lhs, RValue<Short4> rhs)
1768{
1769 return RValue<Short4>(Nucleus::createMul(lhs.value, rhs.value));
1770}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001771
1772// RValue<Short4> operator/(RValue<Short4> lhs, RValue<Short4> rhs)
1773// {
1774// return RValue<Short4>(Nucleus::createSDiv(lhs.value, rhs.value));
1775// }
1776
1777// RValue<Short4> operator%(RValue<Short4> lhs, RValue<Short4> rhs)
1778// {
1779// return RValue<Short4>(Nucleus::createSRem(lhs.value, rhs.value));
1780// }
1781
Nicolas Capens157ba262019-12-10 17:49:14 -05001782RValue<Short4> operator&(RValue<Short4> lhs, RValue<Short4> rhs)
1783{
1784 return RValue<Short4>(Nucleus::createAnd(lhs.value, rhs.value));
1785}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001786
Nicolas Capens157ba262019-12-10 17:49:14 -05001787RValue<Short4> operator|(RValue<Short4> lhs, RValue<Short4> rhs)
1788{
1789 return RValue<Short4>(Nucleus::createOr(lhs.value, rhs.value));
1790}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001791
Nicolas Capens157ba262019-12-10 17:49:14 -05001792RValue<Short4> operator^(RValue<Short4> lhs, RValue<Short4> rhs)
1793{
1794 return RValue<Short4>(Nucleus::createXor(lhs.value, rhs.value));
1795}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001796
Nicolas Capens157ba262019-12-10 17:49:14 -05001797RValue<Short4> operator+=(Short4 &lhs, RValue<Short4> rhs)
1798{
1799 return lhs = lhs + rhs;
1800}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001801
Nicolas Capens157ba262019-12-10 17:49:14 -05001802RValue<Short4> operator-=(Short4 &lhs, RValue<Short4> rhs)
1803{
1804 return lhs = lhs - rhs;
1805}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001806
Nicolas Capens157ba262019-12-10 17:49:14 -05001807RValue<Short4> operator*=(Short4 &lhs, RValue<Short4> rhs)
1808{
1809 return lhs = lhs * rhs;
1810}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001811
1812// RValue<Short4> operator/=(Short4 &lhs, RValue<Short4> rhs)
1813// {
1814// return lhs = lhs / rhs;
1815// }
1816
1817// RValue<Short4> operator%=(Short4 &lhs, RValue<Short4> rhs)
1818// {
1819// return lhs = lhs % rhs;
1820// }
1821
Nicolas Capens157ba262019-12-10 17:49:14 -05001822RValue<Short4> operator&=(Short4 &lhs, RValue<Short4> rhs)
1823{
1824 return lhs = lhs & rhs;
1825}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001826
Nicolas Capens157ba262019-12-10 17:49:14 -05001827RValue<Short4> operator|=(Short4 &lhs, RValue<Short4> rhs)
1828{
1829 return lhs = lhs | rhs;
1830}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001831
Nicolas Capens157ba262019-12-10 17:49:14 -05001832RValue<Short4> operator^=(Short4 &lhs, RValue<Short4> rhs)
1833{
1834 return lhs = lhs ^ rhs;
1835}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001836
Nicolas Capens157ba262019-12-10 17:49:14 -05001837RValue<Short4> operator<<=(Short4 &lhs, unsigned char rhs)
1838{
1839 return lhs = lhs << rhs;
1840}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001841
Nicolas Capens157ba262019-12-10 17:49:14 -05001842RValue<Short4> operator>>=(Short4 &lhs, unsigned char rhs)
1843{
1844 return lhs = lhs >> rhs;
1845}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001846
1847// RValue<Short4> operator+(RValue<Short4> val)
1848// {
1849// return val;
1850// }
1851
Nicolas Capens157ba262019-12-10 17:49:14 -05001852RValue<Short4> operator-(RValue<Short4> val)
1853{
1854 return RValue<Short4>(Nucleus::createNeg(val.value));
1855}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001856
Nicolas Capens157ba262019-12-10 17:49:14 -05001857RValue<Short4> operator~(RValue<Short4> val)
1858{
1859 return RValue<Short4>(Nucleus::createNot(val.value));
1860}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001861
Nicolas Capens157ba262019-12-10 17:49:14 -05001862RValue<Short4> RoundShort4(RValue<Float4> cast)
1863{
1864 RValue<Int4> int4 = RoundInt(cast);
1865 return As<Short4>(PackSigned(int4, int4));
1866}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001867
Nicolas Capens157ba262019-12-10 17:49:14 -05001868RValue<Int2> UnpackLow(RValue<Short4> x, RValue<Short4> y)
1869{
Ben Clayton713b8d32019-12-17 20:37:56 +00001870 int shuffle[8] = { 0, 8, 1, 9, 2, 10, 3, 11 }; // Real type is v8i16
Nicolas Capens157ba262019-12-10 17:49:14 -05001871 return As<Int2>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
1872}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001873
Nicolas Capens157ba262019-12-10 17:49:14 -05001874RValue<Int2> UnpackHigh(RValue<Short4> x, RValue<Short4> y)
1875{
Nicolas Capens133b87d2020-01-25 16:26:28 -05001876 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00001877 int shuffle[8] = { 0, 8, 1, 9, 2, 10, 3, 11 }; // Real type is v8i16
Nicolas Capens157ba262019-12-10 17:49:14 -05001878 auto lowHigh = RValue<Short8>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
1879 return As<Int2>(Swizzle(As<Int4>(lowHigh), 0x2323));
1880}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001881
Nicolas Capens157ba262019-12-10 17:49:14 -05001882RValue<Short4> Swizzle(RValue<Short4> x, uint16_t select)
1883{
1884 // Real type is v8i16
Nicolas Capens133b87d2020-01-25 16:26:28 -05001885 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00001886 int shuffle[8] = {
Nicolas Capens157ba262019-12-10 17:49:14 -05001887 (select >> 12) & 0x03,
Ben Clayton713b8d32019-12-17 20:37:56 +00001888 (select >> 8) & 0x03,
1889 (select >> 4) & 0x03,
1890 (select >> 0) & 0x03,
Nicolas Capens157ba262019-12-10 17:49:14 -05001891 (select >> 12) & 0x03,
Ben Clayton713b8d32019-12-17 20:37:56 +00001892 (select >> 8) & 0x03,
1893 (select >> 4) & 0x03,
1894 (select >> 0) & 0x03,
Nicolas Capens157ba262019-12-10 17:49:14 -05001895 };
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001896
Nicolas Capens157ba262019-12-10 17:49:14 -05001897 return As<Short4>(Nucleus::createShuffleVector(x.value, x.value, shuffle));
1898}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001899
Nicolas Capens157ba262019-12-10 17:49:14 -05001900RValue<Short4> Insert(RValue<Short4> val, RValue<Short> element, int i)
1901{
1902 return RValue<Short4>(Nucleus::createInsertElement(val.value, element.value, i));
1903}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001904
Nicolas Capens157ba262019-12-10 17:49:14 -05001905RValue<Short> Extract(RValue<Short4> val, int i)
1906{
Nicolas Capens519cf222020-05-08 15:27:19 -04001907 return RValue<Short>(Nucleus::createExtractElement(val.value, Short::type(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05001908}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001909
Nicolas Capens157ba262019-12-10 17:49:14 -05001910UShort4::UShort4(RValue<Int4> cast)
1911{
1912 *this = Short4(cast);
1913}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001914
Nicolas Capens157ba262019-12-10 17:49:14 -05001915UShort4::UShort4(unsigned short xyzw)
1916{
Ben Clayton713b8d32019-12-17 20:37:56 +00001917 int64_t constantVector[4] = { xyzw, xyzw, xyzw, xyzw };
Nicolas Capens519cf222020-05-08 15:27:19 -04001918 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001919}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001920
Nicolas Capens157ba262019-12-10 17:49:14 -05001921UShort4::UShort4(unsigned short x, unsigned short y, unsigned short z, unsigned short w)
1922{
Ben Clayton713b8d32019-12-17 20:37:56 +00001923 int64_t constantVector[4] = { x, y, z, w };
Nicolas Capens519cf222020-05-08 15:27:19 -04001924 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001925}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001926
Nicolas Capens157ba262019-12-10 17:49:14 -05001927UShort4::UShort4(RValue<UShort4> rhs)
1928{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001929 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001930}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001931
Nicolas Capens157ba262019-12-10 17:49:14 -05001932UShort4::UShort4(const UShort4 &rhs)
1933{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001934 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05001935}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001936
Nicolas Capens157ba262019-12-10 17:49:14 -05001937UShort4::UShort4(const Reference<UShort4> &rhs)
1938{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001939 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05001940}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001941
Nicolas Capens157ba262019-12-10 17:49:14 -05001942UShort4::UShort4(RValue<Short4> rhs)
1943{
1944 storeValue(rhs.value);
1945}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001946
Nicolas Capens157ba262019-12-10 17:49:14 -05001947UShort4::UShort4(const Short4 &rhs)
1948{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001949 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05001950}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001951
Nicolas Capens157ba262019-12-10 17:49:14 -05001952UShort4::UShort4(const Reference<Short4> &rhs)
1953{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001954 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05001955}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001956
Nicolas Capens157ba262019-12-10 17:49:14 -05001957RValue<UShort4> UShort4::operator=(RValue<UShort4> rhs)
1958{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001959 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05001960}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001961
Nicolas Capens157ba262019-12-10 17:49:14 -05001962RValue<UShort4> UShort4::operator=(const UShort4 &rhs)
1963{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001964 return store(rhs.load());
Nicolas Capens157ba262019-12-10 17:49:14 -05001965}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001966
Nicolas Capens157ba262019-12-10 17:49:14 -05001967RValue<UShort4> UShort4::operator=(const Reference<UShort4> &rhs)
1968{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001969 return RValue<UShort4>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001970}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001971
Nicolas Capens157ba262019-12-10 17:49:14 -05001972RValue<UShort4> UShort4::operator=(RValue<Short4> rhs)
1973{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001974 return RValue<UShort4>(storeValue(rhs.value));
Nicolas Capens157ba262019-12-10 17:49:14 -05001975}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001976
Nicolas Capens157ba262019-12-10 17:49:14 -05001977RValue<UShort4> UShort4::operator=(const Short4 &rhs)
1978{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001979 return RValue<UShort4>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001980}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001981
Nicolas Capens157ba262019-12-10 17:49:14 -05001982RValue<UShort4> UShort4::operator=(const Reference<Short4> &rhs)
1983{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04001984 return RValue<UShort4>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05001985}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001986
Nicolas Capens157ba262019-12-10 17:49:14 -05001987RValue<UShort4> operator+(RValue<UShort4> lhs, RValue<UShort4> rhs)
1988{
1989 return RValue<UShort4>(Nucleus::createAdd(lhs.value, rhs.value));
1990}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001991
Nicolas Capens157ba262019-12-10 17:49:14 -05001992RValue<UShort4> operator-(RValue<UShort4> lhs, RValue<UShort4> rhs)
1993{
1994 return RValue<UShort4>(Nucleus::createSub(lhs.value, rhs.value));
1995}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04001996
Nicolas Capens157ba262019-12-10 17:49:14 -05001997RValue<UShort4> operator*(RValue<UShort4> lhs, RValue<UShort4> rhs)
1998{
1999 return RValue<UShort4>(Nucleus::createMul(lhs.value, rhs.value));
2000}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002001
Nicolas Capens157ba262019-12-10 17:49:14 -05002002RValue<UShort4> operator&(RValue<UShort4> lhs, RValue<UShort4> rhs)
2003{
2004 return RValue<UShort4>(Nucleus::createAnd(lhs.value, rhs.value));
2005}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002006
Nicolas Capens157ba262019-12-10 17:49:14 -05002007RValue<UShort4> operator|(RValue<UShort4> lhs, RValue<UShort4> rhs)
2008{
2009 return RValue<UShort4>(Nucleus::createOr(lhs.value, rhs.value));
2010}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002011
Nicolas Capens157ba262019-12-10 17:49:14 -05002012RValue<UShort4> operator^(RValue<UShort4> lhs, RValue<UShort4> rhs)
2013{
2014 return RValue<UShort4>(Nucleus::createXor(lhs.value, rhs.value));
2015}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002016
Nicolas Capens157ba262019-12-10 17:49:14 -05002017RValue<UShort4> operator<<=(UShort4 &lhs, unsigned char rhs)
2018{
2019 return lhs = lhs << rhs;
2020}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002021
Nicolas Capens157ba262019-12-10 17:49:14 -05002022RValue<UShort4> operator>>=(UShort4 &lhs, unsigned char rhs)
2023{
2024 return lhs = lhs >> rhs;
2025}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002026
Nicolas Capens157ba262019-12-10 17:49:14 -05002027RValue<UShort4> operator~(RValue<UShort4> val)
2028{
2029 return RValue<UShort4>(Nucleus::createNot(val.value));
2030}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002031
Nicolas Capens157ba262019-12-10 17:49:14 -05002032Short8::Short8(short c)
2033{
Ben Clayton713b8d32019-12-17 20:37:56 +00002034 int64_t constantVector[8] = { c, c, c, c, c, c, c, c };
Nicolas Capens519cf222020-05-08 15:27:19 -04002035 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002036}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002037
Nicolas Capens157ba262019-12-10 17:49:14 -05002038Short8::Short8(short c0, short c1, short c2, short c3, short c4, short c5, short c6, short c7)
2039{
Ben Clayton713b8d32019-12-17 20:37:56 +00002040 int64_t constantVector[8] = { c0, c1, c2, c3, c4, c5, c6, c7 };
Nicolas Capens519cf222020-05-08 15:27:19 -04002041 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002042}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002043
Nicolas Capens157ba262019-12-10 17:49:14 -05002044Short8::Short8(RValue<Short8> rhs)
2045{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002046 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002047}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002048
Nicolas Capens157ba262019-12-10 17:49:14 -05002049Short8::Short8(const Reference<Short8> &rhs)
2050{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002051 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05002052}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002053
Nicolas Capens157ba262019-12-10 17:49:14 -05002054Short8::Short8(RValue<Short4> lo, RValue<Short4> hi)
2055{
Ben Clayton713b8d32019-12-17 20:37:56 +00002056 int shuffle[8] = { 0, 1, 2, 3, 8, 9, 10, 11 }; // Real type is v8i16
Nicolas Capens157ba262019-12-10 17:49:14 -05002057 Value *packed = Nucleus::createShuffleVector(lo.value, hi.value, shuffle);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002058
Nicolas Capens157ba262019-12-10 17:49:14 -05002059 storeValue(packed);
2060}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002061
Nicolas Capens157ba262019-12-10 17:49:14 -05002062RValue<Short8> Short8::operator=(RValue<Short8> rhs)
2063{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002064 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002065}
Nicolas Capensf1beca42019-03-26 17:18:57 -04002066
Nicolas Capens157ba262019-12-10 17:49:14 -05002067RValue<Short8> Short8::operator=(const Short8 &rhs)
2068{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002069 return RValue<Short8>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002070}
Nicolas Capensf1beca42019-03-26 17:18:57 -04002071
Nicolas Capens157ba262019-12-10 17:49:14 -05002072RValue<Short8> Short8::operator=(const Reference<Short8> &rhs)
2073{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002074 return RValue<Short8>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002075}
Nicolas Capensf1beca42019-03-26 17:18:57 -04002076
Nicolas Capens157ba262019-12-10 17:49:14 -05002077RValue<Short8> operator+(RValue<Short8> lhs, RValue<Short8> rhs)
2078{
2079 return RValue<Short8>(Nucleus::createAdd(lhs.value, rhs.value));
2080}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002081
Nicolas Capens157ba262019-12-10 17:49:14 -05002082RValue<Short8> operator&(RValue<Short8> lhs, RValue<Short8> rhs)
2083{
2084 return RValue<Short8>(Nucleus::createAnd(lhs.value, rhs.value));
2085}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002086
Nicolas Capens157ba262019-12-10 17:49:14 -05002087RValue<Int4> Abs(RValue<Int4> x)
2088{
2089 // TODO: Optimize.
2090 auto negative = x >> 31;
2091 return (x ^ negative) - negative;
2092}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002093
Nicolas Capens157ba262019-12-10 17:49:14 -05002094UShort8::UShort8(unsigned short c)
2095{
Ben Clayton713b8d32019-12-17 20:37:56 +00002096 int64_t constantVector[8] = { c, c, c, c, c, c, c, c };
Nicolas Capens519cf222020-05-08 15:27:19 -04002097 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002098}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002099
Nicolas Capens157ba262019-12-10 17:49:14 -05002100UShort8::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)
2101{
Ben Clayton713b8d32019-12-17 20:37:56 +00002102 int64_t constantVector[8] = { c0, c1, c2, c3, c4, c5, c6, c7 };
Nicolas Capens519cf222020-05-08 15:27:19 -04002103 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002104}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002105
Nicolas Capens157ba262019-12-10 17:49:14 -05002106UShort8::UShort8(RValue<UShort8> rhs)
2107{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002108 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002109}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002110
Nicolas Capens157ba262019-12-10 17:49:14 -05002111UShort8::UShort8(const Reference<UShort8> &rhs)
2112{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002113 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05002114}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002115
Nicolas Capens157ba262019-12-10 17:49:14 -05002116UShort8::UShort8(RValue<UShort4> lo, RValue<UShort4> hi)
2117{
Ben Clayton713b8d32019-12-17 20:37:56 +00002118 int shuffle[8] = { 0, 1, 2, 3, 8, 9, 10, 11 }; // Real type is v8i16
Nicolas Capens157ba262019-12-10 17:49:14 -05002119 Value *packed = Nucleus::createShuffleVector(lo.value, hi.value, shuffle);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002120
Nicolas Capens157ba262019-12-10 17:49:14 -05002121 storeValue(packed);
2122}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002123
Nicolas Capens157ba262019-12-10 17:49:14 -05002124RValue<UShort8> UShort8::operator=(RValue<UShort8> rhs)
2125{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002126 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002127}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002128
Nicolas Capens157ba262019-12-10 17:49:14 -05002129RValue<UShort8> UShort8::operator=(const UShort8 &rhs)
2130{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002131 return RValue<UShort8>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002132}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002133
Nicolas Capens157ba262019-12-10 17:49:14 -05002134RValue<UShort8> UShort8::operator=(const Reference<UShort8> &rhs)
2135{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002136 return RValue<UShort8>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002137}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002138
Nicolas Capens157ba262019-12-10 17:49:14 -05002139RValue<UShort8> operator&(RValue<UShort8> lhs, RValue<UShort8> rhs)
2140{
2141 return RValue<UShort8>(Nucleus::createAnd(lhs.value, rhs.value));
2142}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002143
Nicolas Capens157ba262019-12-10 17:49:14 -05002144RValue<UShort8> operator+(RValue<UShort8> lhs, RValue<UShort8> rhs)
2145{
2146 return RValue<UShort8>(Nucleus::createAdd(lhs.value, rhs.value));
2147}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002148
Nicolas Capens157ba262019-12-10 17:49:14 -05002149RValue<UShort8> operator*(RValue<UShort8> lhs, RValue<UShort8> rhs)
2150{
2151 return RValue<UShort8>(Nucleus::createMul(lhs.value, rhs.value));
2152}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002153
Nicolas Capens157ba262019-12-10 17:49:14 -05002154RValue<UShort8> operator+=(UShort8 &lhs, RValue<UShort8> rhs)
2155{
2156 return lhs = lhs + rhs;
2157}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002158
Nicolas Capens157ba262019-12-10 17:49:14 -05002159RValue<UShort8> operator~(RValue<UShort8> val)
2160{
2161 return RValue<UShort8>(Nucleus::createNot(val.value));
2162}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002163
Nicolas Capens133b87d2020-01-25 16:26:28 -05002164RValue<UShort8> Swizzle(RValue<UShort8> x, uint32_t select)
2165{
2166 int swizzle[16] = {
2167 static_cast<int>((select >> 28) & 0x07),
2168 static_cast<int>((select >> 24) & 0x07),
2169 static_cast<int>((select >> 20) & 0x07),
2170 static_cast<int>((select >> 16) & 0x07),
2171 static_cast<int>((select >> 12) & 0x07),
2172 static_cast<int>((select >> 8) & 0x07),
2173 static_cast<int>((select >> 4) & 0x07),
2174 static_cast<int>((select >> 0) & 0x07),
2175 };
2176
2177 return RValue<UShort8>(Nucleus::createShuffleVector(x.value, x.value, swizzle));
2178}
2179
Nicolas Capens157ba262019-12-10 17:49:14 -05002180Int::Int(Argument<Int> argument)
2181{
2182 storeValue(argument.value);
2183}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002184
Nicolas Capens157ba262019-12-10 17:49:14 -05002185Int::Int(RValue<Byte> cast)
2186{
Nicolas Capens519cf222020-05-08 15:27:19 -04002187 Value *integer = Nucleus::createZExt(cast.value, Int::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002188
Nicolas Capens157ba262019-12-10 17:49:14 -05002189 storeValue(integer);
2190}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002191
Nicolas Capens157ba262019-12-10 17:49:14 -05002192Int::Int(RValue<SByte> cast)
2193{
Nicolas Capens519cf222020-05-08 15:27:19 -04002194 Value *integer = Nucleus::createSExt(cast.value, Int::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002195
Nicolas Capens157ba262019-12-10 17:49:14 -05002196 storeValue(integer);
2197}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002198
Nicolas Capens157ba262019-12-10 17:49:14 -05002199Int::Int(RValue<Short> cast)
2200{
Nicolas Capens519cf222020-05-08 15:27:19 -04002201 Value *integer = Nucleus::createSExt(cast.value, Int::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002202
Nicolas Capens157ba262019-12-10 17:49:14 -05002203 storeValue(integer);
2204}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002205
Nicolas Capens157ba262019-12-10 17:49:14 -05002206Int::Int(RValue<UShort> cast)
2207{
Nicolas Capens519cf222020-05-08 15:27:19 -04002208 Value *integer = Nucleus::createZExt(cast.value, Int::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002209
Nicolas Capens157ba262019-12-10 17:49:14 -05002210 storeValue(integer);
2211}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002212
Nicolas Capens157ba262019-12-10 17:49:14 -05002213Int::Int(RValue<Int2> cast)
2214{
2215 *this = Extract(cast, 0);
2216}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002217
Nicolas Capens157ba262019-12-10 17:49:14 -05002218Int::Int(RValue<Long> cast)
2219{
Nicolas Capens519cf222020-05-08 15:27:19 -04002220 Value *integer = Nucleus::createTrunc(cast.value, Int::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002221
Nicolas Capens157ba262019-12-10 17:49:14 -05002222 storeValue(integer);
2223}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002224
Nicolas Capens157ba262019-12-10 17:49:14 -05002225Int::Int(RValue<Float> cast)
2226{
Nicolas Capens519cf222020-05-08 15:27:19 -04002227 Value *integer = Nucleus::createFPToSI(cast.value, Int::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002228
Nicolas Capens157ba262019-12-10 17:49:14 -05002229 storeValue(integer);
2230}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002231
Nicolas Capens157ba262019-12-10 17:49:14 -05002232Int::Int(int x)
2233{
2234 storeValue(Nucleus::createConstantInt(x));
2235}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002236
Nicolas Capens157ba262019-12-10 17:49:14 -05002237Int::Int(RValue<Int> rhs)
2238{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002239 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002240}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002241
Nicolas Capens157ba262019-12-10 17:49:14 -05002242Int::Int(RValue<UInt> rhs)
2243{
2244 storeValue(rhs.value);
2245}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002246
Nicolas Capens157ba262019-12-10 17:49:14 -05002247Int::Int(const Int &rhs)
2248{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002249 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05002250}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002251
Nicolas Capens157ba262019-12-10 17:49:14 -05002252Int::Int(const Reference<Int> &rhs)
2253{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002254 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05002255}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002256
Nicolas Capens157ba262019-12-10 17:49:14 -05002257Int::Int(const UInt &rhs)
2258{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002259 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05002260}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002261
Nicolas Capens157ba262019-12-10 17:49:14 -05002262Int::Int(const Reference<UInt> &rhs)
2263{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002264 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05002265}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002266
Nicolas Capens157ba262019-12-10 17:49:14 -05002267RValue<Int> Int::operator=(int rhs)
2268{
2269 return RValue<Int>(storeValue(Nucleus::createConstantInt(rhs)));
2270}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002271
Nicolas Capens157ba262019-12-10 17:49:14 -05002272RValue<Int> Int::operator=(RValue<Int> rhs)
2273{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002274 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002275}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002276
Nicolas Capens157ba262019-12-10 17:49:14 -05002277RValue<Int> Int::operator=(RValue<UInt> rhs)
2278{
2279 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002280
Nicolas Capens157ba262019-12-10 17:49:14 -05002281 return RValue<Int>(rhs);
2282}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002283
Nicolas Capens157ba262019-12-10 17:49:14 -05002284RValue<Int> Int::operator=(const Int &rhs)
2285{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002286 return RValue<Int>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002287}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002288
Nicolas Capens157ba262019-12-10 17:49:14 -05002289RValue<Int> Int::operator=(const Reference<Int> &rhs)
2290{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002291 return RValue<Int>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002292}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002293
Nicolas Capens157ba262019-12-10 17:49:14 -05002294RValue<Int> Int::operator=(const UInt &rhs)
2295{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002296 return RValue<Int>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002297}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002298
Nicolas Capens157ba262019-12-10 17:49:14 -05002299RValue<Int> Int::operator=(const Reference<UInt> &rhs)
2300{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002301 return RValue<Int>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002302}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002303
Nicolas Capens157ba262019-12-10 17:49:14 -05002304RValue<Int> operator+(RValue<Int> lhs, RValue<Int> rhs)
2305{
2306 return RValue<Int>(Nucleus::createAdd(lhs.value, rhs.value));
2307}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002308
Nicolas Capens157ba262019-12-10 17:49:14 -05002309RValue<Int> operator-(RValue<Int> lhs, RValue<Int> rhs)
2310{
2311 return RValue<Int>(Nucleus::createSub(lhs.value, rhs.value));
2312}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002313
Nicolas Capens157ba262019-12-10 17:49:14 -05002314RValue<Int> operator*(RValue<Int> lhs, RValue<Int> rhs)
2315{
2316 return RValue<Int>(Nucleus::createMul(lhs.value, rhs.value));
2317}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002318
Nicolas Capens157ba262019-12-10 17:49:14 -05002319RValue<Int> operator/(RValue<Int> lhs, RValue<Int> rhs)
2320{
2321 return RValue<Int>(Nucleus::createSDiv(lhs.value, rhs.value));
2322}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002323
Nicolas Capens157ba262019-12-10 17:49:14 -05002324RValue<Int> operator%(RValue<Int> lhs, RValue<Int> rhs)
2325{
2326 return RValue<Int>(Nucleus::createSRem(lhs.value, rhs.value));
2327}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002328
Nicolas Capens157ba262019-12-10 17:49:14 -05002329RValue<Int> operator&(RValue<Int> lhs, RValue<Int> rhs)
2330{
2331 return RValue<Int>(Nucleus::createAnd(lhs.value, rhs.value));
2332}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002333
Nicolas Capens157ba262019-12-10 17:49:14 -05002334RValue<Int> operator|(RValue<Int> lhs, RValue<Int> rhs)
2335{
2336 return RValue<Int>(Nucleus::createOr(lhs.value, rhs.value));
2337}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002338
Nicolas Capens157ba262019-12-10 17:49:14 -05002339RValue<Int> operator^(RValue<Int> lhs, RValue<Int> rhs)
2340{
2341 return RValue<Int>(Nucleus::createXor(lhs.value, rhs.value));
2342}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002343
Nicolas Capens157ba262019-12-10 17:49:14 -05002344RValue<Int> operator<<(RValue<Int> lhs, RValue<Int> rhs)
2345{
2346 return RValue<Int>(Nucleus::createShl(lhs.value, rhs.value));
2347}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002348
Nicolas Capens157ba262019-12-10 17:49:14 -05002349RValue<Int> operator>>(RValue<Int> lhs, RValue<Int> rhs)
2350{
2351 return RValue<Int>(Nucleus::createAShr(lhs.value, rhs.value));
2352}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002353
Nicolas Capens157ba262019-12-10 17:49:14 -05002354RValue<Int> operator+=(Int &lhs, RValue<Int> rhs)
2355{
2356 return lhs = lhs + rhs;
2357}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002358
Nicolas Capens157ba262019-12-10 17:49:14 -05002359RValue<Int> operator-=(Int &lhs, RValue<Int> rhs)
2360{
2361 return lhs = lhs - rhs;
2362}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002363
Nicolas Capens157ba262019-12-10 17:49:14 -05002364RValue<Int> operator*=(Int &lhs, RValue<Int> rhs)
2365{
2366 return lhs = lhs * rhs;
2367}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002368
Nicolas Capens157ba262019-12-10 17:49:14 -05002369RValue<Int> operator/=(Int &lhs, RValue<Int> rhs)
2370{
2371 return lhs = lhs / rhs;
2372}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002373
Nicolas Capens157ba262019-12-10 17:49:14 -05002374RValue<Int> operator%=(Int &lhs, RValue<Int> rhs)
2375{
2376 return lhs = lhs % rhs;
2377}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002378
Nicolas Capens157ba262019-12-10 17:49:14 -05002379RValue<Int> operator&=(Int &lhs, RValue<Int> rhs)
2380{
2381 return lhs = lhs & rhs;
2382}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002383
Nicolas Capens157ba262019-12-10 17:49:14 -05002384RValue<Int> operator|=(Int &lhs, RValue<Int> rhs)
2385{
2386 return lhs = lhs | rhs;
2387}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002388
Nicolas Capens157ba262019-12-10 17:49:14 -05002389RValue<Int> operator^=(Int &lhs, RValue<Int> rhs)
2390{
2391 return lhs = lhs ^ rhs;
2392}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002393
Nicolas Capens157ba262019-12-10 17:49:14 -05002394RValue<Int> operator<<=(Int &lhs, RValue<Int> rhs)
2395{
2396 return lhs = lhs << rhs;
2397}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002398
Nicolas Capens157ba262019-12-10 17:49:14 -05002399RValue<Int> operator>>=(Int &lhs, RValue<Int> rhs)
2400{
2401 return lhs = lhs >> rhs;
2402}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002403
Nicolas Capens157ba262019-12-10 17:49:14 -05002404RValue<Int> operator+(RValue<Int> val)
2405{
2406 return val;
2407}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002408
Nicolas Capens157ba262019-12-10 17:49:14 -05002409RValue<Int> operator-(RValue<Int> val)
2410{
2411 return RValue<Int>(Nucleus::createNeg(val.value));
2412}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002413
Nicolas Capens157ba262019-12-10 17:49:14 -05002414RValue<Int> operator~(RValue<Int> val)
2415{
2416 return RValue<Int>(Nucleus::createNot(val.value));
2417}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002418
Nicolas Capens157ba262019-12-10 17:49:14 -05002419RValue<Bool> operator<(RValue<Int> lhs, RValue<Int> rhs)
2420{
2421 return RValue<Bool>(Nucleus::createICmpSLT(lhs.value, rhs.value));
2422}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002423
Nicolas Capens157ba262019-12-10 17:49:14 -05002424RValue<Bool> operator<=(RValue<Int> lhs, RValue<Int> rhs)
2425{
2426 return RValue<Bool>(Nucleus::createICmpSLE(lhs.value, rhs.value));
2427}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002428
Nicolas Capens157ba262019-12-10 17:49:14 -05002429RValue<Bool> operator>(RValue<Int> lhs, RValue<Int> rhs)
2430{
2431 return RValue<Bool>(Nucleus::createICmpSGT(lhs.value, rhs.value));
2432}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002433
Nicolas Capens157ba262019-12-10 17:49:14 -05002434RValue<Bool> operator>=(RValue<Int> lhs, RValue<Int> rhs)
2435{
2436 return RValue<Bool>(Nucleus::createICmpSGE(lhs.value, rhs.value));
2437}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002438
Nicolas Capens157ba262019-12-10 17:49:14 -05002439RValue<Bool> operator!=(RValue<Int> lhs, RValue<Int> rhs)
2440{
2441 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
2442}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002443
Nicolas Capens157ba262019-12-10 17:49:14 -05002444RValue<Bool> operator==(RValue<Int> lhs, RValue<Int> rhs)
2445{
2446 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
2447}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002448
Nicolas Capens157ba262019-12-10 17:49:14 -05002449RValue<Int> Max(RValue<Int> x, RValue<Int> y)
2450{
2451 return IfThenElse(x > y, x, y);
2452}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002453
Nicolas Capens157ba262019-12-10 17:49:14 -05002454RValue<Int> Min(RValue<Int> x, RValue<Int> y)
2455{
2456 return IfThenElse(x < y, x, y);
2457}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002458
Nicolas Capens157ba262019-12-10 17:49:14 -05002459RValue<Int> Clamp(RValue<Int> x, RValue<Int> min, RValue<Int> max)
2460{
2461 return Min(Max(x, min), max);
2462}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002463
Nicolas Capens157ba262019-12-10 17:49:14 -05002464Long::Long(RValue<Int> cast)
2465{
Nicolas Capens519cf222020-05-08 15:27:19 -04002466 Value *integer = Nucleus::createSExt(cast.value, Long::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002467
Nicolas Capens157ba262019-12-10 17:49:14 -05002468 storeValue(integer);
2469}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002470
Nicolas Capens157ba262019-12-10 17:49:14 -05002471Long::Long(RValue<UInt> cast)
2472{
Nicolas Capens519cf222020-05-08 15:27:19 -04002473 Value *integer = Nucleus::createZExt(cast.value, Long::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002474
Nicolas Capens157ba262019-12-10 17:49:14 -05002475 storeValue(integer);
2476}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002477
Nicolas Capens157ba262019-12-10 17:49:14 -05002478Long::Long(RValue<Long> rhs)
2479{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002480 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002481}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002482
Nicolas Capens157ba262019-12-10 17:49:14 -05002483RValue<Long> Long::operator=(int64_t rhs)
2484{
2485 return RValue<Long>(storeValue(Nucleus::createConstantLong(rhs)));
2486}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002487
Nicolas Capens157ba262019-12-10 17:49:14 -05002488RValue<Long> Long::operator=(RValue<Long> rhs)
2489{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002490 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002491}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002492
Nicolas Capens157ba262019-12-10 17:49:14 -05002493RValue<Long> Long::operator=(const Long &rhs)
2494{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002495 return RValue<Long>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002496}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002497
Nicolas Capens157ba262019-12-10 17:49:14 -05002498RValue<Long> Long::operator=(const Reference<Long> &rhs)
2499{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002500 return RValue<Long>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002501}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002502
Nicolas Capens157ba262019-12-10 17:49:14 -05002503RValue<Long> operator+(RValue<Long> lhs, RValue<Long> rhs)
2504{
2505 return RValue<Long>(Nucleus::createAdd(lhs.value, rhs.value));
2506}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002507
Nicolas Capens157ba262019-12-10 17:49:14 -05002508RValue<Long> operator-(RValue<Long> lhs, RValue<Long> rhs)
2509{
2510 return RValue<Long>(Nucleus::createSub(lhs.value, rhs.value));
2511}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002512
Nicolas Capens157ba262019-12-10 17:49:14 -05002513RValue<Long> operator*(RValue<Long> lhs, RValue<Long> rhs)
2514{
2515 return RValue<Long>(Nucleus::createMul(lhs.value, rhs.value));
2516}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002517
Nicolas Capens157ba262019-12-10 17:49:14 -05002518RValue<Long> operator>>(RValue<Long> lhs, RValue<Long> rhs)
2519{
2520 return RValue<Long>(Nucleus::createAShr(lhs.value, rhs.value));
2521}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002522
Nicolas Capens157ba262019-12-10 17:49:14 -05002523RValue<Long> operator+=(Long &lhs, RValue<Long> rhs)
2524{
2525 return lhs = lhs + rhs;
2526}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002527
Nicolas Capens157ba262019-12-10 17:49:14 -05002528RValue<Long> operator-=(Long &lhs, RValue<Long> rhs)
2529{
2530 return lhs = lhs - rhs;
2531}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002532
Ben Clayton713b8d32019-12-17 20:37:56 +00002533RValue<Long> AddAtomic(RValue<Pointer<Long>> x, RValue<Long> y)
Nicolas Capens157ba262019-12-10 17:49:14 -05002534{
2535 return RValue<Long>(Nucleus::createAtomicAdd(x.value, y.value));
2536}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002537
Ben Clayton713b8d32019-12-17 20:37:56 +00002538RValue<UInt> AddAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
Nicolas Capens157ba262019-12-10 17:49:14 -05002539{
2540 return RValue<UInt>(Nucleus::createAtomicAdd(x.value, y.value, memoryOrder));
2541}
Chris Forbes17813932019-04-18 11:45:54 -07002542
Ben Clayton713b8d32019-12-17 20:37:56 +00002543RValue<UInt> SubAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
Nicolas Capens157ba262019-12-10 17:49:14 -05002544{
2545 return RValue<UInt>(Nucleus::createAtomicSub(x.value, y.value, memoryOrder));
2546}
Chris Forbes707ed992019-04-18 18:17:35 -07002547
Ben Clayton713b8d32019-12-17 20:37:56 +00002548RValue<UInt> AndAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
Nicolas Capens157ba262019-12-10 17:49:14 -05002549{
2550 return RValue<UInt>(Nucleus::createAtomicAnd(x.value, y.value, memoryOrder));
2551}
Chris Forbes17813932019-04-18 11:45:54 -07002552
Ben Clayton713b8d32019-12-17 20:37:56 +00002553RValue<UInt> OrAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
Nicolas Capens157ba262019-12-10 17:49:14 -05002554{
2555 return RValue<UInt>(Nucleus::createAtomicOr(x.value, y.value, memoryOrder));
2556}
Chris Forbes17813932019-04-18 11:45:54 -07002557
Ben Clayton713b8d32019-12-17 20:37:56 +00002558RValue<UInt> XorAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
Nicolas Capens157ba262019-12-10 17:49:14 -05002559{
2560 return RValue<UInt>(Nucleus::createAtomicXor(x.value, y.value, memoryOrder));
2561}
Chris Forbes17813932019-04-18 11:45:54 -07002562
Ben Clayton713b8d32019-12-17 20:37:56 +00002563RValue<UInt> ExchangeAtomic(RValue<Pointer<UInt>> x, RValue<UInt> y, std::memory_order memoryOrder)
Nicolas Capens157ba262019-12-10 17:49:14 -05002564{
2565 return RValue<UInt>(Nucleus::createAtomicExchange(x.value, y.value, memoryOrder));
2566}
Chris Forbes17813932019-04-18 11:45:54 -07002567
Ben Clayton713b8d32019-12-17 20:37:56 +00002568RValue<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 -05002569{
2570 return RValue<UInt>(Nucleus::createAtomicCompareExchange(x.value, y.value, compare.value, memoryOrderEqual, memoryOrderUnequal));
2571}
Chris Forbesa16238d2019-04-18 16:31:54 -07002572
Nicolas Capens157ba262019-12-10 17:49:14 -05002573UInt::UInt(Argument<UInt> argument)
2574{
2575 storeValue(argument.value);
2576}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002577
Nicolas Capens157ba262019-12-10 17:49:14 -05002578UInt::UInt(RValue<UShort> cast)
2579{
Nicolas Capens519cf222020-05-08 15:27:19 -04002580 Value *integer = Nucleus::createZExt(cast.value, UInt::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002581
Nicolas Capens157ba262019-12-10 17:49:14 -05002582 storeValue(integer);
2583}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002584
Nicolas Capens157ba262019-12-10 17:49:14 -05002585UInt::UInt(RValue<Long> cast)
2586{
Nicolas Capens519cf222020-05-08 15:27:19 -04002587 Value *integer = Nucleus::createTrunc(cast.value, UInt::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002588
Nicolas Capens157ba262019-12-10 17:49:14 -05002589 storeValue(integer);
2590}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002591
Nicolas Capens157ba262019-12-10 17:49:14 -05002592UInt::UInt(int x)
2593{
2594 storeValue(Nucleus::createConstantInt(x));
2595}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002596
Nicolas Capens157ba262019-12-10 17:49:14 -05002597UInt::UInt(unsigned int x)
2598{
2599 storeValue(Nucleus::createConstantInt(x));
2600}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002601
Nicolas Capens157ba262019-12-10 17:49:14 -05002602UInt::UInt(RValue<UInt> rhs)
2603{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002604 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002605}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002606
Nicolas Capens157ba262019-12-10 17:49:14 -05002607UInt::UInt(RValue<Int> rhs)
2608{
2609 storeValue(rhs.value);
2610}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002611
Nicolas Capens157ba262019-12-10 17:49:14 -05002612UInt::UInt(const UInt &rhs)
2613{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002614 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05002615}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002616
Nicolas Capens157ba262019-12-10 17:49:14 -05002617UInt::UInt(const Reference<UInt> &rhs)
2618{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002619 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05002620}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002621
Nicolas Capens157ba262019-12-10 17:49:14 -05002622UInt::UInt(const Int &rhs)
2623{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002624 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05002625}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002626
Nicolas Capens157ba262019-12-10 17:49:14 -05002627UInt::UInt(const Reference<Int> &rhs)
2628{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002629 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05002630}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002631
Nicolas Capens157ba262019-12-10 17:49:14 -05002632RValue<UInt> UInt::operator=(unsigned int rhs)
2633{
2634 return RValue<UInt>(storeValue(Nucleus::createConstantInt(rhs)));
2635}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002636
Nicolas Capens157ba262019-12-10 17:49:14 -05002637RValue<UInt> UInt::operator=(RValue<UInt> rhs)
2638{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002639 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002640}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002641
Nicolas Capens157ba262019-12-10 17:49:14 -05002642RValue<UInt> UInt::operator=(RValue<Int> rhs)
2643{
2644 storeValue(rhs.value);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002645
Nicolas Capens157ba262019-12-10 17:49:14 -05002646 return RValue<UInt>(rhs);
2647}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002648
Nicolas Capens157ba262019-12-10 17:49:14 -05002649RValue<UInt> UInt::operator=(const UInt &rhs)
2650{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002651 return RValue<UInt>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002652}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002653
Nicolas Capens157ba262019-12-10 17:49:14 -05002654RValue<UInt> UInt::operator=(const Reference<UInt> &rhs)
2655{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002656 return RValue<UInt>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002657}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002658
Nicolas Capens157ba262019-12-10 17:49:14 -05002659RValue<UInt> UInt::operator=(const Int &rhs)
2660{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002661 return RValue<UInt>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002662}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002663
Nicolas Capens157ba262019-12-10 17:49:14 -05002664RValue<UInt> UInt::operator=(const Reference<Int> &rhs)
2665{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002666 return RValue<UInt>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002667}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002668
Nicolas Capens157ba262019-12-10 17:49:14 -05002669RValue<UInt> operator+(RValue<UInt> lhs, RValue<UInt> rhs)
2670{
2671 return RValue<UInt>(Nucleus::createAdd(lhs.value, rhs.value));
2672}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002673
Nicolas Capens157ba262019-12-10 17:49:14 -05002674RValue<UInt> operator-(RValue<UInt> lhs, RValue<UInt> rhs)
2675{
2676 return RValue<UInt>(Nucleus::createSub(lhs.value, rhs.value));
2677}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002678
Nicolas Capens157ba262019-12-10 17:49:14 -05002679RValue<UInt> operator*(RValue<UInt> lhs, RValue<UInt> rhs)
2680{
2681 return RValue<UInt>(Nucleus::createMul(lhs.value, rhs.value));
2682}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002683
Nicolas Capens157ba262019-12-10 17:49:14 -05002684RValue<UInt> operator/(RValue<UInt> lhs, RValue<UInt> rhs)
2685{
2686 return RValue<UInt>(Nucleus::createUDiv(lhs.value, rhs.value));
2687}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002688
Nicolas Capens157ba262019-12-10 17:49:14 -05002689RValue<UInt> operator%(RValue<UInt> lhs, RValue<UInt> rhs)
2690{
2691 return RValue<UInt>(Nucleus::createURem(lhs.value, rhs.value));
2692}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002693
Nicolas Capens157ba262019-12-10 17:49:14 -05002694RValue<UInt> operator&(RValue<UInt> lhs, RValue<UInt> rhs)
2695{
2696 return RValue<UInt>(Nucleus::createAnd(lhs.value, rhs.value));
2697}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002698
Nicolas Capens157ba262019-12-10 17:49:14 -05002699RValue<UInt> operator|(RValue<UInt> lhs, RValue<UInt> rhs)
2700{
2701 return RValue<UInt>(Nucleus::createOr(lhs.value, rhs.value));
2702}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002703
Nicolas Capens157ba262019-12-10 17:49:14 -05002704RValue<UInt> operator^(RValue<UInt> lhs, RValue<UInt> rhs)
2705{
2706 return RValue<UInt>(Nucleus::createXor(lhs.value, rhs.value));
2707}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002708
Nicolas Capens157ba262019-12-10 17:49:14 -05002709RValue<UInt> operator<<(RValue<UInt> lhs, RValue<UInt> rhs)
2710{
2711 return RValue<UInt>(Nucleus::createShl(lhs.value, rhs.value));
2712}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002713
Nicolas Capens157ba262019-12-10 17:49:14 -05002714RValue<UInt> operator>>(RValue<UInt> lhs, RValue<UInt> rhs)
2715{
2716 return RValue<UInt>(Nucleus::createLShr(lhs.value, rhs.value));
2717}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002718
Nicolas Capens157ba262019-12-10 17:49:14 -05002719RValue<UInt> operator+=(UInt &lhs, RValue<UInt> rhs)
2720{
2721 return lhs = lhs + rhs;
2722}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002723
Nicolas Capens157ba262019-12-10 17:49:14 -05002724RValue<UInt> operator-=(UInt &lhs, RValue<UInt> rhs)
2725{
2726 return lhs = lhs - rhs;
2727}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002728
Nicolas Capens157ba262019-12-10 17:49:14 -05002729RValue<UInt> operator*=(UInt &lhs, RValue<UInt> rhs)
2730{
2731 return lhs = lhs * rhs;
2732}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002733
Nicolas Capens157ba262019-12-10 17:49:14 -05002734RValue<UInt> operator/=(UInt &lhs, RValue<UInt> rhs)
2735{
2736 return lhs = lhs / rhs;
2737}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002738
Nicolas Capens157ba262019-12-10 17:49:14 -05002739RValue<UInt> operator%=(UInt &lhs, RValue<UInt> rhs)
2740{
2741 return lhs = lhs % rhs;
2742}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002743
Nicolas Capens157ba262019-12-10 17:49:14 -05002744RValue<UInt> operator&=(UInt &lhs, RValue<UInt> rhs)
2745{
2746 return lhs = lhs & rhs;
2747}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002748
Nicolas Capens157ba262019-12-10 17:49:14 -05002749RValue<UInt> operator|=(UInt &lhs, RValue<UInt> rhs)
2750{
2751 return lhs = lhs | rhs;
2752}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002753
Nicolas Capens157ba262019-12-10 17:49:14 -05002754RValue<UInt> operator^=(UInt &lhs, RValue<UInt> rhs)
2755{
2756 return lhs = lhs ^ rhs;
2757}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002758
Nicolas Capens157ba262019-12-10 17:49:14 -05002759RValue<UInt> operator<<=(UInt &lhs, RValue<UInt> rhs)
2760{
2761 return lhs = lhs << rhs;
2762}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002763
Nicolas Capens157ba262019-12-10 17:49:14 -05002764RValue<UInt> operator>>=(UInt &lhs, RValue<UInt> rhs)
2765{
2766 return lhs = lhs >> rhs;
2767}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002768
Nicolas Capens157ba262019-12-10 17:49:14 -05002769RValue<UInt> operator+(RValue<UInt> val)
2770{
2771 return val;
2772}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002773
Nicolas Capens157ba262019-12-10 17:49:14 -05002774RValue<UInt> operator-(RValue<UInt> val)
2775{
2776 return RValue<UInt>(Nucleus::createNeg(val.value));
2777}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002778
Nicolas Capens157ba262019-12-10 17:49:14 -05002779RValue<UInt> operator~(RValue<UInt> val)
2780{
2781 return RValue<UInt>(Nucleus::createNot(val.value));
2782}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002783
Nicolas Capens157ba262019-12-10 17:49:14 -05002784RValue<UInt> Max(RValue<UInt> x, RValue<UInt> y)
2785{
2786 return IfThenElse(x > y, x, y);
2787}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002788
Nicolas Capens157ba262019-12-10 17:49:14 -05002789RValue<UInt> Min(RValue<UInt> x, RValue<UInt> y)
2790{
2791 return IfThenElse(x < y, x, y);
2792}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002793
Nicolas Capens157ba262019-12-10 17:49:14 -05002794RValue<UInt> Clamp(RValue<UInt> x, RValue<UInt> min, RValue<UInt> max)
2795{
2796 return Min(Max(x, min), max);
2797}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002798
Nicolas Capens157ba262019-12-10 17:49:14 -05002799RValue<Bool> operator<(RValue<UInt> lhs, RValue<UInt> rhs)
2800{
2801 return RValue<Bool>(Nucleus::createICmpULT(lhs.value, rhs.value));
2802}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002803
Nicolas Capens157ba262019-12-10 17:49:14 -05002804RValue<Bool> operator<=(RValue<UInt> lhs, RValue<UInt> rhs)
2805{
2806 return RValue<Bool>(Nucleus::createICmpULE(lhs.value, rhs.value));
2807}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002808
Nicolas Capens157ba262019-12-10 17:49:14 -05002809RValue<Bool> operator>(RValue<UInt> lhs, RValue<UInt> rhs)
2810{
2811 return RValue<Bool>(Nucleus::createICmpUGT(lhs.value, rhs.value));
2812}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002813
Nicolas Capens157ba262019-12-10 17:49:14 -05002814RValue<Bool> operator>=(RValue<UInt> lhs, RValue<UInt> rhs)
2815{
2816 return RValue<Bool>(Nucleus::createICmpUGE(lhs.value, rhs.value));
2817}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002818
Nicolas Capens157ba262019-12-10 17:49:14 -05002819RValue<Bool> operator!=(RValue<UInt> lhs, RValue<UInt> rhs)
2820{
2821 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
2822}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002823
Nicolas Capens157ba262019-12-10 17:49:14 -05002824RValue<Bool> operator==(RValue<UInt> lhs, RValue<UInt> rhs)
2825{
2826 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
2827}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002828
Nicolas Capens157ba262019-12-10 17:49:14 -05002829Int2::Int2(RValue<Int4> cast)
2830{
Nicolas Capens519cf222020-05-08 15:27:19 -04002831 storeValue(Nucleus::createBitCast(cast.value, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002832}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002833
Nicolas Capens157ba262019-12-10 17:49:14 -05002834Int2::Int2(int x, int y)
2835{
Ben Clayton713b8d32019-12-17 20:37:56 +00002836 int64_t constantVector[2] = { x, y };
Nicolas Capens519cf222020-05-08 15:27:19 -04002837 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002838}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002839
Nicolas Capens157ba262019-12-10 17:49:14 -05002840Int2::Int2(RValue<Int2> rhs)
2841{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002842 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002843}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002844
Nicolas Capens157ba262019-12-10 17:49:14 -05002845Int2::Int2(const Int2 &rhs)
2846{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002847 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05002848}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002849
Nicolas Capens157ba262019-12-10 17:49:14 -05002850Int2::Int2(const Reference<Int2> &rhs)
2851{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002852 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05002853}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002854
Nicolas Capens157ba262019-12-10 17:49:14 -05002855Int2::Int2(RValue<Int> lo, RValue<Int> hi)
2856{
Ben Clayton713b8d32019-12-17 20:37:56 +00002857 int shuffle[4] = { 0, 4, 1, 5 };
Nicolas Capens157ba262019-12-10 17:49:14 -05002858 Value *packed = Nucleus::createShuffleVector(Int4(lo).loadValue(), Int4(hi).loadValue(), shuffle);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002859
Nicolas Capens519cf222020-05-08 15:27:19 -04002860 storeValue(Nucleus::createBitCast(packed, Int2::type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002861}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002862
Nicolas Capens157ba262019-12-10 17:49:14 -05002863RValue<Int2> Int2::operator=(RValue<Int2> rhs)
2864{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002865 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05002866}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002867
Nicolas Capens157ba262019-12-10 17:49:14 -05002868RValue<Int2> Int2::operator=(const Int2 &rhs)
2869{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002870 return RValue<Int2>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002871}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002872
Nicolas Capens157ba262019-12-10 17:49:14 -05002873RValue<Int2> Int2::operator=(const Reference<Int2> &rhs)
2874{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04002875 return RValue<Int2>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05002876}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002877
Nicolas Capens157ba262019-12-10 17:49:14 -05002878RValue<Int2> operator+(RValue<Int2> lhs, RValue<Int2> rhs)
2879{
2880 return RValue<Int2>(Nucleus::createAdd(lhs.value, rhs.value));
2881}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002882
Nicolas Capens157ba262019-12-10 17:49:14 -05002883RValue<Int2> operator-(RValue<Int2> lhs, RValue<Int2> rhs)
2884{
2885 return RValue<Int2>(Nucleus::createSub(lhs.value, rhs.value));
2886}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002887
2888// RValue<Int2> operator*(RValue<Int2> lhs, RValue<Int2> rhs)
2889// {
2890// return RValue<Int2>(Nucleus::createMul(lhs.value, rhs.value));
2891// }
2892
2893// RValue<Int2> operator/(RValue<Int2> lhs, RValue<Int2> rhs)
2894// {
2895// return RValue<Int2>(Nucleus::createSDiv(lhs.value, rhs.value));
2896// }
2897
2898// RValue<Int2> operator%(RValue<Int2> lhs, RValue<Int2> rhs)
2899// {
2900// return RValue<Int2>(Nucleus::createSRem(lhs.value, rhs.value));
2901// }
2902
Nicolas Capens157ba262019-12-10 17:49:14 -05002903RValue<Int2> operator&(RValue<Int2> lhs, RValue<Int2> rhs)
2904{
2905 return RValue<Int2>(Nucleus::createAnd(lhs.value, rhs.value));
2906}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002907
Nicolas Capens157ba262019-12-10 17:49:14 -05002908RValue<Int2> operator|(RValue<Int2> lhs, RValue<Int2> rhs)
2909{
2910 return RValue<Int2>(Nucleus::createOr(lhs.value, rhs.value));
2911}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002912
Nicolas Capens157ba262019-12-10 17:49:14 -05002913RValue<Int2> operator^(RValue<Int2> lhs, RValue<Int2> rhs)
2914{
2915 return RValue<Int2>(Nucleus::createXor(lhs.value, rhs.value));
2916}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002917
Nicolas Capens157ba262019-12-10 17:49:14 -05002918RValue<Int2> operator+=(Int2 &lhs, RValue<Int2> rhs)
2919{
2920 return lhs = lhs + rhs;
2921}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002922
Nicolas Capens157ba262019-12-10 17:49:14 -05002923RValue<Int2> operator-=(Int2 &lhs, RValue<Int2> rhs)
2924{
2925 return lhs = lhs - rhs;
2926}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002927
2928// RValue<Int2> operator*=(Int2 &lhs, RValue<Int2> rhs)
2929// {
2930// return lhs = lhs * rhs;
2931// }
2932
2933// RValue<Int2> operator/=(Int2 &lhs, RValue<Int2> rhs)
2934// {
2935// return lhs = lhs / rhs;
2936// }
2937
2938// RValue<Int2> operator%=(Int2 &lhs, RValue<Int2> rhs)
2939// {
2940// return lhs = lhs % rhs;
2941// }
2942
Nicolas Capens157ba262019-12-10 17:49:14 -05002943RValue<Int2> operator&=(Int2 &lhs, RValue<Int2> rhs)
2944{
2945 return lhs = lhs & rhs;
2946}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002947
Nicolas Capens157ba262019-12-10 17:49:14 -05002948RValue<Int2> operator|=(Int2 &lhs, RValue<Int2> rhs)
2949{
2950 return lhs = lhs | rhs;
2951}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002952
Nicolas Capens157ba262019-12-10 17:49:14 -05002953RValue<Int2> operator^=(Int2 &lhs, RValue<Int2> rhs)
2954{
2955 return lhs = lhs ^ rhs;
2956}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002957
Nicolas Capens157ba262019-12-10 17:49:14 -05002958RValue<Int2> operator<<=(Int2 &lhs, unsigned char rhs)
2959{
2960 return lhs = lhs << rhs;
2961}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002962
Nicolas Capens157ba262019-12-10 17:49:14 -05002963RValue<Int2> operator>>=(Int2 &lhs, unsigned char rhs)
2964{
2965 return lhs = lhs >> rhs;
2966}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002967
2968// RValue<Int2> operator+(RValue<Int2> val)
2969// {
2970// return val;
2971// }
2972
2973// RValue<Int2> operator-(RValue<Int2> val)
2974// {
2975// return RValue<Int2>(Nucleus::createNeg(val.value));
2976// }
2977
Nicolas Capens157ba262019-12-10 17:49:14 -05002978RValue<Int2> operator~(RValue<Int2> val)
2979{
2980 return RValue<Int2>(Nucleus::createNot(val.value));
2981}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002982
Nicolas Capens157ba262019-12-10 17:49:14 -05002983RValue<Short4> UnpackLow(RValue<Int2> x, RValue<Int2> y)
2984{
Nicolas Capens133b87d2020-01-25 16:26:28 -05002985 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00002986 int shuffle[4] = { 0, 4, 1, 5 }; // Real type is v4i32
Nicolas Capens157ba262019-12-10 17:49:14 -05002987 return As<Short4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
2988}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002989
Nicolas Capens157ba262019-12-10 17:49:14 -05002990RValue<Short4> UnpackHigh(RValue<Int2> x, RValue<Int2> y)
2991{
Nicolas Capens133b87d2020-01-25 16:26:28 -05002992 // TODO(b/148379603): Optimize narrowing swizzle.
Ben Clayton713b8d32019-12-17 20:37:56 +00002993 int shuffle[4] = { 0, 4, 1, 5 }; // Real type is v4i32
Nicolas Capens157ba262019-12-10 17:49:14 -05002994 auto lowHigh = RValue<Int4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
2995 return As<Short4>(Swizzle(lowHigh, 0x2323));
2996}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04002997
Nicolas Capens157ba262019-12-10 17:49:14 -05002998RValue<Int> Extract(RValue<Int2> val, int i)
2999{
Nicolas Capens519cf222020-05-08 15:27:19 -04003000 return RValue<Int>(Nucleus::createExtractElement(val.value, Int::type(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05003001}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003002
Nicolas Capens157ba262019-12-10 17:49:14 -05003003RValue<Int2> Insert(RValue<Int2> val, RValue<Int> element, int i)
3004{
3005 return RValue<Int2>(Nucleus::createInsertElement(val.value, element.value, i));
3006}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003007
Nicolas Capens157ba262019-12-10 17:49:14 -05003008UInt2::UInt2(unsigned int x, unsigned int y)
3009{
Ben Clayton713b8d32019-12-17 20:37:56 +00003010 int64_t constantVector[2] = { x, y };
Nicolas Capens519cf222020-05-08 15:27:19 -04003011 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003012}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003013
Nicolas Capens157ba262019-12-10 17:49:14 -05003014UInt2::UInt2(RValue<UInt2> rhs)
3015{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003016 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05003017}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003018
Nicolas Capens157ba262019-12-10 17:49:14 -05003019UInt2::UInt2(const UInt2 &rhs)
3020{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003021 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05003022}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003023
Nicolas Capens157ba262019-12-10 17:49:14 -05003024UInt2::UInt2(const Reference<UInt2> &rhs)
3025{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003026 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05003027}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003028
Nicolas Capens157ba262019-12-10 17:49:14 -05003029RValue<UInt2> UInt2::operator=(RValue<UInt2> rhs)
3030{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003031 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05003032}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003033
Nicolas Capens157ba262019-12-10 17:49:14 -05003034RValue<UInt2> UInt2::operator=(const UInt2 &rhs)
3035{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003036 return RValue<UInt2>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003037}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003038
Nicolas Capens157ba262019-12-10 17:49:14 -05003039RValue<UInt2> UInt2::operator=(const Reference<UInt2> &rhs)
3040{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003041 return RValue<UInt2>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003042}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003043
Nicolas Capens157ba262019-12-10 17:49:14 -05003044RValue<UInt2> operator+(RValue<UInt2> lhs, RValue<UInt2> rhs)
3045{
3046 return RValue<UInt2>(Nucleus::createAdd(lhs.value, rhs.value));
3047}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003048
Nicolas Capens157ba262019-12-10 17:49:14 -05003049RValue<UInt2> operator-(RValue<UInt2> lhs, RValue<UInt2> rhs)
3050{
3051 return RValue<UInt2>(Nucleus::createSub(lhs.value, rhs.value));
3052}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003053
3054// RValue<UInt2> operator*(RValue<UInt2> lhs, RValue<UInt2> rhs)
3055// {
3056// return RValue<UInt2>(Nucleus::createMul(lhs.value, rhs.value));
3057// }
3058
3059// RValue<UInt2> operator/(RValue<UInt2> lhs, RValue<UInt2> rhs)
3060// {
3061// return RValue<UInt2>(Nucleus::createUDiv(lhs.value, rhs.value));
3062// }
3063
3064// RValue<UInt2> operator%(RValue<UInt2> lhs, RValue<UInt2> rhs)
3065// {
3066// return RValue<UInt2>(Nucleus::createURem(lhs.value, rhs.value));
3067// }
3068
Nicolas Capens157ba262019-12-10 17:49:14 -05003069RValue<UInt2> operator&(RValue<UInt2> lhs, RValue<UInt2> rhs)
3070{
3071 return RValue<UInt2>(Nucleus::createAnd(lhs.value, rhs.value));
3072}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003073
Nicolas Capens157ba262019-12-10 17:49:14 -05003074RValue<UInt2> operator|(RValue<UInt2> lhs, RValue<UInt2> rhs)
3075{
3076 return RValue<UInt2>(Nucleus::createOr(lhs.value, rhs.value));
3077}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003078
Nicolas Capens157ba262019-12-10 17:49:14 -05003079RValue<UInt2> operator^(RValue<UInt2> lhs, RValue<UInt2> rhs)
3080{
3081 return RValue<UInt2>(Nucleus::createXor(lhs.value, rhs.value));
3082}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003083
Nicolas Capens157ba262019-12-10 17:49:14 -05003084RValue<UInt2> operator+=(UInt2 &lhs, RValue<UInt2> rhs)
3085{
3086 return lhs = lhs + rhs;
3087}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003088
Nicolas Capens157ba262019-12-10 17:49:14 -05003089RValue<UInt2> operator-=(UInt2 &lhs, RValue<UInt2> rhs)
3090{
3091 return lhs = lhs - rhs;
3092}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003093
3094// RValue<UInt2> operator*=(UInt2 &lhs, RValue<UInt2> rhs)
3095// {
3096// return lhs = lhs * rhs;
3097// }
3098
3099// RValue<UInt2> operator/=(UInt2 &lhs, RValue<UInt2> rhs)
3100// {
3101// return lhs = lhs / rhs;
3102// }
3103
3104// RValue<UInt2> operator%=(UInt2 &lhs, RValue<UInt2> rhs)
3105// {
3106// return lhs = lhs % rhs;
3107// }
3108
Nicolas Capens157ba262019-12-10 17:49:14 -05003109RValue<UInt2> operator&=(UInt2 &lhs, RValue<UInt2> rhs)
3110{
3111 return lhs = lhs & rhs;
3112}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003113
Nicolas Capens157ba262019-12-10 17:49:14 -05003114RValue<UInt2> operator|=(UInt2 &lhs, RValue<UInt2> rhs)
3115{
3116 return lhs = lhs | rhs;
3117}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003118
Nicolas Capens157ba262019-12-10 17:49:14 -05003119RValue<UInt2> operator^=(UInt2 &lhs, RValue<UInt2> rhs)
3120{
3121 return lhs = lhs ^ rhs;
3122}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003123
Nicolas Capens157ba262019-12-10 17:49:14 -05003124RValue<UInt2> operator<<=(UInt2 &lhs, unsigned char rhs)
3125{
3126 return lhs = lhs << rhs;
3127}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003128
Nicolas Capens157ba262019-12-10 17:49:14 -05003129RValue<UInt2> operator>>=(UInt2 &lhs, unsigned char rhs)
3130{
3131 return lhs = lhs >> rhs;
3132}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003133
3134// RValue<UInt2> operator+(RValue<UInt2> val)
3135// {
3136// return val;
3137// }
3138
3139// RValue<UInt2> operator-(RValue<UInt2> val)
3140// {
3141// return RValue<UInt2>(Nucleus::createNeg(val.value));
3142// }
3143
Nicolas Capens157ba262019-12-10 17:49:14 -05003144RValue<UInt2> operator~(RValue<UInt2> val)
3145{
3146 return RValue<UInt2>(Nucleus::createNot(val.value));
3147}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003148
Nicolas Capens157ba262019-12-10 17:49:14 -05003149RValue<UInt> Extract(RValue<UInt2> val, int i)
3150{
Nicolas Capens519cf222020-05-08 15:27:19 -04003151 return RValue<UInt>(Nucleus::createExtractElement(val.value, UInt::type(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05003152}
Ben Clayton8ab40532019-05-10 16:23:13 +01003153
Nicolas Capens157ba262019-12-10 17:49:14 -05003154RValue<UInt2> Insert(RValue<UInt2> val, RValue<UInt> element, int i)
3155{
3156 return RValue<UInt2>(Nucleus::createInsertElement(val.value, element.value, i));
3157}
Ben Clayton8ab40532019-05-10 16:23:13 +01003158
Ben Clayton713b8d32019-12-17 20:37:56 +00003159Int4::Int4()
3160 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003161{
3162}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003163
Ben Clayton713b8d32019-12-17 20:37:56 +00003164Int4::Int4(RValue<Float4> cast)
3165 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003166{
Nicolas Capens519cf222020-05-08 15:27:19 -04003167 Value *xyzw = Nucleus::createFPToSI(cast.value, Int4::type());
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003168
Nicolas Capens157ba262019-12-10 17:49:14 -05003169 storeValue(xyzw);
3170}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003171
Ben Clayton713b8d32019-12-17 20:37:56 +00003172Int4::Int4(int xyzw)
3173 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003174{
3175 constant(xyzw, xyzw, xyzw, xyzw);
3176}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003177
Ben Clayton713b8d32019-12-17 20:37:56 +00003178Int4::Int4(int x, int yzw)
3179 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003180{
3181 constant(x, yzw, yzw, yzw);
3182}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003183
Ben Clayton713b8d32019-12-17 20:37:56 +00003184Int4::Int4(int x, int y, int zw)
3185 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003186{
3187 constant(x, y, zw, zw);
3188}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003189
Ben Clayton713b8d32019-12-17 20:37:56 +00003190Int4::Int4(int x, int y, int z, int w)
3191 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003192{
3193 constant(x, y, z, w);
3194}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003195
Nicolas Capens157ba262019-12-10 17:49:14 -05003196void Int4::constant(int x, int y, int z, int w)
3197{
Ben Clayton713b8d32019-12-17 20:37:56 +00003198 int64_t constantVector[4] = { x, y, z, w };
Nicolas Capens519cf222020-05-08 15:27:19 -04003199 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003200}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003201
Ben Clayton713b8d32019-12-17 20:37:56 +00003202Int4::Int4(RValue<Int4> rhs)
3203 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003204{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003205 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05003206}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003207
Ben Clayton713b8d32019-12-17 20:37:56 +00003208Int4::Int4(const Int4 &rhs)
3209 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003210{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003211 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05003212}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003213
Ben Clayton713b8d32019-12-17 20:37:56 +00003214Int4::Int4(const Reference<Int4> &rhs)
3215 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003216{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003217 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05003218}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003219
Ben Clayton713b8d32019-12-17 20:37:56 +00003220Int4::Int4(RValue<UInt4> rhs)
3221 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003222{
3223 storeValue(rhs.value);
3224}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003225
Ben Clayton713b8d32019-12-17 20:37:56 +00003226Int4::Int4(const UInt4 &rhs)
3227 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003228{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003229 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05003230}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003231
Ben Clayton713b8d32019-12-17 20:37:56 +00003232Int4::Int4(const Reference<UInt4> &rhs)
3233 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003234{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003235 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05003236}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003237
Ben Clayton713b8d32019-12-17 20:37:56 +00003238Int4::Int4(RValue<Int2> lo, RValue<Int2> hi)
3239 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003240{
Ben Clayton713b8d32019-12-17 20:37:56 +00003241 int shuffle[4] = { 0, 1, 4, 5 }; // Real type is v4i32
Nicolas Capens157ba262019-12-10 17:49:14 -05003242 Value *packed = Nucleus::createShuffleVector(lo.value, hi.value, shuffle);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003243
Nicolas Capens157ba262019-12-10 17:49:14 -05003244 storeValue(packed);
3245}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003246
Ben Clayton713b8d32019-12-17 20:37:56 +00003247Int4::Int4(const Int &rhs)
3248 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003249{
3250 *this = RValue<Int>(rhs.loadValue());
3251}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003252
Ben Clayton713b8d32019-12-17 20:37:56 +00003253Int4::Int4(const Reference<Int> &rhs)
3254 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003255{
3256 *this = RValue<Int>(rhs.loadValue());
3257}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003258
Nicolas Capens157ba262019-12-10 17:49:14 -05003259RValue<Int4> Int4::operator=(RValue<Int4> rhs)
3260{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003261 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05003262}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003263
Nicolas Capens157ba262019-12-10 17:49:14 -05003264RValue<Int4> Int4::operator=(const Int4 &rhs)
3265{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003266 return RValue<Int4>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003267}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003268
Nicolas Capens157ba262019-12-10 17:49:14 -05003269RValue<Int4> Int4::operator=(const Reference<Int4> &rhs)
3270{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003271 return RValue<Int4>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003272}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003273
Nicolas Capens157ba262019-12-10 17:49:14 -05003274RValue<Int4> operator+(RValue<Int4> lhs, RValue<Int4> rhs)
3275{
3276 return RValue<Int4>(Nucleus::createAdd(lhs.value, rhs.value));
3277}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003278
Nicolas Capens157ba262019-12-10 17:49:14 -05003279RValue<Int4> operator-(RValue<Int4> lhs, RValue<Int4> rhs)
3280{
3281 return RValue<Int4>(Nucleus::createSub(lhs.value, rhs.value));
3282}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003283
Nicolas Capens157ba262019-12-10 17:49:14 -05003284RValue<Int4> operator*(RValue<Int4> lhs, RValue<Int4> rhs)
3285{
3286 return RValue<Int4>(Nucleus::createMul(lhs.value, rhs.value));
3287}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003288
Nicolas Capens157ba262019-12-10 17:49:14 -05003289RValue<Int4> operator/(RValue<Int4> lhs, RValue<Int4> rhs)
3290{
3291 return RValue<Int4>(Nucleus::createSDiv(lhs.value, rhs.value));
3292}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003293
Nicolas Capens157ba262019-12-10 17:49:14 -05003294RValue<Int4> operator%(RValue<Int4> lhs, RValue<Int4> rhs)
3295{
3296 return RValue<Int4>(Nucleus::createSRem(lhs.value, rhs.value));
3297}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003298
Nicolas Capens157ba262019-12-10 17:49:14 -05003299RValue<Int4> operator&(RValue<Int4> lhs, RValue<Int4> rhs)
3300{
3301 return RValue<Int4>(Nucleus::createAnd(lhs.value, rhs.value));
3302}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003303
Nicolas Capens157ba262019-12-10 17:49:14 -05003304RValue<Int4> operator|(RValue<Int4> lhs, RValue<Int4> rhs)
3305{
3306 return RValue<Int4>(Nucleus::createOr(lhs.value, rhs.value));
3307}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003308
Nicolas Capens157ba262019-12-10 17:49:14 -05003309RValue<Int4> operator^(RValue<Int4> lhs, RValue<Int4> rhs)
3310{
3311 return RValue<Int4>(Nucleus::createXor(lhs.value, rhs.value));
3312}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003313
Nicolas Capens157ba262019-12-10 17:49:14 -05003314RValue<Int4> operator<<(RValue<Int4> lhs, RValue<Int4> rhs)
3315{
3316 return RValue<Int4>(Nucleus::createShl(lhs.value, rhs.value));
3317}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003318
Nicolas Capens157ba262019-12-10 17:49:14 -05003319RValue<Int4> operator>>(RValue<Int4> lhs, RValue<Int4> rhs)
3320{
3321 return RValue<Int4>(Nucleus::createAShr(lhs.value, rhs.value));
3322}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003323
Nicolas Capens157ba262019-12-10 17:49:14 -05003324RValue<Int4> operator+=(Int4 &lhs, RValue<Int4> rhs)
3325{
3326 return lhs = lhs + rhs;
3327}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003328
Nicolas Capens157ba262019-12-10 17:49:14 -05003329RValue<Int4> operator-=(Int4 &lhs, RValue<Int4> rhs)
3330{
3331 return lhs = lhs - rhs;
3332}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003333
Nicolas Capens157ba262019-12-10 17:49:14 -05003334RValue<Int4> operator*=(Int4 &lhs, RValue<Int4> rhs)
3335{
3336 return lhs = lhs * rhs;
3337}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003338
3339// RValue<Int4> operator/=(Int4 &lhs, RValue<Int4> rhs)
3340// {
3341// return lhs = lhs / rhs;
3342// }
3343
3344// RValue<Int4> operator%=(Int4 &lhs, RValue<Int4> rhs)
3345// {
3346// return lhs = lhs % rhs;
3347// }
3348
Nicolas Capens157ba262019-12-10 17:49:14 -05003349RValue<Int4> operator&=(Int4 &lhs, RValue<Int4> rhs)
3350{
3351 return lhs = lhs & rhs;
3352}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003353
Nicolas Capens157ba262019-12-10 17:49:14 -05003354RValue<Int4> operator|=(Int4 &lhs, RValue<Int4> rhs)
3355{
3356 return lhs = lhs | rhs;
3357}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003358
Nicolas Capens157ba262019-12-10 17:49:14 -05003359RValue<Int4> operator^=(Int4 &lhs, RValue<Int4> rhs)
3360{
3361 return lhs = lhs ^ rhs;
3362}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003363
Nicolas Capens157ba262019-12-10 17:49:14 -05003364RValue<Int4> operator<<=(Int4 &lhs, unsigned char rhs)
3365{
3366 return lhs = lhs << rhs;
3367}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003368
Nicolas Capens157ba262019-12-10 17:49:14 -05003369RValue<Int4> operator>>=(Int4 &lhs, unsigned char rhs)
3370{
3371 return lhs = lhs >> rhs;
3372}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003373
Nicolas Capens157ba262019-12-10 17:49:14 -05003374RValue<Int4> operator+(RValue<Int4> val)
3375{
3376 return val;
3377}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003378
Nicolas Capens157ba262019-12-10 17:49:14 -05003379RValue<Int4> operator-(RValue<Int4> val)
3380{
3381 return RValue<Int4>(Nucleus::createNeg(val.value));
3382}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003383
Nicolas Capens157ba262019-12-10 17:49:14 -05003384RValue<Int4> operator~(RValue<Int4> val)
3385{
3386 return RValue<Int4>(Nucleus::createNot(val.value));
3387}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003388
Nicolas Capens157ba262019-12-10 17:49:14 -05003389RValue<Int> Extract(RValue<Int4> x, int i)
3390{
Nicolas Capens519cf222020-05-08 15:27:19 -04003391 return RValue<Int>(Nucleus::createExtractElement(x.value, Int::type(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05003392}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003393
Nicolas Capens157ba262019-12-10 17:49:14 -05003394RValue<Int4> Insert(RValue<Int4> x, RValue<Int> element, int i)
3395{
3396 return RValue<Int4>(Nucleus::createInsertElement(x.value, element.value, i));
3397}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003398
Nicolas Capens157ba262019-12-10 17:49:14 -05003399RValue<Int4> Swizzle(RValue<Int4> x, uint16_t select)
3400{
3401 return RValue<Int4>(createSwizzle4(x.value, select));
3402}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003403
Nicolas Capens157ba262019-12-10 17:49:14 -05003404RValue<Int4> Shuffle(RValue<Int4> x, RValue<Int4> y, unsigned short select)
3405{
Nicolas Capensd95467e2020-01-16 01:44:39 -05003406 return RValue<Int4>(createShuffle4(x.value, y.value, select));
Nicolas Capens157ba262019-12-10 17:49:14 -05003407}
David 'Digit' Turnerb9f03f42019-12-04 19:32:34 +01003408
Ben Clayton713b8d32019-12-17 20:37:56 +00003409UInt4::UInt4()
3410 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003411{
3412}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003413
Ben Clayton713b8d32019-12-17 20:37:56 +00003414UInt4::UInt4(int xyzw)
3415 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003416{
3417 constant(xyzw, xyzw, xyzw, xyzw);
3418}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003419
Ben Clayton713b8d32019-12-17 20:37:56 +00003420UInt4::UInt4(int x, int yzw)
3421 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003422{
3423 constant(x, yzw, yzw, yzw);
3424}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003425
Ben Clayton713b8d32019-12-17 20:37:56 +00003426UInt4::UInt4(int x, int y, int zw)
3427 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003428{
3429 constant(x, y, zw, zw);
3430}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003431
Ben Clayton713b8d32019-12-17 20:37:56 +00003432UInt4::UInt4(int x, int y, int z, int w)
3433 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003434{
3435 constant(x, y, z, w);
3436}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003437
Nicolas Capens157ba262019-12-10 17:49:14 -05003438void UInt4::constant(int x, int y, int z, int w)
3439{
Ben Clayton713b8d32019-12-17 20:37:56 +00003440 int64_t constantVector[4] = { x, y, z, w };
Nicolas Capens519cf222020-05-08 15:27:19 -04003441 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003442}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003443
Ben Clayton713b8d32019-12-17 20:37:56 +00003444UInt4::UInt4(RValue<UInt4> rhs)
3445 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003446{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003447 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05003448}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003449
Ben Clayton713b8d32019-12-17 20:37:56 +00003450UInt4::UInt4(const UInt4 &rhs)
3451 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003452{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003453 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05003454}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003455
Ben Clayton713b8d32019-12-17 20:37:56 +00003456UInt4::UInt4(const Reference<UInt4> &rhs)
3457 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003458{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003459 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05003460}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003461
Ben Clayton713b8d32019-12-17 20:37:56 +00003462UInt4::UInt4(RValue<Int4> rhs)
3463 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003464{
3465 storeValue(rhs.value);
3466}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003467
Ben Clayton713b8d32019-12-17 20:37:56 +00003468UInt4::UInt4(const Int4 &rhs)
3469 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003470{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003471 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05003472}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003473
Ben Clayton713b8d32019-12-17 20:37:56 +00003474UInt4::UInt4(const Reference<Int4> &rhs)
3475 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003476{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003477 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05003478}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003479
Ben Clayton713b8d32019-12-17 20:37:56 +00003480UInt4::UInt4(RValue<UInt2> lo, RValue<UInt2> hi)
3481 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003482{
Ben Clayton713b8d32019-12-17 20:37:56 +00003483 int shuffle[4] = { 0, 1, 4, 5 }; // Real type is v4i32
Nicolas Capens157ba262019-12-10 17:49:14 -05003484 Value *packed = Nucleus::createShuffleVector(lo.value, hi.value, shuffle);
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003485
Nicolas Capens157ba262019-12-10 17:49:14 -05003486 storeValue(packed);
3487}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003488
Ben Clayton713b8d32019-12-17 20:37:56 +00003489UInt4::UInt4(const UInt &rhs)
3490 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003491{
3492 *this = RValue<UInt>(rhs.loadValue());
3493}
Ben Clayton88816fa2019-05-15 17:08:14 +01003494
Ben Clayton713b8d32019-12-17 20:37:56 +00003495UInt4::UInt4(const Reference<UInt> &rhs)
3496 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003497{
3498 *this = RValue<UInt>(rhs.loadValue());
3499}
Ben Clayton88816fa2019-05-15 17:08:14 +01003500
Nicolas Capens157ba262019-12-10 17:49:14 -05003501RValue<UInt4> UInt4::operator=(RValue<UInt4> rhs)
3502{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003503 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05003504}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003505
Nicolas Capens157ba262019-12-10 17:49:14 -05003506RValue<UInt4> UInt4::operator=(const UInt4 &rhs)
3507{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003508 return RValue<UInt4>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003509}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003510
Nicolas Capens157ba262019-12-10 17:49:14 -05003511RValue<UInt4> UInt4::operator=(const Reference<UInt4> &rhs)
3512{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003513 return RValue<UInt4>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003514}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003515
Nicolas Capens157ba262019-12-10 17:49:14 -05003516RValue<UInt4> operator+(RValue<UInt4> lhs, RValue<UInt4> rhs)
3517{
3518 return RValue<UInt4>(Nucleus::createAdd(lhs.value, rhs.value));
3519}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003520
Nicolas Capens157ba262019-12-10 17:49:14 -05003521RValue<UInt4> operator-(RValue<UInt4> lhs, RValue<UInt4> rhs)
3522{
3523 return RValue<UInt4>(Nucleus::createSub(lhs.value, rhs.value));
3524}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003525
Nicolas Capens157ba262019-12-10 17:49:14 -05003526RValue<UInt4> operator*(RValue<UInt4> lhs, RValue<UInt4> rhs)
3527{
3528 return RValue<UInt4>(Nucleus::createMul(lhs.value, rhs.value));
3529}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003530
Nicolas Capens157ba262019-12-10 17:49:14 -05003531RValue<UInt4> operator/(RValue<UInt4> lhs, RValue<UInt4> rhs)
3532{
3533 return RValue<UInt4>(Nucleus::createUDiv(lhs.value, rhs.value));
3534}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003535
Nicolas Capens157ba262019-12-10 17:49:14 -05003536RValue<UInt4> operator%(RValue<UInt4> lhs, RValue<UInt4> rhs)
3537{
3538 return RValue<UInt4>(Nucleus::createURem(lhs.value, rhs.value));
3539}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003540
Nicolas Capens157ba262019-12-10 17:49:14 -05003541RValue<UInt4> operator&(RValue<UInt4> lhs, RValue<UInt4> rhs)
3542{
3543 return RValue<UInt4>(Nucleus::createAnd(lhs.value, rhs.value));
3544}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003545
Nicolas Capens157ba262019-12-10 17:49:14 -05003546RValue<UInt4> operator|(RValue<UInt4> lhs, RValue<UInt4> rhs)
3547{
3548 return RValue<UInt4>(Nucleus::createOr(lhs.value, rhs.value));
3549}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003550
Nicolas Capens157ba262019-12-10 17:49:14 -05003551RValue<UInt4> operator^(RValue<UInt4> lhs, RValue<UInt4> rhs)
3552{
3553 return RValue<UInt4>(Nucleus::createXor(lhs.value, rhs.value));
3554}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003555
Nicolas Capens157ba262019-12-10 17:49:14 -05003556RValue<UInt4> operator<<(RValue<UInt4> lhs, RValue<UInt4> rhs)
3557{
3558 return RValue<UInt4>(Nucleus::createShl(lhs.value, rhs.value));
3559}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003560
Nicolas Capens157ba262019-12-10 17:49:14 -05003561RValue<UInt4> operator>>(RValue<UInt4> lhs, RValue<UInt4> rhs)
3562{
3563 return RValue<UInt4>(Nucleus::createLShr(lhs.value, rhs.value));
3564}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003565
Nicolas Capens157ba262019-12-10 17:49:14 -05003566RValue<UInt4> operator+=(UInt4 &lhs, RValue<UInt4> rhs)
3567{
3568 return lhs = lhs + rhs;
3569}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003570
Nicolas Capens157ba262019-12-10 17:49:14 -05003571RValue<UInt4> operator-=(UInt4 &lhs, RValue<UInt4> rhs)
3572{
3573 return lhs = lhs - rhs;
3574}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003575
Nicolas Capens157ba262019-12-10 17:49:14 -05003576RValue<UInt4> operator*=(UInt4 &lhs, RValue<UInt4> rhs)
3577{
3578 return lhs = lhs * rhs;
3579}
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003580
3581// RValue<UInt4> operator/=(UInt4 &lhs, RValue<UInt4> rhs)
3582// {
3583// return lhs = lhs / rhs;
3584// }
3585
3586// RValue<UInt4> operator%=(UInt4 &lhs, RValue<UInt4> rhs)
3587// {
3588// return lhs = lhs % rhs;
3589// }
3590
Nicolas Capens157ba262019-12-10 17:49:14 -05003591RValue<UInt4> operator&=(UInt4 &lhs, RValue<UInt4> rhs)
3592{
3593 return lhs = lhs & rhs;
Nicolas Capensb6d4ce32019-03-12 23:00:24 -04003594}
Nicolas Capens157ba262019-12-10 17:49:14 -05003595
3596RValue<UInt4> operator|=(UInt4 &lhs, RValue<UInt4> rhs)
3597{
3598 return lhs = lhs | rhs;
3599}
3600
3601RValue<UInt4> operator^=(UInt4 &lhs, RValue<UInt4> rhs)
3602{
3603 return lhs = lhs ^ rhs;
3604}
3605
3606RValue<UInt4> operator<<=(UInt4 &lhs, unsigned char rhs)
3607{
3608 return lhs = lhs << rhs;
3609}
3610
3611RValue<UInt4> operator>>=(UInt4 &lhs, unsigned char rhs)
3612{
3613 return lhs = lhs >> rhs;
3614}
3615
3616RValue<UInt4> operator+(RValue<UInt4> val)
3617{
3618 return val;
3619}
3620
3621RValue<UInt4> operator-(RValue<UInt4> val)
3622{
3623 return RValue<UInt4>(Nucleus::createNeg(val.value));
3624}
3625
3626RValue<UInt4> operator~(RValue<UInt4> val)
3627{
3628 return RValue<UInt4>(Nucleus::createNot(val.value));
3629}
3630
3631RValue<UInt> Extract(RValue<UInt4> x, int i)
3632{
Nicolas Capens519cf222020-05-08 15:27:19 -04003633 return RValue<UInt>(Nucleus::createExtractElement(x.value, Int::type(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05003634}
3635
3636RValue<UInt4> Insert(RValue<UInt4> x, RValue<UInt> element, int i)
3637{
3638 return RValue<UInt4>(Nucleus::createInsertElement(x.value, element.value, i));
3639}
3640
3641RValue<UInt4> Swizzle(RValue<UInt4> x, uint16_t select)
3642{
3643 return RValue<UInt4>(createSwizzle4(x.value, select));
3644}
3645
3646RValue<UInt4> Shuffle(RValue<UInt4> x, RValue<UInt4> y, unsigned short select)
3647{
Nicolas Capensd95467e2020-01-16 01:44:39 -05003648 return RValue<UInt4>(createShuffle4(x.value, y.value, select));
Nicolas Capens157ba262019-12-10 17:49:14 -05003649}
3650
3651Half::Half(RValue<Float> cast)
3652{
3653 UInt fp32i = As<UInt>(cast);
3654 UInt abs = fp32i & 0x7FFFFFFF;
Ben Clayton713b8d32019-12-17 20:37:56 +00003655 UShort fp16i((fp32i & 0x80000000) >> 16); // sign
Nicolas Capens157ba262019-12-10 17:49:14 -05003656
Ben Clayton713b8d32019-12-17 20:37:56 +00003657 If(abs > 0x47FFEFFF) // Infinity
Nicolas Capens157ba262019-12-10 17:49:14 -05003658 {
3659 fp16i |= UShort(0x7FFF);
3660 }
3661 Else
3662 {
Ben Clayton713b8d32019-12-17 20:37:56 +00003663 If(abs < 0x38800000) // Denormal
Nicolas Capens157ba262019-12-10 17:49:14 -05003664 {
3665 Int mantissa = (abs & 0x007FFFFF) | 0x00800000;
3666 Int e = 113 - (abs >> 23);
Nicolas Capens60f8c2e2019-12-12 13:40:15 -05003667 abs = IfThenElse(e < 24, (mantissa >> e), Int(0));
Nicolas Capens157ba262019-12-10 17:49:14 -05003668 fp16i |= UShort((abs + 0x00000FFF + ((abs >> 13) & 1)) >> 13);
3669 }
3670 Else
3671 {
3672 fp16i |= UShort((abs + 0xC8000000 + 0x00000FFF + ((abs >> 13) & 1)) >> 13);
3673 }
3674 }
3675
3676 storeValue(fp16i.loadValue());
3677}
3678
3679Float::Float(RValue<Int> cast)
3680{
Nicolas Capens519cf222020-05-08 15:27:19 -04003681 Value *integer = Nucleus::createSIToFP(cast.value, Float::type());
Nicolas Capens157ba262019-12-10 17:49:14 -05003682
3683 storeValue(integer);
3684}
3685
3686Float::Float(RValue<UInt> cast)
3687{
3688 RValue<Float> result = Float(Int(cast & UInt(0x7FFFFFFF))) +
3689 As<Float>((As<Int>(cast) >> 31) & As<Int>(Float(0x80000000u)));
3690
3691 storeValue(result.value);
3692}
3693
3694Float::Float(RValue<Half> cast)
3695{
3696 Int fp16i(As<UShort>(cast));
3697
3698 Int s = (fp16i >> 15) & 0x00000001;
3699 Int e = (fp16i >> 10) & 0x0000001F;
3700 Int m = fp16i & 0x000003FF;
3701
3702 UInt fp32i(s << 31);
3703 If(e == 0)
3704 {
3705 If(m != 0)
3706 {
3707 While((m & 0x00000400) == 0)
3708 {
3709 m <<= 1;
3710 e -= 1;
3711 }
3712
3713 fp32i |= As<UInt>(((e + (127 - 15) + 1) << 23) | ((m & ~0x00000400) << 13));
3714 }
3715 }
3716 Else
3717 {
3718 fp32i |= As<UInt>(((e + (127 - 15)) << 23) | (m << 13));
3719 }
3720
3721 storeValue(As<Float>(fp32i).value);
3722}
3723
3724Float::Float(float x)
3725{
3726 // C++ does not have a way to write an infinite or NaN literal,
3727 // nor does it allow division by zero as a constant expression.
3728 // Thus we should not accept inf or NaN as a Reactor Float constant,
3729 // as this would typically idicate a bug, and avoids undefined
3730 // behavior.
3731 //
3732 // This also prevents the issue of the LLVM JIT only taking double
3733 // values for constructing floating-point constants. During the
3734 // conversion from single-precision to double, a signaling NaN can
3735 // become a quiet NaN, thus altering its bit pattern. Hence this
3736 // assert is also helpful for detecting cases where integers are
3737 // being reinterpreted as float and then bitcast to integer again,
3738 // which does not guarantee preserving the integer value.
3739 //
Nicolas Capense5720882020-01-13 14:10:04 -05003740 // The inifinity() method can be used to obtain positive infinity.
3741 // Should NaN constants be required, methods like quiet_NaN() and
3742 // signaling_NaN() should be added (matching std::numeric_limits).
Nicolas Capens157ba262019-12-10 17:49:14 -05003743 ASSERT(std::isfinite(x));
3744
3745 storeValue(Nucleus::createConstantFloat(x));
3746}
3747
Nicolas Capense5720882020-01-13 14:10:04 -05003748// TODO(b/140302841): Negative infinity can be obtained by using '-infinity()'.
3749// This comes at a minor run-time JIT cost, and the backend may or may not
3750// perform constant folding. This can be optimized by having Reactor perform
3751// the folding, which would still be cheaper than having a capable backend do it.
3752Float Float::infinity()
3753{
3754 Float result;
3755
3756 constexpr double inf = std::numeric_limits<double>::infinity();
3757 result.storeValue(Nucleus::createConstantFloat(inf));
3758
3759 return result;
3760}
3761
Nicolas Capens157ba262019-12-10 17:49:14 -05003762Float::Float(RValue<Float> rhs)
3763{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003764 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05003765}
3766
3767Float::Float(const Float &rhs)
3768{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003769 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05003770}
3771
3772Float::Float(const Reference<Float> &rhs)
3773{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003774 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05003775}
3776
3777Float::Float(Argument<Float> argument)
3778{
3779 storeValue(argument.value);
3780}
3781
3782RValue<Float> Float::operator=(RValue<Float> rhs)
3783{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003784 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05003785}
3786
3787RValue<Float> Float::operator=(const Float &rhs)
3788{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003789 return RValue<Float>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003790}
3791
3792RValue<Float> Float::operator=(const Reference<Float> &rhs)
3793{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003794 return RValue<Float>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003795}
3796
3797RValue<Float> operator+(RValue<Float> lhs, RValue<Float> rhs)
3798{
3799 return RValue<Float>(Nucleus::createFAdd(lhs.value, rhs.value));
3800}
3801
3802RValue<Float> operator-(RValue<Float> lhs, RValue<Float> rhs)
3803{
3804 return RValue<Float>(Nucleus::createFSub(lhs.value, rhs.value));
3805}
3806
3807RValue<Float> operator*(RValue<Float> lhs, RValue<Float> rhs)
3808{
3809 return RValue<Float>(Nucleus::createFMul(lhs.value, rhs.value));
3810}
3811
3812RValue<Float> operator/(RValue<Float> lhs, RValue<Float> rhs)
3813{
3814 return RValue<Float>(Nucleus::createFDiv(lhs.value, rhs.value));
3815}
3816
3817RValue<Float> operator+=(Float &lhs, RValue<Float> rhs)
3818{
3819 return lhs = lhs + rhs;
3820}
3821
3822RValue<Float> operator-=(Float &lhs, RValue<Float> rhs)
3823{
3824 return lhs = lhs - rhs;
3825}
3826
3827RValue<Float> operator*=(Float &lhs, RValue<Float> rhs)
3828{
3829 return lhs = lhs * rhs;
3830}
3831
3832RValue<Float> operator/=(Float &lhs, RValue<Float> rhs)
3833{
3834 return lhs = lhs / rhs;
3835}
3836
3837RValue<Float> operator+(RValue<Float> val)
3838{
3839 return val;
3840}
3841
3842RValue<Float> operator-(RValue<Float> val)
3843{
3844 return RValue<Float>(Nucleus::createFNeg(val.value));
3845}
3846
3847RValue<Bool> operator<(RValue<Float> lhs, RValue<Float> rhs)
3848{
3849 return RValue<Bool>(Nucleus::createFCmpOLT(lhs.value, rhs.value));
3850}
3851
3852RValue<Bool> operator<=(RValue<Float> lhs, RValue<Float> rhs)
3853{
3854 return RValue<Bool>(Nucleus::createFCmpOLE(lhs.value, rhs.value));
3855}
3856
3857RValue<Bool> operator>(RValue<Float> lhs, RValue<Float> rhs)
3858{
3859 return RValue<Bool>(Nucleus::createFCmpOGT(lhs.value, rhs.value));
3860}
3861
3862RValue<Bool> operator>=(RValue<Float> lhs, RValue<Float> rhs)
3863{
3864 return RValue<Bool>(Nucleus::createFCmpOGE(lhs.value, rhs.value));
3865}
3866
3867RValue<Bool> operator!=(RValue<Float> lhs, RValue<Float> rhs)
3868{
3869 return RValue<Bool>(Nucleus::createFCmpONE(lhs.value, rhs.value));
3870}
3871
3872RValue<Bool> operator==(RValue<Float> lhs, RValue<Float> rhs)
3873{
3874 return RValue<Bool>(Nucleus::createFCmpOEQ(lhs.value, rhs.value));
3875}
3876
3877RValue<Float> Abs(RValue<Float> x)
3878{
3879 return IfThenElse(x > 0.0f, x, -x);
3880}
3881
3882RValue<Float> Max(RValue<Float> x, RValue<Float> y)
3883{
3884 return IfThenElse(x > y, x, y);
3885}
3886
3887RValue<Float> Min(RValue<Float> x, RValue<Float> y)
3888{
3889 return IfThenElse(x < y, x, y);
3890}
3891
3892Float2::Float2(RValue<Float4> cast)
3893{
Nicolas Capens519cf222020-05-08 15:27:19 -04003894 storeValue(Nucleus::createBitCast(cast.value, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003895}
3896
Ben Clayton713b8d32019-12-17 20:37:56 +00003897Float4::Float4(RValue<Byte4> cast)
3898 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003899{
3900 Value *a = Int4(cast).loadValue();
Nicolas Capens519cf222020-05-08 15:27:19 -04003901 Value *xyzw = Nucleus::createSIToFP(a, Float4::type());
Nicolas Capens157ba262019-12-10 17:49:14 -05003902
3903 storeValue(xyzw);
3904}
3905
Ben Clayton713b8d32019-12-17 20:37:56 +00003906Float4::Float4(RValue<SByte4> cast)
3907 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003908{
3909 Value *a = Int4(cast).loadValue();
Nicolas Capens519cf222020-05-08 15:27:19 -04003910 Value *xyzw = Nucleus::createSIToFP(a, Float4::type());
Nicolas Capens157ba262019-12-10 17:49:14 -05003911
3912 storeValue(xyzw);
3913}
3914
Ben Clayton713b8d32019-12-17 20:37:56 +00003915Float4::Float4(RValue<Short4> cast)
3916 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003917{
3918 Int4 c(cast);
Nicolas Capens519cf222020-05-08 15:27:19 -04003919 storeValue(Nucleus::createSIToFP(RValue<Int4>(c).value, Float4::type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003920}
3921
Ben Clayton713b8d32019-12-17 20:37:56 +00003922Float4::Float4(RValue<UShort4> cast)
3923 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003924{
3925 Int4 c(cast);
Nicolas Capens519cf222020-05-08 15:27:19 -04003926 storeValue(Nucleus::createSIToFP(RValue<Int4>(c).value, Float4::type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003927}
3928
Ben Clayton713b8d32019-12-17 20:37:56 +00003929Float4::Float4(RValue<Int4> cast)
3930 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003931{
Nicolas Capens519cf222020-05-08 15:27:19 -04003932 Value *xyzw = Nucleus::createSIToFP(cast.value, Float4::type());
Nicolas Capens157ba262019-12-10 17:49:14 -05003933
3934 storeValue(xyzw);
3935}
3936
Ben Clayton713b8d32019-12-17 20:37:56 +00003937Float4::Float4(RValue<UInt4> cast)
3938 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003939{
3940 RValue<Float4> result = Float4(Int4(cast & UInt4(0x7FFFFFFF))) +
3941 As<Float4>((As<Int4>(cast) >> 31) & As<Int4>(Float4(0x80000000u)));
3942
3943 storeValue(result.value);
3944}
3945
Ben Clayton713b8d32019-12-17 20:37:56 +00003946Float4::Float4()
3947 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003948{
3949}
3950
Ben Clayton713b8d32019-12-17 20:37:56 +00003951Float4::Float4(float xyzw)
3952 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003953{
3954 constant(xyzw, xyzw, xyzw, xyzw);
3955}
3956
Ben Clayton713b8d32019-12-17 20:37:56 +00003957Float4::Float4(float x, float yzw)
3958 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003959{
3960 constant(x, yzw, yzw, yzw);
3961}
3962
Ben Clayton713b8d32019-12-17 20:37:56 +00003963Float4::Float4(float x, float y, float zw)
3964 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003965{
3966 constant(x, y, zw, zw);
3967}
3968
Ben Clayton713b8d32019-12-17 20:37:56 +00003969Float4::Float4(float x, float y, float z, float w)
3970 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003971{
3972 constant(x, y, z, w);
3973}
3974
Nicolas Capense5720882020-01-13 14:10:04 -05003975Float4 Float4::infinity()
Nicolas Capens157ba262019-12-10 17:49:14 -05003976{
3977 Float4 result;
Nicolas Capens157ba262019-12-10 17:49:14 -05003978
Nicolas Capense5720882020-01-13 14:10:04 -05003979 constexpr double inf = std::numeric_limits<double>::infinity();
Ben Clayton713b8d32019-12-17 20:37:56 +00003980 double constantVector[4] = { inf, inf, inf, inf };
Nicolas Capens519cf222020-05-08 15:27:19 -04003981 result.storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capense5720882020-01-13 14:10:04 -05003982
3983 return result;
Nicolas Capens157ba262019-12-10 17:49:14 -05003984}
3985
3986void Float4::constant(float x, float y, float z, float w)
3987{
3988 // See Float(float) constructor for the rationale behind this assert.
3989 ASSERT(std::isfinite(x) && std::isfinite(y) && std::isfinite(z) && std::isfinite(w));
3990
Ben Clayton713b8d32019-12-17 20:37:56 +00003991 double constantVector[4] = { x, y, z, w };
Nicolas Capens519cf222020-05-08 15:27:19 -04003992 storeValue(Nucleus::createConstantVector(constantVector, type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05003993}
3994
Ben Clayton713b8d32019-12-17 20:37:56 +00003995Float4::Float4(RValue<Float4> rhs)
3996 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05003997{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04003998 store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05003999}
4000
Ben Clayton713b8d32019-12-17 20:37:56 +00004001Float4::Float4(const Float4 &rhs)
4002 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004003{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04004004 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05004005}
4006
Ben Clayton713b8d32019-12-17 20:37:56 +00004007Float4::Float4(const Reference<Float4> &rhs)
4008 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004009{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04004010 storeValue(rhs.loadValue());
Nicolas Capens157ba262019-12-10 17:49:14 -05004011}
4012
Ben Clayton713b8d32019-12-17 20:37:56 +00004013Float4::Float4(const Float &rhs)
4014 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004015{
4016 *this = RValue<Float>(rhs.loadValue());
4017}
4018
Ben Clayton713b8d32019-12-17 20:37:56 +00004019Float4::Float4(const Reference<Float> &rhs)
4020 : XYZW(this)
Nicolas Capens157ba262019-12-10 17:49:14 -05004021{
4022 *this = RValue<Float>(rhs.loadValue());
4023}
4024
4025RValue<Float4> Float4::operator=(float x)
4026{
4027 return *this = Float4(x, x, x, x);
4028}
4029
4030RValue<Float4> Float4::operator=(RValue<Float4> rhs)
4031{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04004032 return store(rhs);
Nicolas Capens157ba262019-12-10 17:49:14 -05004033}
4034
4035RValue<Float4> Float4::operator=(const Float4 &rhs)
4036{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04004037 return RValue<Float4>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05004038}
4039
4040RValue<Float4> Float4::operator=(const Reference<Float4> &rhs)
4041{
Nicolas Capens5f77c5e2020-05-01 22:51:11 -04004042 return RValue<Float4>(storeValue(rhs.loadValue()));
Nicolas Capens157ba262019-12-10 17:49:14 -05004043}
4044
4045RValue<Float4> Float4::operator=(RValue<Float> rhs)
4046{
4047 return *this = Float4(rhs);
4048}
4049
4050RValue<Float4> Float4::operator=(const Float &rhs)
4051{
4052 return *this = Float4(rhs);
4053}
4054
4055RValue<Float4> Float4::operator=(const Reference<Float> &rhs)
4056{
4057 return *this = Float4(rhs);
4058}
4059
4060RValue<Float4> operator+(RValue<Float4> lhs, RValue<Float4> rhs)
4061{
4062 return RValue<Float4>(Nucleus::createFAdd(lhs.value, rhs.value));
4063}
4064
4065RValue<Float4> operator-(RValue<Float4> lhs, RValue<Float4> rhs)
4066{
4067 return RValue<Float4>(Nucleus::createFSub(lhs.value, rhs.value));
4068}
4069
4070RValue<Float4> operator*(RValue<Float4> lhs, RValue<Float4> rhs)
4071{
4072 return RValue<Float4>(Nucleus::createFMul(lhs.value, rhs.value));
4073}
4074
4075RValue<Float4> operator/(RValue<Float4> lhs, RValue<Float4> rhs)
4076{
4077 return RValue<Float4>(Nucleus::createFDiv(lhs.value, rhs.value));
4078}
4079
Nicolas Capens157ba262019-12-10 17:49:14 -05004080RValue<Float4> operator+=(Float4 &lhs, RValue<Float4> rhs)
4081{
4082 return lhs = lhs + rhs;
4083}
4084
4085RValue<Float4> operator-=(Float4 &lhs, RValue<Float4> rhs)
4086{
4087 return lhs = lhs - rhs;
4088}
4089
4090RValue<Float4> operator*=(Float4 &lhs, RValue<Float4> rhs)
4091{
4092 return lhs = lhs * rhs;
4093}
4094
4095RValue<Float4> operator/=(Float4 &lhs, RValue<Float4> rhs)
4096{
4097 return lhs = lhs / rhs;
4098}
4099
4100RValue<Float4> operator%=(Float4 &lhs, RValue<Float4> rhs)
4101{
4102 return lhs = lhs % rhs;
4103}
4104
4105RValue<Float4> operator+(RValue<Float4> val)
4106{
4107 return val;
4108}
4109
4110RValue<Float4> operator-(RValue<Float4> val)
4111{
4112 return RValue<Float4>(Nucleus::createFNeg(val.value));
4113}
4114
4115RValue<Float4> Abs(RValue<Float4> x)
4116{
4117 // TODO: Optimize.
Nicolas Capens519cf222020-05-08 15:27:19 -04004118 Value *vector = Nucleus::createBitCast(x.value, Int4::type());
Ben Clayton713b8d32019-12-17 20:37:56 +00004119 int64_t constantVector[4] = { 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF };
Nicolas Capens519cf222020-05-08 15:27:19 -04004120 Value *result = Nucleus::createAnd(vector, Nucleus::createConstantVector(constantVector, Int4::type()));
Nicolas Capens157ba262019-12-10 17:49:14 -05004121
4122 return As<Float4>(result);
4123}
4124
4125RValue<Float4> Insert(RValue<Float4> x, RValue<Float> element, int i)
4126{
4127 return RValue<Float4>(Nucleus::createInsertElement(x.value, element.value, i));
4128}
4129
4130RValue<Float> Extract(RValue<Float4> x, int i)
4131{
Nicolas Capens519cf222020-05-08 15:27:19 -04004132 return RValue<Float>(Nucleus::createExtractElement(x.value, Float::type(), i));
Nicolas Capens157ba262019-12-10 17:49:14 -05004133}
4134
4135RValue<Float4> Swizzle(RValue<Float4> x, uint16_t select)
4136{
4137 return RValue<Float4>(createSwizzle4(x.value, select));
4138}
4139
4140RValue<Float4> Shuffle(RValue<Float4> x, RValue<Float4> y, uint16_t select)
4141{
Nicolas Capensd95467e2020-01-16 01:44:39 -05004142 return RValue<Float4>(createShuffle4(x.value, y.value, select));
Nicolas Capens157ba262019-12-10 17:49:14 -05004143}
4144
4145RValue<Float4> ShuffleLowHigh(RValue<Float4> x, RValue<Float4> y, uint16_t imm)
4146{
Ben Clayton713b8d32019-12-17 20:37:56 +00004147 int shuffle[4] = {
Nicolas Capens157ba262019-12-10 17:49:14 -05004148 ((imm >> 12) & 0x03) + 0,
Ben Clayton713b8d32019-12-17 20:37:56 +00004149 ((imm >> 8) & 0x03) + 0,
4150 ((imm >> 4) & 0x03) + 4,
4151 ((imm >> 0) & 0x03) + 4,
Nicolas Capens157ba262019-12-10 17:49:14 -05004152 };
4153
4154 return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
4155}
4156
4157RValue<Float4> UnpackLow(RValue<Float4> x, RValue<Float4> y)
4158{
Ben Clayton713b8d32019-12-17 20:37:56 +00004159 int shuffle[4] = { 0, 4, 1, 5 };
Nicolas Capens157ba262019-12-10 17:49:14 -05004160 return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
4161}
4162
4163RValue<Float4> UnpackHigh(RValue<Float4> x, RValue<Float4> y)
4164{
Ben Clayton713b8d32019-12-17 20:37:56 +00004165 int shuffle[4] = { 2, 6, 3, 7 };
Nicolas Capens157ba262019-12-10 17:49:14 -05004166 return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
4167}
4168
4169RValue<Float4> Mask(Float4 &lhs, RValue<Float4> rhs, uint16_t select)
4170{
4171 Value *vector = lhs.loadValue();
4172 Value *result = createMask4(vector, rhs.value, select);
4173 lhs.storeValue(result);
4174
4175 return RValue<Float4>(result);
4176}
4177
4178RValue<Int4> IsInf(RValue<Float4> x)
4179{
4180 return CmpEQ(As<Int4>(x) & Int4(0x7FFFFFFF), Int4(0x7F800000));
4181}
4182
4183RValue<Int4> IsNan(RValue<Float4> x)
4184{
4185 return ~CmpEQ(x, x);
4186}
4187
4188RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, int offset)
4189{
4190 return lhs + RValue<Int>(Nucleus::createConstantInt(offset));
4191}
4192
4193RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, RValue<Int> offset)
4194{
Nicolas Capens519cf222020-05-08 15:27:19 -04004195 return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value, Byte::type(), offset.value, false));
Nicolas Capens157ba262019-12-10 17:49:14 -05004196}
4197
4198RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, RValue<UInt> offset)
4199{
Nicolas Capens519cf222020-05-08 15:27:19 -04004200 return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value, Byte::type(), offset.value, true));
Nicolas Capens157ba262019-12-10 17:49:14 -05004201}
4202
4203RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, int offset)
4204{
4205 return lhs = lhs + offset;
4206}
4207
4208RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, RValue<Int> offset)
4209{
4210 return lhs = lhs + offset;
4211}
4212
4213RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, RValue<UInt> offset)
4214{
4215 return lhs = lhs + offset;
4216}
4217
4218RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, int offset)
4219{
4220 return lhs + -offset;
4221}
4222
4223RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, RValue<Int> offset)
4224{
4225 return lhs + -offset;
4226}
4227
4228RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, RValue<UInt> offset)
4229{
4230 return lhs + -offset;
4231}
4232
4233RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, int offset)
4234{
4235 return lhs = lhs - offset;
4236}
4237
4238RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, RValue<Int> offset)
4239{
4240 return lhs = lhs - offset;
4241}
4242
4243RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, RValue<UInt> offset)
4244{
4245 return lhs = lhs - offset;
4246}
4247
4248void Return()
4249{
4250 Nucleus::createRetVoid();
4251 // Place any unreachable instructions in an unreferenced block.
4252 Nucleus::setInsertBlock(Nucleus::createBasicBlock());
4253}
4254
4255void branch(RValue<Bool> cmp, BasicBlock *bodyBB, BasicBlock *endBB)
4256{
4257 Nucleus::createCondBr(cmp.value, bodyBB, endBB);
4258 Nucleus::setInsertBlock(bodyBB);
4259}
4260
4261RValue<Float4> MaskedLoad(RValue<Pointer<Float4>> base, RValue<Int4> mask, unsigned int alignment, bool zeroMaskedLanes /* = false */)
4262{
Nicolas Capens519cf222020-05-08 15:27:19 -04004263 return RValue<Float4>(Nucleus::createMaskedLoad(base.value, Float::type(), mask.value, alignment, zeroMaskedLanes));
Nicolas Capens157ba262019-12-10 17:49:14 -05004264}
4265
4266RValue<Int4> MaskedLoad(RValue<Pointer<Int4>> base, RValue<Int4> mask, unsigned int alignment, bool zeroMaskedLanes /* = false */)
4267{
Nicolas Capens519cf222020-05-08 15:27:19 -04004268 return RValue<Int4>(Nucleus::createMaskedLoad(base.value, Int::type(), mask.value, alignment, zeroMaskedLanes));
Nicolas Capens157ba262019-12-10 17:49:14 -05004269}
4270
4271void MaskedStore(RValue<Pointer<Float4>> base, RValue<Float4> val, RValue<Int4> mask, unsigned int alignment)
4272{
4273 Nucleus::createMaskedStore(base.value, val.value, mask.value, alignment);
4274}
4275
4276void MaskedStore(RValue<Pointer<Int4>> base, RValue<Int4> val, RValue<Int4> mask, unsigned int alignment)
4277{
4278 Nucleus::createMaskedStore(base.value, val.value, mask.value, alignment);
4279}
4280
4281void Fence(std::memory_order memoryOrder)
4282{
4283 ASSERT_MSG(memoryOrder == std::memory_order_acquire ||
Ben Clayton713b8d32019-12-17 20:37:56 +00004284 memoryOrder == std::memory_order_release ||
4285 memoryOrder == std::memory_order_acq_rel ||
4286 memoryOrder == std::memory_order_seq_cst,
4287 "Unsupported memoryOrder: %d", int(memoryOrder));
Nicolas Capens157ba262019-12-10 17:49:14 -05004288 Nucleus::createFence(memoryOrder);
4289}
4290
Ben Clayton713b8d32019-12-17 20:37:56 +00004291Bool CToReactor<bool>::cast(bool v)
4292{
4293 return type(v);
4294}
4295Byte CToReactor<uint8_t>::cast(uint8_t v)
4296{
4297 return type(v);
4298}
4299SByte CToReactor<int8_t>::cast(int8_t v)
4300{
4301 return type(v);
4302}
4303Short CToReactor<int16_t>::cast(int16_t v)
4304{
4305 return type(v);
4306}
4307UShort CToReactor<uint16_t>::cast(uint16_t v)
4308{
4309 return type(v);
4310}
4311Int CToReactor<int32_t>::cast(int32_t v)
4312{
4313 return type(v);
4314}
4315UInt CToReactor<uint32_t>::cast(uint32_t v)
4316{
4317 return type(v);
4318}
4319Float CToReactor<float>::cast(float v)
4320{
4321 return type(v);
4322}
4323Float4 CToReactor<float[4]>::cast(float v[4])
4324{
4325 return type(v[0], v[1], v[2], v[3]);
4326}
Nicolas Capens157ba262019-12-10 17:49:14 -05004327
4328// TODO: Long has no constructor that takes a uint64_t
4329// Long CToReactor<uint64_t>::cast(uint64_t v) { return type(v); }
4330
Antonio Maiorano62427e02020-02-13 09:18:05 -05004331#ifdef ENABLE_RR_PRINT
4332static std::string replaceAll(std::string str, const std::string &substr, const std::string &replacement)
4333{
4334 size_t pos = 0;
4335 while((pos = str.find(substr, pos)) != std::string::npos)
4336 {
4337 str.replace(pos, substr.length(), replacement);
4338 pos += replacement.length();
4339 }
4340 return str;
4341}
4342
4343// extractAll returns a vector containing the extracted n scalar value of
4344// the vector vec.
4345// TODO: Move to Reactor.cpp (LLVMReactor can use this too)
4346static std::vector<Value *> extractAll(Value *vec, int n)
4347{
4348 Type *elemTy = Nucleus::getContainedType(Nucleus::getType(vec));
4349 std::vector<Value *> elements;
4350 elements.reserve(n);
4351 for(int i = 0; i < n; i++)
4352 {
4353 auto el = Nucleus::createExtractElement(vec, elemTy, i);
4354 elements.push_back(el);
4355 }
4356 return elements;
4357}
4358
4359// toInt returns all the integer values in vals extended to a printf-required storage value
4360static std::vector<Value *> toInt(const std::vector<Value *> &vals, bool isSigned)
4361{
Nicolas Capens519cf222020-05-08 15:27:19 -04004362 auto storageTy = Nucleus::getPrintfStorageType(Int::type());
Antonio Maiorano62427e02020-02-13 09:18:05 -05004363 std::vector<Value *> elements;
4364 elements.reserve(vals.size());
4365 for(auto v : vals)
4366 {
4367 if(isSigned)
4368 {
4369 elements.push_back(Nucleus::createSExt(v, storageTy));
4370 }
4371 else
4372 {
4373 elements.push_back(Nucleus::createZExt(v, storageTy));
4374 }
4375 }
4376 return elements;
4377}
4378
4379// toFloat returns all the float values in vals extended to extended to a printf-required storage value
4380static std::vector<Value *> toFloat(const std::vector<Value *> &vals)
4381{
Nicolas Capens519cf222020-05-08 15:27:19 -04004382 auto storageTy = Nucleus::getPrintfStorageType(Float::type());
Antonio Maiorano62427e02020-02-13 09:18:05 -05004383 std::vector<Value *> elements;
4384 elements.reserve(vals.size());
4385 for(auto v : vals)
4386 {
4387 elements.push_back(Nucleus::createFPExt(v, storageTy));
4388 }
4389 return elements;
4390}
4391
4392std::vector<Value *> PrintValue::Ty<Bool>::val(const RValue<Bool> &v)
4393{
4394 auto t = Nucleus::createConstantString("true");
4395 auto f = Nucleus::createConstantString("false");
4396 return { Nucleus::createSelect(v.value, t, f) };
4397}
4398
4399std::vector<Value *> PrintValue::Ty<Byte>::val(const RValue<Byte> &v)
4400{
4401 return toInt({ v.value }, false);
4402}
4403
4404std::vector<Value *> PrintValue::Ty<Byte4>::val(const RValue<Byte4> &v)
4405{
4406 return toInt(extractAll(v.value, 4), false);
4407}
4408
4409std::vector<Value *> PrintValue::Ty<Int>::val(const RValue<Int> &v)
4410{
4411 return toInt({ v.value }, true);
4412}
4413
4414std::vector<Value *> PrintValue::Ty<Int2>::val(const RValue<Int2> &v)
4415{
4416 return toInt(extractAll(v.value, 2), true);
4417}
4418
4419std::vector<Value *> PrintValue::Ty<Int4>::val(const RValue<Int4> &v)
4420{
4421 return toInt(extractAll(v.value, 4), true);
4422}
4423
4424std::vector<Value *> PrintValue::Ty<UInt>::val(const RValue<UInt> &v)
4425{
4426 return toInt({ v.value }, false);
4427}
4428
4429std::vector<Value *> PrintValue::Ty<UInt2>::val(const RValue<UInt2> &v)
4430{
4431 return toInt(extractAll(v.value, 2), false);
4432}
4433
4434std::vector<Value *> PrintValue::Ty<UInt4>::val(const RValue<UInt4> &v)
4435{
4436 return toInt(extractAll(v.value, 4), false);
4437}
4438
4439std::vector<Value *> PrintValue::Ty<Short>::val(const RValue<Short> &v)
4440{
4441 return toInt({ v.value }, true);
4442}
4443
4444std::vector<Value *> PrintValue::Ty<Short4>::val(const RValue<Short4> &v)
4445{
4446 return toInt(extractAll(v.value, 4), true);
4447}
4448
4449std::vector<Value *> PrintValue::Ty<UShort>::val(const RValue<UShort> &v)
4450{
4451 return toInt({ v.value }, false);
4452}
4453
4454std::vector<Value *> PrintValue::Ty<UShort4>::val(const RValue<UShort4> &v)
4455{
4456 return toInt(extractAll(v.value, 4), false);
4457}
4458
4459std::vector<Value *> PrintValue::Ty<Float>::val(const RValue<Float> &v)
4460{
4461 return toFloat({ v.value });
4462}
4463
4464std::vector<Value *> PrintValue::Ty<Float4>::val(const RValue<Float4> &v)
4465{
4466 return toFloat(extractAll(v.value, 4));
4467}
4468
4469std::vector<Value *> PrintValue::Ty<const char *>::val(const char *v)
4470{
4471 return { Nucleus::createConstantString(v) };
4472}
4473
4474void Printv(const char *function, const char *file, int line, const char *fmt, std::initializer_list<PrintValue> args)
4475{
4476 // Build the printf format message string.
4477 std::string str;
4478 if(file != nullptr) { str += (line > 0) ? "%s:%d " : "%s "; }
4479 if(function != nullptr) { str += "%s "; }
4480 str += fmt;
4481
4482 // Perform substitution on all '{n}' bracketed indices in the format
4483 // message.
4484 int i = 0;
4485 for(const PrintValue &arg : args)
4486 {
4487 str = replaceAll(str, "{" + std::to_string(i++) + "}", arg.format);
4488 }
4489
4490 std::vector<Value *> vals;
4491 vals.reserve(8);
4492
4493 // The format message is always the first argument.
4494 vals.push_back(Nucleus::createConstantString(str));
4495
4496 // Add optional file, line and function info if provided.
4497 if(file != nullptr)
4498 {
4499 vals.push_back(Nucleus::createConstantString(file));
4500 if(line > 0)
4501 {
4502 vals.push_back(Nucleus::createConstantInt(line));
4503 }
4504 }
4505 if(function != nullptr)
4506 {
4507 vals.push_back(Nucleus::createConstantString(function));
4508 }
4509
4510 // Add all format arguments.
4511 for(const PrintValue &arg : args)
4512 {
4513 for(auto val : arg.values)
4514 {
4515 vals.push_back(val);
4516 }
4517 }
4518
4519 // This call is implemented by each backend
4520 VPrintf(vals);
4521}
4522#endif // ENABLE_RR_PRINT
4523
Nicolas Capens157ba262019-12-10 17:49:14 -05004524} // namespace rr