Subversion Repositories tendra.SVN

Rev

Rev 2 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2 Rev 7
Line -... Line 1...
-
 
1
/*
-
 
2
 * Copyright (c) 2002-2005 The TenDRA Project <http://www.tendra.org/>.
-
 
3
 * All rights reserved.
-
 
4
 *
-
 
5
 * Redistribution and use in source and binary forms, with or without
-
 
6
 * modification, are permitted provided that the following conditions are met:
-
 
7
 *
-
 
8
 * 1. Redistributions of source code must retain the above copyright notice,
-
 
9
 *    this list of conditions and the following disclaimer.
-
 
10
 * 2. Redistributions in binary form must reproduce the above copyright notice,
-
 
11
 *    this list of conditions and the following disclaimer in the documentation
-
 
12
 *    and/or other materials provided with the distribution.
-
 
13
 * 3. Neither the name of The TenDRA Project nor the names of its contributors
-
 
14
 *    may be used to endorse or promote products derived from this software
-
 
15
 *    without specific, prior written permission.
-
 
16
 *
-
 
17
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
-
 
18
 * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-
 
19
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-
 
20
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
-
 
21
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-
 
22
 * EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-
 
23
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-
 
24
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-
 
25
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-
 
26
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-
 
27
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 
28
 *
-
 
29
 * $Id$
-
 
30
 */
1
/*
31
/*
2
    		 Crown Copyright (c) 1997
32
    		 Crown Copyright (c) 1997
3
 
33
 
4
    This TenDRA(r) Computer Program is subject to Copyright
34
    This TenDRA(r) Computer Program is subject to Copyright
5
    owned by the United Kingdom Secretary of State for Defence
35
    owned by the United Kingdom Secretary of State for Defence
Line 35... Line 65...
35
$Date: 1998/01/17 15:55:52 $
65
$Date: 1998/01/17 15:55:52 $
36
$Revision: 1.1.1.1 $
66
$Revision: 1.1.1.1 $
37
$Log: assembler.c,v $
67
$Log: assembler.c,v $
38
 * Revision 1.1.1.1  1998/01/17  15:55:52  release
68
 * Revision 1.1.1.1  1998/01/17  15:55:52  release
39
 * First version to be checked into rolling release.
69
 * First version to be checked into rolling release.
40
 *
70
 *
41
 * Revision 1.10  1997/03/24  12:43:22  pwe
71
 * Revision 1.10  1997/03/24  12:43:22  pwe
42
 * outn int->long
72
 * outn int->long
43
 *
73
 *
44
 * Revision 1.9  1996/02/16  10:11:01  pwe
74
 * Revision 1.9  1996/02/16  10:11:01  pwe
45
 * Linux/ELF struct result and PIC jump table
75
 * Linux/ELF struct result and PIC jump table
Line 95... Line 125...
95
 
125
 
96
 
126
 
97
 
127
 
98
/* PROCEDURES */
128
/* PROCEDURES */
99
 
129
 
100
void dot_align
130
void
101
    PROTO_N ( (n) )
-
 
102
    PROTO_T ( int n )
131
dot_align(int n)
103
{
132
{
104
  if (linux_elf) {
133
  if (linux_elf) {
105
    outs(".align "); outn((long)n); outnl();
134
    outs(".align ");
-
 
135
    outn((long)n);
-
 
136
    outnl();
106
    return;
137
    return;
107
  }
138
  }
108
  if (n == 1)
139
  if (n == 1) {
109
    return;
140
    return;
-
 
141
  }
110
  outs(".align ");
142
  outs(".align ");
111
  switch (n) {
143
  switch (n) {
112
    case 16:
144
    case 16:
113
      n = 4; break;
145
      n = 4; break;
114
    case 8:
146
    case 8:
115
      n = 3; break;
147
      n = 3; break;
116
    case 4:
148
    case 4:
117
      n = 2; break;
149
      n = 2; break;
118
    default:
150
    default:
119
      n = 1; break;
151
      n = 1; break;
120
  };
152
  };
121
 
153
 
122
  outn((long)n); outnl();
154
  outn((long)n);
-
 
155
  outnl();
123
  return;
156
  return;
124
}
157
}
125
 
-
 
126
 
158
 
-
 
159
 
127
void outbyte
160
void
128
    PROTO_Z ()
161
outbyte(void)
129
{
162
{
130
  outs(".byte ");
163
  outs(".byte ");
131
  return;
164
  return;
132
}
165
}
133
 
166
 
134
void outshort
167
void
135
    PROTO_Z ()
168
outshort(void)
136
{
169
{
137
  outs(".value ");
170
  outs(".value ");
138
  return;
171
  return;
139
}
172
}
140
 
173
 
141
void outlong
174
void
142
    PROTO_Z ()
175
outlong(void)
143
{
176
{
144
  outs(".long ");
177
  outs(".long ");
145
  return;
178
  return;
146
}
179
}
147
 
180
 
148
void align_label
181
void
149
    PROTO_N ( (f, jr) )
-
 
150
    PROTO_T ( int f X exp jr )
182
align_label(int f, exp jr)
151
{
183
{
152
  if (linux_elf) {
184
  if (linux_elf) {
153
    if (is80486 && !is80586 && ptno(jr) != last_jump_label) {
185
    if (is80486 && !is80586 && ptno(jr) != last_jump_label) {
154
/* forward jump and continued into
186
/* forward jump and continued into
155
      if (f==0)
187
      if (f==0)
156
        outs(".align 8");
188
        outs(".align 8");
157
*/
189
*/
158
      if (f == 1)	/* repeat jump */
190
      if (f == 1) {	/* repeat jump */
159
        outs(".align 4");
191
        outs(".align 4");
-
 
192
      }
160
      if (f == 2)	/* preceded by a jmp or ret */
193
      if (f == 2) {	/* preceded by a jmp or ret */
161
        outs(".align 16");
194
        outs(".align 16");
-
 
195
      }
162
      outs("\n");
196
      outs("\n");
163
    };
197
    }
164
    return;
198
    return;
165
  }
-
 
166
  else {
199
  } else {
167
    if (is80486 && !is80586 && ptno(jr) != last_jump_label)  {
200
    if (is80486 && !is80586 && ptno(jr)!= last_jump_label) {
168
/* forward jump and continued into
201
/* forward jump and continued into
169
      if (f==0)
202
      if (f==0)
170
        outs(".align 16,7,1");
203
        outs(".align 16,7,1");
171
*/
204
*/
172
      if (f == 1)	/* repeat jump */
205
      if (f == 1) {	/* repeat jump */
173
        outs(".align 3,0x90");
206
        outs(".align 3,0x90");
-
 
207
      }
174
      if (f == 2)	/* preceded by a jmp or ret */
208
      if (f == 2) {	/* preceded by a jmp or ret */
175
        outs(".align 4,0x90");
209
        outs(".align 4,0x90");
-
 
210
      }
176
      if (f == 3)
211
      if (f == 3) {
177
        outs(".align 2,0x90");
212
        outs(".align 2,0x90");
-
 
213
      }
178
      outs("\n");
214
      outs("\n");
179
    };
215
    }
180
    if (is80586 && ptno(jr) != last_jump_label)  {
216
    if (is80586 && ptno(jr)!= last_jump_label) {
181
      if (f >= 1 && f <= 3)
217
      if (f >= 1 && f <= 3) {
182
        outs(".align 2,0x90\n");
218
        outs(".align 2,0x90\n");
-
 
219
      }
183
    };
220
    }
184
    return;
221
    return;
185
  }
222
  }
186
}
223
}
187
 
224
 
188
void eval_postlude
225
void
189
    PROTO_N ( (s, c) )
-
 
190
    PROTO_T ( char * s X exp c )
226
eval_postlude(char *s, exp c)
191
{
227
{
192
  if (!linux_elf)
228
  if (!linux_elf) {
193
    return;
229
    return;
-
 
230
  }
194
  outs(".size ");
231
  outs(".size ");
195
  outs (s);
232
  outs(s);
196
  outs (",");
233
  outs(",");
197
  outn((long)(shape_size(sh(c))+7)/8);
234
  outn((long)(shape_size(sh(c)) + 7) / 8);
198
  outnl();
235
  outnl();
199
  outs(".type ");
236
  outs(".type ");
200
  outs (s);
237
  outs(s);
201
  outs (",@object");
238
  outs(",@object");
202
  outnl();
239
  outnl();
203
  return;
240
  return;
204
}
241
}
205
 
242
 
-
 
243
void
206
void out_readonly_section
244
out_readonly_section(void)
207
    PROTO_Z ()
-
 
208
{
245
{
209
  if (linux_elf)
246
  if (linux_elf) {
210
    outs (".section .rodata");
247
    outs(".section .rodata");
211
  else
248
  } else {
212
    outs (".text");
249
    outs(".text");
-
 
250
  }
213
  return;
251
  return;
214
}
252
}
215
 
253
 
216
void out_dot_comm
254
void
217
    PROTO_N ( (id, sha) )
-
 
218
    PROTO_T ( char * id X shape sha )
255
out_dot_comm(char *id, shape sha)
219
{
256
{
220
	outs (".comm ");
257
	outs(".comm ");
221
	outs (id);
258
	outs(id);
222
	outs (",");
259
	outs(",");
223
	outn ((long)((( shape_size(sha)/ 8) + 3) / 4) * 4);
260
	outn((long)(((shape_size(sha) / 8) + 3) / 4) * 4);
224
 
261
 
225
	outnl ();
262
	outnl();
226
  return;
263
  return;
227
}
264
}
228
 
265
 
229
void out_dot_lcomm
266
void
230
    PROTO_N ( (id, sha) )
-
 
231
    PROTO_T ( char * id X shape sha )
267
out_dot_lcomm(char *id, shape sha)
232
{
268
{
233
	outs (".lcomm ");
269
	outs(".lcomm ");
234
	outs (id);
270
	outs(id);
235
	outs (",");
271
	outs(",");
236
	outn ((long)((( shape_size(sha)/ 8) + 3) / 4) * 4);
272
	outn((long)(((shape_size(sha) / 8) + 3) / 4) * 4);
237
 
273
 
238
	outnl ();
274
	outnl();
239
  return;
275
  return;
240
}
276
}
241
 
277
 
242
void out_bss
278
void
243
    PROTO_N ( (id, sha) )
-
 
244
    PROTO_T ( char * id X shape sha )
279
out_bss(char *id, shape sha)
245
{
280
{
246
	outs (".bss ");
281
	outs(".bss ");
247
	outs (id);
282
	outs(id);
248
	outs (",");
283
	outs(",");
249
	outn ((long)((( shape_size(sha)/ 8) + 3) / 4) * 4);
284
	outn((long)(((shape_size(sha) / 8) + 3) / 4) * 4);
250
 
285
 
251
	outnl ();
286
	outnl();
252
  return;
287
  return;
253
}
288
}
254
 
289
 
255
static int pic_label;
290
static int pic_label;
256
 
291
 
257
void pic_prelude
292
void
258
    PROTO_Z ()
293
pic_prelude(void)
259
{
294
{
260
  int n = next_lab();
295
  int n = next_lab();
261
  pic_label = n;
296
  pic_label = n;
-
 
297
  outs(" call ");
262
  outs(" call "); outs(local_prefix); outn((long)n); outnl();
298
  outs(local_prefix);
-
 
299
  outn((long)n);
-
 
300
  outnl();
263
  outs(local_prefix); outn((long)n); outs(":"); outnl();
301
  outs(local_prefix);
-
 
302
  outn((long)n);
-
 
303
  outs(":");
-
 
304
  outnl();
264
  outs(" popl %ebx"); outnl();
305
  outs(" popl %ebx");
-
 
306
  outnl();
265
  outs(" addl $_GLOBAL_OFFSET_TABLE_+[.-"); outs(local_prefix); outn((long)n); outs("],%ebx");
307
  outs(" addl $_GLOBAL_OFFSET_TABLE_+ [.-");
-
 
308
  outs(local_prefix);
-
 
309
  outn((long)n);
-
 
310
  outs("],%ebx");
266
    outnl();
311
  outnl();
267
  return;
312
  return;
268
}
313
}
269
 
