These tests are in core/rotate_e.e with the other rotation tests, and only run on platforms where _EM_LLSIZE == 8.
		
			
				
	
	
		
			369 lines
		
	
	
	
		
			6.3 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			369 lines
		
	
	
	
		
			6.3 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| #
 | |
|     mes 2, _EM_WSIZE, _EM_PSIZE
 | |
| 
 | |
| /*
 | |
|  * Tests _rol_ (rotate left) and _ror_ (rotate right).  Several back
 | |
|  * ends provide _rol_ and _ror_, but as of year 2017, the compilers
 | |
|  * and optimizers had never emit _rol_ nor _ror_.
 | |
|  *
 | |
|  * By tradition, _rol_ and _ror_ can't rotate values shorter than the
 | |
|  * word size, or longer than 4 bytes.
 | |
|  *  - If word size is 2, then try rotating 2-byte and 4-byte values.
 | |
|  *  - If word size is 4, then try rotating 4-byte values.
 | |
|  *  - If long long size is 8, then also try 8-byte rotations.
 | |
|  *
 | |
|  * You can cheat this test if _cmu_ always pushes zero.
 | |
|  */
 | |
| 
 | |
| #if _EM_WSIZE == 2
 | |
| #define LEN2  4
 | |
|     exa table2
 | |
|     exa left2
 | |
|     exa right2
 | |
| table2         /* left, right */
 | |
|     con 12715U2  /*  0,  0 */
 | |
|     con 25430U2  /*  1, 15 */
 | |
|     con 43825U2  /*  8,  8 */
 | |
|     con 39125U2  /* 15,  1 */
 | |
| left2
 | |
|     con 0I2, 1I2, 8I2, 15I2
 | |
| right2
 | |
|     con 0I2, 15I2, 8I2, 1I2
 | |
| #endif
 | |
| 
 | |
| #define LEN4  4
 | |
|     exa table4
 | |
|     exa left4
 | |
|     exa right4
 | |
| table4              /* left, right */
 | |
|     con  437223536U4  /*  0,  0 */
 | |
|     con  874447072U4  /*  1, 31 */
 | |
|     con 2154830351U4  /* 16, 16 */
 | |
|     con  218611768U4  /* 31,  1 */
 | |
| left4
 | |
|     con 0I2, 1I2, 16I2, 31I2
 | |
| right4
 | |
|     con 0I2, 31I2, 16I2, 1I2
 | |
| 
 | |
|     exa val4
 | |
|     exa val4left7
 | |
|     exa val4right11
 | |
| val4
 | |
|     con 4283808839U4
 | |
| val4left7
 | |
|     con 2866684927U4
 | |
| val4right11
 | |
|     con 2298473143U4
 | |
| 
 | |
| #if _EM_LLSIZE == 8
 | |
| #define LEN8  4
 | |
|     exa table8
 | |
|     exa left8
 | |
|     exa right8
 | |
| table8                        /* left, right */
 | |
|     con 14079773792309488728U8  /*  0, 0  */
 | |
|     con  9712803510909425841U8  /*  1, 63 */
 | |
|     con 10409556348460427178U8  /* 32, 32 */
 | |
|     con  7039886896154744364U8  /* 63, 1  */
 | |
| left8
 | |
|     con 0I2, 1I2, 32I2, 63I2
 | |
| right8
 | |
|     con 0I2, 63I2, 32I2, 1I2
 | |
| 
 | |
|     exa val8
 | |
|     exa val8left13
 | |
|     exa val8right20
 | |
|     exa val8right32
 | |
| val8
 | |
|     con 15129222862059184558U8
 | |
| val8left13
 | |
|     con 13366998808072149566U8
 | |
| val8right20
 | |
|     con  1881076513336495948U8
 | |
| val8right32
 | |
|     con 17636555387978501128U8
 | |
| #endif
 | |
| 
 | |
|     exp $_m_a_i_n
 | |
|     pro $_m_a_i_n, _EM_WSIZE
 | |
| #define i -_EM_WSIZE
 | |
| 
 | |
| #if _EM_WSIZE == 2
 | |
|     /*
 | |
|      * Loop for LEN2 items in table2.
 | |
|      */
 | |
|     loc 0
 | |
|     stl i
 | |
| 1
 | |
|     lae table2
 | |
|     loi 2         /* value to rotate */
 | |
|     lae left2
 | |
|     lol i
 | |
|     loc 1
 | |
|     sli _EM_WSIZE
 | |
