рд╕рдВрдХрд▓рдиред 8: рдЕрдиреБрдХреВрд▓рди

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

рдкреЛрд╕реНрдЯ рдореЗрдВ рдЖрдЧреЗ:

  1. рдПрдХ рдмрдЧ рдХреЛ рдареАрдХ рдХрд░рдирд╛
  2. рд╕рдлрд╛рдИ рдХреА рдкреНрд░рддрд┐рдпрд╛рдВ
  3. рдХреНрдпрд╛ рд╣реБрдЖ рдерд╛?
  4. рддрд╣ рд▓рдЧрд╛рддрд╛рд░
  5. рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдПрдХ рдмрдЧ рдХреЛ рдареАрдХ рдХрд░рдирд╛


рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдзреЛрдЦрд╛ рджреЗрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдЬрдм рдкрд╣рд▓реА рдмрд╛рд░ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рдорд╛рди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЙрдкреА рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрд╕ рдордзреНрдпрд╡рд░реНрддреА рдорд╛рди рдХреЗ рд╕рд╛рде рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЗ рд▓рд┐рдП рднрдВрдбрд╛рд░рдг рд╕реНрдерд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
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 рдХреЛ рдХреЛрдб рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛

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

рд╕рдлрд╛рдИ рдХреА рдкреНрд░рддрд┐рдпрд╛рдВ


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

рд╣рдо рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рдХреИрд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВрдЧреЗ?рдЕрдВрддрд┐рдо рд╡рд┐рднрд╛рдЬрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХреЗ рдмрдЬрд╛рдп рдореВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: 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>
рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рд╣рдо рд╕реЗрдЯ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рддреАрди рдирд┐рдпрдо рдмрдирд╛рддреЗ рд╣реИрдВ:рд╣рдо рдлрд┐рд░ рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ: рдорд╛рд░реНрдЧ рдХреА рджрд┐рд╢рд╛ рдЖрдЧреЗ рд╣реИ (рдЕрдЧрд▓реЗ рдореЗрдВ рдЗрд╕рдХрд╛ рдореВрд▓реНрдп рдкрд┐рдЫрд▓реЗ рдХрдорд╛рдВрдб рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рдореВрд▓реНрдп рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ); рдиреЛрдбреНрд╕ рдореЗрдВ рдСрдкрд░реЗрд╢рди - рдЕрдЬреНрдЮрд╛рдд рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдШред

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

рдПрдХ рд╣реА рдбреЗрдЯрд╛ рд╣рдореЗрдВ рдПрдХ рдФрд░ рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ - рдирд┐рд░рдВрддрд░ рдкреНрд░рд╕рд╛рд░ (рдПрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рд╕рдВрджрд░реНрдн рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЬреНрдЮрд╛рдд рдореВрд▓реНрдп рдХрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди)ред рдпрд╣ рдЕрдиреБрдХреВрд▓рди рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЪреБрдиреЗ рдЧрдП рдкреА-рдХреЛрдб рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╕рд╛рде рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░ рдкрд░ рдХреЛрдИ рд╕рдВрдЪрд╛рд▓рди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рд╕реНрдерд┐рд░ рд╣реЛрддрд╛ рд╣реИ; рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдВрдЪрд╛рд▓рди, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╕рдордп рдкреВрд░реНрдг-рдирд┐рд░рдВрддрд░ "рдирд┐рд░рдВрддрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди" рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рдЕрдм рд╣рдо рдЦреБрдж рдХреЛ 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 рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред

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


All Articles