@@ -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