OpenCores
URL https://opencores.org/ocsvn/thor/thor/trunk

Subversion Repositories thor

[/] [thor/] [trunk/] [FT64v5/] [software/] [CC64/] [source/] [FT64.cpp] - Blame information for rev 48

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 robfinch
// ============================================================================
2
//        __
3
//   \\__/ o\    (C) 2012-2018  Robert Finch, Waterloo
4
//    \  __ /    All rights reserved.
5
//     \/_//     robfinch<remove>@finitron.ca
6
//       ||
7
//
8
// CC64 - 'C' derived language compiler
9
//  - 64 bit CPU
10
//
11
// This source file is free software: you can redistribute it and/or modify 
12
// it under the terms of the GNU Lesser General Public License as published 
13
// by the Free Software Foundation, either version 3 of the License, or     
14
// (at your option) any later version.                                      
15
//                                                                          
16
// This source file is distributed in the hope that it will be useful,      
17
// but WITHOUT ANY WARRANTY; without even the implied warranty of           
18
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            
19
// GNU General Public License for more details.                             
20
//                                                                          
21
// You should have received a copy of the GNU General Public License        
22
// along with this program.  If not, see <http://www.gnu.org/licenses/>.    
23
//                                                                          
24
// ============================================================================
25
//
26
#include "stdafx.h"
27
 
28
extern TYP              stdfunc;
29
 
30
extern void DumpCSETable();
31
extern void scan(Statement *);
32
extern void GenerateComment(char *);
33
int TempFPInvalidate();
34
int TempInvalidate();
35
void TempRevalidate(int,int);
36
void TempFPRevalidate(int);
37
void ReleaseTempRegister(Operand *ap);
38
Operand *GetTempRegister();
39
extern void GenLoad(Operand *ap1, Operand *ap3, int ssize, int size);
40
 
