mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-04 05:17:07 +00:00 
			
		
		
		
	A new backend supporting AMD GPUs: Radeon HD2XXX - HD7XXX git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@169915 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			133 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
//===-- AMDGPUInstPrinter.cpp - AMDGPU MC Inst -> ASM ---------------------===//
 | 
						|
//
 | 
						|
//                     The LLVM Compiler Infrastructure
 | 
						|
//
 | 
						|
// This file is distributed under the University of Illinois Open Source
 | 
						|
// License. See LICENSE.TXT for details.
 | 
						|
//
 | 
						|
// \file
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
 | 
						|
#include "AMDGPUInstPrinter.h"
 | 
						|
#include "MCTargetDesc/AMDGPUMCTargetDesc.h"
 | 
						|
#include "llvm/MC/MCInst.h"
 | 
						|
 | 
						|
using namespace llvm;
 | 
						|
 | 
						|
void AMDGPUInstPrinter::printInst(const MCInst *MI, raw_ostream &OS,
 | 
						|
                             StringRef Annot) {
 | 
						|
  printInstruction(MI, OS);
 | 
						|
 | 
						|
  printAnnotation(OS, Annot);
 | 
						|
}
 | 
						|
 | 
						|
void AMDGPUInstPrinter::printOperand(const MCInst *MI, unsigned OpNo,
 | 
						|
                                     raw_ostream &O) {
 | 
						|
 | 
						|
  const MCOperand &Op = MI->getOperand(OpNo);
 | 
						|
  if (Op.isReg()) {
 | 
						|
    switch (Op.getReg()) {
 | 
						|
    // This is the default predicate state, so we don't need to print it.
 | 
						|
    case AMDGPU::PRED_SEL_OFF: break;
 | 
						|
    default: O << getRegisterName(Op.getReg()); break;
 | 
						|
    }
 | 
						|
  } else if (Op.isImm()) {
 | 
						|
    O << Op.getImm();
 | 
						|
  } else if (Op.isFPImm()) {
 | 
						|
    O << Op.getFPImm();
 | 
						|
  } else {
 | 
						|
    assert(!"unknown operand type in printOperand");
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
void AMDGPUInstPrinter::printMemOperand(const MCInst *MI, unsigned OpNo,
 | 
						|
                                        raw_ostream &O) {
 | 
						|
  printOperand(MI, OpNo, O);
 | 
						|
  O  << ", ";
 | 
						|
  printOperand(MI, OpNo + 1, O);
 | 
						|
}
 | 
						|
 | 
						|
void AMDGPUInstPrinter::printIfSet(const MCInst *MI, unsigned OpNo,
 | 
						|
                                    raw_ostream &O, StringRef Asm) {
 | 
						|
  const MCOperand &Op = MI->getOperand(OpNo);
 | 
						|
  assert(Op.isImm());
 | 
						|
  if (Op.getImm() == 1) {
 | 
						|
    O << Asm;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
void AMDGPUInstPrinter::printAbs(const MCInst *MI, unsigned OpNo,
 | 
						|
                                 raw_ostream &O) {
 | 
						|
  printIfSet(MI, OpNo, O, "|");
 | 
						|
}
 | 
						|
 | 
						|
void AMDGPUInstPrinter::printClamp(const MCInst *MI, unsigned OpNo,
 | 
						|
                                   raw_ostream &O) {
 | 
						|
  printIfSet(MI, OpNo, O, "_SAT");
 | 
						|
}
 | 
						|
 | 
						|
void AMDGPUInstPrinter::printLiteral(const MCInst *MI, unsigned OpNo,
 | 
						|
                                     raw_ostream &O) {
 | 
						|
  union Literal {
 | 
						|
    float f;
 | 
						|
    int32_t i;
 | 
						|
  } L;
 | 
						|
 | 
						|
  L.i = MI->getOperand(OpNo).getImm();
 | 
						|
  O << L.i << "(" << L.f << ")";
 | 
						|
}
 | 
						|
 | 
						|
void AMDGPUInstPrinter::printLast(const MCInst *MI, unsigned OpNo,
 | 
						|
                                  raw_ostream &O) {
 | 
						|
  printIfSet(MI, OpNo, O, " *");
 | 
						|
}
 | 
						|
 | 
						|
void AMDGPUInstPrinter::printNeg(const MCInst *MI, unsigned OpNo,
 | 
						|
                                 raw_ostream &O) {
 | 
						|
  printIfSet(MI, OpNo, O, "-");
 | 
						|
}
 | 
						|
 | 
						|
void AMDGPUInstPrinter::printOMOD(const MCInst *MI, unsigned OpNo,
 | 
						|
                                  raw_ostream &O) {
 | 
						|
  switch (MI->getOperand(OpNo).getImm()) {
 | 
						|
  default: break;
 | 
						|
  case 1:
 | 
						|
    O << " * 2.0";
 | 
						|
    break;
 | 
						|
  case 2:
 | 
						|
    O << " * 4.0";
 | 
						|
    break;
 | 
						|
  case 3:
 | 
						|
    O << " / 2.0";
 | 
						|
    break;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
void AMDGPUInstPrinter::printRel(const MCInst *MI, unsigned OpNo,
 | 
						|
                                 raw_ostream &O) {
 | 
						|
  const MCOperand &Op = MI->getOperand(OpNo);
 | 
						|
  if (Op.getImm() != 0) {
 | 
						|
    O << " + " << Op.getImm();
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
void AMDGPUInstPrinter::printUpdateExecMask(const MCInst *MI, unsigned OpNo,
 | 
						|
                                            raw_ostream &O) {
 | 
						|
  printIfSet(MI, OpNo, O, "ExecMask,");
 | 
						|
}
 | 
						|
 | 
						|
void AMDGPUInstPrinter::printUpdatePred(const MCInst *MI, unsigned OpNo,
 | 
						|
                                        raw_ostream &O) {
 | 
						|
  printIfSet(MI, OpNo, O, "Pred,");
 | 
						|
}
 | 
						|
 | 
						|
void AMDGPUInstPrinter::printWrite(const MCInst *MI, unsigned OpNo,
 | 
						|
                                       raw_ostream &O) {
 | 
						|
  const MCOperand &Op = MI->getOperand(OpNo);
 | 
						|
  if (Op.getImm() == 0) {
 | 
						|
    O << " (MASKED)";
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
#include "AMDGPUGenAsmWriter.inc"
 |