From 772bddaed79860d05f5d3b5ade09ec251b8cbbdb Mon Sep 17 00:00:00 2001 From: George Steed Date: Fri, 19 Jan 2024 11:17:50 +0000 Subject: [PATCH] Add missing memory/cc clobbers to AArch64 Neon kernels There are a few functions in source/scale_neon64.cc which write memory and set condition flags despite not declaring this in the asm clobber list, so add the missing clobbers. Also move a couple of memory/cc clobbers to the start of the clobber list to match other kernels. Bug: libyuv:974 Change-Id: I85f5ff5718e78a4481f7bc53cedaeceb14438895 Reviewed-on: https://chromium-review.googlesource.com/c/libyuv/libyuv/+/5309254 Commit-Queue: Frank Barchard Reviewed-by: Frank Barchard --- source/scale_neon64.cc | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/source/scale_neon64.cc b/source/scale_neon64.cc index 7c0723809..e1a377bba 100644 --- a/source/scale_neon64.cc +++ b/source/scale_neon64.cc @@ -38,7 +38,7 @@ void ScaleRowDown2_NEON(const uint8_t* src_ptr, "+r"(dst), // %1 "+r"(dst_width) // %2 : - : "v0", "v1" // Clobber List + : "memory", "cc", "v0", "v1" // Clobber List ); } @@ -61,7 +61,7 @@ void ScaleRowDown2Linear_NEON(const uint8_t* src_ptr, "+r"(dst), // %1 "+r"(dst_width) // %2 : - : "v0", "v1" // Clobber List + : "memory", "cc", "v0", "v1" // Clobber List ); } @@ -92,7 +92,7 @@ void ScaleRowDown2Box_NEON(const uint8_t* src_ptr, "+r"(dst), // %2 "+r"(dst_width) // %3 : - : "v0", "v1", "v2", "v3" // Clobber List + : "memory", "cc", "v0", "v1", "v2", "v3" // Clobber List ); } @@ -112,7 +112,7 @@ void ScaleRowDown4_NEON(const uint8_t* src_ptr, "+r"(dst_ptr), // %1 "+r"(dst_width) // %2 : - : "v0", "v1", "v2", "v3", "memory", "cc"); + : "memory", "cc", "v0", "v1", "v2", "v3"); } void ScaleRowDown4Box_NEON(const uint8_t* src_ptr, @@ -148,7 +148,7 @@ void ScaleRowDown4Box_NEON(const uint8_t* src_ptr, "+r"(src_ptr3), // %4 "+r"(dst_width) // %5 : - : "v0", "v1", "v2", "v3", "memory", "cc"); + : "memory", "cc", "v0", "v1", "v2", "v3"); } // Down scale from 4 to 3 pixels. Use the neon multilane read/write @@ -171,7 +171,7 @@ void ScaleRowDown34_NEON(const uint8_t* src_ptr, "+r"(dst_ptr), // %1 "+r"(dst_width) // %2 : - : "v0", "v1", "v2", "v3", "memory", "cc"); + : "memory", "cc", "v0", "v1", "v2", "v3"); } void ScaleRowDown34_0_Box_NEON(const uint8_t* src_ptr, @@ -229,8 +229,8 @@ void ScaleRowDown34_0_Box_NEON(const uint8_t* src_ptr, "+r"(dst_width), // %2 "+r"(src_stride) // %3 : - : "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v16", "v17", "v18", - "v19", "v20", "memory", "cc"); + : "memory", "cc", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v16", + "v17", "v18", "v19", "v20"); } void ScaleRowDown34_1_Box_NEON(const uint8_t* src_ptr, @@ -272,7 +272,7 @@ void ScaleRowDown34_1_Box_NEON(const uint8_t* src_ptr, "+r"(dst_width), // %2 "+r"(src_stride) // %3 : - : "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", "memory", "cc"); + : "memory", "cc", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20"); } static const uvec8 kShuf38 = {0, 3, 6, 8, 11, 14, 16, 19, @@ -306,7 +306,7 @@ void ScaleRowDown38_NEON(const uint8_t* src_ptr, "+r"(dst_ptr), // %1 "+r"(dst_width) // %2 : "r"(&kShuf38) // %3 - : "v0", "v1", "v2", "v3", "memory", "cc"); + : "memory", "cc", "v0", "v1", "v2", "v3"); } // 32x3 -> 12x1 @@ -427,9 +427,9 @@ void OMITFP ScaleRowDown38_3_Box_NEON(const uint8_t* src_ptr, : "r"(&kMult38_Div6), // %5 "r"(&kShuf38_2), // %6 "r"(&kMult38_Div9) // %7 - : "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v16", "v17", "v18", - "v19", "v20", "v21", "v22", "v23", "v24", "v25", "v29", "v30", "v31", - "memory", "cc"); + : "memory", "cc", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v16", + "v17", "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25", "v29", + "v30", "v31"); } // 32x2 -> 12x1 @@ -531,8 +531,8 @@ void ScaleRowDown38_2_Box_NEON(const uint8_t* src_ptr, "+r"(dst_width) // %3 : "r"(&kMult38_Div6), // %4 "r"(&kShuf38_2) // %5 - : "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v16", "v17", "v18", - "v19", "v30", "v31", "memory", "cc"); + : "memory", "cc", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v16", + "v17", "v18", "v19", "v30", "v31"); } void ScaleRowUp2_Linear_NEON(const uint8_t* src_ptr, @@ -1417,7 +1417,7 @@ void ScaleRowDown2Box_16_NEON(const uint16_t* src_ptr, "+r"(dst), // %2 "+r"(dst_width) // %3 : - : "v0", "v1", "v2", "v3" // Clobber List + : "memory", "cc", "v0", "v1", "v2", "v3" // Clobber List ); } @@ -1468,8 +1468,8 @@ void ScaleRowUp2_16_NEON(const uint16_t* src_ptr, "+r"(dst_width) // %3 : "r"(2LL), // %4 "r"(14LL) // %5 - : "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v16", "v17", "v18", - "v19" // Clobber List + : "memory", "cc", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v16", + "v17", "v18", "v19" // Clobber List ); }