mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-19 03:25:54 -04:00

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
181 lines
5.1 KiB
C++
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 |