//===-- NVPTXutil.cpp - Functions exported to CodeGen --*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file contains the functions that can be used in CodeGen. // //===----------------------------------------------------------------------===// #include "NVPTXutil.h" #include "NVPTX.h" using namespace llvm; namespace llvm { bool isParamLoad(const MachineInstr *MI) { if ((MI->getOpcode() != NVPTX::LD_i32_avar) && (MI->getOpcode() != NVPTX::LD_i64_avar)) return false; if (MI->getOperand(2).isImm() == false) return false; if (MI->getOperand(2).getImm() != NVPTX::PTXLdStInstCode::PARAM) return false; return true; } #define DATA_MASK 0x7f #define DIGIT_WIDTH 7 #define MORE_BYTES 0x80 static int encode_leb128(uint64_t val, int *nbytes, char *space, int splen) { char *a; char *end = space + splen; a = space; do { unsigned char uc; if (a >= end) return 1; uc = val & DATA_MASK; val >>= DIGIT_WIDTH; if (val != 0) uc |= MORE_BYTES; *a = uc; a++; } while (val); *nbytes = a - space; return 0; } #undef DATA_MASK #undef DIGIT_WIDTH #undef MORE_BYTES uint64_t encode_leb128(const char *str) { union { uint64_t x; char a[8]; } temp64; temp64.x = 0; for (unsigned i=0,e=strlen(str); i!=e; ++i) temp64.a[i] = str[e-1-i]; char encoded[16]; int nbytes; int retval = encode_leb128(temp64.x, &nbytes, encoded, 16); (void)retval; assert(retval == 0 && "Encoding to leb128 failed"); assert(nbytes <= 8 && "Cannot support register names with leb128 encoding > 8 bytes"); temp64.x = 0; for (int i=0; i<nbytes; ++i) temp64.a[i] = encoded[i]; return temp64.x; } } // end namespace llvm