<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/60527>60527</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[X86] -x86-use-fsrm-for-memcpy does not ensure DF = false
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:X86
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
RKSimon
</td>
</tr>
</table>
<pre>
https://simd.godbolt.org/z/MGf1qovrW
If we enable Fast Short Rep Mov memcpy codegen, then we should ensure that the direction flag (DF) has been cleared before calling the REP MOV:
```
define void @doit(ptr %dst, ptr %src, i64 %len) {
call void @llvm.memcpy.p0.p0.i64(ptr %dst, ptr %src, i64 %len, i1 0)
ret void
}
declare void @llvm.memcpy.p0.p0.i64(ptr, ptr, i64, i1 )
```
-mcpu=tigerlake -x86-use-fsrm-for-memcpy
```
doit:
movq %rdx, %rcx
rep;movsb (%rsi), %es:(%rdi)
retq
```
should be:
```
doit:
movq %rdx, %rcx
cld
rep;movsb (%rsi), %es:(%rdi)
retq
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVF9vnT4M_TThxeKKG_4_8NCWHz9NU7Wplba9hsRA1kBoEu7affopwG21rtU2aVEEGGyfcxxjZq3sJ8SKpJckrQO2uEGb6ub9rRz1FLRaPFaDc7Ml8QWhDaGNlaM49Fq0WrmDNj2hzXdCm-v_u-O9PpnPJKpJdLFd33XwDQEn1iqEhlkHt4M2Dm5whmt9ghFHPj8C1wJ7nAi9Ajfg5GPsoBclACe7GAQ3MOc_gZAGuZN6gk6xHggt6obQEgZmoUWcgCtkBgW02GmDwJlScurX2Jv_PsL1h09eyEYxi_a9mgI7OSGctBRAkkho6QgtZmeA0FRY59ntljXcWzJLvKU88xJIfrklghX1KZFSp_GwCT3Mkd8yS_4i8xXII0SElufsBt2afFeR12f-XDGDf4K7A-5IO8QTwou6hCOfFxLXTvZoFLtDCB-KLFwshp01Y9hpE24wr5fV1_Fcchj16R4AvDgjHjyyf-IPZ23bMjiT-HLUJ9v6I_YuVnp-mz9uzbi-F_K5Mgbd_asc9mZq8c2z_4nkvn7DlSvxT1g_Rf9CPhBVLMq4ZAFWxyxP02NU5kkwVBiJPEPaJSmWaZ6zIhMJK7uMthi3IhWBrGhE44hGyfGY0DQ50JLllCZZzoqiY1lMkghHJtVh7RJt-kBau2CVRSnNA8VaVHYdCZS2jN_hJEh88aXICKV-SpjKx4Xt0lvfadI6-5zJSafWeeL90_rNdgGh0cKk3fkvrxsgcQ0dUxaDxagXg6eXbljaA9cjoY1H22_hbPRX5I7QZhVhCW1WHT8CAAD__995ZvU">