TableGen рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ LLVM рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рд╡рд┐рд╡рд░рдг

рдлрд┐рд▓рд╣рд╛рд▓, рдПрд▓рдПрд▓рд╡реАрдПрдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдмрд╣реБрдд рд╣реА рд▓реЛрдХрдкреНрд░рд┐рдп рдкреНрд░рдгрд╛рд▓реА рдмрди рдЧрдИ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рд▓реЛрдЧ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдХрд▓рдХ, рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЖрджрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╕рд╛рдордЧреНрд░реА рдкрд╣рд▓реЗ рд╣реА рд▓рд┐рдЦреА рдЬрд╛ рдЪреБрдХреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд░реВрд╕реА рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рдЕрдЪреНрдЫреА рдЦрдмрд░ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд▓реЗрдЦреЛрдВ рдореЗрдВ рдореБрдЦреНрдп рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣ рд╕реАрдорд╛рдВрдд рдФрд░ рдорд┐рдбрд┐рд▓реЗрдВрдб рдПрд▓рдПрд▓рд╡реАрдПрдо рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдмреЗрд╢рдХ, рдПрд▓рдПрд▓рд╡реАрдПрдо рдСрдкрд░реЗрд╢рди рдХреА рдкреВрд░реА рдпреЛрдЬрдирд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╕рдордп, рдорд╢реАрди рдХреЛрдб рдкреАрдврд╝реА рдХреЛ рдмрд╛рдИрдкрд╛рд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрд╕ рд╡рд┐рд╖рдп рдХреЛ рдЖрдХрд╕реНрдорд┐рдХ рд░реВрдк рд╕реЗ рдЫреБрдЖ рдЬрд╛рддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рд░реВрд╕реА рдореЗрдВ рдкреНрд░рдХрд╛рд╢рдиреЛрдВ рдореЗрдВред рдЗрд╕реА рд╕рдордп, рдПрд▓рдПрд▓рд╡реАрдПрдо рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд▓реНрдХрд┐ рд▓рдЪреАрд▓рд╛ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рддрдВрддреНрд░ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рд╕рд╛рдордЧреНрд░реА рдХреБрдЫ рд╣рдж рддрдХ рдЙрдкреЗрдХреНрд╖рд┐рдд рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдЯреЗрдмрд▓рдЧреИрди рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд╣реЛрдЧреА, рдЬреЛ рдПрд▓рдПрд▓рд╡реАрдПрдо рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред

рд╕рдВрдХрд▓рдХ рдХреЛ рд▓рдХреНрд╖реНрдп рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛рдлреА рд╕реНрдкрд╖реНрдЯ рд╣реИред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЙрдбрд▓ рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХрд╛ рдЕрдкрдирд╛ рд╕реЗрдЯ, рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдорд╢реАрди рдирд┐рд░реНрджреЗрд╢ рдЖрджрд┐ рд╣реЛрддреЗ рд╣реИрдВред рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рд╡реИрдз рдФрд░ рдХреБрд╢рд▓ рдорд╢реАрди рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ: рд░рдЬрд┐рд╕реНрдЯрд░ рд╡рд┐рддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЖрджрд┐ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрд▓рдПрд▓рд╡реАрдПрдо рдмреИрдХрдПрдВрдб рднреА рдорд╢реАрди рдЖрдИрдЖрд░ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреБрдХреВрд▓рди рдХрд░ рд▓реЗрддрд╛ рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдХрд░реАрдм рд╣реИ, рдпрд╛ рд╕реНрд╡рдпрдВ рдХреЛрдбрд╛рдВрддрд░рдХ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдкрд░ред рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдореЗрдВ, рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдФрд░ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ; рддрджрдиреБрд╕рд╛рд░, рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рдкреНрд░реЛрд╕реЗрд╕рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, LLVM рдиреЗ рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЧреБрдгреЛрдВ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХрд▓ рдкреНрд░рд╛рд░реВрдк рдХреЛ рдЕрдкрдирд╛рдпрд╛ред рдкреНрд░рддреНрдпреЗрдХ рд╕рдорд░реНрдерд┐рдд рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП, .td рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдФрдкрдЪрд╛рд░рд┐рдХ рднрд╛рд╖рд╛ рдореЗрдВ рд╡рд┐рд╡рд░рдг рд╣реЛрддрд╛ рд╣реИред рдпрд╣ LLVM рдХреЗ рд╕рд╛рде рд╢рд╛рдорд┐рд▓ TableGen рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп .inc рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдореА рдлрд╛рдЗрд▓реЗрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕реА рд╕реНрд░реЛрдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрд▓рдЧ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИ, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдмрд╕ рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдпреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдлрд╛рдЗрд▓реЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред рдЯреЗрдмрд▓рдЧреИрди рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдпрд╣рд╛рдВ рд╣реИ рдФрд░ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИ, рднрд╛рд╖рд╛ рдХрд╛ рдФрдкрдЪрд╛рд░рд┐рдХ рд╡рд┐рд╡рд░рдг рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рдЪрдп рднреА рд╣реИ ред

