<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/129863>129863</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[LoongArch][Inlineasm] Operand modifier 'u' and 'w' cause compilation error
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
SixWeining
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
SixWeining
</td>
</tr>
</table>
<pre>
## Background
When I read llama.cpp, I find code like this:
https://github.com/ggml-org/llama.cpp/blob/master/ggml/src/ggml-cpu/ggml-cpu-quants.c#L395-L409
```
#ifdef __clang__
#define VREGS_PREFIX "$vr"
#define XREGS_PREFIX "$xr"
#else // GCC
#define VREGS_PREFIX "$f"
#define XREGS_PREFIX "$f"
#endif
#define __ALL_REGS "0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31"
// Convert __m128i to __m256i
static inline __m256i ____m256i(__m128i in) {
__m256i out = __lasx_xvldi(0);
__asm__ volatile (
".irp i," __ALL_REGS "\n\t"
" .ifc %[out], " XREGS_PREFIX"\\i \n\t"
" .irp j," __ALL_REGS "\n\t"
" .ifc %[in], " VREGS_PREFIX "\\j \n\t"
" xvpermi.q $xr\\i, $xr\\j, 0x20 \n\t"
" .endif \n\t"
" .endr \n\t"
" .endif \n\t"
".endr \n\t"
: [out] "+f" (out) : [in] "f" (in)
);
return out;
}
```
which uses too many assembler directives to convert a `__m128i` to `__m256i`. And I try to simplify it by using inline assembly operand modifier [`u` and `w`](https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#LoongArch-Operand-Modifiers). But I find gcc works while clang not because clang requires the operand type must exactly matches the modifiers (i.e. `u` requires a 256-bits vector and `w` requires a 128-bits vector).
## Testcase
```
// cat 2.c
#include <lsxintrin.h>
#include <lasxintrin.h>
// Convert __m128i to __m256i
__m256i ____m256i(__m128i in) {
__m256i out = __lasx_xvldi(0);
__asm__ volatile (
"xvpermi.q %u[out], %u[in], 0x20 \n\t"
: [out] "+f" (out) : [in] "f" (in)
);
return out;
}
```
## Compile
```
$ clang --target=loongarch64 -mlasx -O2 2.c -c
2.c:8:9: error: invalid operand in inline asm: 'xvpermi.q ${0:u}, ${1:u}, 0x20
'
"xvpermi.q %u[out], %u[in], 0x20 \n\t"
^
2.c:8:9: error: unknown operand
<inline asm>:1:18: note: instantiated into assembly here
xvpermi.q $xr1, , 0x20
^
2 errors generated.
```
## gcc is ok
```
vinsgr2vr.d $vr1, $a1, 0x0
xvldi $xr0, 0
vinsgr2vr.d $vr1, $a2, 0x1
xvpermi.q $xr0, $xr1, 0x20
xvst $xr0, $a0, 0
ret
```
@MQ-mengqing
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysV19vq7gS_zTOyyjIDCEkD3kgtFlV6urcu3t1d9-QYxzwKZgc26Tpt78aIClt9mTP1R5UqcTzm_Fv_gvhnC6NUhsWbxni7_r8h9JGm5IhsvhhJjpftXbzfj7bt8XbhmHEMIKtkC-lbTtTMJ4ynv5RKQNPYJUooK5FIwJ5PDLM4AkO2hQg20JBrV8U-Eo7FpFO5f2xf8Udw12pfdXtA9k29KNs6nlrS4a7ibXdvm73DHeNcF7ZEcZw56y86MhjN3mdf-uE8S6QDKPnaB3Pnxd8TYSXfPzjKcNIHwp1gDyXtTBlng-HhTpoo-C_vz3-8nv-r98ed09_AoUGFydL_6egP29B53eQqp2CwUn4Jcv-zvzhB6y_Y5Qp9OEDPM_T5-ecdAjMGWYhwwwZZhHDbMEwixlmS4ZZwjBbMczWhOmBhAwJGhI2JHBI6JDgIeFDUghJozeNvW3SoLrIkDSQNJA0kDSQNJA0ItKIwgv3PiBZa07KesjzJsSVBt_SK8ZLzXjqvPBagjb14Fh_Dnl-QeDqoqYNwzWwZMt4egW2nQcWPUCe18Kd8_OpLkiHM1yzqEcCQJ4L1-Q5nNpaeF1TplajiB6GGGh7BM0wY4jT6H56-r7JDIszP3g4EUCgDxIYxizetp1n8QP1BgmmyR0ssDjTvdp3jUHP6Osto7sUYEpCmwmHmyLsSXy9oTBYgfPpqGyjg28w1PlAeTB2_U3sgJ-R33UEgr5-7_qqTGHvAEYL955bNwaj95_vXBmlcE3i0I1b6kYqGzqkKhwgfYgJcRH3NTqa-lCCVvnOGirX4YwlD5-HFE9fKy0r6Jxy4NsWGmHeQDinmn2tLBTaKun1qZeCHJtKAFvysUXYkpNoOOi7Z8kDSE0BT-DtG8mcbo61PryB9rB_g85pU16ab7zqDdqjssIU0LSFPmhFqdmyJe_IPp2zJX8l0lReq08jXsqgNF0wDPa2N1y00g0ihrvHs1emUMU8dU1QeRru0XPbmjK1spp_GW6e_zre7BiuA9h2_rJkSinhtbUvDl4r6uR-noNpPeyVFJ27nFj1rdOWQlWpqz_-7aig6ZwHdRbS12_QCC-rEXXx1vWJDFQAF5-vxgRgvJzvtXdwUtK3dhqOKSzE1RRGXgwpHnfrf5TzUjh1s6j6gSmFBwzkVUMbWXeFAhZltTtr4602QcWix1uxuJH_2Bj-4cHbj9OfOnunsybuPk3P_uA6ye4Om5_Qtf9_y475zNrmqOvbdC7GcpzPvbCl8ix6qKnYhZXVcgHzhiIH8y9I-YY5pZwSH6UrFqVr4qusbS29aHMStS6uxazNe982vWeYfBjbLNlyFqUd8R4GN0u24eRkjOY0Gck_S813MhM_3vGrMy-mfTUXvyhsUTb17JFFKdEOSZdaXQ3hcF4Yr4VXFAvfvo-vSlk1uf7TLgsH9lP3R4IDJwelMsqS3UvP_mXKaRJpB-3LJ8RJG1daPNmgGMO4OF0uXYhwuJnTvX3DTLcR0eM94G_t4GAnHOxcHPxs591hcraHOv9RLq4XWuX_wtkF__Xf80aZ8httCsbTWbGJinW0FjO1CZNFGCY8CRezarNW0SJOwoQLXIYLvpRKilWYcFwewggxnOkNcox5xOOQR2G8CFYYLsJVdFiJvZTJYcUWXDVC10FdnxpaITPtXKc2Ia5Xy2hWi72q3fgxY9Qr9NLxW8ZuSGm-70rHFrzWzrt3M177uv8Kum4aqtp4-9SXGVVZ_ABfbrYeJh3DZJjxmLzS-7hj-nYXXrdmKJpZZ-vNnY8dYjL-mx9t-1VJz3DX86fVODp42uD_AgAA__9ISMbc">