@@ -5331,7 +5331,7 @@ class StubGenerator: public StubCodeGenerator {
53315331 * NOTE: each field will occupy a single vector register group
53325332 */
53335333 void base64_vector_decode_round (Register src, Register dst, Register codec,
5334- Register size, Register stepSrc, Register stepDst, Register failedIdx, Register minusOne,
5334+ Register size, Register stepSrc, Register stepDst, Register failedIdx,
53355335 VectorRegister inputV1, VectorRegister inputV2, VectorRegister inputV3, VectorRegister inputV4,
53365336 VectorRegister idxV1, VectorRegister idxV2, VectorRegister idxV3, VectorRegister idxV4,
53375337 VectorRegister outputV1, VectorRegister outputV2, VectorRegister outputV3,
@@ -5358,8 +5358,11 @@ class StubGenerator: public StubCodeGenerator {
53585358 __ vor_vv (outputV1, outputV1, outputV2);
53595359 __ vmseq_vi (v0, outputV1, -1 );
53605360 __ vfirst_m (failedIdx, v0);
5361- Label NoFailure;
5362- __ beq (failedIdx, minusOne, NoFailure);
5361+ Label NoFailure, FailureAtIdx0;
5362+ // valid value can only be -1 when < 0
5363+ __ bltz (failedIdx, NoFailure);
5364+ // when the first data (at index 0) fails, no need to process data anymore
5365+ __ beqz (failedIdx, FailureAtIdx0);
53635366 __ vsetvli (x0, failedIdx, Assembler::e8 , lmul, Assembler::mu, Assembler::tu);
53645367 __ slli (stepDst, failedIdx, 1 );
53655368 __ add (stepDst, failedIdx, stepDst);
@@ -5382,6 +5385,7 @@ class StubGenerator: public StubCodeGenerator {
53825385
53835386 // dst = dst + register_group_len_bytes * 3
53845387 __ add (dst, dst, stepDst);
5388+ __ BIND (FailureAtIdx0);
53855389 }
53865390
53875391 /* *
@@ -5501,7 +5505,7 @@ class StubGenerator: public StubCodeGenerator {
55015505 // Assembler::m2
55025506 __ BIND (ProcessM2);
55035507 base64_vector_decode_round (src, dst, codec,
5504- size, stepSrcM2, stepDst, failedIdx, minusOne,
5508+ size, stepSrcM2, stepDst, failedIdx,
55055509 v2, v4, v6, v8, // inputs
55065510 v10, v12, v14, v16, // indexes
55075511 v18, v20, v22, // outputs
@@ -5521,7 +5525,7 @@ class StubGenerator: public StubCodeGenerator {
55215525 __ srli (size, size, 1 );
55225526 __ srli (stepDst, stepDst, 1 );
55235527 base64_vector_decode_round (src, dst, codec,
5524- size, stepSrcM1, stepDst, failedIdx, minusOne,
5528+ size, stepSrcM1, stepDst, failedIdx,
55255529 v1, v2, v3, v4, // inputs
55265530 v5, v6, v7, v8, // indexes
55275531 v9, v10, v11, // outputs
0 commit comments