+#\f
+# 02relset.s
+#
+# RELATIONALS ON SETS
+#
+_RELT:
+ cvtbl (r10)+,r5 #r5 has jump opcode
+ cvtwl (r10)+,r1 #r1 has comparison length (bytes)
+ movl r1,r4 #r4 has stack length
+ blbc r4,l0211
+ incl r4
+l0211:
+ addl3 sp,r4,r3 #r3 has addr of lower operand
+ addl2 r3,r4 #r4 points to cleared stack
+ ashl $1,r5,r5 #maintain compatability
+ jsb *settab(r5) #calc condition, return boolean in r0
+ movl r4,sp #reset stack
+ cmpl r5,$20 #check for branch
+ bgtr l0212
+ movw r0,-(sp) #put boolean on stack
+ jmp (r8)
+l0212:
+ tstl r0
+ beql l0213
+ addl2 $2,r10 #continue on true
+ jmp (r8)
+l0213:
+ cvtwl (r10),r0 #skip on false
+ addl2 r0,r10
+ jmp (r8)
+
+ .align 1
+settab: #condition code branch table
+ .long seteq #generate boolean answer
+ .long setne
+ .long setlt
+ .long setgt
+ .long setle
+ .long setge
+ .long seteq #branch on condition false
+ .long setne
+ .long setlt
+ .long setgt
+ .long setle
+ .long setge
+
+setlt:
+ moval 4(sp),r2 #skip over return address
+ ashl $-1,r1,r1
+l0214:
+ bicw3 (r2),(r3),r0
+ bneq false
+ bicw2 (r3)+,(r2)+
+ bneq l0216 #need only check <= for remainder of set
+ sobgtr r1,l0214
+false:
+ clrl r0
+ rsb
+setle:
+ moval 4(sp),r2
+ ashl $-1,r1,r1
+l0215:
+ bicw2 (r2)+,(r3)+
+ bneq false
+l0216:
+ sobgtr r1,l0215
+true:
+ movl $1,r0
+ rsb
+seteq:
+ cmpc3 r1,(r3),4(sp)
+ beql true
+ clrl r0
+ rsb
+setne:
+ cmpc3 r1,(r3),4(sp)
+ bneq true
+ clrl r0
+ rsb
+setgt:
+ moval 4(sp),r2
+ ashl $-1,r1,r1
+l0217:
+ bicw3 (r3),(r2),r0
+ bneq false
+ bicw2 (r2)+,(r3)+
+ bneq l0219 #need only check >= for remainder of set
+ sobgtr r1,l0217
+ clrl r0
+ rsb
+setge:
+ moval 4(sp),r2
+ ashl $-1,r1,r1
+l0218:
+ bicw2 (r3)+,(r2)+
+ bneq false
+l0219:
+ sobgtr r1,l0218
+ movl $1,r0
+ rsb