LLVM 22.0.0git
CSKYInstrInfo.cpp
Go to the documentation of this file.
1//===-- CSKYInstrInfo.h - CSKY Instruction Information --------*- C++ -*---===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file contains the CSKY implementation of the TargetInstrInfo class.
10//
11//===----------------------------------------------------------------------===//
12
13#include "CSKYInstrInfo.h"
16#include "CSKYTargetMachine.h"
18#include "llvm/MC/MCContext.h"
19
20#define DEBUG_TYPE "csky-instr-info"
21
22using namespace llvm;
23
24#define GET_INSTRINFO_CTOR_DTOR
25#include "CSKYGenInstrInfo.inc"
26
28 : CSKYGenInstrInfo(STI, CSKY::ADJCALLSTACKDOWN, CSKY::ADJCALLSTACKUP),
29 STI(STI) {
30 v2sf = STI.hasFPUv2SingleFloat();
31 v2df = STI.hasFPUv2DoubleFloat();
32 v3sf = STI.hasFPUv3SingleFloat();
33 v3df = STI.hasFPUv3DoubleFloat();
34}
35
38 // Block ends with fall-through condbranch.
39 assert(LastInst.getDesc().isConditionalBranch() &&
40 "Unknown conditional branch");
41 Target = LastInst.getOperand(1).getMBB();
42 Cond.push_back(MachineOperand::CreateImm(LastInst.getOpcode()));
43 Cond.push_back(LastInst.getOperand(0));
44}
45
50 bool AllowModify) const {
51 TBB = FBB = nullptr;
52 Cond.clear();
53
54 // If the block has no terminators, it just falls into the block after it.
55 MachineBasicBlock::iterator I = MBB.getLastNonDebugInstr();
56 if (I == MBB.end() || !isUnpredicatedTerminator(*I))
57 return false;
58
59 // Count the number of terminators and find the first unconditional or
60 // indirect branch.
61 MachineBasicBlock::iterator FirstUncondOrIndirectBr = MBB.end();
62 int NumTerminators = 0;
63 for (auto J = I.getReverse(); J != MBB.rend() && isUnpredicatedTerminator(*J);
64 J++) {
65 NumTerminators++;
66 if (J->getDesc().isUnconditionalBranch() ||
67 J->getDesc().isIndirectBranch()) {
68 FirstUncondOrIndirectBr = J.getReverse();
69 }
70 }
71
72 // If AllowModify is true, we can erase any terminators after
73 // FirstUncondOrIndirectBR.
74 if (AllowModify && FirstUncondOrIndirectBr != MBB.end()) {
75 while (std::next(FirstUncondOrIndirectBr) != MBB.end()) {
76 std::next(FirstUncondOrIndirectBr)->eraseFromParent();
77 NumTerminators--;
78 }
79 I = FirstUncondOrIndirectBr;
80 }
81
82 // We can't handle blocks that end in an indirect branch.
83 if (I->getDesc().isIndirectBranch())
84 return true;
85
86 // We can't handle blocks with more than 2 terminators.
87 if (NumTerminators > 2)
88 return true;
89
90 // Handle a single unconditional branch.
91 if (NumTerminators == 1 && I->getDesc().isUnconditionalBranch()) {
93 return false;
94 }
95
96 // Handle a single conditional branch.
97 if (NumTerminators == 1 && I->getDesc().isConditionalBranch()) {
99 return false;
100 }
101
102 // Handle a conditional branch followed by an unconditional branch.
103 if (NumTerminators == 2 && std::prev(I)->getDesc().isConditionalBranch() &&
104 I->getDesc().isUnconditionalBranch()) {
105 parseCondBranch(*std::prev(I), TBB, Cond);
106 FBB = getBranchDestBlock(*I);
107 return false;
108 }
109
110 // Otherwise, we can't handle this.
111 return true;
112}
113
115 int *BytesRemoved) const {
116 if (BytesRemoved)
117 *BytesRemoved = 0;
118 MachineBasicBlock::iterator I = MBB.getLastNonDebugInstr();
119 if (I == MBB.end())
120 return 0;
121
122 if (!I->getDesc().isUnconditionalBranch() &&
123 !I->getDesc().isConditionalBranch())
124 return 0;
125
126 // Remove the branch.
127 if (BytesRemoved)
128 *BytesRemoved += getInstSizeInBytes(*I);
129 I->eraseFromParent();
130
131 I = MBB.end();
132
133 if (I == MBB.begin())
134 return 1;
135 --I;
136 if (!I->getDesc().isConditionalBranch())
137 return 1;
138
139 // Remove the branch.
140 if (BytesRemoved)
141 *BytesRemoved += getInstSizeInBytes(*I);
142 I->eraseFromParent();
143 return 2;
144}
145
148 assert(MI.getDesc().isBranch() && "Unexpected opcode!");
149 // The branch target is always the last operand.
150 int NumOp = MI.getNumExplicitOperands();
151 assert(MI.getOperand(NumOp - 1).isMBB() && "Expected MBB!");
152 return MI.getOperand(NumOp - 1).getMBB();
153}
154
157 ArrayRef<MachineOperand> Cond, const DebugLoc &DL, int *BytesAdded) const {
158 if (BytesAdded)
159 *BytesAdded = 0;
160
161 // Shouldn't be a fall through.
162 assert(TBB && "insertBranch must not be told to insert a fallthrough");
163 assert((Cond.size() == 2 || Cond.size() == 0) &&
164 "CSKY branch conditions have two components!");
165
166 // Unconditional branch.
167 if (Cond.empty()) {
168 MachineInstr &MI = *BuildMI(&MBB, DL, get(CSKY::BR32)).addMBB(TBB);
169 if (BytesAdded)
170 *BytesAdded += getInstSizeInBytes(MI);
171 return 1;
172 }
173
174 // Either a one or two-way conditional branch.
175 unsigned Opc = Cond[0].getImm();
176 MachineInstr &CondMI = *BuildMI(&MBB, DL, get(Opc)).add(Cond[1]).addMBB(TBB);
177 if (BytesAdded)
178 *BytesAdded += getInstSizeInBytes(CondMI);
179
180 // One-way conditional branch.
181 if (!FBB)
182 return 1;
183
184 // Two-way conditional branch.
185 MachineInstr &MI = *BuildMI(&MBB, DL, get(CSKY::BR32)).addMBB(FBB);
186 if (BytesAdded)
187 *BytesAdded += getInstSizeInBytes(MI);
188 return 2;
189}
190
191static unsigned getOppositeBranchOpc(unsigned Opcode) {
192 switch (Opcode) {
193 default:
194 llvm_unreachable("Unknown conditional branch!");
195 case CSKY::BT32:
196 return CSKY::BF32;
197 case CSKY::BT16:
198 return CSKY::BF16;
199 case CSKY::BF32:
200 return CSKY::BT32;
201 case CSKY::BF16:
202 return CSKY::BT16;
203 case CSKY::BHZ32:
204 return CSKY::BLSZ32;
205 case CSKY::BHSZ32:
206 return CSKY::BLZ32;
207 case CSKY::BLZ32:
208 return CSKY::BHSZ32;
209 case CSKY::BLSZ32:
210 return CSKY::BHZ32;
211 case CSKY::BNEZ32:
212 return CSKY::BEZ32;
213 case CSKY::BEZ32:
214 return CSKY::BNEZ32;
215 }
216}
217
220 assert((Cond.size() == 2) && "Invalid branch condition!");
221 Cond[0].setImm(getOppositeBranchOpc(Cond[0].getImm()));
222 return false;
223}
224
227 const DebugLoc &DL, uint64_t Val,
228 MachineInstr::MIFlag Flag) const {
229 if (!isInt<32>(Val))
230 report_fatal_error("Should only materialize 32-bit constants.");
231
232 MachineRegisterInfo &MRI = MBB.getParent()->getRegInfo();
233
234 Register DstReg;
235 if (STI.hasE2()) {
236 DstReg = MRI.createVirtualRegister(&CSKY::GPRRegClass);
237
238 if (isUInt<16>(Val)) {
239 BuildMI(MBB, MBBI, DL, get(CSKY::MOVI32), DstReg)
240 .addImm(Val & 0xFFFF)
241 .setMIFlags(Flag);
242 } else if (isShiftedUInt<16, 16>(Val)) {
243 BuildMI(MBB, MBBI, DL, get(CSKY::MOVIH32), DstReg)
244 .addImm((Val >> 16) & 0xFFFF)
245 .setMIFlags(Flag);
246 } else {
247 BuildMI(MBB, MBBI, DL, get(CSKY::MOVIH32), DstReg)
248 .addImm((Val >> 16) & 0xFFFF)
249 .setMIFlags(Flag);
250 BuildMI(MBB, MBBI, DL, get(CSKY::ORI32), DstReg)
251 .addReg(DstReg)
252 .addImm(Val & 0xFFFF)
253 .setMIFlags(Flag);
254 }
255
256 } else {
257 DstReg = MRI.createVirtualRegister(&CSKY::mGPRRegClass);
258 if (isUInt<8>(Val)) {
259 BuildMI(MBB, MBBI, DL, get(CSKY::MOVI16), DstReg)
260 .addImm(Val & 0xFF)
261 .setMIFlags(Flag);
262 } else if (isUInt<16>(Val)) {
263 BuildMI(MBB, MBBI, DL, get(CSKY::MOVI16), DstReg)
264 .addImm((Val >> 8) & 0xFF)
265 .setMIFlags(Flag);
266 BuildMI(MBB, MBBI, DL, get(CSKY::LSLI16), DstReg)
267 .addReg(DstReg)
268 .addImm(8)
269 .setMIFlags(Flag);
270 if ((Val & 0xFF) != 0)
271 BuildMI(MBB, MBBI, DL, get(CSKY::ADDI16), DstReg)
272 .addReg(DstReg)
273 .addImm(Val & 0xFF)
274 .setMIFlags(Flag);
275 } else if (isUInt<24>(Val)) {
276 BuildMI(MBB, MBBI, DL, get(CSKY::MOVI16), DstReg)
277 .addImm((Val >> 16) & 0xFF)
278 .setMIFlags(Flag);
279 BuildMI(MBB, MBBI, DL, get(CSKY::LSLI16), DstReg)
280 .addReg(DstReg)
281 .addImm(8)
282 .setMIFlags(Flag);
283 if (((Val >> 8) & 0xFF) != 0)
284 BuildMI(MBB, MBBI, DL, get(CSKY::ADDI16), DstReg)
285 .addReg(DstReg)
286 .addImm((Val >> 8) & 0xFF)
287 .setMIFlags(Flag);
288 BuildMI(MBB, MBBI, DL, get(CSKY::LSLI16), DstReg)
289 .addReg(DstReg)
290 .addImm(8)
291 .setMIFlags(Flag);
292 if ((Val & 0xFF) != 0)
293 BuildMI(MBB, MBBI, DL, get(CSKY::ADDI16), DstReg)
294 .addReg(DstReg)
295 .addImm(Val & 0xFF)
296 .setMIFlags(Flag);
297 } else {
298 BuildMI(MBB, MBBI, DL, get(CSKY::MOVI16), DstReg)
299 .addImm((Val >> 24) & 0xFF)
300 .setMIFlags(Flag);
301 BuildMI(MBB, MBBI, DL, get(CSKY::LSLI16), DstReg)
302 .addReg(DstReg)
303 .addImm(8)
304 .setMIFlags(Flag);
305 if (((Val >> 16) & 0xFF) != 0)
306 BuildMI(MBB, MBBI, DL, get(CSKY::ADDI16), DstReg)
307 .addReg(DstReg)
308 .addImm((Val >> 16) & 0xFF)
309 .setMIFlags(Flag);
310 BuildMI(MBB, MBBI, DL, get(CSKY::LSLI16), DstReg)
311 .addReg(DstReg)
312 .addImm(8)
313 .setMIFlags(Flag);
314 if (((Val >> 8) & 0xFF) != 0)
315 BuildMI(MBB, MBBI, DL, get(CSKY::ADDI16), DstReg)
316 .addReg(DstReg)
317 .addImm((Val >> 8) & 0xFF)
318 .setMIFlags(Flag);
319 BuildMI(MBB, MBBI, DL, get(CSKY::LSLI16), DstReg)
320 .addReg(DstReg)
321 .addImm(8)
322 .setMIFlags(Flag);
323 if ((Val & 0xFF) != 0)
324 BuildMI(MBB, MBBI, DL, get(CSKY::ADDI16), DstReg)
325 .addReg(DstReg)
326 .addImm(Val & 0xFF)
327 .setMIFlags(Flag);
328 }
329 }
330
331 return DstReg;
332}
333
335 int &FrameIndex) const {
336 switch (MI.getOpcode()) {
337 default:
338 return 0;
339 case CSKY::LD16B:
340 case CSKY::LD16H:
341 case CSKY::LD16W:
342 case CSKY::LD32B:
343 case CSKY::LD32BS:
344 case CSKY::LD32H:
345 case CSKY::LD32HS:
346 case CSKY::LD32W:
347 case CSKY::FLD_S:
348 case CSKY::FLD_D:
349 case CSKY::f2FLD_S:
350 case CSKY::f2FLD_D:
351 case CSKY::RESTORE_CARRY:
352 break;
353 }
354
355 if (MI.getOperand(1).isFI() && MI.getOperand(2).isImm() &&
356 MI.getOperand(2).getImm() == 0) {
357 FrameIndex = MI.getOperand(1).getIndex();
358 return MI.getOperand(0).getReg();
359 }
360
361 return 0;
362}
363
365 int &FrameIndex) const {
366 switch (MI.getOpcode()) {
367 default:
368 return 0;
369 case CSKY::ST16B:
370 case CSKY::ST16H:
371 case CSKY::ST16W:
372 case CSKY::ST32B:
373 case CSKY::ST32H:
374 case CSKY::ST32W:
375 case CSKY::FST_S:
376 case CSKY::FST_D:
377 case CSKY::f2FST_S:
378 case CSKY::f2FST_D:
379 case CSKY::SPILL_CARRY:
380 break;
381 }
382
383 if (MI.getOperand(1).isFI() && MI.getOperand(2).isImm() &&
384 MI.getOperand(2).getImm() == 0) {
385 FrameIndex = MI.getOperand(1).getIndex();
386 return MI.getOperand(0).getReg();
387 }
388
389 return 0;
390}
391
394 Register SrcReg, bool IsKill, int FI,
395 const TargetRegisterClass *RC,
396 const TargetRegisterInfo *TRI,
397 Register VReg,
398 MachineInstr::MIFlag Flags) const {
399 DebugLoc DL;
400 if (I != MBB.end())
401 DL = I->getDebugLoc();
402
403 MachineFunction &MF = *MBB.getParent();
405 MachineFrameInfo &MFI = MF.getFrameInfo();
406
407 unsigned Opcode = 0;
408
409 if (CSKY::GPRRegClass.hasSubClassEq(RC)) {
410 Opcode = CSKY::ST32W; // Optimize for 16bit
411 } else if (CSKY::CARRYRegClass.hasSubClassEq(RC)) {
412 Opcode = CSKY::SPILL_CARRY;
413 CFI->setSpillsCR();
414 } else if (v2sf && CSKY::sFPR32RegClass.hasSubClassEq(RC))
415 Opcode = CSKY::FST_S;
416 else if (v2df && CSKY::sFPR64RegClass.hasSubClassEq(RC))
417 Opcode = CSKY::FST_D;
418 else if (v3sf && CSKY::FPR32RegClass.hasSubClassEq(RC))
419 Opcode = CSKY::f2FST_S;
420 else if (v3df && CSKY::FPR64RegClass.hasSubClassEq(RC))
421 Opcode = CSKY::f2FST_D;
422 else {
423 llvm_unreachable("Unknown RegisterClass");
424 }
425
428 MFI.getObjectSize(FI), MFI.getObjectAlign(FI));
429
430 BuildMI(MBB, I, DL, get(Opcode))
431 .addReg(SrcReg, getKillRegState(IsKill))
432 .addFrameIndex(FI)
433 .addImm(0)
434 .addMemOperand(MMO);
435}
436
439 int FI, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI,
440 Register VReg, MachineInstr::MIFlag Flags) const {
441 DebugLoc DL;
442 if (I != MBB.end())
443 DL = I->getDebugLoc();
444
445 MachineFunction &MF = *MBB.getParent();
447 MachineFrameInfo &MFI = MF.getFrameInfo();
448
449 unsigned Opcode = 0;
450
451 if (CSKY::GPRRegClass.hasSubClassEq(RC)) {
452 Opcode = CSKY::LD32W;
453 } else if (CSKY::CARRYRegClass.hasSubClassEq(RC)) {
454 Opcode = CSKY::RESTORE_CARRY;
455 CFI->setSpillsCR();
456 } else if (v2sf && CSKY::sFPR32RegClass.hasSubClassEq(RC))
457 Opcode = CSKY::FLD_S;
458 else if (v2df && CSKY::sFPR64RegClass.hasSubClassEq(RC))
459 Opcode = CSKY::FLD_D;
460 else if (v3sf && CSKY::FPR32RegClass.hasSubClassEq(RC))
461 Opcode = CSKY::f2FLD_S;
462 else if (v3df && CSKY::FPR64RegClass.hasSubClassEq(RC))
463 Opcode = CSKY::f2FLD_D;
464 else {
465 llvm_unreachable("Unknown RegisterClass");
466 }
467
470 MFI.getObjectSize(FI), MFI.getObjectAlign(FI));
471
472 BuildMI(MBB, I, DL, get(Opcode), DestReg)
473 .addFrameIndex(FI)
474 .addImm(0)
475 .addMemOperand(MMO);
476}
477
480 const DebugLoc &DL, Register DestReg,
481 Register SrcReg, bool KillSrc,
482 bool RenamableDest, bool RenamableSrc) const {
483 if (CSKY::GPRRegClass.contains(SrcReg) &&
484 CSKY::CARRYRegClass.contains(DestReg)) {
485 if (STI.hasE2()) {
486 BuildMI(MBB, I, DL, get(CSKY::BTSTI32), DestReg)
487 .addReg(SrcReg, getKillRegState(KillSrc))
488 .addImm(0);
489 } else {
490 assert(SrcReg < CSKY::R8);
491 BuildMI(MBB, I, DL, get(CSKY::BTSTI16), DestReg)
492 .addReg(SrcReg, getKillRegState(KillSrc))
493 .addImm(0);
494 }
495 return;
496 }
497
498 if (CSKY::CARRYRegClass.contains(SrcReg) &&
499 CSKY::GPRRegClass.contains(DestReg)) {
500
501 if (STI.hasE2()) {
502 BuildMI(MBB, I, DL, get(CSKY::MVC32), DestReg)
503 .addReg(SrcReg, getKillRegState(KillSrc));
504 } else {
505 assert(DestReg < CSKY::R16);
506 assert(DestReg < CSKY::R8);
507 BuildMI(MBB, I, DL, get(CSKY::MOVI16), DestReg).addImm(0);
508 BuildMI(MBB, I, DL, get(CSKY::ADDC16))
509 .addReg(DestReg, RegState::Define)
510 .addReg(SrcReg, RegState::Define)
511 .addReg(DestReg, getKillRegState(true))
512 .addReg(DestReg, getKillRegState(true))
513 .addReg(SrcReg, getKillRegState(true));
514 BuildMI(MBB, I, DL, get(CSKY::BTSTI16))
515 .addReg(SrcReg, RegState::Define | getDeadRegState(KillSrc))
516 .addReg(DestReg)
517 .addImm(0);
518 }
519 return;
520 }
521
522 unsigned Opcode = 0;
523 if (CSKY::GPRRegClass.contains(DestReg, SrcReg))
524 Opcode = STI.hasE2() ? CSKY::MOV32 : CSKY::MOV16;
525 else if (v2sf && CSKY::sFPR32RegClass.contains(DestReg, SrcReg))
526 Opcode = CSKY::FMOV_S;
527 else if (v3sf && CSKY::FPR32RegClass.contains(DestReg, SrcReg))
528 Opcode = CSKY::f2FMOV_S;
529 else if (v2df && CSKY::sFPR64RegClass.contains(DestReg, SrcReg))
530 Opcode = CSKY::FMOV_D;
531 else if (v3df && CSKY::FPR64RegClass.contains(DestReg, SrcReg))
532 Opcode = CSKY::f2FMOV_D;
533 else if (v2sf && CSKY::sFPR32RegClass.contains(SrcReg) &&
534 CSKY::GPRRegClass.contains(DestReg))
535 Opcode = CSKY::FMFVRL;
536 else if (v3sf && CSKY::FPR32RegClass.contains(SrcReg) &&
537 CSKY::GPRRegClass.contains(DestReg))
538 Opcode = CSKY::f2FMFVRL;
539 else if (v2df && CSKY::sFPR64RegClass.contains(SrcReg) &&
540 CSKY::GPRRegClass.contains(DestReg))
541 Opcode = CSKY::FMFVRL_D;
542 else if (v3df && CSKY::FPR64RegClass.contains(SrcReg) &&
543 CSKY::GPRRegClass.contains(DestReg))
544 Opcode = CSKY::f2FMFVRL_D;
545 else if (v2sf && CSKY::GPRRegClass.contains(SrcReg) &&
546 CSKY::sFPR32RegClass.contains(DestReg))
547 Opcode = CSKY::FMTVRL;
548 else if (v3sf && CSKY::GPRRegClass.contains(SrcReg) &&
549 CSKY::FPR32RegClass.contains(DestReg))
550 Opcode = CSKY::f2FMTVRL;
551 else if (v2df && CSKY::GPRRegClass.contains(SrcReg) &&
552 CSKY::sFPR64RegClass.contains(DestReg))
553 Opcode = CSKY::FMTVRL_D;
554 else if (v3df && CSKY::GPRRegClass.contains(SrcReg) &&
555 CSKY::FPR64RegClass.contains(DestReg))
556 Opcode = CSKY::f2FMTVRL_D;
557 else {
558 LLVM_DEBUG(dbgs() << "src = " << SrcReg << ", dst = " << DestReg);
559 LLVM_DEBUG(I->dump());
560 llvm_unreachable("Unknown RegisterClass");
561 }
562
563 BuildMI(MBB, I, DL, get(Opcode), DestReg)
564 .addReg(SrcReg, getKillRegState(KillSrc));
565}
566
571
572 Register GlobalBaseReg = CFI->getGlobalBaseReg();
573 if (GlobalBaseReg != 0)
574 return GlobalBaseReg;
575
576 // Insert a pseudo instruction to set the GlobalBaseReg into the first
577 // MBB of the function
578 MachineBasicBlock &FirstMBB = MF.front();
580 DebugLoc DL;
581
583 Type::getInt32Ty(MF.getFunction().getContext()), "_GLOBAL_OFFSET_TABLE_",
584 0, CSKYCP::ADDR);
585
586 unsigned CPI = MCP->getConstantPoolIndex(CPV, Align(4));
587
591 BuildMI(FirstMBB, MBBI, DL, get(CSKY::LRW32), CSKY::R28)
593 .addMemOperand(MO);
594
595 GlobalBaseReg = MRI.createVirtualRegister(&CSKY::GPRRegClass);
596 BuildMI(FirstMBB, MBBI, DL, get(TargetOpcode::COPY), GlobalBaseReg)
597 .addReg(CSKY::R28);
598
599 CFI->setGlobalBaseReg(GlobalBaseReg);
600 return GlobalBaseReg;
601}
602
604 switch (MI.getOpcode()) {
605 default:
606 return MI.getDesc().getSize();
607 case CSKY::CONSTPOOL_ENTRY:
608 return MI.getOperand(2).getImm();
609 case CSKY::SPILL_CARRY:
610 case CSKY::RESTORE_CARRY:
611 case CSKY::PseudoTLSLA32:
612 return 8;
613 case TargetOpcode::INLINEASM_BR:
614 case TargetOpcode::INLINEASM: {
615 const MachineFunction *MF = MI.getParent()->getParent();
616 const char *AsmStr = MI.getOperand(0).getSymbolName();
617 return getInlineAsmLength(AsmStr, *MF->getTarget().getMCAsmInfo());
618 }
619 }
620}
unsigned const MachineRegisterInfo * MRI
static void parseCondBranch(MachineInstr *LastInst, MachineBasicBlock *&Target, SmallVectorImpl< MachineOperand > &Cond)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
static unsigned getOppositeBranchOpc(unsigned Opcode)
IRTranslator LLVM IR MI
#define I(x, y, z)
Definition MD5.cpp:58
Register const TargetRegisterInfo * TRI
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
Definition Value.cpp:480
#define LLVM_DEBUG(...)
Definition Debug.h:114
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:41
static CSKYConstantPoolSymbol * Create(Type *Ty, const char *S, unsigned PCAdjust, CSKYCP::CSKYCPModifier Modifier)
CSKYConstantPoolValue - CSKY specific constantpool value.
unsigned getInstSizeInBytes(const MachineInstr &MI) const override
unsigned removeBranch(MachineBasicBlock &MBB, int *BytesRemoved=nullptr) const override
void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, Register DestReg, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI, Register VReg, MachineInstr::MIFlag Flags=MachineInstr::NoFlags) const override
unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, ArrayRef< MachineOperand > Cond, const DebugLoc &DL, int *BytesAdded=nullptr) const override
const CSKYSubtarget & STI
MachineBasicBlock * getBranchDestBlock(const MachineInstr &MI) const override
void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, Register SrcReg, bool IsKill, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI, Register VReg, MachineInstr::MIFlag Flags=MachineInstr::NoFlags) const override
bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify=false) const override
Register movImm(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &DL, uint64_t Val, MachineInstr::MIFlag Flag=MachineInstr::NoFlags) const
Register isLoadFromStackSlot(const MachineInstr &MI, int &FrameIndex) const override
Register getGlobalBaseReg(MachineFunction &MF) const
bool reverseBranchCondition(SmallVectorImpl< MachineOperand > &Cond) const override
Register isStoreToStackSlot(const MachineInstr &MI, int &FrameIndex) const override
CSKYInstrInfo(const CSKYSubtarget &STI)
void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, const DebugLoc &DL, Register DestReg, Register SrcReg, bool KillSrc, bool RenamableDest=false, bool RenamableSrc=false) const override
A debug info location.
Definition DebugLoc.h:124
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
Definition Function.cpp:359
bool isConditionalBranch() const
Return true if this is a branch which may fall through to the next instruction or may transfer contro...
MachineInstrBundleIterator< MachineInstr > iterator
The MachineConstantPool class keeps track of constants referenced by a function which must be spilled...
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags f, LLT MemTy, Align base_alignment, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr, SyncScope::ID SSID=SyncScope::System, AtomicOrdering Ordering=AtomicOrdering::NotAtomic, AtomicOrdering FailureOrdering=AtomicOrdering::NotAtomic)
getMachineMemOperand - Allocate a new MachineMemOperand.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
MachineConstantPool * getConstantPool()
getConstantPool - Return the constant pool object for the current function.
const MachineBasicBlock & front() const
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
const MachineInstrBuilder & add(const MachineOperand &MO) const
const MachineInstrBuilder & addFrameIndex(int Idx) const
const MachineInstrBuilder & addConstantPoolIndex(unsigned Idx, int Offset=0, unsigned TargetFlags=0) const
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & addMBB(MachineBasicBlock *MBB, unsigned TargetFlags=0) const
const MachineInstrBuilder & setMIFlags(unsigned Flags) const
const MachineInstrBuilder & addMemOperand(MachineMemOperand *MMO) const
reverse_iterator getReverse() const
Get a reverse iterator to the same node.
Representation of each machine instruction.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
const MCInstrDesc & getDesc() const
Returns the target instruction descriptor of this MachineInstr.
const MachineOperand & getOperand(unsigned i) const
A description of a memory reference used in the backend.
@ MOLoad
The memory access reads data.
@ MOStore
The memory access writes data.
MachineBasicBlock * getMBB() const
static MachineOperand CreateImm(int64_t Val)
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
Wrapper class representing virtual and physical registers.
Definition Register.h:19
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
const MCAsmInfo * getMCAsmInfo() const
Return target specific asm information.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
Target - Wrapper for Target specific information.
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:297
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ Define
Register definition.
This is an optimization pass for GlobalISel generic memory operations.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
constexpr bool isInt(int64_t x)
Checks if an integer fits into the given bit width.
Definition MathExtras.h:174
unsigned getDeadRegState(bool B)
MachineInstr * getImm(const MachineOperand &MO, const MachineRegisterInfo *MRI)
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:167
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
Definition MathExtras.h:198
unsigned getKillRegState(bool B)
constexpr bool isShiftedUInt(uint64_t x)
Checks if a unsigned integer is an N bit number shifted left by S.
Definition MathExtras.h:207
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
static LLVM_ABI MachinePointerInfo getConstantPool(MachineFunction &MF)
Return a MachinePointerInfo record that refers to the constant pool.
static LLVM_ABI MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.