@@ -133,9 +133,17 @@ void Translator::translate(UnaryOperatorPtr unaryOperatorPtr) {
133
133
manager->occupy (operandRegPtr, unaryOperatorPtr);
134
134
} else if (unaryOperatorPtr->OpType () == UnaryOpType::Neg) { // -
135
135
auto result = manager->allocReg (unaryOperatorPtr);
136
+ if (unaryOperatorPtr->GetType ()->IsIntegerTy ()) {
137
+ manager->addCode (
138
+ new RCode (Subu, result, manager->zero , operandRegPtr));
139
+ } else if (unaryOperatorPtr->GetType ()->IsIntegerTy ()) {
140
+ auto reg0 = manager->getFreeFloat ();
141
+ std::string name0 = manager->addFloat (0 );
142
+ manager->addCode (new ICode (LS, reg0, name0));
143
+ manager->addCode (new RCode (SubS, result, reg0, operandRegPtr));
144
+ }
136
145
auto optype = unaryOperatorPtr->GetType ()->IsFloatTy () ? SubS : Subu;
137
- manager->addCode (
138
- new RCode (optype, result, manager->zero , operandRegPtr));
146
+
139
147
} else { // not !
140
148
assert (unaryOperatorPtr->OpType () == UnaryOpType::Not &&
141
149
" invalid unary operator" );
@@ -211,11 +219,11 @@ void Translator::translate(CompareInstructionPtr compareInstructionPtr) {
211
219
doOpposite = true ;
212
220
break ;
213
221
case CompareOpType::GreaterThan:
214
- op = CLtS ;
222
+ op = CLeS ;
215
223
doOpposite = true ;
216
224
break ;
217
225
case CompareOpType::GreaterThanOrEqual:
218
- op = CLeS ;
226
+ op = CLtS ;
219
227
doOpposite = true ;
220
228
break ;
221
229
case CompareOpType::LessThan:
@@ -255,10 +263,10 @@ void Translator::translate(BranchInstPtr branchInstPtr) {
255
263
std::string falseLabel =
256
264
*manager->getLabelName (branchInstPtr->FalseBlock ());
257
265
258
- manager->addCode (new ICode (Bnez, cond, falseLabel ));
266
+ manager->addCode (new ICode (Bnez, cond, trueLabel ));
259
267
manager->addCode (new RCode (Nop));
260
268
261
- manager->addCode (new JCode (J, trueLabel ));
269
+ manager->addCode (new JCode (J, falseLabel ));
262
270
manager->addCode (new RCode (Nop));
263
271
}
264
272
@@ -269,8 +277,12 @@ void Translator::translate(CallInstPtr callInstPtr) {
269
277
pushSet.insert (occ.first );
270
278
}
271
279
}
280
+ for (UsePtr use : *(callInstPtr->GetUseList ())) {
281
+ pushSet.erase (use->GetValue ());
282
+ }
283
+
272
284
int pos = manager->currentOffset - 4 -
273
- 4 * ( pushSet.size () - callInstPtr-> GetUseList ()-> size () );
285
+ 4 * pushSet.size ();
274
286
for (UsePtr use : *(callInstPtr->GetUseList ())) {
275
287
MipsCodeType codeType =
276
288
use->GetValue ()->GetType ()->IsFloatTy () ? SS : SW;
@@ -279,7 +291,6 @@ void Translator::translate(CallInstPtr callInstPtr) {
279
291
use->GetValue ()->GetType ()->IsFloatTy () ? FloatRegTy : TmpRegTy);
280
292
manager->addCode (new ICode (codeType, reg, manager->sp , pos));
281
293
pos -= 4 ;
282
- pushSet.erase (use->GetValue ());
283
294
}
284
295
285
296
for (auto valuePtr : pushSet) {
@@ -405,4 +416,8 @@ void Translator::translate(OutputInstPtr outputInstPtr) {
405
416
manager->addCode (new RCode (AddS, manager->f12 , reg, reg0));
406
417
manager->addCode (new ICode (Addiu, manager->v0 , manager->zero , 2 ));
407
418
manager->addCode (new RCode (Syscall));
419
+ // for test: put '\n'
420
+ manager->addCode (new ICode (Addiu, manager->a0 , manager->zero , 10 ));
421
+ manager->addCode (new ICode (Addiu, manager->v0 , manager->zero , 11 ));
422
+ manager->addCode (new RCode (Syscall));
408
423
}
0 commit comments