pdp11: udivhi3 helper
authorAlan Cox <alan@linux.intel.com>
Sun, 18 Feb 2018 14:01:56 +0000 (14:01 +0000)
committerAlan Cox <alan@linux.intel.com>
Sun, 18 Feb 2018 14:01:56 +0000 (14:01 +0000)
Library/libs/udivhi3_pdp11.S [new file with mode: 0644]

diff --git a/Library/libs/udivhi3_pdp11.S b/Library/libs/udivhi3_pdp11.S
new file mode 100644 (file)
index 0000000..52c0542
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ *     The PDP 11 have a signed divide (except early machines) but not an
+ *     unsigned one. For some reason the PDP-11 gcc support lib forgets to
+ *     include this helper so we use our own
+ *
+ *     There are faster divide algorithms based upon lookup tables but they
+ *     take a lot more memory.
+ *
+ *     WARNING: untested at this point
+ */
+       .text
+       .even
+
+       .globl ___divmodhi3
+       .globl ___umodhi3
+       .globl ___udivhi3
+/*
+ *     Maybe should panic ?
+ */
+divide_zero:
+       clr r0
+       clr r1
+       rts pc
+
+divops:
+       mov $1,r0
+       clr r1
+       tst r3
+       beq divide_zero
+align:
+       cmp r2,r3
+       bhis divide     /* if its bigger we are done */
+       bmi divide      /* if the top bit is set we are done */
+       tst r0
+       beq divide      /* and if we ran out of bits it is done */
+       asl r0
+       asl r3
+       br align
+divide:
+       tst r0          /* keep going until we've dealt with each bit we
+                          set in the first pass */
+       beq donediv
+       cmp r3,r2
+       blo wentover
+       sub r3,r2       /* set the bit and account for that chunk */
+       bis r0,r1
+wentover:
+       clc
+       ror r0
+       clc
+       ror r3
+       br divide
+donediv:
+       mov r2,r1       /* makes it easier to handle */
+       rts pc
+
+/*
+ *     Basically a C wrapper around the helper that returns the answer
+ *     in r0 and r1.
+ *
+ *     For the later machines I'm not clear if this or somehow mangling div
+ *     into udiv is faster.
+ */
+___divmodhi3:
+       mov r2,-(sp)
+       mov r3,-(sp)
+       mov 8(sp),r2
+       mov 10(sp),r3
+       jsr pc,divops
+       mov (sp)+,r3
+       mov (sp)+,r2
+       rts pc
+/*
+ *     And we get both forms just by looking at r0 or r1
+ */
+___umodhi3:
+       jsr pc,___divmodhi3
+       mov r1,r0
+       rts pc
+___udivhi3:
+       jsr pc,___divmodhi3
+       rts pc