41
Operand *GenExpr(ENODE *node)
42
{
43
        Operand *ap1,*ap2,*ap3,*ap4;
44
        int lab0, lab1;
45
        int size;
46
        int op;
47
 
48
    lab0 = nextlabel++;
49
    lab1 = nextlabel++;
50
 
51
        switch(node->nodetype) {
52
        case en_eq:             op = op_seq;    break;
53
        case en_ne:             op = op_sne;    break;
54
        case en_lt:             op = op_slt;    break;
55
        case en_ult:    op = op_sltu;   break;
56
        case en_le:             op = op_sle;    break;
57
        case en_ule:    op = op_sleu;   break;
58
        case en_gt:             op = op_sgt;    break;
59
        case en_ugt:    op = op_sgtu;   break;
60
        case en_ge:             op = op_sge;    break;
61
        case en_uge:    op = op_sgeu;   break;
62
        case en_flt:    op = op_fslt;   break;
63
        case en_fle:    op = op_fsle;   break;
64
        case en_fgt:    op = op_fsgt;   break;
65
        case en_fge:    op = op_fsge;   break;
66
        case en_feq:    op = op_fseq;   break;
67
        case en_fne:    op = op_fsne;   break;
68
        case en_veq:
69
                size = GetNaturalSize(node);
70
                ap3 = GetTempVectorRegister();
71
                ap1 = GenerateExpression(node->p[0],F_REG,size);
72
                ap2 = GenerateExpression(node->p[1],F_REG,size);
73
                GenerateTriadic(op_vseq,0,ap3,ap1,ap2);
74
                ReleaseTempReg(ap2);
75
                ReleaseTempReg(ap1);
76
                return (ap3);
77
        case en_vne:
78
                size = GetNaturalSize(node);
79
                ap3 = GetTempVectorRegister();
80
                ap1 = GenerateExpression(node->p[0],F_REG,size);
81
                ap2 = GenerateExpression(node->p[1],F_REG,size);
82
                GenerateTriadic(op_vsne,0,ap3,ap1,ap2);
83
                ReleaseTempReg(ap2);
84
                ReleaseTempReg(ap1);
85
                return (ap3);
86
        case en_vlt:
87
                size = GetNaturalSize(node);
88
                ap3 = GetTempVectorRegister();
89
                ap1 = GenerateExpression(node->p[0],F_REG,size);
90
                ap2 = GenerateExpression(node->p[1],F_REG,size);
91
                GenerateTriadic(op_vslt,0,ap3,ap1,ap2);
92
                ReleaseTempReg(ap2);
93
                ReleaseTempReg(ap1);
94
                return (ap3);
95
        case en_vle:
96
                size = GetNaturalSize(node);
97
                ap3 = GetTempVectorRegister();
98
                ap1 = GenerateExpression(node->p[0],F_REG,size);
99
                ap2 = GenerateExpression(node->p[1],F_REG,size);
100
                GenerateTriadic(op_vsle,0,ap3,ap1,ap2);
101
                ReleaseTempReg(ap2);
102
                ReleaseTempReg(ap1);
103
                return (ap3);
104
        case en_vgt:
105
                size = GetNaturalSize(node);
106
                ap3 = GetTempVectorRegister();
107
                ap1 = GenerateExpression(node->p[0],F_REG,size);
108
                ap2 = GenerateExpression(node->p[1],F_REG,size);
109
                GenerateTriadic(op_vsgt,0,ap3,ap1,ap2);
110
                ReleaseTempReg(ap2);
111
                ReleaseTempReg(ap1);
112
                return (ap3);
113
        case en_vge:
114
                size = GetNaturalSize(node);
115
                ap3 = GetTempVectorRegister();
116
                ap1 = GenerateExpression(node->p[0],F_REG,size);
117
                ap2 = GenerateExpression(node->p[1],F_REG,size);
118
                GenerateTriadic(op_vsge,0,ap3,ap1,ap2);
119
                ReleaseTempReg(ap2);
120
                ReleaseTempReg(ap1);
121
                return (ap3);
122
        default:        // en_land, en_lor
123
                //ap1 = GetTempRegister();
124
                //ap2 = GenerateExpression(node,F_REG,8);
125
                //GenerateDiadic(op_redor,0,ap1,ap2);
126
                //ReleaseTempReg(ap2);
127
                GenerateFalseJump(node,lab0,0);
128
                ap1 = GetTempRegister();
129
                GenerateDiadic(op_ldi,0,ap1,make_immed(1));
130
                GenerateMonadic(op_bra,0,make_label(lab1));
131
                GenerateLabel(lab0);
132
                GenerateDiadic(op_ldi,0,ap1,make_immed(0));
133
                GenerateLabel(lab1);
134
                return ap1;
135
        }
136
 
137
        switch (node->nodetype) {
138
        case en_eq:
139
                size = GetNaturalSize(node);
140
                ap3 = GetTempRegister();
141
                ap1 = GenerateExpression(node->p[0], F_REG, size);
142
                ap2 = GenerateExpression(node->p[1], F_REG | F_IMMED, size);
143
                GenerateTriadic(op_xnor, 0, ap3, ap1, ap2);
144
                ReleaseTempRegister(ap2);
145
                ReleaseTempRegister(ap1);
146
                GenerateDiadic(op_redor, 0, ap3, ap3);
147
                return (ap3);
148
        case en_ne:
149
                size = GetNaturalSize(node);
150
                ap3 = GetTempRegister();
151
                ap1 = GenerateExpression(node->p[0], F_REG, size);
152
                ap2 = GenerateExpression(node->p[1], F_REG | F_IMMED, size);
153
                GenerateTriadic(op_xor, 0, ap3, ap1, ap2);
154
                ReleaseTempRegister(ap2);
155
                ReleaseTempRegister(ap1);
156
                GenerateDiadic(op_redor, 0, ap3, ap3);
157
                return (ap3);
158
        case en_lt:
159
                size = GetNaturalSize(node);
160
                ap3 = GetTempRegister();
161
                ap1 = GenerateExpression(node->p[0], F_REG, size);
162
                ap2 = GenerateExpression(node->p[1], F_REG | F_IMMED, size);
163
                GenerateTriadic(op_slt, 0, ap3, ap1, ap2);
164
                ReleaseTempRegister(ap2);
165
                ReleaseTempRegister(ap1);
166
                //              GenerateDiadic(op_slt,0,ap3,ap3);
167
                return (ap3);
168
        case en_le:
169
                size = GetNaturalSize(node);
170
                ap3 = GetTempRegister();
171
                ap1 = GenerateExpression(node->p[0], F_REG, size);
172
                ap2 = GenerateExpression(node->p[1], F_REG | F_IMMED, size);
173
                GenerateTriadic(op_sle, 0, ap3, ap1, ap2);
174
                ReleaseTempRegister(ap2);
175
                ReleaseTempRegister(ap1);
176
                //              GenerateDiadic(op_sle,0,ap3,ap3);
177
                return (ap3);
178
        case en_gt:
179
                size = GetNaturalSize(node);
180
                ap3 = GetTempRegister();
181
                ap1 = GenerateExpression(node->p[0], F_REG, size);
182
                ap2 = GenerateExpression(node->p[1], F_REG | F_IMMED, size);
183
                if (ap2->mode == am_reg)
184
                        GenerateTriadic(op_slt, 0, ap3, ap2, ap1);
185
                else
186
                        GenerateTriadic(op_sgt, 0, ap3, ap1, ap2);
187
                ReleaseTempRegister(ap2);
188
                ReleaseTempRegister(ap1);
189
                //              GenerateDiadic(op_sgt,0,ap3,ap3);
190
                return (ap3);
191
        case en_ge:
192
                size = GetNaturalSize(node);
193
                ap3 = GetTempRegister();
194
                ap1 = GenerateExpression(node->p[0], F_REG, size);
195
                ap2 = GenerateExpression(node->p[1], F_REG | F_IMMED, size);
196
                GenerateTriadic(op_slt, 0, ap3, ap1, ap2);
197
                GenerateDiadic(op_not, 0, ap3, ap3);
198
                ReleaseTempRegister(ap2);
199
                ReleaseTempRegister(ap1);
200
                //              GenerateDiadic(op_sge,0,ap3,ap3);
201
                return (ap3);
202
        case en_ult:
203
                size = GetNaturalSize(node);
204
                ap3 = GetTempRegister();
205
                ap1 = GenerateExpression(node->p[0], F_REG, size);
206
                ap2 = GenerateExpression(node->p[1], F_REG | F_IMMED, size);
207
                GenerateTriadic(op_sltu, 0, ap3, ap1, ap2);
208
                ReleaseTempRegister(ap2);
209
                ReleaseTempRegister(ap1);
210
                //              GenerateDiadic(op_slt,0,ap3,ap3);
211
                return (ap3);
212
        case en_ule:
213
                size = GetNaturalSize(node);
214
                ap3 = GetTempRegister();
215
                ap1 = GenerateExpression(node->p[0], F_REG, size);
216
                ap2 = GenerateExpression(node->p[1], F_REG | F_IMMED, size);
217
                if (ap2->mode == am_imm) {
218
                        GenerateTriadic(op_sgt, 0, ap3, ap1, ap2);
219
                        GenerateDiadic(op_not, 0, ap3, ap3);
220
                }
221
                else
222
                        GenerateTriadic(op_sleu, 0, ap3, ap1, ap2);
223
                ReleaseTempRegister(ap2);
224
                ReleaseTempRegister(ap1);
225
                //              GenerateDiadic(op_sle,0,ap3,ap3);
226
                return (ap3);
227
        case en_ugt:
228
                size = GetNaturalSize(node);
229
                ap3 = GetTempRegister();
230
                ap1 = GenerateExpression(node->p[0], F_REG, size);
231
                ap2 = GenerateExpression(node->p[1], F_REG | F_IMMED, size);
232
                if (ap2->mode == am_reg)
233
                        GenerateTriadic(op_sleu, 0, ap3, ap2, ap1);
234
                else
235
                        GenerateTriadic(op_sgtu, 0, ap3, ap1, ap2);
236
                ReleaseTempRegister(ap2);
237
                ReleaseTempRegister(ap1);
238
                //              GenerateDiadic(op_sgt,0,ap3,ap3);
239
                return (ap3);
240
        case en_uge:
241
                size = GetNaturalSize(node);
242
                ap3 = GetTempRegister();
243
                ap1 = GenerateExpression(node->p[0], F_REG, size);
244
                ap2 = GenerateExpression(node->p[1], F_REG | F_IMMED, size);
245
                if (ap2->mode == am_reg)
246
                        GenerateTriadic(op_sleu, 0, ap3, ap2, ap1);
247
                else {
248
                        GenerateTriadic(op_sltu, 0, ap3, ap1, ap2);
249
                        GenerateDiadic(op_not, 0, ap3, ap3);
250
                }
251
                ReleaseTempRegister(ap2);
252
                ReleaseTempRegister(ap1);
253
//              GenerateDiadic(op_sge,0,ap3,ap3);
254
                return (ap3);
255
        case en_flt:
256
        case en_fle:
257
        case en_fgt:
258
        case en_fge:
259
        case en_feq:
260
        case en_fne:
261
                size = GetNaturalSize(node);
262
                ap3 = GetTempRegister();
263
                ap1 = GenerateExpression(node->p[0], F_FPREG, size);
264
                ap2 = GenerateExpression(node->p[1], F_FPREG, size);
265
                GenerateTriadic(op, ap1->fpsize(), ap3, ap1, ap2);
266
                ReleaseTempRegister(ap2);
267
                ReleaseTempRegister(ap1);
268
                return (ap3);
269
                /*
270
        case en_ne:
271
        case en_lt:
272
        case en_ult:
273
        case en_gt:
274
        case en_ugt:
275
        case en_le:
276
        case en_ule:
277
        case en_ge:
278
        case en_uge:
279
                size = GetNaturalSize(node);
280
                ap1 = GenerateExpression(node->p[0],F_REG, size);
281
                ap2 = GenerateExpression(node->p[1],F_REG|F_IMMED,size);
282
                GenerateTriadic(op,0,ap1,ap1,ap2);
283
                ReleaseTempRegister(ap2);
284
                return ap1;
285
*/
286
        case en_chk:
287
                size = GetNaturalSize(node);
288
        ap4 = GetTempRegister();
289
                ap1 = GenerateExpression(node->p[0],F_REG,size);
290
                ap2 = GenerateExpression(node->p[1],F_REG,size);
291
                ap3 = GenerateExpression(node->p[2],F_REG|F_IMM0,size);
292
                if (ap3->mode == am_imm) {  // must be a zero
293
                   ap3->mode = am_reg;
294
                   ap3->preg = 0;
295
        }
296
                Generate4adic(op_chk,0,ap4,ap1,ap2,ap3);
297
        ReleaseTempRegister(ap3);
298
        ReleaseTempRegister(ap2);
299
        ReleaseTempRegister(ap1);
300
        return ap4;
301
        }
302
        size = GetNaturalSize(node);
303
    ap3 = GetTempRegister();
304
        ap1 = GenerateExpression(node->p[0],F_REG,size);
305
        ap2 = GenerateExpression(node->p[1],F_REG|F_IMMED,size);
306
        GenerateTriadic(op,0,ap3,ap1,ap2);
307
    ReleaseTempRegister(ap2);
308
    ReleaseTempRegister(ap1);
309
    return ap3;
310
        /*
311
    GenerateFalseJump(node,lab0,0);
312
    ap1 = GetTempRegister();
313
    GenerateDiadic(op_ld,0,ap1,make_immed(1));
314
    GenerateMonadic(op_bra,0,make_label(lab1));
315
    GenerateLabel(lab0);
316
    GenerateDiadic(op_ld,0,ap1,make_immed(0));
317
    GenerateLabel(lab1);
318
    return ap1;
319
        */
320
}
321
 
322
void GenerateCmp(ENODE *node, int op, int label, int predreg, unsigned int prediction)
323
{
324
        int size, sz;
325
        Operand *ap1, *ap2, *ap3;
326
 
327
        size = GetNaturalSize(node);
328
    if (op==op_flt || op==op_fle || op==op_fgt || op==op_fge || op==op_feq || op==op_fne) {
329
        ap1 = GenerateExpression(node->p[0],F_FPREG,size);
330
            ap2 = GenerateExpression(node->p[1],F_FPREG,size);
331
    }
332
    else {
333
        ap1 = GenerateExpression(node->p[0],F_REG, size);
334
            ap2 = GenerateExpression(node->p[1],F_REG|F_IMMED,size);
335
    }
336
        /*
337
        // Optimize CMP to zero and branch into plain branch, this works only for
338
        // signed relational compares.
339
        if (ap2->mode == am_imm && ap2->offset->i==0 && (op==op_eq || op==op_ne || op==op_lt || op==op_le || op==op_gt || op==op_ge)) {
340
        switch(op)
341
        {
342
        case op_eq:     op = op_beq; break;
343
        case op_ne:     op = op_bne; break;
344
        case op_lt: op = op_blt; break;
345
        case op_le: op = op_ble; break;
346
        case op_gt: op = op_bgt; break;
347
        case op_ge: op = op_bge; break;
348
        }
349
        ReleaseTempReg(ap3);
350
                ReleaseTempReg(ap2);
351
                ReleaseTempReg(ap1);
352
                GenerateDiadic(op,0,ap1,make_clabel(label));
353
                return;
354
        }
355
        */
356
        /*
357
        if (op==op_ltu || op==op_leu || op==op_gtu || op==op_geu)
358
            GenerateTriadic(op_cmpu,0,ap3,ap1,ap2);
359
    else if (op==op_flt || op==op_fle || op==op_fgt || op==op_fge || op==op_feq || op==op_fne)
360
        GenerateTriadic(op_fdcmp,0,ap3,ap1,ap2);
361
        else
362
            GenerateTriadic(op_cmp,0,ap3,ap1,ap2);
363
        */
364
        sz = 0;
365
        switch(op)
366
        {
367
        case op_bchk:   break;
368
        case op_eq:     op = op_beq; break;
369
        case op_ne:     op = op_bne; break;
370
        case op_lt: op = op_blt; break;
371
        case op_le: op = op_ble; break;
372
        case op_gt: op = op_bgt; break;
373
        case op_ge: op = op_bge; break;
374
        case op_ltu: op = op_bltu; break;
375
        case op_leu: op = op_bleu; break;
376
        case op_gtu: op = op_bgtu; break;
377
        case op_geu: op = op_bgeu; break;
378
        case op_feq:    op = op_fbeq; sz = 'd'; break;
379
        case op_fne:    op = op_fbne; sz = 'd'; break;
380
        case op_flt:    op = op_fblt; sz = 'd'; break;
381
        case op_fle:    op = op_fble; sz = 'd'; break;
382
        case op_fgt:    op = op_fbgt; sz = 'd'; break;
383
        case op_fge:    op = op_fbge; sz = 'd'; break;
384
        /*
385
                GenerateTriadic(op_fcmp,'q',ap3,ap1,ap2);
386
                GenerateTriadic(op_bbs,0,ap3,make_immed(0),make_clabel(label));
387
                goto xit;
388
        case op_fne:
389
                GenerateTriadic(op_fcmp,'q',ap3,ap1,ap2);
390
                GenerateTriadic(op_bbc,0,ap3,make_immed(0),make_clabel(label));
391
                goto xit;
392
        case op_flt:
393
                GenerateTriadic(op_fcmp,'q',ap3,ap1,ap2);
394
                GenerateTriadic(op_bbs,0,ap3,make_immed(1),make_clabel(label));
395
                goto xit;
396
        case op_fle:
397
                GenerateTriadic(op_fcmp,'q',ap3,ap1,ap2);
398
                GenerateTriadic(op_bbs,0,ap3,make_immed(2),make_clabel(label));
399
                goto xit;
400
        case op_fgt:
401
                GenerateTriadic(op_fcmp,'q',ap3,ap1,ap2);
402
                GenerateTriadic(op_bbc,0,ap3,make_immed(2),make_clabel(label));
403
                goto xit;
404
        case op_fge:
405
                GenerateTriadic(op_fcmp,'q',ap3,ap1,ap2);
406
                GenerateTriadic(op_bbc,0,ap3,make_immed(1),make_clabel(label));
407
                goto xit;
408
        */
409
        }
410
        if (op==op_fbne || op==op_fbeq || op==op_fblt || op==op_fble || op==op_fbgt || op==op_fbge) {
411
                switch(op) {
412
                case op_fbne:
413
                        if (ap2->mode==am_imm) {
414
                                ap3 = GetTempFPRegister();
415
                                GenerateDiadic(op_ldi,0,ap3,ap2);
416
                                ReleaseTempRegister(ap3);
417
                                GenerateTriadic(op_fbne,sz,ap1,ap3,make_clabel(label));
418
                        }
419
                        else
420
                                GenerateTriadic(op_fbne,sz,ap1,ap2,make_clabel(label));
421
                        break;
422
                case op_fbeq:
423
                        if (ap2->mode==am_imm) {
424
                                ap3 = GetTempRegister();
425
                                GenerateDiadic(op_ldi,0,ap3,ap2);
426
                                ReleaseTempRegister(ap3);
427
                                GenerateTriadic(op_fbeq,sz,ap1,ap3,make_clabel(label));
428
                        }
429
                        else
430
                                GenerateTriadic(op_fbeq,sz,ap1,ap2,make_clabel(label));
431
                        break;
432
                case op_fblt:
433
                        if (ap2->mode==am_imm) {
434
                                ap3 = GetTempRegister();
435
                                GenerateDiadic(op_ldi,0,ap3,ap2);
436
                                ReleaseTempRegister(ap3);
437
                                GenerateTriadic(op_fblt,sz,ap1,ap3,make_clabel(label));
438
                        }
439
                        else
440
                                GenerateTriadic(op_fblt,sz,ap1,ap2,make_clabel(label));
441
                        break;
442
                case op_fble:
443
                        if (ap2->mode==am_imm) {
444
                                ap3 = GetTempRegister();
445
                                GenerateDiadic(op_ldi,0,ap3,ap2);
446
                                ReleaseTempRegister(ap3);
447
                                GenerateTriadic(op_fbge,sz,ap3,ap1,make_clabel(label));
448
                        }
449
                        else
450
                                GenerateTriadic(op_fbge,sz,ap2,ap1,make_clabel(label));
451
                        break;
452
                case op_fbgt:
453
                        if (ap2->mode==am_imm) {
454
                                ap3 = GetTempRegister();
455
                                GenerateDiadic(op_ldi,0,ap3,ap2);
456
                                ReleaseTempRegister(ap3);
457
                                GenerateTriadic(op_fblt,sz,ap3,ap1,make_clabel(label));
458
                        }
459
                        else
460
                                GenerateTriadic(op_fblt,sz,ap2,ap1,make_clabel(label));
461
                        break;
462
                case op_fbge:
463
                        if (ap2->mode==am_imm) {
464
                                ap3 = GetTempRegister();
465
                                GenerateDiadic(op_ldi,0,ap3,ap2);
466
                                ReleaseTempRegister(ap3);
467
                                GenerateTriadic(op_fbge,sz,ap1,ap3,make_clabel(label));
468
                        }
469
                        else
470
                                GenerateTriadic(op_fbge,sz,ap1,ap2,make_clabel(label));
471
                        break;
472
                }
473
        }
474
        else {
475
                switch(op) {
476
                case op_beq:
477
                        if (ap2->mode==am_imm && ap2->offset->nodetype==en_icon && ap2->offset->i >= -128 && ap2->offset->i <=128) {
478
                                GenerateTriadic(op_beqi,0,ap1,ap2,make_clabel(label));
479
                        }
480
                        else if (ap2->mode==am_imm) {
481
                                ap3 = GetTempRegister();
482
                                GenerateTriadic(op_xor, 0, ap3, ap1, ap2);
483
                                ReleaseTempRegister(ap3);
484
                                GenerateTriadic(op_beq,0,ap3,makereg(0),make_clabel(label));
485
                        }
486
                        else {
487
                                ReleaseTempReg(ap2);
488
                                ReleaseTempReg(ap1);
489
                                GenerateTriadic(op_beq, 0, ap1, ap2, make_clabel(label));
490
                                return;
491
                        }
492
                        break;
493
                case op_bne:
494
                        if (ap2->mode==am_imm) {
495
                                if (ap2->offset->i == 0)
496
                                        GenerateTriadic(op_bne,0,ap1,makereg(0),make_clabel(label));
497
                                else {
498
                                        ap3 = GetTempRegister();
499
                                        GenerateTriadic(op_xor, 0, ap3, ap1, ap2);
500
                                        ReleaseTempRegister(ap3);
501
                                        GenerateTriadic(op_bne,0,ap3,makereg(0),make_clabel(label));
502
                                }
503
                        }
504
                        else {
505
                                GenerateTriadic(op_bne,0,ap1,ap2,make_clabel(label));
506
                        }
507
                        break;
508
                case op_blt:
509
                        if (ap2->mode==am_imm) {
510
                                if (ap2->offset->i == 0)
511
                                        GenerateTriadic(op_blt,0,ap1,makereg(0),make_clabel(label));
512
                                else {
513
                                        ap3 = GetTempRegister();
514
                                        GenerateTriadic(op_slt, 0, ap3, ap1, ap2);
515
                                        ReleaseTempRegister(ap3);
516
                                        GenerateTriadic(op_bne,0,ap3,makereg(0),make_clabel(label));
517
                                }
518
                        }
519
                        else
520
                                GenerateTriadic(op_blt,0,ap1,ap2,make_clabel(label));
521
                        break;
522
                case op_ble:
523
                        if (ap2->mode==am_imm) {
524
                                if (ap2->offset->i == 0)
525
                                        GenerateTriadic(op_bge,0,makereg(0),ap1,make_clabel(label));
526
                                else {
527
                                        ap3 = GetTempRegister();
528
                                        GenerateTriadic(op_sle , 0, ap3, ap1, ap2);
529
                                        ReleaseTempRegister(ap3);
530
                                        GenerateTriadic(op_bne,0,makereg(0),ap3,make_clabel(label));
531
                                }
532
                        }
533
                        else
534
                                GenerateTriadic(op_bge,0,ap2,ap1,make_clabel(label));
535
                        break;
536
                case op_bgt:
537
                        if (ap2->mode==am_imm) {
538
                                if (ap2->offset->i == 0)
539
                                        GenerateTriadic(op_blt,0,makereg(0),ap1,make_clabel(label));
540
                                else {
541
                                        ap3 = GetTempRegister();
542
                                        GenerateTriadic(op_sle, 0, ap3, ap1, ap2);
543
                                        ReleaseTempRegister(ap3);
544
                                        GenerateTriadic(op_beq,0,makereg(0),ap3,make_clabel(label));
545
                                }
546
                        }
547
                        else
548
                                GenerateTriadic(op_blt,0,ap2,ap1,make_clabel(label));
549
                        break;
550
                case op_bge:
551
                        if (ap2->mode==am_imm) {
552
                                if (ap2->offset->i==0) {
553
                                        GenerateTriadic(op_bge,0,ap1,makereg(0),make_clabel(label));
554
                                }
555
                                else {
556
                                        ap3 = GetTempRegister();
557
                                        GenerateTriadic(op_slt, 0, ap3, ap1, ap2);
558
                                        ReleaseTempRegister(ap3);
559
                                        GenerateTriadic(op_beq,0,ap3,makereg(0),make_clabel(label));
560
                                }
561
                        }
562
                        else
563
                                GenerateTriadic(op_bge,0,ap1,ap2,make_clabel(label));
564
                        break;
565
                case op_bltu:
566
                        if (ap2->mode==am_imm) {
567
                                // Don't generate any code if testing against unsigned zero.
568
                                // An unsigned number can't be less than zero so the branch will
569
                                // always be false. Spit out a warning, its probably coded wrong.
570
                                if (ap2->offset->i == 0)
571
                                        error(ERR_UBLTZ);       //GenerateTriadic(op_bltu,0,ap1,makereg(0),make_clabel(label));
572
                                else {
573
                                        ap3 = GetTempRegister();
574
                                        GenerateTriadic(op_sltu, 0, ap3, ap1, ap2);
575
                                        ReleaseTempRegister(ap3);
576
                                        GenerateTriadic(op_bne,0,ap3,makereg(0),make_clabel(label));
577
                                }
578
                        }
579
                        else
580
                                GenerateTriadic(op_bltu,0,ap1,ap2,make_clabel(label));
581
                        break;
582
                case op_bleu:
583
                        if (ap2->mode==am_imm) {
584
                                if (ap2->offset->i == 0)
585
                                        GenerateTriadic(op_bgeu,0,makereg(0),ap1,make_clabel(label));
586
                                else {
587
                                        ap3 = GetTempRegister();
588
                                        GenerateTriadic(op_sleu, 0, ap3, ap1, ap2);
589
                                        ReleaseTempRegister(ap3);
590
                                        GenerateTriadic(op_bne,0,makereg(0),ap3,make_clabel(label));
591
                                }
592
                        }
593
                        else
594
                                GenerateTriadic(op_bgeu,0,ap2,ap1,make_clabel(label));
595
                        break;
596
                case op_bgtu:
597
                        if (ap2->mode==am_imm) {
598
                                if (ap2->offset->i == 0)
599
                                        GenerateTriadic(op_bltu,0,makereg(0),ap1,make_clabel(label));
600
                                else {
601
                                        ap3 = GetTempRegister();
602
                                        GenerateTriadic(op_sleu, 0, ap3, ap1, ap2);
603
                                        ReleaseTempRegister(ap3);
604
                                        GenerateTriadic(op_beq,0,makereg(0),ap3,make_clabel(label));
605
                                }
606
                        }
607
                        else
608
                                GenerateTriadic(op_bltu,0,ap2,ap1,make_clabel(label));
609
                        break;
610
                case op_bgeu:
611
                        if (ap2->mode==am_imm) {
612
                                if (ap2->offset->i == 0) {
613
                                        // This branch is always true
614
                                        error(ERR_UBGEQ);
615
                                        GenerateTriadic(op_bgeu,0,ap1,makereg(0),make_clabel(label));
616
                                }
617
                                else {
618
                                        ap3 = GetTempRegister();
619
                                        GenerateTriadic(op_sltu, 0, ap3, ap1, ap2);
620
                                        ReleaseTempRegister(ap3);
621
                                        GenerateTriadic(op_beq,0,ap3,makereg(0),make_clabel(label));
622
                                }
623
                        }
624
                        else
625
                                GenerateTriadic(op_bgeu,0,ap1,ap2,make_clabel(label));
626
                        break;
627
                }
628
                //GenerateTriadic(op,sz,ap1,ap2,make_clabel(label));
629
        }
630
        ReleaseTempReg(ap2);
631
        ReleaseTempReg(ap1);
632
}
633
 
