skip the tests which use floating point instructions (as their emulators don't support them).
		
			
				
	
	
		
			186 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			186 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
#
 | 
						|
    mes 2, EM_WSIZE, EM_PSIZE
 | 
						|
 | 
						|
/*
 | 
						|
 * Uses _rck_ for range checks.  Catches the EM trap if a value is out
 | 
						|
 * of range, and continues with the next instruction after _rck_.
 | 
						|
 *
 | 
						|
 * Some back ends, like i80, ignore _rck_, so this test fails.
 | 
						|
 */
 | 
						|
 | 
						|
testnr
 | 
						|
    con 1         ; test number
 | 
						|
caught
 | 
						|
    con 0         ; number of caught traps
 | 
						|
 | 
						|
    inp $next
 | 
						|
    inp $catch
 | 
						|
    inp $never
 | 
						|
    exp $_m_a_i_n
 | 
						|
    pro $_m_a_i_n,0
 | 
						|
 | 
						|
    lim           ; load ignore mask
 | 
						|
    loc 2
 | 
						|
    and EM_WSIZE  ; check bit 1 << ERANGE
 | 
						|
    zeq *1        ; fail if ignoring ERANGE
 | 
						|
.1
 | 
						|
    rom 1I4
 | 
						|
    lae .1
 | 
						|
    loi 4
 | 
						|
    cal $fail
 | 
						|
    asp 4
 | 
						|
1
 | 
						|
 | 
						|
    cal $next     ; increment testnr, catch next trap
 | 
						|
    loc 10125
 | 
						|
.2
 | 
						|
    rom 4283, 13644
 | 
						|
    lae .2
 | 
						|
    rck EM_WSIZE  ; testnr 2 in range
 | 
						|
    asp EM_WSIZE
 | 
						|
 | 
						|
    cal $next
 | 
						|
    loc 4282
 | 
						|
    lae .2
 | 
						|
    rck EM_WSIZE  ; testnr 3 out of range
 | 
						|
    asp EM_WSIZE
 | 
						|
 | 
						|
    cal $next
 | 
						|
    loc 4283
 | 
						|
    lae .2
 | 
						|
    rck EM_WSIZE  ; testnr 4 in range
 | 
						|
    asp EM_WSIZE
 | 
						|
 | 
						|
    cal $next
 | 
						|
    loc 13644
 | 
						|
    lae .2
 | 
						|
    rck EM_WSIZE  ; testnr 5 in range
 | 
						|
    asp EM_WSIZE
 | 
						|
 | 
						|
    cal $next
 | 
						|
    loc 13655
 | 
						|
    lae .2
 | 
						|
    rck EM_WSIZE  ; testnr 6 out of range
 | 
						|
    asp EM_WSIZE
 | 
						|
 | 
						|
    cal $next
 | 
						|
    loc -13015
 | 
						|
.7
 | 
						|
    rom -31344, -1898
 | 
						|
    lae .7
 | 
						|
    rck EM_WSIZE  ; testnr 7 in range
 | 
						|
    asp EM_WSIZE
 | 
						|
 | 
						|
    cal $next
 | 
						|
    loc 8580
 | 
						|
.8
 | 
						|
    rom -26315, 4588
 | 
						|
    lae .8
 | 
						|
    rck EM_WSIZE  ; testnr 8 out of range
 | 
						|
    asp EM_WSIZE
 | 
						|
 | 
						|
    ; The last test raised a trap, so now there is no trap handler.
 | 
						|
    lpi $never
 | 
						|
    sig           ; push old trap handler
 | 
						|
    loc 0
 | 
						|
    loc EM_WSIZE
 | 
						|
    loc EM_PSIZE
 | 
						|
    cuu           ; push NULL pointer
 | 
						|
    cmp
 | 
						|
    zeq *17       ; fail unless old handler is NULL
 | 
						|
.17
 | 
						|
    rom 17I4
 | 
						|
    lae .17
 | 
						|
    loi 4
 | 
						|
    cal $fail
 | 
						|
    asp 4
 | 
						|
17
 | 
						|
    ; Change the trap handler from $never to $catch.
 | 
						|
    lpi $catch
 | 
						|
    sig
 | 
						|
    lpi $never
 | 
						|
    cmp
 | 
						|
    zeq *18
 | 
						|
.18
 | 
						|
    rom 18I4
 | 
						|
    lae .18
 | 
						|
    loi 4
 | 
						|
    cal $fail
 | 
						|
    asp 4
 | 
						|
18
 | 
						|
    ; Begin ignoring range traps.
 | 
						|
    loc 2         ; 1 << ERANGE
 | 
						|
    sim
 | 
						|
    loc 18
 | 
						|
    ste testnr
 | 
						|
    loc 8580
 | 
						|
    lae .8
 | 
						|
    rck EM_WSIZE  ; testnr 18 out of range but ignored
 | 
						|
 | 
						|
    ; Fail if we caught the wrong number of traps.
 | 
						|
    loe caught
 | 
						|
    loc 3
 | 
						|
    beq *20
 | 
						|
.20
 | 
						|
    rom 20I4
 | 
						|
    lae .20
 | 
						|
    loi 4
 | 
						|
    cal $fail
 | 
						|
    asp 4
 | 
						|
20
 | 
						|
    cal $finished
 | 
						|
    end
 | 
						|
 | 
						|
    pro $next,0
 | 
						|
    ine testnr    ; next test
 | 
						|
    lpi $catch
 | 
						|
    sig           ; catch next EM trap (only one trap)
 | 
						|
    asp EM_PSIZE
 | 
						|
    ret 0
 | 
						|
    end
 | 
						|
 | 
						|
    pro $catch,0
 | 
						|
    ine caught    ; count this trap
 | 
						|
 | 
						|
    lol 0         ; load trap number
 | 
						|
    loc 1
 | 
						|
    beq *1        ; fail if trap != ERANGE
 | 
						|
.101
 | 
						|
    rom 257I4
 | 
						|
    lae .101
 | 
						|
    loi 4
 | 
						|
    cal $fail
 | 
						|
    ; Wrong type of trap.  _rtt_ might not work, so exit now.
 | 
						|
    cal $finished
 | 
						|
1
 | 
						|
    ; Fail if the wrong test raised this trap.
 | 
						|
    loe testnr
 | 
						|
    loc 3
 | 
						|
    beq *2
 | 
						|
    loe testnr
 | 
						|
    loc 6
 | 
						|
    beq *2
 | 
						|
    loe testnr
 | 
						|
    loc 8
 | 
						|
    beq *2
 | 
						|
    loc 256
 | 
						|
    loe testnr
 | 
						|
    adi EM_WSIZE  ; 0x100 + testnr
 | 
						|
    loc EM_WSIZE
 | 
						|
    loc 4
 | 
						|
    cuu
 | 
						|
    cal $fail
 | 
						|
    asp 4
 | 
						|
2
 | 
						|
    rtt           ; return from trap handler
 | 
						|
    end
 | 
						|
 | 
						|
    pro $never,0
 | 
						|
.200
 | 
						|
    rom 200I4
 | 
						|
    lae .200
 | 
						|
    loi 4
 | 
						|
    cal $fail
 | 
						|
    asp 4
 | 
						|
    rtt
 | 
						|
    end
 |