@@ -52,6 +52,7 @@ enum OpCode {
52
52
OpCodeBinOp,
53
53
OpCodeCast,
54
54
OpCodeDeoptSafepoint,
55
+ OpCodeSwitch,
55
56
OpCodeUnimplemented = 255 , // YKFIXME: Will eventually be deleted.
56
57
};
57
58
@@ -653,6 +654,32 @@ class YkIRWriter {
653
654
VLMap[I] = {BBIdx, InstIdx};
654
655
InstIdx++;
655
656
}
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
+
656
683
void serialiseInst (Instruction *I, ValueLoweringMap &VLMap, unsigned BBIdx,
657
684
unsigned &InstIdx) {
658
685
// Macro to make the dispatch below easier to read/sort.
@@ -673,6 +700,7 @@ class YkIRWriter {
673
700
INST_SERIALISE (I, ReturnInst, serialiseReturnInst);
674
701
INST_SERIALISE (I, SExtInst, serialiseSExtInst);
675
702
INST_SERIALISE (I, StoreInst, serialiseStoreInst);
703
+ INST_SERIALISE (I, SwitchInst, serialiseSwitchInst);
676
704
677
705
// INST_SERIALISE does an early return upon a match, so if we get here then
678
706
// the instruction wasn't handled.
0 commit comments