634
 
635
static void SaveRegisterSet(SYM *sym)
636
{
637
        int nn, mm;
638
 
639
        if (!cpu.SupportsPush) {
640
                mm = sym->tp->GetBtp()->type!=bt_void ? 29 : 30;
641
                GenerateTriadic(op_sub,0,makereg(regSP),makereg(regSP),make_immed(mm*sizeOfWord));
642
                mm = 0;
643
                for (nn = 1 + (sym->tp->GetBtp()->type!=bt_void ? 1 : 0); nn < 31; nn++) {
644
                        GenerateDiadic(op_sw,0,makereg(nn),make_indexed(mm,regSP));
645
                        mm += sizeOfWord;
646
                }
647
        }
648
        else
649
                for (nn = 1 + (sym->tp->GetBtp()->type!=bt_void ? 1 : 0); nn < 31; nn++)
650
                        GenerateMonadic(op_push,0,makereg(nn));
651
}
652
 
653
static void RestoreRegisterSet(SYM * sym)
654
{
655
        int nn, mm;
656
 
657
        if (!cpu.SupportsPop) {
658
                mm = 0;
659
                for (nn = 1 + (sym->tp->GetBtp()->type!=bt_void ? 1 : 0); nn < 31; nn++) {
660
                        GenerateDiadic(op_lw,0,makereg(nn),make_indexed(mm,regSP));
661
                        mm += sizeOfWord;
662
                }
663
                mm = sym->tp->GetBtp()->type!=bt_void ? 29 : 30;
664
                GenerateTriadic(op_add,0,makereg(regSP),makereg(regSP),make_immed(mm*sizeOfWord));
665
        }
666
        else
667
                for (nn = 1 + (sym->tp->GetBtp()->type!=bt_void ? 1 : 0); nn < 31; nn++)
668
                        GenerateMonadic(op_pop,0,makereg(nn));
669
}
670
 
