From 0ce368324ed41b03f37c9a8dcd4eba5631fc7447 Mon Sep 17 00:00:00 2001 From: David Given Date: Mon, 10 Sep 2018 23:37:28 +0200 Subject: [PATCH] Add the bitset helpers. We now have enough helpers for the tests to run (and massively fail). --- mach/mips/libem/and.s | 30 ++++++++++++++++++++++++++++++ mach/mips/libem/com.s | 27 +++++++++++++++++++++++++++ mach/mips/libem/ior.s | 30 ++++++++++++++++++++++++++++++ mach/mips/libem/set.s | 37 +++++++++++++++++++++++++++++++++++++ mach/mips/libem/zer.s | 24 ++++++++++++++++++++++++ 5 files changed, 148 insertions(+) create mode 100644 mach/mips/libem/and.s create mode 100644 mach/mips/libem/com.s create mode 100644 mach/mips/libem/ior.s create mode 100644 mach/mips/libem/set.s create mode 100644 mach/mips/libem/zer.s diff --git a/mach/mips/libem/and.s b/mach/mips/libem/and.s new file mode 100644 index 000000000..5f0eacb2c --- /dev/null +++ b/mach/mips/libem/and.s @@ -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 index 000000000..fae0d64e5 --- /dev/null +++ b/mach/mips/libem/com.s @@ -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 index 000000000..df2828dfe --- /dev/null +++ b/mach/mips/libem/ior.s @@ -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 index 000000000..01a6ff654 --- /dev/null +++ b/mach/mips/libem/set.s @@ -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 index 000000000..6941d340b --- /dev/null +++ b/mach/mips/libem/zer.s @@ -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 +