Rev 82 | Rev 94 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 82 | Rev 83 | ||
---|---|---|---|
Line 30... | Line 30... | ||
30 | 30 | ||
31 | .global context_save |
31 | .global context_save |
32 | .global context_restore |
32 | .global context_restore |
33 | 33 | ||
34 | context_save: |
34 | context_save: |
35 | alloc loc0 = ar.pfs, 1, 9, 0, 0 |
35 | alloc loc0 = ar.pfs, 1, 10, 0, 0 |
- | 36 | mov loc1 = ar.unat ;; |
|
- | 37 | ||
- | 38 | st8 [in0] = loc0, 8 ;; /* save ar.pfs */ |
|
- | 39 | st8 [in0] = loc1, 8 ;; /* save ar.unat (caller) */ |
|
- | 40 | mov loc2 = in0 ;; |
|
- | 41 | add in0 = 8, in0 ;; /* skip ar.unat (callee) */ |
|
36 | 42 | ||
37 | /* |
43 | /* |
38 | * TODO: save the rest of the context registers. |
44 | * TODO: save the rest of the context registers. |
39 | */ |
45 | */ |
40 | 46 | ||
41 | /* |
47 | /* |
42 | * Save general registers |
48 | * Save general registers including NaT bits |
43 | */ |
49 | */ |
44 | st8 [in0] = r1, 8 ;; |
50 | st8.spill [in0] = r1, 8 ;; |
45 | st8 [in0] = r2, 8 ;; |
51 | st8.spill [in0] = r2, 8 ;; |
46 | st8 [in0] = r3, 8 ;; |
52 | st8.spill [in0] = r3, 8 ;; |
47 | st8 [in0] = r4, 8 ;; |
53 | st8.spill [in0] = r4, 8 ;; |
48 | st8 [in0] = r5, 8 ;; |
54 | st8.spill [in0] = r5, 8 ;; |
49 | st8 [in0] = r6, 8 ;; |
55 | st8.spill [in0] = r6, 8 ;; |
50 | st8 [in0] = r7, 8 ;; |
56 | st8.spill [in0] = r7, 8 ;; |
51 | st8 [in0] = r8, 8 ;; |
57 | st8.spill [in0] = r8, 8 ;; |
52 | st8 [in0] = r9, 8 ;; |
58 | st8.spill [in0] = r9, 8 ;; |
53 | st8 [in0] = r10, 8 ;; |
59 | st8.spill [in0] = r10, 8 ;; |
54 | st8 [in0] = r11, 8 ;; |
60 | st8.spill [in0] = r11, 8 ;; |
55 | st8 [in0] = r12, 8 ;; /* save sp */ |
61 | st8.spill [in0] = r12, 8 ;; /* save sp */ |
56 | st8 [in0] = r13, 8 ;; |
62 | st8.spill [in0] = r13, 8 ;; |
57 | st8 [in0] = r14, 8 ;; |
63 | st8.spill [in0] = r14, 8 ;; |
58 | st8 [in0] = r15, 8 ;; |
64 | st8.spill [in0] = r15, 8 ;; |
59 | st8 [in0] = r16, 8 ;; |
65 | st8.spill [in0] = r16, 8 ;; |
60 | st8 [in0] = r17, 8 ;; |
66 | st8.spill [in0] = r17, 8 ;; |
61 | st8 [in0] = r18, 8 ;; |
67 | st8.spill [in0] = r18, 8 ;; |
62 | st8 [in0] = r19, 8 ;; |
68 | st8.spill [in0] = r19, 8 ;; |
63 | st8 [in0] = r20, 8 ;; |
69 | st8.spill [in0] = r20, 8 ;; |
64 | st8 [in0] = r21, 8 ;; |
70 | st8.spill [in0] = r21, 8 ;; |
65 | st8 [in0] = r22, 8 ;; |
71 | st8.spill [in0] = r22, 8 ;; |
66 | st8 [in0] = r23, 8 ;; |
72 | st8.spill [in0] = r23, 8 ;; |
67 | st8 [in0] = r24, 8 ;; |
73 | st8.spill [in0] = r24, 8 ;; |
68 | st8 [in0] = r25, 8 ;; |
74 | st8.spill [in0] = r25, 8 ;; |
69 | st8 [in0] = r26, 8 ;; |
75 | st8.spill [in0] = r26, 8 ;; |
70 | st8 [in0] = r27, 8 ;; |
76 | st8.spill [in0] = r27, 8 ;; |
71 | st8 [in0] = r28, 8 ;; |
77 | st8.spill [in0] = r28, 8 ;; |
72 | st8 [in0] = r29, 8 ;; |
78 | st8.spill [in0] = r29, 8 ;; |
73 | st8 [in0] = r30, 8 ;; |
79 | st8.spill [in0] = r30, 8 ;; |
74 | st8 [in0] = r31, 8 ;; |
80 | st8.spill [in0] = r31, 8 ;; |
- | 81 | ||
- | 82 | mov loc3 = ar.unat ;; |
|
- | 83 | st8 [loc2] = loc3 /* save ar.unat (callee) */ |
|
75 | 84 | ||
76 | /* |
85 | /* |
77 | * Save branch registers |
86 | * Save branch registers |
78 | */ |
87 | */ |
79 | mov loc1 = b0 ;; |
88 | mov loc2 = b0 ;; |
80 | st8 [in0] = loc1, 8 /* save pc */ |
89 | st8 [in0] = loc2, 8 /* save pc */ |
81 | mov loc2 = b1 ;; |
- | |
82 | st8 [in0] = loc2, 8 |
- | |
83 | mov loc3 = b2 ;; |
90 | mov loc3 = b1 ;; |
84 | st8 [in0] = loc3, 8 |
91 | st8 [in0] = loc3, 8 |
85 | mov loc4 = b3 ;; |
92 | mov loc4 = b2 ;; |
86 | st8 [in0] = loc4, 8 |
93 | st8 [in0] = loc4, 8 |
87 | mov loc5 = b4 ;; |
94 | mov loc5 = b3 ;; |
88 | st8 [in0] = loc5, 8 |
95 | st8 [in0] = loc5, 8 |
89 | mov loc6 = b5 ;; |
96 | mov loc6 = b4 ;; |
90 | st8 [in0] = loc6, 8 |
97 | st8 [in0] = loc6, 8 |
91 | mov loc7 = b6 ;; |
98 | mov loc7 = b5 ;; |
92 | st8 [in0] = loc7, 8 |
99 | st8 [in0] = loc7, 8 |
93 | mov loc8 = b7 ;; |
100 | mov loc8 = b6 ;; |
94 | st8 [in0] = loc8, 8 |
101 | st8 [in0] = loc8, 8 |
- | 102 | mov loc9 = b7 ;; |
|
- | 103 | st8 [in0] = loc9, 8 |
|
95 | 104 | ||
96 | /* |
105 | /* |
97 | * Save predicate registers |
106 | * Save predicate registers |
98 | */ |
107 | */ |
99 | mov loc1 = pr ;; |
108 | mov loc2 = pr ;; |
100 | st8 [in0] = loc1, 8 |
109 | st8 [in0] = loc2, 8 |
101 | 110 | ||
102 | mov ar.pfs = loc0 |
111 | mov ar.pfs = loc0 |
- | 112 | mov ar.unat = loc1 |
|
103 | 113 | ||
104 | add r8 = r0, r0, 1 /* context_save returns 1 */ |
114 | add r8 = r0, r0, 1 /* context_save returns 1 */ |
105 | br.ret.sptk.many b0 |
115 | br.ret.sptk.many b0 |
106 | 116 | ||
107 | context_restore: |
117 | context_restore: |
108 | alloc loc0 = ar.pfs, 1, 9, 0, 0 |
118 | alloc loc0 = ar.pfs, 1, 10, 0, 0 ;; |
109 | 119 | ||
110 | /* |
120 | /* |
111 | * TODO: restore the rest of the context registers. |
121 | * TODO: restore the rest of the context registers. |
112 | */ |
122 | */ |
113 | 123 | ||
- | 124 | ld8 loc0 = [in0], 8 ;; /* load pfs */ |
|
- | 125 | ld8 loc1 = [in0], 8 ;; /* load unat (caller) */ |
|
- | 126 | ld8 loc2 = [in0], 8 ;; /* load unat (callee) */ |
|
- | 127 | ||
- | 128 | mov ar.unat = loc2 ;; |
|
- | 129 | ||
114 | /* |
130 | /* |
115 | * Restore general registers |
131 | * Restore general registers including NaT bits |
116 | */ |
132 | */ |
117 | ld8 r1 = [in0], 8 ;; |
133 | ld8.fill r1 = [in0], 8 ;; |
118 | ld8 r2 = [in0], 8 ;; |
134 | ld8.fill r2 = [in0], 8 ;; |
119 | ld8 r3 = [in0], 8 ;; |
135 | ld8.fill r3 = [in0], 8 ;; |
120 | ld8 r4 = [in0], 8 ;; |
136 | ld8.fill r4 = [in0], 8 ;; |
121 | ld8 r5 = [in0], 8 ;; |
137 | ld8.fill r5 = [in0], 8 ;; |
122 | ld8 r6 = [in0], 8 ;; |
138 | ld8.fill r6 = [in0], 8 ;; |
123 | ld8 r7 = [in0], 8 ;; |
139 | ld8.fill r7 = [in0], 8 ;; |
124 | ld8 r8 = [in0], 8 ;; |
140 | ld8.fill r8 = [in0], 8 ;; |
125 | ld8 r9 = [in0], 8 ;; |
141 | ld8.fill r9 = [in0], 8 ;; |
126 | ld8 r10 = [in0], 8 ;; |
142 | ld8.fill r10 = [in0], 8 ;; |
127 | ld8 r11 = [in0], 8 ;; |
143 | ld8.fill r11 = [in0], 8 ;; |
128 | ld8 r12 = [in0], 8 ;; /* restore sp */ |
144 | ld8.fill r12 = [in0], 8 ;; /* restore sp */ |
129 | ld8 r13 = [in0], 8 ;; |
145 | ld8.fill r13 = [in0], 8 ;; |
130 | ld8 r14 = [in0], 8 ;; |
146 | ld8.fill r14 = [in0], 8 ;; |
131 | ld8 r15 = [in0], 8 ;; |
147 | ld8.fill r15 = [in0], 8 ;; |
132 | ld8 r16 = [in0], 8 ;; |
148 | ld8.fill r16 = [in0], 8 ;; |
133 | ld8 r17 = [in0], 8 ;; |
149 | ld8.fill r17 = [in0], 8 ;; |
134 | ld8 r18 = [in0], 8 ;; |
150 | ld8.fill r18 = [in0], 8 ;; |
135 | ld8 r19 = [in0], 8 ;; |
151 | ld8.fill r19 = [in0], 8 ;; |
136 | ld8 r20 = [in0], 8 ;; |
152 | ld8.fill r20 = [in0], 8 ;; |
137 | ld8 r21 = [in0], 8 ;; |
153 | ld8.fill r21 = [in0], 8 ;; |
138 | ld8 r22 = [in0], 8 ;; |
154 | ld8.fill r22 = [in0], 8 ;; |
139 | ld8 r23 = [in0], 8 ;; |
155 | ld8.fill r23 = [in0], 8 ;; |
140 | ld8 r24 = [in0], 8 ;; |
156 | ld8.fill r24 = [in0], 8 ;; |
141 | ld8 r25 = [in0], 8 ;; |
157 | ld8.fill r25 = [in0], 8 ;; |
142 | ld8 r26 = [in0], 8 ;; |
158 | ld8.fill r26 = [in0], 8 ;; |
143 | ld8 r27 = [in0], 8 ;; |
159 | ld8.fill r27 = [in0], 8 ;; |
144 | ld8 r28 = [in0], 8 ;; |
160 | ld8.fill r28 = [in0], 8 ;; |
145 | ld8 r29 = [in0], 8 ;; |
161 | ld8.fill r29 = [in0], 8 ;; |
146 | ld8 r30 = [in0], 8 ;; |
162 | ld8.fill r30 = [in0], 8 ;; |
147 | ld8 r31 = [in0], 8 ;; |
163 | ld8.fill r31 = [in0], 8 ;; |
148 | 164 | ||
149 | /* |
165 | /* |
150 | * Restore branch registers |
166 | * Restore branch registers |
151 | */ |
167 | */ |
152 | ld8 loc1 = [in0], 8 ;; /* restore pc */ |
168 | ld8 loc2 = [in0], 8 ;; /* restore pc */ |
153 | mov b0 = loc1 |
- | |
154 | ld8 loc2 = [in0], 8 ;; |
- | |
155 | mov b1 = loc2 |
169 | mov b0 = loc2 |
156 | ld8 loc3 = [in0], 8 ;; |
170 | ld8 loc3 = [in0], 8 ;; |
157 | mov b2 = loc3 |
171 | mov b1 = loc3 |
158 | ld8 loc4 = [in0], 8 ;; |
172 | ld8 loc4 = [in0], 8 ;; |
159 | mov b3 = loc4 |
173 | mov b2 = loc4 |
160 | ld8 loc5 = [in0], 8 ;; |
174 | ld8 loc5 = [in0], 8 ;; |
161 | mov b4 = loc5 |
175 | mov b3 = loc5 |
162 | ld8 loc6 = [in0], 8 ;; |
176 | ld8 loc6 = [in0], 8 ;; |
163 | mov b5 = loc6 |
177 | mov b4 = loc6 |
164 | ld8 loc7 = [in0], 8 ;; |
178 | ld8 loc7 = [in0], 8 ;; |
165 | mov b6 = loc7 |
179 | mov b5 = loc7 |
166 | ld8 loc8 = [in0], 8 ;; |
180 | ld8 loc8 = [in0], 8 ;; |
167 | mov b7 = loc8 |
181 | mov b6 = loc8 |
- | 182 | ld8 loc9 = [in0], 8 ;; |
|
- | 183 | mov b7 = loc9 |
|
168 | 184 | ||
- | 185 | /* |
|
- | 186 | * Restore predicate registers |
|
- | 187 | */ |
|
169 | ld8 loc1 = [in0], 8 ;; |
188 | ld8 loc2 = [in0], 8 ;; |
170 | mov pr = loc1, ~0 |
189 | mov pr = loc2, ~0 |
171 | 190 | ||
172 | mov ar.pfs = loc0 |
191 | mov ar.pfs = loc0 |
- | 192 | mov ar.unat = loc1 |
|
173 | 193 | ||
174 | mov r8 = r0 /* context_restore returns 0 */ |
194 | mov r8 = r0 /* context_restore returns 0 */ |
175 | br.ret.sptk.many b0 |
195 | br.ret.sptk.many b0 |