Movups指令计数器

问题描述

您好,我正在寻找gcc使用的优化。在下面的代码中,我使用stpcpy复制了长的硬编码字符串。在下面的程序集中,您可以看到一系列指令,将xmm0寄存器的内容复制到rbx寄存器中。我不明白的是xmm0或相对寻址没有变化。这段代码不应该只是将xmm寄存器的开始复制到rbx的不同部分吗? movups指令有某种内部计数器吗?

char* stpcpy_test2(char* str){
char *filler = "filler2waaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawdawaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
char *ret = malloc(300);
stpcpy(str,filler);

strcpy(ret,"aahahaeheheheadwad");
return ret;}

下面是使用-O3选项在gcc 9.3上生成的程序集

stpcpy_test2:
    push    rbx
    mov     rbx,rdi
    mov     edi,300
    call    malloc
    movdqa  xmm0,XMMWORD PTR .LC0[rip]
    movabs  rdx,7016996765293437281
    movdqa  xmm1,XMMWORD PTR .LC2[rip]
    mov     QWORD PTR [rbx+176],rdx
    mov     edx,25697
    movups  XMMWORD PTR [rbx],xmm0
    movdqa  xmm0,XMMWORD PTR .LC1[rip]
    mov     BYTE PTR [rbx+184],0
    movups  XMMWORD PTR [rbx+16],xmm0
    movups  XMMWORD PTR [rbx+32],xmm0
    movups  XMMWORD PTR [rbx+64],xmm0
    movups  XMMWORD PTR [rbx+80],xmm0
    movups  XMMWORD PTR [rbx+96],xmm0
    movups  XMMWORD PTR [rbx+112],xmm0
    movups  XMMWORD PTR [rbx+128],xmm0
    movups  XMMWORD PTR [rbx+144],xmm0
    movups  XMMWORD PTR [rbx+160],XMMWORD PTR .LC3[rip]
    mov     WORD PTR [rax+16],dx
    mov     BYTE PTR [rax+18],0
    movups  XMMWORD PTR [rbx+48],xmm1
    movups  XMMWORD PTR [rax],xmm0
    pop     rbx
    ret

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...