#
.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