.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