public class AArch64MacroAssembler extends AArch64Assembler
| Modifier and Type | Class and Description |
|---|---|
static class |
AArch64MacroAssembler.AArch64ExceptionCode
Exception codes used when calling hlt instruction.
|
static class |
AArch64MacroAssembler.AdrpAddMacroInstruction |
static class |
AArch64MacroAssembler.AdrpLdrMacroInstruction |
static class |
AArch64MacroAssembler.MovSequenceAnnotation |
class |
AArch64MacroAssembler.ScratchRegister |
AArch64Assembler.BarrierKind, AArch64Assembler.ConditionFlag, AArch64Assembler.DataCacheOperationType, AArch64Assembler.ExtendType, AArch64Assembler.Instruction, AArch64Assembler.InstructionType, AArch64Assembler.LogicalBitmaskImmediateEncoding, AArch64Assembler.PatchableCodeAnnotation, AArch64Assembler.PatcherUtil, AArch64Assembler.PrefetchMode, AArch64Assembler.ShiftType, AArch64Assembler.SingleInstructionAnnotation, AArch64Assembler.SystemHint, AArch64Assembler.SystemRegisterAssembler.CodeAnnotation, Assembler.InstructionCounter, Assembler.LabelHint| Modifier and Type | Field and Description |
|---|---|
AArch64ASIMDMacroAssembler |
neon |
static int |
PREFERRED_BRANCH_TARGET_ALIGNMENT |
static int |
PREFERRED_LOOP_ALIGNMENT |
LoadFlagcodePatchingAnnotationConsumer| Constructor and Description |
|---|
AArch64MacroAssembler(TargetDescription target) |
| Modifier and Type | Method and Description |
|---|---|
void |
add(int size,
Register dst,
Register src,
int immediate)
dst = src + immediate.
|
void |
add(int size,
Register dst,
Register src,
int immediate,
Register scratch)
dst = src + immediate.
|
void |
add(int size,
Register dst,
Register src,
long immediate)
dst = src + immediate.
|
void |
add(int size,
Register dst,
Register src1,
Register src2)
dst = src1 + src2.
|
void |
add(int size,
Register dst,
Register src1,
Register src2,
AArch64Assembler.ShiftType shiftType,
int shiftAmt)
dst = src1 + shiftType(src2, shiftAmt & (size - 1)).
|
void |
adds(int size,
Register dst,
Register src,
int immediate)
dst = src + aimm and sets condition flags.
|
void |
adds(int size,
Register dst,
Register src1,
Register src2)
dst = src1 + src2 and sets condition flags.
|
void |
adr(Register dst,
Label label) |
void |
adrpAdd(Register dst)
Emits patchable adrp add sequence.
|
void |
adrpLdr(int srcSize,
Register result,
Register addressReg)
Emits patchable adrp ldr sequence.
|
void |
align(int modulus)
Aligns PC.
|
void |
and(int size,
Register dst,
Register src1,
Register src2)
dst = src1 & src2.
|
void |
ands(int size,
Register dst,
Register x,
Register y)
Sets condition flags according to result of x & y.
|
void |
asr(int size,
Register dst,
Register src,
long shiftAmt)
dst = src >> (shiftAmt & log2(size)).
|
void |
bic(int size,
Register dst,
Register src,
long imm)
dst = src & (~imm).
|
void |
bic(int size,
Register dst,
Register src1,
Register src2)
dst = src1 & (~src2).
|
void |
bics(int size,
Register dst,
Register src1,
Register src2)
dst = src1 & ~(src2) and sets condition flags.
|
void |
bind(Label l) |
void |
branchConditionally(AArch64Assembler.ConditionFlag condition)
Branches if condition is true.
|
void |
branchConditionally(AArch64Assembler.ConditionFlag condition,
Label label)
Branches to label if condition is true.
|
void |
brk(AArch64MacroAssembler.AArch64ExceptionCode exceptionCode)
Monitor mode software breakpoint: exception routed to a debug monitor executing in a higher
exception level.
|
void |
cacheWriteback(AArch64Address line) |
void |
cbnz(int size,
Register cmp,
Label label)
Compare register and branch if non-zero.
|
void |
cbz(int size,
Register cmp,
Label label)
Compare register and branch if zero.
|
static int |
clampShiftAmt(int size,
long shiftAmt)
Clamps shiftAmt into range 0 <= shiftamt < size according to JLS.
|
void |
cmp(int size,
Register x,
Register y)
Compares x and y and sets condition flags.
|
void |
cmp(int size,
Register x,
Register y,
AArch64Assembler.ExtendType extendType,
int shiftAmt)
Compares x to (extendType(y) << imm) and sets condition flags.
|
void |
compare(int size,
Register x,
int y)
Compares x to y and sets condition flags.
|
void |
csdb()
Consumption of Speculative Data Barrier.
|
void |
cset(int size,
Register dst,
AArch64Assembler.ConditionFlag condition)
Conditional set.
|
void |
deadLoad(int srcSize,
AArch64Address address,
boolean tryMerge)
Performs a load to the zero register.
|
void |
emitJumpTableOffset(Label jumpTable,
Label entryTarget)
Emits offset to store in JumpTable for given JumpTable start (
jumpTable) and jump
target (entryTarget). |
void |
ensureUniquePC()
Same as
AArch64MacroAssembler.nop(). |
void |
eon(int size,
Register dst,
Register src1,
Register src2)
dst = src1 ^ (~src2).
|
void |
eor(int size,
Register dst,
Register src1,
Register src2)
dst = src1 ^ src2.
|
void |
fldr(int size,
Register rt,
AArch64Address address)
Floating point load.
|
void |
fldr(int size,
Register rt,
AArch64Address address,
boolean tryMerge)
Floating point load.
|
void |
fmov(int size,
Register dst,
double imm)
C7.2.132 Floating-point move immediate (scalar)
Move immediate into floating-point register.
|
void |
fmov(int size,
Register dst,
Register src)
Moves integer to float, float to integer, or float to float.
|
void |
fstr(int size,
Register rt,
AArch64Address address)
Floating point store.
|
void |
fstr(int size,
Register rt,
AArch64Address address,
boolean tryMerge)
Floating point store.
|
void |
fullSystemBarrier()
Ensures current execution state is committed before continuing.
|
int |
getPCRelativeOffset(Label label)
Retrieves pc relative offset between current position and provided bound label.
|
AArch64Address |
getPlaceholder(int instructionStartPosition)
Returns a target specific placeholder address that can be used for code patching.
|
AArch64MacroAssembler.ScratchRegister |
getScratchRegister() |
void |
hlt(AArch64MacroAssembler.AArch64ExceptionCode exceptionCode)
Halting mode software breakpoint: Enters halting mode debug state if enabled, else treated as
UNALLOCATED instruction.
|
void |
illegal()
Create an invalid instruction to signify an error.
|
static boolean |
isBranchImmediateOffset(long imm) |
static boolean |
isComparisonImmediate(long imm)
Compare instructions are add/subtract instructions and so support unsigned 12-bit immediate
values (optionally left-shifted by 12).
|
static boolean |
isDoubleImmediate(double imm) |
static boolean |
isFloatImmediate(float imm) |
boolean |
isImmLoadStoreMerged() |
static boolean |
isLogicalImmediate(int size,
long imm) |
void |
jmp()
Immediate jump instruction fixed up by the runtime.
|
void |
jmp(Label label)
Jumps to label.
|
void |
jmp(Register dest)
Jump to address in dest.
|
void |
ldr(int srcSize,
Register rt,
AArch64Address address)
Loads a srcSize value from address into rt.
|
void |
ldr(int srcSize,
Register rt,
AArch64Address address,
boolean tryMerge)
Loads a srcSize value from address into rt.
|
void |
ldrs(int targetSize,
int srcSize,
Register rt,
AArch64Address address)
Loads a srcSize value from address into rt sign-extending it if necessary.
|
void |
loadAddress(Register dst,
AArch64Address address)
Loads memory address into register.
|
void |
loadAlignedAddress(int bitMemoryTransferSize,
Register dst,
Register base,
long displacement)
Loads requested base + displacement into destination register while also confirming the
displacement is properly aligned for the provided transfer size.
|
void |
loadExclusive(int size,
Register rt,
Register rn,
boolean acquire)
Load exclusive.
|
void |
lsl(int size,
Register dst,
Register src,
long shiftAmt)
C.6.2.179 Logical Shift Left (immediate).
|
void |
lsr(int size,
Register dst,
Register src,
long shiftAmt)
C.6.2.182 Logical Shift Right (immediate).
|
AArch64Address |
makeAddress(int bitMemoryTransferSize,
Register base,
int displacement)
Generates an address of the form
base + displacement. |
AArch64Address |
makeAddress(int bitMemoryTransferSize,
Register base,
long displacement)
Generates an address of the form
base + displacement. |
AArch64Address |
makeAddress(int bitMemoryTransferSize,
Register base,
long displacement,
Register scratchReg)
Returns an AArch64Address pointing to
base + displacement. |
void |
mneg(int size,
Register dst,
Register src1,
Register src2)
dst = 0 - src1 * src2.
|
void |
mov(int size,
Register dst,
Register src)
Generates a move between two general purpose registers.
|
void |
mov(Register dst,
int imm)
Loads immediate into register.
|
void |
mov(Register dst,
int imm,
boolean needsImmAnnotation)
Loads immediate into register.
|
void |
mov(Register dst,
long imm)
Loads immediate into register.
|
void |
mov(Register dst,
long imm,
boolean needsImmAnnotation)
Loads immediate into register.
|
void |
movNarrowAddress(Register dst,
long imm)
Generates a 32-bit immediate move code sequence.
|
void |
movNativeAddress(Register dst,
long imm)
Generates a 48-bit immediate move code sequence.
|
void |
movNativeAddress(Register dst,
long imm,
boolean needsImmAnnotation)
Generates a 48-bit immediate move code sequence.
|
void |
mul(int size,
Register dst,
Register src1,
Register src2)
dst = src1 * src2.
|
void |
neg(int size,
Register dst,
Register src)
dst = -src.
|
void |
neg(int size,
Register dst,
Register src,
AArch64Assembler.ShiftType shiftType,
int shiftAmt)
dst = -(shiftType(src, shiftAmt & (size - 1))).
|
void |
nop()
Executes no-op instruction.
|
void |
not(int size,
Register dst,
Register src)
dst = ~src.
|
void |
orn(int size,
Register dst,
Register src1,
Register src2)
dst = src1 | (~src2).
|
void |
orr(int size,
Register dst,
Register src1,
Register src2)
dst = src1 | src2.
|
protected void |
patchJumpTarget(int patchPos,
int jumpTarget)
Patches jump targets when label gets bound.
|
void |
pause() |
void |
popcnt(int size,
Register dst,
Register src,
Register vreg)
Count the set bits of src register.
|
void |
ror(int size,
Register dst,
Register src,
long shiftAmt)
Rotate right (immediate).
|
void |
ror(int size,
Register dst,
Register src1,
Register src2)
C.6.2.228 Rotate right (register).
|
void |
smnegl(Register dst,
Register src1,
Register src2)
Signed multiply-negate long.
|
void |
smulh(int size,
Register dst,
Register src1,
Register src2)
Signed multiply high.
|
void |
smull(Register dst,
Register src1,
Register src2)
Signed multiply long.
|
void |
storeExclusive(int size,
Register rs,
Register rt,
Register rn,
boolean release)
Store exclusive.
|
void |
str(int destSize,
Register rt,
AArch64Address address)
Stores register rt into memory pointed by address.
|
void |
str(int destSize,
Register rt,
AArch64Address address,
boolean tryMerge)
Stores register rt into memory pointed by address.
|
void |
sub(int size,
Register dst,
Register src,
int immediate)
dst = src - immediate.
|
void |
sub(int size,
Register dst,
Register src,
int immediate,
Register scratch)
dst = src - immediate.
|
void |
sub(int size,
Register dst,
Register src1,
Register src2)
dst = src1 - src2.
|
void |
sub(int size,
Register dst,
Register src1,
Register src2,
AArch64Assembler.ShiftType shiftType,
int shiftAmt)
dst = src1 - shiftType(src2, shiftAmt & (size-1)) and sets condition flags.
|
void |
subs(int size,
Register dst,
Register src,
int immediate)
dst = src - aimm and sets condition flags.
|
void |
subs(int size,
Register dst,
Register src1,
Register src2)
dst = src1 - src2 and sets condition flags.
|
void |
sxt(int destSize,
int srcSize,
Register dst,
Register src)
Sign-extend value from src into dst.
|
void |
tbnz(Register cmp,
int uimm6,
Label label)
Test a single bit and branch if the bit is nonzero.
|
void |
tbz(Register cmp,
int uimm6,
Label label)
Test a single bit and branch if the bit is zero.
|
AArch64Address |
tryMakeAddress(int bitMemoryTransferSize,
Register base,
long displacement)
Generates an address of the form
base + displacement. |
void |
tst(int size,
Register x,
long bimm)
C6.2.334 Test bits (immediate).
Sets condition flags according to the result of x & bimm |
void |
tst(int size,
Register x,
Register y)
C6.2.335 Test bits (register).
Sets condition flags according to the result of x & y |
void |
umulh(int size,
Register dst,
Register src1,
Register src2)
Unsigned multiply high.
|
add, adds, adds, adr, adr, adrp, and, ands, annotatePatchingImmediate, b, b, b, b, b, bfm, bic, bics, bl, blr, br, brk, cas, cbnz, cbnz, cbz, cbz, ccmp, clrex, cls, clz, csel, csinc, csneg, dc, dmb, dsb, eon, eor, extr, fabs, fadd, fccmp, fcmp, fcmpe, fcmpeZero, fcmpZero, fcsel, fcvt, fcvtzs, fdiv, fldp, fmadd, fmax, fmin, fmovCpu2Fpu, fmovFpu2Cpu, fmovFpu2Fpu, fmsub, fmul, fneg, frintm, frintn, frintp, frintz, fsqrt, fstp, fsub, getFeatures, getFlags, getLog2TransferSize, hint, hlt, insertLdpStp, isAddSubtractImmediate, isb, isFlagSet, ldadd, ldar, ldaxr, ldp, ldrHelper, ldxr, madd, movk, movn, movz, mrs, msr, msub, orn, orr, prfm, rbit, ret, rev, rorv, sbfm, scvtf, sdiv, smaddl, smsubl, smulh, stlr, stlxr, stp, stxr, sub, subs, subs, supports, swp, tbnz, tbnz, tbz, tbz, ubfm, udiv, umaddl, umulhclose, copy, createLabelName, emitByte, emitByte, emitInt, emitInt, emitLong, emitLong, emitShort, emitShort, emitString, emitString, emitString0, getByte, getInstructionCounter, getInt, getMachineCodeCallDisplacementOffset, getReturnAddressSize, getShort, inlineObjects, isTargetMP, nameOf, position, requestLabelHint, reset, setCodePatchingAnnotationConsumerpublic final AArch64ASIMDMacroAssembler neon
public static final int PREFERRED_LOOP_ALIGNMENT
public static final int PREFERRED_BRANCH_TARGET_ALIGNMENT
public AArch64MacroAssembler.ScratchRegister getScratchRegister()
public int getPCRelativeOffset(Label label)
public AArch64Address tryMakeAddress(int bitMemoryTransferSize, Register base, long displacement)
base + displacement.
Will return null if displacement cannot be represented directly as an immediate address.bitMemoryTransferSize - bit size of memory operation this address will be used in.base - general purpose register. May not be null or the zero register.displacement - arbitrary displacement added to base.base + displacement.public AArch64Address makeAddress(int bitMemoryTransferSize, Register base, long displacement, Register scratchReg)
base + displacement.
Will fail if displacement cannot be represented directly as an immediate address and a
scratch register is not provided.bitMemoryTransferSize - bit size of memory operation this address will be used in.scratchReg - scratch register to use if immediate addressing mode cannot be used. Should
be set to zero-register if scratch register is not available.public AArch64Address makeAddress(int bitMemoryTransferSize, Register base, long displacement)
base + displacement.
Will fail if displacement cannot be represented directly as an immediate address.bitMemoryTransferSize - bit size of memory operation this address will be used in.base - general purpose register. May not be null or the zero register.displacement - arbitrary displacement added to base.base + displacement.public AArch64Address makeAddress(int bitMemoryTransferSize, Register base, int displacement)
base + displacement.
Will fail if displacement cannot be represented directly as an immediate address.makeAddress in class AssemblerbitMemoryTransferSize - bit size of memory operation this address will be used in.base - general purpose register. May not be null or the zero register.displacement - arbitrary displacement added to base.base + displacement.public void loadAddress(Register dst,
AArch64Address address)
dst - general purpose register. May not be null, zero-register or stackpointer.address - address whose value is loaded into dst. May not be null,
POST_INDEXED,
PRE_INDEXED,
PAIR_SIGNED_SCALED,
PAIR_POST_INDEXED, or
PAIR PRE_INDEXED.public void loadAlignedAddress(int bitMemoryTransferSize,
Register dst,
Register base,
long displacement)
public boolean isImmLoadStoreMerged()
public void mov(int size,
Register dst,
Register src)
size - register size. Has to be 32 or 64.public void mov(Register dst,
int imm)
dst - general purpose register. May not be null, zero-register or stackpointer.imm - immediate loaded into register.public void mov(Register dst,
long imm)
dst - general purpose register. May not be null, zero-register or stackpointer.imm - immediate loaded into register.public void mov(Register dst,
int imm,
boolean needsImmAnnotation)
dst - general purpose register. May not be null, zero-register or stackpointer.imm - immediate loaded into register.needsImmAnnotation - Flag to signal of the immediate value should be annotated.public void mov(Register dst,
long imm,
boolean needsImmAnnotation)
dst - general purpose register. May not be null, zero-register or stackpointer.imm - immediate loaded into register.needsImmAnnotation - Flag to signal of the immediate value should be annotated.public void movNativeAddress(Register dst,
long imm)
dst - general purpose register. May not be null, stackpointer or zero-register.imm - public void movNativeAddress(Register dst,
long imm,
boolean needsImmAnnotation)
dst - general purpose register. May not be null, stackpointer or zero-register.imm - The immediate addressneedsImmAnnotation - Flag to signal of the immediate value should be annotated.public void movNarrowAddress(Register dst,
long imm)
dst - general purpose register. May not be null, stackpointer or zero-register.imm - public void ldrs(int targetSize,
int srcSize,
Register rt,
AArch64Address address)
ldrs in class AArch64AssemblertargetSize - size of target register in bits. Must be 32 or 64.srcSize - size of memory read in bits. Must be 8, 16 or 32 and smaller or equal to
targetSize.rt - general purpose register. May not be null or stackpointer.address - all addressing modes allowed. May not be null.public void deadLoad(int srcSize,
AArch64Address address,
boolean tryMerge)
public void ldr(int srcSize,
Register rt,
AArch64Address address)
ldr in class AArch64AssemblersrcSize - size of memory read in bits. Must be 8, 16 or 32 and smaller or equal to
targetSize.rt - general purpose register. May not be null or stackpointer.address - all addressing modes allowed. May not be null.public void ldr(int srcSize,
Register rt,
AArch64Address address,
boolean tryMerge)
public void str(int destSize,
Register rt,
AArch64Address address)
str in class AArch64AssemblerdestSize - number of bits written to memory. Must be 8, 16, 32 or 64.rt - general purpose register. May not be null or stackpointer.address - all addressing modes allowed. May not be null.public void str(int destSize,
Register rt,
AArch64Address address,
boolean tryMerge)
public void fldr(int size,
Register rt,
AArch64Address address)
fldr in class AArch64Assemblersize - number of bits read from memory into rt. Must be 8, 16, 32, 64 or 128.rt - floating point register. May not be null.address - all addressing modes allowed. May not be null.public void fldr(int size,
Register rt,
AArch64Address address,
boolean tryMerge)
public void fstr(int size,
Register rt,
AArch64Address address)
fstr in class AArch64Assemblersize - number of bits read from memory into rt. Must be 32 or 64.rt - floating point register. May not be null.address - all addressing modes allowed. May not be null.public void fstr(int size,
Register rt,
AArch64Address address,
boolean tryMerge)
public void loadExclusive(int size,
Register rt,
Register rn,
boolean acquire)
size - size of memory read in bits. Must be 8, 16, 32 or 64.rt - general purpose register. May not be null or stackpointer.rn - general purpose register.acquire - memory model flag. Decide whether the load has acquire semantics.public void storeExclusive(int size,
Register rs,
Register rt,
Register rn,
boolean release)
size - size of bits written to memory. Must be 8, 16, 32 or 64.rs - general purpose register. Set to exclusive access status. 0 means success,
everything else failure. May not be null, or stackpointer.rt - general purpose register. May not be null or stackpointer.rn - general purpose register.release - memory model flag. Decide whether the store has release semantics.public void cset(int size,
Register dst,
AArch64Assembler.ConditionFlag condition)
dst - general purpose register. May not be null or stackpointer.condition - any condition. May not be null.public void add(int size,
Register dst,
Register src1,
Register src2)
add in class AArch64Assemblersize - register size. Has to be 32 or 64.dst - general purpose register. May not be null. Can be zr if src1 != sp. Can be sp if
src1 != zr.src1 - general purpose register. May not be null. Can be zr if dst != sp. Can be sp if
dst != zr.src2 - general purpose register. May not be null or stackpointer.public void adds(int size,
Register dst,
Register src1,
Register src2)
adds in class AArch64Assemblersize - register size. Has to be 32 or 64.dst - general purpose register. May not be null or stackpointer.src1 - general purpose register. May not be null.src2 - general purpose register. May not be null or stackpointer.public void sub(int size,
Register dst,
Register src1,
Register src2)
sub in class AArch64Assemblersize - register size. Has to be 32 or 64.dst - general purpose register. May not be null. Can be zr if src1 != sp. Can be sp if
src1 != zr.src1 - general purpose register. May not be null. Can be zr if dst != sp. Can be sp if
dst != zr.src2 - general purpose register. May not be null or stackpointer.public void subs(int size,
Register dst,
Register src1,
Register src2)
subs in class AArch64Assemblersize - register size. Has to be 32 or 64.dst - general purpose register. May not be null or stackpointer.src1 - general purpose register. May not be null.src2 - general purpose register. May not be null or stackpointer.public void add(int size,
Register dst,
Register src1,
Register src2,
AArch64Assembler.ShiftType shiftType,
int shiftAmt)
add in class AArch64Assemblersize - register size. Has to be 32 or 64.dst - general purpose register. May not be null or stackpointer.src1 - general purpose register. May not be null or stackpointer.src2 - general purpose register. May not be null or stackpointer.shiftType - any type but ROR.shiftAmt - arbitrary shift amount.public void sub(int size,
Register dst,
Register src1,
Register src2,
AArch64Assembler.ShiftType shiftType,
int shiftAmt)
sub in class AArch64Assemblersize - register size. Has to be 32 or 64.dst - general purpose register. May not be null or stackpointer.src1 - general purpose register. May not be null or stackpointer.src2 - general purpose register. May not be null or stackpointer.shiftType - any type but ROR.shiftAmt - arbitrary shift amount.public void neg(int size,
Register dst,
Register src)
size - register size. Has to be 32 or 64.dst - general purpose register. May not be null or stackpointer.src - general purpose register. May not be null or stackpointer.public void neg(int size,
Register dst,
Register src,
AArch64Assembler.ShiftType shiftType,
int shiftAmt)
size - register size. Has to be 32 or 64.dst - general purpose register. May not be null or stackpointer.src - general purpose register. May not be null or stackpointer.shiftType - right or left shift, arithmetic or logical.shiftAmt - number of shift bits. Has to be between 0 and (size - 1).public void add(int size,
Register dst,
Register src,
int immediate,
Register scratch)
size - register size. Has to be 32 or 64.dst - general purpose register. May not be null or zero-register.src - general purpose register. May not be null or zero-register.immediate - 32-bit signed int.scratch - general purpose register to hold immediate value (if necessary).public void add(int size,
Register dst,
Register src,
int immediate)
add in class AArch64Assemblersize - register size. Has to be 32 or 64.dst - general purpose register. May not be null or zero-register.src - general purpose register. May not be null or zero-register.immediate - 32-bit signed intpublic void add(int size,
Register dst,
Register src,
long immediate)
size - register size. Has to be 32 or 64.dst - general purpose register. May not be null or zero-register.src - general purpose register. May not be null or zero-register.immediate - 64-bit signed intpublic void adds(int size,
Register dst,
Register src,
int immediate)
adds in class AArch64Assemblersize - register size. Has to be 32 or 64.dst - general purpose register. May not be null or stackpointer.src - general purpose register. May not be null or zero-register.immediate - arithmetic immediate.public void sub(int size,
Register dst,
Register src,
int immediate,
Register scratch)
size - register size. Has to be 32 or 64.dst - general purpose register. May not be null or zero-register.src - general purpose register. May not be null or zero-register.immediate - 32-bit signed int.scratch - general purpose register to hold immediate value (if necessary).public void sub(int size,
Register dst,
Register src,
int immediate)
sub in class AArch64Assemblersize - register size. Has to be 32 or 64.dst - general purpose register. May not be null or zero-register.src - general purpose register. May not be null or zero-register.immediate - 32-bit signed intpublic void subs(int size,
Register dst,
Register src,
int immediate)
subs in class AArch64Assemblersize - register size. Has to be 32 or 64.dst - general purpose register. May not be null or stackpointer.src - general purpose register. May not be null or zero-register.immediate - arithmetic immediate.public void mul(int size,
Register dst,
Register src1,
Register src2)
size - register size. Has to be 32 or 64.dst - general purpose register. May not be null or the stackpointer.src1 - general purpose register. May not be null or the stackpointer.src2 - general purpose register. May not be null or the stackpointer.public void mneg(int size,
Register dst,
Register src1,
Register src2)
size - register size. Has to be 32 or 64.dst - general purpose register. May not be null or the stackpointer.src1 - general purpose register. May not be null or the stackpointer.src2 - general purpose register. May not be null or the stackpointer.public void umulh(int size,
Register dst,
Register src1,
Register src2)
size - register size. Has to be 32 or 64.dst - general purpose register. May not be null or the stackpointer.src1 - general purpose register. May not be null or the stackpointer.src2 - general purpose register. May not be null or the stackpointer.public void smulh(int size,
Register dst,
Register src1,
Register src2)
size - register size. Has to be 32 or 64.dst - general purpose register. May not be null or the stackpointer.src1 - general purpose register. May not be null or the stackpointer.src2 - general purpose register. May not be null or the stackpointer.public void smull(Register dst,
Register src1,
Register src2)
dst - 64-bit general purpose register. May not be null or the stackpointer.src1 - 32-bit general purpose register. May not be null or the stackpointer.src2 - 32-bit general purpose register. May not be null or the stackpointer.public void smnegl(Register dst,
Register src1,
Register src2)
dst - 64-bit general purpose register. May not be null or the stackpointer.src1 - 32-bit general purpose register. May not be null or the stackpointer.src2 - 32-bit general purpose register. May not be null or the stackpointer.public static boolean isComparisonImmediate(long imm)
imm - immediate value to be tested.public void lsl(int size,
Register dst,
Register src,
long shiftAmt)
dst = src << (shiftAmt & (size - 1)).
lsl in class AArch64Assemblersize - register size. Has to be 32 or 64.dst - general purpose register. May not be null, stackpointer or zero-register.src - general purpose register. May not be null, stackpointer or zero-register.shiftAmt - amount by which src is shifted.public void lsr(int size,
Register dst,
Register src,
long shiftAmt)
dst = src >>> (shiftAmt & (size - 1)).
lsr in class AArch64Assemblersize - register size. Has to be 32 or 64.dst - general purpose register. May not be null, stackpointer or zero-register.src - general purpose register. May not be null, stackpointer or zero-register.shiftAmt - amount by which src is shifted.public void asr(int size,
Register dst,
Register src,
long shiftAmt)
asr in class AArch64Assemblersize - register size. Has to be 32 or 64.dst - general purpose register. May not be null, stackpointer or zero-register.src - general purpose register. May not be null, stackpointer or zero-register.shiftAmt - amount by which src is shifted.public void ror(int size,
Register dst,
Register src1,
Register src2)
size - register size. Has to be 32 or 64.dst - general purpose register. May not be null or stackpointer.src1 - general purpose register. May not be null or stackpointer.src2 - general purpose register. It holds a shift amount from 0 to (size - 1) in its
bottom 5 bits. May not be null or stackpointer.public void ror(int size,
Register dst,
Register src,
long shiftAmt)
size - register size. Has to be 32 or 64.dst - general purpose register. May not be null or stackpointer.src - general purpose register. May not be null or stackpointer.shiftAmt - amount by which src is rotated. The value depends on the instruction variant,
it can be 0 to (size - 1).public static int clampShiftAmt(int size,
long shiftAmt)
size - size of operation. Must be 32 or 64.shiftAmt - arbitrary shift amount.public void and(int size,
Register dst,
Register src1,
Register src2)
and in class AArch64Assemblersize - register size. Has to be 32 or 64.dst - general purpose register. May not be null or stackpointer.src1 - general purpose register. May not be null or stackpointer.src2 - general purpose register. May not be null or stackpointer.public void eor(int size,
Register dst,
Register src1,
Register src2)
eor in class AArch64Assemblersize - register size. Has to be 32 or 64.dst - general purpose register. May not be null or stackpointer.src1 - general purpose register. May not be null or stackpointer.src2 - general purpose register. May not be null or stackpointer.public void orr(int size,
Register dst,
Register src1,
Register src2)
orr in class AArch64Assemblersize - register size. Has to be 32 or 64.dst - general purpose register. May not be null or stackpointer.src1 - general purpose register. May not be null or stackpointer.src2 - general purpose register. May not be null or stackpointer.public void bic(int size,
Register dst,
Register src1,
Register src2)
size - register size. Has to be 32 or 64.dst - general purpose register. May not be null or stackpointer.src1 - general purpose register. May not be null or stackpointer.src2 - general purpose register. May not be null or stackpointer.public void bic(int size,
Register dst,
Register src,
long imm)
size - register size. Has to be 32 or 64.dst - general purpose register. May not be null or stackpointer.src - general purpose register. May not be null or stackpointer.imm - immediate to encode.public void eon(int size,
Register dst,
Register src1,
Register src2)
size - register size. Has to be 32 or 64.dst - general purpose register. May not be null or stackpointer.src1 - general purpose register. May not be null or stackpointer.src2 - general purpose register. May not be null or stackpointer.public void orn(int size,
Register dst,
Register src1,
Register src2)
size - register size. Has to be 32 or 64.dst - general purpose register. May not be null or stackpointer.src1 - general purpose register. May not be null or stackpointer.src2 - general purpose register. May not be null or stackpointer.public void not(int size,
Register dst,
Register src)
size - register size. Has to be 32 or 64.dst - general purpose register. May not be null or stackpointer.src - general purpose register. May not be null or stackpointer.public void bics(int size,
Register dst,
Register src1,
Register src2)
size - register size. Has to be 32 or 64.dst - general purpose register. May not be null or stackpointer.src1 - general purpose register. May not be null or stackpointer.src2 - general purpose register. May not be null or stackpointer.public void sxt(int destSize,
int srcSize,
Register dst,
Register src)
destSize - destination register size. Must be 32 or 64.srcSize - source register size. Must be smaller than destSize.dst - general purpose register. May not be null, stackpointer or zero-register.src - general purpose register. May not be null, stackpointer or zero-register.public static boolean isLogicalImmediate(int size,
long imm)
size - size of instruction immediate will be encoded within.imm - immediate to encode.public void fmov(int size,
Register dst,
Register src)
fmov in class AArch64Assemblersize - register size. Has to be 32 or 64.dst - Either floating-point or general-purpose register. If general-purpose register may
not be stackpointer or zero register. Cannot be null in any case.src - Either floating-point or general-purpose register. If general-purpose register may
not be stackpointer. Cannot be null in any case.public void fmov(int size,
Register dst,
double imm)
AArch64Assemblerfmov in class AArch64Assemblersize - register size. Has to be 32 or 64.dst - floating point register. May not be null.imm - immediate that is loaded into dst. If size is 32 only float immediates can be
loaded, i.e. (float) imm == imm must be true. In all cases
isFloatImmediate, respectively #isDoubleImmediate must be true
depending on size.public static boolean isDoubleImmediate(double imm)
public static boolean isFloatImmediate(float imm)
public void cmp(int size,
Register x,
Register y)
size - register size. Has to be 32 or 64.x - general purpose register. May not be null.y - general purpose register. May not be null or stackpointer.public void compare(int size,
Register x,
int y)
size - register size. Has to be 32 or 64.x - general purpose register. May not be null or zero-register.y - comparison immediate, AArch64MacroAssembler.isComparisonImmediate(long) has to be true for it.public void cmp(int size,
Register x,
Register y,
AArch64Assembler.ExtendType extendType,
int shiftAmt)
AArch64Assembler.subs(int, Register, Register, Register, ExtendType, int).size - register size. Has to be 32 or 64.x - general purpose register. May not be null or zero-register.y - general purpose register. May not be null or stackpointer.extendType - defines how y is extended to be the same size as x.shiftAmt - must be in range 0 to 4.public void ands(int size,
Register dst,
Register x,
Register y)
ands in class AArch64Assemblersize - register size. Has to be 32 or 64.dst - general purpose register. May not be null or stack-pointer.x - general purpose register. May not be null or stackpointer.y - general purpose register. May not be null or stackpointer.public void tst(int size,
Register x,
long bimm)
public void tst(int size,
Register x,
Register y)
public void adr(Register dst,
Label label)
public void cbnz(int size,
Register cmp,
Label label)
size - Instruction size in bits. Should be either 32 or 64.cmp - general purpose register. May not be null, zero-register or stackpointer.label - Can only handle 21-bit word-aligned offsets for now. May be unbound. Non null.public void cbz(int size,
Register cmp,
Label label)
size - Instruction size in bits. Should be either 32 or 64.cmp - general purpose register. May not be null, zero-register or stackpointer.label - Can only handle 21-bit word-aligned offsets for now. May be unbound. Non null.public void tbnz(Register cmp,
int uimm6,
Label label)
cmp - general purpose register. May not be null, zero-register or stackpointer.uimm6 - Unsigned 6-bit bit index.label - Can only handle 16-bit word-aligned offsets for now. May be unbound. Non null.public void tbz(Register cmp,
int uimm6,
Label label)
cmp - general purpose register. May not be null, zero-register or stackpointer.uimm6 - Unsigned 6-bit bit index.label - Can only handle 16-bit word-aligned offsets for now. May be unbound. Non null.public void branchConditionally(AArch64Assembler.ConditionFlag condition, Label label)
condition - any condition value allowed. Non null.label - Can only handle 21-bit word-aligned offsets for now. May be unbound. Non null.public void branchConditionally(AArch64Assembler.ConditionFlag condition)
condition - any condition value allowed. Non null.public void jmp(Label label)
public void jmp(Register dest)
public void jmp()
public void emitJumpTableOffset(Label jumpTable, Label entryTarget)
jumpTable) and jump
target (entryTarget).public static boolean isBranchImmediateOffset(long imm)
public void hlt(AArch64MacroAssembler.AArch64ExceptionCode exceptionCode)
exceptionCode - exception code specifying why halt was called. Non null.public void brk(AArch64MacroAssembler.AArch64ExceptionCode exceptionCode)
exceptionCode - exception code specifying why break was called. Non null.public void pause()
public void nop()
public void csdb()
public void fullSystemBarrier()
public void ensureUniquePC()
AArch64MacroAssembler.nop().ensureUniquePC in class Assemblerpublic void illegal()
public void align(int modulus)
protected void patchJumpTarget(int patchPos,
int jumpTarget)
patchJumpTarget in class Assemblerpublic AArch64Address getPlaceholder(int instructionStartPosition)
AssemblergetPlaceholder in class AssemblerinstructionStartPosition - The start of the instruction, i.e., the value that is used as
the key for looking up placeholder patching information.public void adrpAdd(Register dst)
public void popcnt(int size,
Register dst,
Register src,
Register vreg)
size - src register size. Has to be 32 or 64.dst - general purpose register. Should not be null or zero-register.src - general purpose register. Should not be null.vreg - SIMD register. Should not be null.public void cacheWriteback(AArch64Address line)
public void adrpLdr(int srcSize,
Register result,
Register addressReg)