40 lines
		
	
	
	
		
			439 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			40 lines
		
	
	
	
		
			439 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| .global csb
 | |
| ECASE=20
 | |
| 
 | |
| csb:
 | |
| 		! case descriptor in %o0
 | |
| 		! index in %o1
 | |
| 	ld	[%o0], %o2	! default jump address
 | |
| 	ld	[%o0+4], %o3	! # entries
 | |
| 	inc	8, %o0
 | |
| 	tst	%o3
 | |
| 	be	3f
 | |
| 	nop
 | |
| 	dec	%o3
 | |
| 	set	0xffff, %o4
 | |
| 	and	%o3, %o4, %o5
 | |
| 	sll	%o5, 3, %o3
 | |
| 1:
 | |
| 	ld	[%o0+%o3], %o4
 | |
| 	cmp	%o4, %o1
 | |
| 	be	2f
 | |
| 	nop
 | |
| 	deccc	8, %o3
 | |
| 	bge	1b
 | |
| 	nop
 | |
| 	b	3f
 | |
| 	nop
 | |
| 2:	
 | |
| 	inc	4, %o3
 | |
| 	ld	[%o0+%o3], %o2
 | |
| 3:
 | |
| 	tst	%o2
 | |
| 	be	4f
 | |
| 	nop
 | |
| 	jmp	%o2
 | |
| 	nop
 | |
| 4:
 | |
| 	set	ECASE, %o0
 | |
| 	set	trp, %g1
 | |
| 	jmp	%g1
 | |
| 	nop
 |