]> git.donarmstrong.com Git - lilypond.git/blobdiff - guile18/qt/md/arm.h
Import guile-1.8 as multiple upstream tarball component
[lilypond.git] / guile18 / qt / md / arm.h
diff --git a/guile18/qt/md/arm.h b/guile18/qt/md/arm.h
new file mode 100644 (file)
index 0000000..016cbb8
--- /dev/null
@@ -0,0 +1,96 @@
+/*
+ * QuickThreads -- Threads-building toolkit.
+ * Copyright (c) 1993 by David Keppel
+ * Copyright (c) 2002 by Marius Vollmer
+ *
+ * Permission to use, copy, modify and distribute this software and
+ * its documentation for any purpose and without fee is hereby
+ * granted, provided that the above copyright notice and this notice
+ * appear in all copies.  This software is provided as a
+ * proof-of-concept and for demonstration purposes; there is no
+ * representation about the suitability of this software for any
+ * purpose.
+ */
+
+#ifndef QT_ARM_H
+#define QT_ARM_H
+
+typedef unsigned long qt_word_t;
+
+#define QT_GROW_DOWN
+
+/* Stack layout on the ARM:
+
+   Callee-save registers are: r4-r11 (f4-f7)
+   Also save r14, link register, and restore as pc.
+
+   +---
+   | lr/pc
+   | r11
+   | r10
+   | r9
+   | r8
+   | r7
+   | r6
+   | r5
+   | r4      <- sp of a suspended thread
+   +---
+
+   Startup:
+
+   +---
+   | only
+   | user
+   | argt
+   | argu    <- sp on entry to qt_start
+   +---
+   | pc      == qt_start
+   | r11
+   | r10
+   | r9
+   | r8
+   | r7
+   | r6
+   | r5
+   | r4
+   +---
+
+*/
+
+/* Stack must be word aligned. */
+#define QT_STKALIGN    (4)     /* Doubleword aligned. */
+
+/* How much space is allocated to hold all the crud for
+   initialization: r4-r11, r14, and the four args for qt_start. */
+
+#define QT_STKBASE     ((9+4)*4)
+
+
+/* Offsets of various registers, in words, relative to final value of SP. */
+#define QT_LR           8
+#define QT_11           7
+#define QT_10           6
+#define QT_9            5
+#define QT_8            4
+#define QT_7            3
+#define QT_6            2
+#define QT_5            1
+#define QT_4            0
+
+
+/* When a never-before-run thread is restored, the return pc points
+   to a fragment of code that starts the thread running.  For
+   non-vargs functions, it just calls the client's `only' function.
+ */
+
+extern void qt_start(void);
+#define QT_ARGS_MD(sp) (QT_SPUT (sp, QT_LR, qt_start))
+
+
+/* The *index* (positive offset) of where to put each value. */
+#define QT_ONLY_INDEX  (12)
+#define QT_USER_INDEX  (11)
+#define QT_ARGT_INDEX  (10)
+#define QT_ARGU_INDEX  (9)
+
+#endif /* ndef QT_ARM_H */