314
 
270
void out_rename
315
void
271
    PROTO_N ( (oldid, newid) )
-
 
272
    PROTO_T ( char * oldid X char * newid )
316
out_rename(char *oldid, char *newid)
273
{
317
{
-
 
318
  UNUSED(oldid);
274
  UNUSED(oldid); UNUSED(newid);
319
  UNUSED(newid);
275
  return;
320
  return;
276
}
321
}
277
 
322
 
278
void out_switch_jump
323
void
279
    PROTO_N ( (tab, a, min) )
-
 
280
    PROTO_T ( int tab X where a X int min )
324
out_switch_jump(int tab, where a, int min)
281
{
325
{
282
  if (PIC_code)  {
326
  if (PIC_code) {
283
    if (min != 0) {
327
    if (min != 0) {
284
      sub (slongsh, mw(zeroe,min), a, reg0);
328
      sub(slongsh, mw(zeroe,min), a, reg0);
285
      a = reg0;
329
      a = reg0;
286
    }
330
    }
287
    if (eq_where (a, reg0)) {
331
    if (eq_where(a, reg0)) {
288
      outs (" movl ");
332
      outs(" movl ");
289
    }
-
 
290
    else {
333
    } else {
291
      outs (" movl %ebx,%eax");
334
      outs(" movl %ebx,%eax");
292
      outnl();
335
      outnl();
293
      outs (" subl ");
336
      outs(" subl ");
294
    }
337
    }
295
    outs(local_prefix);
338
    outs(local_prefix);
296
    outn((long)tab);
339
    outn((long)tab);
297
    outs("@GOTOFF(%ebx,");
340
    outs("@GOTOFF(%ebx,");
298
    operand (32, a, 1, 0);
341
    operand(32, a, 1, 0);
299
    outs(",4),%eax");
342
    outs(",4),%eax");
300
    outnl();
343
    outnl();
301
    if (eq_where (a, reg0)) {
344
    if (eq_where(a, reg0)) {
302
      outs (" subl %ebx,%eax");
345
      outs(" subl %ebx,%eax");
303
      outnl();
346
      outnl();
304
      outs (" negl %eax");
347
      outs(" negl %eax");
305
      outnl();
348
      outnl();
306
    }
349
    }
307
    outs(" jmp *%eax");
350
    outs(" jmp *%eax");
308
    outnl();
351
    outnl();
309
    return;
352
    return;
310
  }
-
 
311
  else  {
353
  } else  {
312
    outs (" jmp *");
354
    outs(" jmp *");
313
    outs(local_prefix);
355
    outs(local_prefix);
314
    outn((long)tab);
356
    outn((long)tab);
315
    outs("-");
357
    outs("-");
316
    outn((long)(4 * min));
358
    outn((long)(4 * min));
317
    outs ("(,");
359
    outs("(,");
318
    operand (32, a, 1, 0);
360
    operand(32, a, 1, 0);
319
    outs (",4)");
361
    outs(",4)");
320
    outnl ();
362
    outnl();
321
    return;
363
    return;
322
  };
364
  };
323
}
365
}
324
 
366
 
325
void out_switch_table
367
void
326
    PROTO_N ( (tab, min, max, v, absent) )
-
 
327
    PROTO_T ( int tab X int min X int max X int * v X int absent )
