рд╕реБрдЦрдж рдкреНрд░рд╡рд╛рд╕ рдХреЗ рдмрд╛рдж, рд╣рдо рдЕрдкрдиреА рдЬреЗ-рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рд▓рд┐рдЦрдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред
рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ, рд╣рдордиреЗ
рд░рдЬрд┐рд╕реНрдЯрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд╕реАрд▓рд┐рдВрдЧ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдПрдХ
рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдФрд░ рдЙрд╕реА рд╕рдордп рдХреЛрдб рдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рдФрд░ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рдкрд╛рдардХреЛрдВ
рдиреЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ
рдПрдХ рдмрдЧ рдкрд╛рдпрд╛ ред
рдкреЛрд╕реНрдЯ рдореЗрдВ рдЖрдЧреЗ:
- рдПрдХ рдмрдЧ рдХреЛ рдареАрдХ рдХрд░рдирд╛
- рд╕рдлрд╛рдИ рдХреА рдкреНрд░рддрд┐рдпрд╛рдВ
- рдХреНрдпрд╛ рд╣реБрдЖ рдерд╛?
- рддрд╣ рд▓рдЧрд╛рддрд╛рд░
- рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдПрдХ рдмрдЧ рдХреЛ рдареАрдХ рдХрд░рдирд╛
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдзреЛрдЦрд╛ рджреЗрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдЬрдм рдкрд╣рд▓реА рдмрд╛рд░ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рдорд╛рди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЙрдкреА рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрд╕ рдордзреНрдпрд╡рд░реНрддреА рдорд╛рди рдХреЗ рд╕рд╛рде рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЗ рд▓рд┐рдП рднрдВрдбрд╛рд░рдг рд╕реНрдерд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
ID '=' EXPR { $$ = $3 ;
if (vars[ $1 ])
emit(command::add, vars[ $1 ], $3 , 0 );
else
vars[ $1 ] = $3 ; // new var
}
рдлрд┐рд░, рдЬрдм рдЯрд╛рдЗрдк
a=2;
рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
a=2;
рд╣рдо рдПрдХ
MOV R1, 2
рдХрдорд╛рдВрдб
MOV R1, 2
(рдХрдирд╡рд▓реНрд╢рди 2 рд╕реЗ) рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░
vars["a"]=R1
(рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХрдирд╡рд▓реНрд╢рди рд╕реЗ) рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВред
рд╕рдм рдХреБрдЫ рд╕рддреНрдп, рд╕рд░рд▓ рдФрд░ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИред
рд╕рдорд╕реНрдпрд╛ рддрдм рдкреИрджрд╛ рд╣реБрдИ, рдЬрдм рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рджрд╛рдИрдВ рдУрд░, рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдХреБрдЫ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд░рд╣рдиреЗ рд╡рд╛рд▓реЗ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдФрд░ рдЪрд░ред
a = 2;
рдмреА = рдП;
рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рджреВрд╕рд░реЗ рдХрдирд╡рд▓реНрд╢рди рдореЗрдВ, рдХреЛрдИ рдирдпрд╛ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ - рдмрд╕ рдпрд╛рдж рд░рдЦреЗрдВ
vars["b"]=R1
рджреЛрдиреЛрдВ рдЪрд░ рдПрдХ рд╣реА рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдереЗ, рдФрд░ рдЬрдм рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛, рддреЛ рджреВрд╕рд░рд╛ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред
рд╕рдорд╛рдзрд╛рди рд╕рддрд╣ рдкрд░ рд╕реНрдерд┐рдд рд╣реИ: рдкреНрд░рддреНрдпреЗрдХ рдирдП рдЪрд░ рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рдирдпрд╛ рд░рдЬрд┐рд╕реНрдЯрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
ID '=' EXPR { $$ = $3 ;
if (!vars[ $1 ]) vars[ $1 ] = newreg();
emit(command::add, vars[ $1 ], $3 , 0 );
}
рдлрд┐рд░
a=2;
рдЯреАрдореЛрдВ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рдорд┐рд▓рддрд╛ рд╣реИ
MOV R1, 2
ADD R2, R1, 0
рдФрд░
vars["a"]=R2
рдпрд╛рдж рд░рдЦреЗрдВ
vars["a"]=R2
рдпрджрд┐
b = a;
рджреНрд╡рд╛рд░рд╛ рдкреАрдЫрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛
b = a;
- рдлрд┐рд░
MOV R3, R2, 0
рдФрд░
vars["b"]=R3
рдХреЛ рдХреЛрдб рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛
рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЕрдм рдЙрддреНрдкрдиреНрди рдХреЛрдб рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реА рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рддрд┐рдпрд╛рдВ рд╣реЛрдВрдЧреА, рдФрд░ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рднреА рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ - рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдкреНрд░рдпреБрдХреНрдд рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝ рд░рд╣реА рд╣реИред
рд╣рдо рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ рдЬрд╣рд╛рдВ рдирдХрд▓ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рджрд╛рдИрдВ рдУрд░ рд╕реЗ рдЪрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ), рдФрд░ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЖрджреЗрд╢реЛрдВ рдХреЛ рдареАрдХ рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╡реЗ рдореВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рд╕рдлрд╛рдИ рдХреА рдкреНрд░рддрд┐рдпрд╛рдВ
рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЙрдиреНрдореВрд▓рди рд╕рд░рд▓ рдЕрдиреБрдХреВрд▓рди рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдкрд╣рд▓реЗ рдкрдж рд╕реЗ
рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдерд╛ ред рд░рдЬрд┐рд╕реНрдЯрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рджреМрд░рд╛рди рдХрд┐рдП рдЧрдП рдЕрдиреБрдХреВрд▓рди рдХреЗ рд╕рд╛рде, рдбреЗрдЯрд╛-рдкреНрд░рд╡рд╛рд╣ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕рдлрд╛рдИ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдбреАрдПрдлрдП рдХреЗ рджреЛ рдкрд┐рдЫрд▓реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рд╕реЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ (рдЬреАрд╡рд┐рдд рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ рдЬрд╛рдирд╛, рд╕рд╣реЗрдЬреЗ рдЧрдП рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рдирд╛) рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдВрджреБ рдкрд░ рд╣рдо рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЛ рд╕реНрдЯреЛрд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рднреА рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рдПрдХ рд╣реА рдХреЗ рд╕реЗрдЯ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЖрдк рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рджреЛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдбреАрдПрдлрдП рдХреЗ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред (рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рд╣рдореЗрд╢рд╛ рджреЛ рд╕реЗрдЯреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - "рд╢рд╛рдорд┐рд▓" рдФрд░ "рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЧрдпрд╛ред")
рд╣рдо рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рдХреИрд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВрдЧреЗ?
ADD RA, RB, 0
рдХрдорд╛рдВрдб ADD RA, RB, 0
RA
рдХреЛ RB
рдХреЗ рд╕реЗрдЯ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ;- рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдорд╛рдорд▓реЗ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдХрдорд╛рди рдЗрд╕реЗ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рд╕реЗрдЯ рдкрд░ рд▓реЗ рдЬрд╛рддреА рд╣реИ;
RA
рдФрд░ RB
рдЯреАрдо рд╕реА рдореЗрдВ рдПрдХ рд╕рд╛рде рд╣реЛрдВрдЧреЗ рдпрджрд┐ рд╡реЗ рд╕рднреА рдЯреАрдореЛрдВ рдореЗрдВ рдПрдХ рд╕рд╛рде рд╣реИрдВ рдЬрд╣рд╛рдВ рд╕реЗ рдЖрдк рд╕реА (рд╕реАрдзреЗ рдпрд╛ рдХреВрдж рдХрд░) рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдВрддрд┐рдо рд╡рд┐рднрд╛рдЬрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХреЗ рдмрдЬрд╛рдп рдореВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
RA
рдмрдЬрд╛рдп
RA
рдЖрдк
RB
рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рд╡реЗ
рд╕рднреА рдЯреАрдореЛрдВ
рдореЗрдВ рдПрдХ рд╕рд╛рде рд╣реИрдВ рдЬрд╣рд╛рдВ
RA
рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдФрд░ рдПрдХ рдФрд░ рд╕реВрдХреНрд╖реНрдорддрд╛: рдЬрдм рд╕реЗ рд╣рдо рдЯреАрдо рд╕реЗ рдЯреАрдо рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рд╕реЗрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЯреНрд░рдВрдХрдЯ (рд╕рднреА рдЖрд╡рдХ рд╕реЗрдЯреЛрдВ рдХреЛ рдХрд╛рдЯрддреЗ рд╣реИрдВ), рдбреАрдПрдлрдП рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рд╕реЗрдЯ рдХреЛ рдЦрд╛рд▓реА рдирд╣реАрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╛рдкрдХ рд░реВрдк рдореЗрдВ - рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╕реЗрдЯ рдХреЛ рдЫреЛрдЯрд╛ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрд╡рд╢реНрдпрдХред рдкреИрд╕рд╛ рдЦрд░реНрдЪ рди рдХрд░рдиреЗ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рд░ рдЯреАрдо рдореЗрдВ рд╕рднреА рдореМрдЬреВрджрд╛ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЛ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╡реНрдпрд╛рдкрдХ рд╕реЗрдЯ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реБрдП "рд▓рд╛рдкрддрд╛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐" рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рдордд рд╣реЛрдВрдЧреЗред
рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрди рддреАрди рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рдореЗрдВ рд╡рд┐рднрд╛рдЬрди рдкрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╡рд┐рднрд╛рдЬрди рдореЗрдВ, рд╣рдо рдЙрди рд╕реЗрдЯреЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ("рд╡реИрд╢реНрд╡рд┐рдХ" рд╕реЗрдЯ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдЬрд┐рд╕рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рд╢реБрд░реВ рдореЗрдВ рдПрдХ рд╕рд╛рде рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ), рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рд▓рд┐рдП ("рд╡реИрд╢реНрд╡рд┐рдХ" рд╕реЗрдЯ рдореЗрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░), рд╕реЗрдЯ рдХрд╛ рдПрдХ рдЗрдЯреЗрдЯрд░ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╕реНрдерд┐рдд рд╣реИ ред
рдореБрдЭреЗ рдЯреНрд░реА
std::set
рд╕рд╛рде рдХреБрдЫ рдЕрдЬреАрдм рд╕рдорд╕реНрдпрд╛рдПрдВ рдереАрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЦреБрдж рдХреЛ
bit::set
рд▓рд┐рдЦрд╛
bit::set
рдХрдВрдЯреЗрдирд░ рдХреЛ рдПрдХ рд╕рдорд╛рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде, рд▓реЗрдХрд┐рди
std::bitset
рд╕рд╛рде
std::bitset
рдЕрдВрджрд░ред рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рджреНрд╡рд╛рд░рд╛, рдпрд╣ рд╕реЗрдЯ рдореЗрдВ рдЕрдзрд┐рдХрддрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдорд╛рди рд▓реЗрддрд╛ рд╣реИред
рдЙрд╕реА рд╕рдордп,
bit::set
рдореЗрдВ рд╕реЗрдЯ (
&=
,
|=
) рдкрд░ рдорд╛рдирдХ рд╕рдВрдЪрд╛рд▓рди рд╣реЛрддреЗ рд╣реИрдВред
typedef bit::set<regnum, 255 > regset;
class regPartition {
typedef std::list<regset> regsets;
regsets sets;
std::map<regnum, regsets::iterator> byreg;
// : ""
public :
// :
bool add(regnum copy, regnum orig) {
if (byreg.count(copy)) {
if (byreg[copy]==byreg[orig]) //
return false ;
byreg[copy]->erase(copy);
// ?
if (!byreg[copy]->size())
sets.erase(byreg[copy]);
}
assert(byreg.count(orig));
byreg[copy] = byreg[orig];
byreg[copy]->insert(copy);
return true ;
}
void remove(regnum r) {
if (byreg.count(тАМr)) {
if (byreg[r]->size()== 1 ) return ; //
byreg[r]->erase(тАМr);
}
byreg[r] = sets.insert(sets.end(), regset());
byreg[r]->insert(тАМr);
}
// :
bool isect( /* const */ regPartition& p, const command& self) {
bool changed = false ;
// , p
foreach(i, byreg) {
regnum r = i->first;
// split by p.byreg[r]
regsets::iterator withR = i->second,
withoutR = sets.insert(sets.end(), regset());
foreach2(j, (*withR), next)
// , -- mov :
//
if (!(self.opcode==command::add && !self.src2 &&
((self.src1==r && self.dest==*j)||(self.dest==r && self.src1==*j)))
&&((!p.byreg.count(тАМr) && p.byreg.count(*j)) || // R in global, J isn't
(p.byreg.count(тАМr) && !p.byreg[r]->count(*j)))) { // R not in global
withR->erase(*j);
withoutR->insert(*j);
byreg[*j] = withoutR;
}
if (!withoutR->size()) //
sets.erase(withoutR);
else //
changed = true ;
}
// , this, p
foreach(i, p.sets) {
regset inP;
foreach(j, (*i))
if (!byreg.count(*j)) inP.insert(*j);
if (inP.size()) {
regsets::iterator newSet = sets.insert(sets.end(), inP);
foreach(j, inP) byreg[*j] = newSet;
changed = true ;
}
}
return changed;
}
// : r ( )
void apply(regnum r, regset& global) {
if (!r) return ; // may not be replaced
assert(byreg.count(тАМr));
if (!global.size()) // uninitialized set
global = *byreg[r];
else // initialized; intersect
global &= *byreg[r];
}
}
struct commandn
рдПрдХ рдирдпрд╛ рдлрд╝реАрд▓реНрдб
regPartition copies;
рдЬреЛрдбрд╝реЗрдВ
regPartition copies;
рдЕрдм рд╣рдо рдбреАрдПрдлрдП рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП:
void copies() {
// )
bool changed = false ;
foreach(i, pcode) {
i->copies = regPartition();
// rule 2
if (writesdest(i)) {
i->copies.remove(i->cmd.dest);
changed = true ;
}
}
while (changed) {
changed = false ;
foreach2(i, pcode, next) {
// rule 1
if (i->cmd.opcode==command::add && !i->cmd.src2)
changed |= i->copies.add(i->cmd.dest, i->cmd.src1);
// rule 3 (next command)
if (hasnext(i))
changed |= next->copies.isect(i->copies, next->cmd);
// rule 3 (jmp target)
if (i->cmd.opcode==command::jz)
changed |= i->tgt->copies.isect(i->copies, i->tgt->cmd);
}
}
// )
std::vector<regset> copies(lastreg+ 1 );
foreach(i, pcode) {
if (readsdest(i))
i->copies.apply(i->cmd.dest, copies[i->cmd.dest]);
if (has2src(i)) {
i->copies.apply(i->cmd.src1, copies[i->cmd.src1]);
i->copies.apply(i->cmd.src2, copies[i->cmd.src2]);
}
}
// )
for (regnum r= 1 ; r<=lastreg; r++) {
copies[r].erase(тАМr);
if (copies[r].size()) { // ?
regnum s = *(copies[r].begin()); // r s
foreach(i, pcode) { //
if (i->cmd.dest==r)
i->cmd.dest = s;
if (has2src(i)) {
if (i->cmd.src1==r) i->cmd.src1 = s;
if (i->cmd.src2==r) i->cmd.src2 = s;
}
if (i->cmd.opcode==command::add && i->cmd.src1==i->cmd.dest && !i->cmd.src2) // self-mov
nopOut(i);
}
foreach(c, copies) //
if (c->count(тАМr)) {
c->erase(тАМr);
c->insert(s);
}
}
}
}
рдХреЙрд▓
copies();
рдЖрдЬреАрд╡рд┐рдХрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЕрдиреБрдХреВрд▓рди рдЪрдХреНрд░ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдбрд╛рд▓реЗрдВред
рдХреНрдпрд╛ рд╣реБрдЖ рдерд╛?
рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рдХреЛрдб рдХреЛ рдХреБрдЫ рдФрд░ рдХрдорд╛рдВрдб рджреНрд╡рд╛рд░рд╛ рдХрдо рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
00 mov r01,0
01 Mov r02, 0x3e8
02 рдЗрдХреЛ 0x126
режрей рдЗрдХреЛ рдЖрд░ режрез
04 рдЧреВрдВрдЬ 0xa0
режрел рдЗрдХреЛ рдЖрд░ режреи
06 рдЗрдХреЛ 0xa7
07 рд▓реЗ r03, r01, r02
08 jz r03, + 0x1d (= 0x26)
09 рдЬреЛрдбрд╝реЗрдВ r03, r01, r02
реж рдП рдореВ рд░ режрек, реи
0b div r03, r03, r04
0c рдЗрдХреЛ 0x162
0d рдЗрдХреЛ r03
0 рдЗрдХреЛ 0xcc
0f рдЗрдирдкреБрдЯ r04
10 рд╕реНрдЯреЛрд░ r01, 1
11 рдореВрд╡ r01, 1
12 eq r01, r04, r01
13 jz r01, +4 (= 0x18)
14 рд▓реЛрдб r01, 1
15 рдореВрд╡ r02, 1
16 рдЙрдк r02, r03, r02
17 jz 0, -0x11 (= 0x7)
18 рдореВрд╡ r01, 2
19 eq r01, r04, r01
1a jz r01, +3 (= 0x1e)
1 рдмреА рдореВрд╡ рдЖрд░ 01, 1
1 рд╕реА рдЬреЛрдбрд╝реЗрдВ r01, r03, r01
1d jz 0, -0x17 (= 0x7)
1e рд▓реЛрдб r01, 1
1 рдПрдл Mov r03, 3
20 eq r03, r04, r03
21 jz r03, +2 (= 0x24)
22 рдкреНрд░рддрд┐рдзреНрд╡рдирд┐ 0x146
23 рдШрдВрдЯреЗ
24 рдЧреВрдВрдЬ 0x16a
25 jz 0, -0x1f (= 7)
26 рдкреНрд░рддрд┐рдзреНрд╡рдирд┐ 0xff
27 рдШрдВрдЯреЗ
рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЧрд╛рдпрдм рдХрдорд╛рдВрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ (
add r01, r01, 0
add r02, r02, 0
рдФрд░
add r02, r02, 0
), рдпрд╣ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рдерд╛ рдХрд┐ рд╡реЗ рдЕрд░реНрдерд╣реАрди рдереЗред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрди рдЖрджреЗрд╢реЛрдВ рдиреЗ рднреМрддрд┐рдХ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреА рдирд┐рдпреБрдХреНрддрд┐ рдХреЗ рдмрд╛рдж рд╣реА рдПрдХ рдЕрд░реНрдерд╣реАрди рд░реВрдк рд▓реЗ рд▓рд┐рдпрд╛, рдЕрд░реНрдерд╛рддред рд╕рдорд╛рдкреНрдд рдкреА-рдХреЛрдб рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдмрд╣реБрдд рдЕрдВрддрд┐рдо рдЪрд░рдг рдореЗрдВред рддрдм рддрдХ, рдСрдкрд░реЗрдВрдбреНрд╕ рдХреЗ рдПрди-рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЕрд▓рдЧ рдереА; рдХреЗрд╡рд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЬреЛ рд╣рдордиреЗ рдЕрднреА-рдЕрднреА рдХрд┐рдпрд╛ рд╣реИ, рдЙрдиреНрд╣реЛрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рдФрд░ рдЙрд╕ рдирдХрд▓ рдХреЛ рд╣рдЯрд╛рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛ рджрд┐рдпрд╛ рд╣реИ, рдЬреЛ рд╕рдВрд╡реЗрджрдирд╣реАрди рдмрдирд╛ рд╣реИ - рдпрд╣ рд╕рдм рд╢рд╛рд░реАрд░рд┐рдХ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреА рдирд┐рдпреБрдХреНрддрд┐ рд╕реЗ рдмрд╣реБрдд рдкрд╣рд▓реЗред
рддрд╣ рд▓рдЧрд╛рддрд╛рд░
рдПрдХ рдЕрдиреНрдп рдорд╛рдирдХ рдЕрдиреБрдХреВрд▓рди, рдЬреЛ рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ рдХреА рддрд░рд╣, рдбреАрдПрдлрдП рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ,
рдирд┐рд░рдВрддрд░ рддрд╣ рд╣реИ ред рд╕рд┐рджреНрдзрд╛рдВрдд рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: рдпрджрд┐ рдСрдкрд░реЗрдВрдбреНрд╕ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдВрдХрд▓рди рдкрд░ рддреБрд░рдВрдд рдСрдкрд░реЗрд╢рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдХреЗ рдмрдЬрд╛рдп
MOV R1, 2
MOV R2, 3
рдПрдбреАрдбреА рдЖрд░ 3, рдЖрд░ 1, рдЖрд░ 2
рд╣рдо рддреБрд░рдВрдд рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
MOV R3.5
рд╕реНрдерд┐рд░рд╛рдВрдХ рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдЬрд░реВрд░реА рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рд▓рд╛рдкрд░рд╡рд╛рд╣реА рдХреЛ рдЗрдВрдЧрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рдЬреНрдЮрд╛рдд рдкрд░рд┐рдгрд╛рдо рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд▓рд╕реА рдерд╛: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
pixels=1024*768;
pixels=786432;
рддреБрд▓рдирд╛ рдореЗрдВ рдкрдврд╝рдиреЗ рдФрд░ рдмрдирд╛рдП рд░рдЦрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди
pixels=786432;
рдЗрд╕ рдмрд╛рд░, рдкреНрд░рддреНрдпреЗрдХ рдХрдорд╛рдВрдб рдореЗрдВ рд╣рдо рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рд╕реЗрдЯреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рд╕рд╛рде рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде: рдлреЙрд░реНрдо
std::map<regnum,int>
рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рд╣рдо рд╕реЗрдЯ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рддреАрди рдирд┐рдпрдо рдмрдирд╛рддреЗ рд╣реИрдВ:
MOV R, X
рдХрдорд╛рдВрдб рдореЗрдВ MOV R, X
R рдХрд╛ рдорд╛рди рдЬреНрдЮрд╛рдд рд╣реИ, рдФрд░ рдпрд╣ X рд╣реИ ;- рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдХрдорд╛рдВрдб рдореЗрдВ рдЬреЛ R рдХрд╛ рдорд╛рди рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдорд╛рди рдЕрдЬреНрдЮрд╛рдд рд╣реИ;
- рдЯреАрдо C рдореЗрдВ, R рдХрд╛ рдорд╛рди рдЬреНрдЮрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рдЬреНрдЮрд╛рдд рд╣реИ рдФрд░ рд╕рднреА рдЯреАрдореЛрдВ рдореЗрдВ рд╕рдорд╛рди рд╣реИ , рдЬрд╣рд╛рдВ рд╕реЗ рдЖрдк C (рд╕реАрдзреЗ рдпрд╛ рдмрд┐рдирд╛ рдЬрдВрдк) рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдо рдлрд┐рд░ рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ: рдорд╛рд░реНрдЧ рдХреА рджрд┐рд╢рд╛ рдЖрдЧреЗ рд╣реИ (рдЕрдЧрд▓реЗ рдореЗрдВ рдЗрд╕рдХрд╛ рдореВрд▓реНрдп рдкрд┐рдЫрд▓реЗ рдХрдорд╛рдВрдб рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рдореВрд▓реНрдп рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ); рдиреЛрдбреНрд╕ рдореЗрдВ рдСрдкрд░реЗрд╢рди - рдЕрдЬреНрдЮрд╛рдд рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдШред
рдЬрдм рд╕реЗрдЯ рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрд╢рди рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рджреЛрдиреЛрдВ рдСрдкрд░реЗрдВрдб рдЬрд┐рдирдореЗрдВ рд╕реЗ рдЬреНрдЮрд╛рдд рд╣реИрдВ, рдПрдордУрд╡реА рдХреЗ рд╕рд╛рдеред
рдПрдХ рд╣реА рдбреЗрдЯрд╛ рд╣рдореЗрдВ рдПрдХ рдФрд░ рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ -
рдирд┐рд░рдВрддрд░ рдкреНрд░рд╕рд╛рд░ (рдПрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рд╕рдВрджрд░реНрдн рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЬреНрдЮрд╛рдд рдореВрд▓реНрдп рдХрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди)ред рдпрд╣ рдЕрдиреБрдХреВрд▓рди рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЪреБрдиреЗ рдЧрдП рдкреА-рдХреЛрдб рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╕рд╛рде рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░ рдкрд░ рдХреЛрдИ рд╕рдВрдЪрд╛рд▓рди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рд╕реНрдерд┐рд░ рд╣реЛрддрд╛ рд╣реИ; рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдВрдЪрд╛рд▓рди, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╕рдордп рдкреВрд░реНрдг-рдирд┐рд░рдВрддрд░ "рдирд┐рд░рдВрддрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди" рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рдЕрдм рд╣рдо рдЦреБрдж рдХреЛ R0 рдХреЗ рд╕рд╛рде рд╢реВрдиреНрдп рдорд╛рди рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдирд┐рд░реНрдорд╛рдг рдЬреИрд╕реЗ
if (1>2) { echo("unreachable"); }
if (1>2) { echo("unreachable"); }
рдЬреЛ рд╕рдВрдХрд▓рди рдХрд░рддрд╛ рд╣реИ
рдПрдордУрд╡реА рдЖрд░ 1, 1
MOV R2, 2
рдЬреАрдЯреА рдЖрд░ 3, рдЖрд░ 1, рдЖрд░ 2
JZ R3, рд▓реЗрдмрд▓
ECHO "рдЕрдЧрдореНрдп"
рд▓реЗрдмрд▓:
рдореЗрдВ рддрд╣ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рдЪрд░рдг рдХреЛ рдЪрд╛рд▓реВ рдХрд░реЗрдЧрд╛
рдПрдордУрд╡реА рдЖрд░ 1, 1
MOV R2, 2
MOV R3, 0
JZ R3, рд▓реЗрдмрд▓
ECHO "рдЕрдЧрдореНрдп"
рд▓реЗрдмрд▓:
рдФрд░ рдкрд┐рдЫрд▓реА рдмрд╛рд░ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдкрд╣рд▓реЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП "рдЧреИрд░-рдЬреАрд╡рд┐рдд рдХреЛрдб рдХрд╛ рд╡рд┐рдирд╛рд╢" рдЕрдиреБрдХреВрд▓рди рдкрд╣рд▓реЗ рджреЛ
MOV
рдЖрджреЗрд╢реЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдЧрд╛ред
рдпрджрд┐ рдЙрд╕реА рд╕рдордп рд╣рдо рд╢реВрдиреНрдп рдорд╛рди рдХреЛ R0 рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
MOV R3, 0
JZ R0, рд▓реЗрдмрд▓
ECHO "рдЕрдЧрдореНрдп"
рд▓реЗрдмрд▓:
рдлрд┐рд░, рдЧреИрд░-рдЬреАрд╡рд┐рдд рдХреЛрдб рдХреЗ рд╕рд╛рде, рдЕрдВрддрд┐рдо
MOV
рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ "рдЕрдЧрдореНрдп рдХреЛрдб рдХрд╛ рд╡рд┐рдирд╛рд╢" рднреА
ECHO
рд╣рдЯрд╛ рджреЗрдЧрд╛,
JZ
рдХреЛ
NOP
рдореЗрдВ рдмрджрд▓ рджреЗрдЧрд╛ред
рдЗрд╕реА рддрд░рд╣, рдЖрдк рдПрдХ рдЬреНрдЮрд╛рдд рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рди рд╡рд╛рд▓реЗ
JZ
рдХреЛрдб рд╕реЗ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рджреВрд╕рд░рд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ "рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛"
ADD RX, (0), RY
рдХрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╣реИ
ADD RX, (0), RY
ADD RX, RY, R0
рд╕рд╛рде
ADD RX, (0), RY
ADD RX, RY, R0
, рддрд╛рдХрд┐ рдХреЙрдкреА рдХреНрд▓реАрдирд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрд╕ рдХрдорд╛рдВрдб рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реЗ рдХреЙрдкреА рдХреА рдкрд╣рдЪрд╛рди рдХрд░реЗред
рддрд╣ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдПрдХ рдФрд░ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдирдХрд╛рд░рд╛рддреНрдордХ рдореВрд▓реНрдп рдЕрдм рд╣рдорд╛рд░реЗ рдЖрджреЗрд╢реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐
рд▓реЗрдХреНрд╕рд░ рдореЗрдВ рд╣рдордиреЗ
NUM
рдЯреЛрдХрди рдХреЛ regexp
[0-9]+
, "-123" рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рдПрдХ рд╢реВрдиреНрдп рдЛрдг рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЧрдИ рдФрд░ рдлрд┐рд░ 123 рдХрд╛ рд╢рд╛рдмреНрджрд┐рдХ рдЕрд░реНрде; рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЛрдВрдиреЗ рдкреА-рдХреЛрдб рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛
рдПрдордУрд╡реА рдЖрд░ 1, 123
SUB R2, R0, R1
рдЕрдм рдкреА-рдХреЛрдб рдореЗрдВ рдПрдХ рдИрдорд╛рдирджрд╛рд░ рдЯреАрдо
MOV R1, -123
ред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
struct commandn
рдХреЛ рдХреБрдЫ рдФрд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреВрд░рдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
std::map<regnum, int > known; regset unknown;
рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдЖрдзрд╛рд░, рдЬреИрд╕рд╛ рдХрд┐ рдкрд┐рдЫрд▓реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣реИ, рдбреАрдПрдлрдП рд╣реИ:
void constp() {
bool changed = false ;
foreach(i, pcode) {
i->known.clear(); i->unknown.clear();
if (i->cmd.opcode==command::mov) { // rule 1
i->known[i->cmd.dest] = i->cmd.imm;
changed = true ;
} else if (writesdest(i)) { // rule 2
i->unknown.insert(i->cmd.dest);
changed = true ;
}
}
while (changed) {
changed = false ;
foreach2(i, pcode, next) {
// rule 3 (next command)
if (hasnext(i))
changed |= propagate(i, next);
// rule 3 (jmp target)
if (i->cmd.opcode==command::jz)
changed |= propagate(i, i->tgt);
}
}
//
foreach(i, pcode) {
i->known[ 0 ] = 0 ; // R0
if (has2src(i) && i->known.count(i->cmd.src1) && i->known.count(i->cmd.src2))
i->cmd = command(command::mov, i->cmd.dest, ops[i->cmd.opcode](i->known[i->cmd.src1],i->known[i->cmd.src2]));
// 0
if (has2src(i)) {
if (i->known.count(i->cmd.src1) && !i->known[i->cmd.src1])
i->cmd.src1 = 0 ;
if (i->known.count(i->cmd.src2) && !i->known[i->cmd.src2])
i->cmd.src2 = 0 ;
if (i->cmd.opcode==command::add && !i->cmd.src1) { //
i->cmd.src1 = i->cmd.src2;
i->cmd.src2 = 0 ;
}
}
if (readsdest(i) && i->known.count(i->cmd.dest))
if (!i->known[i->cmd.dest])
i->cmd.dest = 0 ;
else // , 0
if (i->cmd.opcode==command::jz) nopOut(i);
}
}
propagate()
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрдЬреНрдЮрд╛рдд рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЗ рд╕рдВрдШ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИ: рдХрдИ рдЬреНрдЮрд╛рдд рдореВрд▓реНрдпреЛрдВ рд╡рд╛рд▓реЗ рдПрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рдЕрдЬреНрдЮрд╛рдд рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
bool propagate(pcommandn from, pcommandn to) {
bool changed = false ; // :
//
foreach(i, from->known) {
regnum r = i->first;
if (to->known.count(тАМr))
if ((to->known[r]!=i->second) // , 1
&&!((to->cmd.opcode==command::mov) && (to->cmd.dest==r))) {
to->known.erase(тАМr);
to->unknown.insert(тАМr);
changed = true ;
} else ; //
else if (!to->unknown.count(тАМr)) { // ,
to->known[r]=i->second;
changed = true ;
}
}
//
foreach(r, from->unknown)
if (!to->unknown.count(*r)) {
to->unknown.insert(*r);
to->known.erase(*r);
changed = true ;
}
return changed;
}
рдЕрдВрддрд┐рдо рдЪреАрдЬ рдХреЛ рдЙрд╕ рдореВрд▓реНрдп рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЧрдгрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдСрдкрд░реЗрдВрдб рдЬреНрдЮрд╛рдд рд╣реЛрддреЗ рд╣реИрдВред рдЙрд╕реА рддрд░рд╣ рдЬреИрд╕реЗ рдХрд┐ j-script рдирд┐рд╖реНрдкрд╛рджрдХ рдореЗрдВ, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ opcode рдХреЗ рд▓рд┐рдП рдПрдХ рдлрдВрдХреНрд╢рди рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ:
int hlt( int src1, int src2) { assert( false ); return 0 ; }
int add( int src1, int src2) { return src1+src2; }
int sub( int src1, int src2) { return src1-src2; }
...
int lt( int src1, int src2) { return src1<src2; }
int (*ops[])( int , int ) = {hlt, hlt, hlt, hlt, hlt, hlt, hlt, add, sub, mul, div, eq, ne, ge, le, gt, lt};
constp();
рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рдбрд╛рд▓реЗрдВ
constp();
copies();
рд╕реЗ рдкрд╣рд▓реЗ
copies();
- рдФрд░ рд╣рдо рдЕрдиреБрдХреВрд▓рди рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред
рдЕрдЧрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ - рд╣рдо рднреМрддрд┐рдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рд╕рд╛рде рдкреА-рдХреЛрдб рд╕реЗ x86 / x64
рдХреЗ рд▓рд┐рдП
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред