mirror of
				https://github.com/qemu/qemu.git
				synced 2025-10-30 19:15:42 +00:00 
			
		
		
		
	 50f0171a95
			
		
	
	
		50f0171a95
		
	
	
	
	
		
			
			Make tests for optional instruction groups conditional on the presence of corresponding options in the config. Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
		
			
				
	
	
		
			248 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			248 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| #include "macros.inc"
 | |
| 
 | |
| test_suite mac16
 | |
| 
 | |
| #if XCHAL_HAVE_MAC16
 | |
| 
 | |
| #define ext16(v) (((v) & 0xffff) | (((v) & 0x8000) * 0x1ffffffe))
 | |
| #define mul16(a, b) ((ext16(a) * ext16(b)))
 | |
| 
 | |
| .macro assert_acc_value v
 | |
|     rsr     a4, ACCLO
 | |
|     movi    a5, (\v) & 0xffffffff
 | |
|     assert  eq, a4, a5
 | |
|     rsr     a4, ACCHI
 | |
|     movi    a5, (\v) >> 32
 | |
|     sext    a5, a5, 7
 | |
|     assert  eq, a4, a5
 | |
| .endm
 | |
| 
 | |
| .macro init_reg sr, reg, val
 | |
|     .if (\sr)
 | |
|     movi    a4, \val
 | |
|     wsr     a4, \reg
 | |
|     .else
 | |
|     movi    \reg, \val
 | |
|     .endif
 | |
| .endm
 | |
| 
 | |
| .macro test_mulxx mulop, comb, s, t, a, b
 | |
|     init_reg \comb & 2, \s, \a
 | |
|     init_reg \comb & 1, \t, \b
 | |
| 
 | |
|     \mulop\().ll \s, \t
 | |
|     assert_acc_value mul16(\a, \b)
 | |
| 
 | |
|     \mulop\().lh \s, \t
 | |
|     assert_acc_value mul16(\a, (\b >> 16))
 | |
| 
 | |
|     \mulop\().hl \s, \t
 | |
|     assert_acc_value mul16((\a >> 16), \b)
 | |
| 
 | |
|     \mulop\().hh \s, \t
 | |
|     assert_acc_value mul16((\a >> 16), (\b >> 16))
 | |
| .endm
 | |
| 
 | |
| test mul_aa
 | |
|     test_mulxx mul.aa, 0, a2, a3, 0xf7315a5a, 0xa5a5137f
 | |
| test_end
 | |
| 
 | |
| test mul_ad
 | |
|     test_mulxx mul.ad, 1, a2, m2, 0xf7315a5a, 0xa5a5137f
 | |
| test_end
 | |
| 
 | |
| test mul_da
 | |
|     test_mulxx mul.da, 2, m1, a3, 0xf7315a5a, 0xa5a5137f
 | |
| test_end
 | |
| 
 | |
| test mul_dd
 | |
|     test_mulxx mul.dd, 3, m0, m3, 0xf7315a5a, 0xa5a5137f
 | |
| test_end
 | |
| 
 | |
| 
 | |
| .macro init_acc iv
 | |
|     movi    a4, (\iv) & 0xffffffff
 | |
|     wsr     a4, ACCLO
 | |
|     movi    a4, (\iv) >> 32
 | |
|     wsr     a4, ACCHI
 | |
| .endm
 | |
| 
 | |
| .macro test_mulxxx mulop, comb, s, t, a, b, iv, op
 | |
|     init_reg \comb & 2, \s, \a
 | |
|     init_reg \comb & 1, \t, \b
 | |
| 
 | |
|     init_acc \iv
 | |
|     \mulop\().ll \s, \t
 | |
|     assert_acc_value (\iv \op mul16(\a, \b))
 | |
| 
 | |
|     init_acc \iv
 | |
|     \mulop\().lh \s, \t
 | |
|     assert_acc_value (\iv \op mul16(\a, (\b >> 16)))
 | |
| 
 | |
|     init_acc \iv
 | |
|     \mulop\().hl \s, \t
 | |
|     assert_acc_value (\iv \op mul16((\a >> 16), \b))
 | |
| 
 | |
|     init_acc \iv
 | |
|     \mulop\().hh \s, \t
 | |
|     assert_acc_value (\iv \op mul16((\a >> 16), (\b >> 16)))
 | |
| .endm
 | |
| 
 | |
| 
 | |
| test mula_aa
 | |
|     test_mulxxx mula.aa, 0, a2, a3, 0xf7315a5a, 0xa5a5137f, 0xfff73155aa, +
 | |
| test_end
 | |
| 
 | |
| test mula_ad
 | |
|     test_mulxxx mula.ad, 1, a2, m2, 0xf7315a5a, 0xa5a5137f, 0xfff73155aa, +
 | |
| test_end
 | |
| 
 | |
| test mula_da
 | |
|     test_mulxxx mula.da, 2, m1, a3, 0xf7315a5a, 0xa5a5137f, 0x0ff73155aa, +
 | |
| test_end
 | |
| 
 | |
| test mula_dd
 | |
|     test_mulxxx mula.dd, 3, m0, m3, 0xf7315a5a, 0xa5a5137f, 0x0ff73155aa, +
 | |
| test_end
 | |
| 
 | |
| 
 | |
| test muls_aa
 | |
|     test_mulxxx muls.aa, 0, a2, a3, 0xf7315a5a, 0xa5a5137f, 0x0ff73155aa, -
 | |
| test_end
 | |
| 
 | |
| test muls_ad
 | |
|     test_mulxxx muls.ad, 1, a2, m2, 0xf7315a5a, 0xa5a5137f, 0x0ff73155aa, -
 | |
| test_end
 | |
| 
 | |
| test muls_da
 | |
|     test_mulxxx muls.da, 2, m1, a3, 0xf7315a5a, 0xa5a5137f, 0xfff73155aa, -
 | |
| test_end
 | |
| 
 | |
| test muls_dd
 | |
|     test_mulxxx muls.dd, 3, m0, m3, 0xf7315a5a, 0xa5a5137f, 0xfff73155aa, -
 | |
| test_end
 | |
| 
 | |
| test ldinc
 | |
|     movi    a2, 1f - 4
 | |
|     ldinc   m0, a2
 | |
|     movi    a3, 1f
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a3, m0
 | |
|     movi    a4, 0x55aa137f
 | |
|     assert  eq, a3, a4
 | |
|     ldinc   m1, a2
 | |
|     movi    a3, 1f + 4
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a3, m1
 | |
|     movi    a4, 0x12345678
 | |
|     assert  eq, a3, a4
 | |
| 
 | |
| .data
 | |
| 1:  .word 0x55aa137f, 0x12345678, 0x137fa5a5
 | |
| .text
 | |
| test_end
 | |
| 
 | |
| test lddec
 | |
|     movi    a2, 1f
 | |
|     lddec   m2, a2
 | |
|     movi    a3, 1f - 4
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a3, m2
 | |
|     movi    a4, 0x12345678
 | |
|     assert  eq, a3, a4
 | |
|     lddec   m3, a2
 | |
|     movi    a3, 1f - 8
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a3, m3
 | |
|     movi    a4, 0x55aa137f
 | |
|     assert  eq, a3, a4
 | |
| .data
 | |
|     .word 0x55aa137f, 0x12345678
 | |
| 1:
 | |
| .text
 | |
| test_end
 | |
| 
 | |
| 
 | |
| .macro test_mulxxx_ld mulop, ldop, comb, w, x, s, t, a, b, iv, op
 | |
|     init_reg \comb & 2, \s, \a
 | |
|     init_reg \comb & 1, \t, \b
 | |
| 
 | |
|     init_acc \iv
 | |
|     \mulop\().ll.\ldop \w, \x, \s, \t
 | |
|     assert_acc_value (\iv \op mul16(\a, \b))
 | |
| 
 | |
|     init_acc \iv
 | |
|     \mulop\().lh.\ldop \w, \x, \s, \t
 | |
|     assert_acc_value (\iv \op mul16(\a, (\b >> 16)))
 | |
| 
 | |
|     init_acc \iv
 | |
|     \mulop\().hl.\ldop \w, \x, \s, \t
 | |
|     assert_acc_value (\iv \op mul16((\a >> 16), \b))
 | |
| 
 | |
|     init_acc \iv
 | |
|     \mulop\().hh.\ldop \w, \x, \s, \t
 | |
|     assert_acc_value (\iv \op mul16((\a >> 16), (\b >> 16)))
 | |
| .endm
 | |
| 
 | |
| test mula_da_ldinc
 | |
|     movi    a2, 1f - 4
 | |
|     test_mulxxx_ld mula.da, ldinc, 2, m1, a2, m1, a3, \
 | |
|         0xf7315a5a, 0xa5a5137f, 0x0ff73155aa, +
 | |
|     movi    a3, 1f + 12
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, m1
 | |
|     movi    a3, 0x12345678
 | |
|     assert  eq, a2, a3
 | |
| .data
 | |
| 1:  .word 0xf7315a5a, 0xf7315a5a, 0xf7315a5a, 0x12345678
 | |
| .text
 | |
| test_end
 | |
| 
 | |
| test mula_dd_ldinc
 | |
|     movi    a2, 1f - 4
 | |
|     test_mulxxx_ld mula.dd, ldinc, 3, m2, a2, m1, m2, \
 | |
|         0xf7315a5a, 0xa5a5137f, 0x0ff73155aa, +
 | |
|     movi    a3, 1f + 12
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, m2
 | |
|     movi    a3, 0x12345678
 | |
|     assert  eq, a2, a3
 | |
| .data
 | |
| 1:  .word 0xa5a5137f, 0xa5a5137f, 0xa5a5137f, 0x12345678
 | |
| .text
 | |
| test_end
 | |
| 
 | |
| test mula_da_lddec
 | |
|     movi    a2, 1f
 | |
|     test_mulxxx_ld mula.da, lddec, 2, m1, a2, m1, a3, \
 | |
|         0xf7315a5a, 0xa5a5137f, 0x0ff73155aa, +
 | |
|     movi    a3, 1f - 16
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, m1
 | |
|     movi    a3, 0x12345678
 | |
|     assert  eq, a2, a3
 | |
| .data
 | |
|     .word 0x12345678, 0xf7315a5a, 0xf7315a5a, 0xf7315a5a
 | |
| 1:
 | |
| .text
 | |
| test_end
 | |
| 
 | |
| test mula_dd_lddec
 | |
|     movi    a2, 1f
 | |
|     test_mulxxx_ld mula.dd, lddec, 3, m2, a2, m1, m2, \
 | |
|         0xf7315a5a, 0xa5a5137f, 0x0ff73155aa, +
 | |
|     movi    a3, 1f - 16
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, m2
 | |
|     movi    a3, 0x12345678
 | |
|     assert  eq, a2, a3
 | |
| .data
 | |
|     .word 0x12345678, 0xa5a5137f, 0xa5a5137f, 0xa5a5137f
 | |
| 1:
 | |
| .text
 | |
| test_end
 | |
| 
 | |
| #endif
 | |
| 
 | |
| test_suite_end
 |