| 
									
										
										
										
											2015-05-24 06:55:12 +02:00
										 |  |  | // Copyright 2008 Dolphin Emulator Project
 | 
					
						
							| 
									
										
										
										
											2015-05-18 01:08:10 +02:00
										 |  |  | // Licensed under GPLv2+
 | 
					
						
							| 
									
										
										
										
											2014-02-10 13:54:46 -05:00
										 |  |  | // Refer to the license.txt file included.
 | 
					
						
							| 
									
										
										
										
											2012-12-17 15:01:52 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-10 13:54:46 -05:00
										 |  |  | #pragma once
 | 
					
						
							| 
									
										
										
										
											2012-12-17 15:01:52 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-17 05:18:15 -05:00
										 |  |  | #include "Common/CommonTypes.h"
 | 
					
						
							| 
									
										
										
										
											2012-12-17 15:01:52 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-26 13:49:00 -06:00
										 |  |  | namespace FPURoundMode | 
					
						
							| 
									
										
										
										
											2012-12-17 15:01:52 -06:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-03-09 15:21:50 +01:00
										 |  |  | 	// TODO: MSVC currently produces broken code:
 | 
					
						
							|  |  |  | 	// https://connect.microsoft.com/VisualStudio/feedback/details/828892/vc-2013-miscompilation-with-enums-and-bit-fields
 | 
					
						
							|  |  |  | 	// Once that is fixed, change types in SetRoundMode(), SetSIMDMode(), and in UReg_FPSCR to 'RoundMode'.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	enum RoundMode | 
					
						
							| 
									
										
										
										
											2013-02-26 13:49:00 -06:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		ROUND_NEAR = 0, | 
					
						
							| 
									
										
										
										
											2014-02-23 14:57:31 +01:00
										 |  |  | 		ROUND_CHOP = 1, | 
					
						
							|  |  |  | 		ROUND_UP   = 2, | 
					
						
							|  |  |  | 		ROUND_DOWN = 3 | 
					
						
							| 
									
										
										
										
											2013-02-26 13:49:00 -06:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2014-03-09 15:21:50 +01:00
										 |  |  | 	enum PrecisionMode | 
					
						
							| 
									
										
										
										
											2014-03-04 22:49:33 -08:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2013-02-26 13:49:00 -06:00
										 |  |  | 		PREC_24 = 0, | 
					
						
							| 
									
										
										
										
											2014-02-23 14:57:31 +01:00
										 |  |  | 		PREC_53 = 1, | 
					
						
							|  |  |  | 		PREC_64 = 2 | 
					
						
							| 
									
										
										
										
											2013-02-26 13:49:00 -06:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-09 15:21:50 +01:00
										 |  |  | 	void SetRoundMode(int mode); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void SetPrecisionMode(PrecisionMode mode); | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-09 15:21:50 +01:00
										 |  |  | 	void SetSIMDMode(int rounding_mode, bool non_ieee_mode); | 
					
						
							| 
									
										
										
										
											2013-02-26 13:49:00 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-19 21:51:12 -04:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * There are two different flavors of float to int conversion: | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  |  * _mm_cvtps_epi32() and _mm_cvttps_epi32(). | 
					
						
							| 
									
										
										
										
											2013-03-19 21:51:12 -04:00
										 |  |  |  * | 
					
						
							|  |  |  |  * The first rounds according to the MXCSR rounding bits. | 
					
						
							|  |  |  |  * The second one always uses round towards zero. | 
					
						
							| 
									
										
										
										
											2013-02-26 13:49:00 -06:00
										 |  |  |  */ | 
					
						
							|  |  |  | 	void SaveSIMDState(); | 
					
						
							|  |  |  | 	void LoadSIMDState(); | 
					
						
							|  |  |  | 	void LoadDefaultSIMDState(); | 
					
						
							|  |  |  | } |