Add the bitset helpers. We now have enough helpers for the tests to run (and
authorDavid Given <dg@cowlark.com>
Mon, 10 Sep 2018 21:37:28 +0000 (23:37 +0200)
committerDavid Given <dg@cowlark.com>
Mon, 10 Sep 2018 21:37:28 +0000 (23:37 +0200)
massively fail).

mach/mips/libem/and.s [new file with mode: 0644]
mach/mips/libem/com.s [new file with mode: 0644]
mach/mips/libem/ior.s [new file with mode: 0644]
mach/mips/libem/set.s [new file with mode: 0644]
mach/mips/libem/zer.s [new file with mode: 0644]

diff --git a/mach/mips/libem/and.s b/mach/mips/libem/and.s
new file mode 100644 (file)
index 0000000..5f0eacb
--- /dev/null
@@ -0,0 +1,30 @@
+#
+.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
+
diff --git a/mach/mips/libem/com.s b/mach/mips/libem/com.s
new file mode 100644 (file)
index 0000000..fae0d64
--- /dev/null
@@ -0,0 +1,27 @@
+#
+.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
+
diff --git a/mach/mips/libem/ior.s b/mach/mips/libem/ior.s
new file mode 100644 (file)
index 0000000..df2828d
--- /dev/null
@@ -0,0 +1,30 @@
+#
+.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
+
diff --git a/mach/mips/libem/set.s b/mach/mips/libem/set.s
new file mode 100644 (file)
index 0000000..01a6ff6
--- /dev/null
@@ -0,0 +1,37 @@
+#
+.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
+
diff --git a/mach/mips/libem/zer.s b/mach/mips/libem/zer.s
new file mode 100644 (file)
index 0000000..6941d34
--- /dev/null
@@ -0,0 +1,24 @@
+#
+.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
+