39 lines
		
	
	
	
		
			747 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			39 lines
		
	
	
	
		
			747 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
#
 | 
						|
.sect .text; .sect .rom; .sect .data; .sect .bss
 | 
						|
 | 
						|
/*
 | 
						|
 * Create singleton set.
 | 
						|
 * Stack: ( bitnumber size -- set )
 | 
						|
 */
 | 
						|
 | 
						|
.sect .text
 | 
						|
.define .set
 | 
						|
.set:
 | 
						|
	lw r4, 0(sp)        ! r4 = size
 | 
						|
	lw r5, 4(sp)        ! r5 = bit number
 | 
						|
	addiu sp, sp, 8
 | 
						|
	srl r4, r4, 2       ! r4 = word count
 | 
						|
 | 
						|
	! Create an empty set by pushing zeros.
 | 
						|
 | 
						|
1:
 | 
						|
	addiu sp, sp, -4
 | 
						|
	sw zero, 0(sp)
 | 
						|
	addiu r4, r4, -1
 | 
						|
	bne r4, zero, 1b
 | 
						|
	nop
 | 
						|
 | 
						|
	! sp now points at the set.
 | 
						|
 | 
						|
	andi r6, r5, ~31	! r6 = bit offset of base of word in set
 | 
						|
	srl r6,r6, 3        ! r6 = byte offset of word in set
 | 
						|
	addu r6, sp, r6		! r6 = address of word in set
 | 
						|
 | 
						|
	andi r7, r5, 31		! r7 = bit number within word
 | 
						|
	li r8, 1
 | 
						|
	sllv r8, r8, r7     ! r8 = word with 1 set
 | 
						|
	sw r8, 0(r6)        ! write to set
 | 
						|
 | 
						|
	jr ra
 | 
						|
	nop
 | 
						|
 |