| `Pb (DontSetAA,DontSetLK,target_addr) ->
    { empty_ins with
    memo=sprintf "b %i" target_addr;
    inputs=[];
    outputs=[]; }::k
| `Pb (SetAA,DontSetLK,target_addr) ->
    { empty_ins with
    memo=sprintf "ba %i" target_addr;
    inputs=[];
    outputs=[]; }::k
| `Pb (DontSetAA,SetLK,target_addr) ->
    { empty_ins with
    memo=sprintf "bl %i" target_addr;
    inputs=[];
    outputs=[]; }::k
| `Pb (SetAA,SetLK,target_addr) ->
    { empty_ins with
    memo=sprintf "bla %i" target_addr;
    inputs=[];
    outputs=[]; }::k
| `Pbc (DontSetAA,DontSetLK,bO,bI,target_addr) ->
    { empty_ins with
    memo=sprintf "bc %i,%i,%i" bO bI target_addr;
    inputs=[];
    outputs=[]; }::k
| `Pbc (SetAA,DontSetLK,bO,bI,target_addr) ->
    { empty_ins with
    memo=sprintf "bca %i,%i,%i" bO bI target_addr;
    inputs=[];
    outputs=[]; }::k
| `Pbc (DontSetAA,SetLK,bO,bI,target_addr) ->
    { empty_ins with
    memo=sprintf "bcl %i,%i,%i" bO bI target_addr;
    inputs=[];
    outputs=[]; }::k
| `Pbc (SetAA,SetLK,bO,bI,target_addr) ->
    { empty_ins with
    memo=sprintf "bcla %i,%i,%i" bO bI target_addr;
    inputs=[];
    outputs=[]; }::k
| `Pbclr (DontSetLK,bO,bI,bH) ->
    { empty_ins with
    memo=sprintf "bclr %i,%i,%i" bO bI bH;
    inputs=[];
    outputs=[]; }::k
| `Pbclr (SetLK,bO,bI,bH) ->
    { empty_ins with
    memo=sprintf "bclrl %i,%i,%i" bO bI bH;
    inputs=[];
    outputs=[]; }::k
| `Pbcctr (DontSetLK,bO,bI,bH) ->
    { empty_ins with
    memo=sprintf "bcctr %i,%i,%i" bO bI bH;
    inputs=[];
    outputs=[]; }::k
| `Pbcctr (SetLK,bO,bI,bH) ->
    { empty_ins with
    memo=sprintf "bcctrl %i,%i,%i" bO bI bH;
    inputs=[];
    outputs=[]; }::k
| `Pcrand (bT,bA,bB) ->
    { empty_ins with
    memo=sprintf "crand %i,%i,%i" bT bA bB;
    inputs=[];
    outputs=[]; }::k
| `Pcrnand (bT,bA,bB) ->
    { empty_ins with
    memo=sprintf "crnand %i,%i,%i" bT bA bB;
    inputs=[];
    outputs=[]; }::k
| `Pcror (bT,bA,bB) ->
    { empty_ins with
    memo=sprintf "cror %i,%i,%i" bT bA bB;
    inputs=[];
    outputs=[]; }::k
| `Pcrxor (bT,bA,bB) ->
    { empty_ins with
    memo=sprintf "crxor %i,%i,%i" bT bA bB;
    inputs=[];
    outputs=[]; }::k
| `Pcrnor (bT,bA,bB) ->
    { empty_ins with
    memo=sprintf "crnor %i,%i,%i" bT bA bB;
    inputs=[];
    outputs=[]; }::k
| `Pcreqv (bT,bA,bB) ->
    { empty_ins with
    memo=sprintf "creqv %i,%i,%i" bT bA bB;
    inputs=[];
    outputs=[]; }::k
| `Pcrandc (bT,bA,bB) ->
    { empty_ins with
    memo=sprintf "crandc %i,%i,%i" bT bA bB;
    inputs=[];
    outputs=[]; }::k
| `Pcrorc (bT,bA,bB) ->
    { empty_ins with
    memo=sprintf "crorc %i,%i,%i" bT bA bB;
    inputs=[];
    outputs=[]; }::k
| `Pmcrf (bF,bFA) ->
    { empty_ins with
    memo=sprintf "mcrf %i,%i" bF bFA;
    inputs=[];
    outputs=[]; }::k
| `Psc (lEV) ->
    { empty_ins with
    memo=sprintf "sc %i" lEV;
    inputs=[];
    outputs=[]; }::k
| `Pscv (lEV) ->
    { empty_ins with
    memo=sprintf "scv %i" lEV;
    inputs=[];
    outputs=[]; }::k
| `Plbz (rT,d,rA) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "lbz ^o0,%i(0)" d
      else sprintf "lbz ^o0,%i(^i0)" d;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rA]);
    outputs=[rT]; }::k
| `Plbzx (rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "lbzx ^o0,0,^i0" 
      else sprintf "lbzx ^o0,^i0,^i1" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [rB] else [rA; rB]);
    outputs=[rT]; }::k
| `Plbzu (rT,d,rA) ->
    { empty_ins with
    memo=sprintf "lbzu ^o0,%i(^i0)" d;
    inputs=[rA];
    outputs=[rT; rA]; }::k
| `Plbzux (rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "lbzux ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT; rA]; }::k
| `Plhz (rT,d,rA) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "lhz ^o0,%i(0)" d
      else sprintf "lhz ^o0,%i(^i0)" d;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rA]);
    outputs=[rT]; }::k
| `Plhzx (rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "lhzx ^o0,0,^i0" 
      else sprintf "lhzx ^o0,^i0,^i1" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [rB] else [rA; rB]);
    outputs=[rT]; }::k
| `Plhzu (rT,d,rA) ->
    { empty_ins with
    memo=sprintf "lhzu ^o0,%i(^i0)" d;
    inputs=[rA];
    outputs=[rT; rA]; }::k
| `Plhzux (rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "lhzux ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT; rA]; }::k
| `Plha (rT,d,rA) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "lha ^o0,%i(0)" d
      else sprintf "lha ^o0,%i(^i0)" d;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rA]);
    outputs=[rT]; }::k
| `Plhax (rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "lhax ^o0,0,^i0" 
      else sprintf "lhax ^o0,^i0,^i1" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [rB] else [rA; rB]);
    outputs=[rT]; }::k
| `Plhau (rT,d,rA) ->
    { empty_ins with
    memo=sprintf "lhau ^o0,%i(^i0)" d;
    inputs=[rA];
    outputs=[rT; rA]; }::k
| `Plhaux (rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "lhaux ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT; rA]; }::k
| `Plwz (rT,d,rA) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "lwz ^o0,%i(0)" d
      else sprintf "lwz ^o0,%i(^i0)" d;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rA]);
    outputs=[rT]; }::k