671
 
672
// Push temporaries on the stack.
673
 
674
void SaveRegisterVars(int64_t mask, int64_t rmask)
675
{
676
        int cnt;
677
        int nn;
678
 
679
        if( mask != 0 ) {
680
                cnt = 0;
681
                GenerateTriadic(op_sub,0,makereg(regSP),makereg(regSP),make_immed(popcnt(mask)*8));
682
                for (nn = 0; nn < 64; nn++) {
683
                        if (rmask & (0x8000000000000000ULL >> nn)) {
684
                                GenerateDiadic(op_sw,0,makereg(nn),make_indexed(cnt,regSP));
685
                                cnt+=sizeOfWord;
686
                        }
687
                }
688
        }
689
}
690
 
691
void SaveFPRegisterVars(int64_t mask, int64_t rmask)
692
{
693
        int cnt;
694
        int nn;
695
 
696
        if( mask != 0 ) {
697
                cnt = 0;
698
                GenerateTriadic(op_sub,0,makereg(regSP),makereg(regSP),make_immed(popcnt(mask)*8));
699
                for (nn = 0; nn < 64; nn++) {
700
                        if (rmask & (0x8000000000000000ULL >> nn)) {
701
                                GenerateDiadic(op_sf,'d',makefpreg(nn),make_indexed(cnt,regSP));
702
                                cnt+=sizeOfWord;
703
                        }
704
                }
705
        }
706
}
707
 
