teak-llvm/llvm/lib/Target/Teak/Teak.h
Gericom 3da44a85b7 Many bug fixes and improvements
Fixed invalid mpy instruction being generated
Fixed byte order of 32 bit values when emitted to the elf file
Support for addv/subv to modify 16 bit registers directly
Support for move 8bit immediate
Support for tst0 instruction
Support for directly adding p0 to an ab register after mpy
Support for 8 bit immediate multiply
Support for modr instruction
Support for post increase/decrement for loads and stores
Use copy instruction for a to a register moves
2020-07-28 16:42:11 +02:00

181 lines
5.1 KiB
C++

//===-- Teak.h - Top-level interface for Teak representation --*- 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 entry points for global functions defined in the LLVM
// LEG back-end.
//
//===----------------------------------------------------------------------===//
#ifndef TARGET_TEAK_H
#define TARGET_TEAK_H
#include "MCTargetDesc/TeakMCTargetDesc.h"
#include "llvm/Target/TargetMachine.h"
namespace llvm
{
class TargetMachine;
class TeakTargetMachine;
FunctionPass* createTeakISelDag(TeakTargetMachine &TM, CodeGenOpt::Level OptLevel);
FunctionPass* createTeakOptimizeMovImmPass();
namespace TeakCC
{
enum CondCodes
{
True = 0,
Eq,
Neq,
Gt,
Ge,
Lt,
Le,
Nn,
C,
V,
E,
L,
Nr,
Niu0,
Iu0,
Iu1
};
}
namespace TeakStepZIDS
{
enum Steps
{
Zero = 0,
AddOne = 1,
SubOne = 2,
AddStep = 3
};
}
inline static const char* TeakCCondCodeToString(TeakCC::CondCodes CC)
{
switch (CC)
{
case TeakCC::True:
return "always";
case TeakCC::Eq:
return "eq";
case TeakCC::Neq:
return "neq";
case TeakCC::Gt:
return "gt";
case TeakCC::Ge:
return "ge";
case TeakCC::Lt:
return "lt";
case TeakCC::Le:
return "le";
case TeakCC::Nn:
return "mn";
case TeakCC::C:
return "c";
case TeakCC::V:
return "v";
case TeakCC::E:
return "e";
case TeakCC::L:
return "l";
case TeakCC::Nr:
return "nr";
case TeakCC::Niu0:
return "niu0";
case TeakCC::Iu0:
return "iu0";
case TeakCC::Iu1:
return "iu1";
default:
llvm_unreachable("Invalid cond code");
}
}
inline static unsigned teakGetAbReg(unsigned reg)
{
switch(reg)
{
case Teak::A0: return Teak::A0;
case Teak::A0L: return Teak::A0;
case Teak::A0H: return Teak::A0;
case Teak::A0E: return Teak::A0;
case Teak::A1: return Teak::A1;
case Teak::A1L: return Teak::A1;
case Teak::A1H: return Teak::A1;
case Teak::A1E: return Teak::A1;
case Teak::B0: return Teak::B0;
case Teak::B0L: return Teak::B0;
case Teak::B0H: return Teak::B0;
case Teak::B0E: return Teak::B0;
case Teak::B1: return Teak::B1;
case Teak::B1L: return Teak::B1;
case Teak::B1H: return Teak::B1;
case Teak::B1E: return Teak::B1;
default:
llvm_unreachable("Invalid reg");
}
}
inline static unsigned teakGetAbLReg(unsigned reg)
{
switch(reg)
{
case Teak::A0: return Teak::A0L;
case Teak::A0L: return Teak::A0L;
case Teak::A1: return Teak::A1L;
case Teak::A1L: return Teak::A1L;
case Teak::B0: return Teak::B0L;
case Teak::B0L: return Teak::B0L;
case Teak::B1: return Teak::B1L;
case Teak::B1L: return Teak::B1L;
default:
llvm_unreachable("Invalid reg");
}
}
inline static unsigned teakGetAbHReg(unsigned reg)
{
switch(reg)
{
case Teak::A0: return Teak::A0H;
case Teak::A0H: return Teak::A0H;
case Teak::A1: return Teak::A1H;
case Teak::A1H: return Teak::A1H;
case Teak::B0: return Teak::B0H;
case Teak::B0H: return Teak::B0H;
case Teak::B1: return Teak::B1H;
case Teak::B1H: return Teak::B1H;
default:
llvm_unreachable("Invalid reg");
}
}
inline static unsigned teakGetAbEReg(unsigned reg)
{
switch(reg)
{
case Teak::A0: return Teak::A0E;
case Teak::A0E: return Teak::A0E;
case Teak::A1: return Teak::A1E;
case Teak::A1E: return Teak::A1E;
case Teak::B0: return Teak::B0E;
case Teak::B0E: return Teak::B0E;
case Teak::B1: return Teak::B1E;
case Teak::B1E: return Teak::B1E;
default:
llvm_unreachable("Invalid reg");
}
}
} // end namespace llvm;
#endif