| `Plwzx (rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "lwzx ^o0,0,^i0" 
      else sprintf "lwzx ^o0,^i0,^i1" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [rB] else [rA; rB]);
    outputs=[rT]; }::k
| `Plwzu (rT,d,rA) ->
    { empty_ins with
    memo=sprintf "lwzu ^o0,%i(^i0)" d;
    inputs=[rA];
    outputs=[rT; rA]; }::k
| `Plwzux (rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "lwzux ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT; rA]; }::k
| `Plwa (rT,dS,rA) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "lwa ^o0,%i(0)" (dS lsr 2)
      else sprintf "lwa ^o0,%i(^i0)" (dS lsr 2);
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rA]);
    outputs=[rT]; }::k
| `Plwax (rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "lwax ^o0,0,^i0" 
      else sprintf "lwax ^o0,^i0,^i1" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [rB] else [rA; rB]);
    outputs=[rT]; }::k
| `Plwaux (rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "lwaux ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT; rA]; }::k
| `Pld (rT,dS,rA) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "ld ^o0,%i(0)" (dS lsr 2)
      else sprintf "ld ^o0,%i(^i0)" (dS lsr 2);
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rA]);
    outputs=[rT]; }::k
| `Pldx (rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "ldx ^o0,0,^i0" 
      else sprintf "ldx ^o0,^i0,^i1" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [rB] else [rA; rB]);
    outputs=[rT]; }::k
| `Pldu (rT,dS,rA) ->
    { empty_ins with
    memo=sprintf "ldu ^o0,%i(^i0)" (dS lsr 2);
    inputs=[rA];
    outputs=[rT; rA]; }::k
| `Pldux (rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "ldux ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT; rA]; }::k
| `Pstb (rS,d,rA) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "stb ^i0,%i(0)" d
      else sprintf "stb ^i0,%i(^i1)" d;
    inputs=
      (if rA = A.Ireg A.GPR0 then [rS] else [rS; rA]);
    outputs=[]; }::k
| `Pstbx (rS,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "stbx ^i0,0,^i1" 
      else sprintf "stbx ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [rS; rB] else [rS; rA; rB]);
    outputs=[]; }::k
| `Pstbu (rS,d,rA) ->
    { empty_ins with
    memo=sprintf "stbu ^i0,%i(^i1)" d;
    inputs=[rS; rA];
    outputs=[rA]; }::k
| `Pstbux (rS,rA,rB) ->
    { empty_ins with
    memo=sprintf "stbux ^i0,^i1,^i2" ;
    inputs=[rS; rA; rB];
    outputs=[rA]; }::k
| `Psth (rS,d,rA) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "sth ^i0,%i(0)" d
      else sprintf "sth ^i0,%i(^i1)" d;
    inputs=
      (if rA = A.Ireg A.GPR0 then [rS] else [rS; rA]);
    outputs=[]; }::k
| `Psthx (rS,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "sthx ^i0,0,^i1" 
      else sprintf "sthx ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [rS; rB] else [rS; rA; rB]);
    outputs=[]; }::k
| `Psthu (rS,d,rA) ->
    { empty_ins with
    memo=sprintf "sthu ^i0,%i(^i1)" d;
    inputs=[rS; rA];
    outputs=[rA]; }::k
| `Psthux (rS,rA,rB) ->
    { empty_ins with
    memo=sprintf "sthux ^i0,^i1,^i2" ;
    inputs=[rS; rA; rB];
    outputs=[rA]; }::k
| `Pstw (rS,d,rA) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "stw ^i0,%i(0)" d
      else sprintf "stw ^i0,%i(^i1)" d;
    inputs=
      (if rA = A.Ireg A.GPR0 then [rS] else [rS; rA]);
    outputs=[]; }::k
| `Pstwx (rS,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "stwx ^i0,0,^i1" 
      else sprintf "stwx ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [rS; rB] else [rS; rA; rB]);
    outputs=[]; }::k
| `Pstwu (rS,d,rA) ->
    { empty_ins with
    memo=sprintf "stwu ^i0,%i(^i1)" d;
    inputs=[rS; rA];
    outputs=[rA]; }::k
| `Pstwux (rS,rA,rB) ->
    { empty_ins with
    memo=sprintf "stwux ^i0,^i1,^i2" ;
    inputs=[rS; rA; rB];
    outputs=[rA]; }::k
| `Pstd (rS,dS,rA) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "std ^i0,%i(0)" (dS lsr 2)
      else sprintf "std ^i0,%i(^i1)" (dS lsr 2);
    inputs=
      (if rA = A.Ireg A.GPR0 then [rS] else [rS; rA]);
    outputs=[]; }::k
| `Pstdx (rS,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "stdx ^i0,0,^i1" 
      else sprintf "stdx ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [rS; rB] else [rS; rA; rB]);
    outputs=[]; }::k
| `Pstdu (rS,dS,rA) ->
    { empty_ins with
    memo=sprintf "stdu ^i0,%i(^i1)" (dS lsr 2);
    inputs=[rS; rA];
    outputs=[rA]; }::k
| `Pstdux (rS,rA,rB) ->
    { empty_ins with
    memo=sprintf "stdux ^i0,^i1,^i2" ;
    inputs=[rS; rA; rB];
    outputs=[rA]; }::k
| `Plq (rTp,dQ,rA,pT) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "lq %i,%i(0),%i" rTp dQ pT
      else sprintf "lq %i,%i(^i0),%i" rTp dQ pT;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rA]);
    outputs=[rA]; }::k
| `Pstq (rSp,dS,rA) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "stq %i,%i(0)" rSp (dS lsr 2)
      else sprintf "stq %i,%i(^i0)" rSp (dS lsr 2);
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rA]);
    outputs=[]; }::k
| `Plhbrx (rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "lhbrx ^o0,0,^i0" 
      else sprintf "lhbrx ^o0,^i0,^i1" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [rB] else [rA; rB]);
    outputs=[rT]; }::k
| `Psthbrx (rS,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "sthbrx ^i0,0,^i1" 
      else sprintf "sthbrx ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [rS; rB] else [rS; rA; rB]);
    outputs=[]; }::k
| `Plwbrx (rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "lwbrx ^o0,0,^i0" 
      else sprintf "lwbrx ^o0,^i0,^i1" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [rB] else [rA; rB]);
    outputs=[rT]; }::k
| `Pstwbrx (rS,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "stwbrx ^i0,0,^i1" 
      else sprintf "stwbrx ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [rS; rB] else [rS; rA; rB]);
    outputs=[]; }::k
