Functions
EncodeBImmediate
function
#
func EncodeBImmediate(imm int64) (int64, error)
EncodeCBImmediate
function
#
func EncodeCBImmediate(imm int64) (int64, error)
EncodeCJImmediate
function
#
func EncodeCJImmediate(imm int64) (int64, error)
EncodeIImmediate
function
#
func EncodeIImmediate(imm int64) (int64, error)
EncodeJImmediate
function
#
func EncodeJImmediate(imm int64) (int64, error)
EncodeSImmediate
function
#
func EncodeSImmediate(imm int64) (int64, error)
EncodeUImmediate
function
#
func EncodeUImmediate(imm int64) (int64, error)
InvertBranch
function
#
InvertBranch inverts the condition of a conditional branch.
func InvertBranch(as obj.As) obj.As
ParseSuffix
function
#
func ParseSuffix(prog *obj.Prog, cond string) (err error)
RegName
function
#
func RegName(r int) string
Split32BitImmediate
function
#
Split32BitImmediate splits a signed 32-bit immediate into a signed 20-bit
upper immediate and a signed 12-bit lower immediate to be added to the upper
result. For example, high may be used in LUI and low in a following ADDI to
generate a full 32-bit constant.
func Split32BitImmediate(imm int64) (low int64, high int64, err error)
String
method
#
func (ins *instruction) String() string
addrToReg
function
#
addrToReg extracts the register from an Addr, handling special Addr.Names.
func addrToReg(a obj.Addr) int16
assemble
function
#
assemble emits machine code.
It is called at the very end of the assembly process.
func assemble(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc)
buildop
function
#
func buildop(ctxt *obj.Link)
containsCall
function
#
containsCall reports whether the symbol contains a CALL (or equivalent)
instruction. Must be called after progedit.
func containsCall(sym *obj.LSym) bool
encode
method
#
func (ins *instruction) encode() (uint32, error)
encode
function
#
func encode(a obj.As) *inst
encodeB
function
#
encodeB encodes a B-type RISC-V instruction.
func encodeB(ins *instruction) uint32
encodeBImmediate
function
#
encodeBImmediate encodes an immediate for a B-type RISC-V instruction.
func encodeBImmediate(imm uint32) uint32
encodeCBImmediate
function
#
encodeCBImmediate encodes an immediate for a CB-type RISC-V instruction.
func encodeCBImmediate(imm uint32) uint32
encodeCJImmediate
function
#
encodeCJImmediate encodes an immediate for a CJ-type RISC-V instruction.
func encodeCJImmediate(imm uint32) uint32
encodeI
function
#
encodeI encodes an I-type RISC-V instruction.
func encodeI(as obj.As, rs1 uint32, rd uint32, imm uint32) uint32
encodeIF
function
#
func encodeIF(ins *instruction) uint32
encodeIII
function
#
func encodeIII(ins *instruction) uint32
encodeJ
function
#
encodeJ encodes a J-type RISC-V instruction.
func encodeJ(ins *instruction) uint32
encodeJImmediate
function
#
encodeJImmediate encodes an immediate for a J-type RISC-V instruction.
func encodeJImmediate(imm uint32) uint32
encodeR
function
#
encodeR encodes an R-type RISC-V instruction.
func encodeR(as obj.As, rs1 uint32, rs2 uint32, rd uint32, funct3 uint32, funct7 uint32) uint32
encodeR4
function
#
encodeR4 encodes an R4-type RISC-V instruction.
func encodeR4(as obj.As, rs1 uint32, rs2 uint32, rs3 uint32, rd uint32, funct3 uint32, funct2 uint32) uint32
encodeRFF
function
#
func encodeRFF(ins *instruction) uint32
encodeRFFF
function
#
func encodeRFFF(ins *instruction) uint32
encodeRFFFF
function
#
func encodeRFFFF(ins *instruction) uint32
encodeRFFI
function
#
func encodeRFFI(ins *instruction) uint32
encodeRFI
function
#
func encodeRFI(ins *instruction) uint32
encodeRIF
function
#
func encodeRIF(ins *instruction) uint32
encodeRII
function
#
func encodeRII(ins *instruction) uint32
encodeRIII
function
#
func encodeRIII(ins *instruction) uint32
encodeRawIns
function
#
func encodeRawIns(ins *instruction) uint32
encodeS
function
#
encodeS encodes an S-type RISC-V instruction.
func encodeS(as obj.As, rs1 uint32, rs2 uint32, imm uint32) uint32
encodeSF
function
#
func encodeSF(ins *instruction) uint32
encodeSI
function
#
func encodeSI(ins *instruction) uint32
encodeU
function
#
encodeU encodes a U-type RISC-V instruction.
func encodeU(ins *instruction) uint32
encodingForAs
function
#
encodingForAs returns the encoding for an obj.As.
func encodingForAs(as obj.As) (*encoding, error)
extractBitAndShift
function
#
extractBitAndShift extracts the specified bit from the given immediate,
before shifting it to the requested position and returning it.
func extractBitAndShift(imm uint32, bit int, pos int) uint32
immEven
function
#
immEven checks that the immediate is a multiple of two. If it
is not, an error is returned.
func immEven(x int64) error
immI
function
#
immI extracts the signed integer of the specified size from an immediate.
func immI(as obj.As, imm int64, nbits uint) uint32
immIFits
function
#
immIFits checks whether the immediate value x fits in nbits bits
as a signed integer. If it does not, an error is returned.
func immIFits(x int64, nbits uint) error
init
function
#
func init()
instructionDataForAs
function
#
instructionDataForAs returns the instruction data for an obj.As.
func instructionDataForAs(as obj.As) (*instructionData, error)
instructionForProg
function
#
instructionForProg returns the default *obj.Prog to instruction mapping.
func instructionForProg(p *obj.Prog) *instruction
instructionsForLoad
function
#
instructionsForLoad returns the machine instructions for a load. The load
instruction is specified by as and the base/source register is specified
by rs, instead of the obj.Prog.
func instructionsForLoad(p *obj.Prog, as obj.As, rs int16) []*instruction
instructionsForMOV
function
#
instructionsForMOV returns the machine instructions for an *obj.Prog that
uses a MOV pseudo-instruction.
func instructionsForMOV(p *obj.Prog) []*instruction
instructionsForOpImmediate
function
#
instructionsForOpImmediate returns the machine instructions for an immediate
operand. The instruction is specified by as and the source register is
specified by rs, instead of the obj.Prog.
func instructionsForOpImmediate(p *obj.Prog, as obj.As, rs int16) []*instruction
instructionsForProg
function
#
instructionsForProg returns the machine instructions for an *obj.Prog.
func instructionsForProg(p *obj.Prog) []*instruction
instructionsForRotate
function
#
instructionsForRotate returns the machine instructions for a bitwise rotation.
func instructionsForRotate(p *obj.Prog, ins *instruction) []*instruction
instructionsForStore
function
#
instructionsForStore returns the machine instructions for a store. The store
instruction is specified by as and the target/source register is specified
by rd, instead of the obj.Prog.
func instructionsForStore(p *obj.Prog, as obj.As, rd int16) []*instruction
instructionsForTLS
function
#
func instructionsForTLS(p *obj.Prog, ins *instruction) []*instruction
instructionsForTLSLoad
function
#
func instructionsForTLSLoad(p *obj.Prog) []*instruction
instructionsForTLSStore
function
#
func instructionsForTLSStore(p *obj.Prog) []*instruction
isUnsafePoint
function
#
func isUnsafePoint(p *obj.Prog) bool
jalToSym
function
#
func jalToSym(ctxt *obj.Link, p *obj.Prog, lr int16)
length
method
#
func (ins *instruction) length() int
markRelocs
function
#
markRelocs marks an obj.Prog that specifies a MOV pseudo-instruction and
requires relocation.
func markRelocs(p *obj.Prog)
movToLoad
function
#
movToLoad converts a MOV mnemonic into the corresponding load instruction.
func movToLoad(mnemonic obj.As) obj.As
movToStore
function
#
movToStore converts a MOV mnemonic into the corresponding store instruction.
func movToStore(mnemonic obj.As) obj.As
opSuffixString
function
#
func opSuffixString(s uint8) string
pcAlignPadLength
function
#
func pcAlignPadLength(pc int64, alignedValue int64) int
preprocess
function
#
preprocess generates prologue and epilogue code, computes PC-relative branch
and jump offsets, and resolves pseudo-registers.
preprocess is called once per linker symbol.
When preprocess finishes, all instructions in the symbol are either
concrete, real RISC-V instructions or directive pseudo-ops like TEXT,
PCDATA, and FUNCDATA.
func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc)
progedit
function
#
progedit is called individually for each *obj.Prog. It normalizes instruction
formats and eliminates as many pseudo-instructions as possible.
func progedit(ctxt *obj.Link, p *obj.Prog, newprog obj.ProgAlloc)
regAddr
function
#
regAddr extracts a register from an Addr.
func regAddr(a obj.Addr, min uint32, max uint32) uint32
regF
function
#
regF returns a float register.
func regF(r uint32) uint32
regFAddr
function
#
regFAddr extracts the float register from an Addr.
func regFAddr(a obj.Addr) uint32
regI
function
#
regI returns an integer register.
func regI(r uint32) uint32
regIAddr
function
#
regIAddr extracts the integer register from an Addr.
func regIAddr(a obj.Addr) uint32
regV
function
#
regV returns a vector register.
func regV(r uint32) uint32
regVal
function
#
func regVal(r uint32, min uint32, max uint32) uint32
rmSuffixEncode
function
#
func rmSuffixEncode(s string) (uint8, error)
rmSuffixString
function
#
func rmSuffixString(u uint8) (string, error)
setPCs
function
#
setPCs sets the Pc field in all instructions reachable from p.
It uses pc as the initial value and returns the next available pc.
func setPCs(p *obj.Prog, pc int64) int64
signExtend
function
#
signExtend sign extends val starting at bit bit.
func signExtend(val int64, bit uint) int64
stackOffset
function
#
stackOffset updates Addr offsets based on the current stack size.
The stack looks like:
-------------------
| |
| PARAMs |
| |
| |
-------------------
| Parent RA | SP on function entry
-------------------
| |
| |
| AUTOs |
| |
| |
-------------------
| RA | SP during function execution
-------------------
FixedFrameSize makes other packages aware of the space allocated for RA.
A nicer version of this diagram can be found on slide 21 of the presentation
attached to https://golang.org/issue/16922#issuecomment-243748180.
func stackOffset(a *obj.Addr, stacksize int64)
stacksplit
function
#
func stacksplit(ctxt *obj.Link, p *obj.Prog, cursym *obj.LSym, newprog obj.ProgAlloc, framesize int64) *obj.Prog
usesRegTmp
method
#
func (ins *instruction) usesRegTmp() bool
validate
method
#
func (ins *instruction) validate(ctxt *obj.Link)
validateB
function
#
func validateB(ctxt *obj.Link, ins *instruction)
validateIF
function
#
func validateIF(ctxt *obj.Link, ins *instruction)
validateIII
function
#
func validateIII(ctxt *obj.Link, ins *instruction)
validateJ
function
#
func validateJ(ctxt *obj.Link, ins *instruction)
validateRFF
function
#
func validateRFF(ctxt *obj.Link, ins *instruction)
validateRFFF
function
#
func validateRFFF(ctxt *obj.Link, ins *instruction)
validateRFFFF
function
#
func validateRFFFF(ctxt *obj.Link, ins *instruction)
validateRFFI
function
#
func validateRFFI(ctxt *obj.Link, ins *instruction)
validateRFI
function
#
func validateRFI(ctxt *obj.Link, ins *instruction)
validateRIF
function
#
func validateRIF(ctxt *obj.Link, ins *instruction)
validateRII
function
#
func validateRII(ctxt *obj.Link, ins *instruction)
validateRIII
function
#
func validateRIII(ctxt *obj.Link, ins *instruction)
validateRaw
function
#
func validateRaw(ctxt *obj.Link, ins *instruction)
validateSF
function
#
func validateSF(ctxt *obj.Link, ins *instruction)
validateSI
function
#
func validateSI(ctxt *obj.Link, ins *instruction)
validateU
function
#
func validateU(ctxt *obj.Link, ins *instruction)
wantEvenOffset
function
#
wantEvenOffset checks that the offset is a multiple of two.
func wantEvenOffset(ctxt *obj.Link, ins *instruction, offset int64)
wantFloatReg
function
#
wantFloatReg checks that r is a floating-point register.
func wantFloatReg(ctxt *obj.Link, ins *instruction, pos string, r uint32)
wantImmI
function
#
func wantImmI(ctxt *obj.Link, ins *instruction, imm int64, nbits uint)
wantIntReg
function
#
wantIntReg checks that r is an integer register.
func wantIntReg(ctxt *obj.Link, ins *instruction, pos string, r uint32)
wantNoneReg
function
#
func wantNoneReg(ctxt *obj.Link, ins *instruction, pos string, r uint32)
wantReg
function
#
func wantReg(ctxt *obj.Link, ins *instruction, pos string, descr string, r uint32, min uint32, max uint32)
wantVectorReg
function
#
wantVectorReg checks that r is a vector register.
func wantVectorReg(ctxt *obj.Link, ins *instruction, pos string, r uint32)