-
Notifications
You must be signed in to change notification settings - Fork 1
Analyzing ASM from LAS Test Cases
In order to dump the assembly code for the main function of a compiled test case use the following script:
objdump -d petsc_raw | c++filt | awk -v RS= '/^[[:xdigit:]].*<main>/'
replace main with another function name to retrieve the assembly for that function instead. Redirect the output into a file for best performance.
It is also possible to use gdb to decompile the assembly code, which is often faster, but that involves load the binary as an executable so the above is preferred for now.
The following are lists of the assembly code take from CORI using -O3 (for everything in the dependency stack) optimization on the section of the petsc_hard.cc file for each of 5 test cases between the calls to PCU_Time().
Raw PETSc API call:
413121: e8 3c 63 b2 04 callq 4f39462 <PCU_Time>
413126: c5 fb 11 04 24 vmovsd %xmm0,(%rsp)
41312b: 48 8b 54 24 28 mov 0x28(%rsp),%rdx
413130: 48 83 c4 f0 add $0xfffffffffffffff0,%rsp
413134: 44 89 e6 mov %r12d,%esi
413137: 44 89 e1 mov %r12d,%ecx
41313a: 49 89 d0 mov %rdx,%r8
41313d: 48 8b 7c 24 60 mov 0x60(%rsp),%rdi
413142: 4c 8b 4c 24 18 mov 0x18(%rsp),%r9
413147: c7 04 24 02 00 00 00 movl $0x2,(%rsp)
41314e: e8 8d 4d 35 00 callq 767ee0 <MatSetValues>
413153: 48 83 c4 10 add $0x10,%rsp
413157: e8 06 63 b2 04 callq 4f39462 <PCU_Time>
LasOps<petsc> API call:
41312f: e8 2e 63 b2 04 callq 4f39462 <PCU_Time>
413134: c5 fb 11 04 24 vmovsd %xmm0,(%rsp)
413139: 48 8b 54 24 28 mov 0x28(%rsp),%rdx
41313e: 48 83 c4 f0 add $0xfffffffffffffff0,%rsp
413142: 44 89 e6 mov %r12d,%esi
413145: 44 89 e1 mov %r12d,%ecx
413148: 49 89 d0 mov %rdx,%r8
41314b: 48 8b 7c 24 60 mov 0x60(%rsp),%rdi
413150: 4c 8b 4c 24 18 mov 0x18(%rsp),%r9
413155: c7 04 24 02 00 00 00 movl $0x2,(%rsp)
41315c: e8 9f 4d 35 00 callq 767f00 <MatSetValues>
413161: 48 83 c4 10 add $0x10,%rsp
413165: e8 f8 62 b2 04 callq 4f39462 <PCU_Time>
Function call:
413121: e8 3c 63 b2 04 callq 4f39462 <PCU_Time>
413126: c5 fb 11 04 24 vmovsd %xmm0,(%rsp)
41312b: 48 8b 54 24 28 mov 0x28(%rsp),%rdx
413130: 44 89 e6 mov %r12d,%esi
413133: 44 89 e1 mov %r12d,%ecx
413136: 49 89 d0 mov %rdx,%r8
413139: 48 8b 7c 24 50 mov 0x50(%rsp),%rdi
41313e: 4c 8b 4c 24 08 mov 0x8(%rsp),%r9
413143: e8 98 04 00 00 callq 4135e0 <add(_p_Mat*, int, int*, int, int*, double*)>
413148: e8 15 63 b2 04 callq 4f39462 <PCU_Time>
00000000004135e0 <add(_p_Mat*, int, int*, int, int*, double*)>:
4135e0: 48 83 ec 18 sub $0x18,%rsp
4135e4: c7 04 24 02 00 00 00 movl $0x2,(%rsp)
4135eb: e8 e0 48 35 00 callq 767ed0 <MatSetValues>
4135f0: 48 83 c4 18 add $0x18,%rsp
4135f4: c3 retq
4135f5: 0f 1f 40 00 nopl 0x0(%rax)
4135f9: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
C-virt function call:
413129: e8 34 63 b2 04 callq 4f39462 <PCU_Time>
41312e: c5 fb 11 04 24 vmovsd %xmm0,(%rsp)
413133: 48 8b 54 24 28 mov 0x28(%rsp),%rdx
413138: 44 89 e6 mov %r12d,%esi
41313b: 48 8b 7c 24 50 mov 0x50(%rsp),%rdi
413140: 44 89 e1 mov %r12d,%ecx
413143: 4c 8b 4c 24 08 mov 0x8(%rsp),%r9
413148: 49 89 d0 mov %rdx,%r8
41314b: 41 ff 55 00 callq *0x0(%r13)
41314f: e8 0e 63 b2 04 callq 4f39462 <PCU_Time>
0000000000413600 <_add(_p_Mat*, int, int*, int, int*, double*)>:
413600: 48 83 ec 18 sub $0x18,%rsp
413604: c7 04 24 02 00 00 00 movl $0x2,(%rsp)
41360b: e8 c0 48 35 00 callq 767ed0 <MatSetValues>
413610: 48 83 c4 18 add $0x18,%rsp
413614: c3 retq
413615: 0f 1f 40 00 nopl 0x0(%rax)
413619: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
C++ virtual function call
413129: e8 34 63 b2 04 callq 4f39462 <PCU_Time>
41312e: c5 fb 11 04 24 vmovsd %xmm0,(%rsp)
413133: 48 8b 4c 24 28 mov 0x28(%rsp),%rcx
413138: 48 83 c4 f0 add $0xfffffffffffffff0,%rsp
41313c: 4d 8b 55 00 mov 0x0(%r13),%r10
413140: 4c 89 ef mov %r13,%rdi
413143: 48 8b 44 24 18 mov 0x18(%rsp),%rax
413148: 48 8d 74 24 60 lea 0x60(%rsp),%rsi
41314d: 44 89 e2 mov %r12d,%edx
413150: 45 89 e0 mov %r12d,%r8d
413153: 49 89 c9 mov %rcx,%r9
413156: 48 89 04 24 mov %rax,(%rsp)
41315a: 41 ff 12 callq *(%r10)
41315d: 48 83 c4 10 add $0x10,%rsp
413161: e8 fc 62 b2 04 callq 4f39462 <PCU_Time>
0000000000413660 <petsc_ops::add(las::Mat*, int, int*, int, int*, double*)>:
413660: 48 8b 44 24 08 mov 0x8(%rsp),%rax
413665: 48 8b 3e mov (%rsi),%rdi
413668: 89 d6 mov %edx,%esi
41366a: 48 89 ca mov %rcx,%rdx
41366d: 44 89 c1 mov %r8d,%ecx
413670: 4d 89 c8 mov %r9,%r8
413673: 49 89 c1 mov %rax,%r9
413676: c7 44 24 08 02 00 00 movl $0x2,0x8(%rsp)
41367d: 00
41367e: e9 4d 48 35 00 jmpq 767ed0 <MatSetValues>
413683: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
413688: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
41368f: 00
Raw PETSc call:
bl 10633e0 <.apf::getElementNumbers(apf::NumberingOf<int>*, apf::MeshEntity*, apf::NewArray<int>&)>
nop
ld r5,168(r1)
ld r3,328(r1)
ld r8,192(r1)
mr r4,r14
mr r6,r14
li r9,2
mr r7,r5
bl 10dc8e0 <.MatSetValues>
LasOps<petsc> call:
bl 1063410 <.apf::getElementNumbers(apf::NumberingOf<int>*, apf::MeshEntity*, apf::NewArray<int>&)>
nop
ld r5,168(r1)
ld r3,0(r21)
ld r8,192(r1)
mr r4,r17
mr r6,r17
li r9,2
mr r7,r5
bl 10dc910 <.MatSetValues>
Function call:
bl 10633d0 <.apf::getElementNumbers(apf::NumberingOf<int>*, apf::MeshEntity*, apf::NewArray<int>&)>
nop
ld r5,168(r1)
ld r3,328(r1)
ld r8,192(r1)
mr r4,r14
mr r6,r14
mr r7,r5
bl 1002160 <.add(_p_Mat*, int, int*, int, int*, double*)>
0000000001002170 <.add(_p_Mat*, int, int*, int, int*, double*)>:
stdu r1,-128(r1)
mflr r0
std r0,144(r1)
extsw r4,r4
extsw r6,r6
li r9,2
bl 10dc8e0 <.MatSetValues>
nop
ld r12,144(r1)
addi r1,r1,128
mtlr r12
blr
C-style inheritance:
bl 10633f0 <.apf::getElementNumbers(apf::NumberingOf<int>*, apf::MeshEntity*, apf::NewArray<int>&)>
nop
ld r9,0(r21)
ld r5,168(r1)
ld r3,328(r1)
ld r8,192(r1)
mr r4,r14
mr r6,r14
ld r0,0(r9)
mr r7,r5
ld r11,16(r9)
mtctr r0
ld r2,8(r9)
bctrl ; petsc_cops->add()
00000000010021e0 <._add(_p_Mat*, int, int*, int, int*, double*)>:
stdu r1,-128(r1)
mflr r0
std r0,144(r1)
extsw r4,r4
extsw r6,r6
li r9,2
bl 10dc8f0 <.MatSetValues>
nop
ld r12,144(r1)
addi r1,r1,128
mtlr r12
blr
C++ inheritance:
bl 1063400 <.apf::getElementNumbers(apf::NumberingOf<int>*, apf::MeshEntity*, apf::NewArray<int>&)>
nop
ld r7,0(r20)
ld r6,168(r1)
mr r5,r14
ld r9,192(r1)
mr r3,r20
mr r4,r21
ld r10,0(r7)
mr r7,r14
mr r8,r6
ld r0,0(r10)
ld r11,16(r10)
mtctr r0
ld r2,8(r10)
bctrl ; petsc_ops::add()
<.petsc_ops::add(las::Mat*, int, int*, int, int*, double*)>:
stdu r1,-128(r1)
mflr r0
std r0,144(r1)
extsw r0,r7
ld r3,0(r4)
extsw r4,r5
mr r5,r6
mr r6,r0
mr r7,r8
mr r8,r9
li r9,2
bl 10dc900 <.MatSetValues>
nop
ld r12,144(r1)
addi r1,r1,128
mtlr r12
blr