From dd472117aa4002952d90c7110a3f61ae8fb237f2 Mon Sep 17 00:00:00 2001 From: Themis Demetriades Date: Wed, 5 Jun 2024 22:50:04 +0100 Subject: [PATCH] Add negation for second operand in DPR instructions w/ S --- src/execute.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/execute.c b/src/execute.c index d49878c..0506370 100644 --- a/src/execute.c +++ b/src/execute.c @@ -203,6 +203,9 @@ static void executeDPRegister(Machine *state, a64inst_instruction *inst) { // Apply shift to value held in second register a64inst_DPRegister_ArithmLogicData *arithmLogicData = &inst->data.DPRegisterData.processOpData.arithmLogicData; uint8_t shiftAmount = arithmLogicData->shiftAmount; + if (arithmLogicData->negShiftedSrc2) { + src2Val = ~src2Val; + } switch(arithmLogicData->shiftType) { case a64inst_LSL: @@ -214,7 +217,11 @@ static void executeDPRegister(Machine *state, a64inst_instruction *inst) { break; case a64inst_ASR: - src2Val = truncateValue((int64_t)src2Val >> shiftAmount, regType); + if (regType == a64inst_X) { + src2Val = truncateValue((int64_t)src2Val >> shiftAmount, regType); + } else { + src2Val = truncateValue((int32_t)src2Val >> shiftAmount, regType); + } break; case a64inst_ROR: