massively fail).
--- /dev/null
+#
+.sect .text; .sect .rom; .sect .data; .sect .bss
+
+/*
+ * Set intersection.
+ * Stack: ( a b size -- a&b )
+ */
+
+.sect .text
+.define .and
+.and:
+ lw r4, 0(sp) ! r4 = size
+ addiu sp, sp, 4 ! sp points at b
+ addu r5, sp, r4 ! r5 points at a
+ srl r4, r4, 2 ! r4 = count of words
+
+1:
+ lw at, 0(r5) ! load a
+ lw r6, 0(sp) ! load b
+ and at, at, r6 ! combine
+ sw at, 0(r5) ! write back to a
+ addiu r5, r5, 4
+ addiu sp, sp, 4
+ addiu r4, r4, -1
+ bne r4, zero, 1b
+ nop
+
+ jr ra
+ nop
+
--- /dev/null
+#
+.sect .text; .sect .rom; .sect .data; .sect .bss
+
+/*
+ * Set complement.
+ * Stack: ( a size -- ~a )
+ */
+
+.sect .text
+.define .com
+.com:
+ lw r4, 0(sp) ! r4 = size
+ addiu sp, sp, 4
+ mov r5, sp ! r5 points to set
+ srl r4, r4, 2 ! r4 = word count
+
+1:
+ lw at, 0(r5)
+ nor at, zero, at
+ sw at, 0(r5)
+ addiu r5, r5, 4
+ addiu r4, r4, -1
+ bne r4, zero, 1b
+
+ jr ra
+ nop
+
--- /dev/null
+#
+.sect .text; .sect .rom; .sect .data; .sect .bss
+
+/*
+ * Set union.
+ * Stack: ( a b size -- a|b )
+ */
+
+.sect .text
+.define .ior
+.ior:
+ lw r4, 0(sp) ! r4 = size
+ addiu sp, sp, 4 ! sp points at b
+ addu r5, sp, r4 ! r5 points at a
+ srl r4, r4, 2 ! r4 = count of words
+
+1:
+ lw at, 0(r5) ! load a
+ lw r6, 0(sp) ! load b
+ or at, at, r6 ! combine
+ sw at, 0(r5) ! write back to a
+ addiu r5, r5, 4
+ addiu sp, sp, 4
+ addiu r4, r4, -1
+ bne r4, zero, 1b
+ nop
+
+ jr ra
+ nop
+
--- /dev/null
+#
+.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, 4
+ srl r4, r4, 2 ! r4 = word count
+
+ ! Create an empty set.
+
+1:
+ addiu sp, sp, -4
+ sw zero, 0(sp)
+ addiu r4, r4, -1
+ bne r4, zero, 1b
+
+ ! sp now points at the set.
+
+ srl r6, r5, 3 ! r6 = offset of word in set
+ addu r6, sp, r6 ! r6 = address of word in set
+
+ ext r7, r5, 0, 3 ! 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
+
--- /dev/null
+#
+.sect .text; .sect .rom; .sect .data; .sect .bss
+
+/*
+ * Create empty set.
+ * Stack: ( size -- set )
+ */
+
+.sect .text
+.define .zer
+.zer:
+ lw r4, 0(sp) ! r4 = size
+ addiu sp, sp, 4
+ srl r4, r4, 2 ! r4 = word count
+
+1:
+ addiu sp, sp, -4
+ sw zero, 0(sp)
+ addiu r4, r4, -1
+ bne r4, zero, 1b
+
+ jr ra
+ nop
+