Skip to content

Commit 3d82c1a

Browse files
authored
Merge pull request rust-lang#145 from vext01/switch
Serialise switch instructions.
2 parents 94fbc4b + a789859 commit 3d82c1a

File tree

1 file changed

+28
-0
lines changed

1 file changed

+28
-0
lines changed

llvm/lib/YkIR/YkIRWriter.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ enum OpCode {
5252
OpCodeBinOp,
5353
OpCodeCast,
5454
OpCodeDeoptSafepoint,
55+
OpCodeSwitch,
5556
OpCodeUnimplemented = 255, // YKFIXME: Will eventually be deleted.
5657
};
5758

@@ -653,6 +654,32 @@ class YkIRWriter {
653654
VLMap[I] = {BBIdx, InstIdx};
654655
InstIdx++;
655656
}
657+
658+
void serialiseSwitchInst(SwitchInst *I, ValueLoweringMap &VLMap,
659+
unsigned BBIdx, unsigned &InstIdx) {
660+
// opcode:
661+
serialiseOpcode(OpCodeSwitch);
662+
// test_val:
663+
serialiseOperand(I, VLMap, I->getCondition());
664+
// default_dest:
665+
serialiseBlockLabel(I->getDefaultDest());
666+
// num_cases:
667+
assert(I->getNumCases() == std::distance(I->case_begin(), I->case_end()));
668+
OutStreamer.emitSizeT(I->getNumCases());
669+
// case_values:
670+
for (auto &Case : I->cases()) {
671+
// We can't handle case values larger than uint64_t for now.
672+
assert(Case.getCaseValue()->getBitWidth() <= 64);
673+
OutStreamer.emitInt64(Case.getCaseValue()->getZExtValue());
674+
}
675+
// case_dests:
676+
for (auto &Case : I->cases()) {
677+
serialiseBlockLabel(Case.getCaseSuccessor());
678+
}
679+
680+
InstIdx++;
681+
}
682+
656683
void serialiseInst(Instruction *I, ValueLoweringMap &VLMap, unsigned BBIdx,
657684
unsigned &InstIdx) {
658685
// Macro to make the dispatch below easier to read/sort.
@@ -673,6 +700,7 @@ class YkIRWriter {
673700
INST_SERIALISE(I, ReturnInst, serialiseReturnInst);
674701
INST_SERIALISE(I, SExtInst, serialiseSExtInst);
675702
INST_SERIALISE(I, StoreInst, serialiseStoreInst);
703+
INST_SERIALISE(I, SwitchInst, serialiseSwitchInst);
676704

677705
// INST_SERIALISE does an early return upon a match, so if we get here then
678706
// the instruction wasn't handled.

0 commit comments

Comments
 (0)