--- /dev/null
+#
+.sect .text; .sect .rom; .sect .data; .sect .bss
+
+/*
+ * Set comparison Returns 0 if the sets were equal.
+ * Stack: ( a b size -- a!=b )
+ */
+
+.sect .text
+.define .cms
+.cms:
+ lw r4, 0(sp) ! r4 = size; sp points at b-word
+ addu r5, sp, r4 ! r5 points at a-word
+ addu r6, r5, r4 ! r6 is final sp-word
+ srl r4, r4, 2 ! r4 = count of words
+ li r8, 1 ! result
+
+1:
+ lw at, 4(r5) ! load a
+ lw r7, 4(sp) ! load b
+ bne at, r7, exit ! branch if not equal
+ nop
+ addiu r5, r5, 4
+ addiu sp, sp, 4
+ addiu r4, r4, -1
+ bne r4, zero, 1b
+ nop
+
+ li r8, 0 ! Update result.
+exit:
+ mov sp, r6
+ sw r8, 0(sp)
+ jr ra
+ nop
+
--- /dev/null
+#
+ mes 2, EM_WSIZE, EM_PSIZE
+
+ exp $_m_a_i_n
+ pro $_m_a_i_n, 0
+
+ /* Compare equal word sets. */
+
+word
+ rom EM_WSIZE
+
+ loc 1
+ loc 1
+ loe word /* to defeat constant folding */
+ cms
+ zeq *1
+
+ loc __LINE__
+ cal $fail
+ asp 4
+1
+
+ /* Compare non-equal word sets. */
+
+ loc 1
+ loc 2
+ loe word /* to defeat constant folding */
+ cms
+ zne *2
+
+ loc __LINE__
+ cal $fail
+ asp 4
+2
+
+ /* Compare equal triple-word sets. */
+
+ loc 1
+ loc 2
+ loc 3
+ loc 1
+ loc 2
+ loc 3
+ loe word /* to defeat constant folding */
+ loc 3
+ mli EM_WSIZE
+ cms
+ zeq *3
+
+ loc __LINE__
+ cal $fail
+ asp 4
+3
+
+ /* Compare non-equal triple-word sets. */
+
+ loc 1
+ loc 2
+ loc 3
+ loc 1
+ loc 2
+ loc 4
+ loe word /* to defeat constant folding */
+ loc 3
+ mli EM_WSIZE
+ cms
+ zne *4
+
+ loc __LINE__
+ cal $fail
+ asp 4
+4
+
+ cal $finished
+ end