33 lines
		
	
	
	
		
			678 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			33 lines
		
	
	
	
		
			678 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
.sect .text
 | 
						|
 | 
						|
! Create singleton set.
 | 
						|
!  Stack: ( bitnumber size -- set )
 | 
						|
!
 | 
						|
! Some back ends trap ESET if bitnumber is out of range.  We don't
 | 
						|
! because the compilers tend to pass a valid bitnumber.
 | 
						|
 | 
						|
.define .set
 | 
						|
.set:
 | 
						|
	lwz     r3, 0 (sp)
 | 
						|
	lwz     r4, 4 (sp)
 | 
						|
	addi    sp, sp, 8
 | 
						|
 | 
						|
	srwi	r7, r3, 2
 | 
						|
	neg	r5, r3
 | 
						|
	add	sp, sp, r5		! allocate set
 | 
						|
	mr	r6, sp			! r6 = ptr to set
 | 
						|
	mtspr	ctr, r7			! ctr = r3 / 4
 | 
						|
1:
 | 
						|
	clrrwi.	r7, r4, 5		! r7 = r4 & ~31
 | 
						|
	beq	2f			! branch if r4 in 0..31
 | 
						|
	li	r5, 0			! no bit, word is zero
 | 
						|
	b	3f
 | 
						|
2:
 | 
						|
	li	r5, 1
 | 
						|
	slw	r5, r5, r4		! yes bit, set bit in word
 | 
						|
3:
 | 
						|
	stw	r5, 0(r6)		! store word in set
 | 
						|
	addi	r4, r4, -32
 | 
						|
	addi	r6, r6, 4
 | 
						|
	bdnz	1b			! loop ctr times
 | 
						|
	blr
 |