https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100173
--- Comment #7 from Drea Pinski <pinskia at gcc dot gnu.org> ---
I have a patch to add simple TARGET_MEM_REF support.
Which gives now:
```
.L4:
movzwl (%r9), %esi
movzwl -62(%rax), %edi
addq $2, %r9
xorl %r8d, %r8d
movzwl 2(%rax), %ecx
subl %esi, %edi
addl %esi, %ecx
cmpw %cx, %di
cmovge %r10, %r8
cmovge %edi, %ecx
movzwl (%rax,%r8), %edi
movw %cx, 2(%rdx)
leal (%rdi,%rdi), %ecx
movw %cx, (%rdx)
movzwl -62(%rax), %edi
movzwl 2(%rax), %ecx
addl %esi, %edi
subl %esi, %ecx
xorl %esi, %esi
cmpw %cx, %di
cmovge %r10, %rsi
cmovge %edi, %ecx
addq $8, %rdx
addq $4, %rax
movzwl -4(%rax,%rsi), %esi
movw %cx, -2(%rdx)
leal 1(%rsi,%rsi), %ecx
movw %cx, -4(%rdx)
cmpq %rdx, %r11
jne .L4
```
That is no branches.
And it is similar to what LLVM gets at -O2.
Note a simple testcase like:
```
int f(int a, int *b, int *d, int *c)
{
for(int i = 0; i < 1024; i++)
{
int t;
int t1;
if (b[i] > d[i]) {
t1 = b[i];
t = c[i];
}
else {
t1 = d[i];
t = c[i+2];
}
b[i] = t+t1;
}
}
````
is supported. even if the target_mem_ref is more complex :).