Eric reported that native_sched_clock() gets miscompiled; we loose a seqcount
loop. These patches cure that.

After these patches:

native_sched_clock:
        pushq   %rbp    #
        movq    %rsp, %rbp      #,

        ... jump label ...

        rdtsc
        salq    $32, %rdx       #, tmp110
        orq     %rax, %rdx      # low, tmp110
        movq    %rdx, %r10      # tmp110, _23
        movq    $cyc2ns, %r9    #, tmp136
.L235:
        movl %gs:cyc2ns+32(%rip),%eax   # cyc2ns.seq.sequence, pfo_ret__
        movl    %eax, %ecx      # pfo_ret__, idx
        andl    $1, %ecx        #, idx
        salq    $4, %rcx        #, tmp116
        addq    %r9, %rcx       # tmp136, tmp117
        movq %gs:8(%rcx),%rdi   # cyc2ns.data[idx_14].cyc2ns_offset, pfo_ret__
        movl %gs:(%rcx),%esi    # cyc2ns.data[idx_14].cyc2ns_mul, pfo_ret__
        movl %gs:4(%rcx),%ecx   # cyc2ns.data[idx_14].cyc2ns_shift, pfo_ret__
        movl %gs:cyc2ns+32(%rip),%r8d   # cyc2ns.seq.sequence, pfo_ret__
        cmpl    %r8d, %eax      # pfo_ret__, pfo_ret__
        jne     .L235   #,
        movl    %esi, %esi      # pfo_ret__, pfo_ret__
        movq    %rsi, %rax      # pfo_ret__, tmp133
        mulq    %r10    # _23
        shrdq   %rdx, %rax      # pfo_ret__,, tmp134
        shrq    %cl, %rdx       # pfo_ret__,
        testb   $64, %cl        #, pfo_ret__
        cmovne  %rdx, %rax      #,, tmp134
        addq    %rdi, %rax      # pfo_ret__, <retval>
        popq    %rbp    #
        ret

Reply via email to