OLD | NEW |
---|---|
1 // | 1 // |
2 // The Subzero Code Generator | 2 // The Subzero Code Generator |
3 // | 3 // |
4 // This file is distributed under the University of Illinois Open Source | 4 // This file is distributed under the University of Illinois Open Source |
5 // License. See LICENSE.TXT for details. | 5 // License. See LICENSE.TXT for details. |
6 // | 6 // |
7 //===----------------------------------------------------------------------===// | 7 //===----------------------------------------------------------------------===// |
8 /// | 8 /// |
9 /// \file | 9 /// \file |
10 /// \brief Implements the TargetLoweringMIPS32 class, which consists almost | 10 /// \brief Implements the TargetLoweringMIPS32 class, which consists almost |
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
364 // There aren't any 64-bit integer registers for Mips32. | 364 // There aren't any 64-bit integer registers for Mips32. |
365 assert(Type != IceType_i64); | 365 assert(Type != IceType_i64); |
366 Variable *Reg = Func->makeVariable(Type); | 366 Variable *Reg = Func->makeVariable(Type); |
367 if (RegNum.hasValue()) | 367 if (RegNum.hasValue()) |
368 Reg->setRegNum(RegNum); | 368 Reg->setRegNum(RegNum); |
369 else | 369 else |
370 Reg->setMustHaveReg(); | 370 Reg->setMustHaveReg(); |
371 return Reg; | 371 return Reg; |
372 } | 372 } |
373 | 373 |
374 OperandMIPS32Mem *TargetMIPS32::formMemoryOperand(Operand *Operand, Type Ty) { | |
375 // It may be the case that address mode optimization already creates an | |
376 // OperandMIPS32Mem, so in that case it wouldn't need another level of | |
377 // transformation. | |
378 if (llvm::isa<OperandMIPS32Mem>(Operand)) { | |
Jim Stichnoth
2016/05/31 18:18:52
Sorry, I was a bit off in my previous comment. Th
| |
379 return llvm::cast<OperandMIPS32Mem>(Operand); | |
380 } | |
381 | |
382 // If we didn't do address mode optimization, then we only have a base/offset | |
383 // to work with. MIPS always requires a base register, so just use that to | |
384 // hold the operand. | |
385 auto *Base = llvm::cast<Variable>(legalize(Operand, Legal_Reg)); | |
386 return OperandMIPS32Mem::create( | |
387 Func, Ty, Base, | |
388 llvm::cast<ConstantInteger32>(Ctx->getConstantZero(IceType_i32))); | |
389 } | |
390 | |
374 void TargetMIPS32::emitVariable(const Variable *Var) const { | 391 void TargetMIPS32::emitVariable(const Variable *Var) const { |
375 if (!BuildDefs::dump()) | 392 if (!BuildDefs::dump()) |
376 return; | 393 return; |
377 Ostream &Str = Ctx->getStrEmit(); | 394 Ostream &Str = Ctx->getStrEmit(); |
378 const Type FrameSPTy = IceType_i32; | 395 const Type FrameSPTy = IceType_i32; |
379 if (Var->hasReg()) { | 396 if (Var->hasReg()) { |
380 Str << '$' << getRegName(Var->getRegNum(), Var->getType()); | 397 Str << '$' << getRegName(Var->getRegNum(), Var->getType()); |
381 return; | 398 return; |
382 } else { | 399 } else { |
383 int32_t Offset = Var->getStackOffset(); | 400 int32_t Offset = Var->getStackOffset(); |
(...skipping 936 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1320 | 1337 |
1321 void TargetMIPS32::lowerSelect(const InstSelect *Instr) { | 1338 void TargetMIPS32::lowerSelect(const InstSelect *Instr) { |
1322 UnimplementedLoweringError(this, Instr); | 1339 UnimplementedLoweringError(this, Instr); |
1323 } | 1340 } |
1324 | 1341 |
1325 void TargetMIPS32::lowerShuffleVector(const InstShuffleVector *Instr) { | 1342 void TargetMIPS32::lowerShuffleVector(const InstShuffleVector *Instr) { |
1326 UnimplementedLoweringError(this, Instr); | 1343 UnimplementedLoweringError(this, Instr); |
1327 } | 1344 } |
1328 | 1345 |
1329 void TargetMIPS32::lowerStore(const InstStore *Instr) { | 1346 void TargetMIPS32::lowerStore(const InstStore *Instr) { |
1330 UnimplementedLoweringError(this, Instr); | 1347 Operand *Value = Instr->getData(); |
1348 Operand *Addr = Instr->getAddr(); | |
1349 OperandMIPS32Mem *NewAddr = formMemoryOperand(Addr, Value->getType()); | |
1350 Type Ty = NewAddr->getType(); | |
1351 | |
1352 if (Ty == IceType_i64) { | |
1353 Value = legalizeUndef(Value); | |
1354 Variable *ValueHi = legalizeToReg(hiOperand(Value)); | |
1355 Variable *ValueLo = legalizeToReg(loOperand(Value)); | |
1356 _sw(ValueHi, llvm::cast<OperandMIPS32Mem>(hiOperand(NewAddr))); | |
1357 _sw(ValueLo, llvm::cast<OperandMIPS32Mem>(loOperand(NewAddr))); | |
1358 } else { | |
1359 Variable *ValueR = legalizeToReg(Value); | |
1360 _sw(ValueR, NewAddr); | |
1361 } | |
1331 } | 1362 } |
1332 | 1363 |
1333 void TargetMIPS32::doAddressOptStore() { UnimplementedError(getFlags()); } | 1364 void TargetMIPS32::doAddressOptStore() { UnimplementedError(getFlags()); } |
1334 | 1365 |
1335 void TargetMIPS32::lowerSwitch(const InstSwitch *Instr) { | 1366 void TargetMIPS32::lowerSwitch(const InstSwitch *Instr) { |
1336 UnimplementedLoweringError(this, Instr); | 1367 UnimplementedLoweringError(this, Instr); |
1337 } | 1368 } |
1338 | 1369 |
1339 void TargetMIPS32::lowerBreakpoint(const InstBreakpoint *Instr) { | 1370 void TargetMIPS32::lowerBreakpoint(const InstBreakpoint *Instr) { |
1340 UnimplementedLoweringError(this, Instr); | 1371 UnimplementedLoweringError(this, Instr); |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1502 Str << "\t.set\t" | 1533 Str << "\t.set\t" |
1503 << "nomips16\n"; | 1534 << "nomips16\n"; |
1504 } | 1535 } |
1505 | 1536 |
1506 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; | 1537 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; |
1507 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; | 1538 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; |
1508 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; | 1539 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; |
1509 | 1540 |
1510 } // end of namespace MIPS32 | 1541 } // end of namespace MIPS32 |
1511 } // end of namespace Ice | 1542 } // end of namespace Ice |
OLD | NEW |