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 94... Line 124...
94
 
124
 
95
/* PROCEDURES */
125
/* PROCEDURES */
96
 
126
 
97
/* clear out all the register records */
127
/* clear out all the register records */
98
void clear_reg_record
128
void clear_reg_record
99
    PROTO_N ( (s) )
-
 
100
    PROTO_T ( regcell * s )
129
(regcell * s)
101
{
130
{
102
  int   i;
131
  int   i;
103
  for (i = 0; i < no_fixed_regs; ++i) {
132
  for (i = 0; i < no_fixed_regs; ++i) {
104
    s[i].regcell_key = 4;
133
    s[i].regcell_key = 4;
105
#ifdef NEWDWARF
134
#ifdef NEWDWARF
106
    if (dwarf2) {
135
    if (dwarf2) {
107
      dw_close_regassn (i, 0);
136
      dw_close_regassn(i, 0);
108
      dw_close_regassn (i, 1);
137
      dw_close_regassn(i, 1);
109
    }
138
    }
110
#endif
139
#endif
111
  }
140
  }
112
  return;
141
  return;
113
}
142
}
114
 
143
 
115
/* clear out the registers not preserved
144
/* clear out the registers not preserved
116
   over procedure calls */
145
   over procedure calls */
117
void clear_low_reg_record
146
void clear_low_reg_record
118
    PROTO_N ( (s) )
-
 
119
    PROTO_T ( regcell * s )
147
(regcell * s)
120
{
148
{
121
  int   i;
149
  int   i;
122
  for (i = 0; i < no_fixed_regs; ++i) {
150
  for (i = 0; i < no_fixed_regs; ++i) {
123
    s[i].regcell_key = 4;
151
    s[i].regcell_key = 4;
124
#ifdef NEWDWARF
152
#ifdef NEWDWARF
125
    if (dwarf2) {
153
    if (dwarf2) {
126
      dw_close_regassn (i, 0);
154
      dw_close_regassn(i, 0);
127
      dw_close_regassn (i, 1);
155
      dw_close_regassn(i, 1);
128
    }
156
    }
129
#endif
157
#endif
130
  }
158
  }
131
  return;
159
  return;
132
}
160
}
133
 
161
 
134
 
162
 
135
/* true if changing d invalidates r */
163
/* true if changing d invalidates r */
136
static  int inval
164
static  int inval
137
    PROTO_N ( (d, r) )
-
 
138
    PROTO_T ( exp d X exp r )
165
(exp d, exp r)
139
{
166
{
140
  if ((d == nilexp || name (d) == cont_tag) &&
167
  if ((d == nilexp || name(d) == cont_tag) &&
141
      (name (r) == cont_tag || (name (r) == name_tag && isglob (son (r)))))
168
     (name(r) == cont_tag || (name(r) == name_tag && isglob(son(r)))))
142
    return (1);
169
    return(1);
143
  if ((name (r) == name_tag && !isvar (son (r))) ||
170
  if ((name(r) == name_tag && !isvar(son(r))) ||
144
	name (r) == cont_tag)
171
	name(r) == cont_tag)
145
    return (eq_where (mw (d, 0), mw (r, 0)));
172
    return(eq_where(mw(d, 0), mw(r, 0)));
146
 
173
 
147
  if (name (r) == reff_tag)
174
  if (name(r) == reff_tag)
148
    return (inval (d, son (r)));
175
    return(inval(d, son(r)));
149
 
176
 
150
  if (name (r) == addptr_tag) {
177
  if (name(r) == addptr_tag) {
151
    if (name (bro (son (r))) == offset_mult_tag)
178
    if (name(bro(son(r))) == offset_mult_tag)
152
      return (inval (d, son (r)) || inval (d, son (bro (son (r)))));
179
      return(inval(d, son(r)) || inval(d, son(bro(son(r)))));
153
    return (inval (d, son (r)) || inval (d, bro (son (r))));
180
    return(inval(d, son(r)) || inval(d, bro(son(r))));
154
  };
181
  };
155
 
182
 
156
  if (name (r) == ident_tag)
183
  if (name(r) == ident_tag)
157
    return (inval (d, son (r)) || inval (d, bro (son (r))));
184
    return(inval(d, son(r)) || inval(d, bro(son(r))));
158
 
185
 
159
  return (0);
186
  return(0);
160
}
187
}
161
 
