Mercurial > hg > CbC > CbC_examples
annotate ljtes/ljtes_as2.c @ 24:19160c497905
lj_as2: can compile -O2 (can't execute)
author | Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 31 Jan 2016 19:37:36 +0900 |
parents | facab2ddc380 |
children | 6324b8df04f1 |
rev | line source |
---|---|
23
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1 #ifdef GCC |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
2 #define __environment _CbC_environment |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
3 #define __return _CbC_return |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
4 #endif |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
5 |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
6 #define LOOP 5000000 |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
7 |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
8 #include <stdio.h> |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
9 struct __CbC_env{ |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
10 void *ret_p,*env; |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
11 }; |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
12 |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
13 int save_env(void *env); |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
14 |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
15 __code factorial(int n,int result,int orig,__code(*print)(int,int,int,__code(*)(),void*), void *exit1env) |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
16 { |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
17 if (n<0) { |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
18 printf("#0008:err %d!\n",n); |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
19 goto return_cs(0,exit1env); |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
20 } |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
21 if (n==0) |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
22 goto (*print)(n,result,orig,print,exit1env); |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
23 else { |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
24 result += n; |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
25 n--; |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
26 goto factorial(n,result,orig,print,exit1env); |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
27 } |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
28 } |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
29 |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
30 |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
31 int calc(int n){ |
24
19160c497905
lj_as2: can compile -O2 (can't execute)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
32 volatile void *env = ({ |
19160c497905
lj_as2: can compile -O2 (can't execute)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
33 volatile struct __CbC_env __CbC_environment; |
23
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
34 env = &__CbC_environment; |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
35 jmp_buf env_buf; |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
36 int retval; |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
37 __CbC_environment.ret_p = &retval; |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
38 __CbC_environment.env = &env_buf; |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
39 if (save_env(__CbC_environment.env)){ |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
40 return retval; |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
41 } |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
42 &__CbC_environment; |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
43 }); |
24
19160c497905
lj_as2: can compile -O2 (can't execute)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
44 goto factorial(n,1,n,print,(void*)env); |
23
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
45 return 0; |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
46 } |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
47 |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
48 int main( int ac, char *av[]) |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
49 { |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
50 int i; |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
51 long ans; |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
52 for(i=LOOP,ans=0;i>0;i--){ |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
53 int a = calc(10); |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
54 ans += a; |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
55 } |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
56 |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
57 printf("%ld\n",ans); |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
58 } |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
59 |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
60 int save_env(void *env){ |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
61 asm volatile( |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
62 "movq %%rbp,(%%rdi);" // env.env[1] = %rbp; frame pointer |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
63 "movq (%%rsp), %%rax;" // get return addres |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
64 "movq %%rax, 0x8(%%rdi);" // set return addres |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
65 "popq %%rax;" // fix stack pointer |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
66 "movq %%rsp, 0x10(%%rdi);" // set stack pointer |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
67 "movl $0, %%eax;" // set return value |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
68 "jmpq *0x8(%%rdi);" // return |
24
19160c497905
lj_as2: can compile -O2 (can't execute)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
69 :"+D"(env)::"rax"); |
23
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
70 return 0; |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
71 } |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
72 |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
73 __code return_cs(int val, void* env){ |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
74 asm volatile( |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
75 "movq (%%rdi), %%r10;" // %r10 = env.ret_p (return value) |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
76 "movq %%rcx ,(%%r10);" // set return value |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
77 "movq 0x8(%%rdi), %%r10;" // %r10 = env.env (environment) |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
78 "movq (%%r10), %%rbp;" // restore frame pointer |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
79 "movq 0x10(%%r10), %%rsp;" // restore stack pointer |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
80 "movl $1, %%eax;" // set return value |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
81 "jmpq *0x8(%%r10);" // return |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
82 :"+D"(env):"c"(val):"r10","eax"); |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
83 } |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
84 |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
85 __code print(int n,int result,int orig,__code(*print)(),void*exit1env) |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
86 { |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
87 goto return_cs(result, exit1env); |
facab2ddc380
remove label (segmentation fault when -O2)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
88 } |