genericOps.go (go1.19.src) | : | genericOps.go (go1.19.1.src) | ||
---|---|---|---|---|
skipping to change at line 358 | skipping to change at line 358 | |||
{name: "LocalAddr", argLength: 2, aux: "Sym", symEffect: "Addr"}, // Addr ess of a variable. Arg0=SP. Arg1=mem. Aux identifies the variable. | {name: "LocalAddr", argLength: 2, aux: "Sym", symEffect: "Addr"}, // Addr ess of a variable. Arg0=SP. Arg1=mem. Aux identifies the variable. | |||
{name: "SP", zeroWidth: true}, // stack pointer | {name: "SP", zeroWidth: true}, // stack pointer | |||
{name: "SB", typ: "Uintptr", zeroWidth: true}, // static base pointer (a. k.a. globals pointer) | {name: "SB", typ: "Uintptr", zeroWidth: true}, // static base pointer (a. k.a. globals pointer) | |||
{name: "Invalid"}, // unused value | {name: "Invalid"}, // unused value | |||
// Memory operations | // Memory operations | |||
{name: "Load", argLength: 2}, // Load from arg0. arg1=memory | {name: "Load", argLength: 2}, // Load from arg0. arg1=memory | |||
{name: "Dereference", argLength: 2}, // Load from arg0. arg1=memory. Helper op for arg/result passing, result is an otherwise not-SSA -able "value". | {name: "Dereference", argLength: 2}, // Load from arg0. arg1=memory. Helper op for arg/result passing, result is an otherwise not-SSA -able "value". | |||
{name: "Store", argLength: 3, typ: "Mem", aux: "Typ"}, // Store arg1 to a rg0. arg2=memory, aux=type. Returns memory. | {name: "Store", argLength: 3, typ: "Mem", aux: "Typ"}, // Store arg1 to a rg0. arg2=memory, aux=type. Returns memory. | |||
// The source and destination of Move may overlap in some cases. See e.g. | // Normally we require that the source and destination of Move do not ove | |||
rlap. | ||||
// There is an exception when we know all the loads will happen before al | ||||
l | ||||
// the stores. In that case, overlap is ok. See | ||||
// memmove inlining in generic.rules. When inlineablememmovesize (in ../r ewrite.go) | // memmove inlining in generic.rules. When inlineablememmovesize (in ../r ewrite.go) | |||
// returns true, we must do all loads before all stores, when lowering Mo ve. | // returns true, we must do all loads before all stores, when lowering Mo ve. | |||
// The type of Move is used for the write barrier pass to insert write ba rriers | // The type of Move is used for the write barrier pass to insert write ba rriers | |||
// and for alignment on some architectures. | // and for alignment on some architectures. | |||
// For pointerless types, it is possible for the type to be inaccurate. | // For pointerless types, it is possible for the type to be inaccurate. | |||
// For type alignment and pointer information, use the type in Aux; | // For type alignment and pointer information, use the type in Aux; | |||
// for type size, use the size in AuxInt. | // for type size, use the size in AuxInt. | |||
// The "inline runtime.memmove" rewrite rule generates Moves with inaccur ate types, | // The "inline runtime.memmove" rewrite rule generates Moves with inaccur ate types, | |||
// such as type byte instead of the more accurate type [8]byte. | // such as type byte instead of the more accurate type [8]byte. | |||
{name: "Move", argLength: 3, typ: "Mem", aux: "TypSize"}, // arg0=destptr , arg1=srcptr, arg2=mem, auxint=size, aux=type. Returns memory. | {name: "Move", argLength: 3, typ: "Mem", aux: "TypSize"}, // arg0=destptr , arg1=srcptr, arg2=mem, auxint=size, aux=type. Returns memory. | |||
End of changes. 1 change blocks. | ||||
1 lines changed or deleted | 5 lines changed or added |