From 91fdab4f89de688d490d02ee8b4267bf5cf1c138 Mon Sep 17 00:00:00 2001 From: Wunkolo Date: Sun, 12 May 2024 21:15:33 -0700 Subject: [PATCH] [a64] Fix `OPCODE_CNTLZ` 8 and 16 bit CNTLZ needs its bit-count fixed to its original element-type --- a64_sequences.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/a64_sequences.cc b/a64_sequences.cc index 9b58a8409..e33e7ef5c 100644 --- a/a64_sequences.cc +++ b/a64_sequences.cc @@ -2740,16 +2740,18 @@ EMITTER_OPCODE_TABLE(OPCODE_BYTE_SWAP, BYTE_SWAP_I16, BYTE_SWAP_I32, // ============================================================================ struct CNTLZ_I8 : Sequence> { static void Emit(A64Emitter& e, const EmitArgType& i) { - // No 8bit lzcnt, so do 16 and sub 8. + // No 8bit lzcnt, so do 32 and sub 24. e.UXTB(i.dest, i.src1); e.CLZ(i.dest, i.dest); - e.SUB(i.dest.reg(), i.dest.reg(), 8); + e.SUB(i.dest.reg(), i.dest.reg(), 24); } }; struct CNTLZ_I16 : Sequence> { static void Emit(A64Emitter& e, const EmitArgType& i) { + // No 16bit lzcnt, so do 32 and sub 16. e.UXTH(i.dest, i.src1); e.CLZ(i.dest, i.dest); + e.SUB(i.dest.reg(), i.dest.reg(), 16); } }; struct CNTLZ_I32 : Sequence> {