首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何“移除”SSE寄存器末尾的字节?

如何“移除”SSE寄存器末尾的字节?
EN

Stack Overflow用户
提问于 2013-04-01 05:41:11
回答 2查看 378关注 0票数 3

对于uni赋值,我需要编写一个函数来计算汇编中字符串(由指针和索引定义)中的空格数量。为此需要使用pcmpeqb (即使用SSE寄存器),并提示使用popcntpmovmskb。我的基本方法是以16字节块的形式处理字符串,将每个块加载到%xmm8中,并将其与初始化为包含16个空格的%xmm9进行比较。然而,我需要以某种方式特殊地处理最后一块。

我的第一个想法是使用rotate指令删除字符串末尾之后的垃圾。(保证字符串在结束后会分配一些额外的空间,以防止段错误,但那里的数据可能不应该用于比较。)我偶然发现了PSRLDQ,但它似乎不接受非直接参数。(或者至少拒绝我扔给它的东西。)所以我的问题是:如何才能删除SSE寄存器的最后X个字节,而不将其中的一半置零,或者逐个字地这样做?(据我所知,它们上的大多数可用操作都是这样的。)

我的代码(模样板)目前看起来是这样的--有问题的部分在最后,在标签_last:之后

代码语言:javascript
复制
    # === Arguments ===
    # %rdi - char *input
    # %rsi - size_t count
    # === Temporaries ===
    # %rdx - how many chars to process in final run
    # %rcx - how many characters were "read" already
    # %r8 - pop count of last iteration
    # %r9
    # %r11
    # === SSE Temporaries ===
    # %xmm8 - the chunk of the string being processed
    # %xmm9 - 16 spaces

    xor %rcx, %rcx
    xor %rax, %rax
    movdqu _spaces(%rip), %xmm9

_loop:
    # set %rdx to number of characters left to process
    mov %rsi, %rdx
    sub %rcx, %rdx

    # we've reached the end of the string
    cmp %rdx, %rsi
    jge _end

    movdqu (%rdi, %rcx), %xmm8 # load chunk of string to process
    add $16, %rcx

    # less than 16 characters to process
    cmp $16, %rdx
    jg _last

_compare: #compare %xmm8 with spaces and add count of spaces to %eax
    pcmpeqb %xmm9, %xmm8
    pmovmskb %xmm8, %r8d
    popcntl %r8d, %r8d
    add %r8d, %eax
    jmp _loop

_last: # last part of string, less than 16 chars
    sub $16, %rdx
    neg %rdx
    # I need to delete possible garbage after the last chars
    psrldq %edx, %xmm8 
    jmp _compare

_end:
    ret

(那里的控制流可能仍然有but,但我稍后会处理这个问题。)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-01 06:06:35

我认为最简单的解决方案是使用SSE寄存器中的所有16个字符,但屏蔽pmovmskb之后的位。请注意,像您这样使用16字节加载是不安全的,因为您可能会进入一个无法访问的页面。

票数 2
EN

Stack Overflow用户

发布于 2013-04-08 07:23:11

不要试图“删除”SSE寄存器中的多余字节。相反,在比较并执行PMOVMSKB之后,只需屏蔽与额外字节相对应的结果掩码中的位。这是矢量化中的一种非常标准的方法;而不是一步一个脚印地获取您想要的数据,处理所有的数据,然后在以后清理您不想要的部分。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15734862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档