708
// Restore registers used as register variables.
709
 
710
static void RestoreRegisterVars()
711
{
712
        int cnt2, cnt;
713
        int nn;
714
 
715
        if( save_mask != 0 ) {
716
                cnt2 = cnt = popcnt(save_mask)*sizeOfWord;
717
                cnt = 0;
718
                for (nn = 0; nn < 64; nn++) {
719
                        if (save_mask & (1LL << nn)) {
720
                                GenerateDiadic(op_lw,0,makereg(nn),make_indexed(cnt,regSP));
721
                                cnt += sizeOfWord;
722
                        }
723
                }
724
                GenerateTriadic(op_add,0,makereg(regSP),makereg(regSP),make_immed(cnt2));
725
        }
726
}
727
 
728
static void RestoreFPRegisterVars()
729
{
730
        int cnt2, cnt;
731
        int nn;
732
 
733
        if( fpsave_mask != 0 ) {
734
                cnt2 = cnt = popcnt(fpsave_mask)*sizeOfWord;
735
                cnt = 0;
736
                for (nn = 0; nn < 64; nn++) {
737
                        if (fpsave_mask & (1LL << nn)) {
738
                                GenerateDiadic(op_lf,'d',makefpreg(nn),make_indexed(cnt,regSP));
739
                                cnt += sizeOfWord;
740
                        }
741
                }
742
                GenerateTriadic(op_add,0,makereg(regSP),makereg(regSP),make_immed(cnt2));
743
        }
744
}
745
 
746
static int round4(int n)
747
{
748
    while(n & 3) n++;
749
    return (n);
750
};
751
 
752
static void SaveTemporaries(Function *sym, int *sp, int *fsp)
753
{
754
        if (sym) {
755
                if (sym->UsesTemps) {
756
                        *sp = TempInvalidate(fsp);
757
                        //*fsp = TempFPInvalidate();
758
                }
759
        }
760
        else {
761
                *sp = TempInvalidate(fsp);
762
                //*fsp = TempFPInvalidate();
763
        }
764
}
765
 
766
static void RestoreTemporaries(Function *sym, int sp, int fsp)
767
{
768
        if (sym) {
769
                if (sym->UsesTemps) {
770
                        //TempFPRevalidate(fsp);
771
                        TempRevalidate(sp,fsp);
772
                }
773
        }
774
        else {
775
                //TempFPRevalidate(fsp);
776
                TempRevalidate(sp,fsp);
777
        }
778
}
779
 
