<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/144422>144422</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[RISCV] failure to use mulw for 32 bit multiplication
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
tom-rein
</td>
</tr>
</table>
<pre>
LLVM doesn't use mulw, except when it otherwise would have to introduce a sext.w.
The following code could use only mulw, but LLVM uses mul instead ([godbolt](https://godbolt.org/z/9aoTKK8Kv)):
```C++
int cube(int x) {
return x * x * x;
}
int squarep1(int x) {
return x * x + 1;
}
int mulshift(int x) {
return x * x << 4;
}
void store(int x, int &y) {
y = x * x;
}
void store(short x, short &y) {
y = x * x;
}
void store(unsigned char x, unsigned char &y) {
y = x * x;
}
void store(signed char x, signed char &y) {
y = x * x;
}
short square16(short x) {
return x * x;
}
int square(short x) {
return x * x;
}
unsigned short square16(unsigned short x) {
return x * x;
}
unsigned char square8(unsigned char x) {
return x * x;
}
signed char square8(signed char x) {
return x * x;
}
int square(unsigned char x) {
return x * x;
}
int square(signed char x) {
return x * x;
}
long square(unsigned x) {
return x * x;
}
```
LLVM generates this:
```
cube(int):
mul a1, a0, a0
mulw a0, a1, a0
ret
squarep1(int):
mul a0, a0, a0
addiw a0, a0, 1
ret
mulshift(int):
mul a0, a0, a0
slliw a0, a0, 4
ret
store(int, int&):
mul a0, a0, a0
sw a0, 0(a1)
ret
store(short, short&):
mul a0, a0, a0
sh a0, 0(a1)
ret
store(unsigned char, unsigned char&):
mul a0, a0, a0
sb a0, 0(a1)
ret
store(signed char, signed char&):
mul a0, a0, a0
sb a0, 0(a1)
ret
square16(short):
mul a0, a0, a0
sext.h a0, a0
ret
square(short):
mul a0, a0, a0
ret
square16(unsigned short):
mul a0, a0, a0
zext.h a0, a0
ret
square8(unsigned char):
mul a0, a0, a0
zext.b a0, a0
ret
square8(signed char):
mul a0, a0, a0
sext.b a0, a0
ret
square(unsigned char):
mul a0, a0, a0
ret
square(signed char):
mul a0, a0, a0
ret
square(unsigned int):
mul a0, a0, a0
zext.w a0, a0
ret
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJykV02PozgQ_TXFpdQRmI_AgUM6rUirnr3sjuZuwAleOThrm9A9v35koJOGQCbNRIggyn7vVZV5sqnW_FAxlkL4DOGLQ2tTSpUaeXxSjFdOJov39Nu3H39jIZmugKwN1prhsRYNkC2yt5ydDDYlq5AblKZkquGaYSNrUWBJzwyNRF4ZJYs6Z0hRszezalbgbsDdfC8Z7qUQsuHVAXNZMMzbmZZEVuL9wpTVBlshtWbavkVeacNogUBiCJ8PssikMBC-AIlLY04a_A2QHZBdH1pJdQCy-wlkl1D5_fU1fj0DSezlWy0Qud21BfJsL3fDK4N5nTEgsX18A5IgrG0EFTO1qvANgWw-7uDbEKxfuuTsFP1_TRU7eRMIiLcgz-hNgBxroUu-N4-B-FvwtxiMcM6SF6iNVJ-S2drGIJDofYj4juC_zCQ1wNGlVD1S9_gHWHXVLsUC85KqDnP46k90jpGX43Z5dm31os81mO_J7LpYNP1SlRspo8j8cp1DbOvRAcZTLXlY4zTeUrRBwZaLGtZ9IYiQ1WFCzOMQHy7TwbWWdmAVU9QwjabkeuRG4G6uFnQxK-x_1gjtj3p2WVO3vw8GNO2ALuTdDFDM9D0bWNUk0wV_DEKLgjdXlvbuTZEMrexKcsljjkELccMQTKZx9bje4YBE83Wb5Wvw0wAXSGxrl_Tf0pCq_dwuJriMrpylm0tw8CHc2OWcinkF2ZcVjPgfYL9fg3kFo0V6Nd4FLHb_UeJUaMSygGNK59CVvy74Zyf493pvLPsLXC1J9khV4nHjv7TIHqaZz-W3BZto41K9d0TddeO7vWzu5f9h-06R-kXiJ9RhqbcOXc_1XeI5ZRrvmRtmLIq8jGSZFzJC11EeJGsvJHtSxA5PiUtCN_IiLwn8wF2RYu_HQbIOAhrEdJ9A4LIj5WIlxPlod8UO17pmqRcEASGOoBkTuj0REFKxBtsoEGIPCCq1k56y-qAhcAXXRl9hDDeiPUr889e_2x8QvuCeclGr9gzwcWzAvVToE8x4u7E1_CR4Tg2XlVMrkY627tyUdbbK5RHIzvL0f08nJf9juQGya9VpILte_jklvwIAAP__FQeFBQ">