|     ads _EM_WSIZE
 | |
|     loi 2         /* left distance */
 | |
|     rol 2         /* rotate left */
 | |
|     lae table2
 | |
|     lol i
 | |
|     loc 1
 | |
|     sli _EM_WSIZE
 | |
|     ads _EM_WSIZE
 | |
|     loi 2         /* expected result */
 | |
|     cmu 2
 | |
|     zeq *2
 | |
|     loc __LINE__
 | |
|     loc _EM_WSIZE
 | |
|     loc 4
 | |
|     cuu
 | |
|     cal $fail
 | |
|     asp 4
 | |
| 2
 | |
|     lae table2
 | |
|     loi 2         /* value to rotate */
 | |
|     lae right2
 | |
|     lol i
 | |
|     loc 1
 | |
|     sli _EM_WSIZE
 | |
|     ads _EM_WSIZE
 | |
|     loi 2         /* right distance */
 | |
|     ror 2         /* rotate right */
 | |
|     lae table2
 | |
|     lol i
 | |
|     loc 1
 | |
|     sli _EM_WSIZE
 | |
|     ads _EM_WSIZE
 | |
|     loi 2         /* expected result */
 | |
|     cmu 2
 | |
|     zeq *3
 | |
|     loc __LINE__
 | |
|     loc _EM_WSIZE
 | |
|     loc 4
 | |
|     cuu
 | |
|     cal $fail
 | |
|     asp 4
 | |
| 3
 | |
|     inl i         /* loop LEN2 times */
 | |
|     lol i
 | |
|     loc LEN2
 | |
|     blt *1
 | |
| #endif /* _EM_WSIZE == 2 */
 | |
| 
 | |
|     /*
 | |
|      * Loop for LEN4 items in table4.
 | |
|      */
 | |
|     loc 0
 | |
|     stl i
 | |
| 4
 | |
|     lae table4
 | |
|     loi 4         /* value to rotate */
 | |
|     lae left4
 | |
|     lol i
 | |
|     loc 1
 | |
|     sli _EM_WSIZE
 | |
|     ads _EM_WSIZE
 | |
|     loi 2         /* left distance */
 | |
|     loc 2
 | |
|     loc _EM_WSIZE
 | |
|     cii
 | |
|     rol 4         /* rotate left */
 | |
|     lae table4
 | |
|     lol i
 | |
|     loc 2
 | |
|     sli _EM_WSIZE
 | |
|     ads _EM_WSIZE
 | |
|     loi 4         /* expected result */
 | |
|     cmu 4
 | |
|     zeq *5
 | |
|     loc __LINE__
 | |
|     loc _EM_WSIZE
 | |
|     loc 4
 | |
|     cuu
 | |
|     cal $fail
 | |
|     asp 4
 | |
| 5
 | |
|     lae table4
 | |
|     loi 4         /* value to rotate */
 | |
|     lae right4
 | |
|     lol i
 | |
|     loc 1
 | |
|     sli _EM_WSIZE
 | |
|     ads _EM_WSIZE
 | |
|     loi 2         /* right distance */
 | |
|     loc 2
 | |
|     loc _EM_WSIZE
 | |
|     cii
 | |
|     ror 4         /* rotate right */
 | |
|     lae table4
 | |
|     lol i
 | |
|     loc 2
 | |
|     sli _EM_WSIZE
 | |
|     ads _EM_WSIZE
 | |
|     loi 4         /* expected result */
 | |
|     cmu 4
 | |
|     zeq *6
 | |
|     loc __LINE__
 | |
|     loc _EM_WSIZE
 | |
|     loc 4
 | |
|     cuu
 | |
|     cal $fail
 | |
|     asp 4
 | |
| 6
 | |
|     inl i         /* loop LEN4 times */
 | |
|     lol i
 | |
|     loc LEN4
 | |
|     blt *4
 | |
| 
 | |
|     /*
 | |
|      * Rotate 4-byte values by a constant distance, because this uses
 | |
|      * different rules in PowerPC ncg.
 | |
|      */
 | |
|     lae val4
 | |
|     loi 4
 | |
|     loc 7
 | |
|     rol 4         /* rotate left by 7 bits */
 | |
|     lae val4left7
 | |
|     loi 4
 | |
|     cmu 4
 | |
|     zeq *7
 | |
|     loc __LINE__
 | |
|     loc _EM_WSIZE
 | |
|     loc 4
 | |
|     cuu
 | |
|     cal $fail
 | |
