2016-10-26 1 views
1

y86 코드에서 루프를 풀려고했지만 테스트 프로그램을 실행하려고 할 때 두 가지 값을 얻었습니다. 등록 번호.Unrolling y86 loop

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 

와 내가 만든 풀린 버전은 다음과 같습니다 : 코드는

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이 실행되고 있지만 어디에 있는지 잘 모르겠습니다. 루프를 두 번 풀어 대신 2 개의 값을 확인했습니다.

답변

1

방금 ​​고쳤습니다. 함수를 제대로 언 롤하기 위해 루프를 시작하기 전에 % rdx를 감소 시키려고했습니다.