--- /dev/null
+#
+/*
+ * VideoCore IV support library for the ACK
+ * © 2013 David Given
+ * This file is redistributable under the terms of the 3-clause BSD license.
+ * See the file 'Copying' in the root of the distribution for the full text.
+ */
+
+#include "videocore.h"
+
+.define .csb
+.sect .data
+.csb:
+ ! on entry:
+ ! r0 = un-fixed-up descriptor
+ ! r1 = value
+ add r0, gp ! r0 = fixed up descriptor
+
+ adds8 r2, r0, #1 ! r2 = moving pointer
+ ld r3, 4 (r0) ! r3 = count
+ adds8 r3, r0, r3 ! r3 = end ptr
+
+loop:
+ ld r4, (r2)++
+ b.eq r4, r1, matched ! r2 points at matching addr
+ addcmpb.le r2, #4, r3, loop
+notmatched:
+ mov r2, r0 ! r2 points at default jump
+matched:
+ ld r2, (r2) ! load destination address
+ add r2, gp ! fix up r2
+ b r2 ! ...and go
+
pat csa /* Array-lookup switch */
with GPR0 GPR1 STACK
+ kills ALL
gen
b {LABEL, ".csa"}
pat csb /* Table-lookup switch */
- with STACK
+ with GPR0 GPR1 STACK
+ kills ALL
gen
bl {LABEL, ".csb"}
pat loc loc cfi $1==$2 && $1==QUAD /* Convert float -> integer */
leaving
+ loc 0
+#if 0
cal ".cfi"
lfr QUAD
+#endif
pat loc loc cfu $1==$2 && $1==QUAD /* Convert float -> unsigned */
leaving
+ loc 0
+#if 0
cal ".cfu"
lfr QUAD
+#endif
pat loc loc cif $1==$2 && $1==QUAD /* Convert integer -> float */
leaving
+ loc 0
+#if 0
cal ".cif"
lfr QUAD
+#endif
pat loc loc cuf $1==$2 && $1==QUAD /* Convert unsigned -> float */
leaving
+ loc 0
+#if 0
cal ".cuf"
lfr QUAD
+#endif
pat fef /* Split float */
leaving
+ loc 0
+ loc 0
+#if 0
cal ".cuf"
lfr QUAD*2
+#endif
pat fif /* Multiply float and split (?) */
leaving