780
// push the operand expression onto the stack.
781
// Structure variables are represented as an address in a register and arrive
782
// here as autocon nodes if on the stack. If the variable size is greater than
783
// 8 we assume a structure variable and we assume we have the address in a reg.
784
// Returns: number of stack words pushed.
785
//
786
static int GeneratePushParameter(ENODE *ep, int regno, int stkoffs)
787
{
788
        Operand *ap, *ap3;
789
        int nn = 0;
790
        int sz;
791
 
792
        switch(ep->etype) {
793
        case bt_quad:   sz = sizeOfFPD; break;
794
        case bt_triple: sz = sizeOfFPT; break;
795
        case bt_double: sz = sizeOfFPD; break;
796
        case bt_float:  sz = sizeOfFPD; break;
797
        default:        sz = sizeOfWord; break;
798
        }
799
        if (ep->tp) {
800
                if (ep->tp->IsFloatType())
801
                        ap = GenerateExpression(ep,F_REG,sizeOfFP);
802
                else
803
                        ap = GenerateExpression(ep,F_REG|F_IMMED,sizeOfWord);
804
        }
805
        else if (ep->etype==bt_quad)
806
                ap = GenerateExpression(ep,F_REG,sz);
807
        else if (ep->etype==bt_double)
808
                ap = GenerateExpression(ep,F_REG,sz);
809
        else if (ep->etype==bt_triple)
810
                ap = GenerateExpression(ep,F_REG,sz);
811
        else if (ep->etype==bt_float)
812
                ap = GenerateExpression(ep,F_REG,sz);
813
        else
814
                ap = GenerateExpression(ep,F_REG|F_IMMED,sz);
815
        switch(ap->mode) {
816
    case am_reg:
817
    case am_fpreg:
818
    case am_imm:
819
/*
820
        nn = round8(ep->esize);
821
        if (nn > 8) {// && (ep->tp->type==bt_struct || ep->tp->type==bt_union)) {           // structure or array ?
822
            ap2 = GetTempRegister();
823
            GenerateTriadic(op_subui,0,makereg(regSP),makereg(regSP),make_immed(nn));
824
            GenerateDiadic(op_mov, 0, ap2, makereg(regSP));
825
            GenerateMonadic(op_push,0,make_immed(ep->esize));
826
            GenerateMonadic(op_push,0,ap);
827
            GenerateMonadic(op_push,0,ap2);
828
            GenerateMonadic(op_bsr,0,make_string("memcpy_"));
829
            GenerateTriadic(op_addui,0,makereg(regSP),makereg(regSP),make_immed(24));
830
                GenerateMonadic(op_push,0,ap2);
831
            ReleaseTempReg(ap2);
832
            nn = nn >> 3;
833
        }
834
        else {
835
*/
836
                        if (regno) {
837
                                GenerateMonadic(op_hint,0,make_immed(1));
838
                                if (ap->mode==am_imm) {
839
                                        GenerateDiadic(op_ldi,0,makereg(regno & 0x7fff), ap);
840
                                        if (regno & 0x8000) {
841
                                                GenerateTriadic(op_sub,0,makereg(regSP),makereg(regSP),make_immed(sizeOfWord));
842
                                                nn = 1;
843
                                        }
844
                                }
845
                                else if (ap->mode==am_fpreg) {
846
                                        GenerateDiadic(op_mov,0,makefpreg(regno & 0x7fff), ap);
847
                                        if (regno & 0x8000) {
848
                                                GenerateTriadic(op_sub,0,makereg(regSP),makereg(regSP),make_immed(sz));
849
                                                nn = sz/sizeOfWord;
850
                                        }
851
                                }
852
                                else {
853
                                        //ap->preg = regno & 0x7fff;
854
                                        GenerateDiadic(op_mov,0,makereg(regno & 0x7fff), ap);
855
                                        if (regno & 0x8000) {
856
                                                GenerateTriadic(op_sub,0,makereg(regSP),makereg(regSP),make_immed(sizeOfWord));
857
                                                nn = 1;
858
                                        }
859
                                }
860
                        }
861
                        else {
862
                                if (cpu.SupportsPush) {
863
                                        if (ap->mode==am_imm) { // must have been a zero
864
                                                if (ap->offset->i==0)
865
                                                GenerateMonadic(op_push,0,makereg(0));
866
                                                else {
867
                                                        ap3 = GetTempRegister();
868
                                                        GenerateDiadic(op_ldi,0,ap3,ap);
869
                                                        GenerateMonadic(op_push,0,ap3);
870
                                                        ReleaseTempReg(ap3);
871
                                                }
872
                                                nn = 1;
873
                                        }
874
                                        else {
875
                                                if (ap->type=stddouble.GetIndex()) {
876
                                                        GenerateMonadic(op_push,ap->FloatSize,ap);
877
                                                        nn = sz/sizeOfWord;
878
                                                }
879
                                                else {
880
                                                GenerateMonadic(op_push,0,ap);
881
                                                        nn = 1;
882
                                                }
883
                                        }
884
                                }
885
                                else {
886
                                        if (ap->mode==am_imm) { // must have been a zero
887
                                                ap3 = nullptr;
888
                                                if (ap->offset->i!=0) {
889
                                                        ap3 = GetTempRegister();
890
                                                        GenerateDiadic(op_ldi,0,ap3,ap);
891
                                                GenerateDiadic(op_sw,0,ap3,make_indexed(stkoffs,regSP));
892
                                                        ReleaseTempReg(ap3);
893
                                                }
894
                                                else
895
                                                GenerateDiadic(op_sw,0,makereg(0),make_indexed(stkoffs,regSP));
896
                                                nn = 1;
897
                                        }
898
                                        else {
899
                                                if (ap->type==stddouble.GetIndex() || ap->mode==am_fpreg) {
900
                                                        GenerateDiadic(op_sf,'d',ap,make_indexed(stkoffs,regSP));
901
                                                        nn = sz/sizeOfWord;
902
                                                }
903
                                                else {
904
                                                GenerateDiadic(op_sw,0,ap,make_indexed(stkoffs,regSP));
905
                                                        nn = 1;
906
                                                }
907
                                        }
908
                                }
909
                        }
910
//        }
911
        break;
912
    }
913
//      ReleaseTempReg(ap);
914
        return nn;
915
}
916
 
917
// Store entire argument list onto stack
918
//
919
static int GenerateStoreArgumentList(Function *sym, ENODE *plist)
920
{
921
        TypeArray *ta = nullptr;
922
        int i,sum;
923
        OCODE *ip;
924
        ENODE *p;
925
        ENODE *pl[100];
926
        int nn;
927
 
928
        sum = 0;
929
        if (sym)
930
                ta = sym->GetProtoTypes();
931
 
932
        ip = peep_tail;
933
        GenerateTriadic(op_sub,0,makereg(regSP),makereg(regSP),make_immed(0));
934
        // Capture the parameter list. It is needed in the reverse order.
935
        for (nn = 0, p = plist; p != NULL; p = p->p[1], nn++) {
936
                pl[nn] = p->p[0];
937
        }
938
        for(--nn, i = 0; nn >= 0; --nn,i++ )
939
    {
940
//              sum += GeneratePushParameter(pl[nn],ta ? ta->preg[ta->length - i - 1] : 0,sum*8);
941
                sum += GeneratePushParameter(pl[nn],ta ? ta->preg[i] : 0,sum*8);
942
//              plist = plist->p[1];
943
    }
944
        if (sum==0)
945
                MarkRemove(ip->fwd);
946
        else
947
                ip->fwd->oper3 = make_immed(sum*sizeOfWord);
948
        if (ta)
949
                delete ta;
950
    return sum;
951
}
952
 
