blob: aacec938b626f3dcb7bd9b220f52ef056e9657f9 [file] [log] [blame]
Nicolas Capens598f8d82016-09-26 15:09:10 -04001// Copyright 2016 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 "Nucleus.hpp"
16
17#include "Reactor.hpp"
18#include "Routine.hpp"
19
Nicolas Capens2ae9d742016-11-24 14:43:05 -050020#include "Optimizer.hpp"
21
Nicolas Capens598f8d82016-09-26 15:09:10 -040022#include "src/IceTypes.h"
23#include "src/IceCfg.h"
24#include "src/IceELFStreamer.h"
25#include "src/IceGlobalContext.h"
26#include "src/IceCfgNode.h"
27#include "src/IceELFObjectWriter.h"
Nicolas Capens8dfd9a72016-10-13 17:44:51 -040028#include "src/IceGlobalInits.h"
Nicolas Capens598f8d82016-09-26 15:09:10 -040029
30#include "llvm/Support/FileSystem.h"
31#include "llvm/Support/raw_os_ostream.h"
32
33#define WIN32_LEAN_AND_MEAN
34#define NOMINMAX
35#include <Windows.h>
36
37#include <mutex>
38#include <limits>
39#include <iostream>
40#include <cassert>
41
42namespace
43{
44 Ice::GlobalContext *context = nullptr;
45 Ice::Cfg *function = nullptr;
46 Ice::CfgNode *basicBlock = nullptr;
47 Ice::CfgLocalAllocatorScope *allocator = nullptr;
48 sw::Routine *routine = nullptr;
49
50 std::mutex codegenMutex;
51
52 Ice::ELFFileStreamer *elfFile = nullptr;
53 Ice::Fdstream *out = nullptr;
54}
55
56namespace sw
57{
Nicolas Capens23d99a42016-09-30 14:57:16 -040058 enum EmulatedType
59 {
60 EmulatedShift = 16,
61 EmulatedV2 = 2 << EmulatedShift,
62 EmulatedV4 = 4 << EmulatedShift,
63 EmulatedV8 = 8 << EmulatedShift,
64 EmulatedBits = EmulatedV2 | EmulatedV4 | EmulatedV8,
65
66 Type_v2i32 = Ice::IceType_v4i32 | EmulatedV2,
67 Type_v4i16 = Ice::IceType_v8i16 | EmulatedV4,
68 Type_v2i16 = Ice::IceType_v8i16 | EmulatedV2,
69 Type_v8i8 = Ice::IceType_v16i8 | EmulatedV8,
70 Type_v4i8 = Ice::IceType_v16i8 | EmulatedV4,
Nicolas Capens4cfd4572016-10-20 01:00:19 -040071 Type_v2f32 = Ice::IceType_v4f32 | EmulatedV2,
Nicolas Capens23d99a42016-09-30 14:57:16 -040072 };
73
Nicolas Capens15060bb2016-12-05 22:17:19 -050074 class Value : public Ice::Operand {};
Nicolas Capensb98fe5c2016-11-09 12:24:06 -050075 class SwitchCases : public Ice::InstSwitch {};
Nicolas Capens598f8d82016-09-26 15:09:10 -040076 class BasicBlock : public Ice::CfgNode {};
77
78 Ice::Type T(Type *t)
79 {
Nicolas Capens23d99a42016-09-30 14:57:16 -040080 static_assert(Ice::IceType_NUM < EmulatedBits, "Ice::Type overlaps with our emulated types!");
81 return (Ice::Type)(reinterpret_cast<std::intptr_t>(t) & ~EmulatedBits);
Nicolas Capens598f8d82016-09-26 15:09:10 -040082 }
83
84 Type *T(Ice::Type t)
85 {
86 return reinterpret_cast<Type*>(t);
87 }
88
Nicolas Capens23d99a42016-09-30 14:57:16 -040089 Type *T(EmulatedType t)
90 {
91 return reinterpret_cast<Type*>(t);
92 }
93
Nicolas Capens15060bb2016-12-05 22:17:19 -050094 Value *V(Ice::Operand *v)
Nicolas Capens598f8d82016-09-26 15:09:10 -040095 {
96 return reinterpret_cast<Value*>(v);
97 }
98
Nicolas Capens611642a2016-09-28 16:45:04 -040099 BasicBlock *B(Ice::CfgNode *b)
100 {
101 return reinterpret_cast<BasicBlock*>(b);
102 }
103
Nicolas Capens598f8d82016-09-26 15:09:10 -0400104 Optimization optimization[10] = {InstructionCombining, Disabled};
105
Nicolas Capens66478362016-10-13 15:36:36 -0400106 using ElfHeader = std::conditional<sizeof(void*) == 8, Elf64_Ehdr, Elf32_Ehdr>::type;
107 using SectionHeader = std::conditional<sizeof(void*) == 8, Elf64_Shdr, Elf32_Shdr>::type;
108
109 inline const SectionHeader *sectionHeader(const ElfHeader *elfHeader)
110 {
111 return reinterpret_cast<const SectionHeader*>((intptr_t)elfHeader + elfHeader->e_shoff);
112 }
Nicolas Capens87852e12016-11-24 14:45:06 -0500113
Nicolas Capens66478362016-10-13 15:36:36 -0400114 inline const SectionHeader *elfSection(const ElfHeader *elfHeader, int index)
115 {
116 return &sectionHeader(elfHeader)[index];
117 }
118
119 static void *relocateSymbol(const ElfHeader *elfHeader, const Elf32_Rel &relocation, const SectionHeader &relocationTable)
120 {
121 const SectionHeader *target = elfSection(elfHeader, relocationTable.sh_info);
Nicolas Capens87852e12016-11-24 14:45:06 -0500122
Nicolas Capens66478362016-10-13 15:36:36 -0400123 intptr_t address = (intptr_t)elfHeader + target->sh_offset;
124 int32_t *patchSite = (int*)(address + relocation.r_offset);
125 uint32_t index = relocation.getSymbol();
126 int table = relocationTable.sh_link;
127 void *symbolValue = nullptr;
Nicolas Capens87852e12016-11-24 14:45:06 -0500128
Nicolas Capens66478362016-10-13 15:36:36 -0400129 if(index != SHN_UNDEF)
130 {
131 if(table == SHN_UNDEF) return nullptr;
132 const SectionHeader *symbolTable = elfSection(elfHeader, table);
Nicolas Capens87852e12016-11-24 14:45:06 -0500133
Nicolas Capens66478362016-10-13 15:36:36 -0400134 uint32_t symtab_entries = symbolTable->sh_size / symbolTable->sh_entsize;
135 if(index >= symtab_entries)
136 {
137 assert(index < symtab_entries && "Symbol Index out of range");
138 return nullptr;
139 }
Nicolas Capens87852e12016-11-24 14:45:06 -0500140
Nicolas Capens66478362016-10-13 15:36:36 -0400141 intptr_t symbolAddress = (intptr_t)elfHeader + symbolTable->sh_offset;
142 Elf32_Sym &symbol = ((Elf32_Sym*)symbolAddress)[index];
143 uint16_t section = symbol.st_shndx;
144
145 if(section != SHN_UNDEF && section < SHN_LORESERVE)
146 {
147 const SectionHeader *target = elfSection(elfHeader, symbol.st_shndx);
148 symbolValue = reinterpret_cast<void*>((intptr_t)elfHeader + symbol.st_value + target->sh_offset);
149 }
150 else
151 {
152 return nullptr;
153 }
154 }
155
156 switch(relocation.getType())
157 {
158 case R_386_NONE:
159 // No relocation
160 break;
161 case R_386_32:
162 *patchSite = (int32_t)((intptr_t)symbolValue + *patchSite);
163 break;
164 // case R_386_PC32:
165 // *patchSite = (int32_t)((intptr_t)symbolValue + *patchSite - (intptr_t)patchSite);
166 // break;
167 default:
168 assert(false && "Unsupported relocation type");
169 return nullptr;
170 }
171
172 return symbolValue;
173 }
174
175 static void *relocateSymbol(const ElfHeader *elfHeader, const Elf64_Rela &relocation, const SectionHeader &relocationTable)
176 {
177 const SectionHeader *target = elfSection(elfHeader, relocationTable.sh_info);
Nicolas Capens87852e12016-11-24 14:45:06 -0500178
Nicolas Capens66478362016-10-13 15:36:36 -0400179 intptr_t address = (intptr_t)elfHeader + target->sh_offset;
180 int32_t *patchSite = (int*)(address + relocation.r_offset);
181 uint32_t index = relocation.getSymbol();
182 int table = relocationTable.sh_link;
183 void *symbolValue = nullptr;
184
185 if(index != SHN_UNDEF)
186 {
187 if(table == SHN_UNDEF) return nullptr;
188 const SectionHeader *symbolTable = elfSection(elfHeader, table);
Nicolas Capens87852e12016-11-24 14:45:06 -0500189
Nicolas Capens66478362016-10-13 15:36:36 -0400190 uint32_t symtab_entries = symbolTable->sh_size / symbolTable->sh_entsize;
191 if(index >= symtab_entries)
192 {
193 assert(index < symtab_entries && "Symbol Index out of range");
194 return nullptr;
195 }
Nicolas Capens87852e12016-11-24 14:45:06 -0500196
Nicolas Capens66478362016-10-13 15:36:36 -0400197 intptr_t symbolAddress = (intptr_t)elfHeader + symbolTable->sh_offset;
198 Elf64_Sym &symbol = ((Elf64_Sym*)symbolAddress)[index];
199 uint16_t section = symbol.st_shndx;
200
201 if(section != SHN_UNDEF && section < SHN_LORESERVE)
202 {
203 const SectionHeader *target = elfSection(elfHeader, symbol.st_shndx);
204 symbolValue = reinterpret_cast<void*>((intptr_t)elfHeader + symbol.st_value + target->sh_offset);
205 }
206 else
207 {
208 return nullptr;
209 }
210 }
211
212 switch(relocation.getType())
213 {
214 case R_X86_64_NONE:
215 // No relocation
216 break;
Nicolas Capensb98fe5c2016-11-09 12:24:06 -0500217 case R_X86_64_64:
218 *(int64_t*)patchSite = (int64_t)((intptr_t)symbolValue + *(int64_t*)patchSite) + relocation.r_addend;
219 break;
Nicolas Capens66478362016-10-13 15:36:36 -0400220 case R_X86_64_PC32:
221 *patchSite = (int32_t)((intptr_t)symbolValue + *patchSite - (intptr_t)patchSite) + relocation.r_addend;
222 break;
Nicolas Capensb98fe5c2016-11-09 12:24:06 -0500223 case R_X86_64_32S:
224 *patchSite = (int32_t)((intptr_t)symbolValue + *patchSite) + relocation.r_addend;
225 break;
Nicolas Capens66478362016-10-13 15:36:36 -0400226 default:
227 assert(false && "Unsupported relocation type");
228 return nullptr;
229 }
230
231 return symbolValue;
232 }
233
Nicolas Capens598f8d82016-09-26 15:09:10 -0400234 void *loadImage(uint8_t *const elfImage)
235 {
Nicolas Capens598f8d82016-09-26 15:09:10 -0400236 ElfHeader *elfHeader = (ElfHeader*)elfImage;
237
238 if(!elfHeader->checkMagic())
239 {
240 return nullptr;
241 }
242
Nicolas Capens66478362016-10-13 15:36:36 -0400243 // Expect ELF bitness to match platform
Nicolas Capens65047112016-11-07 13:01:07 -0500244 assert(sizeof(void*) == 8 ? elfHeader->getFileClass() == ELFCLASS64 : elfHeader->getFileClass() == ELFCLASS32);
Nicolas Capens66478362016-10-13 15:36:36 -0400245 assert(sizeof(void*) == 8 ? elfHeader->e_machine == EM_X86_64 : elfHeader->e_machine == EM_386);
246
Nicolas Capens598f8d82016-09-26 15:09:10 -0400247 SectionHeader *sectionHeader = (SectionHeader*)(elfImage + elfHeader->e_shoff);
248 void *entry = nullptr;
249
250 for(int i = 0; i < elfHeader->e_shnum; i++)
251 {
Nicolas Capens66478362016-10-13 15:36:36 -0400252 if(sectionHeader[i].sh_type == SHT_PROGBITS)
Nicolas Capens598f8d82016-09-26 15:09:10 -0400253 {
Nicolas Capens66478362016-10-13 15:36:36 -0400254 if(sectionHeader[i].sh_flags & SHF_EXECINSTR)
255 {
256 entry = elfImage + sectionHeader[i].sh_offset;
257 }
258 }
259 else if(sectionHeader[i].sh_type == SHT_REL)
260 {
261 assert(sizeof(void*) == 4 && "UNIMPLEMENTED"); // Only expected/implemented for 32-bit code
262
263 for(int index = 0; index < sectionHeader[i].sh_size / sectionHeader[i].sh_entsize; index++)
264 {
265 const Elf32_Rel &relocation = ((const Elf32_Rel*)(elfImage + sectionHeader[i].sh_offset))[index];
266 void *symbol = relocateSymbol(elfHeader, relocation, sectionHeader[i]);
267 }
268 }
269 else if(sectionHeader[i].sh_type == SHT_RELA)
270 {
271 assert(sizeof(void*) == 8 && "UNIMPLEMENTED"); // Only expected/implemented for 64-bit code
272
273 for(int index = 0; index < sectionHeader[i].sh_size / sectionHeader[i].sh_entsize; index++)
274 {
275 const Elf64_Rela &relocation = ((const Elf64_Rela*)(elfImage + sectionHeader[i].sh_offset))[index];
276 void *symbol = relocateSymbol(elfHeader, relocation, sectionHeader[i]);
277 }
Nicolas Capens598f8d82016-09-26 15:09:10 -0400278 }
279 }
280
281 return entry;
282 }
283
284 template<typename T>
285 struct ExecutableAllocator
286 {
287 ExecutableAllocator() {};
288 template<class U> ExecutableAllocator(const ExecutableAllocator<U> &other) {};
289
290 using value_type = T;
291 using size_type = std::size_t;
292
293 T *allocate(size_type n)
294 {
295 return (T*)VirtualAlloc(NULL, sizeof(T) * n, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
296 }
297
298 void deallocate(T *p, size_type n)
299 {
300 VirtualFree(p, 0, MEM_RELEASE);
301 }
302 };
303
304 class ELFMemoryStreamer : public Ice::ELFStreamer, public Routine
305 {
306 ELFMemoryStreamer(const ELFMemoryStreamer &) = delete;
307 ELFMemoryStreamer &operator=(const ELFMemoryStreamer &) = delete;
308
309 public:
Nicolas Capens58274b52016-10-19 23:45:19 -0400310 ELFMemoryStreamer() : Routine(), entry(nullptr)
Nicolas Capens598f8d82016-09-26 15:09:10 -0400311 {
312 position = 0;
313 buffer.reserve(0x1000);
314 }
315
316 virtual ~ELFMemoryStreamer()
317 {
318 if(buffer.size() != 0)
319 {
320 DWORD exeProtection;
321 VirtualProtect(&buffer[0], buffer.size(), oldProtection, &exeProtection);
322 }
323 }
324
325 void write8(uint8_t Value) override
326 {
327 if(position == (uint64_t)buffer.size())
328 {
329 buffer.push_back(Value);
330 position++;
331 }
332 else if(position < (uint64_t)buffer.size())
333 {
334 buffer[position] = Value;
335 position++;
336 }
337 else assert(false && "UNIMPLEMENTED");
338 }
339
340 void writeBytes(llvm::StringRef Bytes) override
341 {
342 std::size_t oldSize = buffer.size();
343 buffer.resize(oldSize + Bytes.size());
344 memcpy(&buffer[oldSize], Bytes.begin(), Bytes.size());
345 position += Bytes.size();
346 }
347
348 uint64_t tell() const override { return position; }
349
350 void seek(uint64_t Off) override { position = Off; }
351
352 const void *getEntry() override
353 {
Nicolas Capens58274b52016-10-19 23:45:19 -0400354 if(!entry)
355 {
356 VirtualProtect(&buffer[0], buffer.size(), PAGE_EXECUTE_READWRITE, &oldProtection);
357 position = std::numeric_limits<std::size_t>::max(); // Can't stream more data after this
Nicolas Capens598f8d82016-09-26 15:09:10 -0400358
Nicolas Capens58274b52016-10-19 23:45:19 -0400359 entry = loadImage(&buffer[0]);
360 }
361
362 return entry;
Nicolas Capens598f8d82016-09-26 15:09:10 -0400363 }
364
365 private:
Nicolas Capens58274b52016-10-19 23:45:19 -0400366 void *entry;
Nicolas Capens598f8d82016-09-26 15:09:10 -0400367 std::vector<uint8_t, ExecutableAllocator<uint8_t>> buffer;
368 std::size_t position;
369 DWORD oldProtection;
370 };
371
372 Nucleus::Nucleus()
373 {
374 ::codegenMutex.lock(); // Reactor is currently not thread safe
375
Nicolas Capens66478362016-10-13 15:36:36 -0400376 Ice::ClFlags &Flags = Ice::ClFlags::Flags;
377 Ice::ClFlags::getParsedClFlags(Flags);
378
379 Flags.setTargetArch(sizeof(void*) == 8 ? Ice::Target_X8664 : Ice::Target_X8632);
380 Flags.setOutFileType(Ice::FT_Elf);
381 Flags.setOptLevel(Ice::Opt_2);
382 Flags.setApplicationBinaryInterface(Ice::ABI_Platform);
Nicolas Capensa8086512016-11-07 17:32:17 -0500383 Flags.setTargetInstructionSet(Ice::X86InstructionSet_SSE4_1);
Nicolas Capens65047112016-11-07 13:01:07 -0500384 Flags.setVerbose(false ? Ice::IceV_All : Ice::IceV_None);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400385
Nicolas Capens65047112016-11-07 13:01:07 -0500386 static llvm::raw_os_ostream cout(std::cout);
387 static llvm::raw_os_ostream cerr(std::cerr);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400388
389 if(false) // Write out to a file
390 {
391 std::error_code errorCode;
392 ::out = new Ice::Fdstream("out.o", errorCode, llvm::sys::fs::F_None);
393 ::elfFile = new Ice::ELFFileStreamer(*out);
Nicolas Capens65047112016-11-07 13:01:07 -0500394 ::context = new Ice::GlobalContext(&cout, &cout, &cerr, elfFile);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400395 }
396 else
397 {
398 ELFMemoryStreamer *elfMemory = new ELFMemoryStreamer();
Nicolas Capens65047112016-11-07 13:01:07 -0500399 ::context = new Ice::GlobalContext(&cout, &cout, &cerr, elfMemory);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400400 ::routine = elfMemory;
401 }
402 }
403
404 Nucleus::~Nucleus()
405 {
406 delete ::allocator;
407 delete ::function;
408 delete ::context;
409
410 delete ::elfFile;
411 delete ::out;
412
413 ::codegenMutex.unlock();
414 }
415
416 Routine *Nucleus::acquireRoutine(const wchar_t *name, bool runOptimizations)
417 {
418 if(basicBlock->getInsts().empty() || basicBlock->getInsts().back().getKind() != Ice::Inst::Ret)
419 {
420 createRetVoid();
421 }
422
423 std::wstring wideName(name);
424 std::string asciiName(wideName.begin(), wideName.end());
425 ::function->setFunctionName(Ice::GlobalString::createWithString(::context, asciiName));
426
Nicolas Capens2ae9d742016-11-24 14:43:05 -0500427 optimize();
428
Nicolas Capens598f8d82016-09-26 15:09:10 -0400429 ::function->translate();
Nicolas Capensde19f392016-10-19 10:29:49 -0400430 assert(!::function->hasError());
431
Nicolas Capens66478362016-10-13 15:36:36 -0400432 auto *globals = ::function->getGlobalInits().release();
433
434 if(globals && !globals->empty())
435 {
436 ::context->getGlobals()->merge(globals);
437 }
Nicolas Capens598f8d82016-09-26 15:09:10 -0400438
439 ::context->emitFileHeader();
440 ::function->emitIAS();
441 auto assembler = ::function->releaseAssembler();
Nicolas Capens66478362016-10-13 15:36:36 -0400442 auto objectWriter = ::context->getObjectWriter();
443 assembler->alignFunction();
444 objectWriter->writeFunctionCode(::function->getFunctionName(), false, assembler.get());
445 ::context->lowerGlobals("last");
Nicolas Capens73dd7a22016-10-20 13:20:34 -0400446 ::context->lowerConstants();
Nicolas Capensb98fe5c2016-11-09 12:24:06 -0500447 ::context->lowerJumpTables();
Nicolas Capens66478362016-10-13 15:36:36 -0400448 objectWriter->setUndefinedSyms(::context->getConstantExternSyms());
449 objectWriter->writeNonUserSections();
Nicolas Capens598f8d82016-09-26 15:09:10 -0400450
451 return ::routine;
452 }
453
454 void Nucleus::optimize()
455 {
Nicolas Capens2ae9d742016-11-24 14:43:05 -0500456 sw::optimize(::function);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400457 }
458
459 Value *Nucleus::allocateStackVariable(Type *t, int arraySize)
460 {
461 Ice::Type type = T(t);
Nicolas Capensa8f98632016-10-20 11:25:55 -0400462 int typeSize = Ice::typeWidthInBytes(type);
463 int totalSize = typeSize * (arraySize ? arraySize : 1);
Nicolas Capense12780d2016-09-27 14:18:07 -0400464
Nicolas Capensa8f98632016-10-20 11:25:55 -0400465 auto bytes = Ice::ConstantInteger32::create(::context, type, totalSize);
Nicolas Capense12780d2016-09-27 14:18:07 -0400466 auto address = ::function->makeVariable(T(getPointerType(t)));
Nicolas Capensa8f98632016-10-20 11:25:55 -0400467 auto alloca = Ice::InstAlloca::create(::function, address, bytes, typeSize);
Nicolas Capense12780d2016-09-27 14:18:07 -0400468 ::function->getEntryNode()->getInsts().push_front(alloca);
469
470 return V(address);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400471 }
472
473 BasicBlock *Nucleus::createBasicBlock()
474 {
Nicolas Capens611642a2016-09-28 16:45:04 -0400475 return B(::function->makeNode());
Nicolas Capens598f8d82016-09-26 15:09:10 -0400476 }
477
478 BasicBlock *Nucleus::getInsertBlock()
479 {
Nicolas Capens611642a2016-09-28 16:45:04 -0400480 return B(::basicBlock);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400481 }
482
483 void Nucleus::setInsertBlock(BasicBlock *basicBlock)
484 {
Nicolas Capens9ed1a182016-10-24 09:52:23 -0400485 // assert(::basicBlock->getInsts().back().getTerminatorEdges().size() >= 0 && "Previous basic block must have a terminator");
Nicolas Capens611642a2016-09-28 16:45:04 -0400486 ::basicBlock = basicBlock;
Nicolas Capens598f8d82016-09-26 15:09:10 -0400487 }
488
Nicolas Capens598f8d82016-09-26 15:09:10 -0400489 void Nucleus::createFunction(Type *ReturnType, std::vector<Type*> &Params)
490 {
491 uint32_t sequenceNumber = 0;
492 ::function = Ice::Cfg::create(::context, sequenceNumber).release();
493 ::allocator = new Ice::CfgLocalAllocatorScope(::function);
494
495 for(Type *type : Params)
496 {
497 Ice::Variable *arg = ::function->makeVariable(T(type));
498 ::function->addArg(arg);
499 }
500
501 Ice::CfgNode *node = ::function->makeNode();
502 ::function->setEntryNode(node);
503 ::basicBlock = node;
504 }
505
506 Value *Nucleus::getArgument(unsigned int index)
507 {
508 return V(::function->getArgs()[index]);
509 }
510
511 void Nucleus::createRetVoid()
512 {
Nicolas Capensfdcca2d2016-10-20 11:31:36 -0400513 Ice::InstRet *ret = Ice::InstRet::create(::function);
514 ::basicBlock->appendInst(ret);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400515 }
516
517 void Nucleus::createRet(Value *v)
518 {
Nicolas Capensfdcca2d2016-10-20 11:31:36 -0400519 Ice::InstRet *ret = Ice::InstRet::create(::function, v);
520 ::basicBlock->appendInst(ret);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400521 }
522
523 void Nucleus::createBr(BasicBlock *dest)
524 {
Nicolas Capens611642a2016-09-28 16:45:04 -0400525 auto br = Ice::InstBr::create(::function, dest);
526 ::basicBlock->appendInst(br);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400527 }
528
529 void Nucleus::createCondBr(Value *cond, BasicBlock *ifTrue, BasicBlock *ifFalse)
530 {
Nicolas Capens611642a2016-09-28 16:45:04 -0400531 auto br = Ice::InstBr::create(::function, cond, ifTrue, ifFalse);
532 ::basicBlock->appendInst(br);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400533 }
534
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400535 static Value *createArithmetic(Ice::InstArithmetic::OpKind op, Value *lhs, Value *rhs)
536 {
Nicolas Capens327f1df2016-10-21 14:26:34 -0400537 assert(lhs->getType() == rhs->getType() || (llvm::isa<Ice::Constant>(rhs) && (op == Ice::InstArithmetic::Shl || Ice::InstArithmetic::Lshr || Ice::InstArithmetic::Ashr)));
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400538
539 Ice::Variable *result = ::function->makeVariable(lhs->getType());
540 Ice::InstArithmetic *arithmetic = Ice::InstArithmetic::create(::function, op, result, lhs, rhs);
541 ::basicBlock->appendInst(arithmetic);
542
543 return V(result);
544 }
545
Nicolas Capens598f8d82016-09-26 15:09:10 -0400546 Value *Nucleus::createAdd(Value *lhs, Value *rhs)
547 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400548 return createArithmetic(Ice::InstArithmetic::Add, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400549 }
550
551 Value *Nucleus::createSub(Value *lhs, Value *rhs)
552 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400553 return createArithmetic(Ice::InstArithmetic::Sub, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400554 }
555
556 Value *Nucleus::createMul(Value *lhs, Value *rhs)
557 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400558 return createArithmetic(Ice::InstArithmetic::Mul, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400559 }
560
561 Value *Nucleus::createUDiv(Value *lhs, Value *rhs)
562 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400563 return createArithmetic(Ice::InstArithmetic::Udiv, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400564 }
565
566 Value *Nucleus::createSDiv(Value *lhs, Value *rhs)
567 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400568 return createArithmetic(Ice::InstArithmetic::Sdiv, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400569 }
570
571 Value *Nucleus::createFAdd(Value *lhs, Value *rhs)
572 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400573 return createArithmetic(Ice::InstArithmetic::Fadd, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400574 }
575
576 Value *Nucleus::createFSub(Value *lhs, Value *rhs)
577 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400578 return createArithmetic(Ice::InstArithmetic::Fsub, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400579 }
580
581 Value *Nucleus::createFMul(Value *lhs, Value *rhs)
582 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400583 return createArithmetic(Ice::InstArithmetic::Fmul, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400584 }
585
586 Value *Nucleus::createFDiv(Value *lhs, Value *rhs)
587 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400588 return createArithmetic(Ice::InstArithmetic::Fdiv, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400589 }
590
591 Value *Nucleus::createURem(Value *lhs, Value *rhs)
592 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400593 return createArithmetic(Ice::InstArithmetic::Urem, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400594 }
595
596 Value *Nucleus::createSRem(Value *lhs, Value *rhs)
597 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400598 return createArithmetic(Ice::InstArithmetic::Srem, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400599 }
600
601 Value *Nucleus::createFRem(Value *lhs, Value *rhs)
602 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400603 return createArithmetic(Ice::InstArithmetic::Frem, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400604 }
605
606 Value *Nucleus::createShl(Value *lhs, Value *rhs)
607 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400608 return createArithmetic(Ice::InstArithmetic::Shl, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400609 }
610
611 Value *Nucleus::createLShr(Value *lhs, Value *rhs)
612 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400613 return createArithmetic(Ice::InstArithmetic::Lshr, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400614 }
615
616 Value *Nucleus::createAShr(Value *lhs, Value *rhs)
617 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400618 return createArithmetic(Ice::InstArithmetic::Ashr, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400619 }
620
621 Value *Nucleus::createAnd(Value *lhs, Value *rhs)
622 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400623 return createArithmetic(Ice::InstArithmetic::And, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400624 }
625
626 Value *Nucleus::createOr(Value *lhs, Value *rhs)
627 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400628 return createArithmetic(Ice::InstArithmetic::Or, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400629 }
630
631 Value *Nucleus::createXor(Value *lhs, Value *rhs)
632 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400633 return createArithmetic(Ice::InstArithmetic::Xor, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400634 }
635
Nicolas Capens15060bb2016-12-05 22:17:19 -0500636 static Ice::Variable *createAssign(Ice::Operand *constant)
Nicolas Capensb955d5b2016-09-28 22:36:28 -0400637 {
638 Ice::Variable *value = ::function->makeVariable(constant->getType());
639 auto assign = Ice::InstAssign::create(::function, value, constant);
640 ::basicBlock->appendInst(assign);
641
Nicolas Capens15060bb2016-12-05 22:17:19 -0500642 return value;
Nicolas Capensb955d5b2016-09-28 22:36:28 -0400643 }
644
Nicolas Capens598f8d82016-09-26 15:09:10 -0400645 Value *Nucleus::createNeg(Value *v)
646 {
Nicolas Capensc5c0c332016-11-08 11:37:01 -0500647 return createSub(createNullValue(T(v->getType())), v);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400648 }
649
650 Value *Nucleus::createFNeg(Value *v)
651 {
Nicolas Capensc5c0c332016-11-08 11:37:01 -0500652 double c[4] = {-0.0, -0.0, -0.0, -0.0};
653 Value *negativeZero = Ice::isVectorType(v->getType()) ?
654 createConstantVector(c, T(v->getType())) :
Nicolas Capens15060bb2016-12-05 22:17:19 -0500655 V(::context->getConstantFloat(-0.0f));
Nicolas Capensc5c0c332016-11-08 11:37:01 -0500656
657 return createFSub(negativeZero, v);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400658 }
659
660 Value *Nucleus::createNot(Value *v)
661 {
Nicolas Capensc5c0c332016-11-08 11:37:01 -0500662 if(Ice::isScalarIntegerType(v->getType()))
663 {
Nicolas Capens15060bb2016-12-05 22:17:19 -0500664 return createXor(v, V(::context->getConstantInt(v->getType(), -1)));
Nicolas Capensc5c0c332016-11-08 11:37:01 -0500665 }
666 else // Vector
667 {
668 int64_t c[4] = {-1, -1, -1, -1};
669 return createXor(v, createConstantVector(c, T(v->getType())));
670 }
Nicolas Capens598f8d82016-09-26 15:09:10 -0400671 }
672
Nicolas Capense12780d2016-09-27 14:18:07 -0400673 Value *Nucleus::createLoad(Value *ptr, Type *type, bool isVolatile, unsigned int align)
Nicolas Capens598f8d82016-09-26 15:09:10 -0400674 {
Nicolas Capens23d99a42016-09-30 14:57:16 -0400675 int valueType = (int)reinterpret_cast<intptr_t>(type);
676 Ice::Variable *result = ::function->makeVariable(T(type));
677
678 if(valueType & EmulatedBits)
679 {
680 switch(valueType)
681 {
682 case Type_v4i8:
683 case Type_v2i16:
684 {
685 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::LoadSubVector, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
686 auto target = ::context->getConstantUndef(Ice::IceType_i32);
687 auto load = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
Nicolas Capens23d99a42016-09-30 14:57:16 -0400688 load->addArg(ptr);
Nicolas Capens87852e12016-11-24 14:45:06 -0500689 load->addArg(::context->getConstantInt32(4));
Nicolas Capens23d99a42016-09-30 14:57:16 -0400690 ::basicBlock->appendInst(load);
691 }
692 break;
693 case Type_v2i32:
694 case Type_v8i8:
695 case Type_v4i16:
Nicolas Capens4cfd4572016-10-20 01:00:19 -0400696 case Type_v2f32:
Nicolas Capens23d99a42016-09-30 14:57:16 -0400697 {
698 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::LoadSubVector, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
699 auto target = ::context->getConstantUndef(Ice::IceType_i32);
700 auto load = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
Nicolas Capens23d99a42016-09-30 14:57:16 -0400701 load->addArg(ptr);
Nicolas Capens87852e12016-11-24 14:45:06 -0500702 load->addArg(::context->getConstantInt32(8));
Nicolas Capens23d99a42016-09-30 14:57:16 -0400703 ::basicBlock->appendInst(load);
704 }
705 break;
706 default: assert(false && "UNIMPLEMENTED");
707 }
708 }
709 else
710 {
711 auto load = Ice::InstLoad::create(::function, result, ptr, align);
712 ::basicBlock->appendInst(load);
713 }
714
715 return V(result);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400716 }
717
Nicolas Capens6d738712016-09-30 04:15:22 -0400718 Value *Nucleus::createStore(Value *value, Value *ptr, Type *type, bool isVolatile, unsigned int align)
Nicolas Capens598f8d82016-09-26 15:09:10 -0400719 {
Nicolas Capens23d99a42016-09-30 14:57:16 -0400720 int valueType = (int)reinterpret_cast<intptr_t>(type);
721
722 if(valueType & EmulatedBits)
723 {
724 switch(valueType)
725 {
726 case Type_v4i8:
727 case Type_v2i16:
728 {
729 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::StoreSubVector, Ice::Intrinsics::SideEffects_T, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_T};
730 auto target = ::context->getConstantUndef(Ice::IceType_i32);
731 auto store = Ice::InstIntrinsicCall::create(::function, 3, nullptr, target, intrinsic);
Nicolas Capens23d99a42016-09-30 14:57:16 -0400732 store->addArg(value);
733 store->addArg(ptr);
Nicolas Capens87852e12016-11-24 14:45:06 -0500734 store->addArg(::context->getConstantInt32(4));
Nicolas Capens23d99a42016-09-30 14:57:16 -0400735 ::basicBlock->appendInst(store);
736 }
737 break;
738 case Type_v2i32:
739 case Type_v8i8:
740 case Type_v4i16:
Nicolas Capens4cfd4572016-10-20 01:00:19 -0400741 case Type_v2f32:
Nicolas Capens23d99a42016-09-30 14:57:16 -0400742 {
743 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::StoreSubVector, Ice::Intrinsics::SideEffects_T, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_T};
744 auto target = ::context->getConstantUndef(Ice::IceType_i32);
745 auto store = Ice::InstIntrinsicCall::create(::function, 3, nullptr, target, intrinsic);
Nicolas Capens23d99a42016-09-30 14:57:16 -0400746 store->addArg(value);
747 store->addArg(ptr);
Nicolas Capens87852e12016-11-24 14:45:06 -0500748 store->addArg(::context->getConstantInt32(8));
Nicolas Capens23d99a42016-09-30 14:57:16 -0400749 ::basicBlock->appendInst(store);
750 }
751 break;
752 default: assert(false && "UNIMPLEMENTED");
753 }
754 }
755 else
756 {
757 assert(T(value->getType()) == type);
758
759 auto store = Ice::InstStore::create(::function, value, ptr, align);
760 ::basicBlock->appendInst(store);
761 }
762
Nicolas Capens598f8d82016-09-26 15:09:10 -0400763 return value;
764 }
765
Nicolas Capens6d738712016-09-30 04:15:22 -0400766 Value *Nucleus::createGEP(Value *ptr, Type *type, Value *index)
Nicolas Capens598f8d82016-09-26 15:09:10 -0400767 {
Nicolas Capens8820f642016-09-30 04:42:43 -0400768 assert(index->getType() == Ice::IceType_i32);
769
Nicolas Capens15060bb2016-12-05 22:17:19 -0500770 if(auto *constant = llvm::dyn_cast<Ice::ConstantInteger32>(index))
771 {
772 int32_t offset = constant->getValue() * (int)Ice::typeWidthInBytes(T(type));
773
774 if(offset == 0)
775 {
776 return ptr;
777 }
778
779 return createAdd(ptr, createConstantInt(offset));
780 }
781
Nicolas Capens8820f642016-09-30 04:42:43 -0400782 if(!Ice::isByteSizedType(T(type)))
783 {
Nicolas Capens13ac2322016-10-13 14:52:12 -0400784 index = createMul(index, createConstantInt((int)Ice::typeWidthInBytes(T(type))));
Nicolas Capens8820f642016-09-30 04:42:43 -0400785 }
786
787 if(sizeof(void*) == 8)
788 {
789 index = createSExt(index, T(Ice::IceType_i64));
790 }
791
792 return createAdd(ptr, index);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400793 }
794
795 Value *Nucleus::createAtomicAdd(Value *ptr, Value *value)
796 {
797 assert(false && "UNIMPLEMENTED"); return nullptr;
798 }
799
Nicolas Capensa0c2fc52016-09-30 05:04:21 -0400800 static Value *createCast(Ice::InstCast::OpKind op, Value *v, Type *destType)
801 {
Nicolas Capens23d99a42016-09-30 14:57:16 -0400802 if(v->getType() == T(destType))
Nicolas Capensa0c2fc52016-09-30 05:04:21 -0400803 {
804 return v;
805 }
806
807 Ice::Variable *result = ::function->makeVariable(T(destType));
808 Ice::InstCast *cast = Ice::InstCast::create(::function, op, result, v);
809 ::basicBlock->appendInst(cast);
810
811 return V(result);
812 }
813
Nicolas Capens598f8d82016-09-26 15:09:10 -0400814 Value *Nucleus::createTrunc(Value *v, Type *destType)
815 {
Nicolas Capensa0c2fc52016-09-30 05:04:21 -0400816 return createCast(Ice::InstCast::Trunc, v, destType);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400817 }
818
819 Value *Nucleus::createZExt(Value *v, Type *destType)
820 {
Nicolas Capensa0c2fc52016-09-30 05:04:21 -0400821 return createCast(Ice::InstCast::Zext, v, destType);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400822 }
823
824 Value *Nucleus::createSExt(Value *v, Type *destType)
825 {
Nicolas Capensa0c2fc52016-09-30 05:04:21 -0400826 return createCast(Ice::InstCast::Sext, v, destType);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400827 }
828
829 Value *Nucleus::createFPToSI(Value *v, Type *destType)
830 {
Nicolas Capensa0c2fc52016-09-30 05:04:21 -0400831 return createCast(Ice::InstCast::Fptosi, v, destType);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400832 }
833
834 Value *Nucleus::createUIToFP(Value *v, Type *destType)
835 {
Nicolas Capensa0c2fc52016-09-30 05:04:21 -0400836 return createCast(Ice::InstCast::Uitofp, v, destType);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400837 }
838
839 Value *Nucleus::createSIToFP(Value *v, Type *destType)
840 {
Nicolas Capensa0c2fc52016-09-30 05:04:21 -0400841 return createCast(Ice::InstCast::Sitofp, v, destType);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400842 }
843
844 Value *Nucleus::createFPTrunc(Value *v, Type *destType)
845 {
Nicolas Capensa0c2fc52016-09-30 05:04:21 -0400846 return createCast(Ice::InstCast::Fptrunc, v, destType);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400847 }
848
849 Value *Nucleus::createFPExt(Value *v, Type *destType)
850 {
Nicolas Capensa0c2fc52016-09-30 05:04:21 -0400851 return createCast(Ice::InstCast::Fpext, v, destType);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400852 }
853
854 Value *Nucleus::createBitCast(Value *v, Type *destType)
855 {
Nicolas Capensa0c2fc52016-09-30 05:04:21 -0400856 return createCast(Ice::InstCast::Bitcast, v, destType);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400857 }
858
Nicolas Capens43dc6292016-10-20 00:01:38 -0400859 static Value *createIntCompare(Ice::InstIcmp::ICond condition, Value *lhs, Value *rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -0400860 {
Nicolas Capens611642a2016-09-28 16:45:04 -0400861 assert(lhs->getType() == rhs->getType());
862
Nicolas Capens43dc6292016-10-20 00:01:38 -0400863 auto result = ::function->makeVariable(Ice::isScalarIntegerType(lhs->getType()) ? Ice::IceType_i1 : lhs->getType());
864 auto cmp = Ice::InstIcmp::create(::function, condition, result, lhs, rhs);
Nicolas Capens611642a2016-09-28 16:45:04 -0400865 ::basicBlock->appendInst(cmp);
866
867 return V(result);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400868 }
869
Nicolas Capens43dc6292016-10-20 00:01:38 -0400870 Value *Nucleus::createICmpEQ(Value *lhs, Value *rhs)
871 {
872 return createIntCompare(Ice::InstIcmp::Eq, lhs, rhs);
873 }
874
875 Value *Nucleus::createICmpNE(Value *lhs, Value *rhs)
876 {
877 return createIntCompare(Ice::InstIcmp::Ne, lhs, rhs);
878 }
879
880 Value *Nucleus::createICmpUGT(Value *lhs, Value *rhs)
881 {
882 return createIntCompare(Ice::InstIcmp::Ugt, lhs, rhs);
883 }
884
885 Value *Nucleus::createICmpUGE(Value *lhs, Value *rhs)
886 {
887 return createIntCompare(Ice::InstIcmp::Uge, lhs, rhs);
888 }
889
890 Value *Nucleus::createICmpULT(Value *lhs, Value *rhs)
891 {
892 return createIntCompare(Ice::InstIcmp::Ult, lhs, rhs);
893 }
894
895 Value *Nucleus::createICmpULE(Value *lhs, Value *rhs)
896 {
897 return createIntCompare(Ice::InstIcmp::Ule, lhs, rhs);
898 }
899
900 Value *Nucleus::createICmpSGT(Value *lhs, Value *rhs)
901 {
902 return createIntCompare(Ice::InstIcmp::Sgt, lhs, rhs);
903 }
904
905 Value *Nucleus::createICmpSGE(Value *lhs, Value *rhs)
906 {
907 return createIntCompare(Ice::InstIcmp::Sge, lhs, rhs);
908 }
909
910 Value *Nucleus::createICmpSLT(Value *lhs, Value *rhs)
911 {
912 return createIntCompare(Ice::InstIcmp::Slt, lhs, rhs);
913 }
914
Nicolas Capens598f8d82016-09-26 15:09:10 -0400915 Value *Nucleus::createICmpSLE(Value *lhs, Value *rhs)
916 {
Nicolas Capens43dc6292016-10-20 00:01:38 -0400917 return createIntCompare(Ice::InstIcmp::Sle, lhs, rhs);
918 }
919
920 static Value *createFloatCompare(Ice::InstFcmp::FCond condition, Value *lhs, Value *rhs)
921 {
922 assert(lhs->getType() == rhs->getType());
923 assert(Ice::isScalarFloatingType(lhs->getType()) || lhs->getType() == Ice::IceType_v4f32);
924
925 auto result = ::function->makeVariable(Ice::isScalarFloatingType(lhs->getType()) ? Ice::IceType_i1 : Ice::IceType_v4i32);
926 auto cmp = Ice::InstFcmp::create(::function, condition, result, lhs, rhs);
927 ::basicBlock->appendInst(cmp);
928
929 return V(result);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400930 }
931
932 Value *Nucleus::createFCmpOEQ(Value *lhs, Value *rhs)
933 {
Nicolas Capens43dc6292016-10-20 00:01:38 -0400934 return createFloatCompare(Ice::InstFcmp::Oeq, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400935 }
936
937 Value *Nucleus::createFCmpOGT(Value *lhs, Value *rhs)
938 {
Nicolas Capens43dc6292016-10-20 00:01:38 -0400939 return createFloatCompare(Ice::InstFcmp::Ogt, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400940 }
941
942 Value *Nucleus::createFCmpOGE(Value *lhs, Value *rhs)
943 {
Nicolas Capens43dc6292016-10-20 00:01:38 -0400944 return createFloatCompare(Ice::InstFcmp::Oge, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400945 }
946
947 Value *Nucleus::createFCmpOLT(Value *lhs, Value *rhs)
948 {
Nicolas Capens43dc6292016-10-20 00:01:38 -0400949 return createFloatCompare(Ice::InstFcmp::Olt, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400950 }
951
952 Value *Nucleus::createFCmpOLE(Value *lhs, Value *rhs)
953 {
Nicolas Capens43dc6292016-10-20 00:01:38 -0400954 return createFloatCompare(Ice::InstFcmp::Ole, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400955 }
956
957 Value *Nucleus::createFCmpONE(Value *lhs, Value *rhs)
958 {
Nicolas Capens43dc6292016-10-20 00:01:38 -0400959 return createFloatCompare(Ice::InstFcmp::One, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400960 }
961
962 Value *Nucleus::createFCmpORD(Value *lhs, Value *rhs)
963 {
Nicolas Capens43dc6292016-10-20 00:01:38 -0400964 return createFloatCompare(Ice::InstFcmp::Ord, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400965 }
966
967 Value *Nucleus::createFCmpUNO(Value *lhs, Value *rhs)
968 {
Nicolas Capens43dc6292016-10-20 00:01:38 -0400969 return createFloatCompare(Ice::InstFcmp::Uno, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400970 }
971
972 Value *Nucleus::createFCmpUEQ(Value *lhs, Value *rhs)
973 {
Nicolas Capens43dc6292016-10-20 00:01:38 -0400974 return createFloatCompare(Ice::InstFcmp::Ueq, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400975 }
976
977 Value *Nucleus::createFCmpUGT(Value *lhs, Value *rhs)
978 {
Nicolas Capens43dc6292016-10-20 00:01:38 -0400979 return createFloatCompare(Ice::InstFcmp::Ugt, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400980 }
981
982 Value *Nucleus::createFCmpUGE(Value *lhs, Value *rhs)
983 {
Nicolas Capens43dc6292016-10-20 00:01:38 -0400984 return createFloatCompare(Ice::InstFcmp::Uge, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400985 }
986
987 Value *Nucleus::createFCmpULT(Value *lhs, Value *rhs)
988 {
Nicolas Capens43dc6292016-10-20 00:01:38 -0400989 return createFloatCompare(Ice::InstFcmp::Ult, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400990 }
991
992 Value *Nucleus::createFCmpULE(Value *lhs, Value *rhs)
993 {
Nicolas Capens43dc6292016-10-20 00:01:38 -0400994 return createFloatCompare(Ice::InstFcmp::Ule, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400995 }
996
997 Value *Nucleus::createFCmpUNE(Value *lhs, Value *rhs)
998 {
Nicolas Capens43dc6292016-10-20 00:01:38 -0400999 return createFloatCompare(Ice::InstFcmp::Une, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -04001000 }
1001
Nicolas Capense95d5342016-09-30 11:37:28 -04001002 Value *Nucleus::createExtractElement(Value *vector, Type *type, int index)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001003 {
Nicolas Capens9709d4f2016-09-30 11:44:14 -04001004 auto result = ::function->makeVariable(T(type));
1005 auto extract = Ice::InstExtractElement::create(::function, result, vector, ::context->getConstantInt32(index));
1006 ::basicBlock->appendInst(extract);
1007
1008 return V(result);
Nicolas Capens598f8d82016-09-26 15:09:10 -04001009 }
1010
1011 Value *Nucleus::createInsertElement(Value *vector, Value *element, int index)
1012 {
Nicolas Capens9709d4f2016-09-30 11:44:14 -04001013 auto result = ::function->makeVariable(vector->getType());
1014 auto insert = Ice::InstInsertElement::create(::function, result, vector, element, ::context->getConstantInt32(index));
1015 ::basicBlock->appendInst(insert);
1016
1017 return V(result);
Nicolas Capens598f8d82016-09-26 15:09:10 -04001018 }
1019
Nicolas Capense89cd582016-09-30 14:23:47 -04001020 Value *Nucleus::createShuffleVector(Value *V1, Value *V2, const int *select)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001021 {
Nicolas Capens619c0ab2016-09-30 14:46:24 -04001022 assert(V1->getType() == V2->getType());
1023
1024 int size = Ice::typeNumElements(V1->getType());
1025 auto result = ::function->makeVariable(V1->getType());
1026 auto shuffle = Ice::InstShuffleVector::create(::function, result, V1, V2);
1027
1028 for(int i = 0; i < size; i++)
1029 {
1030 shuffle->addIndex(llvm::cast<Ice::ConstantInteger32>(::context->getConstantInt32(select[i])));
1031 }
1032
1033 ::basicBlock->appendInst(shuffle);
1034
1035 return V(result);
Nicolas Capens598f8d82016-09-26 15:09:10 -04001036 }
1037
1038 Value *Nucleus::createSelect(Value *C, Value *ifTrue, Value *ifFalse)
1039 {
Nicolas Capens53a8a3f2016-10-26 00:23:12 -04001040 assert(ifTrue->getType() == ifFalse->getType());
1041
1042 auto result = ::function->makeVariable(ifTrue->getType());
1043 auto *select = Ice::InstSelect::create(::function, result, C, ifTrue, ifFalse);
1044 ::basicBlock->appendInst(select);
1045
1046 return V(result);
Nicolas Capens598f8d82016-09-26 15:09:10 -04001047 }
1048
Nicolas Capensb98fe5c2016-11-09 12:24:06 -05001049 SwitchCases *Nucleus::createSwitch(Value *control, BasicBlock *defaultBranch, unsigned numCases)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001050 {
Nicolas Capensb98fe5c2016-11-09 12:24:06 -05001051 auto switchInst = Ice::InstSwitch::create(::function, numCases, control, defaultBranch);
1052 ::basicBlock->appendInst(switchInst);
1053
1054 return reinterpret_cast<SwitchCases*>(switchInst);
Nicolas Capens598f8d82016-09-26 15:09:10 -04001055 }
1056
Nicolas Capensb98fe5c2016-11-09 12:24:06 -05001057 void Nucleus::addSwitchCase(SwitchCases *switchCases, int label, BasicBlock *branch)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001058 {
Nicolas Capensb98fe5c2016-11-09 12:24:06 -05001059 switchCases->addBranch(label, label, branch);
Nicolas Capens598f8d82016-09-26 15:09:10 -04001060 }
1061
1062 void Nucleus::createUnreachable()
1063 {
Nicolas Capensfdcca2d2016-10-20 11:31:36 -04001064 Ice::InstUnreachable *unreachable = Ice::InstUnreachable::create(::function);
1065 ::basicBlock->appendInst(unreachable);
Nicolas Capens598f8d82016-09-26 15:09:10 -04001066 }
1067
Nicolas Capense95d5342016-09-30 11:37:28 -04001068 static Value *createSwizzle4(Value *val, unsigned char select)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001069 {
Nicolas Capens619c0ab2016-09-30 14:46:24 -04001070 int swizzle[4] =
1071 {
1072 (select >> 0) & 0x03,
1073 (select >> 2) & 0x03,
1074 (select >> 4) & 0x03,
1075 (select >> 6) & 0x03,
1076 };
Nicolas Capens9709d4f2016-09-30 11:44:14 -04001077
Nicolas Capens619c0ab2016-09-30 14:46:24 -04001078 return Nucleus::createShuffleVector(val, val, swizzle);
Nicolas Capens598f8d82016-09-26 15:09:10 -04001079 }
1080
Nicolas Capense95d5342016-09-30 11:37:28 -04001081 static Value *createMask4(Value *lhs, Value *rhs, unsigned char select)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001082 {
Nicolas Capensa4c30b02016-11-08 15:43:17 -05001083 int64_t mask[4] = {0, 0, 0, 0};
1084
1085 mask[(select >> 0) & 0x03] = -1;
1086 mask[(select >> 2) & 0x03] = -1;
1087 mask[(select >> 4) & 0x03] = -1;
1088 mask[(select >> 6) & 0x03] = -1;
1089
1090 Value *condition = Nucleus::createConstantVector(mask, T(Ice::IceType_v4i1));
1091 Value *result = Nucleus::createSelect(condition, rhs, lhs);
1092
1093 return result;
Nicolas Capens598f8d82016-09-26 15:09:10 -04001094 }
1095
Nicolas Capens598f8d82016-09-26 15:09:10 -04001096 Type *Nucleus::getPointerType(Type *ElementType)
1097 {
Nicolas Capense12780d2016-09-27 14:18:07 -04001098 if(sizeof(void*) == 8)
1099 {
1100 return T(Ice::IceType_i64);
1101 }
1102 else
1103 {
1104 return T(Ice::IceType_i32);
1105 }
Nicolas Capens598f8d82016-09-26 15:09:10 -04001106 }
1107
Nicolas Capens13ac2322016-10-13 14:52:12 -04001108 Value *Nucleus::createNullValue(Type *Ty)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001109 {
Nicolas Capens73dd7a22016-10-20 13:20:34 -04001110 if(Ice::isVectorType(T(Ty)))
1111 {
1112 int64_t c[4] = {0, 0, 0, 0};
1113 return createConstantVector(c, Ty);
1114 }
1115 else
1116 {
Nicolas Capens15060bb2016-12-05 22:17:19 -05001117 return V(::context->getConstantZero(T(Ty)));
Nicolas Capens73dd7a22016-10-20 13:20:34 -04001118 }
Nicolas Capens598f8d82016-09-26 15:09:10 -04001119 }
1120
Nicolas Capens13ac2322016-10-13 14:52:12 -04001121 Value *Nucleus::createConstantLong(int64_t i)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001122 {
Nicolas Capens15060bb2016-12-05 22:17:19 -05001123 return V(::context->getConstantInt64(i));
Nicolas Capens598f8d82016-09-26 15:09:10 -04001124 }
1125
Nicolas Capens13ac2322016-10-13 14:52:12 -04001126 Value *Nucleus::createConstantInt(int i)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001127 {
Nicolas Capens15060bb2016-12-05 22:17:19 -05001128 return V(::context->getConstantInt32(i));
Nicolas Capens598f8d82016-09-26 15:09:10 -04001129 }
1130
Nicolas Capens13ac2322016-10-13 14:52:12 -04001131 Value *Nucleus::createConstantInt(unsigned int i)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001132 {
Nicolas Capens15060bb2016-12-05 22:17:19 -05001133 return V(::context->getConstantInt32(i));
Nicolas Capens598f8d82016-09-26 15:09:10 -04001134 }
1135
Nicolas Capens13ac2322016-10-13 14:52:12 -04001136 Value *Nucleus::createConstantBool(bool b)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001137 {
Nicolas Capens15060bb2016-12-05 22:17:19 -05001138 return V(::context->getConstantInt1(b));
Nicolas Capens598f8d82016-09-26 15:09:10 -04001139 }
1140
Nicolas Capens13ac2322016-10-13 14:52:12 -04001141 Value *Nucleus::createConstantByte(signed char i)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001142 {
Nicolas Capens15060bb2016-12-05 22:17:19 -05001143 return V(::context->getConstantInt8(i));
Nicolas Capens598f8d82016-09-26 15:09:10 -04001144 }
1145
Nicolas Capens13ac2322016-10-13 14:52:12 -04001146 Value *Nucleus::createConstantByte(unsigned char i)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001147 {
Nicolas Capens15060bb2016-12-05 22:17:19 -05001148 return V(::context->getConstantInt8(i));
Nicolas Capens598f8d82016-09-26 15:09:10 -04001149 }
1150
Nicolas Capens13ac2322016-10-13 14:52:12 -04001151 Value *Nucleus::createConstantShort(short i)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001152 {
Nicolas Capens15060bb2016-12-05 22:17:19 -05001153 return V(::context->getConstantInt16(i));
Nicolas Capens598f8d82016-09-26 15:09:10 -04001154 }
1155
Nicolas Capens13ac2322016-10-13 14:52:12 -04001156 Value *Nucleus::createConstantShort(unsigned short i)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001157 {
Nicolas Capens15060bb2016-12-05 22:17:19 -05001158 return V(::context->getConstantInt16(i));
Nicolas Capens598f8d82016-09-26 15:09:10 -04001159 }
1160
Nicolas Capens13ac2322016-10-13 14:52:12 -04001161 Value *Nucleus::createConstantFloat(float x)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001162 {
Nicolas Capens15060bb2016-12-05 22:17:19 -05001163 return V(::context->getConstantFloat(x));
Nicolas Capens598f8d82016-09-26 15:09:10 -04001164 }
1165
Nicolas Capens13ac2322016-10-13 14:52:12 -04001166 Value *Nucleus::createNullPointer(Type *Ty)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001167 {
Nicolas Capensa29d6532016-12-05 21:38:09 -05001168 return createNullValue(T(sizeof(void*) == 8 ? Ice::IceType_i64 : Ice::IceType_i32));
Nicolas Capens598f8d82016-09-26 15:09:10 -04001169 }
1170
Nicolas Capens7f3f69c2016-10-20 01:29:33 -04001171 Value *Nucleus::createConstantVector(const int64_t *constants, Type *type)
Nicolas Capens13ac2322016-10-13 14:52:12 -04001172 {
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04001173 const int vectorSize = 16;
1174 assert(Ice::typeWidthInBytes(T(type)) == vectorSize);
1175 const int alignment = vectorSize;
1176 auto globalPool = ::function->getGlobalPool();
1177
Nicolas Capens7f3f69c2016-10-20 01:29:33 -04001178 const int64_t *i = constants;
1179 const double *f = reinterpret_cast<const double*>(constants);
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04001180 Ice::VariableDeclaration::DataInitializer *dataInitializer = nullptr;
Nicolas Capens7f3f69c2016-10-20 01:29:33 -04001181
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04001182 switch((int)reinterpret_cast<intptr_t>(type))
1183 {
1184 case Ice::IceType_v4i32:
Nicolas Capensa4c30b02016-11-08 15:43:17 -05001185 case Ice::IceType_v4i1:
Nicolas Capens7f3f69c2016-10-20 01:29:33 -04001186 {
1187 const int initializer[4] = {(int)i[0], (int)i[1], (int)i[2], (int)i[3]};
1188 static_assert(sizeof(initializer) == vectorSize, "!");
1189 dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize);
1190 }
1191 break;
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04001192 case Ice::IceType_v4f32:
1193 {
Nicolas Capens7f3f69c2016-10-20 01:29:33 -04001194 const float initializer[4] = {(float)f[0], (float)f[1], (float)f[2], (float)f[3]};
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04001195 static_assert(sizeof(initializer) == vectorSize, "!");
1196 dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize);
1197 }
1198 break;
1199 case Ice::IceType_v8i16:
Nicolas Capensa4c30b02016-11-08 15:43:17 -05001200 case Ice::IceType_v8i1:
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04001201 {
Nicolas Capens7f3f69c2016-10-20 01:29:33 -04001202 const short initializer[8] = {(short)i[0], (short)i[1], (short)i[2], (short)i[3], (short)i[4], (short)i[5], (short)i[6], (short)i[7]};
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04001203 static_assert(sizeof(initializer) == vectorSize, "!");
1204 dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize);
1205 }
1206 break;
1207 case Ice::IceType_v16i8:
Nicolas Capensa4c30b02016-11-08 15:43:17 -05001208 case Ice::IceType_v16i1:
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04001209 {
Nicolas Capens7f3f69c2016-10-20 01:29:33 -04001210 const char initializer[16] = {(char)i[0], (char)i[1], (char)i[2], (char)i[3], (char)i[4], (char)i[5], (char)i[6], (char)i[7], (char)i[8], (char)i[9], (char)i[10], (char)i[11], (char)i[12], (char)i[13], (char)i[14], (char)i[15]};
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04001211 static_assert(sizeof(initializer) == vectorSize, "!");
1212 dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize);
1213 }
1214 break;
1215 case Type_v2i32:
Nicolas Capens7f3f69c2016-10-20 01:29:33 -04001216 {
1217 const int initializer[4] = {(int)i[0], (int)i[1], (int)i[0], (int)i[1]};
1218 static_assert(sizeof(initializer) == vectorSize, "!");
1219 dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize);
1220 }
1221 break;
Nicolas Capens4cfd4572016-10-20 01:00:19 -04001222 case Type_v2f32:
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04001223 {
Nicolas Capens7f3f69c2016-10-20 01:29:33 -04001224 const float initializer[4] = {(float)f[0], (float)f[1], (float)f[0], (float)f[1]};
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04001225 static_assert(sizeof(initializer) == vectorSize, "!");
1226 dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize);
1227 }
1228 break;
1229 case Type_v4i16:
1230 {
Nicolas Capens7f3f69c2016-10-20 01:29:33 -04001231 const short initializer[8] = {(short)i[0], (short)i[1], (short)i[2], (short)i[3], (short)i[0], (short)i[1], (short)i[2], (short)i[3]};
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04001232 static_assert(sizeof(initializer) == vectorSize, "!");
1233 dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize);
1234 }
1235 break;
1236 case Type_v8i8:
1237 {
Nicolas Capens7f3f69c2016-10-20 01:29:33 -04001238 const char initializer[16] = {(char)i[0], (char)i[1], (char)i[2], (char)i[3], (char)i[4], (char)i[5], (char)i[6], (char)i[7], (char)i[0], (char)i[1], (char)i[2], (char)i[3], (char)i[4], (char)i[5], (char)i[6], (char)i[7]};
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04001239 static_assert(sizeof(initializer) == vectorSize, "!");
1240 dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize);
1241 }
1242 break;
1243 case Type_v4i8:
1244 {
Nicolas Capens7f3f69c2016-10-20 01:29:33 -04001245 const char initializer[16] = {(char)i[0], (char)i[1], (char)i[2], (char)i[3], (char)i[0], (char)i[1], (char)i[2], (char)i[3], (char)i[0], (char)i[1], (char)i[2], (char)i[3], (char)i[0], (char)i[1], (char)i[2], (char)i[3]};
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04001246 static_assert(sizeof(initializer) == vectorSize, "!");
1247 dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize);
1248 }
1249 break;
1250 default:
1251 assert(false && "Unknown constant vector type" && type);
1252 }
1253
1254 auto name = Ice::GlobalString::createWithoutString(::context);
1255 auto *variableDeclaration = Ice::VariableDeclaration::create(globalPool);
1256 variableDeclaration->setName(name);
1257 variableDeclaration->setAlignment(alignment);
1258 variableDeclaration->setIsConstant(true);
1259 variableDeclaration->addInitializer(dataInitializer);
Nicolas Capens87852e12016-11-24 14:45:06 -05001260
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04001261 ::function->addGlobal(variableDeclaration);
1262
1263 constexpr int32_t offset = 0;
1264 Ice::Operand *ptr = ::context->getConstantSym(offset, name);
1265
1266 Ice::Variable *result = ::function->makeVariable(T(type));
1267 auto load = Ice::InstLoad::create(::function, result, ptr, alignment);
1268 ::basicBlock->appendInst(load);
1269
1270 return V(result);
Nicolas Capens13ac2322016-10-13 14:52:12 -04001271 }
1272
1273 Value *Nucleus::createConstantVector(const double *constants, Type *type)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001274 {
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04001275 return createConstantVector((const int64_t*)constants, type);
Nicolas Capens598f8d82016-09-26 15:09:10 -04001276 }
1277
1278 Type *Void::getType()
1279 {
1280 return T(Ice::IceType_void);
1281 }
1282
Nicolas Capens598f8d82016-09-26 15:09:10 -04001283 Bool::Bool(Argument<Bool> argument)
1284 {
1285 storeValue(argument.value);
1286 }
1287
1288 Bool::Bool()
1289 {
1290 }
1291
1292 Bool::Bool(bool x)
1293 {
1294 storeValue(Nucleus::createConstantBool(x));
1295 }
1296
1297 Bool::Bool(RValue<Bool> rhs)
1298 {
1299 storeValue(rhs.value);
1300 }
1301
1302 Bool::Bool(const Bool &rhs)
1303 {
1304 Value *value = rhs.loadValue();
1305 storeValue(value);
1306 }
1307
1308 Bool::Bool(const Reference<Bool> &rhs)
1309 {
1310 Value *value = rhs.loadValue();
1311 storeValue(value);
1312 }
1313
Nicolas Capens96d4e092016-11-18 14:22:38 -05001314 RValue<Bool> Bool::operator=(RValue<Bool> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001315 {
1316 storeValue(rhs.value);
1317
1318 return rhs;
1319 }
1320
Nicolas Capens96d4e092016-11-18 14:22:38 -05001321 RValue<Bool> Bool::operator=(const Bool &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001322 {
1323 Value *value = rhs.loadValue();
1324 storeValue(value);
1325
1326 return RValue<Bool>(value);
1327 }
1328
Nicolas Capens96d4e092016-11-18 14:22:38 -05001329 RValue<Bool> Bool::operator=(const Reference<Bool> &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001330 {
1331 Value *value = rhs.loadValue();
1332 storeValue(value);
1333
1334 return RValue<Bool>(value);
1335 }
1336
1337 RValue<Bool> operator!(RValue<Bool> val)
1338 {
1339 return RValue<Bool>(Nucleus::createNot(val.value));
1340 }
1341
1342 RValue<Bool> operator&&(RValue<Bool> lhs, RValue<Bool> rhs)
1343 {
1344 return RValue<Bool>(Nucleus::createAnd(lhs.value, rhs.value));
1345 }
1346
1347 RValue<Bool> operator||(RValue<Bool> lhs, RValue<Bool> rhs)
1348 {
1349 return RValue<Bool>(Nucleus::createOr(lhs.value, rhs.value));
1350 }
1351
1352 Type *Bool::getType()
1353 {
Nicolas Capens4cfd4572016-10-20 01:00:19 -04001354 return T(Ice::IceType_i1);
Nicolas Capens598f8d82016-09-26 15:09:10 -04001355 }
1356
1357 Byte::Byte(Argument<Byte> argument)
1358 {
1359 storeValue(argument.value);
1360 }
1361
1362 Byte::Byte(RValue<Int> cast)
1363 {
1364 Value *integer = Nucleus::createTrunc(cast.value, Byte::getType());
1365
1366 storeValue(integer);
1367 }
1368
1369 Byte::Byte(RValue<UInt> cast)
1370 {
1371 Value *integer = Nucleus::createTrunc(cast.value, Byte::getType());
1372
1373 storeValue(integer);
1374 }
1375
1376 Byte::Byte(RValue<UShort> cast)
1377 {
1378 Value *integer = Nucleus::createTrunc(cast.value, Byte::getType());
1379
1380 storeValue(integer);
1381 }
1382
1383 Byte::Byte()
1384 {
1385 }
1386
1387 Byte::Byte(int x)
1388 {
1389 storeValue(Nucleus::createConstantByte((unsigned char)x));
1390 }
1391
1392 Byte::Byte(unsigned char x)
1393 {
1394 storeValue(Nucleus::createConstantByte(x));
1395 }
1396
1397 Byte::Byte(RValue<Byte> rhs)
1398 {
1399 storeValue(rhs.value);
1400 }
1401
1402 Byte::Byte(const Byte &rhs)
1403 {
1404 Value *value = rhs.loadValue();
1405 storeValue(value);
1406 }
1407
1408 Byte::Byte(const Reference<Byte> &rhs)
1409 {
1410 Value *value = rhs.loadValue();
1411 storeValue(value);
1412 }
1413
Nicolas Capens96d4e092016-11-18 14:22:38 -05001414 RValue<Byte> Byte::operator=(RValue<Byte> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001415 {
1416 storeValue(rhs.value);
1417
1418 return rhs;
1419 }
1420
Nicolas Capens96d4e092016-11-18 14:22:38 -05001421 RValue<Byte> Byte::operator=(const Byte &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001422 {
1423 Value *value = rhs.loadValue();
1424 storeValue(value);
1425
1426 return RValue<Byte>(value);
1427 }
1428
Nicolas Capens96d4e092016-11-18 14:22:38 -05001429 RValue<Byte> Byte::operator=(const Reference<Byte> &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001430 {
1431 Value *value = rhs.loadValue();
1432 storeValue(value);
1433
1434 return RValue<Byte>(value);
1435 }
1436
1437 RValue<Byte> operator+(RValue<Byte> lhs, RValue<Byte> rhs)
1438 {
1439 return RValue<Byte>(Nucleus::createAdd(lhs.value, rhs.value));
1440 }
1441
1442 RValue<Byte> operator-(RValue<Byte> lhs, RValue<Byte> rhs)
1443 {
1444 return RValue<Byte>(Nucleus::createSub(lhs.value, rhs.value));
1445 }
1446
1447 RValue<Byte> operator*(RValue<Byte> lhs, RValue<Byte> rhs)
1448 {
1449 return RValue<Byte>(Nucleus::createMul(lhs.value, rhs.value));
1450 }
1451
1452 RValue<Byte> operator/(RValue<Byte> lhs, RValue<Byte> rhs)
1453 {
1454 return RValue<Byte>(Nucleus::createUDiv(lhs.value, rhs.value));
1455 }
1456
1457 RValue<Byte> operator%(RValue<Byte> lhs, RValue<Byte> rhs)
1458 {
1459 return RValue<Byte>(Nucleus::createURem(lhs.value, rhs.value));
1460 }
1461
1462 RValue<Byte> operator&(RValue<Byte> lhs, RValue<Byte> rhs)
1463 {
1464 return RValue<Byte>(Nucleus::createAnd(lhs.value, rhs.value));
1465 }
1466
1467 RValue<Byte> operator|(RValue<Byte> lhs, RValue<Byte> rhs)
1468 {
1469 return RValue<Byte>(Nucleus::createOr(lhs.value, rhs.value));
1470 }
1471
1472 RValue<Byte> operator^(RValue<Byte> lhs, RValue<Byte> rhs)
1473 {
1474 return RValue<Byte>(Nucleus::createXor(lhs.value, rhs.value));
1475 }
1476
1477 RValue<Byte> operator<<(RValue<Byte> lhs, RValue<Byte> rhs)
1478 {
1479 return RValue<Byte>(Nucleus::createShl(lhs.value, rhs.value));
1480 }
1481
1482 RValue<Byte> operator>>(RValue<Byte> lhs, RValue<Byte> rhs)
1483 {
1484 return RValue<Byte>(Nucleus::createLShr(lhs.value, rhs.value));
1485 }
1486
Nicolas Capens96d4e092016-11-18 14:22:38 -05001487 RValue<Byte> operator+=(Byte &lhs, RValue<Byte> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001488 {
1489 return lhs = lhs + rhs;
1490 }
1491
Nicolas Capens96d4e092016-11-18 14:22:38 -05001492 RValue<Byte> operator-=(Byte &lhs, RValue<Byte> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001493 {
1494 return lhs = lhs - rhs;
1495 }
1496
Nicolas Capens96d4e092016-11-18 14:22:38 -05001497 RValue<Byte> operator*=(Byte &lhs, RValue<Byte> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001498 {
1499 return lhs = lhs * rhs;
1500 }
1501
Nicolas Capens96d4e092016-11-18 14:22:38 -05001502 RValue<Byte> operator/=(Byte &lhs, RValue<Byte> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001503 {
1504 return lhs = lhs / rhs;
1505 }
1506
Nicolas Capens96d4e092016-11-18 14:22:38 -05001507 RValue<Byte> operator%=(Byte &lhs, RValue<Byte> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001508 {
1509 return lhs = lhs % rhs;
1510 }
1511
Nicolas Capens96d4e092016-11-18 14:22:38 -05001512 RValue<Byte> operator&=(Byte &lhs, RValue<Byte> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001513 {
1514 return lhs = lhs & rhs;
1515 }
1516
Nicolas Capens96d4e092016-11-18 14:22:38 -05001517 RValue<Byte> operator|=(Byte &lhs, RValue<Byte> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001518 {
1519 return lhs = lhs | rhs;
1520 }
1521
Nicolas Capens96d4e092016-11-18 14:22:38 -05001522 RValue<Byte> operator^=(Byte &lhs, RValue<Byte> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001523 {
1524 return lhs = lhs ^ rhs;
1525 }
1526
Nicolas Capens96d4e092016-11-18 14:22:38 -05001527 RValue<Byte> operator<<=(Byte &lhs, RValue<Byte> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001528 {
1529 return lhs = lhs << rhs;
1530 }
1531
Nicolas Capens96d4e092016-11-18 14:22:38 -05001532 RValue<Byte> operator>>=(Byte &lhs, RValue<Byte> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001533 {
1534 return lhs = lhs >> rhs;
1535 }
1536
1537 RValue<Byte> operator+(RValue<Byte> val)
1538 {
1539 return val;
1540 }
1541
1542 RValue<Byte> operator-(RValue<Byte> val)
1543 {
1544 return RValue<Byte>(Nucleus::createNeg(val.value));
1545 }
1546
1547 RValue<Byte> operator~(RValue<Byte> val)
1548 {
1549 return RValue<Byte>(Nucleus::createNot(val.value));
1550 }
1551
Nicolas Capens96d4e092016-11-18 14:22:38 -05001552 RValue<Byte> operator++(Byte &val, int) // Post-increment
Nicolas Capens598f8d82016-09-26 15:09:10 -04001553 {
1554 RValue<Byte> res = val;
Nicolas Capensd1229402016-11-07 16:05:22 -05001555 val += Byte(1);
Nicolas Capens598f8d82016-09-26 15:09:10 -04001556 return res;
1557 }
1558
Nicolas Capens96d4e092016-11-18 14:22:38 -05001559 const Byte &operator++(Byte &val) // Pre-increment
Nicolas Capens598f8d82016-09-26 15:09:10 -04001560 {
Nicolas Capensd1229402016-11-07 16:05:22 -05001561 val += Byte(1);
Nicolas Capens598f8d82016-09-26 15:09:10 -04001562 return val;
1563 }
1564
Nicolas Capens96d4e092016-11-18 14:22:38 -05001565 RValue<Byte> operator--(Byte &val, int) // Post-decrement
Nicolas Capens598f8d82016-09-26 15:09:10 -04001566 {
1567 RValue<Byte> res = val;
Nicolas Capensd1229402016-11-07 16:05:22 -05001568 val -= Byte(1);
Nicolas Capens598f8d82016-09-26 15:09:10 -04001569 return res;
1570 }
1571
Nicolas Capens96d4e092016-11-18 14:22:38 -05001572 const Byte &operator--(Byte &val) // Pre-decrement
Nicolas Capens598f8d82016-09-26 15:09:10 -04001573 {
Nicolas Capensd1229402016-11-07 16:05:22 -05001574 val -= Byte(1);
Nicolas Capens598f8d82016-09-26 15:09:10 -04001575 return val;
1576 }
1577
1578 RValue<Bool> operator<(RValue<Byte> lhs, RValue<Byte> rhs)
1579 {
1580 return RValue<Bool>(Nucleus::createICmpULT(lhs.value, rhs.value));
1581 }
1582
1583 RValue<Bool> operator<=(RValue<Byte> lhs, RValue<Byte> rhs)
1584 {
1585 return RValue<Bool>(Nucleus::createICmpULE(lhs.value, rhs.value));
1586 }
1587
1588 RValue<Bool> operator>(RValue<Byte> lhs, RValue<Byte> rhs)
1589 {
1590 return RValue<Bool>(Nucleus::createICmpUGT(lhs.value, rhs.value));
1591 }
1592
1593 RValue<Bool> operator>=(RValue<Byte> lhs, RValue<Byte> rhs)
1594 {
1595 return RValue<Bool>(Nucleus::createICmpUGE(lhs.value, rhs.value));
1596 }
1597
1598 RValue<Bool> operator!=(RValue<Byte> lhs, RValue<Byte> rhs)
1599 {
1600 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
1601 }
1602
1603 RValue<Bool> operator==(RValue<Byte> lhs, RValue<Byte> rhs)
1604 {
1605 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
1606 }
1607
1608 Type *Byte::getType()
1609 {
Nicolas Capens6d738712016-09-30 04:15:22 -04001610 return T(Ice::IceType_i8);
Nicolas Capens598f8d82016-09-26 15:09:10 -04001611 }
1612
1613 SByte::SByte(Argument<SByte> argument)
1614 {
1615 storeValue(argument.value);
1616 }
1617
1618 SByte::SByte(RValue<Int> cast)
1619 {
1620 Value *integer = Nucleus::createTrunc(cast.value, SByte::getType());
1621
1622 storeValue(integer);
1623 }
1624
1625 SByte::SByte(RValue<Short> cast)
1626 {
1627 Value *integer = Nucleus::createTrunc(cast.value, SByte::getType());
1628
1629 storeValue(integer);
1630 }
1631
1632 SByte::SByte()
1633 {
1634 }
1635
1636 SByte::SByte(signed char x)
1637 {
1638 storeValue(Nucleus::createConstantByte(x));
1639 }
1640
1641 SByte::SByte(RValue<SByte> rhs)
1642 {
1643 storeValue(rhs.value);
1644 }
1645
1646 SByte::SByte(const SByte &rhs)
1647 {
1648 Value *value = rhs.loadValue();
1649 storeValue(value);
1650 }
1651
1652 SByte::SByte(const Reference<SByte> &rhs)
1653 {
1654 Value *value = rhs.loadValue();
1655 storeValue(value);
1656 }
1657
Nicolas Capens96d4e092016-11-18 14:22:38 -05001658 RValue<SByte> SByte::operator=(RValue<SByte> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001659 {
1660 storeValue(rhs.value);
1661
1662 return rhs;
1663 }
1664
Nicolas Capens96d4e092016-11-18 14:22:38 -05001665 RValue<SByte> SByte::operator=(const SByte &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001666 {
1667 Value *value = rhs.loadValue();
1668 storeValue(value);
1669
1670 return RValue<SByte>(value);
1671 }
1672
Nicolas Capens96d4e092016-11-18 14:22:38 -05001673 RValue<SByte> SByte::operator=(const Reference<SByte> &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001674 {
1675 Value *value = rhs.loadValue();
1676 storeValue(value);
1677
1678 return RValue<SByte>(value);
1679 }
1680
1681 RValue<SByte> operator+(RValue<SByte> lhs, RValue<SByte> rhs)
1682 {
1683 return RValue<SByte>(Nucleus::createAdd(lhs.value, rhs.value));
1684 }
1685
1686 RValue<SByte> operator-(RValue<SByte> lhs, RValue<SByte> rhs)
1687 {
1688 return RValue<SByte>(Nucleus::createSub(lhs.value, rhs.value));
1689 }
1690
1691 RValue<SByte> operator*(RValue<SByte> lhs, RValue<SByte> rhs)
1692 {
1693 return RValue<SByte>(Nucleus::createMul(lhs.value, rhs.value));
1694 }
1695
1696 RValue<SByte> operator/(RValue<SByte> lhs, RValue<SByte> rhs)
1697 {
1698 return RValue<SByte>(Nucleus::createSDiv(lhs.value, rhs.value));
1699 }
1700
1701 RValue<SByte> operator%(RValue<SByte> lhs, RValue<SByte> rhs)
1702 {
1703 return RValue<SByte>(Nucleus::createSRem(lhs.value, rhs.value));
1704 }
1705
1706 RValue<SByte> operator&(RValue<SByte> lhs, RValue<SByte> rhs)
1707 {
1708 return RValue<SByte>(Nucleus::createAnd(lhs.value, rhs.value));
1709 }
1710
1711 RValue<SByte> operator|(RValue<SByte> lhs, RValue<SByte> rhs)
1712 {
1713 return RValue<SByte>(Nucleus::createOr(lhs.value, rhs.value));
1714 }
1715
1716 RValue<SByte> operator^(RValue<SByte> lhs, RValue<SByte> rhs)
1717 {
1718 return RValue<SByte>(Nucleus::createXor(lhs.value, rhs.value));
1719 }
1720
1721 RValue<SByte> operator<<(RValue<SByte> lhs, RValue<SByte> rhs)
1722 {
1723 return RValue<SByte>(Nucleus::createShl(lhs.value, rhs.value));
1724 }
1725
1726 RValue<SByte> operator>>(RValue<SByte> lhs, RValue<SByte> rhs)
1727 {
1728 return RValue<SByte>(Nucleus::createAShr(lhs.value, rhs.value));
1729 }
1730
Nicolas Capens96d4e092016-11-18 14:22:38 -05001731 RValue<SByte> operator+=(SByte &lhs, RValue<SByte> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001732 {
1733 return lhs = lhs + rhs;
1734 }
1735
Nicolas Capens96d4e092016-11-18 14:22:38 -05001736 RValue<SByte> operator-=(SByte &lhs, RValue<SByte> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001737 {
1738 return lhs = lhs - rhs;
1739 }
1740
Nicolas Capens96d4e092016-11-18 14:22:38 -05001741 RValue<SByte> operator*=(SByte &lhs, RValue<SByte> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001742 {
1743 return lhs = lhs * rhs;
1744 }
1745
Nicolas Capens96d4e092016-11-18 14:22:38 -05001746 RValue<SByte> operator/=(SByte &lhs, RValue<SByte> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001747 {
1748 return lhs = lhs / rhs;
1749 }
1750
Nicolas Capens96d4e092016-11-18 14:22:38 -05001751 RValue<SByte> operator%=(SByte &lhs, RValue<SByte> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001752 {
1753 return lhs = lhs % rhs;
1754 }
1755
Nicolas Capens96d4e092016-11-18 14:22:38 -05001756 RValue<SByte> operator&=(SByte &lhs, RValue<SByte> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001757 {
1758 return lhs = lhs & rhs;
1759 }
1760
Nicolas Capens96d4e092016-11-18 14:22:38 -05001761 RValue<SByte> operator|=(SByte &lhs, RValue<SByte> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001762 {
1763 return lhs = lhs | rhs;
1764 }
1765
Nicolas Capens96d4e092016-11-18 14:22:38 -05001766 RValue<SByte> operator^=(SByte &lhs, RValue<SByte> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001767 {
1768 return lhs = lhs ^ rhs;
1769 }
1770
Nicolas Capens96d4e092016-11-18 14:22:38 -05001771 RValue<SByte> operator<<=(SByte &lhs, RValue<SByte> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001772 {
1773 return lhs = lhs << rhs;
1774 }
1775
Nicolas Capens96d4e092016-11-18 14:22:38 -05001776 RValue<SByte> operator>>=(SByte &lhs, RValue<SByte> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001777 {
1778 return lhs = lhs >> rhs;
1779 }
1780
1781 RValue<SByte> operator+(RValue<SByte> val)
1782 {
1783 return val;
1784 }
1785
1786 RValue<SByte> operator-(RValue<SByte> val)
1787 {
1788 return RValue<SByte>(Nucleus::createNeg(val.value));
1789 }
1790
1791 RValue<SByte> operator~(RValue<SByte> val)
1792 {
1793 return RValue<SByte>(Nucleus::createNot(val.value));
1794 }
1795
Nicolas Capens96d4e092016-11-18 14:22:38 -05001796 RValue<SByte> operator++(SByte &val, int) // Post-increment
Nicolas Capens598f8d82016-09-26 15:09:10 -04001797 {
1798 RValue<SByte> res = val;
Nicolas Capensd1229402016-11-07 16:05:22 -05001799 val += SByte(1);
Nicolas Capens598f8d82016-09-26 15:09:10 -04001800 return res;
1801 }
1802
Nicolas Capens96d4e092016-11-18 14:22:38 -05001803 const SByte &operator++(SByte &val) // Pre-increment
Nicolas Capens598f8d82016-09-26 15:09:10 -04001804 {
Nicolas Capensd1229402016-11-07 16:05:22 -05001805 val += SByte(1);
Nicolas Capens598f8d82016-09-26 15:09:10 -04001806 return val;
1807 }
1808
Nicolas Capens96d4e092016-11-18 14:22:38 -05001809 RValue<SByte> operator--(SByte &val, int) // Post-decrement
Nicolas Capens598f8d82016-09-26 15:09:10 -04001810 {
1811 RValue<SByte> res = val;
Nicolas Capensd1229402016-11-07 16:05:22 -05001812 val -= SByte(1);
Nicolas Capens598f8d82016-09-26 15:09:10 -04001813 return res;
1814 }
1815
Nicolas Capens96d4e092016-11-18 14:22:38 -05001816 const SByte &operator--(SByte &val) // Pre-decrement
Nicolas Capens598f8d82016-09-26 15:09:10 -04001817 {
Nicolas Capensd1229402016-11-07 16:05:22 -05001818 val -= SByte(1);
Nicolas Capens598f8d82016-09-26 15:09:10 -04001819 return val;
1820 }
1821
1822 RValue<Bool> operator<(RValue<SByte> lhs, RValue<SByte> rhs)
1823 {
1824 return RValue<Bool>(Nucleus::createICmpSLT(lhs.value, rhs.value));
1825 }
1826
1827 RValue<Bool> operator<=(RValue<SByte> lhs, RValue<SByte> rhs)
1828 {
1829 return RValue<Bool>(Nucleus::createICmpSLE(lhs.value, rhs.value));
1830 }
1831
1832 RValue<Bool> operator>(RValue<SByte> lhs, RValue<SByte> rhs)
1833 {
1834 return RValue<Bool>(Nucleus::createICmpSGT(lhs.value, rhs.value));
1835 }
1836
1837 RValue<Bool> operator>=(RValue<SByte> lhs, RValue<SByte> rhs)
1838 {
1839 return RValue<Bool>(Nucleus::createICmpSGE(lhs.value, rhs.value));
1840 }
1841
1842 RValue<Bool> operator!=(RValue<SByte> lhs, RValue<SByte> rhs)
1843 {
1844 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
1845 }
1846
1847 RValue<Bool> operator==(RValue<SByte> lhs, RValue<SByte> rhs)
1848 {
1849 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
1850 }
1851
1852 Type *SByte::getType()
1853 {
Nicolas Capens4cfd4572016-10-20 01:00:19 -04001854 return T(Ice::IceType_i8);
Nicolas Capens598f8d82016-09-26 15:09:10 -04001855 }
1856
1857 Short::Short(Argument<Short> argument)
1858 {
1859 storeValue(argument.value);
1860 }
1861
1862 Short::Short(RValue<Int> cast)
1863 {
1864 Value *integer = Nucleus::createTrunc(cast.value, Short::getType());
1865
1866 storeValue(integer);
1867 }
1868
1869 Short::Short()
1870 {
1871 }
1872
1873 Short::Short(short x)
1874 {
1875 storeValue(Nucleus::createConstantShort(x));
1876 }
1877
1878 Short::Short(RValue<Short> rhs)
1879 {
1880 storeValue(rhs.value);
1881 }
1882
1883 Short::Short(const Short &rhs)
1884 {
1885 Value *value = rhs.loadValue();
1886 storeValue(value);
1887 }
1888
1889 Short::Short(const Reference<Short> &rhs)
1890 {
1891 Value *value = rhs.loadValue();
1892 storeValue(value);
1893 }
1894
Nicolas Capens96d4e092016-11-18 14:22:38 -05001895 RValue<Short> Short::operator=(RValue<Short> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001896 {
1897 storeValue(rhs.value);
1898
1899 return rhs;
1900 }
1901
Nicolas Capens96d4e092016-11-18 14:22:38 -05001902 RValue<Short> Short::operator=(const Short &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001903 {
1904 Value *value = rhs.loadValue();
1905 storeValue(value);
1906
1907 return RValue<Short>(value);
1908 }
1909
Nicolas Capens96d4e092016-11-18 14:22:38 -05001910 RValue<Short> Short::operator=(const Reference<Short> &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001911 {
1912 Value *value = rhs.loadValue();
1913 storeValue(value);
1914
1915 return RValue<Short>(value);
1916 }
1917
1918 RValue<Short> operator+(RValue<Short> lhs, RValue<Short> rhs)
1919 {
1920 return RValue<Short>(Nucleus::createAdd(lhs.value, rhs.value));
1921 }
1922
1923 RValue<Short> operator-(RValue<Short> lhs, RValue<Short> rhs)
1924 {
1925 return RValue<Short>(Nucleus::createSub(lhs.value, rhs.value));
1926 }
1927
1928 RValue<Short> operator*(RValue<Short> lhs, RValue<Short> rhs)
1929 {
1930 return RValue<Short>(Nucleus::createMul(lhs.value, rhs.value));
1931 }
1932
1933 RValue<Short> operator/(RValue<Short> lhs, RValue<Short> rhs)
1934 {
1935 return RValue<Short>(Nucleus::createSDiv(lhs.value, rhs.value));
1936 }
1937
1938 RValue<Short> operator%(RValue<Short> lhs, RValue<Short> rhs)
1939 {
1940 return RValue<Short>(Nucleus::createSRem(lhs.value, rhs.value));
1941 }
1942
1943 RValue<Short> operator&(RValue<Short> lhs, RValue<Short> rhs)
1944 {
1945 return RValue<Short>(Nucleus::createAnd(lhs.value, rhs.value));
1946 }
1947
1948 RValue<Short> operator|(RValue<Short> lhs, RValue<Short> rhs)
1949 {
1950 return RValue<Short>(Nucleus::createOr(lhs.value, rhs.value));
1951 }
1952
1953 RValue<Short> operator^(RValue<Short> lhs, RValue<Short> rhs)
1954 {
1955 return RValue<Short>(Nucleus::createXor(lhs.value, rhs.value));
1956 }
1957
1958 RValue<Short> operator<<(RValue<Short> lhs, RValue<Short> rhs)
1959 {
1960 return RValue<Short>(Nucleus::createShl(lhs.value, rhs.value));
1961 }
1962
1963 RValue<Short> operator>>(RValue<Short> lhs, RValue<Short> rhs)
1964 {
1965 return RValue<Short>(Nucleus::createAShr(lhs.value, rhs.value));
1966 }
1967
Nicolas Capens96d4e092016-11-18 14:22:38 -05001968 RValue<Short> operator+=(Short &lhs, RValue<Short> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001969 {
1970 return lhs = lhs + rhs;
1971 }
1972
Nicolas Capens96d4e092016-11-18 14:22:38 -05001973 RValue<Short> operator-=(Short &lhs, RValue<Short> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001974 {
1975 return lhs = lhs - rhs;
1976 }
1977
Nicolas Capens96d4e092016-11-18 14:22:38 -05001978 RValue<Short> operator*=(Short &lhs, RValue<Short> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001979 {
1980 return lhs = lhs * rhs;
1981 }
1982
Nicolas Capens96d4e092016-11-18 14:22:38 -05001983 RValue<Short> operator/=(Short &lhs, RValue<Short> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001984 {
1985 return lhs = lhs / rhs;
1986 }
1987
Nicolas Capens96d4e092016-11-18 14:22:38 -05001988 RValue<Short> operator%=(Short &lhs, RValue<Short> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001989 {
1990 return lhs = lhs % rhs;
1991 }
1992
Nicolas Capens96d4e092016-11-18 14:22:38 -05001993 RValue<Short> operator&=(Short &lhs, RValue<Short> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001994 {
1995 return lhs = lhs & rhs;
1996 }
1997
Nicolas Capens96d4e092016-11-18 14:22:38 -05001998 RValue<Short> operator|=(Short &lhs, RValue<Short> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001999 {
2000 return lhs = lhs | rhs;
2001 }
2002
Nicolas Capens96d4e092016-11-18 14:22:38 -05002003 RValue<Short> operator^=(Short &lhs, RValue<Short> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002004 {
2005 return lhs = lhs ^ rhs;
2006 }
2007
Nicolas Capens96d4e092016-11-18 14:22:38 -05002008 RValue<Short> operator<<=(Short &lhs, RValue<Short> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002009 {
2010 return lhs = lhs << rhs;
2011 }
2012
Nicolas Capens96d4e092016-11-18 14:22:38 -05002013 RValue<Short> operator>>=(Short &lhs, RValue<Short> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002014 {
2015 return lhs = lhs >> rhs;
2016 }
2017
2018 RValue<Short> operator+(RValue<Short> val)
2019 {
2020 return val;
2021 }
2022
2023 RValue<Short> operator-(RValue<Short> val)
2024 {
2025 return RValue<Short>(Nucleus::createNeg(val.value));
2026 }
2027
2028 RValue<Short> operator~(RValue<Short> val)
2029 {
2030 return RValue<Short>(Nucleus::createNot(val.value));
2031 }
2032
Nicolas Capens96d4e092016-11-18 14:22:38 -05002033 RValue<Short> operator++(Short &val, int) // Post-increment
Nicolas Capens598f8d82016-09-26 15:09:10 -04002034 {
2035 RValue<Short> res = val;
Nicolas Capensd1229402016-11-07 16:05:22 -05002036 val += Short(1);
Nicolas Capens598f8d82016-09-26 15:09:10 -04002037 return res;
2038 }
2039
Nicolas Capens96d4e092016-11-18 14:22:38 -05002040 const Short &operator++(Short &val) // Pre-increment
Nicolas Capens598f8d82016-09-26 15:09:10 -04002041 {
Nicolas Capensd1229402016-11-07 16:05:22 -05002042 val += Short(1);
Nicolas Capens598f8d82016-09-26 15:09:10 -04002043 return val;
2044 }
2045
Nicolas Capens96d4e092016-11-18 14:22:38 -05002046 RValue<Short> operator--(Short &val, int) // Post-decrement
Nicolas Capens598f8d82016-09-26 15:09:10 -04002047 {
2048 RValue<Short> res = val;
Nicolas Capensd1229402016-11-07 16:05:22 -05002049 val -= Short(1);
Nicolas Capens598f8d82016-09-26 15:09:10 -04002050 return res;
2051 }
2052
Nicolas Capens96d4e092016-11-18 14:22:38 -05002053 const Short &operator--(Short &val) // Pre-decrement
Nicolas Capens598f8d82016-09-26 15:09:10 -04002054 {
Nicolas Capensd1229402016-11-07 16:05:22 -05002055 val -= Short(1);
Nicolas Capens598f8d82016-09-26 15:09:10 -04002056 return val;
2057 }
2058
2059 RValue<Bool> operator<(RValue<Short> lhs, RValue<Short> rhs)
2060 {
2061 return RValue<Bool>(Nucleus::createICmpSLT(lhs.value, rhs.value));
2062 }
2063
2064 RValue<Bool> operator<=(RValue<Short> lhs, RValue<Short> rhs)
2065 {
2066 return RValue<Bool>(Nucleus::createICmpSLE(lhs.value, rhs.value));
2067 }
2068
2069 RValue<Bool> operator>(RValue<Short> lhs, RValue<Short> rhs)
2070 {
2071 return RValue<Bool>(Nucleus::createICmpSGT(lhs.value, rhs.value));
2072 }
2073
2074 RValue<Bool> operator>=(RValue<Short> lhs, RValue<Short> rhs)
2075 {
2076 return RValue<Bool>(Nucleus::createICmpSGE(lhs.value, rhs.value));
2077 }
2078
2079 RValue<Bool> operator!=(RValue<Short> lhs, RValue<Short> rhs)
2080 {
2081 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
2082 }
2083
2084 RValue<Bool> operator==(RValue<Short> lhs, RValue<Short> rhs)
2085 {
2086 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
2087 }
2088
2089 Type *Short::getType()
2090 {
Nicolas Capens4cfd4572016-10-20 01:00:19 -04002091 return T(Ice::IceType_i16);
Nicolas Capens598f8d82016-09-26 15:09:10 -04002092 }
2093
2094 UShort::UShort(Argument<UShort> argument)
2095 {
2096 storeValue(argument.value);
2097 }
2098
2099 UShort::UShort(RValue<UInt> cast)
2100 {
2101 Value *integer = Nucleus::createTrunc(cast.value, UShort::getType());
2102
2103 storeValue(integer);
2104 }
2105
2106 UShort::UShort(RValue<Int> cast)
2107 {
2108 Value *integer = Nucleus::createTrunc(cast.value, UShort::getType());
2109
2110 storeValue(integer);
2111 }
2112
2113 UShort::UShort()
2114 {
2115 }
2116
2117 UShort::UShort(unsigned short x)
2118 {
2119 storeValue(Nucleus::createConstantShort(x));
2120 }
2121
2122 UShort::UShort(RValue<UShort> rhs)
2123 {
2124 storeValue(rhs.value);
2125 }
2126
2127 UShort::UShort(const UShort &rhs)
2128 {
2129 Value *value = rhs.loadValue();
2130 storeValue(value);
2131 }
2132
2133 UShort::UShort(const Reference<UShort> &rhs)
2134 {
2135 Value *value = rhs.loadValue();
2136 storeValue(value);
2137 }
2138
Nicolas Capens96d4e092016-11-18 14:22:38 -05002139 RValue<UShort> UShort::operator=(RValue<UShort> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002140 {
2141 storeValue(rhs.value);
2142
2143 return rhs;
2144 }
2145
Nicolas Capens96d4e092016-11-18 14:22:38 -05002146 RValue<UShort> UShort::operator=(const UShort &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002147 {
2148 Value *value = rhs.loadValue();
2149 storeValue(value);
2150
2151 return RValue<UShort>(value);
2152 }
2153
Nicolas Capens96d4e092016-11-18 14:22:38 -05002154 RValue<UShort> UShort::operator=(const Reference<UShort> &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002155 {
2156 Value *value = rhs.loadValue();
2157 storeValue(value);
2158
2159 return RValue<UShort>(value);
2160 }
2161
2162 RValue<UShort> operator+(RValue<UShort> lhs, RValue<UShort> rhs)
2163 {
2164 return RValue<UShort>(Nucleus::createAdd(lhs.value, rhs.value));
2165 }
2166
2167 RValue<UShort> operator-(RValue<UShort> lhs, RValue<UShort> rhs)
2168 {
2169 return RValue<UShort>(Nucleus::createSub(lhs.value, rhs.value));
2170 }
2171
2172 RValue<UShort> operator*(RValue<UShort> lhs, RValue<UShort> rhs)
2173 {
2174 return RValue<UShort>(Nucleus::createMul(lhs.value, rhs.value));
2175 }
2176
2177 RValue<UShort> operator/(RValue<UShort> lhs, RValue<UShort> rhs)
2178 {
2179 return RValue<UShort>(Nucleus::createUDiv(lhs.value, rhs.value));
2180 }
2181
2182 RValue<UShort> operator%(RValue<UShort> lhs, RValue<UShort> rhs)
2183 {
2184 return RValue<UShort>(Nucleus::createURem(lhs.value, rhs.value));
2185 }
2186
2187 RValue<UShort> operator&(RValue<UShort> lhs, RValue<UShort> rhs)
2188 {
2189 return RValue<UShort>(Nucleus::createAnd(lhs.value, rhs.value));
2190 }
2191
2192 RValue<UShort> operator|(RValue<UShort> lhs, RValue<UShort> rhs)
2193 {
2194 return RValue<UShort>(Nucleus::createOr(lhs.value, rhs.value));
2195 }
2196
2197 RValue<UShort> operator^(RValue<UShort> lhs, RValue<UShort> rhs)
2198 {
2199 return RValue<UShort>(Nucleus::createXor(lhs.value, rhs.value));
2200 }
2201
2202 RValue<UShort> operator<<(RValue<UShort> lhs, RValue<UShort> rhs)
2203 {
2204 return RValue<UShort>(Nucleus::createShl(lhs.value, rhs.value));
2205 }
2206
2207 RValue<UShort> operator>>(RValue<UShort> lhs, RValue<UShort> rhs)
2208 {
2209 return RValue<UShort>(Nucleus::createLShr(lhs.value, rhs.value));
2210 }
2211
Nicolas Capens96d4e092016-11-18 14:22:38 -05002212 RValue<UShort> operator+=(UShort &lhs, RValue<UShort> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002213 {
2214 return lhs = lhs + rhs;
2215 }
2216
Nicolas Capens96d4e092016-11-18 14:22:38 -05002217 RValue<UShort> operator-=(UShort &lhs, RValue<UShort> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002218 {
2219 return lhs = lhs - rhs;
2220 }
2221
Nicolas Capens96d4e092016-11-18 14:22:38 -05002222 RValue<UShort> operator*=(UShort &lhs, RValue<UShort> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002223 {
2224 return lhs = lhs * rhs;
2225 }
2226
Nicolas Capens96d4e092016-11-18 14:22:38 -05002227 RValue<UShort> operator/=(UShort &lhs, RValue<UShort> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002228 {
2229 return lhs = lhs / rhs;
2230 }
2231
Nicolas Capens96d4e092016-11-18 14:22:38 -05002232 RValue<UShort> operator%=(UShort &lhs, RValue<UShort> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002233 {
2234 return lhs = lhs % rhs;
2235 }
2236
Nicolas Capens96d4e092016-11-18 14:22:38 -05002237 RValue<UShort> operator&=(UShort &lhs, RValue<UShort> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002238 {
2239 return lhs = lhs & rhs;
2240 }
2241
Nicolas Capens96d4e092016-11-18 14:22:38 -05002242 RValue<UShort> operator|=(UShort &lhs, RValue<UShort> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002243 {
2244 return lhs = lhs | rhs;
2245 }
2246
Nicolas Capens96d4e092016-11-18 14:22:38 -05002247 RValue<UShort> operator^=(UShort &lhs, RValue<UShort> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002248 {
2249 return lhs = lhs ^ rhs;
2250 }
2251
Nicolas Capens96d4e092016-11-18 14:22:38 -05002252 RValue<UShort> operator<<=(UShort &lhs, RValue<UShort> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002253 {
2254 return lhs = lhs << rhs;
2255 }
2256
Nicolas Capens96d4e092016-11-18 14:22:38 -05002257 RValue<UShort> operator>>=(UShort &lhs, RValue<UShort> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002258 {
2259 return lhs = lhs >> rhs;
2260 }
2261
2262 RValue<UShort> operator+(RValue<UShort> val)
2263 {
2264 return val;
2265 }
2266
2267 RValue<UShort> operator-(RValue<UShort> val)
2268 {
2269 return RValue<UShort>(Nucleus::createNeg(val.value));
2270 }
2271
2272 RValue<UShort> operator~(RValue<UShort> val)
2273 {
2274 return RValue<UShort>(Nucleus::createNot(val.value));
2275 }
2276
Nicolas Capens96d4e092016-11-18 14:22:38 -05002277 RValue<UShort> operator++(UShort &val, int) // Post-increment
Nicolas Capens598f8d82016-09-26 15:09:10 -04002278 {
2279 RValue<UShort> res = val;
Nicolas Capensd1229402016-11-07 16:05:22 -05002280 val += UShort(1);
Nicolas Capens598f8d82016-09-26 15:09:10 -04002281 return res;
2282 }
2283
Nicolas Capens96d4e092016-11-18 14:22:38 -05002284 const UShort &operator++(UShort &val) // Pre-increment
Nicolas Capens598f8d82016-09-26 15:09:10 -04002285 {
Nicolas Capensd1229402016-11-07 16:05:22 -05002286 val += UShort(1);
Nicolas Capens598f8d82016-09-26 15:09:10 -04002287 return val;
2288 }
2289
Nicolas Capens96d4e092016-11-18 14:22:38 -05002290 RValue<UShort> operator--(UShort &val, int) // Post-decrement
Nicolas Capens598f8d82016-09-26 15:09:10 -04002291 {
2292 RValue<UShort> res = val;
Nicolas Capensd1229402016-11-07 16:05:22 -05002293 val -= UShort(1);
Nicolas Capens598f8d82016-09-26 15:09:10 -04002294 return res;
2295 }
2296
Nicolas Capens96d4e092016-11-18 14:22:38 -05002297 const UShort &operator--(UShort &val) // Pre-decrement
Nicolas Capens598f8d82016-09-26 15:09:10 -04002298 {
Nicolas Capensd1229402016-11-07 16:05:22 -05002299 val -= UShort(1);
Nicolas Capens598f8d82016-09-26 15:09:10 -04002300 return val;
2301 }
2302
2303 RValue<Bool> operator<(RValue<UShort> lhs, RValue<UShort> rhs)
2304 {
2305 return RValue<Bool>(Nucleus::createICmpULT(lhs.value, rhs.value));
2306 }
2307
2308 RValue<Bool> operator<=(RValue<UShort> lhs, RValue<UShort> rhs)
2309 {
2310 return RValue<Bool>(Nucleus::createICmpULE(lhs.value, rhs.value));
2311 }
2312
2313 RValue<Bool> operator>(RValue<UShort> lhs, RValue<UShort> rhs)
2314 {
2315 return RValue<Bool>(Nucleus::createICmpUGT(lhs.value, rhs.value));
2316 }
2317
2318 RValue<Bool> operator>=(RValue<UShort> lhs, RValue<UShort> rhs)
2319 {
2320 return RValue<Bool>(Nucleus::createICmpUGE(lhs.value, rhs.value));
2321 }
2322
2323 RValue<Bool> operator!=(RValue<UShort> lhs, RValue<UShort> rhs)
2324 {
2325 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
2326 }
2327
2328 RValue<Bool> operator==(RValue<UShort> lhs, RValue<UShort> rhs)
2329 {
2330 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
2331 }
2332
2333 Type *UShort::getType()
2334 {
Nicolas Capens4cfd4572016-10-20 01:00:19 -04002335 return T(Ice::IceType_i16);
Nicolas Capens598f8d82016-09-26 15:09:10 -04002336 }
2337
Nicolas Capens16b5f152016-10-13 13:39:01 -04002338 Byte4::Byte4(RValue<Byte8> cast)
2339 {
2340 // xyzw.parent = this;
2341
2342 storeValue(Nucleus::createBitCast(cast.value, getType()));
2343 }
2344
2345 Byte4::Byte4(const Reference<Byte4> &rhs)
2346 {
2347 // xyzw.parent = this;
2348
Nicolas Capensd1229402016-11-07 16:05:22 -05002349 Value *value = rhs.loadValue();
2350 storeValue(value);
Nicolas Capens16b5f152016-10-13 13:39:01 -04002351 }
2352
Nicolas Capens598f8d82016-09-26 15:09:10 -04002353 Type *Byte4::getType()
2354 {
Nicolas Capens23d99a42016-09-30 14:57:16 -04002355 return T(Type_v4i8);
Nicolas Capens598f8d82016-09-26 15:09:10 -04002356 }
2357
2358 Type *SByte4::getType()
2359 {
Nicolas Capens4cfd4572016-10-20 01:00:19 -04002360 return T(Type_v4i8);
Nicolas Capens598f8d82016-09-26 15:09:10 -04002361 }
2362
2363 Byte8::Byte8()
2364 {
Nicolas Capens598f8d82016-09-26 15:09:10 -04002365 }
2366
2367 Byte8::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)
2368 {
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04002369 int64_t constantVector[8] = {x0, x1, x2, x3, x4, x5, x6, x7};
2370 storeValue(Nucleus::createConstantVector(constantVector, getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002371 }
2372
2373 Byte8::Byte8(RValue<Byte8> rhs)
2374 {
Nicolas Capens598f8d82016-09-26 15:09:10 -04002375 storeValue(rhs.value);
2376 }
2377
2378 Byte8::Byte8(const Byte8 &rhs)
2379 {
Nicolas Capens598f8d82016-09-26 15:09:10 -04002380 Value *value = rhs.loadValue();
2381 storeValue(value);
2382 }
2383
2384 Byte8::Byte8(const Reference<Byte8> &rhs)
2385 {
Nicolas Capens598f8d82016-09-26 15:09:10 -04002386 Value *value = rhs.loadValue();
2387 storeValue(value);
2388 }
2389
Nicolas Capens96d4e092016-11-18 14:22:38 -05002390 RValue<Byte8> Byte8::operator=(RValue<Byte8> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002391 {
2392 storeValue(rhs.value);
2393
2394 return rhs;
2395 }
2396
Nicolas Capens96d4e092016-11-18 14:22:38 -05002397 RValue<Byte8> Byte8::operator=(const Byte8 &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002398 {
2399 Value *value = rhs.loadValue();
2400 storeValue(value);
2401
2402 return RValue<Byte8>(value);
2403 }
2404
Nicolas Capens96d4e092016-11-18 14:22:38 -05002405 RValue<Byte8> Byte8::operator=(const Reference<Byte8> &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002406 {
2407 Value *value = rhs.loadValue();
2408 storeValue(value);
2409
2410 return RValue<Byte8>(value);
2411 }
2412
2413 RValue<Byte8> operator+(RValue<Byte8> lhs, RValue<Byte8> rhs)
2414 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04002415 return RValue<Byte8>(Nucleus::createAdd(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002416 }
2417
2418 RValue<Byte8> operator-(RValue<Byte8> lhs, RValue<Byte8> rhs)
2419 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04002420 return RValue<Byte8>(Nucleus::createSub(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002421 }
2422
2423// RValue<Byte8> operator*(RValue<Byte8> lhs, RValue<Byte8> rhs)
2424// {
2425// return RValue<Byte8>(Nucleus::createMul(lhs.value, rhs.value));
2426// }
2427
2428// RValue<Byte8> operator/(RValue<Byte8> lhs, RValue<Byte8> rhs)
2429// {
2430// return RValue<Byte8>(Nucleus::createUDiv(lhs.value, rhs.value));
2431// }
2432
2433// RValue<Byte8> operator%(RValue<Byte8> lhs, RValue<Byte8> rhs)
2434// {
2435// return RValue<Byte8>(Nucleus::createURem(lhs.value, rhs.value));
2436// }
2437
2438 RValue<Byte8> operator&(RValue<Byte8> lhs, RValue<Byte8> rhs)
2439 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04002440 return RValue<Byte8>(Nucleus::createAnd(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002441 }
2442
2443 RValue<Byte8> operator|(RValue<Byte8> lhs, RValue<Byte8> rhs)
2444 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04002445 return RValue<Byte8>(Nucleus::createOr(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002446 }
2447
2448 RValue<Byte8> operator^(RValue<Byte8> lhs, RValue<Byte8> rhs)
2449 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04002450 return RValue<Byte8>(Nucleus::createXor(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002451 }
2452
2453// RValue<Byte8> operator<<(RValue<Byte8> lhs, unsigned char rhs)
2454// {
Nicolas Capens15060bb2016-12-05 22:17:19 -05002455// return RValue<Byte8>(Nucleus::createShl(lhs.value, V(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002456// }
2457
2458// RValue<Byte8> operator>>(RValue<Byte8> lhs, unsigned char rhs)
2459// {
Nicolas Capens15060bb2016-12-05 22:17:19 -05002460// return RValue<Byte8>(Nucleus::createLShr(lhs.value, V(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002461// }
2462
Nicolas Capens96d4e092016-11-18 14:22:38 -05002463 RValue<Byte8> operator+=(Byte8 &lhs, RValue<Byte8> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002464 {
2465 return lhs = lhs + rhs;
2466 }
2467
Nicolas Capens96d4e092016-11-18 14:22:38 -05002468 RValue<Byte8> operator-=(Byte8 &lhs, RValue<Byte8> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002469 {
2470 return lhs = lhs - rhs;
2471 }
2472
Nicolas Capens96d4e092016-11-18 14:22:38 -05002473// RValue<Byte8> operator*=(Byte8 &lhs, RValue<Byte8> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002474// {
2475// return lhs = lhs * rhs;
2476// }
2477
Nicolas Capens96d4e092016-11-18 14:22:38 -05002478// RValue<Byte8> operator/=(Byte8 &lhs, RValue<Byte8> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002479// {
2480// return lhs = lhs / rhs;
2481// }
2482
Nicolas Capens96d4e092016-11-18 14:22:38 -05002483// RValue<Byte8> operator%=(Byte8 &lhs, RValue<Byte8> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002484// {
2485// return lhs = lhs % rhs;
2486// }
2487
Nicolas Capens96d4e092016-11-18 14:22:38 -05002488 RValue<Byte8> operator&=(Byte8 &lhs, RValue<Byte8> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002489 {
2490 return lhs = lhs & rhs;
2491 }
2492
Nicolas Capens96d4e092016-11-18 14:22:38 -05002493 RValue<Byte8> operator|=(Byte8 &lhs, RValue<Byte8> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002494 {
2495 return lhs = lhs | rhs;
2496 }
2497
Nicolas Capens96d4e092016-11-18 14:22:38 -05002498 RValue<Byte8> operator^=(Byte8 &lhs, RValue<Byte8> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002499 {
2500 return lhs = lhs ^ rhs;
2501 }
2502
Nicolas Capens96d4e092016-11-18 14:22:38 -05002503// RValue<Byte8> operator<<=(Byte8 &lhs, RValue<Byte8> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002504// {
2505// return lhs = lhs << rhs;
2506// }
2507
Nicolas Capens96d4e092016-11-18 14:22:38 -05002508// RValue<Byte8> operator>>=(Byte8 &lhs, RValue<Byte8> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002509// {
2510// return lhs = lhs >> rhs;
2511// }
2512
2513// RValue<Byte8> operator+(RValue<Byte8> val)
2514// {
2515// return val;
2516// }
2517
2518// RValue<Byte8> operator-(RValue<Byte8> val)
2519// {
2520// return RValue<Byte8>(Nucleus::createNeg(val.value));
2521// }
2522
2523 RValue<Byte8> operator~(RValue<Byte8> val)
2524 {
2525 return RValue<Byte8>(Nucleus::createNot(val.value));
2526 }
2527
2528 RValue<Byte8> AddSat(RValue<Byte8> x, RValue<Byte8> y)
2529 {
Nicolas Capensc71bed22016-11-07 22:25:14 -05002530 Ice::Variable *result = ::function->makeVariable(Ice::IceType_v16i8);
2531 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::AddSaturateUnsigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
2532 auto target = ::context->getConstantUndef(Ice::IceType_i32);
2533 auto paddusb = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
2534 paddusb->addArg(x.value);
2535 paddusb->addArg(y.value);
2536 ::basicBlock->appendInst(paddusb);
2537
2538 return RValue<Byte8>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002539 }
2540
2541 RValue<Byte8> SubSat(RValue<Byte8> x, RValue<Byte8> y)
2542 {
Nicolas Capensc71bed22016-11-07 22:25:14 -05002543 Ice::Variable *result = ::function->makeVariable(Ice::IceType_v16i8);
2544 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::SubtractSaturateUnsigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
2545 auto target = ::context->getConstantUndef(Ice::IceType_i32);
2546 auto psubusw = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
2547 psubusw->addArg(x.value);
2548 psubusw->addArg(y.value);
2549 ::basicBlock->appendInst(psubusw);
2550
2551 return RValue<Byte8>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002552 }
2553
2554 RValue<Short4> Unpack(RValue<Byte4> x)
2555 {
Nicolas Capens37fbece2016-10-21 15:08:56 -04002556 int shuffle[16] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7}; // Real type is v16i8
2557 return RValue<Short4>(Nucleus::createShuffleVector(x.value, x.value, shuffle));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002558 }
2559
2560 RValue<Short4> UnpackLow(RValue<Byte8> x, RValue<Byte8> y)
2561 {
Nicolas Capens37fbece2016-10-21 15:08:56 -04002562 int shuffle[16] = {0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23}; // Real type is v16i8
2563 return RValue<Short4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002564 }
2565
2566 RValue<Short4> UnpackHigh(RValue<Byte8> x, RValue<Byte8> y)
2567 {
Nicolas Capens20e22c42016-10-25 17:32:37 -04002568 int shuffle[16] = {0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23}; // Real type is v16i8
2569 auto lowHigh = RValue<Byte16>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
2570 return As<Short4>(Swizzle(As<Int4>(lowHigh), 0xEE));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002571 }
2572
2573 RValue<Int> SignMask(RValue<Byte8> x)
2574 {
Nicolas Capensc71bed22016-11-07 22:25:14 -05002575 Ice::Variable *result = ::function->makeVariable(Ice::IceType_i32);
2576 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::SignMask, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
2577 auto target = ::context->getConstantUndef(Ice::IceType_i32);
2578 auto movmsk = Ice::InstIntrinsicCall::create(::function, 1, result, target, intrinsic);
2579 movmsk->addArg(x.value);
2580 ::basicBlock->appendInst(movmsk);
2581
2582 return RValue<Int>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002583 }
2584
2585// RValue<Byte8> CmpGT(RValue<Byte8> x, RValue<Byte8> y)
2586// {
Nicolas Capens2f970b62016-11-08 14:28:59 -05002587// return RValue<Byte8>(createIntCompare(Ice::InstIcmp::Ugt, x.value, y.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002588// }
2589
2590 RValue<Byte8> CmpEQ(RValue<Byte8> x, RValue<Byte8> y)
2591 {
Nicolas Capens2f970b62016-11-08 14:28:59 -05002592 return RValue<Byte8>(Nucleus::createSExt(Nucleus::createICmpEQ(x.value, y.value), Int4::getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002593 }
2594
2595 Type *Byte8::getType()
2596 {
Nicolas Capens23d99a42016-09-30 14:57:16 -04002597 return T(Type_v8i8);
Nicolas Capens598f8d82016-09-26 15:09:10 -04002598 }
2599
2600 SByte8::SByte8()
2601 {
2602 // xyzw.parent = this;
2603 }
2604
2605 SByte8::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)
2606 {
2607 // xyzw.parent = this;
2608
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04002609 int64_t constantVector[8] = { x0, x1, x2, x3, x4, x5, x6, x7 };
2610 Value *vector = V(Nucleus::createConstantVector(constantVector, getType()));
2611
2612 storeValue(Nucleus::createBitCast(vector, getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002613 }
2614
Nicolas Capens598f8d82016-09-26 15:09:10 -04002615 SByte8::SByte8(RValue<SByte8> rhs)
2616 {
2617 // xyzw.parent = this;
2618
2619 storeValue(rhs.value);
2620 }
2621
2622 SByte8::SByte8(const SByte8 &rhs)
2623 {
2624 // xyzw.parent = this;
2625
2626 Value *value = rhs.loadValue();
2627 storeValue(value);
2628 }
2629
2630 SByte8::SByte8(const Reference<SByte8> &rhs)
2631 {
2632 // xyzw.parent = this;
2633
2634 Value *value = rhs.loadValue();
2635 storeValue(value);
2636 }
2637
Nicolas Capens96d4e092016-11-18 14:22:38 -05002638 RValue<SByte8> SByte8::operator=(RValue<SByte8> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002639 {
2640 storeValue(rhs.value);
2641
2642 return rhs;
2643 }
2644
Nicolas Capens96d4e092016-11-18 14:22:38 -05002645 RValue<SByte8> SByte8::operator=(const SByte8 &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002646 {
2647 Value *value = rhs.loadValue();
2648 storeValue(value);
2649
2650 return RValue<SByte8>(value);
2651 }
2652
Nicolas Capens96d4e092016-11-18 14:22:38 -05002653 RValue<SByte8> SByte8::operator=(const Reference<SByte8> &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002654 {
2655 Value *value = rhs.loadValue();
2656 storeValue(value);
2657
2658 return RValue<SByte8>(value);
2659 }
2660
2661 RValue<SByte8> operator+(RValue<SByte8> lhs, RValue<SByte8> rhs)
2662 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04002663 return RValue<SByte8>(Nucleus::createAdd(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002664 }
2665
2666 RValue<SByte8> operator-(RValue<SByte8> lhs, RValue<SByte8> rhs)
2667 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04002668 return RValue<SByte8>(Nucleus::createSub(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002669 }
2670
2671// RValue<SByte8> operator*(RValue<SByte8> lhs, RValue<SByte8> rhs)
2672// {
2673// return RValue<SByte8>(Nucleus::createMul(lhs.value, rhs.value));
2674// }
2675
2676// RValue<SByte8> operator/(RValue<SByte8> lhs, RValue<SByte8> rhs)
2677// {
2678// return RValue<SByte8>(Nucleus::createSDiv(lhs.value, rhs.value));
2679// }
2680
2681// RValue<SByte8> operator%(RValue<SByte8> lhs, RValue<SByte8> rhs)
2682// {
2683// return RValue<SByte8>(Nucleus::createSRem(lhs.value, rhs.value));
2684// }
2685
2686 RValue<SByte8> operator&(RValue<SByte8> lhs, RValue<SByte8> rhs)
2687 {
2688 return RValue<SByte8>(Nucleus::createAnd(lhs.value, rhs.value));
2689 }
2690
2691 RValue<SByte8> operator|(RValue<SByte8> lhs, RValue<SByte8> rhs)
2692 {
2693 return RValue<SByte8>(Nucleus::createOr(lhs.value, rhs.value));
2694 }
2695
2696 RValue<SByte8> operator^(RValue<SByte8> lhs, RValue<SByte8> rhs)
2697 {
2698 return RValue<SByte8>(Nucleus::createXor(lhs.value, rhs.value));
2699 }
2700
2701// RValue<SByte8> operator<<(RValue<SByte8> lhs, unsigned char rhs)
2702// {
Nicolas Capens15060bb2016-12-05 22:17:19 -05002703// return RValue<SByte8>(Nucleus::createShl(lhs.value, V(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002704// }
2705
2706// RValue<SByte8> operator>>(RValue<SByte8> lhs, unsigned char rhs)
2707// {
Nicolas Capens15060bb2016-12-05 22:17:19 -05002708// return RValue<SByte8>(Nucleus::createAShr(lhs.value, V(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002709// }
2710
Nicolas Capens96d4e092016-11-18 14:22:38 -05002711 RValue<SByte8> operator+=(SByte8 &lhs, RValue<SByte8> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002712 {
2713 return lhs = lhs + rhs;
2714 }
2715
Nicolas Capens96d4e092016-11-18 14:22:38 -05002716 RValue<SByte8> operator-=(SByte8 &lhs, RValue<SByte8> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002717 {
2718 return lhs = lhs - rhs;
2719 }
2720
Nicolas Capens96d4e092016-11-18 14:22:38 -05002721// RValue<SByte8> operator*=(SByte8 &lhs, RValue<SByte8> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002722// {
2723// return lhs = lhs * rhs;
2724// }
2725
Nicolas Capens96d4e092016-11-18 14:22:38 -05002726// RValue<SByte8> operator/=(SByte8 &lhs, RValue<SByte8> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002727// {
2728// return lhs = lhs / rhs;
2729// }
2730
Nicolas Capens96d4e092016-11-18 14:22:38 -05002731// RValue<SByte8> operator%=(SByte8 &lhs, RValue<SByte8> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002732// {
2733// return lhs = lhs % rhs;
2734// }
2735
Nicolas Capens96d4e092016-11-18 14:22:38 -05002736 RValue<SByte8> operator&=(SByte8 &lhs, RValue<SByte8> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002737 {
2738 return lhs = lhs & rhs;
2739 }
2740
Nicolas Capens96d4e092016-11-18 14:22:38 -05002741 RValue<SByte8> operator|=(SByte8 &lhs, RValue<SByte8> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002742 {
2743 return lhs = lhs | rhs;
2744 }
2745
Nicolas Capens96d4e092016-11-18 14:22:38 -05002746 RValue<SByte8> operator^=(SByte8 &lhs, RValue<SByte8> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002747 {
2748 return lhs = lhs ^ rhs;
2749 }
2750
Nicolas Capens96d4e092016-11-18 14:22:38 -05002751// RValue<SByte8> operator<<=(SByte8 &lhs, RValue<SByte8> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002752// {
2753// return lhs = lhs << rhs;
2754// }
2755
Nicolas Capens96d4e092016-11-18 14:22:38 -05002756// RValue<SByte8> operator>>=(SByte8 &lhs, RValue<SByte8> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002757// {
2758// return lhs = lhs >> rhs;
2759// }
2760
2761// RValue<SByte8> operator+(RValue<SByte8> val)
2762// {
2763// return val;
2764// }
2765
2766// RValue<SByte8> operator-(RValue<SByte8> val)
2767// {
2768// return RValue<SByte8>(Nucleus::createNeg(val.value));
2769// }
2770
2771 RValue<SByte8> operator~(RValue<SByte8> val)
2772 {
2773 return RValue<SByte8>(Nucleus::createNot(val.value));
2774 }
2775
2776 RValue<SByte8> AddSat(RValue<SByte8> x, RValue<SByte8> y)
2777 {
Nicolas Capensc71bed22016-11-07 22:25:14 -05002778 Ice::Variable *result = ::function->makeVariable(Ice::IceType_v16i8);
2779 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::AddSaturateSigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
2780 auto target = ::context->getConstantUndef(Ice::IceType_i32);
2781 auto paddsb = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
2782 paddsb->addArg(x.value);
2783 paddsb->addArg(y.value);
2784 ::basicBlock->appendInst(paddsb);
2785
2786 return RValue<SByte8>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002787 }
2788
2789 RValue<SByte8> SubSat(RValue<SByte8> x, RValue<SByte8> y)
2790 {
Nicolas Capensc71bed22016-11-07 22:25:14 -05002791 Ice::Variable *result = ::function->makeVariable(Ice::IceType_v16i8);
2792 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::SubtractSaturateSigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
2793 auto target = ::context->getConstantUndef(Ice::IceType_i32);
2794 auto psubsb = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
2795 psubsb->addArg(x.value);
2796 psubsb->addArg(y.value);
2797 ::basicBlock->appendInst(psubsb);
2798
2799 return RValue<SByte8>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002800 }
2801
2802 RValue<Short4> UnpackLow(RValue<SByte8> x, RValue<SByte8> y)
2803 {
Nicolas Capens37fbece2016-10-21 15:08:56 -04002804 int shuffle[16] = {0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23}; // Real type is v16i8
2805 return RValue<Short4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002806 }
2807
2808 RValue<Short4> UnpackHigh(RValue<SByte8> x, RValue<SByte8> y)
2809 {
Nicolas Capens20e22c42016-10-25 17:32:37 -04002810 int shuffle[16] = {0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23}; // Real type is v16i8
2811 auto lowHigh = RValue<Byte16>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
2812 return As<Short4>(Swizzle(As<Int4>(lowHigh), 0xEE));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002813 }
2814
2815 RValue<Int> SignMask(RValue<SByte8> x)
2816 {
Nicolas Capensf2cb9df2016-10-21 17:26:13 -04002817 Ice::Variable *result = ::function->makeVariable(Ice::IceType_i32);
2818 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::SignMask, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
2819 auto target = ::context->getConstantUndef(Ice::IceType_i32);
2820 auto movmsk = Ice::InstIntrinsicCall::create(::function, 1, result, target, intrinsic);
2821 movmsk->addArg(x.value);
2822 ::basicBlock->appendInst(movmsk);
2823
2824 return RValue<Int>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002825 }
2826
2827 RValue<Byte8> CmpGT(RValue<SByte8> x, RValue<SByte8> y)
2828 {
Nicolas Capens2f970b62016-11-08 14:28:59 -05002829 return RValue<Byte8>(createIntCompare(Ice::InstIcmp::Sgt, x.value, y.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002830 }
2831
2832 RValue<Byte8> CmpEQ(RValue<SByte8> x, RValue<SByte8> y)
2833 {
Nicolas Capens2f970b62016-11-08 14:28:59 -05002834 return RValue<Byte8>(Nucleus::createSExt(Nucleus::createICmpEQ(x.value, y.value), Int4::getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002835 }
2836
2837 Type *SByte8::getType()
2838 {
Nicolas Capens4cfd4572016-10-20 01:00:19 -04002839 return T(Type_v8i8);
Nicolas Capens598f8d82016-09-26 15:09:10 -04002840 }
2841
2842 Byte16::Byte16(RValue<Byte16> rhs)
2843 {
2844 // xyzw.parent = this;
2845
2846 storeValue(rhs.value);
2847 }
2848
2849 Byte16::Byte16(const Byte16 &rhs)
2850 {
2851 // xyzw.parent = this;
2852
2853 Value *value = rhs.loadValue();
2854 storeValue(value);
2855 }
2856
2857 Byte16::Byte16(const Reference<Byte16> &rhs)
2858 {
2859 // xyzw.parent = this;
2860
2861 Value *value = rhs.loadValue();
2862 storeValue(value);
2863 }
2864
Nicolas Capens96d4e092016-11-18 14:22:38 -05002865 RValue<Byte16> Byte16::operator=(RValue<Byte16> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002866 {
2867 storeValue(rhs.value);
2868
2869 return rhs;
2870 }
2871
Nicolas Capens96d4e092016-11-18 14:22:38 -05002872 RValue<Byte16> Byte16::operator=(const Byte16 &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002873 {
2874 Value *value = rhs.loadValue();
2875 storeValue(value);
2876
2877 return RValue<Byte16>(value);
2878 }
2879
Nicolas Capens96d4e092016-11-18 14:22:38 -05002880 RValue<Byte16> Byte16::operator=(const Reference<Byte16> &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04002881 {
2882 Value *value = rhs.loadValue();
2883 storeValue(value);
2884
2885 return RValue<Byte16>(value);
2886 }
2887
2888 Type *Byte16::getType()
2889 {
Nicolas Capens23d99a42016-09-30 14:57:16 -04002890 return T(Ice::IceType_v16i8);
Nicolas Capens598f8d82016-09-26 15:09:10 -04002891 }
2892
2893 Type *SByte16::getType()
2894 {
Nicolas Capens23d99a42016-09-30 14:57:16 -04002895 return T(Ice::IceType_v16i8);
Nicolas Capens598f8d82016-09-26 15:09:10 -04002896 }
2897
Nicolas Capens16b5f152016-10-13 13:39:01 -04002898 Short2::Short2(RValue<Short4> cast)
2899 {
Nicolas Capensc70a1162016-12-03 00:16:14 -05002900 storeValue(Nucleus::createBitCast(cast.value, getType()));
Nicolas Capens16b5f152016-10-13 13:39:01 -04002901 }
2902
2903 Type *Short2::getType()
2904 {
Nicolas Capens23d99a42016-09-30 14:57:16 -04002905 return T(Type_v2i16);
Nicolas Capens16b5f152016-10-13 13:39:01 -04002906 }
2907
2908 UShort2::UShort2(RValue<UShort4> cast)
2909 {
Nicolas Capensc70a1162016-12-03 00:16:14 -05002910 storeValue(Nucleus::createBitCast(cast.value, getType()));
Nicolas Capens16b5f152016-10-13 13:39:01 -04002911 }
2912
2913 Type *UShort2::getType()
2914 {
Nicolas Capens23d99a42016-09-30 14:57:16 -04002915 return T(Type_v2i16);
Nicolas Capens16b5f152016-10-13 13:39:01 -04002916 }
2917
Nicolas Capens598f8d82016-09-26 15:09:10 -04002918 Short4::Short4(RValue<Int> cast)
2919 {
Nicolas Capensd4227962016-11-09 14:24:25 -05002920 Value *vector = loadValue();
2921 Value *insert = Nucleus::createInsertElement(vector, cast.value, 0);
2922 Value *swizzle = Swizzle(RValue<Short4>(insert), 0x00).value;
Nicolas Capens598f8d82016-09-26 15:09:10 -04002923
2924 storeValue(swizzle);
2925 }
2926
2927 Short4::Short4(RValue<Int4> cast)
2928 {
Nicolas Capensd4227962016-11-09 14:24:25 -05002929 int pshufb[16] = {0, 1, 4, 5, 8, 9, 12, 13, 0, 1, 4, 5, 8, 9, 12, 13};
2930 Value *byte16 = Nucleus::createBitCast(cast.value, Byte16::getType());
2931 Value *packed = Nucleus::createShuffleVector(byte16, byte16, pshufb);
2932
2933 Value *int2 = RValue<Int2>(Int2(RValue<Int4>(packed))).value;
2934 Value *short4 = Nucleus::createBitCast(int2, Short4::getType());
2935
2936 storeValue(short4);
Nicolas Capens598f8d82016-09-26 15:09:10 -04002937 }
2938
2939// Short4::Short4(RValue<Float> cast)
2940// {
2941// }
2942
2943 Short4::Short4(RValue<Float4> cast)
2944 {
2945 assert(false && "UNIMPLEMENTED");
2946 }
2947
2948 Short4::Short4()
2949 {
2950 // xyzw.parent = this;
2951 }
2952
2953 Short4::Short4(short xyzw)
2954 {
2955 // xyzw.parent = this;
2956
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04002957 int64_t constantVector[4] = {xyzw, xyzw, xyzw, xyzw};
2958 storeValue(Nucleus::createConstantVector(constantVector, getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002959 }
2960
2961 Short4::Short4(short x, short y, short z, short w)
2962 {
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04002963 // xyzw.parent = this;
Nicolas Capens598f8d82016-09-26 15:09:10 -04002964
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04002965 int64_t constantVector[4] = {x, y, z, w};
2966 storeValue(Nucleus::createConstantVector(constantVector, getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002967 }
2968
2969 Short4::Short4(RValue<Short4> rhs)
2970 {
2971 // xyzw.parent = this;
2972
2973 storeValue(rhs.value);
2974 }
2975
2976 Short4::Short4(const Short4 &rhs)
2977 {
2978 // xyzw.parent = this;
2979
2980 Value *value = rhs.loadValue();
2981 storeValue(value);
2982 }
2983
2984 Short4::Short4(const Reference<Short4> &rhs)
2985 {
2986 // xyzw.parent = this;
2987
2988 Value *value = rhs.loadValue();
2989 storeValue(value);
2990 }
2991
2992 Short4::Short4(RValue<UShort4> rhs)
2993 {
2994 // xyzw.parent = this;
2995
2996 storeValue(rhs.value);
2997 }
2998
2999 Short4::Short4(const UShort4 &rhs)
3000 {
3001 // xyzw.parent = this;
3002
3003 storeValue(rhs.loadValue());
3004 }
3005
3006 Short4::Short4(const Reference<UShort4> &rhs)
3007 {
3008 // xyzw.parent = this;
3009
3010 storeValue(rhs.loadValue());
3011 }
3012
Nicolas Capens96d4e092016-11-18 14:22:38 -05003013 RValue<Short4> Short4::operator=(RValue<Short4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003014 {
3015 storeValue(rhs.value);
3016
3017 return rhs;
3018 }
3019
Nicolas Capens96d4e092016-11-18 14:22:38 -05003020 RValue<Short4> Short4::operator=(const Short4 &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003021 {
3022 Value *value = rhs.loadValue();
3023 storeValue(value);
3024
3025 return RValue<Short4>(value);
3026 }
3027
Nicolas Capens96d4e092016-11-18 14:22:38 -05003028 RValue<Short4> Short4::operator=(const Reference<Short4> &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003029 {
3030 Value *value = rhs.loadValue();
3031 storeValue(value);
3032
3033 return RValue<Short4>(value);
3034 }
3035
Nicolas Capens96d4e092016-11-18 14:22:38 -05003036 RValue<Short4> Short4::operator=(RValue<UShort4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003037 {
3038 storeValue(rhs.value);
3039
3040 return RValue<Short4>(rhs);
3041 }
3042
Nicolas Capens96d4e092016-11-18 14:22:38 -05003043 RValue<Short4> Short4::operator=(const UShort4 &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003044 {
3045 Value *value = rhs.loadValue();
3046 storeValue(value);
3047
3048 return RValue<Short4>(value);
3049 }
3050
Nicolas Capens96d4e092016-11-18 14:22:38 -05003051 RValue<Short4> Short4::operator=(const Reference<UShort4> &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003052 {
3053 Value *value = rhs.loadValue();
3054 storeValue(value);
3055
3056 return RValue<Short4>(value);
3057 }
3058
3059 RValue<Short4> operator+(RValue<Short4> lhs, RValue<Short4> rhs)
3060 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04003061 return RValue<Short4>(Nucleus::createAdd(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003062 }
3063
3064 RValue<Short4> operator-(RValue<Short4> lhs, RValue<Short4> rhs)
3065 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04003066 return RValue<Short4>(Nucleus::createSub(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003067 }
3068
3069 RValue<Short4> operator*(RValue<Short4> lhs, RValue<Short4> rhs)
3070 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04003071 return RValue<Short4>(Nucleus::createMul(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003072 }
3073
3074// RValue<Short4> operator/(RValue<Short4> lhs, RValue<Short4> rhs)
3075// {
3076// return RValue<Short4>(Nucleus::createSDiv(lhs.value, rhs.value));
3077// }
3078
3079// RValue<Short4> operator%(RValue<Short4> lhs, RValue<Short4> rhs)
3080// {
3081// return RValue<Short4>(Nucleus::createSRem(lhs.value, rhs.value));
3082// }
3083
3084 RValue<Short4> operator&(RValue<Short4> lhs, RValue<Short4> rhs)
3085 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04003086 return RValue<Short4>(Nucleus::createAnd(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003087 }
3088
3089 RValue<Short4> operator|(RValue<Short4> lhs, RValue<Short4> rhs)
3090 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04003091 return RValue<Short4>(Nucleus::createOr(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003092 }
3093
3094 RValue<Short4> operator^(RValue<Short4> lhs, RValue<Short4> rhs)
3095 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04003096 return RValue<Short4>(Nucleus::createXor(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003097 }
3098
3099 RValue<Short4> operator<<(RValue<Short4> lhs, unsigned char rhs)
3100 {
Nicolas Capens15060bb2016-12-05 22:17:19 -05003101 return RValue<Short4>(Nucleus::createShl(lhs.value, V(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003102 }
3103
3104 RValue<Short4> operator>>(RValue<Short4> lhs, unsigned char rhs)
3105 {
Nicolas Capens15060bb2016-12-05 22:17:19 -05003106 return RValue<Short4>(Nucleus::createAShr(lhs.value, V(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003107 }
3108
Nicolas Capens96d4e092016-11-18 14:22:38 -05003109 RValue<Short4> operator+=(Short4 &lhs, RValue<Short4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003110 {
3111 return lhs = lhs + rhs;
3112 }
3113
Nicolas Capens96d4e092016-11-18 14:22:38 -05003114 RValue<Short4> operator-=(Short4 &lhs, RValue<Short4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003115 {
3116 return lhs = lhs - rhs;
3117 }
3118
Nicolas Capens96d4e092016-11-18 14:22:38 -05003119 RValue<Short4> operator*=(Short4 &lhs, RValue<Short4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003120 {
3121 return lhs = lhs * rhs;
3122 }
3123
Nicolas Capens96d4e092016-11-18 14:22:38 -05003124// RValue<Short4> operator/=(Short4 &lhs, RValue<Short4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003125// {
3126// return lhs = lhs / rhs;
3127// }
3128
Nicolas Capens96d4e092016-11-18 14:22:38 -05003129// RValue<Short4> operator%=(Short4 &lhs, RValue<Short4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003130// {
3131// return lhs = lhs % rhs;
3132// }
3133
Nicolas Capens96d4e092016-11-18 14:22:38 -05003134 RValue<Short4> operator&=(Short4 &lhs, RValue<Short4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003135 {
3136 return lhs = lhs & rhs;
3137 }
3138
Nicolas Capens96d4e092016-11-18 14:22:38 -05003139 RValue<Short4> operator|=(Short4 &lhs, RValue<Short4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003140 {
3141 return lhs = lhs | rhs;
3142 }
3143
Nicolas Capens96d4e092016-11-18 14:22:38 -05003144 RValue<Short4> operator^=(Short4 &lhs, RValue<Short4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003145 {
3146 return lhs = lhs ^ rhs;
3147 }
3148
Nicolas Capens96d4e092016-11-18 14:22:38 -05003149 RValue<Short4> operator<<=(Short4 &lhs, unsigned char rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003150 {
3151 return lhs = lhs << rhs;
3152 }
3153
Nicolas Capens96d4e092016-11-18 14:22:38 -05003154 RValue<Short4> operator>>=(Short4 &lhs, unsigned char rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003155 {
3156 return lhs = lhs >> rhs;
3157 }
3158
Nicolas Capens598f8d82016-09-26 15:09:10 -04003159// RValue<Short4> operator+(RValue<Short4> val)
3160// {
3161// return val;
3162// }
3163
3164 RValue<Short4> operator-(RValue<Short4> val)
3165 {
Nicolas Capensc5c0c332016-11-08 11:37:01 -05003166 return RValue<Short4>(Nucleus::createNeg(val.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003167 }
3168
3169 RValue<Short4> operator~(RValue<Short4> val)
3170 {
Nicolas Capensc5c0c332016-11-08 11:37:01 -05003171 return RValue<Short4>(Nucleus::createNot(val.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003172 }
3173
3174 RValue<Short4> RoundShort4(RValue<Float4> cast)
3175 {
Nicolas Capensd4227962016-11-09 14:24:25 -05003176 RValue<Int4> int4 = RoundInt(cast);
3177 return As<Short4>(Pack(int4, int4));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003178 }
3179
3180 RValue<Short4> Max(RValue<Short4> x, RValue<Short4> y)
3181 {
Nicolas Capens53a8a3f2016-10-26 00:23:12 -04003182 Ice::Variable *condition = ::function->makeVariable(Ice::IceType_v8i1);
3183 auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Sle, condition, x.value, y.value);
3184 ::basicBlock->appendInst(cmp);
3185
3186 Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16);
3187 auto select = Ice::InstSelect::create(::function, result, condition, y.value, x.value);
3188 ::basicBlock->appendInst(select);
3189
3190 return RValue<Short4>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003191 }
3192
3193 RValue<Short4> Min(RValue<Short4> x, RValue<Short4> y)
3194 {
Nicolas Capens53a8a3f2016-10-26 00:23:12 -04003195 Ice::Variable *condition = ::function->makeVariable(Ice::IceType_v8i1);
3196 auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Sgt, condition, x.value, y.value);
3197 ::basicBlock->appendInst(cmp);
3198
3199 Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16);
3200 auto select = Ice::InstSelect::create(::function, result, condition, y.value, x.value);
3201 ::basicBlock->appendInst(select);
3202
3203 return RValue<Short4>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003204 }
3205
3206 RValue<Short4> AddSat(RValue<Short4> x, RValue<Short4> y)
3207 {
Nicolas Capensc71bed22016-11-07 22:25:14 -05003208 Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16);
3209 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::AddSaturateSigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
3210 auto target = ::context->getConstantUndef(Ice::IceType_i32);
3211 auto paddsw = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
3212 paddsw->addArg(x.value);
3213 paddsw->addArg(y.value);
3214 ::basicBlock->appendInst(paddsw);
3215
3216 return RValue<Short4>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003217 }
3218
3219 RValue<Short4> SubSat(RValue<Short4> x, RValue<Short4> y)
3220 {
Nicolas Capensc71bed22016-11-07 22:25:14 -05003221 Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16);
3222 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::SubtractSaturateSigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
3223 auto target = ::context->getConstantUndef(Ice::IceType_i32);
3224 auto psubsw = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
3225 psubsw->addArg(x.value);
3226 psubsw->addArg(y.value);
3227 ::basicBlock->appendInst(psubsw);
3228
3229 return RValue<Short4>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003230 }
3231
3232 RValue<Short4> MulHigh(RValue<Short4> x, RValue<Short4> y)
3233 {
Nicolas Capensc71bed22016-11-07 22:25:14 -05003234 Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16);
3235 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::MultiplyHighSigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
3236 auto target = ::context->getConstantUndef(Ice::IceType_i32);
3237 auto pmulhw = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
3238 pmulhw->addArg(x.value);
3239 pmulhw->addArg(y.value);
3240 ::basicBlock->appendInst(pmulhw);
3241
Nicolas Capens5b41ba32016-12-08 14:34:00 -05003242 return RValue<Short4>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003243 }
3244
3245 RValue<Int2> MulAdd(RValue<Short4> x, RValue<Short4> y)
3246 {
Nicolas Capensc71bed22016-11-07 22:25:14 -05003247 Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16);
3248 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::MultiplyAddPairs, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
3249 auto target = ::context->getConstantUndef(Ice::IceType_i32);
3250 auto pmaddwd = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
3251 pmaddwd->addArg(x.value);
3252 pmaddwd->addArg(y.value);
3253 ::basicBlock->appendInst(pmaddwd);
3254
3255 return RValue<Int2>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003256 }
3257
3258 RValue<SByte8> Pack(RValue<Short4> x, RValue<Short4> y)
3259 {
Nicolas Capensec54a172016-10-25 17:32:37 -04003260 Ice::Variable *result = ::function->makeVariable(Ice::IceType_v16i8);
3261 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::VectorPackSigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
3262 auto target = ::context->getConstantUndef(Ice::IceType_i32);
3263 auto pack = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
3264 pack->addArg(x.value);
3265 pack->addArg(y.value);
3266 ::basicBlock->appendInst(pack);
3267
Nicolas Capens70dfff42016-10-27 10:20:28 -04003268 return As<SByte8>(Swizzle(As<Int4>(V(result)), 0x88));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003269 }
3270
3271 RValue<Int2> UnpackLow(RValue<Short4> x, RValue<Short4> y)
3272 {
Nicolas Capens37fbece2016-10-21 15:08:56 -04003273 int shuffle[8] = {0, 8, 1, 9, 2, 10, 3, 11}; // Real type is v8i16
3274 return RValue<Int2>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003275 }
3276
3277 RValue<Int2> UnpackHigh(RValue<Short4> x, RValue<Short4> y)
3278 {
Nicolas Capens20e22c42016-10-25 17:32:37 -04003279 int shuffle[8] = {0, 8, 1, 9, 2, 10, 3, 11}; // Real type is v8i16
3280 auto lowHigh = RValue<Short8>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
3281 return As<Int2>(Swizzle(As<Int4>(lowHigh), 0xEE));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003282 }
3283
3284 RValue<Short4> Swizzle(RValue<Short4> x, unsigned char select)
3285 {
Nicolas Capens37fbece2016-10-21 15:08:56 -04003286 // Real type is v8i16
3287 int shuffle[8] =
3288 {
3289 (select >> 0) & 0x03,
3290 (select >> 2) & 0x03,
3291 (select >> 4) & 0x03,
3292 (select >> 6) & 0x03,
3293 (select >> 0) & 0x03,
3294 (select >> 2) & 0x03,
3295 (select >> 4) & 0x03,
3296 (select >> 6) & 0x03,
3297 };
3298
3299 return RValue<Short4>(Nucleus::createShuffleVector(x.value, x.value, shuffle));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003300 }
3301
3302 RValue<Short4> Insert(RValue<Short4> val, RValue<Short> element, int i)
3303 {
Nicolas Capensc94ab742016-11-08 15:15:31 -05003304 return RValue<Short4>(Nucleus::createInsertElement(val.value, element.value, i));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003305 }
3306
3307 RValue<Short> Extract(RValue<Short4> val, int i)
3308 {
Nicolas Capensc94ab742016-11-08 15:15:31 -05003309 return RValue<Short>(Nucleus::createExtractElement(val.value, Int::getType(), i));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003310 }
3311
3312 RValue<Short4> CmpGT(RValue<Short4> x, RValue<Short4> y)
3313 {
Nicolas Capens2f970b62016-11-08 14:28:59 -05003314 return RValue<Short4>(createIntCompare(Ice::InstIcmp::Sgt, x.value, y.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003315 }
3316
3317 RValue<Short4> CmpEQ(RValue<Short4> x, RValue<Short4> y)
3318 {
Nicolas Capens2f970b62016-11-08 14:28:59 -05003319 return RValue<Short4>(Nucleus::createSExt(Nucleus::createICmpEQ(x.value, y.value), Int4::getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003320 }
3321
3322 Type *Short4::getType()
3323 {
Nicolas Capens23d99a42016-09-30 14:57:16 -04003324 return T(Type_v4i16);
Nicolas Capens598f8d82016-09-26 15:09:10 -04003325 }
3326
3327 UShort4::UShort4(RValue<Int4> cast)
3328 {
3329 *this = Short4(cast);
3330 }
3331
3332 UShort4::UShort4(RValue<Float4> cast, bool saturate)
3333 {
Nicolas Capensd4227962016-11-09 14:24:25 -05003334 if(saturate)
3335 {
3336 if(true) // SSE 4.1
3337 {
3338 Int4 int4(Min(cast, Float4(0xFFFF))); // packusdw takes care of 0x0000 saturation
3339 *this = As<Short4>(Pack(As<UInt4>(int4), As<UInt4>(int4)));
3340 }
3341 else
3342 {
3343 *this = Short4(Int4(Max(Min(cast, Float4(0xFFFF)), Float4(0x0000))));
3344 }
3345 }
3346 else
3347 {
3348 *this = Short4(Int4(cast));
3349 }
Nicolas Capens598f8d82016-09-26 15:09:10 -04003350 }
3351
3352 UShort4::UShort4()
3353 {
3354 // xyzw.parent = this;
3355 }
3356
3357 UShort4::UShort4(unsigned short xyzw)
3358 {
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04003359 // xyzw.parent = this;
Nicolas Capens598f8d82016-09-26 15:09:10 -04003360
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04003361 int64_t constantVector[4] = {xyzw, xyzw, xyzw, xyzw};
3362 storeValue(Nucleus::createConstantVector(constantVector, getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003363 }
3364
3365 UShort4::UShort4(unsigned short x, unsigned short y, unsigned short z, unsigned short w)
3366 {
3367 // xyzw.parent = this;
3368
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04003369 int64_t constantVector[4] = {x, y, z, w};
3370 storeValue(Nucleus::createConstantVector(constantVector, getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003371 }
3372
3373 UShort4::UShort4(RValue<UShort4> rhs)
3374 {
3375 // xyzw.parent = this;
3376
3377 storeValue(rhs.value);
3378 }
3379
3380 UShort4::UShort4(const UShort4 &rhs)
3381 {
3382 // xyzw.parent = this;
3383
3384 Value *value = rhs.loadValue();
3385 storeValue(value);
3386 }
3387
3388 UShort4::UShort4(const Reference<UShort4> &rhs)
3389 {
3390 // xyzw.parent = this;
3391
3392 Value *value = rhs.loadValue();
3393 storeValue(value);
3394 }
3395
3396 UShort4::UShort4(RValue<Short4> rhs)
3397 {
3398 // xyzw.parent = this;
3399
3400 storeValue(rhs.value);
3401 }
3402
3403 UShort4::UShort4(const Short4 &rhs)
3404 {
3405 // xyzw.parent = this;
3406
3407 Value *value = rhs.loadValue();
3408 storeValue(value);
3409 }
3410
3411 UShort4::UShort4(const Reference<Short4> &rhs)
3412 {
3413 // xyzw.parent = this;
3414
3415 Value *value = rhs.loadValue();
3416 storeValue(value);
3417 }
3418
Nicolas Capens96d4e092016-11-18 14:22:38 -05003419 RValue<UShort4> UShort4::operator=(RValue<UShort4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003420 {
3421 storeValue(rhs.value);
3422
3423 return rhs;
3424 }
3425
Nicolas Capens96d4e092016-11-18 14:22:38 -05003426 RValue<UShort4> UShort4::operator=(const UShort4 &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003427 {
3428 Value *value = rhs.loadValue();
3429 storeValue(value);
3430
3431 return RValue<UShort4>(value);
3432 }
3433
Nicolas Capens96d4e092016-11-18 14:22:38 -05003434 RValue<UShort4> UShort4::operator=(const Reference<UShort4> &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003435 {
3436 Value *value = rhs.loadValue();
3437 storeValue(value);
3438
3439 return RValue<UShort4>(value);
3440 }
3441
Nicolas Capens96d4e092016-11-18 14:22:38 -05003442 RValue<UShort4> UShort4::operator=(RValue<Short4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003443 {
3444 storeValue(rhs.value);
3445
3446 return RValue<UShort4>(rhs);
3447 }
3448
Nicolas Capens96d4e092016-11-18 14:22:38 -05003449 RValue<UShort4> UShort4::operator=(const Short4 &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003450 {
3451 Value *value = rhs.loadValue();
3452 storeValue(value);
3453
3454 return RValue<UShort4>(value);
3455 }
3456
Nicolas Capens96d4e092016-11-18 14:22:38 -05003457 RValue<UShort4> UShort4::operator=(const Reference<Short4> &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003458 {
3459 Value *value = rhs.loadValue();
3460 storeValue(value);
3461
3462 return RValue<UShort4>(value);
3463 }
3464
3465 RValue<UShort4> operator+(RValue<UShort4> lhs, RValue<UShort4> rhs)
3466 {
Nicolas Capens5b41ba32016-12-08 14:34:00 -05003467 return RValue<UShort4>(Nucleus::createAdd(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003468 }
3469
3470 RValue<UShort4> operator-(RValue<UShort4> lhs, RValue<UShort4> rhs)
3471 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04003472 return RValue<UShort4>(Nucleus::createSub(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003473 }
3474
3475 RValue<UShort4> operator*(RValue<UShort4> lhs, RValue<UShort4> rhs)
3476 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04003477 return RValue<UShort4>(Nucleus::createMul(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003478 }
3479
Nicolas Capens16b5f152016-10-13 13:39:01 -04003480 RValue<UShort4> operator&(RValue<UShort4> lhs, RValue<UShort4> rhs)
3481 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04003482 return RValue<UShort4>(Nucleus::createAnd(lhs.value, rhs.value));
Nicolas Capens16b5f152016-10-13 13:39:01 -04003483 }
3484
3485 RValue<UShort4> operator|(RValue<UShort4> lhs, RValue<UShort4> rhs)
3486 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04003487 return RValue<UShort4>(Nucleus::createOr(lhs.value, rhs.value));
Nicolas Capens16b5f152016-10-13 13:39:01 -04003488 }
3489
3490 RValue<UShort4> operator^(RValue<UShort4> lhs, RValue<UShort4> rhs)
3491 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04003492 return RValue<UShort4>(Nucleus::createXor(lhs.value, rhs.value));
Nicolas Capens16b5f152016-10-13 13:39:01 -04003493 }
3494
Nicolas Capens598f8d82016-09-26 15:09:10 -04003495 RValue<UShort4> operator<<(RValue<UShort4> lhs, unsigned char rhs)
3496 {
Nicolas Capens15060bb2016-12-05 22:17:19 -05003497 return RValue<UShort4>(Nucleus::createShl(lhs.value, V(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003498 }
3499
3500 RValue<UShort4> operator>>(RValue<UShort4> lhs, unsigned char rhs)
3501 {
Nicolas Capens15060bb2016-12-05 22:17:19 -05003502 return RValue<UShort4>(Nucleus::createLShr(lhs.value, V(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003503 }
3504
Nicolas Capens96d4e092016-11-18 14:22:38 -05003505 RValue<UShort4> operator<<=(UShort4 &lhs, unsigned char rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003506 {
3507 return lhs = lhs << rhs;
3508 }
3509
Nicolas Capens96d4e092016-11-18 14:22:38 -05003510 RValue<UShort4> operator>>=(UShort4 &lhs, unsigned char rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003511 {
3512 return lhs = lhs >> rhs;
3513 }
3514
Nicolas Capens598f8d82016-09-26 15:09:10 -04003515 RValue<UShort4> operator~(RValue<UShort4> val)
3516 {
Nicolas Capensc5c0c332016-11-08 11:37:01 -05003517 return RValue<UShort4>(Nucleus::createNot(val.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003518 }
3519
3520 RValue<UShort4> Max(RValue<UShort4> x, RValue<UShort4> y)
3521 {
Nicolas Capens53a8a3f2016-10-26 00:23:12 -04003522 Ice::Variable *condition = ::function->makeVariable(Ice::IceType_v8i1);
3523 auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Ule, condition, x.value, y.value);
3524 ::basicBlock->appendInst(cmp);
3525
3526 Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16);
3527 auto select = Ice::InstSelect::create(::function, result, condition, y.value, x.value);
3528 ::basicBlock->appendInst(select);
3529
3530 return RValue<UShort4>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003531 }
3532
3533 RValue<UShort4> Min(RValue<UShort4> x, RValue<UShort4> y)
3534 {
Nicolas Capens53a8a3f2016-10-26 00:23:12 -04003535 Ice::Variable *condition = ::function->makeVariable(Ice::IceType_v8i1);
3536 auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Ugt, condition, x.value, y.value);
3537 ::basicBlock->appendInst(cmp);
3538
3539 Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16);
3540 auto select = Ice::InstSelect::create(::function, result, condition, y.value, x.value);
3541 ::basicBlock->appendInst(select);
3542
3543 return RValue<UShort4>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003544 }
3545
3546 RValue<UShort4> AddSat(RValue<UShort4> x, RValue<UShort4> y)
3547 {
Nicolas Capensc71bed22016-11-07 22:25:14 -05003548 Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16);
3549 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::AddSaturateUnsigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
3550 auto target = ::context->getConstantUndef(Ice::IceType_i32);
3551 auto paddusw = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
3552 paddusw->addArg(x.value);
3553 paddusw->addArg(y.value);
3554 ::basicBlock->appendInst(paddusw);
3555
3556 return RValue<UShort4>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003557 }
3558
3559 RValue<UShort4> SubSat(RValue<UShort4> x, RValue<UShort4> y)
3560 {
Nicolas Capensc71bed22016-11-07 22:25:14 -05003561 Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16);
3562 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::SubtractSaturateUnsigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
3563 auto target = ::context->getConstantUndef(Ice::IceType_i32);
3564 auto psubusw = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
3565 psubusw->addArg(x.value);
3566 psubusw->addArg(y.value);
3567 ::basicBlock->appendInst(psubusw);
3568
3569 return RValue<UShort4>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003570 }
3571
3572 RValue<UShort4> MulHigh(RValue<UShort4> x, RValue<UShort4> y)
3573 {
Nicolas Capensc71bed22016-11-07 22:25:14 -05003574 Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16);
3575 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::MultiplyHighUnsigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
3576 auto target = ::context->getConstantUndef(Ice::IceType_i32);
3577 auto pmulhuw = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
3578 pmulhuw->addArg(x.value);
3579 pmulhuw->addArg(y.value);
3580 ::basicBlock->appendInst(pmulhuw);
3581
3582 return RValue<UShort4>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003583 }
3584
3585 RValue<UShort4> Average(RValue<UShort4> x, RValue<UShort4> y)
3586 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003587 assert(false && "UNIMPLEMENTED"); return RValue<UShort4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003588 }
3589
3590 RValue<Byte8> Pack(RValue<UShort4> x, RValue<UShort4> y)
3591 {
Nicolas Capensec54a172016-10-25 17:32:37 -04003592 Ice::Variable *result = ::function->makeVariable(Ice::IceType_v16i8);
3593 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::VectorPackUnsigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
3594 auto target = ::context->getConstantUndef(Ice::IceType_i32);
3595 auto pack = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
3596 pack->addArg(x.value);
3597 pack->addArg(y.value);
3598 ::basicBlock->appendInst(pack);
3599
Nicolas Capens70dfff42016-10-27 10:20:28 -04003600 return As<Byte8>(Swizzle(As<Int4>(V(result)), 0x88));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003601 }
3602
3603 Type *UShort4::getType()
3604 {
Nicolas Capens23d99a42016-09-30 14:57:16 -04003605 return T(Type_v4i16);
Nicolas Capens598f8d82016-09-26 15:09:10 -04003606 }
3607
3608 Short8::Short8(short c0, short c1, short c2, short c3, short c4, short c5, short c6, short c7)
3609 {
3610 // xyzw.parent = this;
3611
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04003612 int64_t constantVector[8] = {c0, c1, c2, c3, c4, c5, c6, c7};
3613 storeValue(Nucleus::createConstantVector(constantVector, getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003614 }
3615
3616 Short8::Short8(RValue<Short8> rhs)
3617 {
3618 // xyzw.parent = this;
3619
3620 storeValue(rhs.value);
3621 }
3622
3623 Short8::Short8(const Reference<Short8> &rhs)
3624 {
3625 // xyzw.parent = this;
3626
3627 Value *value = rhs.loadValue();
3628 storeValue(value);
3629 }
3630
3631 Short8::Short8(RValue<Short4> lo, RValue<Short4> hi)
3632 {
Nicolas Capensc70a1162016-12-03 00:16:14 -05003633 int shuffle[8] = {0, 1, 2, 3, 8, 9, 10, 11}; // Real type is v8i16
3634 Value *packed = Nucleus::createShuffleVector(lo.value, hi.value, shuffle);
3635
3636 storeValue(packed);
Nicolas Capens598f8d82016-09-26 15:09:10 -04003637 }
3638
3639 RValue<Short8> operator+(RValue<Short8> lhs, RValue<Short8> rhs)
3640 {
3641 return RValue<Short8>(Nucleus::createAdd(lhs.value, rhs.value));
3642 }
3643
3644 RValue<Short8> operator&(RValue<Short8> lhs, RValue<Short8> rhs)
3645 {
3646 return RValue<Short8>(Nucleus::createAnd(lhs.value, rhs.value));
3647 }
3648
3649 RValue<Short8> operator<<(RValue<Short8> lhs, unsigned char rhs)
3650 {
Nicolas Capens15060bb2016-12-05 22:17:19 -05003651 return RValue<Short8>(Nucleus::createShl(lhs.value, V(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003652 }
3653
3654 RValue<Short8> operator>>(RValue<Short8> lhs, unsigned char rhs)
3655 {
Nicolas Capens15060bb2016-12-05 22:17:19 -05003656 return RValue<Short8>(Nucleus::createAShr(lhs.value, V(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003657 }
3658
3659 RValue<Int4> MulAdd(RValue<Short8> x, RValue<Short8> y)
3660 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003661 assert(false && "UNIMPLEMENTED"); return RValue<Int4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003662 }
3663
3664 RValue<Int4> Abs(RValue<Int4> x)
3665 {
Nicolas Capens84272242016-11-09 13:31:06 -05003666 auto negative = x >> 31;
3667 return (x ^ negative) - negative;
Nicolas Capens598f8d82016-09-26 15:09:10 -04003668 }
3669
3670 RValue<Short8> MulHigh(RValue<Short8> x, RValue<Short8> y)
3671 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003672 assert(false && "UNIMPLEMENTED"); return RValue<Short8>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003673 }
3674
3675 Type *Short8::getType()
3676 {
Nicolas Capens4cfd4572016-10-20 01:00:19 -04003677 return T(Ice::IceType_v8i16);
Nicolas Capens598f8d82016-09-26 15:09:10 -04003678 }
3679
3680 UShort8::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)
3681 {
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04003682 int64_t constantVector[8] = {c0, c1, c2, c3, c4, c5, c6, c7};
3683 storeValue(Nucleus::createConstantVector(constantVector, getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003684 }
3685
3686 UShort8::UShort8(RValue<UShort8> rhs)
3687 {
Nicolas Capens598f8d82016-09-26 15:09:10 -04003688 storeValue(rhs.value);
3689 }
3690
3691 UShort8::UShort8(const Reference<UShort8> &rhs)
3692 {
Nicolas Capens598f8d82016-09-26 15:09:10 -04003693 Value *value = rhs.loadValue();
3694 storeValue(value);
3695 }
3696
3697 UShort8::UShort8(RValue<UShort4> lo, RValue<UShort4> hi)
3698 {
Nicolas Capensc70a1162016-12-03 00:16:14 -05003699 int shuffle[8] = {0, 1, 2, 3, 8, 9, 10, 11}; // Real type is v8i16
3700 Value *packed = Nucleus::createShuffleVector(lo.value, hi.value, shuffle);
3701
3702 storeValue(packed);
Nicolas Capens598f8d82016-09-26 15:09:10 -04003703 }
3704
Nicolas Capens96d4e092016-11-18 14:22:38 -05003705 RValue<UShort8> UShort8::operator=(RValue<UShort8> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003706 {
3707 storeValue(rhs.value);
3708
3709 return rhs;
3710 }
3711
Nicolas Capens96d4e092016-11-18 14:22:38 -05003712 RValue<UShort8> UShort8::operator=(const UShort8 &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003713 {
3714 Value *value = rhs.loadValue();
3715 storeValue(value);
3716
3717 return RValue<UShort8>(value);
3718 }
3719
Nicolas Capens96d4e092016-11-18 14:22:38 -05003720 RValue<UShort8> UShort8::operator=(const Reference<UShort8> &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003721 {
3722 Value *value = rhs.loadValue();
3723 storeValue(value);
3724
3725 return RValue<UShort8>(value);
3726 }
3727
3728 RValue<UShort8> operator&(RValue<UShort8> lhs, RValue<UShort8> rhs)
3729 {
3730 return RValue<UShort8>(Nucleus::createAnd(lhs.value, rhs.value));
3731 }
3732
3733 RValue<UShort8> operator<<(RValue<UShort8> lhs, unsigned char rhs)
3734 {
Nicolas Capens15060bb2016-12-05 22:17:19 -05003735 return RValue<UShort8>(Nucleus::createShl(lhs.value, V(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003736 }
3737
3738 RValue<UShort8> operator>>(RValue<UShort8> lhs, unsigned char rhs)
3739 {
Nicolas Capens15060bb2016-12-05 22:17:19 -05003740 return RValue<UShort8>(Nucleus::createLShr(lhs.value, V(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003741 }
3742
3743 RValue<UShort8> operator+(RValue<UShort8> lhs, RValue<UShort8> rhs)
3744 {
3745 return RValue<UShort8>(Nucleus::createAdd(lhs.value, rhs.value));
3746 }
3747
3748 RValue<UShort8> operator*(RValue<UShort8> lhs, RValue<UShort8> rhs)
3749 {
3750 return RValue<UShort8>(Nucleus::createMul(lhs.value, rhs.value));
3751 }
3752
Nicolas Capens96d4e092016-11-18 14:22:38 -05003753 RValue<UShort8> operator+=(UShort8 &lhs, RValue<UShort8> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003754 {
3755 return lhs = lhs + rhs;
3756 }
3757
3758 RValue<UShort8> operator~(RValue<UShort8> val)
3759 {
3760 return RValue<UShort8>(Nucleus::createNot(val.value));
3761 }
3762
3763 RValue<UShort8> Swizzle(RValue<UShort8> x, char select0, char select1, char select2, char select3, char select4, char select5, char select6, char select7)
3764 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003765 assert(false && "UNIMPLEMENTED"); return RValue<UShort8>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003766 }
3767
3768 RValue<UShort8> MulHigh(RValue<UShort8> x, RValue<UShort8> y)
3769 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003770 assert(false && "UNIMPLEMENTED"); return RValue<UShort8>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003771 }
3772
3773 // FIXME: Implement as Shuffle(x, y, Select(i0, ..., i16)) and Shuffle(x, y, SELECT_PACK_REPEAT(element))
3774// RValue<UShort8> PackRepeat(RValue<Byte16> x, RValue<Byte16> y, int element)
3775// {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003776// assert(false && "UNIMPLEMENTED"); return RValue<UShort8>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003777// }
3778
3779 Type *UShort8::getType()
3780 {
Nicolas Capens4cfd4572016-10-20 01:00:19 -04003781 return T(Ice::IceType_v8i16);
Nicolas Capens598f8d82016-09-26 15:09:10 -04003782 }
3783
3784 Int::Int(Argument<Int> argument)
3785 {
3786 storeValue(argument.value);
3787 }
3788
3789 Int::Int(RValue<Byte> cast)
3790 {
3791 Value *integer = Nucleus::createZExt(cast.value, Int::getType());
3792
3793 storeValue(integer);
3794 }
3795
3796 Int::Int(RValue<SByte> cast)
3797 {
3798 Value *integer = Nucleus::createSExt(cast.value, Int::getType());
3799
3800 storeValue(integer);
3801 }
3802
3803 Int::Int(RValue<Short> cast)
3804 {
3805 Value *integer = Nucleus::createSExt(cast.value, Int::getType());
3806
3807 storeValue(integer);
3808 }
3809
3810 Int::Int(RValue<UShort> cast)
3811 {
3812 Value *integer = Nucleus::createZExt(cast.value, Int::getType());
3813
3814 storeValue(integer);
3815 }
3816
3817 Int::Int(RValue<Int2> cast)
3818 {
3819 *this = Extract(cast, 0);
3820 }
3821
3822 Int::Int(RValue<Long> cast)
3823 {
3824 Value *integer = Nucleus::createTrunc(cast.value, Int::getType());
3825
3826 storeValue(integer);
3827 }
3828
3829 Int::Int(RValue<Float> cast)
3830 {
3831 Value *integer = Nucleus::createFPToSI(cast.value, Int::getType());
3832
3833 storeValue(integer);
3834 }
3835
3836 Int::Int()
3837 {
3838 }
3839
3840 Int::Int(int x)
3841 {
3842 storeValue(Nucleus::createConstantInt(x));
3843 }
3844
3845 Int::Int(RValue<Int> rhs)
3846 {
3847 storeValue(rhs.value);
3848 }
3849
3850 Int::Int(RValue<UInt> rhs)
3851 {
3852 storeValue(rhs.value);
3853 }
3854
3855 Int::Int(const Int &rhs)
3856 {
3857 Value *value = rhs.loadValue();
3858 storeValue(value);
3859 }
3860
3861 Int::Int(const Reference<Int> &rhs)
3862 {
3863 Value *value = rhs.loadValue();
3864 storeValue(value);
3865 }
3866
3867 Int::Int(const UInt &rhs)
3868 {
3869 Value *value = rhs.loadValue();
3870 storeValue(value);
3871 }
3872
3873 Int::Int(const Reference<UInt> &rhs)
3874 {
3875 Value *value = rhs.loadValue();
3876 storeValue(value);
3877 }
3878
Nicolas Capens96d4e092016-11-18 14:22:38 -05003879 RValue<Int> Int::operator=(int rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003880 {
3881 return RValue<Int>(storeValue(Nucleus::createConstantInt(rhs)));
3882 }
3883
Nicolas Capens96d4e092016-11-18 14:22:38 -05003884 RValue<Int> Int::operator=(RValue<Int> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003885 {
3886 storeValue(rhs.value);
3887
3888 return rhs;
3889 }
3890
Nicolas Capens96d4e092016-11-18 14:22:38 -05003891 RValue<Int> Int::operator=(RValue<UInt> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003892 {
3893 storeValue(rhs.value);
3894
3895 return RValue<Int>(rhs);
3896 }
3897
Nicolas Capens96d4e092016-11-18 14:22:38 -05003898 RValue<Int> Int::operator=(const Int &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003899 {
3900 Value *value = rhs.loadValue();
3901 storeValue(value);
3902
3903 return RValue<Int>(value);
3904 }
3905
Nicolas Capens96d4e092016-11-18 14:22:38 -05003906 RValue<Int> Int::operator=(const Reference<Int> &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003907 {
3908 Value *value = rhs.loadValue();
3909 storeValue(value);
3910
3911 return RValue<Int>(value);
3912 }
3913
Nicolas Capens96d4e092016-11-18 14:22:38 -05003914 RValue<Int> Int::operator=(const UInt &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003915 {
3916 Value *value = rhs.loadValue();
3917 storeValue(value);
3918
3919 return RValue<Int>(value);
3920 }
3921
Nicolas Capens96d4e092016-11-18 14:22:38 -05003922 RValue<Int> Int::operator=(const Reference<UInt> &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003923 {
3924 Value *value = rhs.loadValue();
3925 storeValue(value);
3926
3927 return RValue<Int>(value);
3928 }
3929
3930 RValue<Int> operator+(RValue<Int> lhs, RValue<Int> rhs)
3931 {
3932 return RValue<Int>(Nucleus::createAdd(lhs.value, rhs.value));
3933 }
3934
3935 RValue<Int> operator-(RValue<Int> lhs, RValue<Int> rhs)
3936 {
3937 return RValue<Int>(Nucleus::createSub(lhs.value, rhs.value));
3938 }
3939
3940 RValue<Int> operator*(RValue<Int> lhs, RValue<Int> rhs)
3941 {
3942 return RValue<Int>(Nucleus::createMul(lhs.value, rhs.value));
3943 }
3944
3945 RValue<Int> operator/(RValue<Int> lhs, RValue<Int> rhs)
3946 {
3947 return RValue<Int>(Nucleus::createSDiv(lhs.value, rhs.value));
3948 }
3949
3950 RValue<Int> operator%(RValue<Int> lhs, RValue<Int> rhs)
3951 {
3952 return RValue<Int>(Nucleus::createSRem(lhs.value, rhs.value));
3953 }
3954
3955 RValue<Int> operator&(RValue<Int> lhs, RValue<Int> rhs)
3956 {
3957 return RValue<Int>(Nucleus::createAnd(lhs.value, rhs.value));
3958 }
3959
3960 RValue<Int> operator|(RValue<Int> lhs, RValue<Int> rhs)
3961 {
3962 return RValue<Int>(Nucleus::createOr(lhs.value, rhs.value));
3963 }
3964
3965 RValue<Int> operator^(RValue<Int> lhs, RValue<Int> rhs)
3966 {
3967 return RValue<Int>(Nucleus::createXor(lhs.value, rhs.value));
3968 }
3969
3970 RValue<Int> operator<<(RValue<Int> lhs, RValue<Int> rhs)
3971 {
3972 return RValue<Int>(Nucleus::createShl(lhs.value, rhs.value));
3973 }
3974
3975 RValue<Int> operator>>(RValue<Int> lhs, RValue<Int> rhs)
3976 {
3977 return RValue<Int>(Nucleus::createAShr(lhs.value, rhs.value));
3978 }
3979
Nicolas Capens96d4e092016-11-18 14:22:38 -05003980 RValue<Int> operator+=(Int &lhs, RValue<Int> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003981 {
3982 return lhs = lhs + rhs;
3983 }
3984
Nicolas Capens96d4e092016-11-18 14:22:38 -05003985 RValue<Int> operator-=(Int &lhs, RValue<Int> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003986 {
3987 return lhs = lhs - rhs;
3988 }
3989
Nicolas Capens96d4e092016-11-18 14:22:38 -05003990 RValue<Int> operator*=(Int &lhs, RValue<Int> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003991 {
3992 return lhs = lhs * rhs;
3993 }
3994
Nicolas Capens96d4e092016-11-18 14:22:38 -05003995 RValue<Int> operator/=(Int &lhs, RValue<Int> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04003996 {
3997 return lhs = lhs / rhs;
3998 }
3999
Nicolas Capens96d4e092016-11-18 14:22:38 -05004000 RValue<Int> operator%=(Int &lhs, RValue<Int> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004001 {
4002 return lhs = lhs % rhs;
4003 }
4004
Nicolas Capens96d4e092016-11-18 14:22:38 -05004005 RValue<Int> operator&=(Int &lhs, RValue<Int> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004006 {
4007 return lhs = lhs & rhs;
4008 }
4009
Nicolas Capens96d4e092016-11-18 14:22:38 -05004010 RValue<Int> operator|=(Int &lhs, RValue<Int> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004011 {
4012 return lhs = lhs | rhs;
4013 }
4014
Nicolas Capens96d4e092016-11-18 14:22:38 -05004015 RValue<Int> operator^=(Int &lhs, RValue<Int> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004016 {
4017 return lhs = lhs ^ rhs;
4018 }
4019
Nicolas Capens96d4e092016-11-18 14:22:38 -05004020 RValue<Int> operator<<=(Int &lhs, RValue<Int> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004021 {
4022 return lhs = lhs << rhs;
4023 }
4024
Nicolas Capens96d4e092016-11-18 14:22:38 -05004025 RValue<Int> operator>>=(Int &lhs, RValue<Int> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004026 {
4027 return lhs = lhs >> rhs;
4028 }
4029
4030 RValue<Int> operator+(RValue<Int> val)
4031 {
4032 return val;
4033 }
4034
4035 RValue<Int> operator-(RValue<Int> val)
4036 {
4037 return RValue<Int>(Nucleus::createNeg(val.value));
4038 }
4039
4040 RValue<Int> operator~(RValue<Int> val)
4041 {
4042 return RValue<Int>(Nucleus::createNot(val.value));
4043 }
4044
Nicolas Capens96d4e092016-11-18 14:22:38 -05004045 RValue<Int> operator++(Int &val, int) // Post-increment
Nicolas Capens598f8d82016-09-26 15:09:10 -04004046 {
Nicolas Capens5b41ba32016-12-08 14:34:00 -05004047 RValue<Int> res = val;
Nicolas Capensd1229402016-11-07 16:05:22 -05004048 val += 1;
4049 return res;
Nicolas Capens598f8d82016-09-26 15:09:10 -04004050 }
4051
Nicolas Capens96d4e092016-11-18 14:22:38 -05004052 const Int &operator++(Int &val) // Pre-increment
Nicolas Capens598f8d82016-09-26 15:09:10 -04004053 {
Nicolas Capensd1229402016-11-07 16:05:22 -05004054 val += 1;
4055 return val;
Nicolas Capens598f8d82016-09-26 15:09:10 -04004056 }
4057
Nicolas Capens96d4e092016-11-18 14:22:38 -05004058 RValue<Int> operator--(Int &val, int) // Post-decrement
Nicolas Capens598f8d82016-09-26 15:09:10 -04004059 {
Nicolas Capensd1229402016-11-07 16:05:22 -05004060 RValue<Int> res = val;
4061 val -= 1;
4062 return res;
Nicolas Capens598f8d82016-09-26 15:09:10 -04004063 }
4064
Nicolas Capens96d4e092016-11-18 14:22:38 -05004065 const Int &operator--(Int &val) // Pre-decrement
Nicolas Capens598f8d82016-09-26 15:09:10 -04004066 {
Nicolas Capensd1229402016-11-07 16:05:22 -05004067 val -= 1;
4068 return val;
Nicolas Capens598f8d82016-09-26 15:09:10 -04004069 }
4070
4071 RValue<Bool> operator<(RValue<Int> lhs, RValue<Int> rhs)
4072 {
4073 return RValue<Bool>(Nucleus::createICmpSLT(lhs.value, rhs.value));
4074 }
4075
4076 RValue<Bool> operator<=(RValue<Int> lhs, RValue<Int> rhs)
4077 {
4078 return RValue<Bool>(Nucleus::createICmpSLE(lhs.value, rhs.value));
4079 }
4080
4081 RValue<Bool> operator>(RValue<Int> lhs, RValue<Int> rhs)
4082 {
4083 return RValue<Bool>(Nucleus::createICmpSGT(lhs.value, rhs.value));
4084 }
4085
4086 RValue<Bool> operator>=(RValue<Int> lhs, RValue<Int> rhs)
4087 {
4088 return RValue<Bool>(Nucleus::createICmpSGE(lhs.value, rhs.value));
4089 }
4090
4091 RValue<Bool> operator!=(RValue<Int> lhs, RValue<Int> rhs)
4092 {
4093 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
4094 }
4095
4096 RValue<Bool> operator==(RValue<Int> lhs, RValue<Int> rhs)
4097 {
4098 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
4099 }
4100
4101 RValue<Int> Max(RValue<Int> x, RValue<Int> y)
4102 {
4103 return IfThenElse(x > y, x, y);
4104 }
4105
4106 RValue<Int> Min(RValue<Int> x, RValue<Int> y)
4107 {
4108 return IfThenElse(x < y, x, y);
4109 }
4110
4111 RValue<Int> Clamp(RValue<Int> x, RValue<Int> min, RValue<Int> max)
4112 {
4113 return Min(Max(x, min), max);
4114 }
4115
4116 RValue<Int> RoundInt(RValue<Float> cast)
4117 {
Nicolas Capensb13cf492016-12-08 08:58:54 -05004118 RValue<Float> rounded = Round(cast);
4119
Nicolas Capensa8086512016-11-07 17:32:17 -05004120 Ice::Variable *result = ::function->makeVariable(Ice::IceType_i32);
Nicolas Capensb13cf492016-12-08 08:58:54 -05004121 auto round = Ice::InstCast::create(::function, Ice::InstCast::Fptosi, result, rounded.value);
Nicolas Capensa8086512016-11-07 17:32:17 -05004122 ::basicBlock->appendInst(round);
4123
4124 return RValue<Int>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004125 }
4126
4127 Type *Int::getType()
4128 {
4129 return T(Ice::IceType_i32);
4130 }
4131
4132 Long::Long(RValue<Int> cast)
4133 {
4134 Value *integer = Nucleus::createSExt(cast.value, Long::getType());
4135
4136 storeValue(integer);
4137 }
4138
4139 Long::Long(RValue<UInt> cast)
4140 {
4141 Value *integer = Nucleus::createZExt(cast.value, Long::getType());
4142
4143 storeValue(integer);
4144 }
4145
4146 Long::Long()
4147 {
4148 }
4149
4150 Long::Long(RValue<Long> rhs)
4151 {
4152 storeValue(rhs.value);
4153 }
4154
Nicolas Capens96d4e092016-11-18 14:22:38 -05004155 RValue<Long> Long::operator=(int64_t rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004156 {
Nicolas Capens13ac2322016-10-13 14:52:12 -04004157 return RValue<Long>(storeValue(Nucleus::createConstantLong(rhs)));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004158 }
4159
Nicolas Capens96d4e092016-11-18 14:22:38 -05004160 RValue<Long> Long::operator=(RValue<Long> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004161 {
4162 storeValue(rhs.value);
4163
4164 return rhs;
4165 }
4166
Nicolas Capens96d4e092016-11-18 14:22:38 -05004167 RValue<Long> Long::operator=(const Long &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004168 {
4169 Value *value = rhs.loadValue();
4170 storeValue(value);
4171
4172 return RValue<Long>(value);
4173 }
4174
Nicolas Capens96d4e092016-11-18 14:22:38 -05004175 RValue<Long> Long::operator=(const Reference<Long> &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004176 {
4177 Value *value = rhs.loadValue();
4178 storeValue(value);
4179
4180 return RValue<Long>(value);
4181 }
4182
4183 RValue<Long> operator+(RValue<Long> lhs, RValue<Long> rhs)
4184 {
4185 return RValue<Long>(Nucleus::createAdd(lhs.value, rhs.value));
4186 }
4187
4188 RValue<Long> operator-(RValue<Long> lhs, RValue<Long> rhs)
4189 {
4190 return RValue<Long>(Nucleus::createSub(lhs.value, rhs.value));
4191 }
4192
Nicolas Capens96d4e092016-11-18 14:22:38 -05004193 RValue<Long> operator+=(Long &lhs, RValue<Long> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004194 {
4195 return lhs = lhs + rhs;
4196 }
4197
Nicolas Capens96d4e092016-11-18 14:22:38 -05004198 RValue<Long> operator-=(Long &lhs, RValue<Long> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004199 {
4200 return lhs = lhs - rhs;
4201 }
4202
4203 RValue<Long> AddAtomic(RValue<Pointer<Long> > x, RValue<Long> y)
4204 {
4205 return RValue<Long>(Nucleus::createAtomicAdd(x.value, y.value));
4206 }
4207
4208 Type *Long::getType()
4209 {
Nicolas Capens4cfd4572016-10-20 01:00:19 -04004210 return T(Ice::IceType_i64);
Nicolas Capens598f8d82016-09-26 15:09:10 -04004211 }
4212
Nicolas Capens598f8d82016-09-26 15:09:10 -04004213 UInt::UInt(Argument<UInt> argument)
4214 {
4215 storeValue(argument.value);
4216 }
4217
4218 UInt::UInt(RValue<UShort> cast)
4219 {
4220 Value *integer = Nucleus::createZExt(cast.value, UInt::getType());
4221
4222 storeValue(integer);
4223 }
4224
4225 UInt::UInt(RValue<Long> cast)
4226 {
4227 Value *integer = Nucleus::createTrunc(cast.value, UInt::getType());
4228
4229 storeValue(integer);
4230 }
4231
4232 UInt::UInt(RValue<Float> cast)
4233 {
Nicolas Capensc70a1162016-12-03 00:16:14 -05004234 // Smallest positive value representable in UInt, but not in Int
4235 const unsigned int ustart = 0x80000000u;
4236 const float ustartf = float(ustart);
4237
4238 // If the value is negative, store 0, otherwise store the result of the conversion
4239 storeValue((~(As<Int>(cast) >> 31) &
4240 // Check if the value can be represented as an Int
4241 IfThenElse(cast >= ustartf,
4242 // If the value is too large, subtract ustart and re-add it after conversion.
4243 As<Int>(As<UInt>(Int(cast - Float(ustartf))) + UInt(ustart)),
4244 // Otherwise, just convert normally
4245 Int(cast))).value);
Nicolas Capens598f8d82016-09-26 15:09:10 -04004246 }
4247
4248 UInt::UInt()
4249 {
4250 }
4251
4252 UInt::UInt(int x)
4253 {
4254 storeValue(Nucleus::createConstantInt(x));
4255 }
4256
4257 UInt::UInt(unsigned int x)
4258 {
4259 storeValue(Nucleus::createConstantInt(x));
4260 }
4261
4262 UInt::UInt(RValue<UInt> rhs)
4263 {
4264 storeValue(rhs.value);
4265 }
4266
4267 UInt::UInt(RValue<Int> rhs)
4268 {
4269 storeValue(rhs.value);
4270 }
4271
4272 UInt::UInt(const UInt &rhs)
4273 {
4274 Value *value = rhs.loadValue();
4275 storeValue(value);
4276 }
4277
4278 UInt::UInt(const Reference<UInt> &rhs)
4279 {
4280 Value *value = rhs.loadValue();
4281 storeValue(value);
4282 }
4283
4284 UInt::UInt(const Int &rhs)
4285 {
4286 Value *value = rhs.loadValue();
4287 storeValue(value);
4288 }
4289
4290 UInt::UInt(const Reference<Int> &rhs)
4291 {
4292 Value *value = rhs.loadValue();
4293 storeValue(value);
4294 }
4295
Nicolas Capens96d4e092016-11-18 14:22:38 -05004296 RValue<UInt> UInt::operator=(unsigned int rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004297 {
4298 return RValue<UInt>(storeValue(Nucleus::createConstantInt(rhs)));
4299 }
4300
Nicolas Capens96d4e092016-11-18 14:22:38 -05004301 RValue<UInt> UInt::operator=(RValue<UInt> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004302 {
4303 storeValue(rhs.value);
4304
4305 return rhs;
4306 }
4307
Nicolas Capens96d4e092016-11-18 14:22:38 -05004308 RValue<UInt> UInt::operator=(RValue<Int> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004309 {
4310 storeValue(rhs.value);
4311
4312 return RValue<UInt>(rhs);
4313 }
4314
Nicolas Capens96d4e092016-11-18 14:22:38 -05004315 RValue<UInt> UInt::operator=(const UInt &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004316 {
4317 Value *value = rhs.loadValue();
4318 storeValue(value);
4319
4320 return RValue<UInt>(value);
4321 }
4322
Nicolas Capens96d4e092016-11-18 14:22:38 -05004323 RValue<UInt> UInt::operator=(const Reference<UInt> &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004324 {
4325 Value *value = rhs.loadValue();
4326 storeValue(value);
4327
4328 return RValue<UInt>(value);
4329 }
4330
Nicolas Capens96d4e092016-11-18 14:22:38 -05004331 RValue<UInt> UInt::operator=(const Int &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004332 {
4333 Value *value = rhs.loadValue();
4334 storeValue(value);
4335
4336 return RValue<UInt>(value);
4337 }
4338
Nicolas Capens96d4e092016-11-18 14:22:38 -05004339 RValue<UInt> UInt::operator=(const Reference<Int> &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004340 {
4341 Value *value = rhs.loadValue();
4342 storeValue(value);
4343
4344 return RValue<UInt>(value);
4345 }
4346
4347 RValue<UInt> operator+(RValue<UInt> lhs, RValue<UInt> rhs)
4348 {
4349 return RValue<UInt>(Nucleus::createAdd(lhs.value, rhs.value));
4350 }
4351
4352 RValue<UInt> operator-(RValue<UInt> lhs, RValue<UInt> rhs)
4353 {
4354 return RValue<UInt>(Nucleus::createSub(lhs.value, rhs.value));
4355 }
4356
4357 RValue<UInt> operator*(RValue<UInt> lhs, RValue<UInt> rhs)
4358 {
4359 return RValue<UInt>(Nucleus::createMul(lhs.value, rhs.value));
4360 }
4361
4362 RValue<UInt> operator/(RValue<UInt> lhs, RValue<UInt> rhs)
4363 {
4364 return RValue<UInt>(Nucleus::createUDiv(lhs.value, rhs.value));
4365 }
4366
4367 RValue<UInt> operator%(RValue<UInt> lhs, RValue<UInt> rhs)
4368 {
4369 return RValue<UInt>(Nucleus::createURem(lhs.value, rhs.value));
4370 }
4371
4372 RValue<UInt> operator&(RValue<UInt> lhs, RValue<UInt> rhs)
4373 {
4374 return RValue<UInt>(Nucleus::createAnd(lhs.value, rhs.value));
4375 }
4376
4377 RValue<UInt> operator|(RValue<UInt> lhs, RValue<UInt> rhs)
4378 {
4379 return RValue<UInt>(Nucleus::createOr(lhs.value, rhs.value));
4380 }
4381
4382 RValue<UInt> operator^(RValue<UInt> lhs, RValue<UInt> rhs)
4383 {
4384 return RValue<UInt>(Nucleus::createXor(lhs.value, rhs.value));
4385 }
4386
4387 RValue<UInt> operator<<(RValue<UInt> lhs, RValue<UInt> rhs)
4388 {
4389 return RValue<UInt>(Nucleus::createShl(lhs.value, rhs.value));
4390 }
4391
4392 RValue<UInt> operator>>(RValue<UInt> lhs, RValue<UInt> rhs)
4393 {
4394 return RValue<UInt>(Nucleus::createLShr(lhs.value, rhs.value));
4395 }
4396
Nicolas Capens96d4e092016-11-18 14:22:38 -05004397 RValue<UInt> operator+=(UInt &lhs, RValue<UInt> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004398 {
4399 return lhs = lhs + rhs;
4400 }
4401
Nicolas Capens96d4e092016-11-18 14:22:38 -05004402 RValue<UInt> operator-=(UInt &lhs, RValue<UInt> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004403 {
4404 return lhs = lhs - rhs;
4405 }
4406
Nicolas Capens96d4e092016-11-18 14:22:38 -05004407 RValue<UInt> operator*=(UInt &lhs, RValue<UInt> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004408 {
4409 return lhs = lhs * rhs;
4410 }
4411
Nicolas Capens96d4e092016-11-18 14:22:38 -05004412 RValue<UInt> operator/=(UInt &lhs, RValue<UInt> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004413 {
4414 return lhs = lhs / rhs;
4415 }
4416
Nicolas Capens96d4e092016-11-18 14:22:38 -05004417 RValue<UInt> operator%=(UInt &lhs, RValue<UInt> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004418 {
4419 return lhs = lhs % rhs;
4420 }
4421
Nicolas Capens96d4e092016-11-18 14:22:38 -05004422 RValue<UInt> operator&=(UInt &lhs, RValue<UInt> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004423 {
4424 return lhs = lhs & rhs;
4425 }
4426
Nicolas Capens96d4e092016-11-18 14:22:38 -05004427 RValue<UInt> operator|=(UInt &lhs, RValue<UInt> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004428 {
4429 return lhs = lhs | rhs;
4430 }
4431
Nicolas Capens96d4e092016-11-18 14:22:38 -05004432 RValue<UInt> operator^=(UInt &lhs, RValue<UInt> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004433 {
4434 return lhs = lhs ^ rhs;
4435 }
4436
Nicolas Capens96d4e092016-11-18 14:22:38 -05004437 RValue<UInt> operator<<=(UInt &lhs, RValue<UInt> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004438 {
4439 return lhs = lhs << rhs;
4440 }
4441
Nicolas Capens96d4e092016-11-18 14:22:38 -05004442 RValue<UInt> operator>>=(UInt &lhs, RValue<UInt> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004443 {
4444 return lhs = lhs >> rhs;
4445 }
4446
4447 RValue<UInt> operator+(RValue<UInt> val)
4448 {
4449 return val;
4450 }
4451
4452 RValue<UInt> operator-(RValue<UInt> val)
4453 {
4454 return RValue<UInt>(Nucleus::createNeg(val.value));
4455 }
4456
4457 RValue<UInt> operator~(RValue<UInt> val)
4458 {
4459 return RValue<UInt>(Nucleus::createNot(val.value));
4460 }
4461
Nicolas Capens96d4e092016-11-18 14:22:38 -05004462 RValue<UInt> operator++(UInt &val, int) // Post-increment
Nicolas Capens598f8d82016-09-26 15:09:10 -04004463 {
Nicolas Capensd1229402016-11-07 16:05:22 -05004464 RValue<UInt> res = val;
4465 val += 1;
4466 return res;
Nicolas Capens598f8d82016-09-26 15:09:10 -04004467 }
4468
Nicolas Capens96d4e092016-11-18 14:22:38 -05004469 const UInt &operator++(UInt &val) // Pre-increment
Nicolas Capens598f8d82016-09-26 15:09:10 -04004470 {
Nicolas Capensd1229402016-11-07 16:05:22 -05004471 val += 1;
4472 return val;
Nicolas Capens598f8d82016-09-26 15:09:10 -04004473 }
4474
Nicolas Capens96d4e092016-11-18 14:22:38 -05004475 RValue<UInt> operator--(UInt &val, int) // Post-decrement
Nicolas Capens598f8d82016-09-26 15:09:10 -04004476 {
Nicolas Capensd1229402016-11-07 16:05:22 -05004477 RValue<UInt> res = val;
4478 val -= 1;
4479 return res;
Nicolas Capens598f8d82016-09-26 15:09:10 -04004480 }
4481
Nicolas Capens96d4e092016-11-18 14:22:38 -05004482 const UInt &operator--(UInt &val) // Pre-decrement
Nicolas Capens598f8d82016-09-26 15:09:10 -04004483 {
Nicolas Capensd1229402016-11-07 16:05:22 -05004484 val -= 1;
4485 return val;
Nicolas Capens598f8d82016-09-26 15:09:10 -04004486 }
4487
4488 RValue<UInt> Max(RValue<UInt> x, RValue<UInt> y)
4489 {
4490 return IfThenElse(x > y, x, y);
4491 }
4492
4493 RValue<UInt> Min(RValue<UInt> x, RValue<UInt> y)
4494 {
4495 return IfThenElse(x < y, x, y);
4496 }
4497
4498 RValue<UInt> Clamp(RValue<UInt> x, RValue<UInt> min, RValue<UInt> max)
4499 {
4500 return Min(Max(x, min), max);
4501 }
4502
4503 RValue<Bool> operator<(RValue<UInt> lhs, RValue<UInt> rhs)
4504 {
4505 return RValue<Bool>(Nucleus::createICmpULT(lhs.value, rhs.value));
4506 }
4507
4508 RValue<Bool> operator<=(RValue<UInt> lhs, RValue<UInt> rhs)
4509 {
4510 return RValue<Bool>(Nucleus::createICmpULE(lhs.value, rhs.value));
4511 }
4512
4513 RValue<Bool> operator>(RValue<UInt> lhs, RValue<UInt> rhs)
4514 {
4515 return RValue<Bool>(Nucleus::createICmpUGT(lhs.value, rhs.value));
4516 }
4517
4518 RValue<Bool> operator>=(RValue<UInt> lhs, RValue<UInt> rhs)
4519 {
4520 return RValue<Bool>(Nucleus::createICmpUGE(lhs.value, rhs.value));
4521 }
4522
4523 RValue<Bool> operator!=(RValue<UInt> lhs, RValue<UInt> rhs)
4524 {
4525 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
4526 }
4527
4528 RValue<Bool> operator==(RValue<UInt> lhs, RValue<UInt> rhs)
4529 {
4530 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
4531 }
4532
4533// RValue<UInt> RoundUInt(RValue<Float> cast)
4534// {
Nicolas Capensc37252c2016-09-28 16:11:54 -04004535// assert(false && "UNIMPLEMENTED"); return RValue<UInt>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004536// }
4537
4538 Type *UInt::getType()
4539 {
Nicolas Capens4cfd4572016-10-20 01:00:19 -04004540 return T(Ice::IceType_i32);
Nicolas Capens598f8d82016-09-26 15:09:10 -04004541 }
4542
4543// Int2::Int2(RValue<Int> cast)
4544// {
4545// Value *extend = Nucleus::createZExt(cast.value, Long::getType());
4546// Value *vector = Nucleus::createBitCast(extend, Int2::getType());
4547//
4548// Constant *shuffle[2];
4549// shuffle[0] = Nucleus::createConstantInt(0);
4550// shuffle[1] = Nucleus::createConstantInt(0);
4551//
4552// Value *replicate = Nucleus::createShuffleVector(vector, UndefValue::get(Int2::getType()), Nucleus::createConstantVector(shuffle, 2));
4553//
4554// storeValue(replicate);
4555// }
4556
4557 Int2::Int2(RValue<Int4> cast)
4558 {
Nicolas Capens22008782016-10-20 01:11:47 -04004559 storeValue(Nucleus::createBitCast(cast.value, getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004560 }
4561
4562 Int2::Int2()
4563 {
4564 // xy.parent = this;
4565 }
4566
4567 Int2::Int2(int x, int y)
4568 {
4569 // xy.parent = this;
4570
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04004571 int64_t constantVector[2] = {x, y};
4572 storeValue(Nucleus::createConstantVector(constantVector, getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004573 }
4574
4575 Int2::Int2(RValue<Int2> rhs)
4576 {
4577 // xy.parent = this;
4578
4579 storeValue(rhs.value);
4580 }
4581
4582 Int2::Int2(const Int2 &rhs)
4583 {
4584 // xy.parent = this;
4585
4586 Value *value = rhs.loadValue();
4587 storeValue(value);
4588 }
4589
4590 Int2::Int2(const Reference<Int2> &rhs)
4591 {
4592 // xy.parent = this;
4593
4594 Value *value = rhs.loadValue();
4595 storeValue(value);
4596 }
4597
4598 Int2::Int2(RValue<Int> lo, RValue<Int> hi)
4599 {
Nicolas Capensd4227962016-11-09 14:24:25 -05004600 int shuffle[4] = {0, 4, 1, 5};
4601 Value *packed = Nucleus::createShuffleVector(Int4(lo).loadValue(), Int4(hi).loadValue(), shuffle);
4602
4603 storeValue(Nucleus::createBitCast(packed, Int2::getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004604 }
4605
Nicolas Capens96d4e092016-11-18 14:22:38 -05004606 RValue<Int2> Int2::operator=(RValue<Int2> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004607 {
4608 storeValue(rhs.value);
4609
4610 return rhs;
4611 }
4612
Nicolas Capens96d4e092016-11-18 14:22:38 -05004613 RValue<Int2> Int2::operator=(const Int2 &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004614 {
4615 Value *value = rhs.loadValue();
4616 storeValue(value);
4617
4618 return RValue<Int2>(value);
4619 }
4620
Nicolas Capens96d4e092016-11-18 14:22:38 -05004621 RValue<Int2> Int2::operator=(const Reference<Int2> &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004622 {
4623 Value *value = rhs.loadValue();
4624 storeValue(value);
4625
4626 return RValue<Int2>(value);
4627 }
4628
4629 RValue<Int2> operator+(RValue<Int2> lhs, RValue<Int2> rhs)
4630 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04004631 return RValue<Int2>(Nucleus::createAdd(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004632 }
4633
4634 RValue<Int2> operator-(RValue<Int2> lhs, RValue<Int2> rhs)
4635 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04004636 return RValue<Int2>(Nucleus::createSub(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004637 }
4638
4639// RValue<Int2> operator*(RValue<Int2> lhs, RValue<Int2> rhs)
4640// {
4641// return RValue<Int2>(Nucleus::createMul(lhs.value, rhs.value));
4642// }
4643
4644// RValue<Int2> operator/(RValue<Int2> lhs, RValue<Int2> rhs)
4645// {
4646// return RValue<Int2>(Nucleus::createSDiv(lhs.value, rhs.value));
4647// }
4648
4649// RValue<Int2> operator%(RValue<Int2> lhs, RValue<Int2> rhs)
4650// {
4651// return RValue<Int2>(Nucleus::createSRem(lhs.value, rhs.value));
4652// }
4653
4654 RValue<Int2> operator&(RValue<Int2> lhs, RValue<Int2> rhs)
4655 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04004656 return RValue<Int2>(Nucleus::createAnd(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004657 }
4658
4659 RValue<Int2> operator|(RValue<Int2> lhs, RValue<Int2> rhs)
4660 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04004661 return RValue<Int2>(Nucleus::createOr(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004662 }
4663
4664 RValue<Int2> operator^(RValue<Int2> lhs, RValue<Int2> rhs)
4665 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04004666 return RValue<Int2>(Nucleus::createXor(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004667 }
4668
4669 RValue<Int2> operator<<(RValue<Int2> lhs, unsigned char rhs)
4670 {
Nicolas Capens15060bb2016-12-05 22:17:19 -05004671 return RValue<Int2>(Nucleus::createShl(lhs.value, V(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004672 }
4673
4674 RValue<Int2> operator>>(RValue<Int2> lhs, unsigned char rhs)
4675 {
Nicolas Capens15060bb2016-12-05 22:17:19 -05004676 return RValue<Int2>(Nucleus::createAShr(lhs.value, V(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004677 }
4678
Nicolas Capens96d4e092016-11-18 14:22:38 -05004679 RValue<Int2> operator+=(Int2 &lhs, RValue<Int2> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004680 {
4681 return lhs = lhs + rhs;
4682 }
4683
Nicolas Capens96d4e092016-11-18 14:22:38 -05004684 RValue<Int2> operator-=(Int2 &lhs, RValue<Int2> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004685 {
4686 return lhs = lhs - rhs;
4687 }
4688
Nicolas Capens96d4e092016-11-18 14:22:38 -05004689// RValue<Int2> operator*=(Int2 &lhs, RValue<Int2> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004690// {
4691// return lhs = lhs * rhs;
4692// }
4693
Nicolas Capens96d4e092016-11-18 14:22:38 -05004694// RValue<Int2> operator/=(Int2 &lhs, RValue<Int2> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004695// {
4696// return lhs = lhs / rhs;
4697// }
4698
Nicolas Capens96d4e092016-11-18 14:22:38 -05004699// RValue<Int2> operator%=(Int2 &lhs, RValue<Int2> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004700// {
4701// return lhs = lhs % rhs;
4702// }
4703
Nicolas Capens96d4e092016-11-18 14:22:38 -05004704 RValue<Int2> operator&=(Int2 &lhs, RValue<Int2> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004705 {
4706 return lhs = lhs & rhs;
4707 }
4708
Nicolas Capens96d4e092016-11-18 14:22:38 -05004709 RValue<Int2> operator|=(Int2 &lhs, RValue<Int2> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004710 {
4711 return lhs = lhs | rhs;
4712 }
4713
Nicolas Capens96d4e092016-11-18 14:22:38 -05004714 RValue<Int2> operator^=(Int2 &lhs, RValue<Int2> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004715 {
4716 return lhs = lhs ^ rhs;
4717 }
4718
Nicolas Capens96d4e092016-11-18 14:22:38 -05004719 RValue<Int2> operator<<=(Int2 &lhs, unsigned char rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004720 {
4721 return lhs = lhs << rhs;
4722 }
4723
Nicolas Capens96d4e092016-11-18 14:22:38 -05004724 RValue<Int2> operator>>=(Int2 &lhs, unsigned char rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004725 {
4726 return lhs = lhs >> rhs;
4727 }
4728
Nicolas Capens598f8d82016-09-26 15:09:10 -04004729// RValue<Int2> operator+(RValue<Int2> val)
4730// {
4731// return val;
4732// }
4733
4734// RValue<Int2> operator-(RValue<Int2> val)
4735// {
4736// return RValue<Int2>(Nucleus::createNeg(val.value));
4737// }
4738
4739 RValue<Int2> operator~(RValue<Int2> val)
4740 {
Nicolas Capensc5c0c332016-11-08 11:37:01 -05004741 return RValue<Int2>(Nucleus::createNot(val.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004742 }
4743
Nicolas Capens45f187a2016-12-02 15:30:56 -05004744 RValue<Short4> UnpackLow(RValue<Int2> x, RValue<Int2> y)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004745 {
Nicolas Capensc70a1162016-12-03 00:16:14 -05004746 int shuffle[4] = {0, 4, 1, 5}; // Real type is v4i32
4747 return As<Short4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004748 }
4749
Nicolas Capens45f187a2016-12-02 15:30:56 -05004750 RValue<Short4> UnpackHigh(RValue<Int2> x, RValue<Int2> y)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004751 {
Nicolas Capensc70a1162016-12-03 00:16:14 -05004752 int shuffle[16] = {0, 4, 1, 5}; // Real type is v4i32
4753 auto lowHigh = RValue<Int4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
4754 return As<Short4>(Swizzle(lowHigh, 0xEE));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004755 }
4756
4757 RValue<Int> Extract(RValue<Int2> val, int i)
4758 {
Nicolas Capensc94ab742016-11-08 15:15:31 -05004759 return RValue<Int>(Nucleus::createExtractElement(val.value, Int::getType(), i));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004760 }
4761
4762 RValue<Int2> Insert(RValue<Int2> val, RValue<Int> element, int i)
4763 {
Nicolas Capensc94ab742016-11-08 15:15:31 -05004764 return RValue<Int2>(Nucleus::createInsertElement(val.value, element.value, i));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004765 }
4766
4767 Type *Int2::getType()
4768 {
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04004769 return T(Type_v2i32);
Nicolas Capens598f8d82016-09-26 15:09:10 -04004770 }
4771
4772 UInt2::UInt2()
4773 {
4774 // xy.parent = this;
4775 }
4776
4777 UInt2::UInt2(unsigned int x, unsigned int y)
4778 {
4779 // xy.parent = this;
4780
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04004781 int64_t constantVector[2] = {x, y};
4782 storeValue(Nucleus::createConstantVector(constantVector, getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004783 }
4784
4785 UInt2::UInt2(RValue<UInt2> rhs)
4786 {
4787 // xy.parent = this;
4788
4789 storeValue(rhs.value);
4790 }
4791
4792 UInt2::UInt2(const UInt2 &rhs)
4793 {
4794 // xy.parent = this;
4795
4796 Value *value = rhs.loadValue();
4797 storeValue(value);
4798 }
4799
4800 UInt2::UInt2(const Reference<UInt2> &rhs)
4801 {
4802 // xy.parent = this;
4803
4804 Value *value = rhs.loadValue();
4805 storeValue(value);
4806 }
4807
Nicolas Capens96d4e092016-11-18 14:22:38 -05004808 RValue<UInt2> UInt2::operator=(RValue<UInt2> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004809 {
4810 storeValue(rhs.value);
4811
4812 return rhs;
4813 }
4814
Nicolas Capens96d4e092016-11-18 14:22:38 -05004815 RValue<UInt2> UInt2::operator=(const UInt2 &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004816 {
4817 Value *value = rhs.loadValue();
4818 storeValue(value);
4819
4820 return RValue<UInt2>(value);
4821 }
4822
Nicolas Capens96d4e092016-11-18 14:22:38 -05004823 RValue<UInt2> UInt2::operator=(const Reference<UInt2> &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004824 {
4825 Value *value = rhs.loadValue();
4826 storeValue(value);
4827
4828 return RValue<UInt2>(value);
4829 }
4830
4831 RValue<UInt2> operator+(RValue<UInt2> lhs, RValue<UInt2> rhs)
4832 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04004833 return RValue<UInt2>(Nucleus::createAdd(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004834 }
4835
4836 RValue<UInt2> operator-(RValue<UInt2> lhs, RValue<UInt2> rhs)
4837 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04004838 return RValue<UInt2>(Nucleus::createSub(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004839 }
4840
4841// RValue<UInt2> operator*(RValue<UInt2> lhs, RValue<UInt2> rhs)
4842// {
4843// return RValue<UInt2>(Nucleus::createMul(lhs.value, rhs.value));
4844// }
4845
4846// RValue<UInt2> operator/(RValue<UInt2> lhs, RValue<UInt2> rhs)
4847// {
4848// return RValue<UInt2>(Nucleus::createUDiv(lhs.value, rhs.value));
4849// }
4850
4851// RValue<UInt2> operator%(RValue<UInt2> lhs, RValue<UInt2> rhs)
4852// {
4853// return RValue<UInt2>(Nucleus::createURem(lhs.value, rhs.value));
4854// }
4855
4856 RValue<UInt2> operator&(RValue<UInt2> lhs, RValue<UInt2> rhs)
4857 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04004858 return RValue<UInt2>(Nucleus::createAnd(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004859 }
4860
4861 RValue<UInt2> operator|(RValue<UInt2> lhs, RValue<UInt2> rhs)
4862 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04004863 return RValue<UInt2>(Nucleus::createOr(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004864 }
4865
4866 RValue<UInt2> operator^(RValue<UInt2> lhs, RValue<UInt2> rhs)
4867 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04004868 return RValue<UInt2>(Nucleus::createXor(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004869 }
4870
4871 RValue<UInt2> operator<<(RValue<UInt2> lhs, unsigned char rhs)
4872 {
Nicolas Capens15060bb2016-12-05 22:17:19 -05004873 return RValue<UInt2>(Nucleus::createShl(lhs.value, V(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004874 }
4875
4876 RValue<UInt2> operator>>(RValue<UInt2> lhs, unsigned char rhs)
4877 {
Nicolas Capens15060bb2016-12-05 22:17:19 -05004878 return RValue<UInt2>(Nucleus::createLShr(lhs.value, V(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004879 }
4880
Nicolas Capens96d4e092016-11-18 14:22:38 -05004881 RValue<UInt2> operator+=(UInt2 &lhs, RValue<UInt2> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004882 {
4883 return lhs = lhs + rhs;
4884 }
4885
Nicolas Capens96d4e092016-11-18 14:22:38 -05004886 RValue<UInt2> operator-=(UInt2 &lhs, RValue<UInt2> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004887 {
4888 return lhs = lhs - rhs;
4889 }
4890
Nicolas Capens96d4e092016-11-18 14:22:38 -05004891// RValue<UInt2> operator*=(UInt2 &lhs, RValue<UInt2> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004892// {
4893// return lhs = lhs * rhs;
4894// }
4895
Nicolas Capens96d4e092016-11-18 14:22:38 -05004896// RValue<UInt2> operator/=(UInt2 &lhs, RValue<UInt2> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004897// {
4898// return lhs = lhs / rhs;
4899// }
4900
Nicolas Capens96d4e092016-11-18 14:22:38 -05004901// RValue<UInt2> operator%=(UInt2 &lhs, RValue<UInt2> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004902// {
4903// return lhs = lhs % rhs;
4904// }
4905
Nicolas Capens96d4e092016-11-18 14:22:38 -05004906 RValue<UInt2> operator&=(UInt2 &lhs, RValue<UInt2> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004907 {
4908 return lhs = lhs & rhs;
4909 }
4910
Nicolas Capens96d4e092016-11-18 14:22:38 -05004911 RValue<UInt2> operator|=(UInt2 &lhs, RValue<UInt2> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004912 {
4913 return lhs = lhs | rhs;
4914 }
4915
Nicolas Capens96d4e092016-11-18 14:22:38 -05004916 RValue<UInt2> operator^=(UInt2 &lhs, RValue<UInt2> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004917 {
4918 return lhs = lhs ^ rhs;
4919 }
4920
Nicolas Capens96d4e092016-11-18 14:22:38 -05004921 RValue<UInt2> operator<<=(UInt2 &lhs, unsigned char rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004922 {
4923 return lhs = lhs << rhs;
4924 }
4925
Nicolas Capens96d4e092016-11-18 14:22:38 -05004926 RValue<UInt2> operator>>=(UInt2 &lhs, unsigned char rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04004927 {
4928 return lhs = lhs >> rhs;
4929 }
4930
Nicolas Capens598f8d82016-09-26 15:09:10 -04004931// RValue<UInt2> operator+(RValue<UInt2> val)
4932// {
4933// return val;
4934// }
4935
4936// RValue<UInt2> operator-(RValue<UInt2> val)
4937// {
4938// return RValue<UInt2>(Nucleus::createNeg(val.value));
4939// }
4940
4941 RValue<UInt2> operator~(RValue<UInt2> val)
4942 {
4943 return RValue<UInt2>(Nucleus::createNot(val.value));
4944 }
4945
4946 Type *UInt2::getType()
4947 {
Nicolas Capens4cfd4572016-10-20 01:00:19 -04004948 return T(Type_v2i32);
Nicolas Capens598f8d82016-09-26 15:09:10 -04004949 }
4950
4951 Int4::Int4(RValue<Byte4> cast)
4952 {
Nicolas Capensd4227962016-11-09 14:24:25 -05004953 Value *x = Nucleus::createBitCast(cast.value, Int::getType());
4954 Value *a = Nucleus::createInsertElement(loadValue(), x, 0);
4955
4956 Value *e;
4957 int swizzle[16] = {0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23};
4958 Value *b = Nucleus::createBitCast(a, Byte16::getType());
4959 Value *c = Nucleus::createShuffleVector(b, V(Nucleus::createNullValue(Byte16::getType())), swizzle);
4960
4961 int swizzle2[8] = {0, 8, 1, 9, 2, 10, 3, 11};
4962 Value *d = Nucleus::createBitCast(c, Short8::getType());
4963 e = Nucleus::createShuffleVector(d, V(Nucleus::createNullValue(Short8::getType())), swizzle2);
4964
4965 Value *f = Nucleus::createBitCast(e, Int4::getType());
4966 storeValue(f);
Nicolas Capens598f8d82016-09-26 15:09:10 -04004967 }
4968
4969 Int4::Int4(RValue<SByte4> cast)
4970 {
Nicolas Capensd4227962016-11-09 14:24:25 -05004971 Value *x = Nucleus::createBitCast(cast.value, Int::getType());
4972 Value *a = Nucleus::createInsertElement(loadValue(), x, 0);
4973
4974 Value *e;
4975 int swizzle[16] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7};
4976 Value *b = Nucleus::createBitCast(a, Byte16::getType());
4977 Value *c = Nucleus::createShuffleVector(b, b, swizzle);
4978
4979 int swizzle2[8] = {0, 0, 1, 1, 2, 2, 3, 3};
4980 Value *d = Nucleus::createBitCast(c, Short8::getType());
4981 e = Nucleus::createShuffleVector(d, d, swizzle2);
4982
4983 Value *f = Nucleus::createBitCast(e, Int4::getType());
Nicolas Capens15060bb2016-12-05 22:17:19 -05004984 Value *g = Nucleus::createAShr(f, V(::context->getConstantInt32(24)));
Nicolas Capensd4227962016-11-09 14:24:25 -05004985 storeValue(g);
Nicolas Capens598f8d82016-09-26 15:09:10 -04004986 }
4987
4988 Int4::Int4(RValue<Float4> cast)
4989 {
4990 // xyzw.parent = this;
4991
4992 Value *xyzw = Nucleus::createFPToSI(cast.value, Int4::getType());
4993
4994 storeValue(xyzw);
4995 }
4996
4997 Int4::Int4(RValue<Short4> cast)
4998 {
Nicolas Capensd4227962016-11-09 14:24:25 -05004999 int swizzle[8] = {0, 0, 1, 1, 2, 2, 3, 3};
5000 Value *c = Nucleus::createShuffleVector(cast.value, cast.value, swizzle);
5001 Value *d = Nucleus::createBitCast(c, Int4::getType());
Nicolas Capens15060bb2016-12-05 22:17:19 -05005002 Value *e = Nucleus::createAShr(d, V(::context->getConstantInt32(16)));
Nicolas Capensd4227962016-11-09 14:24:25 -05005003 storeValue(e);
Nicolas Capens598f8d82016-09-26 15:09:10 -04005004 }
5005
5006 Int4::Int4(RValue<UShort4> cast)
5007 {
Nicolas Capensd4227962016-11-09 14:24:25 -05005008 int swizzle[8] = {0, 8, 1, 9, 2, 10, 3, 11};
5009 Value *c = Nucleus::createShuffleVector(cast.value, Short8(0, 0, 0, 0, 0, 0, 0, 0).loadValue(), swizzle);
5010 Value *d = Nucleus::createBitCast(c, Int4::getType());
5011 storeValue(d);
Nicolas Capens598f8d82016-09-26 15:09:10 -04005012 }
5013
5014 Int4::Int4()
5015 {
5016 // xyzw.parent = this;
5017 }
5018
5019 Int4::Int4(int xyzw)
5020 {
5021 constant(xyzw, xyzw, xyzw, xyzw);
5022 }
5023
5024 Int4::Int4(int x, int yzw)
5025 {
5026 constant(x, yzw, yzw, yzw);
5027 }
5028
5029 Int4::Int4(int x, int y, int zw)
5030 {
5031 constant(x, y, zw, zw);
5032 }
5033
5034 Int4::Int4(int x, int y, int z, int w)
5035 {
5036 constant(x, y, z, w);
5037 }
5038
5039 void Int4::constant(int x, int y, int z, int w)
5040 {
5041 // xyzw.parent = this;
5042
Nicolas Capens13ac2322016-10-13 14:52:12 -04005043 int64_t constantVector[4] = {x, y, z, w};
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04005044 storeValue(Nucleus::createConstantVector(constantVector, getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005045 }
5046
5047 Int4::Int4(RValue<Int4> rhs)
5048 {
5049 // xyzw.parent = this;
5050
5051 storeValue(rhs.value);
5052 }
5053
5054 Int4::Int4(const Int4 &rhs)
5055 {
5056 // xyzw.parent = this;
5057
5058 Value *value = rhs.loadValue();
5059 storeValue(value);
5060 }
5061
5062 Int4::Int4(const Reference<Int4> &rhs)
5063 {
5064 // xyzw.parent = this;
5065
5066 Value *value = rhs.loadValue();
5067 storeValue(value);
5068 }
5069
5070 Int4::Int4(RValue<UInt4> rhs)
5071 {
5072 // xyzw.parent = this;
5073
5074 storeValue(rhs.value);
5075 }
5076
5077 Int4::Int4(const UInt4 &rhs)
5078 {
5079 // xyzw.parent = this;
5080
5081 Value *value = rhs.loadValue();
5082 storeValue(value);
5083 }
5084
5085 Int4::Int4(const Reference<UInt4> &rhs)
5086 {
5087 // xyzw.parent = this;
5088
5089 Value *value = rhs.loadValue();
5090 storeValue(value);
5091 }
5092
5093 Int4::Int4(RValue<Int2> lo, RValue<Int2> hi)
5094 {
Nicolas Capensc70a1162016-12-03 00:16:14 -05005095 int shuffle[4] = {0, 1, 4, 5}; // Real type is v4i32
5096 Value *packed = Nucleus::createShuffleVector(lo.value, hi.value, shuffle);
5097
5098 storeValue(packed);
Nicolas Capens598f8d82016-09-26 15:09:10 -04005099 }
5100
5101 Int4::Int4(RValue<Int> rhs)
5102 {
5103 // xyzw.parent = this;
5104
Nicolas Capensd4227962016-11-09 14:24:25 -05005105 Value *vector = loadValue();
5106 Value *insert = Nucleus::createInsertElement(vector, rhs.value, 0);
5107
5108 int swizzle[4] = {0, 0, 0, 0};
5109 Value *replicate = Nucleus::createShuffleVector(insert, insert, swizzle);
5110
5111 storeValue(replicate);
Nicolas Capens598f8d82016-09-26 15:09:10 -04005112 }
5113
5114 Int4::Int4(const Int &rhs)
5115 {
5116 // xyzw.parent = this;
5117
5118 *this = RValue<Int>(rhs.loadValue());
5119 }
5120
5121 Int4::Int4(const Reference<Int> &rhs)
5122 {
5123 // xyzw.parent = this;
5124
5125 *this = RValue<Int>(rhs.loadValue());
5126 }
5127
Nicolas Capens96d4e092016-11-18 14:22:38 -05005128 RValue<Int4> Int4::operator=(RValue<Int4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005129 {
5130 storeValue(rhs.value);
5131
5132 return rhs;
5133 }
5134
Nicolas Capens96d4e092016-11-18 14:22:38 -05005135 RValue<Int4> Int4::operator=(const Int4 &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005136 {
5137 Value *value = rhs.loadValue();
5138 storeValue(value);
5139
5140 return RValue<Int4>(value);
5141 }
5142
Nicolas Capens96d4e092016-11-18 14:22:38 -05005143 RValue<Int4> Int4::operator=(const Reference<Int4> &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005144 {
5145 Value *value = rhs.loadValue();
5146 storeValue(value);
5147
5148 return RValue<Int4>(value);
5149 }
5150
5151 RValue<Int4> operator+(RValue<Int4> lhs, RValue<Int4> rhs)
5152 {
5153 return RValue<Int4>(Nucleus::createAdd(lhs.value, rhs.value));
5154 }
5155
5156 RValue<Int4> operator-(RValue<Int4> lhs, RValue<Int4> rhs)
5157 {
5158 return RValue<Int4>(Nucleus::createSub(lhs.value, rhs.value));
5159 }
5160
5161 RValue<Int4> operator*(RValue<Int4> lhs, RValue<Int4> rhs)
5162 {
5163 return RValue<Int4>(Nucleus::createMul(lhs.value, rhs.value));
5164 }
5165
5166 RValue<Int4> operator/(RValue<Int4> lhs, RValue<Int4> rhs)
5167 {
5168 return RValue<Int4>(Nucleus::createSDiv(lhs.value, rhs.value));
5169 }
5170
5171 RValue<Int4> operator%(RValue<Int4> lhs, RValue<Int4> rhs)
5172 {
5173 return RValue<Int4>(Nucleus::createSRem(lhs.value, rhs.value));
5174 }
5175
5176 RValue<Int4> operator&(RValue<Int4> lhs, RValue<Int4> rhs)
5177 {
5178 return RValue<Int4>(Nucleus::createAnd(lhs.value, rhs.value));
5179 }
5180
5181 RValue<Int4> operator|(RValue<Int4> lhs, RValue<Int4> rhs)
5182 {
5183 return RValue<Int4>(Nucleus::createOr(lhs.value, rhs.value));
5184 }
5185
5186 RValue<Int4> operator^(RValue<Int4> lhs, RValue<Int4> rhs)
5187 {
5188 return RValue<Int4>(Nucleus::createXor(lhs.value, rhs.value));
5189 }
5190
5191 RValue<Int4> operator<<(RValue<Int4> lhs, unsigned char rhs)
5192 {
Nicolas Capens15060bb2016-12-05 22:17:19 -05005193 return RValue<Int4>(Nucleus::createShl(lhs.value, V(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005194 }
5195
5196 RValue<Int4> operator>>(RValue<Int4> lhs, unsigned char rhs)
5197 {
Nicolas Capens15060bb2016-12-05 22:17:19 -05005198 return RValue<Int4>(Nucleus::createAShr(lhs.value, V(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005199 }
5200
5201 RValue<Int4> operator<<(RValue<Int4> lhs, RValue<Int4> rhs)
5202 {
5203 return RValue<Int4>(Nucleus::createShl(lhs.value, rhs.value));
5204 }
5205
5206 RValue<Int4> operator>>(RValue<Int4> lhs, RValue<Int4> rhs)
5207 {
5208 return RValue<Int4>(Nucleus::createAShr(lhs.value, rhs.value));
5209 }
5210
Nicolas Capens96d4e092016-11-18 14:22:38 -05005211 RValue<Int4> operator+=(Int4 &lhs, RValue<Int4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005212 {
5213 return lhs = lhs + rhs;
5214 }
5215
Nicolas Capens96d4e092016-11-18 14:22:38 -05005216 RValue<Int4> operator-=(Int4 &lhs, RValue<Int4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005217 {
5218 return lhs = lhs - rhs;
5219 }
5220
Nicolas Capens96d4e092016-11-18 14:22:38 -05005221 RValue<Int4> operator*=(Int4 &lhs, RValue<Int4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005222 {
5223 return lhs = lhs * rhs;
5224 }
5225
Nicolas Capens96d4e092016-11-18 14:22:38 -05005226// RValue<Int4> operator/=(Int4 &lhs, RValue<Int4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005227// {
5228// return lhs = lhs / rhs;
5229// }
5230
Nicolas Capens96d4e092016-11-18 14:22:38 -05005231// RValue<Int4> operator%=(Int4 &lhs, RValue<Int4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005232// {
5233// return lhs = lhs % rhs;
5234// }
5235
Nicolas Capens96d4e092016-11-18 14:22:38 -05005236 RValue<Int4> operator&=(Int4 &lhs, RValue<Int4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005237 {
5238 return lhs = lhs & rhs;
5239 }
5240
Nicolas Capens96d4e092016-11-18 14:22:38 -05005241 RValue<Int4> operator|=(Int4 &lhs, RValue<Int4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005242 {
5243 return lhs = lhs | rhs;
5244 }
5245
Nicolas Capens96d4e092016-11-18 14:22:38 -05005246 RValue<Int4> operator^=(Int4 &lhs, RValue<Int4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005247 {
5248 return lhs = lhs ^ rhs;
5249 }
5250
Nicolas Capens96d4e092016-11-18 14:22:38 -05005251 RValue<Int4> operator<<=(Int4 &lhs, unsigned char rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005252 {
5253 return lhs = lhs << rhs;
5254 }
5255
Nicolas Capens96d4e092016-11-18 14:22:38 -05005256 RValue<Int4> operator>>=(Int4 &lhs, unsigned char rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005257 {
5258 return lhs = lhs >> rhs;
5259 }
5260
5261 RValue<Int4> operator+(RValue<Int4> val)
5262 {
5263 return val;
5264 }
5265
5266 RValue<Int4> operator-(RValue<Int4> val)
5267 {
5268 return RValue<Int4>(Nucleus::createNeg(val.value));
5269 }
5270
5271 RValue<Int4> operator~(RValue<Int4> val)
5272 {
5273 return RValue<Int4>(Nucleus::createNot(val.value));
5274 }
5275
5276 RValue<Int4> CmpEQ(RValue<Int4> x, RValue<Int4> y)
5277 {
5278 return RValue<Int4>(Nucleus::createSExt(Nucleus::createICmpEQ(x.value, y.value), Int4::getType()));
5279 }
5280
5281 RValue<Int4> CmpLT(RValue<Int4> x, RValue<Int4> y)
5282 {
5283 return RValue<Int4>(Nucleus::createSExt(Nucleus::createICmpSLT(x.value, y.value), Int4::getType()));
5284 }
5285
5286 RValue<Int4> CmpLE(RValue<Int4> x, RValue<Int4> y)
5287 {
5288 return RValue<Int4>(Nucleus::createSExt(Nucleus::createICmpSLE(x.value, y.value), Int4::getType()));
5289 }
5290
5291 RValue<Int4> CmpNEQ(RValue<Int4> x, RValue<Int4> y)
5292 {
5293 return RValue<Int4>(Nucleus::createSExt(Nucleus::createICmpNE(x.value, y.value), Int4::getType()));
5294 }
5295
5296 RValue<Int4> CmpNLT(RValue<Int4> x, RValue<Int4> y)
5297 {
5298 return RValue<Int4>(Nucleus::createSExt(Nucleus::createICmpSGE(x.value, y.value), Int4::getType()));
5299 }
5300
5301 RValue<Int4> CmpNLE(RValue<Int4> x, RValue<Int4> y)
5302 {
5303 return RValue<Int4>(Nucleus::createSExt(Nucleus::createICmpSGT(x.value, y.value), Int4::getType()));
5304 }
5305
5306 RValue<Int4> Max(RValue<Int4> x, RValue<Int4> y)
5307 {
Nicolas Capens53a8a3f2016-10-26 00:23:12 -04005308 Ice::Variable *condition = ::function->makeVariable(Ice::IceType_v4i1);
5309 auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Sle, condition, x.value, y.value);
5310 ::basicBlock->appendInst(cmp);
5311
5312 Ice::Variable *result = ::function->makeVariable(Ice::IceType_v4i32);
5313 auto select = Ice::InstSelect::create(::function, result, condition, y.value, x.value);
5314 ::basicBlock->appendInst(select);
5315
5316 return RValue<Int4>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005317 }
5318
5319 RValue<Int4> Min(RValue<Int4> x, RValue<Int4> y)
5320 {
Nicolas Capens53a8a3f2016-10-26 00:23:12 -04005321 Ice::Variable *condition = ::function->makeVariable(Ice::IceType_v4i1);
5322 auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Sgt, condition, x.value, y.value);
5323 ::basicBlock->appendInst(cmp);
5324
5325 Ice::Variable *result = ::function->makeVariable(Ice::IceType_v4i32);
5326 auto select = Ice::InstSelect::create(::function, result, condition, y.value, x.value);
5327 ::basicBlock->appendInst(select);
5328
5329 return RValue<Int4>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005330 }
5331
5332 RValue<Int4> RoundInt(RValue<Float4> cast)
5333 {
Nicolas Capensb13cf492016-12-08 08:58:54 -05005334 RValue<Float4> rounded = Round(cast);
5335
Nicolas Capensa8086512016-11-07 17:32:17 -05005336 Ice::Variable *result = ::function->makeVariable(Ice::IceType_v4i32);
Nicolas Capensb13cf492016-12-08 08:58:54 -05005337 auto round = Ice::InstCast::create(::function, Ice::InstCast::Fptosi, result, rounded.value);
Nicolas Capensa8086512016-11-07 17:32:17 -05005338 ::basicBlock->appendInst(round);
5339
5340 return RValue<Int4>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005341 }
5342
5343 RValue<Short8> Pack(RValue<Int4> x, RValue<Int4> y)
5344 {
Nicolas Capensec54a172016-10-25 17:32:37 -04005345 Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16);
5346 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::VectorPackSigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
5347 auto target = ::context->getConstantUndef(Ice::IceType_i32);
5348 auto pack = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
5349 pack->addArg(x.value);
5350 pack->addArg(y.value);
5351 ::basicBlock->appendInst(pack);
5352
5353 return RValue<Short8>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005354 }
5355
5356 RValue<Int> Extract(RValue<Int4> x, int i)
5357 {
Nicolas Capense95d5342016-09-30 11:37:28 -04005358 return RValue<Int>(Nucleus::createExtractElement(x.value, Int::getType(), i));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005359 }
5360
5361 RValue<Int4> Insert(RValue<Int4> x, RValue<Int> element, int i)
5362 {
5363 return RValue<Int4>(Nucleus::createInsertElement(x.value, element.value, i));
5364 }
5365
5366 RValue<Int> SignMask(RValue<Int4> x)
5367 {
Nicolas Capensf2cb9df2016-10-21 17:26:13 -04005368 Ice::Variable *result = ::function->makeVariable(Ice::IceType_i32);
5369 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::SignMask, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
5370 auto target = ::context->getConstantUndef(Ice::IceType_i32);
5371 auto movmsk = Ice::InstIntrinsicCall::create(::function, 1, result, target, intrinsic);
5372 movmsk->addArg(x.value);
5373 ::basicBlock->appendInst(movmsk);
5374
5375 return RValue<Int>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005376 }
5377
5378 RValue<Int4> Swizzle(RValue<Int4> x, unsigned char select)
5379 {
Nicolas Capense95d5342016-09-30 11:37:28 -04005380 return RValue<Int4>(createSwizzle4(x.value, select));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005381 }
5382
5383 Type *Int4::getType()
5384 {
Nicolas Capens23d99a42016-09-30 14:57:16 -04005385 return T(Ice::IceType_v4i32);
Nicolas Capens598f8d82016-09-26 15:09:10 -04005386 }
5387
5388 UInt4::UInt4(RValue<Float4> cast)
5389 {
5390 // xyzw.parent = this;
5391
Nicolas Capensc70a1162016-12-03 00:16:14 -05005392 // Smallest positive value representable in UInt, but not in Int
5393 const unsigned int ustart = 0x80000000u;
5394 const float ustartf = float(ustart);
5395
5396 // Check if the value can be represented as an Int
5397 Int4 uiValue = CmpNLT(cast, Float4(ustartf));
5398 // If the value is too large, subtract ustart and re-add it after conversion.
5399 uiValue = (uiValue & As<Int4>(As<UInt4>(Int4(cast - Float4(ustartf))) + UInt4(ustart))) |
5400 // Otherwise, just convert normally
5401 (~uiValue & Int4(cast));
5402 // If the value is negative, store 0, otherwise store the result of the conversion
5403 storeValue((~(As<Int4>(cast) >> 31) & uiValue).value);
Nicolas Capens598f8d82016-09-26 15:09:10 -04005404 }
5405
5406 UInt4::UInt4()
5407 {
5408 // xyzw.parent = this;
5409 }
5410
5411 UInt4::UInt4(int xyzw)
5412 {
5413 constant(xyzw, xyzw, xyzw, xyzw);
5414 }
5415
5416 UInt4::UInt4(int x, int yzw)
5417 {
5418 constant(x, yzw, yzw, yzw);
5419 }
5420
5421 UInt4::UInt4(int x, int y, int zw)
5422 {
5423 constant(x, y, zw, zw);
5424 }
5425
5426 UInt4::UInt4(int x, int y, int z, int w)
5427 {
5428 constant(x, y, z, w);
5429 }
5430
5431 void UInt4::constant(int x, int y, int z, int w)
5432 {
5433 // xyzw.parent = this;
5434
Nicolas Capens13ac2322016-10-13 14:52:12 -04005435 int64_t constantVector[4] = {x, y, z, w};
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04005436 storeValue(Nucleus::createConstantVector(constantVector, getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005437 }
5438
5439 UInt4::UInt4(RValue<UInt4> rhs)
5440 {
5441 // xyzw.parent = this;
5442
5443 storeValue(rhs.value);
5444 }
5445
5446 UInt4::UInt4(const UInt4 &rhs)
5447 {
5448 // xyzw.parent = this;
5449
5450 Value *value = rhs.loadValue();
5451 storeValue(value);
5452 }
5453
5454 UInt4::UInt4(const Reference<UInt4> &rhs)
5455 {
5456 // xyzw.parent = this;
5457
5458 Value *value = rhs.loadValue();
5459 storeValue(value);
5460 }
5461
5462 UInt4::UInt4(RValue<Int4> rhs)
5463 {
5464 // xyzw.parent = this;
5465
5466 storeValue(rhs.value);
5467 }
5468
5469 UInt4::UInt4(const Int4 &rhs)
5470 {
5471 // xyzw.parent = this;
5472
5473 Value *value = rhs.loadValue();
5474 storeValue(value);
5475 }
5476
5477 UInt4::UInt4(const Reference<Int4> &rhs)
5478 {
5479 // xyzw.parent = this;
5480
5481 Value *value = rhs.loadValue();
5482 storeValue(value);
5483 }
5484
5485 UInt4::UInt4(RValue<UInt2> lo, RValue<UInt2> hi)
5486 {
Nicolas Capensc70a1162016-12-03 00:16:14 -05005487 int shuffle[4] = {0, 1, 4, 5}; // Real type is v4i32
5488 Value *packed = Nucleus::createShuffleVector(lo.value, hi.value, shuffle);
5489
5490 storeValue(packed);
Nicolas Capens598f8d82016-09-26 15:09:10 -04005491 }
5492
Nicolas Capens96d4e092016-11-18 14:22:38 -05005493 RValue<UInt4> UInt4::operator=(RValue<UInt4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005494 {
5495 storeValue(rhs.value);
5496
5497 return rhs;
5498 }
5499
Nicolas Capens96d4e092016-11-18 14:22:38 -05005500 RValue<UInt4> UInt4::operator=(const UInt4 &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005501 {
5502 Value *value = rhs.loadValue();
5503 storeValue(value);
5504
5505 return RValue<UInt4>(value);
5506 }
5507
Nicolas Capens96d4e092016-11-18 14:22:38 -05005508 RValue<UInt4> UInt4::operator=(const Reference<UInt4> &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005509 {
5510 Value *value = rhs.loadValue();
5511 storeValue(value);
5512
5513 return RValue<UInt4>(value);
5514 }
5515
5516 RValue<UInt4> operator+(RValue<UInt4> lhs, RValue<UInt4> rhs)
5517 {
5518 return RValue<UInt4>(Nucleus::createAdd(lhs.value, rhs.value));
5519 }
5520
5521 RValue<UInt4> operator-(RValue<UInt4> lhs, RValue<UInt4> rhs)
5522 {
5523 return RValue<UInt4>(Nucleus::createSub(lhs.value, rhs.value));
5524 }
5525
5526 RValue<UInt4> operator*(RValue<UInt4> lhs, RValue<UInt4> rhs)
5527 {
5528 return RValue<UInt4>(Nucleus::createMul(lhs.value, rhs.value));
5529 }
5530
5531 RValue<UInt4> operator/(RValue<UInt4> lhs, RValue<UInt4> rhs)
5532 {
5533 return RValue<UInt4>(Nucleus::createUDiv(lhs.value, rhs.value));
5534 }
5535
5536 RValue<UInt4> operator%(RValue<UInt4> lhs, RValue<UInt4> rhs)
5537 {
5538 return RValue<UInt4>(Nucleus::createURem(lhs.value, rhs.value));
5539 }
5540
5541 RValue<UInt4> operator&(RValue<UInt4> lhs, RValue<UInt4> rhs)
5542 {
5543 return RValue<UInt4>(Nucleus::createAnd(lhs.value, rhs.value));
5544 }
5545
5546 RValue<UInt4> operator|(RValue<UInt4> lhs, RValue<UInt4> rhs)
5547 {
5548 return RValue<UInt4>(Nucleus::createOr(lhs.value, rhs.value));
5549 }
5550
5551 RValue<UInt4> operator^(RValue<UInt4> lhs, RValue<UInt4> rhs)
5552 {
5553 return RValue<UInt4>(Nucleus::createXor(lhs.value, rhs.value));
5554 }
5555
5556 RValue<UInt4> operator<<(RValue<UInt4> lhs, unsigned char rhs)
5557 {
Nicolas Capens15060bb2016-12-05 22:17:19 -05005558 return RValue<UInt4>(Nucleus::createShl(lhs.value, V(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005559 }
5560
5561 RValue<UInt4> operator>>(RValue<UInt4> lhs, unsigned char rhs)
5562 {
Nicolas Capens15060bb2016-12-05 22:17:19 -05005563 return RValue<UInt4>(Nucleus::createLShr(lhs.value, V(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005564 }
5565
5566 RValue<UInt4> operator<<(RValue<UInt4> lhs, RValue<UInt4> rhs)
5567 {
5568 return RValue<UInt4>(Nucleus::createShl(lhs.value, rhs.value));
5569 }
5570
5571 RValue<UInt4> operator>>(RValue<UInt4> lhs, RValue<UInt4> rhs)
5572 {
5573 return RValue<UInt4>(Nucleus::createLShr(lhs.value, rhs.value));
5574 }
5575
Nicolas Capens96d4e092016-11-18 14:22:38 -05005576 RValue<UInt4> operator+=(UInt4 &lhs, RValue<UInt4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005577 {
5578 return lhs = lhs + rhs;
5579 }
5580
Nicolas Capens96d4e092016-11-18 14:22:38 -05005581 RValue<UInt4> operator-=(UInt4 &lhs, RValue<UInt4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005582 {
5583 return lhs = lhs - rhs;
5584 }
5585
Nicolas Capens96d4e092016-11-18 14:22:38 -05005586 RValue<UInt4> operator*=(UInt4 &lhs, RValue<UInt4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005587 {
5588 return lhs = lhs * rhs;
5589 }
5590
Nicolas Capens96d4e092016-11-18 14:22:38 -05005591// RValue<UInt4> operator/=(UInt4 &lhs, RValue<UInt4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005592// {
5593// return lhs = lhs / rhs;
5594// }
5595
Nicolas Capens96d4e092016-11-18 14:22:38 -05005596// RValue<UInt4> operator%=(UInt4 &lhs, RValue<UInt4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005597// {
5598// return lhs = lhs % rhs;
5599// }
5600
Nicolas Capens96d4e092016-11-18 14:22:38 -05005601 RValue<UInt4> operator&=(UInt4 &lhs, RValue<UInt4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005602 {
5603 return lhs = lhs & rhs;
5604 }
5605
Nicolas Capens96d4e092016-11-18 14:22:38 -05005606 RValue<UInt4> operator|=(UInt4 &lhs, RValue<UInt4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005607 {
5608 return lhs = lhs | rhs;
5609 }
5610
Nicolas Capens96d4e092016-11-18 14:22:38 -05005611 RValue<UInt4> operator^=(UInt4 &lhs, RValue<UInt4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005612 {
5613 return lhs = lhs ^ rhs;
5614 }
5615
Nicolas Capens96d4e092016-11-18 14:22:38 -05005616 RValue<UInt4> operator<<=(UInt4 &lhs, unsigned char rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005617 {
5618 return lhs = lhs << rhs;
5619 }
5620
Nicolas Capens96d4e092016-11-18 14:22:38 -05005621 RValue<UInt4> operator>>=(UInt4 &lhs, unsigned char rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005622 {
5623 return lhs = lhs >> rhs;
5624 }
5625
5626 RValue<UInt4> operator+(RValue<UInt4> val)
5627 {
5628 return val;
5629 }
5630
5631 RValue<UInt4> operator-(RValue<UInt4> val)
5632 {
5633 return RValue<UInt4>(Nucleus::createNeg(val.value));
5634 }
5635
5636 RValue<UInt4> operator~(RValue<UInt4> val)
5637 {
5638 return RValue<UInt4>(Nucleus::createNot(val.value));
5639 }
5640
5641 RValue<UInt4> CmpEQ(RValue<UInt4> x, RValue<UInt4> y)
5642 {
5643 return RValue<UInt4>(Nucleus::createSExt(Nucleus::createICmpEQ(x.value, y.value), Int4::getType()));
5644 }
5645
5646 RValue<UInt4> CmpLT(RValue<UInt4> x, RValue<UInt4> y)
5647 {
5648 return RValue<UInt4>(Nucleus::createSExt(Nucleus::createICmpULT(x.value, y.value), Int4::getType()));
5649 }
5650
5651 RValue<UInt4> CmpLE(RValue<UInt4> x, RValue<UInt4> y)
5652 {
5653 return RValue<UInt4>(Nucleus::createSExt(Nucleus::createICmpULE(x.value, y.value), Int4::getType()));
5654 }
5655
5656 RValue<UInt4> CmpNEQ(RValue<UInt4> x, RValue<UInt4> y)
5657 {
5658 return RValue<UInt4>(Nucleus::createSExt(Nucleus::createICmpNE(x.value, y.value), Int4::getType()));
5659 }
5660
5661 RValue<UInt4> CmpNLT(RValue<UInt4> x, RValue<UInt4> y)
5662 {
5663 return RValue<UInt4>(Nucleus::createSExt(Nucleus::createICmpUGE(x.value, y.value), Int4::getType()));
5664 }
5665
5666 RValue<UInt4> CmpNLE(RValue<UInt4> x, RValue<UInt4> y)
5667 {
5668 return RValue<UInt4>(Nucleus::createSExt(Nucleus::createICmpUGT(x.value, y.value), Int4::getType()));
5669 }
5670
5671 RValue<UInt4> Max(RValue<UInt4> x, RValue<UInt4> y)
5672 {
Nicolas Capens53a8a3f2016-10-26 00:23:12 -04005673 Ice::Variable *condition = ::function->makeVariable(Ice::IceType_v4i1);
5674 auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Ule, condition, x.value, y.value);
5675 ::basicBlock->appendInst(cmp);
5676
5677 Ice::Variable *result = ::function->makeVariable(Ice::IceType_v4i32);
5678 auto select = Ice::InstSelect::create(::function, result, condition, y.value, x.value);
5679 ::basicBlock->appendInst(select);
5680
5681 return RValue<UInt4>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005682 }
5683
5684 RValue<UInt4> Min(RValue<UInt4> x, RValue<UInt4> y)
5685 {
Nicolas Capens53a8a3f2016-10-26 00:23:12 -04005686 Ice::Variable *condition = ::function->makeVariable(Ice::IceType_v4i1);
5687 auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Ugt, condition, x.value, y.value);
5688 ::basicBlock->appendInst(cmp);
5689
5690 Ice::Variable *result = ::function->makeVariable(Ice::IceType_v4i32);
5691 auto select = Ice::InstSelect::create(::function, result, condition, y.value, x.value);
5692 ::basicBlock->appendInst(select);
5693
5694 return RValue<UInt4>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005695 }
5696
5697 RValue<UShort8> Pack(RValue<UInt4> x, RValue<UInt4> y)
5698 {
Nicolas Capensec54a172016-10-25 17:32:37 -04005699 Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16);
5700 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::VectorPackUnsigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
5701 auto target = ::context->getConstantUndef(Ice::IceType_i32);
5702 auto pack = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
5703 pack->addArg(x.value);
5704 pack->addArg(y.value);
5705 ::basicBlock->appendInst(pack);
5706
5707 return RValue<UShort8>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005708 }
5709
5710 Type *UInt4::getType()
5711 {
Nicolas Capens4cfd4572016-10-20 01:00:19 -04005712 return T(Ice::IceType_v4i32);
Nicolas Capens598f8d82016-09-26 15:09:10 -04005713 }
5714
5715 Float::Float(RValue<Int> cast)
5716 {
5717 Value *integer = Nucleus::createSIToFP(cast.value, Float::getType());
5718
5719 storeValue(integer);
5720 }
5721
5722 Float::Float()
5723 {
5724 }
5725
5726 Float::Float(float x)
5727 {
5728 storeValue(Nucleus::createConstantFloat(x));
5729 }
5730
5731 Float::Float(RValue<Float> rhs)
5732 {
5733 storeValue(rhs.value);
5734 }
5735
5736 Float::Float(const Float &rhs)
5737 {
5738 Value *value = rhs.loadValue();
5739 storeValue(value);
5740 }
5741
5742 Float::Float(const Reference<Float> &rhs)
5743 {
5744 Value *value = rhs.loadValue();
5745 storeValue(value);
5746 }
5747
Nicolas Capens96d4e092016-11-18 14:22:38 -05005748 RValue<Float> Float::operator=(RValue<Float> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005749 {
5750 storeValue(rhs.value);
5751
5752 return rhs;
5753 }
5754
Nicolas Capens96d4e092016-11-18 14:22:38 -05005755 RValue<Float> Float::operator=(const Float &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005756 {
5757 Value *value = rhs.loadValue();
5758 storeValue(value);
5759
5760 return RValue<Float>(value);
5761 }
5762
Nicolas Capens96d4e092016-11-18 14:22:38 -05005763 RValue<Float> Float::operator=(const Reference<Float> &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005764 {
5765 Value *value = rhs.loadValue();
5766 storeValue(value);
5767
5768 return RValue<Float>(value);
5769 }
5770
5771 RValue<Float> operator+(RValue<Float> lhs, RValue<Float> rhs)
5772 {
5773 return RValue<Float>(Nucleus::createFAdd(lhs.value, rhs.value));
5774 }
5775
5776 RValue<Float> operator-(RValue<Float> lhs, RValue<Float> rhs)
5777 {
5778 return RValue<Float>(Nucleus::createFSub(lhs.value, rhs.value));
5779 }
5780
5781 RValue<Float> operator*(RValue<Float> lhs, RValue<Float> rhs)
5782 {
5783 return RValue<Float>(Nucleus::createFMul(lhs.value, rhs.value));
5784 }
5785
5786 RValue<Float> operator/(RValue<Float> lhs, RValue<Float> rhs)
5787 {
5788 return RValue<Float>(Nucleus::createFDiv(lhs.value, rhs.value));
5789 }
5790
Nicolas Capens96d4e092016-11-18 14:22:38 -05005791 RValue<Float> operator+=(Float &lhs, RValue<Float> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005792 {
5793 return lhs = lhs + rhs;
5794 }
5795
Nicolas Capens96d4e092016-11-18 14:22:38 -05005796 RValue<Float> operator-=(Float &lhs, RValue<Float> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005797 {
5798 return lhs = lhs - rhs;
5799 }
5800
Nicolas Capens96d4e092016-11-18 14:22:38 -05005801 RValue<Float> operator*=(Float &lhs, RValue<Float> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005802 {
5803 return lhs = lhs * rhs;
5804 }
5805
Nicolas Capens96d4e092016-11-18 14:22:38 -05005806 RValue<Float> operator/=(Float &lhs, RValue<Float> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04005807 {
5808 return lhs = lhs / rhs;
5809 }
5810
5811 RValue<Float> operator+(RValue<Float> val)
5812 {
5813 return val;
5814 }
5815
5816 RValue<Float> operator-(RValue<Float> val)
5817 {
5818 return RValue<Float>(Nucleus::createFNeg(val.value));
5819 }
5820
5821 RValue<Bool> operator<(RValue<Float> lhs, RValue<Float> rhs)
5822 {
5823 return RValue<Bool>(Nucleus::createFCmpOLT(lhs.value, rhs.value));
5824 }
5825
5826 RValue<Bool> operator<=(RValue<Float> lhs, RValue<Float> rhs)
5827 {
5828 return RValue<Bool>(Nucleus::createFCmpOLE(lhs.value, rhs.value));
5829 }
5830
5831 RValue<Bool> operator>(RValue<Float> lhs, RValue<Float> rhs)
5832 {
5833 return RValue<Bool>(Nucleus::createFCmpOGT(lhs.value, rhs.value));
5834 }
5835
5836 RValue<Bool> operator>=(RValue<Float> lhs, RValue<Float> rhs)
5837 {
5838 return RValue<Bool>(Nucleus::createFCmpOGE(lhs.value, rhs.value));
5839 }
5840
5841 RValue<Bool> operator!=(RValue<Float> lhs, RValue<Float> rhs)
5842 {
5843 return RValue<Bool>(Nucleus::createFCmpONE(lhs.value, rhs.value));
5844 }
5845
5846 RValue<Bool> operator==(RValue<Float> lhs, RValue<Float> rhs)
5847 {
5848 return RValue<Bool>(Nucleus::createFCmpOEQ(lhs.value, rhs.value));
5849 }
5850
5851 RValue<Float> Abs(RValue<Float> x)
5852 {
5853 return IfThenElse(x > 0.0f, x, -x);
5854 }
5855
5856 RValue<Float> Max(RValue<Float> x, RValue<Float> y)
5857 {
5858 return IfThenElse(x > y, x, y);
5859 }
5860
5861 RValue<Float> Min(RValue<Float> x, RValue<Float> y)
5862 {
5863 return IfThenElse(x < y, x, y);
5864 }
5865
5866 RValue<Float> Rcp_pp(RValue<Float> x, bool exactAtPow2)
5867 {
Nicolas Capensd52e9362016-10-31 23:23:15 -04005868 return 1.0f / x;
Nicolas Capens598f8d82016-09-26 15:09:10 -04005869 }
5870
5871 RValue<Float> RcpSqrt_pp(RValue<Float> x)
5872 {
Nicolas Capensd52e9362016-10-31 23:23:15 -04005873 return Rcp_pp(Sqrt(x));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005874 }
5875
5876 RValue<Float> Sqrt(RValue<Float> x)
5877 {
Nicolas Capensd52e9362016-10-31 23:23:15 -04005878 Ice::Variable *result = ::function->makeVariable(Ice::IceType_f32);
5879 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::Sqrt, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
5880 auto target = ::context->getConstantUndef(Ice::IceType_i32);
5881 auto sqrt = Ice::InstIntrinsicCall::create(::function, 1, result, target, intrinsic);
5882 sqrt->addArg(x.value);
5883 ::basicBlock->appendInst(sqrt);
5884
5885 return RValue<Float>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005886 }
5887
5888 RValue<Float> Round(RValue<Float> x)
5889 {
Nicolas Capensa8086512016-11-07 17:32:17 -05005890 return Float4(Round(Float4(x))).x;
Nicolas Capens598f8d82016-09-26 15:09:10 -04005891 }
5892
5893 RValue<Float> Trunc(RValue<Float> x)
5894 {
Nicolas Capensa8086512016-11-07 17:32:17 -05005895 return Float4(Trunc(Float4(x))).x;
Nicolas Capens598f8d82016-09-26 15:09:10 -04005896 }
5897
5898 RValue<Float> Frac(RValue<Float> x)
5899 {
Nicolas Capensa8086512016-11-07 17:32:17 -05005900 return Float4(Frac(Float4(x))).x;
Nicolas Capens598f8d82016-09-26 15:09:10 -04005901 }
5902
5903 RValue<Float> Floor(RValue<Float> x)
5904 {
Nicolas Capensa8086512016-11-07 17:32:17 -05005905 return Float4(Floor(Float4(x))).x;
Nicolas Capens598f8d82016-09-26 15:09:10 -04005906 }
5907
5908 RValue<Float> Ceil(RValue<Float> x)
5909 {
Nicolas Capensa8086512016-11-07 17:32:17 -05005910 return Float4(Ceil(Float4(x))).x;
Nicolas Capens598f8d82016-09-26 15:09:10 -04005911 }
5912
5913 Type *Float::getType()
5914 {
Nicolas Capens9709d4f2016-09-30 11:44:14 -04005915 return T(Ice::IceType_f32);
Nicolas Capens598f8d82016-09-26 15:09:10 -04005916 }
5917
5918 Float2::Float2(RValue<Float4> cast)
5919 {
Nicolas Capens22008782016-10-20 01:11:47 -04005920 storeValue(Nucleus::createBitCast(cast.value, getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005921 }
5922
5923 Type *Float2::getType()
5924 {
Nicolas Capens4cfd4572016-10-20 01:00:19 -04005925 return T(Type_v2f32);
Nicolas Capens598f8d82016-09-26 15:09:10 -04005926 }
5927
5928 Float4::Float4(RValue<Byte4> cast)
5929 {
5930 xyzw.parent = this;
5931
Nicolas Capensd4227962016-11-09 14:24:25 -05005932 Value *a = Int4(cast).loadValue();
5933 Value *xyzw = Nucleus::createSIToFP(a, Float4::getType());
5934
5935 storeValue(xyzw);
Nicolas Capens598f8d82016-09-26 15:09:10 -04005936 }
5937
5938 Float4::Float4(RValue<SByte4> cast)
5939 {
5940 xyzw.parent = this;
5941
Nicolas Capensd4227962016-11-09 14:24:25 -05005942 Value *a = Int4(cast).loadValue();
5943 Value *xyzw = Nucleus::createSIToFP(a, Float4::getType());
5944
5945 storeValue(xyzw);
Nicolas Capens598f8d82016-09-26 15:09:10 -04005946 }
5947
5948 Float4::Float4(RValue<Short4> cast)
5949 {
5950 xyzw.parent = this;
5951
5952 Int4 c(cast);
5953 storeValue(Nucleus::createSIToFP(RValue<Int4>(c).value, Float4::getType()));
5954 }
5955
5956 Float4::Float4(RValue<UShort4> cast)
5957 {
5958 xyzw.parent = this;
5959
5960 Int4 c(cast);
5961 storeValue(Nucleus::createSIToFP(RValue<Int4>(c).value, Float4::getType()));
5962 }
5963
5964 Float4::Float4(RValue<Int4> cast)
5965 {
5966 xyzw.parent = this;
5967
5968 Value *xyzw = Nucleus::createSIToFP(cast.value, Float4::getType());
5969
5970 storeValue(xyzw);
5971 }
5972
5973 Float4::Float4(RValue<UInt4> cast)
5974 {
5975 xyzw.parent = this;
5976
5977 Value *xyzw = Nucleus::createUIToFP(cast.value, Float4::getType());
5978
5979 storeValue(xyzw);
5980 }
5981
5982 Float4::Float4()
5983 {
5984 xyzw.parent = this;
5985 }
5986
5987 Float4::Float4(float xyzw)
5988 {
5989 constant(xyzw, xyzw, xyzw, xyzw);
5990 }
5991
5992 Float4::Float4(float x, float yzw)
5993 {
5994 constant(x, yzw, yzw, yzw);
5995 }
5996
5997 Float4::Float4(float x, float y, float zw)
5998 {
5999 constant(x, y, zw, zw);
6000 }
6001
6002 Float4::Float4(float x, float y, float z, float w)
6003 {
6004 constant(x, y, z, w);
6005 }
6006
6007 void Float4::constant(float x, float y, float z, float w)
6008 {
6009 xyzw.parent = this;
6010
Nicolas Capens13ac2322016-10-13 14:52:12 -04006011 double constantVector[4] = {x, y, z, w};
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04006012 storeValue(Nucleus::createConstantVector(constantVector, getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04006013 }
6014
6015 Float4::Float4(RValue<Float4> rhs)
6016 {
6017 xyzw.parent = this;
6018
6019 storeValue(rhs.value);
6020 }
6021
6022 Float4::Float4(const Float4 &rhs)
6023 {
6024 xyzw.parent = this;
6025
6026 Value *value = rhs.loadValue();
6027 storeValue(value);
6028 }
6029
6030 Float4::Float4(const Reference<Float4> &rhs)
6031 {
6032 xyzw.parent = this;
6033
6034 Value *value = rhs.loadValue();
6035 storeValue(value);
6036 }
6037
6038 Float4::Float4(RValue<Float> rhs)
6039 {
6040 xyzw.parent = this;
6041
Nicolas Capensd4227962016-11-09 14:24:25 -05006042 Value *vector = loadValue();
6043 Value *insert = Nucleus::createInsertElement(vector, rhs.value, 0);
6044
6045 int swizzle[4] = {0, 0, 0, 0};
6046 Value *replicate = Nucleus::createShuffleVector(insert, insert, swizzle);
6047
6048 storeValue(replicate);
Nicolas Capens598f8d82016-09-26 15:09:10 -04006049 }
6050
6051 Float4::Float4(const Float &rhs)
6052 {
6053 xyzw.parent = this;
6054
6055 *this = RValue<Float>(rhs.loadValue());
6056 }
6057
6058 Float4::Float4(const Reference<Float> &rhs)
6059 {
6060 xyzw.parent = this;
6061
6062 *this = RValue<Float>(rhs.loadValue());
6063 }
6064
Nicolas Capens96d4e092016-11-18 14:22:38 -05006065 RValue<Float4> Float4::operator=(float x)
Nicolas Capens598f8d82016-09-26 15:09:10 -04006066 {
6067 return *this = Float4(x, x, x, x);
6068 }
6069
Nicolas Capens96d4e092016-11-18 14:22:38 -05006070 RValue<Float4> Float4::operator=(RValue<Float4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04006071 {
6072 storeValue(rhs.value);
6073
6074 return rhs;
6075 }
6076
Nicolas Capens96d4e092016-11-18 14:22:38 -05006077 RValue<Float4> Float4::operator=(const Float4 &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04006078 {
6079 Value *value = rhs.loadValue();
6080 storeValue(value);
6081
6082 return RValue<Float4>(value);
6083 }
6084
Nicolas Capens96d4e092016-11-18 14:22:38 -05006085 RValue<Float4> Float4::operator=(const Reference<Float4> &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04006086 {
6087 Value *value = rhs.loadValue();
6088 storeValue(value);
6089
6090 return RValue<Float4>(value);
6091 }
6092
Nicolas Capens96d4e092016-11-18 14:22:38 -05006093 RValue<Float4> Float4::operator=(RValue<Float> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04006094 {
6095 return *this = Float4(rhs);
6096 }
6097
Nicolas Capens96d4e092016-11-18 14:22:38 -05006098 RValue<Float4> Float4::operator=(const Float &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04006099 {
6100 return *this = Float4(rhs);
6101 }
6102
Nicolas Capens96d4e092016-11-18 14:22:38 -05006103 RValue<Float4> Float4::operator=(const Reference<Float> &rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04006104 {
6105 return *this = Float4(rhs);
6106 }
6107
6108 RValue<Float4> operator+(RValue<Float4> lhs, RValue<Float4> rhs)
6109 {
6110 return RValue<Float4>(Nucleus::createFAdd(lhs.value, rhs.value));
6111 }
6112
6113 RValue<Float4> operator-(RValue<Float4> lhs, RValue<Float4> rhs)
6114 {
6115 return RValue<Float4>(Nucleus::createFSub(lhs.value, rhs.value));
6116 }
6117
6118 RValue<Float4> operator*(RValue<Float4> lhs, RValue<Float4> rhs)
6119 {
6120 return RValue<Float4>(Nucleus::createFMul(lhs.value, rhs.value));
6121 }
6122
6123 RValue<Float4> operator/(RValue<Float4> lhs, RValue<Float4> rhs)
6124 {
6125 return RValue<Float4>(Nucleus::createFDiv(lhs.value, rhs.value));
6126 }
6127
6128 RValue<Float4> operator%(RValue<Float4> lhs, RValue<Float4> rhs)
6129 {
6130 return RValue<Float4>(Nucleus::createFRem(lhs.value, rhs.value));
6131 }
6132
Nicolas Capens96d4e092016-11-18 14:22:38 -05006133 RValue<Float4> operator+=(Float4 &lhs, RValue<Float4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04006134 {
6135 return lhs = lhs + rhs;
6136 }
6137
Nicolas Capens96d4e092016-11-18 14:22:38 -05006138 RValue<Float4> operator-=(Float4 &lhs, RValue<Float4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04006139 {
6140 return lhs = lhs - rhs;
6141 }
6142
Nicolas Capens96d4e092016-11-18 14:22:38 -05006143 RValue<Float4> operator*=(Float4 &lhs, RValue<Float4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04006144 {
6145 return lhs = lhs * rhs;
6146 }
6147
Nicolas Capens96d4e092016-11-18 14:22:38 -05006148 RValue<Float4> operator/=(Float4 &lhs, RValue<Float4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04006149 {
6150 return lhs = lhs / rhs;
6151 }
6152
Nicolas Capens96d4e092016-11-18 14:22:38 -05006153 RValue<Float4> operator%=(Float4 &lhs, RValue<Float4> rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -04006154 {
6155 return lhs = lhs % rhs;
6156 }
6157
6158 RValue<Float4> operator+(RValue<Float4> val)
6159 {
6160 return val;
6161 }
6162
6163 RValue<Float4> operator-(RValue<Float4> val)
6164 {
6165 return RValue<Float4>(Nucleus::createFNeg(val.value));
6166 }
6167
6168 RValue<Float4> Abs(RValue<Float4> x)
6169 {
Nicolas Capens84272242016-11-09 13:31:06 -05006170 Value *vector = Nucleus::createBitCast(x.value, Int4::getType());
6171 int64_t constantVector[4] = {0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF};
6172 Value *result = Nucleus::createAnd(vector, V(Nucleus::createConstantVector(constantVector, Int4::getType())));
6173
6174 return As<Float4>(result);
Nicolas Capens598f8d82016-09-26 15:09:10 -04006175 }
6176
6177 RValue<Float4> Max(RValue<Float4> x, RValue<Float4> y)
6178 {
Nicolas Capens53a8a3f2016-10-26 00:23:12 -04006179 Ice::Variable *condition = ::function->makeVariable(Ice::IceType_v4i1);
6180 auto cmp = Ice::InstFcmp::create(::function, Ice::InstFcmp::Ule, condition, x.value, y.value);
6181 ::basicBlock->appendInst(cmp);
6182
6183 Ice::Variable *result = ::function->makeVariable(Ice::IceType_v4f32);
6184 auto select = Ice::InstSelect::create(::function, result, condition, y.value, x.value);
6185 ::basicBlock->appendInst(select);
6186
6187 return RValue<Float4>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04006188 }
6189
6190 RValue<Float4> Min(RValue<Float4> x, RValue<Float4> y)
6191 {
Nicolas Capens53a8a3f2016-10-26 00:23:12 -04006192 Ice::Variable *condition = ::function->makeVariable(Ice::IceType_v4i1);
6193 auto cmp = Ice::InstFcmp::create(::function, Ice::InstFcmp::Ugt, condition, x.value, y.value);
6194 ::basicBlock->appendInst(cmp);
6195
6196 Ice::Variable *result = ::function->makeVariable(Ice::IceType_v4f32);
6197 auto select = Ice::InstSelect::create(::function, result, condition, y.value, x.value);
6198 ::basicBlock->appendInst(select);
6199
6200 return RValue<Float4>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04006201 }
6202
6203 RValue<Float4> Rcp_pp(RValue<Float4> x, bool exactAtPow2)
6204 {
Nicolas Capensd52e9362016-10-31 23:23:15 -04006205 return Float4(1.0f) / x;
Nicolas Capens598f8d82016-09-26 15:09:10 -04006206 }
6207
6208 RValue<Float4> RcpSqrt_pp(RValue<Float4> x)
6209 {
Nicolas Capensd52e9362016-10-31 23:23:15 -04006210 return Rcp_pp(Sqrt(x));
Nicolas Capens598f8d82016-09-26 15:09:10 -04006211 }
6212
6213 RValue<Float4> Sqrt(RValue<Float4> x)
6214 {
Nicolas Capensd52e9362016-10-31 23:23:15 -04006215 Ice::Variable *result = ::function->makeVariable(Ice::IceType_v4f32);
6216 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::Sqrt, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
6217 auto target = ::context->getConstantUndef(Ice::IceType_i32);
6218 auto sqrt = Ice::InstIntrinsicCall::create(::function, 1, result, target, intrinsic);
6219 sqrt->addArg(x.value);
6220 ::basicBlock->appendInst(sqrt);
6221
6222 return RValue<Float4>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04006223 }
6224
Nicolas Capensc94ab742016-11-08 15:15:31 -05006225 RValue<Float4> Insert(RValue<Float4> x, RValue<Float> element, int i)
Nicolas Capens598f8d82016-09-26 15:09:10 -04006226 {
Nicolas Capensc94ab742016-11-08 15:15:31 -05006227 return RValue<Float4>(Nucleus::createInsertElement(x.value, element.value, i));
Nicolas Capens598f8d82016-09-26 15:09:10 -04006228 }
6229
6230 RValue<Float> Extract(RValue<Float4> x, int i)
6231 {
Nicolas Capense95d5342016-09-30 11:37:28 -04006232 return RValue<Float>(Nucleus::createExtractElement(x.value, Float::getType(), i));
Nicolas Capens598f8d82016-09-26 15:09:10 -04006233 }
6234
6235 RValue<Float4> Swizzle(RValue<Float4> x, unsigned char select)
6236 {
Nicolas Capense95d5342016-09-30 11:37:28 -04006237 return RValue<Float4>(createSwizzle4(x.value, select));
Nicolas Capens598f8d82016-09-26 15:09:10 -04006238 }
6239
6240 RValue<Float4> ShuffleLowHigh(RValue<Float4> x, RValue<Float4> y, unsigned char imm)
6241 {
Nicolas Capens37fbece2016-10-21 15:08:56 -04006242 int shuffle[4] =
6243 {
6244 ((imm >> 0) & 0x03) + 0,
6245 ((imm >> 2) & 0x03) + 0,
6246 ((imm >> 4) & 0x03) + 4,
6247 ((imm >> 6) & 0x03) + 4,
6248 };
6249
6250 return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
Nicolas Capens598f8d82016-09-26 15:09:10 -04006251 }
6252
6253 RValue<Float4> UnpackLow(RValue<Float4> x, RValue<Float4> y)
6254 {
Nicolas Capens37fbece2016-10-21 15:08:56 -04006255 int shuffle[4] = {0, 4, 1, 5};
6256 return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
Nicolas Capens598f8d82016-09-26 15:09:10 -04006257 }
6258
6259 RValue<Float4> UnpackHigh(RValue<Float4> x, RValue<Float4> y)
6260 {
Nicolas Capens37fbece2016-10-21 15:08:56 -04006261 int shuffle[4] = {2, 6, 3, 7};
6262 return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
Nicolas Capens598f8d82016-09-26 15:09:10 -04006263 }
6264
6265 RValue<Float4> Mask(Float4 &lhs, RValue<Float4> rhs, unsigned char select)
6266 {
6267 Value *vector = lhs.loadValue();
Nicolas Capensa4c30b02016-11-08 15:43:17 -05006268 Value *result = createMask4(vector, rhs.value, select);
6269 lhs.storeValue(result);
Nicolas Capens598f8d82016-09-26 15:09:10 -04006270
Nicolas Capensa4c30b02016-11-08 15:43:17 -05006271 return RValue<Float4>(result);
Nicolas Capens598f8d82016-09-26 15:09:10 -04006272 }
6273
6274 RValue<Int> SignMask(RValue<Float4> x)
6275 {
Nicolas Capensf2cb9df2016-10-21 17:26:13 -04006276 Ice::Variable *result = ::function->makeVariable(Ice::IceType_i32);
6277 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::SignMask, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
6278 auto target = ::context->getConstantUndef(Ice::IceType_i32);
6279 auto movmsk = Ice::InstIntrinsicCall::create(::function, 1, result, target, intrinsic);
6280 movmsk->addArg(x.value);
6281 ::basicBlock->appendInst(movmsk);
6282
6283 return RValue<Int>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04006284 }
6285
6286 RValue<Int4> CmpEQ(RValue<Float4> x, RValue<Float4> y)
6287 {
6288 return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpOEQ(x.value, y.value), Int4::getType()));
6289 }
6290
6291 RValue<Int4> CmpLT(RValue<Float4> x, RValue<Float4> y)
6292 {
6293 return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpOLT(x.value, y.value), Int4::getType()));
6294 }
6295
6296 RValue<Int4> CmpLE(RValue<Float4> x, RValue<Float4> y)
6297 {
6298 return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpOLE(x.value, y.value), Int4::getType()));
6299 }
6300
6301 RValue<Int4> CmpNEQ(RValue<Float4> x, RValue<Float4> y)
6302 {
6303 return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpONE(x.value, y.value), Int4::getType()));
6304 }
6305
6306 RValue<Int4> CmpNLT(RValue<Float4> x, RValue<Float4> y)
6307 {
6308 return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpOGE(x.value, y.value), Int4::getType()));
6309 }
6310
6311 RValue<Int4> CmpNLE(RValue<Float4> x, RValue<Float4> y)
6312 {
6313 return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpOGT(x.value, y.value), Int4::getType()));
6314 }
6315
6316 RValue<Float4> Round(RValue<Float4> x)
6317 {
Nicolas Capensa8086512016-11-07 17:32:17 -05006318 Ice::Variable *result = ::function->makeVariable(Ice::IceType_v4f32);
6319 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::Round, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
6320 auto target = ::context->getConstantUndef(Ice::IceType_i32);
6321 auto round = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
6322 round->addArg(x.value);
6323 round->addArg(::context->getConstantInt32(0));
6324 ::basicBlock->appendInst(round);
6325
6326 return RValue<Float4>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04006327 }
6328
6329 RValue<Float4> Trunc(RValue<Float4> x)
6330 {
Nicolas Capensa8086512016-11-07 17:32:17 -05006331 Ice::Variable *result = ::function->makeVariable(Ice::IceType_v4f32);
6332 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::Round, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
6333 auto target = ::context->getConstantUndef(Ice::IceType_i32);
6334 auto round = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
6335 round->addArg(x.value);
6336 round->addArg(::context->getConstantInt32(3));
6337 ::basicBlock->appendInst(round);
6338
6339 return RValue<Float4>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04006340 }
6341
6342 RValue<Float4> Frac(RValue<Float4> x)
6343 {
Nicolas Capensa8086512016-11-07 17:32:17 -05006344 return x - Floor(x);
Nicolas Capens598f8d82016-09-26 15:09:10 -04006345 }
6346
6347 RValue<Float4> Floor(RValue<Float4> x)
6348 {
Nicolas Capensa8086512016-11-07 17:32:17 -05006349 Ice::Variable *result = ::function->makeVariable(Ice::IceType_v4f32);
6350 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::Round, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
6351 auto target = ::context->getConstantUndef(Ice::IceType_i32);
6352 auto round = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
6353 round->addArg(x.value);
6354 round->addArg(::context->getConstantInt32(1));
6355 ::basicBlock->appendInst(round);
6356
6357 return RValue<Float4>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04006358 }
6359
6360 RValue<Float4> Ceil(RValue<Float4> x)
6361 {
Nicolas Capensa8086512016-11-07 17:32:17 -05006362 Ice::Variable *result = ::function->makeVariable(Ice::IceType_v4f32);
6363 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::Round, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
6364 auto target = ::context->getConstantUndef(Ice::IceType_i32);
6365 auto round = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
6366 round->addArg(x.value);
6367 round->addArg(::context->getConstantInt32(2));
6368 ::basicBlock->appendInst(round);
6369
6370 return RValue<Float4>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04006371 }
6372
6373 Type *Float4::getType()
6374 {
Nicolas Capens9709d4f2016-09-30 11:44:14 -04006375 return T(Ice::IceType_v4f32);
Nicolas Capens598f8d82016-09-26 15:09:10 -04006376 }
6377
6378 RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, int offset)
6379 {
Nicolas Capens8820f642016-09-30 04:42:43 -04006380 return lhs + RValue<Int>(Nucleus::createConstantInt(offset));
Nicolas Capens598f8d82016-09-26 15:09:10 -04006381 }
6382
6383 RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, RValue<Int> offset)
6384 {
Nicolas Capens6d738712016-09-30 04:15:22 -04006385 return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value, Byte::getType(), offset.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04006386 }
6387
6388 RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, RValue<UInt> offset)
6389 {
Nicolas Capens6d738712016-09-30 04:15:22 -04006390 return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value, Byte::getType(), offset.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04006391 }
6392
Nicolas Capens96d4e092016-11-18 14:22:38 -05006393 RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, int offset)
Nicolas Capens598f8d82016-09-26 15:09:10 -04006394 {
6395 return lhs = lhs + offset;
6396 }
6397
Nicolas Capens96d4e092016-11-18 14:22:38 -05006398 RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, RValue<Int> offset)
Nicolas Capens598f8d82016-09-26 15:09:10 -04006399 {
6400 return lhs = lhs + offset;
6401 }
6402
Nicolas Capens96d4e092016-11-18 14:22:38 -05006403 RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, RValue<UInt> offset)
Nicolas Capens598f8d82016-09-26 15:09:10 -04006404 {
6405 return lhs = lhs + offset;
6406 }
6407
6408 RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, int offset)
6409 {
6410 return lhs + -offset;
6411 }
6412
6413 RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, RValue<Int> offset)
6414 {
6415 return lhs + -offset;
6416 }
6417
6418 RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, RValue<UInt> offset)
6419 {
6420 return lhs + -offset;
6421 }
6422
Nicolas Capens96d4e092016-11-18 14:22:38 -05006423 RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, int offset)
Nicolas Capens598f8d82016-09-26 15:09:10 -04006424 {
6425 return lhs = lhs - offset;
6426 }
6427
Nicolas Capens96d4e092016-11-18 14:22:38 -05006428 RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, RValue<Int> offset)
Nicolas Capens598f8d82016-09-26 15:09:10 -04006429 {
6430 return lhs = lhs - offset;
6431 }
6432
Nicolas Capens96d4e092016-11-18 14:22:38 -05006433 RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, RValue<UInt> offset)
Nicolas Capens598f8d82016-09-26 15:09:10 -04006434 {
6435 return lhs = lhs - offset;
6436 }
6437
6438 void Return()
6439 {
6440 Nucleus::createRetVoid();
6441 Nucleus::setInsertBlock(Nucleus::createBasicBlock());
6442 Nucleus::createUnreachable();
6443 }
6444
Nicolas Capenseb253d02016-11-18 14:40:40 -05006445 void Return(RValue<Int> ret)
Nicolas Capens598f8d82016-09-26 15:09:10 -04006446 {
Nicolas Capenseb253d02016-11-18 14:40:40 -05006447 Nucleus::createRet(ret.value);
Nicolas Capensfdcca2d2016-10-20 11:31:36 -04006448 Nucleus::setInsertBlock(Nucleus::createBasicBlock());
6449 Nucleus::createUnreachable();
Nicolas Capens598f8d82016-09-26 15:09:10 -04006450 }
6451
Nicolas Capens598f8d82016-09-26 15:09:10 -04006452 bool branch(RValue<Bool> cmp, BasicBlock *bodyBB, BasicBlock *endBB)
6453 {
6454 Nucleus::createCondBr(cmp.value, bodyBB, endBB);
6455 Nucleus::setInsertBlock(bodyBB);
6456
6457 return true;
6458 }
6459
Nicolas Capens598f8d82016-09-26 15:09:10 -04006460 RValue<Long> Ticks()
6461 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04006462 assert(false && "UNIMPLEMENTED"); return RValue<Long>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04006463 }
6464}