рдмреЗрд╢рдХ, рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╡реНрдпрд╛рдкрдХ рд╡рд┐рд╖рдп рд╣реИ, рдЬрд╣рд╛рдВ рдХрдИ рд╡рд┐рд╡рд░рдг рд╣реИрдВ рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдк рд╡реНрдпрдХреНрддрд┐рдЧрдд рд▓реЗрдЦ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдЕрд╡рд▓реЛрдХрди рдХреЗ рдмрд┐рдирд╛ рднреА рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рдореВрд▓ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред

.Td рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рд╡рд┐рд╡рд░рдг


рддреЛ, рдЯреЗрдмрд▓рдЧреЗрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдФрдкрдЪрд╛рд░рд┐рдХ рд╡рд┐рд╡рд░рдг рднрд╛рд╖рд╛ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреА рд╕рдорд╛рди рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рдПрдХ рдШреЛрд╖рдгрд╛рддреНрдордХ рд╢реИрд▓реА рдореЗрдВ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдЗрд╕ рднрд╛рд╖рд╛ рдХреЛ рдЖрдорддреМрд░ рдкрд░ рдЯреЗрдмрд▓рдЧрди рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╛рдиреА рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ, TableGen рдФрдкрдЪрд╛рд░рд┐рдХ рднрд╛рд╖рд╛ рдХреЗ рдирд╛рдо рдФрд░ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред

рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╕рд┐рд╕реНрдЯрдо рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрдирдХрд╛ рд╡рд┐рд╡рд░рдг рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ .td рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд░рдЦрд░рдЦрд╛рд╡ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп #include рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреА рд╕рд╣рд╛рдпрддрд╛ рд╕реЗ, Target.td рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдореЗрд╢рд╛ рдкрд╣рд▓реЗ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╕реНрд╡рддрдВрддреНрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЯреЗрдмрд▓рдЧреИрди рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдВрддрд░рд┐рдХ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ .td рдлрд╝рд╛рдЗрд▓ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╢рд╛рдорд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЗрд╕рдореЗрдВ рдЖрдзрд╛рд░ рдХрдХреНрд╖рд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬреИрд╕реЗ Register , Instruction , Processor , рдЖрджрд┐, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдЖрдкрдХреЛ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдкрдиреА рдЦреБрдж рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред LLVMред рдкрд┐рдЫрд▓реЗ рд╡рд╛рдХреНрдп рд╕реЗ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЯреЗрдмрд▓рдЧреИрди рдореЗрдВ рд╕рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬреНрдЮрд╛рдд рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдзрд╛рд░рдгрд╛ рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, TableGen рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рдореВрд▓ рдЗрдХрд╛рдЗрдпрд╛рдБ рд╣реЛрддреА рд╣реИрдВ: рдХрдХреНрд╖рд╛рдПрдВ рдФрд░ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ ред

рдХрдХреНрд╖рд╛рдПрдВ


рдЯреЗрдмрд▓рдЧреИрди рдХрдХреНрд╖рд╛рдПрдВ рднреА рд╕рд╛рд░ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рд╕рд░рд▓ рдЗрдХрд╛рдЗрдпрд╛рдВ рд╣реИрдВред

рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рдХреНрд╖реЗрддреНрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╡реЗ рдЕрдиреНрдп рд╡рд░реНрдЧреЛрдВ рдХреЛ рднреА рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдзрд╛рд░ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдиреАрдЪреЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

 // A class representing the register size, spill size and spill alignment // in bits of a register. class RegInfo<int RS, int SS, int SA> { int RegSize = RS; // Register size in bits. int SpillSize = SS; // Spill slot size in bits. int SpillAlignment = SA; // Spill slot alignment in bits. } 

рдХреЛрдг рдХреЛрд╖реНрдардХ рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╡рд░реНрдЧ рдЧреБрдгреЛрдВ рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рд╕реЗ, рдЖрдк рдпрд╣ рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ TableGen рднрд╛рд╖рд╛ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рд╣реИред TableGen рдореЗрдВ рдореМрдЬреВрдж рдкреНрд░рдХрд╛рд░: bit (рдорд╛рди 0 рдФрд░ 1 рдХреЗ рд╕рд╛рде рдмреВрд▓рд┐рдпрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ), int , string , code ( code рдПрдХ рдЯреБрдХрдбрд╝рд╛, рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдмрд╕ рдХреНрдпреЛрдВрдХрд┐ TableGen рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдЕрд░реНрдереЛрдВ рдореЗрдВ рддрд░реАрдХреЗ рдФрд░ рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдХреЛрдб рдХреА рдкрдВрдХреНрддрд┐рдпрд╛рдБ [{ ... }] рдореЗрдВ рд▓рд┐рдЦреА рдЬрд╛рддреА рд╣реИрдВ [{ ... }] ), рдмрд┐рдЯреНрд╕ <n>, рд╕реВрдЪреА <рдкреНрд░рдХрд╛рд░> (рдорд╛рди рд╡рд░реНрдЧ рдХреЛрд╖реНрдардХ [...] рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рдпрдерди рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ), class type , dag ред

рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдордЭрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдкреНрд░рд╢реНрди рд╣реИрдВ, рддреЛ рд╡реЗ рд╕рднреА рднрд╛рд╖рд╛ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИрдВ, рдЬреЛ рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рджрд┐рдП рдЧрдП рд▓рд┐рдВрдХ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред

рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рднреА рдПрдХ рдХрд╛рдлреА рдкрд░рд┐рдЪрд┐рдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╣реИ :

 class X86MemOperand<string printMethod, AsmOperandClass parserMatchClass = X86MemAsmOperand> : Operand<iPTR> { let PrintMethod = printMethod; let MIOperandInfo = (ops ptr_rc, i8imm, ptr_rc_nosp, i32imm, SEGMENT_REG); let ParserMatchClass = parserMatchClass; let OperandType = "OPERAND_MEMORY"; } 

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдирд┐рд░реНрдорд┐рдд рд╡рд░реНрдЧ, рдЬрд╝рд╛рд╣рд┐рд░ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝реАрд▓реНрдб рдХреЗ рдорд╛рдиреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдпрд╣ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдлрд╝реАрд▓реНрдб рдХреЛ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджрд┐рдП рдЧрдП рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рдорд╛рди рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдлрд╝реАрд▓реНрдб рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред

рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ (рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ)


рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдареЛрд╕ рд╣реИрдВ, рдЖрдк рдЙрдирдХреА рддреБрд▓рдирд╛ рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВ рдФрд░ рдКрдкрд░ рдмрддрд╛рдП рдЕрдиреБрд╕рд╛рд░ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЖрдзрд╛рд░ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдПрдХ рд╡рд░реНрдЧ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИрдВ, рдФрд░ рдЙрдирдХреЗ рдЕрдкрдиреЗ рдХреНрд╖реЗрддреНрд░ рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

 def i8mem : X86MemOperand<"printbytemem", X86Mem8AsmOperand>; def X86AbsMemAsmOperand : AsmOperandClass { let Name = "AbsMem"; let SuperClasses = [X86MemAsmOperand]; } 

Multiclasses (multiclasses)


рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдореЗрдВ рд╕рдорд╛рди рд╢рдмреНрджрд╛рд░реНрде рд╣реЛрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддреАрди-рдкрддреЛрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рджреЛ рд░реВрдкреЛрдВ тАЬreg = reg op regтАЭ рдФрд░ тАЬreg = reg op immтАЭ ред рдПрдХ рдорд╛рдорд▓реЗ рдореЗрдВ, рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рд╕реЗ рдорд╛рди рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рднреА рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рджреВрд╕рд░рд╛ рдСрдкрд░реЗрдВрдб рдПрдХ рдирд┐рд░рдВрддрд░ рдореВрд▓реНрдп (рдЕрдкрд░ - рддрддреНрдХрд╛рд▓ рдСрдкрд░реЗрдВрдб) рд╣реЛрддрд╛ рд╣реИред

рд╕рднреА рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдирд╛ рдердХрд╛рдК рд╣реИ, рдЧрд▓рддреА рдХрд░рдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИред рдмреЗрд╢рдХ, рд╡реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрдХрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдорд▓реНрдЯреАрдЧреНрд▓рд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдРрд╕реА рдЕрд╡рдзрд╛рд░рдгрд╛ рдЯреЗрдмрд▓рдЧреИрди рднрд╛рд╖рд╛ рдореЗрдВ рдореМрдЬреВрдж рд╣реИред

 multiclass ri_inst<int opc, string asmstr> { def _rr : inst<opc, !strconcat(asmstr, " $dst, $src1, $src2"), (ops GPR:$dst, GPR:$src1, GPR:$src2)>; def _ri : inst<opc, !strconcat(asmstr, " $dst, $src1, $src2"), (ops GPR:$dst, GPR:$src1, Imm:$src2)>; } 

рдорд▓реНрдЯреАрдХрд▓реНрд╢реЗрд╕ рдХреЗ рдЕрдВрджрд░, рдЖрдкрдХреЛ рдбрд┐рдлреЙрд▓реНрдЯ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдкреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкреВрд░реНрдг рд░реВрдк рдирд╣реАрдВ рд╣реИред рдЙрд╕реА рд╕рдордп, рдЖрдк рдЙрди рдореЗрдВ рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡реЗ рд╕рдм рдХреБрдЫ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╕рдВрднрд╡ рд╣реИред рдПрдХ defm рдЖрдзрд╛рд░ рдкрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рднрд╛рд╖рд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ defm рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

 // Instantiations of the ri_inst multiclass. defm ADD : ri_inst<0b111, "add">; defm SUB : ri_inst<0b101, "sub">; defm MUL : ri_inst<0b100, "mul">; 

рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, defm рдорд╛рдзреНрдпрдо рд╕реЗ рджреА рдЧрдИ рдРрд╕реА рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП defm рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрдИ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдХрд┐ рдореБрдЦреНрдп рдирд┐рд░реНрджреЗрд╢ рдФрд░ рдорд▓реНрдЯреАрдХрд╛рд▓реЗрдЬрд╝ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдкреЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдпреЛрдЬрди рд╣реИрдВред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрджреЗрд╢ рдЙрддреНрдкрдиреНрди рд╣реЛрдВрдЧреЗ: ADD_rr , ADD_ri , SUB_rr , SUB_ri , MUL_rr , MUL_ri ред

