@@ -63,7 +63,7 @@ class Tier2Emitter(Emitter):
6363 def __init__ (self , out : CWriter , labels : dict [str , Label ]):
6464 super ().__init__ (out , labels )
6565 self ._replacers ["oparg" ] = self .oparg
66- self ._replacers ["OFFSET_OF_CORRESPONDING_UOP " ] = self .offset_of_corresponding_uop
66+ self ._replacers ["OFFSET_OF " ] = self .offset_of
6767
6868 def goto_error (self , offset : int , storage : Storage ) -> str :
6969 # To do: Add jump targets for popping values.
@@ -135,7 +135,7 @@ def oparg(
135135 self .out .emit_at (uop .name [- 1 ], tkn )
136136 return True
137137
138- def offset_of_corresponding_uop (
138+ def offset_of (
139139 self ,
140140 tkn : Token ,
141141 tkn_iter : TokenIterator ,
@@ -144,14 +144,21 @@ def offset_of_corresponding_uop(
144144 inst : Instruction | None ,
145145 ) -> bool :
146146 assert uop .name .startswith ("_GUARD_IP" )
147- rest = uop .name [len ("_GUARD_IP" ):]
148- self .emit (f" OFFSET_OF{ rest } ;\n " )
147+ # LPAREN
148+ next (tkn_iter )
149+ inst = next (tkn_iter )
150+ self .emit (f" OFFSET_OF_{ inst .text } ;\n " )
151+ # RPAREN
152+ next (tkn_iter )
153+ # SEMI
149154 next (tkn_iter )
150155 return True
151156
152- def write_uop (uop : Uop , emitter : Emitter , stack : Stack ) -> Stack :
157+ def write_uop (uop : Uop , emitter : Emitter , stack : Stack , offset_strs : dict [ str , tuple [ str , str ]] ) -> Stack :
153158 locals : dict [str , Local ] = {}
154159 try :
160+ if name_offset_pair := offset_strs .get (uop .name ):
161+ emitter .emit (f"#define OFFSET_OF_{ name_offset_pair [0 ]} ({ name_offset_pair [1 ]} )\n " )
155162 emitter .out .start_line ()
156163 if uop .properties .oparg :
157164 emitter .emit ("oparg = CURRENT_OPARG();\n " )
@@ -172,28 +179,16 @@ def write_uop(uop: Uop, emitter: Emitter, stack: Stack) -> Stack:
172179 idx += 1
173180 _ , storage = emitter .emit_tokens (uop , storage , None , False )
174181 storage .flush (emitter .out )
182+ if name_offset_pair :
183+ emitter .emit (f"#undef OFFSET_OF_{ name_offset_pair [0 ]} \n " )
175184 except StackError as ex :
176185 raise analysis_error (ex .args [0 ], uop .body .open ) from None
177186 return storage .stack
178187
179188SKIPS = ("_EXTENDED_ARG" ,)
180189
181190
182- def generate_tier2 (
183- filenames : list [str ], analysis : Analysis , outfile : TextIO , lines : bool
184- ) -> None :
185- write_header (__file__ , filenames , outfile )
186- outfile .write (
187- """
188- #ifdef TIER_ONE
189- #error "This file is for Tier 2 only"
190- #endif
191- #define TIER_TWO 2
192- """
193- )
194- out = CWriter (outfile , 2 , lines )
195- emitter = Tier2Emitter (out , analysis .labels )
196- out .emit ("\n " )
191+ def populate_offset_strs (analysis : Analysis ) -> dict [str , tuple [str , str ]]:
197192 offset_strs : dict [str , tuple [str , str ]] = {}
198193 for name , uop in analysis .uops .items ():
199194 if not f"_GUARD_IP_{ name } " in analysis .uops :
@@ -214,7 +209,23 @@ def generate_tier2(
214209 found = True
215210 assert offset_str
216211 offset_strs [f"_GUARD_IP_{ name } " ] = (name , offset_str )
212+ return offset_strs
217213
214+ def generate_tier2 (
215+ filenames : list [str ], analysis : Analysis , outfile : TextIO , lines : bool
216+ ) -> None :
217+ write_header (__file__ , filenames , outfile )
218+ outfile .write (
219+ """
220+ #ifdef TIER_ONE
221+ #error "This file is for Tier 2 only"
222+ #endif
223+ #define TIER_TWO 2
224+ """
225+ )
226+ out = CWriter (outfile , 2 , lines )
227+ emitter = Tier2Emitter (out , analysis .labels )
228+ offset_strs = populate_offset_strs (analysis )
218229 out .emit ("\n " )
219230
220231 for name , uop in analysis .uops .items ():
@@ -231,11 +242,7 @@ def generate_tier2(
231242 out .emit (f"case { uop .name } : {{\n " )
232243 declare_variables (uop , out )
233244 stack = Stack ()
234- if name_offset_pair := offset_strs .get (name ):
235- out .emit (f"#define OFFSET_OF_{ name_offset_pair [0 ]} ({ name_offset_pair [1 ]} )\n " )
236- stack = write_uop (uop , emitter , stack )
237- if name_offset_pair :
238- out .emit (f"#undef OFFSET_OF_{ name_offset_pair [0 ]} \n " )
245+ stack = write_uop (uop , emitter , stack , offset_strs )
239246 out .start_line ()
240247 if not uop .properties .always_exits :
241248 out .emit ("break;\n " )
0 commit comments