Fix overflow when multiplying two large positive numbers.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3429 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
		
							parent
							
								
									9278480e8f
								
							
						
					
					
						commit
						67fc07d3fb
					
				@ -43,7 +43,8 @@ void muls64(int64_t *phigh, int64_t *plow, int64_t a, int64_t b)
 | 
				
			|||||||
    ph = (a >> 32) * (b >> 32);
 | 
					    ph = (a >> 32) * (b >> 32);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ph += (int64_t)pm1 >> 32;
 | 
					    ph += (int64_t)pm1 >> 32;
 | 
				
			||||||
    pm1 = (uint64_t)((uint32_t)pm1) + pm2 + (pl >> 32);
 | 
					    ph += (int64_t)pm2 >> 32;
 | 
				
			||||||
 | 
					    pm1 = (uint64_t)((uint32_t)pm1) + (uint64_t)((uint32_t)pm2) + (pl >> 32);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    *phigh = ph + ((int64_t)pm1 >> 32);
 | 
					    *phigh = ph + ((int64_t)pm1 >> 32);
 | 
				
			||||||
    *plow = (pm1 << 32) + (uint32_t)pl;
 | 
					    *plow = (pm1 << 32) + (uint32_t)pl;
 | 
				
			||||||
@ -67,7 +68,8 @@ void mulu64(uint64_t *phigh, uint64_t *plow, uint64_t a, uint64_t b)
 | 
				
			|||||||
    ph = (a >> 32) * (b >> 32);
 | 
					    ph = (a >> 32) * (b >> 32);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ph += pm1 >> 32;
 | 
					    ph += pm1 >> 32;
 | 
				
			||||||
    pm1 = (uint64_t)((uint32_t)pm1) + pm2 + (pl >> 32);
 | 
					    ph += pm2 >> 32;
 | 
				
			||||||
 | 
					    pm1 = (uint64_t)((uint32_t)pm1) + (uint64_t)((uint32_t)pm2) + (pl >> 32);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    *phigh = ph + (pm1 >> 32);
 | 
					    *phigh = ph + (pm1 >> 32);
 | 
				
			||||||
    *plow = (pm1 << 32) + (uint32_t)pl;
 | 
					    *plow = (pm1 << 32) + (uint32_t)pl;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user