149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//===-- NVPTXutil.cpp - Functions exported to CodeGen --*- C++ -*-===// 249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// 349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// The LLVM Compiler Infrastructure 449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// 549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// This file is distributed under the University of Illinois Open Source 649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// License. See LICENSE.TXT for details. 749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// 849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//===----------------------------------------------------------------------===// 949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// 1049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// This file contains the functions that can be used in CodeGen. 1149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// 1249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//===----------------------------------------------------------------------===// 1349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 1449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "NVPTXutil.h" 1549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "NVPTX.h" 1649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 1749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskiusing namespace llvm; 1849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 1949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskinamespace llvm { 2049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 213639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinskibool isParamLoad(const MachineInstr *MI) { 2249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski if ((MI->getOpcode() != NVPTX::LD_i32_avar) && 2349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski (MI->getOpcode() != NVPTX::LD_i64_avar)) 2449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return false; 2549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski if (MI->getOperand(2).isImm() == false) 2649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return false; 2749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski if (MI->getOperand(2).getImm() != NVPTX::PTXLdStInstCode::PARAM) 2849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return false; 2949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return true; 3049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} 3149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 323639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski#define DATA_MASK 0x7f 333639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski#define DIGIT_WIDTH 7 343639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski#define MORE_BYTES 0x80 3549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 363639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinskistatic int encode_leb128(uint64_t val, int *nbytes, char *space, int splen) { 3749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski char *a; 3849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski char *end = space + splen; 3949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 4049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski a = space; 4149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski do { 4249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski unsigned char uc; 4349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 4449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski if (a >= end) 4549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return 1; 4649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski uc = val & DATA_MASK; 4749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski val >>= DIGIT_WIDTH; 4849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski if (val != 0) 4949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski uc |= MORE_BYTES; 5049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski *a = uc; 5149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski a++; 5249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski } while (val); 5349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski *nbytes = a - space; 5449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return 0; 5549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} 5649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 5749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#undef DATA_MASK 5849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#undef DIGIT_WIDTH 5949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#undef MORE_BYTES 6049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 613639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinskiuint64_t encode_leb128(const char *str) { 623639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski union { 633639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski uint64_t x; 643639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski char a[8]; 653639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski } temp64; 6649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 6749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski temp64.x = 0; 6849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 693639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski for (unsigned i = 0, e = strlen(str); i != e; ++i) 703639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski temp64.a[i] = str[e - 1 - i]; 7149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 7249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski char encoded[16]; 7349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski int nbytes; 7449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 7549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski int retval = encode_leb128(temp64.x, &nbytes, encoded, 16); 7649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 773639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski (void) retval; 783639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski assert(retval == 0 && "Encoding to leb128 failed"); 7949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 8049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski assert(nbytes <= 8 && 8149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski "Cannot support register names with leb128 encoding > 8 bytes"); 8249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 8349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski temp64.x = 0; 843639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski for (int i = 0; i < nbytes; ++i) 8549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski temp64.a[i] = encoded[i]; 8649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 8749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski return temp64.x; 8849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} 8949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski 9049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} // end namespace llvm 91