|     asp 4
 | |
| 7
 | |
|     lae val4
 | |
|     loi 4
 | |
|     loc 11
 | |
|     ror 4         /* rotate right by 11 bits */
 | |
|     lae val4right11
 | |
|     loi 4
 | |
|     cmu 4
 | |
|     zeq *8
 | |
|     loc __LINE__
 | |
|     loc _EM_WSIZE
 | |
|     loc 4
 | |
|     cuu
 | |
|     cal $fail
 | |
|     asp 4
 | |
| 8
 | |
| 
 | |
| #if _EM_LLSIZE == 8
 | |
|     /*
 | |
|      * Loop for LEN8 items in table8.
 | |
|      */
 | |
|     loc 0
 | |
|     stl i
 | |
| 9
 | |
|     lae table8
 | |
|     loi 8         /* value to rotate */
 | |
|     lae left8
 | |
|     lol i
 | |
|     loc 1
 | |
|     sli _EM_WSIZE
 | |
|     ads _EM_WSIZE
 | |
|     loi 2         /* left distance */
 | |
|     loc 2
 | |
|     loc _EM_WSIZE
 | |
|     cii
 | |
|     rol 8         /* rotate left */
 | |
|     lae table8
 | |
|     lol i
 | |
|     loc 3
 | |
|     sli _EM_WSIZE
 | |
|     ads _EM_WSIZE
 | |
|     loi 8         /* expected result */
 | |
|     cmu 8
 | |
|     zeq *10
 | |
|     loc __LINE__
 | |
|     loc _EM_WSIZE
 | |
|     loc 4
 | |
|     cuu
 | |
|     cal $fail
 | |
|     asp 4
 | |
| 10
 | |
|     lae table8
 | |
|     loi 8         /* value to rotate */
 | |
|     lae right8
 | |
|     lol i
 | |
|     loc 1
 | |
|     sli _EM_WSIZE
 | |
|     ads _EM_WSIZE
 | |
|     loi 2         /* right distance */
 | |
|     loc 2
 | |
|     loc _EM_WSIZE
 | |
|     cii
 | |
|     ror 8         /* rotate right */
 | |
|     lae table8
 | |
|     lol i
 | |
|     loc 3
 | |
|     sli _EM_WSIZE
 | |
|     ads _EM_WSIZE
 | |
|     loi 8         /* expected result */
 | |
|     cmu 8
 | |
|     zeq *11
 | |
|     loc __LINE__
 | |
|     loc _EM_WSIZE
 | |
|     loc 4
 | |
|     cuu
 | |
|     cal $fail
 | |
|     asp 4
 | |
| 11
 | |
|     inl i         /* loop LEN8 times */
 | |
|     lol i
 | |
|     loc LEN8
 | |
|     blt *9
 | |
| 
 | |
|     /*
 | |
|      * Rotate 8-byte value by constant distance.
 | |
|      */
 | |
|     lae val8
 | |
|     loi 8
 | |
|     loc 13
 | |
|     rol 8         /* rotate left by 13 bits */
 | |
|     lae val8left13
 | |
|     loi 8
 | |
|     cmu 8
 | |
|     zeq *12
 | |
|     loc __LINE__
 | |
|     loc _EM_WSIZE
 | |
|     loc 4
 | |
|     cuu
 | |
|     cal $fail
 | |
|     asp 4
 | |
| 12
 | |
|     lae val8
 | |
|     loi 8
 | |
|     loc 20
 | |
|     ror 8         /* rotate right by 20 bits */
 | |
|     lae val8right20
 | |
|     loi 8
 | |
|     cmu 8
 | |
|     zeq *13
 | |
|     loc __LINE__
 | |
|     loc _EM_WSIZE
 | |
|     loc 4
 | |
|     cuu
 | |
|     cal $fail
 | |
|     asp 4
 | |
| 13
 | |
|     lae val8
 | |
|     loi 8
 | |
|     loc 32
 | |
|     ror 8         /* rotate right by 32 bits */
 | |
|     lae val8right32
 | |
|     loi 8
 | |
|     cmu 8
 | |
|     zeq *14
 | |
|     loc __LINE__
 | |
|     loc _EM_WSIZE
 | |
|     loc 4
 | |
|     cuu
 | |
|     cal $fail
 | |
|     asp 4
 | |
| 14
 | |
| #endif /* _EM_LLSIZE == 8 */
 | |
| 
 | |
|     cal $finished
 | |
|     end
 |