| `Pldbrx (rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "ldbrx ^o0,0,^i0" 
      else sprintf "ldbrx ^o0,^i0,^i1" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [rB] else [rA; rB]);
    outputs=[rT]; }::k
| `Pstdbrx (rS,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "stdbrx ^i0,0,^i1" 
      else sprintf "stdbrx ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [rS; rB] else [rS; rA; rB]);
    outputs=[]; }::k
| `Plmw (rT,d,rA) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "lmw ^o0,%i(0)" d
      else sprintf "lmw ^o0,%i(^i0)" d;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rA]);
    outputs=[] @ (A.regs_interval rT); }::k
| `Pstmw (rS,d,rA) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "stmw ^i0,%i(0)" d
      else sprintf "stmw ^i1,%i(^i0)" d;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rA]) @ (A.regs_interval rS);
    outputs=[]; }::k
| `Plswi (rT,rA,nB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "lswi %i,0,%i" rT nB
      else sprintf "lswi %i,^i0,%i" rT nB;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rA]);
    outputs=[]; }::k
| `Plswx (rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "lswx ^o0,0,^i0" 
      else sprintf "lswx ^o0,^i0,^i1" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [rB] else [rA; rB]);
    outputs=[rT]; }::k
| `Pstswi (rS,rA,nB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "stswi %i,0,%i" rS nB
      else sprintf "stswi %i,^i0,%i" rS nB;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rA]);
    outputs=[]; }::k
| `Pstswx (rS,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "stswx %i,0,^i0" rS
      else sprintf "stswx %i,^i0,^i1" rS;
    inputs=
      (if rA = A.Ireg A.GPR0 then [rB] else [rA; rB]);
    outputs=[]; }::k
| `Paddi (rT,rA,sI) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "addi ^o0,0,%i" sI
      else sprintf "addi ^o0,^i0,%i" sI;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rA]);
    outputs=[rT]; }::k
| `Paddis (rT,rA,sI) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "addis ^o0,0,%i" sI
      else sprintf "addis ^o0,^i0,%i" sI;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rA]);
    outputs=[rT]; }::k
| `Padd (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "add ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Padd (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "add. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Padd (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "addo ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Padd (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "addo. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Psubf (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "subf ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Psubf (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "subf. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Psubf (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "subfo ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Psubf (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "subfo. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Paddic (rT,rA,sI) ->
    { empty_ins with
    memo=sprintf "addic ^o0,^i0,%i" sI;
    inputs=[rA];
    outputs=[rT]; }::k
| `Paddicdot (rT,rA,sI) ->
    { empty_ins with
    memo=sprintf "addic. ^o0,^i0,%i" sI;
    inputs=[rA];
    outputs=[rT]; }::k
