var intArgRegs … var floatArgRegs … var floatRegSize … type abiStep … type abiStepKind … const abiStepBad … const abiStepStack … const abiStepIntReg … const abiStepPointer … const abiStepFloatReg … type abiSeq … func (a *abiSeq) dump() { … } // stepsForValue returns the ABI instructions for translating // the i'th Go argument or return value represented by this // abiSeq to the Go ABI. func (a *abiSeq) stepsForValue(i int) []abiStep { … } // addArg extends the abiSeq with a new Go value of type t. // // If the value was stack-assigned, returns the single // abiStep describing that translation, and nil otherwise. func (a *abiSeq) addArg(t *abi.Type) *abiStep { … } // addRcvr extends the abiSeq with a new method call // receiver according to the interface calling convention. // // If the receiver was stack-assigned, returns the single // abiStep describing that translation, and nil otherwise. // Returns true if the receiver is a pointer. func (a *abiSeq) addRcvr(rcvr *abi.Type) (*abiStep, bool) { … } // regAssign attempts to reserve argument registers for a value of // type t, stored at some offset. // // It returns whether or not the assignment succeeded, but // leaves any changes it made to a.steps behind, so the caller // must undo that work by adjusting a.steps if it fails. // // This method along with the assign* methods represent the // complete register-assignment algorithm for the Go ABI. func (a *abiSeq) regAssign(t *abi.Type, offset uintptr) bool { … } // assignIntN assigns n values to registers, each "size" bytes large, // from the data at [offset, offset+n*size) in memory. Each value at // [offset+i*size, offset+(i+1)*size) for i < n is assigned to the // next n integer registers. // // Bit i in ptrMap indicates whether the i'th value is a pointer. // n must be <= 8. // // Returns whether assignment succeeded. func (a *abiSeq) assignIntN(offset, size uintptr, n int, ptrMap uint8) bool { … } // assignFloatN assigns n values to registers, each "size" bytes large, // from the data at [offset, offset+n*size) in memory. Each value at // [offset+i*size, offset+(i+1)*size) for i < n is assigned to the // next n floating-point registers. // // Returns whether assignment succeeded. func (a *abiSeq) assignFloatN(offset, size uintptr, n int) bool { … } // stackAssign reserves space for one value that is "size" bytes // large with alignment "alignment" to the stack. // // Should not be called directly; use addArg instead. func (a *abiSeq) stackAssign(size, alignment uintptr) { … } type abiDesc … func (a *abiDesc) dump() { … } func dumpPtrBitMap(b abi.IntArgRegBitmap) { … } func newAbiDesc(t *funcType, rcvr *abi.Type) abiDesc { … } // intFromReg loads an argSize sized integer from reg and places it at to. // // argSize must be non-zero, fit in a register, and a power-of-two. func intFromReg(r *abi.RegArgs, reg int, argSize uintptr, to unsafe.Pointer) { … } // intToReg loads an argSize sized integer and stores it into reg. // // argSize must be non-zero, fit in a register, and a power-of-two. func intToReg(r *abi.RegArgs, reg int, argSize uintptr, from unsafe.Pointer) { … } // floatFromReg loads a float value from its register representation in r. // // argSize must be 4 or 8. func floatFromReg(r *abi.RegArgs, reg int, argSize uintptr, to unsafe.Pointer) { … } // floatToReg stores a float value in its register representation in r. // // argSize must be either 4 or 8. func floatToReg(r *abi.RegArgs, reg int, argSize uintptr, from unsafe.Pointer) { … }