34 #define DEBUG_NAME "compiler2/aarch64"
46 cf[1] = (inst >> 8) & 0xff;
47 cf[2] = (inst >> 16) & 0xff;
48 cf[3] = (inst >> 24) & 0xff;
59 if (off >= 0 && off <= 255 && (off % sz == 0)) {
60 em.
ldr(dst, base, off);
61 }
else if (off >= -256 && off <= 255) {
62 em.
ldur(dst, base, off);
63 }
else if (off < 0 && (-off) < 0xffff) {
70 em.
ldr(dst, base, off);
80 em.
stur(src, base, off);
82 em.
str(src, base, off);
114 if (value < 0 && -value-1 < 0xffff) {
115 em.
movn(reg, -value - 1);
119 em.
movz(reg, value & 0xffff);
123 u2 imm = (value >> 16) & 0xffff;
124 em.
movk(reg, imm, 1);
135 if (value < 0 && -value-1 < 0xffff) {
136 em.
movn(reg, -value - 1);
140 em.
movz(reg, value & 0xffff);
144 u2 imm = (value >> 16) & 0xffff;
145 em.
movk(reg, imm, 1);
148 if (v > 0xffffffff) {
149 u2 imm = (value >> 32) & 0xffff;
150 em.
movk(reg, imm, 2);
153 if (v > 0xffffffffffff) {
154 u2 imm = (value >> 48) & 0xffff;
155 em.
movk(reg, imm, 3);
170 if (this->
get(1).
op->is_Register()) {
172 }
else if (this->
get(1).
op->is_Immediate()) {
188 if (
get(0).
op->is_Register() &&
get(1).
op->is_Register()) {
191 ABORT_MSG(
"AddInst<T>::emit",
"Operand not in register.");
196 if (
get(1).
op->is_Register()) {
247 LOG2(
"JumpInst::emit: target not yet known (" <<
this <<
" to "
248 << *MBB <<
")" <<
nl);
257 LOG2(
"JumpInst::emit: jump to the next instruction -> can be omitted ("
258 <<
this <<
" to " << *MBB <<
")" <<
nl);
271 LOG2(
"JumpInst::link BI: " << *mbb <<
" idx: " << idx.idx <<
" CF begin: "
291 LOG2(
"CondJumpInst::emit: target not yet known (" <<
this <<
" to "
292 << *mbb <<
")" <<
nl);
299 ABORT_MSG(
"Aarch64 ERROR",
"CondJump offset 0 oO!");
302 LOG2(
"found offset of " << *mbb <<
": " << offset <<
nl);
319 u4 stp = 0xa9800000 | 0x1d | (0x1f << 5) | (0x1e << 10);
321 stp |= (imm & 0x7f) << 15;
325 u4 mov = 0x91000000 | 0x1d | (0x1f << 5);
343 u4 ldp = 0xa8c00000 | 0x1d | (0x1f << 5) | (0x1e << 10);
345 ldp |= (imm & 0x7f) << 15;
352 u4 ret = 0xd65f0000 | (0x1e << 5);
414 LOG2(
this <<
" offset: " << offset <<
" data index: " <<
data_index.idx
virtual void emit(Emitter &em) const
void cmp(const Reg &rn, s2 imm)
virtual void emit(Emitter &em) const
void movk(const Reg &rd, u2 imm, u1 shift=0)
void emitLConst(Emitter &em) const
CodeFragment get_CodeFragment(std::size_t size)
get a code fragment
bool is_stackslot() const
virtual void emit(CodeMemory *cm) const
emit machine code
CodeFragment get_aligned_CodeFragment(std::size_t size)
get an aligned code fragment
virtual void emit(Emitter &em) const
virtual void emit(Emitter &em) const
virtual void emit(Emitter &em) const
void emit(CodeMemory *cm)
virtual void emit(Emitter &em) const
virtual void link(CodeFragment &cf) const
link machine code
void fneg(const Reg &rd, const Reg &rn)
virtual void emit(CodeMemory *cm) const
emit machine code
Reg reg_op(std::size_t idx) const
void ldur(const Reg &rt, const Reg &rn, s2 imm=0)
virtual void emit(Emitter &em) const
void fmul(const Reg &rd, const Reg &rn, const Reg &rm)
s4 trap
A trap number as defined in aarch64/md-trap.hpp.
A basic block of (scheduled) machine instructions.
void csel(const Reg &rd, const Reg &rn, const Reg &rm, Cond::COND cond)
virtual void emit(CodeMemory *cm) const
emit machine code
void fadd(const Reg &rd, const Reg &rn, const Reg &rm)
void movz(const Reg &rd, u2 imm)
void sxth(const Reg &rd, const Reg &rn)
void fcvt(const Reg &rd, const Reg &rn)
MachineOperandDesc result
void add(const Reg &rd, const Reg &rn, s2 imm)
void msub(const Reg &rd, const Reg &rn, const Reg &rm, const Reg &ra)
void neg(const Reg &rd, const Reg &rm)
virtual void link(CodeFragment &cf) const
link machine code
void str(const Reg &rt, const Reg &rn, s2 imm=0)
virtual void emit(Emitter &em) const
MachineBasicBlock * successor_back() const
virtual void link(CodeFragment &CF) const
link machine code
virtual void emit(Emitter &em) const
std::size_t size() const
get size
virtual void emit(Emitter &em) const
void bcond(u1 cond, s4 offset)
virtual uintptr_t get_mpc() const =0
get the absolute position in code segment
const CodeSegment & get_CodeSegment() const
get CodeSegment
virtual void emit(Emitter &em) const
static bool is_invalid(IdxTy idx)
is invalid index
void require_linking(const MachineInstruction *, CodeFragment CF)
Add a MachineInstruction that require linking.
MachineBasicBlock * successor_front() const
virtual void emit(Emitter &em) const
virtual void emit(Emitter &em) const
void sdiv(const Reg &rd, const Reg &rn, const Reg &rm)
s4 get_offset(CodeSegment::IdxTy to, CodeSegment::IdxTy from) const
virtual void emit(Emitter &em) const
virtual void emit(Emitter &em) const
Type::TypeID resultT() const
void andd(const Reg &rd, const Reg &rn, const Reg &rm)
Segment< Tag, RefCategory > * get_Segment() const
Get containing segment.
Immediate * cast_to< Immediate >(MachineOperand *op)
virtual void emit(Emitter &em) const
void fdiv(const Reg &rd, const Reg &rn, const Reg &rm)
CodeMemory * get_CodeMemory() const
Get containing CodeMemory.
IdxTy get_end() const
Get the index of the first element after the reference.
virtual void emit(CodeMemory *cm) const
emit machine code
static void emitRaw(CodeMemory *cm, u4 inst)
void sub(const Reg &rd, const Reg &rn, s2 imm)
virtual void emit(Emitter &em) const
#define UNIMPLEMENTED_MSG(EXPR_LONG)
void scvtf(const Reg &rd, const Reg &rn)
virtual void reposition(intptr_t base)=0
reposition to another base
void movn(const Reg &rd, u2 imm)
std::size_t size() const
size of the reference
virtual void emit(Emitter &em) const
PointerTag< CodeSegmentType, const MachineBasicBlock, LabelID > CSLabel
void stur(const Reg &rt, const Reg &rn, s2 imm=0)
virtual void emit(Emitter &em) const
void set_target(MachineBasicBlock *target)
virtual void emit(Emitter &em) const
virtual void emit(Emitter &em) const
virtual void emit(CodeMemory *cm) const
emit machine code
void emitIConst(Emitter &em) const
IdxTy get_index(Tag2 tag) const
get the index of a tag
void fmov(const Reg &rd, const Reg &rn)
virtual void link(CodeFragment &cf) const
link machine code
virtual void emit(Emitter &em) const
virtual void emit(CodeMemory *cm) const
emit machine code
virtual void emit(Emitter &em) const
void mul(const Reg &rd, const Reg &rn, const Reg &rm)
void sxtb(const Reg &rd, const Reg &rn)
DataSegment::IdxTy data_index
void sxtw(const Reg &xd, const Reg &wn)
virtual void emit(Emitter &em) const
void fcmp(const Reg &rn, const Reg &rm)
virtual void emit(Emitter &em) const
void emit_nop(codegendata *cd)
virtual void emit(Emitter &em) const
void fsub(const Reg &rd, const Reg &rn, const Reg &rm)
void mov(const Reg &rd, const Reg &rm)
s4 trap
A trap number as defined in aarch64/md-trap.hpp.
virtual void emit(Emitter &em) const
void ldr(const Reg &rt, s4 offset)
void trap(const Reg &rd, int type)
virtual void emit(Emitter &em) const
IdxTy get_begin() const
Get the index of the first element.
virtual void emit(Emitter &em) const
virtual void emit(CodeMemory *cm) const
emit machine code
void uxth(const Reg &wd, const Reg &wn)
#define ABORT_MSG(EXPR_SHORT, EXPR_LONG)
void ubfx(const Reg &wd, const Reg &wn)
const DataSegment & get_DataSegment() const
get DataSegment
virtual void emit(Emitter &em) const