mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-03 14:21:30 +00:00 
			
		
		
		
	Hopefully this resolves any outstanding style issues and gives us an automated way of ensuring we conform to the style guidelines. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@178415 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			91 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
//===-- 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
 |