| 
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -233,15 +233,6 @@ class AddSubtractSpec(Elaboratable):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        xer_w_ov32 = Signal()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        xer_w_ca32 = Signal()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        m.d.comb += [
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            xer_r_so  .eq(self.pfv.xer.r_data[63 - 32]),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            xer_w_so  .eq(xer_w_ov),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            xer_w_ov  .eq(Mux(msr_r_sf, ov_64, ov_32)),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            xer_w_ca  .eq(Mux(msr_r_sf, ca_64, ca_32)),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            xer_w_ov32.eq(ov_32),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            xer_w_ca32.eq(ca_32),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        ]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        if isinstance(spec_insn, (
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ADD_   , ADDO_   , ADDIC_ ,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            SUBF_  , SUBFO_  ,
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -252,7 +243,10 @@ class AddSubtractSpec(Elaboratable):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            NEG_   , NEGO_   ,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            )):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            # Read XER.SO (to update CR0)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            m.d.comb += spec_xer_r_mask[63 - 32].eq(1)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            m.d.comb += [
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                xer_r_so.eq(self.pfv.xer.r_data[63 - 32]),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                spec_xer_r_mask[63 - 32].eq(1),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        if isinstance(spec_insn, (
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ADDO  , ADDO_  , SUBFO  , SUBFO_  ,
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -262,23 +256,23 @@ class AddSubtractSpec(Elaboratable):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ADDZEO, ADDZEO_, SUBFZEO, SUBFZEO_,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            NEGO  , NEGO_  ,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            )):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            # Set XER.SO
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            # Set XER.SO, write XER.OV and XER.OV32
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            m.d.comb += [
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                xer_w_so  .eq(xer_w_ov),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                xer_w_ov  .eq(Mux(msr_r_sf, ov_64, ov_32)),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                xer_w_ov32.eq(ov_32),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                spec_xer_w_mask[63 - 32].eq(xer_w_so),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                spec_xer_w_data[63 - 32].eq(xer_w_so),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                spec_xer_w_mask[63 - 33].eq(1),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                spec_xer_w_data[63 - 33].eq(xer_w_ov),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                spec_xer_w_mask[63 - 44].eq(1),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                spec_xer_w_data[63 - 44].eq(xer_w_ov32),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        if isinstance(spec_insn, (
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ADDO  , ADDO_  , SUBFO  , SUBFO_  ,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ADDCO , ADDCO_ , SUBFCO , SUBFCO_ ,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ADDEO , ADDEO_ , SUBFEO , SUBFEO_ ,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ADDMEO, ADDMEO_, SUBFMEO, SUBFMEO_,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ADDZEO, ADDZEO_, SUBFZEO, SUBFZEO_,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ADDEX ,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            NEGO  , NEGO_  ,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            )):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        elif isinstance(spec_insn, ADDEX):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            # Write XER.OV and XER.OV32
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            m.d.comb += [
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                xer_w_ov  .eq(Mux(msr_r_sf, ca_64, ca_32)),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                xer_w_ov32.eq(ca_32),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                spec_xer_w_mask[63 - 33].eq(1),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                spec_xer_w_data[63 - 33].eq(xer_w_ov),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                spec_xer_w_mask[63 - 44].eq(1),
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -298,6 +292,8 @@ class AddSubtractSpec(Elaboratable):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            )):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            # Write XER.CA and XER.CA32
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            m.d.comb += [
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                xer_w_ca  .eq(Mux(msr_r_sf, ca_64, ca_32)),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                xer_w_ca32.eq(ca_32),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                spec_xer_w_mask[63 - 34].eq(1),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                spec_xer_w_data[63 - 34].eq(xer_w_ca),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                spec_xer_w_mask[63 - 45].eq(1),
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -328,13 +324,6 @@ class AddSubtractSpec(Elaboratable):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        cr0_w_eq = Signal()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        cr0_w_so = Signal()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        m.d.comb += [
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            cr0_w_lt.eq(Mux(msr_r_sf, result[63], result[31])),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            cr0_w_gt.eq(~(cr0_w_lt | cr0_w_eq)),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            cr0_w_eq.eq(~Mux(msr_r_sf, result[:64].any(), result[:32].any())),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            cr0_w_so.eq(Mux(spec_xer_w_mask[63 - 32], xer_w_so, xer_r_so)),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        ]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        if isinstance(spec_insn, (
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ADD_   , ADDO_   , ADDIC_ ,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            SUBF_  , SUBFO_  ,
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -346,6 +335,11 @@ class AddSubtractSpec(Elaboratable):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            )):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            # Write CR0
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            m.d.comb += [
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                cr0_w_lt.eq(Mux(msr_r_sf, result[63], result[31])),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                cr0_w_gt.eq(~(cr0_w_lt | cr0_w_eq)),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                cr0_w_eq.eq(~Mux(msr_r_sf, result[:64].any(), result[:32].any())),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                cr0_w_so.eq(Mux(xer_w_so, xer_w_so, xer_r_so)),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                spec_cr_w_stb [ 7 - 0].eq(1),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                spec_cr_w_data[31 - 0].eq(cr0_w_lt),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                spec_cr_w_data[31 - 1].eq(cr0_w_gt),
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
			
			 | 
			 | 
			
				
 
 |