<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/142961>142961</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[aarch64] gcc get better result than llvm for abs
</td>
</tr>
<tr>
<th>Labels</th>
<td>
NEON
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
vfdff
</td>
</tr>
</table>
<pre>
* test: https://godbolt.org/z/cTcjvPE1z
```
#include <stdlib.h>
int square (unsigned char *pix1, unsigned char *pix2) {
int sum=0;
for (int i=0; i< 16; i++)
sum += abs (pix1[i]-pix2[i]);
return sum;
}
```
* gcc: uabdl2 + uabal + uaddlv
```
square:
ldr q31, [x0]
ldr q30, [x1]
uabdl2 v29.8h, v31.16b, v30.16b
uabal v29.8h, v31.8b, v30.8b
uaddlv s31, v29.8h
fmov w0, s31
ret
```
* llvm:
```
square:
ldr q0, [x0]
ldr q1, [x1]
uabd v0.16b, v0.16b, v1.16b
ushll2 v1.8h, v0.16b, #0
ushll v0.8h, v0.8b, #0
uaddl2 v2.4s, v0.8h, v1.8h
uaddl v0.4s, v0.4h, v1.4h
add v0.4s, v0.4s, v2.4s
addv s0, v0.4s
fmov w0, s0
ret
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyElN9uqzgQxp9muBkV-Q8QuOCCNOWyuxf7AgabQOWE1jZst0-_siHkEPX0REgeeX72fP7sjLB2OF-VKiE9QnqKxOT60ZRzJ7suakb5XwmsQqesA15h79y7BV4Bq4HV51E2o3bxaM7A6i9gdftP-zb__UK_gFSQkfUjFTA-XFs9SYXAn62TemjiHviLz5FquDq0H5MwCoHl0zVIktj2wiCw6n34pMCe8bsEA1YgHI5AKkTEsNN0AX4iwG-T3ejp3OeGNeODZ6TZErJj-IqVR_R7oJ_jJxSN9auDiPQ4QHp6CnWX2K_aChnlJnNdBPg5OJyWA-688HZUeG5b7-gkGqmZr-VDoddISj0_rFsM8uZvKlFLgx88mAPp8ZN4Qfus_31wciPonlir48yKOO89NHMa06xZQhLCHS40PuL5Rud72B8C0S761jX3fHcZZz_-G8R56p4zyn3vmtbzZbHgt9ZspyZ_soX-4IofZ7JZcY_ooye218FCerNkY4Fx8kgu225k_i3onQu3Eif2BvZr9Z2HgVy23MjkRia_kkKGI-3JJQhVdmS4F0vuGKker4v8eFuRLLkseCEiVdJDUlCW56SI-lJ0smi6lKQdFyTNpEgVkW0hW8qKLuEqGkpGWEoyklJOsiSPE06TplGqKzqZ5uoACVEXMejYPwXfeqLB2kmVNGFFRiMtGqVt6GaMvb789QqM-b5mSs8_NdPZQkL0YJ297-AGp0MHFMK0fZZAevL_Tzwrh41yThk0yk7aoevFNTzC0FREY6PJ6PKhLQ6un5q4HS_A6vBgl-Hp3YxvqnXA6iDZAqtX1XPJ_g8AAP__fAp4Ww">