рдорд▓реНрдЯреАрдХрд▓рд╛рд╕реЗрд╕ рдореЗрдВ рди рдХреЗрд╡рд▓ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдмрд▓реНрдХрд┐ рдиреЗрд╕реНрдЯреЗрдб defm рднреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдкреАрдврд╝реА рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЬрдЯрд┐рд▓ рд░реВрдкреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рдЬрдВрдЬреАрд░реЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕рд░рдХрд╛рд░реА рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

Subtargets


рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдмреБрдирд┐рдпрд╛рджреА рдФрд░ рдЙрдкрдпреЛрдЧреА рдЪреАрдЬ рдЬрд┐рд╕рдореЗрдВ рдирд┐рд░реНрджреЗрд╢ рд╕реЗрдЯ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд░реВрдк рд╣реИрдВ, рдПрд▓рдПрд▓рд╡реАрдПрдо рдореЗрдВ рд╕рдмрдЯрд╛рд░реНрдЧреЗрдЯ рдХрд╛ рд╕рдорд░реНрдерди рд╣реИред рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг LLVM SPARC рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рдЬреЛ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ SPARC рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрд╕реЗрд╕рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рддреАрди рдореБрдЦреНрдп рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИ: рд╕рдВрд╕реНрдХрд░рдг 8 (V8, 32-рдмрд┐рдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░), рд╕рдВрд╕реНрдХрд░рдг 9 (V9, 64-рдмрд┐рдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░) рдФрд░ UltraSPARC рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ред рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реИ, рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреА рдПрдХ рдЕрд▓рдЧ рд╕рдВрдЦреНрдпрд╛, рд╕рдорд░реНрдерд┐рдд рдмрд╛рдЗрдЯ рдСрд░реНрдбрд░, рдЖрджрд┐ред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрджрд┐ рдХрдИ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИрдВ, рддреЛ рдпрд╣ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП XXXSubtarget рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рд╡рд┐рд╡рд░рдг рдореЗрдВ рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдирдП рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╡рд┐рдХрд▓реНрдк -mcpu= рдФрд░ -mattr= ред

Subtarget рдХреНрд▓рд╛рд╕ рдХреЗ рдЕрд▓рд╛рд╡рд╛, Subtarget рдХреНрд▓рд╛рд╕ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

 class SubtargetFeature<string n, string a, string v, string d, list<SubtargetFeature> i = []> { string Name = n; string Attribute = a; string Value = v; string Desc = d; list<SubtargetFeature> Implies = i; } 

Sparc.td рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдЖрдк Sparc.td рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдЙрдкрдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

 def FeatureV9 : SubtargetFeature<"v9", "IsV9", "true", "Enable SPARC-V9 instructions">; def FeatureV8Deprecated : SubtargetFeature<"deprecated-v8", "V8DeprecatedInsts", "true", "Enable deprecated V8 instructions in V9 mode">; def FeatureVIS : SubtargetFeature<"vis", "IsVIS", "true", "Enable UltraSPARC Visual Instruction Set extensions">; 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡реИрд╕реЗ рднреА, Sparc.td рдЕрднреА рднреА Proc рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ SPARC рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдмрд╕ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдЧреБрдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕реЗрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

 class Proc<string Name, list<SubtargetFeature> Features> : Processor<Name, NoItineraries, Features>; def : Proc<"generic", []>; def : Proc<"v8", []>; def : Proc<"supersparc", []>; def : Proc<"sparclite", []>; def : Proc<"f934", []>; def : Proc<"hypersparc", []>; def : Proc<"sparclite86x", []>; def : Proc<"sparclet", []>; def : Proc<"tsc701", []>; def : Proc<"v9", [FeatureV9]>; def : Proc<"ultrasparc", [FeatureV9, FeatureV8Deprecated]>; def : Proc<"ultrasparc3", [FeatureV9, FeatureV8Deprecated]>; def : Proc<"ultrasparc3-vis", [FeatureV9, FeatureV8Deprecated, FeatureVIS]>; 

рдЯреЗрдмрд▓рдЧреЗрди рдФрд░ рдПрд▓рдПрд▓рд╡реАрдПрдо рдмреИрдХрдПрдВрдб рдХреЛрдб рдореЗрдВ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЧреБрдгреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз


рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдЧреБрдг рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддреБ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдФрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрд▓рдПрд▓рд╡реАрдПрдо рдмреИрдХрдПрдВрдб рд╕реНрд░реЛрдд рдХреЛрдб рд╕реЗ рдЙрдирдХреА рдХреЛрдИ рд╕реАрдзреА рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХрднреА-рдХрднреА рдЖрдк рд╕рдВрдХрд▓рдХ рдХреЛрдб рдореЗрдВ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдХреБрдЫ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЧреБрдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

TSFlags


рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Instruction рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреНрд╖реЗрддреНрд░ рд╣реИ, 64-рдмрд┐рдЯ TSFlags, рдЬрд┐рд╕реЗ TableGen рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ TableGen рд╡рд┐рд╡рд░рдг рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╡рд░реНрдЧ MCInstrDesc рдХреЗ C ++ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред рдЖрдк рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдмрд┐рдЯреНрд╕ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреЛ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдХреБрдЫ рдмреВрд▓рд┐рдпрди рдорд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╣рдо рдПрдХ рд╕реНрдХреЗрд▓рд░ ALU рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

 let TSFlags{0} = SALU; 

рдпрд╛ рд╣рдо рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд░, рд╣рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд┐рдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

 // Instruction type according to the ISA. IType Type = type; let TSFlags{7-1} = Type.Value; 

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдмреИрдХреЗрдВрдб рдХреЛрдб рдореЗрдВ рдЗрди рдЧреБрдгреЛрдВ рдХреЛ рдирд┐рд░реНрджреЗрд╢ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

 bool isSALU = MI.getDesc().TSFlags & SIInstrFlags::SALU; 

рдпрджрд┐ рд╕рдВрдкрддреНрддрд┐ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ TableGen рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдСрдЯреЛ-рдЬрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдкреНрд░реЗрд╖рдг рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред

 (Desc.TSFlags & X86II::FormMask) == X86II::MRMSrcMem 


рдХрд╛рд░реНрдп рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рддрд╛ рд╣реИ


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рдзреЗрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрдирдХреА рдорджрдж рд╕реЗ, рдЖрдк рдЯреЗрдмрд▓рдЧреИрди рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рддрджрдиреБрд╕рд╛рд░ рдмреИрдХрдПрдВрдб рдХреЛрдб рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧреАред рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдРрд╕реА рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рднрд╛рд╖рд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдиреАрдЪреЗ рдкреНрд░рд╕реНрддреБрдд рдХреА рдЧрдИ рд╣реИред

 // Base class for function predicates. class FunctionPredicateBase<string name, MCStatement body> { string FunctionName = name; MCStatement Body = body; } 

рдЖрдк X86 рдХреЗ рдмреИрдХрдПрдВрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рддреЛ рдЗрд╕рдХрд╛ рдЕрдкрдирд╛ рдордзреНрдпрд╡рд░реНрддреА рд╡рд░реНрдЧ рд╣реИ, рдЬрд┐рд╕рдХреА рд╕рд╣рд╛рдпрддрд╛ рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд┐рд░реНрдорд┐рдд рд╣реИрдВред

 // Check that a call to method `Name` in class "XXXInstrInfo" (where XXX is // the name of a target) returns true. // // TIIPredicate definitions are used to model calls to the target-specific // InstrInfo. A TIIPredicate is treated specially by the InstrInfoEmitter // tablegen backend, which will use it to automatically generate a definition in // the target specific `InstrInfo` class. // // There cannot be multiple TIIPredicate definitions with the same name for the // same target class TIIPredicate<string Name, MCStatement body> : FunctionPredicateBase<Name, body>, MCInstPredicate; // This predicate evaluates to true only if the input machine instruction is a // 3-operands LEA. Tablegen automatically generates a new method for it in // X86GenInstrInfo. def IsThreeOperandsLEAFn : TIIPredicate<"isThreeOperandsLEA", IsThreeOperandsLEABody>; //   -    ,  -  ,       // Used to generate the body of a TII member function. def IsThreeOperandsLEABody : MCOpcodeSwitchStatement<[LEACases], MCReturnStatement<FalsePred>>; 

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЖрдк C ++ рдХреЛрдб рдореЗрдВ isThreeOperandsLEA рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 if (!(TII->isThreeOperandsLEA(MI) || hasInefficientLEABaseReg(Base, Index)) || !TII->isSafeToClobberEFLAGS(MBB, MI) || Segment.getReg() != X86::NoRegister) return; 

рдпрд╣рд╛рдБ TII рд▓рдХреНрд╖реНрдп рдирд┐рд░реНрджреЗрд╢ рд╕реВрдЪрдирд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП MCSubtargetInfo рд╕реЗ getInstrInfo() рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЕрдиреБрдХреВрд▓рди рдХреЗ рджреМрд░рд╛рди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд░рд┐рд╡рд░реНрддрдиред рдирд┐рд░реНрджреЗрд╢ рдорд╛рдирдЪрд┐рддреНрд░рдг


