 29851ee7c8
			
		
	
	
		29851ee7c8
		
	
	
	
	
		
			
			This change corrects and simplifies how discard is calculated for shift left logical vector instructions. It is used to detect overflow and set bit 22 in the DSPControl register. The existing tests (shll_ph.c, shll_qb.c) are extended with the corner cases that expose incorrectness in the previous implementation. Signed-off-by: Petar Jovanovic <petar.jovanovic@imgtec.com> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
		
			
				
	
	
		
			56 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include<stdio.h>
 | |
| #include<assert.h>
 | |
| 
 | |
| int main()
 | |
| {
 | |
|     int rd, rt, dsp;
 | |
|     int result, resultdsp;
 | |
| 
 | |
|     rt     = 0x87654321;
 | |
|     result  = 0x87654321;
 | |
|     resultdsp = 0x00;
 | |
| 
 | |
|     __asm
 | |
|         ("wrdsp $0\n\t"
 | |
|          "shll.qb %0, %2, 0x00\n\t"
 | |
|          "rddsp   %1\n\t"
 | |
|          : "=r"(rd), "=r"(dsp)
 | |
|          : "r"(rt)
 | |
|         );
 | |
|     dsp = (dsp >> 22) & 0x01;
 | |
|     assert(dsp == resultdsp);
 | |
|     assert(rd == result);
 | |
| 
 | |
|     rt     = 0x87654321;
 | |
|     result = 0x38281808;
 | |
|     resultdsp = 0x01;
 | |
| 
 | |
|     __asm
 | |
|         ("wrdsp $0\n\t"
 | |
|          "shll.qb %0, %2, 0x03\n\t"
 | |
|          "rddsp   %1\n\t"
 | |
|          : "=r"(rd), "=r"(dsp)
 | |
|          : "r"(rt)
 | |
|         );
 | |
|     dsp = (dsp >> 22) & 0x01;
 | |
|     assert(dsp == resultdsp);
 | |
|     assert(rd == result);
 | |
| 
 | |
|     rt     = 0x00000001;
 | |
|     result = 0x00000080;
 | |
|     resultdsp = 0x00;
 | |
| 
 | |
|     __asm
 | |
|         ("wrdsp $0\n\t"
 | |
|          "shll.qb %0, %2, 0x07\n\t"
 | |
|          "rddsp   %1\n\t"
 | |
|          : "=r"(rd), "=r"(dsp)
 | |
|          : "r"(rt)
 | |
|         );
 | |
|     dsp = (dsp >> 22) & 0x01;
 | |
|     assert(dsp == resultdsp);
 | |
|     assert(rd == result);
 | |
| 
 | |
|     return 0;
 | |
| }
 |