From 7b6cc4ec705d0a227115ff61bd0fb954e2bf37fc Mon Sep 17 00:00:00 2001 From: SachinVin Date: Sat, 27 Jul 2019 09:56:24 +0530 Subject: [PATCH] a64 emitter: fix Scalar Saturating Instructions --- src/backend/A64/emitter/a64_emitter.cpp | 37 +++++++++++++++++++------ src/backend/A64/emitter/a64_emitter.h | 8 +++--- 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/src/backend/A64/emitter/a64_emitter.cpp b/src/backend/A64/emitter/a64_emitter.cpp index 12963a73..6eb399e2 100644 --- a/src/backend/A64/emitter/a64_emitter.cpp +++ b/src/backend/A64/emitter/a64_emitter.cpp @@ -1998,8 +1998,27 @@ void ARM64FloatEmitter::EmitScalarThreeSame(bool U, u32 size, u32 opcode, ARM64R Rd = DecodeReg(Rd); Rn = DecodeReg(Rn); Rm = DecodeReg(Rm); + int esize = 0; + switch (size) { + case 8: + esize = 0; + break; + case 16: + esize = 1; + break; + case 32: + esize = 2; + break; + case 64: + esize = 3; + break; + default: + ASSERT_MSG(false, "Size must be 8, 16, 32, or 64"); + break; + } - Write32((U << 29) | (0b1011110001 << 21) | (size << 22) | (Rm << 16) | + + Write32((U << 29) | (0b1011110001 << 21) | (esize << 22) | (Rm << 16) | (opcode << 11) | (1 << 10) | (Rn << 5) | Rd); } @@ -2799,17 +2818,17 @@ void ARM64FloatEmitter::EmitScalar3Source(bool isDouble, ARM64Reg Rd, ARM64Reg R } // Scalar three same -void ARM64FloatEmitter::SQADD(ESize esize, ARM64Reg Rd, ARM64Reg Rn, ARM64Reg Rm) { - EmitScalarThreeSame(0, static_cast(esize), 0b000011, Rd, Rn, Rm); +void ARM64FloatEmitter::SQADD(u8 size, ARM64Reg Rd, ARM64Reg Rn, ARM64Reg Rm) { + EmitScalarThreeSame(0, size, 0b00001, Rd, Rn, Rm); } -void ARM64FloatEmitter::SQSUB(ESize esize, ARM64Reg Rd, ARM64Reg Rn, ARM64Reg Rm) { - EmitScalarThreeSame(0, static_cast(esize), 0b001011, Rd, Rn, Rm); +void ARM64FloatEmitter::SQSUB(u8 size, ARM64Reg Rd, ARM64Reg Rn, ARM64Reg Rm) { + EmitScalarThreeSame(0, size, 0b00101, Rd, Rn, Rm); } -void ARM64FloatEmitter::UQADD(ESize esize, ARM64Reg Rd, ARM64Reg Rn, ARM64Reg Rm) { - EmitScalarThreeSame(1, static_cast(esize), 0b000011, Rd, Rn, Rm); +void ARM64FloatEmitter::UQADD(u8 size, ARM64Reg Rd, ARM64Reg Rn, ARM64Reg Rm) { + EmitScalarThreeSame(1, size, 0b00001, Rd, Rn, Rm); } -void ARM64FloatEmitter::UQSUB(ESize esize, ARM64Reg Rd, ARM64Reg Rn, ARM64Reg Rm) { - EmitScalarThreeSame(1, static_cast(esize), 0b001011, Rd, Rn, Rm); +void ARM64FloatEmitter::UQSUB(u8 size, ARM64Reg Rd, ARM64Reg Rn, ARM64Reg Rm) { + EmitScalarThreeSame(1, size, 0b00101, Rd, Rn, Rm); } // Scalar floating point immediate diff --git a/src/backend/A64/emitter/a64_emitter.h b/src/backend/A64/emitter/a64_emitter.h index f4b99436..533b1175 100644 --- a/src/backend/A64/emitter/a64_emitter.h +++ b/src/backend/A64/emitter/a64_emitter.h @@ -954,10 +954,10 @@ public: void FNMSUB(ARM64Reg Rd, ARM64Reg Rn, ARM64Reg Rm, ARM64Reg Ra); // Scalar three same - void SQADD(ESize esize, ARM64Reg Rd, ARM64Reg Rn, ARM64Reg Rm); - void UQADD(ESize esize, ARM64Reg Rd, ARM64Reg Rn, ARM64Reg Rm); - void SQSUB(ESize esize, ARM64Reg Rd, ARM64Reg Rn, ARM64Reg Rm); - void UQSUB(ESize esize, ARM64Reg Rd, ARM64Reg Rn, ARM64Reg Rm); + void SQADD(u8 size, ARM64Reg Rd, ARM64Reg Rn, ARM64Reg Rm); + void UQADD(u8 size, ARM64Reg Rd, ARM64Reg Rn, ARM64Reg Rm); + void SQSUB(u8 size, ARM64Reg Rd, ARM64Reg Rn, ARM64Reg Rm); + void UQSUB(u8 size, ARM64Reg Rd, ARM64Reg Rn, ARM64Reg Rm); // Scalar floating point immediate void FMOV(ARM64Reg Rd, uint8_t imm8);