188
 
162
/* true if changing d invalidates r */
189
/* true if changing d invalidates r */
163
int invalidates
190
int invalidates
164
    PROTO_N ( (d, r) )
-
 
165
    PROTO_T ( exp d X exp r )
191
(exp d, exp r)
166
{
192
{
167
  if (name (r) == cont_tag || name (r) == ass_tag)
193
  if (name(r) == cont_tag || name(r) == ass_tag)
168
    return (inval (d, son (r)));
194
    return(inval(d, son(r)));
169
  return (0);
195
  return(0);
170
}
196
}
171
 
197
 
172
/* convert register mask to register number */
198
/* convert register mask to register number */
173
static int  get_regno
199
static int  get_regno
174
    PROTO_N ( (mask) )
-
 
175
    PROTO_T ( int mask )
200
(int mask)
176
{
201
{
177
  int   m = 1;
202
  int   m = 1;
178
  int   res;
203
  int   res;
179
  for (res = 0; res < no_fixed_regs && (mask & m) == 0; res++)
204
  for (res = 0; res < no_fixed_regs && (mask & m) == 0; res++)
180
    m = m + m;
205
    m = m + m;
181
  return (res);
206
  return(res);
182
}
207
}
183
 
208
 
184
/* if there is a register holding the same
209
/* if there is a register holding the same
185
   value as is in w, return this register
210
   value as is in w, return this register
186
   (as a where), otherwise the where_exp
211
   (as a where), otherwise the where_exp
187
   field of the result will be nilexp */
212
   field of the result will be nilexp */
188
where equiv_reg
213
where equiv_reg
189
    PROTO_N ( (w, sz) )
-
 
190
    PROTO_T ( where w X int sz )
214
(where w, int sz)
191
{
215
{
192
  int   i;
216
  int   i;
193
  where res;
217
  where res;
194
  res.where_exp = nilexp;
218
  res.where_exp = nilexp;
195
 
219
 
196
  if (w.where_off != 0)
220
  if (w.where_off != 0)
197
    return (res);
221
    return(res);
198
  for (i = 0; i < no_fixed_regs; i++) {
222
  for (i = 0; i < no_fixed_regs; i++) {
199
    regcell * p = &crt_reg_record[i];
223
    regcell * p = &crt_reg_record[i];
200
    if ((p -> regcell_key & 1) &&
224
    if ((p -> regcell_key & 1) &&
201
	(sz == 0 || sz == p -> first_size) &&
225
	(sz == 0 || sz == p -> first_size) &&
202
	eq_where_exp (p -> first_dest, w.where_exp, 1, (sz==0))) {
226
	eq_where_exp(p -> first_dest, w.where_exp, 1,(sz==0))) {
203
#ifdef NEWDWARF
227
#ifdef NEWDWARF
204
      if (dwarf2)
228
      if (dwarf2)
205
	dw_used_regassn (i, 0);
229
	dw_used_regassn(i, 0);
206
#endif
230
#endif
207
      return (reg_wheres[i]);
231
      return(reg_wheres[i]);
208
    }
232
    }
209
    if ((p -> regcell_key & 2) &&
233
    if ((p -> regcell_key & 2) &&
210
	(sz == 0 || sz == p -> second_size) &&
234
	(sz == 0 || sz == p -> second_size) &&
211
	eq_where_exp (p -> second_dest, w.where_exp, 1, (sz==0))) {
235
	eq_where_exp(p -> second_dest, w.where_exp, 1,(sz==0))) {
212
#ifdef NEWDWARF
236
#ifdef NEWDWARF
213
      if (dwarf2)
237
      if (dwarf2)
214
	dw_used_regassn (i, 1);
238
	dw_used_regassn(i, 1);
215
#endif
239
#endif
216
      return (reg_wheres[i]);
240
      return(reg_wheres[i]);
217
    }
241
    }
218
  };
242
  };
219
  res.where_exp = nilexp;
243
  res.where_exp = nilexp;
220
  return (res);
244
  return(res);
221
}
245
}
222
 
