blob: a8c2b747580144f71765aed5b185415cb2f7d723 [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
20#include "src/IceTypes.h"
21#include "src/IceCfg.h"
22#include "src/IceELFStreamer.h"
23#include "src/IceGlobalContext.h"
24#include "src/IceCfgNode.h"
25#include "src/IceELFObjectWriter.h"
Nicolas Capens8dfd9a72016-10-13 17:44:51 -040026#include "src/IceGlobalInits.h"
Nicolas Capens598f8d82016-09-26 15:09:10 -040027
28#include "llvm/Support/FileSystem.h"
29#include "llvm/Support/raw_os_ostream.h"
30
31#define WIN32_LEAN_AND_MEAN
32#define NOMINMAX
33#include <Windows.h>
34
35#include <mutex>
36#include <limits>
37#include <iostream>
38#include <cassert>
39
40namespace
41{
42 Ice::GlobalContext *context = nullptr;
43 Ice::Cfg *function = nullptr;
44 Ice::CfgNode *basicBlock = nullptr;
45 Ice::CfgLocalAllocatorScope *allocator = nullptr;
46 sw::Routine *routine = nullptr;
47
48 std::mutex codegenMutex;
49
Nicolas Capens9ed1a182016-10-24 09:52:23 -040050 sw::BasicBlock *falseBB = nullptr;
51
Nicolas Capens598f8d82016-09-26 15:09:10 -040052 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 Capens598f8d82016-09-26 15:09:10 -040074 class Value : public Ice::Variable {};
75 class BasicBlock : public Ice::CfgNode {};
76
77 Ice::Type T(Type *t)
78 {
Nicolas Capens23d99a42016-09-30 14:57:16 -040079 static_assert(Ice::IceType_NUM < EmulatedBits, "Ice::Type overlaps with our emulated types!");
80 return (Ice::Type)(reinterpret_cast<std::intptr_t>(t) & ~EmulatedBits);
Nicolas Capens598f8d82016-09-26 15:09:10 -040081 }
82
83 Type *T(Ice::Type t)
84 {
85 return reinterpret_cast<Type*>(t);
86 }
87
Nicolas Capens23d99a42016-09-30 14:57:16 -040088 Type *T(EmulatedType t)
89 {
90 return reinterpret_cast<Type*>(t);
91 }
92
Nicolas Capens598f8d82016-09-26 15:09:10 -040093 Value *V(Ice::Variable *v)
94 {
95 return reinterpret_cast<Value*>(v);
96 }
97
Nicolas Capens327f1df2016-10-21 14:26:34 -040098 Value *C(Ice::Constant *c) // Only safe for casting right-hand side operand
99 {
100 return reinterpret_cast<Value*>(c);
101 }
102
Nicolas Capens611642a2016-09-28 16:45:04 -0400103 BasicBlock *B(Ice::CfgNode *b)
104 {
105 return reinterpret_cast<BasicBlock*>(b);
106 }
107
Nicolas Capens598f8d82016-09-26 15:09:10 -0400108 Optimization optimization[10] = {InstructionCombining, Disabled};
109
Nicolas Capens66478362016-10-13 15:36:36 -0400110 using ElfHeader = std::conditional<sizeof(void*) == 8, Elf64_Ehdr, Elf32_Ehdr>::type;
111 using SectionHeader = std::conditional<sizeof(void*) == 8, Elf64_Shdr, Elf32_Shdr>::type;
112
113 inline const SectionHeader *sectionHeader(const ElfHeader *elfHeader)
114 {
115 return reinterpret_cast<const SectionHeader*>((intptr_t)elfHeader + elfHeader->e_shoff);
116 }
117
118 inline const SectionHeader *elfSection(const ElfHeader *elfHeader, int index)
119 {
120 return &sectionHeader(elfHeader)[index];
121 }
122
123 static void *relocateSymbol(const ElfHeader *elfHeader, const Elf32_Rel &relocation, const SectionHeader &relocationTable)
124 {
125 const SectionHeader *target = elfSection(elfHeader, relocationTable.sh_info);
126
127 intptr_t address = (intptr_t)elfHeader + target->sh_offset;
128 int32_t *patchSite = (int*)(address + relocation.r_offset);
129 uint32_t index = relocation.getSymbol();
130 int table = relocationTable.sh_link;
131 void *symbolValue = nullptr;
132
133 if(index != SHN_UNDEF)
134 {
135 if(table == SHN_UNDEF) return nullptr;
136 const SectionHeader *symbolTable = elfSection(elfHeader, table);
137
138 uint32_t symtab_entries = symbolTable->sh_size / symbolTable->sh_entsize;
139 if(index >= symtab_entries)
140 {
141 assert(index < symtab_entries && "Symbol Index out of range");
142 return nullptr;
143 }
144
145 intptr_t symbolAddress = (intptr_t)elfHeader + symbolTable->sh_offset;
146 Elf32_Sym &symbol = ((Elf32_Sym*)symbolAddress)[index];
147 uint16_t section = symbol.st_shndx;
148
149 if(section != SHN_UNDEF && section < SHN_LORESERVE)
150 {
151 const SectionHeader *target = elfSection(elfHeader, symbol.st_shndx);
152 symbolValue = reinterpret_cast<void*>((intptr_t)elfHeader + symbol.st_value + target->sh_offset);
153 }
154 else
155 {
156 return nullptr;
157 }
158 }
159
160 switch(relocation.getType())
161 {
162 case R_386_NONE:
163 // No relocation
164 break;
165 case R_386_32:
166 *patchSite = (int32_t)((intptr_t)symbolValue + *patchSite);
167 break;
168 // case R_386_PC32:
169 // *patchSite = (int32_t)((intptr_t)symbolValue + *patchSite - (intptr_t)patchSite);
170 // break;
171 default:
172 assert(false && "Unsupported relocation type");
173 return nullptr;
174 }
175
176 return symbolValue;
177 }
178
179 static void *relocateSymbol(const ElfHeader *elfHeader, const Elf64_Rela &relocation, const SectionHeader &relocationTable)
180 {
181 const SectionHeader *target = elfSection(elfHeader, relocationTable.sh_info);
182
183 intptr_t address = (intptr_t)elfHeader + target->sh_offset;
184 int32_t *patchSite = (int*)(address + relocation.r_offset);
185 uint32_t index = relocation.getSymbol();
186 int table = relocationTable.sh_link;
187 void *symbolValue = nullptr;
188
189 if(index != SHN_UNDEF)
190 {
191 if(table == SHN_UNDEF) return nullptr;
192 const SectionHeader *symbolTable = elfSection(elfHeader, table);
193
194 uint32_t symtab_entries = symbolTable->sh_size / symbolTable->sh_entsize;
195 if(index >= symtab_entries)
196 {
197 assert(index < symtab_entries && "Symbol Index out of range");
198 return nullptr;
199 }
200
201 intptr_t symbolAddress = (intptr_t)elfHeader + symbolTable->sh_offset;
202 Elf64_Sym &symbol = ((Elf64_Sym*)symbolAddress)[index];
203 uint16_t section = symbol.st_shndx;
204
205 if(section != SHN_UNDEF && section < SHN_LORESERVE)
206 {
207 const SectionHeader *target = elfSection(elfHeader, symbol.st_shndx);
208 symbolValue = reinterpret_cast<void*>((intptr_t)elfHeader + symbol.st_value + target->sh_offset);
209 }
210 else
211 {
212 return nullptr;
213 }
214 }
215
216 switch(relocation.getType())
217 {
218 case R_X86_64_NONE:
219 // No relocation
220 break;
221 // case R_X86_64_64:
222 // *patchSite = (int32_t)((intptr_t)symbolValue + *patchSite) + relocation->r_addend;
223 // break;
224 case R_X86_64_PC32:
225 *patchSite = (int32_t)((intptr_t)symbolValue + *patchSite - (intptr_t)patchSite) + relocation.r_addend;
226 break;
227 // case R_X86_64_32S:
228 // *patchSite = (int32_t)((intptr_t)symbolValue + *patchSite) + relocation.r_addend;
229 // break;
230 default:
231 assert(false && "Unsupported relocation type");
232 return nullptr;
233 }
234
235 return symbolValue;
236 }
237
Nicolas Capens598f8d82016-09-26 15:09:10 -0400238 void *loadImage(uint8_t *const elfImage)
239 {
Nicolas Capens598f8d82016-09-26 15:09:10 -0400240 ElfHeader *elfHeader = (ElfHeader*)elfImage;
241
242 if(!elfHeader->checkMagic())
243 {
244 return nullptr;
245 }
246
Nicolas Capens66478362016-10-13 15:36:36 -0400247 // Expect ELF bitness to match platform
248 assert(sizeof(void*) == 8 ? elfHeader->e_machine == EM_X86_64 : elfHeader->e_machine == EM_386);
249
Nicolas Capens598f8d82016-09-26 15:09:10 -0400250 SectionHeader *sectionHeader = (SectionHeader*)(elfImage + elfHeader->e_shoff);
251 void *entry = nullptr;
252
253 for(int i = 0; i < elfHeader->e_shnum; i++)
254 {
Nicolas Capens66478362016-10-13 15:36:36 -0400255 if(sectionHeader[i].sh_type == SHT_PROGBITS)
Nicolas Capens598f8d82016-09-26 15:09:10 -0400256 {
Nicolas Capens66478362016-10-13 15:36:36 -0400257 if(sectionHeader[i].sh_flags & SHF_EXECINSTR)
258 {
259 entry = elfImage + sectionHeader[i].sh_offset;
260 }
261 }
262 else if(sectionHeader[i].sh_type == SHT_REL)
263 {
264 assert(sizeof(void*) == 4 && "UNIMPLEMENTED"); // Only expected/implemented for 32-bit code
265
266 for(int index = 0; index < sectionHeader[i].sh_size / sectionHeader[i].sh_entsize; index++)
267 {
268 const Elf32_Rel &relocation = ((const Elf32_Rel*)(elfImage + sectionHeader[i].sh_offset))[index];
269 void *symbol = relocateSymbol(elfHeader, relocation, sectionHeader[i]);
270 }
271 }
272 else if(sectionHeader[i].sh_type == SHT_RELA)
273 {
274 assert(sizeof(void*) == 8 && "UNIMPLEMENTED"); // Only expected/implemented for 64-bit code
275
276 for(int index = 0; index < sectionHeader[i].sh_size / sectionHeader[i].sh_entsize; index++)
277 {
278 const Elf64_Rela &relocation = ((const Elf64_Rela*)(elfImage + sectionHeader[i].sh_offset))[index];
279 void *symbol = relocateSymbol(elfHeader, relocation, sectionHeader[i]);
280 }
Nicolas Capens598f8d82016-09-26 15:09:10 -0400281 }
282 }
283
284 return entry;
285 }
286
287 template<typename T>
288 struct ExecutableAllocator
289 {
290 ExecutableAllocator() {};
291 template<class U> ExecutableAllocator(const ExecutableAllocator<U> &other) {};
292
293 using value_type = T;
294 using size_type = std::size_t;
295
296 T *allocate(size_type n)
297 {
298 return (T*)VirtualAlloc(NULL, sizeof(T) * n, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
299 }
300
301 void deallocate(T *p, size_type n)
302 {
303 VirtualFree(p, 0, MEM_RELEASE);
304 }
305 };
306
307 class ELFMemoryStreamer : public Ice::ELFStreamer, public Routine
308 {
309 ELFMemoryStreamer(const ELFMemoryStreamer &) = delete;
310 ELFMemoryStreamer &operator=(const ELFMemoryStreamer &) = delete;
311
312 public:
Nicolas Capens58274b52016-10-19 23:45:19 -0400313 ELFMemoryStreamer() : Routine(), entry(nullptr)
Nicolas Capens598f8d82016-09-26 15:09:10 -0400314 {
315 position = 0;
316 buffer.reserve(0x1000);
317 }
318
319 virtual ~ELFMemoryStreamer()
320 {
321 if(buffer.size() != 0)
322 {
323 DWORD exeProtection;
324 VirtualProtect(&buffer[0], buffer.size(), oldProtection, &exeProtection);
325 }
326 }
327
328 void write8(uint8_t Value) override
329 {
330 if(position == (uint64_t)buffer.size())
331 {
332 buffer.push_back(Value);
333 position++;
334 }
335 else if(position < (uint64_t)buffer.size())
336 {
337 buffer[position] = Value;
338 position++;
339 }
340 else assert(false && "UNIMPLEMENTED");
341 }
342
343 void writeBytes(llvm::StringRef Bytes) override
344 {
345 std::size_t oldSize = buffer.size();
346 buffer.resize(oldSize + Bytes.size());
347 memcpy(&buffer[oldSize], Bytes.begin(), Bytes.size());
348 position += Bytes.size();
349 }
350
351 uint64_t tell() const override { return position; }
352
353 void seek(uint64_t Off) override { position = Off; }
354
355 const void *getEntry() override
356 {
Nicolas Capens58274b52016-10-19 23:45:19 -0400357 if(!entry)
358 {
359 VirtualProtect(&buffer[0], buffer.size(), PAGE_EXECUTE_READWRITE, &oldProtection);
360 position = std::numeric_limits<std::size_t>::max(); // Can't stream more data after this
Nicolas Capens598f8d82016-09-26 15:09:10 -0400361
Nicolas Capens58274b52016-10-19 23:45:19 -0400362 entry = loadImage(&buffer[0]);
363 }
364
365 return entry;
Nicolas Capens598f8d82016-09-26 15:09:10 -0400366 }
367
368 private:
Nicolas Capens58274b52016-10-19 23:45:19 -0400369 void *entry;
Nicolas Capens598f8d82016-09-26 15:09:10 -0400370 std::vector<uint8_t, ExecutableAllocator<uint8_t>> buffer;
371 std::size_t position;
372 DWORD oldProtection;
373 };
374
375 Nucleus::Nucleus()
376 {
377 ::codegenMutex.lock(); // Reactor is currently not thread safe
378
Nicolas Capens66478362016-10-13 15:36:36 -0400379 Ice::ClFlags &Flags = Ice::ClFlags::Flags;
380 Ice::ClFlags::getParsedClFlags(Flags);
381
382 Flags.setTargetArch(sizeof(void*) == 8 ? Ice::Target_X8664 : Ice::Target_X8632);
383 Flags.setOutFileType(Ice::FT_Elf);
384 Flags.setOptLevel(Ice::Opt_2);
385 Flags.setApplicationBinaryInterface(Ice::ABI_Platform);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400386
387 std::unique_ptr<Ice::Ostream> cout(new llvm::raw_os_ostream(std::cout));
388
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);
394 ::context = new Ice::GlobalContext(cout.get(), cout.get(), cout.get(), elfFile);
395 }
396 else
397 {
398 ELFMemoryStreamer *elfMemory = new ELFMemoryStreamer();
399 ::context = new Ice::GlobalContext(cout.get(), cout.get(), cout.get(), elfMemory);
400 ::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
427 ::function->translate();
Nicolas Capensde19f392016-10-19 10:29:49 -0400428 assert(!::function->hasError());
429
Nicolas Capens66478362016-10-13 15:36:36 -0400430 auto *globals = ::function->getGlobalInits().release();
431
432 if(globals && !globals->empty())
433 {
434 ::context->getGlobals()->merge(globals);
435 }
Nicolas Capens598f8d82016-09-26 15:09:10 -0400436
437 ::context->emitFileHeader();
438 ::function->emitIAS();
439 auto assembler = ::function->releaseAssembler();
Nicolas Capens66478362016-10-13 15:36:36 -0400440 auto objectWriter = ::context->getObjectWriter();
441 assembler->alignFunction();
442 objectWriter->writeFunctionCode(::function->getFunctionName(), false, assembler.get());
443 ::context->lowerGlobals("last");
Nicolas Capens73dd7a22016-10-20 13:20:34 -0400444 ::context->lowerConstants();
Nicolas Capens66478362016-10-13 15:36:36 -0400445 objectWriter->setUndefinedSyms(::context->getConstantExternSyms());
446 objectWriter->writeNonUserSections();
Nicolas Capens598f8d82016-09-26 15:09:10 -0400447
448 return ::routine;
449 }
450
451 void Nucleus::optimize()
452 {
453 }
454
455 Value *Nucleus::allocateStackVariable(Type *t, int arraySize)
456 {
457 Ice::Type type = T(t);
Nicolas Capensa8f98632016-10-20 11:25:55 -0400458 int typeSize = Ice::typeWidthInBytes(type);
459 int totalSize = typeSize * (arraySize ? arraySize : 1);
Nicolas Capense12780d2016-09-27 14:18:07 -0400460
Nicolas Capensa8f98632016-10-20 11:25:55 -0400461 auto bytes = Ice::ConstantInteger32::create(::context, type, totalSize);
Nicolas Capense12780d2016-09-27 14:18:07 -0400462 auto address = ::function->makeVariable(T(getPointerType(t)));
Nicolas Capensa8f98632016-10-20 11:25:55 -0400463 auto alloca = Ice::InstAlloca::create(::function, address, bytes, typeSize);
Nicolas Capense12780d2016-09-27 14:18:07 -0400464 ::function->getEntryNode()->getInsts().push_front(alloca);
465
466 return V(address);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400467 }
468
469 BasicBlock *Nucleus::createBasicBlock()
470 {
Nicolas Capens611642a2016-09-28 16:45:04 -0400471 return B(::function->makeNode());
Nicolas Capens598f8d82016-09-26 15:09:10 -0400472 }
473
474 BasicBlock *Nucleus::getInsertBlock()
475 {
Nicolas Capens611642a2016-09-28 16:45:04 -0400476 return B(::basicBlock);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400477 }
478
479 void Nucleus::setInsertBlock(BasicBlock *basicBlock)
480 {
Nicolas Capens9ed1a182016-10-24 09:52:23 -0400481 // assert(::basicBlock->getInsts().back().getTerminatorEdges().size() >= 0 && "Previous basic block must have a terminator");
Nicolas Capens611642a2016-09-28 16:45:04 -0400482 ::basicBlock = basicBlock;
Nicolas Capens598f8d82016-09-26 15:09:10 -0400483 }
484
Nicolas Capens598f8d82016-09-26 15:09:10 -0400485 void Nucleus::createFunction(Type *ReturnType, std::vector<Type*> &Params)
486 {
487 uint32_t sequenceNumber = 0;
488 ::function = Ice::Cfg::create(::context, sequenceNumber).release();
489 ::allocator = new Ice::CfgLocalAllocatorScope(::function);
490
491 for(Type *type : Params)
492 {
493 Ice::Variable *arg = ::function->makeVariable(T(type));
494 ::function->addArg(arg);
495 }
496
497 Ice::CfgNode *node = ::function->makeNode();
498 ::function->setEntryNode(node);
499 ::basicBlock = node;
500 }
501
502 Value *Nucleus::getArgument(unsigned int index)
503 {
504 return V(::function->getArgs()[index]);
505 }
506
507 void Nucleus::createRetVoid()
508 {
Nicolas Capensfdcca2d2016-10-20 11:31:36 -0400509 Ice::InstRet *ret = Ice::InstRet::create(::function);
510 ::basicBlock->appendInst(ret);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400511 }
512
513 void Nucleus::createRet(Value *v)
514 {
Nicolas Capensfdcca2d2016-10-20 11:31:36 -0400515 Ice::InstRet *ret = Ice::InstRet::create(::function, v);
516 ::basicBlock->appendInst(ret);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400517 }
518
519 void Nucleus::createBr(BasicBlock *dest)
520 {
Nicolas Capens611642a2016-09-28 16:45:04 -0400521 auto br = Ice::InstBr::create(::function, dest);
522 ::basicBlock->appendInst(br);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400523 }
524
525 void Nucleus::createCondBr(Value *cond, BasicBlock *ifTrue, BasicBlock *ifFalse)
526 {
Nicolas Capens611642a2016-09-28 16:45:04 -0400527 auto br = Ice::InstBr::create(::function, cond, ifTrue, ifFalse);
528 ::basicBlock->appendInst(br);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400529 }
530
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400531 static Value *createArithmetic(Ice::InstArithmetic::OpKind op, Value *lhs, Value *rhs)
532 {
Nicolas Capens327f1df2016-10-21 14:26:34 -0400533 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 -0400534
535 Ice::Variable *result = ::function->makeVariable(lhs->getType());
536 Ice::InstArithmetic *arithmetic = Ice::InstArithmetic::create(::function, op, result, lhs, rhs);
537 ::basicBlock->appendInst(arithmetic);
538
539 return V(result);
540 }
541
Nicolas Capens598f8d82016-09-26 15:09:10 -0400542 Value *Nucleus::createAdd(Value *lhs, Value *rhs)
543 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400544 return createArithmetic(Ice::InstArithmetic::Add, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400545 }
546
547 Value *Nucleus::createSub(Value *lhs, Value *rhs)
548 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400549 return createArithmetic(Ice::InstArithmetic::Sub, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400550 }
551
552 Value *Nucleus::createMul(Value *lhs, Value *rhs)
553 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400554 return createArithmetic(Ice::InstArithmetic::Mul, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400555 }
556
557 Value *Nucleus::createUDiv(Value *lhs, Value *rhs)
558 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400559 return createArithmetic(Ice::InstArithmetic::Udiv, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400560 }
561
562 Value *Nucleus::createSDiv(Value *lhs, Value *rhs)
563 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400564 return createArithmetic(Ice::InstArithmetic::Sdiv, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400565 }
566
567 Value *Nucleus::createFAdd(Value *lhs, Value *rhs)
568 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400569 return createArithmetic(Ice::InstArithmetic::Fadd, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400570 }
571
572 Value *Nucleus::createFSub(Value *lhs, Value *rhs)
573 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400574 return createArithmetic(Ice::InstArithmetic::Fsub, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400575 }
576
577 Value *Nucleus::createFMul(Value *lhs, Value *rhs)
578 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400579 return createArithmetic(Ice::InstArithmetic::Fmul, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400580 }
581
582 Value *Nucleus::createFDiv(Value *lhs, Value *rhs)
583 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400584 return createArithmetic(Ice::InstArithmetic::Fdiv, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400585 }
586
587 Value *Nucleus::createURem(Value *lhs, Value *rhs)
588 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400589 return createArithmetic(Ice::InstArithmetic::Urem, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400590 }
591
592 Value *Nucleus::createSRem(Value *lhs, Value *rhs)
593 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400594 return createArithmetic(Ice::InstArithmetic::Srem, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400595 }
596
597 Value *Nucleus::createFRem(Value *lhs, Value *rhs)
598 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400599 return createArithmetic(Ice::InstArithmetic::Frem, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400600 }
601
602 Value *Nucleus::createShl(Value *lhs, Value *rhs)
603 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400604 return createArithmetic(Ice::InstArithmetic::Shl, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400605 }
606
607 Value *Nucleus::createLShr(Value *lhs, Value *rhs)
608 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400609 return createArithmetic(Ice::InstArithmetic::Lshr, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400610 }
611
612 Value *Nucleus::createAShr(Value *lhs, Value *rhs)
613 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400614 return createArithmetic(Ice::InstArithmetic::Ashr, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400615 }
616
617 Value *Nucleus::createAnd(Value *lhs, Value *rhs)
618 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400619 return createArithmetic(Ice::InstArithmetic::And, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400620 }
621
622 Value *Nucleus::createOr(Value *lhs, Value *rhs)
623 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400624 return createArithmetic(Ice::InstArithmetic::Or, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400625 }
626
627 Value *Nucleus::createXor(Value *lhs, Value *rhs)
628 {
Nicolas Capens7d9f76d2016-09-29 13:39:44 -0400629 return createArithmetic(Ice::InstArithmetic::Xor, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400630 }
631
Nicolas Capens13ac2322016-10-13 14:52:12 -0400632 static Value *createAssign(Ice::Constant *constant)
Nicolas Capensb955d5b2016-09-28 22:36:28 -0400633 {
634 Ice::Variable *value = ::function->makeVariable(constant->getType());
635 auto assign = Ice::InstAssign::create(::function, value, constant);
636 ::basicBlock->appendInst(assign);
637
638 return V(value);
639 }
640
Nicolas Capens598f8d82016-09-26 15:09:10 -0400641 Value *Nucleus::createNeg(Value *v)
642 {
643 assert(false && "UNIMPLEMENTED"); return nullptr;
644 }
645
646 Value *Nucleus::createFNeg(Value *v)
647 {
648 assert(false && "UNIMPLEMENTED"); return nullptr;
649 }
650
651 Value *Nucleus::createNot(Value *v)
652 {
653 assert(false && "UNIMPLEMENTED"); return nullptr;
654 }
655
Nicolas Capense12780d2016-09-27 14:18:07 -0400656 Value *Nucleus::createLoad(Value *ptr, Type *type, bool isVolatile, unsigned int align)
Nicolas Capens598f8d82016-09-26 15:09:10 -0400657 {
Nicolas Capens23d99a42016-09-30 14:57:16 -0400658 int valueType = (int)reinterpret_cast<intptr_t>(type);
659 Ice::Variable *result = ::function->makeVariable(T(type));
660
661 if(valueType & EmulatedBits)
662 {
663 switch(valueType)
664 {
665 case Type_v4i8:
666 case Type_v2i16:
667 {
668 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::LoadSubVector, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
669 auto target = ::context->getConstantUndef(Ice::IceType_i32);
670 auto load = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
671 load->addArg(::context->getConstantInt32(4));
672 load->addArg(ptr);
673 ::basicBlock->appendInst(load);
674 }
675 break;
676 case Type_v2i32:
677 case Type_v8i8:
678 case Type_v4i16:
Nicolas Capens4cfd4572016-10-20 01:00:19 -0400679 case Type_v2f32:
Nicolas Capens23d99a42016-09-30 14:57:16 -0400680 {
681 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::LoadSubVector, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
682 auto target = ::context->getConstantUndef(Ice::IceType_i32);
683 auto load = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic);
684 load->addArg(::context->getConstantInt32(8));
685 load->addArg(ptr);
686 ::basicBlock->appendInst(load);
687 }
688 break;
689 default: assert(false && "UNIMPLEMENTED");
690 }
691 }
692 else
693 {
694 auto load = Ice::InstLoad::create(::function, result, ptr, align);
695 ::basicBlock->appendInst(load);
696 }
697
698 return V(result);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400699 }
700
Nicolas Capens6d738712016-09-30 04:15:22 -0400701 Value *Nucleus::createStore(Value *value, Value *ptr, Type *type, bool isVolatile, unsigned int align)
Nicolas Capens598f8d82016-09-26 15:09:10 -0400702 {
Nicolas Capens23d99a42016-09-30 14:57:16 -0400703 int valueType = (int)reinterpret_cast<intptr_t>(type);
704
705 if(valueType & EmulatedBits)
706 {
707 switch(valueType)
708 {
709 case Type_v4i8:
710 case Type_v2i16:
711 {
712 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::StoreSubVector, Ice::Intrinsics::SideEffects_T, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_T};
713 auto target = ::context->getConstantUndef(Ice::IceType_i32);
714 auto store = Ice::InstIntrinsicCall::create(::function, 3, nullptr, target, intrinsic);
715 store->addArg(::context->getConstantInt32(4));
716 store->addArg(value);
717 store->addArg(ptr);
718 ::basicBlock->appendInst(store);
719 }
720 break;
721 case Type_v2i32:
722 case Type_v8i8:
723 case Type_v4i16:
Nicolas Capens4cfd4572016-10-20 01:00:19 -0400724 case Type_v2f32:
Nicolas Capens23d99a42016-09-30 14:57:16 -0400725 {
726 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::StoreSubVector, Ice::Intrinsics::SideEffects_T, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_T};
727 auto target = ::context->getConstantUndef(Ice::IceType_i32);
728 auto store = Ice::InstIntrinsicCall::create(::function, 3, nullptr, target, intrinsic);
729 store->addArg(::context->getConstantInt32(8));
730 store->addArg(value);
731 store->addArg(ptr);
732 ::basicBlock->appendInst(store);
733 }
734 break;
735 default: assert(false && "UNIMPLEMENTED");
736 }
737 }
738 else
739 {
740 assert(T(value->getType()) == type);
741
742 auto store = Ice::InstStore::create(::function, value, ptr, align);
743 ::basicBlock->appendInst(store);
744 }
745
Nicolas Capens598f8d82016-09-26 15:09:10 -0400746 return value;
747 }
748
Nicolas Capens6d738712016-09-30 04:15:22 -0400749 Value *Nucleus::createGEP(Value *ptr, Type *type, Value *index)
Nicolas Capens598f8d82016-09-26 15:09:10 -0400750 {
Nicolas Capens8820f642016-09-30 04:42:43 -0400751 assert(index->getType() == Ice::IceType_i32);
752
753 if(!Ice::isByteSizedType(T(type)))
754 {
Nicolas Capens13ac2322016-10-13 14:52:12 -0400755 index = createMul(index, createConstantInt((int)Ice::typeWidthInBytes(T(type))));
Nicolas Capens8820f642016-09-30 04:42:43 -0400756 }
757
758 if(sizeof(void*) == 8)
759 {
760 index = createSExt(index, T(Ice::IceType_i64));
761 }
762
763 return createAdd(ptr, index);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400764 }
765
766 Value *Nucleus::createAtomicAdd(Value *ptr, Value *value)
767 {
768 assert(false && "UNIMPLEMENTED"); return nullptr;
769 }
770
Nicolas Capensa0c2fc52016-09-30 05:04:21 -0400771 static Value *createCast(Ice::InstCast::OpKind op, Value *v, Type *destType)
772 {
Nicolas Capens23d99a42016-09-30 14:57:16 -0400773 if(v->getType() == T(destType))
Nicolas Capensa0c2fc52016-09-30 05:04:21 -0400774 {
775 return v;
776 }
777
778 Ice::Variable *result = ::function->makeVariable(T(destType));
779 Ice::InstCast *cast = Ice::InstCast::create(::function, op, result, v);
780 ::basicBlock->appendInst(cast);
781
782 return V(result);
783 }
784
Nicolas Capens598f8d82016-09-26 15:09:10 -0400785 Value *Nucleus::createTrunc(Value *v, Type *destType)
786 {
Nicolas Capensa0c2fc52016-09-30 05:04:21 -0400787 return createCast(Ice::InstCast::Trunc, v, destType);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400788 }
789
790 Value *Nucleus::createZExt(Value *v, Type *destType)
791 {
Nicolas Capensa0c2fc52016-09-30 05:04:21 -0400792 return createCast(Ice::InstCast::Zext, v, destType);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400793 }
794
795 Value *Nucleus::createSExt(Value *v, Type *destType)
796 {
Nicolas Capensa0c2fc52016-09-30 05:04:21 -0400797 return createCast(Ice::InstCast::Sext, v, destType);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400798 }
799
800 Value *Nucleus::createFPToSI(Value *v, Type *destType)
801 {
Nicolas Capensa0c2fc52016-09-30 05:04:21 -0400802 return createCast(Ice::InstCast::Fptosi, v, destType);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400803 }
804
805 Value *Nucleus::createUIToFP(Value *v, Type *destType)
806 {
Nicolas Capensa0c2fc52016-09-30 05:04:21 -0400807 return createCast(Ice::InstCast::Uitofp, v, destType);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400808 }
809
810 Value *Nucleus::createSIToFP(Value *v, Type *destType)
811 {
Nicolas Capensa0c2fc52016-09-30 05:04:21 -0400812 return createCast(Ice::InstCast::Sitofp, v, destType);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400813 }
814
815 Value *Nucleus::createFPTrunc(Value *v, Type *destType)
816 {
Nicolas Capensa0c2fc52016-09-30 05:04:21 -0400817 return createCast(Ice::InstCast::Fptrunc, v, destType);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400818 }
819
820 Value *Nucleus::createFPExt(Value *v, Type *destType)
821 {
Nicolas Capensa0c2fc52016-09-30 05:04:21 -0400822 return createCast(Ice::InstCast::Fpext, v, destType);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400823 }
824
825 Value *Nucleus::createBitCast(Value *v, Type *destType)
826 {
Nicolas Capensa0c2fc52016-09-30 05:04:21 -0400827 return createCast(Ice::InstCast::Bitcast, v, destType);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400828 }
829
830 Value *Nucleus::createIntCast(Value *v, Type *destType, bool isSigned)
831 {
832 assert(false && "UNIMPLEMENTED"); return nullptr;
833 }
834
Nicolas Capens43dc6292016-10-20 00:01:38 -0400835 static Value *createIntCompare(Ice::InstIcmp::ICond condition, Value *lhs, Value *rhs)
Nicolas Capens598f8d82016-09-26 15:09:10 -0400836 {
Nicolas Capens611642a2016-09-28 16:45:04 -0400837 assert(lhs->getType() == rhs->getType());
838
Nicolas Capens43dc6292016-10-20 00:01:38 -0400839 auto result = ::function->makeVariable(Ice::isScalarIntegerType(lhs->getType()) ? Ice::IceType_i1 : lhs->getType());
840 auto cmp = Ice::InstIcmp::create(::function, condition, result, lhs, rhs);
Nicolas Capens611642a2016-09-28 16:45:04 -0400841 ::basicBlock->appendInst(cmp);
842
843 return V(result);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400844 }
845
Nicolas Capens43dc6292016-10-20 00:01:38 -0400846 Value *Nucleus::createICmpEQ(Value *lhs, Value *rhs)
847 {
848 return createIntCompare(Ice::InstIcmp::Eq, lhs, rhs);
849 }
850
851 Value *Nucleus::createICmpNE(Value *lhs, Value *rhs)
852 {
853 return createIntCompare(Ice::InstIcmp::Ne, lhs, rhs);
854 }
855
856 Value *Nucleus::createICmpUGT(Value *lhs, Value *rhs)
857 {
858 return createIntCompare(Ice::InstIcmp::Ugt, lhs, rhs);
859 }
860
861 Value *Nucleus::createICmpUGE(Value *lhs, Value *rhs)
862 {
863 return createIntCompare(Ice::InstIcmp::Uge, lhs, rhs);
864 }
865
866 Value *Nucleus::createICmpULT(Value *lhs, Value *rhs)
867 {
868 return createIntCompare(Ice::InstIcmp::Ult, lhs, rhs);
869 }
870
871 Value *Nucleus::createICmpULE(Value *lhs, Value *rhs)
872 {
873 return createIntCompare(Ice::InstIcmp::Ule, lhs, rhs);
874 }
875
876 Value *Nucleus::createICmpSGT(Value *lhs, Value *rhs)
877 {
878 return createIntCompare(Ice::InstIcmp::Sgt, lhs, rhs);
879 }
880
881 Value *Nucleus::createICmpSGE(Value *lhs, Value *rhs)
882 {
883 return createIntCompare(Ice::InstIcmp::Sge, lhs, rhs);
884 }
885
886 Value *Nucleus::createICmpSLT(Value *lhs, Value *rhs)
887 {
888 return createIntCompare(Ice::InstIcmp::Slt, lhs, rhs);
889 }
890
Nicolas Capens598f8d82016-09-26 15:09:10 -0400891 Value *Nucleus::createICmpSLE(Value *lhs, Value *rhs)
892 {
Nicolas Capens43dc6292016-10-20 00:01:38 -0400893 return createIntCompare(Ice::InstIcmp::Sle, lhs, rhs);
894 }
895
896 static Value *createFloatCompare(Ice::InstFcmp::FCond condition, Value *lhs, Value *rhs)
897 {
898 assert(lhs->getType() == rhs->getType());
899 assert(Ice::isScalarFloatingType(lhs->getType()) || lhs->getType() == Ice::IceType_v4f32);
900
901 auto result = ::function->makeVariable(Ice::isScalarFloatingType(lhs->getType()) ? Ice::IceType_i1 : Ice::IceType_v4i32);
902 auto cmp = Ice::InstFcmp::create(::function, condition, result, lhs, rhs);
903 ::basicBlock->appendInst(cmp);
904
905 return V(result);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400906 }
907
908 Value *Nucleus::createFCmpOEQ(Value *lhs, Value *rhs)
909 {
Nicolas Capens43dc6292016-10-20 00:01:38 -0400910 return createFloatCompare(Ice::InstFcmp::Oeq, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400911 }
912
913 Value *Nucleus::createFCmpOGT(Value *lhs, Value *rhs)
914 {
Nicolas Capens43dc6292016-10-20 00:01:38 -0400915 return createFloatCompare(Ice::InstFcmp::Ogt, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400916 }
917
918 Value *Nucleus::createFCmpOGE(Value *lhs, Value *rhs)
919 {
Nicolas Capens43dc6292016-10-20 00:01:38 -0400920 return createFloatCompare(Ice::InstFcmp::Oge, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400921 }
922
923 Value *Nucleus::createFCmpOLT(Value *lhs, Value *rhs)
924 {
Nicolas Capens43dc6292016-10-20 00:01:38 -0400925 return createFloatCompare(Ice::InstFcmp::Olt, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400926 }
927
928 Value *Nucleus::createFCmpOLE(Value *lhs, Value *rhs)
929 {
Nicolas Capens43dc6292016-10-20 00:01:38 -0400930 return createFloatCompare(Ice::InstFcmp::Ole, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400931 }
932
933 Value *Nucleus::createFCmpONE(Value *lhs, Value *rhs)
934 {
Nicolas Capens43dc6292016-10-20 00:01:38 -0400935 return createFloatCompare(Ice::InstFcmp::One, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400936 }
937
938 Value *Nucleus::createFCmpORD(Value *lhs, Value *rhs)
939 {
Nicolas Capens43dc6292016-10-20 00:01:38 -0400940 return createFloatCompare(Ice::InstFcmp::Ord, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400941 }
942
943 Value *Nucleus::createFCmpUNO(Value *lhs, Value *rhs)
944 {
Nicolas Capens43dc6292016-10-20 00:01:38 -0400945 return createFloatCompare(Ice::InstFcmp::Uno, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400946 }
947
948 Value *Nucleus::createFCmpUEQ(Value *lhs, Value *rhs)
949 {
Nicolas Capens43dc6292016-10-20 00:01:38 -0400950 return createFloatCompare(Ice::InstFcmp::Ueq, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400951 }
952
953 Value *Nucleus::createFCmpUGT(Value *lhs, Value *rhs)
954 {
Nicolas Capens43dc6292016-10-20 00:01:38 -0400955 return createFloatCompare(Ice::InstFcmp::Ugt, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400956 }
957
958 Value *Nucleus::createFCmpUGE(Value *lhs, Value *rhs)
959 {
Nicolas Capens43dc6292016-10-20 00:01:38 -0400960 return createFloatCompare(Ice::InstFcmp::Uge, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400961 }
962
963 Value *Nucleus::createFCmpULT(Value *lhs, Value *rhs)
964 {
Nicolas Capens43dc6292016-10-20 00:01:38 -0400965 return createFloatCompare(Ice::InstFcmp::Ult, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400966 }
967
968 Value *Nucleus::createFCmpULE(Value *lhs, Value *rhs)
969 {
Nicolas Capens43dc6292016-10-20 00:01:38 -0400970 return createFloatCompare(Ice::InstFcmp::Ule, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400971 }
972
973 Value *Nucleus::createFCmpUNE(Value *lhs, Value *rhs)
974 {
Nicolas Capens43dc6292016-10-20 00:01:38 -0400975 return createFloatCompare(Ice::InstFcmp::Une, lhs, rhs);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400976 }
977
Nicolas Capense95d5342016-09-30 11:37:28 -0400978 Value *Nucleus::createExtractElement(Value *vector, Type *type, int index)
Nicolas Capens598f8d82016-09-26 15:09:10 -0400979 {
Nicolas Capens9709d4f2016-09-30 11:44:14 -0400980 auto result = ::function->makeVariable(T(type));
981 auto extract = Ice::InstExtractElement::create(::function, result, vector, ::context->getConstantInt32(index));
982 ::basicBlock->appendInst(extract);
983
984 return V(result);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400985 }
986
987 Value *Nucleus::createInsertElement(Value *vector, Value *element, int index)
988 {
Nicolas Capens9709d4f2016-09-30 11:44:14 -0400989 auto result = ::function->makeVariable(vector->getType());
990 auto insert = Ice::InstInsertElement::create(::function, result, vector, element, ::context->getConstantInt32(index));
991 ::basicBlock->appendInst(insert);
992
993 return V(result);
Nicolas Capens598f8d82016-09-26 15:09:10 -0400994 }
995
Nicolas Capense89cd582016-09-30 14:23:47 -0400996 Value *Nucleus::createShuffleVector(Value *V1, Value *V2, const int *select)
Nicolas Capens598f8d82016-09-26 15:09:10 -0400997 {
Nicolas Capens619c0ab2016-09-30 14:46:24 -0400998 assert(V1->getType() == V2->getType());
999
1000 int size = Ice::typeNumElements(V1->getType());
1001 auto result = ::function->makeVariable(V1->getType());
1002 auto shuffle = Ice::InstShuffleVector::create(::function, result, V1, V2);
1003
1004 for(int i = 0; i < size; i++)
1005 {
1006 shuffle->addIndex(llvm::cast<Ice::ConstantInteger32>(::context->getConstantInt32(select[i])));
1007 }
1008
1009 ::basicBlock->appendInst(shuffle);
1010
1011 return V(result);
Nicolas Capens598f8d82016-09-26 15:09:10 -04001012 }
1013
1014 Value *Nucleus::createSelect(Value *C, Value *ifTrue, Value *ifFalse)
1015 {
1016 assert(false && "UNIMPLEMENTED"); return nullptr;
1017 }
1018
1019 Value *Nucleus::createSwitch(Value *v, BasicBlock *Dest, unsigned NumCases)
1020 {
1021 assert(false && "UNIMPLEMENTED"); return nullptr;
1022 }
1023
1024 void Nucleus::addSwitchCase(Value *Switch, int Case, BasicBlock *Branch)
1025 {
1026 assert(false && "UNIMPLEMENTED"); return;
1027 }
1028
1029 void Nucleus::createUnreachable()
1030 {
Nicolas Capensfdcca2d2016-10-20 11:31:36 -04001031 Ice::InstUnreachable *unreachable = Ice::InstUnreachable::create(::function);
1032 ::basicBlock->appendInst(unreachable);
Nicolas Capens598f8d82016-09-26 15:09:10 -04001033 }
1034
Nicolas Capense95d5342016-09-30 11:37:28 -04001035 static Value *createSwizzle4(Value *val, unsigned char select)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001036 {
Nicolas Capens619c0ab2016-09-30 14:46:24 -04001037 int swizzle[4] =
1038 {
1039 (select >> 0) & 0x03,
1040 (select >> 2) & 0x03,
1041 (select >> 4) & 0x03,
1042 (select >> 6) & 0x03,
1043 };
Nicolas Capens9709d4f2016-09-30 11:44:14 -04001044
Nicolas Capens619c0ab2016-09-30 14:46:24 -04001045 return Nucleus::createShuffleVector(val, val, swizzle);
Nicolas Capens598f8d82016-09-26 15:09:10 -04001046 }
1047
Nicolas Capense95d5342016-09-30 11:37:28 -04001048 static Value *createMask4(Value *lhs, Value *rhs, unsigned char select)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001049 {
1050 assert(false && "UNIMPLEMENTED"); return nullptr;
1051 }
1052
Nicolas Capens73dd7a22016-10-20 13:20:34 -04001053 Value *Nucleus::createConstantPointer(const void *address, Type *Ty, unsigned int align)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001054 {
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04001055 if(sizeof(void*) == 8)
1056 {
1057 return createAssign(::context->getConstantInt64(reinterpret_cast<intptr_t>(address)));
1058 }
1059 else
1060 {
1061 return createAssign(::context->getConstantInt32(reinterpret_cast<intptr_t>(address)));
1062 }
Nicolas Capens598f8d82016-09-26 15:09:10 -04001063 }
1064
1065 Type *Nucleus::getPointerType(Type *ElementType)
1066 {
Nicolas Capense12780d2016-09-27 14:18:07 -04001067 if(sizeof(void*) == 8)
1068 {
1069 return T(Ice::IceType_i64);
1070 }
1071 else
1072 {
1073 return T(Ice::IceType_i32);
1074 }
Nicolas Capens598f8d82016-09-26 15:09:10 -04001075 }
1076
Nicolas Capens13ac2322016-10-13 14:52:12 -04001077 Value *Nucleus::createNullValue(Type *Ty)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001078 {
Nicolas Capens73dd7a22016-10-20 13:20:34 -04001079 if(Ice::isVectorType(T(Ty)))
1080 {
1081 int64_t c[4] = {0, 0, 0, 0};
1082 return createConstantVector(c, Ty);
1083 }
1084 else
1085 {
1086 return createAssign(::context->getConstantZero(T(Ty)));
1087 }
Nicolas Capens598f8d82016-09-26 15:09:10 -04001088 }
1089
Nicolas Capens13ac2322016-10-13 14:52:12 -04001090 Value *Nucleus::createConstantLong(int64_t i)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001091 {
Nicolas Capens73dd7a22016-10-20 13:20:34 -04001092 return createAssign(::context->getConstantInt64(i));
Nicolas Capens598f8d82016-09-26 15:09:10 -04001093 }
1094
Nicolas Capens13ac2322016-10-13 14:52:12 -04001095 Value *Nucleus::createConstantInt(int i)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001096 {
Nicolas Capens13ac2322016-10-13 14:52:12 -04001097 return createAssign(::context->getConstantInt32(i));
Nicolas Capens598f8d82016-09-26 15:09:10 -04001098 }
1099
Nicolas Capens13ac2322016-10-13 14:52:12 -04001100 Value *Nucleus::createConstantInt(unsigned int i)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001101 {
Nicolas Capens73dd7a22016-10-20 13:20:34 -04001102 return createAssign(::context->getConstantInt32(i));
Nicolas Capens598f8d82016-09-26 15:09:10 -04001103 }
1104
Nicolas Capens13ac2322016-10-13 14:52:12 -04001105 Value *Nucleus::createConstantBool(bool b)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001106 {
Nicolas Capens73dd7a22016-10-20 13:20:34 -04001107 return createAssign(::context->getConstantInt1(b));
Nicolas Capens598f8d82016-09-26 15:09:10 -04001108 }
1109
Nicolas Capens13ac2322016-10-13 14:52:12 -04001110 Value *Nucleus::createConstantByte(signed char i)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001111 {
Nicolas Capens73dd7a22016-10-20 13:20:34 -04001112 return createAssign(::context->getConstantInt8(i));
Nicolas Capens598f8d82016-09-26 15:09:10 -04001113 }
1114
Nicolas Capens13ac2322016-10-13 14:52:12 -04001115 Value *Nucleus::createConstantByte(unsigned char i)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001116 {
Nicolas Capens73dd7a22016-10-20 13:20:34 -04001117 return createAssign(::context->getConstantInt8(i));
Nicolas Capens598f8d82016-09-26 15:09:10 -04001118 }
1119
Nicolas Capens13ac2322016-10-13 14:52:12 -04001120 Value *Nucleus::createConstantShort(short i)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001121 {
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04001122 return createAssign(::context->getConstantInt16(i));
Nicolas Capens598f8d82016-09-26 15:09:10 -04001123 }
1124
Nicolas Capens13ac2322016-10-13 14:52:12 -04001125 Value *Nucleus::createConstantShort(unsigned short i)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001126 {
Nicolas Capens73dd7a22016-10-20 13:20:34 -04001127 return createAssign(::context->getConstantInt16(i));
Nicolas Capens598f8d82016-09-26 15:09:10 -04001128 }
1129
Nicolas Capens13ac2322016-10-13 14:52:12 -04001130 Value *Nucleus::createConstantFloat(float x)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001131 {
Nicolas Capens73dd7a22016-10-20 13:20:34 -04001132 return createAssign(::context->getConstantFloat(x));
Nicolas Capens598f8d82016-09-26 15:09:10 -04001133 }
1134
Nicolas Capens13ac2322016-10-13 14:52:12 -04001135 Value *Nucleus::createNullPointer(Type *Ty)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001136 {
Nicolas Capens73dd7a22016-10-20 13:20:34 -04001137 if(true)
1138 {
1139 return createNullValue(T(sizeof(void*) == 8 ? Ice::IceType_i64 : Ice::IceType_i32));
1140 }
1141 else
1142 {
1143 return createConstantPointer(nullptr, Ty);
1144 }
Nicolas Capens598f8d82016-09-26 15:09:10 -04001145 }
1146
Nicolas Capens7f3f69c2016-10-20 01:29:33 -04001147 Value *Nucleus::createConstantVector(const int64_t *constants, Type *type)
Nicolas Capens13ac2322016-10-13 14:52:12 -04001148 {
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04001149 const int vectorSize = 16;
1150 assert(Ice::typeWidthInBytes(T(type)) == vectorSize);
1151 const int alignment = vectorSize;
1152 auto globalPool = ::function->getGlobalPool();
1153
Nicolas Capens7f3f69c2016-10-20 01:29:33 -04001154 const int64_t *i = constants;
1155 const double *f = reinterpret_cast<const double*>(constants);
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04001156 Ice::VariableDeclaration::DataInitializer *dataInitializer = nullptr;
Nicolas Capens7f3f69c2016-10-20 01:29:33 -04001157
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04001158 switch((int)reinterpret_cast<intptr_t>(type))
1159 {
1160 case Ice::IceType_v4i32:
Nicolas Capens7f3f69c2016-10-20 01:29:33 -04001161 {
1162 const int initializer[4] = {(int)i[0], (int)i[1], (int)i[2], (int)i[3]};
1163 static_assert(sizeof(initializer) == vectorSize, "!");
1164 dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize);
1165 }
1166 break;
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04001167 case Ice::IceType_v4f32:
1168 {
Nicolas Capens7f3f69c2016-10-20 01:29:33 -04001169 const float initializer[4] = {(float)f[0], (float)f[1], (float)f[2], (float)f[3]};
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04001170 static_assert(sizeof(initializer) == vectorSize, "!");
1171 dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize);
1172 }
1173 break;
1174 case Ice::IceType_v8i16:
1175 {
Nicolas Capens7f3f69c2016-10-20 01:29:33 -04001176 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 -04001177 static_assert(sizeof(initializer) == vectorSize, "!");
1178 dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize);
1179 }
1180 break;
1181 case Ice::IceType_v16i8:
1182 {
Nicolas Capens7f3f69c2016-10-20 01:29:33 -04001183 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 -04001184 static_assert(sizeof(initializer) == vectorSize, "!");
1185 dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize);
1186 }
1187 break;
1188 case Type_v2i32:
Nicolas Capens7f3f69c2016-10-20 01:29:33 -04001189 {
1190 const int initializer[4] = {(int)i[0], (int)i[1], (int)i[0], (int)i[1]};
1191 static_assert(sizeof(initializer) == vectorSize, "!");
1192 dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize);
1193 }
1194 break;
Nicolas Capens4cfd4572016-10-20 01:00:19 -04001195 case Type_v2f32:
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04001196 {
Nicolas Capens7f3f69c2016-10-20 01:29:33 -04001197 const float initializer[4] = {(float)f[0], (float)f[1], (float)f[0], (float)f[1]};
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04001198 static_assert(sizeof(initializer) == vectorSize, "!");
1199 dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize);
1200 }
1201 break;
1202 case Type_v4i16:
1203 {
Nicolas Capens7f3f69c2016-10-20 01:29:33 -04001204 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 -04001205 static_assert(sizeof(initializer) == vectorSize, "!");
1206 dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize);
1207 }
1208 break;
1209 case Type_v8i8:
1210 {
Nicolas Capens7f3f69c2016-10-20 01:29:33 -04001211 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 -04001212 static_assert(sizeof(initializer) == vectorSize, "!");
1213 dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize);
1214 }
1215 break;
1216 case Type_v4i8:
1217 {
Nicolas Capens7f3f69c2016-10-20 01:29:33 -04001218 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 -04001219 static_assert(sizeof(initializer) == vectorSize, "!");
1220 dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize);
1221 }
1222 break;
1223 default:
1224 assert(false && "Unknown constant vector type" && type);
1225 }
1226
1227 auto name = Ice::GlobalString::createWithoutString(::context);
1228 auto *variableDeclaration = Ice::VariableDeclaration::create(globalPool);
1229 variableDeclaration->setName(name);
1230 variableDeclaration->setAlignment(alignment);
1231 variableDeclaration->setIsConstant(true);
1232 variableDeclaration->addInitializer(dataInitializer);
1233
1234 ::function->addGlobal(variableDeclaration);
1235
1236 constexpr int32_t offset = 0;
1237 Ice::Operand *ptr = ::context->getConstantSym(offset, name);
1238
1239 Ice::Variable *result = ::function->makeVariable(T(type));
1240 auto load = Ice::InstLoad::create(::function, result, ptr, alignment);
1241 ::basicBlock->appendInst(load);
1242
1243 return V(result);
Nicolas Capens13ac2322016-10-13 14:52:12 -04001244 }
1245
1246 Value *Nucleus::createConstantVector(const double *constants, Type *type)
Nicolas Capens598f8d82016-09-26 15:09:10 -04001247 {
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04001248 return createConstantVector((const int64_t*)constants, type);
Nicolas Capens598f8d82016-09-26 15:09:10 -04001249 }
1250
1251 Type *Void::getType()
1252 {
1253 return T(Ice::IceType_void);
1254 }
1255
Nicolas Capens598f8d82016-09-26 15:09:10 -04001256 Bool::Bool(Argument<Bool> argument)
1257 {
1258 storeValue(argument.value);
1259 }
1260
1261 Bool::Bool()
1262 {
1263 }
1264
1265 Bool::Bool(bool x)
1266 {
1267 storeValue(Nucleus::createConstantBool(x));
1268 }
1269
1270 Bool::Bool(RValue<Bool> rhs)
1271 {
1272 storeValue(rhs.value);
1273 }
1274
1275 Bool::Bool(const Bool &rhs)
1276 {
1277 Value *value = rhs.loadValue();
1278 storeValue(value);
1279 }
1280
1281 Bool::Bool(const Reference<Bool> &rhs)
1282 {
1283 Value *value = rhs.loadValue();
1284 storeValue(value);
1285 }
1286
1287 RValue<Bool> Bool::operator=(RValue<Bool> rhs) const
1288 {
1289 storeValue(rhs.value);
1290
1291 return rhs;
1292 }
1293
1294 RValue<Bool> Bool::operator=(const Bool &rhs) const
1295 {
1296 Value *value = rhs.loadValue();
1297 storeValue(value);
1298
1299 return RValue<Bool>(value);
1300 }
1301
1302 RValue<Bool> Bool::operator=(const Reference<Bool> &rhs) const
1303 {
1304 Value *value = rhs.loadValue();
1305 storeValue(value);
1306
1307 return RValue<Bool>(value);
1308 }
1309
1310 RValue<Bool> operator!(RValue<Bool> val)
1311 {
1312 return RValue<Bool>(Nucleus::createNot(val.value));
1313 }
1314
1315 RValue<Bool> operator&&(RValue<Bool> lhs, RValue<Bool> rhs)
1316 {
1317 return RValue<Bool>(Nucleus::createAnd(lhs.value, rhs.value));
1318 }
1319
1320 RValue<Bool> operator||(RValue<Bool> lhs, RValue<Bool> rhs)
1321 {
1322 return RValue<Bool>(Nucleus::createOr(lhs.value, rhs.value));
1323 }
1324
1325 Type *Bool::getType()
1326 {
Nicolas Capens4cfd4572016-10-20 01:00:19 -04001327 return T(Ice::IceType_i1);
Nicolas Capens598f8d82016-09-26 15:09:10 -04001328 }
1329
1330 Byte::Byte(Argument<Byte> argument)
1331 {
1332 storeValue(argument.value);
1333 }
1334
1335 Byte::Byte(RValue<Int> cast)
1336 {
1337 Value *integer = Nucleus::createTrunc(cast.value, Byte::getType());
1338
1339 storeValue(integer);
1340 }
1341
1342 Byte::Byte(RValue<UInt> cast)
1343 {
1344 Value *integer = Nucleus::createTrunc(cast.value, Byte::getType());
1345
1346 storeValue(integer);
1347 }
1348
1349 Byte::Byte(RValue<UShort> cast)
1350 {
1351 Value *integer = Nucleus::createTrunc(cast.value, Byte::getType());
1352
1353 storeValue(integer);
1354 }
1355
1356 Byte::Byte()
1357 {
1358 }
1359
1360 Byte::Byte(int x)
1361 {
1362 storeValue(Nucleus::createConstantByte((unsigned char)x));
1363 }
1364
1365 Byte::Byte(unsigned char x)
1366 {
1367 storeValue(Nucleus::createConstantByte(x));
1368 }
1369
1370 Byte::Byte(RValue<Byte> rhs)
1371 {
1372 storeValue(rhs.value);
1373 }
1374
1375 Byte::Byte(const Byte &rhs)
1376 {
1377 Value *value = rhs.loadValue();
1378 storeValue(value);
1379 }
1380
1381 Byte::Byte(const Reference<Byte> &rhs)
1382 {
1383 Value *value = rhs.loadValue();
1384 storeValue(value);
1385 }
1386
1387 RValue<Byte> Byte::operator=(RValue<Byte> rhs) const
1388 {
1389 storeValue(rhs.value);
1390
1391 return rhs;
1392 }
1393
1394 RValue<Byte> Byte::operator=(const Byte &rhs) const
1395 {
1396 Value *value = rhs.loadValue();
1397 storeValue(value);
1398
1399 return RValue<Byte>(value);
1400 }
1401
1402 RValue<Byte> Byte::operator=(const Reference<Byte> &rhs) const
1403 {
1404 Value *value = rhs.loadValue();
1405 storeValue(value);
1406
1407 return RValue<Byte>(value);
1408 }
1409
1410 RValue<Byte> operator+(RValue<Byte> lhs, RValue<Byte> rhs)
1411 {
1412 return RValue<Byte>(Nucleus::createAdd(lhs.value, rhs.value));
1413 }
1414
1415 RValue<Byte> operator-(RValue<Byte> lhs, RValue<Byte> rhs)
1416 {
1417 return RValue<Byte>(Nucleus::createSub(lhs.value, rhs.value));
1418 }
1419
1420 RValue<Byte> operator*(RValue<Byte> lhs, RValue<Byte> rhs)
1421 {
1422 return RValue<Byte>(Nucleus::createMul(lhs.value, rhs.value));
1423 }
1424
1425 RValue<Byte> operator/(RValue<Byte> lhs, RValue<Byte> rhs)
1426 {
1427 return RValue<Byte>(Nucleus::createUDiv(lhs.value, rhs.value));
1428 }
1429
1430 RValue<Byte> operator%(RValue<Byte> lhs, RValue<Byte> rhs)
1431 {
1432 return RValue<Byte>(Nucleus::createURem(lhs.value, rhs.value));
1433 }
1434
1435 RValue<Byte> operator&(RValue<Byte> lhs, RValue<Byte> rhs)
1436 {
1437 return RValue<Byte>(Nucleus::createAnd(lhs.value, rhs.value));
1438 }
1439
1440 RValue<Byte> operator|(RValue<Byte> lhs, RValue<Byte> rhs)
1441 {
1442 return RValue<Byte>(Nucleus::createOr(lhs.value, rhs.value));
1443 }
1444
1445 RValue<Byte> operator^(RValue<Byte> lhs, RValue<Byte> rhs)
1446 {
1447 return RValue<Byte>(Nucleus::createXor(lhs.value, rhs.value));
1448 }
1449
1450 RValue<Byte> operator<<(RValue<Byte> lhs, RValue<Byte> rhs)
1451 {
1452 return RValue<Byte>(Nucleus::createShl(lhs.value, rhs.value));
1453 }
1454
1455 RValue<Byte> operator>>(RValue<Byte> lhs, RValue<Byte> rhs)
1456 {
1457 return RValue<Byte>(Nucleus::createLShr(lhs.value, rhs.value));
1458 }
1459
1460 RValue<Byte> operator+=(const Byte &lhs, RValue<Byte> rhs)
1461 {
1462 return lhs = lhs + rhs;
1463 }
1464
1465 RValue<Byte> operator-=(const Byte &lhs, RValue<Byte> rhs)
1466 {
1467 return lhs = lhs - rhs;
1468 }
1469
1470 RValue<Byte> operator*=(const Byte &lhs, RValue<Byte> rhs)
1471 {
1472 return lhs = lhs * rhs;
1473 }
1474
1475 RValue<Byte> operator/=(const Byte &lhs, RValue<Byte> rhs)
1476 {
1477 return lhs = lhs / rhs;
1478 }
1479
1480 RValue<Byte> operator%=(const Byte &lhs, RValue<Byte> rhs)
1481 {
1482 return lhs = lhs % rhs;
1483 }
1484
1485 RValue<Byte> operator&=(const Byte &lhs, RValue<Byte> rhs)
1486 {
1487 return lhs = lhs & rhs;
1488 }
1489
1490 RValue<Byte> operator|=(const Byte &lhs, RValue<Byte> rhs)
1491 {
1492 return lhs = lhs | rhs;
1493 }
1494
1495 RValue<Byte> operator^=(const Byte &lhs, RValue<Byte> rhs)
1496 {
1497 return lhs = lhs ^ rhs;
1498 }
1499
1500 RValue<Byte> operator<<=(const Byte &lhs, RValue<Byte> rhs)
1501 {
1502 return lhs = lhs << rhs;
1503 }
1504
1505 RValue<Byte> operator>>=(const Byte &lhs, RValue<Byte> rhs)
1506 {
1507 return lhs = lhs >> rhs;
1508 }
1509
1510 RValue<Byte> operator+(RValue<Byte> val)
1511 {
1512 return val;
1513 }
1514
1515 RValue<Byte> operator-(RValue<Byte> val)
1516 {
1517 return RValue<Byte>(Nucleus::createNeg(val.value));
1518 }
1519
1520 RValue<Byte> operator~(RValue<Byte> val)
1521 {
1522 return RValue<Byte>(Nucleus::createNot(val.value));
1523 }
1524
1525 RValue<Byte> operator++(const Byte &val, int) // Post-increment
1526 {
1527 RValue<Byte> res = val;
1528
1529 assert(false && "UNIMPLEMENTED");
1530
1531 return res;
1532 }
1533
1534 const Byte &operator++(const Byte &val) // Pre-increment
1535 {
1536 assert(false && "UNIMPLEMENTED");
1537
1538 return val;
1539 }
1540
1541 RValue<Byte> operator--(const Byte &val, int) // Post-decrement
1542 {
1543 RValue<Byte> res = val;
1544
1545 assert(false && "UNIMPLEMENTED");
1546
1547 return res;
1548 }
1549
1550 const Byte &operator--(const Byte &val) // Pre-decrement
1551 {
1552 assert(false && "UNIMPLEMENTED");
1553
1554 return val;
1555 }
1556
1557 RValue<Bool> operator<(RValue<Byte> lhs, RValue<Byte> rhs)
1558 {
1559 return RValue<Bool>(Nucleus::createICmpULT(lhs.value, rhs.value));
1560 }
1561
1562 RValue<Bool> operator<=(RValue<Byte> lhs, RValue<Byte> rhs)
1563 {
1564 return RValue<Bool>(Nucleus::createICmpULE(lhs.value, rhs.value));
1565 }
1566
1567 RValue<Bool> operator>(RValue<Byte> lhs, RValue<Byte> rhs)
1568 {
1569 return RValue<Bool>(Nucleus::createICmpUGT(lhs.value, rhs.value));
1570 }
1571
1572 RValue<Bool> operator>=(RValue<Byte> lhs, RValue<Byte> rhs)
1573 {
1574 return RValue<Bool>(Nucleus::createICmpUGE(lhs.value, rhs.value));
1575 }
1576
1577 RValue<Bool> operator!=(RValue<Byte> lhs, RValue<Byte> rhs)
1578 {
1579 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
1580 }
1581
1582 RValue<Bool> operator==(RValue<Byte> lhs, RValue<Byte> rhs)
1583 {
1584 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
1585 }
1586
1587 Type *Byte::getType()
1588 {
Nicolas Capens6d738712016-09-30 04:15:22 -04001589 return T(Ice::IceType_i8);
Nicolas Capens598f8d82016-09-26 15:09:10 -04001590 }
1591
1592 SByte::SByte(Argument<SByte> argument)
1593 {
1594 storeValue(argument.value);
1595 }
1596
1597 SByte::SByte(RValue<Int> cast)
1598 {
1599 Value *integer = Nucleus::createTrunc(cast.value, SByte::getType());
1600
1601 storeValue(integer);
1602 }
1603
1604 SByte::SByte(RValue<Short> cast)
1605 {
1606 Value *integer = Nucleus::createTrunc(cast.value, SByte::getType());
1607
1608 storeValue(integer);
1609 }
1610
1611 SByte::SByte()
1612 {
1613 }
1614
1615 SByte::SByte(signed char x)
1616 {
1617 storeValue(Nucleus::createConstantByte(x));
1618 }
1619
1620 SByte::SByte(RValue<SByte> rhs)
1621 {
1622 storeValue(rhs.value);
1623 }
1624
1625 SByte::SByte(const SByte &rhs)
1626 {
1627 Value *value = rhs.loadValue();
1628 storeValue(value);
1629 }
1630
1631 SByte::SByte(const Reference<SByte> &rhs)
1632 {
1633 Value *value = rhs.loadValue();
1634 storeValue(value);
1635 }
1636
1637 RValue<SByte> SByte::operator=(RValue<SByte> rhs) const
1638 {
1639 storeValue(rhs.value);
1640
1641 return rhs;
1642 }
1643
1644 RValue<SByte> SByte::operator=(const SByte &rhs) const
1645 {
1646 Value *value = rhs.loadValue();
1647 storeValue(value);
1648
1649 return RValue<SByte>(value);
1650 }
1651
1652 RValue<SByte> SByte::operator=(const Reference<SByte> &rhs) const
1653 {
1654 Value *value = rhs.loadValue();
1655 storeValue(value);
1656
1657 return RValue<SByte>(value);
1658 }
1659
1660 RValue<SByte> operator+(RValue<SByte> lhs, RValue<SByte> rhs)
1661 {
1662 return RValue<SByte>(Nucleus::createAdd(lhs.value, rhs.value));
1663 }
1664
1665 RValue<SByte> operator-(RValue<SByte> lhs, RValue<SByte> rhs)
1666 {
1667 return RValue<SByte>(Nucleus::createSub(lhs.value, rhs.value));
1668 }
1669
1670 RValue<SByte> operator*(RValue<SByte> lhs, RValue<SByte> rhs)
1671 {
1672 return RValue<SByte>(Nucleus::createMul(lhs.value, rhs.value));
1673 }
1674
1675 RValue<SByte> operator/(RValue<SByte> lhs, RValue<SByte> rhs)
1676 {
1677 return RValue<SByte>(Nucleus::createSDiv(lhs.value, rhs.value));
1678 }
1679
1680 RValue<SByte> operator%(RValue<SByte> lhs, RValue<SByte> rhs)
1681 {
1682 return RValue<SByte>(Nucleus::createSRem(lhs.value, rhs.value));
1683 }
1684
1685 RValue<SByte> operator&(RValue<SByte> lhs, RValue<SByte> rhs)
1686 {
1687 return RValue<SByte>(Nucleus::createAnd(lhs.value, rhs.value));
1688 }
1689
1690 RValue<SByte> operator|(RValue<SByte> lhs, RValue<SByte> rhs)
1691 {
1692 return RValue<SByte>(Nucleus::createOr(lhs.value, rhs.value));
1693 }
1694
1695 RValue<SByte> operator^(RValue<SByte> lhs, RValue<SByte> rhs)
1696 {
1697 return RValue<SByte>(Nucleus::createXor(lhs.value, rhs.value));
1698 }
1699
1700 RValue<SByte> operator<<(RValue<SByte> lhs, RValue<SByte> rhs)
1701 {
1702 return RValue<SByte>(Nucleus::createShl(lhs.value, rhs.value));
1703 }
1704
1705 RValue<SByte> operator>>(RValue<SByte> lhs, RValue<SByte> rhs)
1706 {
1707 return RValue<SByte>(Nucleus::createAShr(lhs.value, rhs.value));
1708 }
1709
1710 RValue<SByte> operator+=(const SByte &lhs, RValue<SByte> rhs)
1711 {
1712 return lhs = lhs + rhs;
1713 }
1714
1715 RValue<SByte> operator-=(const SByte &lhs, RValue<SByte> rhs)
1716 {
1717 return lhs = lhs - rhs;
1718 }
1719
1720 RValue<SByte> operator*=(const SByte &lhs, RValue<SByte> rhs)
1721 {
1722 return lhs = lhs * rhs;
1723 }
1724
1725 RValue<SByte> operator/=(const SByte &lhs, RValue<SByte> rhs)
1726 {
1727 return lhs = lhs / rhs;
1728 }
1729
1730 RValue<SByte> operator%=(const SByte &lhs, RValue<SByte> rhs)
1731 {
1732 return lhs = lhs % rhs;
1733 }
1734
1735 RValue<SByte> operator&=(const SByte &lhs, RValue<SByte> rhs)
1736 {
1737 return lhs = lhs & rhs;
1738 }
1739
1740 RValue<SByte> operator|=(const SByte &lhs, RValue<SByte> rhs)
1741 {
1742 return lhs = lhs | rhs;
1743 }
1744
1745 RValue<SByte> operator^=(const SByte &lhs, RValue<SByte> rhs)
1746 {
1747 return lhs = lhs ^ rhs;
1748 }
1749
1750 RValue<SByte> operator<<=(const SByte &lhs, RValue<SByte> rhs)
1751 {
1752 return lhs = lhs << rhs;
1753 }
1754
1755 RValue<SByte> operator>>=(const SByte &lhs, RValue<SByte> rhs)
1756 {
1757 return lhs = lhs >> rhs;
1758 }
1759
1760 RValue<SByte> operator+(RValue<SByte> val)
1761 {
1762 return val;
1763 }
1764
1765 RValue<SByte> operator-(RValue<SByte> val)
1766 {
1767 return RValue<SByte>(Nucleus::createNeg(val.value));
1768 }
1769
1770 RValue<SByte> operator~(RValue<SByte> val)
1771 {
1772 return RValue<SByte>(Nucleus::createNot(val.value));
1773 }
1774
1775 RValue<SByte> operator++(const SByte &val, int) // Post-increment
1776 {
1777 RValue<SByte> res = val;
1778
1779 assert(false && "UNIMPLEMENTED");
1780
1781 return res;
1782 }
1783
1784 const SByte &operator++(const SByte &val) // Pre-increment
1785 {
1786 assert(false && "UNIMPLEMENTED");
1787 assert(false && "UNIMPLEMENTED");
1788
1789 return val;
1790 }
1791
1792 RValue<SByte> operator--(const SByte &val, int) // Post-decrement
1793 {
1794 RValue<SByte> res = val;
1795
1796 assert(false && "UNIMPLEMENTED");
1797 assert(false && "UNIMPLEMENTED");
1798
1799 return res;
1800 }
1801
1802 const SByte &operator--(const SByte &val) // Pre-decrement
1803 {
1804 assert(false && "UNIMPLEMENTED");
1805 assert(false && "UNIMPLEMENTED");
1806
1807 return val;
1808 }
1809
1810 RValue<Bool> operator<(RValue<SByte> lhs, RValue<SByte> rhs)
1811 {
1812 return RValue<Bool>(Nucleus::createICmpSLT(lhs.value, rhs.value));
1813 }
1814
1815 RValue<Bool> operator<=(RValue<SByte> lhs, RValue<SByte> rhs)
1816 {
1817 return RValue<Bool>(Nucleus::createICmpSLE(lhs.value, rhs.value));
1818 }
1819
1820 RValue<Bool> operator>(RValue<SByte> lhs, RValue<SByte> rhs)
1821 {
1822 return RValue<Bool>(Nucleus::createICmpSGT(lhs.value, rhs.value));
1823 }
1824
1825 RValue<Bool> operator>=(RValue<SByte> lhs, RValue<SByte> rhs)
1826 {
1827 return RValue<Bool>(Nucleus::createICmpSGE(lhs.value, rhs.value));
1828 }
1829
1830 RValue<Bool> operator!=(RValue<SByte> lhs, RValue<SByte> rhs)
1831 {
1832 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
1833 }
1834
1835 RValue<Bool> operator==(RValue<SByte> lhs, RValue<SByte> rhs)
1836 {
1837 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
1838 }
1839
1840 Type *SByte::getType()
1841 {
Nicolas Capens4cfd4572016-10-20 01:00:19 -04001842 return T(Ice::IceType_i8);
Nicolas Capens598f8d82016-09-26 15:09:10 -04001843 }
1844
1845 Short::Short(Argument<Short> argument)
1846 {
1847 storeValue(argument.value);
1848 }
1849
1850 Short::Short(RValue<Int> cast)
1851 {
1852 Value *integer = Nucleus::createTrunc(cast.value, Short::getType());
1853
1854 storeValue(integer);
1855 }
1856
1857 Short::Short()
1858 {
1859 }
1860
1861 Short::Short(short x)
1862 {
1863 storeValue(Nucleus::createConstantShort(x));
1864 }
1865
1866 Short::Short(RValue<Short> rhs)
1867 {
1868 storeValue(rhs.value);
1869 }
1870
1871 Short::Short(const Short &rhs)
1872 {
1873 Value *value = rhs.loadValue();
1874 storeValue(value);
1875 }
1876
1877 Short::Short(const Reference<Short> &rhs)
1878 {
1879 Value *value = rhs.loadValue();
1880 storeValue(value);
1881 }
1882
1883 RValue<Short> Short::operator=(RValue<Short> rhs) const
1884 {
1885 storeValue(rhs.value);
1886
1887 return rhs;
1888 }
1889
1890 RValue<Short> Short::operator=(const Short &rhs) const
1891 {
1892 Value *value = rhs.loadValue();
1893 storeValue(value);
1894
1895 return RValue<Short>(value);
1896 }
1897
1898 RValue<Short> Short::operator=(const Reference<Short> &rhs) const
1899 {
1900 Value *value = rhs.loadValue();
1901 storeValue(value);
1902
1903 return RValue<Short>(value);
1904 }
1905
1906 RValue<Short> operator+(RValue<Short> lhs, RValue<Short> rhs)
1907 {
1908 return RValue<Short>(Nucleus::createAdd(lhs.value, rhs.value));
1909 }
1910
1911 RValue<Short> operator-(RValue<Short> lhs, RValue<Short> rhs)
1912 {
1913 return RValue<Short>(Nucleus::createSub(lhs.value, rhs.value));
1914 }
1915
1916 RValue<Short> operator*(RValue<Short> lhs, RValue<Short> rhs)
1917 {
1918 return RValue<Short>(Nucleus::createMul(lhs.value, rhs.value));
1919 }
1920
1921 RValue<Short> operator/(RValue<Short> lhs, RValue<Short> rhs)
1922 {
1923 return RValue<Short>(Nucleus::createSDiv(lhs.value, rhs.value));
1924 }
1925
1926 RValue<Short> operator%(RValue<Short> lhs, RValue<Short> rhs)
1927 {
1928 return RValue<Short>(Nucleus::createSRem(lhs.value, rhs.value));
1929 }
1930
1931 RValue<Short> operator&(RValue<Short> lhs, RValue<Short> rhs)
1932 {
1933 return RValue<Short>(Nucleus::createAnd(lhs.value, rhs.value));
1934 }
1935
1936 RValue<Short> operator|(RValue<Short> lhs, RValue<Short> rhs)
1937 {
1938 return RValue<Short>(Nucleus::createOr(lhs.value, rhs.value));
1939 }
1940
1941 RValue<Short> operator^(RValue<Short> lhs, RValue<Short> rhs)
1942 {
1943 return RValue<Short>(Nucleus::createXor(lhs.value, rhs.value));
1944 }
1945
1946 RValue<Short> operator<<(RValue<Short> lhs, RValue<Short> rhs)
1947 {
1948 return RValue<Short>(Nucleus::createShl(lhs.value, rhs.value));
1949 }
1950
1951 RValue<Short> operator>>(RValue<Short> lhs, RValue<Short> rhs)
1952 {
1953 return RValue<Short>(Nucleus::createAShr(lhs.value, rhs.value));
1954 }
1955
1956 RValue<Short> operator+=(const Short &lhs, RValue<Short> rhs)
1957 {
1958 return lhs = lhs + rhs;
1959 }
1960
1961 RValue<Short> operator-=(const Short &lhs, RValue<Short> rhs)
1962 {
1963 return lhs = lhs - rhs;
1964 }
1965
1966 RValue<Short> operator*=(const Short &lhs, RValue<Short> rhs)
1967 {
1968 return lhs = lhs * rhs;
1969 }
1970
1971 RValue<Short> operator/=(const Short &lhs, RValue<Short> rhs)
1972 {
1973 return lhs = lhs / rhs;
1974 }
1975
1976 RValue<Short> operator%=(const Short &lhs, RValue<Short> rhs)
1977 {
1978 return lhs = lhs % rhs;
1979 }
1980
1981 RValue<Short> operator&=(const Short &lhs, RValue<Short> rhs)
1982 {
1983 return lhs = lhs & rhs;
1984 }
1985
1986 RValue<Short> operator|=(const Short &lhs, RValue<Short> rhs)
1987 {
1988 return lhs = lhs | rhs;
1989 }
1990
1991 RValue<Short> operator^=(const Short &lhs, RValue<Short> rhs)
1992 {
1993 return lhs = lhs ^ rhs;
1994 }
1995
1996 RValue<Short> operator<<=(const Short &lhs, RValue<Short> rhs)
1997 {
1998 return lhs = lhs << rhs;
1999 }
2000
2001 RValue<Short> operator>>=(const Short &lhs, RValue<Short> rhs)
2002 {
2003 return lhs = lhs >> rhs;
2004 }
2005
2006 RValue<Short> operator+(RValue<Short> val)
2007 {
2008 return val;
2009 }
2010
2011 RValue<Short> operator-(RValue<Short> val)
2012 {
2013 return RValue<Short>(Nucleus::createNeg(val.value));
2014 }
2015
2016 RValue<Short> operator~(RValue<Short> val)
2017 {
2018 return RValue<Short>(Nucleus::createNot(val.value));
2019 }
2020
2021 RValue<Short> operator++(const Short &val, int) // Post-increment
2022 {
2023 RValue<Short> res = val;
2024
2025 assert(false && "UNIMPLEMENTED");
2026 assert(false && "UNIMPLEMENTED");
2027
2028 return res;
2029 }
2030
2031 const Short &operator++(const Short &val) // Pre-increment
2032 {
2033 assert(false && "UNIMPLEMENTED");
2034 assert(false && "UNIMPLEMENTED");
2035
2036 return val;
2037 }
2038
2039 RValue<Short> operator--(const Short &val, int) // Post-decrement
2040 {
2041 RValue<Short> res = val;
2042
2043 assert(false && "UNIMPLEMENTED");
2044 assert(false && "UNIMPLEMENTED");
2045
2046 return res;
2047 }
2048
2049 const Short &operator--(const Short &val) // Pre-decrement
2050 {
2051 assert(false && "UNIMPLEMENTED");
2052 assert(false && "UNIMPLEMENTED");
2053
2054 return val;
2055 }
2056
2057 RValue<Bool> operator<(RValue<Short> lhs, RValue<Short> rhs)
2058 {
2059 return RValue<Bool>(Nucleus::createICmpSLT(lhs.value, rhs.value));
2060 }
2061
2062 RValue<Bool> operator<=(RValue<Short> lhs, RValue<Short> rhs)
2063 {
2064 return RValue<Bool>(Nucleus::createICmpSLE(lhs.value, rhs.value));
2065 }
2066
2067 RValue<Bool> operator>(RValue<Short> lhs, RValue<Short> rhs)
2068 {
2069 return RValue<Bool>(Nucleus::createICmpSGT(lhs.value, rhs.value));
2070 }
2071
2072 RValue<Bool> operator>=(RValue<Short> lhs, RValue<Short> rhs)
2073 {
2074 return RValue<Bool>(Nucleus::createICmpSGE(lhs.value, rhs.value));
2075 }
2076
2077 RValue<Bool> operator!=(RValue<Short> lhs, RValue<Short> rhs)
2078 {
2079 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
2080 }
2081
2082 RValue<Bool> operator==(RValue<Short> lhs, RValue<Short> rhs)
2083 {
2084 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
2085 }
2086
2087 Type *Short::getType()
2088 {
Nicolas Capens4cfd4572016-10-20 01:00:19 -04002089 return T(Ice::IceType_i16);
Nicolas Capens598f8d82016-09-26 15:09:10 -04002090 }
2091
2092 UShort::UShort(Argument<UShort> argument)
2093 {
2094 storeValue(argument.value);
2095 }
2096
2097 UShort::UShort(RValue<UInt> cast)
2098 {
2099 Value *integer = Nucleus::createTrunc(cast.value, UShort::getType());
2100
2101 storeValue(integer);
2102 }
2103
2104 UShort::UShort(RValue<Int> cast)
2105 {
2106 Value *integer = Nucleus::createTrunc(cast.value, UShort::getType());
2107
2108 storeValue(integer);
2109 }
2110
2111 UShort::UShort()
2112 {
2113 }
2114
2115 UShort::UShort(unsigned short x)
2116 {
2117 storeValue(Nucleus::createConstantShort(x));
2118 }
2119
2120 UShort::UShort(RValue<UShort> rhs)
2121 {
2122 storeValue(rhs.value);
2123 }
2124
2125 UShort::UShort(const UShort &rhs)
2126 {
2127 Value *value = rhs.loadValue();
2128 storeValue(value);
2129 }
2130
2131 UShort::UShort(const Reference<UShort> &rhs)
2132 {
2133 Value *value = rhs.loadValue();
2134 storeValue(value);
2135 }
2136
2137 RValue<UShort> UShort::operator=(RValue<UShort> rhs) const
2138 {
2139 storeValue(rhs.value);
2140
2141 return rhs;
2142 }
2143
2144 RValue<UShort> UShort::operator=(const UShort &rhs) const
2145 {
2146 Value *value = rhs.loadValue();
2147 storeValue(value);
2148
2149 return RValue<UShort>(value);
2150 }
2151
2152 RValue<UShort> UShort::operator=(const Reference<UShort> &rhs) const
2153 {
2154 Value *value = rhs.loadValue();
2155 storeValue(value);
2156
2157 return RValue<UShort>(value);
2158 }
2159
2160 RValue<UShort> operator+(RValue<UShort> lhs, RValue<UShort> rhs)
2161 {
2162 return RValue<UShort>(Nucleus::createAdd(lhs.value, rhs.value));
2163 }
2164
2165 RValue<UShort> operator-(RValue<UShort> lhs, RValue<UShort> rhs)
2166 {
2167 return RValue<UShort>(Nucleus::createSub(lhs.value, rhs.value));
2168 }
2169
2170 RValue<UShort> operator*(RValue<UShort> lhs, RValue<UShort> rhs)
2171 {
2172 return RValue<UShort>(Nucleus::createMul(lhs.value, rhs.value));
2173 }
2174
2175 RValue<UShort> operator/(RValue<UShort> lhs, RValue<UShort> rhs)
2176 {
2177 return RValue<UShort>(Nucleus::createUDiv(lhs.value, rhs.value));
2178 }
2179
2180 RValue<UShort> operator%(RValue<UShort> lhs, RValue<UShort> rhs)
2181 {
2182 return RValue<UShort>(Nucleus::createURem(lhs.value, rhs.value));
2183 }
2184
2185 RValue<UShort> operator&(RValue<UShort> lhs, RValue<UShort> rhs)
2186 {
2187 return RValue<UShort>(Nucleus::createAnd(lhs.value, rhs.value));
2188 }
2189
2190 RValue<UShort> operator|(RValue<UShort> lhs, RValue<UShort> rhs)
2191 {
2192 return RValue<UShort>(Nucleus::createOr(lhs.value, rhs.value));
2193 }
2194
2195 RValue<UShort> operator^(RValue<UShort> lhs, RValue<UShort> rhs)
2196 {
2197 return RValue<UShort>(Nucleus::createXor(lhs.value, rhs.value));
2198 }
2199
2200 RValue<UShort> operator<<(RValue<UShort> lhs, RValue<UShort> rhs)
2201 {
2202 return RValue<UShort>(Nucleus::createShl(lhs.value, rhs.value));
2203 }
2204
2205 RValue<UShort> operator>>(RValue<UShort> lhs, RValue<UShort> rhs)
2206 {
2207 return RValue<UShort>(Nucleus::createLShr(lhs.value, rhs.value));
2208 }
2209
2210 RValue<UShort> operator+=(const UShort &lhs, RValue<UShort> rhs)
2211 {
2212 return lhs = lhs + rhs;
2213 }
2214
2215 RValue<UShort> operator-=(const UShort &lhs, RValue<UShort> rhs)
2216 {
2217 return lhs = lhs - rhs;
2218 }
2219
2220 RValue<UShort> operator*=(const UShort &lhs, RValue<UShort> rhs)
2221 {
2222 return lhs = lhs * rhs;
2223 }
2224
2225 RValue<UShort> operator/=(const UShort &lhs, RValue<UShort> rhs)
2226 {
2227 return lhs = lhs / rhs;
2228 }
2229
2230 RValue<UShort> operator%=(const UShort &lhs, RValue<UShort> rhs)
2231 {
2232 return lhs = lhs % rhs;
2233 }
2234
2235 RValue<UShort> operator&=(const UShort &lhs, RValue<UShort> rhs)
2236 {
2237 return lhs = lhs & rhs;
2238 }
2239
2240 RValue<UShort> operator|=(const UShort &lhs, RValue<UShort> rhs)
2241 {
2242 return lhs = lhs | rhs;
2243 }
2244
2245 RValue<UShort> operator^=(const UShort &lhs, RValue<UShort> rhs)
2246 {
2247 return lhs = lhs ^ rhs;
2248 }
2249
2250 RValue<UShort> operator<<=(const UShort &lhs, RValue<UShort> rhs)
2251 {
2252 return lhs = lhs << rhs;
2253 }
2254
2255 RValue<UShort> operator>>=(const UShort &lhs, RValue<UShort> rhs)
2256 {
2257 return lhs = lhs >> rhs;
2258 }
2259
2260 RValue<UShort> operator+(RValue<UShort> val)
2261 {
2262 return val;
2263 }
2264
2265 RValue<UShort> operator-(RValue<UShort> val)
2266 {
2267 return RValue<UShort>(Nucleus::createNeg(val.value));
2268 }
2269
2270 RValue<UShort> operator~(RValue<UShort> val)
2271 {
2272 return RValue<UShort>(Nucleus::createNot(val.value));
2273 }
2274
2275 RValue<UShort> operator++(const UShort &val, int) // Post-increment
2276 {
2277 RValue<UShort> res = val;
2278
2279 assert(false && "UNIMPLEMENTED");
2280 assert(false && "UNIMPLEMENTED");
2281
2282 return res;
2283 }
2284
2285 const UShort &operator++(const UShort &val) // Pre-increment
2286 {
2287 assert(false && "UNIMPLEMENTED");
2288 assert(false && "UNIMPLEMENTED");
2289
2290 return val;
2291 }
2292
2293 RValue<UShort> operator--(const UShort &val, int) // Post-decrement
2294 {
2295 RValue<UShort> res = val;
2296
2297 assert(false && "UNIMPLEMENTED");
2298 assert(false && "UNIMPLEMENTED");
2299
2300 return res;
2301 }
2302
2303 const UShort &operator--(const UShort &val) // Pre-decrement
2304 {
2305 assert(false && "UNIMPLEMENTED");
2306 assert(false && "UNIMPLEMENTED");
2307
2308 return val;
2309 }
2310
2311 RValue<Bool> operator<(RValue<UShort> lhs, RValue<UShort> rhs)
2312 {
2313 return RValue<Bool>(Nucleus::createICmpULT(lhs.value, rhs.value));
2314 }
2315
2316 RValue<Bool> operator<=(RValue<UShort> lhs, RValue<UShort> rhs)
2317 {
2318 return RValue<Bool>(Nucleus::createICmpULE(lhs.value, rhs.value));
2319 }
2320
2321 RValue<Bool> operator>(RValue<UShort> lhs, RValue<UShort> rhs)
2322 {
2323 return RValue<Bool>(Nucleus::createICmpUGT(lhs.value, rhs.value));
2324 }
2325
2326 RValue<Bool> operator>=(RValue<UShort> lhs, RValue<UShort> rhs)
2327 {
2328 return RValue<Bool>(Nucleus::createICmpUGE(lhs.value, rhs.value));
2329 }
2330
2331 RValue<Bool> operator!=(RValue<UShort> lhs, RValue<UShort> rhs)
2332 {
2333 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
2334 }
2335
2336 RValue<Bool> operator==(RValue<UShort> lhs, RValue<UShort> rhs)
2337 {
2338 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
2339 }
2340
2341 Type *UShort::getType()
2342 {
Nicolas Capens4cfd4572016-10-20 01:00:19 -04002343 return T(Ice::IceType_i16);
Nicolas Capens598f8d82016-09-26 15:09:10 -04002344 }
2345
Nicolas Capens16b5f152016-10-13 13:39:01 -04002346 Byte4::Byte4(RValue<Byte8> cast)
2347 {
2348 // xyzw.parent = this;
2349
2350 storeValue(Nucleus::createBitCast(cast.value, getType()));
2351 }
2352
2353 Byte4::Byte4(const Reference<Byte4> &rhs)
2354 {
2355 // xyzw.parent = this;
2356
2357 assert(false && "UNIMPLEMENTED");
2358 }
2359
Nicolas Capens598f8d82016-09-26 15:09:10 -04002360 Type *Byte4::getType()
2361 {
Nicolas Capens23d99a42016-09-30 14:57:16 -04002362 return T(Type_v4i8);
Nicolas Capens598f8d82016-09-26 15:09:10 -04002363 }
2364
2365 Type *SByte4::getType()
2366 {
Nicolas Capens4cfd4572016-10-20 01:00:19 -04002367 return T(Type_v4i8);
Nicolas Capens598f8d82016-09-26 15:09:10 -04002368 }
2369
2370 Byte8::Byte8()
2371 {
Nicolas Capens598f8d82016-09-26 15:09:10 -04002372 }
2373
2374 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)
2375 {
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04002376 int64_t constantVector[8] = {x0, x1, x2, x3, x4, x5, x6, x7};
2377 storeValue(Nucleus::createConstantVector(constantVector, getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002378 }
2379
2380 Byte8::Byte8(RValue<Byte8> rhs)
2381 {
Nicolas Capens598f8d82016-09-26 15:09:10 -04002382 storeValue(rhs.value);
2383 }
2384
2385 Byte8::Byte8(const Byte8 &rhs)
2386 {
Nicolas Capens598f8d82016-09-26 15:09:10 -04002387 Value *value = rhs.loadValue();
2388 storeValue(value);
2389 }
2390
2391 Byte8::Byte8(const Reference<Byte8> &rhs)
2392 {
Nicolas Capens598f8d82016-09-26 15:09:10 -04002393 Value *value = rhs.loadValue();
2394 storeValue(value);
2395 }
2396
2397 RValue<Byte8> Byte8::operator=(RValue<Byte8> rhs) const
2398 {
2399 storeValue(rhs.value);
2400
2401 return rhs;
2402 }
2403
2404 RValue<Byte8> Byte8::operator=(const Byte8 &rhs) const
2405 {
2406 Value *value = rhs.loadValue();
2407 storeValue(value);
2408
2409 return RValue<Byte8>(value);
2410 }
2411
2412 RValue<Byte8> Byte8::operator=(const Reference<Byte8> &rhs) const
2413 {
2414 Value *value = rhs.loadValue();
2415 storeValue(value);
2416
2417 return RValue<Byte8>(value);
2418 }
2419
2420 RValue<Byte8> operator+(RValue<Byte8> lhs, RValue<Byte8> rhs)
2421 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04002422 return RValue<Byte8>(Nucleus::createAdd(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002423 }
2424
2425 RValue<Byte8> operator-(RValue<Byte8> lhs, RValue<Byte8> rhs)
2426 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04002427 return RValue<Byte8>(Nucleus::createSub(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002428 }
2429
2430// RValue<Byte8> operator*(RValue<Byte8> lhs, RValue<Byte8> rhs)
2431// {
2432// return RValue<Byte8>(Nucleus::createMul(lhs.value, rhs.value));
2433// }
2434
2435// RValue<Byte8> operator/(RValue<Byte8> lhs, RValue<Byte8> rhs)
2436// {
2437// return RValue<Byte8>(Nucleus::createUDiv(lhs.value, rhs.value));
2438// }
2439
2440// RValue<Byte8> operator%(RValue<Byte8> lhs, RValue<Byte8> rhs)
2441// {
2442// return RValue<Byte8>(Nucleus::createURem(lhs.value, rhs.value));
2443// }
2444
2445 RValue<Byte8> operator&(RValue<Byte8> lhs, RValue<Byte8> rhs)
2446 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04002447 return RValue<Byte8>(Nucleus::createAnd(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002448 }
2449
2450 RValue<Byte8> operator|(RValue<Byte8> lhs, RValue<Byte8> rhs)
2451 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04002452 return RValue<Byte8>(Nucleus::createOr(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002453 }
2454
2455 RValue<Byte8> operator^(RValue<Byte8> lhs, RValue<Byte8> rhs)
2456 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04002457 return RValue<Byte8>(Nucleus::createXor(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002458 }
2459
2460// RValue<Byte8> operator<<(RValue<Byte8> lhs, unsigned char rhs)
2461// {
Nicolas Capens327f1df2016-10-21 14:26:34 -04002462// return RValue<Byte8>(Nucleus::createShl(lhs.value, C(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002463// }
2464
2465// RValue<Byte8> operator>>(RValue<Byte8> lhs, unsigned char rhs)
2466// {
Nicolas Capens327f1df2016-10-21 14:26:34 -04002467// return RValue<Byte8>(Nucleus::createLShr(lhs.value, C(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002468// }
2469
2470 RValue<Byte8> operator+=(const Byte8 &lhs, RValue<Byte8> rhs)
2471 {
2472 return lhs = lhs + rhs;
2473 }
2474
2475 RValue<Byte8> operator-=(const Byte8 &lhs, RValue<Byte8> rhs)
2476 {
2477 return lhs = lhs - rhs;
2478 }
2479
2480// RValue<Byte8> operator*=(const Byte8 &lhs, RValue<Byte8> rhs)
2481// {
2482// return lhs = lhs * rhs;
2483// }
2484
2485// RValue<Byte8> operator/=(const Byte8 &lhs, RValue<Byte8> rhs)
2486// {
2487// return lhs = lhs / rhs;
2488// }
2489
2490// RValue<Byte8> operator%=(const Byte8 &lhs, RValue<Byte8> rhs)
2491// {
2492// return lhs = lhs % rhs;
2493// }
2494
2495 RValue<Byte8> operator&=(const Byte8 &lhs, RValue<Byte8> rhs)
2496 {
2497 return lhs = lhs & rhs;
2498 }
2499
2500 RValue<Byte8> operator|=(const Byte8 &lhs, RValue<Byte8> rhs)
2501 {
2502 return lhs = lhs | rhs;
2503 }
2504
2505 RValue<Byte8> operator^=(const Byte8 &lhs, RValue<Byte8> rhs)
2506 {
2507 return lhs = lhs ^ rhs;
2508 }
2509
2510// RValue<Byte8> operator<<=(const Byte8 &lhs, RValue<Byte8> rhs)
2511// {
2512// return lhs = lhs << rhs;
2513// }
2514
2515// RValue<Byte8> operator>>=(const Byte8 &lhs, RValue<Byte8> rhs)
2516// {
2517// return lhs = lhs >> rhs;
2518// }
2519
2520// RValue<Byte8> operator+(RValue<Byte8> val)
2521// {
2522// return val;
2523// }
2524
2525// RValue<Byte8> operator-(RValue<Byte8> val)
2526// {
2527// return RValue<Byte8>(Nucleus::createNeg(val.value));
2528// }
2529
2530 RValue<Byte8> operator~(RValue<Byte8> val)
2531 {
2532 return RValue<Byte8>(Nucleus::createNot(val.value));
2533 }
2534
2535 RValue<Byte8> AddSat(RValue<Byte8> x, RValue<Byte8> y)
2536 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04002537 assert(false && "UNIMPLEMENTED"); return RValue<Byte8>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002538 }
2539
2540 RValue<Byte8> SubSat(RValue<Byte8> x, RValue<Byte8> y)
2541 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04002542 assert(false && "UNIMPLEMENTED"); return RValue<Byte8>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002543 }
2544
2545 RValue<Short4> Unpack(RValue<Byte4> x)
2546 {
Nicolas Capens37fbece2016-10-21 15:08:56 -04002547 int shuffle[16] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7}; // Real type is v16i8
2548 return RValue<Short4>(Nucleus::createShuffleVector(x.value, x.value, shuffle));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002549 }
2550
2551 RValue<Short4> UnpackLow(RValue<Byte8> x, RValue<Byte8> y)
2552 {
Nicolas Capens37fbece2016-10-21 15:08:56 -04002553 int shuffle[16] = {0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23}; // Real type is v16i8
2554 return RValue<Short4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002555 }
2556
2557 RValue<Short4> UnpackHigh(RValue<Byte8> x, RValue<Byte8> y)
2558 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04002559 assert(false && "UNIMPLEMENTED"); return RValue<Short4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002560 }
2561
2562 RValue<Int> SignMask(RValue<Byte8> x)
2563 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04002564 assert(false && "UNIMPLEMENTED"); return RValue<Int>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002565 }
2566
2567// RValue<Byte8> CmpGT(RValue<Byte8> x, RValue<Byte8> y)
2568// {
Nicolas Capensc37252c2016-09-28 16:11:54 -04002569// assert(false && "UNIMPLEMENTED"); return RValue<Byte8>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002570// }
2571
2572 RValue<Byte8> CmpEQ(RValue<Byte8> x, RValue<Byte8> y)
2573 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04002574 assert(false && "UNIMPLEMENTED"); return RValue<Byte8>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002575 }
2576
2577 Type *Byte8::getType()
2578 {
Nicolas Capens23d99a42016-09-30 14:57:16 -04002579 return T(Type_v8i8);
Nicolas Capens598f8d82016-09-26 15:09:10 -04002580 }
2581
2582 SByte8::SByte8()
2583 {
2584 // xyzw.parent = this;
2585 }
2586
2587 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)
2588 {
2589 // xyzw.parent = this;
2590
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04002591 int64_t constantVector[8] = { x0, x1, x2, x3, x4, x5, x6, x7 };
2592 Value *vector = V(Nucleus::createConstantVector(constantVector, getType()));
2593
2594 storeValue(Nucleus::createBitCast(vector, getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002595 }
2596
Nicolas Capens598f8d82016-09-26 15:09:10 -04002597 SByte8::SByte8(RValue<SByte8> rhs)
2598 {
2599 // xyzw.parent = this;
2600
2601 storeValue(rhs.value);
2602 }
2603
2604 SByte8::SByte8(const SByte8 &rhs)
2605 {
2606 // xyzw.parent = this;
2607
2608 Value *value = rhs.loadValue();
2609 storeValue(value);
2610 }
2611
2612 SByte8::SByte8(const Reference<SByte8> &rhs)
2613 {
2614 // xyzw.parent = this;
2615
2616 Value *value = rhs.loadValue();
2617 storeValue(value);
2618 }
2619
2620 RValue<SByte8> SByte8::operator=(RValue<SByte8> rhs) const
2621 {
2622 storeValue(rhs.value);
2623
2624 return rhs;
2625 }
2626
2627 RValue<SByte8> SByte8::operator=(const SByte8 &rhs) const
2628 {
2629 Value *value = rhs.loadValue();
2630 storeValue(value);
2631
2632 return RValue<SByte8>(value);
2633 }
2634
2635 RValue<SByte8> SByte8::operator=(const Reference<SByte8> &rhs) const
2636 {
2637 Value *value = rhs.loadValue();
2638 storeValue(value);
2639
2640 return RValue<SByte8>(value);
2641 }
2642
2643 RValue<SByte8> operator+(RValue<SByte8> lhs, RValue<SByte8> rhs)
2644 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04002645 return RValue<SByte8>(Nucleus::createAdd(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002646 }
2647
2648 RValue<SByte8> operator-(RValue<SByte8> lhs, RValue<SByte8> rhs)
2649 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04002650 return RValue<SByte8>(Nucleus::createSub(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002651 }
2652
2653// RValue<SByte8> operator*(RValue<SByte8> lhs, RValue<SByte8> rhs)
2654// {
2655// return RValue<SByte8>(Nucleus::createMul(lhs.value, rhs.value));
2656// }
2657
2658// RValue<SByte8> operator/(RValue<SByte8> lhs, RValue<SByte8> rhs)
2659// {
2660// return RValue<SByte8>(Nucleus::createSDiv(lhs.value, rhs.value));
2661// }
2662
2663// RValue<SByte8> operator%(RValue<SByte8> lhs, RValue<SByte8> rhs)
2664// {
2665// return RValue<SByte8>(Nucleus::createSRem(lhs.value, rhs.value));
2666// }
2667
2668 RValue<SByte8> operator&(RValue<SByte8> lhs, RValue<SByte8> rhs)
2669 {
2670 return RValue<SByte8>(Nucleus::createAnd(lhs.value, rhs.value));
2671 }
2672
2673 RValue<SByte8> operator|(RValue<SByte8> lhs, RValue<SByte8> rhs)
2674 {
2675 return RValue<SByte8>(Nucleus::createOr(lhs.value, rhs.value));
2676 }
2677
2678 RValue<SByte8> operator^(RValue<SByte8> lhs, RValue<SByte8> rhs)
2679 {
2680 return RValue<SByte8>(Nucleus::createXor(lhs.value, rhs.value));
2681 }
2682
2683// RValue<SByte8> operator<<(RValue<SByte8> lhs, unsigned char rhs)
2684// {
Nicolas Capens327f1df2016-10-21 14:26:34 -04002685// return RValue<SByte8>(Nucleus::createShl(lhs.value, C(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002686// }
2687
2688// RValue<SByte8> operator>>(RValue<SByte8> lhs, unsigned char rhs)
2689// {
Nicolas Capens327f1df2016-10-21 14:26:34 -04002690// return RValue<SByte8>(Nucleus::createAShr(lhs.value, C(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002691// }
2692
2693 RValue<SByte8> operator+=(const SByte8 &lhs, RValue<SByte8> rhs)
2694 {
2695 return lhs = lhs + rhs;
2696 }
2697
2698 RValue<SByte8> operator-=(const SByte8 &lhs, RValue<SByte8> rhs)
2699 {
2700 return lhs = lhs - rhs;
2701 }
2702
2703// RValue<SByte8> operator*=(const SByte8 &lhs, RValue<SByte8> rhs)
2704// {
2705// return lhs = lhs * rhs;
2706// }
2707
2708// RValue<SByte8> operator/=(const SByte8 &lhs, RValue<SByte8> rhs)
2709// {
2710// return lhs = lhs / rhs;
2711// }
2712
2713// RValue<SByte8> operator%=(const SByte8 &lhs, RValue<SByte8> rhs)
2714// {
2715// return lhs = lhs % rhs;
2716// }
2717
2718 RValue<SByte8> operator&=(const SByte8 &lhs, RValue<SByte8> rhs)
2719 {
2720 return lhs = lhs & rhs;
2721 }
2722
2723 RValue<SByte8> operator|=(const SByte8 &lhs, RValue<SByte8> rhs)
2724 {
2725 return lhs = lhs | rhs;
2726 }
2727
2728 RValue<SByte8> operator^=(const SByte8 &lhs, RValue<SByte8> rhs)
2729 {
2730 return lhs = lhs ^ rhs;
2731 }
2732
2733// RValue<SByte8> operator<<=(const SByte8 &lhs, RValue<SByte8> rhs)
2734// {
2735// return lhs = lhs << rhs;
2736// }
2737
2738// RValue<SByte8> operator>>=(const SByte8 &lhs, RValue<SByte8> rhs)
2739// {
2740// return lhs = lhs >> rhs;
2741// }
2742
2743// RValue<SByte8> operator+(RValue<SByte8> val)
2744// {
2745// return val;
2746// }
2747
2748// RValue<SByte8> operator-(RValue<SByte8> val)
2749// {
2750// return RValue<SByte8>(Nucleus::createNeg(val.value));
2751// }
2752
2753 RValue<SByte8> operator~(RValue<SByte8> val)
2754 {
2755 return RValue<SByte8>(Nucleus::createNot(val.value));
2756 }
2757
2758 RValue<SByte8> AddSat(RValue<SByte8> x, RValue<SByte8> y)
2759 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04002760 assert(false && "UNIMPLEMENTED"); return RValue<SByte8>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002761 }
2762
2763 RValue<SByte8> SubSat(RValue<SByte8> x, RValue<SByte8> y)
2764 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04002765 assert(false && "UNIMPLEMENTED"); return RValue<SByte8>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002766 }
2767
2768 RValue<Short4> UnpackLow(RValue<SByte8> x, RValue<SByte8> y)
2769 {
Nicolas Capens37fbece2016-10-21 15:08:56 -04002770 int shuffle[16] = {0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23}; // Real type is v16i8
2771 return RValue<Short4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002772 }
2773
2774 RValue<Short4> UnpackHigh(RValue<SByte8> x, RValue<SByte8> y)
2775 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04002776 assert(false && "UNIMPLEMENTED"); return RValue<Short4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002777 }
2778
2779 RValue<Int> SignMask(RValue<SByte8> x)
2780 {
Nicolas Capensf2cb9df2016-10-21 17:26:13 -04002781 Ice::Variable *result = ::function->makeVariable(Ice::IceType_i32);
2782 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::SignMask, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
2783 auto target = ::context->getConstantUndef(Ice::IceType_i32);
2784 auto movmsk = Ice::InstIntrinsicCall::create(::function, 1, result, target, intrinsic);
2785 movmsk->addArg(x.value);
2786 ::basicBlock->appendInst(movmsk);
2787
2788 return RValue<Int>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002789 }
2790
2791 RValue<Byte8> CmpGT(RValue<SByte8> x, RValue<SByte8> y)
2792 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04002793 assert(false && "UNIMPLEMENTED"); return RValue<Byte8>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002794 }
2795
2796 RValue<Byte8> CmpEQ(RValue<SByte8> x, RValue<SByte8> y)
2797 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04002798 assert(false && "UNIMPLEMENTED"); return RValue<Byte8>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002799 }
2800
2801 Type *SByte8::getType()
2802 {
Nicolas Capens4cfd4572016-10-20 01:00:19 -04002803 return T(Type_v8i8);
Nicolas Capens598f8d82016-09-26 15:09:10 -04002804 }
2805
2806 Byte16::Byte16(RValue<Byte16> rhs)
2807 {
2808 // xyzw.parent = this;
2809
2810 storeValue(rhs.value);
2811 }
2812
2813 Byte16::Byte16(const Byte16 &rhs)
2814 {
2815 // xyzw.parent = this;
2816
2817 Value *value = rhs.loadValue();
2818 storeValue(value);
2819 }
2820
2821 Byte16::Byte16(const Reference<Byte16> &rhs)
2822 {
2823 // xyzw.parent = this;
2824
2825 Value *value = rhs.loadValue();
2826 storeValue(value);
2827 }
2828
2829 RValue<Byte16> Byte16::operator=(RValue<Byte16> rhs) const
2830 {
2831 storeValue(rhs.value);
2832
2833 return rhs;
2834 }
2835
2836 RValue<Byte16> Byte16::operator=(const Byte16 &rhs) const
2837 {
2838 Value *value = rhs.loadValue();
2839 storeValue(value);
2840
2841 return RValue<Byte16>(value);
2842 }
2843
2844 RValue<Byte16> Byte16::operator=(const Reference<Byte16> &rhs) const
2845 {
2846 Value *value = rhs.loadValue();
2847 storeValue(value);
2848
2849 return RValue<Byte16>(value);
2850 }
2851
2852 Type *Byte16::getType()
2853 {
Nicolas Capens23d99a42016-09-30 14:57:16 -04002854 return T(Ice::IceType_v16i8);
Nicolas Capens598f8d82016-09-26 15:09:10 -04002855 }
2856
2857 Type *SByte16::getType()
2858 {
Nicolas Capens23d99a42016-09-30 14:57:16 -04002859 return T(Ice::IceType_v16i8);
Nicolas Capens598f8d82016-09-26 15:09:10 -04002860 }
2861
Nicolas Capens16b5f152016-10-13 13:39:01 -04002862 Short2::Short2(RValue<Short4> cast)
2863 {
2864 assert(false && "UNIMPLEMENTED");
2865 }
2866
2867 Type *Short2::getType()
2868 {
Nicolas Capens23d99a42016-09-30 14:57:16 -04002869 return T(Type_v2i16);
Nicolas Capens16b5f152016-10-13 13:39:01 -04002870 }
2871
2872 UShort2::UShort2(RValue<UShort4> cast)
2873 {
2874 assert(false && "UNIMPLEMENTED");
2875 }
2876
2877 Type *UShort2::getType()
2878 {
Nicolas Capens23d99a42016-09-30 14:57:16 -04002879 return T(Type_v2i16);
Nicolas Capens16b5f152016-10-13 13:39:01 -04002880 }
2881
Nicolas Capens598f8d82016-09-26 15:09:10 -04002882 Short4::Short4(RValue<Int> cast)
2883 {
2884 Value *extend = Nucleus::createZExt(cast.value, Long::getType());
2885 Value *swizzle = Swizzle(RValue<Short4>(extend), 0x00).value;
2886
2887 storeValue(swizzle);
2888 }
2889
2890 Short4::Short4(RValue<Int4> cast)
2891 {
2892 assert(false && "UNIMPLEMENTED");
2893 }
2894
2895// Short4::Short4(RValue<Float> cast)
2896// {
2897// }
2898
2899 Short4::Short4(RValue<Float4> cast)
2900 {
2901 assert(false && "UNIMPLEMENTED");
2902 }
2903
2904 Short4::Short4()
2905 {
2906 // xyzw.parent = this;
2907 }
2908
2909 Short4::Short4(short xyzw)
2910 {
2911 // xyzw.parent = this;
2912
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04002913 int64_t constantVector[4] = {xyzw, xyzw, xyzw, xyzw};
2914 storeValue(Nucleus::createConstantVector(constantVector, getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002915 }
2916
2917 Short4::Short4(short x, short y, short z, short w)
2918 {
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04002919 // xyzw.parent = this;
Nicolas Capens598f8d82016-09-26 15:09:10 -04002920
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04002921 int64_t constantVector[4] = {x, y, z, w};
2922 storeValue(Nucleus::createConstantVector(constantVector, getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04002923 }
2924
2925 Short4::Short4(RValue<Short4> rhs)
2926 {
2927 // xyzw.parent = this;
2928
2929 storeValue(rhs.value);
2930 }
2931
2932 Short4::Short4(const Short4 &rhs)
2933 {
2934 // xyzw.parent = this;
2935
2936 Value *value = rhs.loadValue();
2937 storeValue(value);
2938 }
2939
2940 Short4::Short4(const Reference<Short4> &rhs)
2941 {
2942 // xyzw.parent = this;
2943
2944 Value *value = rhs.loadValue();
2945 storeValue(value);
2946 }
2947
2948 Short4::Short4(RValue<UShort4> rhs)
2949 {
2950 // xyzw.parent = this;
2951
2952 storeValue(rhs.value);
2953 }
2954
2955 Short4::Short4(const UShort4 &rhs)
2956 {
2957 // xyzw.parent = this;
2958
2959 storeValue(rhs.loadValue());
2960 }
2961
2962 Short4::Short4(const Reference<UShort4> &rhs)
2963 {
2964 // xyzw.parent = this;
2965
2966 storeValue(rhs.loadValue());
2967 }
2968
2969 RValue<Short4> Short4::operator=(RValue<Short4> rhs) const
2970 {
2971 storeValue(rhs.value);
2972
2973 return rhs;
2974 }
2975
2976 RValue<Short4> Short4::operator=(const Short4 &rhs) const
2977 {
2978 Value *value = rhs.loadValue();
2979 storeValue(value);
2980
2981 return RValue<Short4>(value);
2982 }
2983
2984 RValue<Short4> Short4::operator=(const Reference<Short4> &rhs) const
2985 {
2986 Value *value = rhs.loadValue();
2987 storeValue(value);
2988
2989 return RValue<Short4>(value);
2990 }
2991
2992 RValue<Short4> Short4::operator=(RValue<UShort4> rhs) const
2993 {
2994 storeValue(rhs.value);
2995
2996 return RValue<Short4>(rhs);
2997 }
2998
2999 RValue<Short4> Short4::operator=(const UShort4 &rhs) const
3000 {
3001 Value *value = rhs.loadValue();
3002 storeValue(value);
3003
3004 return RValue<Short4>(value);
3005 }
3006
3007 RValue<Short4> Short4::operator=(const Reference<UShort4> &rhs) const
3008 {
3009 Value *value = rhs.loadValue();
3010 storeValue(value);
3011
3012 return RValue<Short4>(value);
3013 }
3014
3015 RValue<Short4> operator+(RValue<Short4> lhs, RValue<Short4> rhs)
3016 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04003017 return RValue<Short4>(Nucleus::createAdd(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003018 }
3019
3020 RValue<Short4> operator-(RValue<Short4> lhs, RValue<Short4> rhs)
3021 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04003022 return RValue<Short4>(Nucleus::createSub(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003023 }
3024
3025 RValue<Short4> operator*(RValue<Short4> lhs, RValue<Short4> rhs)
3026 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04003027 return RValue<Short4>(Nucleus::createMul(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003028 }
3029
3030// RValue<Short4> operator/(RValue<Short4> lhs, RValue<Short4> rhs)
3031// {
3032// return RValue<Short4>(Nucleus::createSDiv(lhs.value, rhs.value));
3033// }
3034
3035// RValue<Short4> operator%(RValue<Short4> lhs, RValue<Short4> rhs)
3036// {
3037// return RValue<Short4>(Nucleus::createSRem(lhs.value, rhs.value));
3038// }
3039
3040 RValue<Short4> operator&(RValue<Short4> lhs, RValue<Short4> rhs)
3041 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04003042 return RValue<Short4>(Nucleus::createAnd(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003043 }
3044
3045 RValue<Short4> operator|(RValue<Short4> lhs, RValue<Short4> rhs)
3046 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04003047 return RValue<Short4>(Nucleus::createOr(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003048 }
3049
3050 RValue<Short4> operator^(RValue<Short4> lhs, RValue<Short4> rhs)
3051 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04003052 return RValue<Short4>(Nucleus::createXor(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003053 }
3054
3055 RValue<Short4> operator<<(RValue<Short4> lhs, unsigned char rhs)
3056 {
Nicolas Capens327f1df2016-10-21 14:26:34 -04003057 return RValue<Short4>(Nucleus::createShl(lhs.value, C(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003058 }
3059
3060 RValue<Short4> operator>>(RValue<Short4> lhs, unsigned char rhs)
3061 {
Nicolas Capens327f1df2016-10-21 14:26:34 -04003062 return RValue<Short4>(Nucleus::createAShr(lhs.value, C(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003063 }
3064
3065 RValue<Short4> operator<<(RValue<Short4> lhs, RValue<Long1> rhs)
3066 {
3067 // return RValue<Short4>(Nucleus::createShl(lhs.value, rhs.value));
3068
Nicolas Capensc37252c2016-09-28 16:11:54 -04003069 assert(false && "UNIMPLEMENTED"); return RValue<Short4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003070 }
3071
3072 RValue<Short4> operator>>(RValue<Short4> lhs, RValue<Long1> rhs)
3073 {
3074 // return RValue<Short4>(Nucleus::createAShr(lhs.value, rhs.value));
3075
Nicolas Capensc37252c2016-09-28 16:11:54 -04003076 assert(false && "UNIMPLEMENTED"); return RValue<Short4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003077 }
3078
3079 RValue<Short4> operator+=(const Short4 &lhs, RValue<Short4> rhs)
3080 {
3081 return lhs = lhs + rhs;
3082 }
3083
3084 RValue<Short4> operator-=(const Short4 &lhs, RValue<Short4> rhs)
3085 {
3086 return lhs = lhs - rhs;
3087 }
3088
3089 RValue<Short4> operator*=(const Short4 &lhs, RValue<Short4> rhs)
3090 {
3091 return lhs = lhs * rhs;
3092 }
3093
3094// RValue<Short4> operator/=(const Short4 &lhs, RValue<Short4> rhs)
3095// {
3096// return lhs = lhs / rhs;
3097// }
3098
3099// RValue<Short4> operator%=(const Short4 &lhs, RValue<Short4> rhs)
3100// {
3101// return lhs = lhs % rhs;
3102// }
3103
3104 RValue<Short4> operator&=(const Short4 &lhs, RValue<Short4> rhs)
3105 {
3106 return lhs = lhs & rhs;
3107 }
3108
3109 RValue<Short4> operator|=(const Short4 &lhs, RValue<Short4> rhs)
3110 {
3111 return lhs = lhs | rhs;
3112 }
3113
3114 RValue<Short4> operator^=(const Short4 &lhs, RValue<Short4> rhs)
3115 {
3116 return lhs = lhs ^ rhs;
3117 }
3118
3119 RValue<Short4> operator<<=(const Short4 &lhs, unsigned char rhs)
3120 {
3121 return lhs = lhs << rhs;
3122 }
3123
3124 RValue<Short4> operator>>=(const Short4 &lhs, unsigned char rhs)
3125 {
3126 return lhs = lhs >> rhs;
3127 }
3128
3129 RValue<Short4> operator<<=(const Short4 &lhs, RValue<Long1> rhs)
3130 {
3131 return lhs = lhs << rhs;
3132 }
3133
3134 RValue<Short4> operator>>=(const Short4 &lhs, RValue<Long1> rhs)
3135 {
3136 return lhs = lhs >> rhs;
3137 }
3138
3139// RValue<Short4> operator+(RValue<Short4> val)
3140// {
3141// return val;
3142// }
3143
3144 RValue<Short4> operator-(RValue<Short4> val)
3145 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003146 assert(false && "UNIMPLEMENTED"); return RValue<Short4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003147 }
3148
3149 RValue<Short4> operator~(RValue<Short4> val)
3150 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003151 assert(false && "UNIMPLEMENTED"); return RValue<Short4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003152 }
3153
3154 RValue<Short4> RoundShort4(RValue<Float4> cast)
3155 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003156 assert(false && "UNIMPLEMENTED"); return RValue<Short4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003157 }
3158
3159 RValue<Short4> Max(RValue<Short4> x, RValue<Short4> y)
3160 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003161 assert(false && "UNIMPLEMENTED"); return RValue<Short4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003162 }
3163
3164 RValue<Short4> Min(RValue<Short4> x, RValue<Short4> y)
3165 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003166 assert(false && "UNIMPLEMENTED"); return RValue<Short4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003167 }
3168
3169 RValue<Short4> AddSat(RValue<Short4> x, RValue<Short4> y)
3170 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003171 assert(false && "UNIMPLEMENTED"); return RValue<Short4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003172 }
3173
3174 RValue<Short4> SubSat(RValue<Short4> x, RValue<Short4> y)
3175 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003176 assert(false && "UNIMPLEMENTED"); return RValue<Short4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003177 }
3178
3179 RValue<Short4> MulHigh(RValue<Short4> x, RValue<Short4> y)
3180 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003181 assert(false && "UNIMPLEMENTED"); return RValue<Short4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003182 }
3183
3184 RValue<Int2> MulAdd(RValue<Short4> x, RValue<Short4> y)
3185 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003186 assert(false && "UNIMPLEMENTED"); return RValue<Int2>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003187 }
3188
3189 RValue<SByte8> Pack(RValue<Short4> x, RValue<Short4> y)
3190 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003191 assert(false && "UNIMPLEMENTED"); return RValue<SByte8>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003192 }
3193
3194 RValue<Int2> UnpackLow(RValue<Short4> x, RValue<Short4> y)
3195 {
Nicolas Capens37fbece2016-10-21 15:08:56 -04003196 int shuffle[8] = {0, 8, 1, 9, 2, 10, 3, 11}; // Real type is v8i16
3197 return RValue<Int2>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003198 }
3199
3200 RValue<Int2> UnpackHigh(RValue<Short4> x, RValue<Short4> y)
3201 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003202 assert(false && "UNIMPLEMENTED"); return RValue<Int2>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003203 }
3204
3205 RValue<Short4> Swizzle(RValue<Short4> x, unsigned char select)
3206 {
Nicolas Capens37fbece2016-10-21 15:08:56 -04003207 // Real type is v8i16
3208 int shuffle[8] =
3209 {
3210 (select >> 0) & 0x03,
3211 (select >> 2) & 0x03,
3212 (select >> 4) & 0x03,
3213 (select >> 6) & 0x03,
3214 (select >> 0) & 0x03,
3215 (select >> 2) & 0x03,
3216 (select >> 4) & 0x03,
3217 (select >> 6) & 0x03,
3218 };
3219
3220 return RValue<Short4>(Nucleus::createShuffleVector(x.value, x.value, shuffle));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003221 }
3222
3223 RValue<Short4> Insert(RValue<Short4> val, RValue<Short> element, int i)
3224 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003225 assert(false && "UNIMPLEMENTED"); return RValue<Short4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003226 }
3227
3228 RValue<Short> Extract(RValue<Short4> val, int i)
3229 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003230 assert(false && "UNIMPLEMENTED"); return RValue<Short>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003231 }
3232
3233 RValue<Short4> CmpGT(RValue<Short4> x, RValue<Short4> y)
3234 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003235 assert(false && "UNIMPLEMENTED"); return RValue<Short4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003236 }
3237
3238 RValue<Short4> CmpEQ(RValue<Short4> x, RValue<Short4> y)
3239 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003240 assert(false && "UNIMPLEMENTED"); return RValue<Short4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003241 }
3242
3243 Type *Short4::getType()
3244 {
Nicolas Capens23d99a42016-09-30 14:57:16 -04003245 return T(Type_v4i16);
Nicolas Capens598f8d82016-09-26 15:09:10 -04003246 }
3247
3248 UShort4::UShort4(RValue<Int4> cast)
3249 {
3250 *this = Short4(cast);
3251 }
3252
3253 UShort4::UShort4(RValue<Float4> cast, bool saturate)
3254 {
3255 assert(false && "UNIMPLEMENTED");
3256 }
3257
3258 UShort4::UShort4()
3259 {
3260 // xyzw.parent = this;
3261 }
3262
3263 UShort4::UShort4(unsigned short xyzw)
3264 {
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04003265 // xyzw.parent = this;
Nicolas Capens598f8d82016-09-26 15:09:10 -04003266
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04003267 int64_t constantVector[4] = {xyzw, xyzw, xyzw, xyzw};
3268 storeValue(Nucleus::createConstantVector(constantVector, getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003269 }
3270
3271 UShort4::UShort4(unsigned short x, unsigned short y, unsigned short z, unsigned short w)
3272 {
3273 // xyzw.parent = this;
3274
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04003275 int64_t constantVector[4] = {x, y, z, w};
3276 storeValue(Nucleus::createConstantVector(constantVector, getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003277 }
3278
3279 UShort4::UShort4(RValue<UShort4> rhs)
3280 {
3281 // xyzw.parent = this;
3282
3283 storeValue(rhs.value);
3284 }
3285
3286 UShort4::UShort4(const UShort4 &rhs)
3287 {
3288 // xyzw.parent = this;
3289
3290 Value *value = rhs.loadValue();
3291 storeValue(value);
3292 }
3293
3294 UShort4::UShort4(const Reference<UShort4> &rhs)
3295 {
3296 // xyzw.parent = this;
3297
3298 Value *value = rhs.loadValue();
3299 storeValue(value);
3300 }
3301
3302 UShort4::UShort4(RValue<Short4> rhs)
3303 {
3304 // xyzw.parent = this;
3305
3306 storeValue(rhs.value);
3307 }
3308
3309 UShort4::UShort4(const Short4 &rhs)
3310 {
3311 // xyzw.parent = this;
3312
3313 Value *value = rhs.loadValue();
3314 storeValue(value);
3315 }
3316
3317 UShort4::UShort4(const Reference<Short4> &rhs)
3318 {
3319 // xyzw.parent = this;
3320
3321 Value *value = rhs.loadValue();
3322 storeValue(value);
3323 }
3324
3325 RValue<UShort4> UShort4::operator=(RValue<UShort4> rhs) const
3326 {
3327 storeValue(rhs.value);
3328
3329 return rhs;
3330 }
3331
3332 RValue<UShort4> UShort4::operator=(const UShort4 &rhs) const
3333 {
3334 Value *value = rhs.loadValue();
3335 storeValue(value);
3336
3337 return RValue<UShort4>(value);
3338 }
3339
3340 RValue<UShort4> UShort4::operator=(const Reference<UShort4> &rhs) const
3341 {
3342 Value *value = rhs.loadValue();
3343 storeValue(value);
3344
3345 return RValue<UShort4>(value);
3346 }
3347
3348 RValue<UShort4> UShort4::operator=(RValue<Short4> rhs) const
3349 {
3350 storeValue(rhs.value);
3351
3352 return RValue<UShort4>(rhs);
3353 }
3354
3355 RValue<UShort4> UShort4::operator=(const Short4 &rhs) const
3356 {
3357 Value *value = rhs.loadValue();
3358 storeValue(value);
3359
3360 return RValue<UShort4>(value);
3361 }
3362
3363 RValue<UShort4> UShort4::operator=(const Reference<Short4> &rhs) const
3364 {
3365 Value *value = rhs.loadValue();
3366 storeValue(value);
3367
3368 return RValue<UShort4>(value);
3369 }
3370
3371 RValue<UShort4> operator+(RValue<UShort4> lhs, RValue<UShort4> rhs)
3372 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04003373 return RValue<Short4>(Nucleus::createAdd(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003374 }
3375
3376 RValue<UShort4> operator-(RValue<UShort4> lhs, RValue<UShort4> rhs)
3377 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04003378 return RValue<UShort4>(Nucleus::createSub(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003379 }
3380
3381 RValue<UShort4> operator*(RValue<UShort4> lhs, RValue<UShort4> rhs)
3382 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04003383 return RValue<UShort4>(Nucleus::createMul(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003384 }
3385
Nicolas Capens16b5f152016-10-13 13:39:01 -04003386 RValue<UShort4> operator&(RValue<UShort4> lhs, RValue<UShort4> rhs)
3387 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04003388 return RValue<UShort4>(Nucleus::createAnd(lhs.value, rhs.value));
Nicolas Capens16b5f152016-10-13 13:39:01 -04003389 }
3390
3391 RValue<UShort4> operator|(RValue<UShort4> lhs, RValue<UShort4> rhs)
3392 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04003393 return RValue<UShort4>(Nucleus::createOr(lhs.value, rhs.value));
Nicolas Capens16b5f152016-10-13 13:39:01 -04003394 }
3395
3396 RValue<UShort4> operator^(RValue<UShort4> lhs, RValue<UShort4> rhs)
3397 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04003398 return RValue<UShort4>(Nucleus::createXor(lhs.value, rhs.value));
Nicolas Capens16b5f152016-10-13 13:39:01 -04003399 }
3400
Nicolas Capens598f8d82016-09-26 15:09:10 -04003401 RValue<UShort4> operator<<(RValue<UShort4> lhs, unsigned char rhs)
3402 {
Nicolas Capens327f1df2016-10-21 14:26:34 -04003403 return RValue<UShort4>(Nucleus::createShl(lhs.value, C(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003404 }
3405
3406 RValue<UShort4> operator>>(RValue<UShort4> lhs, unsigned char rhs)
3407 {
Nicolas Capens327f1df2016-10-21 14:26:34 -04003408 return RValue<UShort4>(Nucleus::createLShr(lhs.value, C(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003409 }
3410
3411 RValue<UShort4> operator<<(RValue<UShort4> lhs, RValue<Long1> rhs)
3412 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003413 assert(false && "UNIMPLEMENTED"); return RValue<UShort4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003414 }
3415
3416 RValue<UShort4> operator>>(RValue<UShort4> lhs, RValue<Long1> rhs)
3417 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003418 assert(false && "UNIMPLEMENTED"); return RValue<UShort4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003419 }
3420
3421 RValue<UShort4> operator<<=(const UShort4 &lhs, unsigned char rhs)
3422 {
3423 return lhs = lhs << rhs;
3424 }
3425
3426 RValue<UShort4> operator>>=(const UShort4 &lhs, unsigned char rhs)
3427 {
3428 return lhs = lhs >> rhs;
3429 }
3430
3431 RValue<UShort4> operator<<=(const UShort4 &lhs, RValue<Long1> rhs)
3432 {
3433 return lhs = lhs << rhs;
3434 }
3435
3436 RValue<UShort4> operator>>=(const UShort4 &lhs, RValue<Long1> rhs)
3437 {
3438 return lhs = lhs >> rhs;
3439 }
3440
3441 RValue<UShort4> operator~(RValue<UShort4> val)
3442 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003443 assert(false && "UNIMPLEMENTED"); return RValue<UShort4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003444 }
3445
3446 RValue<UShort4> Max(RValue<UShort4> x, RValue<UShort4> y)
3447 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003448 assert(false && "UNIMPLEMENTED"); return RValue<UShort4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003449 }
3450
3451 RValue<UShort4> Min(RValue<UShort4> x, RValue<UShort4> y)
3452 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003453 assert(false && "UNIMPLEMENTED"); return RValue<UShort4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003454 }
3455
3456 RValue<UShort4> AddSat(RValue<UShort4> x, RValue<UShort4> y)
3457 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003458 assert(false && "UNIMPLEMENTED"); return RValue<UShort4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003459 }
3460
3461 RValue<UShort4> SubSat(RValue<UShort4> x, RValue<UShort4> y)
3462 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003463 assert(false && "UNIMPLEMENTED"); return RValue<UShort4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003464 }
3465
3466 RValue<UShort4> MulHigh(RValue<UShort4> x, RValue<UShort4> y)
3467 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003468 assert(false && "UNIMPLEMENTED"); return RValue<UShort4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003469 }
3470
3471 RValue<UShort4> Average(RValue<UShort4> x, RValue<UShort4> y)
3472 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003473 assert(false && "UNIMPLEMENTED"); return RValue<UShort4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003474 }
3475
3476 RValue<Byte8> Pack(RValue<UShort4> x, RValue<UShort4> y)
3477 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003478 assert(false && "UNIMPLEMENTED"); return RValue<Byte8>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003479 }
3480
3481 Type *UShort4::getType()
3482 {
Nicolas Capens23d99a42016-09-30 14:57:16 -04003483 return T(Type_v4i16);
Nicolas Capens598f8d82016-09-26 15:09:10 -04003484 }
3485
3486 Short8::Short8(short c0, short c1, short c2, short c3, short c4, short c5, short c6, short c7)
3487 {
3488 // xyzw.parent = this;
3489
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04003490 int64_t constantVector[8] = {c0, c1, c2, c3, c4, c5, c6, c7};
3491 storeValue(Nucleus::createConstantVector(constantVector, getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003492 }
3493
3494 Short8::Short8(RValue<Short8> rhs)
3495 {
3496 // xyzw.parent = this;
3497
3498 storeValue(rhs.value);
3499 }
3500
3501 Short8::Short8(const Reference<Short8> &rhs)
3502 {
3503 // xyzw.parent = this;
3504
3505 Value *value = rhs.loadValue();
3506 storeValue(value);
3507 }
3508
3509 Short8::Short8(RValue<Short4> lo, RValue<Short4> hi)
3510 {
3511 assert(false && "UNIMPLEMENTED");
3512 }
3513
3514 RValue<Short8> operator+(RValue<Short8> lhs, RValue<Short8> rhs)
3515 {
3516 return RValue<Short8>(Nucleus::createAdd(lhs.value, rhs.value));
3517 }
3518
3519 RValue<Short8> operator&(RValue<Short8> lhs, RValue<Short8> rhs)
3520 {
3521 return RValue<Short8>(Nucleus::createAnd(lhs.value, rhs.value));
3522 }
3523
3524 RValue<Short8> operator<<(RValue<Short8> lhs, unsigned char rhs)
3525 {
Nicolas Capens327f1df2016-10-21 14:26:34 -04003526 return RValue<Short8>(Nucleus::createShl(lhs.value, C(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003527 }
3528
3529 RValue<Short8> operator>>(RValue<Short8> lhs, unsigned char rhs)
3530 {
Nicolas Capens327f1df2016-10-21 14:26:34 -04003531 return RValue<Short8>(Nucleus::createAShr(lhs.value, C(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003532 }
3533
3534 RValue<Int4> MulAdd(RValue<Short8> x, RValue<Short8> y)
3535 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003536 assert(false && "UNIMPLEMENTED"); return RValue<Int4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003537 }
3538
3539 RValue<Int4> Abs(RValue<Int4> x)
3540 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003541 assert(false && "UNIMPLEMENTED"); return RValue<Int4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003542 }
3543
3544 RValue<Short8> MulHigh(RValue<Short8> x, RValue<Short8> y)
3545 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003546 assert(false && "UNIMPLEMENTED"); return RValue<Short8>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003547 }
3548
3549 Type *Short8::getType()
3550 {
Nicolas Capens4cfd4572016-10-20 01:00:19 -04003551 return T(Ice::IceType_v8i16);
Nicolas Capens598f8d82016-09-26 15:09:10 -04003552 }
3553
3554 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)
3555 {
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04003556 int64_t constantVector[8] = {c0, c1, c2, c3, c4, c5, c6, c7};
3557 storeValue(Nucleus::createConstantVector(constantVector, getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003558 }
3559
3560 UShort8::UShort8(RValue<UShort8> rhs)
3561 {
Nicolas Capens598f8d82016-09-26 15:09:10 -04003562 storeValue(rhs.value);
3563 }
3564
3565 UShort8::UShort8(const Reference<UShort8> &rhs)
3566 {
Nicolas Capens598f8d82016-09-26 15:09:10 -04003567 Value *value = rhs.loadValue();
3568 storeValue(value);
3569 }
3570
3571 UShort8::UShort8(RValue<UShort4> lo, RValue<UShort4> hi)
3572 {
3573 assert(false && "UNIMPLEMENTED");
3574 }
3575
3576 RValue<UShort8> UShort8::operator=(RValue<UShort8> rhs) const
3577 {
3578 storeValue(rhs.value);
3579
3580 return rhs;
3581 }
3582
3583 RValue<UShort8> UShort8::operator=(const UShort8 &rhs) const
3584 {
3585 Value *value = rhs.loadValue();
3586 storeValue(value);
3587
3588 return RValue<UShort8>(value);
3589 }
3590
3591 RValue<UShort8> UShort8::operator=(const Reference<UShort8> &rhs) const
3592 {
3593 Value *value = rhs.loadValue();
3594 storeValue(value);
3595
3596 return RValue<UShort8>(value);
3597 }
3598
3599 RValue<UShort8> operator&(RValue<UShort8> lhs, RValue<UShort8> rhs)
3600 {
3601 return RValue<UShort8>(Nucleus::createAnd(lhs.value, rhs.value));
3602 }
3603
3604 RValue<UShort8> operator<<(RValue<UShort8> lhs, unsigned char rhs)
3605 {
Nicolas Capens327f1df2016-10-21 14:26:34 -04003606 return RValue<UShort8>(Nucleus::createShl(lhs.value, C(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003607 }
3608
3609 RValue<UShort8> operator>>(RValue<UShort8> lhs, unsigned char rhs)
3610 {
Nicolas Capens327f1df2016-10-21 14:26:34 -04003611 return RValue<UShort8>(Nucleus::createLShr(lhs.value, C(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003612 }
3613
3614 RValue<UShort8> operator+(RValue<UShort8> lhs, RValue<UShort8> rhs)
3615 {
3616 return RValue<UShort8>(Nucleus::createAdd(lhs.value, rhs.value));
3617 }
3618
3619 RValue<UShort8> operator*(RValue<UShort8> lhs, RValue<UShort8> rhs)
3620 {
3621 return RValue<UShort8>(Nucleus::createMul(lhs.value, rhs.value));
3622 }
3623
3624 RValue<UShort8> operator+=(const UShort8 &lhs, RValue<UShort8> rhs)
3625 {
3626 return lhs = lhs + rhs;
3627 }
3628
3629 RValue<UShort8> operator~(RValue<UShort8> val)
3630 {
3631 return RValue<UShort8>(Nucleus::createNot(val.value));
3632 }
3633
3634 RValue<UShort8> Swizzle(RValue<UShort8> x, char select0, char select1, char select2, char select3, char select4, char select5, char select6, char select7)
3635 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003636 assert(false && "UNIMPLEMENTED"); return RValue<UShort8>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003637 }
3638
3639 RValue<UShort8> MulHigh(RValue<UShort8> x, RValue<UShort8> y)
3640 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003641 assert(false && "UNIMPLEMENTED"); return RValue<UShort8>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003642 }
3643
3644 // FIXME: Implement as Shuffle(x, y, Select(i0, ..., i16)) and Shuffle(x, y, SELECT_PACK_REPEAT(element))
3645// RValue<UShort8> PackRepeat(RValue<Byte16> x, RValue<Byte16> y, int element)
3646// {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003647// assert(false && "UNIMPLEMENTED"); return RValue<UShort8>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003648// }
3649
3650 Type *UShort8::getType()
3651 {
Nicolas Capens4cfd4572016-10-20 01:00:19 -04003652 return T(Ice::IceType_v8i16);
Nicolas Capens598f8d82016-09-26 15:09:10 -04003653 }
3654
3655 Int::Int(Argument<Int> argument)
3656 {
3657 storeValue(argument.value);
3658 }
3659
3660 Int::Int(RValue<Byte> cast)
3661 {
3662 Value *integer = Nucleus::createZExt(cast.value, Int::getType());
3663
3664 storeValue(integer);
3665 }
3666
3667 Int::Int(RValue<SByte> cast)
3668 {
3669 Value *integer = Nucleus::createSExt(cast.value, Int::getType());
3670
3671 storeValue(integer);
3672 }
3673
3674 Int::Int(RValue<Short> cast)
3675 {
3676 Value *integer = Nucleus::createSExt(cast.value, Int::getType());
3677
3678 storeValue(integer);
3679 }
3680
3681 Int::Int(RValue<UShort> cast)
3682 {
3683 Value *integer = Nucleus::createZExt(cast.value, Int::getType());
3684
3685 storeValue(integer);
3686 }
3687
3688 Int::Int(RValue<Int2> cast)
3689 {
3690 *this = Extract(cast, 0);
3691 }
3692
3693 Int::Int(RValue<Long> cast)
3694 {
3695 Value *integer = Nucleus::createTrunc(cast.value, Int::getType());
3696
3697 storeValue(integer);
3698 }
3699
3700 Int::Int(RValue<Float> cast)
3701 {
3702 Value *integer = Nucleus::createFPToSI(cast.value, Int::getType());
3703
3704 storeValue(integer);
3705 }
3706
3707 Int::Int()
3708 {
3709 }
3710
3711 Int::Int(int x)
3712 {
3713 storeValue(Nucleus::createConstantInt(x));
3714 }
3715
3716 Int::Int(RValue<Int> rhs)
3717 {
3718 storeValue(rhs.value);
3719 }
3720
3721 Int::Int(RValue<UInt> rhs)
3722 {
3723 storeValue(rhs.value);
3724 }
3725
3726 Int::Int(const Int &rhs)
3727 {
3728 Value *value = rhs.loadValue();
3729 storeValue(value);
3730 }
3731
3732 Int::Int(const Reference<Int> &rhs)
3733 {
3734 Value *value = rhs.loadValue();
3735 storeValue(value);
3736 }
3737
3738 Int::Int(const UInt &rhs)
3739 {
3740 Value *value = rhs.loadValue();
3741 storeValue(value);
3742 }
3743
3744 Int::Int(const Reference<UInt> &rhs)
3745 {
3746 Value *value = rhs.loadValue();
3747 storeValue(value);
3748 }
3749
3750 RValue<Int> Int::operator=(int rhs) const
3751 {
3752 return RValue<Int>(storeValue(Nucleus::createConstantInt(rhs)));
3753 }
3754
3755 RValue<Int> Int::operator=(RValue<Int> rhs) const
3756 {
3757 storeValue(rhs.value);
3758
3759 return rhs;
3760 }
3761
3762 RValue<Int> Int::operator=(RValue<UInt> rhs) const
3763 {
3764 storeValue(rhs.value);
3765
3766 return RValue<Int>(rhs);
3767 }
3768
3769 RValue<Int> Int::operator=(const Int &rhs) const
3770 {
3771 Value *value = rhs.loadValue();
3772 storeValue(value);
3773
3774 return RValue<Int>(value);
3775 }
3776
3777 RValue<Int> Int::operator=(const Reference<Int> &rhs) const
3778 {
3779 Value *value = rhs.loadValue();
3780 storeValue(value);
3781
3782 return RValue<Int>(value);
3783 }
3784
3785 RValue<Int> Int::operator=(const UInt &rhs) const
3786 {
3787 Value *value = rhs.loadValue();
3788 storeValue(value);
3789
3790 return RValue<Int>(value);
3791 }
3792
3793 RValue<Int> Int::operator=(const Reference<UInt> &rhs) const
3794 {
3795 Value *value = rhs.loadValue();
3796 storeValue(value);
3797
3798 return RValue<Int>(value);
3799 }
3800
3801 RValue<Int> operator+(RValue<Int> lhs, RValue<Int> rhs)
3802 {
3803 return RValue<Int>(Nucleus::createAdd(lhs.value, rhs.value));
3804 }
3805
3806 RValue<Int> operator-(RValue<Int> lhs, RValue<Int> rhs)
3807 {
3808 return RValue<Int>(Nucleus::createSub(lhs.value, rhs.value));
3809 }
3810
3811 RValue<Int> operator*(RValue<Int> lhs, RValue<Int> rhs)
3812 {
3813 return RValue<Int>(Nucleus::createMul(lhs.value, rhs.value));
3814 }
3815
3816 RValue<Int> operator/(RValue<Int> lhs, RValue<Int> rhs)
3817 {
3818 return RValue<Int>(Nucleus::createSDiv(lhs.value, rhs.value));
3819 }
3820
3821 RValue<Int> operator%(RValue<Int> lhs, RValue<Int> rhs)
3822 {
3823 return RValue<Int>(Nucleus::createSRem(lhs.value, rhs.value));
3824 }
3825
3826 RValue<Int> operator&(RValue<Int> lhs, RValue<Int> rhs)
3827 {
3828 return RValue<Int>(Nucleus::createAnd(lhs.value, rhs.value));
3829 }
3830
3831 RValue<Int> operator|(RValue<Int> lhs, RValue<Int> rhs)
3832 {
3833 return RValue<Int>(Nucleus::createOr(lhs.value, rhs.value));
3834 }
3835
3836 RValue<Int> operator^(RValue<Int> lhs, RValue<Int> rhs)
3837 {
3838 return RValue<Int>(Nucleus::createXor(lhs.value, rhs.value));
3839 }
3840
3841 RValue<Int> operator<<(RValue<Int> lhs, RValue<Int> rhs)
3842 {
3843 return RValue<Int>(Nucleus::createShl(lhs.value, rhs.value));
3844 }
3845
3846 RValue<Int> operator>>(RValue<Int> lhs, RValue<Int> rhs)
3847 {
3848 return RValue<Int>(Nucleus::createAShr(lhs.value, rhs.value));
3849 }
3850
3851 RValue<Int> operator+=(const Int &lhs, RValue<Int> rhs)
3852 {
3853 return lhs = lhs + rhs;
3854 }
3855
3856 RValue<Int> operator-=(const Int &lhs, RValue<Int> rhs)
3857 {
3858 return lhs = lhs - rhs;
3859 }
3860
3861 RValue<Int> operator*=(const Int &lhs, RValue<Int> rhs)
3862 {
3863 return lhs = lhs * rhs;
3864 }
3865
3866 RValue<Int> operator/=(const Int &lhs, RValue<Int> rhs)
3867 {
3868 return lhs = lhs / rhs;
3869 }
3870
3871 RValue<Int> operator%=(const Int &lhs, RValue<Int> rhs)
3872 {
3873 return lhs = lhs % rhs;
3874 }
3875
3876 RValue<Int> operator&=(const Int &lhs, RValue<Int> rhs)
3877 {
3878 return lhs = lhs & rhs;
3879 }
3880
3881 RValue<Int> operator|=(const Int &lhs, RValue<Int> rhs)
3882 {
3883 return lhs = lhs | rhs;
3884 }
3885
3886 RValue<Int> operator^=(const Int &lhs, RValue<Int> rhs)
3887 {
3888 return lhs = lhs ^ rhs;
3889 }
3890
3891 RValue<Int> operator<<=(const Int &lhs, RValue<Int> rhs)
3892 {
3893 return lhs = lhs << rhs;
3894 }
3895
3896 RValue<Int> operator>>=(const Int &lhs, RValue<Int> rhs)
3897 {
3898 return lhs = lhs >> rhs;
3899 }
3900
3901 RValue<Int> operator+(RValue<Int> val)
3902 {
3903 return val;
3904 }
3905
3906 RValue<Int> operator-(RValue<Int> val)
3907 {
3908 return RValue<Int>(Nucleus::createNeg(val.value));
3909 }
3910
3911 RValue<Int> operator~(RValue<Int> val)
3912 {
3913 return RValue<Int>(Nucleus::createNot(val.value));
3914 }
3915
3916 RValue<Int> operator++(const Int &val, int) // Post-increment
3917 {
Nicolas Capens611642a2016-09-28 16:45:04 -04003918 auto oldValue = val.loadValue();
3919 auto newValue = ::function->makeVariable(Ice::IceType_i32);
3920 auto inc = Ice::InstArithmetic::create(::function, Ice::InstArithmetic::Add, newValue, oldValue, ::context->getConstantInt32(1));
3921 ::basicBlock->appendInst(inc);
3922 val.storeValue(V(newValue));
3923
3924 return RValue<Int>(oldValue);
Nicolas Capens598f8d82016-09-26 15:09:10 -04003925 }
3926
3927 const Int &operator++(const Int &val) // Pre-increment
3928 {
3929 assert(false && "UNIMPLEMENTED"); return val;
3930 }
3931
3932 RValue<Int> operator--(const Int &val, int) // Post-decrement
3933 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003934 assert(false && "UNIMPLEMENTED"); return RValue<Int>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003935 }
3936
3937 const Int &operator--(const Int &val) // Pre-decrement
3938 {
3939 assert(false && "UNIMPLEMENTED"); return val;
3940 }
3941
3942 RValue<Bool> operator<(RValue<Int> lhs, RValue<Int> rhs)
3943 {
3944 return RValue<Bool>(Nucleus::createICmpSLT(lhs.value, rhs.value));
3945 }
3946
3947 RValue<Bool> operator<=(RValue<Int> lhs, RValue<Int> rhs)
3948 {
3949 return RValue<Bool>(Nucleus::createICmpSLE(lhs.value, rhs.value));
3950 }
3951
3952 RValue<Bool> operator>(RValue<Int> lhs, RValue<Int> rhs)
3953 {
3954 return RValue<Bool>(Nucleus::createICmpSGT(lhs.value, rhs.value));
3955 }
3956
3957 RValue<Bool> operator>=(RValue<Int> lhs, RValue<Int> rhs)
3958 {
3959 return RValue<Bool>(Nucleus::createICmpSGE(lhs.value, rhs.value));
3960 }
3961
3962 RValue<Bool> operator!=(RValue<Int> lhs, RValue<Int> rhs)
3963 {
3964 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
3965 }
3966
3967 RValue<Bool> operator==(RValue<Int> lhs, RValue<Int> rhs)
3968 {
3969 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
3970 }
3971
3972 RValue<Int> Max(RValue<Int> x, RValue<Int> y)
3973 {
3974 return IfThenElse(x > y, x, y);
3975 }
3976
3977 RValue<Int> Min(RValue<Int> x, RValue<Int> y)
3978 {
3979 return IfThenElse(x < y, x, y);
3980 }
3981
3982 RValue<Int> Clamp(RValue<Int> x, RValue<Int> min, RValue<Int> max)
3983 {
3984 return Min(Max(x, min), max);
3985 }
3986
3987 RValue<Int> RoundInt(RValue<Float> cast)
3988 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04003989 assert(false && "UNIMPLEMENTED"); return RValue<Int>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04003990 }
3991
3992 Type *Int::getType()
3993 {
3994 return T(Ice::IceType_i32);
3995 }
3996
3997 Long::Long(RValue<Int> cast)
3998 {
3999 Value *integer = Nucleus::createSExt(cast.value, Long::getType());
4000
4001 storeValue(integer);
4002 }
4003
4004 Long::Long(RValue<UInt> cast)
4005 {
4006 Value *integer = Nucleus::createZExt(cast.value, Long::getType());
4007
4008 storeValue(integer);
4009 }
4010
4011 Long::Long()
4012 {
4013 }
4014
4015 Long::Long(RValue<Long> rhs)
4016 {
4017 storeValue(rhs.value);
4018 }
4019
4020 RValue<Long> Long::operator=(int64_t rhs) const
4021 {
Nicolas Capens13ac2322016-10-13 14:52:12 -04004022 return RValue<Long>(storeValue(Nucleus::createConstantLong(rhs)));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004023 }
4024
4025 RValue<Long> Long::operator=(RValue<Long> rhs) const
4026 {
4027 storeValue(rhs.value);
4028
4029 return rhs;
4030 }
4031
4032 RValue<Long> Long::operator=(const Long &rhs) const
4033 {
4034 Value *value = rhs.loadValue();
4035 storeValue(value);
4036
4037 return RValue<Long>(value);
4038 }
4039
4040 RValue<Long> Long::operator=(const Reference<Long> &rhs) const
4041 {
4042 Value *value = rhs.loadValue();
4043 storeValue(value);
4044
4045 return RValue<Long>(value);
4046 }
4047
4048 RValue<Long> operator+(RValue<Long> lhs, RValue<Long> rhs)
4049 {
4050 return RValue<Long>(Nucleus::createAdd(lhs.value, rhs.value));
4051 }
4052
4053 RValue<Long> operator-(RValue<Long> lhs, RValue<Long> rhs)
4054 {
4055 return RValue<Long>(Nucleus::createSub(lhs.value, rhs.value));
4056 }
4057
4058 RValue<Long> operator+=(const Long &lhs, RValue<Long> rhs)
4059 {
4060 return lhs = lhs + rhs;
4061 }
4062
4063 RValue<Long> operator-=(const Long &lhs, RValue<Long> rhs)
4064 {
4065 return lhs = lhs - rhs;
4066 }
4067
4068 RValue<Long> AddAtomic(RValue<Pointer<Long> > x, RValue<Long> y)
4069 {
4070 return RValue<Long>(Nucleus::createAtomicAdd(x.value, y.value));
4071 }
4072
4073 Type *Long::getType()
4074 {
Nicolas Capens4cfd4572016-10-20 01:00:19 -04004075 return T(Ice::IceType_i64);
Nicolas Capens598f8d82016-09-26 15:09:10 -04004076 }
4077
4078 Long1::Long1(const RValue<UInt> cast)
4079 {
4080 assert(false && "UNIMPLEMENTED");
4081 }
4082
4083 Long1::Long1(RValue<Long1> rhs)
4084 {
4085 storeValue(rhs.value);
4086 }
4087
4088 Type *Long1::getType()
4089 {
4090 assert(false && "UNIMPLEMENTED"); return nullptr;
4091 }
4092
Nicolas Capens598f8d82016-09-26 15:09:10 -04004093 UInt::UInt(Argument<UInt> argument)
4094 {
4095 storeValue(argument.value);
4096 }
4097
4098 UInt::UInt(RValue<UShort> cast)
4099 {
4100 Value *integer = Nucleus::createZExt(cast.value, UInt::getType());
4101
4102 storeValue(integer);
4103 }
4104
4105 UInt::UInt(RValue<Long> cast)
4106 {
4107 Value *integer = Nucleus::createTrunc(cast.value, UInt::getType());
4108
4109 storeValue(integer);
4110 }
4111
4112 UInt::UInt(RValue<Float> cast)
4113 {
4114 assert(false && "UNIMPLEMENTED");
4115 }
4116
4117 UInt::UInt()
4118 {
4119 }
4120
4121 UInt::UInt(int x)
4122 {
4123 storeValue(Nucleus::createConstantInt(x));
4124 }
4125
4126 UInt::UInt(unsigned int x)
4127 {
4128 storeValue(Nucleus::createConstantInt(x));
4129 }
4130
4131 UInt::UInt(RValue<UInt> rhs)
4132 {
4133 storeValue(rhs.value);
4134 }
4135
4136 UInt::UInt(RValue<Int> rhs)
4137 {
4138 storeValue(rhs.value);
4139 }
4140
4141 UInt::UInt(const UInt &rhs)
4142 {
4143 Value *value = rhs.loadValue();
4144 storeValue(value);
4145 }
4146
4147 UInt::UInt(const Reference<UInt> &rhs)
4148 {
4149 Value *value = rhs.loadValue();
4150 storeValue(value);
4151 }
4152
4153 UInt::UInt(const Int &rhs)
4154 {
4155 Value *value = rhs.loadValue();
4156 storeValue(value);
4157 }
4158
4159 UInt::UInt(const Reference<Int> &rhs)
4160 {
4161 Value *value = rhs.loadValue();
4162 storeValue(value);
4163 }
4164
4165 RValue<UInt> UInt::operator=(unsigned int rhs) const
4166 {
4167 return RValue<UInt>(storeValue(Nucleus::createConstantInt(rhs)));
4168 }
4169
4170 RValue<UInt> UInt::operator=(RValue<UInt> rhs) const
4171 {
4172 storeValue(rhs.value);
4173
4174 return rhs;
4175 }
4176
4177 RValue<UInt> UInt::operator=(RValue<Int> rhs) const
4178 {
4179 storeValue(rhs.value);
4180
4181 return RValue<UInt>(rhs);
4182 }
4183
4184 RValue<UInt> UInt::operator=(const UInt &rhs) const
4185 {
4186 Value *value = rhs.loadValue();
4187 storeValue(value);
4188
4189 return RValue<UInt>(value);
4190 }
4191
4192 RValue<UInt> UInt::operator=(const Reference<UInt> &rhs) const
4193 {
4194 Value *value = rhs.loadValue();
4195 storeValue(value);
4196
4197 return RValue<UInt>(value);
4198 }
4199
4200 RValue<UInt> UInt::operator=(const Int &rhs) const
4201 {
4202 Value *value = rhs.loadValue();
4203 storeValue(value);
4204
4205 return RValue<UInt>(value);
4206 }
4207
4208 RValue<UInt> UInt::operator=(const Reference<Int> &rhs) const
4209 {
4210 Value *value = rhs.loadValue();
4211 storeValue(value);
4212
4213 return RValue<UInt>(value);
4214 }
4215
4216 RValue<UInt> operator+(RValue<UInt> lhs, RValue<UInt> rhs)
4217 {
4218 return RValue<UInt>(Nucleus::createAdd(lhs.value, rhs.value));
4219 }
4220
4221 RValue<UInt> operator-(RValue<UInt> lhs, RValue<UInt> rhs)
4222 {
4223 return RValue<UInt>(Nucleus::createSub(lhs.value, rhs.value));
4224 }
4225
4226 RValue<UInt> operator*(RValue<UInt> lhs, RValue<UInt> rhs)
4227 {
4228 return RValue<UInt>(Nucleus::createMul(lhs.value, rhs.value));
4229 }
4230
4231 RValue<UInt> operator/(RValue<UInt> lhs, RValue<UInt> rhs)
4232 {
4233 return RValue<UInt>(Nucleus::createUDiv(lhs.value, rhs.value));
4234 }
4235
4236 RValue<UInt> operator%(RValue<UInt> lhs, RValue<UInt> rhs)
4237 {
4238 return RValue<UInt>(Nucleus::createURem(lhs.value, rhs.value));
4239 }
4240
4241 RValue<UInt> operator&(RValue<UInt> lhs, RValue<UInt> rhs)
4242 {
4243 return RValue<UInt>(Nucleus::createAnd(lhs.value, rhs.value));
4244 }
4245
4246 RValue<UInt> operator|(RValue<UInt> lhs, RValue<UInt> rhs)
4247 {
4248 return RValue<UInt>(Nucleus::createOr(lhs.value, rhs.value));
4249 }
4250
4251 RValue<UInt> operator^(RValue<UInt> lhs, RValue<UInt> rhs)
4252 {
4253 return RValue<UInt>(Nucleus::createXor(lhs.value, rhs.value));
4254 }
4255
4256 RValue<UInt> operator<<(RValue<UInt> lhs, RValue<UInt> rhs)
4257 {
4258 return RValue<UInt>(Nucleus::createShl(lhs.value, rhs.value));
4259 }
4260
4261 RValue<UInt> operator>>(RValue<UInt> lhs, RValue<UInt> rhs)
4262 {
4263 return RValue<UInt>(Nucleus::createLShr(lhs.value, rhs.value));
4264 }
4265
4266 RValue<UInt> operator+=(const UInt &lhs, RValue<UInt> rhs)
4267 {
4268 return lhs = lhs + rhs;
4269 }
4270
4271 RValue<UInt> operator-=(const UInt &lhs, RValue<UInt> rhs)
4272 {
4273 return lhs = lhs - rhs;
4274 }
4275
4276 RValue<UInt> operator*=(const UInt &lhs, RValue<UInt> rhs)
4277 {
4278 return lhs = lhs * rhs;
4279 }
4280
4281 RValue<UInt> operator/=(const UInt &lhs, RValue<UInt> rhs)
4282 {
4283 return lhs = lhs / rhs;
4284 }
4285
4286 RValue<UInt> operator%=(const UInt &lhs, RValue<UInt> rhs)
4287 {
4288 return lhs = lhs % rhs;
4289 }
4290
4291 RValue<UInt> operator&=(const UInt &lhs, RValue<UInt> rhs)
4292 {
4293 return lhs = lhs & rhs;
4294 }
4295
4296 RValue<UInt> operator|=(const UInt &lhs, RValue<UInt> rhs)
4297 {
4298 return lhs = lhs | rhs;
4299 }
4300
4301 RValue<UInt> operator^=(const UInt &lhs, RValue<UInt> rhs)
4302 {
4303 return lhs = lhs ^ rhs;
4304 }
4305
4306 RValue<UInt> operator<<=(const UInt &lhs, RValue<UInt> rhs)
4307 {
4308 return lhs = lhs << rhs;
4309 }
4310
4311 RValue<UInt> operator>>=(const UInt &lhs, RValue<UInt> rhs)
4312 {
4313 return lhs = lhs >> rhs;
4314 }
4315
4316 RValue<UInt> operator+(RValue<UInt> val)
4317 {
4318 return val;
4319 }
4320
4321 RValue<UInt> operator-(RValue<UInt> val)
4322 {
4323 return RValue<UInt>(Nucleus::createNeg(val.value));
4324 }
4325
4326 RValue<UInt> operator~(RValue<UInt> val)
4327 {
4328 return RValue<UInt>(Nucleus::createNot(val.value));
4329 }
4330
4331 RValue<UInt> operator++(const UInt &val, int) // Post-increment
4332 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04004333 assert(false && "UNIMPLEMENTED"); return RValue<UInt>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004334 }
4335
4336 const UInt &operator++(const UInt &val) // Pre-increment
4337 {
4338 assert(false && "UNIMPLEMENTED"); return val;
4339 }
4340
4341 RValue<UInt> operator--(const UInt &val, int) // Post-decrement
4342 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04004343 assert(false && "UNIMPLEMENTED"); return RValue<UInt>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004344 }
4345
4346 const UInt &operator--(const UInt &val) // Pre-decrement
4347 {
4348 assert(false && "UNIMPLEMENTED"); return val;
4349 }
4350
4351 RValue<UInt> Max(RValue<UInt> x, RValue<UInt> y)
4352 {
4353 return IfThenElse(x > y, x, y);
4354 }
4355
4356 RValue<UInt> Min(RValue<UInt> x, RValue<UInt> y)
4357 {
4358 return IfThenElse(x < y, x, y);
4359 }
4360
4361 RValue<UInt> Clamp(RValue<UInt> x, RValue<UInt> min, RValue<UInt> max)
4362 {
4363 return Min(Max(x, min), max);
4364 }
4365
4366 RValue<Bool> operator<(RValue<UInt> lhs, RValue<UInt> rhs)
4367 {
4368 return RValue<Bool>(Nucleus::createICmpULT(lhs.value, rhs.value));
4369 }
4370
4371 RValue<Bool> operator<=(RValue<UInt> lhs, RValue<UInt> rhs)
4372 {
4373 return RValue<Bool>(Nucleus::createICmpULE(lhs.value, rhs.value));
4374 }
4375
4376 RValue<Bool> operator>(RValue<UInt> lhs, RValue<UInt> rhs)
4377 {
4378 return RValue<Bool>(Nucleus::createICmpUGT(lhs.value, rhs.value));
4379 }
4380
4381 RValue<Bool> operator>=(RValue<UInt> lhs, RValue<UInt> rhs)
4382 {
4383 return RValue<Bool>(Nucleus::createICmpUGE(lhs.value, rhs.value));
4384 }
4385
4386 RValue<Bool> operator!=(RValue<UInt> lhs, RValue<UInt> rhs)
4387 {
4388 return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
4389 }
4390
4391 RValue<Bool> operator==(RValue<UInt> lhs, RValue<UInt> rhs)
4392 {
4393 return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
4394 }
4395
4396// RValue<UInt> RoundUInt(RValue<Float> cast)
4397// {
Nicolas Capensc37252c2016-09-28 16:11:54 -04004398// assert(false && "UNIMPLEMENTED"); return RValue<UInt>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004399// }
4400
4401 Type *UInt::getType()
4402 {
Nicolas Capens4cfd4572016-10-20 01:00:19 -04004403 return T(Ice::IceType_i32);
Nicolas Capens598f8d82016-09-26 15:09:10 -04004404 }
4405
4406// Int2::Int2(RValue<Int> cast)
4407// {
4408// Value *extend = Nucleus::createZExt(cast.value, Long::getType());
4409// Value *vector = Nucleus::createBitCast(extend, Int2::getType());
4410//
4411// Constant *shuffle[2];
4412// shuffle[0] = Nucleus::createConstantInt(0);
4413// shuffle[1] = Nucleus::createConstantInt(0);
4414//
4415// Value *replicate = Nucleus::createShuffleVector(vector, UndefValue::get(Int2::getType()), Nucleus::createConstantVector(shuffle, 2));
4416//
4417// storeValue(replicate);
4418// }
4419
4420 Int2::Int2(RValue<Int4> cast)
4421 {
Nicolas Capens22008782016-10-20 01:11:47 -04004422 storeValue(Nucleus::createBitCast(cast.value, getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004423 }
4424
4425 Int2::Int2()
4426 {
4427 // xy.parent = this;
4428 }
4429
4430 Int2::Int2(int x, int y)
4431 {
4432 // xy.parent = this;
4433
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04004434 int64_t constantVector[2] = {x, y};
4435 storeValue(Nucleus::createConstantVector(constantVector, getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004436 }
4437
4438 Int2::Int2(RValue<Int2> rhs)
4439 {
4440 // xy.parent = this;
4441
4442 storeValue(rhs.value);
4443 }
4444
4445 Int2::Int2(const Int2 &rhs)
4446 {
4447 // xy.parent = this;
4448
4449 Value *value = rhs.loadValue();
4450 storeValue(value);
4451 }
4452
4453 Int2::Int2(const Reference<Int2> &rhs)
4454 {
4455 // xy.parent = this;
4456
4457 Value *value = rhs.loadValue();
4458 storeValue(value);
4459 }
4460
4461 Int2::Int2(RValue<Int> lo, RValue<Int> hi)
4462 {
4463 assert(false && "UNIMPLEMENTED");
4464 }
4465
4466 RValue<Int2> Int2::operator=(RValue<Int2> rhs) const
4467 {
4468 storeValue(rhs.value);
4469
4470 return rhs;
4471 }
4472
4473 RValue<Int2> Int2::operator=(const Int2 &rhs) const
4474 {
4475 Value *value = rhs.loadValue();
4476 storeValue(value);
4477
4478 return RValue<Int2>(value);
4479 }
4480
4481 RValue<Int2> Int2::operator=(const Reference<Int2> &rhs) const
4482 {
4483 Value *value = rhs.loadValue();
4484 storeValue(value);
4485
4486 return RValue<Int2>(value);
4487 }
4488
4489 RValue<Int2> operator+(RValue<Int2> lhs, RValue<Int2> rhs)
4490 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04004491 return RValue<Int2>(Nucleus::createAdd(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004492 }
4493
4494 RValue<Int2> operator-(RValue<Int2> lhs, RValue<Int2> rhs)
4495 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04004496 return RValue<Int2>(Nucleus::createSub(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004497 }
4498
4499// RValue<Int2> operator*(RValue<Int2> lhs, RValue<Int2> rhs)
4500// {
4501// return RValue<Int2>(Nucleus::createMul(lhs.value, rhs.value));
4502// }
4503
4504// RValue<Int2> operator/(RValue<Int2> lhs, RValue<Int2> rhs)
4505// {
4506// return RValue<Int2>(Nucleus::createSDiv(lhs.value, rhs.value));
4507// }
4508
4509// RValue<Int2> operator%(RValue<Int2> lhs, RValue<Int2> rhs)
4510// {
4511// return RValue<Int2>(Nucleus::createSRem(lhs.value, rhs.value));
4512// }
4513
4514 RValue<Int2> operator&(RValue<Int2> lhs, RValue<Int2> rhs)
4515 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04004516 return RValue<Int2>(Nucleus::createAnd(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004517 }
4518
4519 RValue<Int2> operator|(RValue<Int2> lhs, RValue<Int2> rhs)
4520 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04004521 return RValue<Int2>(Nucleus::createOr(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004522 }
4523
4524 RValue<Int2> operator^(RValue<Int2> lhs, RValue<Int2> rhs)
4525 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04004526 return RValue<Int2>(Nucleus::createXor(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004527 }
4528
4529 RValue<Int2> operator<<(RValue<Int2> lhs, unsigned char rhs)
4530 {
Nicolas Capens327f1df2016-10-21 14:26:34 -04004531 return RValue<Int2>(Nucleus::createShl(lhs.value, C(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004532 }
4533
4534 RValue<Int2> operator>>(RValue<Int2> lhs, unsigned char rhs)
4535 {
Nicolas Capens327f1df2016-10-21 14:26:34 -04004536 return RValue<Int2>(Nucleus::createAShr(lhs.value, C(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004537 }
4538
4539 RValue<Int2> operator<<(RValue<Int2> lhs, RValue<Long1> rhs)
4540 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04004541 assert(false && "UNIMPLEMENTED"); return RValue<Int2>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004542 }
4543
4544 RValue<Int2> operator>>(RValue<Int2> lhs, RValue<Long1> rhs)
4545 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04004546 assert(false && "UNIMPLEMENTED"); return RValue<Int2>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004547 }
4548
4549 RValue<Int2> operator+=(const Int2 &lhs, RValue<Int2> rhs)
4550 {
4551 return lhs = lhs + rhs;
4552 }
4553
4554 RValue<Int2> operator-=(const Int2 &lhs, RValue<Int2> rhs)
4555 {
4556 return lhs = lhs - rhs;
4557 }
4558
4559// RValue<Int2> operator*=(const Int2 &lhs, RValue<Int2> rhs)
4560// {
4561// return lhs = lhs * rhs;
4562// }
4563
4564// RValue<Int2> operator/=(const Int2 &lhs, RValue<Int2> rhs)
4565// {
4566// return lhs = lhs / rhs;
4567// }
4568
4569// RValue<Int2> operator%=(const Int2 &lhs, RValue<Int2> rhs)
4570// {
4571// return lhs = lhs % rhs;
4572// }
4573
4574 RValue<Int2> operator&=(const Int2 &lhs, RValue<Int2> rhs)
4575 {
4576 return lhs = lhs & rhs;
4577 }
4578
4579 RValue<Int2> operator|=(const Int2 &lhs, RValue<Int2> rhs)
4580 {
4581 return lhs = lhs | rhs;
4582 }
4583
4584 RValue<Int2> operator^=(const Int2 &lhs, RValue<Int2> rhs)
4585 {
4586 return lhs = lhs ^ rhs;
4587 }
4588
4589 RValue<Int2> operator<<=(const Int2 &lhs, unsigned char rhs)
4590 {
4591 return lhs = lhs << rhs;
4592 }
4593
4594 RValue<Int2> operator>>=(const Int2 &lhs, unsigned char rhs)
4595 {
4596 return lhs = lhs >> rhs;
4597 }
4598
4599 RValue<Int2> operator<<=(const Int2 &lhs, RValue<Long1> rhs)
4600 {
4601 return lhs = lhs << rhs;
4602 }
4603
4604 RValue<Int2> operator>>=(const Int2 &lhs, RValue<Long1> rhs)
4605 {
4606 return lhs = lhs >> rhs;
4607 }
4608
4609// RValue<Int2> operator+(RValue<Int2> val)
4610// {
4611// return val;
4612// }
4613
4614// RValue<Int2> operator-(RValue<Int2> val)
4615// {
4616// return RValue<Int2>(Nucleus::createNeg(val.value));
4617// }
4618
4619 RValue<Int2> operator~(RValue<Int2> val)
4620 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04004621 assert(false && "UNIMPLEMENTED"); return RValue<Int2>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004622 }
4623
4624 RValue<Long1> UnpackLow(RValue<Int2> x, RValue<Int2> y)
4625 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04004626 assert(false && "UNIMPLEMENTED"); return RValue<Long1>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004627 }
4628
4629 RValue<Long1> UnpackHigh(RValue<Int2> x, RValue<Int2> y)
4630 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04004631 assert(false && "UNIMPLEMENTED"); return RValue<Long1>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004632 }
4633
4634 RValue<Int> Extract(RValue<Int2> val, int i)
4635 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04004636 assert(false && "UNIMPLEMENTED"); return RValue<Int>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004637 }
4638
4639 RValue<Int2> Insert(RValue<Int2> val, RValue<Int> element, int i)
4640 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04004641 assert(false && "UNIMPLEMENTED"); return RValue<Int2>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004642 }
4643
4644 Type *Int2::getType()
4645 {
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04004646 return T(Type_v2i32);
Nicolas Capens598f8d82016-09-26 15:09:10 -04004647 }
4648
4649 UInt2::UInt2()
4650 {
4651 // xy.parent = this;
4652 }
4653
4654 UInt2::UInt2(unsigned int x, unsigned int y)
4655 {
4656 // xy.parent = this;
4657
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04004658 int64_t constantVector[2] = {x, y};
4659 storeValue(Nucleus::createConstantVector(constantVector, getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004660 }
4661
4662 UInt2::UInt2(RValue<UInt2> rhs)
4663 {
4664 // xy.parent = this;
4665
4666 storeValue(rhs.value);
4667 }
4668
4669 UInt2::UInt2(const UInt2 &rhs)
4670 {
4671 // xy.parent = this;
4672
4673 Value *value = rhs.loadValue();
4674 storeValue(value);
4675 }
4676
4677 UInt2::UInt2(const Reference<UInt2> &rhs)
4678 {
4679 // xy.parent = this;
4680
4681 Value *value = rhs.loadValue();
4682 storeValue(value);
4683 }
4684
4685 RValue<UInt2> UInt2::operator=(RValue<UInt2> rhs) const
4686 {
4687 storeValue(rhs.value);
4688
4689 return rhs;
4690 }
4691
4692 RValue<UInt2> UInt2::operator=(const UInt2 &rhs) const
4693 {
4694 Value *value = rhs.loadValue();
4695 storeValue(value);
4696
4697 return RValue<UInt2>(value);
4698 }
4699
4700 RValue<UInt2> UInt2::operator=(const Reference<UInt2> &rhs) const
4701 {
4702 Value *value = rhs.loadValue();
4703 storeValue(value);
4704
4705 return RValue<UInt2>(value);
4706 }
4707
4708 RValue<UInt2> operator+(RValue<UInt2> lhs, RValue<UInt2> rhs)
4709 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04004710 return RValue<UInt2>(Nucleus::createAdd(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004711 }
4712
4713 RValue<UInt2> operator-(RValue<UInt2> lhs, RValue<UInt2> rhs)
4714 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04004715 return RValue<UInt2>(Nucleus::createSub(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004716 }
4717
4718// RValue<UInt2> operator*(RValue<UInt2> lhs, RValue<UInt2> rhs)
4719// {
4720// return RValue<UInt2>(Nucleus::createMul(lhs.value, rhs.value));
4721// }
4722
4723// RValue<UInt2> operator/(RValue<UInt2> lhs, RValue<UInt2> rhs)
4724// {
4725// return RValue<UInt2>(Nucleus::createUDiv(lhs.value, rhs.value));
4726// }
4727
4728// RValue<UInt2> operator%(RValue<UInt2> lhs, RValue<UInt2> rhs)
4729// {
4730// return RValue<UInt2>(Nucleus::createURem(lhs.value, rhs.value));
4731// }
4732
4733 RValue<UInt2> operator&(RValue<UInt2> lhs, RValue<UInt2> rhs)
4734 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04004735 return RValue<UInt2>(Nucleus::createAnd(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004736 }
4737
4738 RValue<UInt2> operator|(RValue<UInt2> lhs, RValue<UInt2> rhs)
4739 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04004740 return RValue<UInt2>(Nucleus::createOr(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004741 }
4742
4743 RValue<UInt2> operator^(RValue<UInt2> lhs, RValue<UInt2> rhs)
4744 {
Nicolas Capensc4c431d2016-10-21 15:30:29 -04004745 return RValue<UInt2>(Nucleus::createXor(lhs.value, rhs.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004746 }
4747
4748 RValue<UInt2> operator<<(RValue<UInt2> lhs, unsigned char rhs)
4749 {
Nicolas Capens327f1df2016-10-21 14:26:34 -04004750 return RValue<UInt2>(Nucleus::createShl(lhs.value, C(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004751 }
4752
4753 RValue<UInt2> operator>>(RValue<UInt2> lhs, unsigned char rhs)
4754 {
Nicolas Capens327f1df2016-10-21 14:26:34 -04004755 return RValue<UInt2>(Nucleus::createLShr(lhs.value, C(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004756 }
4757
4758 RValue<UInt2> operator<<(RValue<UInt2> lhs, RValue<Long1> rhs)
4759 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04004760 assert(false && "UNIMPLEMENTED"); return RValue<UInt2>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004761 }
4762
4763 RValue<UInt2> operator>>(RValue<UInt2> lhs, RValue<Long1> rhs)
4764 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04004765 assert(false && "UNIMPLEMENTED"); return RValue<UInt2>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004766 }
4767
4768 RValue<UInt2> operator+=(const UInt2 &lhs, RValue<UInt2> rhs)
4769 {
4770 return lhs = lhs + rhs;
4771 }
4772
4773 RValue<UInt2> operator-=(const UInt2 &lhs, RValue<UInt2> rhs)
4774 {
4775 return lhs = lhs - rhs;
4776 }
4777
4778// RValue<UInt2> operator*=(const UInt2 &lhs, RValue<UInt2> rhs)
4779// {
4780// return lhs = lhs * rhs;
4781// }
4782
4783// RValue<UInt2> operator/=(const UInt2 &lhs, RValue<UInt2> rhs)
4784// {
4785// return lhs = lhs / rhs;
4786// }
4787
4788// RValue<UInt2> operator%=(const UInt2 &lhs, RValue<UInt2> rhs)
4789// {
4790// return lhs = lhs % rhs;
4791// }
4792
4793 RValue<UInt2> operator&=(const UInt2 &lhs, RValue<UInt2> rhs)
4794 {
4795 return lhs = lhs & rhs;
4796 }
4797
4798 RValue<UInt2> operator|=(const UInt2 &lhs, RValue<UInt2> rhs)
4799 {
4800 return lhs = lhs | rhs;
4801 }
4802
4803 RValue<UInt2> operator^=(const UInt2 &lhs, RValue<UInt2> rhs)
4804 {
4805 return lhs = lhs ^ rhs;
4806 }
4807
4808 RValue<UInt2> operator<<=(const UInt2 &lhs, unsigned char rhs)
4809 {
4810 return lhs = lhs << rhs;
4811 }
4812
4813 RValue<UInt2> operator>>=(const UInt2 &lhs, unsigned char rhs)
4814 {
4815 return lhs = lhs >> rhs;
4816 }
4817
4818 RValue<UInt2> operator<<=(const UInt2 &lhs, RValue<Long1> rhs)
4819 {
4820 return lhs = lhs << rhs;
4821 }
4822
4823 RValue<UInt2> operator>>=(const UInt2 &lhs, RValue<Long1> rhs)
4824 {
4825 return lhs = lhs >> rhs;
4826 }
4827
4828// RValue<UInt2> operator+(RValue<UInt2> val)
4829// {
4830// return val;
4831// }
4832
4833// RValue<UInt2> operator-(RValue<UInt2> val)
4834// {
4835// return RValue<UInt2>(Nucleus::createNeg(val.value));
4836// }
4837
4838 RValue<UInt2> operator~(RValue<UInt2> val)
4839 {
4840 return RValue<UInt2>(Nucleus::createNot(val.value));
4841 }
4842
4843 Type *UInt2::getType()
4844 {
Nicolas Capens4cfd4572016-10-20 01:00:19 -04004845 return T(Type_v2i32);
Nicolas Capens598f8d82016-09-26 15:09:10 -04004846 }
4847
4848 Int4::Int4(RValue<Byte4> cast)
4849 {
4850 assert(false && "UNIMPLEMENTED");
4851 }
4852
4853 Int4::Int4(RValue<SByte4> cast)
4854 {
4855 assert(false && "UNIMPLEMENTED");
4856 }
4857
4858 Int4::Int4(RValue<Float4> cast)
4859 {
4860 // xyzw.parent = this;
4861
4862 Value *xyzw = Nucleus::createFPToSI(cast.value, Int4::getType());
4863
4864 storeValue(xyzw);
4865 }
4866
4867 Int4::Int4(RValue<Short4> cast)
4868 {
4869 assert(false && "UNIMPLEMENTED");
4870 }
4871
4872 Int4::Int4(RValue<UShort4> cast)
4873 {
4874 assert(false && "UNIMPLEMENTED");
4875 }
4876
4877 Int4::Int4()
4878 {
4879 // xyzw.parent = this;
4880 }
4881
4882 Int4::Int4(int xyzw)
4883 {
4884 constant(xyzw, xyzw, xyzw, xyzw);
4885 }
4886
4887 Int4::Int4(int x, int yzw)
4888 {
4889 constant(x, yzw, yzw, yzw);
4890 }
4891
4892 Int4::Int4(int x, int y, int zw)
4893 {
4894 constant(x, y, zw, zw);
4895 }
4896
4897 Int4::Int4(int x, int y, int z, int w)
4898 {
4899 constant(x, y, z, w);
4900 }
4901
4902 void Int4::constant(int x, int y, int z, int w)
4903 {
4904 // xyzw.parent = this;
4905
Nicolas Capens13ac2322016-10-13 14:52:12 -04004906 int64_t constantVector[4] = {x, y, z, w};
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04004907 storeValue(Nucleus::createConstantVector(constantVector, getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04004908 }
4909
4910 Int4::Int4(RValue<Int4> rhs)
4911 {
4912 // xyzw.parent = this;
4913
4914 storeValue(rhs.value);
4915 }
4916
4917 Int4::Int4(const Int4 &rhs)
4918 {
4919 // xyzw.parent = this;
4920
4921 Value *value = rhs.loadValue();
4922 storeValue(value);
4923 }
4924
4925 Int4::Int4(const Reference<Int4> &rhs)
4926 {
4927 // xyzw.parent = this;
4928
4929 Value *value = rhs.loadValue();
4930 storeValue(value);
4931 }
4932
4933 Int4::Int4(RValue<UInt4> rhs)
4934 {
4935 // xyzw.parent = this;
4936
4937 storeValue(rhs.value);
4938 }
4939
4940 Int4::Int4(const UInt4 &rhs)
4941 {
4942 // xyzw.parent = this;
4943
4944 Value *value = rhs.loadValue();
4945 storeValue(value);
4946 }
4947
4948 Int4::Int4(const Reference<UInt4> &rhs)
4949 {
4950 // xyzw.parent = this;
4951
4952 Value *value = rhs.loadValue();
4953 storeValue(value);
4954 }
4955
4956 Int4::Int4(RValue<Int2> lo, RValue<Int2> hi)
4957 {
4958 assert(false && "UNIMPLEMENTED");
4959 }
4960
4961 Int4::Int4(RValue<Int> rhs)
4962 {
4963 // xyzw.parent = this;
4964
4965 assert(false && "UNIMPLEMENTED");
4966 }
4967
4968 Int4::Int4(const Int &rhs)
4969 {
4970 // xyzw.parent = this;
4971
4972 *this = RValue<Int>(rhs.loadValue());
4973 }
4974
4975 Int4::Int4(const Reference<Int> &rhs)
4976 {
4977 // xyzw.parent = this;
4978
4979 *this = RValue<Int>(rhs.loadValue());
4980 }
4981
4982 RValue<Int4> Int4::operator=(RValue<Int4> rhs) const
4983 {
4984 storeValue(rhs.value);
4985
4986 return rhs;
4987 }
4988
4989 RValue<Int4> Int4::operator=(const Int4 &rhs) const
4990 {
4991 Value *value = rhs.loadValue();
4992 storeValue(value);
4993
4994 return RValue<Int4>(value);
4995 }
4996
4997 RValue<Int4> Int4::operator=(const Reference<Int4> &rhs) const
4998 {
4999 Value *value = rhs.loadValue();
5000 storeValue(value);
5001
5002 return RValue<Int4>(value);
5003 }
5004
5005 RValue<Int4> operator+(RValue<Int4> lhs, RValue<Int4> rhs)
5006 {
5007 return RValue<Int4>(Nucleus::createAdd(lhs.value, rhs.value));
5008 }
5009
5010 RValue<Int4> operator-(RValue<Int4> lhs, RValue<Int4> rhs)
5011 {
5012 return RValue<Int4>(Nucleus::createSub(lhs.value, rhs.value));
5013 }
5014
5015 RValue<Int4> operator*(RValue<Int4> lhs, RValue<Int4> rhs)
5016 {
5017 return RValue<Int4>(Nucleus::createMul(lhs.value, rhs.value));
5018 }
5019
5020 RValue<Int4> operator/(RValue<Int4> lhs, RValue<Int4> rhs)
5021 {
5022 return RValue<Int4>(Nucleus::createSDiv(lhs.value, rhs.value));
5023 }
5024
5025 RValue<Int4> operator%(RValue<Int4> lhs, RValue<Int4> rhs)
5026 {
5027 return RValue<Int4>(Nucleus::createSRem(lhs.value, rhs.value));
5028 }
5029
5030 RValue<Int4> operator&(RValue<Int4> lhs, RValue<Int4> rhs)
5031 {
5032 return RValue<Int4>(Nucleus::createAnd(lhs.value, rhs.value));
5033 }
5034
5035 RValue<Int4> operator|(RValue<Int4> lhs, RValue<Int4> rhs)
5036 {
5037 return RValue<Int4>(Nucleus::createOr(lhs.value, rhs.value));
5038 }
5039
5040 RValue<Int4> operator^(RValue<Int4> lhs, RValue<Int4> rhs)
5041 {
5042 return RValue<Int4>(Nucleus::createXor(lhs.value, rhs.value));
5043 }
5044
5045 RValue<Int4> operator<<(RValue<Int4> lhs, unsigned char rhs)
5046 {
Nicolas Capens327f1df2016-10-21 14:26:34 -04005047 return RValue<Int4>(Nucleus::createShl(lhs.value, C(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005048 }
5049
5050 RValue<Int4> operator>>(RValue<Int4> lhs, unsigned char rhs)
5051 {
Nicolas Capens327f1df2016-10-21 14:26:34 -04005052 return RValue<Int4>(Nucleus::createAShr(lhs.value, C(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005053 }
5054
5055 RValue<Int4> operator<<(RValue<Int4> lhs, RValue<Int4> rhs)
5056 {
5057 return RValue<Int4>(Nucleus::createShl(lhs.value, rhs.value));
5058 }
5059
5060 RValue<Int4> operator>>(RValue<Int4> lhs, RValue<Int4> rhs)
5061 {
5062 return RValue<Int4>(Nucleus::createAShr(lhs.value, rhs.value));
5063 }
5064
5065 RValue<Int4> operator+=(const Int4 &lhs, RValue<Int4> rhs)
5066 {
5067 return lhs = lhs + rhs;
5068 }
5069
5070 RValue<Int4> operator-=(const Int4 &lhs, RValue<Int4> rhs)
5071 {
5072 return lhs = lhs - rhs;
5073 }
5074
5075 RValue<Int4> operator*=(const Int4 &lhs, RValue<Int4> rhs)
5076 {
5077 return lhs = lhs * rhs;
5078 }
5079
5080// RValue<Int4> operator/=(const Int4 &lhs, RValue<Int4> rhs)
5081// {
5082// return lhs = lhs / rhs;
5083// }
5084
5085// RValue<Int4> operator%=(const Int4 &lhs, RValue<Int4> rhs)
5086// {
5087// return lhs = lhs % rhs;
5088// }
5089
5090 RValue<Int4> operator&=(const Int4 &lhs, RValue<Int4> rhs)
5091 {
5092 return lhs = lhs & rhs;
5093 }
5094
5095 RValue<Int4> operator|=(const Int4 &lhs, RValue<Int4> rhs)
5096 {
5097 return lhs = lhs | rhs;
5098 }
5099
5100 RValue<Int4> operator^=(const Int4 &lhs, RValue<Int4> rhs)
5101 {
5102 return lhs = lhs ^ rhs;
5103 }
5104
5105 RValue<Int4> operator<<=(const Int4 &lhs, unsigned char rhs)
5106 {
5107 return lhs = lhs << rhs;
5108 }
5109
5110 RValue<Int4> operator>>=(const Int4 &lhs, unsigned char rhs)
5111 {
5112 return lhs = lhs >> rhs;
5113 }
5114
5115 RValue<Int4> operator+(RValue<Int4> val)
5116 {
5117 return val;
5118 }
5119
5120 RValue<Int4> operator-(RValue<Int4> val)
5121 {
5122 return RValue<Int4>(Nucleus::createNeg(val.value));
5123 }
5124
5125 RValue<Int4> operator~(RValue<Int4> val)
5126 {
5127 return RValue<Int4>(Nucleus::createNot(val.value));
5128 }
5129
5130 RValue<Int4> CmpEQ(RValue<Int4> x, RValue<Int4> y)
5131 {
5132 return RValue<Int4>(Nucleus::createSExt(Nucleus::createICmpEQ(x.value, y.value), Int4::getType()));
5133 }
5134
5135 RValue<Int4> CmpLT(RValue<Int4> x, RValue<Int4> y)
5136 {
5137 return RValue<Int4>(Nucleus::createSExt(Nucleus::createICmpSLT(x.value, y.value), Int4::getType()));
5138 }
5139
5140 RValue<Int4> CmpLE(RValue<Int4> x, RValue<Int4> y)
5141 {
5142 return RValue<Int4>(Nucleus::createSExt(Nucleus::createICmpSLE(x.value, y.value), Int4::getType()));
5143 }
5144
5145 RValue<Int4> CmpNEQ(RValue<Int4> x, RValue<Int4> y)
5146 {
5147 return RValue<Int4>(Nucleus::createSExt(Nucleus::createICmpNE(x.value, y.value), Int4::getType()));
5148 }
5149
5150 RValue<Int4> CmpNLT(RValue<Int4> x, RValue<Int4> y)
5151 {
5152 return RValue<Int4>(Nucleus::createSExt(Nucleus::createICmpSGE(x.value, y.value), Int4::getType()));
5153 }
5154
5155 RValue<Int4> CmpNLE(RValue<Int4> x, RValue<Int4> y)
5156 {
5157 return RValue<Int4>(Nucleus::createSExt(Nucleus::createICmpSGT(x.value, y.value), Int4::getType()));
5158 }
5159
5160 RValue<Int4> Max(RValue<Int4> x, RValue<Int4> y)
5161 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04005162 assert(false && "UNIMPLEMENTED"); return RValue<Int4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005163 }
5164
5165 RValue<Int4> Min(RValue<Int4> x, RValue<Int4> y)
5166 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04005167 assert(false && "UNIMPLEMENTED"); return RValue<Int4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005168 }
5169
5170 RValue<Int4> RoundInt(RValue<Float4> cast)
5171 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04005172 assert(false && "UNIMPLEMENTED"); return RValue<Int4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005173 }
5174
5175 RValue<Short8> Pack(RValue<Int4> x, RValue<Int4> y)
5176 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04005177 assert(false && "UNIMPLEMENTED"); return RValue<Short8>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005178 }
5179
5180 RValue<Int> Extract(RValue<Int4> x, int i)
5181 {
Nicolas Capense95d5342016-09-30 11:37:28 -04005182 return RValue<Int>(Nucleus::createExtractElement(x.value, Int::getType(), i));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005183 }
5184
5185 RValue<Int4> Insert(RValue<Int4> x, RValue<Int> element, int i)
5186 {
5187 return RValue<Int4>(Nucleus::createInsertElement(x.value, element.value, i));
5188 }
5189
5190 RValue<Int> SignMask(RValue<Int4> x)
5191 {
Nicolas Capensf2cb9df2016-10-21 17:26:13 -04005192 Ice::Variable *result = ::function->makeVariable(Ice::IceType_i32);
5193 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::SignMask, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
5194 auto target = ::context->getConstantUndef(Ice::IceType_i32);
5195 auto movmsk = Ice::InstIntrinsicCall::create(::function, 1, result, target, intrinsic);
5196 movmsk->addArg(x.value);
5197 ::basicBlock->appendInst(movmsk);
5198
5199 return RValue<Int>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005200 }
5201
5202 RValue<Int4> Swizzle(RValue<Int4> x, unsigned char select)
5203 {
Nicolas Capense95d5342016-09-30 11:37:28 -04005204 return RValue<Int4>(createSwizzle4(x.value, select));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005205 }
5206
5207 Type *Int4::getType()
5208 {
Nicolas Capens23d99a42016-09-30 14:57:16 -04005209 return T(Ice::IceType_v4i32);
Nicolas Capens598f8d82016-09-26 15:09:10 -04005210 }
5211
5212 UInt4::UInt4(RValue<Float4> cast)
5213 {
5214 // xyzw.parent = this;
5215
5216 assert(false && "UNIMPLEMENTED");
5217 }
5218
5219 UInt4::UInt4()
5220 {
5221 // xyzw.parent = this;
5222 }
5223
5224 UInt4::UInt4(int xyzw)
5225 {
5226 constant(xyzw, xyzw, xyzw, xyzw);
5227 }
5228
5229 UInt4::UInt4(int x, int yzw)
5230 {
5231 constant(x, yzw, yzw, yzw);
5232 }
5233
5234 UInt4::UInt4(int x, int y, int zw)
5235 {
5236 constant(x, y, zw, zw);
5237 }
5238
5239 UInt4::UInt4(int x, int y, int z, int w)
5240 {
5241 constant(x, y, z, w);
5242 }
5243
5244 void UInt4::constant(int x, int y, int z, int w)
5245 {
5246 // xyzw.parent = this;
5247
Nicolas Capens13ac2322016-10-13 14:52:12 -04005248 int64_t constantVector[4] = {x, y, z, w};
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04005249 storeValue(Nucleus::createConstantVector(constantVector, getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005250 }
5251
5252 UInt4::UInt4(RValue<UInt4> rhs)
5253 {
5254 // xyzw.parent = this;
5255
5256 storeValue(rhs.value);
5257 }
5258
5259 UInt4::UInt4(const UInt4 &rhs)
5260 {
5261 // xyzw.parent = this;
5262
5263 Value *value = rhs.loadValue();
5264 storeValue(value);
5265 }
5266
5267 UInt4::UInt4(const Reference<UInt4> &rhs)
5268 {
5269 // xyzw.parent = this;
5270
5271 Value *value = rhs.loadValue();
5272 storeValue(value);
5273 }
5274
5275 UInt4::UInt4(RValue<Int4> rhs)
5276 {
5277 // xyzw.parent = this;
5278
5279 storeValue(rhs.value);
5280 }
5281
5282 UInt4::UInt4(const Int4 &rhs)
5283 {
5284 // xyzw.parent = this;
5285
5286 Value *value = rhs.loadValue();
5287 storeValue(value);
5288 }
5289
5290 UInt4::UInt4(const Reference<Int4> &rhs)
5291 {
5292 // xyzw.parent = this;
5293
5294 Value *value = rhs.loadValue();
5295 storeValue(value);
5296 }
5297
5298 UInt4::UInt4(RValue<UInt2> lo, RValue<UInt2> hi)
5299 {
5300 assert(false && "UNIMPLEMENTED");
5301 }
5302
5303 RValue<UInt4> UInt4::operator=(RValue<UInt4> rhs) const
5304 {
5305 storeValue(rhs.value);
5306
5307 return rhs;
5308 }
5309
5310 RValue<UInt4> UInt4::operator=(const UInt4 &rhs) const
5311 {
5312 Value *value = rhs.loadValue();
5313 storeValue(value);
5314
5315 return RValue<UInt4>(value);
5316 }
5317
5318 RValue<UInt4> UInt4::operator=(const Reference<UInt4> &rhs) const
5319 {
5320 Value *value = rhs.loadValue();
5321 storeValue(value);
5322
5323 return RValue<UInt4>(value);
5324 }
5325
5326 RValue<UInt4> operator+(RValue<UInt4> lhs, RValue<UInt4> rhs)
5327 {
5328 return RValue<UInt4>(Nucleus::createAdd(lhs.value, rhs.value));
5329 }
5330
5331 RValue<UInt4> operator-(RValue<UInt4> lhs, RValue<UInt4> rhs)
5332 {
5333 return RValue<UInt4>(Nucleus::createSub(lhs.value, rhs.value));
5334 }
5335
5336 RValue<UInt4> operator*(RValue<UInt4> lhs, RValue<UInt4> rhs)
5337 {
5338 return RValue<UInt4>(Nucleus::createMul(lhs.value, rhs.value));
5339 }
5340
5341 RValue<UInt4> operator/(RValue<UInt4> lhs, RValue<UInt4> rhs)
5342 {
5343 return RValue<UInt4>(Nucleus::createUDiv(lhs.value, rhs.value));
5344 }
5345
5346 RValue<UInt4> operator%(RValue<UInt4> lhs, RValue<UInt4> rhs)
5347 {
5348 return RValue<UInt4>(Nucleus::createURem(lhs.value, rhs.value));
5349 }
5350
5351 RValue<UInt4> operator&(RValue<UInt4> lhs, RValue<UInt4> rhs)
5352 {
5353 return RValue<UInt4>(Nucleus::createAnd(lhs.value, rhs.value));
5354 }
5355
5356 RValue<UInt4> operator|(RValue<UInt4> lhs, RValue<UInt4> rhs)
5357 {
5358 return RValue<UInt4>(Nucleus::createOr(lhs.value, rhs.value));
5359 }
5360
5361 RValue<UInt4> operator^(RValue<UInt4> lhs, RValue<UInt4> rhs)
5362 {
5363 return RValue<UInt4>(Nucleus::createXor(lhs.value, rhs.value));
5364 }
5365
5366 RValue<UInt4> operator<<(RValue<UInt4> lhs, unsigned char rhs)
5367 {
Nicolas Capens327f1df2016-10-21 14:26:34 -04005368 return RValue<UInt4>(Nucleus::createShl(lhs.value, C(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005369 }
5370
5371 RValue<UInt4> operator>>(RValue<UInt4> lhs, unsigned char rhs)
5372 {
Nicolas Capens327f1df2016-10-21 14:26:34 -04005373 return RValue<UInt4>(Nucleus::createLShr(lhs.value, C(::context->getConstantInt32(rhs))));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005374 }
5375
5376 RValue<UInt4> operator<<(RValue<UInt4> lhs, RValue<UInt4> rhs)
5377 {
5378 return RValue<UInt4>(Nucleus::createShl(lhs.value, rhs.value));
5379 }
5380
5381 RValue<UInt4> operator>>(RValue<UInt4> lhs, RValue<UInt4> rhs)
5382 {
5383 return RValue<UInt4>(Nucleus::createLShr(lhs.value, rhs.value));
5384 }
5385
5386 RValue<UInt4> operator+=(const UInt4 &lhs, RValue<UInt4> rhs)
5387 {
5388 return lhs = lhs + rhs;
5389 }
5390
5391 RValue<UInt4> operator-=(const UInt4 &lhs, RValue<UInt4> rhs)
5392 {
5393 return lhs = lhs - rhs;
5394 }
5395
5396 RValue<UInt4> operator*=(const UInt4 &lhs, RValue<UInt4> rhs)
5397 {
5398 return lhs = lhs * rhs;
5399 }
5400
5401// RValue<UInt4> operator/=(const UInt4 &lhs, RValue<UInt4> rhs)
5402// {
5403// return lhs = lhs / rhs;
5404// }
5405
5406// RValue<UInt4> operator%=(const UInt4 &lhs, RValue<UInt4> rhs)
5407// {
5408// return lhs = lhs % rhs;
5409// }
5410
5411 RValue<UInt4> operator&=(const UInt4 &lhs, RValue<UInt4> rhs)
5412 {
5413 return lhs = lhs & rhs;
5414 }
5415
5416 RValue<UInt4> operator|=(const UInt4 &lhs, RValue<UInt4> rhs)
5417 {
5418 return lhs = lhs | rhs;
5419 }
5420
5421 RValue<UInt4> operator^=(const UInt4 &lhs, RValue<UInt4> rhs)
5422 {
5423 return lhs = lhs ^ rhs;
5424 }
5425
5426 RValue<UInt4> operator<<=(const UInt4 &lhs, unsigned char rhs)
5427 {
5428 return lhs = lhs << rhs;
5429 }
5430
5431 RValue<UInt4> operator>>=(const UInt4 &lhs, unsigned char rhs)
5432 {
5433 return lhs = lhs >> rhs;
5434 }
5435
5436 RValue<UInt4> operator+(RValue<UInt4> val)
5437 {
5438 return val;
5439 }
5440
5441 RValue<UInt4> operator-(RValue<UInt4> val)
5442 {
5443 return RValue<UInt4>(Nucleus::createNeg(val.value));
5444 }
5445
5446 RValue<UInt4> operator~(RValue<UInt4> val)
5447 {
5448 return RValue<UInt4>(Nucleus::createNot(val.value));
5449 }
5450
5451 RValue<UInt4> CmpEQ(RValue<UInt4> x, RValue<UInt4> y)
5452 {
5453 return RValue<UInt4>(Nucleus::createSExt(Nucleus::createICmpEQ(x.value, y.value), Int4::getType()));
5454 }
5455
5456 RValue<UInt4> CmpLT(RValue<UInt4> x, RValue<UInt4> y)
5457 {
5458 return RValue<UInt4>(Nucleus::createSExt(Nucleus::createICmpULT(x.value, y.value), Int4::getType()));
5459 }
5460
5461 RValue<UInt4> CmpLE(RValue<UInt4> x, RValue<UInt4> y)
5462 {
5463 return RValue<UInt4>(Nucleus::createSExt(Nucleus::createICmpULE(x.value, y.value), Int4::getType()));
5464 }
5465
5466 RValue<UInt4> CmpNEQ(RValue<UInt4> x, RValue<UInt4> y)
5467 {
5468 return RValue<UInt4>(Nucleus::createSExt(Nucleus::createICmpNE(x.value, y.value), Int4::getType()));
5469 }
5470
5471 RValue<UInt4> CmpNLT(RValue<UInt4> x, RValue<UInt4> y)
5472 {
5473 return RValue<UInt4>(Nucleus::createSExt(Nucleus::createICmpUGE(x.value, y.value), Int4::getType()));
5474 }
5475
5476 RValue<UInt4> CmpNLE(RValue<UInt4> x, RValue<UInt4> y)
5477 {
5478 return RValue<UInt4>(Nucleus::createSExt(Nucleus::createICmpUGT(x.value, y.value), Int4::getType()));
5479 }
5480
5481 RValue<UInt4> Max(RValue<UInt4> x, RValue<UInt4> y)
5482 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04005483 assert(false && "UNIMPLEMENTED"); return RValue<UInt4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005484 }
5485
5486 RValue<UInt4> Min(RValue<UInt4> x, RValue<UInt4> y)
5487 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04005488 assert(false && "UNIMPLEMENTED"); return RValue<UInt4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005489 }
5490
5491 RValue<UShort8> Pack(RValue<UInt4> x, RValue<UInt4> y)
5492 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04005493 assert(false && "UNIMPLEMENTED"); return RValue<UShort8>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005494 }
5495
5496 Type *UInt4::getType()
5497 {
Nicolas Capens4cfd4572016-10-20 01:00:19 -04005498 return T(Ice::IceType_v4i32);
Nicolas Capens598f8d82016-09-26 15:09:10 -04005499 }
5500
5501 Float::Float(RValue<Int> cast)
5502 {
5503 Value *integer = Nucleus::createSIToFP(cast.value, Float::getType());
5504
5505 storeValue(integer);
5506 }
5507
5508 Float::Float()
5509 {
5510 }
5511
5512 Float::Float(float x)
5513 {
5514 storeValue(Nucleus::createConstantFloat(x));
5515 }
5516
5517 Float::Float(RValue<Float> rhs)
5518 {
5519 storeValue(rhs.value);
5520 }
5521
5522 Float::Float(const Float &rhs)
5523 {
5524 Value *value = rhs.loadValue();
5525 storeValue(value);
5526 }
5527
5528 Float::Float(const Reference<Float> &rhs)
5529 {
5530 Value *value = rhs.loadValue();
5531 storeValue(value);
5532 }
5533
5534 RValue<Float> Float::operator=(RValue<Float> rhs) const
5535 {
5536 storeValue(rhs.value);
5537
5538 return rhs;
5539 }
5540
5541 RValue<Float> Float::operator=(const Float &rhs) const
5542 {
5543 Value *value = rhs.loadValue();
5544 storeValue(value);
5545
5546 return RValue<Float>(value);
5547 }
5548
5549 RValue<Float> Float::operator=(const Reference<Float> &rhs) const
5550 {
5551 Value *value = rhs.loadValue();
5552 storeValue(value);
5553
5554 return RValue<Float>(value);
5555 }
5556
5557 RValue<Float> operator+(RValue<Float> lhs, RValue<Float> rhs)
5558 {
5559 return RValue<Float>(Nucleus::createFAdd(lhs.value, rhs.value));
5560 }
5561
5562 RValue<Float> operator-(RValue<Float> lhs, RValue<Float> rhs)
5563 {
5564 return RValue<Float>(Nucleus::createFSub(lhs.value, rhs.value));
5565 }
5566
5567 RValue<Float> operator*(RValue<Float> lhs, RValue<Float> rhs)
5568 {
5569 return RValue<Float>(Nucleus::createFMul(lhs.value, rhs.value));
5570 }
5571
5572 RValue<Float> operator/(RValue<Float> lhs, RValue<Float> rhs)
5573 {
5574 return RValue<Float>(Nucleus::createFDiv(lhs.value, rhs.value));
5575 }
5576
5577 RValue<Float> operator+=(const Float &lhs, RValue<Float> rhs)
5578 {
5579 return lhs = lhs + rhs;
5580 }
5581
5582 RValue<Float> operator-=(const Float &lhs, RValue<Float> rhs)
5583 {
5584 return lhs = lhs - rhs;
5585 }
5586
5587 RValue<Float> operator*=(const Float &lhs, RValue<Float> rhs)
5588 {
5589 return lhs = lhs * rhs;
5590 }
5591
5592 RValue<Float> operator/=(const Float &lhs, RValue<Float> rhs)
5593 {
5594 return lhs = lhs / rhs;
5595 }
5596
5597 RValue<Float> operator+(RValue<Float> val)
5598 {
5599 return val;
5600 }
5601
5602 RValue<Float> operator-(RValue<Float> val)
5603 {
5604 return RValue<Float>(Nucleus::createFNeg(val.value));
5605 }
5606
5607 RValue<Bool> operator<(RValue<Float> lhs, RValue<Float> rhs)
5608 {
5609 return RValue<Bool>(Nucleus::createFCmpOLT(lhs.value, rhs.value));
5610 }
5611
5612 RValue<Bool> operator<=(RValue<Float> lhs, RValue<Float> rhs)
5613 {
5614 return RValue<Bool>(Nucleus::createFCmpOLE(lhs.value, rhs.value));
5615 }
5616
5617 RValue<Bool> operator>(RValue<Float> lhs, RValue<Float> rhs)
5618 {
5619 return RValue<Bool>(Nucleus::createFCmpOGT(lhs.value, rhs.value));
5620 }
5621
5622 RValue<Bool> operator>=(RValue<Float> lhs, RValue<Float> rhs)
5623 {
5624 return RValue<Bool>(Nucleus::createFCmpOGE(lhs.value, rhs.value));
5625 }
5626
5627 RValue<Bool> operator!=(RValue<Float> lhs, RValue<Float> rhs)
5628 {
5629 return RValue<Bool>(Nucleus::createFCmpONE(lhs.value, rhs.value));
5630 }
5631
5632 RValue<Bool> operator==(RValue<Float> lhs, RValue<Float> rhs)
5633 {
5634 return RValue<Bool>(Nucleus::createFCmpOEQ(lhs.value, rhs.value));
5635 }
5636
5637 RValue<Float> Abs(RValue<Float> x)
5638 {
5639 return IfThenElse(x > 0.0f, x, -x);
5640 }
5641
5642 RValue<Float> Max(RValue<Float> x, RValue<Float> y)
5643 {
5644 return IfThenElse(x > y, x, y);
5645 }
5646
5647 RValue<Float> Min(RValue<Float> x, RValue<Float> y)
5648 {
5649 return IfThenElse(x < y, x, y);
5650 }
5651
5652 RValue<Float> Rcp_pp(RValue<Float> x, bool exactAtPow2)
5653 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04005654 assert(false && "UNIMPLEMENTED"); return RValue<Float>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005655 }
5656
5657 RValue<Float> RcpSqrt_pp(RValue<Float> x)
5658 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04005659 assert(false && "UNIMPLEMENTED"); return RValue<Float>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005660 }
5661
5662 RValue<Float> Sqrt(RValue<Float> x)
5663 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04005664 assert(false && "UNIMPLEMENTED"); return RValue<Float>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005665 }
5666
5667 RValue<Float> Round(RValue<Float> x)
5668 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04005669 assert(false && "UNIMPLEMENTED"); return RValue<Float>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005670 }
5671
5672 RValue<Float> Trunc(RValue<Float> x)
5673 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04005674 assert(false && "UNIMPLEMENTED"); return RValue<Float>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005675 }
5676
5677 RValue<Float> Frac(RValue<Float> x)
5678 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04005679 assert(false && "UNIMPLEMENTED"); return RValue<Float>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005680 }
5681
5682 RValue<Float> Floor(RValue<Float> x)
5683 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04005684 assert(false && "UNIMPLEMENTED"); return RValue<Float>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005685 }
5686
5687 RValue<Float> Ceil(RValue<Float> x)
5688 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04005689 assert(false && "UNIMPLEMENTED"); return RValue<Float>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005690 }
5691
5692 Type *Float::getType()
5693 {
Nicolas Capens9709d4f2016-09-30 11:44:14 -04005694 return T(Ice::IceType_f32);
Nicolas Capens598f8d82016-09-26 15:09:10 -04005695 }
5696
5697 Float2::Float2(RValue<Float4> cast)
5698 {
Nicolas Capens22008782016-10-20 01:11:47 -04005699 storeValue(Nucleus::createBitCast(cast.value, getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005700 }
5701
5702 Type *Float2::getType()
5703 {
Nicolas Capens4cfd4572016-10-20 01:00:19 -04005704 return T(Type_v2f32);
Nicolas Capens598f8d82016-09-26 15:09:10 -04005705 }
5706
5707 Float4::Float4(RValue<Byte4> cast)
5708 {
5709 xyzw.parent = this;
5710
5711 assert(false && "UNIMPLEMENTED");
5712 }
5713
5714 Float4::Float4(RValue<SByte4> cast)
5715 {
5716 xyzw.parent = this;
5717
5718 assert(false && "UNIMPLEMENTED");
5719 }
5720
5721 Float4::Float4(RValue<Short4> cast)
5722 {
5723 xyzw.parent = this;
5724
5725 Int4 c(cast);
5726 storeValue(Nucleus::createSIToFP(RValue<Int4>(c).value, Float4::getType()));
5727 }
5728
5729 Float4::Float4(RValue<UShort4> cast)
5730 {
5731 xyzw.parent = this;
5732
5733 Int4 c(cast);
5734 storeValue(Nucleus::createSIToFP(RValue<Int4>(c).value, Float4::getType()));
5735 }
5736
5737 Float4::Float4(RValue<Int4> cast)
5738 {
5739 xyzw.parent = this;
5740
5741 Value *xyzw = Nucleus::createSIToFP(cast.value, Float4::getType());
5742
5743 storeValue(xyzw);
5744 }
5745
5746 Float4::Float4(RValue<UInt4> cast)
5747 {
5748 xyzw.parent = this;
5749
5750 Value *xyzw = Nucleus::createUIToFP(cast.value, Float4::getType());
5751
5752 storeValue(xyzw);
5753 }
5754
5755 Float4::Float4()
5756 {
5757 xyzw.parent = this;
5758 }
5759
5760 Float4::Float4(float xyzw)
5761 {
5762 constant(xyzw, xyzw, xyzw, xyzw);
5763 }
5764
5765 Float4::Float4(float x, float yzw)
5766 {
5767 constant(x, yzw, yzw, yzw);
5768 }
5769
5770 Float4::Float4(float x, float y, float zw)
5771 {
5772 constant(x, y, zw, zw);
5773 }
5774
5775 Float4::Float4(float x, float y, float z, float w)
5776 {
5777 constant(x, y, z, w);
5778 }
5779
5780 void Float4::constant(float x, float y, float z, float w)
5781 {
5782 xyzw.parent = this;
5783
Nicolas Capens13ac2322016-10-13 14:52:12 -04005784 double constantVector[4] = {x, y, z, w};
Nicolas Capens8dfd9a72016-10-13 17:44:51 -04005785 storeValue(Nucleus::createConstantVector(constantVector, getType()));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005786 }
5787
5788 Float4::Float4(RValue<Float4> rhs)
5789 {
5790 xyzw.parent = this;
5791
5792 storeValue(rhs.value);
5793 }
5794
5795 Float4::Float4(const Float4 &rhs)
5796 {
5797 xyzw.parent = this;
5798
5799 Value *value = rhs.loadValue();
5800 storeValue(value);
5801 }
5802
5803 Float4::Float4(const Reference<Float4> &rhs)
5804 {
5805 xyzw.parent = this;
5806
5807 Value *value = rhs.loadValue();
5808 storeValue(value);
5809 }
5810
5811 Float4::Float4(RValue<Float> rhs)
5812 {
5813 xyzw.parent = this;
5814
5815 assert(false && "UNIMPLEMENTED");
5816 }
5817
5818 Float4::Float4(const Float &rhs)
5819 {
5820 xyzw.parent = this;
5821
5822 *this = RValue<Float>(rhs.loadValue());
5823 }
5824
5825 Float4::Float4(const Reference<Float> &rhs)
5826 {
5827 xyzw.parent = this;
5828
5829 *this = RValue<Float>(rhs.loadValue());
5830 }
5831
5832 RValue<Float4> Float4::operator=(float x) const
5833 {
5834 return *this = Float4(x, x, x, x);
5835 }
5836
5837 RValue<Float4> Float4::operator=(RValue<Float4> rhs) const
5838 {
5839 storeValue(rhs.value);
5840
5841 return rhs;
5842 }
5843
5844 RValue<Float4> Float4::operator=(const Float4 &rhs) const
5845 {
5846 Value *value = rhs.loadValue();
5847 storeValue(value);
5848
5849 return RValue<Float4>(value);
5850 }
5851
5852 RValue<Float4> Float4::operator=(const Reference<Float4> &rhs) const
5853 {
5854 Value *value = rhs.loadValue();
5855 storeValue(value);
5856
5857 return RValue<Float4>(value);
5858 }
5859
5860 RValue<Float4> Float4::operator=(RValue<Float> rhs) const
5861 {
5862 return *this = Float4(rhs);
5863 }
5864
5865 RValue<Float4> Float4::operator=(const Float &rhs) const
5866 {
5867 return *this = Float4(rhs);
5868 }
5869
5870 RValue<Float4> Float4::operator=(const Reference<Float> &rhs) const
5871 {
5872 return *this = Float4(rhs);
5873 }
5874
5875 RValue<Float4> operator+(RValue<Float4> lhs, RValue<Float4> rhs)
5876 {
5877 return RValue<Float4>(Nucleus::createFAdd(lhs.value, rhs.value));
5878 }
5879
5880 RValue<Float4> operator-(RValue<Float4> lhs, RValue<Float4> rhs)
5881 {
5882 return RValue<Float4>(Nucleus::createFSub(lhs.value, rhs.value));
5883 }
5884
5885 RValue<Float4> operator*(RValue<Float4> lhs, RValue<Float4> rhs)
5886 {
5887 return RValue<Float4>(Nucleus::createFMul(lhs.value, rhs.value));
5888 }
5889
5890 RValue<Float4> operator/(RValue<Float4> lhs, RValue<Float4> rhs)
5891 {
5892 return RValue<Float4>(Nucleus::createFDiv(lhs.value, rhs.value));
5893 }
5894
5895 RValue<Float4> operator%(RValue<Float4> lhs, RValue<Float4> rhs)
5896 {
5897 return RValue<Float4>(Nucleus::createFRem(lhs.value, rhs.value));
5898 }
5899
5900 RValue<Float4> operator+=(const Float4 &lhs, RValue<Float4> rhs)
5901 {
5902 return lhs = lhs + rhs;
5903 }
5904
5905 RValue<Float4> operator-=(const Float4 &lhs, RValue<Float4> rhs)
5906 {
5907 return lhs = lhs - rhs;
5908 }
5909
5910 RValue<Float4> operator*=(const Float4 &lhs, RValue<Float4> rhs)
5911 {
5912 return lhs = lhs * rhs;
5913 }
5914
5915 RValue<Float4> operator/=(const Float4 &lhs, RValue<Float4> rhs)
5916 {
5917 return lhs = lhs / rhs;
5918 }
5919
5920 RValue<Float4> operator%=(const Float4 &lhs, RValue<Float4> rhs)
5921 {
5922 return lhs = lhs % rhs;
5923 }
5924
5925 RValue<Float4> operator+(RValue<Float4> val)
5926 {
5927 return val;
5928 }
5929
5930 RValue<Float4> operator-(RValue<Float4> val)
5931 {
5932 return RValue<Float4>(Nucleus::createFNeg(val.value));
5933 }
5934
5935 RValue<Float4> Abs(RValue<Float4> x)
5936 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04005937 assert(false && "UNIMPLEMENTED"); return RValue<Float4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005938 }
5939
5940 RValue<Float4> Max(RValue<Float4> x, RValue<Float4> y)
5941 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04005942 assert(false && "UNIMPLEMENTED"); return RValue<Float4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005943 }
5944
5945 RValue<Float4> Min(RValue<Float4> x, RValue<Float4> y)
5946 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04005947 assert(false && "UNIMPLEMENTED"); return RValue<Float4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005948 }
5949
5950 RValue<Float4> Rcp_pp(RValue<Float4> x, bool exactAtPow2)
5951 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04005952 assert(false && "UNIMPLEMENTED"); return RValue<Float4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005953 }
5954
5955 RValue<Float4> RcpSqrt_pp(RValue<Float4> x)
5956 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04005957 assert(false && "UNIMPLEMENTED"); return RValue<Float4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005958 }
5959
5960 RValue<Float4> Sqrt(RValue<Float4> x)
5961 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04005962 assert(false && "UNIMPLEMENTED"); return RValue<Float4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005963 }
5964
5965 RValue<Float4> Insert(const Float4 &val, RValue<Float> element, int i)
5966 {
5967 Value *value = val.loadValue();
5968 Value *insert = Nucleus::createInsertElement(value, element.value, i);
5969
5970 val = RValue<Float4>(insert);
5971
5972 return val;
5973 }
5974
5975 RValue<Float> Extract(RValue<Float4> x, int i)
5976 {
Nicolas Capense95d5342016-09-30 11:37:28 -04005977 return RValue<Float>(Nucleus::createExtractElement(x.value, Float::getType(), i));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005978 }
5979
5980 RValue<Float4> Swizzle(RValue<Float4> x, unsigned char select)
5981 {
Nicolas Capense95d5342016-09-30 11:37:28 -04005982 return RValue<Float4>(createSwizzle4(x.value, select));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005983 }
5984
5985 RValue<Float4> ShuffleLowHigh(RValue<Float4> x, RValue<Float4> y, unsigned char imm)
5986 {
Nicolas Capens37fbece2016-10-21 15:08:56 -04005987 int shuffle[4] =
5988 {
5989 ((imm >> 0) & 0x03) + 0,
5990 ((imm >> 2) & 0x03) + 0,
5991 ((imm >> 4) & 0x03) + 4,
5992 ((imm >> 6) & 0x03) + 4,
5993 };
5994
5995 return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
Nicolas Capens598f8d82016-09-26 15:09:10 -04005996 }
5997
5998 RValue<Float4> UnpackLow(RValue<Float4> x, RValue<Float4> y)
5999 {
Nicolas Capens37fbece2016-10-21 15:08:56 -04006000 int shuffle[4] = {0, 4, 1, 5};
6001 return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
Nicolas Capens598f8d82016-09-26 15:09:10 -04006002 }
6003
6004 RValue<Float4> UnpackHigh(RValue<Float4> x, RValue<Float4> y)
6005 {
Nicolas Capens37fbece2016-10-21 15:08:56 -04006006 int shuffle[4] = {2, 6, 3, 7};
6007 return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, shuffle));
Nicolas Capens598f8d82016-09-26 15:09:10 -04006008 }
6009
6010 RValue<Float4> Mask(Float4 &lhs, RValue<Float4> rhs, unsigned char select)
6011 {
6012 Value *vector = lhs.loadValue();
Nicolas Capense95d5342016-09-30 11:37:28 -04006013 Value *shuffle = createMask4(vector, rhs.value, select);
Nicolas Capens598f8d82016-09-26 15:09:10 -04006014 lhs.storeValue(shuffle);
6015
6016 return RValue<Float4>(shuffle);
6017 }
6018
6019 RValue<Int> SignMask(RValue<Float4> x)
6020 {
Nicolas Capensf2cb9df2016-10-21 17:26:13 -04006021 Ice::Variable *result = ::function->makeVariable(Ice::IceType_i32);
6022 const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::SignMask, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F};
6023 auto target = ::context->getConstantUndef(Ice::IceType_i32);
6024 auto movmsk = Ice::InstIntrinsicCall::create(::function, 1, result, target, intrinsic);
6025 movmsk->addArg(x.value);
6026 ::basicBlock->appendInst(movmsk);
6027
6028 return RValue<Int>(V(result));
Nicolas Capens598f8d82016-09-26 15:09:10 -04006029 }
6030
6031 RValue<Int4> CmpEQ(RValue<Float4> x, RValue<Float4> y)
6032 {
6033 return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpOEQ(x.value, y.value), Int4::getType()));
6034 }
6035
6036 RValue<Int4> CmpLT(RValue<Float4> x, RValue<Float4> y)
6037 {
6038 return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpOLT(x.value, y.value), Int4::getType()));
6039 }
6040
6041 RValue<Int4> CmpLE(RValue<Float4> x, RValue<Float4> y)
6042 {
6043 return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpOLE(x.value, y.value), Int4::getType()));
6044 }
6045
6046 RValue<Int4> CmpNEQ(RValue<Float4> x, RValue<Float4> y)
6047 {
6048 return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpONE(x.value, y.value), Int4::getType()));
6049 }
6050
6051 RValue<Int4> CmpNLT(RValue<Float4> x, RValue<Float4> y)
6052 {
6053 return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpOGE(x.value, y.value), Int4::getType()));
6054 }
6055
6056 RValue<Int4> CmpNLE(RValue<Float4> x, RValue<Float4> y)
6057 {
6058 return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpOGT(x.value, y.value), Int4::getType()));
6059 }
6060
6061 RValue<Float4> Round(RValue<Float4> x)
6062 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04006063 assert(false && "UNIMPLEMENTED"); return RValue<Float4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04006064 }
6065
6066 RValue<Float4> Trunc(RValue<Float4> x)
6067 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04006068 assert(false && "UNIMPLEMENTED"); return RValue<Float4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04006069 }
6070
6071 RValue<Float4> Frac(RValue<Float4> x)
6072 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04006073 assert(false && "UNIMPLEMENTED"); return RValue<Float4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04006074 }
6075
6076 RValue<Float4> Floor(RValue<Float4> x)
6077 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04006078 assert(false && "UNIMPLEMENTED"); return RValue<Float4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04006079 }
6080
6081 RValue<Float4> Ceil(RValue<Float4> x)
6082 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04006083 assert(false && "UNIMPLEMENTED"); return RValue<Float4>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04006084 }
6085
6086 Type *Float4::getType()
6087 {
Nicolas Capens9709d4f2016-09-30 11:44:14 -04006088 return T(Ice::IceType_v4f32);
Nicolas Capens598f8d82016-09-26 15:09:10 -04006089 }
6090
6091 RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, int offset)
6092 {
Nicolas Capens8820f642016-09-30 04:42:43 -04006093 return lhs + RValue<Int>(Nucleus::createConstantInt(offset));
Nicolas Capens598f8d82016-09-26 15:09:10 -04006094 }
6095
6096 RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, RValue<Int> offset)
6097 {
Nicolas Capens6d738712016-09-30 04:15:22 -04006098 return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value, Byte::getType(), offset.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04006099 }
6100
6101 RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, RValue<UInt> offset)
6102 {
Nicolas Capens6d738712016-09-30 04:15:22 -04006103 return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value, Byte::getType(), offset.value));
Nicolas Capens598f8d82016-09-26 15:09:10 -04006104 }
6105
6106 RValue<Pointer<Byte>> operator+=(const Pointer<Byte> &lhs, int offset)
6107 {
6108 return lhs = lhs + offset;
6109 }
6110
6111 RValue<Pointer<Byte>> operator+=(const Pointer<Byte> &lhs, RValue<Int> offset)
6112 {
6113 return lhs = lhs + offset;
6114 }
6115
6116 RValue<Pointer<Byte>> operator+=(const Pointer<Byte> &lhs, RValue<UInt> offset)
6117 {
6118 return lhs = lhs + offset;
6119 }
6120
6121 RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, int offset)
6122 {
6123 return lhs + -offset;
6124 }
6125
6126 RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, RValue<Int> offset)
6127 {
6128 return lhs + -offset;
6129 }
6130
6131 RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, RValue<UInt> offset)
6132 {
6133 return lhs + -offset;
6134 }
6135
6136 RValue<Pointer<Byte>> operator-=(const Pointer<Byte> &lhs, int offset)
6137 {
6138 return lhs = lhs - offset;
6139 }
6140
6141 RValue<Pointer<Byte>> operator-=(const Pointer<Byte> &lhs, RValue<Int> offset)
6142 {
6143 return lhs = lhs - offset;
6144 }
6145
6146 RValue<Pointer<Byte>> operator-=(const Pointer<Byte> &lhs, RValue<UInt> offset)
6147 {
6148 return lhs = lhs - offset;
6149 }
6150
6151 void Return()
6152 {
6153 Nucleus::createRetVoid();
6154 Nucleus::setInsertBlock(Nucleus::createBasicBlock());
6155 Nucleus::createUnreachable();
6156 }
6157
6158 void Return(bool ret)
6159 {
Nicolas Capensfdcca2d2016-10-20 11:31:36 -04006160 Nucleus::createRet(Nucleus::createConstantInt(ret));
6161 Nucleus::setInsertBlock(Nucleus::createBasicBlock());
6162 Nucleus::createUnreachable();
Nicolas Capens598f8d82016-09-26 15:09:10 -04006163 }
6164
6165 void Return(const Int &ret)
6166 {
Nicolas Capensfdcca2d2016-10-20 11:31:36 -04006167 Nucleus::createRet(ret.loadValue());
6168 Nucleus::setInsertBlock(Nucleus::createBasicBlock());
6169 Nucleus::createUnreachable();
Nicolas Capens598f8d82016-09-26 15:09:10 -04006170 }
6171
Nicolas Capens598f8d82016-09-26 15:09:10 -04006172 bool branch(RValue<Bool> cmp, BasicBlock *bodyBB, BasicBlock *endBB)
6173 {
6174 Nucleus::createCondBr(cmp.value, bodyBB, endBB);
6175 Nucleus::setInsertBlock(bodyBB);
6176
6177 return true;
6178 }
6179
Nicolas Capens9ed1a182016-10-24 09:52:23 -04006180 void endIf(BasicBlock *falseBB)
6181 {
6182 ::falseBB = falseBB;
6183 }
6184
Nicolas Capens598f8d82016-09-26 15:09:10 -04006185 bool elseBlock(BasicBlock *falseBB)
6186 {
Nicolas Capens9ed1a182016-10-24 09:52:23 -04006187 assert(falseBB && "Else not preceded by If");
6188 falseBB->getInsts().back().setDeleted();
Nicolas Capens598f8d82016-09-26 15:09:10 -04006189 Nucleus::setInsertBlock(falseBB);
6190
6191 return true;
6192 }
6193
Nicolas Capens9ed1a182016-10-24 09:52:23 -04006194 BasicBlock *beginElse()
6195 {
6196 BasicBlock *falseBB = ::falseBB;
6197 ::falseBB = nullptr;
6198
6199 return falseBB;
6200 }
6201
Nicolas Capens598f8d82016-09-26 15:09:10 -04006202 RValue<Long> Ticks()
6203 {
Nicolas Capensc37252c2016-09-28 16:11:54 -04006204 assert(false && "UNIMPLEMENTED"); return RValue<Long>(V(nullptr));
Nicolas Capens598f8d82016-09-26 15:09:10 -04006205 }
6206}
6207