@@ -288,3 +288,159 @@ opcodes!(
288288 Store ( u8 , u32 ) ,
289289 }
290290) ;
291+
292+ impl RegOp {
293+ /// Apply a mutating function to every register in the op
294+ ///
295+ /// Both inputs and outputs are visited
296+ pub fn visit_regs_mut < F : FnMut ( & mut u8 ) > ( & mut self , mut f : F ) {
297+ match self {
298+ RegOp :: CopyImm ( out, imm) => {
299+ let _: f32 = * imm;
300+ f ( out)
301+ }
302+ RegOp :: NegReg ( out, arg)
303+ | RegOp :: AbsReg ( out, arg)
304+ | RegOp :: RecipReg ( out, arg)
305+ | RegOp :: SqrtReg ( out, arg)
306+ | RegOp :: SquareReg ( out, arg)
307+ | RegOp :: FloorReg ( out, arg)
308+ | RegOp :: CeilReg ( out, arg)
309+ | RegOp :: RoundReg ( out, arg)
310+ | RegOp :: CopyReg ( out, arg)
311+ | RegOp :: SinReg ( out, arg)
312+ | RegOp :: CosReg ( out, arg)
313+ | RegOp :: TanReg ( out, arg)
314+ | RegOp :: AsinReg ( out, arg)
315+ | RegOp :: AcosReg ( out, arg)
316+ | RegOp :: AtanReg ( out, arg)
317+ | RegOp :: ExpReg ( out, arg)
318+ | RegOp :: LnReg ( out, arg)
319+ | RegOp :: NotReg ( out, arg) => {
320+ f ( out) ;
321+ f ( arg) ;
322+ }
323+ RegOp :: AddRegImm ( out, arg, imm)
324+ | RegOp :: MulRegImm ( out, arg, imm)
325+ | RegOp :: DivRegImm ( out, arg, imm)
326+ | RegOp :: DivImmReg ( out, arg, imm)
327+ | RegOp :: SubImmReg ( out, arg, imm)
328+ | RegOp :: SubRegImm ( out, arg, imm)
329+ | RegOp :: AtanRegImm ( out, arg, imm)
330+ | RegOp :: AtanImmReg ( out, arg, imm)
331+ | RegOp :: MinRegImm ( out, arg, imm)
332+ | RegOp :: MaxRegImm ( out, arg, imm)
333+ | RegOp :: CompareRegImm ( out, arg, imm)
334+ | RegOp :: CompareImmReg ( out, arg, imm)
335+ | RegOp :: ModRegImm ( out, arg, imm)
336+ | RegOp :: ModImmReg ( out, arg, imm)
337+ | RegOp :: AndRegImm ( out, arg, imm)
338+ | RegOp :: OrRegImm ( out, arg, imm) => {
339+ let _: f32 = * imm; // type-checking pattern
340+ f ( out) ;
341+ f ( arg) ;
342+ }
343+
344+ RegOp :: AddRegReg ( out, lhs, rhs)
345+ | RegOp :: MulRegReg ( out, lhs, rhs)
346+ | RegOp :: DivRegReg ( out, lhs, rhs)
347+ | RegOp :: SubRegReg ( out, lhs, rhs)
348+ | RegOp :: AtanRegReg ( out, lhs, rhs)
349+ | RegOp :: MinRegReg ( out, lhs, rhs)
350+ | RegOp :: MaxRegReg ( out, lhs, rhs)
351+ | RegOp :: CompareRegReg ( out, lhs, rhs)
352+ | RegOp :: ModRegReg ( out, lhs, rhs)
353+ | RegOp :: AndRegReg ( out, lhs, rhs)
354+ | RegOp :: OrRegReg ( out, lhs, rhs) => {
355+ f ( out) ;
356+ f ( lhs) ;
357+ f ( rhs) ;
358+ }
359+
360+ RegOp :: Output ( reg, imm)
361+ | RegOp :: Input ( reg, imm)
362+ | RegOp :: Store ( reg, imm)
363+ | RegOp :: Load ( reg, imm) => {
364+ let _: u32 = * imm; // type-checking pattern
365+ f ( reg)
366+ }
367+ }
368+ }
369+
370+ /// Apply a function to every register in the op
371+ ///
372+ /// Both inputs and outputs are visited
373+ pub fn visit_regs < F : FnMut ( u8 ) > ( & self , mut f : F ) {
374+ match self {
375+ RegOp :: CopyImm ( out, imm) => {
376+ let _: f32 = * imm;
377+ f ( * out)
378+ }
379+ RegOp :: NegReg ( out, arg)
380+ | RegOp :: AbsReg ( out, arg)
381+ | RegOp :: RecipReg ( out, arg)
382+ | RegOp :: SqrtReg ( out, arg)
383+ | RegOp :: SquareReg ( out, arg)
384+ | RegOp :: FloorReg ( out, arg)
385+ | RegOp :: CeilReg ( out, arg)
386+ | RegOp :: RoundReg ( out, arg)
387+ | RegOp :: CopyReg ( out, arg)
388+ | RegOp :: SinReg ( out, arg)
389+ | RegOp :: CosReg ( out, arg)
390+ | RegOp :: TanReg ( out, arg)
391+ | RegOp :: AsinReg ( out, arg)
392+ | RegOp :: AcosReg ( out, arg)
393+ | RegOp :: AtanReg ( out, arg)
394+ | RegOp :: ExpReg ( out, arg)
395+ | RegOp :: LnReg ( out, arg)
396+ | RegOp :: NotReg ( out, arg) => {
397+ f ( * out) ;
398+ f ( * arg) ;
399+ }
400+ RegOp :: AddRegImm ( out, arg, imm)
401+ | RegOp :: MulRegImm ( out, arg, imm)
402+ | RegOp :: DivRegImm ( out, arg, imm)
403+ | RegOp :: DivImmReg ( out, arg, imm)
404+ | RegOp :: SubImmReg ( out, arg, imm)
405+ | RegOp :: SubRegImm ( out, arg, imm)
406+ | RegOp :: AtanRegImm ( out, arg, imm)
407+ | RegOp :: AtanImmReg ( out, arg, imm)
408+ | RegOp :: MinRegImm ( out, arg, imm)
409+ | RegOp :: MaxRegImm ( out, arg, imm)
410+ | RegOp :: CompareRegImm ( out, arg, imm)
411+ | RegOp :: CompareImmReg ( out, arg, imm)
412+ | RegOp :: ModRegImm ( out, arg, imm)
413+ | RegOp :: ModImmReg ( out, arg, imm)
414+ | RegOp :: AndRegImm ( out, arg, imm)
415+ | RegOp :: OrRegImm ( out, arg, imm) => {
416+ let _: f32 = * imm; // type-checking pattern
417+ f ( * out) ;
418+ f ( * arg) ;
419+ }
420+
421+ RegOp :: AddRegReg ( out, lhs, rhs)
422+ | RegOp :: MulRegReg ( out, lhs, rhs)
423+ | RegOp :: DivRegReg ( out, lhs, rhs)
424+ | RegOp :: SubRegReg ( out, lhs, rhs)
425+ | RegOp :: AtanRegReg ( out, lhs, rhs)
426+ | RegOp :: MinRegReg ( out, lhs, rhs)
427+ | RegOp :: MaxRegReg ( out, lhs, rhs)
428+ | RegOp :: CompareRegReg ( out, lhs, rhs)
429+ | RegOp :: ModRegReg ( out, lhs, rhs)
430+ | RegOp :: AndRegReg ( out, lhs, rhs)
431+ | RegOp :: OrRegReg ( out, lhs, rhs) => {
432+ f ( * out) ;
433+ f ( * lhs) ;
434+ f ( * rhs) ;
435+ }
436+
437+ RegOp :: Output ( reg, imm)
438+ | RegOp :: Input ( reg, imm)
439+ | RegOp :: Store ( reg, imm)
440+ | RegOp :: Load ( reg, imm) => {
441+ let _: u32 = * imm; // type-checking pattern
442+ f ( * reg)
443+ }
444+ }
445+ }
446+ }
0 commit comments