953
Operand *GenerateFunctionCall(ENODE *node, int flags)
954
{
955
        Operand *ap;
956
        Function *sym;
957
        Function *o_fn;
958
        SYM *s;
959
    int i;
960
        int sp = 0;
961
        int fsp = 0;
962
        int ps;
963
        TypeArray *ta = nullptr;
964
        int64_t mask,fmask;
965
        CSETable *csetbl;
966
 
967
        sym = nullptr;
968
 
969
        // Call the function
970
        if( node->p[0]->nodetype == en_nacon || node->p[0]->nodetype == en_cnacon ) {
971
                s = gsearch(*node->p[0]->sp);
972
                sym = s->fi;
973
        i = 0;
974
                sym->SaveTemporaries(&sp, &fsp);
975
  /*
976
        if ((sym->tp->GetBtp()->type==bt_struct || sym->tp->GetBtp()->type==bt_union) && sym->tp->GetBtp()->size > 8) {
977
            nn = tmpAlloc(sym->tp->GetBtp()->size) + lc_auto + round8(sym->tp->GetBtp()->size);
978
            GenerateMonadic(op_pea,0,make_indexed(-nn,regFP));
979
            i = 1;
980
        }
981
*/
982
                if (currentFn->HasRegisterParameters())
983
                        sym->SaveRegisterArguments();
984
        i = i + GenerateStoreArgumentList(sym,node->p[1]);
985
//              ReleaseTempRegister(ap);
986
                if (sym && sym->IsInline) {
987
                        o_fn = currentFn;
988
                        mask = save_mask;
989
                        fmask = fpsave_mask;
990
                        currentFn = sym;
991
                        ps = pass;
992
                        sym->Gen();
993
                        pass = ps;
994
                        currentFn = o_fn;
995
                        fpsave_mask = fmask;
996
                        save_mask = mask;
997
                }
998
                else {
999
                        GenerateMonadic(op_call,0,make_offset(node->p[0]));
1000
                        GenerateMonadic(op_bex,0,make_label(throwlab));
1001
                }
1002
        }
1003
    else
1004
    {
1005
        i = 0;
1006
    /*
1007
        if ((node->p[0]->tp->GetBtp()->type==bt_struct || node->p[0]->tp->GetBtp()->type==bt_union) && node->p[0]->tp->GetBtp()->size > 8) {
1008
            nn = tmpAlloc(node->p[0]->tp->GetBtp()->size) + lc_auto + round8(node->p[0]->tp->GetBtp()->size);
1009
            GenerateMonadic(op_pea,0,make_indexed(-nn,regFP));
1010
            i = 1;
1011
        }
1012
     */
1013
                ap = GenerateExpression(node->p[0],F_REG,sizeOfWord);
1014
                if (ap->offset)
1015
                        sym = ap->offset->sym->fi;
1016
                sym->SaveTemporaries(&sp, &fsp);
1017
                if (currentFn->HasRegisterParameters())
1018
                        sym->SaveRegisterArguments();
1019
        i = i + GenerateStoreArgumentList(sym,node->p[1]);
1020
                ap->mode = am_ind;
1021
                ap->offset = 0;
1022
                if (sym && sym->IsInline) {
1023
                        o_fn = currentFn;
1024
                        mask = save_mask;
1025
                        fmask = fpsave_mask;
1026
                        currentFn = sym;
1027
                        ps = pass;
1028
                        sym->Gen();
1029
                        pass = ps;
1030
                        currentFn = o_fn;
1031
                        fpsave_mask = fmask;
1032
                        save_mask = mask;
1033
                }
1034
                else {
1035
                        GenerateMonadic(op_call,0,ap);
1036
                        GenerateMonadic(op_bex,0,make_label(throwlab));
1037
                }
1038
                ReleaseTempRegister(ap);
1039
    }
1040
        // Pop parameters off the stack
1041
        if (i!=0) {
1042
                if (sym) {
1043
                        if (!sym->IsPascal)
1044
                                GenerateTriadic(op_add,0,makereg(regSP),makereg(regSP),make_immed(i * sizeOfWord));
1045
                }
1046
                else
1047
                        GenerateTriadic(op_add,0,makereg(regSP),makereg(regSP),make_immed(i * sizeOfWord));
1048
        }
1049
        if (currentFn->HasRegisterParameters())
1050
                sym->RestoreRegisterArguments();
1051
        sym->RestoreTemporaries(sp, fsp);
1052
        /*
1053
        if (sym) {
1054
           if (sym->tp->type==bt_double)
1055
           result = GetTempFPRegister();
1056
           else
1057
           result = GetTempRegister();
1058
    }
1059
    else {
1060
        if (node->etype==bt_double)
1061
            result = GetTempFPRegister();
1062
        else
1063
            result = GetTempRegister();
1064
    }
1065
        */
1066
        if (sym
1067
                && sym->sym
1068
                && sym->sym->tp
1069
                && sym->sym->tp->GetBtp()
1070
                && sym->sym->tp->GetBtp()->IsFloatType()) {
1071
                return (makefpreg(1));
1072
        }
1073
        if (sym
1074
                && sym->sym
1075
                && sym->sym->tp
1076
                && sym->sym->tp->GetBtp()
1077
                && sym->sym->tp->GetBtp()->IsVectorType())
1078
                return (makevreg(1));
1079
        ap = makereg(1);
1080
        if (sym
1081
                && sym->sym
1082
                && sym->sym->tp
1083
                && sym->sym->tp->GetBtp()
1084
                )
1085
                ap->isPtr = sym->sym->tp->GetBtp()->type == bt_pointer;
1086
        return (ap);
1087
        /*
1088
        else {
1089
                if( result->preg != 1 || (flags & F_REG) == 0 ) {
1090
                        if (sym) {
1091
                                if (sym->tp->GetBtp()->type==bt_void)
1092
                                        ;
1093
                                else {
1094
                    if (sym->tp->type==bt_double)
1095
                                            GenerateDiadic(op_fdmov,0,result,makefpreg(1));
1096
                    else
1097
                                            GenerateDiadic(op_mov,0,result,makereg(1));
1098
                }
1099
                        }
1100
                        else {
1101
                if (node->etype==bt_double)
1102
                                GenerateDiadic(op_fdmov,0,result,makereg(1));
1103
                else
1104
                                GenerateDiadic(op_mov,0,result,makereg(1));
1105
            }
1106
                }
1107
        }
1108
    return result;
1109
        */
1110
}
1111
 
1112
void GenLdi(Operand *ap1, Operand *ap2)
1113
{
1114
        GenerateDiadic(op_ldi,0,ap1,ap2);
1115
  return;
1116
}
1117
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.