368
out_switch_table(int tab, int min, int max, int *v, int absent)
328
{
369
{
329
  int i;
370
  int i;
330
 
371
 
331
  dot_align(4);
372
  dot_align(4);
332
  outnl();
373
  outnl();
333
 
374
 
334
  outs(local_prefix);
375
  outs(local_prefix);
335
  outn ((long)tab);
376
  outn((long)tab);
336
  outs (":");
377
  outs(":");
337
  outnl ();
378
  outnl();
338
 
379
 
339
  for (i = min; i <= max; ++i) {
380
  for (i = min; i <= max; ++i) {
340
    outs (".long ");
381
    outs(".long ");
341
    if (v[i - min] != -1)  {
382
    if (v[i - min]!= -1) {
342
      if (PIC_code) {
383
      if (PIC_code) {
343
	outs(" _GLOBAL_OFFSET_TABLE_+[.-");
384
	outs(" _GLOBAL_OFFSET_TABLE_+ [.-");
344
	outs(local_prefix);
385
	outs(local_prefix);
345
	outn ((long)v[i - min]);
386
	outn((long)v[i - min]);
346
	outs("]");
387
	outs("]");
347
      }
-
 
348
      else {
388
      } else {
349
	outs(local_prefix);
389
	outs(local_prefix);
350
	outn ((long)v[i - min]);
390
	outn((long)v[i - min]);
351
      }
391
      }
352
    }
-
 
353
    else  {
392
    } else {
354
      if (absent == -1)
393
      if (absent == -1) {
355
        outn ((long)0);
394
        outn((long)0);
356
      else {
395
      } else {
357
	if (PIC_code) {
396
	if (PIC_code) {
358
	  outs(" _GLOBAL_OFFSET_TABLE_+[.-");
397
	  outs(" _GLOBAL_OFFSET_TABLE_+ [.-");
359
	  outs(local_prefix);
398
	  outs(local_prefix);
360
	  outn ((long)absent);
399
	  outn((long)absent);
361
	  outs("]");
400
	  outs("]");
362
	}
-
 
363
	else {
401
	} else {
364
	  outs(local_prefix);
402
	  outs(local_prefix);
365
	  outn ((long)absent);
403
	  outn((long)absent);
366
	}
404
	}
367
      };
405
      }
368
    };
406
    }
369
    outnl ();
407
    outnl();
370
  };
408
  }
371
  outnl();
409
  outnl();
372
  return;
410
  return;
373
}
411
}
374
 
412
 
375
void proc_size
413
void
376
    PROTO_N ( (s) )
-
 
377
    PROTO_T ( char * s )
414
proc_size(char *s)
378
{
415
{
379
  outs(".align 4");
416
  outs(".align 4");
380
  outnl();
417
  outnl();
381
  outs(".size ");
418
  outs(".size ");
382
  outs(s);
419
  outs(s);
Line 384... Line 421...
384
  outs(s);
421
  outs(s);
385
  outnl();
422
  outnl();
386
  return;
423
  return;
387
}
424
}
388
 
425
 
389
void proc_type
426
void
390
    PROTO_N ( (s) )
-
 
391
    PROTO_T ( char * s )
427
proc_type(char *s)
392
{
428
{
393
  outs(".type ");
429
  outs(".type ");
394
  outs(s);
430
  outs(s);
395
  outs(",@function");
431
  outs(",@function");
396
  outnl();
432
  outnl();
397
  return;
433
  return;
398
}
434
}
399
 
435
 
400
void outend
436
void
401
    PROTO_Z ()
437
outend(void)
402
{		/* close the output */
438
{		/* close the output */
403
  int   st;
439
  int st;
404
  outs(".text");
440
  outs(".text");
405
  outnl();
441
  outnl();
406
  dot_align(16);
442
  dot_align(16);
407
  outnl();
443
  outnl();
408
  outs("___tdf_end:");
444
  outs("___tdf_end:");
409
  outnl();
445
  outnl();
410
  st = fclose (fpout);
446
  st = fclose(fpout);
411
  if (st == EOF) {
447
  if (st == EOF) {
412
    failer ("failed to close file");
448
    failer("failed to close file");
413
    exit(EXIT_FAILURE);
449
    exit(EXIT_FAILURE);
414
  };
450
  }
415
}
451
}
416
 
452
 
417
void outopenbr
453
void
418
    PROTO_Z ()
454
outopenbr(void)
419
{
455
{
420
  return;
456
  return;
421
}
457
}
422
 
458
 
423
 
459
 
424
void outclosebr
460
void
425
    PROTO_Z ()
461
outclosebr(void)
426
{
462
{
427
  return;
463
  return;
428
}
464
}
429
 
465
 
430
void outdivsym
466
void
431
    PROTO_Z ()
467
outdivsym(void)
432
{
468
{
433
  outs("/");
469
  outs("/");
434
  return;
470
  return;
435
}
471
}
436
 
472
 
437
void out_initialiser
473
void
438
    PROTO_N ( (id) )
-
 
439
    PROTO_T ( char* id )
474
out_initialiser(char *id)
440
{
475
{
441
  if (!linux_elf) {
476
  if (!linux_elf) {
442
    outs(".stabs \"___TDFI_LIST__\",22,0,0,");
477
    outs(".stabs \"___TDFI_LIST__\",22,0,0,");
443
    outs (id);
478
    outs(id);
444
    outnl ();
479
    outnl();
445
    outnl ();
480
    outnl();
446
    return;
481
    return;
447
  }
482
  }
448
  outs (".section .init\n");
483
  outs(".section .init\n");
449
  outs (" call ");
484
  outs(" call ");
450
  outs (id);
485
  outs(id);
451
  if (PIC_code)
486
  if (PIC_code) {
452
    outs ("@PLT");
487
    outs("@PLT");
-
 
488
  }
453
  outnl ();
489
  outnl();
454
  outnl ();
490
  outnl();
455
  return;
491
  return;
456
}
492
}
457
 
493
 
458
 
494
 
-
 
495
void
459
void out_main_prelude
496
out_main_prelude(void)
460
    PROTO_Z ()		/* if (!linux_elf) */
-
 
461
{
497
{
-
 
498
  /* if (!linux_elf) */
462
  int nl1 = next_lab ();
499
  int nl1 = next_lab();
463
  int nl2 = next_lab ();
500
  int nl2 = next_lab();
464
  min_rfree |= 0x8;
501
  min_rfree |= 0x8;
465
  outs (" movl $___TDFI_LIST__+4, %ebx\n");
502
  outs(" movl $___TDFI_LIST__+4, %ebx\n");
466
  outs (local_prefix);
503
  outs(local_prefix);
467
  outn ((long)nl1);
504
  outn((long)nl1);
468
  outs (":\n");
505
  outs(":\n");
469
  outs (" movl (%ebx),%eax\n");
506
  outs(" movl (%ebx),%eax\n");
470
  outs (" cmpl $0,%eax\n");
507
  outs(" cmpl $0,%eax\n");
471
  simple_branch ("je", nl2);
508
  simple_branch("je", nl2);
472
  outs (" call *%eax\n");
509
  outs(" call *%eax\n");
473
  outs (" addl $4,%ebx\n");
510
  outs(" addl $4,%ebx\n");
474
  simple_branch ("jmp", nl1);
511
  simple_branch("jmp", nl1);
475
  outs (local_prefix);
512
  outs(local_prefix);
476
  outn ((long)nl2);
513
  outn((long)nl2);
477
  outs (":\n");
514
  outs(":\n");
478
  return;
515
  return;
479
}
516
}
480
 
517
 
-
 
518
void
481
void out_main_postlude
519
out_main_postlude(void)
482
    PROTO_Z ()	/* if (!linux_elf) */
-
 
483
{
520
{
-
 
521
  /* if (!linux_elf) */
484
  char * sdummy = "Idummy";
522
  char *sdummy = "Idummy";
485
  char * pdummy = (char *) xcalloc (((int)strlen(local_prefix) +
523
  char *pdummy = (char *)xcalloc(((int)strlen(local_prefix) +
486
				(int)strlen(sdummy) + 1), sizeof (char));
524
				  (int)strlen(sdummy) + 1), sizeof(char));
487
  strcpy (pdummy, local_prefix);
525
  strcpy(pdummy, local_prefix);
488
  strcat (pdummy, sdummy);
526
  strcat(pdummy, sdummy);
489
  outs (".text\n");
527
  outs(".text\n");
490
  outs (pdummy);
528
  outs(pdummy);
491
  outs (":\n");
529
  outs(":\n");
492
  outs (" ret\n");
530
  outs(" ret\n");
493
  out_initialiser(pdummy);
531
  out_initialiser(pdummy);
494
  return;
532
  return;
495
}
533
}
496
 
534