рд╕рдВрдХрд▓рди рдХреЗ рдмрд╛рдж рдХреЗ рдЪрд░рдгреЛрдВ рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрд┐рдП рдЧрдП рдЕрдиреБрдХреВрд▓рди рдХреЗ рджреМрд░рд╛рди, рдХрд╛рд░реНрдп рдЕрдХреНрд╕рд░ рдПрдХ рдлреЙрд░реНрдо рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╕рднреА рдпрд╛ рдХреЗрд╡рд▓ рдПрдХ рднрд╛рдЧ рдХреЛ рджреВрд╕рд░реЗ рд░реВрдк рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдмрд╣реБрд░рдВрдЧреА рдХреЗ рдЖрд╡реЗрджрди рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдорд╛рди рд╢рдмреНрджрд╛рд░реНрде рдФрд░ рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдХреЛрдб рдореЗрдВ, рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдмрдбрд╝реЗ switch-case рдирд┐рд░реНрдорд╛рдг рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдиреЗ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдХреБрдЪрд▓ рджрд┐рдпрд╛ред рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ, рдЗрди рд╡рд┐рд╢рд╛рд▓ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЛ рдореИрдХреНрд░реЛрдЬрд╝ рдХреА рдорджрдж рд╕реЗ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдкреНрд░рд╕рд┐рджреНрдз рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╛рдо рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрд╣реБрдд рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдмрдирд╛рдП рд░рдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рд╕рднреА рдирд┐рд░реНрджреЗрд╢ рдирд╛рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реВрдЪреАрдмрджреНрдз рд╣реИрдВред рдПрдХ рдирдпрд╛ рдирд┐рд░реНрджреЗрд╢ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕рднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдкреАрдбрд╝рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдПрд▓рдПрд▓рд╡реАрдПрдо рдиреЗ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдПрдХ рд░реВрдк рдХреЛ рджреВрд╕рд░реЗ Instruction Mapping рдореЗрдВ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрдВрддреНрд░ рдмрдирд╛рдпрд╛ред

рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдЯреЗрдмрд▓рдЧрди рдореЗрдВ рд╕реАрдзреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рдореЙрдбрд▓ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдПрд▓рдПрд▓рд╡реАрдПрдо рдЯреЗрдмрд▓рдЧреИрди рдореЗрдВ рдРрд╕реЗ рдореЙрдбрд▓ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рд╣реИред

 class InstrMapping { // Used to reduce search space only to the instructions using this // relation model. string FilterClass; // List of fields/attributes that should be same for all the instructions in // a row of the relation table. Think of this as a set of properties shared // by all the instructions related by this relationship. list<string> RowFields = []; // List of fields/attributes that are same for all the instructions // in a column of the relation table. list<string> ColFields = []; // Values for the fields/attributes listed in 'ColFields' corresponding to // the key instruction. This is the instruction that will be transformed // using this relation model. list<string> KeyCol = []; // List of values for the fields/attributes listed in 'ColFields', one for // each column in the relation table. These are the instructions a key // instruction will be transformed into. list<list<string> > ValueCols = []; } 

рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ рдЬреЛ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдкрд╛рдП рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдЕрдм рдФрд░ рднреА рд╕рд░рд▓ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдВрддрд┐рдо рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рдХреЙрд▓рдо рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВред рдмреИрдХрдПрдВрдб рдХреЛрдб рдореЗрдВ рдЖрдк рдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рдВрд╕ рдореИрдкрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд░реНрдгрд┐рдд рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдирдП рд░реВрдкреЛрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢, mmdsp рдореЗрдВ рдбреАрдПрд╕рдкреА рдирд┐рд░реНрджреЗрд╢ рдЗрддреНрдпрд╛рджрд┐ рдХреЛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕ рддрдВрддреНрд░ рдХрд╛ рдЕрдм рддрдХ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдмрд╕ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдмреИрдХрдПрдВрдб рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдмрдирдирд╛ рд╢реБрд░реВ рд╣реЛ рдЧрдП рдереЗ, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрднреА рднреА рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдЧреБрдг рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдХреБрдЫ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдкреБрдирд░реНрд░рдЪрдирд╛ред

рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдПред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд┐рдзреЗрдп рдФрд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдмрд┐рдирд╛ рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╡рд┐рдзреЗрдп рдХреНрд░рдорд╢рдГ рд╕рддреНрдп рдФрд░ рдЕрд╕рддреНрдп рд╣реИред рд╣рдо рдЙрдиреНрд╣реЗрдВ рдПрдХ рдорд▓реНрдЯреАрд╕реНрдХрд▓реНрд╕ рдФрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧ рдХреА рдорджрдж рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдо рд╕рд┐рд░реНрдл рдПрдХ рдлрд┐рд▓реНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рдХрдИ рдЧреБрдгреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╕рд░рд▓реАрдХреГрдд рд╡рд┐рд╡рд░рдг рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

 class PredRel; multiclass MyInstruction<string name> { let BaseOpcode = name in { def : PredRel { let PredSense = ""; } def _pt: PredRel { let PredSense = "true"; } def _pf: PredRel { let PredSense = "false"; } } } defm ADD: MyInstruction<тАЭADDтАЭ>; defm SUB: MyIntruction<тАЭSUBтАЭ>; defm MUL: MyInstruction<тАЭMULтАЭ>; тАж 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрд╣ рднреА рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдХрдИ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рд╣реИ let тАж in рдирд┐рд░реНрдорд╛рдг рдореЗрдВред рдирддреАрдЬрддрди, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВ рдЬреЛ рдЙрдирдХреЗ рдЖрдзрд╛рд░ рдирд╛рдо рдФрд░ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдирдХреЗ рд░реВрдк рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред рддрдм рдЖрдк рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рдореЙрдбрд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

 def getPredOpcode : InstrMapping { // ,       - PredRel  let FilterClass = "PredRel"; //         ,      let RowFields = ["BaseOpcode"]; //          PredSense. let ColFields = ["PredSense"]; //  ,  ,       ,     PredSense=тАЭтАЭ let KeyCol = [""]; //   PredSense      let ValueCols = [["true"], ["false"]]; } 

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЗрд╕ рд╡рд┐рд╡рд░рдг рд╕реЗ рдирд┐рдореНрди рддрд╛рд▓рд┐рдХрд╛ рдЙрддреНрдкрдиреНрди рдХреА рдЬрд╛рдПрдЧреАред

PredSense = ""PredSense = "рд╕рдЪ"PredSense = "рдЧрд▓рдд"
рдЬреЛрдбрд╝реЗрдВADD_ptADD_pf
рдЙрдкSUB_ptSUB_pf
рдПрдордпреВрдПрд▓MUL_ptMUL_pf

.inc рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЙрддреНрдкрдиреНрди рд╣реЛрдЧрд╛

 int getPredOpcode(uint16_t Opcode, enum PredSense inPredSense) 

рдЬреЛ, рддрджрдиреБрд╕рд╛рд░, рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдХреЛрдб рдФрд░ рдкреНрд░рд┐рдбрд┐рдХреНрд╢рди рдСрдЯреЛ-рдЬрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдПрдиреНрдпреВрдорд░реЗрд╢рди рдХреЗ рдореВрд▓реНрдп рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреЙрд▓рдо рдореЗрдВ рд╕рднреА рд╕рдВрднрд╡ рдорд╛рди рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмреНрдпрд╛рдЬ рдХреЗ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд▓рд┐рдП рд╡рд╛рдВрдЫрд┐рдд рд╕рд░рдгреА рддрддреНрд╡ рджреЗрддрд╛ рд╣реИред

рдФрд░ рдмреИрдХрдПрдВрдб рдХреЛрдб рдореЗрдВ, switch-case рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп switch-case рдХреЗрд╡рд▓ рдЙрддреНрдкрдиреНрди рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдЬреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдХреЛрдб рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ред рдПрдХ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди, рдЬрд╣рд╛рдВ рдирдП рдирд┐рд░реНрджреЗрд╢ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред

рд╕реНрд╡рддрдГ-рдирд┐рд░реНрдорд┐рдд рдХрд▓рд╛рдХреГрддрд┐рдпрд╛рдБ ( .inc рдлрд╝рд╛рдЗрд▓реЗрдВ)


TableGen рд╡рд┐рд╡рд░рдг рдФрд░ LLVM рдмреИрдХрдПрдВрдб рдХреЛрдб рдХреЗ рдмреАрдЪ рд╕рднреА рдЗрдВрдЯрд░реИрдХреНрд╢рди C рдХреЛрдб рд╡рд╛рд▓реА рдЙрддреНрдкрдиреНрди .inc рдлрд╝рд╛рдЗрд▓реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдкреВрд░реА рддрд╕реНрд╡реАрд░ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╣реИрдВред

рдкреНрд░рддреНрдпреЗрдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рдмрд╛рдж, рдкреНрд░рддреНрдпреЗрдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП, рдмрд┐рд▓реНрдб рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдХрдИ .inc рдлрд╛рдЗрд▓реЗрдВ .inc , рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИредрддреЛ рд╡рд╣рд╛рдБ рдПрдХ рдлрд╛рдЗрд▓ рд╣реИ <TargetName>GenInstrInfo.incрдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдпреБрдХреНрдд <TargetName>GenRegisterInfo.incрдЬреЛ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рд╣реИ, рдХреНрд░рдорд╢рдГ, рд╡рд╣рд╛рдБ рдХреЛрдбрд╛рдВрддрд░рдХ рдФрд░ рдЗрд╕рдХреЗ рдЙрддреНрдкрд╛рджрди рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓реЗрдВ рд╣реИрдВ <TargetName>GenAsmMatcher.incрдФрд░ <TargetName>GenAsmWriter.incрдЖрджрд┐

рддреЛ рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдХреНрдпрд╛ рдмрдирддрд╛ рд╣реИ? рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╡реЗ рдЧрдгрдирд╛, рд╕рд░рдгрд┐рдпрд╛рдБ, рд╕рдВрд░рдЪрдирд╛рдПрдВ рдФрд░ рд╕рд░рд▓ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ <TargetName>GenInstrInfo.incред

рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд▓рдХреНрд╖реНрдп рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдирд╛рдорд╕реНрдерд╛рди рдореЗрдВ рдПрдХ рдЧрдгрдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕рднреА рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВред

 namespace X86 { enum { PHI = 0, тАж ADD16i16 = 287, ADD16mi = 288, ADD16mi8 = 289, ADD16mr = 290, ADD16ri = 291, ADD16ri8 = 292, ADD16rm = 293, ADD16rr = 294, ADD16rr_REV = 295, тАж } 

рдЕрдЧрд▓рд╛ рдПрдХ рд╕рд░рдгреА рд╣реИ рдЬреЛ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЧреБрдгреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ const MCInstrDesc X86Insts[]ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд░рдгрд┐рдпреЛрдВ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢ рдирд╛рдо рдЖрджрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИред рдореВрд▓ рд░реВрдк рд╕реЗ, рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдФрд░ рд╕рд░рдгрд┐рдпреЛрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рддреА рд╣реИред

рдРрд╕реЗ рдХрд╛рд░реНрдп рднреА рд╣реИрдВ рдЬрд┐рдирдХрд╛ рд╡рд░реНрдгрди рд╡рд┐рдзреЗрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдлрд╝рдВрдХреНрд╢рди рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдЙрддреНрдкрдиреНрди рд╣реЛрдЧрд╛ред

 bool X86InstrInfo::isThreeOperandsLEA(const MachineInstr &MI) { switch(MI.getOpcode()) { case X86::LEA32r: case X86::LEA64r: case X86::LEA64_32r: case X86::LEA16r: return ( MI.getOperand(1).isReg() && MI.getOperand(1).getReg() != 0 && MI.getOperand(3).isReg() && MI.getOperand(3).getReg() != 0 && ( ( MI.getOperand(4).isImm() && MI.getOperand(4).getImm() != 0 ) || (MI.getOperand(4).isGlobal()) ) ); default: return false; } // end of switch-stmt } 

рд▓реЗрдХрд┐рди рдЙрддреНрдкрдиреНрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдФрд░ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рдбреЗрдЯрд╛ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ X86GenSubtargetInfo.incрдЖрдк рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдХрд┐ рдмреИрдХрдПрдВрдб рдХреЛрдб рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдФрд░ рдПрдХ TTI рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВред

 struct X86GenMCSubtargetInfo : public MCSubtargetInfo { X86GenMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS, ArrayRef<SubtargetFeatureKV> PF, ArrayRef<SubtargetSubTypeKV> PD, const MCWriteProcResEntry *WPR, const MCWriteLatencyEntry *WL, const MCReadAdvanceEntry *RA, const InstrStage *IS, const unsigned *OC, const unsigned *FP) : MCSubtargetInfo(TT, CPU, FS, PF, PD, WPR, WL, RA, IS, OC, FP) { } unsigned resolveVariantSchedClass(unsigned SchedClass, const MCInst *MI, unsigned CPUID) const override { return X86_MC::resolveVariantSchedClassImpl(SchedClass, MI, CPUID); } }; 

рдпрджрд┐ Subtargetрд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдиреНрдпрд╛рд╕реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ XXXGenSubtarget.inc, SubtargetFeatureрддреЛ рд╕реАрдкреАрдпреВ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдФрд░ рдЙрдкрдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░рдВрддрд░ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд░реНрдгрд┐рдд рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЧрдгрди рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ , рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЙрддреНрдкрдиреНрди рд╣реЛрдЧрд╛ ParseSubtargetFeaturesрдЬреЛ рд╡рд┐рдХрд▓реНрдк рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ Subtargetред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, XXXSubtargetрдмреИрдХрдПрдВрдб рдХреЛрдб рдореЗрдВ рд╡рд┐рдзрд┐ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЫрджреНрдо рдХреЛрдб рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдореЗрдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:

 XXXSubtarget::XXXSubtarget(const Module &M, const std::string &FS) { // Set the default features // Determine default and user specified characteristics of the CPU // Call ParseSubtargetFeatures(FS, CPU) to parse the features string // Perform any additional operations } 

рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ .incрдлрд╛рдЗрд▓реЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╣реЛрддреА рд╣реИрдВ рдФрд░ рдЗрд╕рдореЗрдВ рд╡рд┐рд╢рд╛рд▓ рд╕рд░рдгрд┐рдпрд╛рдБ рд╣реЛрддреА рд╣реИрдВ, рдЗрд╕рд╕реЗ рд╣рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рдордп рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд╕реА рдРрд░реЗ рддрддреНрд╡ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░рдВрддрд░ рд╕рдордп рд╣реЛрддрд╛ рд╣реИред рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдЦреЛрдЬ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдкрд░рд┐рдЪрд╛рд▓рди рд╕рдордп рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдЦреЛрдЬ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЗрд╕ рд░реВрдк рдореЗрдВ рднрдВрдбрд╛рд░рдг рдХрд╛рдлреА рдЙрдЪрд┐рдд рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


рдирддреАрдЬрддрди, рдПрд▓рдПрд▓рд╡реАрдПрдо рдореЗрдВ рдЯреЗрдмрд▓рдЧреИрди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдиреБрдХреВрд▓рди рдФрд░ рдХреЛрдб рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП рдПрд▓рдПрд▓рд╡реАрдПрдо рдмреИрдХрдПрдВрдб рд╕реНрд░реЛрдд рдХреЛрдб рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рддрдВрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрдардиреАрдп рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдорд░реНрдерд┐рдд рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╡рд┐рд╡рд░рдг рд╣реИрдВред рдЗрд╕реА рд╕рдордп, рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╡рд┐рд╡рд░рдг рдСрдЯреЛ-рдЬрдирд░реЗрдЯ рдХреЛрдб рдХреЗ рдХрд╛рд░рдг рд╕рдВрдХрд▓рдХ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХреБрд╢рд▓ рд╕рдорд╛рдзрд╛рди рдФрд░ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

Source: https://habr.com/ru/post/hi474460/


All Articles