1598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved. 2598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// 3598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// Licensed under the Apache License, Version 2.0 (the "License"); 4598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// you may not use this file except in compliance with the License. 5598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// You may obtain a copy of the License at 6598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// 7598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// http://www.apache.org/licenses/LICENSE-2.0 8598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// 9598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// Unless required by applicable law or agreed to in writing, software 10598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// distributed under the License is distributed on an "AS IS" BASIS, 11598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// See the License for the specific language governing permissions and 13598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// limitations under the License. 14598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 15598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens#include "Reactor.hpp" 16598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 172ae9d748de3749956aefad727fa9fdab4eb8eef2Nicolas Capens#include "Optimizer.hpp" 182ae9d748de3749956aefad727fa9fdab4eb8eef2Nicolas Capens 19598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens#include "src/IceTypes.h" 20598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens#include "src/IceCfg.h" 21598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens#include "src/IceELFStreamer.h" 22598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens#include "src/IceGlobalContext.h" 23598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens#include "src/IceCfgNode.h" 24598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens#include "src/IceELFObjectWriter.h" 258dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens#include "src/IceGlobalInits.h" 26598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 27598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens#include "llvm/Support/FileSystem.h" 28598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens#include "llvm/Support/raw_os_ostream.h" 29598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 30bd65da956d68fcc0cad776c3ffc73b6176a3f68eNicolas Capens#if defined(_WIN32) 31113e33ac5a3455981941643df40a98243fd4469fAlexis Hetu#ifndef WIN32_LEAN_AND_MEAN 32598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens#define WIN32_LEAN_AND_MEAN 33113e33ac5a3455981941643df40a98243fd4469fAlexis Hetu#endif // !WIN32_LEAN_AND_MEAN 34113e33ac5a3455981941643df40a98243fd4469fAlexis Hetu#ifndef NOMINMAX 35598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens#define NOMINMAX 36113e33ac5a3455981941643df40a98243fd4469fAlexis Hetu#endif // !NOMINMAX 37598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens#include <Windows.h> 38bd65da956d68fcc0cad776c3ffc73b6176a3f68eNicolas Capens#else 39bd65da956d68fcc0cad776c3ffc73b6176a3f68eNicolas Capens#include <sys/mman.h> 40411273e7b30258756011601a2c3035dd67721a55Nicolas Capens#if !defined(MAP_ANONYMOUS) 41411273e7b30258756011601a2c3035dd67721a55Nicolas Capens#define MAP_ANONYMOUS MAP_ANON 428b27574a7edb0f8c7a28aaa4087474b8ce43332eNicolas Capens#endif 43bd65da956d68fcc0cad776c3ffc73b6176a3f68eNicolas Capens#endif 44598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 45cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens//#include <mutex> 46598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens#include <limits> 47598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens#include <iostream> 48598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens#include <cassert> 49598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 50598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capensnamespace 51598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens{ 52598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Ice::GlobalContext *context = nullptr; 53598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Ice::Cfg *function = nullptr; 54598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Ice::CfgNode *basicBlock = nullptr; 55598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Ice::CfgLocalAllocatorScope *allocator = nullptr; 56598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens sw::Routine *routine = nullptr; 57598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 58598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens std::mutex codegenMutex; 59598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 60598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Ice::ELFFileStreamer *elfFile = nullptr; 61598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Ice::Fdstream *out = nullptr; 62598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens} 63598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 64ccd5ecb438faab7aff74835c36f75e31b7acf406Nicolas Capensnamespace 65ccd5ecb438faab7aff74835c36f75e31b7acf406Nicolas Capens{ 6647dc8676fcff01274de3d3fe98e1de607ff076d3Nicolas Capens #if !defined(__i386__) && defined(_M_IX86) 6747dc8676fcff01274de3d3fe98e1de607ff076d3Nicolas Capens #define __i386__ 1 6847dc8676fcff01274de3d3fe98e1de607ff076d3Nicolas Capens #endif 6947dc8676fcff01274de3d3fe98e1de607ff076d3Nicolas Capens 7047dc8676fcff01274de3d3fe98e1de607ff076d3Nicolas Capens #if !defined(__x86_64__) && (defined(_M_AMD64) || defined (_M_X64)) 7147dc8676fcff01274de3d3fe98e1de607ff076d3Nicolas Capens #define __x86_64__ 1 7247dc8676fcff01274de3d3fe98e1de607ff076d3Nicolas Capens #endif 7347dc8676fcff01274de3d3fe98e1de607ff076d3Nicolas Capens 74ccd5ecb438faab7aff74835c36f75e31b7acf406Nicolas Capens class CPUID 75ccd5ecb438faab7aff74835c36f75e31b7acf406Nicolas Capens { 76ccd5ecb438faab7aff74835c36f75e31b7acf406Nicolas Capens public: 77f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens const static bool ARM; 78ccd5ecb438faab7aff74835c36f75e31b7acf406Nicolas Capens const static bool SSE4_1; 79ccd5ecb438faab7aff74835c36f75e31b7acf406Nicolas Capens 80ccd5ecb438faab7aff74835c36f75e31b7acf406Nicolas Capens private: 81ccd5ecb438faab7aff74835c36f75e31b7acf406Nicolas Capens static void cpuid(int registers[4], int info) 82ccd5ecb438faab7aff74835c36f75e31b7acf406Nicolas Capens { 8347dc8676fcff01274de3d3fe98e1de607ff076d3Nicolas Capens #if defined(__i386__) || defined(__x86_64__) 8447dc8676fcff01274de3d3fe98e1de607ff076d3Nicolas Capens #if defined(_WIN32) 8547dc8676fcff01274de3d3fe98e1de607ff076d3Nicolas Capens __cpuid(registers, info); 8647dc8676fcff01274de3d3fe98e1de607ff076d3Nicolas Capens #else 8747dc8676fcff01274de3d3fe98e1de607ff076d3Nicolas Capens __asm volatile("cpuid": "=a" (registers[0]), "=b" (registers[1]), "=c" (registers[2]), "=d" (registers[3]): "a" (info)); 8847dc8676fcff01274de3d3fe98e1de607ff076d3Nicolas Capens #endif 89ccd5ecb438faab7aff74835c36f75e31b7acf406Nicolas Capens #else 9047dc8676fcff01274de3d3fe98e1de607ff076d3Nicolas Capens registers[0] = 0; 9147dc8676fcff01274de3d3fe98e1de607ff076d3Nicolas Capens registers[1] = 0; 9247dc8676fcff01274de3d3fe98e1de607ff076d3Nicolas Capens registers[2] = 0; 9347dc8676fcff01274de3d3fe98e1de607ff076d3Nicolas Capens registers[3] = 0; 94ccd5ecb438faab7aff74835c36f75e31b7acf406Nicolas Capens #endif 95ccd5ecb438faab7aff74835c36f75e31b7acf406Nicolas Capens } 96ccd5ecb438faab7aff74835c36f75e31b7acf406Nicolas Capens 97f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens static bool detectARM() 98f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens { 99f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens #if defined(__arm__) 100f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens return true; 101f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens #elif defined(__i386__) || defined(__x86_64__) 102f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens return false; 103f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens #else 104f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens #error "Unknown architecture" 105f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens #endif 106f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens } 107f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens 108ccd5ecb438faab7aff74835c36f75e31b7acf406Nicolas Capens static bool detectSSE4_1() 109ccd5ecb438faab7aff74835c36f75e31b7acf406Nicolas Capens { 11047dc8676fcff01274de3d3fe98e1de607ff076d3Nicolas Capens #if defined(__i386__) || defined(__x86_64__) 11147dc8676fcff01274de3d3fe98e1de607ff076d3Nicolas Capens int registers[4]; 11247dc8676fcff01274de3d3fe98e1de607ff076d3Nicolas Capens cpuid(registers, 1); 11347dc8676fcff01274de3d3fe98e1de607ff076d3Nicolas Capens return (registers[2] & 0x00080000) != 0; 11447dc8676fcff01274de3d3fe98e1de607ff076d3Nicolas Capens #else 11547dc8676fcff01274de3d3fe98e1de607ff076d3Nicolas Capens return false; 11647dc8676fcff01274de3d3fe98e1de607ff076d3Nicolas Capens #endif 117ccd5ecb438faab7aff74835c36f75e31b7acf406Nicolas Capens } 118ccd5ecb438faab7aff74835c36f75e31b7acf406Nicolas Capens }; 119ccd5ecb438faab7aff74835c36f75e31b7acf406Nicolas Capens 120f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens const bool CPUID::ARM = CPUID::detectARM(); 121ccd5ecb438faab7aff74835c36f75e31b7acf406Nicolas Capens const bool CPUID::SSE4_1 = CPUID::detectSSE4_1(); 122091f350c0c1a18c7a05fa4b49ebb009e1710b3b8Nicolas Capens const bool emulateIntrinsics = false; 1232d8c370e1f949b9ddf7249179fa5a6041b4a050dNicolas Capens const bool emulateMismatchedBitCast = CPUID::ARM; 124ccd5ecb438faab7aff74835c36f75e31b7acf406Nicolas Capens} 125ccd5ecb438faab7aff74835c36f75e31b7acf406Nicolas Capens 126598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capensnamespace sw 127598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens{ 12823d99a4943f621bd09723c92ed012be233cd966cNicolas Capens enum EmulatedType 12923d99a4943f621bd09723c92ed012be233cd966cNicolas Capens { 13023d99a4943f621bd09723c92ed012be233cd966cNicolas Capens EmulatedShift = 16, 13123d99a4943f621bd09723c92ed012be233cd966cNicolas Capens EmulatedV2 = 2 << EmulatedShift, 13223d99a4943f621bd09723c92ed012be233cd966cNicolas Capens EmulatedV4 = 4 << EmulatedShift, 13323d99a4943f621bd09723c92ed012be233cd966cNicolas Capens EmulatedV8 = 8 << EmulatedShift, 13423d99a4943f621bd09723c92ed012be233cd966cNicolas Capens EmulatedBits = EmulatedV2 | EmulatedV4 | EmulatedV8, 13523d99a4943f621bd09723c92ed012be233cd966cNicolas Capens 13623d99a4943f621bd09723c92ed012be233cd966cNicolas Capens Type_v2i32 = Ice::IceType_v4i32 | EmulatedV2, 13723d99a4943f621bd09723c92ed012be233cd966cNicolas Capens Type_v4i16 = Ice::IceType_v8i16 | EmulatedV4, 13823d99a4943f621bd09723c92ed012be233cd966cNicolas Capens Type_v2i16 = Ice::IceType_v8i16 | EmulatedV2, 13923d99a4943f621bd09723c92ed012be233cd966cNicolas Capens Type_v8i8 = Ice::IceType_v16i8 | EmulatedV8, 14023d99a4943f621bd09723c92ed012be233cd966cNicolas Capens Type_v4i8 = Ice::IceType_v16i8 | EmulatedV4, 1414cfd45760c4cc0fb821322a869a2979ca8226843Nicolas Capens Type_v2f32 = Ice::IceType_v4f32 | EmulatedV2, 14223d99a4943f621bd09723c92ed012be233cd966cNicolas Capens }; 14323d99a4943f621bd09723c92ed012be233cd966cNicolas Capens 14415060bb012724757c3944f55da9fd668af78e559Nicolas Capens class Value : public Ice::Operand {}; 145b98fe5cd1eaa821083d816cf86a20eefe22f57c7Nicolas Capens class SwitchCases : public Ice::InstSwitch {}; 146598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens class BasicBlock : public Ice::CfgNode {}; 147598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 148598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Ice::Type T(Type *t) 149598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 150113e33ac5a3455981941643df40a98243fd4469fAlexis Hetu static_assert(static_cast<unsigned int>(Ice::IceType_NUM) < static_cast<unsigned int>(EmulatedBits), "Ice::Type overlaps with our emulated types!"); 15123d99a4943f621bd09723c92ed012be233cd966cNicolas Capens return (Ice::Type)(reinterpret_cast<std::intptr_t>(t) & ~EmulatedBits); 152598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 153598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 154598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Type *T(Ice::Type t) 155598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 156598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return reinterpret_cast<Type*>(t); 157598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 158598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 15923d99a4943f621bd09723c92ed012be233cd966cNicolas Capens Type *T(EmulatedType t) 16023d99a4943f621bd09723c92ed012be233cd966cNicolas Capens { 16123d99a4943f621bd09723c92ed012be233cd966cNicolas Capens return reinterpret_cast<Type*>(t); 16223d99a4943f621bd09723c92ed012be233cd966cNicolas Capens } 16323d99a4943f621bd09723c92ed012be233cd966cNicolas Capens 16415060bb012724757c3944f55da9fd668af78e559Nicolas Capens Value *V(Ice::Operand *v) 165598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 166598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return reinterpret_cast<Value*>(v); 167598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 168598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 169611642a2bb8c6922f90217d6296acc8b0ae59f10Nicolas Capens BasicBlock *B(Ice::CfgNode *b) 170611642a2bb8c6922f90217d6296acc8b0ae59f10Nicolas Capens { 171611642a2bb8c6922f90217d6296acc8b0ae59f10Nicolas Capens return reinterpret_cast<BasicBlock*>(b); 172611642a2bb8c6922f90217d6296acc8b0ae59f10Nicolas Capens } 173611642a2bb8c6922f90217d6296acc8b0ae59f10Nicolas Capens 174584088c014dda0148f75922a0a49543b846acbbbNicolas Capens static size_t typeSize(Type *type) 175584088c014dda0148f75922a0a49543b846acbbbNicolas Capens { 176584088c014dda0148f75922a0a49543b846acbbbNicolas Capens if(reinterpret_cast<std::intptr_t>(type) & EmulatedBits) 177584088c014dda0148f75922a0a49543b846acbbbNicolas Capens { 178584088c014dda0148f75922a0a49543b846acbbbNicolas Capens switch(reinterpret_cast<std::intptr_t>(type)) 179584088c014dda0148f75922a0a49543b846acbbbNicolas Capens { 180584088c014dda0148f75922a0a49543b846acbbbNicolas Capens case Type_v2i32: return 8; 181584088c014dda0148f75922a0a49543b846acbbbNicolas Capens case Type_v4i16: return 8; 182584088c014dda0148f75922a0a49543b846acbbbNicolas Capens case Type_v2i16: return 4; 183584088c014dda0148f75922a0a49543b846acbbbNicolas Capens case Type_v8i8: return 8; 184584088c014dda0148f75922a0a49543b846acbbbNicolas Capens case Type_v4i8: return 4; 185584088c014dda0148f75922a0a49543b846acbbbNicolas Capens case Type_v2f32: return 8; 186584088c014dda0148f75922a0a49543b846acbbbNicolas Capens default: assert(false); 187584088c014dda0148f75922a0a49543b846acbbbNicolas Capens } 188584088c014dda0148f75922a0a49543b846acbbbNicolas Capens } 189584088c014dda0148f75922a0a49543b846acbbbNicolas Capens 190584088c014dda0148f75922a0a49543b846acbbbNicolas Capens return Ice::typeWidthInBytes(T(type)); 191584088c014dda0148f75922a0a49543b846acbbbNicolas Capens } 192584088c014dda0148f75922a0a49543b846acbbbNicolas Capens 193598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Optimization optimization[10] = {InstructionCombining, Disabled}; 194598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 195664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens using ElfHeader = std::conditional<sizeof(void*) == 8, Elf64_Ehdr, Elf32_Ehdr>::type; 196664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens using SectionHeader = std::conditional<sizeof(void*) == 8, Elf64_Shdr, Elf32_Shdr>::type; 197664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens 198664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens inline const SectionHeader *sectionHeader(const ElfHeader *elfHeader) 199664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens { 200664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens return reinterpret_cast<const SectionHeader*>((intptr_t)elfHeader + elfHeader->e_shoff); 201664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens } 20287852e1df6414583fa536b569db62e93821f6247Nicolas Capens 203664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens inline const SectionHeader *elfSection(const ElfHeader *elfHeader, int index) 204664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens { 205664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens return §ionHeader(elfHeader)[index]; 206664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens } 207664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens 208664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens static void *relocateSymbol(const ElfHeader *elfHeader, const Elf32_Rel &relocation, const SectionHeader &relocationTable) 209664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens { 210664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens const SectionHeader *target = elfSection(elfHeader, relocationTable.sh_info); 21187852e1df6414583fa536b569db62e93821f6247Nicolas Capens 212664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens intptr_t address = (intptr_t)elfHeader + target->sh_offset; 213664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens int32_t *patchSite = (int*)(address + relocation.r_offset); 214664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens uint32_t index = relocation.getSymbol(); 215664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens int table = relocationTable.sh_link; 216664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens void *symbolValue = nullptr; 21787852e1df6414583fa536b569db62e93821f6247Nicolas Capens 218664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens if(index != SHN_UNDEF) 219664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens { 220664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens if(table == SHN_UNDEF) return nullptr; 221664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens const SectionHeader *symbolTable = elfSection(elfHeader, table); 22287852e1df6414583fa536b569db62e93821f6247Nicolas Capens 223664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens uint32_t symtab_entries = symbolTable->sh_size / symbolTable->sh_entsize; 224664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens if(index >= symtab_entries) 225664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens { 226664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens assert(index < symtab_entries && "Symbol Index out of range"); 227664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens return nullptr; 228664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens } 22987852e1df6414583fa536b569db62e93821f6247Nicolas Capens 230664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens intptr_t symbolAddress = (intptr_t)elfHeader + symbolTable->sh_offset; 231664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens Elf32_Sym &symbol = ((Elf32_Sym*)symbolAddress)[index]; 232664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens uint16_t section = symbol.st_shndx; 233664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens 234664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens if(section != SHN_UNDEF && section < SHN_LORESERVE) 235664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens { 236664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens const SectionHeader *target = elfSection(elfHeader, symbol.st_shndx); 237664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens symbolValue = reinterpret_cast<void*>((intptr_t)elfHeader + symbol.st_value + target->sh_offset); 238664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens } 239664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens else 240664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens { 241664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens return nullptr; 242664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens } 243664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens } 244664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens 245f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens if(CPUID::ARM) 246f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens { 24730cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens switch(relocation.getType()) 24830cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens { 24930cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens case R_ARM_NONE: 25030cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens // No relocation 25130cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens break; 25230cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens case R_ARM_MOVW_ABS_NC: 25330cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens { 25430cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens uint32_t thumb = 0; // Calls to Thumb code not supported. 255f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens uint32_t lo = (uint32_t)(intptr_t)symbolValue | thumb; 25630cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens *patchSite = (*patchSite & 0xFFF0F000) | ((lo & 0xF000) << 4) | (lo & 0x0FFF); 25730cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens } 25830cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens break; 25930cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens case R_ARM_MOVT_ABS: 26030cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens { 261f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens uint32_t hi = (uint32_t)(intptr_t)(symbolValue) >> 16; 26230cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens *patchSite = (*patchSite & 0xFFF0F000) | ((hi & 0xF000) << 4) | (hi & 0x0FFF); 26330cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens } 26430cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens break; 26530cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens default: 26630cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens assert(false && "Unsupported relocation type"); 26730cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens return nullptr; 26830cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens } 269f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens } 270f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens else 271f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens { 272f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens switch(relocation.getType()) 273f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens { 274f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens case R_386_NONE: 275f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens // No relocation 276f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens break; 277f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens case R_386_32: 278f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens *patchSite = (int32_t)((intptr_t)symbolValue + *patchSite); 279f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens break; 280f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens // case R_386_PC32: 281f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens // *patchSite = (int32_t)((intptr_t)symbolValue + *patchSite - (intptr_t)patchSite); 282f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens // break; 283f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens default: 284f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens assert(false && "Unsupported relocation type"); 285f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens return nullptr; 286f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens } 287f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens } 288f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens 289664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens return symbolValue; 290664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens } 291664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens 292664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens static void *relocateSymbol(const ElfHeader *elfHeader, const Elf64_Rela &relocation, const SectionHeader &relocationTable) 293664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens { 294664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens const SectionHeader *target = elfSection(elfHeader, relocationTable.sh_info); 29587852e1df6414583fa536b569db62e93821f6247Nicolas Capens 296664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens intptr_t address = (intptr_t)elfHeader + target->sh_offset; 297664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens int32_t *patchSite = (int*)(address + relocation.r_offset); 298664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens uint32_t index = relocation.getSymbol(); 299664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens int table = relocationTable.sh_link; 300664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens void *symbolValue = nullptr; 301664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens 302664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens if(index != SHN_UNDEF) 303664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens { 304664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens if(table == SHN_UNDEF) return nullptr; 305664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens const SectionHeader *symbolTable = elfSection(elfHeader, table); 30687852e1df6414583fa536b569db62e93821f6247Nicolas Capens 307664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens uint32_t symtab_entries = symbolTable->sh_size / symbolTable->sh_entsize; 308664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens if(index >= symtab_entries) 309664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens { 310664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens assert(index < symtab_entries && "Symbol Index out of range"); 311664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens return nullptr; 312664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens } 31387852e1df6414583fa536b569db62e93821f6247Nicolas Capens 314664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens intptr_t symbolAddress = (intptr_t)elfHeader + symbolTable->sh_offset; 315664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens Elf64_Sym &symbol = ((Elf64_Sym*)symbolAddress)[index]; 316664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens uint16_t section = symbol.st_shndx; 317664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens 318664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens if(section != SHN_UNDEF && section < SHN_LORESERVE) 319664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens { 320664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens const SectionHeader *target = elfSection(elfHeader, symbol.st_shndx); 321664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens symbolValue = reinterpret_cast<void*>((intptr_t)elfHeader + symbol.st_value + target->sh_offset); 322664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens } 323664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens else 324664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens { 325664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens return nullptr; 326664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens } 327664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens } 328664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens 329f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens switch(relocation.getType()) 330f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens { 331f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens case R_X86_64_NONE: 332f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens // No relocation 333f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens break; 334f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens case R_X86_64_64: 335f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens *(int64_t*)patchSite = (int64_t)((intptr_t)symbolValue + *(int64_t*)patchSite) + relocation.r_addend; 336f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens break; 337f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens case R_X86_64_PC32: 338f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens *patchSite = (int32_t)((intptr_t)symbolValue + *patchSite - (intptr_t)patchSite) + relocation.r_addend; 339f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens break; 340f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens case R_X86_64_32S: 341f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens *patchSite = (int32_t)((intptr_t)symbolValue + *patchSite) + relocation.r_addend; 342f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens break; 343f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens default: 344f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens assert(false && "Unsupported relocation type"); 345f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens return nullptr; 346f110e4d2625a88e71e998c3353fd84fad18e5b37Nicolas Capens } 347664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens 348664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens return symbolValue; 349664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens } 350664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens 3511cc44388266a519499c582a7d78cb5c6cfbcd5bfNicolas Capens void *loadImage(uint8_t *const elfImage, size_t &codeSize) 352598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 353598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens ElfHeader *elfHeader = (ElfHeader*)elfImage; 354598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 355598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens if(!elfHeader->checkMagic()) 356598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 357598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return nullptr; 358598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 359598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 360664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens // Expect ELF bitness to match platform 3616504711938ecad88fd4976f937b0733936925198Nicolas Capens assert(sizeof(void*) == 8 ? elfHeader->getFileClass() == ELFCLASS64 : elfHeader->getFileClass() == ELFCLASS32); 36230cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens #if defined(__i386__) 36330cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens assert(sizeof(void*) == 4 && elfHeader->e_machine == EM_386); 36430cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens #elif defined(__x86_64__) 36530cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens assert(sizeof(void*) == 8 && elfHeader->e_machine == EM_X86_64); 36630cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens #elif defined(__arm__) 36730cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens assert(sizeof(void*) == 4 && elfHeader->e_machine == EM_ARM); 36830cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens #else 36930cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens #error "Unsupported platform" 37030cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens #endif 371664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens 372598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens SectionHeader *sectionHeader = (SectionHeader*)(elfImage + elfHeader->e_shoff); 373598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens void *entry = nullptr; 374598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 375598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens for(int i = 0; i < elfHeader->e_shnum; i++) 376598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 377664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens if(sectionHeader[i].sh_type == SHT_PROGBITS) 378664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens { 379664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens if(sectionHeader[i].sh_flags & SHF_EXECINSTR) 380664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens { 381664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens entry = elfImage + sectionHeader[i].sh_offset; 3821cc44388266a519499c582a7d78cb5c6cfbcd5bfNicolas Capens codeSize = sectionHeader[i].sh_size; 383664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens } 384664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens } 385664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens else if(sectionHeader[i].sh_type == SHT_REL) 386664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens { 387664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens assert(sizeof(void*) == 4 && "UNIMPLEMENTED"); // Only expected/implemented for 32-bit code 388664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens 389113e33ac5a3455981941643df40a98243fd4469fAlexis Hetu for(Elf32_Word index = 0; index < sectionHeader[i].sh_size / sectionHeader[i].sh_entsize; index++) 390664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens { 391664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens const Elf32_Rel &relocation = ((const Elf32_Rel*)(elfImage + sectionHeader[i].sh_offset))[index]; 392113e33ac5a3455981941643df40a98243fd4469fAlexis Hetu relocateSymbol(elfHeader, relocation, sectionHeader[i]); 393664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens } 394664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens } 395664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens else if(sectionHeader[i].sh_type == SHT_RELA) 396598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 397664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens assert(sizeof(void*) == 8 && "UNIMPLEMENTED"); // Only expected/implemented for 64-bit code 398664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens 399113e33ac5a3455981941643df40a98243fd4469fAlexis Hetu for(Elf32_Word index = 0; index < sectionHeader[i].sh_size / sectionHeader[i].sh_entsize; index++) 400664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens { 401664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens const Elf64_Rela &relocation = ((const Elf64_Rela*)(elfImage + sectionHeader[i].sh_offset))[index]; 402113e33ac5a3455981941643df40a98243fd4469fAlexis Hetu relocateSymbol(elfHeader, relocation, sectionHeader[i]); 403664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens } 404598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 405598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 406598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 407598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return entry; 408598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 409598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 410598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens template<typename T> 411598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens struct ExecutableAllocator 412598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 413598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens ExecutableAllocator() {}; 414598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens template<class U> ExecutableAllocator(const ExecutableAllocator<U> &other) {}; 415598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 416598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens using value_type = T; 417598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens using size_type = std::size_t; 418598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 419598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens T *allocate(size_type n) 420598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 421bd65da956d68fcc0cad776c3ffc73b6176a3f68eNicolas Capens #if defined(_WIN32) 422bd65da956d68fcc0cad776c3ffc73b6176a3f68eNicolas Capens return (T*)VirtualAlloc(NULL, sizeof(T) * n, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); 423bd65da956d68fcc0cad776c3ffc73b6176a3f68eNicolas Capens #else 424bd65da956d68fcc0cad776c3ffc73b6176a3f68eNicolas Capens return (T*)mmap(nullptr, sizeof(T) * n, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); 425bd65da956d68fcc0cad776c3ffc73b6176a3f68eNicolas Capens #endif 426598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 427598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 428598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens void deallocate(T *p, size_type n) 429598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 430bd65da956d68fcc0cad776c3ffc73b6176a3f68eNicolas Capens #if defined(_WIN32) 431bd65da956d68fcc0cad776c3ffc73b6176a3f68eNicolas Capens VirtualFree(p, 0, MEM_RELEASE); 432bd65da956d68fcc0cad776c3ffc73b6176a3f68eNicolas Capens #else 433bd65da956d68fcc0cad776c3ffc73b6176a3f68eNicolas Capens munmap(p, sizeof(T) * n); 434bd65da956d68fcc0cad776c3ffc73b6176a3f68eNicolas Capens #endif 435598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 436598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens }; 437598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 438598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens class ELFMemoryStreamer : public Ice::ELFStreamer, public Routine 439598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 440598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens ELFMemoryStreamer(const ELFMemoryStreamer &) = delete; 441598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens ELFMemoryStreamer &operator=(const ELFMemoryStreamer &) = delete; 442598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 443598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens public: 44458274b5af7a36c2b1f1ef3ccce1c82feb0b47f9fNicolas Capens ELFMemoryStreamer() : Routine(), entry(nullptr) 445598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 446598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens position = 0; 447598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens buffer.reserve(0x1000); 448598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 449598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 45081aa97bd20033674ba28d779c05fbcee1539ebf7Nicolas Capens ~ELFMemoryStreamer() override 451598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 452bd65da956d68fcc0cad776c3ffc73b6176a3f68eNicolas Capens #if defined(_WIN32) 453bd65da956d68fcc0cad776c3ffc73b6176a3f68eNicolas Capens if(buffer.size() != 0) 454bd65da956d68fcc0cad776c3ffc73b6176a3f68eNicolas Capens { 455bd65da956d68fcc0cad776c3ffc73b6176a3f68eNicolas Capens DWORD exeProtection; 456bd65da956d68fcc0cad776c3ffc73b6176a3f68eNicolas Capens VirtualProtect(&buffer[0], buffer.size(), oldProtection, &exeProtection); 457bd65da956d68fcc0cad776c3ffc73b6176a3f68eNicolas Capens } 458bd65da956d68fcc0cad776c3ffc73b6176a3f68eNicolas Capens #endif 459598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 460598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 461598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens void write8(uint8_t Value) override 462598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 463598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens if(position == (uint64_t)buffer.size()) 464598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 465598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens buffer.push_back(Value); 466598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens position++; 467598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 468598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens else if(position < (uint64_t)buffer.size()) 469598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 470598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens buffer[position] = Value; 471598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens position++; 472598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 473598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens else assert(false && "UNIMPLEMENTED"); 474598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 475598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 476598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens void writeBytes(llvm::StringRef Bytes) override 477598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 478598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens std::size_t oldSize = buffer.size(); 479598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens buffer.resize(oldSize + Bytes.size()); 480598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens memcpy(&buffer[oldSize], Bytes.begin(), Bytes.size()); 481598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens position += Bytes.size(); 482598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 483598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 484598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens uint64_t tell() const override { return position; } 485598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 486598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens void seek(uint64_t Off) override { position = Off; } 487598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 488598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens const void *getEntry() override 489598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 49058274b5af7a36c2b1f1ef3ccce1c82feb0b47f9fNicolas Capens if(!entry) 49158274b5af7a36c2b1f1ef3ccce1c82feb0b47f9fNicolas Capens { 492bd65da956d68fcc0cad776c3ffc73b6176a3f68eNicolas Capens position = std::numeric_limits<std::size_t>::max(); // Can't stream more data after this 49358274b5af7a36c2b1f1ef3ccce1c82feb0b47f9fNicolas Capens 4941cc44388266a519499c582a7d78cb5c6cfbcd5bfNicolas Capens size_t codeSize = 0; 4951cc44388266a519499c582a7d78cb5c6cfbcd5bfNicolas Capens entry = loadImage(&buffer[0], codeSize); 4961cc44388266a519499c582a7d78cb5c6cfbcd5bfNicolas Capens 4971cc44388266a519499c582a7d78cb5c6cfbcd5bfNicolas Capens #if defined(_WIN32) 498e745f5a9ba3780d6bf5b0904d398ccc82104febfNicolas Capens VirtualProtect(&buffer[0], buffer.size(), PAGE_EXECUTE_READ, &oldProtection); 4991cc44388266a519499c582a7d78cb5c6cfbcd5bfNicolas Capens FlushInstructionCache(GetCurrentProcess(), NULL, 0); 5001cc44388266a519499c582a7d78cb5c6cfbcd5bfNicolas Capens #else 501e745f5a9ba3780d6bf5b0904d398ccc82104febfNicolas Capens mprotect(&buffer[0], buffer.size(), PROT_READ | PROT_EXEC); 5021cc44388266a519499c582a7d78cb5c6cfbcd5bfNicolas Capens __builtin___clear_cache((char*)entry, (char*)entry + codeSize); 5031cc44388266a519499c582a7d78cb5c6cfbcd5bfNicolas Capens #endif 50458274b5af7a36c2b1f1ef3ccce1c82feb0b47f9fNicolas Capens } 505598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 50658274b5af7a36c2b1f1ef3ccce1c82feb0b47f9fNicolas Capens return entry; 507598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 508598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 509598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens private: 51058274b5af7a36c2b1f1ef3ccce1c82feb0b47f9fNicolas Capens void *entry; 511598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens std::vector<uint8_t, ExecutableAllocator<uint8_t>> buffer; 512598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens std::size_t position; 513bd65da956d68fcc0cad776c3ffc73b6176a3f68eNicolas Capens 514bd65da956d68fcc0cad776c3ffc73b6176a3f68eNicolas Capens #if defined(_WIN32) 515598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens DWORD oldProtection; 516bd65da956d68fcc0cad776c3ffc73b6176a3f68eNicolas Capens #endif 517598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens }; 518598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 519598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Nucleus::Nucleus() 520598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 521598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens ::codegenMutex.lock(); // Reactor is currently not thread safe 522598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 523664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens Ice::ClFlags &Flags = Ice::ClFlags::Flags; 524664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens Ice::ClFlags::getParsedClFlags(Flags); 525664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens 52630cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens #if defined(__arm__) 52730cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens Flags.setTargetArch(Ice::Target_ARM32); 52830cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens Flags.setTargetInstructionSet(Ice::ARM32InstructionSet_HWDivArm); 52930cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens #else // x86 53030cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens Flags.setTargetArch(sizeof(void*) == 8 ? Ice::Target_X8664 : Ice::Target_X8632); 53130cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens Flags.setTargetInstructionSet(CPUID::SSE4_1 ? Ice::X86InstructionSet_SSE4_1 : Ice::X86InstructionSet_SSE2); 53230cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens #endif 533664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens Flags.setOutFileType(Ice::FT_Elf); 534664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens Flags.setOptLevel(Ice::Opt_2); 535664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens Flags.setApplicationBinaryInterface(Ice::ABI_Platform); 53630cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens Flags.setVerbose(false ? Ice::IceV_Most : Ice::IceV_None); 53730cd7d493449076986e7e34ddd00e2eaed113157Nicolas Capens Flags.setDisableHybridAssembly(true); 538598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5396504711938ecad88fd4976f937b0733936925198Nicolas Capens static llvm::raw_os_ostream cout(std::cout); 5406504711938ecad88fd4976f937b0733936925198Nicolas Capens static llvm::raw_os_ostream cerr(std::cerr); 541598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 542598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens if(false) // Write out to a file 543598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 544598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens std::error_code errorCode; 545598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens ::out = new Ice::Fdstream("out.o", errorCode, llvm::sys::fs::F_None); 546598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens ::elfFile = new Ice::ELFFileStreamer(*out); 5476504711938ecad88fd4976f937b0733936925198Nicolas Capens ::context = new Ice::GlobalContext(&cout, &cout, &cerr, elfFile); 548598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 549598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens else 550598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 551598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens ELFMemoryStreamer *elfMemory = new ELFMemoryStreamer(); 5526504711938ecad88fd4976f937b0733936925198Nicolas Capens ::context = new Ice::GlobalContext(&cout, &cout, &cerr, elfMemory); 553598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens ::routine = elfMemory; 554598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 555598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 556598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 557598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Nucleus::~Nucleus() 558598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 559619a8c5a7275d5b2f6e162e056ac41e37281a569Nicolas Capens delete ::routine; 560619a8c5a7275d5b2f6e162e056ac41e37281a569Nicolas Capens 561598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens delete ::allocator; 562598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens delete ::function; 563598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens delete ::context; 564598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 565598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens delete ::elfFile; 566598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens delete ::out; 567598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 568598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens ::codegenMutex.unlock(); 569598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 570598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 571598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Routine *Nucleus::acquireRoutine(const wchar_t *name, bool runOptimizations) 572598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 573598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens if(basicBlock->getInsts().empty() || basicBlock->getInsts().back().getKind() != Ice::Inst::Ret) 574598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 575598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens createRetVoid(); 576598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 577598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 578598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens std::wstring wideName(name); 579598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens std::string asciiName(wideName.begin(), wideName.end()); 580598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens ::function->setFunctionName(Ice::GlobalString::createWithString(::context, asciiName)); 581598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5822ae9d748de3749956aefad727fa9fdab4eb8eef2Nicolas Capens optimize(); 5832ae9d748de3749956aefad727fa9fdab4eb8eef2Nicolas Capens 584598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens ::function->translate(); 585de19f39a7049cccb37fb8b6086817637337f1cccNicolas Capens assert(!::function->hasError()); 586de19f39a7049cccb37fb8b6086817637337f1cccNicolas Capens 58783a6bb93fd825b975161546ff92d6fb77a7a9c22Nicolas Capens auto globals = ::function->getGlobalInits(); 588664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens 589664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens if(globals && !globals->empty()) 590664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens { 59183a6bb93fd825b975161546ff92d6fb77a7a9c22Nicolas Capens ::context->getGlobals()->merge(globals.get()); 592664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens } 593598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 594598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens ::context->emitFileHeader(); 595598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens ::function->emitIAS(); 596598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens auto assembler = ::function->releaseAssembler(); 597664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens auto objectWriter = ::context->getObjectWriter(); 598664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens assembler->alignFunction(); 599664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens objectWriter->writeFunctionCode(::function->getFunctionName(), false, assembler.get()); 600664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens ::context->lowerGlobals("last"); 60173dd7a249d69107af605d7cb7fd94baa9d722795Nicolas Capens ::context->lowerConstants(); 602b98fe5cd1eaa821083d816cf86a20eefe22f57c7Nicolas Capens ::context->lowerJumpTables(); 603664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens objectWriter->setUndefinedSyms(::context->getConstantExternSyms()); 604664783624264ab1ec4b15aaf9a45fe6daff3e4f6Nicolas Capens objectWriter->writeNonUserSections(); 605598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 606619a8c5a7275d5b2f6e162e056ac41e37281a569Nicolas Capens Routine *handoffRoutine = ::routine; 607619a8c5a7275d5b2f6e162e056ac41e37281a569Nicolas Capens ::routine = nullptr; 608619a8c5a7275d5b2f6e162e056ac41e37281a569Nicolas Capens 609619a8c5a7275d5b2f6e162e056ac41e37281a569Nicolas Capens return handoffRoutine; 610598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 611598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 612598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens void Nucleus::optimize() 613598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6142ae9d748de3749956aefad727fa9fdab4eb8eef2Nicolas Capens sw::optimize(::function); 615598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 616598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 617598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::allocateStackVariable(Type *t, int arraySize) 618598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 619598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Ice::Type type = T(t); 620a8f9863d6cb76485bdfd44c473f6677804fa7cfeNicolas Capens int typeSize = Ice::typeWidthInBytes(type); 621a8f9863d6cb76485bdfd44c473f6677804fa7cfeNicolas Capens int totalSize = typeSize * (arraySize ? arraySize : 1); 622e12780d57478a3d0e349a29169df73ae4a8ba684Nicolas Capens 623a8f9863d6cb76485bdfd44c473f6677804fa7cfeNicolas Capens auto bytes = Ice::ConstantInteger32::create(::context, type, totalSize); 624e12780d57478a3d0e349a29169df73ae4a8ba684Nicolas Capens auto address = ::function->makeVariable(T(getPointerType(t))); 625a8f9863d6cb76485bdfd44c473f6677804fa7cfeNicolas Capens auto alloca = Ice::InstAlloca::create(::function, address, bytes, typeSize); 626e12780d57478a3d0e349a29169df73ae4a8ba684Nicolas Capens ::function->getEntryNode()->getInsts().push_front(alloca); 627e12780d57478a3d0e349a29169df73ae4a8ba684Nicolas Capens 628e12780d57478a3d0e349a29169df73ae4a8ba684Nicolas Capens return V(address); 629598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 630598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 631598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens BasicBlock *Nucleus::createBasicBlock() 632598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 633611642a2bb8c6922f90217d6296acc8b0ae59f10Nicolas Capens return B(::function->makeNode()); 634598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 635598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 636598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens BasicBlock *Nucleus::getInsertBlock() 637598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 638611642a2bb8c6922f90217d6296acc8b0ae59f10Nicolas Capens return B(::basicBlock); 639598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 640598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 641598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens void Nucleus::setInsertBlock(BasicBlock *basicBlock) 642598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6439ed1a1832df6f0416d4a94446fe8e12b0cde7793Nicolas Capens // assert(::basicBlock->getInsts().back().getTerminatorEdges().size() >= 0 && "Previous basic block must have a terminator"); 644611642a2bb8c6922f90217d6296acc8b0ae59f10Nicolas Capens ::basicBlock = basicBlock; 645598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 646598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 647598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens void Nucleus::createFunction(Type *ReturnType, std::vector<Type*> &Params) 648598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 649598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens uint32_t sequenceNumber = 0; 650598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens ::function = Ice::Cfg::create(::context, sequenceNumber).release(); 651598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens ::allocator = new Ice::CfgLocalAllocatorScope(::function); 652598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 653598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens for(Type *type : Params) 654598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 655598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Ice::Variable *arg = ::function->makeVariable(T(type)); 656598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens ::function->addArg(arg); 657598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 658598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 659598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Ice::CfgNode *node = ::function->makeNode(); 660598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens ::function->setEntryNode(node); 661598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens ::basicBlock = node; 662598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 663598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 664598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::getArgument(unsigned int index) 665598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 666598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return V(::function->getArgs()[index]); 667598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 668598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 669598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens void Nucleus::createRetVoid() 670598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 671fdcca2dc47cab06f4dfe598ffd1c26c98e302e60Nicolas Capens Ice::InstRet *ret = Ice::InstRet::create(::function); 672fdcca2dc47cab06f4dfe598ffd1c26c98e302e60Nicolas Capens ::basicBlock->appendInst(ret); 673598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 674598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 675598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens void Nucleus::createRet(Value *v) 676598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 677fdcca2dc47cab06f4dfe598ffd1c26c98e302e60Nicolas Capens Ice::InstRet *ret = Ice::InstRet::create(::function, v); 678fdcca2dc47cab06f4dfe598ffd1c26c98e302e60Nicolas Capens ::basicBlock->appendInst(ret); 679598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 680598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 681598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens void Nucleus::createBr(BasicBlock *dest) 682598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 683611642a2bb8c6922f90217d6296acc8b0ae59f10Nicolas Capens auto br = Ice::InstBr::create(::function, dest); 684611642a2bb8c6922f90217d6296acc8b0ae59f10Nicolas Capens ::basicBlock->appendInst(br); 685598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 686598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 687598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens void Nucleus::createCondBr(Value *cond, BasicBlock *ifTrue, BasicBlock *ifFalse) 688598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 689611642a2bb8c6922f90217d6296acc8b0ae59f10Nicolas Capens auto br = Ice::InstBr::create(::function, cond, ifTrue, ifFalse); 690611642a2bb8c6922f90217d6296acc8b0ae59f10Nicolas Capens ::basicBlock->appendInst(br); 691598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 692598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 693f8360baf379b430faaeac8ff8bf5091cdabd0b40Nicolas Capens static bool isCommutative(Ice::InstArithmetic::OpKind op) 694f8360baf379b430faaeac8ff8bf5091cdabd0b40Nicolas Capens { 695f8360baf379b430faaeac8ff8bf5091cdabd0b40Nicolas Capens switch(op) 696f8360baf379b430faaeac8ff8bf5091cdabd0b40Nicolas Capens { 697f8360baf379b430faaeac8ff8bf5091cdabd0b40Nicolas Capens case Ice::InstArithmetic::Add: 698f8360baf379b430faaeac8ff8bf5091cdabd0b40Nicolas Capens case Ice::InstArithmetic::Fadd: 699f8360baf379b430faaeac8ff8bf5091cdabd0b40Nicolas Capens case Ice::InstArithmetic::Mul: 700f8360baf379b430faaeac8ff8bf5091cdabd0b40Nicolas Capens case Ice::InstArithmetic::Fmul: 701f8360baf379b430faaeac8ff8bf5091cdabd0b40Nicolas Capens case Ice::InstArithmetic::And: 702f8360baf379b430faaeac8ff8bf5091cdabd0b40Nicolas Capens case Ice::InstArithmetic::Or: 703f8360baf379b430faaeac8ff8bf5091cdabd0b40Nicolas Capens case Ice::InstArithmetic::Xor: 704f8360baf379b430faaeac8ff8bf5091cdabd0b40Nicolas Capens return true; 705f8360baf379b430faaeac8ff8bf5091cdabd0b40Nicolas Capens default: 706f8360baf379b430faaeac8ff8bf5091cdabd0b40Nicolas Capens return false; 707f8360baf379b430faaeac8ff8bf5091cdabd0b40Nicolas Capens } 708f8360baf379b430faaeac8ff8bf5091cdabd0b40Nicolas Capens } 709f8360baf379b430faaeac8ff8bf5091cdabd0b40Nicolas Capens 7107d9f76dc22b8a916bf4f16cbb2a435b2c6c85ebaNicolas Capens static Value *createArithmetic(Ice::InstArithmetic::OpKind op, Value *lhs, Value *rhs) 7117d9f76dc22b8a916bf4f16cbb2a435b2c6c85ebaNicolas Capens { 712b64e0ceb39c57035ecc06d9f8e7c5dd1867442deNicolas Capens assert(lhs->getType() == rhs->getType() || llvm::isa<Ice::Constant>(rhs)); 7137d9f76dc22b8a916bf4f16cbb2a435b2c6c85ebaNicolas Capens 714f8360baf379b430faaeac8ff8bf5091cdabd0b40Nicolas Capens bool swapOperands = llvm::isa<Ice::Constant>(lhs) && isCommutative(op); 715f8360baf379b430faaeac8ff8bf5091cdabd0b40Nicolas Capens 7167d9f76dc22b8a916bf4f16cbb2a435b2c6c85ebaNicolas Capens Ice::Variable *result = ::function->makeVariable(lhs->getType()); 717f8360baf379b430faaeac8ff8bf5091cdabd0b40Nicolas Capens Ice::InstArithmetic *arithmetic = Ice::InstArithmetic::create(::function, op, result, swapOperands ? rhs : lhs, swapOperands ? lhs : rhs); 7187d9f76dc22b8a916bf4f16cbb2a435b2c6c85ebaNicolas Capens ::basicBlock->appendInst(arithmetic); 7197d9f76dc22b8a916bf4f16cbb2a435b2c6c85ebaNicolas Capens 7207d9f76dc22b8a916bf4f16cbb2a435b2c6c85ebaNicolas Capens return V(result); 7217d9f76dc22b8a916bf4f16cbb2a435b2c6c85ebaNicolas Capens } 7227d9f76dc22b8a916bf4f16cbb2a435b2c6c85ebaNicolas Capens 723598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createAdd(Value *lhs, Value *rhs) 724598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 7257d9f76dc22b8a916bf4f16cbb2a435b2c6c85ebaNicolas Capens return createArithmetic(Ice::InstArithmetic::Add, lhs, rhs); 726598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 727598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 728598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createSub(Value *lhs, Value *rhs) 729598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 7307d9f76dc22b8a916bf4f16cbb2a435b2c6c85ebaNicolas Capens return createArithmetic(Ice::InstArithmetic::Sub, lhs, rhs); 731598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 732598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 733598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createMul(Value *lhs, Value *rhs) 734598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 7357d9f76dc22b8a916bf4f16cbb2a435b2c6c85ebaNicolas Capens return createArithmetic(Ice::InstArithmetic::Mul, lhs, rhs); 736598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 737598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 738598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createUDiv(Value *lhs, Value *rhs) 739598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 7407d9f76dc22b8a916bf4f16cbb2a435b2c6c85ebaNicolas Capens return createArithmetic(Ice::InstArithmetic::Udiv, lhs, rhs); 741598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 742598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 743598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createSDiv(Value *lhs, Value *rhs) 744598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 7457d9f76dc22b8a916bf4f16cbb2a435b2c6c85ebaNicolas Capens return createArithmetic(Ice::InstArithmetic::Sdiv, lhs, rhs); 746598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 747598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 748598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createFAdd(Value *lhs, Value *rhs) 749598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 7507d9f76dc22b8a916bf4f16cbb2a435b2c6c85ebaNicolas Capens return createArithmetic(Ice::InstArithmetic::Fadd, lhs, rhs); 751598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 752598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 753598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createFSub(Value *lhs, Value *rhs) 754598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 7557d9f76dc22b8a916bf4f16cbb2a435b2c6c85ebaNicolas Capens return createArithmetic(Ice::InstArithmetic::Fsub, lhs, rhs); 756598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 757598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 758598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createFMul(Value *lhs, Value *rhs) 759598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 7607d9f76dc22b8a916bf4f16cbb2a435b2c6c85ebaNicolas Capens return createArithmetic(Ice::InstArithmetic::Fmul, lhs, rhs); 761598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 762598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 763598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createFDiv(Value *lhs, Value *rhs) 764598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 7657d9f76dc22b8a916bf4f16cbb2a435b2c6c85ebaNicolas Capens return createArithmetic(Ice::InstArithmetic::Fdiv, lhs, rhs); 766598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 767598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 768598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createURem(Value *lhs, Value *rhs) 769598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 7707d9f76dc22b8a916bf4f16cbb2a435b2c6c85ebaNicolas Capens return createArithmetic(Ice::InstArithmetic::Urem, lhs, rhs); 771598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 772598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 773598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createSRem(Value *lhs, Value *rhs) 774598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 7757d9f76dc22b8a916bf4f16cbb2a435b2c6c85ebaNicolas Capens return createArithmetic(Ice::InstArithmetic::Srem, lhs, rhs); 776598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 777598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 778598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createFRem(Value *lhs, Value *rhs) 779598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 7807d9f76dc22b8a916bf4f16cbb2a435b2c6c85ebaNicolas Capens return createArithmetic(Ice::InstArithmetic::Frem, lhs, rhs); 781598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 782598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 783598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createShl(Value *lhs, Value *rhs) 784598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 7857d9f76dc22b8a916bf4f16cbb2a435b2c6c85ebaNicolas Capens return createArithmetic(Ice::InstArithmetic::Shl, lhs, rhs); 786598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 787598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 788598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createLShr(Value *lhs, Value *rhs) 789598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 7907d9f76dc22b8a916bf4f16cbb2a435b2c6c85ebaNicolas Capens return createArithmetic(Ice::InstArithmetic::Lshr, lhs, rhs); 791598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 792598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 793598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createAShr(Value *lhs, Value *rhs) 794598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 7957d9f76dc22b8a916bf4f16cbb2a435b2c6c85ebaNicolas Capens return createArithmetic(Ice::InstArithmetic::Ashr, lhs, rhs); 796598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 797598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 798598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createAnd(Value *lhs, Value *rhs) 799598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 8007d9f76dc22b8a916bf4f16cbb2a435b2c6c85ebaNicolas Capens return createArithmetic(Ice::InstArithmetic::And, lhs, rhs); 801598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 802598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 803598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createOr(Value *lhs, Value *rhs) 804598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 8057d9f76dc22b8a916bf4f16cbb2a435b2c6c85ebaNicolas Capens return createArithmetic(Ice::InstArithmetic::Or, lhs, rhs); 806598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 807598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 808598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createXor(Value *lhs, Value *rhs) 809598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 8107d9f76dc22b8a916bf4f16cbb2a435b2c6c85ebaNicolas Capens return createArithmetic(Ice::InstArithmetic::Xor, lhs, rhs); 811598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 812598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 813598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createNeg(Value *v) 814598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 815c5c0c335f2a2e8add573a3865d5b169b5b092dd8Nicolas Capens return createSub(createNullValue(T(v->getType())), v); 816598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 817598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 818598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createFNeg(Value *v) 819598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 820c5c0c335f2a2e8add573a3865d5b169b5b092dd8Nicolas Capens double c[4] = {-0.0, -0.0, -0.0, -0.0}; 821c5c0c335f2a2e8add573a3865d5b169b5b092dd8Nicolas Capens Value *negativeZero = Ice::isVectorType(v->getType()) ? 822c5c0c335f2a2e8add573a3865d5b169b5b092dd8Nicolas Capens createConstantVector(c, T(v->getType())) : 82315060bb012724757c3944f55da9fd668af78e559Nicolas Capens V(::context->getConstantFloat(-0.0f)); 824c5c0c335f2a2e8add573a3865d5b169b5b092dd8Nicolas Capens 825c5c0c335f2a2e8add573a3865d5b169b5b092dd8Nicolas Capens return createFSub(negativeZero, v); 826598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 827598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 828598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createNot(Value *v) 829598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 830c5c0c335f2a2e8add573a3865d5b169b5b092dd8Nicolas Capens if(Ice::isScalarIntegerType(v->getType())) 831c5c0c335f2a2e8add573a3865d5b169b5b092dd8Nicolas Capens { 83215060bb012724757c3944f55da9fd668af78e559Nicolas Capens return createXor(v, V(::context->getConstantInt(v->getType(), -1))); 833c5c0c335f2a2e8add573a3865d5b169b5b092dd8Nicolas Capens } 834c5c0c335f2a2e8add573a3865d5b169b5b092dd8Nicolas Capens else // Vector 835c5c0c335f2a2e8add573a3865d5b169b5b092dd8Nicolas Capens { 836f34d1ace76a7e384685ebc5395141295cf1c618fNicolas Capens int64_t c[16] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}; 837c5c0c335f2a2e8add573a3865d5b169b5b092dd8Nicolas Capens return createXor(v, createConstantVector(c, T(v->getType()))); 838c5c0c335f2a2e8add573a3865d5b169b5b092dd8Nicolas Capens } 839598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 840598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 841e12780d57478a3d0e349a29169df73ae4a8ba684Nicolas Capens Value *Nucleus::createLoad(Value *ptr, Type *type, bool isVolatile, unsigned int align) 842598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 84323d99a4943f621bd09723c92ed012be233cd966cNicolas Capens int valueType = (int)reinterpret_cast<intptr_t>(type); 84423d99a4943f621bd09723c92ed012be233cd966cNicolas Capens Ice::Variable *result = ::function->makeVariable(T(type)); 84523d99a4943f621bd09723c92ed012be233cd966cNicolas Capens 846f4c4ecabe933ef9495c47c948893fedb4db2e143Nicolas Capens if((valueType & EmulatedBits) && (align != 0)) // Narrow vector not stored on stack. 84723d99a4943f621bd09723c92ed012be233cd966cNicolas Capens { 848070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens if(emulateIntrinsics) 849070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens { 850070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens if(typeSize(type) == 4) 851070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens { 852070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens auto pointer = RValue<Pointer<Byte>>(ptr); 8531894cfa4e5be9a82491805c2e477f16262717e42Nicolas Capens Int x = *Pointer<Int>(pointer); 854070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens 855070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens Int4 vector; 856070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens vector = Insert(vector, x, 0); 857070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens 858070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens auto bitcast = Ice::InstCast::create(::function, Ice::InstCast::Bitcast, result, vector.loadValue()); 859070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens ::basicBlock->appendInst(bitcast); 860070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens } 861070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens else if(typeSize(type) == 8) 862070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens { 863070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens auto pointer = RValue<Pointer<Byte>>(ptr); 8641894cfa4e5be9a82491805c2e477f16262717e42Nicolas Capens Int x = *Pointer<Int>(pointer); 865070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens Int y = *Pointer<Int>(pointer + 4); 866070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens 867070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens Int4 vector; 868070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens vector = Insert(vector, x, 0); 869070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens vector = Insert(vector, y, 1); 870070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens 871070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens auto bitcast = Ice::InstCast::create(::function, Ice::InstCast::Bitcast, result, vector.loadValue()); 872070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens ::basicBlock->appendInst(bitcast); 873070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens } 874070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens else assert(false); 875070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens } 876070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens else 877070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens { 878070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::LoadSubVector, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; 879070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens auto target = ::context->getConstantUndef(Ice::IceType_i32); 880070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens auto load = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic); 881070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens load->addArg(ptr); 882070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens load->addArg(::context->getConstantInt32(typeSize(type))); 883070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens ::basicBlock->appendInst(load); 884070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens } 88523d99a4943f621bd09723c92ed012be233cd966cNicolas Capens } 88623d99a4943f621bd09723c92ed012be233cd966cNicolas Capens else 88723d99a4943f621bd09723c92ed012be233cd966cNicolas Capens { 88823d99a4943f621bd09723c92ed012be233cd966cNicolas Capens auto load = Ice::InstLoad::create(::function, result, ptr, align); 88923d99a4943f621bd09723c92ed012be233cd966cNicolas Capens ::basicBlock->appendInst(load); 89023d99a4943f621bd09723c92ed012be233cd966cNicolas Capens } 89123d99a4943f621bd09723c92ed012be233cd966cNicolas Capens 89223d99a4943f621bd09723c92ed012be233cd966cNicolas Capens return V(result); 893598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 894598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 8956d73871220b21157ce9f91b5d51334b379e27a7eNicolas Capens Value *Nucleus::createStore(Value *value, Value *ptr, Type *type, bool isVolatile, unsigned int align) 896598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 89723d99a4943f621bd09723c92ed012be233cd966cNicolas Capens int valueType = (int)reinterpret_cast<intptr_t>(type); 89823d99a4943f621bd09723c92ed012be233cd966cNicolas Capens 899f4c4ecabe933ef9495c47c948893fedb4db2e143Nicolas Capens if((valueType & EmulatedBits) && (align != 0)) // Narrow vector not stored on stack. 90023d99a4943f621bd09723c92ed012be233cd966cNicolas Capens { 901070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens if(emulateIntrinsics) 902070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens { 903070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens if(typeSize(type) == 4) 904070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens { 905070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens Ice::Variable *vector = ::function->makeVariable(Ice::IceType_v4i32); 906070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens auto bitcast = Ice::InstCast::create(::function, Ice::InstCast::Bitcast, vector, value); 907070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens ::basicBlock->appendInst(bitcast); 908070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens 909070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens RValue<Int4> v(V(vector)); 910070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens 911070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens auto pointer = RValue<Pointer<Byte>>(ptr); 912070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens Int x = Extract(v, 0); 913070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens *Pointer<Int>(pointer) = x; 914070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens } 915070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens else if(typeSize(type) == 8) 916070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens { 917070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens Ice::Variable *vector = ::function->makeVariable(Ice::IceType_v4i32); 918070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens auto bitcast = Ice::InstCast::create(::function, Ice::InstCast::Bitcast, vector, value); 919070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens ::basicBlock->appendInst(bitcast); 920070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens 921070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens RValue<Int4> v(V(vector)); 922070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens 923070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens auto pointer = RValue<Pointer<Byte>>(ptr); 924070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens Int x = Extract(v, 0); 925070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens *Pointer<Int>(pointer) = x; 926070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens Int y = Extract(v, 1); 927070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens *Pointer<Int>(pointer + 4) = y; 928070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens } 929070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens else assert(false); 930070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens } 931070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens else 932070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens { 933070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::StoreSubVector, Ice::Intrinsics::SideEffects_T, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_T}; 934070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens auto target = ::context->getConstantUndef(Ice::IceType_i32); 935070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens auto store = Ice::InstIntrinsicCall::create(::function, 3, nullptr, target, intrinsic); 936070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens store->addArg(value); 937070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens store->addArg(ptr); 938070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens store->addArg(::context->getConstantInt32(typeSize(type))); 939070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens ::basicBlock->appendInst(store); 940070d9f4df1ab67907f83c128fa53ea94be8dfc87Nicolas Capens } 94123d99a4943f621bd09723c92ed012be233cd966cNicolas Capens } 94223d99a4943f621bd09723c92ed012be233cd966cNicolas Capens else 94323d99a4943f621bd09723c92ed012be233cd966cNicolas Capens { 944f4c4ecabe933ef9495c47c948893fedb4db2e143Nicolas Capens assert(value->getType() == T(type)); 94523d99a4943f621bd09723c92ed012be233cd966cNicolas Capens 94623d99a4943f621bd09723c92ed012be233cd966cNicolas Capens auto store = Ice::InstStore::create(::function, value, ptr, align); 94723d99a4943f621bd09723c92ed012be233cd966cNicolas Capens ::basicBlock->appendInst(store); 94823d99a4943f621bd09723c92ed012be233cd966cNicolas Capens } 94923d99a4943f621bd09723c92ed012be233cd966cNicolas Capens 950598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return value; 951598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 952598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 953d294def5b421885b259403efb9b1abddaae3a82cNicolas Capens Value *Nucleus::createGEP(Value *ptr, Type *type, Value *index, bool unsignedIndex) 954598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 9558820f64b43b5b41c15cbebd3bcf2a6078800d8daNicolas Capens assert(index->getType() == Ice::IceType_i32); 9568820f64b43b5b41c15cbebd3bcf2a6078800d8daNicolas Capens 95715060bb012724757c3944f55da9fd668af78e559Nicolas Capens if(auto *constant = llvm::dyn_cast<Ice::ConstantInteger32>(index)) 95815060bb012724757c3944f55da9fd668af78e559Nicolas Capens { 959584088c014dda0148f75922a0a49543b846acbbbNicolas Capens int32_t offset = constant->getValue() * (int)typeSize(type); 96015060bb012724757c3944f55da9fd668af78e559Nicolas Capens 96115060bb012724757c3944f55da9fd668af78e559Nicolas Capens if(offset == 0) 96215060bb012724757c3944f55da9fd668af78e559Nicolas Capens { 96315060bb012724757c3944f55da9fd668af78e559Nicolas Capens return ptr; 96415060bb012724757c3944f55da9fd668af78e559Nicolas Capens } 96515060bb012724757c3944f55da9fd668af78e559Nicolas Capens 96615060bb012724757c3944f55da9fd668af78e559Nicolas Capens return createAdd(ptr, createConstantInt(offset)); 96715060bb012724757c3944f55da9fd668af78e559Nicolas Capens } 96815060bb012724757c3944f55da9fd668af78e559Nicolas Capens 9698820f64b43b5b41c15cbebd3bcf2a6078800d8daNicolas Capens if(!Ice::isByteSizedType(T(type))) 9708820f64b43b5b41c15cbebd3bcf2a6078800d8daNicolas Capens { 971584088c014dda0148f75922a0a49543b846acbbbNicolas Capens index = createMul(index, createConstantInt((int)typeSize(type))); 9728820f64b43b5b41c15cbebd3bcf2a6078800d8daNicolas Capens } 9738820f64b43b5b41c15cbebd3bcf2a6078800d8daNicolas Capens 9748820f64b43b5b41c15cbebd3bcf2a6078800d8daNicolas Capens if(sizeof(void*) == 8) 9758820f64b43b5b41c15cbebd3bcf2a6078800d8daNicolas Capens { 976d294def5b421885b259403efb9b1abddaae3a82cNicolas Capens if(unsignedIndex) 977d294def5b421885b259403efb9b1abddaae3a82cNicolas Capens { 978d294def5b421885b259403efb9b1abddaae3a82cNicolas Capens index = createZExt(index, T(Ice::IceType_i64)); 979d294def5b421885b259403efb9b1abddaae3a82cNicolas Capens } 980d294def5b421885b259403efb9b1abddaae3a82cNicolas Capens else 981d294def5b421885b259403efb9b1abddaae3a82cNicolas Capens { 982d294def5b421885b259403efb9b1abddaae3a82cNicolas Capens index = createSExt(index, T(Ice::IceType_i64)); 983d294def5b421885b259403efb9b1abddaae3a82cNicolas Capens } 9848820f64b43b5b41c15cbebd3bcf2a6078800d8daNicolas Capens } 9858820f64b43b5b41c15cbebd3bcf2a6078800d8daNicolas Capens 9868820f64b43b5b41c15cbebd3bcf2a6078800d8daNicolas Capens return createAdd(ptr, index); 987598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 988598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 989598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createAtomicAdd(Value *ptr, Value *value) 990598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 991598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens assert(false && "UNIMPLEMENTED"); return nullptr; 992598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 993598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 994a0c2fc5023ab82b56499badf01d06b6efa05179cNicolas Capens static Value *createCast(Ice::InstCast::OpKind op, Value *v, Type *destType) 995a0c2fc5023ab82b56499badf01d06b6efa05179cNicolas Capens { 99623d99a4943f621bd09723c92ed012be233cd966cNicolas Capens if(v->getType() == T(destType)) 997a0c2fc5023ab82b56499badf01d06b6efa05179cNicolas Capens { 998a0c2fc5023ab82b56499badf01d06b6efa05179cNicolas Capens return v; 999a0c2fc5023ab82b56499badf01d06b6efa05179cNicolas Capens } 1000a0c2fc5023ab82b56499badf01d06b6efa05179cNicolas Capens 1001a0c2fc5023ab82b56499badf01d06b6efa05179cNicolas Capens Ice::Variable *result = ::function->makeVariable(T(destType)); 1002a0c2fc5023ab82b56499badf01d06b6efa05179cNicolas Capens Ice::InstCast *cast = Ice::InstCast::create(::function, op, result, v); 1003a0c2fc5023ab82b56499badf01d06b6efa05179cNicolas Capens ::basicBlock->appendInst(cast); 1004a0c2fc5023ab82b56499badf01d06b6efa05179cNicolas Capens 1005a0c2fc5023ab82b56499badf01d06b6efa05179cNicolas Capens return V(result); 1006a0c2fc5023ab82b56499badf01d06b6efa05179cNicolas Capens } 1007a0c2fc5023ab82b56499badf01d06b6efa05179cNicolas Capens 1008598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createTrunc(Value *v, Type *destType) 1009598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1010a0c2fc5023ab82b56499badf01d06b6efa05179cNicolas Capens return createCast(Ice::InstCast::Trunc, v, destType); 1011598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1012598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1013598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createZExt(Value *v, Type *destType) 1014598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1015a0c2fc5023ab82b56499badf01d06b6efa05179cNicolas Capens return createCast(Ice::InstCast::Zext, v, destType); 1016598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1017598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1018598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createSExt(Value *v, Type *destType) 1019598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1020a0c2fc5023ab82b56499badf01d06b6efa05179cNicolas Capens return createCast(Ice::InstCast::Sext, v, destType); 1021598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1022598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1023598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createFPToSI(Value *v, Type *destType) 1024598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1025a0c2fc5023ab82b56499badf01d06b6efa05179cNicolas Capens return createCast(Ice::InstCast::Fptosi, v, destType); 1026598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1027598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1028598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createSIToFP(Value *v, Type *destType) 1029598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1030a0c2fc5023ab82b56499badf01d06b6efa05179cNicolas Capens return createCast(Ice::InstCast::Sitofp, v, destType); 1031598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1032598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1033598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createFPTrunc(Value *v, Type *destType) 1034598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1035a0c2fc5023ab82b56499badf01d06b6efa05179cNicolas Capens return createCast(Ice::InstCast::Fptrunc, v, destType); 1036598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1037598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1038598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createFPExt(Value *v, Type *destType) 1039598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1040a0c2fc5023ab82b56499badf01d06b6efa05179cNicolas Capens return createCast(Ice::InstCast::Fpext, v, destType); 1041598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1042598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1043598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createBitCast(Value *v, Type *destType) 1044598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 10452d8c370e1f949b9ddf7249179fa5a6041b4a050dNicolas Capens // Bitcasts must be between types of the same logical size. But with emulated narrow vectors we need 10462d8c370e1f949b9ddf7249179fa5a6041b4a050dNicolas Capens // support for casting between scalars and wide vectors. For platforms where this is not supported, 10472d8c370e1f949b9ddf7249179fa5a6041b4a050dNicolas Capens // emulate them by writing to the stack and reading back as the destination type. 10482d8c370e1f949b9ddf7249179fa5a6041b4a050dNicolas Capens if(emulateMismatchedBitCast) 10492d8c370e1f949b9ddf7249179fa5a6041b4a050dNicolas Capens { 10502d8c370e1f949b9ddf7249179fa5a6041b4a050dNicolas Capens if(!Ice::isVectorType(v->getType()) && Ice::isVectorType(T(destType))) 10512d8c370e1f949b9ddf7249179fa5a6041b4a050dNicolas Capens { 10522d8c370e1f949b9ddf7249179fa5a6041b4a050dNicolas Capens Value *address = allocateStackVariable(destType); 10532d8c370e1f949b9ddf7249179fa5a6041b4a050dNicolas Capens createStore(v, address, T(v->getType())); 10542d8c370e1f949b9ddf7249179fa5a6041b4a050dNicolas Capens return createLoad(address, destType); 10552d8c370e1f949b9ddf7249179fa5a6041b4a050dNicolas Capens } 10562d8c370e1f949b9ddf7249179fa5a6041b4a050dNicolas Capens else if(Ice::isVectorType(v->getType()) && !Ice::isVectorType(T(destType))) 10572d8c370e1f949b9ddf7249179fa5a6041b4a050dNicolas Capens { 10582d8c370e1f949b9ddf7249179fa5a6041b4a050dNicolas Capens Value *address = allocateStackVariable(T(v->getType())); 10592d8c370e1f949b9ddf7249179fa5a6041b4a050dNicolas Capens createStore(v, address, T(v->getType())); 10602d8c370e1f949b9ddf7249179fa5a6041b4a050dNicolas Capens return createLoad(address, destType); 10612d8c370e1f949b9ddf7249179fa5a6041b4a050dNicolas Capens } 10622d8c370e1f949b9ddf7249179fa5a6041b4a050dNicolas Capens } 10632d8c370e1f949b9ddf7249179fa5a6041b4a050dNicolas Capens 1064a0c2fc5023ab82b56499badf01d06b6efa05179cNicolas Capens return createCast(Ice::InstCast::Bitcast, v, destType); 1065598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1066598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 106743dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens static Value *createIntCompare(Ice::InstIcmp::ICond condition, Value *lhs, Value *rhs) 106843dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens { 106943dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens assert(lhs->getType() == rhs->getType()); 107043dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens 107143dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens auto result = ::function->makeVariable(Ice::isScalarIntegerType(lhs->getType()) ? Ice::IceType_i1 : lhs->getType()); 107243dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens auto cmp = Ice::InstIcmp::create(::function, condition, result, lhs, rhs); 107343dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens ::basicBlock->appendInst(cmp); 107443dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens 107543dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens return V(result); 107643dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens } 107743dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens 1078598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createICmpEQ(Value *lhs, Value *rhs) 1079598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 108043dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens return createIntCompare(Ice::InstIcmp::Eq, lhs, rhs); 1081598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1082598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1083598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createICmpNE(Value *lhs, Value *rhs) 1084598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 108543dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens return createIntCompare(Ice::InstIcmp::Ne, lhs, rhs); 1086598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1087598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1088598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createICmpUGT(Value *lhs, Value *rhs) 1089598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 109043dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens return createIntCompare(Ice::InstIcmp::Ugt, lhs, rhs); 1091598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1092598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1093598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createICmpUGE(Value *lhs, Value *rhs) 1094598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 109543dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens return createIntCompare(Ice::InstIcmp::Uge, lhs, rhs); 1096598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1097598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1098598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createICmpULT(Value *lhs, Value *rhs) 1099598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 110043dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens return createIntCompare(Ice::InstIcmp::Ult, lhs, rhs); 1101598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1102598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1103598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createICmpULE(Value *lhs, Value *rhs) 1104598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 110543dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens return createIntCompare(Ice::InstIcmp::Ule, lhs, rhs); 1106598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1107598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1108598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createICmpSGT(Value *lhs, Value *rhs) 1109598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 111043dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens return createIntCompare(Ice::InstIcmp::Sgt, lhs, rhs); 1111598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1112598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1113598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createICmpSGE(Value *lhs, Value *rhs) 1114598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 111543dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens return createIntCompare(Ice::InstIcmp::Sge, lhs, rhs); 1116598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1117598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1118598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createICmpSLT(Value *lhs, Value *rhs) 1119598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 112043dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens return createIntCompare(Ice::InstIcmp::Slt, lhs, rhs); 112143dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens } 112243dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens 112343dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens Value *Nucleus::createICmpSLE(Value *lhs, Value *rhs) 112443dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens { 112543dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens return createIntCompare(Ice::InstIcmp::Sle, lhs, rhs); 112643dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens } 112743dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens 112843dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens static Value *createFloatCompare(Ice::InstFcmp::FCond condition, Value *lhs, Value *rhs) 112943dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens { 1130611642a2bb8c6922f90217d6296acc8b0ae59f10Nicolas Capens assert(lhs->getType() == rhs->getType()); 113143dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens assert(Ice::isScalarFloatingType(lhs->getType()) || lhs->getType() == Ice::IceType_v4f32); 1132611642a2bb8c6922f90217d6296acc8b0ae59f10Nicolas Capens 113343dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens auto result = ::function->makeVariable(Ice::isScalarFloatingType(lhs->getType()) ? Ice::IceType_i1 : Ice::IceType_v4i32); 113443dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens auto cmp = Ice::InstFcmp::create(::function, condition, result, lhs, rhs); 1135611642a2bb8c6922f90217d6296acc8b0ae59f10Nicolas Capens ::basicBlock->appendInst(cmp); 1136611642a2bb8c6922f90217d6296acc8b0ae59f10Nicolas Capens 1137611642a2bb8c6922f90217d6296acc8b0ae59f10Nicolas Capens return V(result); 1138598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1139598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1140598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createFCmpOEQ(Value *lhs, Value *rhs) 1141598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 114243dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens return createFloatCompare(Ice::InstFcmp::Oeq, lhs, rhs); 1143598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1144598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1145598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createFCmpOGT(Value *lhs, Value *rhs) 1146598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 114743dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens return createFloatCompare(Ice::InstFcmp::Ogt, lhs, rhs); 1148598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1149598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1150598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createFCmpOGE(Value *lhs, Value *rhs) 1151598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 115243dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens return createFloatCompare(Ice::InstFcmp::Oge, lhs, rhs); 1153598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1154598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1155598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createFCmpOLT(Value *lhs, Value *rhs) 1156598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 115743dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens return createFloatCompare(Ice::InstFcmp::Olt, lhs, rhs); 1158598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1159598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1160598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createFCmpOLE(Value *lhs, Value *rhs) 1161598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 116243dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens return createFloatCompare(Ice::InstFcmp::Ole, lhs, rhs); 1163598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1164598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1165598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createFCmpONE(Value *lhs, Value *rhs) 1166598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 116743dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens return createFloatCompare(Ice::InstFcmp::One, lhs, rhs); 1168598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1169598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1170598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createFCmpORD(Value *lhs, Value *rhs) 1171598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 117243dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens return createFloatCompare(Ice::InstFcmp::Ord, lhs, rhs); 1173598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1174598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1175598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createFCmpUNO(Value *lhs, Value *rhs) 1176598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 117743dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens return createFloatCompare(Ice::InstFcmp::Uno, lhs, rhs); 1178598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1179598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1180598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createFCmpUEQ(Value *lhs, Value *rhs) 1181598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 118243dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens return createFloatCompare(Ice::InstFcmp::Ueq, lhs, rhs); 1183598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1184598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1185598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createFCmpUGT(Value *lhs, Value *rhs) 1186598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 118743dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens return createFloatCompare(Ice::InstFcmp::Ugt, lhs, rhs); 1188598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1189598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1190598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createFCmpUGE(Value *lhs, Value *rhs) 1191598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 119243dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens return createFloatCompare(Ice::InstFcmp::Uge, lhs, rhs); 1193598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1194598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1195598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createFCmpULT(Value *lhs, Value *rhs) 1196598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 119743dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens return createFloatCompare(Ice::InstFcmp::Ult, lhs, rhs); 1198598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1199598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1200598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createFCmpULE(Value *lhs, Value *rhs) 1201598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 120243dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens return createFloatCompare(Ice::InstFcmp::Ule, lhs, rhs); 1203598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1204598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1205598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createFCmpUNE(Value *lhs, Value *rhs) 1206598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 120743dc629d8270b71db8414e3f7b2f8f90cb36f4f9Nicolas Capens return createFloatCompare(Ice::InstFcmp::Une, lhs, rhs); 1208598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1209598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1210e95d534ac645273b3669ef62046d9aa612468e7eNicolas Capens Value *Nucleus::createExtractElement(Value *vector, Type *type, int index) 1211598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 12129709d4ffa1b82a98036334ad3bed463a8d6aafc6Nicolas Capens auto result = ::function->makeVariable(T(type)); 12139709d4ffa1b82a98036334ad3bed463a8d6aafc6Nicolas Capens auto extract = Ice::InstExtractElement::create(::function, result, vector, ::context->getConstantInt32(index)); 12149709d4ffa1b82a98036334ad3bed463a8d6aafc6Nicolas Capens ::basicBlock->appendInst(extract); 12159709d4ffa1b82a98036334ad3bed463a8d6aafc6Nicolas Capens 12169709d4ffa1b82a98036334ad3bed463a8d6aafc6Nicolas Capens return V(result); 1217598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1218598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1219598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createInsertElement(Value *vector, Value *element, int index) 1220598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 12219709d4ffa1b82a98036334ad3bed463a8d6aafc6Nicolas Capens auto result = ::function->makeVariable(vector->getType()); 12229709d4ffa1b82a98036334ad3bed463a8d6aafc6Nicolas Capens auto insert = Ice::InstInsertElement::create(::function, result, vector, element, ::context->getConstantInt32(index)); 12239709d4ffa1b82a98036334ad3bed463a8d6aafc6Nicolas Capens ::basicBlock->appendInst(insert); 12249709d4ffa1b82a98036334ad3bed463a8d6aafc6Nicolas Capens 12259709d4ffa1b82a98036334ad3bed463a8d6aafc6Nicolas Capens return V(result); 1226598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1227598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1228e89cd5805a9e9578821d9049671f5a345874eca3Nicolas Capens Value *Nucleus::createShuffleVector(Value *V1, Value *V2, const int *select) 1229598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1230619c0ab95c7f58fc2fbc970ba46bc78030259c82Nicolas Capens assert(V1->getType() == V2->getType()); 1231619c0ab95c7f58fc2fbc970ba46bc78030259c82Nicolas Capens 1232619c0ab95c7f58fc2fbc970ba46bc78030259c82Nicolas Capens int size = Ice::typeNumElements(V1->getType()); 1233619c0ab95c7f58fc2fbc970ba46bc78030259c82Nicolas Capens auto result = ::function->makeVariable(V1->getType()); 1234619c0ab95c7f58fc2fbc970ba46bc78030259c82Nicolas Capens auto shuffle = Ice::InstShuffleVector::create(::function, result, V1, V2); 1235619c0ab95c7f58fc2fbc970ba46bc78030259c82Nicolas Capens 1236619c0ab95c7f58fc2fbc970ba46bc78030259c82Nicolas Capens for(int i = 0; i < size; i++) 1237619c0ab95c7f58fc2fbc970ba46bc78030259c82Nicolas Capens { 1238619c0ab95c7f58fc2fbc970ba46bc78030259c82Nicolas Capens shuffle->addIndex(llvm::cast<Ice::ConstantInteger32>(::context->getConstantInt32(select[i]))); 1239619c0ab95c7f58fc2fbc970ba46bc78030259c82Nicolas Capens } 1240619c0ab95c7f58fc2fbc970ba46bc78030259c82Nicolas Capens 1241619c0ab95c7f58fc2fbc970ba46bc78030259c82Nicolas Capens ::basicBlock->appendInst(shuffle); 1242619c0ab95c7f58fc2fbc970ba46bc78030259c82Nicolas Capens 1243619c0ab95c7f58fc2fbc970ba46bc78030259c82Nicolas Capens return V(result); 1244598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1245598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1246598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *Nucleus::createSelect(Value *C, Value *ifTrue, Value *ifFalse) 1247598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 124853a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens assert(ifTrue->getType() == ifFalse->getType()); 124953a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens 125053a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens auto result = ::function->makeVariable(ifTrue->getType()); 125153a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens auto *select = Ice::InstSelect::create(::function, result, C, ifTrue, ifFalse); 125253a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens ::basicBlock->appendInst(select); 125353a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens 125453a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens return V(result); 1255598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1256598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1257b98fe5cd1eaa821083d816cf86a20eefe22f57c7Nicolas Capens SwitchCases *Nucleus::createSwitch(Value *control, BasicBlock *defaultBranch, unsigned numCases) 1258598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1259b98fe5cd1eaa821083d816cf86a20eefe22f57c7Nicolas Capens auto switchInst = Ice::InstSwitch::create(::function, numCases, control, defaultBranch); 1260b98fe5cd1eaa821083d816cf86a20eefe22f57c7Nicolas Capens ::basicBlock->appendInst(switchInst); 1261b98fe5cd1eaa821083d816cf86a20eefe22f57c7Nicolas Capens 1262b98fe5cd1eaa821083d816cf86a20eefe22f57c7Nicolas Capens return reinterpret_cast<SwitchCases*>(switchInst); 1263598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1264598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1265b98fe5cd1eaa821083d816cf86a20eefe22f57c7Nicolas Capens void Nucleus::addSwitchCase(SwitchCases *switchCases, int label, BasicBlock *branch) 1266598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1267b98fe5cd1eaa821083d816cf86a20eefe22f57c7Nicolas Capens switchCases->addBranch(label, label, branch); 1268598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1269598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1270598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens void Nucleus::createUnreachable() 1271598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1272fdcca2dc47cab06f4dfe598ffd1c26c98e302e60Nicolas Capens Ice::InstUnreachable *unreachable = Ice::InstUnreachable::create(::function); 1273fdcca2dc47cab06f4dfe598ffd1c26c98e302e60Nicolas Capens ::basicBlock->appendInst(unreachable); 1274598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1275598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1276e95d534ac645273b3669ef62046d9aa612468e7eNicolas Capens static Value *createSwizzle4(Value *val, unsigned char select) 1277598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1278619c0ab95c7f58fc2fbc970ba46bc78030259c82Nicolas Capens int swizzle[4] = 1279619c0ab95c7f58fc2fbc970ba46bc78030259c82Nicolas Capens { 1280619c0ab95c7f58fc2fbc970ba46bc78030259c82Nicolas Capens (select >> 0) & 0x03, 1281619c0ab95c7f58fc2fbc970ba46bc78030259c82Nicolas Capens (select >> 2) & 0x03, 1282619c0ab95c7f58fc2fbc970ba46bc78030259c82Nicolas Capens (select >> 4) & 0x03, 1283619c0ab95c7f58fc2fbc970ba46bc78030259c82Nicolas Capens (select >> 6) & 0x03, 1284619c0ab95c7f58fc2fbc970ba46bc78030259c82Nicolas Capens }; 12859709d4ffa1b82a98036334ad3bed463a8d6aafc6Nicolas Capens 1286619c0ab95c7f58fc2fbc970ba46bc78030259c82Nicolas Capens return Nucleus::createShuffleVector(val, val, swizzle); 1287598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1288598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1289e95d534ac645273b3669ef62046d9aa612468e7eNicolas Capens static Value *createMask4(Value *lhs, Value *rhs, unsigned char select) 1290598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1291a4c30b054c6a5359483e2fcc9d4d5ed658831a45Nicolas Capens int64_t mask[4] = {0, 0, 0, 0}; 1292a4c30b054c6a5359483e2fcc9d4d5ed658831a45Nicolas Capens 1293a4c30b054c6a5359483e2fcc9d4d5ed658831a45Nicolas Capens mask[(select >> 0) & 0x03] = -1; 1294a4c30b054c6a5359483e2fcc9d4d5ed658831a45Nicolas Capens mask[(select >> 2) & 0x03] = -1; 1295a4c30b054c6a5359483e2fcc9d4d5ed658831a45Nicolas Capens mask[(select >> 4) & 0x03] = -1; 1296a4c30b054c6a5359483e2fcc9d4d5ed658831a45Nicolas Capens mask[(select >> 6) & 0x03] = -1; 1297a4c30b054c6a5359483e2fcc9d4d5ed658831a45Nicolas Capens 1298a4c30b054c6a5359483e2fcc9d4d5ed658831a45Nicolas Capens Value *condition = Nucleus::createConstantVector(mask, T(Ice::IceType_v4i1)); 1299a4c30b054c6a5359483e2fcc9d4d5ed658831a45Nicolas Capens Value *result = Nucleus::createSelect(condition, rhs, lhs); 1300a4c30b054c6a5359483e2fcc9d4d5ed658831a45Nicolas Capens 1301a4c30b054c6a5359483e2fcc9d4d5ed658831a45Nicolas Capens return result; 1302598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1303598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1304598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Type *Nucleus::getPointerType(Type *ElementType) 1305598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1306e12780d57478a3d0e349a29169df73ae4a8ba684Nicolas Capens if(sizeof(void*) == 8) 1307e12780d57478a3d0e349a29169df73ae4a8ba684Nicolas Capens { 1308e12780d57478a3d0e349a29169df73ae4a8ba684Nicolas Capens return T(Ice::IceType_i64); 1309e12780d57478a3d0e349a29169df73ae4a8ba684Nicolas Capens } 1310e12780d57478a3d0e349a29169df73ae4a8ba684Nicolas Capens else 1311e12780d57478a3d0e349a29169df73ae4a8ba684Nicolas Capens { 1312e12780d57478a3d0e349a29169df73ae4a8ba684Nicolas Capens return T(Ice::IceType_i32); 1313e12780d57478a3d0e349a29169df73ae4a8ba684Nicolas Capens } 1314598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1315598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 131613ac2327184133f5a69584ff2d69bc2cdeec1457Nicolas Capens Value *Nucleus::createNullValue(Type *Ty) 1317598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 131873dd7a249d69107af605d7cb7fd94baa9d722795Nicolas Capens if(Ice::isVectorType(T(Ty))) 131973dd7a249d69107af605d7cb7fd94baa9d722795Nicolas Capens { 132030385f0f418b2c366acd7ef9bf6024b41bd4a1e1Nicolas Capens assert(Ice::typeNumElements(T(Ty)) <= 16); 132130385f0f418b2c366acd7ef9bf6024b41bd4a1e1Nicolas Capens int64_t c[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 132273dd7a249d69107af605d7cb7fd94baa9d722795Nicolas Capens return createConstantVector(c, Ty); 132373dd7a249d69107af605d7cb7fd94baa9d722795Nicolas Capens } 132473dd7a249d69107af605d7cb7fd94baa9d722795Nicolas Capens else 132573dd7a249d69107af605d7cb7fd94baa9d722795Nicolas Capens { 132615060bb012724757c3944f55da9fd668af78e559Nicolas Capens return V(::context->getConstantZero(T(Ty))); 132773dd7a249d69107af605d7cb7fd94baa9d722795Nicolas Capens } 1328598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1329598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 133013ac2327184133f5a69584ff2d69bc2cdeec1457Nicolas Capens Value *Nucleus::createConstantLong(int64_t i) 1331598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 133215060bb012724757c3944f55da9fd668af78e559Nicolas Capens return V(::context->getConstantInt64(i)); 1333598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1334598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 133513ac2327184133f5a69584ff2d69bc2cdeec1457Nicolas Capens Value *Nucleus::createConstantInt(int i) 1336598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 133715060bb012724757c3944f55da9fd668af78e559Nicolas Capens return V(::context->getConstantInt32(i)); 1338598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1339598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 134013ac2327184133f5a69584ff2d69bc2cdeec1457Nicolas Capens Value *Nucleus::createConstantInt(unsigned int i) 1341598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 134215060bb012724757c3944f55da9fd668af78e559Nicolas Capens return V(::context->getConstantInt32(i)); 1343598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1344598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 134513ac2327184133f5a69584ff2d69bc2cdeec1457Nicolas Capens Value *Nucleus::createConstantBool(bool b) 1346598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 134715060bb012724757c3944f55da9fd668af78e559Nicolas Capens return V(::context->getConstantInt1(b)); 1348598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1349598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 135013ac2327184133f5a69584ff2d69bc2cdeec1457Nicolas Capens Value *Nucleus::createConstantByte(signed char i) 1351598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 135215060bb012724757c3944f55da9fd668af78e559Nicolas Capens return V(::context->getConstantInt8(i)); 1353598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1354598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 135513ac2327184133f5a69584ff2d69bc2cdeec1457Nicolas Capens Value *Nucleus::createConstantByte(unsigned char i) 1356598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 135715060bb012724757c3944f55da9fd668af78e559Nicolas Capens return V(::context->getConstantInt8(i)); 1358598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1359598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 136013ac2327184133f5a69584ff2d69bc2cdeec1457Nicolas Capens Value *Nucleus::createConstantShort(short i) 1361598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 136215060bb012724757c3944f55da9fd668af78e559Nicolas Capens return V(::context->getConstantInt16(i)); 1363598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1364598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 136513ac2327184133f5a69584ff2d69bc2cdeec1457Nicolas Capens Value *Nucleus::createConstantShort(unsigned short i) 1366598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 136715060bb012724757c3944f55da9fd668af78e559Nicolas Capens return V(::context->getConstantInt16(i)); 1368598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1369598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 137013ac2327184133f5a69584ff2d69bc2cdeec1457Nicolas Capens Value *Nucleus::createConstantFloat(float x) 1371598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 137215060bb012724757c3944f55da9fd668af78e559Nicolas Capens return V(::context->getConstantFloat(x)); 1373598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1374598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 137513ac2327184133f5a69584ff2d69bc2cdeec1457Nicolas Capens Value *Nucleus::createNullPointer(Type *Ty) 1376598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1377a29d653e1378c38f41da3d02234ded50437a548aNicolas Capens return createNullValue(T(sizeof(void*) == 8 ? Ice::IceType_i64 : Ice::IceType_i32)); 1378598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1379598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 13807f3f69cbf6581477e96763a269c7c369df265dfaNicolas Capens Value *Nucleus::createConstantVector(const int64_t *constants, Type *type) 138113ac2327184133f5a69584ff2d69bc2cdeec1457Nicolas Capens { 13828dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens const int vectorSize = 16; 13838dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens assert(Ice::typeWidthInBytes(T(type)) == vectorSize); 13848dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens const int alignment = vectorSize; 13858dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens auto globalPool = ::function->getGlobalPool(); 13868dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens 13877f3f69cbf6581477e96763a269c7c369df265dfaNicolas Capens const int64_t *i = constants; 13887f3f69cbf6581477e96763a269c7c369df265dfaNicolas Capens const double *f = reinterpret_cast<const double*>(constants); 13898dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens Ice::VariableDeclaration::DataInitializer *dataInitializer = nullptr; 13907f3f69cbf6581477e96763a269c7c369df265dfaNicolas Capens 13918dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens switch((int)reinterpret_cast<intptr_t>(type)) 13928dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens { 13938dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens case Ice::IceType_v4i32: 1394a4c30b054c6a5359483e2fcc9d4d5ed658831a45Nicolas Capens case Ice::IceType_v4i1: 13957f3f69cbf6581477e96763a269c7c369df265dfaNicolas Capens { 13967f3f69cbf6581477e96763a269c7c369df265dfaNicolas Capens const int initializer[4] = {(int)i[0], (int)i[1], (int)i[2], (int)i[3]}; 13977f3f69cbf6581477e96763a269c7c369df265dfaNicolas Capens static_assert(sizeof(initializer) == vectorSize, "!"); 13987f3f69cbf6581477e96763a269c7c369df265dfaNicolas Capens dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize); 13997f3f69cbf6581477e96763a269c7c369df265dfaNicolas Capens } 14007f3f69cbf6581477e96763a269c7c369df265dfaNicolas Capens break; 14018dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens case Ice::IceType_v4f32: 14028dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens { 14037f3f69cbf6581477e96763a269c7c369df265dfaNicolas Capens const float initializer[4] = {(float)f[0], (float)f[1], (float)f[2], (float)f[3]}; 14048dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens static_assert(sizeof(initializer) == vectorSize, "!"); 14058dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize); 14068dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens } 14078dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens break; 14088dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens case Ice::IceType_v8i16: 1409a4c30b054c6a5359483e2fcc9d4d5ed658831a45Nicolas Capens case Ice::IceType_v8i1: 14108dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens { 14117f3f69cbf6581477e96763a269c7c369df265dfaNicolas Capens 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]}; 14128dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens static_assert(sizeof(initializer) == vectorSize, "!"); 14138dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize); 14148dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens } 14158dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens break; 14168dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens case Ice::IceType_v16i8: 1417a4c30b054c6a5359483e2fcc9d4d5ed658831a45Nicolas Capens case Ice::IceType_v16i1: 14188dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens { 14197f3f69cbf6581477e96763a269c7c369df265dfaNicolas Capens 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]}; 14208dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens static_assert(sizeof(initializer) == vectorSize, "!"); 14218dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize); 14228dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens } 14238dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens break; 14248dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens case Type_v2i32: 14257f3f69cbf6581477e96763a269c7c369df265dfaNicolas Capens { 14267f3f69cbf6581477e96763a269c7c369df265dfaNicolas Capens const int initializer[4] = {(int)i[0], (int)i[1], (int)i[0], (int)i[1]}; 14277f3f69cbf6581477e96763a269c7c369df265dfaNicolas Capens static_assert(sizeof(initializer) == vectorSize, "!"); 14287f3f69cbf6581477e96763a269c7c369df265dfaNicolas Capens dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize); 14297f3f69cbf6581477e96763a269c7c369df265dfaNicolas Capens } 14307f3f69cbf6581477e96763a269c7c369df265dfaNicolas Capens break; 14314cfd45760c4cc0fb821322a869a2979ca8226843Nicolas Capens case Type_v2f32: 14328dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens { 14337f3f69cbf6581477e96763a269c7c369df265dfaNicolas Capens const float initializer[4] = {(float)f[0], (float)f[1], (float)f[0], (float)f[1]}; 14348dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens static_assert(sizeof(initializer) == vectorSize, "!"); 14358dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize); 14368dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens } 14378dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens break; 14388dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens case Type_v4i16: 14398dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens { 14407f3f69cbf6581477e96763a269c7c369df265dfaNicolas Capens 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]}; 14418dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens static_assert(sizeof(initializer) == vectorSize, "!"); 14428dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize); 14438dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens } 14448dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens break; 14458dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens case Type_v8i8: 14468dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens { 14477f3f69cbf6581477e96763a269c7c369df265dfaNicolas Capens 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]}; 14488dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens static_assert(sizeof(initializer) == vectorSize, "!"); 14498dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize); 14508dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens } 14518dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens break; 14528dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens case Type_v4i8: 14538dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens { 14547f3f69cbf6581477e96763a269c7c369df265dfaNicolas Capens 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]}; 14558dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens static_assert(sizeof(initializer) == vectorSize, "!"); 14568dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens dataInitializer = Ice::VariableDeclaration::DataInitializer::create(globalPool, (const char*)initializer, vectorSize); 14578dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens } 14588dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens break; 14598dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens default: 14608dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens assert(false && "Unknown constant vector type" && type); 14618dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens } 14628dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens 14638dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens auto name = Ice::GlobalString::createWithoutString(::context); 14648dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens auto *variableDeclaration = Ice::VariableDeclaration::create(globalPool); 14658dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens variableDeclaration->setName(name); 14668dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens variableDeclaration->setAlignment(alignment); 14678dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens variableDeclaration->setIsConstant(true); 14688dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens variableDeclaration->addInitializer(dataInitializer); 146987852e1df6414583fa536b569db62e93821f6247Nicolas Capens 14708dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens ::function->addGlobal(variableDeclaration); 14718dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens 14728dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens constexpr int32_t offset = 0; 14738dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens Ice::Operand *ptr = ::context->getConstantSym(offset, name); 14748dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens 14758dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens Ice::Variable *result = ::function->makeVariable(T(type)); 14768dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens auto load = Ice::InstLoad::create(::function, result, ptr, alignment); 14778dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens ::basicBlock->appendInst(load); 14788dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens 14798dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens return V(result); 148013ac2327184133f5a69584ff2d69bc2cdeec1457Nicolas Capens } 148113ac2327184133f5a69584ff2d69bc2cdeec1457Nicolas Capens 148213ac2327184133f5a69584ff2d69bc2cdeec1457Nicolas Capens Value *Nucleus::createConstantVector(const double *constants, Type *type) 1483598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 14848dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens return createConstantVector((const int64_t*)constants, type); 1485598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1486598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1487598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Type *Void::getType() 1488598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1489598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return T(Ice::IceType_void); 1490598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1491598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1492598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Bool::Bool(Argument<Bool> argument) 1493598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1494598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(argument.value); 1495598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1496598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1497598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Bool::Bool(bool x) 1498598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1499598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(Nucleus::createConstantBool(x)); 1500598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1501598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1502598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Bool::Bool(RValue<Bool> rhs) 1503598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1504598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 1505598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1506598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1507598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Bool::Bool(const Bool &rhs) 1508598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1509598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 1510598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 1511598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1512598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1513598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Bool::Bool(const Reference<Bool> &rhs) 1514598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1515598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 1516598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 1517598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1518598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 151996d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Bool> Bool::operator=(RValue<Bool> rhs) 1520598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1521598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 1522598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1523598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return rhs; 1524598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1525598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 152696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Bool> Bool::operator=(const Bool &rhs) 1527598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1528598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 1529598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 1530598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1531598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(value); 1532598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1533598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 153496d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Bool> Bool::operator=(const Reference<Bool> &rhs) 1535598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1536598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 1537598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 1538598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1539598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(value); 1540598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1541598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1542598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator!(RValue<Bool> val) 1543598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1544598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createNot(val.value)); 1545598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1546598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1547598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator&&(RValue<Bool> lhs, RValue<Bool> rhs) 1548598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1549598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createAnd(lhs.value, rhs.value)); 1550598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1551598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1552598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator||(RValue<Bool> lhs, RValue<Bool> rhs) 1553598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1554598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createOr(lhs.value, rhs.value)); 1555598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1556598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1557598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Type *Bool::getType() 1558598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 15594cfd45760c4cc0fb821322a869a2979ca8226843Nicolas Capens return T(Ice::IceType_i1); 1560598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1561598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1562598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Byte::Byte(Argument<Byte> argument) 1563598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1564598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(argument.value); 1565598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1566598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1567598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Byte::Byte(RValue<Int> cast) 1568598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1569598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *integer = Nucleus::createTrunc(cast.value, Byte::getType()); 1570598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1571598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(integer); 1572598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1573598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1574598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Byte::Byte(RValue<UInt> cast) 1575598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1576598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *integer = Nucleus::createTrunc(cast.value, Byte::getType()); 1577598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1578598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(integer); 1579598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1580598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1581598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Byte::Byte(RValue<UShort> cast) 1582598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1583598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *integer = Nucleus::createTrunc(cast.value, Byte::getType()); 1584598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1585598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(integer); 1586598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1587598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1588598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Byte::Byte(int x) 1589598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1590598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(Nucleus::createConstantByte((unsigned char)x)); 1591598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1592598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1593598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Byte::Byte(unsigned char x) 1594598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1595598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(Nucleus::createConstantByte(x)); 1596598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1597598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1598598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Byte::Byte(RValue<Byte> rhs) 1599598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1600598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 1601598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1602598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1603598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Byte::Byte(const Byte &rhs) 1604598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1605598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 1606598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 1607598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1608598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1609598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Byte::Byte(const Reference<Byte> &rhs) 1610598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1611598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 1612598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 1613598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1614598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 161596d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Byte> Byte::operator=(RValue<Byte> rhs) 1616598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1617598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 1618598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1619598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return rhs; 1620598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1621598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 162296d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Byte> Byte::operator=(const Byte &rhs) 1623598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1624598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 1625598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 1626598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1627598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Byte>(value); 1628598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1629598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 163096d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Byte> Byte::operator=(const Reference<Byte> &rhs) 1631598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1632598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 1633598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 1634598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1635598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Byte>(value); 1636598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1637598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1638598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Byte> operator+(RValue<Byte> lhs, RValue<Byte> rhs) 1639598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1640598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Byte>(Nucleus::createAdd(lhs.value, rhs.value)); 1641598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1642598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1643598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Byte> operator-(RValue<Byte> lhs, RValue<Byte> rhs) 1644598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1645598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Byte>(Nucleus::createSub(lhs.value, rhs.value)); 1646598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1647598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1648598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Byte> operator*(RValue<Byte> lhs, RValue<Byte> rhs) 1649598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1650598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Byte>(Nucleus::createMul(lhs.value, rhs.value)); 1651598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1652598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1653598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Byte> operator/(RValue<Byte> lhs, RValue<Byte> rhs) 1654598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1655598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Byte>(Nucleus::createUDiv(lhs.value, rhs.value)); 1656598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1657598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1658598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Byte> operator%(RValue<Byte> lhs, RValue<Byte> rhs) 1659598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1660598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Byte>(Nucleus::createURem(lhs.value, rhs.value)); 1661598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1662598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1663598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Byte> operator&(RValue<Byte> lhs, RValue<Byte> rhs) 1664598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1665598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Byte>(Nucleus::createAnd(lhs.value, rhs.value)); 1666598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1667598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1668598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Byte> operator|(RValue<Byte> lhs, RValue<Byte> rhs) 1669598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1670598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Byte>(Nucleus::createOr(lhs.value, rhs.value)); 1671598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1672598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1673598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Byte> operator^(RValue<Byte> lhs, RValue<Byte> rhs) 1674598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1675598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Byte>(Nucleus::createXor(lhs.value, rhs.value)); 1676598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1677598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1678598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Byte> operator<<(RValue<Byte> lhs, RValue<Byte> rhs) 1679598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1680598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Byte>(Nucleus::createShl(lhs.value, rhs.value)); 1681598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1682598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1683598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Byte> operator>>(RValue<Byte> lhs, RValue<Byte> rhs) 1684598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1685598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Byte>(Nucleus::createLShr(lhs.value, rhs.value)); 1686598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1687598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 168896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Byte> operator+=(Byte &lhs, RValue<Byte> rhs) 1689598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1690598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs + rhs; 1691598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1692598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 169396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Byte> operator-=(Byte &lhs, RValue<Byte> rhs) 1694598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1695598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs - rhs; 1696598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1697598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 169896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Byte> operator*=(Byte &lhs, RValue<Byte> rhs) 1699598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1700598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs * rhs; 1701598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1702598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 170396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Byte> operator/=(Byte &lhs, RValue<Byte> rhs) 1704598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1705598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs / rhs; 1706598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1707598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 170896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Byte> operator%=(Byte &lhs, RValue<Byte> rhs) 1709598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1710598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs % rhs; 1711598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1712598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 171396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Byte> operator&=(Byte &lhs, RValue<Byte> rhs) 1714598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1715598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs & rhs; 1716598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1717598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 171896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Byte> operator|=(Byte &lhs, RValue<Byte> rhs) 1719598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1720598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs | rhs; 1721598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1722598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 172396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Byte> operator^=(Byte &lhs, RValue<Byte> rhs) 1724598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1725598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs ^ rhs; 1726598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1727598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 172896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Byte> operator<<=(Byte &lhs, RValue<Byte> rhs) 1729598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1730598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs << rhs; 1731598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1732598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 173396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Byte> operator>>=(Byte &lhs, RValue<Byte> rhs) 1734598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1735598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs >> rhs; 1736598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1737598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1738598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Byte> operator+(RValue<Byte> val) 1739598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1740598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return val; 1741598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1742598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1743598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Byte> operator-(RValue<Byte> val) 1744598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1745598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Byte>(Nucleus::createNeg(val.value)); 1746598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1747598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1748598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Byte> operator~(RValue<Byte> val) 1749598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1750598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Byte>(Nucleus::createNot(val.value)); 1751598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1752598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 175396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Byte> operator++(Byte &val, int) // Post-increment 1754598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1755598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Byte> res = val; 1756d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens val += Byte(1); 1757598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return res; 1758598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1759598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 176096d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens const Byte &operator++(Byte &val) // Pre-increment 1761598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1762d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens val += Byte(1); 1763598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return val; 1764598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1765598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 176696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Byte> operator--(Byte &val, int) // Post-decrement 1767598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1768598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Byte> res = val; 1769d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens val -= Byte(1); 1770598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return res; 1771598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1772598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 177396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens const Byte &operator--(Byte &val) // Pre-decrement 1774598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1775d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens val -= Byte(1); 1776598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return val; 1777598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1778598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1779598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator<(RValue<Byte> lhs, RValue<Byte> rhs) 1780598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1781598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpULT(lhs.value, rhs.value)); 1782598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1783598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1784598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator<=(RValue<Byte> lhs, RValue<Byte> rhs) 1785598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1786598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpULE(lhs.value, rhs.value)); 1787598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1788598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1789598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator>(RValue<Byte> lhs, RValue<Byte> rhs) 1790598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1791598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpUGT(lhs.value, rhs.value)); 1792598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1793598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1794598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator>=(RValue<Byte> lhs, RValue<Byte> rhs) 1795598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1796598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpUGE(lhs.value, rhs.value)); 1797598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1798598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1799598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator!=(RValue<Byte> lhs, RValue<Byte> rhs) 1800598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1801598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value)); 1802598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1803598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1804598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator==(RValue<Byte> lhs, RValue<Byte> rhs) 1805598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1806598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value)); 1807598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1808598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1809598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Type *Byte::getType() 1810598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 18116d73871220b21157ce9f91b5d51334b379e27a7eNicolas Capens return T(Ice::IceType_i8); 1812598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1813598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1814598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens SByte::SByte(Argument<SByte> argument) 1815598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1816598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(argument.value); 1817598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1818598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1819598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens SByte::SByte(RValue<Int> cast) 1820598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1821598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *integer = Nucleus::createTrunc(cast.value, SByte::getType()); 1822598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1823598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(integer); 1824598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1825598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1826598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens SByte::SByte(RValue<Short> cast) 1827598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1828598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *integer = Nucleus::createTrunc(cast.value, SByte::getType()); 1829598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1830598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(integer); 1831598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1832598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1833598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens SByte::SByte(signed char x) 1834598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1835598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(Nucleus::createConstantByte(x)); 1836598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1837598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1838598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens SByte::SByte(RValue<SByte> rhs) 1839598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1840598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 1841598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1842598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1843598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens SByte::SByte(const SByte &rhs) 1844598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1845598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 1846598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 1847598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1848598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1849598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens SByte::SByte(const Reference<SByte> &rhs) 1850598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1851598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 1852598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 1853598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1854598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 185596d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<SByte> SByte::operator=(RValue<SByte> rhs) 1856598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1857598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 1858598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1859598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return rhs; 1860598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1861598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 186296d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<SByte> SByte::operator=(const SByte &rhs) 1863598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1864598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 1865598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 1866598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1867598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<SByte>(value); 1868598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1869598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 187096d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<SByte> SByte::operator=(const Reference<SByte> &rhs) 1871598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1872598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 1873598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 1874598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1875598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<SByte>(value); 1876598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1877598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1878598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<SByte> operator+(RValue<SByte> lhs, RValue<SByte> rhs) 1879598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1880598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<SByte>(Nucleus::createAdd(lhs.value, rhs.value)); 1881598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1882598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1883598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<SByte> operator-(RValue<SByte> lhs, RValue<SByte> rhs) 1884598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1885598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<SByte>(Nucleus::createSub(lhs.value, rhs.value)); 1886598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1887598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1888598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<SByte> operator*(RValue<SByte> lhs, RValue<SByte> rhs) 1889598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1890598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<SByte>(Nucleus::createMul(lhs.value, rhs.value)); 1891598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1892598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1893598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<SByte> operator/(RValue<SByte> lhs, RValue<SByte> rhs) 1894598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1895598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<SByte>(Nucleus::createSDiv(lhs.value, rhs.value)); 1896598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1897598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1898598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<SByte> operator%(RValue<SByte> lhs, RValue<SByte> rhs) 1899598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1900598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<SByte>(Nucleus::createSRem(lhs.value, rhs.value)); 1901598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1902598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1903598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<SByte> operator&(RValue<SByte> lhs, RValue<SByte> rhs) 1904598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1905598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<SByte>(Nucleus::createAnd(lhs.value, rhs.value)); 1906598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1907598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1908598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<SByte> operator|(RValue<SByte> lhs, RValue<SByte> rhs) 1909598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1910598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<SByte>(Nucleus::createOr(lhs.value, rhs.value)); 1911598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1912598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1913598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<SByte> operator^(RValue<SByte> lhs, RValue<SByte> rhs) 1914598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1915598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<SByte>(Nucleus::createXor(lhs.value, rhs.value)); 1916598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1917598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1918598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<SByte> operator<<(RValue<SByte> lhs, RValue<SByte> rhs) 1919598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1920598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<SByte>(Nucleus::createShl(lhs.value, rhs.value)); 1921598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1922598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1923598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<SByte> operator>>(RValue<SByte> lhs, RValue<SByte> rhs) 1924598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1925598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<SByte>(Nucleus::createAShr(lhs.value, rhs.value)); 1926598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1927598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 192896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<SByte> operator+=(SByte &lhs, RValue<SByte> rhs) 1929598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1930598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs + rhs; 1931598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1932598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 193396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<SByte> operator-=(SByte &lhs, RValue<SByte> rhs) 1934598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1935598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs - rhs; 1936598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1937598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 193896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<SByte> operator*=(SByte &lhs, RValue<SByte> rhs) 1939598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1940598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs * rhs; 1941598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1942598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 194396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<SByte> operator/=(SByte &lhs, RValue<SByte> rhs) 1944598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1945598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs / rhs; 1946598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1947598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 194896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<SByte> operator%=(SByte &lhs, RValue<SByte> rhs) 1949598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1950598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs % rhs; 1951598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1952598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 195396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<SByte> operator&=(SByte &lhs, RValue<SByte> rhs) 1954598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1955598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs & rhs; 1956598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1957598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 195896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<SByte> operator|=(SByte &lhs, RValue<SByte> rhs) 1959598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1960598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs | rhs; 1961598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1962598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 196396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<SByte> operator^=(SByte &lhs, RValue<SByte> rhs) 1964598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1965598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs ^ rhs; 1966598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1967598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 196896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<SByte> operator<<=(SByte &lhs, RValue<SByte> rhs) 1969598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1970598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs << rhs; 1971598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1972598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 197396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<SByte> operator>>=(SByte &lhs, RValue<SByte> rhs) 1974598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1975598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs >> rhs; 1976598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1977598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1978598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<SByte> operator+(RValue<SByte> val) 1979598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1980598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return val; 1981598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1982598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1983598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<SByte> operator-(RValue<SByte> val) 1984598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1985598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<SByte>(Nucleus::createNeg(val.value)); 1986598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1987598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 1988598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<SByte> operator~(RValue<SByte> val) 1989598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1990598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<SByte>(Nucleus::createNot(val.value)); 1991598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1992598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 199396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<SByte> operator++(SByte &val, int) // Post-increment 1994598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 1995598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<SByte> res = val; 1996d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens val += SByte(1); 1997598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return res; 1998598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 1999598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 200096d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens const SByte &operator++(SByte &val) // Pre-increment 2001598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2002d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens val += SByte(1); 2003598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return val; 2004598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2005598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 200696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<SByte> operator--(SByte &val, int) // Post-decrement 2007598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2008598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<SByte> res = val; 2009d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens val -= SByte(1); 2010598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return res; 2011598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2012598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 201396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens const SByte &operator--(SByte &val) // Pre-decrement 2014598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2015d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens val -= SByte(1); 2016598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return val; 2017598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2018598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2019598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator<(RValue<SByte> lhs, RValue<SByte> rhs) 2020598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2021598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpSLT(lhs.value, rhs.value)); 2022598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2023598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2024598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator<=(RValue<SByte> lhs, RValue<SByte> rhs) 2025598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2026598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpSLE(lhs.value, rhs.value)); 2027598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2028598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2029598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator>(RValue<SByte> lhs, RValue<SByte> rhs) 2030598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2031598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpSGT(lhs.value, rhs.value)); 2032598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2033598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2034598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator>=(RValue<SByte> lhs, RValue<SByte> rhs) 2035598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2036598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpSGE(lhs.value, rhs.value)); 2037598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2038598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2039598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator!=(RValue<SByte> lhs, RValue<SByte> rhs) 2040598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2041598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value)); 2042598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2043598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2044598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator==(RValue<SByte> lhs, RValue<SByte> rhs) 2045598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2046598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value)); 2047598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2048598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2049598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Type *SByte::getType() 2050598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 20514cfd45760c4cc0fb821322a869a2979ca8226843Nicolas Capens return T(Ice::IceType_i8); 2052598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2053598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2054598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Short::Short(Argument<Short> argument) 2055598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2056598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(argument.value); 2057598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2058598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2059598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Short::Short(RValue<Int> cast) 2060598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2061598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *integer = Nucleus::createTrunc(cast.value, Short::getType()); 2062598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2063598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(integer); 2064598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2065598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2066598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Short::Short(short x) 2067598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2068598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(Nucleus::createConstantShort(x)); 2069598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2070598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2071598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Short::Short(RValue<Short> rhs) 2072598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2073598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 2074598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2075598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2076598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Short::Short(const Short &rhs) 2077598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2078598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 2079598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 2080598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2081598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2082598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Short::Short(const Reference<Short> &rhs) 2083598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2084598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 2085598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 2086598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2087598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 208896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Short> Short::operator=(RValue<Short> rhs) 2089598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2090598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 2091598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2092598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return rhs; 2093598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2094598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 209596d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Short> Short::operator=(const Short &rhs) 2096598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2097598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 2098598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 2099598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2100598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Short>(value); 2101598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2102598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 210396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Short> Short::operator=(const Reference<Short> &rhs) 2104598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2105598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 2106598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 2107598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2108598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Short>(value); 2109598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2110598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2111598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short> operator+(RValue<Short> lhs, RValue<Short> rhs) 2112598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2113598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Short>(Nucleus::createAdd(lhs.value, rhs.value)); 2114598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2115598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2116598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short> operator-(RValue<Short> lhs, RValue<Short> rhs) 2117598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2118598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Short>(Nucleus::createSub(lhs.value, rhs.value)); 2119598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2120598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2121598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short> operator*(RValue<Short> lhs, RValue<Short> rhs) 2122598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2123598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Short>(Nucleus::createMul(lhs.value, rhs.value)); 2124598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2125598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2126598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short> operator/(RValue<Short> lhs, RValue<Short> rhs) 2127598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2128598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Short>(Nucleus::createSDiv(lhs.value, rhs.value)); 2129598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2130598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2131598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short> operator%(RValue<Short> lhs, RValue<Short> rhs) 2132598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2133598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Short>(Nucleus::createSRem(lhs.value, rhs.value)); 2134598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2135598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2136598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short> operator&(RValue<Short> lhs, RValue<Short> rhs) 2137598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2138598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Short>(Nucleus::createAnd(lhs.value, rhs.value)); 2139598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2140598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2141598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short> operator|(RValue<Short> lhs, RValue<Short> rhs) 2142598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2143598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Short>(Nucleus::createOr(lhs.value, rhs.value)); 2144598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2145598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2146598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short> operator^(RValue<Short> lhs, RValue<Short> rhs) 2147598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2148598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Short>(Nucleus::createXor(lhs.value, rhs.value)); 2149598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2150598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2151598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short> operator<<(RValue<Short> lhs, RValue<Short> rhs) 2152598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2153598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Short>(Nucleus::createShl(lhs.value, rhs.value)); 2154598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2155598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2156598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short> operator>>(RValue<Short> lhs, RValue<Short> rhs) 2157598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2158598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Short>(Nucleus::createAShr(lhs.value, rhs.value)); 2159598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2160598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 216196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Short> operator+=(Short &lhs, RValue<Short> rhs) 2162598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2163598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs + rhs; 2164598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2165598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 216696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Short> operator-=(Short &lhs, RValue<Short> rhs) 2167598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2168598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs - rhs; 2169598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2170598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 217196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Short> operator*=(Short &lhs, RValue<Short> rhs) 2172598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2173598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs * rhs; 2174598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2175598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 217696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Short> operator/=(Short &lhs, RValue<Short> rhs) 2177598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2178598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs / rhs; 2179598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2180598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 218196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Short> operator%=(Short &lhs, RValue<Short> rhs) 2182598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2183598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs % rhs; 2184598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2185598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 218696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Short> operator&=(Short &lhs, RValue<Short> rhs) 2187598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2188598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs & rhs; 2189598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2190598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 219196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Short> operator|=(Short &lhs, RValue<Short> rhs) 2192598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2193598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs | rhs; 2194598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2195598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 219696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Short> operator^=(Short &lhs, RValue<Short> rhs) 2197598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2198598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs ^ rhs; 2199598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2200598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 220196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Short> operator<<=(Short &lhs, RValue<Short> rhs) 2202598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2203598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs << rhs; 2204598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2205598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 220696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Short> operator>>=(Short &lhs, RValue<Short> rhs) 2207598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2208598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs >> rhs; 2209598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2210598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2211598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short> operator+(RValue<Short> val) 2212598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2213598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return val; 2214598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2215598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2216598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short> operator-(RValue<Short> val) 2217598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2218598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Short>(Nucleus::createNeg(val.value)); 2219598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2220598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2221598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short> operator~(RValue<Short> val) 2222598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2223598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Short>(Nucleus::createNot(val.value)); 2224598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2225598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 222696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Short> operator++(Short &val, int) // Post-increment 2227598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2228598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short> res = val; 2229d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens val += Short(1); 2230598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return res; 2231598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2232598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 223396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens const Short &operator++(Short &val) // Pre-increment 2234598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2235d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens val += Short(1); 2236598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return val; 2237598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2238598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 223996d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Short> operator--(Short &val, int) // Post-decrement 2240598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2241598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short> res = val; 2242d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens val -= Short(1); 2243598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return res; 2244598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2245598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 224696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens const Short &operator--(Short &val) // Pre-decrement 2247598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2248d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens val -= Short(1); 2249598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return val; 2250598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2251598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2252598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator<(RValue<Short> lhs, RValue<Short> rhs) 2253598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2254598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpSLT(lhs.value, rhs.value)); 2255598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2256598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2257598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator<=(RValue<Short> lhs, RValue<Short> rhs) 2258598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2259598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpSLE(lhs.value, rhs.value)); 2260598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2261598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2262598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator>(RValue<Short> lhs, RValue<Short> rhs) 2263598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2264598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpSGT(lhs.value, rhs.value)); 2265598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2266598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2267598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator>=(RValue<Short> lhs, RValue<Short> rhs) 2268598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2269598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpSGE(lhs.value, rhs.value)); 2270598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2271598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2272598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator!=(RValue<Short> lhs, RValue<Short> rhs) 2273598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2274598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value)); 2275598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2276598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2277598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator==(RValue<Short> lhs, RValue<Short> rhs) 2278598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2279598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value)); 2280598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2281598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2282598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Type *Short::getType() 2283598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 22844cfd45760c4cc0fb821322a869a2979ca8226843Nicolas Capens return T(Ice::IceType_i16); 2285598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2286598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2287598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UShort::UShort(Argument<UShort> argument) 2288598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2289598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(argument.value); 2290598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2291598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2292598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UShort::UShort(RValue<UInt> cast) 2293598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2294598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *integer = Nucleus::createTrunc(cast.value, UShort::getType()); 2295598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2296598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(integer); 2297598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2298598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2299598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UShort::UShort(RValue<Int> cast) 2300598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2301598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *integer = Nucleus::createTrunc(cast.value, UShort::getType()); 2302598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2303598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(integer); 2304598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2305598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2306598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UShort::UShort(unsigned short x) 2307598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2308598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(Nucleus::createConstantShort(x)); 2309598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2310598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2311598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UShort::UShort(RValue<UShort> rhs) 2312598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2313598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 2314598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2315598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2316598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UShort::UShort(const UShort &rhs) 2317598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2318598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 2319598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 2320598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2321598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2322598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UShort::UShort(const Reference<UShort> &rhs) 2323598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2324598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 2325598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 2326598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2327598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 232896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UShort> UShort::operator=(RValue<UShort> rhs) 2329598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2330598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 2331598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2332598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return rhs; 2333598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2334598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 233596d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UShort> UShort::operator=(const UShort &rhs) 2336598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2337598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 2338598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 2339598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2340598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UShort>(value); 2341598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2342598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 234396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UShort> UShort::operator=(const Reference<UShort> &rhs) 2344598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2345598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 2346598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 2347598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2348598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UShort>(value); 2349598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2350598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2351598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort> operator+(RValue<UShort> lhs, RValue<UShort> rhs) 2352598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2353598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UShort>(Nucleus::createAdd(lhs.value, rhs.value)); 2354598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2355598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2356598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort> operator-(RValue<UShort> lhs, RValue<UShort> rhs) 2357598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2358598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UShort>(Nucleus::createSub(lhs.value, rhs.value)); 2359598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2360598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2361598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort> operator*(RValue<UShort> lhs, RValue<UShort> rhs) 2362598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2363598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UShort>(Nucleus::createMul(lhs.value, rhs.value)); 2364598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2365598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2366598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort> operator/(RValue<UShort> lhs, RValue<UShort> rhs) 2367598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2368598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UShort>(Nucleus::createUDiv(lhs.value, rhs.value)); 2369598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2370598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2371598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort> operator%(RValue<UShort> lhs, RValue<UShort> rhs) 2372598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2373598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UShort>(Nucleus::createURem(lhs.value, rhs.value)); 2374598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2375598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2376598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort> operator&(RValue<UShort> lhs, RValue<UShort> rhs) 2377598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2378598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UShort>(Nucleus::createAnd(lhs.value, rhs.value)); 2379598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2380598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2381598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort> operator|(RValue<UShort> lhs, RValue<UShort> rhs) 2382598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2383598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UShort>(Nucleus::createOr(lhs.value, rhs.value)); 2384598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2385598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2386598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort> operator^(RValue<UShort> lhs, RValue<UShort> rhs) 2387598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2388598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UShort>(Nucleus::createXor(lhs.value, rhs.value)); 2389598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2390598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2391598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort> operator<<(RValue<UShort> lhs, RValue<UShort> rhs) 2392598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2393598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UShort>(Nucleus::createShl(lhs.value, rhs.value)); 2394598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2395598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2396598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort> operator>>(RValue<UShort> lhs, RValue<UShort> rhs) 2397598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2398598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UShort>(Nucleus::createLShr(lhs.value, rhs.value)); 2399598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2400598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 240196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UShort> operator+=(UShort &lhs, RValue<UShort> rhs) 2402598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2403598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs + rhs; 2404598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2405598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 240696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UShort> operator-=(UShort &lhs, RValue<UShort> rhs) 2407598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2408598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs - rhs; 2409598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2410598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 241196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UShort> operator*=(UShort &lhs, RValue<UShort> rhs) 2412598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2413598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs * rhs; 2414598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2415598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 241696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UShort> operator/=(UShort &lhs, RValue<UShort> rhs) 2417598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2418598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs / rhs; 2419598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2420598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 242196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UShort> operator%=(UShort &lhs, RValue<UShort> rhs) 2422598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2423598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs % rhs; 2424598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2425598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 242696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UShort> operator&=(UShort &lhs, RValue<UShort> rhs) 2427598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2428598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs & rhs; 2429598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2430598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 243196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UShort> operator|=(UShort &lhs, RValue<UShort> rhs) 2432598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2433598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs | rhs; 2434598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2435598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 243696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UShort> operator^=(UShort &lhs, RValue<UShort> rhs) 2437598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2438598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs ^ rhs; 2439598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2440598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 244196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UShort> operator<<=(UShort &lhs, RValue<UShort> rhs) 2442598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2443598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs << rhs; 2444598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2445598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 244696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UShort> operator>>=(UShort &lhs, RValue<UShort> rhs) 2447598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2448598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs >> rhs; 2449598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2450598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2451598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort> operator+(RValue<UShort> val) 2452598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2453598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return val; 2454598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2455598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2456598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort> operator-(RValue<UShort> val) 2457598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2458598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UShort>(Nucleus::createNeg(val.value)); 2459598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2460598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2461598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort> operator~(RValue<UShort> val) 2462598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2463598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UShort>(Nucleus::createNot(val.value)); 2464598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2465598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 246696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UShort> operator++(UShort &val, int) // Post-increment 2467598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2468598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort> res = val; 2469d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens val += UShort(1); 2470598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return res; 2471598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2472598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 247396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens const UShort &operator++(UShort &val) // Pre-increment 2474598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2475d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens val += UShort(1); 2476598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return val; 2477598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2478598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 247996d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UShort> operator--(UShort &val, int) // Post-decrement 2480598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2481598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort> res = val; 2482d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens val -= UShort(1); 2483598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return res; 2484598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2485598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 248696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens const UShort &operator--(UShort &val) // Pre-decrement 2487598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2488d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens val -= UShort(1); 2489598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return val; 2490598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2491598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2492598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator<(RValue<UShort> lhs, RValue<UShort> rhs) 2493598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2494598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpULT(lhs.value, rhs.value)); 2495598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2496598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2497598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator<=(RValue<UShort> lhs, RValue<UShort> rhs) 2498598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2499598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpULE(lhs.value, rhs.value)); 2500598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2501598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2502598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator>(RValue<UShort> lhs, RValue<UShort> rhs) 2503598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2504598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpUGT(lhs.value, rhs.value)); 2505598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2506598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2507598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator>=(RValue<UShort> lhs, RValue<UShort> rhs) 2508598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2509598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpUGE(lhs.value, rhs.value)); 2510598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2511598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2512598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator!=(RValue<UShort> lhs, RValue<UShort> rhs) 2513598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2514598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value)); 2515598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2516598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2517598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator==(RValue<UShort> lhs, RValue<UShort> rhs) 2518598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2519598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value)); 2520598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2521598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2522598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Type *UShort::getType() 2523598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 25244cfd45760c4cc0fb821322a869a2979ca8226843Nicolas Capens return T(Ice::IceType_i16); 2525598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2526598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 252716b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens Byte4::Byte4(RValue<Byte8> cast) 252816b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens { 252916b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens storeValue(Nucleus::createBitCast(cast.value, getType())); 253016b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens } 253116b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens 253216b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens Byte4::Byte4(const Reference<Byte4> &rhs) 253316b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens { 2534d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens Value *value = rhs.loadValue(); 2535d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens storeValue(value); 253616b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens } 253716b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens 2538598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Type *Byte4::getType() 2539598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 254023d99a4943f621bd09723c92ed012be233cd966cNicolas Capens return T(Type_v4i8); 2541598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2542598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2543598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Type *SByte4::getType() 2544598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 25454cfd45760c4cc0fb821322a869a2979ca8226843Nicolas Capens return T(Type_v4i8); 2546598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2547598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2548598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 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) 2549598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 25508dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens int64_t constantVector[8] = {x0, x1, x2, x3, x4, x5, x6, x7}; 25518dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens storeValue(Nucleus::createConstantVector(constantVector, getType())); 2552598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2553598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2554598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Byte8::Byte8(RValue<Byte8> rhs) 2555598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2556598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 2557598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2558598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2559598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Byte8::Byte8(const Byte8 &rhs) 2560598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2561598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 2562598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 2563598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2564598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2565598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Byte8::Byte8(const Reference<Byte8> &rhs) 2566598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2567598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 2568598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 2569598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2570598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 257196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Byte8> Byte8::operator=(RValue<Byte8> rhs) 2572598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2573598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 2574598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2575598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return rhs; 2576598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2577598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 257896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Byte8> Byte8::operator=(const Byte8 &rhs) 2579598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2580598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 2581598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 2582598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2583598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Byte8>(value); 2584598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2585598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 258696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Byte8> Byte8::operator=(const Reference<Byte8> &rhs) 2587598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2588598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 2589598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 2590598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2591598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Byte8>(value); 2592598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2593598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2594598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Byte8> operator+(RValue<Byte8> lhs, RValue<Byte8> rhs) 2595598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2596c4c431d6f52859c2e20e42cc08ac51e060261a63Nicolas Capens return RValue<Byte8>(Nucleus::createAdd(lhs.value, rhs.value)); 2597598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2598598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2599598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Byte8> operator-(RValue<Byte8> lhs, RValue<Byte8> rhs) 2600598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2601c4c431d6f52859c2e20e42cc08ac51e060261a63Nicolas Capens return RValue<Byte8>(Nucleus::createSub(lhs.value, rhs.value)); 2602598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2603598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2604598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// RValue<Byte8> operator*(RValue<Byte8> lhs, RValue<Byte8> rhs) 2605598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 2606598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return RValue<Byte8>(Nucleus::createMul(lhs.value, rhs.value)); 2607598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 2608598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2609598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// RValue<Byte8> operator/(RValue<Byte8> lhs, RValue<Byte8> rhs) 2610598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 2611598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return RValue<Byte8>(Nucleus::createUDiv(lhs.value, rhs.value)); 2612598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 2613598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2614598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// RValue<Byte8> operator%(RValue<Byte8> lhs, RValue<Byte8> rhs) 2615598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 2616598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return RValue<Byte8>(Nucleus::createURem(lhs.value, rhs.value)); 2617598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 2618598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2619598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Byte8> operator&(RValue<Byte8> lhs, RValue<Byte8> rhs) 2620598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2621c4c431d6f52859c2e20e42cc08ac51e060261a63Nicolas Capens return RValue<Byte8>(Nucleus::createAnd(lhs.value, rhs.value)); 2622598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2623598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2624598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Byte8> operator|(RValue<Byte8> lhs, RValue<Byte8> rhs) 2625598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2626c4c431d6f52859c2e20e42cc08ac51e060261a63Nicolas Capens return RValue<Byte8>(Nucleus::createOr(lhs.value, rhs.value)); 2627598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2628598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2629598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Byte8> operator^(RValue<Byte8> lhs, RValue<Byte8> rhs) 2630598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2631c4c431d6f52859c2e20e42cc08ac51e060261a63Nicolas Capens return RValue<Byte8>(Nucleus::createXor(lhs.value, rhs.value)); 2632598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2633598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2634598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// RValue<Byte8> operator<<(RValue<Byte8> lhs, unsigned char rhs) 2635598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 263615060bb012724757c3944f55da9fd668af78e559Nicolas Capens// return RValue<Byte8>(Nucleus::createShl(lhs.value, V(::context->getConstantInt32(rhs)))); 2637598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 2638598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2639598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// RValue<Byte8> operator>>(RValue<Byte8> lhs, unsigned char rhs) 2640598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 264115060bb012724757c3944f55da9fd668af78e559Nicolas Capens// return RValue<Byte8>(Nucleus::createLShr(lhs.value, V(::context->getConstantInt32(rhs)))); 2642598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 2643598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 264496d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Byte8> operator+=(Byte8 &lhs, RValue<Byte8> rhs) 2645598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2646598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs + rhs; 2647598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2648598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 264996d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Byte8> operator-=(Byte8 &lhs, RValue<Byte8> rhs) 2650598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2651598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs - rhs; 2652598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2653598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 265496d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens// RValue<Byte8> operator*=(Byte8 &lhs, RValue<Byte8> rhs) 2655598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 2656598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return lhs = lhs * rhs; 2657598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 2658598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 265996d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens// RValue<Byte8> operator/=(Byte8 &lhs, RValue<Byte8> rhs) 2660598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 2661598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return lhs = lhs / rhs; 2662598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 2663598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 266496d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens// RValue<Byte8> operator%=(Byte8 &lhs, RValue<Byte8> rhs) 2665598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 2666598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return lhs = lhs % rhs; 2667598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 2668598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 266996d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Byte8> operator&=(Byte8 &lhs, RValue<Byte8> rhs) 2670598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2671598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs & rhs; 2672598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2673598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 267496d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Byte8> operator|=(Byte8 &lhs, RValue<Byte8> rhs) 2675598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2676598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs | rhs; 2677598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2678598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 267996d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Byte8> operator^=(Byte8 &lhs, RValue<Byte8> rhs) 2680598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2681598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs ^ rhs; 2682598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2683598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 268496d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens// RValue<Byte8> operator<<=(Byte8 &lhs, RValue<Byte8> rhs) 2685598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 2686598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return lhs = lhs << rhs; 2687598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 2688598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 268996d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens// RValue<Byte8> operator>>=(Byte8 &lhs, RValue<Byte8> rhs) 2690598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 2691598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return lhs = lhs >> rhs; 2692598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 2693598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2694598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// RValue<Byte8> operator+(RValue<Byte8> val) 2695598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 2696598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return val; 2697598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 2698598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2699598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// RValue<Byte8> operator-(RValue<Byte8> val) 2700598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 2701598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return RValue<Byte8>(Nucleus::createNeg(val.value)); 2702598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 2703598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2704598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Byte8> operator~(RValue<Byte8> val) 2705598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2706598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Byte8>(Nucleus::createNot(val.value)); 2707598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2708598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2709d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens RValue<Byte> Extract(RValue<Byte8> val, int i) 2710d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens { 2711d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens return RValue<Byte>(Nucleus::createExtractElement(val.value, Byte::getType(), i)); 2712d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens } 2713d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens 2714d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens RValue<Byte8> Insert(RValue<Byte8> val, RValue<Byte> element, int i) 2715d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens { 2716d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens return RValue<Byte8>(Nucleus::createInsertElement(val.value, element.value, i)); 2717d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens } 2718d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens 271933438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens RValue<Byte> SaturateUnsigned(RValue<Short> x) 27209843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens { 27217f301812cb31acec219f155d96895c559053ae85Nicolas Capens return Byte(IfThenElse(Int(x) > 0xFF, Int(0xFF), IfThenElse(Int(x) < 0, Int(0), Int(x)))); 27229843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens } 27239843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens 2724598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Byte8> AddSat(RValue<Byte8> x, RValue<Byte8> y) 2725598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 27269843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens if(emulateIntrinsics) 27279843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens { 27289843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens Byte8 result; 272933438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateUnsigned(Short(Int(Extract(x, 0)) + Int(Extract(y, 0)))), 0); 273033438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateUnsigned(Short(Int(Extract(x, 1)) + Int(Extract(y, 1)))), 1); 273133438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateUnsigned(Short(Int(Extract(x, 2)) + Int(Extract(y, 2)))), 2); 273233438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateUnsigned(Short(Int(Extract(x, 3)) + Int(Extract(y, 3)))), 3); 273333438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateUnsigned(Short(Int(Extract(x, 4)) + Int(Extract(y, 4)))), 4); 273433438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateUnsigned(Short(Int(Extract(x, 5)) + Int(Extract(y, 5)))), 5); 273533438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateUnsigned(Short(Int(Extract(x, 6)) + Int(Extract(y, 6)))), 6); 273633438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateUnsigned(Short(Int(Extract(x, 7)) + Int(Extract(y, 7)))), 7); 2737c71bed2d8c33e694d0c468618df971b1763479b0Nicolas Capens 27389843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens return result; 27399843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens } 27409843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens else 27419843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens { 27429843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_v16i8); 27439843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::AddSaturateUnsigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; 27449843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens auto target = ::context->getConstantUndef(Ice::IceType_i32); 27459843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens auto paddusb = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic); 27469843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens paddusb->addArg(x.value); 27479843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens paddusb->addArg(y.value); 27489843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens ::basicBlock->appendInst(paddusb); 27499843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens 27509843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens return RValue<Byte8>(V(result)); 27519843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens } 2752598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2753598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2754598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Byte8> SubSat(RValue<Byte8> x, RValue<Byte8> y) 2755598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 27569843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens if(emulateIntrinsics) 27579843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens { 27589843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens Byte8 result; 275933438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateUnsigned(Short(Int(Extract(x, 0)) - Int(Extract(y, 0)))), 0); 276033438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateUnsigned(Short(Int(Extract(x, 1)) - Int(Extract(y, 1)))), 1); 276133438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateUnsigned(Short(Int(Extract(x, 2)) - Int(Extract(y, 2)))), 2); 276233438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateUnsigned(Short(Int(Extract(x, 3)) - Int(Extract(y, 3)))), 3); 276333438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateUnsigned(Short(Int(Extract(x, 4)) - Int(Extract(y, 4)))), 4); 276433438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateUnsigned(Short(Int(Extract(x, 5)) - Int(Extract(y, 5)))), 5); 276533438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateUnsigned(Short(Int(Extract(x, 6)) - Int(Extract(y, 6)))), 6); 276633438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateUnsigned(Short(Int(Extract(x, 7)) - Int(Extract(y, 7)))), 7); 27679843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens 27689843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens return result; 27699843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens } 27709843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens else 27719843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens { 27729843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_v16i8); 27739843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::SubtractSaturateUnsigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; 27749843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens auto target = ::context->getConstantUndef(Ice::IceType_i32); 27759843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens auto psubusw = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic); 27769843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens psubusw->addArg(x.value); 27779843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens psubusw->addArg(y.value); 27789843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens ::basicBlock->appendInst(psubusw); 2779c71bed2d8c33e694d0c468618df971b1763479b0Nicolas Capens 27809843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens return RValue<Byte8>(V(result)); 27819843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens } 2782598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2783598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2784598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short4> Unpack(RValue<Byte4> x) 2785598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 278637fbecee519c3fc4502f48f42cced9797c85361fNicolas Capens int shuffle[16] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7}; // Real type is v16i8 2787bea4dce934c96284fb60f21c9a1698c86e1fd703Nicolas Capens return As<Short4>(Nucleus::createShuffleVector(x.value, x.value, shuffle)); 2788598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2789598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2790411273e7b30258756011601a2c3035dd67721a55Nicolas Capens RValue<Short4> Unpack(RValue<Byte4> x, RValue<Byte4> y) 2791411273e7b30258756011601a2c3035dd67721a55Nicolas Capens { 2792411273e7b30258756011601a2c3035dd67721a55Nicolas Capens return UnpackLow(As<Byte8>(x), As<Byte8>(y)); 2793411273e7b30258756011601a2c3035dd67721a55Nicolas Capens } 2794411273e7b30258756011601a2c3035dd67721a55Nicolas Capens 2795598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short4> UnpackLow(RValue<Byte8> x, RValue<Byte8> y) 2796598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 279737fbecee519c3fc4502f48f42cced9797c85361fNicolas Capens int shuffle[16] = {0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23}; // Real type is v16i8 2798bea4dce934c96284fb60f21c9a1698c86e1fd703Nicolas Capens return As<Short4>(Nucleus::createShuffleVector(x.value, y.value, shuffle)); 2799598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2800598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2801598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short4> UnpackHigh(RValue<Byte8> x, RValue<Byte8> y) 2802598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 280320e22c4b509a0f7d0fa6208e2974556e46ae8b62Nicolas Capens int shuffle[16] = {0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23}; // Real type is v16i8 280420e22c4b509a0f7d0fa6208e2974556e46ae8b62Nicolas Capens auto lowHigh = RValue<Byte16>(Nucleus::createShuffleVector(x.value, y.value, shuffle)); 280520e22c4b509a0f7d0fa6208e2974556e46ae8b62Nicolas Capens return As<Short4>(Swizzle(As<Int4>(lowHigh), 0xEE)); 2806598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2807598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2808d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens RValue<SByte> Extract(RValue<SByte8> val, int i) 2809d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens { 2810d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens return RValue<SByte>(Nucleus::createExtractElement(val.value, SByte::getType(), i)); 2811d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens } 2812d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens 2813d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens RValue<SByte8> Insert(RValue<SByte8> val, RValue<SByte> element, int i) 2814d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens { 2815d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens return RValue<SByte8>(Nucleus::createInsertElement(val.value, element.value, i)); 2816d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens } 2817d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens 2818d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens RValue<SByte8> operator>>(RValue<SByte8> lhs, unsigned char rhs) 2819d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens { 2820d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens if(emulateIntrinsics) 2821d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens { 2822d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens SByte8 result; 2823d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens result = Insert(result, Extract(lhs, 0) >> SByte(rhs), 0); 2824d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens result = Insert(result, Extract(lhs, 1) >> SByte(rhs), 1); 2825d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens result = Insert(result, Extract(lhs, 2) >> SByte(rhs), 2); 2826d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens result = Insert(result, Extract(lhs, 3) >> SByte(rhs), 3); 2827d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens result = Insert(result, Extract(lhs, 4) >> SByte(rhs), 4); 2828d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens result = Insert(result, Extract(lhs, 5) >> SByte(rhs), 5); 2829d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens result = Insert(result, Extract(lhs, 6) >> SByte(rhs), 6); 2830d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens result = Insert(result, Extract(lhs, 7) >> SByte(rhs), 7); 2831d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens 2832d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens return result; 2833d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens } 2834d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens else 2835d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens { 2836d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens #if defined(__i386__) || defined(__x86_64__) 2837d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens // SSE2 doesn't support byte vector shifts, so shift as shorts and recombine. 2838e18c530caa1a741b97f9250b62d12c5b02ce6653Alexis Hetu RValue<Short4> hi = (As<Short4>(lhs) >> rhs) & Short4(0xFF00u); 2839d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens RValue<Short4> lo = As<Short4>(As<UShort4>((As<Short4>(lhs) << 8) >> rhs) >> 8); 2840d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens 2841d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens return As<SByte8>(hi | lo); 2842d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens #else 2843d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens return RValue<SByte8>(Nucleus::createAShr(lhs.value, V(::context->getConstantInt32(rhs)))); 2844d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens #endif 2845d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens } 2846d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens } 2847d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens 2848598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int> SignMask(RValue<Byte8> x) 2849598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2850091f350c0c1a18c7a05fa4b49ebb009e1710b3b8Nicolas Capens if(emulateIntrinsics || CPUID::ARM) 2851d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens { 2852d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens Byte8 xx = As<Byte8>(As<SByte8>(x) >> 7) & Byte8(0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80); 2853d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens return Int(Extract(xx, 0)) | Int(Extract(xx, 1)) | Int(Extract(xx, 2)) | Int(Extract(xx, 3)) | Int(Extract(xx, 4)) | Int(Extract(xx, 5)) | Int(Extract(xx, 6)) | Int(Extract(xx, 7)); 2854d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens } 2855d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens else 2856d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens { 2857d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_i32); 2858d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::SignMask, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; 2859d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens auto target = ::context->getConstantUndef(Ice::IceType_i32); 2860d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens auto movmsk = Ice::InstIntrinsicCall::create(::function, 1, result, target, intrinsic); 2861d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens movmsk->addArg(x.value); 2862d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens ::basicBlock->appendInst(movmsk); 2863c71bed2d8c33e694d0c468618df971b1763479b0Nicolas Capens 28640f70a7fa78b484008ac440352979e8bd62e4f0cdNicolas Capens return RValue<Int>(V(result)) & 0xFF; 2865d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens } 2866598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2867598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2868598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// RValue<Byte8> CmpGT(RValue<Byte8> x, RValue<Byte8> y) 2869598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 28702f970b66add8414b15e6097a423ecc30181e66faNicolas Capens// return RValue<Byte8>(createIntCompare(Ice::InstIcmp::Ugt, x.value, y.value)); 2871598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 2872598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2873598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Byte8> CmpEQ(RValue<Byte8> x, RValue<Byte8> y) 2874598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 28755e6ca097025a069d2c4da383a312ffcf35e44a19Nicolas Capens return RValue<Byte8>(Nucleus::createICmpEQ(x.value, y.value)); 2876598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2877598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2878598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Type *Byte8::getType() 2879598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 288023d99a4943f621bd09723c92ed012be233cd966cNicolas Capens return T(Type_v8i8); 2881598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2882598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2883598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 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) 2884598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 28858dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens int64_t constantVector[8] = { x0, x1, x2, x3, x4, x5, x6, x7 }; 28868dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens Value *vector = V(Nucleus::createConstantVector(constantVector, getType())); 28878dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens 28888dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens storeValue(Nucleus::createBitCast(vector, getType())); 2889598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2890598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2891598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens SByte8::SByte8(RValue<SByte8> rhs) 2892598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2893598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 2894598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2895598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2896598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens SByte8::SByte8(const SByte8 &rhs) 2897598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2898598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 2899598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 2900598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2901598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2902598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens SByte8::SByte8(const Reference<SByte8> &rhs) 2903598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2904598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 2905598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 2906598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2907598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 290896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<SByte8> SByte8::operator=(RValue<SByte8> rhs) 2909598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2910598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 2911598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2912598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return rhs; 2913598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2914598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 291596d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<SByte8> SByte8::operator=(const SByte8 &rhs) 2916598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2917598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 2918598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 2919598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2920598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<SByte8>(value); 2921598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2922598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 292396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<SByte8> SByte8::operator=(const Reference<SByte8> &rhs) 2924598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2925598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 2926598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 2927598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2928598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<SByte8>(value); 2929598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2930598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2931598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<SByte8> operator+(RValue<SByte8> lhs, RValue<SByte8> rhs) 2932598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2933c4c431d6f52859c2e20e42cc08ac51e060261a63Nicolas Capens return RValue<SByte8>(Nucleus::createAdd(lhs.value, rhs.value)); 2934598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2935598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2936598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<SByte8> operator-(RValue<SByte8> lhs, RValue<SByte8> rhs) 2937598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2938c4c431d6f52859c2e20e42cc08ac51e060261a63Nicolas Capens return RValue<SByte8>(Nucleus::createSub(lhs.value, rhs.value)); 2939598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2940598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2941598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// RValue<SByte8> operator*(RValue<SByte8> lhs, RValue<SByte8> rhs) 2942598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 2943598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return RValue<SByte8>(Nucleus::createMul(lhs.value, rhs.value)); 2944598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 2945598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2946598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// RValue<SByte8> operator/(RValue<SByte8> lhs, RValue<SByte8> rhs) 2947598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 2948598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return RValue<SByte8>(Nucleus::createSDiv(lhs.value, rhs.value)); 2949598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 2950598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2951598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// RValue<SByte8> operator%(RValue<SByte8> lhs, RValue<SByte8> rhs) 2952598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 2953598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return RValue<SByte8>(Nucleus::createSRem(lhs.value, rhs.value)); 2954598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 2955598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2956598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<SByte8> operator&(RValue<SByte8> lhs, RValue<SByte8> rhs) 2957598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2958598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<SByte8>(Nucleus::createAnd(lhs.value, rhs.value)); 2959598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2960598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2961598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<SByte8> operator|(RValue<SByte8> lhs, RValue<SByte8> rhs) 2962598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2963598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<SByte8>(Nucleus::createOr(lhs.value, rhs.value)); 2964598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2965598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2966598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<SByte8> operator^(RValue<SByte8> lhs, RValue<SByte8> rhs) 2967598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2968598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<SByte8>(Nucleus::createXor(lhs.value, rhs.value)); 2969598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2970598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2971598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// RValue<SByte8> operator<<(RValue<SByte8> lhs, unsigned char rhs) 2972598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 297315060bb012724757c3944f55da9fd668af78e559Nicolas Capens// return RValue<SByte8>(Nucleus::createShl(lhs.value, V(::context->getConstantInt32(rhs)))); 2974598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 2975598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 2976598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// RValue<SByte8> operator>>(RValue<SByte8> lhs, unsigned char rhs) 2977598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 297815060bb012724757c3944f55da9fd668af78e559Nicolas Capens// return RValue<SByte8>(Nucleus::createAShr(lhs.value, V(::context->getConstantInt32(rhs)))); 2979598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 2980598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 298196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<SByte8> operator+=(SByte8 &lhs, RValue<SByte8> rhs) 2982598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2983598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs + rhs; 2984598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2985598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 298696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<SByte8> operator-=(SByte8 &lhs, RValue<SByte8> rhs) 2987598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 2988598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs - rhs; 2989598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 2990598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 299196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens// RValue<SByte8> operator*=(SByte8 &lhs, RValue<SByte8> rhs) 2992598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 2993598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return lhs = lhs * rhs; 2994598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 2995598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 299696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens// RValue<SByte8> operator/=(SByte8 &lhs, RValue<SByte8> rhs) 2997598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 2998598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return lhs = lhs / rhs; 2999598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 3000598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 300196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens// RValue<SByte8> operator%=(SByte8 &lhs, RValue<SByte8> rhs) 3002598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 3003598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return lhs = lhs % rhs; 3004598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 3005598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 300696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<SByte8> operator&=(SByte8 &lhs, RValue<SByte8> rhs) 3007598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3008598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs & rhs; 3009598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3010598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 301196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<SByte8> operator|=(SByte8 &lhs, RValue<SByte8> rhs) 3012598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3013598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs | rhs; 3014598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3015598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 301696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<SByte8> operator^=(SByte8 &lhs, RValue<SByte8> rhs) 3017598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3018598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs ^ rhs; 3019598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3020598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 302196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens// RValue<SByte8> operator<<=(SByte8 &lhs, RValue<SByte8> rhs) 3022598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 3023598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return lhs = lhs << rhs; 3024598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 3025598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 302696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens// RValue<SByte8> operator>>=(SByte8 &lhs, RValue<SByte8> rhs) 3027598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 3028598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return lhs = lhs >> rhs; 3029598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 3030598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3031598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// RValue<SByte8> operator+(RValue<SByte8> val) 3032598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 3033598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return val; 3034598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 3035598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3036598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// RValue<SByte8> operator-(RValue<SByte8> val) 3037598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 3038598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return RValue<SByte8>(Nucleus::createNeg(val.value)); 3039598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 3040598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3041598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<SByte8> operator~(RValue<SByte8> val) 3042598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3043598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<SByte8>(Nucleus::createNot(val.value)); 3044598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3045598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 304633438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens RValue<SByte> SaturateSigned(RValue<Short> x) 30479843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens { 30489843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens return SByte(IfThenElse(Int(x) > 0x7F, Int(0x7F), IfThenElse(Int(x) < -0x80, Int(0x80), Int(x)))); 30499843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens } 30509843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens 3051598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<SByte8> AddSat(RValue<SByte8> x, RValue<SByte8> y) 3052598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 30539843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens if(emulateIntrinsics) 30549843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens { 30559843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens SByte8 result; 305633438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Short(Int(Extract(x, 0)) + Int(Extract(y, 0)))), 0); 305733438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Short(Int(Extract(x, 1)) + Int(Extract(y, 1)))), 1); 305833438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Short(Int(Extract(x, 2)) + Int(Extract(y, 2)))), 2); 305933438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Short(Int(Extract(x, 3)) + Int(Extract(y, 3)))), 3); 306033438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Short(Int(Extract(x, 4)) + Int(Extract(y, 4)))), 4); 306133438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Short(Int(Extract(x, 5)) + Int(Extract(y, 5)))), 5); 306233438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Short(Int(Extract(x, 6)) + Int(Extract(y, 6)))), 6); 306333438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Short(Int(Extract(x, 7)) + Int(Extract(y, 7)))), 7); 30649843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens 30659843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens return result; 30669843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens } 30679843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens else 30689843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens { 30699843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_v16i8); 30709843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::AddSaturateSigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; 30719843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens auto target = ::context->getConstantUndef(Ice::IceType_i32); 30729843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens auto paddsb = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic); 30739843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens paddsb->addArg(x.value); 30749843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens paddsb->addArg(y.value); 30759843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens ::basicBlock->appendInst(paddsb); 3076c71bed2d8c33e694d0c468618df971b1763479b0Nicolas Capens 30779843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens return RValue<SByte8>(V(result)); 30789843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens } 3079598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3080598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3081598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<SByte8> SubSat(RValue<SByte8> x, RValue<SByte8> y) 3082598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 30839843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens if(emulateIntrinsics) 30849843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens { 30859843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens SByte8 result; 308633438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Short(Int(Extract(x, 0)) - Int(Extract(y, 0)))), 0); 308733438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Short(Int(Extract(x, 1)) - Int(Extract(y, 1)))), 1); 308833438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Short(Int(Extract(x, 2)) - Int(Extract(y, 2)))), 2); 308933438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Short(Int(Extract(x, 3)) - Int(Extract(y, 3)))), 3); 309033438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Short(Int(Extract(x, 4)) - Int(Extract(y, 4)))), 4); 309133438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Short(Int(Extract(x, 5)) - Int(Extract(y, 5)))), 5); 309233438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Short(Int(Extract(x, 6)) - Int(Extract(y, 6)))), 6); 309333438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Short(Int(Extract(x, 7)) - Int(Extract(y, 7)))), 7); 3094c71bed2d8c33e694d0c468618df971b1763479b0Nicolas Capens 30959843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens return result; 30969843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens } 30979843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens else 30989843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens { 30999843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_v16i8); 31009843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::SubtractSaturateSigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; 31019843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens auto target = ::context->getConstantUndef(Ice::IceType_i32); 31029843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens auto psubsb = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic); 31039843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens psubsb->addArg(x.value); 31049843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens psubsb->addArg(y.value); 31059843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens ::basicBlock->appendInst(psubsb); 31069843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens 31079843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens return RValue<SByte8>(V(result)); 31089843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens } 3109598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3110598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3111598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short4> UnpackLow(RValue<SByte8> x, RValue<SByte8> y) 3112598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 311337fbecee519c3fc4502f48f42cced9797c85361fNicolas Capens int shuffle[16] = {0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23}; // Real type is v16i8 3114bea4dce934c96284fb60f21c9a1698c86e1fd703Nicolas Capens return As<Short4>(Nucleus::createShuffleVector(x.value, y.value, shuffle)); 3115598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3116598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3117598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short4> UnpackHigh(RValue<SByte8> x, RValue<SByte8> y) 3118598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 311920e22c4b509a0f7d0fa6208e2974556e46ae8b62Nicolas Capens int shuffle[16] = {0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23}; // Real type is v16i8 312020e22c4b509a0f7d0fa6208e2974556e46ae8b62Nicolas Capens auto lowHigh = RValue<Byte16>(Nucleus::createShuffleVector(x.value, y.value, shuffle)); 312120e22c4b509a0f7d0fa6208e2974556e46ae8b62Nicolas Capens return As<Short4>(Swizzle(As<Int4>(lowHigh), 0xEE)); 3122598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3123598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3124598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int> SignMask(RValue<SByte8> x) 3125598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3126091f350c0c1a18c7a05fa4b49ebb009e1710b3b8Nicolas Capens if(emulateIntrinsics || CPUID::ARM) 3127d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens { 3128d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens SByte8 xx = (x >> 7) & SByte8(0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80); 3129d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens return Int(Extract(xx, 0)) | Int(Extract(xx, 1)) | Int(Extract(xx, 2)) | Int(Extract(xx, 3)) | Int(Extract(xx, 4)) | Int(Extract(xx, 5)) | Int(Extract(xx, 6)) | Int(Extract(xx, 7)); 3130d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens } 3131d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens else 3132d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens { 3133d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_i32); 3134d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::SignMask, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; 3135d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens auto target = ::context->getConstantUndef(Ice::IceType_i32); 3136d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens auto movmsk = Ice::InstIntrinsicCall::create(::function, 1, result, target, intrinsic); 3137d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens movmsk->addArg(x.value); 3138d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens ::basicBlock->appendInst(movmsk); 3139f2cb9dff9c71cff304d98f0df7ffe6bebd6bc2bbNicolas Capens 31400f70a7fa78b484008ac440352979e8bd62e4f0cdNicolas Capens return RValue<Int>(V(result)) & 0xFF; 3141d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens } 3142598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3143598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3144598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Byte8> CmpGT(RValue<SByte8> x, RValue<SByte8> y) 3145598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 31462f970b66add8414b15e6097a423ecc30181e66faNicolas Capens return RValue<Byte8>(createIntCompare(Ice::InstIcmp::Sgt, x.value, y.value)); 3147598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3148598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3149598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Byte8> CmpEQ(RValue<SByte8> x, RValue<SByte8> y) 3150598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 31515e6ca097025a069d2c4da383a312ffcf35e44a19Nicolas Capens return RValue<Byte8>(Nucleus::createICmpEQ(x.value, y.value)); 3152598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3153598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3154598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Type *SByte8::getType() 3155598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 31564cfd45760c4cc0fb821322a869a2979ca8226843Nicolas Capens return T(Type_v8i8); 3157598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3158598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3159598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Byte16::Byte16(RValue<Byte16> rhs) 3160598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3161598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 3162598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3163598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3164598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Byte16::Byte16(const Byte16 &rhs) 3165598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3166598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 3167598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 3168598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3169598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3170598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Byte16::Byte16(const Reference<Byte16> &rhs) 3171598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3172598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 3173598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 3174598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3175598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 317696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Byte16> Byte16::operator=(RValue<Byte16> rhs) 3177598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3178598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 3179598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3180598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return rhs; 3181598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3182598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 318396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Byte16> Byte16::operator=(const Byte16 &rhs) 3184598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3185598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 3186598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 3187598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3188598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Byte16>(value); 3189598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3190598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 319196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Byte16> Byte16::operator=(const Reference<Byte16> &rhs) 3192598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3193598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 3194598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 3195598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3196598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Byte16>(value); 3197598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3198598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3199598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Type *Byte16::getType() 3200598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 320123d99a4943f621bd09723c92ed012be233cd966cNicolas Capens return T(Ice::IceType_v16i8); 3202598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3203598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3204598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Type *SByte16::getType() 3205598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 320623d99a4943f621bd09723c92ed012be233cd966cNicolas Capens return T(Ice::IceType_v16i8); 3207598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3208598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 320916b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens Short2::Short2(RValue<Short4> cast) 321016b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens { 3211c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens storeValue(Nucleus::createBitCast(cast.value, getType())); 321216b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens } 321316b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens 321416b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens Type *Short2::getType() 321516b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens { 321623d99a4943f621bd09723c92ed012be233cd966cNicolas Capens return T(Type_v2i16); 321716b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens } 321816b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens 321916b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens UShort2::UShort2(RValue<UShort4> cast) 322016b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens { 3221c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens storeValue(Nucleus::createBitCast(cast.value, getType())); 322216b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens } 322316b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens 322416b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens Type *UShort2::getType() 322516b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens { 322623d99a4943f621bd09723c92ed012be233cd966cNicolas Capens return T(Type_v2i16); 322716b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens } 322816b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens 3229598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Short4::Short4(RValue<Int> cast) 3230598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3231d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens Value *vector = loadValue(); 3232bf22bbf24ab4d062f746b123edf5ddad82070542Nicolas Capens Value *element = Nucleus::createTrunc(cast.value, Short::getType()); 3233bf22bbf24ab4d062f746b123edf5ddad82070542Nicolas Capens Value *insert = Nucleus::createInsertElement(vector, element, 0); 3234d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens Value *swizzle = Swizzle(RValue<Short4>(insert), 0x00).value; 3235598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3236598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(swizzle); 3237598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3238598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3239598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Short4::Short4(RValue<Int4> cast) 3240598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3241f8beb4bedfdb11eca2f947afde79dd78b6386206Nicolas Capens int select[8] = {0, 2, 4, 6, 0, 2, 4, 6}; 3242f8beb4bedfdb11eca2f947afde79dd78b6386206Nicolas Capens Value *short8 = Nucleus::createBitCast(cast.value, Short8::getType()); 3243f8beb4bedfdb11eca2f947afde79dd78b6386206Nicolas Capens Value *packed = Nucleus::createShuffleVector(short8, short8, select); 3244d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens 3245bea4dce934c96284fb60f21c9a1698c86e1fd703Nicolas Capens Value *int2 = RValue<Int2>(Int2(As<Int4>(packed))).value; 3246d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens Value *short4 = Nucleus::createBitCast(int2, Short4::getType()); 3247d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens 3248d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens storeValue(short4); 3249598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3250598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3251598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// Short4::Short4(RValue<Float> cast) 3252598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 3253598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 3254598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3255598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Short4::Short4(RValue<Float4> cast) 3256598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3257598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens assert(false && "UNIMPLEMENTED"); 3258598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3259598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3260598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Short4::Short4(short xyzw) 3261598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 32628dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens int64_t constantVector[4] = {xyzw, xyzw, xyzw, xyzw}; 32638dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens storeValue(Nucleus::createConstantVector(constantVector, getType())); 3264598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3265598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3266598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Short4::Short4(short x, short y, short z, short w) 3267598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 32688dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens int64_t constantVector[4] = {x, y, z, w}; 32698dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens storeValue(Nucleus::createConstantVector(constantVector, getType())); 3270598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3271598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3272598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Short4::Short4(RValue<Short4> rhs) 3273598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3274598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 3275598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3276598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3277598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Short4::Short4(const Short4 &rhs) 3278598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3279598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 3280598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 3281598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3282598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3283598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Short4::Short4(const Reference<Short4> &rhs) 3284598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3285598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 3286598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 3287598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3288598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3289598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Short4::Short4(RValue<UShort4> rhs) 3290598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3291598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 3292598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3293598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3294598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Short4::Short4(const UShort4 &rhs) 3295598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3296598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.loadValue()); 3297598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3298598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3299598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Short4::Short4(const Reference<UShort4> &rhs) 3300598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3301598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.loadValue()); 3302598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3303598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 330496d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Short4> Short4::operator=(RValue<Short4> rhs) 3305598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3306598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 3307598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3308598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return rhs; 3309598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3310598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 331196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Short4> Short4::operator=(const Short4 &rhs) 3312598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3313598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 3314598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 3315598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3316598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Short4>(value); 3317598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3318598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 331996d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Short4> Short4::operator=(const Reference<Short4> &rhs) 3320598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3321598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 3322598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 3323598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3324598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Short4>(value); 3325598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3326598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 332796d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Short4> Short4::operator=(RValue<UShort4> rhs) 3328598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3329598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 3330598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3331598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Short4>(rhs); 3332598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3333598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 333496d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Short4> Short4::operator=(const UShort4 &rhs) 3335598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3336598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 3337598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 3338598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3339598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Short4>(value); 3340598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3341598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 334296d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Short4> Short4::operator=(const Reference<UShort4> &rhs) 3343598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3344598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 3345598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 3346598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3347598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Short4>(value); 3348598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3349598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3350598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short4> operator+(RValue<Short4> lhs, RValue<Short4> rhs) 3351598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3352c4c431d6f52859c2e20e42cc08ac51e060261a63Nicolas Capens return RValue<Short4>(Nucleus::createAdd(lhs.value, rhs.value)); 3353598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3354598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3355598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short4> operator-(RValue<Short4> lhs, RValue<Short4> rhs) 3356598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3357c4c431d6f52859c2e20e42cc08ac51e060261a63Nicolas Capens return RValue<Short4>(Nucleus::createSub(lhs.value, rhs.value)); 3358598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3359598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3360598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short4> operator*(RValue<Short4> lhs, RValue<Short4> rhs) 3361598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3362c4c431d6f52859c2e20e42cc08ac51e060261a63Nicolas Capens return RValue<Short4>(Nucleus::createMul(lhs.value, rhs.value)); 3363598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3364598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3365598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// RValue<Short4> operator/(RValue<Short4> lhs, RValue<Short4> rhs) 3366598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 3367598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return RValue<Short4>(Nucleus::createSDiv(lhs.value, rhs.value)); 3368598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 3369598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3370598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// RValue<Short4> operator%(RValue<Short4> lhs, RValue<Short4> rhs) 3371598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 3372598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return RValue<Short4>(Nucleus::createSRem(lhs.value, rhs.value)); 3373598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 3374598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3375598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short4> operator&(RValue<Short4> lhs, RValue<Short4> rhs) 3376598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3377c4c431d6f52859c2e20e42cc08ac51e060261a63Nicolas Capens return RValue<Short4>(Nucleus::createAnd(lhs.value, rhs.value)); 3378598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3379598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3380598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short4> operator|(RValue<Short4> lhs, RValue<Short4> rhs) 3381598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3382c4c431d6f52859c2e20e42cc08ac51e060261a63Nicolas Capens return RValue<Short4>(Nucleus::createOr(lhs.value, rhs.value)); 3383598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3384598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3385598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short4> operator^(RValue<Short4> lhs, RValue<Short4> rhs) 3386598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3387c4c431d6f52859c2e20e42cc08ac51e060261a63Nicolas Capens return RValue<Short4>(Nucleus::createXor(lhs.value, rhs.value)); 3388598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3389598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3390598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short4> operator<<(RValue<Short4> lhs, unsigned char rhs) 3391598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 33928be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens if(emulateIntrinsics) 33938be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 33948be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens Short4 result; 33958be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 0) << Short(rhs), 0); 33968be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 1) << Short(rhs), 1); 33978be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 2) << Short(rhs), 2); 33988be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 3) << Short(rhs), 3); 33998be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens 34008be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return result; 34018be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 34028be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens else 34038be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 34048be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return RValue<Short4>(Nucleus::createShl(lhs.value, V(::context->getConstantInt32(rhs)))); 34058be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 3406598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3407598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3408598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short4> operator>>(RValue<Short4> lhs, unsigned char rhs) 3409598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 34108be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens if(emulateIntrinsics) 34118be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 34128be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens Short4 result; 34138be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 0) >> Short(rhs), 0); 34148be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 1) >> Short(rhs), 1); 34158be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 2) >> Short(rhs), 2); 34168be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 3) >> Short(rhs), 3); 34178be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens 34188be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return result; 34198be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 34208be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens else 34218be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 34228be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return RValue<Short4>(Nucleus::createAShr(lhs.value, V(::context->getConstantInt32(rhs)))); 34238be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 3424598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3425598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 342696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Short4> operator+=(Short4 &lhs, RValue<Short4> rhs) 3427598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3428598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs + rhs; 3429598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3430598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 343196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Short4> operator-=(Short4 &lhs, RValue<Short4> rhs) 3432598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3433598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs - rhs; 3434598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3435598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 343696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Short4> operator*=(Short4 &lhs, RValue<Short4> rhs) 3437598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3438598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs * rhs; 3439598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3440598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 344196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens// RValue<Short4> operator/=(Short4 &lhs, RValue<Short4> rhs) 3442598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 3443598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return lhs = lhs / rhs; 3444598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 3445598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 344696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens// RValue<Short4> operator%=(Short4 &lhs, RValue<Short4> rhs) 3447598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 3448598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return lhs = lhs % rhs; 3449598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 3450598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 345196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Short4> operator&=(Short4 &lhs, RValue<Short4> rhs) 3452598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3453598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs & rhs; 3454598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3455598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 345696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Short4> operator|=(Short4 &lhs, RValue<Short4> rhs) 3457598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3458598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs | rhs; 3459598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3460598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 346196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Short4> operator^=(Short4 &lhs, RValue<Short4> rhs) 3462598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3463598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs ^ rhs; 3464598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3465598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 346696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Short4> operator<<=(Short4 &lhs, unsigned char rhs) 3467598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3468598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs << rhs; 3469598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3470598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 347196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Short4> operator>>=(Short4 &lhs, unsigned char rhs) 3472598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3473598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs >> rhs; 3474598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3475598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3476598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// RValue<Short4> operator+(RValue<Short4> val) 3477598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 3478598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return val; 3479598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 3480598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3481598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short4> operator-(RValue<Short4> val) 3482598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3483c5c0c335f2a2e8add573a3865d5b169b5b092dd8Nicolas Capens return RValue<Short4>(Nucleus::createNeg(val.value)); 3484598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3485598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3486598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short4> operator~(RValue<Short4> val) 3487598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3488c5c0c335f2a2e8add573a3865d5b169b5b092dd8Nicolas Capens return RValue<Short4>(Nucleus::createNot(val.value)); 3489598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3490598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3491598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short4> RoundShort4(RValue<Float4> cast) 3492598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3493d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens RValue<Int4> int4 = RoundInt(cast); 349433438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens return As<Short4>(PackSigned(int4, int4)); 3495598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3496598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3497598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short4> Max(RValue<Short4> x, RValue<Short4> y) 3498598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 349953a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens Ice::Variable *condition = ::function->makeVariable(Ice::IceType_v8i1); 350053a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Sle, condition, x.value, y.value); 350153a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens ::basicBlock->appendInst(cmp); 350253a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens 350353a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16); 350453a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens auto select = Ice::InstSelect::create(::function, result, condition, y.value, x.value); 350553a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens ::basicBlock->appendInst(select); 350653a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens 350753a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens return RValue<Short4>(V(result)); 3508598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3509598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3510598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short4> Min(RValue<Short4> x, RValue<Short4> y) 3511598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 351253a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens Ice::Variable *condition = ::function->makeVariable(Ice::IceType_v8i1); 351353a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Sgt, condition, x.value, y.value); 351453a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens ::basicBlock->appendInst(cmp); 351553a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens 351653a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16); 351753a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens auto select = Ice::InstSelect::create(::function, result, condition, y.value, x.value); 351853a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens ::basicBlock->appendInst(select); 351953a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens 352053a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens return RValue<Short4>(V(result)); 3521598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3522598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 352333438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens RValue<Short> SaturateSigned(RValue<Int> x) 35249843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens { 35259843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens return Short(IfThenElse(x > 0x7FFF, Int(0x7FFF), IfThenElse(x < -0x8000, Int(0x8000), x))); 35269843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens } 35279843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens 3528598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short4> AddSat(RValue<Short4> x, RValue<Short4> y) 3529598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 35309843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens if(emulateIntrinsics) 35319843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens { 35329843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens Short4 result; 353333438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Int(Extract(x, 0)) + Int(Extract(y, 0))), 0); 353433438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Int(Extract(x, 1)) + Int(Extract(y, 1))), 1); 353533438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Int(Extract(x, 2)) + Int(Extract(y, 2))), 2); 353633438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Int(Extract(x, 3)) + Int(Extract(y, 3))), 3); 3537c71bed2d8c33e694d0c468618df971b1763479b0Nicolas Capens 35389843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens return result; 35399843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens } 35409843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens else 35419843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens { 35429843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16); 35439843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::AddSaturateSigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; 35449843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens auto target = ::context->getConstantUndef(Ice::IceType_i32); 35459843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens auto paddsw = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic); 35469843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens paddsw->addArg(x.value); 35479843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens paddsw->addArg(y.value); 35489843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens ::basicBlock->appendInst(paddsw); 35499843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens 35509843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens return RValue<Short4>(V(result)); 35519843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens } 3552598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3553598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3554598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short4> SubSat(RValue<Short4> x, RValue<Short4> y) 3555598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 35569843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens if(emulateIntrinsics) 35579843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens { 35589843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens Short4 result; 355933438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Int(Extract(x, 0)) - Int(Extract(y, 0))), 0); 356033438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Int(Extract(x, 1)) - Int(Extract(y, 1))), 1); 356133438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Int(Extract(x, 2)) - Int(Extract(y, 2))), 2); 356233438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Int(Extract(x, 3)) - Int(Extract(y, 3))), 3); 3563c71bed2d8c33e694d0c468618df971b1763479b0Nicolas Capens 35649843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens return result; 35659843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens } 35669843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens else 35679843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens { 35689843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16); 35699843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::SubtractSaturateSigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; 35709843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens auto target = ::context->getConstantUndef(Ice::IceType_i32); 35719843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens auto psubsw = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic); 35729843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens psubsw->addArg(x.value); 35739843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens psubsw->addArg(y.value); 35749843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens ::basicBlock->appendInst(psubsw); 35759843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens 35769843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens return RValue<Short4>(V(result)); 35779843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens } 3578598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3579598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3580598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short4> MulHigh(RValue<Short4> x, RValue<Short4> y) 3581598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 35826c15744a34949008a36a708f5934d21f2d882478Nicolas Capens if(emulateIntrinsics) 35836c15744a34949008a36a708f5934d21f2d882478Nicolas Capens { 35846c15744a34949008a36a708f5934d21f2d882478Nicolas Capens Short4 result; 35856c15744a34949008a36a708f5934d21f2d882478Nicolas Capens result = Insert(result, Short((Int(Extract(x, 0)) * Int(Extract(y, 0))) >> 16), 0); 35866c15744a34949008a36a708f5934d21f2d882478Nicolas Capens result = Insert(result, Short((Int(Extract(x, 1)) * Int(Extract(y, 1))) >> 16), 1); 35876c15744a34949008a36a708f5934d21f2d882478Nicolas Capens result = Insert(result, Short((Int(Extract(x, 2)) * Int(Extract(y, 2))) >> 16), 2); 35886c15744a34949008a36a708f5934d21f2d882478Nicolas Capens result = Insert(result, Short((Int(Extract(x, 3)) * Int(Extract(y, 3))) >> 16), 3); 3589c71bed2d8c33e694d0c468618df971b1763479b0Nicolas Capens 35906c15744a34949008a36a708f5934d21f2d882478Nicolas Capens return result; 35916c15744a34949008a36a708f5934d21f2d882478Nicolas Capens } 35926c15744a34949008a36a708f5934d21f2d882478Nicolas Capens else 35936c15744a34949008a36a708f5934d21f2d882478Nicolas Capens { 35946c15744a34949008a36a708f5934d21f2d882478Nicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16); 35956c15744a34949008a36a708f5934d21f2d882478Nicolas Capens const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::MultiplyHighSigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; 35966c15744a34949008a36a708f5934d21f2d882478Nicolas Capens auto target = ::context->getConstantUndef(Ice::IceType_i32); 35976c15744a34949008a36a708f5934d21f2d882478Nicolas Capens auto pmulhw = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic); 35986c15744a34949008a36a708f5934d21f2d882478Nicolas Capens pmulhw->addArg(x.value); 35996c15744a34949008a36a708f5934d21f2d882478Nicolas Capens pmulhw->addArg(y.value); 36006c15744a34949008a36a708f5934d21f2d882478Nicolas Capens ::basicBlock->appendInst(pmulhw); 36016c15744a34949008a36a708f5934d21f2d882478Nicolas Capens 36026c15744a34949008a36a708f5934d21f2d882478Nicolas Capens return RValue<Short4>(V(result)); 36036c15744a34949008a36a708f5934d21f2d882478Nicolas Capens } 3604598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3605598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3606598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int2> MulAdd(RValue<Short4> x, RValue<Short4> y) 3607598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3608afe27e9210a06b52a898cce60a4e8483a8f226a7Nicolas Capens if(emulateIntrinsics) 3609afe27e9210a06b52a898cce60a4e8483a8f226a7Nicolas Capens { 3610afe27e9210a06b52a898cce60a4e8483a8f226a7Nicolas Capens Int2 result; 3611afe27e9210a06b52a898cce60a4e8483a8f226a7Nicolas Capens result = Insert(result, Int(Extract(x, 0)) * Int(Extract(y, 0)) + Int(Extract(x, 1)) * Int(Extract(y, 1)), 0); 3612afe27e9210a06b52a898cce60a4e8483a8f226a7Nicolas Capens result = Insert(result, Int(Extract(x, 2)) * Int(Extract(y, 2)) + Int(Extract(x, 3)) * Int(Extract(y, 3)), 1); 3613afe27e9210a06b52a898cce60a4e8483a8f226a7Nicolas Capens 3614afe27e9210a06b52a898cce60a4e8483a8f226a7Nicolas Capens return result; 3615afe27e9210a06b52a898cce60a4e8483a8f226a7Nicolas Capens } 3616afe27e9210a06b52a898cce60a4e8483a8f226a7Nicolas Capens else 3617afe27e9210a06b52a898cce60a4e8483a8f226a7Nicolas Capens { 3618afe27e9210a06b52a898cce60a4e8483a8f226a7Nicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16); 3619afe27e9210a06b52a898cce60a4e8483a8f226a7Nicolas Capens const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::MultiplyAddPairs, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; 3620afe27e9210a06b52a898cce60a4e8483a8f226a7Nicolas Capens auto target = ::context->getConstantUndef(Ice::IceType_i32); 3621afe27e9210a06b52a898cce60a4e8483a8f226a7Nicolas Capens auto pmaddwd = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic); 3622afe27e9210a06b52a898cce60a4e8483a8f226a7Nicolas Capens pmaddwd->addArg(x.value); 3623afe27e9210a06b52a898cce60a4e8483a8f226a7Nicolas Capens pmaddwd->addArg(y.value); 3624afe27e9210a06b52a898cce60a4e8483a8f226a7Nicolas Capens ::basicBlock->appendInst(pmaddwd); 3625afe27e9210a06b52a898cce60a4e8483a8f226a7Nicolas Capens 3626afe27e9210a06b52a898cce60a4e8483a8f226a7Nicolas Capens return As<Int2>(V(result)); 3627afe27e9210a06b52a898cce60a4e8483a8f226a7Nicolas Capens } 3628598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3629598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 363033438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens RValue<SByte8> PackSigned(RValue<Short4> x, RValue<Short4> y) 3631598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 36328960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens if(emulateIntrinsics) 36338960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens { 36348960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens SByte8 result; 363533438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Extract(x, 0)), 0); 363633438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Extract(x, 1)), 1); 363733438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Extract(x, 2)), 2); 363833438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Extract(x, 3)), 3); 363933438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Extract(y, 0)), 4); 364033438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Extract(y, 1)), 5); 364133438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Extract(y, 2)), 6); 364233438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Extract(y, 3)), 7); 3643ec54a17ecc46a5b032ea620a0c455d1cbc3eb1bbNicolas Capens 36448960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens return result; 36458960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens } 36468960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens else 36478960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens { 36488960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_v16i8); 36498960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::VectorPackSigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; 36508960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens auto target = ::context->getConstantUndef(Ice::IceType_i32); 36518960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens auto pack = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic); 36528960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens pack->addArg(x.value); 36538960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens pack->addArg(y.value); 36548960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens ::basicBlock->appendInst(pack); 36558960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens 36568960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens return As<SByte8>(Swizzle(As<Int4>(V(result)), 0x88)); 36578960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens } 3658598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3659598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 366033438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens RValue<Byte8> PackUnsigned(RValue<Short4> x, RValue<Short4> y) 366133438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens { 366233438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens if(emulateIntrinsics) 366333438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens { 366433438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens Byte8 result; 366533438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateUnsigned(Extract(x, 0)), 0); 366633438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateUnsigned(Extract(x, 1)), 1); 366733438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateUnsigned(Extract(x, 2)), 2); 366833438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateUnsigned(Extract(x, 3)), 3); 366933438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateUnsigned(Extract(y, 0)), 4); 367033438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateUnsigned(Extract(y, 1)), 5); 367133438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateUnsigned(Extract(y, 2)), 6); 367233438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateUnsigned(Extract(y, 3)), 7); 367333438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens 367433438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens return result; 367533438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens } 367633438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens else 367733438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens { 367833438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_v16i8); 367933438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::VectorPackUnsigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; 368033438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens auto target = ::context->getConstantUndef(Ice::IceType_i32); 368133438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens auto pack = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic); 368233438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens pack->addArg(x.value); 368333438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens pack->addArg(y.value); 368433438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens ::basicBlock->appendInst(pack); 368533438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens 368633438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens return As<Byte8>(Swizzle(As<Int4>(V(result)), 0x88)); 368733438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens } 368833438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens } 368933438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens 3690598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int2> UnpackLow(RValue<Short4> x, RValue<Short4> y) 3691598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 369237fbecee519c3fc4502f48f42cced9797c85361fNicolas Capens int shuffle[8] = {0, 8, 1, 9, 2, 10, 3, 11}; // Real type is v8i16 3693bea4dce934c96284fb60f21c9a1698c86e1fd703Nicolas Capens return As<Int2>(Nucleus::createShuffleVector(x.value, y.value, shuffle)); 3694598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3695598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3696598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int2> UnpackHigh(RValue<Short4> x, RValue<Short4> y) 3697598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 369820e22c4b509a0f7d0fa6208e2974556e46ae8b62Nicolas Capens int shuffle[8] = {0, 8, 1, 9, 2, 10, 3, 11}; // Real type is v8i16 369920e22c4b509a0f7d0fa6208e2974556e46ae8b62Nicolas Capens auto lowHigh = RValue<Short8>(Nucleus::createShuffleVector(x.value, y.value, shuffle)); 370020e22c4b509a0f7d0fa6208e2974556e46ae8b62Nicolas Capens return As<Int2>(Swizzle(As<Int4>(lowHigh), 0xEE)); 3701598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3702598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3703598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short4> Swizzle(RValue<Short4> x, unsigned char select) 3704598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 370537fbecee519c3fc4502f48f42cced9797c85361fNicolas Capens // Real type is v8i16 370637fbecee519c3fc4502f48f42cced9797c85361fNicolas Capens int shuffle[8] = 370737fbecee519c3fc4502f48f42cced9797c85361fNicolas Capens { 370837fbecee519c3fc4502f48f42cced9797c85361fNicolas Capens (select >> 0) & 0x03, 370937fbecee519c3fc4502f48f42cced9797c85361fNicolas Capens (select >> 2) & 0x03, 371037fbecee519c3fc4502f48f42cced9797c85361fNicolas Capens (select >> 4) & 0x03, 371137fbecee519c3fc4502f48f42cced9797c85361fNicolas Capens (select >> 6) & 0x03, 371237fbecee519c3fc4502f48f42cced9797c85361fNicolas Capens (select >> 0) & 0x03, 371337fbecee519c3fc4502f48f42cced9797c85361fNicolas Capens (select >> 2) & 0x03, 371437fbecee519c3fc4502f48f42cced9797c85361fNicolas Capens (select >> 4) & 0x03, 371537fbecee519c3fc4502f48f42cced9797c85361fNicolas Capens (select >> 6) & 0x03, 371637fbecee519c3fc4502f48f42cced9797c85361fNicolas Capens }; 371737fbecee519c3fc4502f48f42cced9797c85361fNicolas Capens 371837fbecee519c3fc4502f48f42cced9797c85361fNicolas Capens return RValue<Short4>(Nucleus::createShuffleVector(x.value, x.value, shuffle)); 3719598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3720598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3721598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short4> Insert(RValue<Short4> val, RValue<Short> element, int i) 3722598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3723c94ab74f4570d4ce781645f6c4396778a15819c1Nicolas Capens return RValue<Short4>(Nucleus::createInsertElement(val.value, element.value, i)); 3724598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3725598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3726598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short> Extract(RValue<Short4> val, int i) 3727598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 37280133d0f58c48e66939bfc6924bbf76a45c2ec4c5Nicolas Capens return RValue<Short>(Nucleus::createExtractElement(val.value, Short::getType(), i)); 3729598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3730598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3731598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short4> CmpGT(RValue<Short4> x, RValue<Short4> y) 3732598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 37332f970b66add8414b15e6097a423ecc30181e66faNicolas Capens return RValue<Short4>(createIntCompare(Ice::InstIcmp::Sgt, x.value, y.value)); 3734598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3735598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3736598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short4> CmpEQ(RValue<Short4> x, RValue<Short4> y) 3737598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 37385e6ca097025a069d2c4da383a312ffcf35e44a19Nicolas Capens return RValue<Short4>(Nucleus::createICmpEQ(x.value, y.value)); 3739598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3740598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3741598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Type *Short4::getType() 3742598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 374323d99a4943f621bd09723c92ed012be233cd966cNicolas Capens return T(Type_v4i16); 3744598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3745598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3746598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UShort4::UShort4(RValue<Int4> cast) 3747598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3748598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens *this = Short4(cast); 3749598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3750598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3751598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UShort4::UShort4(RValue<Float4> cast, bool saturate) 3752598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3753d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens if(saturate) 3754d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens { 37559ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens if(CPUID::SSE4_1) 3756d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens { 3757091f350c0c1a18c7a05fa4b49ebb009e1710b3b8Nicolas Capens // x86 produces 0x80000000 on 32-bit integer overflow/underflow. 3758091f350c0c1a18c7a05fa4b49ebb009e1710b3b8Nicolas Capens // PackUnsigned takes care of 0x0000 saturation. 3759091f350c0c1a18c7a05fa4b49ebb009e1710b3b8Nicolas Capens Int4 int4(Min(cast, Float4(0xFFFF))); 3760091f350c0c1a18c7a05fa4b49ebb009e1710b3b8Nicolas Capens *this = As<UShort4>(PackUnsigned(int4, int4)); 3761091f350c0c1a18c7a05fa4b49ebb009e1710b3b8Nicolas Capens } 3762091f350c0c1a18c7a05fa4b49ebb009e1710b3b8Nicolas Capens else if(CPUID::ARM) 3763091f350c0c1a18c7a05fa4b49ebb009e1710b3b8Nicolas Capens { 3764091f350c0c1a18c7a05fa4b49ebb009e1710b3b8Nicolas Capens // ARM saturates the 32-bit integer result on overflow/undeflow. 3765091f350c0c1a18c7a05fa4b49ebb009e1710b3b8Nicolas Capens Int4 int4(cast); 376633438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens *this = As<UShort4>(PackUnsigned(int4, int4)); 3767d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens } 3768d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens else 3769d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens { 3770d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens *this = Short4(Int4(Max(Min(cast, Float4(0xFFFF)), Float4(0x0000)))); 3771d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens } 3772d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens } 3773d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens else 3774d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens { 3775d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens *this = Short4(Int4(cast)); 3776d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens } 3777598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3778598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3779598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UShort4::UShort4(unsigned short xyzw) 3780598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 37818dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens int64_t constantVector[4] = {xyzw, xyzw, xyzw, xyzw}; 37828dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens storeValue(Nucleus::createConstantVector(constantVector, getType())); 3783598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3784598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3785598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UShort4::UShort4(unsigned short x, unsigned short y, unsigned short z, unsigned short w) 3786598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 37878dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens int64_t constantVector[4] = {x, y, z, w}; 37888dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens storeValue(Nucleus::createConstantVector(constantVector, getType())); 3789598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3790598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3791598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UShort4::UShort4(RValue<UShort4> rhs) 3792598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3793598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 3794598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3795598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3796598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UShort4::UShort4(const UShort4 &rhs) 3797598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3798598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 3799598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 3800598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3801598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3802598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UShort4::UShort4(const Reference<UShort4> &rhs) 3803598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3804598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 3805598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 3806598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3807598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3808598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UShort4::UShort4(RValue<Short4> rhs) 3809598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3810598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 3811598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3812598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3813598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UShort4::UShort4(const Short4 &rhs) 3814598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3815598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 3816598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 3817598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3818598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3819598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UShort4::UShort4(const Reference<Short4> &rhs) 3820598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3821598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 3822598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 3823598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3824598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 382596d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UShort4> UShort4::operator=(RValue<UShort4> rhs) 3826598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3827598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 3828598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3829598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return rhs; 3830598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3831598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 383296d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UShort4> UShort4::operator=(const UShort4 &rhs) 3833598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3834598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 3835598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 3836598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3837598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UShort4>(value); 3838598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3839598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 384096d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UShort4> UShort4::operator=(const Reference<UShort4> &rhs) 3841598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3842598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 3843598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 3844598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3845598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UShort4>(value); 3846598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3847598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 384896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UShort4> UShort4::operator=(RValue<Short4> rhs) 3849598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3850598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 3851598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3852598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UShort4>(rhs); 3853598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3854598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 385596d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UShort4> UShort4::operator=(const Short4 &rhs) 3856598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3857598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 3858598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 3859598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3860598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UShort4>(value); 3861598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3862598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 386396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UShort4> UShort4::operator=(const Reference<Short4> &rhs) 3864598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3865598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 3866598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 3867598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3868598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UShort4>(value); 3869598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3870598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3871598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort4> operator+(RValue<UShort4> lhs, RValue<UShort4> rhs) 3872598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 38735b41ba36f7931a74e7406096cc1bc0460e01761eNicolas Capens return RValue<UShort4>(Nucleus::createAdd(lhs.value, rhs.value)); 3874598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3875598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3876598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort4> operator-(RValue<UShort4> lhs, RValue<UShort4> rhs) 3877598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3878c4c431d6f52859c2e20e42cc08ac51e060261a63Nicolas Capens return RValue<UShort4>(Nucleus::createSub(lhs.value, rhs.value)); 3879598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3880598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3881598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort4> operator*(RValue<UShort4> lhs, RValue<UShort4> rhs) 3882598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3883c4c431d6f52859c2e20e42cc08ac51e060261a63Nicolas Capens return RValue<UShort4>(Nucleus::createMul(lhs.value, rhs.value)); 388416b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens } 388516b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens 388616b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens RValue<UShort4> operator&(RValue<UShort4> lhs, RValue<UShort4> rhs) 388716b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens { 3888c4c431d6f52859c2e20e42cc08ac51e060261a63Nicolas Capens return RValue<UShort4>(Nucleus::createAnd(lhs.value, rhs.value)); 388916b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens } 389016b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens 389116b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens RValue<UShort4> operator|(RValue<UShort4> lhs, RValue<UShort4> rhs) 389216b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens { 3893c4c431d6f52859c2e20e42cc08ac51e060261a63Nicolas Capens return RValue<UShort4>(Nucleus::createOr(lhs.value, rhs.value)); 389416b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens } 389516b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens 389616b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens RValue<UShort4> operator^(RValue<UShort4> lhs, RValue<UShort4> rhs) 389716b5f15bbba60a7f89fc3c313588da86a4266869Nicolas Capens { 3898c4c431d6f52859c2e20e42cc08ac51e060261a63Nicolas Capens return RValue<UShort4>(Nucleus::createXor(lhs.value, rhs.value)); 3899598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3900598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 39018be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens RValue<UShort> Extract(RValue<UShort4> val, int i) 39028be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 39038be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return RValue<UShort>(Nucleus::createExtractElement(val.value, UShort::getType(), i)); 39048be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 39058be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens 39068be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens RValue<UShort4> Insert(RValue<UShort4> val, RValue<UShort> element, int i) 39078be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 39088be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return RValue<UShort4>(Nucleus::createInsertElement(val.value, element.value, i)); 39098be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 39108be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens 3911598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort4> operator<<(RValue<UShort4> lhs, unsigned char rhs) 3912598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 39138be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens if(emulateIntrinsics) 39148be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 39158be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens UShort4 result; 39168be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 0) << UShort(rhs), 0); 39178be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 1) << UShort(rhs), 1); 39188be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 2) << UShort(rhs), 2); 39198be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 3) << UShort(rhs), 3); 39208be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens 39218be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return result; 39228be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 39238be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens else 39248be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 39258be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return RValue<UShort4>(Nucleus::createShl(lhs.value, V(::context->getConstantInt32(rhs)))); 39268be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 3927598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3928598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3929598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort4> operator>>(RValue<UShort4> lhs, unsigned char rhs) 3930598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 39318be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens if(emulateIntrinsics) 39328be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 39338be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens UShort4 result; 39348be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 0) >> UShort(rhs), 0); 39358be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 1) >> UShort(rhs), 1); 39368be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 2) >> UShort(rhs), 2); 39378be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 3) >> UShort(rhs), 3); 39388be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens 39398be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return result; 39408be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 39418be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens else 39428be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 39438be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return RValue<UShort4>(Nucleus::createLShr(lhs.value, V(::context->getConstantInt32(rhs)))); 39448be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 3945598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3946598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 394796d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UShort4> operator<<=(UShort4 &lhs, unsigned char rhs) 3948598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3949598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs << rhs; 3950598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3951598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 395296d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UShort4> operator>>=(UShort4 &lhs, unsigned char rhs) 3953598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3954598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs >> rhs; 3955598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3956598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3957598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort4> operator~(RValue<UShort4> val) 3958598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 3959c5c0c335f2a2e8add573a3865d5b169b5b092dd8Nicolas Capens return RValue<UShort4>(Nucleus::createNot(val.value)); 3960598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3961598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3962598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort4> Max(RValue<UShort4> x, RValue<UShort4> y) 3963598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 396453a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens Ice::Variable *condition = ::function->makeVariable(Ice::IceType_v8i1); 396553a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Ule, condition, x.value, y.value); 396653a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens ::basicBlock->appendInst(cmp); 396753a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens 396853a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16); 396953a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens auto select = Ice::InstSelect::create(::function, result, condition, y.value, x.value); 397053a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens ::basicBlock->appendInst(select); 397153a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens 397253a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens return RValue<UShort4>(V(result)); 3973598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3974598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 3975598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort4> Min(RValue<UShort4> x, RValue<UShort4> y) 3976598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 397753a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens Ice::Variable *condition = ::function->makeVariable(Ice::IceType_v8i1); 397853a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Ugt, condition, x.value, y.value); 397953a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens ::basicBlock->appendInst(cmp); 398053a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens 398153a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16); 398253a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens auto select = Ice::InstSelect::create(::function, result, condition, y.value, x.value); 398353a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens ::basicBlock->appendInst(select); 398453a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens 398553a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens return RValue<UShort4>(V(result)); 3986598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 3987598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 39887f301812cb31acec219f155d96895c559053ae85Nicolas Capens RValue<UShort> SaturateUnsigned(RValue<Int> x) 39899843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens { 39909843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens return UShort(IfThenElse(x > 0xFFFF, Int(0xFFFF), IfThenElse(x < 0, Int(0), x))); 39919843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens } 39929843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens 3993598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort4> AddSat(RValue<UShort4> x, RValue<UShort4> y) 3994598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 39959843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens if(emulateIntrinsics) 39969843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens { 39979843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens UShort4 result; 39987f301812cb31acec219f155d96895c559053ae85Nicolas Capens result = Insert(result, SaturateUnsigned(Int(Extract(x, 0)) + Int(Extract(y, 0))), 0); 39997f301812cb31acec219f155d96895c559053ae85Nicolas Capens result = Insert(result, SaturateUnsigned(Int(Extract(x, 1)) + Int(Extract(y, 1))), 1); 40007f301812cb31acec219f155d96895c559053ae85Nicolas Capens result = Insert(result, SaturateUnsigned(Int(Extract(x, 2)) + Int(Extract(y, 2))), 2); 40017f301812cb31acec219f155d96895c559053ae85Nicolas Capens result = Insert(result, SaturateUnsigned(Int(Extract(x, 3)) + Int(Extract(y, 3))), 3); 4002c71bed2d8c33e694d0c468618df971b1763479b0Nicolas Capens 40039843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens return result; 40049843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens } 40059843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens else 40069843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens { 40079843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16); 40089843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::AddSaturateUnsigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; 40099843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens auto target = ::context->getConstantUndef(Ice::IceType_i32); 40109843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens auto paddusw = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic); 40119843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens paddusw->addArg(x.value); 40129843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens paddusw->addArg(y.value); 40139843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens ::basicBlock->appendInst(paddusw); 40149843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens 40159843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens return RValue<UShort4>(V(result)); 40169843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens } 4017598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4018598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4019598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort4> SubSat(RValue<UShort4> x, RValue<UShort4> y) 4020598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 40219843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens if(emulateIntrinsics) 40229843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens { 40239843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens UShort4 result; 40247f301812cb31acec219f155d96895c559053ae85Nicolas Capens result = Insert(result, SaturateUnsigned(Int(Extract(x, 0)) - Int(Extract(y, 0))), 0); 40257f301812cb31acec219f155d96895c559053ae85Nicolas Capens result = Insert(result, SaturateUnsigned(Int(Extract(x, 1)) - Int(Extract(y, 1))), 1); 40267f301812cb31acec219f155d96895c559053ae85Nicolas Capens result = Insert(result, SaturateUnsigned(Int(Extract(x, 2)) - Int(Extract(y, 2))), 2); 40277f301812cb31acec219f155d96895c559053ae85Nicolas Capens result = Insert(result, SaturateUnsigned(Int(Extract(x, 3)) - Int(Extract(y, 3))), 3); 4028c71bed2d8c33e694d0c468618df971b1763479b0Nicolas Capens 40299843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens return result; 40309843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens } 40319843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens else 40329843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens { 40339843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16); 40349843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::SubtractSaturateUnsigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; 40359843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens auto target = ::context->getConstantUndef(Ice::IceType_i32); 40369843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens auto psubusw = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic); 40379843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens psubusw->addArg(x.value); 40389843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens psubusw->addArg(y.value); 40399843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens ::basicBlock->appendInst(psubusw); 40409843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens 40419843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens return RValue<UShort4>(V(result)); 40429843673730ad6f70a212a41db3f56bf85276bc44Nicolas Capens } 4043598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4044598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4045598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort4> MulHigh(RValue<UShort4> x, RValue<UShort4> y) 4046598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 40476c15744a34949008a36a708f5934d21f2d882478Nicolas Capens if(emulateIntrinsics) 40486c15744a34949008a36a708f5934d21f2d882478Nicolas Capens { 40496c15744a34949008a36a708f5934d21f2d882478Nicolas Capens UShort4 result; 40506c15744a34949008a36a708f5934d21f2d882478Nicolas Capens result = Insert(result, UShort((UInt(Extract(x, 0)) * UInt(Extract(y, 0))) >> 16), 0); 40516c15744a34949008a36a708f5934d21f2d882478Nicolas Capens result = Insert(result, UShort((UInt(Extract(x, 1)) * UInt(Extract(y, 1))) >> 16), 1); 40526c15744a34949008a36a708f5934d21f2d882478Nicolas Capens result = Insert(result, UShort((UInt(Extract(x, 2)) * UInt(Extract(y, 2))) >> 16), 2); 40536c15744a34949008a36a708f5934d21f2d882478Nicolas Capens result = Insert(result, UShort((UInt(Extract(x, 3)) * UInt(Extract(y, 3))) >> 16), 3); 4054c71bed2d8c33e694d0c468618df971b1763479b0Nicolas Capens 40556c15744a34949008a36a708f5934d21f2d882478Nicolas Capens return result; 40566c15744a34949008a36a708f5934d21f2d882478Nicolas Capens } 40576c15744a34949008a36a708f5934d21f2d882478Nicolas Capens else 40586c15744a34949008a36a708f5934d21f2d882478Nicolas Capens { 40596c15744a34949008a36a708f5934d21f2d882478Nicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16); 40606c15744a34949008a36a708f5934d21f2d882478Nicolas Capens const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::MultiplyHighUnsigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; 40616c15744a34949008a36a708f5934d21f2d882478Nicolas Capens auto target = ::context->getConstantUndef(Ice::IceType_i32); 40626c15744a34949008a36a708f5934d21f2d882478Nicolas Capens auto pmulhuw = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic); 40636c15744a34949008a36a708f5934d21f2d882478Nicolas Capens pmulhuw->addArg(x.value); 40646c15744a34949008a36a708f5934d21f2d882478Nicolas Capens pmulhuw->addArg(y.value); 40656c15744a34949008a36a708f5934d21f2d882478Nicolas Capens ::basicBlock->appendInst(pmulhuw); 40666c15744a34949008a36a708f5934d21f2d882478Nicolas Capens 40676c15744a34949008a36a708f5934d21f2d882478Nicolas Capens return RValue<UShort4>(V(result)); 40686c15744a34949008a36a708f5934d21f2d882478Nicolas Capens } 4069598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4070598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4071598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort4> Average(RValue<UShort4> x, RValue<UShort4> y) 4072598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4073c37252c9efa50660790a22d1e8c5a39883f94022Nicolas Capens assert(false && "UNIMPLEMENTED"); return RValue<UShort4>(V(nullptr)); 4074598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4075598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4076598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Type *UShort4::getType() 4077598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 407823d99a4943f621bd09723c92ed012be233cd966cNicolas Capens return T(Type_v4i16); 4079598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4080598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 40813e7062b993c74700a403f46f01e0d55bfaed71dfNicolas Capens Short8::Short8(short c) 40823e7062b993c74700a403f46f01e0d55bfaed71dfNicolas Capens { 40833e7062b993c74700a403f46f01e0d55bfaed71dfNicolas Capens int64_t constantVector[8] = {c, c, c, c, c, c, c, c}; 40843e7062b993c74700a403f46f01e0d55bfaed71dfNicolas Capens storeValue(Nucleus::createConstantVector(constantVector, getType())); 40853e7062b993c74700a403f46f01e0d55bfaed71dfNicolas Capens } 40863e7062b993c74700a403f46f01e0d55bfaed71dfNicolas Capens 4087598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Short8::Short8(short c0, short c1, short c2, short c3, short c4, short c5, short c6, short c7) 4088598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 40898dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens int64_t constantVector[8] = {c0, c1, c2, c3, c4, c5, c6, c7}; 40908dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens storeValue(Nucleus::createConstantVector(constantVector, getType())); 4091598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4092598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4093598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Short8::Short8(RValue<Short8> rhs) 4094598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4095598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 4096598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4097598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4098598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Short8::Short8(const Reference<Short8> &rhs) 4099598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4100598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 4101598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 4102598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4103598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4104598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Short8::Short8(RValue<Short4> lo, RValue<Short4> hi) 4105598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4106c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens int shuffle[8] = {0, 1, 2, 3, 8, 9, 10, 11}; // Real type is v8i16 4107c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens Value *packed = Nucleus::createShuffleVector(lo.value, hi.value, shuffle); 4108c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens 4109c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens storeValue(packed); 4110598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4111598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4112598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short8> operator+(RValue<Short8> lhs, RValue<Short8> rhs) 4113598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4114598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Short8>(Nucleus::createAdd(lhs.value, rhs.value)); 4115598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4116598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4117598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short8> operator&(RValue<Short8> lhs, RValue<Short8> rhs) 4118598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4119598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Short8>(Nucleus::createAnd(lhs.value, rhs.value)); 4120598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4121598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 41228be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens RValue<Short> Extract(RValue<Short8> val, int i) 41238be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 41248be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return RValue<Short>(Nucleus::createExtractElement(val.value, Short::getType(), i)); 41258be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 41268be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens 41278be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens RValue<Short8> Insert(RValue<Short8> val, RValue<Short> element, int i) 41288be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 41298be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return RValue<Short8>(Nucleus::createInsertElement(val.value, element.value, i)); 41308be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 41318be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens 4132598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short8> operator<<(RValue<Short8> lhs, unsigned char rhs) 4133598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 41348be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens if(emulateIntrinsics) 41358be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 41368be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens Short8 result; 41378be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 0) << Short(rhs), 0); 41388be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 1) << Short(rhs), 1); 41398be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 2) << Short(rhs), 2); 41408be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 3) << Short(rhs), 3); 41418be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 4) << Short(rhs), 4); 41428be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 5) << Short(rhs), 5); 41438be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 6) << Short(rhs), 6); 41448be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 7) << Short(rhs), 7); 41458be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens 41468be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return result; 41478be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 41488be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens else 41498be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 41508be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return RValue<Short8>(Nucleus::createShl(lhs.value, V(::context->getConstantInt32(rhs)))); 41518be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 4152598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4153598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4154598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short8> operator>>(RValue<Short8> lhs, unsigned char rhs) 4155598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 41568be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens if(emulateIntrinsics) 41578be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 41588be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens Short8 result; 41598be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 0) >> Short(rhs), 0); 41608be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 1) >> Short(rhs), 1); 41618be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 2) >> Short(rhs), 2); 41628be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 3) >> Short(rhs), 3); 41638be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 4) >> Short(rhs), 4); 41648be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 5) >> Short(rhs), 5); 41658be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 6) >> Short(rhs), 6); 41668be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 7) >> Short(rhs), 7); 41678be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens 41688be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return result; 41698be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 41708be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens else 41718be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 41728be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return RValue<Short8>(Nucleus::createAShr(lhs.value, V(::context->getConstantInt32(rhs)))); 41738be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 4174598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4175598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4176598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> MulAdd(RValue<Short8> x, RValue<Short8> y) 4177598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4178c37252c9efa50660790a22d1e8c5a39883f94022Nicolas Capens assert(false && "UNIMPLEMENTED"); return RValue<Int4>(V(nullptr)); 4179598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4180598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4181598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> Abs(RValue<Int4> x) 4182598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 41838427224b0b9fb16613594714afbdd59877914ff1Nicolas Capens auto negative = x >> 31; 41848427224b0b9fb16613594714afbdd59877914ff1Nicolas Capens return (x ^ negative) - negative; 4185598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4186598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4187598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Short8> MulHigh(RValue<Short8> x, RValue<Short8> y) 4188598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4189c37252c9efa50660790a22d1e8c5a39883f94022Nicolas Capens assert(false && "UNIMPLEMENTED"); return RValue<Short8>(V(nullptr)); 4190598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4191598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4192598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Type *Short8::getType() 4193598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 41944cfd45760c4cc0fb821322a869a2979ca8226843Nicolas Capens return T(Ice::IceType_v8i16); 4195598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4196598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 41973e7062b993c74700a403f46f01e0d55bfaed71dfNicolas Capens UShort8::UShort8(unsigned short c) 41983e7062b993c74700a403f46f01e0d55bfaed71dfNicolas Capens { 41993e7062b993c74700a403f46f01e0d55bfaed71dfNicolas Capens int64_t constantVector[8] = {c, c, c, c, c, c, c, c}; 42003e7062b993c74700a403f46f01e0d55bfaed71dfNicolas Capens storeValue(Nucleus::createConstantVector(constantVector, getType())); 42013e7062b993c74700a403f46f01e0d55bfaed71dfNicolas Capens } 42023e7062b993c74700a403f46f01e0d55bfaed71dfNicolas Capens 4203598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 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) 4204598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 42058dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens int64_t constantVector[8] = {c0, c1, c2, c3, c4, c5, c6, c7}; 42068dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens storeValue(Nucleus::createConstantVector(constantVector, getType())); 4207598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4208598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4209598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UShort8::UShort8(RValue<UShort8> rhs) 4210598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4211598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 4212598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4213598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4214598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UShort8::UShort8(const Reference<UShort8> &rhs) 4215598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4216598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 4217598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 4218598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4219598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4220598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UShort8::UShort8(RValue<UShort4> lo, RValue<UShort4> hi) 4221598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4222c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens int shuffle[8] = {0, 1, 2, 3, 8, 9, 10, 11}; // Real type is v8i16 4223c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens Value *packed = Nucleus::createShuffleVector(lo.value, hi.value, shuffle); 4224c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens 4225c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens storeValue(packed); 4226598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4227598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 422896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UShort8> UShort8::operator=(RValue<UShort8> rhs) 4229598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4230598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 4231598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4232598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return rhs; 4233598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4234598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 423596d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UShort8> UShort8::operator=(const UShort8 &rhs) 4236598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4237598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 4238598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 4239598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4240598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UShort8>(value); 4241598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4242598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 424396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UShort8> UShort8::operator=(const Reference<UShort8> &rhs) 4244598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4245598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 4246598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 4247598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4248598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UShort8>(value); 4249598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4250598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4251598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort8> operator&(RValue<UShort8> lhs, RValue<UShort8> rhs) 4252598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4253598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UShort8>(Nucleus::createAnd(lhs.value, rhs.value)); 4254598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4255598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 42568be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens RValue<UShort> Extract(RValue<UShort8> val, int i) 42578be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 42588be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return RValue<UShort>(Nucleus::createExtractElement(val.value, UShort::getType(), i)); 42598be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 42608be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens 42618be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens RValue<UShort8> Insert(RValue<UShort8> val, RValue<UShort> element, int i) 42628be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 42638be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return RValue<UShort8>(Nucleus::createInsertElement(val.value, element.value, i)); 42648be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 42658be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens 4266598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort8> operator<<(RValue<UShort8> lhs, unsigned char rhs) 4267598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 42688be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens if(emulateIntrinsics) 42698be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 42708be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens UShort8 result; 42718be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 0) << UShort(rhs), 0); 42728be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 1) << UShort(rhs), 1); 42738be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 2) << UShort(rhs), 2); 42748be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 3) << UShort(rhs), 3); 42758be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 4) << UShort(rhs), 4); 42768be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 5) << UShort(rhs), 5); 42778be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 6) << UShort(rhs), 6); 42788be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 7) << UShort(rhs), 7); 42798be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens 42808be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return result; 42818be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 42828be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens else 42838be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 42848be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return RValue<UShort8>(Nucleus::createShl(lhs.value, V(::context->getConstantInt32(rhs)))); 42858be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 4286598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4287598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4288598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort8> operator>>(RValue<UShort8> lhs, unsigned char rhs) 4289598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 42908be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens if(emulateIntrinsics) 42918be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 42928be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens UShort8 result; 42938be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 0) >> UShort(rhs), 0); 42948be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 1) >> UShort(rhs), 1); 42958be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 2) >> UShort(rhs), 2); 42968be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 3) >> UShort(rhs), 3); 42978be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 4) >> UShort(rhs), 4); 42988be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 5) >> UShort(rhs), 5); 42998be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 6) >> UShort(rhs), 6); 43008be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 7) >> UShort(rhs), 7); 43018be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens 43028be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return result; 43038be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 43048be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens else 43058be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 43068be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return RValue<UShort8>(Nucleus::createLShr(lhs.value, V(::context->getConstantInt32(rhs)))); 43078be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 4308598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4309598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4310598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort8> operator+(RValue<UShort8> lhs, RValue<UShort8> rhs) 4311598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4312598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UShort8>(Nucleus::createAdd(lhs.value, rhs.value)); 4313598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4314598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4315598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort8> operator*(RValue<UShort8> lhs, RValue<UShort8> rhs) 4316598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4317598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UShort8>(Nucleus::createMul(lhs.value, rhs.value)); 4318598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4319598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 432096d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UShort8> operator+=(UShort8 &lhs, RValue<UShort8> rhs) 4321598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4322598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs + rhs; 4323598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4324598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4325598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort8> operator~(RValue<UShort8> val) 4326598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4327598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UShort8>(Nucleus::createNot(val.value)); 4328598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4329598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4330598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort8> Swizzle(RValue<UShort8> x, char select0, char select1, char select2, char select3, char select4, char select5, char select6, char select7) 4331598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4332c37252c9efa50660790a22d1e8c5a39883f94022Nicolas Capens assert(false && "UNIMPLEMENTED"); return RValue<UShort8>(V(nullptr)); 4333598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4334598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4335598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UShort8> MulHigh(RValue<UShort8> x, RValue<UShort8> y) 4336598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4337c37252c9efa50660790a22d1e8c5a39883f94022Nicolas Capens assert(false && "UNIMPLEMENTED"); return RValue<UShort8>(V(nullptr)); 4338598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4339598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4340598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens // FIXME: Implement as Shuffle(x, y, Select(i0, ..., i16)) and Shuffle(x, y, SELECT_PACK_REPEAT(element)) 4341598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// RValue<UShort8> PackRepeat(RValue<Byte16> x, RValue<Byte16> y, int element) 4342598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 4343c37252c9efa50660790a22d1e8c5a39883f94022Nicolas Capens// assert(false && "UNIMPLEMENTED"); return RValue<UShort8>(V(nullptr)); 4344598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 4345598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4346598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Type *UShort8::getType() 4347598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 43484cfd45760c4cc0fb821322a869a2979ca8226843Nicolas Capens return T(Ice::IceType_v8i16); 4349598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4350598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4351598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Int::Int(Argument<Int> argument) 4352598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4353598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(argument.value); 4354598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4355598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4356598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Int::Int(RValue<Byte> cast) 4357598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4358598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *integer = Nucleus::createZExt(cast.value, Int::getType()); 4359598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4360598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(integer); 4361598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4362598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4363598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Int::Int(RValue<SByte> cast) 4364598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4365598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *integer = Nucleus::createSExt(cast.value, Int::getType()); 4366598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4367598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(integer); 4368598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4369598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4370598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Int::Int(RValue<Short> cast) 4371598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4372598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *integer = Nucleus::createSExt(cast.value, Int::getType()); 4373598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4374598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(integer); 4375598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4376598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4377598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Int::Int(RValue<UShort> cast) 4378598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4379598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *integer = Nucleus::createZExt(cast.value, Int::getType()); 4380598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4381598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(integer); 4382598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4383598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4384598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Int::Int(RValue<Int2> cast) 4385598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4386598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens *this = Extract(cast, 0); 4387598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4388598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4389598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Int::Int(RValue<Long> cast) 4390598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4391598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *integer = Nucleus::createTrunc(cast.value, Int::getType()); 4392598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4393598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(integer); 4394598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4395598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4396598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Int::Int(RValue<Float> cast) 4397598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4398598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *integer = Nucleus::createFPToSI(cast.value, Int::getType()); 4399598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4400598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(integer); 4401598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4402598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4403598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Int::Int(int x) 4404598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4405598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(Nucleus::createConstantInt(x)); 4406598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4407598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4408598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Int::Int(RValue<Int> rhs) 4409598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4410598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 4411598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4412598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4413598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Int::Int(RValue<UInt> rhs) 4414598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4415598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 4416598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4417598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4418598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Int::Int(const Int &rhs) 4419598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4420598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 4421598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 4422598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4423598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4424598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Int::Int(const Reference<Int> &rhs) 4425598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4426598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 4427598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 4428598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4429598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4430598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Int::Int(const UInt &rhs) 4431598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4432598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 4433598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 4434598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4435598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4436598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Int::Int(const Reference<UInt> &rhs) 4437598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4438598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 4439598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 4440598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4441598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 444296d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int> Int::operator=(int rhs) 4443598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4444598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int>(storeValue(Nucleus::createConstantInt(rhs))); 4445598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4446598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 444796d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int> Int::operator=(RValue<Int> rhs) 4448598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4449598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 4450598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4451598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return rhs; 4452598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4453598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 445496d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int> Int::operator=(RValue<UInt> rhs) 4455598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4456598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 4457598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4458598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int>(rhs); 4459598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4460598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 446196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int> Int::operator=(const Int &rhs) 4462598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4463598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 4464598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 4465598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4466598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int>(value); 4467598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4468598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 446996d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int> Int::operator=(const Reference<Int> &rhs) 4470598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4471598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 4472598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 4473598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4474598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int>(value); 4475598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4476598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 447796d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int> Int::operator=(const UInt &rhs) 4478598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4479598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 4480598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 4481598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4482598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int>(value); 4483598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4484598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 448596d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int> Int::operator=(const Reference<UInt> &rhs) 4486598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4487598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 4488598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 4489598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4490598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int>(value); 4491598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4492598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4493598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int> operator+(RValue<Int> lhs, RValue<Int> rhs) 4494598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4495598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int>(Nucleus::createAdd(lhs.value, rhs.value)); 4496598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4497598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4498598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int> operator-(RValue<Int> lhs, RValue<Int> rhs) 4499598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4500598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int>(Nucleus::createSub(lhs.value, rhs.value)); 4501598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4502598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4503598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int> operator*(RValue<Int> lhs, RValue<Int> rhs) 4504598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4505598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int>(Nucleus::createMul(lhs.value, rhs.value)); 4506598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4507598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4508598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int> operator/(RValue<Int> lhs, RValue<Int> rhs) 4509598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4510598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int>(Nucleus::createSDiv(lhs.value, rhs.value)); 4511598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4512598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4513598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int> operator%(RValue<Int> lhs, RValue<Int> rhs) 4514598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4515598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int>(Nucleus::createSRem(lhs.value, rhs.value)); 4516598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4517598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4518598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int> operator&(RValue<Int> lhs, RValue<Int> rhs) 4519598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4520598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int>(Nucleus::createAnd(lhs.value, rhs.value)); 4521598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4522598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4523598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int> operator|(RValue<Int> lhs, RValue<Int> rhs) 4524598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4525598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int>(Nucleus::createOr(lhs.value, rhs.value)); 4526598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4527598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4528598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int> operator^(RValue<Int> lhs, RValue<Int> rhs) 4529598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4530598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int>(Nucleus::createXor(lhs.value, rhs.value)); 4531598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4532598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4533598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int> operator<<(RValue<Int> lhs, RValue<Int> rhs) 4534598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4535598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int>(Nucleus::createShl(lhs.value, rhs.value)); 4536598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4537598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4538598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int> operator>>(RValue<Int> lhs, RValue<Int> rhs) 4539598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4540598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int>(Nucleus::createAShr(lhs.value, rhs.value)); 4541598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4542598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 454396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int> operator+=(Int &lhs, RValue<Int> rhs) 4544598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4545598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs + rhs; 4546598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4547598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 454896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int> operator-=(Int &lhs, RValue<Int> rhs) 4549598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4550598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs - rhs; 4551598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4552598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 455396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int> operator*=(Int &lhs, RValue<Int> rhs) 4554598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4555598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs * rhs; 4556598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4557598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 455896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int> operator/=(Int &lhs, RValue<Int> rhs) 4559598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4560598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs / rhs; 4561598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4562598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 456396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int> operator%=(Int &lhs, RValue<Int> rhs) 4564598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4565598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs % rhs; 4566598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4567598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 456896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int> operator&=(Int &lhs, RValue<Int> rhs) 4569598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4570598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs & rhs; 4571598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4572598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 457396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int> operator|=(Int &lhs, RValue<Int> rhs) 4574598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4575598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs | rhs; 4576598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4577598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 457896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int> operator^=(Int &lhs, RValue<Int> rhs) 4579598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4580598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs ^ rhs; 4581598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4582598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 458396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int> operator<<=(Int &lhs, RValue<Int> rhs) 4584598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4585598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs << rhs; 4586598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4587598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 458896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int> operator>>=(Int &lhs, RValue<Int> rhs) 4589598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4590598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs >> rhs; 4591598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4592598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4593598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int> operator+(RValue<Int> val) 4594598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4595598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return val; 4596598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4597598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4598598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int> operator-(RValue<Int> val) 4599598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4600598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int>(Nucleus::createNeg(val.value)); 4601598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4602598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4603598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int> operator~(RValue<Int> val) 4604598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4605598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int>(Nucleus::createNot(val.value)); 4606598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4607598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 460896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int> operator++(Int &val, int) // Post-increment 4609598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 46105b41ba36f7931a74e7406096cc1bc0460e01761eNicolas Capens RValue<Int> res = val; 4611d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens val += 1; 4612d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens return res; 4613598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4614598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 461596d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens const Int &operator++(Int &val) // Pre-increment 4616598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4617d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens val += 1; 4618d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens return val; 4619598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4620598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 462196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int> operator--(Int &val, int) // Post-decrement 4622598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4623d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens RValue<Int> res = val; 4624d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens val -= 1; 4625d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens return res; 4626598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4627598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 462896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens const Int &operator--(Int &val) // Pre-decrement 4629598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4630d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens val -= 1; 4631d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens return val; 4632598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4633598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4634598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator<(RValue<Int> lhs, RValue<Int> rhs) 4635598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4636598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpSLT(lhs.value, rhs.value)); 4637598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4638598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4639598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator<=(RValue<Int> lhs, RValue<Int> rhs) 4640598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4641598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpSLE(lhs.value, rhs.value)); 4642598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4643598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4644598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator>(RValue<Int> lhs, RValue<Int> rhs) 4645598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4646598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpSGT(lhs.value, rhs.value)); 4647598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4648598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4649598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator>=(RValue<Int> lhs, RValue<Int> rhs) 4650598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4651598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpSGE(lhs.value, rhs.value)); 4652598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4653598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4654598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator!=(RValue<Int> lhs, RValue<Int> rhs) 4655598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4656598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value)); 4657598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4658598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4659598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator==(RValue<Int> lhs, RValue<Int> rhs) 4660598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4661598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value)); 4662598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4663598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4664598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int> Max(RValue<Int> x, RValue<Int> y) 4665598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4666598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return IfThenElse(x > y, x, y); 4667598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4668598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4669598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int> Min(RValue<Int> x, RValue<Int> y) 4670598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4671598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return IfThenElse(x < y, x, y); 4672598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4673598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4674598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int> Clamp(RValue<Int> x, RValue<Int> min, RValue<Int> max) 4675598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4676598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return Min(Max(x, min), max); 4677598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4678598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4679598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int> RoundInt(RValue<Float> cast) 4680598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4681091f350c0c1a18c7a05fa4b49ebb009e1710b3b8Nicolas Capens if(emulateIntrinsics || CPUID::ARM) 4682f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens { 4683f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens // Push the fractional part off the mantissa. Accurate up to +/-2^22. 4684f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens return Int((cast + Float(0x00C00000)) - Float(0x00C00000)); 4685f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens } 4686f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens else 4687f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens { 4688f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_i32); 4689f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::Nearbyint, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; 4690f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens auto target = ::context->getConstantUndef(Ice::IceType_i32); 4691f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens auto nearbyint = Ice::InstIntrinsicCall::create(::function, 1, result, target, intrinsic); 4692f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens nearbyint->addArg(cast.value); 4693f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens ::basicBlock->appendInst(nearbyint); 4694a8086514024d968e68c9eb82a52baac794881e59Nicolas Capens 4695f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens return RValue<Int>(V(result)); 4696f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens } 4697598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4698598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4699598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Type *Int::getType() 4700598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4701598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return T(Ice::IceType_i32); 4702598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4703598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4704598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Long::Long(RValue<Int> cast) 4705598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4706598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *integer = Nucleus::createSExt(cast.value, Long::getType()); 4707598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4708598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(integer); 4709598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4710598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4711598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Long::Long(RValue<UInt> cast) 4712598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4713598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *integer = Nucleus::createZExt(cast.value, Long::getType()); 4714598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4715598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(integer); 4716598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4717598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4718598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Long::Long(RValue<Long> rhs) 4719598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4720598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 4721598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4722598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 472396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Long> Long::operator=(int64_t rhs) 4724598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 472513ac2327184133f5a69584ff2d69bc2cdeec1457Nicolas Capens return RValue<Long>(storeValue(Nucleus::createConstantLong(rhs))); 4726598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4727598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 472896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Long> Long::operator=(RValue<Long> rhs) 4729598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4730598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 4731598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4732598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return rhs; 4733598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4734598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 473596d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Long> Long::operator=(const Long &rhs) 4736598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4737598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 4738598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 4739598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4740598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Long>(value); 4741598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4742598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 474396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Long> Long::operator=(const Reference<Long> &rhs) 4744598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4745598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 4746598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 4747598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4748598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Long>(value); 4749598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4750598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4751598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Long> operator+(RValue<Long> lhs, RValue<Long> rhs) 4752598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4753598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Long>(Nucleus::createAdd(lhs.value, rhs.value)); 4754598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4755598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4756598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Long> operator-(RValue<Long> lhs, RValue<Long> rhs) 4757598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4758598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Long>(Nucleus::createSub(lhs.value, rhs.value)); 4759598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4760598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 476196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Long> operator+=(Long &lhs, RValue<Long> rhs) 4762598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4763598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs + rhs; 4764598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4765598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 476696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Long> operator-=(Long &lhs, RValue<Long> rhs) 4767598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4768598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs - rhs; 4769598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4770598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4771598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Long> AddAtomic(RValue<Pointer<Long> > x, RValue<Long> y) 4772598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4773598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Long>(Nucleus::createAtomicAdd(x.value, y.value)); 4774598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4775598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4776598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Type *Long::getType() 4777598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 47784cfd45760c4cc0fb821322a869a2979ca8226843Nicolas Capens return T(Ice::IceType_i64); 4779598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4780598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4781598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UInt::UInt(Argument<UInt> argument) 4782598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4783598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(argument.value); 4784598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4785598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4786598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UInt::UInt(RValue<UShort> cast) 4787598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4788598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *integer = Nucleus::createZExt(cast.value, UInt::getType()); 4789598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4790598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(integer); 4791598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4792598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4793598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UInt::UInt(RValue<Long> cast) 4794598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4795598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *integer = Nucleus::createTrunc(cast.value, UInt::getType()); 4796598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4797598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(integer); 4798598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4799598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4800598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UInt::UInt(RValue<Float> cast) 4801598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4802c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens // Smallest positive value representable in UInt, but not in Int 4803c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens const unsigned int ustart = 0x80000000u; 4804c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens const float ustartf = float(ustart); 4805c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens 4806c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens // If the value is negative, store 0, otherwise store the result of the conversion 4807c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens storeValue((~(As<Int>(cast) >> 31) & 4808c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens // Check if the value can be represented as an Int 4809c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens IfThenElse(cast >= ustartf, 4810c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens // If the value is too large, subtract ustart and re-add it after conversion. 4811c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens As<Int>(As<UInt>(Int(cast - Float(ustartf))) + UInt(ustart)), 4812c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens // Otherwise, just convert normally 4813c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens Int(cast))).value); 4814598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4815598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4816598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UInt::UInt(int x) 4817598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4818598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(Nucleus::createConstantInt(x)); 4819598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4820598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4821598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UInt::UInt(unsigned int x) 4822598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4823598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(Nucleus::createConstantInt(x)); 4824598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4825598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4826598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UInt::UInt(RValue<UInt> rhs) 4827598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4828598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 4829598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4830598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4831598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UInt::UInt(RValue<Int> rhs) 4832598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4833598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 4834598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4835598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4836598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UInt::UInt(const UInt &rhs) 4837598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4838598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 4839598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 4840598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4841598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4842598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UInt::UInt(const Reference<UInt> &rhs) 4843598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4844598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 4845598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 4846598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4847598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4848598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UInt::UInt(const Int &rhs) 4849598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4850598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 4851598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 4852598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4853598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4854598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UInt::UInt(const Reference<Int> &rhs) 4855598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4856598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 4857598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 4858598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4859598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 486096d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt> UInt::operator=(unsigned int rhs) 4861598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4862598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt>(storeValue(Nucleus::createConstantInt(rhs))); 4863598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4864598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 486596d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt> UInt::operator=(RValue<UInt> rhs) 4866598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4867598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 4868598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4869598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return rhs; 4870598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4871598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 487296d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt> UInt::operator=(RValue<Int> rhs) 4873598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4874598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 4875598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4876598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt>(rhs); 4877598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4878598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 487996d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt> UInt::operator=(const UInt &rhs) 4880598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4881598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 4882598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 4883598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4884598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt>(value); 4885598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4886598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 488796d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt> UInt::operator=(const Reference<UInt> &rhs) 4888598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4889598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 4890598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 4891598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4892598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt>(value); 4893598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4894598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 489596d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt> UInt::operator=(const Int &rhs) 4896598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4897598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 4898598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 4899598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4900598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt>(value); 4901598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4902598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 490396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt> UInt::operator=(const Reference<Int> &rhs) 4904598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4905598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 4906598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 4907598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4908598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt>(value); 4909598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4910598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4911598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt> operator+(RValue<UInt> lhs, RValue<UInt> rhs) 4912598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4913598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt>(Nucleus::createAdd(lhs.value, rhs.value)); 4914598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4915598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4916598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt> operator-(RValue<UInt> lhs, RValue<UInt> rhs) 4917598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4918598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt>(Nucleus::createSub(lhs.value, rhs.value)); 4919598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4920598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4921598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt> operator*(RValue<UInt> lhs, RValue<UInt> rhs) 4922598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4923598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt>(Nucleus::createMul(lhs.value, rhs.value)); 4924598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4925598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4926598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt> operator/(RValue<UInt> lhs, RValue<UInt> rhs) 4927598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4928598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt>(Nucleus::createUDiv(lhs.value, rhs.value)); 4929598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4930598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4931598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt> operator%(RValue<UInt> lhs, RValue<UInt> rhs) 4932598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4933598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt>(Nucleus::createURem(lhs.value, rhs.value)); 4934598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4935598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4936598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt> operator&(RValue<UInt> lhs, RValue<UInt> rhs) 4937598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4938598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt>(Nucleus::createAnd(lhs.value, rhs.value)); 4939598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4940598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4941598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt> operator|(RValue<UInt> lhs, RValue<UInt> rhs) 4942598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4943598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt>(Nucleus::createOr(lhs.value, rhs.value)); 4944598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4945598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4946598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt> operator^(RValue<UInt> lhs, RValue<UInt> rhs) 4947598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4948598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt>(Nucleus::createXor(lhs.value, rhs.value)); 4949598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4950598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4951598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt> operator<<(RValue<UInt> lhs, RValue<UInt> rhs) 4952598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4953598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt>(Nucleus::createShl(lhs.value, rhs.value)); 4954598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4955598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 4956598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt> operator>>(RValue<UInt> lhs, RValue<UInt> rhs) 4957598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4958598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt>(Nucleus::createLShr(lhs.value, rhs.value)); 4959598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4960598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 496196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt> operator+=(UInt &lhs, RValue<UInt> rhs) 4962598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4963598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs + rhs; 4964598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4965598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 496696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt> operator-=(UInt &lhs, RValue<UInt> rhs) 4967598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4968598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs - rhs; 4969598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4970598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 497196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt> operator*=(UInt &lhs, RValue<UInt> rhs) 4972598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4973598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs * rhs; 4974598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4975598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 497696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt> operator/=(UInt &lhs, RValue<UInt> rhs) 4977598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4978598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs / rhs; 4979598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4980598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 498196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt> operator%=(UInt &lhs, RValue<UInt> rhs) 4982598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4983598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs % rhs; 4984598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4985598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 498696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt> operator&=(UInt &lhs, RValue<UInt> rhs) 4987598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4988598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs & rhs; 4989598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4990598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 499196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt> operator|=(UInt &lhs, RValue<UInt> rhs) 4992598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4993598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs | rhs; 4994598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 4995598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 499696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt> operator^=(UInt &lhs, RValue<UInt> rhs) 4997598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 4998598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs ^ rhs; 4999598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5000598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 500196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt> operator<<=(UInt &lhs, RValue<UInt> rhs) 5002598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5003598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs << rhs; 5004598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5005598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 500696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt> operator>>=(UInt &lhs, RValue<UInt> rhs) 5007598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5008598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs >> rhs; 5009598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5010598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5011598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt> operator+(RValue<UInt> val) 5012598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5013598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return val; 5014598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5015598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5016598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt> operator-(RValue<UInt> val) 5017598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5018598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt>(Nucleus::createNeg(val.value)); 5019598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5020598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5021598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt> operator~(RValue<UInt> val) 5022598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5023598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt>(Nucleus::createNot(val.value)); 5024598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5025598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 502696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt> operator++(UInt &val, int) // Post-increment 5027598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5028d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens RValue<UInt> res = val; 5029d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens val += 1; 5030d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens return res; 5031598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5032598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 503396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens const UInt &operator++(UInt &val) // Pre-increment 5034598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5035d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens val += 1; 5036d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens return val; 5037598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5038598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 503996d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt> operator--(UInt &val, int) // Post-decrement 5040598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5041d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens RValue<UInt> res = val; 5042d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens val -= 1; 5043d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens return res; 5044598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5045598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 504696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens const UInt &operator--(UInt &val) // Pre-decrement 5047598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5048d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens val -= 1; 5049d122940e6876425c0a73dbbe172bc2111a278dd7Nicolas Capens return val; 5050598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5051598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5052598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt> Max(RValue<UInt> x, RValue<UInt> y) 5053598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5054598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return IfThenElse(x > y, x, y); 5055598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5056598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5057598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt> Min(RValue<UInt> x, RValue<UInt> y) 5058598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5059598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return IfThenElse(x < y, x, y); 5060598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5061598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5062598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt> Clamp(RValue<UInt> x, RValue<UInt> min, RValue<UInt> max) 5063598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5064598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return Min(Max(x, min), max); 5065598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5066598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5067598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator<(RValue<UInt> lhs, RValue<UInt> rhs) 5068598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5069598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpULT(lhs.value, rhs.value)); 5070598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5071598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5072598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator<=(RValue<UInt> lhs, RValue<UInt> rhs) 5073598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5074598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpULE(lhs.value, rhs.value)); 5075598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5076598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5077598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator>(RValue<UInt> lhs, RValue<UInt> rhs) 5078598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5079598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpUGT(lhs.value, rhs.value)); 5080598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5081598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5082598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator>=(RValue<UInt> lhs, RValue<UInt> rhs) 5083598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5084598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpUGE(lhs.value, rhs.value)); 5085598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5086598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5087598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator!=(RValue<UInt> lhs, RValue<UInt> rhs) 5088598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5089598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value)); 5090598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5091598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5092598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator==(RValue<UInt> lhs, RValue<UInt> rhs) 5093598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5094598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value)); 5095598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5096598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5097598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// RValue<UInt> RoundUInt(RValue<Float> cast) 5098598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 5099c37252c9efa50660790a22d1e8c5a39883f94022Nicolas Capens// assert(false && "UNIMPLEMENTED"); return RValue<UInt>(V(nullptr)); 5100598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 5101598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5102598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Type *UInt::getType() 5103598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 51044cfd45760c4cc0fb821322a869a2979ca8226843Nicolas Capens return T(Ice::IceType_i32); 5105598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5106598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5107598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// Int2::Int2(RValue<Int> cast) 5108598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 5109598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// Value *extend = Nucleus::createZExt(cast.value, Long::getType()); 5110598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// Value *vector = Nucleus::createBitCast(extend, Int2::getType()); 5111598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// 5112598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// Constant *shuffle[2]; 5113598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// shuffle[0] = Nucleus::createConstantInt(0); 5114598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// shuffle[1] = Nucleus::createConstantInt(0); 5115598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// 5116598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// Value *replicate = Nucleus::createShuffleVector(vector, UndefValue::get(Int2::getType()), Nucleus::createConstantVector(shuffle, 2)); 5117598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// 5118598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// storeValue(replicate); 5119598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 5120598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5121598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Int2::Int2(RValue<Int4> cast) 5122598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 51232200878636ca416caedebec3b1d8c2734a0b64f3Nicolas Capens storeValue(Nucleus::createBitCast(cast.value, getType())); 5124598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5125598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5126598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Int2::Int2(int x, int y) 5127598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 51288dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens int64_t constantVector[2] = {x, y}; 51298dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens storeValue(Nucleus::createConstantVector(constantVector, getType())); 5130598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5131598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5132598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Int2::Int2(RValue<Int2> rhs) 5133598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5134598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 5135598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5136598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5137598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Int2::Int2(const Int2 &rhs) 5138598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5139598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 5140598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 5141598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5142598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5143598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Int2::Int2(const Reference<Int2> &rhs) 5144598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5145598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 5146598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 5147598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5148598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5149598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Int2::Int2(RValue<Int> lo, RValue<Int> hi) 5150598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5151d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens int shuffle[4] = {0, 4, 1, 5}; 5152d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens Value *packed = Nucleus::createShuffleVector(Int4(lo).loadValue(), Int4(hi).loadValue(), shuffle); 5153d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens 5154d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens storeValue(Nucleus::createBitCast(packed, Int2::getType())); 5155598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5156598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 515796d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int2> Int2::operator=(RValue<Int2> rhs) 5158598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5159598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 5160598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5161598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return rhs; 5162598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5163598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 516496d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int2> Int2::operator=(const Int2 &rhs) 5165598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5166598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 5167598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 5168598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5169598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int2>(value); 5170598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5171598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 517296d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int2> Int2::operator=(const Reference<Int2> &rhs) 5173598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5174598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 5175598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 5176598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5177598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int2>(value); 5178598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5179598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5180598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int2> operator+(RValue<Int2> lhs, RValue<Int2> rhs) 5181598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5182c4c431d6f52859c2e20e42cc08ac51e060261a63Nicolas Capens return RValue<Int2>(Nucleus::createAdd(lhs.value, rhs.value)); 5183598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5184598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5185598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int2> operator-(RValue<Int2> lhs, RValue<Int2> rhs) 5186598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5187c4c431d6f52859c2e20e42cc08ac51e060261a63Nicolas Capens return RValue<Int2>(Nucleus::createSub(lhs.value, rhs.value)); 5188598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5189598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5190598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// RValue<Int2> operator*(RValue<Int2> lhs, RValue<Int2> rhs) 5191598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 5192598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return RValue<Int2>(Nucleus::createMul(lhs.value, rhs.value)); 5193598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 5194598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5195598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// RValue<Int2> operator/(RValue<Int2> lhs, RValue<Int2> rhs) 5196598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 5197598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return RValue<Int2>(Nucleus::createSDiv(lhs.value, rhs.value)); 5198598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 5199598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5200598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// RValue<Int2> operator%(RValue<Int2> lhs, RValue<Int2> rhs) 5201598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 5202598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return RValue<Int2>(Nucleus::createSRem(lhs.value, rhs.value)); 5203598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 5204598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5205598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int2> operator&(RValue<Int2> lhs, RValue<Int2> rhs) 5206598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5207c4c431d6f52859c2e20e42cc08ac51e060261a63Nicolas Capens return RValue<Int2>(Nucleus::createAnd(lhs.value, rhs.value)); 5208598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5209598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5210598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int2> operator|(RValue<Int2> lhs, RValue<Int2> rhs) 5211598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5212c4c431d6f52859c2e20e42cc08ac51e060261a63Nicolas Capens return RValue<Int2>(Nucleus::createOr(lhs.value, rhs.value)); 5213598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5214598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5215598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int2> operator^(RValue<Int2> lhs, RValue<Int2> rhs) 5216598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5217c4c431d6f52859c2e20e42cc08ac51e060261a63Nicolas Capens return RValue<Int2>(Nucleus::createXor(lhs.value, rhs.value)); 5218598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5219598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5220598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int2> operator<<(RValue<Int2> lhs, unsigned char rhs) 5221598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 52228be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens if(emulateIntrinsics) 52238be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 52248be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens Int2 result; 52258be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 0) << Int(rhs), 0); 52268be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 1) << Int(rhs), 1); 52278be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens 52288be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return result; 52298be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 52308be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens else 52318be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 52328be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return RValue<Int2>(Nucleus::createShl(lhs.value, V(::context->getConstantInt32(rhs)))); 52338be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 5234598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5235598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5236598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int2> operator>>(RValue<Int2> lhs, unsigned char rhs) 5237598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 52388be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens if(emulateIntrinsics) 52398be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 52408be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens Int2 result; 52418be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 0) >> Int(rhs), 0); 52428be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 1) >> Int(rhs), 1); 52438be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens 52448be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return result; 52458be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 52468be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens else 52478be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 52488be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return RValue<Int2>(Nucleus::createAShr(lhs.value, V(::context->getConstantInt32(rhs)))); 52498be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 5250598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5251598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 525296d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int2> operator+=(Int2 &lhs, RValue<Int2> rhs) 5253598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5254598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs + rhs; 5255598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5256598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 525796d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int2> operator-=(Int2 &lhs, RValue<Int2> rhs) 5258598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5259598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs - rhs; 5260598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5261598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 526296d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens// RValue<Int2> operator*=(Int2 &lhs, RValue<Int2> rhs) 5263598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 5264598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return lhs = lhs * rhs; 5265598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 5266598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 526796d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens// RValue<Int2> operator/=(Int2 &lhs, RValue<Int2> rhs) 5268598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 5269598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return lhs = lhs / rhs; 5270598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 5271598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 527296d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens// RValue<Int2> operator%=(Int2 &lhs, RValue<Int2> rhs) 5273598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 5274598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return lhs = lhs % rhs; 5275598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 5276598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 527796d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int2> operator&=(Int2 &lhs, RValue<Int2> rhs) 5278598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5279598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs & rhs; 5280598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5281598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 528296d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int2> operator|=(Int2 &lhs, RValue<Int2> rhs) 5283598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5284598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs | rhs; 5285598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5286598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 528796d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int2> operator^=(Int2 &lhs, RValue<Int2> rhs) 5288598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5289598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs ^ rhs; 5290598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5291598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 529296d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int2> operator<<=(Int2 &lhs, unsigned char rhs) 5293598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5294598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs << rhs; 5295598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5296598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 529796d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int2> operator>>=(Int2 &lhs, unsigned char rhs) 5298598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5299598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs >> rhs; 5300598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5301598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5302598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// RValue<Int2> operator+(RValue<Int2> val) 5303598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 5304598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return val; 5305598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 5306598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5307598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// RValue<Int2> operator-(RValue<Int2> val) 5308598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 5309598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return RValue<Int2>(Nucleus::createNeg(val.value)); 5310598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 5311598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5312598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int2> operator~(RValue<Int2> val) 5313598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5314c5c0c335f2a2e8add573a3865d5b169b5b092dd8Nicolas Capens return RValue<Int2>(Nucleus::createNot(val.value)); 5315598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5316598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 531745f187a368c383d2f44f369b965d361e1ce33e44Nicolas Capens RValue<Short4> UnpackLow(RValue<Int2> x, RValue<Int2> y) 5318598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5319c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens int shuffle[4] = {0, 4, 1, 5}; // Real type is v4i32 5320c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens return As<Short4>(Nucleus::createShuffleVector(x.value, y.value, shuffle)); 5321598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5322598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 532345f187a368c383d2f44f369b965d361e1ce33e44Nicolas Capens RValue<Short4> UnpackHigh(RValue<Int2> x, RValue<Int2> y) 5324598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5325f8beb4bedfdb11eca2f947afde79dd78b6386206Nicolas Capens int shuffle[4] = {0, 4, 1, 5}; // Real type is v4i32 5326c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens auto lowHigh = RValue<Int4>(Nucleus::createShuffleVector(x.value, y.value, shuffle)); 5327c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens return As<Short4>(Swizzle(lowHigh, 0xEE)); 5328598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5329598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5330598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int> Extract(RValue<Int2> val, int i) 5331598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5332c94ab74f4570d4ce781645f6c4396778a15819c1Nicolas Capens return RValue<Int>(Nucleus::createExtractElement(val.value, Int::getType(), i)); 5333598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5334598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5335598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int2> Insert(RValue<Int2> val, RValue<Int> element, int i) 5336598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5337c94ab74f4570d4ce781645f6c4396778a15819c1Nicolas Capens return RValue<Int2>(Nucleus::createInsertElement(val.value, element.value, i)); 5338598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5339598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5340598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Type *Int2::getType() 5341598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 53428dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens return T(Type_v2i32); 5343598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5344598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5345598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UInt2::UInt2(unsigned int x, unsigned int y) 5346598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 53478dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens int64_t constantVector[2] = {x, y}; 53488dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens storeValue(Nucleus::createConstantVector(constantVector, getType())); 5349598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5350598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5351598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UInt2::UInt2(RValue<UInt2> rhs) 5352598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5353598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 5354598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5355598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5356598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UInt2::UInt2(const UInt2 &rhs) 5357598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5358598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 5359598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 5360598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5361598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5362598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens UInt2::UInt2(const Reference<UInt2> &rhs) 5363598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5364598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 5365598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 5366598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5367598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 536896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt2> UInt2::operator=(RValue<UInt2> rhs) 5369598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5370598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 5371598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5372598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return rhs; 5373598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5374598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 537596d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt2> UInt2::operator=(const UInt2 &rhs) 5376598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5377598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 5378598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 5379598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5380598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt2>(value); 5381598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5382598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 538396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt2> UInt2::operator=(const Reference<UInt2> &rhs) 5384598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5385598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 5386598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 5387598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5388598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt2>(value); 5389598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5390598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5391598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt2> operator+(RValue<UInt2> lhs, RValue<UInt2> rhs) 5392598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5393c4c431d6f52859c2e20e42cc08ac51e060261a63Nicolas Capens return RValue<UInt2>(Nucleus::createAdd(lhs.value, rhs.value)); 5394598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5395598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5396598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt2> operator-(RValue<UInt2> lhs, RValue<UInt2> rhs) 5397598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5398c4c431d6f52859c2e20e42cc08ac51e060261a63Nicolas Capens return RValue<UInt2>(Nucleus::createSub(lhs.value, rhs.value)); 5399598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5400598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5401598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// RValue<UInt2> operator*(RValue<UInt2> lhs, RValue<UInt2> rhs) 5402598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 5403598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return RValue<UInt2>(Nucleus::createMul(lhs.value, rhs.value)); 5404598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 5405598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5406598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// RValue<UInt2> operator/(RValue<UInt2> lhs, RValue<UInt2> rhs) 5407598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 5408598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return RValue<UInt2>(Nucleus::createUDiv(lhs.value, rhs.value)); 5409598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 5410598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5411598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// RValue<UInt2> operator%(RValue<UInt2> lhs, RValue<UInt2> rhs) 5412598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 5413598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return RValue<UInt2>(Nucleus::createURem(lhs.value, rhs.value)); 5414598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 5415598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5416598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt2> operator&(RValue<UInt2> lhs, RValue<UInt2> rhs) 5417598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5418c4c431d6f52859c2e20e42cc08ac51e060261a63Nicolas Capens return RValue<UInt2>(Nucleus::createAnd(lhs.value, rhs.value)); 5419598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5420598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5421598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt2> operator|(RValue<UInt2> lhs, RValue<UInt2> rhs) 5422598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5423c4c431d6f52859c2e20e42cc08ac51e060261a63Nicolas Capens return RValue<UInt2>(Nucleus::createOr(lhs.value, rhs.value)); 5424598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5425598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5426598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt2> operator^(RValue<UInt2> lhs, RValue<UInt2> rhs) 5427598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5428c4c431d6f52859c2e20e42cc08ac51e060261a63Nicolas Capens return RValue<UInt2>(Nucleus::createXor(lhs.value, rhs.value)); 5429598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5430598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 54318be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens RValue<UInt> Extract(RValue<UInt2> val, int i) 54328be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 54338be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return RValue<UInt>(Nucleus::createExtractElement(val.value, UInt::getType(), i)); 54348be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 54358be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens 54368be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens RValue<UInt2> Insert(RValue<UInt2> val, RValue<UInt> element, int i) 54378be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 54388be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return RValue<UInt2>(Nucleus::createInsertElement(val.value, element.value, i)); 54398be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 54408be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens 5441598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt2> operator<<(RValue<UInt2> lhs, unsigned char rhs) 5442598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 54438be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens if(emulateIntrinsics) 54448be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 54458be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens UInt2 result; 54468be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 0) << UInt(rhs), 0); 54478be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 1) << UInt(rhs), 1); 54488be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens 54498be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return result; 54508be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 54518be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens else 54528be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 54538be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return RValue<UInt2>(Nucleus::createShl(lhs.value, V(::context->getConstantInt32(rhs)))); 54548be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 5455598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5456598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5457598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt2> operator>>(RValue<UInt2> lhs, unsigned char rhs) 5458598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 54598be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens if(emulateIntrinsics) 54608be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 54618be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens UInt2 result; 54628be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 0) >> UInt(rhs), 0); 54638be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 1) >> UInt(rhs), 1); 54648be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens 54658be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return result; 54668be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 54678be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens else 54688be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 54698be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return RValue<UInt2>(Nucleus::createLShr(lhs.value, V(::context->getConstantInt32(rhs)))); 54708be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 5471598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5472598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 547396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt2> operator+=(UInt2 &lhs, RValue<UInt2> rhs) 5474598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5475598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs + rhs; 5476598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5477598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 547896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt2> operator-=(UInt2 &lhs, RValue<UInt2> rhs) 5479598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5480598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs - rhs; 5481598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5482598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 548396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens// RValue<UInt2> operator*=(UInt2 &lhs, RValue<UInt2> rhs) 5484598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 5485598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return lhs = lhs * rhs; 5486598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 5487598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 548896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens// RValue<UInt2> operator/=(UInt2 &lhs, RValue<UInt2> rhs) 5489598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 5490598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return lhs = lhs / rhs; 5491598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 5492598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 549396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens// RValue<UInt2> operator%=(UInt2 &lhs, RValue<UInt2> rhs) 5494598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 5495598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return lhs = lhs % rhs; 5496598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 5497598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 549896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt2> operator&=(UInt2 &lhs, RValue<UInt2> rhs) 5499598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5500598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs & rhs; 5501598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5502598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 550396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt2> operator|=(UInt2 &lhs, RValue<UInt2> rhs) 5504598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5505598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs | rhs; 5506598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5507598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 550896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt2> operator^=(UInt2 &lhs, RValue<UInt2> rhs) 5509598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5510598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs ^ rhs; 5511598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5512598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 551396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt2> operator<<=(UInt2 &lhs, unsigned char rhs) 5514598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5515598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs << rhs; 5516598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5517598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 551896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt2> operator>>=(UInt2 &lhs, unsigned char rhs) 5519598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5520598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs >> rhs; 5521598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5522598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5523598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// RValue<UInt2> operator+(RValue<UInt2> val) 5524598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 5525598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return val; 5526598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 5527598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5528598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// RValue<UInt2> operator-(RValue<UInt2> val) 5529598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 5530598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return RValue<UInt2>(Nucleus::createNeg(val.value)); 5531598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 5532598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5533598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt2> operator~(RValue<UInt2> val) 5534598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5535598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt2>(Nucleus::createNot(val.value)); 5536598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5537598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5538598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Type *UInt2::getType() 5539598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 55404cfd45760c4cc0fb821322a869a2979ca8226843Nicolas Capens return T(Type_v2i32); 5541598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5542598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5543cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Int4::Int4() : XYZW(this) 5544cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens { 5545cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens } 5546cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens 5547cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Int4::Int4(RValue<Byte4> cast) : XYZW(this) 5548598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5549d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens Value *x = Nucleus::createBitCast(cast.value, Int::getType()); 5550d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens Value *a = Nucleus::createInsertElement(loadValue(), x, 0); 5551d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens 5552d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens Value *e; 5553d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens int swizzle[16] = {0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23}; 5554d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens Value *b = Nucleus::createBitCast(a, Byte16::getType()); 5555d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens Value *c = Nucleus::createShuffleVector(b, V(Nucleus::createNullValue(Byte16::getType())), swizzle); 5556d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens 5557d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens int swizzle2[8] = {0, 8, 1, 9, 2, 10, 3, 11}; 5558d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens Value *d = Nucleus::createBitCast(c, Short8::getType()); 5559d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens e = Nucleus::createShuffleVector(d, V(Nucleus::createNullValue(Short8::getType())), swizzle2); 5560d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens 5561d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens Value *f = Nucleus::createBitCast(e, Int4::getType()); 5562d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens storeValue(f); 5563598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5564598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5565cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Int4::Int4(RValue<SByte4> cast) : XYZW(this) 5566598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5567d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens Value *x = Nucleus::createBitCast(cast.value, Int::getType()); 5568d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens Value *a = Nucleus::createInsertElement(loadValue(), x, 0); 5569d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens 5570d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens int swizzle[16] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7}; 5571d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens Value *b = Nucleus::createBitCast(a, Byte16::getType()); 5572d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens Value *c = Nucleus::createShuffleVector(b, b, swizzle); 5573d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens 5574d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens int swizzle2[8] = {0, 0, 1, 1, 2, 2, 3, 3}; 5575d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens Value *d = Nucleus::createBitCast(c, Short8::getType()); 55768be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens Value *e = Nucleus::createShuffleVector(d, d, swizzle2); 5577d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens 55788be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens *this = As<Int4>(e) >> 24; 5579598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5580598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5581cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Int4::Int4(RValue<Float4> cast) : XYZW(this) 5582598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5583598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *xyzw = Nucleus::createFPToSI(cast.value, Int4::getType()); 5584598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5585598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(xyzw); 5586598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5587598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5588cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Int4::Int4(RValue<Short4> cast) : XYZW(this) 5589598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5590d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens int swizzle[8] = {0, 0, 1, 1, 2, 2, 3, 3}; 5591d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens Value *c = Nucleus::createShuffleVector(cast.value, cast.value, swizzle); 55928be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens 55938be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens *this = As<Int4>(c) >> 16; 5594598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5595598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5596cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Int4::Int4(RValue<UShort4> cast) : XYZW(this) 5597598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5598d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens int swizzle[8] = {0, 8, 1, 9, 2, 10, 3, 11}; 5599d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens Value *c = Nucleus::createShuffleVector(cast.value, Short8(0, 0, 0, 0, 0, 0, 0, 0).loadValue(), swizzle); 5600d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens Value *d = Nucleus::createBitCast(c, Int4::getType()); 5601d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens storeValue(d); 5602598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5603598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5604cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Int4::Int4(int xyzw) : XYZW(this) 5605598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5606598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens constant(xyzw, xyzw, xyzw, xyzw); 5607598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5608598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5609cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Int4::Int4(int x, int yzw) : XYZW(this) 5610598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5611598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens constant(x, yzw, yzw, yzw); 5612598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5613598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5614cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Int4::Int4(int x, int y, int zw) : XYZW(this) 5615598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5616598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens constant(x, y, zw, zw); 5617598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5618598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5619cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Int4::Int4(int x, int y, int z, int w) : XYZW(this) 5620598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5621598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens constant(x, y, z, w); 5622598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5623598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5624598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens void Int4::constant(int x, int y, int z, int w) 5625598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 562613ac2327184133f5a69584ff2d69bc2cdeec1457Nicolas Capens int64_t constantVector[4] = {x, y, z, w}; 56278dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens storeValue(Nucleus::createConstantVector(constantVector, getType())); 5628598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5629598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5630cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Int4::Int4(RValue<Int4> rhs) : XYZW(this) 5631598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5632598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 5633598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5634598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5635cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Int4::Int4(const Int4 &rhs) : XYZW(this) 5636598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5637598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 5638598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 5639598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5640598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5641cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Int4::Int4(const Reference<Int4> &rhs) : XYZW(this) 5642598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5643598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 5644598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 5645598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5646598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5647cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Int4::Int4(RValue<UInt4> rhs) : XYZW(this) 5648598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5649598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 5650598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5651598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5652cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Int4::Int4(const UInt4 &rhs) : XYZW(this) 5653598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5654598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 5655598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 5656598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5657598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5658cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Int4::Int4(const Reference<UInt4> &rhs) : XYZW(this) 5659598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5660598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 5661598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 5662598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5663598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5664cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Int4::Int4(RValue<Int2> lo, RValue<Int2> hi) : XYZW(this) 5665598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5666c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens int shuffle[4] = {0, 1, 4, 5}; // Real type is v4i32 5667c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens Value *packed = Nucleus::createShuffleVector(lo.value, hi.value, shuffle); 5668c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens 5669c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens storeValue(packed); 5670598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5671598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5672cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Int4::Int4(RValue<Int> rhs) : XYZW(this) 5673598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5674f8beb4bedfdb11eca2f947afde79dd78b6386206Nicolas Capens Value *vector = Nucleus::createBitCast(rhs.value, Int4::getType()); 5675d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens 5676d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens int swizzle[4] = {0, 0, 0, 0}; 5677f8beb4bedfdb11eca2f947afde79dd78b6386206Nicolas Capens Value *replicate = Nucleus::createShuffleVector(vector, vector, swizzle); 5678d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens 5679d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens storeValue(replicate); 5680598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5681598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5682cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Int4::Int4(const Int &rhs) : XYZW(this) 5683598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5684598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens *this = RValue<Int>(rhs.loadValue()); 5685598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5686598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5687cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Int4::Int4(const Reference<Int> &rhs) : XYZW(this) 5688598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5689598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens *this = RValue<Int>(rhs.loadValue()); 5690598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5691598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 569296d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int4> Int4::operator=(RValue<Int4> rhs) 5693598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5694598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 5695598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5696598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return rhs; 5697598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5698598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 569996d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int4> Int4::operator=(const Int4 &rhs) 5700598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5701598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 5702598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 5703598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5704598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int4>(value); 5705598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5706598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 570796d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int4> Int4::operator=(const Reference<Int4> &rhs) 5708598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5709598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 5710598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 5711598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5712598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int4>(value); 5713598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5714598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5715598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> operator+(RValue<Int4> lhs, RValue<Int4> rhs) 5716598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5717598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int4>(Nucleus::createAdd(lhs.value, rhs.value)); 5718598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5719598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5720598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> operator-(RValue<Int4> lhs, RValue<Int4> rhs) 5721598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5722598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int4>(Nucleus::createSub(lhs.value, rhs.value)); 5723598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5724598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5725598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> operator*(RValue<Int4> lhs, RValue<Int4> rhs) 5726598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5727598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int4>(Nucleus::createMul(lhs.value, rhs.value)); 5728598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5729598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5730598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> operator/(RValue<Int4> lhs, RValue<Int4> rhs) 5731598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5732598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int4>(Nucleus::createSDiv(lhs.value, rhs.value)); 5733598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5734598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5735598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> operator%(RValue<Int4> lhs, RValue<Int4> rhs) 5736598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5737598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int4>(Nucleus::createSRem(lhs.value, rhs.value)); 5738598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5739598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5740598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> operator&(RValue<Int4> lhs, RValue<Int4> rhs) 5741598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5742598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int4>(Nucleus::createAnd(lhs.value, rhs.value)); 5743598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5744598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5745598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> operator|(RValue<Int4> lhs, RValue<Int4> rhs) 5746598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5747598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int4>(Nucleus::createOr(lhs.value, rhs.value)); 5748598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5749598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5750598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> operator^(RValue<Int4> lhs, RValue<Int4> rhs) 5751598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5752598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int4>(Nucleus::createXor(lhs.value, rhs.value)); 5753598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5754598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5755598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> operator<<(RValue<Int4> lhs, unsigned char rhs) 5756598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 57578be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens if(emulateIntrinsics) 57588be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 57598be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens Int4 result; 57608be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 0) << Int(rhs), 0); 57618be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 1) << Int(rhs), 1); 57628be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 2) << Int(rhs), 2); 57638be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 3) << Int(rhs), 3); 57648be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens 57658be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return result; 57668be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 57678be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens else 57688be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 57698be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return RValue<Int4>(Nucleus::createShl(lhs.value, V(::context->getConstantInt32(rhs)))); 57708be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 5771598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5772598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5773598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> operator>>(RValue<Int4> lhs, unsigned char rhs) 5774598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 57758be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens if(emulateIntrinsics) 57768be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 57778be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens Int4 result; 57788be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 0) >> Int(rhs), 0); 57798be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 1) >> Int(rhs), 1); 57808be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 2) >> Int(rhs), 2); 57818be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 3) >> Int(rhs), 3); 57828be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens 57838be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return result; 57848be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 57858be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens else 57868be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 57878be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return RValue<Int4>(Nucleus::createAShr(lhs.value, V(::context->getConstantInt32(rhs)))); 57888be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 5789598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5790598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5791598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> operator<<(RValue<Int4> lhs, RValue<Int4> rhs) 5792598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5793598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int4>(Nucleus::createShl(lhs.value, rhs.value)); 5794598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5795598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5796598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> operator>>(RValue<Int4> lhs, RValue<Int4> rhs) 5797598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5798598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int4>(Nucleus::createAShr(lhs.value, rhs.value)); 5799598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5800598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 580196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int4> operator+=(Int4 &lhs, RValue<Int4> rhs) 5802598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5803598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs + rhs; 5804598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5805598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 580696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int4> operator-=(Int4 &lhs, RValue<Int4> rhs) 5807598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5808598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs - rhs; 5809598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5810598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 581196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int4> operator*=(Int4 &lhs, RValue<Int4> rhs) 5812598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5813598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs * rhs; 5814598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5815598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 581696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens// RValue<Int4> operator/=(Int4 &lhs, RValue<Int4> rhs) 5817598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 5818598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return lhs = lhs / rhs; 5819598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 5820598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 582196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens// RValue<Int4> operator%=(Int4 &lhs, RValue<Int4> rhs) 5822598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 5823598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return lhs = lhs % rhs; 5824598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 5825598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 582696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int4> operator&=(Int4 &lhs, RValue<Int4> rhs) 5827598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5828598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs & rhs; 5829598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5830598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 583196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int4> operator|=(Int4 &lhs, RValue<Int4> rhs) 5832598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5833598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs | rhs; 5834598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5835598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 583696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int4> operator^=(Int4 &lhs, RValue<Int4> rhs) 5837598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5838598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs ^ rhs; 5839598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5840598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 584196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int4> operator<<=(Int4 &lhs, unsigned char rhs) 5842598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5843598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs << rhs; 5844598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5845598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 584696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Int4> operator>>=(Int4 &lhs, unsigned char rhs) 5847598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5848598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs >> rhs; 5849598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5850598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5851598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> operator+(RValue<Int4> val) 5852598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5853598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return val; 5854598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5855598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5856598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> operator-(RValue<Int4> val) 5857598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5858598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int4>(Nucleus::createNeg(val.value)); 5859598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5860598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5861598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> operator~(RValue<Int4> val) 5862598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5863598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int4>(Nucleus::createNot(val.value)); 5864598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5865598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5866598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> CmpEQ(RValue<Int4> x, RValue<Int4> y) 5867598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 58685e6ca097025a069d2c4da383a312ffcf35e44a19Nicolas Capens return RValue<Int4>(Nucleus::createICmpEQ(x.value, y.value)); 5869598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5870598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5871598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> CmpLT(RValue<Int4> x, RValue<Int4> y) 5872598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 58735e6ca097025a069d2c4da383a312ffcf35e44a19Nicolas Capens return RValue<Int4>(Nucleus::createICmpSLT(x.value, y.value)); 5874598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5875598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5876598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> CmpLE(RValue<Int4> x, RValue<Int4> y) 5877598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 58785e6ca097025a069d2c4da383a312ffcf35e44a19Nicolas Capens return RValue<Int4>(Nucleus::createICmpSLE(x.value, y.value)); 5879598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5880598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5881598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> CmpNEQ(RValue<Int4> x, RValue<Int4> y) 5882598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 58835e6ca097025a069d2c4da383a312ffcf35e44a19Nicolas Capens return RValue<Int4>(Nucleus::createICmpNE(x.value, y.value)); 5884598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5885598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5886598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> CmpNLT(RValue<Int4> x, RValue<Int4> y) 5887598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 58885e6ca097025a069d2c4da383a312ffcf35e44a19Nicolas Capens return RValue<Int4>(Nucleus::createICmpSGE(x.value, y.value)); 5889598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5890598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5891598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> CmpNLE(RValue<Int4> x, RValue<Int4> y) 5892598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 58935e6ca097025a069d2c4da383a312ffcf35e44a19Nicolas Capens return RValue<Int4>(Nucleus::createICmpSGT(x.value, y.value)); 5894598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5895598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5896598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> Max(RValue<Int4> x, RValue<Int4> y) 5897598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 589853a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens Ice::Variable *condition = ::function->makeVariable(Ice::IceType_v4i1); 589953a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Sle, condition, x.value, y.value); 590053a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens ::basicBlock->appendInst(cmp); 590153a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens 590253a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_v4i32); 590353a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens auto select = Ice::InstSelect::create(::function, result, condition, y.value, x.value); 590453a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens ::basicBlock->appendInst(select); 590553a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens 590653a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens return RValue<Int4>(V(result)); 5907598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5908598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5909598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> Min(RValue<Int4> x, RValue<Int4> y) 5910598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 591153a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens Ice::Variable *condition = ::function->makeVariable(Ice::IceType_v4i1); 591253a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Sgt, condition, x.value, y.value); 591353a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens ::basicBlock->appendInst(cmp); 591453a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens 591553a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_v4i32); 591653a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens auto select = Ice::InstSelect::create(::function, result, condition, y.value, x.value); 591753a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens ::basicBlock->appendInst(select); 591853a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens 591953a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens return RValue<Int4>(V(result)); 5920598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5921598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 5922598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> RoundInt(RValue<Float4> cast) 5923598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 5924091f350c0c1a18c7a05fa4b49ebb009e1710b3b8Nicolas Capens if(emulateIntrinsics || CPUID::ARM) 5925f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens { 5926f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens // Push the fractional part off the mantissa. Accurate up to +/-2^22. 5927f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens return Int4((cast + Float4(0x00C00000)) - Float4(0x00C00000)); 5928f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens } 5929f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens else 5930f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens { 5931f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_v4i32); 5932f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::Nearbyint, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; 5933f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens auto target = ::context->getConstantUndef(Ice::IceType_i32); 5934f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens auto nearbyint = Ice::InstIntrinsicCall::create(::function, 1, result, target, intrinsic); 5935f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens nearbyint->addArg(cast.value); 5936f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens ::basicBlock->appendInst(nearbyint); 5937a8086514024d968e68c9eb82a52baac794881e59Nicolas Capens 5938f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens return RValue<Int4>(V(result)); 5939f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens } 5940598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5941598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 594233438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens RValue<Short8> PackSigned(RValue<Int4> x, RValue<Int4> y) 5943598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 59448960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens if(emulateIntrinsics) 59458960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens { 59468960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens Short8 result; 594733438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Extract(x, 0)), 0); 594833438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Extract(x, 1)), 1); 594933438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Extract(x, 2)), 2); 595033438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Extract(x, 3)), 3); 595133438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Extract(y, 0)), 4); 595233438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Extract(y, 1)), 5); 595333438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Extract(y, 2)), 6); 595433438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens result = Insert(result, SaturateSigned(Extract(y, 3)), 7); 5955ec54a17ecc46a5b032ea620a0c455d1cbc3eb1bbNicolas Capens 59568960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens return result; 59578960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens } 59588960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens else 59598960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens { 59608960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16); 59618960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::VectorPackSigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; 59628960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens auto target = ::context->getConstantUndef(Ice::IceType_i32); 59638960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens auto pack = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic); 59648960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens pack->addArg(x.value); 59658960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens pack->addArg(y.value); 59668960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens ::basicBlock->appendInst(pack); 59678960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens 59688960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens return RValue<Short8>(V(result)); 59698960fbfe92bdc8d1e7fc3e148226eb5e76a3efa3Nicolas Capens } 5970598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 5971598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 597233438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens RValue<UShort8> PackUnsigned(RValue<Int4> x, RValue<Int4> y) 597333438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens { 5974091f350c0c1a18c7a05fa4b49ebb009e1710b3b8Nicolas Capens if(emulateIntrinsics || !(CPUID::SSE4_1 || CPUID::ARM)) 5975091f350c0c1a18c7a05fa4b49ebb009e1710b3b8Nicolas Capens { 5976091f350c0c1a18c7a05fa4b49ebb009e1710b3b8Nicolas Capens RValue<Int4> sx = As<Int4>(x); 5977091f350c0c1a18c7a05fa4b49ebb009e1710b3b8Nicolas Capens RValue<Int4> bx = (sx & ~(sx >> 31)) - Int4(0x8000); 5978091f350c0c1a18c7a05fa4b49ebb009e1710b3b8Nicolas Capens 5979091f350c0c1a18c7a05fa4b49ebb009e1710b3b8Nicolas Capens RValue<Int4> sy = As<Int4>(y); 5980091f350c0c1a18c7a05fa4b49ebb009e1710b3b8Nicolas Capens RValue<Int4> by = (sy & ~(sy >> 31)) - Int4(0x8000); 5981091f350c0c1a18c7a05fa4b49ebb009e1710b3b8Nicolas Capens 5982091f350c0c1a18c7a05fa4b49ebb009e1710b3b8Nicolas Capens return As<UShort8>(PackSigned(bx, by) + Short8(0x8000u)); 5983091f350c0c1a18c7a05fa4b49ebb009e1710b3b8Nicolas Capens } 5984091f350c0c1a18c7a05fa4b49ebb009e1710b3b8Nicolas Capens else 598533438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens { 598633438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_v8i16); 598733438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::VectorPackUnsigned, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; 598833438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens auto target = ::context->getConstantUndef(Ice::IceType_i32); 598933438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens auto pack = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic); 599033438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens pack->addArg(x.value); 599133438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens pack->addArg(y.value); 599233438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens ::basicBlock->appendInst(pack); 599333438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens 599433438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens return RValue<UShort8>(V(result)); 599533438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens } 599633438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens } 599733438a6882d629139617d80cc7fdbc687b71a794Nicolas Capens 5998598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int> Extract(RValue<Int4> x, int i) 5999598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6000e95d534ac645273b3669ef62046d9aa612468e7eNicolas Capens return RValue<Int>(Nucleus::createExtractElement(x.value, Int::getType(), i)); 6001598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6002598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6003598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> Insert(RValue<Int4> x, RValue<Int> element, int i) 6004598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6005598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Int4>(Nucleus::createInsertElement(x.value, element.value, i)); 6006598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6007598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6008598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int> SignMask(RValue<Int4> x) 6009598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6010091f350c0c1a18c7a05fa4b49ebb009e1710b3b8Nicolas Capens if(emulateIntrinsics || CPUID::ARM) 6011d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens { 6012d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens Int4 xx = (x >> 31) & Int4(0x00000001, 0x00000002, 0x00000004, 0x00000008); 6013d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens return Extract(xx, 0) | Extract(xx, 1) | Extract(xx, 2) | Extract(xx, 3); 6014d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens } 6015d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens else 6016d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens { 6017d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_i32); 6018d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::SignMask, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; 6019d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens auto target = ::context->getConstantUndef(Ice::IceType_i32); 6020d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens auto movmsk = Ice::InstIntrinsicCall::create(::function, 1, result, target, intrinsic); 6021d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens movmsk->addArg(x.value); 6022d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens ::basicBlock->appendInst(movmsk); 6023f2cb9dff9c71cff304d98f0df7ffe6bebd6bc2bbNicolas Capens 6024d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens return RValue<Int>(V(result)); 6025d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens } 6026598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6027598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6028598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> Swizzle(RValue<Int4> x, unsigned char select) 6029598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6030e95d534ac645273b3669ef62046d9aa612468e7eNicolas Capens return RValue<Int4>(createSwizzle4(x.value, select)); 6031598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6032598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6033598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Type *Int4::getType() 6034598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 603523d99a4943f621bd09723c92ed012be233cd966cNicolas Capens return T(Ice::IceType_v4i32); 6036598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6037598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6038cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens UInt4::UInt4() : XYZW(this) 6039cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens { 6040cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens } 6041cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens 6042cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens UInt4::UInt4(RValue<Float4> cast) : XYZW(this) 6043598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6044c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens // Smallest positive value representable in UInt, but not in Int 6045c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens const unsigned int ustart = 0x80000000u; 6046c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens const float ustartf = float(ustart); 6047c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens 6048c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens // Check if the value can be represented as an Int 6049c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens Int4 uiValue = CmpNLT(cast, Float4(ustartf)); 6050c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens // If the value is too large, subtract ustart and re-add it after conversion. 6051c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens uiValue = (uiValue & As<Int4>(As<UInt4>(Int4(cast - Float4(ustartf))) + UInt4(ustart))) | 6052c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens // Otherwise, just convert normally 6053c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens (~uiValue & Int4(cast)); 6054c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens // If the value is negative, store 0, otherwise store the result of the conversion 6055c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens storeValue((~(As<Int4>(cast) >> 31) & uiValue).value); 6056598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6057598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6058cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens UInt4::UInt4(int xyzw) : XYZW(this) 6059598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6060598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens constant(xyzw, xyzw, xyzw, xyzw); 6061598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6062598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6063cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens UInt4::UInt4(int x, int yzw) : XYZW(this) 6064598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6065598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens constant(x, yzw, yzw, yzw); 6066598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6067598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6068cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens UInt4::UInt4(int x, int y, int zw) : XYZW(this) 6069598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6070598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens constant(x, y, zw, zw); 6071598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6072598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6073cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens UInt4::UInt4(int x, int y, int z, int w) : XYZW(this) 6074598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6075598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens constant(x, y, z, w); 6076598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6077598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6078598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens void UInt4::constant(int x, int y, int z, int w) 6079598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 608013ac2327184133f5a69584ff2d69bc2cdeec1457Nicolas Capens int64_t constantVector[4] = {x, y, z, w}; 60818dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens storeValue(Nucleus::createConstantVector(constantVector, getType())); 6082598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6083598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6084cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens UInt4::UInt4(RValue<UInt4> rhs) : XYZW(this) 6085598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6086598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 6087598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6088598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6089cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens UInt4::UInt4(const UInt4 &rhs) : XYZW(this) 6090598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6091598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 6092598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 6093598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6094598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6095cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens UInt4::UInt4(const Reference<UInt4> &rhs) : XYZW(this) 6096598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6097598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 6098598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 6099598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6100598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6101cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens UInt4::UInt4(RValue<Int4> rhs) : XYZW(this) 6102598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6103598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 6104598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6105598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6106cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens UInt4::UInt4(const Int4 &rhs) : XYZW(this) 6107598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6108598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 6109598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 6110598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6111598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6112cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens UInt4::UInt4(const Reference<Int4> &rhs) : XYZW(this) 6113598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6114598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 6115598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 6116598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6117598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6118cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens UInt4::UInt4(RValue<UInt2> lo, RValue<UInt2> hi) : XYZW(this) 6119598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6120c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens int shuffle[4] = {0, 1, 4, 5}; // Real type is v4i32 6121c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens Value *packed = Nucleus::createShuffleVector(lo.value, hi.value, shuffle); 6122c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens 6123c70a116d0f18f98a755e7f2d19e643ebcef5f79bNicolas Capens storeValue(packed); 6124598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6125598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 612696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt4> UInt4::operator=(RValue<UInt4> rhs) 6127598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6128598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 6129598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6130598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return rhs; 6131598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6132598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 613396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt4> UInt4::operator=(const UInt4 &rhs) 6134598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6135598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 6136598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 6137598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6138598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt4>(value); 6139598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6140598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 614196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt4> UInt4::operator=(const Reference<UInt4> &rhs) 6142598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6143598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 6144598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 6145598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6146598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt4>(value); 6147598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6148598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6149598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt4> operator+(RValue<UInt4> lhs, RValue<UInt4> rhs) 6150598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6151598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt4>(Nucleus::createAdd(lhs.value, rhs.value)); 6152598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6153598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6154598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt4> operator-(RValue<UInt4> lhs, RValue<UInt4> rhs) 6155598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6156598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt4>(Nucleus::createSub(lhs.value, rhs.value)); 6157598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6158598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6159598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt4> operator*(RValue<UInt4> lhs, RValue<UInt4> rhs) 6160598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6161598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt4>(Nucleus::createMul(lhs.value, rhs.value)); 6162598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6163598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6164598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt4> operator/(RValue<UInt4> lhs, RValue<UInt4> rhs) 6165598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6166598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt4>(Nucleus::createUDiv(lhs.value, rhs.value)); 6167598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6168598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6169598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt4> operator%(RValue<UInt4> lhs, RValue<UInt4> rhs) 6170598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6171598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt4>(Nucleus::createURem(lhs.value, rhs.value)); 6172598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6173598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6174598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt4> operator&(RValue<UInt4> lhs, RValue<UInt4> rhs) 6175598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6176598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt4>(Nucleus::createAnd(lhs.value, rhs.value)); 6177598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6178598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6179598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt4> operator|(RValue<UInt4> lhs, RValue<UInt4> rhs) 6180598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6181598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt4>(Nucleus::createOr(lhs.value, rhs.value)); 6182598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6183598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6184598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt4> operator^(RValue<UInt4> lhs, RValue<UInt4> rhs) 6185598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6186598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt4>(Nucleus::createXor(lhs.value, rhs.value)); 6187598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6188598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 61898be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens RValue<UInt> Extract(RValue<UInt4> x, int i) 61908be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 61918be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return RValue<UInt>(Nucleus::createExtractElement(x.value, UInt::getType(), i)); 61928be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 61938be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens 61948be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens RValue<UInt4> Insert(RValue<UInt4> x, RValue<UInt> element, int i) 61958be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 61968be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return RValue<UInt4>(Nucleus::createInsertElement(x.value, element.value, i)); 61978be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 61988be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens 6199598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt4> operator<<(RValue<UInt4> lhs, unsigned char rhs) 6200598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 62018be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens if(emulateIntrinsics) 62028be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 62038be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens UInt4 result; 62048be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 0) << UInt(rhs), 0); 62058be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 1) << UInt(rhs), 1); 62068be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 2) << UInt(rhs), 2); 62078be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 3) << UInt(rhs), 3); 62088be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens 62098be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return result; 62108be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 62118be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens else 62128be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 62138be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return RValue<UInt4>(Nucleus::createShl(lhs.value, V(::context->getConstantInt32(rhs)))); 62148be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 6215598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6216598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6217598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt4> operator>>(RValue<UInt4> lhs, unsigned char rhs) 6218598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 62198be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens if(emulateIntrinsics) 62208be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 62218be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens UInt4 result; 62228be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 0) >> UInt(rhs), 0); 62238be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 1) >> UInt(rhs), 1); 62248be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 2) >> UInt(rhs), 2); 62258be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens result = Insert(result, Extract(lhs, 3) >> UInt(rhs), 3); 62268be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens 62278be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return result; 62288be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 62298be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens else 62308be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens { 62318be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens return RValue<UInt4>(Nucleus::createLShr(lhs.value, V(::context->getConstantInt32(rhs)))); 62328be6c7bbafed4cb22c462b8a838b47621d87874dNicolas Capens } 6233598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6234598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6235598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt4> operator<<(RValue<UInt4> lhs, RValue<UInt4> rhs) 6236598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6237598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt4>(Nucleus::createShl(lhs.value, rhs.value)); 6238598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6239598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6240598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt4> operator>>(RValue<UInt4> lhs, RValue<UInt4> rhs) 6241598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6242598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt4>(Nucleus::createLShr(lhs.value, rhs.value)); 6243598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6244598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 624596d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt4> operator+=(UInt4 &lhs, RValue<UInt4> rhs) 6246598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6247598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs + rhs; 6248598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6249598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 625096d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt4> operator-=(UInt4 &lhs, RValue<UInt4> rhs) 6251598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6252598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs - rhs; 6253598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6254598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 625596d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt4> operator*=(UInt4 &lhs, RValue<UInt4> rhs) 6256598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6257598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs * rhs; 6258598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6259598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 626096d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens// RValue<UInt4> operator/=(UInt4 &lhs, RValue<UInt4> rhs) 6261598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 6262598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return lhs = lhs / rhs; 6263598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 6264598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 626596d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens// RValue<UInt4> operator%=(UInt4 &lhs, RValue<UInt4> rhs) 6266598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// { 6267598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// return lhs = lhs % rhs; 6268598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens// } 6269598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 627096d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt4> operator&=(UInt4 &lhs, RValue<UInt4> rhs) 6271598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6272598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs & rhs; 6273598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6274598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 627596d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt4> operator|=(UInt4 &lhs, RValue<UInt4> rhs) 6276598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6277598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs | rhs; 6278598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6279598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 628096d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt4> operator^=(UInt4 &lhs, RValue<UInt4> rhs) 6281598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6282598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs ^ rhs; 6283598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6284598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 628596d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt4> operator<<=(UInt4 &lhs, unsigned char rhs) 6286598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6287598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs << rhs; 6288598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6289598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 629096d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<UInt4> operator>>=(UInt4 &lhs, unsigned char rhs) 6291598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6292598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs >> rhs; 6293598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6294598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6295598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt4> operator+(RValue<UInt4> val) 6296598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6297598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return val; 6298598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6299598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6300598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt4> operator-(RValue<UInt4> val) 6301598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6302598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt4>(Nucleus::createNeg(val.value)); 6303598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6304598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6305598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt4> operator~(RValue<UInt4> val) 6306598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6307598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<UInt4>(Nucleus::createNot(val.value)); 6308598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6309598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6310598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt4> CmpEQ(RValue<UInt4> x, RValue<UInt4> y) 6311598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 63125e6ca097025a069d2c4da383a312ffcf35e44a19Nicolas Capens return RValue<UInt4>(Nucleus::createICmpEQ(x.value, y.value)); 6313598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6314598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6315598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt4> CmpLT(RValue<UInt4> x, RValue<UInt4> y) 6316598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 63175e6ca097025a069d2c4da383a312ffcf35e44a19Nicolas Capens return RValue<UInt4>(Nucleus::createICmpULT(x.value, y.value)); 6318598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6319598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6320598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt4> CmpLE(RValue<UInt4> x, RValue<UInt4> y) 6321598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 63225e6ca097025a069d2c4da383a312ffcf35e44a19Nicolas Capens return RValue<UInt4>(Nucleus::createICmpULE(x.value, y.value)); 6323598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6324598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6325598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt4> CmpNEQ(RValue<UInt4> x, RValue<UInt4> y) 6326598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 63275e6ca097025a069d2c4da383a312ffcf35e44a19Nicolas Capens return RValue<UInt4>(Nucleus::createICmpNE(x.value, y.value)); 6328598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6329598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6330598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt4> CmpNLT(RValue<UInt4> x, RValue<UInt4> y) 6331598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 63325e6ca097025a069d2c4da383a312ffcf35e44a19Nicolas Capens return RValue<UInt4>(Nucleus::createICmpUGE(x.value, y.value)); 6333598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6334598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6335598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt4> CmpNLE(RValue<UInt4> x, RValue<UInt4> y) 6336598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 63375e6ca097025a069d2c4da383a312ffcf35e44a19Nicolas Capens return RValue<UInt4>(Nucleus::createICmpUGT(x.value, y.value)); 6338598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6339598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6340598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt4> Max(RValue<UInt4> x, RValue<UInt4> y) 6341598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 634253a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens Ice::Variable *condition = ::function->makeVariable(Ice::IceType_v4i1); 634353a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Ule, condition, x.value, y.value); 634453a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens ::basicBlock->appendInst(cmp); 634553a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens 634653a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_v4i32); 634753a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens auto select = Ice::InstSelect::create(::function, result, condition, y.value, x.value); 634853a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens ::basicBlock->appendInst(select); 634953a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens 635053a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens return RValue<UInt4>(V(result)); 6351598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6352598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6353598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<UInt4> Min(RValue<UInt4> x, RValue<UInt4> y) 6354598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 635553a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens Ice::Variable *condition = ::function->makeVariable(Ice::IceType_v4i1); 635653a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens auto cmp = Ice::InstIcmp::create(::function, Ice::InstIcmp::Ugt, condition, x.value, y.value); 635753a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens ::basicBlock->appendInst(cmp); 635853a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens 635953a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_v4i32); 636053a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens auto select = Ice::InstSelect::create(::function, result, condition, y.value, x.value); 636153a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens ::basicBlock->appendInst(select); 636253a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens 636353a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens return RValue<UInt4>(V(result)); 6364598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6365598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6366598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Type *UInt4::getType() 6367598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 63684cfd45760c4cc0fb821322a869a2979ca8226843Nicolas Capens return T(Ice::IceType_v4i32); 6369598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6370598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6371598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Float::Float(RValue<Int> cast) 6372598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6373598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *integer = Nucleus::createSIToFP(cast.value, Float::getType()); 6374598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6375598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(integer); 6376598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6377598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6378cfd963201e004f8b9b5b631812960d6985f03e75Alexis Hetu Float::Float(RValue<UInt> cast) 6379cfd963201e004f8b9b5b631812960d6985f03e75Alexis Hetu { 6380cfd963201e004f8b9b5b631812960d6985f03e75Alexis Hetu RValue<Float> result = Float(Int(cast & UInt(0x7FFFFFFF))) + 6381cfd963201e004f8b9b5b631812960d6985f03e75Alexis Hetu As<Float>((As<Int>(cast) >> 31) & As<Int>(Float(0x80000000u))); 6382cfd963201e004f8b9b5b631812960d6985f03e75Alexis Hetu 6383cfd963201e004f8b9b5b631812960d6985f03e75Alexis Hetu storeValue(result.value); 6384cfd963201e004f8b9b5b631812960d6985f03e75Alexis Hetu } 6385cfd963201e004f8b9b5b631812960d6985f03e75Alexis Hetu 6386598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Float::Float(float x) 6387598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6388598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(Nucleus::createConstantFloat(x)); 6389598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6390598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6391598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Float::Float(RValue<Float> rhs) 6392598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6393598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 6394598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6395598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6396598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Float::Float(const Float &rhs) 6397598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6398598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 6399598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 6400598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6401598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6402598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Float::Float(const Reference<Float> &rhs) 6403598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6404598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 6405598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 6406598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6407598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 640896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Float> Float::operator=(RValue<Float> rhs) 6409598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6410598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 6411598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6412598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return rhs; 6413598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6414598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 641596d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Float> Float::operator=(const Float &rhs) 6416598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6417598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 6418598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 6419598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6420598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Float>(value); 6421598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6422598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 642396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Float> Float::operator=(const Reference<Float> &rhs) 6424598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6425598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 6426598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 6427598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6428598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Float>(value); 6429598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6430598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6431598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float> operator+(RValue<Float> lhs, RValue<Float> rhs) 6432598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6433598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Float>(Nucleus::createFAdd(lhs.value, rhs.value)); 6434598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6435598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6436598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float> operator-(RValue<Float> lhs, RValue<Float> rhs) 6437598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6438598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Float>(Nucleus::createFSub(lhs.value, rhs.value)); 6439598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6440598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6441598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float> operator*(RValue<Float> lhs, RValue<Float> rhs) 6442598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6443598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Float>(Nucleus::createFMul(lhs.value, rhs.value)); 6444598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6445598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6446598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float> operator/(RValue<Float> lhs, RValue<Float> rhs) 6447598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6448598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Float>(Nucleus::createFDiv(lhs.value, rhs.value)); 6449598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6450598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 645196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Float> operator+=(Float &lhs, RValue<Float> rhs) 6452598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6453598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs + rhs; 6454598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6455598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 645696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Float> operator-=(Float &lhs, RValue<Float> rhs) 6457598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6458598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs - rhs; 6459598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6460598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 646196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Float> operator*=(Float &lhs, RValue<Float> rhs) 6462598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6463598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs * rhs; 6464598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6465598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 646696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Float> operator/=(Float &lhs, RValue<Float> rhs) 6467598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6468598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs / rhs; 6469598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6470598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6471598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float> operator+(RValue<Float> val) 6472598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6473598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return val; 6474598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6475598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6476598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float> operator-(RValue<Float> val) 6477598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6478598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Float>(Nucleus::createFNeg(val.value)); 6479598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6480598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6481598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator<(RValue<Float> lhs, RValue<Float> rhs) 6482598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6483598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createFCmpOLT(lhs.value, rhs.value)); 6484598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6485598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6486598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator<=(RValue<Float> lhs, RValue<Float> rhs) 6487598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6488598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createFCmpOLE(lhs.value, rhs.value)); 6489598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6490598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6491598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator>(RValue<Float> lhs, RValue<Float> rhs) 6492598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6493598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createFCmpOGT(lhs.value, rhs.value)); 6494598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6495598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6496598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator>=(RValue<Float> lhs, RValue<Float> rhs) 6497598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6498598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createFCmpOGE(lhs.value, rhs.value)); 6499598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6500598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6501598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator!=(RValue<Float> lhs, RValue<Float> rhs) 6502598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6503598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createFCmpONE(lhs.value, rhs.value)); 6504598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6505598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6506598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Bool> operator==(RValue<Float> lhs, RValue<Float> rhs) 6507598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6508598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Bool>(Nucleus::createFCmpOEQ(lhs.value, rhs.value)); 6509598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6510598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6511598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float> Abs(RValue<Float> x) 6512598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6513598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return IfThenElse(x > 0.0f, x, -x); 6514598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6515598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6516598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float> Max(RValue<Float> x, RValue<Float> y) 6517598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6518598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return IfThenElse(x > y, x, y); 6519598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6520598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6521598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float> Min(RValue<Float> x, RValue<Float> y) 6522598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6523598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return IfThenElse(x < y, x, y); 6524598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6525598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6526598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float> Rcp_pp(RValue<Float> x, bool exactAtPow2) 6527598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6528d52e936b2b4c8b7d646f54d47489bebe0389b4e9Nicolas Capens return 1.0f / x; 6529598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6530598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6531598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float> RcpSqrt_pp(RValue<Float> x) 6532598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6533d52e936b2b4c8b7d646f54d47489bebe0389b4e9Nicolas Capens return Rcp_pp(Sqrt(x)); 6534598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6535598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6536598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float> Sqrt(RValue<Float> x) 6537598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6538d52e936b2b4c8b7d646f54d47489bebe0389b4e9Nicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_f32); 6539d52e936b2b4c8b7d646f54d47489bebe0389b4e9Nicolas Capens const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::Sqrt, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; 6540d52e936b2b4c8b7d646f54d47489bebe0389b4e9Nicolas Capens auto target = ::context->getConstantUndef(Ice::IceType_i32); 6541d52e936b2b4c8b7d646f54d47489bebe0389b4e9Nicolas Capens auto sqrt = Ice::InstIntrinsicCall::create(::function, 1, result, target, intrinsic); 6542d52e936b2b4c8b7d646f54d47489bebe0389b4e9Nicolas Capens sqrt->addArg(x.value); 6543d52e936b2b4c8b7d646f54d47489bebe0389b4e9Nicolas Capens ::basicBlock->appendInst(sqrt); 6544d52e936b2b4c8b7d646f54d47489bebe0389b4e9Nicolas Capens 6545d52e936b2b4c8b7d646f54d47489bebe0389b4e9Nicolas Capens return RValue<Float>(V(result)); 6546598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6547598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6548598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float> Round(RValue<Float> x) 6549598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6550a8086514024d968e68c9eb82a52baac794881e59Nicolas Capens return Float4(Round(Float4(x))).x; 6551598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6552598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6553598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float> Trunc(RValue<Float> x) 6554598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6555a8086514024d968e68c9eb82a52baac794881e59Nicolas Capens return Float4(Trunc(Float4(x))).x; 6556598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6557598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6558598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float> Frac(RValue<Float> x) 6559598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6560a8086514024d968e68c9eb82a52baac794881e59Nicolas Capens return Float4(Frac(Float4(x))).x; 6561598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6562598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6563598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float> Floor(RValue<Float> x) 6564598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6565a8086514024d968e68c9eb82a52baac794881e59Nicolas Capens return Float4(Floor(Float4(x))).x; 6566598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6567598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6568598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float> Ceil(RValue<Float> x) 6569598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6570a8086514024d968e68c9eb82a52baac794881e59Nicolas Capens return Float4(Ceil(Float4(x))).x; 6571598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6572598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6573598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Type *Float::getType() 6574598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 65759709d4ffa1b82a98036334ad3bed463a8d6aafc6Nicolas Capens return T(Ice::IceType_f32); 6576598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6577598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6578598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Float2::Float2(RValue<Float4> cast) 6579598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 65802200878636ca416caedebec3b1d8c2734a0b64f3Nicolas Capens storeValue(Nucleus::createBitCast(cast.value, getType())); 6581598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6582598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6583598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Type *Float2::getType() 6584598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 65854cfd45760c4cc0fb821322a869a2979ca8226843Nicolas Capens return T(Type_v2f32); 6586598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6587598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6588cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Float4::Float4(RValue<Byte4> cast) : XYZW(this) 6589598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6590d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens Value *a = Int4(cast).loadValue(); 6591d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens Value *xyzw = Nucleus::createSIToFP(a, Float4::getType()); 6592d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens 6593d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens storeValue(xyzw); 6594598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6595598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6596cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Float4::Float4(RValue<SByte4> cast) : XYZW(this) 6597598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6598d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens Value *a = Int4(cast).loadValue(); 6599d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens Value *xyzw = Nucleus::createSIToFP(a, Float4::getType()); 6600d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens 6601d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens storeValue(xyzw); 6602598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6603598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6604cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Float4::Float4(RValue<Short4> cast) : XYZW(this) 6605598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6606598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Int4 c(cast); 6607598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(Nucleus::createSIToFP(RValue<Int4>(c).value, Float4::getType())); 6608598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6609598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6610cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Float4::Float4(RValue<UShort4> cast) : XYZW(this) 6611598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6612598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Int4 c(cast); 6613598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(Nucleus::createSIToFP(RValue<Int4>(c).value, Float4::getType())); 6614598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6615598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6616cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Float4::Float4(RValue<Int4> cast) : XYZW(this) 6617598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6618598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *xyzw = Nucleus::createSIToFP(cast.value, Float4::getType()); 6619598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6620598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(xyzw); 6621598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6622598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6623cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Float4::Float4(RValue<UInt4> cast) : XYZW(this) 6624598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 662596445fe36c80c3cb5443a29be673bedb7ad2fb2fNicolas Capens RValue<Float4> result = Float4(Int4(cast & UInt4(0x7FFFFFFF))) + 662696445fe36c80c3cb5443a29be673bedb7ad2fb2fNicolas Capens As<Float4>((As<Int4>(cast) >> 31) & As<Int4>(Float4(0x80000000u))); 6627598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 662896445fe36c80c3cb5443a29be673bedb7ad2fb2fNicolas Capens storeValue(result.value); 6629598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6630598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6631cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Float4::Float4() : XYZW(this) 6632598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6633598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6634598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6635cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Float4::Float4(float xyzw) : XYZW(this) 6636598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6637598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens constant(xyzw, xyzw, xyzw, xyzw); 6638598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6639598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6640cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Float4::Float4(float x, float yzw) : XYZW(this) 6641598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6642598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens constant(x, yzw, yzw, yzw); 6643598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6644598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6645cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Float4::Float4(float x, float y, float zw) : XYZW(this) 6646598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6647598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens constant(x, y, zw, zw); 6648598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6649598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6650cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Float4::Float4(float x, float y, float z, float w) : XYZW(this) 6651598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6652598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens constant(x, y, z, w); 6653598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6654598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6655598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens void Float4::constant(float x, float y, float z, float w) 6656598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 665713ac2327184133f5a69584ff2d69bc2cdeec1457Nicolas Capens double constantVector[4] = {x, y, z, w}; 66588dfd9a7616f89f269f9c46cc7659c6e1a7db1ec7Nicolas Capens storeValue(Nucleus::createConstantVector(constantVector, getType())); 6659598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6660598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6661cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Float4::Float4(RValue<Float4> rhs) : XYZW(this) 6662598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6663598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 6664598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6665598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6666cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Float4::Float4(const Float4 &rhs) : XYZW(this) 6667598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6668598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 6669598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 6670598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6671598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6672cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Float4::Float4(const Reference<Float4> &rhs) : XYZW(this) 6673598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6674598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 6675598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 6676598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6677598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6678cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Float4::Float4(RValue<Float> rhs) : XYZW(this) 6679598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6680f8beb4bedfdb11eca2f947afde79dd78b6386206Nicolas Capens Value *vector = Nucleus::createBitCast(rhs.value, Float4::getType()); 6681d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens 6682d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens int swizzle[4] = {0, 0, 0, 0}; 6683f8beb4bedfdb11eca2f947afde79dd78b6386206Nicolas Capens Value *replicate = Nucleus::createShuffleVector(vector, vector, swizzle); 6684d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens 6685d422796784e4af7026085c2f0e0f9cd92c677b35Nicolas Capens storeValue(replicate); 6686598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6687598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6688cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Float4::Float4(const Float &rhs) : XYZW(this) 6689598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6690598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens *this = RValue<Float>(rhs.loadValue()); 6691598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6692598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6693cb98676127fd976d4fee1269f606ad0d949bd9b9Nicolas Capens Float4::Float4(const Reference<Float> &rhs) : XYZW(this) 6694598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6695598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens *this = RValue<Float>(rhs.loadValue()); 6696598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6697598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 669896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Float4> Float4::operator=(float x) 6699598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6700598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return *this = Float4(x, x, x, x); 6701598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6702598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 670396d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Float4> Float4::operator=(RValue<Float4> rhs) 6704598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6705598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(rhs.value); 6706598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6707598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return rhs; 6708598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6709598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 671096d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Float4> Float4::operator=(const Float4 &rhs) 6711598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6712598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 6713598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 6714598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6715598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Float4>(value); 6716598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6717598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 671896d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Float4> Float4::operator=(const Reference<Float4> &rhs) 6719598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6720598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *value = rhs.loadValue(); 6721598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens storeValue(value); 6722598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6723598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Float4>(value); 6724598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6725598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 672696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Float4> Float4::operator=(RValue<Float> rhs) 6727598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6728598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return *this = Float4(rhs); 6729598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6730598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 673196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Float4> Float4::operator=(const Float &rhs) 6732598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6733598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return *this = Float4(rhs); 6734598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6735598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 673696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Float4> Float4::operator=(const Reference<Float> &rhs) 6737598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6738598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return *this = Float4(rhs); 6739598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6740598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6741598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float4> operator+(RValue<Float4> lhs, RValue<Float4> rhs) 6742598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6743598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Float4>(Nucleus::createFAdd(lhs.value, rhs.value)); 6744598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6745598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6746598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float4> operator-(RValue<Float4> lhs, RValue<Float4> rhs) 6747598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6748598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Float4>(Nucleus::createFSub(lhs.value, rhs.value)); 6749598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6750598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6751598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float4> operator*(RValue<Float4> lhs, RValue<Float4> rhs) 6752598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6753598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Float4>(Nucleus::createFMul(lhs.value, rhs.value)); 6754598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6755598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6756598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float4> operator/(RValue<Float4> lhs, RValue<Float4> rhs) 6757598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6758598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Float4>(Nucleus::createFDiv(lhs.value, rhs.value)); 6759598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6760598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6761598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float4> operator%(RValue<Float4> lhs, RValue<Float4> rhs) 6762598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6763598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Float4>(Nucleus::createFRem(lhs.value, rhs.value)); 6764598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6765598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 676696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Float4> operator+=(Float4 &lhs, RValue<Float4> rhs) 6767598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6768598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs + rhs; 6769598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6770598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 677196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Float4> operator-=(Float4 &lhs, RValue<Float4> rhs) 6772598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6773598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs - rhs; 6774598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6775598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 677696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Float4> operator*=(Float4 &lhs, RValue<Float4> rhs) 6777598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6778598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs * rhs; 6779598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6780598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 678196d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Float4> operator/=(Float4 &lhs, RValue<Float4> rhs) 6782598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6783598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs / rhs; 6784598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6785598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 678696d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Float4> operator%=(Float4 &lhs, RValue<Float4> rhs) 6787598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6788598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs % rhs; 6789598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6790598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6791598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float4> operator+(RValue<Float4> val) 6792598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6793598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return val; 6794598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6795598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6796598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float4> operator-(RValue<Float4> val) 6797598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6798598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return RValue<Float4>(Nucleus::createFNeg(val.value)); 6799598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6800598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6801598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float4> Abs(RValue<Float4> x) 6802598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 68038427224b0b9fb16613594714afbdd59877914ff1Nicolas Capens Value *vector = Nucleus::createBitCast(x.value, Int4::getType()); 68048427224b0b9fb16613594714afbdd59877914ff1Nicolas Capens int64_t constantVector[4] = {0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF}; 68058427224b0b9fb16613594714afbdd59877914ff1Nicolas Capens Value *result = Nucleus::createAnd(vector, V(Nucleus::createConstantVector(constantVector, Int4::getType()))); 68068427224b0b9fb16613594714afbdd59877914ff1Nicolas Capens 68078427224b0b9fb16613594714afbdd59877914ff1Nicolas Capens return As<Float4>(result); 6808598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6809598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6810598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float4> Max(RValue<Float4> x, RValue<Float4> y) 6811598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 681253a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens Ice::Variable *condition = ::function->makeVariable(Ice::IceType_v4i1); 68135cdb91a428353d525009b23eab6cbab07436fd46Nicolas Capens auto cmp = Ice::InstFcmp::create(::function, Ice::InstFcmp::Ogt, condition, x.value, y.value); 681453a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens ::basicBlock->appendInst(cmp); 681553a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens 681653a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_v4f32); 68175cdb91a428353d525009b23eab6cbab07436fd46Nicolas Capens auto select = Ice::InstSelect::create(::function, result, condition, x.value, y.value); 681853a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens ::basicBlock->appendInst(select); 681953a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens 682053a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens return RValue<Float4>(V(result)); 6821598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6822598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6823598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float4> Min(RValue<Float4> x, RValue<Float4> y) 6824598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 682553a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens Ice::Variable *condition = ::function->makeVariable(Ice::IceType_v4i1); 68265cdb91a428353d525009b23eab6cbab07436fd46Nicolas Capens auto cmp = Ice::InstFcmp::create(::function, Ice::InstFcmp::Olt, condition, x.value, y.value); 682753a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens ::basicBlock->appendInst(cmp); 682853a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens 682953a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_v4f32); 68305cdb91a428353d525009b23eab6cbab07436fd46Nicolas Capens auto select = Ice::InstSelect::create(::function, result, condition, x.value, y.value); 683153a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens ::basicBlock->appendInst(select); 683253a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens 683353a8a3f51d1d9e5de55d75e986c85414fdbec8a0Nicolas Capens return RValue<Float4>(V(result)); 6834598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6835598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6836598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float4> Rcp_pp(RValue<Float4> x, bool exactAtPow2) 6837598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6838d52e936b2b4c8b7d646f54d47489bebe0389b4e9Nicolas Capens return Float4(1.0f) / x; 6839598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6840598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6841598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float4> RcpSqrt_pp(RValue<Float4> x) 6842598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6843d52e936b2b4c8b7d646f54d47489bebe0389b4e9Nicolas Capens return Rcp_pp(Sqrt(x)); 6844598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6845598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6846598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float4> Sqrt(RValue<Float4> x) 6847598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6848091f350c0c1a18c7a05fa4b49ebb009e1710b3b8Nicolas Capens if(emulateIntrinsics || CPUID::ARM) 68499f737d3718ea156d8a91bcef87022df3a6b7aee6Nicolas Capens { 68509f737d3718ea156d8a91bcef87022df3a6b7aee6Nicolas Capens Float4 result; 68519f737d3718ea156d8a91bcef87022df3a6b7aee6Nicolas Capens result.x = Sqrt(Float(Float4(x).x)); 68529f737d3718ea156d8a91bcef87022df3a6b7aee6Nicolas Capens result.y = Sqrt(Float(Float4(x).y)); 68539f737d3718ea156d8a91bcef87022df3a6b7aee6Nicolas Capens result.z = Sqrt(Float(Float4(x).z)); 68549f737d3718ea156d8a91bcef87022df3a6b7aee6Nicolas Capens result.w = Sqrt(Float(Float4(x).w)); 6855d52e936b2b4c8b7d646f54d47489bebe0389b4e9Nicolas Capens 68569f737d3718ea156d8a91bcef87022df3a6b7aee6Nicolas Capens return result; 68579f737d3718ea156d8a91bcef87022df3a6b7aee6Nicolas Capens } 68589f737d3718ea156d8a91bcef87022df3a6b7aee6Nicolas Capens else 68599f737d3718ea156d8a91bcef87022df3a6b7aee6Nicolas Capens { 68609f737d3718ea156d8a91bcef87022df3a6b7aee6Nicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_v4f32); 68619f737d3718ea156d8a91bcef87022df3a6b7aee6Nicolas Capens const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::Sqrt, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; 68629f737d3718ea156d8a91bcef87022df3a6b7aee6Nicolas Capens auto target = ::context->getConstantUndef(Ice::IceType_i32); 68639f737d3718ea156d8a91bcef87022df3a6b7aee6Nicolas Capens auto sqrt = Ice::InstIntrinsicCall::create(::function, 1, result, target, intrinsic); 68649f737d3718ea156d8a91bcef87022df3a6b7aee6Nicolas Capens sqrt->addArg(x.value); 68659f737d3718ea156d8a91bcef87022df3a6b7aee6Nicolas Capens ::basicBlock->appendInst(sqrt); 68669f737d3718ea156d8a91bcef87022df3a6b7aee6Nicolas Capens 68679f737d3718ea156d8a91bcef87022df3a6b7aee6Nicolas Capens return RValue<Float4>(V(result)); 68689f737d3718ea156d8a91bcef87022df3a6b7aee6Nicolas Capens } 6869598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6870598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6871c94ab74f4570d4ce781645f6c4396778a15819c1Nicolas Capens RValue<Float4> Insert(RValue<Float4> x, RValue<Float> element, int i) 6872598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6873c94ab74f4570d4ce781645f6c4396778a15819c1Nicolas Capens return RValue<Float4>(Nucleus::createInsertElement(x.value, element.value, i)); 6874598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6875598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6876598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float> Extract(RValue<Float4> x, int i) 6877598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6878e95d534ac645273b3669ef62046d9aa612468e7eNicolas Capens return RValue<Float>(Nucleus::createExtractElement(x.value, Float::getType(), i)); 6879598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6880598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6881598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float4> Swizzle(RValue<Float4> x, unsigned char select) 6882598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6883e95d534ac645273b3669ef62046d9aa612468e7eNicolas Capens return RValue<Float4>(createSwizzle4(x.value, select)); 6884598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6885598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6886598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float4> ShuffleLowHigh(RValue<Float4> x, RValue<Float4> y, unsigned char imm) 6887598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 688837fbecee519c3fc4502f48f42cced9797c85361fNicolas Capens int shuffle[4] = 688937fbecee519c3fc4502f48f42cced9797c85361fNicolas Capens { 689037fbecee519c3fc4502f48f42cced9797c85361fNicolas Capens ((imm >> 0) & 0x03) + 0, 689137fbecee519c3fc4502f48f42cced9797c85361fNicolas Capens ((imm >> 2) & 0x03) + 0, 689237fbecee519c3fc4502f48f42cced9797c85361fNicolas Capens ((imm >> 4) & 0x03) + 4, 689337fbecee519c3fc4502f48f42cced9797c85361fNicolas Capens ((imm >> 6) & 0x03) + 4, 689437fbecee519c3fc4502f48f42cced9797c85361fNicolas Capens }; 689537fbecee519c3fc4502f48f42cced9797c85361fNicolas Capens 689637fbecee519c3fc4502f48f42cced9797c85361fNicolas Capens return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, shuffle)); 6897598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6898598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6899598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float4> UnpackLow(RValue<Float4> x, RValue<Float4> y) 6900598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 690137fbecee519c3fc4502f48f42cced9797c85361fNicolas Capens int shuffle[4] = {0, 4, 1, 5}; 690237fbecee519c3fc4502f48f42cced9797c85361fNicolas Capens return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, shuffle)); 6903598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6904598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6905598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float4> UnpackHigh(RValue<Float4> x, RValue<Float4> y) 6906598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 690737fbecee519c3fc4502f48f42cced9797c85361fNicolas Capens int shuffle[4] = {2, 6, 3, 7}; 690837fbecee519c3fc4502f48f42cced9797c85361fNicolas Capens return RValue<Float4>(Nucleus::createShuffleVector(x.value, y.value, shuffle)); 6909598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6910598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6911598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float4> Mask(Float4 &lhs, RValue<Float4> rhs, unsigned char select) 6912598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6913598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Value *vector = lhs.loadValue(); 6914a4c30b054c6a5359483e2fcc9d4d5ed658831a45Nicolas Capens Value *result = createMask4(vector, rhs.value, select); 6915a4c30b054c6a5359483e2fcc9d4d5ed658831a45Nicolas Capens lhs.storeValue(result); 6916598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6917a4c30b054c6a5359483e2fcc9d4d5ed658831a45Nicolas Capens return RValue<Float4>(result); 6918598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6919598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6920598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int> SignMask(RValue<Float4> x) 6921598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6922091f350c0c1a18c7a05fa4b49ebb009e1710b3b8Nicolas Capens if(emulateIntrinsics || CPUID::ARM) 6923d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens { 6924d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens Int4 xx = (As<Int4>(x) >> 31) & Int4(0x00000001, 0x00000002, 0x00000004, 0x00000008); 6925d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens return Extract(xx, 0) | Extract(xx, 1) | Extract(xx, 2) | Extract(xx, 3); 6926d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens } 6927d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens else 6928d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens { 6929d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_i32); 6930d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::SignMask, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; 6931d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens auto target = ::context->getConstantUndef(Ice::IceType_i32); 6932d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens auto movmsk = Ice::InstIntrinsicCall::create(::function, 1, result, target, intrinsic); 6933d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens movmsk->addArg(x.value); 6934d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens ::basicBlock->appendInst(movmsk); 6935f2cb9dff9c71cff304d98f0df7ffe6bebd6bc2bbNicolas Capens 6936d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens return RValue<Int>(V(result)); 6937d6cacadd302fa6ead3a0d6be47dcebd4ee36fa51Nicolas Capens } 6938598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6939598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6940598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> CmpEQ(RValue<Float4> x, RValue<Float4> y) 6941598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 69425e6ca097025a069d2c4da383a312ffcf35e44a19Nicolas Capens return RValue<Int4>(Nucleus::createFCmpOEQ(x.value, y.value)); 6943598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6944598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6945598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> CmpLT(RValue<Float4> x, RValue<Float4> y) 6946598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 69475e6ca097025a069d2c4da383a312ffcf35e44a19Nicolas Capens return RValue<Int4>(Nucleus::createFCmpOLT(x.value, y.value)); 6948598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6949598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6950598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> CmpLE(RValue<Float4> x, RValue<Float4> y) 6951598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 69525e6ca097025a069d2c4da383a312ffcf35e44a19Nicolas Capens return RValue<Int4>(Nucleus::createFCmpOLE(x.value, y.value)); 6953598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6954598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6955598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> CmpNEQ(RValue<Float4> x, RValue<Float4> y) 6956598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 69575e6ca097025a069d2c4da383a312ffcf35e44a19Nicolas Capens return RValue<Int4>(Nucleus::createFCmpONE(x.value, y.value)); 6958598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6959598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6960598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> CmpNLT(RValue<Float4> x, RValue<Float4> y) 6961598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 69625e6ca097025a069d2c4da383a312ffcf35e44a19Nicolas Capens return RValue<Int4>(Nucleus::createFCmpOGE(x.value, y.value)); 6963598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6964598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 6965598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Int4> CmpNLE(RValue<Float4> x, RValue<Float4> y) 6966598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 69675e6ca097025a069d2c4da383a312ffcf35e44a19Nicolas Capens return RValue<Int4>(Nucleus::createFCmpOGT(x.value, y.value)); 6968598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 6969598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 69708ef6d1097d9fe71a2461a5040bddb1893bdbed6cAlexis Hetu RValue<Int4> IsInf(RValue<Float4> x) 69718ef6d1097d9fe71a2461a5040bddb1893bdbed6cAlexis Hetu { 69728ef6d1097d9fe71a2461a5040bddb1893bdbed6cAlexis Hetu return CmpEQ(As<Int4>(x) & Int4(0x7FFFFFFF), Int4(0x7F800000)); 69738ef6d1097d9fe71a2461a5040bddb1893bdbed6cAlexis Hetu } 69748ef6d1097d9fe71a2461a5040bddb1893bdbed6cAlexis Hetu 69758ef6d1097d9fe71a2461a5040bddb1893bdbed6cAlexis Hetu RValue<Int4> IsNan(RValue<Float4> x) 69768ef6d1097d9fe71a2461a5040bddb1893bdbed6cAlexis Hetu { 69778ef6d1097d9fe71a2461a5040bddb1893bdbed6cAlexis Hetu return ~CmpEQ(x, x); 69788ef6d1097d9fe71a2461a5040bddb1893bdbed6cAlexis Hetu } 69798ef6d1097d9fe71a2461a5040bddb1893bdbed6cAlexis Hetu 6980598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float4> Round(RValue<Float4> x) 6981598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 6982091f350c0c1a18c7a05fa4b49ebb009e1710b3b8Nicolas Capens if(emulateIntrinsics || CPUID::ARM) 6983f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens { 6984f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens // Push the fractional part off the mantissa. Accurate up to +/-2^22. 6985f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens return (x + Float4(0x00C00000)) - Float4(0x00C00000); 6986f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens } 6987f7b758899c8a260de81bf9fdfea70cb4d7a9816bNicolas Capens else if(CPUID::SSE4_1) 69889ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens { 69899ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_v4f32); 69909ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::Round, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; 69919ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens auto target = ::context->getConstantUndef(Ice::IceType_i32); 69929ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens auto round = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic); 69939ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens round->addArg(x.value); 69949ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens round->addArg(::context->getConstantInt32(0)); 69959ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens ::basicBlock->appendInst(round); 69969ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens 69979ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens return RValue<Float4>(V(result)); 69989ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens } 69999ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens else 70009ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens { 70019ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens return Float4(RoundInt(x)); 70029ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens } 7003598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 7004598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 7005598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float4> Trunc(RValue<Float4> x) 7006598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 70079ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens if(CPUID::SSE4_1) 70089ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens { 70099ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_v4f32); 70109ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::Round, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; 70119ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens auto target = ::context->getConstantUndef(Ice::IceType_i32); 70129ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens auto round = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic); 70139ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens round->addArg(x.value); 70149ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens round->addArg(::context->getConstantInt32(3)); 70159ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens ::basicBlock->appendInst(round); 70169ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens 70179ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens return RValue<Float4>(V(result)); 70189ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens } 70199ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens else 70209ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens { 70219ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens return Float4(Int4(x)); 70229ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens } 7023598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 7024598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 7025598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float4> Frac(RValue<Float4> x) 7026598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 7027b923042e7737fcde817b648b399f86506dff3565Nicolas Capens Float4 frc; 7028b923042e7737fcde817b648b399f86506dff3565Nicolas Capens 70299ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens if(CPUID::SSE4_1) 70309ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens { 7031b923042e7737fcde817b648b399f86506dff3565Nicolas Capens frc = x - Floor(x); 70329ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens } 70339ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens else 70349ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens { 7035b923042e7737fcde817b648b399f86506dff3565Nicolas Capens frc = x - Float4(Int4(x)); // Signed fractional part. 70369ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens 7037b923042e7737fcde817b648b399f86506dff3565Nicolas Capens frc += As<Float4>(As<Int4>(CmpNLE(Float4(0.0f), frc)) & As<Int4>(Float4(1, 1, 1, 1))); // Add 1.0 if negative. 70389ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens } 7039b923042e7737fcde817b648b399f86506dff3565Nicolas Capens 7040b923042e7737fcde817b648b399f86506dff3565Nicolas Capens // x - floor(x) can be 1.0 for very small negative x. 7041b923042e7737fcde817b648b399f86506dff3565Nicolas Capens // Clamp against the value just below 1.0. 7042b923042e7737fcde817b648b399f86506dff3565Nicolas Capens return Min(frc, As<Float4>(Int4(0x3F7FFFFF))); 7043598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 7044598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 7045598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float4> Floor(RValue<Float4> x) 7046598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 70479ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens if(CPUID::SSE4_1) 70489ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens { 70499ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_v4f32); 70509ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::Round, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; 70519ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens auto target = ::context->getConstantUndef(Ice::IceType_i32); 70529ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens auto round = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic); 70539ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens round->addArg(x.value); 70549ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens round->addArg(::context->getConstantInt32(1)); 70559ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens ::basicBlock->appendInst(round); 70569ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens 70579ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens return RValue<Float4>(V(result)); 70589ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens } 70599ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens else 70609ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens { 70619ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens return x - Frac(x); 70629ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens } 7063598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 7064598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 7065598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Float4> Ceil(RValue<Float4> x) 7066598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 70679ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens if(CPUID::SSE4_1) 70689ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens { 70699ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens Ice::Variable *result = ::function->makeVariable(Ice::IceType_v4f32); 70709ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens const Ice::Intrinsics::IntrinsicInfo intrinsic = {Ice::Intrinsics::Round, Ice::Intrinsics::SideEffects_F, Ice::Intrinsics::ReturnsTwice_F, Ice::Intrinsics::MemoryWrite_F}; 70719ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens auto target = ::context->getConstantUndef(Ice::IceType_i32); 70729ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens auto round = Ice::InstIntrinsicCall::create(::function, 2, result, target, intrinsic); 70739ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens round->addArg(x.value); 70749ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens round->addArg(::context->getConstantInt32(2)); 70759ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens ::basicBlock->appendInst(round); 70769ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens 70779ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens return RValue<Float4>(V(result)); 70789ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens } 70799ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens else 70809ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens { 70819ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens return -Floor(-x); 70829ca48d5c2afe04f8ea54fd9cfaca5248099f4e4cNicolas Capens } 7083598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 7084598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 7085598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Type *Float4::getType() 7086598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 70879709d4ffa1b82a98036334ad3bed463a8d6aafc6Nicolas Capens return T(Ice::IceType_v4f32); 7088598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 7089598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 7090598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, int offset) 7091598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 70928820f64b43b5b41c15cbebd3bcf2a6078800d8daNicolas Capens return lhs + RValue<Int>(Nucleus::createConstantInt(offset)); 7093598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 7094598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 7095598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, RValue<Int> offset) 7096598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 7097d294def5b421885b259403efb9b1abddaae3a82cNicolas Capens return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value, Byte::getType(), offset.value, false)); 7098598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 7099598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 7100598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, RValue<UInt> offset) 7101598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 7102d294def5b421885b259403efb9b1abddaae3a82cNicolas Capens return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value, Byte::getType(), offset.value, true)); 7103598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 7104598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 710596d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, int offset) 7106598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 7107598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs + offset; 7108598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 7109598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 711096d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, RValue<Int> offset) 7111598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 7112598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs + offset; 7113598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 7114598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 711596d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Pointer<Byte>> operator+=(Pointer<Byte> &lhs, RValue<UInt> offset) 7116598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 7117598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs + offset; 7118598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 7119598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 7120598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, int offset) 7121598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 7122598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs + -offset; 7123598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 7124598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 7125598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, RValue<Int> offset) 7126598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 7127598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs + -offset; 7128598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 7129598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 7130598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, RValue<UInt> offset) 7131598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 7132598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs + -offset; 7133598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 7134598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 713596d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, int offset) 7136598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 7137598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs - offset; 7138598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 7139598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 714096d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, RValue<Int> offset) 7141598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 7142598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs - offset; 7143598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 7144598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 714596d4e09163d5979f9b695cea48975d8b89b3372bNicolas Capens RValue<Pointer<Byte>> operator-=(Pointer<Byte> &lhs, RValue<UInt> offset) 7146598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 7147598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens return lhs = lhs - offset; 7148598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 7149598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 7150598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens void Return() 7151598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 7152598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Nucleus::createRetVoid(); 7153598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Nucleus::setInsertBlock(Nucleus::createBasicBlock()); 7154598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Nucleus::createUnreachable(); 7155598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 7156598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 7157eb253d0b6c3d44e99804ad780d273008159246d8Nicolas Capens void Return(RValue<Int> ret) 7158598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 7159eb253d0b6c3d44e99804ad780d273008159246d8Nicolas Capens Nucleus::createRet(ret.value); 7160fdcca2dc47cab06f4dfe598ffd1c26c98e302e60Nicolas Capens Nucleus::setInsertBlock(Nucleus::createBasicBlock()); 7161fdcca2dc47cab06f4dfe598ffd1c26c98e302e60Nicolas Capens Nucleus::createUnreachable(); 7162598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 7163598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 7164f4eec2f957577bd5f97639863adf4da2e9a82c2bNicolas Capens void branch(RValue<Bool> cmp, BasicBlock *bodyBB, BasicBlock *endBB) 7165598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 7166598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Nucleus::createCondBr(cmp.value, bodyBB, endBB); 7167598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens Nucleus::setInsertBlock(bodyBB); 7168598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 7169598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens 7170598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens RValue<Long> Ticks() 7171598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens { 7172c37252c9efa50660790a22d1e8c5a39883f94022Nicolas Capens assert(false && "UNIMPLEMENTED"); return RValue<Long>(V(nullptr)); 7173598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens } 7174598f8d890f6c8de8f8565641902a3946d4a77919Nicolas Capens} 7175