36 lines
764 B
C++
36 lines
764 B
C++
// A contrived example to test the double jump removal peephole.
|
|
|
|
extern "C" unsigned long bar(unsigned long count) {
|
|
return count + 1;
|
|
}
|
|
|
|
unsigned long foo(unsigned long count) {
|
|
asm(
|
|
" cmpq $1,%0\n"
|
|
" je .L7\n"
|
|
" incq %0\n"
|
|
" jmp .L1\n"
|
|
".L1: jmp .L2\n"
|
|
".L2: incq %0\n"
|
|
" cmpq $2,%0\n"
|
|
" jne .L3\n"
|
|
" jmp .L4\n"
|
|
".L3: jmp .L5\n"
|
|
".L5: incq %0\n"
|
|
".L4: movq %0,%%rdi\n"
|
|
" pop %%rbp\n"
|
|
" jmp .L6\n"
|
|
".L7: pop %%rbp\n"
|
|
" incq %0\n"
|
|
" jmp .L6\n"
|
|
".L6: jmp bar\n"
|
|
:
|
|
: "m"(count)
|
|
);
|
|
return count;
|
|
}
|
|
|
|
int main(int argc, const char* argv[]) {
|
|
return foo(38);
|
|
}
|