| 18 | namespace FEXCore::CPU { |
| 19 | |
| 20 | DEF_OP(LoadContext) { |
| 21 | const auto Op = IROp->C<IR::IROp_LoadContext>(); |
| 22 | const auto OpSize = IROp->Size; |
| 23 | |
| 24 | if (Op->Class == FEXCore::IR::GPRClass) { |
| 25 | auto Dst = GetReg(Node); |
| 26 | |
| 27 | switch (OpSize) { |
| 28 | case IR::OpSize::i8Bit: ldrb(Dst, STATE, Op->Offset); break; |
| 29 | case IR::OpSize::i16Bit: ldrh(Dst, STATE, Op->Offset); break; |
| 30 | case IR::OpSize::i32Bit: ldr(Dst.W(), STATE, Op->Offset); break; |
| 31 | case IR::OpSize::i64Bit: ldr(Dst.X(), STATE, Op->Offset); break; |
| 32 | default: LOGMAN_MSG_A_FMT("Unhandled LoadContext size: {}", OpSize); break; |
| 33 | } |
| 34 | } else { |
| 35 | auto Dst = GetVReg(Node); |
| 36 | |
| 37 | switch (OpSize) { |
| 38 | case IR::OpSize::i8Bit: ldrb(Dst, STATE, Op->Offset); break; |
| 39 | case IR::OpSize::i16Bit: ldrh(Dst, STATE, Op->Offset); break; |
| 40 | case IR::OpSize::i32Bit: ldr(Dst.S(), STATE, Op->Offset); break; |
| 41 | case IR::OpSize::i64Bit: ldr(Dst.D(), STATE, Op->Offset); break; |
| 42 | case IR::OpSize::i128Bit: ldr(Dst.Q(), STATE, Op->Offset); break; |
| 43 | case IR::OpSize::i256Bit: |
| 44 | mov(TMP1, Op->Offset); |
| 45 | ld1b<ARMEmitter::SubRegSize::i8Bit>(Dst.Z(), PRED_TMP_32B.Zeroing(), STATE, TMP1); |
| 46 | break; |
| 47 | default: LOGMAN_MSG_A_FMT("Unhandled LoadContext size: {}", OpSize); break; |
| 48 | } |
| 49 | } |
| 50 | } |
| 51 | |
| 52 | DEF_OP(LoadContextPair) { |
| 53 | const auto Op = IROp->C<IR::IROp_LoadContextPair>(); |
nothing calls this directly
no test coverage detected