
gc
рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реНрдЯреЗрдЯрд┐рдХ рд╕рд┐рдВрдЧрд▓ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ (рдПрд╕рдПрд╕рдП) рдЕрдиреБрдХреВрд▓рди рдирд┐рдпрдореЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рд▓рд┐рд╕реНрдк рдЬреИрд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рднрд╛рд╖рд╛ ( рдбреАрдПрд╕рдПрд▓ ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдореИрдВ рдЗрд╕ рднрд╛рд╖рд╛ рдХреЗ рдореБрдЦреНрдп рддрддреНрд╡реЛрдВ, рдЗрд╕рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдФрд░ рд╕реАрдорд╛рдУрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВред
рдПрдХ рдЕрднреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдЗрдП рдЧреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдХреА рдкреАрдврд╝реА рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ рдкрд╣рд▓реЗ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реБрдЖ рдерд╛, рдЬреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ a*b+c
рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рдЧреЛ рдПрд╕рдПрд╕рдП рд╕рдВрдХрд▓рдХ рдмреИрдХрдПрдВрдб рдХреЗ рдЖрдВрддрд░рд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдкрд╣рд▓рд╛ рд▓реЗрдЦ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдирд┐рдпрдореЛрдВ рдХреЗ рдбреАрдПрд╕рдПрд▓ рд╡рд┐рд╡рд░рдг рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЕрдкрдиреЗ рдЕрдЧрд▓реЗ рд╕рддреНрд░ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЖрдзрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдШрдЯрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред
рдкрд░рд┐рдЪрдп
рдРрдиреНрдЯреЗрдиреЗрдЯреЗрдб рдПрдПрд╕рдЯреА рд╕реЗ рдПрд╕рдПрд╕рдП рджреГрд╢реНрдп рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд╕рдордп рдлреНрд░рдВрдЯрдПрдВрдб рдЧреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдХрд╛рд░реНрдп cmd / рд╕рдВрдХрд▓рди / рдЖрдВрддрд░рд┐рдХ / gc / ssa.go. рдореЗрдВ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдПрд╕рдПрд╕рдП рдмреИрдХрдПрдВрдб рдХрд╛ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ ssa.Compile
рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдЬрд┐рд╕реЗ cmd / compile / рдЖрдВрддрд░рд┐рдХ / ssa / compile.go рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╢рдмреНрджрд╛рд╡рд▓реАрдПрди | рдЖрд░рдпреВ | рдореВрд▓реНрдп |
---|
рд╕рдВрдХрд▓рдХ рд╕рд╛рдордиреЗ | рд╕рдВрдХрд▓рдХ рд╕рд╛рдордиреЗ | рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдФрд░ рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг, рдХрднреА-рдХрднреА рдЯрд╛рдЗрдк рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди, рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рдХрд░реАрдм рд╣реИ, рдЖрдорддреМрд░ рдкрд░ рдХреБрдЫ рдПрдиреЛрдЯреЗрдЯ рдПрдПрд╕рдЯреАред |
рд╕рдВрдХрд▓рдХ рдмреИрдХрдПрдВрдб | рд╕рдВрдХрд▓рдХ рдмреИрдХрдПрдВрдб | рдирд┐рдЪрд▓реЗ рд╕реНрддрд░ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдФрд░ рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡, рдХреЛрдб рдкреАрдврд╝реАред |
рдкреНрд░рдкрддреНрд░ | рдЖрдХрд╛рд░ | рд╢рдмреНрдж "рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐" (рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐) рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рдПрдХ рдкрд░реНрдпрд╛рдпрд╡рд╛рдЪреАред рдЖрдорддреМрд░ рдкрд░ рд▓рд┐рд╕реНрдк рдореЗрдВ, form рдкреНрд░реЛрдЧреНрд░рд╛рдо рддрддреНрд╡ рдХрд╛ рдирд╛рдо рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХрд╛ рд╣реИ, рдпрд╣ рдПрдХ рд╕реВрдЪреА рдпрд╛ рдПрдХ рдкрд░рдорд╛рдгреБ рд╣реЛред |
рдЕрдиреБрдХреВрд▓рди рдкрд╛рд╕ | рдЕрдиреБрдХреВрд▓рди рдЪрд░рдг | рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдкрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрдиред "рдкрд╛рд╕" рд╢рдмреНрдж рдХреБрдЫ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдЪрд░рдг рдХрдИ рдкрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ / рдпрд╛ рдПрдХ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЕрдиреНрдп рдЪрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдо рд╣реИред |
рдпрджрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд▓реЗрдЦ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рд╢рдмреНрдж рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ, рдпрд╣ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рдЗрд╕реЗ рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдПрд╕рдПрд╕рдП рдЧреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдореЗрдВ рдХрдИ рдЪрд░рдг рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдХрд▓рд┐рдд рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИред рдХреБрдЫ рдЪрд░рдг рддрдерд╛рдХрдерд┐рдд "рдкреБрдирд░реНрд▓реЗрдЦрди рдирд┐рдпрдо" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдПрд╕рдПрд╕рдП рдЕрдиреБрдХреНрд░рдо рдХреЛ рджреВрд╕рд░реЗ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдо, рд╕рдВрднрд╡рддрдГ рдЕрдзрд┐рдХ рдЗрд╖реНрдЯрддрдоред
рдПрд╕-рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдирд┐рдпрдореЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрди рднрд╛рд╡реЛрдВ рдХреЗ рддрддреНрд╡ ssa.Value рд╣реИрдВ ред рд╕рдмрд╕реЗ рд╕рд░рд▓ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпреЗ рдирд┐рдпрдо рдЖрдкрдХреЛ рдПрдХ ssa.Value
рдХреЛ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб 8-рдмрд┐рдЯ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рдЧреБрдгрди рдХреЛ рдврд╣рддрд╛ рд╣реИ:
(Mul8 (Const8 [c]) (Const8 [d])) -> (Const8 [int64(int8(c*d))])
SSA рдорд╛рдиреЛрдВ рдХреА рджреЛ рдореБрдЦреНрдп рд╢реНрд░реЗрдгрд┐рдпрд╛рдВ рд╣реИрдВ: рдЙрдЪреНрдЪ-рд╕реНрддрд░, рд▓рдХреНрд╖реНрдп рдорд╢реАрди рд╕реЗ рд▓рдЧрднрдЧ рд╕реНрд╡рддрдВрддреНрд░, рдФрд░ рдЬреЛ рдХрд┐ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИрдВ (рдЖрдорддреМрд░ рдкрд░ 1-in-1 рдорд╢реАрди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдореИрдк рдХреА рдЬрд╛рддреА рд╣реИрдВ)ред
рдЗрди рджреЛрдиреЛрдВ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрдиреБрдХреВрд▓рди рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкрд╣рд▓реЗ, рд╕рднреА рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдФрд░ рд╕рд╛рдорд╛рдиреНрдп, рдлрд┐рд░ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рдЙрдиреНрдореБрдЦред
рдирд┐рдпрдореЛрдВ рд╕реЗ рдЬреБрдбрд╝реЗ рд╕рднреА рдХреЛрдб cmd / рд╕рдВрдХрд▓рди / рдЖрдВрддрд░рд┐рдХ / ssa / gen рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИрдВред рд╣рдо рджреЛ рд╕реЗрдЯреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ:
- genericOps.go - рдорд╢реАрди-рд╕реНрд╡рддрдВрддреНрд░ рд╕рдВрдЪрд╛рд▓рдиред
- AMD64Ops.go - рд╕рдВрдЪрд╛рд▓рди
GOARCH=AMD64
(64-рдмрд┐рдЯ x86) рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИред
рдЕрдореВрд░реНрдд рдорд╢реАрди рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд╣рд▓реЗ рдХреБрдЫ рдЪрд░рдгреЛрдВ рдХреЗ рдмрд╛рдж, рддрдерд╛рдХрдерд┐рдд genericOps
рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк genericOps
рд╕реЗ genericOps
рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрд╣ AMD64Ops
рд╣реЛрдЧрд╛ред рдЗрд╕ рдмрд┐рдВрджреБ рдХреЗ рдмрд╛рдж, рд╕рднреА рдмрд╛рдж рдХреЗ рдЪрд░рдг рджреВрд╕рд░реА рд╢реНрд░реЗрдгреА рд╕реЗ рдкреНрд░рд╕реНрддреБрддрд┐ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХреЗ рдмрд╛рдж, рдПрдХ рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рдЦреЗрд▓рдиреЗ рдореЗрдВ рдЖрддрд╛ рд╣реИред AMD64 рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдЬрдирд░реЗрд╢рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреИрдХреЗрдЬ cmd / рд╕рдВрдХрд▓рди / рдЖрдВрддрд░рд┐рдХ / amd64 рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдХрд╛рд░реНрдп ssa.Block
рдФрд░ ssa.Value
рдХреЛ рдЕрдиреБрдХреНрд░рдо obj рд╕реЗ рдмрджрд▓рдирд╛ рд╣реИред рдЕрд╕реЗрдВрдмрд▓рд░ рдорд╢реАрди рдХреЛрдб рдПрдХрддреНрд░ рдХрд░реЗрдЧрд╛, рдЬреЛ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрдЧрд╛ред
рдЕрдиреБрдХреВрд▓рди рдирд┐рдпрдо
рдпрджрд┐ рдСрдкрд░реЗрд╢рди рдкрд░рд┐рднрд╛рд╖рд╛ рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ " ${ARCH}Ops.go
" рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЕрдиреБрдХреВрд▓рди рдирд┐рдпрдореЛрдВ рдХреЛ " ${ARCH}.Rules
" рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред
рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдирд┐рдпрдо рд╕рд░рд▓ рд░реВрдкрд╛рдВрддрд░рдг рдХрд░рддреЗ рд╣реИрдВ, рдЕрдзрд┐рдХрд╛рдВрд╢ рдирд┐рд░рдВрддрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреА рддрд╣ , рд╕рд╛рде рд╣реА рд╕рд╛рде рдХреБрдЫ рдкрд░рд┐рд╡рд░реНрддрди рдЬреЛ рдмрд╛рдж рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддреЗ рд╣реИрдВред
рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдирд┐рдпрдореЛрдВ рд╡рд╛рд▓реА рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рджреЛ рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ:
- рдХрдо рдХрд░рдирд╛ - рдорд╢реАрди рд╕рдордХрдХреНрд╖реЛрдВ рдХреЗ рд╕рд╛рде рдЕрдореВрд░реНрдд рд╕рдВрдЪрд╛рд▓рди рдХреА рдЬрдЧрд╣ред
- рдЕрдиреБрдХреВрд▓рди рд╕реНрд╡рдпрдВред
рдПрдХ рдорд╢реАрди рдореЗрдВ рдПрдХ рдСрдкрд░реЗрд╢рди рдХреЛ рдХрдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
(Const32 [val]) -> (MOVLconst [val]) // L - long, 32- (Const64 [val]) -> (MOVQconst [val]) // Q - quad, 64- | | generic op | AMD64 op
рдпрд╣ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдореЗрдВ рд╣реИ рдХрд┐ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рд╕рдВрдЪрд╛рд▓рди рдХреА рд▓рд╛рдЧрдд рдХреЛ рдХрдо рдХрд░рдирд╛ , рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдореЗрдореЛрд░реА рдПрдбреНрд░реЗрд╕рд┐рдВрдЧ рдореЛрдб рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдПрдореНрдмреЗрдб рдХрд░рдирд╛ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
рдСрдкрд░реЗрд╢рдиреНрд╕ рдореЗрдВ рдПрдХ рдПрдордиреЛрдореЛрдирд┐рдХ рдирд╛рдо рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдУрдкрдХреЛрдб рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддреБрдХрд▓рд╛-рдирд┐рд░реНрднрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдСрдкрдХреЛрдб рдЖрдорддреМрд░ рдкрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВред
рдирд┐рдпрдо рд╡рд┐рд╡рд░рдг рднрд╛рд╖рд╛ рд╕рд┐рдВрдЯреЗрдХреНрд╕
рдореВрд▓ рд╡реНрдпрд╛рдХрд░рдг рдирд┐рдпрдо рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИред
рд╕реНрдирд┐рдкреЗрдЯ рдЕрдиреБрд╡рд╛рдж рдКрдкрд░ рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ " //
" рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ рдЕрдВрджрд░ .Rules
рдлрд╝рд╛рдЗрд▓реЗрдВред
рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ рдЬрд┐рд╕рдореЗрдВ рдпреЗ рд╕рднреА рддрддреНрд╡ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
Opcode=ADDLconst - 32- : AuxInt=c - , `x` : : (ADDLconst [c] x) && int32(c)==0 -> x | / | / | | / | / | | / | / | / ( `&&` ) ,
рдпреЗ рд╕рднреА рд╡реНрдпрд╛рдЦреНрдпрд╛рддреНрдордХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╡реИрдз рдирд┐рдпрдо рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИрдВред
рдпрд╣ рдирд┐рдпрдо x+0
рдХреЛ x
рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╢рд░реНрддреЛрдВ рдЕрдиреБрднрд╛рдЧ рдХреЗ рдЕрдВрджрд░ рд╕рдм рдХреБрдЫ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЧреЛ рдХреЛрдб рд╣реИ,
рдЬрдм рддрдХ рднрд╛рд╡реЛрдВ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ, рдЬрд┐рд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдХ bool
рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЖрдк rewrite.go рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд┐рдзреЗрдп рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рд╛рдорд╛рдиреНрдп рдСрдкрдХреЛрдб рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдВрдпреЛрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХрдИ рдирд┐рдпрдореЛрдВ рдХреЛ рдЬрдиреНрдо рджреЗрддрд╛ рд╣реИ:
(ADD(Q|L)const [off] x:(SP)) -> (LEA(Q|L) [off] x) // Q|L alternation: (ADDQconst [off] x:(SP)) -> (LEAQ [off] x) (ADDLconst [off] x:(SP)) -> (LEAL [off] x) // `x`: (ADDQconst [off] (SP)) -> (LEAQ [off] (SP)) (ADDLconst [off] (SP)) -> (LEAL [off] (SP))
(SP)
рдЬреЗрдиреЗрд░рд┐рдХрдСрдкреНрд╕.рдУрдЧреЛ рдореЗрдВ рд╕реЗ рдПрдХ рдСрдкрд░реЗрд╢рди рд╣реИ рдФрд░ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕реНрдЯреИрдХ рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░ рд▓реЛрдб рдХрд░рдиреЗ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рддрд╛ рд╣реИред рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рдХреЛрдИ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ SP
, рдЗрд╕рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рд╡реИрд░рд┐рдПрдмрд▓ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ (S- рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЗ рдмрд╛рдИрдВ рдУрд░ ->
):
- рдЪрд░, рдЬреИрд╕реЗ
x
, рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдмрд┐рдирд╛ :
рдХреБрдЫ рднреА рдХреИрдкреНрдЪрд░ рдХрд░реЗрдВ - рдПрдХ рдирд┐рдпрдорд┐рдд рдЪрд░ рдХреА рддрд░рд╣,
_
рдХрд┐рд╕реА рднреА рдореВрд▓реНрдп рдХреЛ рдкрдХрдбрд╝рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
// : ADDQconst, // : (ADDQconst _) -> v (ADDQconst x) -> (ADDQconst x)
рдпрджрд┐ AuxInt
рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ (рд╡рд░реНрдЧ рдХреЛрд╖реНрдардХреЛрдВ рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐), рддреЛ рдирд┐рдпрдо рдХрд┐рд╕реА рднреА AuxInt
рдорд╛рди рдкрд░ рдлрд╛рдпрд░ рдХрд░реЗрдЧрд╛ред рдЗрд╕реА рддрд░рд╣ рд╕реЗ {}
-рдкреИрд░рд╛рдореАрдЯрд░ (рдиреАрдЪреЗ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ)ред
рдирд╛рдо v
рдЕрд░реНрде рд╣реИ рд╕рдмрд╕реЗ рдмрд╛рд╣рд░реА рдХреИрдкреНрдЪрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд░реВрдкред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ (ADDQconst (SUBQconst x))
рдмрд╛рд╣рд░реА рд░реВрдк ADDQconst
ред
рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рдмрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд╕реЗ рдЖрдкрдХреЛ рдПрд╕-рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЗ рдХрдИ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:
(ADDQconst [v] (ADDQconst [v] x)) // , , "x+2+2" (x+v+v).
рдирд┐рдпрдореЛрдВ рдореЗрдВ рдкреНрд░рдХрд╛рд░
рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдФрд░ / рдпрд╛ рдорд┐рд▓рд╛рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдкреНрд░рдХрд╛рд░ рдХреЛ "рддреНрд░рд┐рдХреЛрдгреАрдп рдХреЛрд╖реНрдардХ" рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, C ++ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ:
// typ.UInt32 - BTSLconst. // BSFL typ.UInt32, // . (Ctz16 x) -> (BSFL (BTSLconst <typ.UInt32> [16] x))
рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, "рд╡рд░реНрдг" рд╣реИрдВ (рдпрд╛, рдЕрдзрд┐рдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд░реВрдк рд╕реЗ - Aux
рдЧреБрдг)ред
(StaticCall [argsWidth] {target} mem) -> (CALLstatic [argsWidth] {target} mem)
[argsWidth]
- Value.AuxInt
StaticCall
- рддрд░реНрдХреЛрдВ рдХрд╛ рдХреБрд▓ рдЖрдХрд╛рд░ рдкрд╛рд░рд┐рдд рд╣реБрдЖ{target}
- Value.Aux
ред StaticCall
- рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ<typ.UInt32>
- Value.Type
ред рдорд╛рди рдкреНрд░рдХрд╛рд░
Aux
рдФрд░ AuxInt
рд╢рдмреНрджрд╛рд░реНрде рдСрдкрд░реЗрд╢рди рд╕реЗ рдСрдкрд░реЗрд╢рди рддрдХ рдмрд╣реБрдд рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕реНрд░реЛрдд *Ops.go
рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ opData opcode opData
рдореЗрдВ рдПрдХ aux
рдХреНрд╖реЗрддреНрд░ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЗрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдмрддрд╛рддрд╛ рд╣реИред
рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЬ cmd / рд╕рдВрдХрд▓рди / рдЖрдВрддрд░рд┐рдХ / рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдПрд╕рдПрд╕рдП рдмреИрдХрдПрдВрдб рдХреЗ рд▓рд┐рдП types.TypeFlags
, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП types.TypeFlags
, рдмрд╛рдХреА cmd/compile/internal/gc
рдФрд░ types.TypeFlags
cmd/compile/internal/gc
types.TypeFlags
рдмреАрдЪ рдЖрдо рд╣реИрдВред
рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ
рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╣реИред types.TypeMem
, рдЬреЛ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рдХрдИ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ:
- рдЖрдкрдХреЛ рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ рдкреИрдЯрд░реНрди рджреНрд╡рд╛рд░рд╛
ssa.Value
рдХреЛ рд╕реЙрд░реНрдЯ рдФрд░ рд╕рдореВрд╣ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рдмреЗрд╕ рдмреНрд▓реЙрдХ (рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдиреАрдЪреЗ) рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рд╕рд╣реА рдирд┐рд╖реНрдкрд╛рджрди рдЖрджреЗрд╢ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИред - рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдореЗрдореЛрд░реА рд╕реНрдЯреНрд░реАрдо рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдирд┐рд░реНрджреЗрд╢ рдореЗрдореЛрд░реА рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдирдпрд╛ SSA рдорд╛рди рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЯрд╛рдЗрдк
types.TypeMem
рдЬрд╛рдПрдЧрд╛ред
OpPhi
рдХреЗ рд╡рд┐рд╢реЗрд╖ рдЕрд░реНрде рдХреА OpPhi
, рдореЗрдореЛрд░реА рдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХреЗ рдХрдИ рдЪрд░рдгреЛрдВ рдореЗрдВ рдЕрд╕рд╛рдзрд╛рд░рдг рд░реВрдк рд╕реЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЬрд╛рддреА рд╣реИред
рдлреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛Phi
рдХреА рдПрдХ рднреВрдорд┐рдХрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдЪрд░рдг рджрд░ рдЪрд░рдг рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрддреА рд╣реИред
рд╕рдВрдХрд▓рдХ рдХреЗ рдПрд╕рдПрд╕рдП рдХрд╛рд░реНрдп рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, Phi
рдЕрдкрдиреЗ рдХреНрд▓рд╛рд╕рд┐рдХ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдкрде рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдореВрд▓реНрдп рдХреА рдкрд╕рдВрдж рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдиреЗ рд╣рдореЗрдВ рдЗрд╕ рдореВрд▓реНрдп рддрдХ рдкрд╣реБрдВрдЪрд╛рдпрд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХрд┐рд╕реА рдмреНрд▓реЙрдХ рдореЗрдВ рджреЛ рдЬрдВрдк рд╣реИрдВ, рдФрд░ рджреЛрдиреЛрдВ рдореЗрдореЛрд░реА рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЧрдВрддрд╡реНрдп рдмреНрд▓реЙрдХ рдХреЛ (Phi mem1 mem2)
рдмрд░рд╛рдмрд░ рдореЗрдореЛрд░реА рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧреАред рдЪрдХреНрд░ рднреА Phi
рдорд╛рди рдХреЛ рдЦреАрдВрдЪрддреЗ рд╣реИрдВред
рдПрдХ рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ types.TypeFlags
рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рдкреНрд░рдХрд╛рд░ рд╕реАрдкреАрдпреВ рдЭрдВрдбреЗ рдкреИрджрд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрджреЗрд╢ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, ADDQ
рдЬреИрд╕реЗ рдирд┐рд░реНрджреЗрд╢, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ рдЭрдВрдбреЗ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред types.Flags
, рд▓реЗрдХрд┐рди clobberFlags
рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рд╣реЛрддреЗ рд╣реИрдВред
types.Flags
рдЙрдкрдпреЛрдЧ CMPQ
рдЬреИрд╕реЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЙрдирдХреЗ рдХрд┐рд╕реА рднреА рд╕реНрдкрд╖реНрдЯ рдСрдкрд░реЗрдВрдб рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдирд╣реАрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдЧрд▓реЗ рдирд┐рд░реНрджреЗрд╢ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
SETL
рдЬреИрд╕реЗ рдирд┐рд░реНрджреЗрд╢ рдЖрдкрдХреЛ рдЭрдВрдбреЗ рдХреЛ "рдкрдврд╝рдиреЗ" рдФрд░ ssa.Value
рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдПрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
L-less than G-greater than | | (SETL (InvertFlags x)) -> (SETG x) | ,
SSA рдирд┐рд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдо
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИ ( example.go
):
package example func fusedMulAdd(a, b, c float64) float64 { return a*c + b }
рд╣рдо SSA рдХреЛрдб рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ fusedMulAdd
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП fusedMulAdd
рд╣реИ:
$ GOSSAFUNC=fusedMulAdd go tool compile example.go > ssa.txt
рдЕрдм рдХрд╛рд░реНрдпрд╢реАрд▓ (рд╡рд░реНрддрдорд╛рди) рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:
ssa.txt
рдореЗрдВ рдЯреЗрдХреНрдЯ рдбрдВрдк рд╢рд╛рдорд┐рд▓ рд╣реИредssa.html
, рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдЙрд╕рдореЗрдВ рд╕рдорд╛рди рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рд╕рдВрд╡рд╛рджрд╛рддреНрдордХ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рд╛рд░реВрдк рдореЗрдВред рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЦреЛрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
FusedMulAdd рдХреЗ рд▓рд┐рдП рдорд╢реАрди рдХреЛрдбрдЪрд░рд┐рддреНрд░ ~r3
рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
v7 (4) MOVSD a(SP), X0 v11 (4) MOVSD c+16(SP), X1 v12 (4) MULSD X1, X0 v6 (4) MOVSD b+8(SP), X1 v13 (4) ADDSD X1, X0 v15 (4) MOVSD X0, ret+24(SP) b1 (4) RET
lower
рдЪрд░рдг рдХреЗ рдмрд╛рдж fusedMulAdd
рд▓рд┐рдП рдпрд╣ SSA рдкреНрд░реЛрдЧреНрд░рд╛рдо fusedMulAdd
рджрд┐рдЦрддрд╛ рд╣реИ: (ssa.html):

рдкрд╛рда рдкреНрд░рд╛рд░реВрдк SSA рдХрд╛рд░реНрдпрдХреНрд░рдордпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЖрдк рдЗрд╕реЗ рдХреЙрдкреА рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
lower [77667 ns] b1: v1 (?) = InitMem <mem> v2 (?) = SP <uintptr> v7 (?) = LEAQ <*float64> {~r3} v2 v8 (3) = Arg <float64> {a} v9 (3) = Arg <float64> {b} v10 (3) = Arg <float64> {c} v12 (+4) = MULSD <float64> v8 v10 v13 (4) = ADDSD <float64> v12 v9 v14 (4) = VarDef <mem> {~r3} v1 v15 (4) = MOVSDstore <mem> {~r3} v2 v13 v14 Ret v15 (line +4)
рдЗрд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдПрд╕-рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ:
(MOVQstore {~r3} (SP) (ADDSD (MULSD (Arg {a}) (Arg {c})) (Arg {b})))
рд░реЗрдЧреЙрд▓реЙрдХ рдЪрд░рдг рдХреЗ рдмрд╛рдж рдПрд╕.рдПрд╕.рдП.рдпрд╣ regalloc
рдЪрд░рдг рдХреЗ рд▓рд┐рдП ssa.html
рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рд╣реИред

regalloc [87237 ns] b1: v1 (?) = InitMem <mem> v14 (4) = VarDef <mem> {~r3} v1 v2 (?) = SP <uintptr> : SP v8 (3) = Arg <float64> {a} : a[float64] v9 (3) = Arg <float64> {b} : b[float64] v10 (3) = Arg <float64> {c} : c[float64] v7 (4) = LoadReg <float64> v8 : X0 v11 (4) = LoadReg <float64> v10 : X1 v12 (+4) = MULSD <float64> v7 v11 : X0 v6 (4) = LoadReg <float64> v9 : X1 v13 (4) = ADDSD <float64> v12 v6 : X0 v15 (4) = MOVSDstore <mem> {~r3} v2 v13 v14 Ret v15 (line +4)
рдирдП рдЕрдиреБрдХреВрд▓рди рдирд┐рдпрдо рдЬреЛрдбрд╝рдирд╛
FMA рд╡рд╛рд▓реЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ , рд╣рдо рджреЛ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ a*c + b
рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд▓рд┐рдпрд╛ рддреЛрдХрд░ рдХреЗ рд▓реЗрдЦрди рдХреЗ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ CL117295 рд▓реЗрдВред
рдЖрдкрдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ diff
рдкреИрдЪ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рд╣реИред
1. рдПрдХ рдирдпрд╛ рдСрдкрд░реЗрд╢рди рдЬреЛрдбрд╝рдирд╛ - FMASD
рдлрд╝рд╛рдЗрд▓ compile/internal/ssa/gen/AMD64Ops.go
рдореЗрдВ AMD64ops
рд╕реНрд▓рд╛рдЗрд╕ AMD64ops
рдФрд░ рдПрдХ рдирдпрд╛ рддрддреНрд╡ (рдХрд╣реАрдВ рднреА) рдЬреЛрдбрд╝реЗрдВ:
{
рдЪреВрдВрдХрд┐ рдкрд╣рд▓реЗ рдХреЛрдИ рдСрдкрд░реЗрд╢рди (fp,fp,fp -> fp)
рдереЗ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рдирдП рдХреНрд╡рд╛рд▓реАрдлрд╛рдпрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
fp01 = regInfo{inputs: nil, outputs: fponly} fp21 = regInfo{inputs: []regMask{fp, fp}, outputs: fponly} + fp31 = regInfo{inputs: []regMask{fp, fp, fp}, outputs: fponly}
2. рдПрдХ рдЕрдиреБрдХреВрд▓рди рдирд┐рдпрдо рдЬреЛрдбрд╝рдирд╛
(ADDSD (MULSD xy) z) -> (FMASD zxy)
рдПрдХ рдЕрдзрд┐рдХ рд╕рд╣реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд┐рдирд╛ рд╢рд░реНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ FMA рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ред рд╣рдо рдпрд╣ рдорд╛рдиреЗрдВрдЧреЗ рдХрд┐ рд╣рдорд╛рд░реЗ рдЯрд╛рд░рдЧреЗрдЯ рдорд╢реАрди рдкрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдлрдПрдордП рд╣реИред
рд╕рдВрдХрд▓рдХ рдРрд╕реЗ рдЪреЗрдХ рдХреЗ рд▓рд┐рдП config
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:
// config.useFMA=false, . (ADDSD (MULSD xy) z) && config.useFMA-> (FMASD zxy)
рдПрдлрдПрдордП рд╕рдорд░реНрдерди рдХреА рдЬрд╛рдВрдЪ рдХреИрд╕реЗ рдХрд░реЗрдВ?рдпрджрд┐ рд╕рд┐рд╕реНрдЯрдо рдкрд░ lscpu
рдЙрдкрд▓рдмреНрдз рд╣реИ, рддреЛ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:
$ lscpu | grep fma
3. рдХреЛрдб рдкреАрдврд╝реА рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдЕрдм, ssaGenValue
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, compile/internal/amd64/ssa.go
рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдкрдХреЛ FMASD
рд▓рд┐рдП рдХреЛрдб рдкреАрдврд╝реА рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { switch v.Op { case ssa.OpAMD64FMASD: p := s.Prog(v.Op.Asm())
рдЕрдм рд╣рдорд╛рд░реЗ рдирдП рдЕрдиреБрдХреВрд▓рди рдХреЗ рдХрд╛рдо рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИред рдирдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдмрд╣реБрдд рджреБрд░реНрд▓рдн рд╣реИ, рдЖрдорддреМрд░ рдкрд░ рдирдП рдЕрдиреБрдХреВрд▓рди рдкрд╣рд▓реЗ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдПрд╕рдПрд╕рдП рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдЬрд╛рдБрдЪ рдкрд░рд┐рдгрд╛рдо
рдкрд╣рд▓рд╛ рдХрджрдо рдЕрджреНрдпрддрди gen/AMD64Ops.go
рдФрд░ gen/AMD64.Rules
рд╕реЗ рдЧреЛ рдХреЛрдб рдЙрддреНрдкрдиреНрди gen/AMD64.Rules
ред
рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рдЕрдкрдирд╛ рдирдпрд╛ рд╕рдВрдХрд▓рдХ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
go install cmd/compile
рдЕрдм, рдПрдХ рд╣реА рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдорд╢реАрди рдХреЛрдб рдорд┐рд▓рддрд╛ рд╣реИ:
- v7 (4) MOVSD a(SP), X0 - v11 (4) MOVSD c+16(SP), X1 - v12 (4) MULSD X1, X0 - v6 (4) MOVSD b+8(SP), X1 - v13 (4) ADDSD X1, X0 - v15 (4) MOVSD X0, ret+24(SP) - b1 (4) RET + v12 (4) MOVSD b+8(SP), X0 + v7 (4) MOVSD a(SP), X1 + v11 (4) MOVSD c+16(SP), X2 + v13 (4) VFMADD231SD X2, X1, X0 + v15 (4) MOVSD X0, ret+24(SP) + b1 (4) RET
рдмреБрдирд┐рдпрд╛рджреА рдмреНрд▓реЙрдХ
рдЕрдм рдЬрдм рд╕рдмрд╕реЗ рдХрдард┐рди рдХрд╛рдо рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЖрдЗрдП рдЖрдзрд╛рд░ рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред
рдЬрд┐рди рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╣рдордиреЗ рдКрдкрд░ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рд╡реЗ рдмреНрд▓реЙрдХ рдореЗрдВ рд╣реИрдВ, рдФрд░ рдмреНрд▓реЙрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╣реИрдВред
рдмреНрд▓реЙрдХ, рдЬреИрд╕реЗ ssa.Value
, рд╕рд╛рд░ рдФрд░ рдорд╢реАрди-рдирд┐рд░реНрднрд░ рд╣реИрдВред рд╕рднреА рдмреНрд▓реЙрдХреЛрдВ рдореЗрдВ рдареАрдХ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рд╣реИ рдФрд░ 0 рд╕реЗ 2 рдЧрдВрддрд╡реНрдп рдмреНрд▓реЙрдХреЛрдВ (рдмреНрд▓реЙрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░) рд╣реИред
рд╕рдмрд╕реЗ рд╕рд░рд▓ рдмреНрд▓реЙрдХ рд╣реИрдВ If
, Exit
рдФрд░ Plain
:
Exit
рдмреНрд▓реЙрдХ рдореЗрдВ 0 рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдмреНрд▓реЙрдХ рд╣реИрдВред рдпреЗ рдкрддреНрддреА рдмреНрд▓реЙрдХ рд╣реИрдВ рдЬреЛ рдЧреИрд░-рд╕реНрдерд╛рдиреАрдп рдХреВрдж рдмрдирд╛рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, panic
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдПредPlain
рдмреНрд▓реЙрдХ рдореЗрдВ 1 рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдмреНрд▓реЙрдХ рд╣реЛрддрд╛ рд╣реИред рдмреНрд▓реЙрдХ рдХреЗ рд╕рднреА рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рджреВрд╕рд░реЗ рдмреНрд▓реЙрдХ рдореЗрдВ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдмрд┐рдирд╛ рд╢рд░реНрдд рдХреВрдж рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИредIf
рдмреНрд▓реЙрдХ рдореЗрдВ 2 рдЧрдВрддрд╡реНрдп рдмреНрд▓реЙрдХ рд╣реИрдВред рд╕рдВрдХреНрд░рдордг рдХреА рд╕реНрдерд┐рддрд┐ ( Block.Control
) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣рд╛рдБ AMD64
рдмреНрд▓реЙрдХ рдореЗрдВ рд╕рд╛рд░ рдмреНрд▓реЙрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ:
"then" ( ) | "else" ( ) | | (If (SETL cmp) yes no) -> (LT cmp yes no) (If (SETLE cmp) yes no) -> (LE cmp yes no)
рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рдПрд╕рдПрд╕рдП рднрд╛рдЧ рдореЗрдВ рдЕрдиреНрдп рдЕрдиреБрдХреВрд▓рди рдЪрд░рдгреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЕрдиреБрдХреВрд▓рди рдирд┐рдпрдореЛрдВ рдХреА рд╕реАрдорд╛рдПрдВ
рдПрд╕рдПрд╕рдП рдмреИрдХреЗрдВрдб рдХреЗ рдЕрдкрдиреЗ рдлрд╛рдпрджреЗ рд╣реИрдВред рдХреБрдЫ рдЕрдиреБрдХреВрд▓рди O(1)
рдореЗрдВ рд╕рдВрднрд╡ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдореЗрдВ рдХрдорд┐рдпрд╛рдВ рднреА рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдЕрдХреЗрд▓реЗ рдЕрдиреБрдХреВрд▓рдХ рдХрд╛ SSA рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХрдо рд╕реЗ рдХрдо рддрдм рддрдХ рдЬрдм рддрдХ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдХреБрдЫ рдкрд╣рд▓реВ рдирд╣реАрдВ рдмрджрд▓ рдЬрд╛рддреЗред
рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдк append
рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
xs = append(xs, 'a') xs = append(xs, 'b')
рдЬрд┐рд╕ рд╕рдордп рдПрд╕рдПрд╕рдП рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдЙрд╕ рд╕рдордп рдХреЛрдб рдХреА рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рд╕рдВрд░рдЪрдирд╛ рдЦреЛ рдЬрд╛рддреА рд╣реИ рдФрд░ append
, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпреБрдХреНрдд рдмреНрд▓реЙрдХ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдПрдХ рдмреЛрдЭрд┐рд▓ рдирд┐рдпрдо рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ append
рд▓рд┐рдП рд╕реГрдЬрд┐рдд рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдХреЗ рд╕рдВрдкреВрд░реНрдг рдЕрдиреБрдХреНрд░рдо рдХреЛ рдкрдХрдбрд╝рддрд╛ рд╣реИред
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ .Rules
рдмрд╛рд░реЗ рдореЗрдВ рдмреЛрд▓рддреЗ рд╣реБрдП, рдлрд┐рд░ рдЗрд╕ DSL рдореЗрдВ рдмреНрд▓реЙрдХ ( ssa.Block
) рдХреЗ рд╕рд╛рде рдХрдордЬреЛрд░ рдХрд╛рдо рд╣реИред рдЗрд╕ рднрд╛рд╖рд╛ рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдмреНрд▓реЙрдХреЛрдВ рд╕реЗ рдЬреБрдбрд╝рд╛ рдХреЛрдИ рднреА рдирд┐рд░рдВрдХреБрд╢ рдЕрдиреБрдХреВрд▓рди рдЕрд╕рдВрднрд╡ рд╣реИред рдЖрдВрд╢рд┐рдХ рдмреНрд▓реЙрдХ рдЕрджреНрдпрддрди рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдмреНрд▓реЙрдХ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдирд╛ рднреА рдЕрд╕рдВрднрд╡ рд╣реИ (рд▓реЗрдХрд┐рди First
рдмреНрд▓реЙрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реИрдХ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдбреЗрдб рдХреЛрдб рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
рднрд▓реЗ рд╣реА рдХреБрдЫ рдХрдорд┐рдпрд╛рдВ рдареАрдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдВ, рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рдХреЛрдб рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдПрдХрд▓ рдФрд░ рдмреЗрд╣рддрд░ рдордзреНрдпрд╡рд░реНрддреА рд░реВрдк рдирд╣реАрдВ рд╣реИред
рдЬрд╛рдУ рдХрд┐ рддреЗрдЬреА рд╕реЗ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ
рдпрджрд┐ рдЖрдк рдХреБрдЫ рд╢рд╛рдВрдд рдЕрдиреБрдХреВрд▓рди рдирд┐рдпрдореЛрдВ рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВ, рддреЛ рдмреЗрдЭрд┐рдЭрдХ рдЗрд╕реЗ go-review.googlesource.com рдкрд░ рднреЗрдЬреЗрдВред рдореБрдЭреЗ рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА (CC рдореЗрдВ iskander.sharipov@intel.com
рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ)ред
рд╣реИрдкреНрдкреА рд╣реИрдХрд┐рдВрдЧ рдХрдВрдкрд╛рдЗрд▓рд░!

рдмреЛрдирд╕ рд╕рд╛рдордЧреНрд░реА
рдЬрд╛рдиреЗ рдпрд╛ рдмрджрд▓реЗ рдЧрдП SSA рдирд┐рдпрдореЛрдВ рдореЗрдВ рдЕрдЪреНрдЫреЗ рдкреИрдЪ рдХреЗ рдЙрджрд╛рд╣рд░рдг:
рдЗрддрдиреА рджреЗрд░ рдкрд╣рд▓реЗ рдирд╣реАрдВ, рдПрдХ README рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕рдВрдХрд▓рдХ рдХреЗ рдПрд╕рдПрд╕рдП рднрд╛рдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред
рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреАред