首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >展开y86循环

展开y86循环
EN

Stack Overflow用户
提问于 2016-10-26 09:37:25
回答 1查看 1.5K关注 0票数 1

我试图在y86代码中展开一个循环,但是当我试图运行一个测试程序时,我得到了两个不同的值。注册表。代码为:

代码语言:javascript
复制
    xorq %rax,%rax      # count = 0;
    andq %rdx,%rdx      # len <= 0?
    jle Done        # if so, goto Done:

Loop:   
    mrmovq (%rdi), %r10 # read val from src...
    rmmovq %r10, (%rsi) # ...and store it to dst
    andq %r10, %r10     # val <= 0?
    jle Npos        # if so, goto Npos:
    #irmovq $1, %r10
    #addq %r10, %rax        
    iaddq $1, %rax      # count++
Npos:   
    irmovq $1, %r10
    subq %r10, %rdx     # len--
    #irmovq $8, %r10
    #addq %r10, %rdi        
    #addq %r10, %rsi        
    iaddq $8, %rdi      # src++
    iaddq $8, %rsi      # dst++
    andq %rdx,%rdx      # len > 0?
    jg Loop         # if so, goto Loop:
Done:
    ret

我制作的展开版本是:

代码语言:javascript
复制
xorq %rax,%rax      # count = 0;
    andq %rdx,%rdx      # len <= 0?
    jle Done        # if so, goto Done:

Loop:   
    mrmovq (%rdi), %r10     # read val from src…
    mrmovq 8(%rdi), %r11    # <- from class get second value
    rmmovq %r10, (%rsi)     # ...and store it to dst
    rmmovq %r11, 8(%rsi)         # store second val to dst
    andq %r10, %r10     # val <= 0?
    jle Npos            # if so, goto Npos:
    iaddq $1, %rax

Npos:   
    andq %r11, %r11 # check if src[1] <= 0
    jle Npos2       # if it is, don’t increase count
    iaddq $1, %rax

Npos2: 
    irmvoq %2, %r10
    iaddq $16, %rdi     # increase stack or base pointer to get next 2 vals
    iaddq $16, %rsi     # increase stack or base pointer to store next 2 vals
    subq %r10, %rdx     # decrease length by 2
    jge Loop            # go back into loop if length >= 2

len_cleanup:
    iaddq $2, %rdx

cleanup:
    irmovq $1, %r10
    subq %r10, %rdx
    jl Done             # if length < 0, jmp to Done, no cleanup needed
    mrmovq (%rdi), %r10     # get next val
    rmmovq %r10, (%rsi)     # move val onto stack
    andq %r10, %r10     # check if val <= 0
    jle Done            # skip count if val < 0
    iaddq $1, %rax      # same as iaddq $1, %rax

Done: 
    ret

我应该得到的结果是2,但从展开的结果返回的结果是3。我知道有一个额外的iaddq正在执行,但我不确定在哪里。我将循环展开了两次,这样我就可以检查两个值。

EN

回答 1

Stack Overflow用户

发布于 2016-10-26 09:42:38

我刚修好了。在开始循环之前,我应该递减%rdx,以便正确地展开函数。

当您不知道迭代计数是展开因子的倍数时,您需要将do{ }while(--i >= 0);展开为

--i; do { }while(i-=2 >= 0);,以确保您不会超调。

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

https://stackoverflow.com/questions/40252351

复制
相关文章

相似问题

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