| `Psubfic (rT,rA,sI) ->
    { empty_ins with
    memo=sprintf "subfic ^o0,^i0,%i" sI;
    inputs=[rA];
    outputs=[rT]; }::k
| `Paddc (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "addc ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Paddc (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "addc. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Paddc (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "addco ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Paddc (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "addco. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Psubfc (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "subfc ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Psubfc (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "subfc. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Psubfc (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "subfco ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Psubfc (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "subfco. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Padde (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "adde ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Padde (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "adde. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Padde (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "addeo ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Padde (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "addeo. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Psubfe (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "subfe ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Psubfe (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "subfe. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Psubfe (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "subfeo ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Psubfe (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "subfeo. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Paddme (DontSetSOOV,DontSetCR0,rT,rA) ->
    { empty_ins with
    memo=sprintf "addme ^o0,^i0" ;
    inputs=[rA];
    outputs=[rT]; }::k
| `Paddme (DontSetSOOV,SetCR0,rT,rA) ->
    { empty_ins with
    memo=sprintf "addme. ^o0,^i0" ;
    inputs=[rA];
    outputs=[rT]; }::k
| `Paddme (SetSOOV,DontSetCR0,rT,rA) ->
    { empty_ins with
    memo=sprintf "addmeo ^o0,^i0" ;
    inputs=[rA];
    outputs=[rT]; }::k
| `Paddme (SetSOOV,SetCR0,rT,rA) ->
    { empty_ins with
    memo=sprintf "addmeo. ^o0,^i0" ;
    inputs=[rA];
    outputs=[rT]; }::k
| `Psubfme (DontSetSOOV,DontSetCR0,rT,rA) ->
    { empty_ins with
    memo=sprintf "subfme ^o0,^i0" ;
    inputs=[rA];
    outputs=[rT]; }::k
| `Psubfme (DontSetSOOV,SetCR0,rT,rA) ->
    { empty_ins with
    memo=sprintf "subfme. ^o0,^i0" ;
    inputs=[rA];
    outputs=[rT]; }::k
| `Psubfme (SetSOOV,DontSetCR0,rT,rA) ->
    { empty_ins with
    memo=sprintf "subfmeo ^o0,^i0" ;
    inputs=[rA];
    outputs=[rT]; }::k
| `Psubfme (SetSOOV,SetCR0,rT,rA) ->
    { empty_ins with
    memo=sprintf "subfmeo. ^o0,^i0" ;
    inputs=[rA];
    outputs=[rT]; }::k
| `Paddze (DontSetSOOV,DontSetCR0,rT,rA) ->
    { empty_ins with
    memo=sprintf "addze ^o0,^i0" ;
    inputs=[rA];
    outputs=[rT]; }::k
| `Paddze (DontSetSOOV,SetCR0,rT,rA) ->
    { empty_ins with
    memo=sprintf "addze. ^o0,^i0" ;
    inputs=[rA];
    outputs=[rT]; }::k
| `Paddze (SetSOOV,DontSetCR0,rT,rA) ->
    { empty_ins with
    memo=sprintf "addzeo ^o0,^i0" ;
    inputs=[rA];
    outputs=[rT]; }::k
| `Paddze (SetSOOV,SetCR0,rT,rA) ->
    { empty_ins with
    memo=sprintf "addzeo. ^o0,^i0" ;
    inputs=[rA];
    outputs=[rT]; }::k
| `Psubfze (DontSetSOOV,DontSetCR0,rT,rA) ->
    { empty_ins with
    memo=sprintf "subfze ^o0,^i0" ;
    inputs=[rA];
    outputs=[rT]; }::k
| `Psubfze (DontSetSOOV,SetCR0,rT,rA) ->
    { empty_ins with
    memo=sprintf "subfze. ^o0,^i0" ;
    inputs=[rA];
    outputs=[rT]; }::k
| `Psubfze (SetSOOV,DontSetCR0,rT,rA) ->
    { empty_ins with
    memo=sprintf "subfzeo ^o0,^i0" ;
    inputs=[rA];
    outputs=[rT]; }::k
| `Psubfze (SetSOOV,SetCR0,rT,rA) ->
    { empty_ins with
    memo=sprintf "subfzeo. ^o0,^i0" ;
    inputs=[rA];
    outputs=[rT]; }::k
| `Pneg (DontSetSOOV,DontSetCR0,rT,rA) ->
    { empty_ins with
    memo=sprintf "neg ^o0,^i0" ;
    inputs=[rA];
    outputs=[rT]; }::k
| `Pneg (DontSetSOOV,SetCR0,rT,rA) ->
    { empty_ins with
    memo=sprintf "neg. ^o0,^i0" ;
    inputs=[rA];
    outputs=[rT]; }::k
| `Pneg (SetSOOV,DontSetCR0,rT,rA) ->
    { empty_ins with
    memo=sprintf "nego ^o0,^i0" ;
    inputs=[rA];
    outputs=[rT]; }::k
| `Pneg (SetSOOV,SetCR0,rT,rA) ->
    { empty_ins with
    memo=sprintf "nego. ^o0,^i0" ;
    inputs=[rA];
    outputs=[rT]; }::k
| `Pmulli (rT,rA,sI) ->
    { empty_ins with
    memo=sprintf "mulli ^o0,^i0,%i" sI;
    inputs=[rA];
    outputs=[rT]; }::k
| `Pmullw (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "mullw ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pmullw (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "mullw. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pmullw (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "mullwo ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pmullw (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "mullwo. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pmulhw (DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "mulhw ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pmulhw (SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "mulhw. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pmulhwu (DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "mulhwu ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pmulhwu (SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "mulhwu. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pdivw (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "divw ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pdivw (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "divw. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pdivw (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "divwo ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pdivw (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "divwo. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pdivwu (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "divwu ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pdivwu (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "divwu. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pdivwu (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "divwuo ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pdivwu (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "divwuo. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pdivwe (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "divwe ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pdivwe (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "divwe. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pdivwe (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "divweo ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pdivwe (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "divweo. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pdivweu (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "divweu ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pdivweu (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "divweu. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pdivweu (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "divweuo ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pdivweu (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "divweuo. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pmulld (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "mulld ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pmulld (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "mulld. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pmulld (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "mulldo ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pmulld (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "mulldo. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pmulhd (DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "mulhd ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pmulhd (SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "mulhd. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pmulhdu (DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "mulhdu ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pmulhdu (SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "mulhdu. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pdivd (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "divd ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pdivd (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "divd. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pdivd (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "divdo ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pdivd (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "divdo. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pdivdu (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "divdu ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pdivdu (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "divdu. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pdivdu (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "divduo ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pdivdu (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "divduo. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pdivde (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "divde ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pdivde (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "divde. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pdivde (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "divdeo ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pdivde (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "divdeo. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pdivdeu (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "divdeu ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pdivdeu (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "divdeu. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pdivdeu (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "divdeuo ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pdivdeu (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "divdeuo. ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pcmpi (bF,l,rA,sI) ->
    { empty_ins with
    memo=sprintf "cmpi %i,%i,^i0,%i" bF l sI;
    inputs=[rA];
    outputs=[]; }::k
| `Pcmp (bF,l,rA,rB) ->
    { empty_ins with
    memo=sprintf "cmp %i,%i,^i0,^i1" bF l;
    inputs=[rA; rB];
    outputs=[]; }::k
| `Pcmpli (bF,l,rA,uI) ->
    { empty_ins with
    memo=sprintf "cmpli %i,%i,^i0,%i" bF l uI;
    inputs=[rA];
    outputs=[]; }::k
| `Pcmpl (bF,l,rA,rB) ->
    { empty_ins with
    memo=sprintf "cmpl %i,%i,^i0,^i1" bF l;
    inputs=[rA; rB];
    outputs=[]; }::k
| `Pisel (rT,rA,rB,bC) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "isel ^o0,0,^i0,%i" bC
      else sprintf "isel ^o0,^i0,^i1,%i" bC;
    inputs=
      (if rA = A.Ireg A.GPR0 then [rB] else [rA; rB]);
    outputs=[rT]; }::k
| `Pandi (rA,rS,uI) ->
    { empty_ins with
    memo=sprintf "andi. ^o0,^i0,%i" uI;
    inputs=[rS];
    outputs=[rA]; }::k
| `Pandis (rA,rS,uI) ->
    { empty_ins with
    memo=sprintf "andis. ^o0,^i0,%i" uI;
    inputs=[rS];
    outputs=[rA]; }::k
| `Pori (rA,rS,uI) ->
    { empty_ins with
    memo=sprintf "ori ^o0,^i0,%i" uI;
    inputs=[rS];
    outputs=[rA]; }::k
| `Poris (rA,rS,uI) ->
    { empty_ins with
    memo=sprintf "oris ^o0,^i0,%i" uI;
    inputs=[rS];
    outputs=[rA]; }::k
| `Pxori (rA,rS,uI) ->
    { empty_ins with
    memo=sprintf "xori ^o0,^i0,%i" uI;
    inputs=[rS];
    outputs=[rA]; }::k
| `Pxoris (rA,rS,uI) ->
    { empty_ins with
    memo=sprintf "xoris ^o0,^i0,%i" uI;
    inputs=[rS];
    outputs=[rA]; }::k
| `Pand (DontSetCR0,rA,rS,rB) ->
    { empty_ins with
    memo=sprintf "and ^o0,^i0,^i1" ;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Pand (SetCR0,rA,rS,rB) ->
    { empty_ins with
    memo=sprintf "and. ^o0,^i0,^i1" ;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Pxor (DontSetCR0,rA,rS,rB) ->
    { empty_ins with
    memo=sprintf "xor ^o0,^i0,^i1" ;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Pxor (SetCR0,rA,rS,rB) ->
    { empty_ins with
    memo=sprintf "xor. ^o0,^i0,^i1" ;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Pnand (DontSetCR0,rA,rS,rB) ->
    { empty_ins with
    memo=sprintf "nand ^o0,^i0,^i1" ;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Pnand (SetCR0,rA,rS,rB) ->
    { empty_ins with
    memo=sprintf "nand. ^o0,^i0,^i1" ;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Por (DontSetCR0,rA,rS,rB) ->
    { empty_ins with
    memo=sprintf "or ^o0,^i0,^i1" ;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Por (SetCR0,rA,rS,rB) ->
    { empty_ins with
    memo=sprintf "or. ^o0,^i0,^i1" ;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Pnor (DontSetCR0,rA,rS,rB) ->
    { empty_ins with
    memo=sprintf "nor ^o0,^i0,^i1" ;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Pnor (SetCR0,rA,rS,rB) ->
    { empty_ins with
    memo=sprintf "nor. ^o0,^i0,^i1" ;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Peqv (DontSetCR0,rA,rS,rB) ->
    { empty_ins with
    memo=sprintf "eqv ^o0,^i0,^i1" ;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Peqv (SetCR0,rA,rS,rB) ->
    { empty_ins with
    memo=sprintf "eqv. ^o0,^i0,^i1" ;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Pandc (DontSetCR0,rA,rS,rB) ->
    { empty_ins with
    memo=sprintf "andc ^o0,^i0,^i1" ;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Pandc (SetCR0,rA,rS,rB) ->
    { empty_ins with
    memo=sprintf "andc. ^o0,^i0,^i1" ;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Porc (DontSetCR0,rA,rS,rB) ->
    { empty_ins with
    memo=sprintf "orc ^o0,^i0,^i1" ;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Porc (SetCR0,rA,rS,rB) ->
    { empty_ins with
    memo=sprintf "orc. ^o0,^i0,^i1" ;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Pextsb (DontSetCR0,rA,rS) ->
    { empty_ins with
    memo=sprintf "extsb ^o0,^i0" ;
    inputs=[rS];
    outputs=[rA]; }::k
| `Pextsb (SetCR0,rA,rS) ->
    { empty_ins with
    memo=sprintf "extsb. ^o0,^i0" ;
    inputs=[rS];
    outputs=[rA]; }::k
| `Pextsh (DontSetCR0,rA,rS) ->
    { empty_ins with
    memo=sprintf "extsh ^o0,^i0" ;
    inputs=[rS];
    outputs=[rA]; }::k
| `Pextsh (SetCR0,rA,rS) ->
    { empty_ins with
    memo=sprintf "extsh. ^o0,^i0" ;
    inputs=[rS];
    outputs=[rA]; }::k
| `Pcntlzw (DontSetCR0,rA,rS) ->
    { empty_ins with
    memo=sprintf "cntlzw ^o0,^i0" ;
    inputs=[rS];
    outputs=[rA]; }::k
| `Pcntlzw (SetCR0,rA,rS) ->
    { empty_ins with
    memo=sprintf "cntlzw. ^o0,^i0" ;
    inputs=[rS];
    outputs=[rA]; }::k
| `Pcmpb (rA,rS,rB) ->
    { empty_ins with
    memo=sprintf "cmpb ^o0,%i,^i0" rS;
    inputs=[rB];
    outputs=[rA]; }::k
| `Ppopcntb (rA,rS) ->
    { empty_ins with
    memo=sprintf "popcntb ^o0,^i0" ;
    inputs=[rS];
    outputs=[rA]; }::k
| `Ppopcntw (rA,rS) ->
    { empty_ins with
    memo=sprintf "popcntw ^o0,^i0" ;
    inputs=[rS];
    outputs=[rA]; }::k
| `Pprtyd (rA,rS) ->
    { empty_ins with
    memo=sprintf "prtyd ^o0,^i0" ;
    inputs=[rS];
    outputs=[rA]; }::k
| `Pprtyw (rA,rS) ->
    { empty_ins with
    memo=sprintf "prtyw ^o0,^i0" ;
    inputs=[rS];
    outputs=[rA]; }::k
| `Pextsw (DontSetCR0,rA,rS) ->
    { empty_ins with
    memo=sprintf "extsw ^o0,^i0" ;
    inputs=[rS];
    outputs=[rA]; }::k
| `Pextsw (SetCR0,rA,rS) ->
    { empty_ins with
    memo=sprintf "extsw. ^o0,^i0" ;
    inputs=[rS];
    outputs=[rA]; }::k
| `Pcntlzd (DontSetCR0,rA,rS) ->
    { empty_ins with
    memo=sprintf "cntlzd ^o0,^i0" ;
    inputs=[rS];
    outputs=[rA]; }::k
| `Pcntlzd (SetCR0,rA,rS) ->
    { empty_ins with
    memo=sprintf "cntlzd. ^o0,^i0" ;
    inputs=[rS];
    outputs=[rA]; }::k
| `Ppopcntd (rA,rS) ->
    { empty_ins with
    memo=sprintf "popcntd ^o0,^i0" ;
    inputs=[rS];
    outputs=[rA]; }::k
| `Pbpermd (rA,rS,rB) ->
    { empty_ins with
    memo=sprintf "bpermd ^o0,^i0,^i1" ;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Prlwinm (DontSetCR0,rA,rS,sH,mB,mE) ->
    { empty_ins with
    memo=sprintf "rlwinm ^o0,^i0,%i,%i,%i" sH mB mE;
    inputs=[rS];
    outputs=[rA]; }::k
| `Prlwinm (SetCR0,rA,rS,sH,mB,mE) ->
    { empty_ins with
    memo=sprintf "rlwinm. ^o0,^i0,%i,%i,%i" sH mB mE;
    inputs=[rS];
    outputs=[rA]; }::k
| `Prlwnm (DontSetCR0,rA,rS,rB,mB,mE) ->
    { empty_ins with
    memo=sprintf "rlwnm ^o0,^i0,^i1,%i,%i" mB mE;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Prlwnm (SetCR0,rA,rS,rB,mB,mE) ->
    { empty_ins with
    memo=sprintf "rlwnm. ^o0,^i0,^i1,%i,%i" mB mE;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Prlwimi (DontSetCR0,rA,rS,sH,mB,mE) ->
    { empty_ins with
    memo=sprintf "rlwimi ^i0,^i1,%i,%i,%i" sH mB mE;
    inputs=[rA; rS];
    outputs=[rA]; }::k
| `Prlwimi (SetCR0,rA,rS,sH,mB,mE) ->
    { empty_ins with
    memo=sprintf "rlwimi. ^i0,^i1,%i,%i,%i" sH mB mE;
    inputs=[rA; rS];
    outputs=[rA]; }::k
| `Prldicl (DontSetCR0,rA,rS,sH,mB) ->
    { empty_ins with
    memo=sprintf "rldicl ^o0,^i0,%i,%i" sH mB;
    inputs=[rS];
    outputs=[rA]; }::k
| `Prldicl (SetCR0,rA,rS,sH,mB) ->
    { empty_ins with
    memo=sprintf "rldicl. ^o0,^i0,%i,%i" sH mB;
    inputs=[rS];
    outputs=[rA]; }::k
| `Prldicr (DontSetCR0,rA,rS,sH,mE) ->
    { empty_ins with
    memo=sprintf "rldicr ^o0,^i0,%i,%i" sH mE;
    inputs=[rS];
    outputs=[rA]; }::k
| `Prldicr (SetCR0,rA,rS,sH,mE) ->
    { empty_ins with
    memo=sprintf "rldicr. ^o0,^i0,%i,%i" sH mE;
    inputs=[rS];
    outputs=[rA]; }::k
| `Prldic (DontSetCR0,rA,rS,sH,mB) ->
    { empty_ins with
    memo=sprintf "rldic ^o0,^i0,%i,%i" sH mB;
    inputs=[rS];
    outputs=[rA]; }::k
| `Prldic (SetCR0,rA,rS,sH,mB) ->
    { empty_ins with
    memo=sprintf "rldic. ^o0,^i0,%i,%i" sH mB;
    inputs=[rS];
    outputs=[rA]; }::k
| `Prldcl (DontSetCR0,rA,rS,rB,mB) ->
    { empty_ins with
    memo=sprintf "rldcl ^o0,^i0,^i1,%i" mB;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Prldcl (SetCR0,rA,rS,rB,mB) ->
    { empty_ins with
    memo=sprintf "rldcl. ^o0,^i0,^i1,%i" mB;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Prldcr (DontSetCR0,rA,rS,rB,mE) ->
    { empty_ins with
    memo=sprintf "rldcr ^o0,^i0,^i1,%i" mE;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Prldcr (SetCR0,rA,rS,rB,mE) ->
    { empty_ins with
    memo=sprintf "rldcr. ^o0,^i0,^i1,%i" mE;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Prldimi (DontSetCR0,rA,rS,sH,mB) ->
    { empty_ins with
    memo=sprintf "rldimi ^i0,^i1,%i,%i" sH mB;
    inputs=[rA; rS];
    outputs=[rA]; }::k
| `Prldimi (SetCR0,rA,rS,sH,mB) ->
    { empty_ins with
    memo=sprintf "rldimi. ^i0,^i1,%i,%i" sH mB;
    inputs=[rA; rS];
    outputs=[rA]; }::k
| `Pslw (DontSetCR0,rA,rS,rB) ->
    { empty_ins with
    memo=sprintf "slw ^o0,^i0,^i1" ;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Pslw (SetCR0,rA,rS,rB) ->
    { empty_ins with
    memo=sprintf "slw. ^o0,^i0,^i1" ;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Psrw (DontSetCR0,rA,rS,rB) ->
    { empty_ins with
    memo=sprintf "srw ^o0,^i0,^i1" ;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Psrw (SetCR0,rA,rS,rB) ->
    { empty_ins with
    memo=sprintf "srw. ^o0,^i0,^i1" ;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Psrawi (DontSetCR0,rA,rS,sH) ->
    { empty_ins with
    memo=sprintf "srawi ^o0,^i0,%i" sH;
    inputs=[rS];
    outputs=[rA]; }::k
| `Psrawi (SetCR0,rA,rS,sH) ->
    { empty_ins with
    memo=sprintf "srawi. ^o0,^i0,%i" sH;
    inputs=[rS];
    outputs=[rA]; }::k
| `Psraw (DontSetCR0,rA,rS,rB) ->
    { empty_ins with
    memo=sprintf "sraw ^o0,^i0,^i1" ;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Psraw (SetCR0,rA,rS,rB) ->
    { empty_ins with
    memo=sprintf "sraw. ^o0,^i0,^i1" ;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Psld (DontSetCR0,rA,rS,rB) ->
    { empty_ins with
    memo=sprintf "sld ^o0,^i0,^i1" ;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Psld (SetCR0,rA,rS,rB) ->
    { empty_ins with
    memo=sprintf "sld. ^o0,^i0,^i1" ;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Psrd (DontSetCR0,rA,rS,rB) ->
    { empty_ins with
    memo=sprintf "srd ^o0,^i0,^i1" ;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Psrd (SetCR0,rA,rS,rB) ->
    { empty_ins with
    memo=sprintf "srd. ^o0,^i0,^i1" ;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Psradi (DontSetCR0,rA,rS,sH) ->
    { empty_ins with
    memo=sprintf "sradi ^o0,^i0,%i" sH;
    inputs=[rS];
    outputs=[rA]; }::k
| `Psradi (SetCR0,rA,rS,sH) ->
    { empty_ins with
    memo=sprintf "sradi. ^o0,^i0,%i" sH;
    inputs=[rS];
    outputs=[rA]; }::k
| `Psrad (DontSetCR0,rA,rS,rB) ->
    { empty_ins with
    memo=sprintf "srad ^o0,^i0,^i1" ;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Psrad (SetCR0,rA,rS,rB) ->
    { empty_ins with
    memo=sprintf "srad. ^o0,^i0,^i1" ;
    inputs=[rS; rB];
    outputs=[rA]; }::k
| `Pcdtbcd (rA,rS) ->
    { empty_ins with
    memo=sprintf "cdtbcd ^o0,^i0" ;
    inputs=[rS];
    outputs=[rA]; }::k
| `Pcbcdtd (rA,rS) ->
    { empty_ins with
    memo=sprintf "cbcdtd ^o0,^i0" ;
    inputs=[rS];
    outputs=[rA]; }::k
| `Paddg6s (rT,rA,rB) ->
    { empty_ins with
    memo=sprintf "addg6s ^o0,^i0,^i1" ;
    inputs=[rA; rB];
    outputs=[rT]; }::k
| `Pmtspr (sPR,rS) ->
    { empty_ins with
    memo=sprintf "mtspr %i,^i0" sPR;
    inputs=[rS];
    outputs=[]; }::k
| `Pmfspr (rT,sPR) ->
    { empty_ins with
    memo=sprintf "mfspr ^o0,%i" sPR;
    inputs=[];
    outputs=[rT]; }::k
| `Pmtcrf (fXM,rS) ->
    { empty_ins with
    memo=sprintf "mtcrf %i,^i0" fXM;
    inputs=[rS];
    outputs=[]; }::k
| `Pmfcr (rT) ->
    { empty_ins with
    memo=sprintf "mfcr ^o0" ;
    inputs=[];
    outputs=[rT]; }::k
| `Pmtocrf (fXM,rS) ->
    { empty_ins with
    memo=sprintf "mtocrf %i,^i0" fXM;
    inputs=[rS];
    outputs=[]; }::k
| `Pmfocrf (rT,fXM) ->
    { empty_ins with
    memo=sprintf "mfocrf ^o0,%i" fXM;
    inputs=[];
    outputs=[rT]; }::k
| `Pmcrxr (bF) ->
    { empty_ins with
    memo=sprintf "mcrxr %i" bF;
    inputs=[];
    outputs=[]; }::k
| `Pdlmzb (DontSetCR0,rA,rS,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "dlmzb 0,^o1,^o2" 
      else sprintf "dlmzb ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rA; rS; rB]);
    outputs=[rA; rS; rB]; }::k
| `Pdlmzb (SetCR0,rA,rS,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "dlmzb. 0,^o1,^o2" 
      else sprintf "dlmzb. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rA; rS; rB]);
    outputs=[rA; rS; rB]; }::k
| `Pmacchw (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "macchw ^o0,0,^o2" 
      else sprintf "macchw ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmacchw (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "macchw. ^o0,0,^o2" 
      else sprintf "macchw. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmacchw (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "macchwo ^o0,0,^o2" 
      else sprintf "macchwo ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmacchw (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "macchwo. ^o0,0,^o2" 
      else sprintf "macchwo. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmacchws (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "macchws ^o0,0,^o2" 
      else sprintf "macchws ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmacchws (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "macchws. ^o0,0,^o2" 
      else sprintf "macchws. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmacchws (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "macchwso ^o0,0,^o2" 
      else sprintf "macchwso ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmacchws (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "macchwso. ^o0,0,^o2" 
      else sprintf "macchwso. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmacchwu (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "macchwu ^o0,0,^o2" 
      else sprintf "macchwu ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmacchwu (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "macchwu. ^o0,0,^o2" 
      else sprintf "macchwu. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmacchwu (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "macchwuo ^o0,0,^o2" 
      else sprintf "macchwuo ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmacchwu (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "macchwuo. ^o0,0,^o2" 
      else sprintf "macchwuo. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmacchwsu (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "macchwsu ^o0,0,^o2" 
      else sprintf "macchwsu ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmacchwsu (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "macchwsu. ^o0,0,^o2" 
      else sprintf "macchwsu. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmacchwsu (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "macchwsuo ^o0,0,^o2" 
      else sprintf "macchwsuo ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmacchwsu (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "macchwsuo. ^o0,0,^o2" 
      else sprintf "macchwsuo. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmachhw (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "machhw ^o0,0,^o2" 
      else sprintf "machhw ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmachhw (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "machhw. ^o0,0,^o2" 
      else sprintf "machhw. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmachhw (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "machhwo ^o0,0,^o2" 
      else sprintf "machhwo ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmachhw (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "machhwo. ^o0,0,^o2" 
      else sprintf "machhwo. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmachhws (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "machhws ^o0,0,^o2" 
      else sprintf "machhws ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmachhws (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "machhws. ^o0,0,^o2" 
      else sprintf "machhws. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmachhws (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "machhwso ^o0,0,^o2" 
      else sprintf "machhwso ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmachhws (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "machhwso. ^o0,0,^o2" 
      else sprintf "machhwso. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmachhwu (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "machhwu ^o0,0,^o2" 
      else sprintf "machhwu ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmachhwu (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "machhwu. ^o0,0,^o2" 
      else sprintf "machhwu. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmachhwu (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "machhwuo ^o0,0,^o2" 
      else sprintf "machhwuo ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmachhwu (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "machhwuo. ^o0,0,^o2" 
      else sprintf "machhwuo. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmachhwsu (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "machhwsu ^o0,0,^o2" 
      else sprintf "machhwsu ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmachhwsu (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "machhwsu. ^o0,0,^o2" 
      else sprintf "machhwsu. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmachhwsu (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "machhwsuo ^o0,0,^o2" 
      else sprintf "machhwsuo ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmachhwsu (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "machhwsuo. ^o0,0,^o2" 
      else sprintf "machhwsuo. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmaclhw (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "maclhw ^o0,0,^o2" 
      else sprintf "maclhw ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmaclhw (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "maclhw. ^o0,0,^o2" 
      else sprintf "maclhw. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmaclhw (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "maclhwo ^o0,0,^o2" 
      else sprintf "maclhwo ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmaclhw (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "maclhwo. ^o0,0,^o2" 
      else sprintf "maclhwo. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmaclhws (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "maclhws ^o0,0,^o2" 
      else sprintf "maclhws ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmaclhws (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "maclhws. ^o0,0,^o2" 
      else sprintf "maclhws. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmaclhws (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "maclhwso ^o0,0,^o2" 
      else sprintf "maclhwso ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmaclhws (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "maclhwso. ^o0,0,^o2" 
      else sprintf "maclhwso. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmaclhwu (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "maclhwu ^o0,0,^o2" 
      else sprintf "maclhwu ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmaclhwu (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "maclhwu. ^o0,0,^o2" 
      else sprintf "maclhwu. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmaclhwu (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "maclhwuo ^o0,0,^o2" 
      else sprintf "maclhwuo ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmaclhwu (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "maclhwuo. ^o0,0,^o2" 
      else sprintf "maclhwuo. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmaclhwsu (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "maclhwsu ^o0,0,^o2" 
      else sprintf "maclhwsu ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmaclhwsu (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "maclhwsu. ^o0,0,^o2" 
      else sprintf "maclhwsu. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmaclhwsu (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "maclhwsuo ^o0,0,^o2" 
      else sprintf "maclhwsuo ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmaclhwsu (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "maclhwsuo. ^o0,0,^o2" 
      else sprintf "maclhwsuo. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmulchw (DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "mulchw ^o0,0,^o2" 
      else sprintf "mulchw ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmulchw (SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "mulchw. ^o0,0,^o2" 
      else sprintf "mulchw. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmulchwu (DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "mulchwu ^o0,0,^o2" 
      else sprintf "mulchwu ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmulchwu (SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "mulchwu. ^o0,0,^o2" 
      else sprintf "mulchwu. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmulhhw (DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "mulhhw ^o0,0,^o2" 
      else sprintf "mulhhw ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmulhhw (SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "mulhhw. ^o0,0,^o2" 
      else sprintf "mulhhw. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmulhhwu (DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "mulhhwu ^o0,0,^o2" 
      else sprintf "mulhhwu ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmulhhwu (SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "mulhhwu. ^o0,0,^o2" 
      else sprintf "mulhhwu. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmullhw (DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "mullhw ^o0,0,^o2" 
      else sprintf "mullhw ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmullhw (SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "mullhw. ^o0,0,^o2" 
      else sprintf "mullhw. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmullhwu (DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "mullhwu ^o0,0,^o2" 
      else sprintf "mullhwu ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pmullhwu (SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "mullhwu. ^o0,0,^o2" 
      else sprintf "mullhwu. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pnmacchw (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "nmacchw ^o0,0,^o2" 
      else sprintf "nmacchw ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pnmacchw (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "nmacchw. ^o0,0,^o2" 
      else sprintf "nmacchw. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pnmacchw (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "nmacchwo ^o0,0,^o2" 
      else sprintf "nmacchwo ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pnmacchw (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "nmacchwo. ^o0,0,^o2" 
      else sprintf "nmacchwo. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pnmacchws (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "nmacchws ^o0,0,^o2" 
      else sprintf "nmacchws ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pnmacchws (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "nmacchws. ^o0,0,^o2" 
      else sprintf "nmacchws. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pnmacchws (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "nmacchwso ^o0,0,^o2" 
      else sprintf "nmacchwso ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pnmacchws (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "nmacchwso. ^o0,0,^o2" 
      else sprintf "nmacchwso. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pnmachhw (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "nmachhw ^o0,0,^o2" 
      else sprintf "nmachhw ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pnmachhw (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "nmachhw. ^o0,0,^o2" 
      else sprintf "nmachhw. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pnmachhw (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "nmachhwo ^o0,0,^o2" 
      else sprintf "nmachhwo ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pnmachhw (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "nmachhwo. ^o0,0,^o2" 
      else sprintf "nmachhwo. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pnmachhws (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "nmachhws ^o0,0,^o2" 
      else sprintf "nmachhws ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pnmachhws (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "nmachhws. ^o0,0,^o2" 
      else sprintf "nmachhws. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pnmachhws (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "nmachhwso ^o0,0,^o2" 
      else sprintf "nmachhwso ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pnmachhws (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "nmachhwso. ^o0,0,^o2" 
      else sprintf "nmachhwso. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pnmaclhw (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "nmaclhw ^o0,0,^o2" 
      else sprintf "nmaclhw ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pnmaclhw (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "nmaclhw. ^o0,0,^o2" 
      else sprintf "nmaclhw. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pnmaclhw (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "nmaclhwo ^o0,0,^o2" 
      else sprintf "nmaclhwo ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pnmaclhw (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "nmaclhwo. ^o0,0,^o2" 
      else sprintf "nmaclhwo. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pnmaclhws (DontSetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "nmaclhws ^o0,0,^o2" 
      else sprintf "nmaclhws ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pnmaclhws (DontSetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "nmaclhws. ^o0,0,^o2" 
      else sprintf "nmaclhws. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pnmaclhws (SetSOOV,DontSetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "nmaclhwso ^o0,0,^o2" 
      else sprintf "nmaclhwso ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Pnmaclhws (SetSOOV,SetCR0,rT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "nmaclhwso. ^o0,0,^o2" 
      else sprintf "nmaclhwso. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rT; rA; rB]);
    outputs=[rT; rA; rB]; }::k
| `Picbi (rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "icbi 0,^o1" 
      else sprintf "icbi ^i0,^i1" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rA; rB]);
    outputs=[rA; rB]; }::k
| `Picbt (cT,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "icbt %i,0,^o1" cT
      else sprintf "icbt %i,^i0,^i1" cT;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rA; rB]);
    outputs=[rA; rB]; }::k
| `Pdcba (rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "dcba 0,^o1" 
      else sprintf "dcba ^i0,^i1" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rA; rB]);
    outputs=[rA; rB]; }::k
| `Pdcbt (rA,rB,tH) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "dcbt 0,^o1,%i" tH
      else sprintf "dcbt ^i0,^i1,%i" tH;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rA; rB]);
    outputs=[rA; rB]; }::k
| `Pdcbtst (rA,rB,tH) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "dcbtst 0,^o1,%i" tH
      else sprintf "dcbtst ^i0,^i1,%i" tH;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rA; rB]);
    outputs=[rA; rB]; }::k
| `Pdcbz (rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "dcbz 0,^o1" 
      else sprintf "dcbz ^i0,^i1" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rA; rB]);
    outputs=[rA; rB]; }::k
| `Pdcbst (rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "dcbst 0,^o1" 
      else sprintf "dcbst ^i0,^i1" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rA; rB]);
    outputs=[rA; rB]; }::k
| `Pdcbf (rA,rB,l) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "dcbf 0,^o1,%i" l
      else sprintf "dcbf ^i0,^i1,%i" l;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rA; rB]);
    outputs=[rA; rB]; }::k
| `Pisync ->
    { empty_ins with
    memo=sprintf "isync " ;
    inputs=[];
    outputs=[]; }::k
| `Plbarx (rT,rA,rB,eH) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "lbarx ^o0,0,^i0,%i" eH
      else sprintf "lbarx ^o0,^i0,^i1,%i" eH;
    inputs=
      (if rA = A.Ireg A.GPR0 then [rB] else [rA; rB]);
    outputs=[rT]; }::k
| `Plharx (rT,rA,rB,eH) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "lharx ^o0,0,^i0,%i" eH
      else sprintf "lharx ^o0,^i0,^i1,%i" eH;
    inputs=
      (if rA = A.Ireg A.GPR0 then [rB] else [rA; rB]);
    outputs=[rT]; }::k
| `Plwarx (rT,rA,rB,eH) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "lwarx ^o0,0,^i0,%i" eH
      else sprintf "lwarx ^o0,^i0,^i1,%i" eH;
    inputs=
      (if rA = A.Ireg A.GPR0 then [rB] else [rA; rB]);
    outputs=[rT]; }::k
| `Pstbcx (rS,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "stbcx. ^o0,0,^o2" 
      else sprintf "stbcx. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rS; rA; rB]);
    outputs=[rS; rA; rB]; }::k
| `Psthcx (rS,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "sthcx. ^o0,0,^o2" 
      else sprintf "sthcx. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rS; rA; rB]);
    outputs=[rS; rA; rB]; }::k
| `Pstwcx (rS,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "stwcx. ^o0,0,^o2" 
      else sprintf "stwcx. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rS; rA; rB]);
    outputs=[rS; rA; rB]; }::k
| `Pldarx (rT,rA,rB,eH) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "ldarx ^o0,0,^i0,%i" eH
      else sprintf "ldarx ^o0,^i0,^i1,%i" eH;
    inputs=
      (if rA = A.Ireg A.GPR0 then [rB] else [rA; rB]);
    outputs=[rT]; }::k
| `Pstdcx (rS,rA,rB) ->
    { empty_ins with
    memo= if rA = A.Ireg A.GPR0
      then sprintf "stdcx. ^o0,0,^o2" 
      else sprintf "stdcx. ^i0,^i1,^i2" ;
    inputs=
      (if rA = A.Ireg A.GPR0 then [] else [rS; rA; rB]);
    outputs=[rS; rA; rB]; }::k
| `Psync (l) ->
    { empty_ins with
    memo=sprintf "sync %i" l;
    inputs=[];
    outputs=[]; }::k
| `Peieio ->
    { empty_ins with
    memo=sprintf "eieio " ;
    inputs=[];
    outputs=[]; }::k
| `Pwait (wC) ->
    { empty_ins with
    memo=sprintf "wait %i" wC;
    inputs=[];
    outputs=[]; }::k
