diff CbC-examples/code_segment_pointer_check/code_segment_pointer_check.cbc @ 27:f9b1a53df341

implemented indirect sibcall for ppc.
author kent@teto.cr.ie.u-ryukyu.ac.jp
date Tue, 10 Nov 2009 16:34:29 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CbC-examples/code_segment_pointer_check/code_segment_pointer_check.cbc	Tue Nov 10 16:34:29 2009 +0900
@@ -0,0 +1,120 @@
+#include<stdio.h>
+#include<stdlib.h>
+#define dprint(f, args...) \
+	printf("in %s env=%p: "f, __FUNCTION__, __builtin_frame_address(0), ## args)
+
+/*
+ * コードセグメント間の遷移で
+ *
+ *
+ *
+ */
+
+__code schedule ();
+__code cs0a ();
+__code cs1a (int a);
+__code cs2a (int a, double b);
+__code cs3a (int a, double b, int c);
+__code cs4a (int a, double b, int c, float d);
+__code cs0b ();
+__code cs1b (int a);
+__code cs2b (int a, double b);
+__code cs3b (int a, double b, int c);
+__code cs4b (int a, double b, int c, float d);
+
+/* defined in file code_segment_pointer_check.cbc at offset 1649  */
+int main ();
+
+__code end(int a) {
+	dprint("exit with code %d\n",a);
+	exit(a);
+}
+
+__code (*cs0) ();
+__code (*cs1) (int);
+__code (*cs2) (int, double);
+__code (*cs3) (int, double, int);
+__code (*cs4) (int, double, int, float);
+int i=0;
+__code schedule() {
+	dprint("i=%d\n",i);
+	if ( i>=100 ) {
+		goto end(0);
+	}
+	switch (i++%5) {
+	case 0:
+		goto cs0();
+	case 1:
+		goto cs1(i);
+	case 2:
+		goto cs2(i, i*1.3);
+	case 3:
+		goto cs3(i, i*1.3, 20*i);
+	case 4:
+		goto cs4(i, i*1.3, 20*i, i*0.8);
+	default:
+		exit(0);
+	}
+	dprint("code unreachable!\n");
+}
+
+__code cs0a() {
+	dprint("no args\n");
+	cs0 = cs0b;
+	goto schedule();
+}
+__code cs1a(int a) {
+	dprint("int a=%d\n", a);
+	cs1 = cs1b;
+	goto schedule();
+}
+__code cs2a(int a, double b) {
+	dprint("int a=%d, double b=%lf\n", a, b);
+	cs2 = cs2b;
+	goto schedule();
+}
+__code cs3a(int a, double b, int c) {
+	dprint("int a=%d, double b=%lf, int c=%d\n", a, b, c);
+	cs3 = cs3b;
+	goto schedule();
+}
+__code cs4a(int a, double b, int c, float d) {
+	dprint("int a=%d, double b=%lf, int c=%d, float d=%f\n", a, b, c, d);
+	cs4 = cs4b;
+	goto schedule();
+}
+
+__code cs0b() {
+	dprint("no args\n");
+	cs0 = cs0a;
+	goto schedule();
+}
+__code cs1b(int a) {
+	dprint("int a=%d\n", a);
+	cs1 = cs1a;
+	goto schedule();
+}
+__code cs2b(int a, double b) {
+	dprint("int a=%d, double b=%lf\n", a, b);
+	cs2 = cs2a;
+	goto schedule();
+}
+__code cs3b(int a, double b, int c) {
+	dprint("int a=%d, double b=%lf, int c=%d\n", a, b, c);
+	cs3 = cs3a;
+	goto schedule();
+}
+__code cs4b(int a, double b, int c, float d) {
+	dprint("int a=%d, double b=%lf, int c=%d, float d=%f\n", a, b, c, d);
+	cs4 = cs4a;
+	goto schedule();
+}
+
+int main() {
+	cs0 = cs0a;
+	cs1 = cs1a;
+	cs2 = cs2a;
+	cs3 = cs3a;
+	cs4 = cs4a;
+	goto schedule();
+}