246
 
223
static int is_aliased
247
static int is_aliased
224
    PROTO_N ( (dest) )
-
 
225
    PROTO_T ( exp dest )
248
(exp dest)
226
{
249
{
227
  if (dest == nilexp)
250
  if (dest == nilexp)
228
    return 0;
251
    return 0;
229
  if (name (dest) != cont_tag &&
252
  if (name(dest)!= cont_tag &&
230
      name (dest) != ass_tag)
253
      name(dest)!= ass_tag)
231
    return (0);
254
    return(0);
232
 
255
 
233
  if (name (son (dest)) == name_tag &&
256
  if (name(son(dest)) == name_tag &&
234
      isvar (son (son (dest))) &&
257
      isvar(son(son(dest))) &&
235
      iscaonly (son (son (dest))))
258
      iscaonly(son(son(dest))))
236
    return (0);
259
    return(0);
237
  return (1);
260
  return(1);
238
}
261
}
239
 
262
 
240
static  int shape_overlap
263
static  int shape_overlap
241
    PROTO_N ( (e1, e2) )
-
 
242
    PROTO_T ( exp e1 X exp e2 )
264
(exp e1, exp e2)
243
{
265
{
244
  shape s1 = sh (e1);
266
  shape s1 = sh(e1);
245
  shape s2 = sh (e2);
267
  shape s2 = sh(e2);
246
  if (name (s1) <= doublehd && name (s1) > tophd && name (s2) == ptrhd)
268
  if (name(s1) <= doublehd && name(s1) > tophd && name(s2) == ptrhd)
247
    return (0);
269
    return(0);
248
  if (name (s2) <= doublehd && name (s2) > tophd && name (s1) == ptrhd)
270
  if (name(s2) <= doublehd && name(s2) > tophd && name(s1) == ptrhd)
249
    return (0);
271
    return(0);
250
  return (1);
272
  return(1);
251
}
273
}
252
 
274
 
253
 
275
 
254
/* make changes to the register record
276
/* make changes to the register record
255
   needed when dest receives an unknown
277
   needed when dest receives an unknown
256
   value */
278
   value */
257
void invalidate_dest
279
void invalidate_dest
258
    PROTO_N ( (dest) )
-
 
259
    PROTO_T ( where dest )
280
(where dest)
260
{
281
{
261
  exp d = dest.where_exp;
282
  exp d = dest.where_exp;
262
  int  regmask = (d == nilexp) ? 0 : (in_reg (d) & 0x7fffffff);
283
  int  regmask = (d == nilexp)? 0 :(in_reg(d) & 0x7fffffff);
263
  int  regno;
284
  int  regno;
264
  where weq;
285
  where weq;
265
  int   i;
286
  int   i;
266
 
287
 
267
	/* this repeats the condition state check at start of move,
288
	/* this repeats the condition state check at start of move,
268
	   in case contop has reset it */
289
	   in case contop has reset it */
269
 
290
 
270
  if ((cond1_set && (eq_where (dest, cond1) ||
291
  if ((cond1_set && (eq_where(dest, cond1) ||
271
	  invalidates (dest.where_exp, cond1.where_exp))) ||
292
	  invalidates(dest.where_exp, cond1.where_exp))) ||
272
      (cond2_set &&
293
     (cond2_set &&
273
	(eq_where (dest, cond2a) || eq_where (dest, cond2b) ||
294
	(eq_where(dest, cond2a) || eq_where(dest, cond2b) ||
274
	  invalidates (dest.where_exp, cond2a.where_exp) ||
295
	  invalidates(dest.where_exp, cond2a.where_exp) ||
275
	  invalidates (dest.where_exp, cond2b.where_exp)))) {
296
	  invalidates(dest.where_exp, cond2b.where_exp)))) {
276
    cond1_set = 0;
297
    cond1_set = 0;
277
    cond2_set = 0;
298
    cond2_set = 0;
278
  };
299
  };
279
 
300
 
280
  if (is_aliased (dest.where_exp)) {
301
  if (is_aliased(dest.where_exp)) {
281
    for (i = 0; i < no_fixed_regs; ++i) {
302
    for (i = 0; i < no_fixed_regs; ++i) {
282
      regcell * pr = &crt_reg_record[i];
303
      regcell * pr = &crt_reg_record[i];
283
      switch (pr -> regcell_key) {
304
      switch (pr -> regcell_key) {
284
	case 1:
305
	case 1:
285
	  if (is_aliased (pr -> first_dest) &&
306
	  if (is_aliased(pr -> first_dest) &&
286
	      shape_overlap (dest.where_exp, pr -> first_dest)) {
307
	      shape_overlap(dest.where_exp, pr -> first_dest)) {
287
	    pr -> regcell_key = 4;
308
	    pr -> regcell_key = 4;
288
#ifdef NEWDWARF
309
#ifdef NEWDWARF
289
	    if (dwarf2)
310
	    if (dwarf2)
290
	      dw_close_regassn (i, 0);
311
	      dw_close_regassn(i, 0);
291
#endif
312
#endif
292
	  }
313
	  }
293
	  break;
314
	  break;
294
	case 2:
315
	case 2:
295
	  if (is_aliased (pr -> second_dest) &&
316
	  if (is_aliased(pr -> second_dest) &&
296
	      shape_overlap (dest.where_exp, pr -> second_dest)) {
317
	      shape_overlap(dest.where_exp, pr -> second_dest)) {
297
	    pr -> regcell_key = 4;
318
	    pr -> regcell_key = 4;
298
#ifdef NEWDWARF
319
#ifdef NEWDWARF
299
	    if (dwarf2)
320
	    if (dwarf2)
300
	      dw_close_regassn (i, 1);
321
	      dw_close_regassn(i, 1);
301
#endif
322
#endif
302
	  }
323
	  }
303
	  break;
324
	  break;
304
	case 3:
325
	case 3:
305
	  if (is_aliased (pr -> first_dest) &&
326
	  if (is_aliased(pr -> first_dest) &&
306
	      shape_overlap (dest.where_exp, pr -> first_dest)) {
327
	      shape_overlap(dest.where_exp, pr -> first_dest)) {
307
	    pr -> regcell_key &= 2;
328
	    pr -> regcell_key &= 2;
308
#ifdef NEWDWARF
329
#ifdef NEWDWARF
309
	    if (dwarf2)
330
	    if (dwarf2)
310
	      dw_close_regassn (i, 0);
331
	      dw_close_regassn(i, 0);
311
#endif
332
#endif
312
	  }
333
	  }
313
	  if (is_aliased (pr -> second_dest) &&
334
	  if (is_aliased(pr -> second_dest) &&
314
	      shape_overlap (dest.where_exp, pr -> second_dest)) {
335
	      shape_overlap(dest.where_exp, pr -> second_dest)) {
315
	    pr -> regcell_key &= 1;
336
	    pr -> regcell_key &= 1;
316
#ifdef NEWDWARF
337
#ifdef NEWDWARF
317
	    if (dwarf2)
338
	    if (dwarf2)
318
	      dw_close_regassn (i, 1);
339
	      dw_close_regassn(i, 1);
319
#endif
340
#endif
320
	  }
341
	  }
321
	  if (pr -> regcell_key == 0)
342
	  if (pr -> regcell_key == 0)
322
	    pr -> regcell_key = 4;
343
	    pr -> regcell_key = 4;
323
	default: ;
344
	default:;
324
      };
345
      };
325
    };
346
    };
326
  };
347
  };
327
 
348
 
328
  if (regmask) {
349
  if (regmask) {
329
    regno = get_regno (regmask);
350
    regno = get_regno(regmask);
330
    if (regno < no_fixed_regs)
351
    if (regno < no_fixed_regs)
331
      crt_reg_record[regno].regcell_key = 4;
352
      crt_reg_record[regno].regcell_key = 4;
332
  };
353
  };
333
 
354
 
334
  if (regmask || d == nilexp) {
355
  if (regmask || d == nilexp) {
335
    for (i = 0; i < no_fixed_regs; ++i) {
356
    for (i = 0; i < no_fixed_regs; ++i) {
336
      regcell * pr = &crt_reg_record[i];
357
      regcell * pr = &crt_reg_record[i];
337
      switch (pr -> regcell_key) {
358
      switch (pr -> regcell_key) {
338
	case 1:
359
	case 1:
339
	  if (invalidates (d, pr -> first_dest)) {
360
	  if (invalidates(d, pr -> first_dest)) {
340
	    pr -> regcell_key = 4;
361
	    pr -> regcell_key = 4;
341
#ifdef NEWDWARF
362
#ifdef NEWDWARF
342
	    if (dwarf2)
363
	    if (dwarf2)
343
	      dw_close_regassn (i, 0);
364
	      dw_close_regassn(i, 0);
344
#endif
365
#endif
345
	  }
366
	  }
346
	  break;
367
	  break;
347
	case 2:
368
	case 2:
348
	  if (invalidates (d, pr -> second_dest)) {
369
	  if (invalidates(d, pr -> second_dest)) {
349
	    pr -> regcell_key = 4;
370
	    pr -> regcell_key = 4;
350
#ifdef NEWDWARF
371
#ifdef NEWDWARF
351
	    if (dwarf2)
372
	    if (dwarf2)
352
	      dw_close_regassn (i, 1);
373
	      dw_close_regassn(i, 1);
353
#endif
374
#endif
354
	  }
375
	  }
355
	  break;
376
	  break;
356
	case 3:
377
	case 3:
357
	  if (invalidates (d, pr -> first_dest)) {
378
	  if (invalidates(d, pr -> first_dest)) {
358
	    pr -> regcell_key &= 2;
379
	    pr -> regcell_key &= 2;
359
#ifdef NEWDWARF
380
#ifdef NEWDWARF
360
	    if (dwarf2)
381
	    if (dwarf2)
361
	      dw_close_regassn (i, 0);
382
	      dw_close_regassn(i, 0);
362
#endif
383
#endif
363
	  }
384
	  }
364
	  if (invalidates (d, pr -> second_dest)) {
385
	  if (invalidates(d, pr -> second_dest)) {
365
	    pr -> regcell_key &= 1;
386
	    pr -> regcell_key &= 1;
366
#ifdef NEWDWARF
387
#ifdef NEWDWARF
367
	    if (dwarf2)
388
	    if (dwarf2)
368
	      dw_close_regassn (i, 1);
389
	      dw_close_regassn(i, 1);
369
#endif
390
#endif
370
	  }
391
	  }
371
	  if (pr -> regcell_key == 0)
392
	  if (pr -> regcell_key == 0)
372
	    pr -> regcell_key = 4;
393
	    pr -> regcell_key = 4;
373
	default: ;
394
	default:;
374
      };
395
      };
375
    };
396
    };
376
    return;
397
    return;
377
  };
398
  };
378
#ifdef NEWDWARF
399
#ifdef NEWDWARF
379
  dw_ignore_used_regassn = 1;
400
  dw_ignore_used_regassn = 1;
380
#endif
401
#endif
381
  while (1) {
402
  while (1) {
382
    weq = equiv_reg (dest, 0);
403
    weq = equiv_reg(dest, 0);
383
    if (weq.where_exp == nilexp)
404
    if (weq.where_exp == nilexp)
384
      break;
405
      break;
385
    regmask = (in_reg (weq.where_exp) & 0x7fffffff);
406
    regmask = (in_reg(weq.where_exp) & 0x7fffffff);
386
    regno = get_regno (regmask);
407
    regno = get_regno(regmask);
387
    if (regno < no_fixed_regs)
408
    if (regno < no_fixed_regs)
388
      crt_reg_record[regno].regcell_key = 4;
409
      crt_reg_record[regno].regcell_key = 4;
389
  };
410
  };
390
#ifdef NEWDWARF
411
#ifdef NEWDWARF
391
  dw_ignore_used_regassn = 0;
412
  dw_ignore_used_regassn = 0;
Line 394... Line 415...
394
}
415
}
395
 
416
 
396
/* from is being moved to to. Make changes
417
/* from is being moved to to. Make changes
397
   to the register records accordingly */
418
   to the register records accordingly */
398
void move_reg
419
void move_reg
399
    PROTO_N ( (from, to, sha) )
-
 
400
    PROTO_T ( where from X where to X shape sha )
420
(where from, where to, shape sha)
401
{
421
{
402
  int  regmask_to = in_reg (to.where_exp);
422
  int  regmask_to = in_reg(to.where_exp);
403
  int  regmask_from = in_reg (from.where_exp);
423
  int  regmask_from = in_reg(from.where_exp);
404
  int sz = shape_size(sha);
424
  int sz = shape_size(sha);
405
  if (name(sha) == shrealhd)
425
  if (name(sha) == shrealhd)
406
    return;
426
    return;
407
  if (regmask_from != 0 && regmask_to != 0)
427
  if (regmask_from != 0 && regmask_to != 0)
408
    return;
428
    return;
409
  if ((regmask_from & (int)0x80000000) || (regmask_to & (int)0x80000000))
429
  if ((regmask_from & (int)0x80000000) || (regmask_to & (int)0x80000000))
410
    return;
430
    return;
411
  if (from.where_off != 0 || to.where_off != 0)
431
  if (from.where_off != 0 || to.where_off != 0)
412
    return;
432
    return;
413
  if (regmask_to && invalidates (to.where_exp, from.where_exp))
433
  if (regmask_to && invalidates(to.where_exp, from.where_exp))
414
    return;
434
    return;
415
  if (regmask_to && regmask_to < 64) {
435
  if (regmask_to && regmask_to < 64) {
416
    int   regno_to = get_regno (regmask_to);
436
    int   regno_to = get_regno(regmask_to);
417
    regcell * p = &crt_reg_record[regno_to];
437
    regcell * p = &crt_reg_record[regno_to];
418
    switch (p -> regcell_key) {
438
    switch (p -> regcell_key) {
419
      case 1:
439
      case 1:
420
	{
440
	{
421
	  p -> regcell_key = 3;
441
	  p -> regcell_key = 3;
422
	  p -> second_dest = from.where_exp;
442
	  p -> second_dest = from.where_exp;
423
	  p -> second_size = sz;
443
	  p -> second_size = sz;
424
#ifdef NEWDWARF
444
#ifdef NEWDWARF
425
	  if (dwarf2)
445
	  if (dwarf2)
426
	    dw_init_regassn (regno_to, 1);
446
	    dw_init_regassn(regno_to, 1);
427
#endif
447
#endif
428
	  break;
448
	  break;
429
	};
449
	};
430
      case 2:
450
      case 2:
431
	{
451
	{
432
	  p -> regcell_key = 3;
452
	  p -> regcell_key = 3;
433
	  p -> first_dest = from.where_exp;
453
	  p -> first_dest = from.where_exp;
434
	  p -> first_size = sz;
454
	  p -> first_size = sz;
435
#ifdef NEWDWARF
455
#ifdef NEWDWARF
436
	  if (dwarf2)
456
	  if (dwarf2)
437
	    dw_init_regassn (regno_to, 0);
457
	    dw_init_regassn(regno_to, 0);
438
#endif
458
#endif
439
	  break;
459
	  break;
440
	};
460
	};
441
      case 3:
461
      case 3:
442
	break;
462
	break;
Line 445... Line 465...
445
	  p -> regcell_key = 1;
465
	  p -> regcell_key = 1;
446
	  p -> first_dest = from.where_exp;
466
	  p -> first_dest = from.where_exp;
447
	  p -> first_size = sz;
467
	  p -> first_size = sz;
448
#ifdef NEWDWARF
468
#ifdef NEWDWARF
449
	  if (dwarf2)
469
	  if (dwarf2)
450
	    dw_init_regassn (regno_to, 0);
470
	    dw_init_regassn(regno_to, 0);
451
#endif
471
#endif
452
	  break;
472
	  break;
453
	};
473
	};
454
    };
474
    };
455
  };
475
  };
456
  if (regmask_from && regmask_from < 64) {
476
  if (regmask_from && regmask_from < 64) {
457
    int   regno_from = get_regno (regmask_from);
477
    int   regno_from = get_regno(regmask_from);
458
    regcell * p = &crt_reg_record[regno_from];
478
    regcell * p = &crt_reg_record[regno_from];
459
    switch (p -> regcell_key) {
479
    switch (p -> regcell_key) {
460
      case 1:
480
      case 1:
461
	{
481
	{
462
	  p -> regcell_key = 3;
482
	  p -> regcell_key = 3;
463
	  p -> second_dest = to.where_exp;
483
	  p -> second_dest = to.where_exp;
464
	  p -> second_size = sz;
484
	  p -> second_size = sz;
465
#ifdef NEWDWARF
485
#ifdef NEWDWARF
466
	  if (dwarf2)
486
	  if (dwarf2)
467
	    dw_init_regassn (regno_from, 1);
487
	    dw_init_regassn(regno_from, 1);
468
#endif
488
#endif
469
	  break;
489
	  break;
470
	};
490
	};
471
      case 2:
491
      case 2:
472
	{
492
	{
473
	  p -> regcell_key = 3;
493
	  p -> regcell_key = 3;
474
	  p -> first_dest = to.where_exp;
494
	  p -> first_dest = to.where_exp;
475
	  p -> first_size = sz;
495
	  p -> first_size = sz;
476
#ifdef NEWDWARF
496
#ifdef NEWDWARF
477
	  if (dwarf2)
497
	  if (dwarf2)
478
	    dw_init_regassn (regno_from, 0);
498
	    dw_init_regassn(regno_from, 0);
479
#endif
499
#endif
480
	  break;
500
	  break;
481
	};
501
	};
482
      case 3:
502
      case 3:
483
	break;
503
	break;
Line 486... Line 506...
486
	  p -> regcell_key = 1;
506
	  p -> regcell_key = 1;
487
	  p -> first_dest = to.where_exp;
507
	  p -> first_dest = to.where_exp;
488
	  p -> first_size = sz;
508
	  p -> first_size = sz;
489
#ifdef NEWDWARF
509
#ifdef NEWDWARF
490
	  if (dwarf2)
510
	  if (dwarf2)
491
	    dw_init_regassn (regno_from, 0);
511
	    dw_init_regassn(regno_from, 0);
492
#endif
512
#endif
493
	  break;
513
	  break;
494
	};
514
	};
495
    };
515
    };
496
  };
516
  };