Documentation
¶
Overview ¶
Package arm64 encodes the subset of A64 instructions the JIT emits.
Methods append one instruction each. Branches take labels, which are resolved by Code. Encodings follow the Arm Architecture Reference Manual; asm_test.go checks them against the system assembler.
Index ¶
- Variables
- type Asm
- func (a *Asm) Add(rd, rn, rm Reg)
- func (a *Asm) AddImm(rd, rn Reg, imm uint32)
- func (a *Asm) AddShifted(rd, rn, rm Reg, shift uint32)
- func (a *Asm) And(rd, rn, rm Reg)
- func (a *Asm) Asr(rd, rn Reg, shift uint32)
- func (a *Asm) B(l Label)
- func (a *Asm) BCond(c Cond, l Label)
- func (a *Asm) Bind(l Label)
- func (a *Asm) Br(rn Reg)
- func (a *Asm) Cbnz(rt Reg, l Label)
- func (a *Asm) Cbz(rt Reg, l Label)
- func (a *Asm) Cmp(rn, rm Reg)
- func (a *Asm) CmpImm(rn Reg, imm uint32)
- func (a *Asm) Code() ([]byte, error)
- func (a *Asm) Csel(rd, rn, rm Reg, c Cond)
- func (a *Asm) Eor(rd, rn, rm Reg)
- func (a *Asm) Fabs(fd, fn FReg)
- func (a *Asm) Fadd(fd, fn, fm FReg)
- func (a *Asm) Fcmp(fn, fm FReg)
- func (a *Asm) FcvtDS(fd, fn FReg)
- func (a *Asm) FcvtSD(fd, fn FReg)
- func (a *Asm) Fcvtzs(rd Reg, fn FReg)
- func (a *Asm) Fcvtzu(rd Reg, fn FReg)
- func (a *Asm) Fdiv(fd, fn, fm FReg)
- func (a *Asm) Fmadd(fd, fn, fm, fa FReg)
- func (a *Asm) Fmov(fd, fn FReg)
- func (a *Asm) FmovFromF(rd Reg, fn FReg)
- func (a *Asm) FmovToF(fd FReg, rn Reg)
- func (a *Asm) Fmsub(fd, fn, fm, fa FReg)
- func (a *Asm) Fmul(fd, fn, fm FReg)
- func (a *Asm) Fneg(fd, fn FReg)
- func (a *Asm) Frintm(fd, fn FReg)
- func (a *Asm) Frintp(fd, fn FReg)
- func (a *Asm) Fsqrt(fd, fn FReg)
- func (a *Asm) Fsub(fd, fn, fm FReg)
- func (a *Asm) Ldr(rt, rn Reg, off uint32)
- func (a *Asm) LdrD(ft FReg, rn Reg, off uint32)
- func (a *Asm) LdrS(ft FReg, rn Reg, off uint32)
- func (a *Asm) LdrW(rt, rn Reg, off uint32)
- func (a *Asm) Ldrb(rt, rn Reg, off uint32)
- func (a *Asm) Ldrsw(rt, rn Reg, off uint32)
- func (a *Asm) Len() int
- func (a *Asm) Lslv(rd, rn, rm Reg)
- func (a *Asm) Lsr(rd, rn Reg, shift uint32)
- func (a *Asm) Lsrv(rd, rn, rm Reg)
- func (a *Asm) Mov(rd, rm Reg)
- func (a *Asm) MovImm(rd Reg, v uint64)
- func (a *Asm) Msub(rd, rn, rm, ra Reg)
- func (a *Asm) Mul(rd, rn, rm Reg)
- func (a *Asm) Mvn(rd, rm Reg)
- func (a *Asm) Neg(rd, rm Reg)
- func (a *Asm) NewLabel() Label
- func (a *Asm) Offset(l Label) int
- func (a *Asm) Orr(rd, rn, rm Reg)
- func (a *Asm) Ret()
- func (a *Asm) Scvtf(fd FReg, rn Reg)
- func (a *Asm) Sdiv(rd, rn, rm Reg)
- func (a *Asm) Smulh(rd, rn, rm Reg)
- func (a *Asm) Str(rt, rn Reg, off uint32)
- func (a *Asm) StrD(ft FReg, rn Reg, off uint32)
- func (a *Asm) StrS(ft FReg, rn Reg, off uint32)
- func (a *Asm) StrW(rt, rn Reg, off uint32)
- func (a *Asm) Strb(rt, rn Reg, off uint32)
- func (a *Asm) Sub(rd, rn, rm Reg)
- func (a *Asm) SubImm(rd, rn Reg, imm uint32)
- func (a *Asm) SubsImm(rd, rn Reg, imm uint32)
- func (a *Asm) Tbnz(rt Reg, b uint32, l Label)
- func (a *Asm) Tbz(rt Reg, b uint32, l Label)
- func (a *Asm) Ucvtf(fd FReg, rn Reg)
- func (a *Asm) Udiv(rd, rn, rm Reg)
- type Cond
- type FReg
- type Label
- type Reg
Constants ¶
This section is empty.
Variables ¶
var ErrTestRange = errors.New("arm64: test branch out of range")
ErrTestRange is Code's error for a Tbz or Tbnz farther than ±32 KB from its label, which LongTests allows.
Functions ¶
This section is empty.
Types ¶
type Asm ¶
type Asm struct {
// LongTests makes Tbz and Tbnz reach any label, as two instructions:
// the opposite test, skipping an unconditional branch to the label.
// Without it they reach ±32 KB, and Code reports ErrTestRange for one
// that does not.
LongTests bool
// contains filtered or unexported fields
}
Asm accumulates instructions.
func (*Asm) AddShifted ¶
AddShifted computes rd = rn + rm<<shift.
func (*Asm) Fcmp ¶
Fcmp compares fn with fm. After it, MI means less, LS less or equal, GT greater and GE greater or equal, all false when either is NaN; EQ is equal and NE is not equal or unordered.
func (*Asm) FcvtSD ¶
FcvtSD converts the float32 in fn to a double in fd; FcvtDS rounds the double in fn to a float32 in fd.
func (*Asm) Fcvtzs ¶
Fcvtzs converts fn to a signed integer in rd, rounding toward zero and saturating, as Go's int(f) does on arm64.
func (*Asm) Fcvtzu ¶
Fcvtzu converts fn to an unsigned integer in rd, rounding toward zero and saturating, as Go's uint64(f) does on arm64.
func (*Asm) Sdiv ¶
Sdiv and Udiv compute rd = rn / rm, signed and unsigned, rounding toward zero. Dividing by zero gives zero.