forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			88 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
| // REQUIRES: mips-registered-target
 | |
| // RUN: %clang --target=mips64-unknown-linux -S -mmadd4    %s -o -| FileCheck %s -check-prefix=MADD4
 | |
| // RUN: %clang --target=mips64-unknown-linux -S -mno-madd4 %s -o -| FileCheck %s -check-prefix=NOMADD4
 | |
| // RUN: %clang --target=mips64-unknown-linux -S -mmadd4    -fno-honor-nans %s -o -| FileCheck %s -check-prefix=MADD4-NONAN
 | |
| // RUN: %clang --target=mips64-unknown-linux -S -mno-madd4 -fno-honor-nans %s -o -| FileCheck %s -check-prefix=NOMADD4-NONAN
 | |
|  
 | |
| float madd_s (float f, float g, float h)
 | |
| {
 | |
|   return (f * g) + h;
 | |
| }
 | |
| // MADD4:   madd.s
 | |
| // NOMADD4: mul.s
 | |
| // NOMADD4: add.s
 | |
| 
 | |
| float msub_s (float f, float g, float h)
 | |
| {
 | |
|   return (f * g) - h;
 | |
| }
 | |
| // MADD4:   msub.s
 | |
| // NOMADD4: mul.s
 | |
| // NOMADD4: sub.s
 | |
| 
 | |
| double madd_d (double f, double g, double h)
 | |
| {
 | |
|   return (f * g) + h;
 | |
| }
 | |
| // MADD4:   madd.d
 | |
| // NOMADD4: mul.d
 | |
| // NOMADD4: add.d
 | |
| 
 | |
| double msub_d (double f, double g, double h)
 | |
| {
 | |
|   return (f * g) - h;
 | |
| }
 | |
| // MADD4:   msub.d
 | |
| // NOMADD4: mul.d
 | |
| // NOMADD4: sub.d
 | |
| 
 | |
| 
 | |
| float nmadd_s (float f, float g, float h)
 | |
| {
 | |
|   // FIXME: Zero has been explicitly placed to force generation of a positive
 | |
|   // zero in IR until pattern used to match this instruction is changed to
 | |
|   // comply with negative zero as well.
 | |
|   return 0-((f * g) + h);
 | |
| }
 | |
| // MADD4-NONAN:   nmadd.s
 | |
| // NOMADD4-NONAN: mul.s
 | |
| // NOMADD4-NONAN: add.s
 | |
| // NOMADD4-NONAN: sub.s
 | |
| 
 | |
| float nmsub_s (float f, float g, float h)
 | |
| {
 | |
|   // FIXME: Zero has been explicitly placed to force generation of a positive
 | |
|   // zero in IR until pattern used to match this instruction is changed to
 | |
|   // comply with negative zero as well.
 | |
|   return 0-((f * g) - h);
 | |
| }
 | |
| // MADD4-NONAN:   nmsub.s
 | |
| // NOMADD4-NONAN: mul.s
 | |
| // NOMADD4-NONAN: sub.s
 | |
| // NOMADD4-NONAN: sub.s
 | |
| 
 | |
| double nmadd_d (double f, double g, double h)
 | |
| {
 | |
|   // FIXME: Zero has been explicitly placed to force generation of a positive
 | |
|   // zero in IR until pattern used to match this instruction is changed to
 | |
|   // comply with negative zero as well.
 | |
|   return 0-((f * g) + h);
 | |
| }
 | |
| // MADD4-NONAN:   nmadd.d
 | |
| // NOMADD4-NONAN: mul.d
 | |
| // NOMADD4-NONAN: add.d
 | |
| // NOMADD4-NONAN: sub.d
 | |
| 
 | |
| double nmsub_d (double f, double g, double h)
 | |
| {
 | |
|   // FIXME: Zero has been explicitly placed to force generation of a positive
 | |
|   // zero in IR until pattern used to match this instruction is changed to
 | |
|   // comply with negative zero as well.
 | |
|   return 0-((f * g) - h);
 | |
| }
 | |
| // MADD4-NONAN:   nmsub.d
 | |
| // NOMADD4-NONAN: mul.d
 | |
| // NOMADD4-NONAN: sub.d
 | |
| // NOMADD4-NONAN: sub.d
 | |
| 
 |