Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 46.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:720 31.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:697 7.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:780 5.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:780 2.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:779 1.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:679 1.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:702 1.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:780 1.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:780 1.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:780 1.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:826 1.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:827 1.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:800 1.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:802 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000782ca0 : : CHashBucketScan(CHashTable table, : CHashPtr *start, : uint32 hashcode, : const void *key, : CHashScanResult *res) : { 0.00 : 782ca0: 55 push %rbp 0.00 : 782ca1: 48 89 e5 mov %rsp,%rbp 0.00 : 782ca4: 41 57 push %r15 0.00 : 782ca6: 41 89 d7 mov %edx,%r15d 0.00 : 782ca9: 41 56 push %r14 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:679 1.00 : 782cab: 41 55 push %r13 0.00 : 782cad: 49 89 fd mov %rdi,%r13 0.00 : 782cb0: 41 54 push %r12 0.00 : 782cb2: 45 31 e4 xor %r12d,%r12d 0.00 : 782cb5: 53 push %rbx 0.00 : 782cb6: 48 83 ec 18 sub $0x18,%rsp 0.00 : 782cba: 48 89 75 d0 mov %rsi,-0x30(%rbp) 0.00 : 782cbe: 48 89 4d c8 mov %rcx,-0x38(%rbp) 0.00 : 782cc2: 4c 89 45 c0 mov %r8,-0x40(%rbp) : CHashPtr *pointer_to_target; : CHashNode *target_node = NULL; : : retry: : pointer_to_target = start; : target = *pointer_to_target; 0.00 : 782cc6: 48 8b 45 d0 mov -0x30(%rbp),%rax 0.00 : 782cca: 44 8b 10 mov (%rax),%r10d : : /* : * If we've reached the end of the bucket chain, stop; otherwise, : * figure out the actual address of the next item. : */ : if (CHashPtrIsInvalid(target)) /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:697 31.00 : 782ccd: 41 83 fa fd cmp $0xfffffffd,%r10d 0.00 : 782cd1: 0f 87 ff 00 00 00 ja 782dd6 : { : res->found = false; : break; 0.00 : 782cd7: 4c 8b 75 d0 mov -0x30(%rbp),%r14 0.00 : 782cdb: eb 21 jmp 782cfe 0.00 : 782cdd: 0f 1f 00 nopl (%rax) : /* : * Bucket chains are kept in order, so that there is exactly one legal : * point at which any given key can be inserted. The ordering is by : * hashcode first, and then by memcmp ordering of the keys involved. : */ : h = target_node->un.hashcode; 0.00 : 782ce0: 41 8b 44 24 04 mov 0x4(%r12),%eax : if (h == hashcode) /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:779 2.00 : 782ce5: 44 39 f8 cmp %r15d,%eax 0.00 : 782ce8: 74 5e je 782d48 : cmp = memcmp(CHashNodeGetItem(target_node), key, : table->desc.key_size); : else if (h > hashcode) 0.00 : 782cea: 41 39 c7 cmp %eax,%r15d 0.00 : 782ced: 0f 1f 00 nopl (%rax) 0.00 : 782cf0: 72 7b jb 782d6d : break; : } : } : : /* Continue scan from next node. */ : pointer_to_target = &target_node->next; 0.00 : 782cf2: 4d 89 e6 mov %r12,%r14 0.00 : 782cf5: 45 89 c2 mov %r8d,%r10d : : /* : * If we've reached the end of the bucket chain, stop; otherwise, : * figure out the actual address of the next item. : */ : if (CHashPtrIsInvalid(target)) 0.00 : 782cf8: 41 83 fa fd cmp $0xfffffffd,%r10d 0.00 : 782cfc: 77 79 ja 782d77 : { : res->found = false; : break; : } : target_node = CHashTableGetNode(table, target); 0.00 : 782cfe: 44 89 d0 mov %r10d,%eax 0.00 : 782d01: d1 e8 shr %eax 0.00 : 782d03: 41 89 c4 mov %eax,%r12d 0.00 : 782d06: 45 0f af 65 1c imul 0x1c(%r13),%r12d /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:702 1.00 : 782d0b: 4d 03 65 30 add 0x30(%r13),%r12 : * target may have been fetched from an arena entry that could be : * concurrently modified, so a dependency barrier is required before : * dereferencing the derived pointer. : */ : pg_read_barrier_depends(); : next = target_node->next; 0.00 : 782d0f: 45 8b 04 24 mov (%r12),%r8d : * ensures that delete-marked elements are removed from bucket chains : * as quickly as possible and reduces code duplication. See : * CHashDelete for further comments about why delete-marking is : * necessary and how it allows safe deletion. : */ : if (CHashPtrIsMarked(next)) /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:720 46.00 : 782d13: 41 f6 c0 01 test $0x1,%r8b 0.00 : 782d17: 74 c7 je 782ce0 : { : zap: : if (__sync_bool_compare_and_swap(pointer_to_target, 0.00 : 782d19: 44 89 c3 mov %r8d,%ebx 0.00 : 782d1c: 44 89 d0 mov %r10d,%eax 0.00 : 782d1f: 83 e3 fe and $0xfffffffe,%ebx 0.00 : 782d22: f0 41 0f b1 1e lock cmpxchg %ebx,(%r14) 0.00 : 782d27: 74 77 je 782da0 : * the node which precedes it before we advance to the next : * node. That could certainly happen occasionally, but we'd : * have to be pretty unlucky to have it happen even twice in : * a row. : */ : CHashTableIncrementStatistic(table, CHS_Scan_Expunge_Fail); 0.00 : 782d29: 49 83 85 88 00 00 00 addq $0x1,0x88(%r13) 0.00 : 782d30: 01 : target = *pointer_to_target; 0.00 : 782d31: 45 8b 16 mov (%r14),%r10d : if (CHashPtrIsMarked(target)) 0.00 : 782d34: 41 f6 c2 01 test $0x1,%r10b 0.00 : 782d38: 74 be je 782cf8 : { : CHashTableIncrementStatistic(table, CHS_Scan_Restart); 0.00 : 782d3a: 49 83 85 90 00 00 00 addq $0x1,0x90(%r13) 0.00 : 782d41: 01 : goto retry; 0.00 : 782d42: eb 82 jmp 782cc6 0.00 : 782d44: 0f 1f 40 00 nopl 0x0(%rax) : * point at which any given key can be inserted. The ordering is by : * hashcode first, and then by memcmp ordering of the keys involved. : */ : h = target_node->un.hashcode; : if (h == hashcode) : cmp = memcmp(CHashNodeGetItem(target_node), key, /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:780 1.00 : 782d48: 41 0f b7 4d 0e movzwl 0xe(%r13),%ecx 1.00 : 782d4d: 48 8b 7d c8 mov -0x38(%rbp),%rdi 0.00 : 782d51: 49 8d 74 24 08 lea 0x8(%r12),%rsi 0.00 : 782d56: 48 39 c9 cmp %rcx,%rcx /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:780 5.00 : 782d59: f3 a6 repz cmpsb %es:(%rdi),%ds:(%rsi) 7.00 : 782d5b: 0f 97 c0 seta %al /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:780 1.00 : 782d5e: 0f 92 c2 setb %dl 0.00 : 782d61: 28 d0 sub %dl,%al 0.00 : 782d63: 0f be c0 movsbl %al,%eax : * the point where we expect to find the key OR someone delete-marked : * the item and overwrote the hashcode with a gcnext pointer. In the : * latter case we must take care not to be fooled into stopping the : * scan early. : */ : if (cmp >= 0) 0.00 : 782d66: 83 f8 00 cmp $0x0,%eax 0.00 : 782d69: 7c 87 jl 782cf2 : { : if (cmp == 0) 0.00 : 782d6b: 74 5b je 782dc8 : /* : * pg_read_barrier() prevents the reread of the next pointer : * from being speculated ahead of the read of the hash value. : */ : pg_read_barrier(); : next = target_node->next; 0.00 : 782d6d: 45 8b 04 24 mov (%r12),%r8d : if (CHashPtrIsMarked(next)) 0.00 : 782d71: 41 f6 c0 01 test $0x1,%r8b 0.00 : 782d75: 75 a2 jne 782d19 : goto zap; : res->found = false; 0.00 : 782d77: 48 8b 7d c0 mov -0x40(%rbp),%rdi 0.00 : 782d7b: c6 47 18 00 movb $0x0,0x18(%rdi) : pointer_to_target = &target_node->next; : target = next; : } : : /* Send results back to caller. */ : res->target = target; 0.00 : 782d7f: 48 8b 45 c0 mov -0x40(%rbp),%rax 0.00 : 782d83: 44 89 10 mov %r10d,(%rax) : res->pointer_to_target = pointer_to_target; /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:826 1.00 : 782d86: 4c 89 70 08 mov %r14,0x8(%rax) : res->target_node = target_node; /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:827 1.00 : 782d8a: 4c 89 60 10 mov %r12,0x10(%rax) : } 0.00 : 782d8e: 48 83 c4 18 add $0x18,%rsp 0.00 : 782d92: 5b pop %rbx 0.00 : 782d93: 41 5c pop %r12 0.00 : 782d95: 41 5d pop %r13 0.00 : 782d97: 41 5e pop %r14 0.00 : 782d99: 41 5f pop %r15 0.00 : 782d9b: c9 leaveq 0.00 : 782d9c: c3 retq 0.00 : 782d9d: 0f 1f 00 nopl (%rax) : * delete-mark has been applied. Thus, if we just keep : * following the next pointers, we're guaranteed to visit : * all non-deleted items (and possibly some deleted items) : * that were present at the time we began the scan. : */ : CHashTableIncrementStatistic(table, CHS_Scan_Expunge); 0.00 : 782da0: 49 83 85 80 00 00 00 addq $0x1,0x80(%r13) 0.00 : 782da7: 01 : CHashAddToGarbage(table, hashcode & table->bucket_mask, 0.00 : 782da8: 44 89 fe mov %r15d,%esi 0.00 : 782dab: 41 23 75 10 and 0x10(%r13),%esi 0.00 : 782daf: 44 89 d2 mov %r10d,%edx 0.00 : 782db2: 4c 89 ef mov %r13,%rdi 0.00 : 782db5: e8 96 fe ff ff callq 782c50 0.00 : 782dba: 41 89 da mov %ebx,%r10d 0.00 : 782dbd: e9 36 ff ff ff jmpq 782cf8 0.00 : 782dc2: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : */ : if (cmp >= 0) : { : if (cmp == 0) : { : res->found = true; 0.00 : 782dc8: 48 8b 45 c0 mov -0x40(%rbp),%rax /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:800 1.00 : 782dcc: c6 40 18 01 movb $0x1,0x18(%rax) : res->next = next; 0.00 : 782dd0: 44 89 40 04 mov %r8d,0x4(%rax) : break; /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:802 1.00 : 782dd4: eb a9 jmp 782d7f : : /* : * If we've reached the end of the bucket chain, stop; otherwise, : * figure out the actual address of the next item. : */ : if (CHashPtrIsInvalid(target)) 0.00 : 782dd6: 49 89 c6 mov %rax,%r14 0.00 : 782dd9: eb 9c jmp 782d77 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 68.54 /home/Computational/mark/src/postgres-andres/src/backend/utils/time/tqual.c:924 12.36 /home/Computational/mark/src/postgres-andres/src/backend/utils/time/tqual.c:1028 7.87 /home/Computational/mark/src/postgres-andres/src/backend/utils/time/tqual.c:924 2.25 /home/Computational/mark/src/postgres-andres/src/backend/utils/time/tqual.c:918 2.25 /home/Computational/mark/src/postgres-andres/src/backend/utils/time/tqual.c:1103 2.25 /home/Computational/mark/src/postgres-andres/src/backend/utils/time/tqual.c:1103 1.12 /home/Computational/mark/src/postgres-andres/src/backend/utils/time/tqual.c:1028 1.12 /home/Computational/mark/src/postgres-andres/src/backend/utils/time/tqual.c:1035 1.12 /home/Computational/mark/src/postgres-andres/src/backend/utils/time/tqual.c:1103 1.12 /home/Computational/mark/src/postgres-andres/src/backend/utils/time/tqual.c:1099 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000007a5750 : : * can't see it.) : */ : bool : HeapTupleSatisfiesMVCC(HeapTuple htup, Snapshot snapshot, : Buffer buffer) : { 0.00 : 7a5750: 55 push %rbp 0.00 : 7a5751: 48 89 e5 mov %rsp,%rbp 0.00 : 7a5754: 4c 89 6d f0 mov %r13,-0x10(%rbp) 0.00 : 7a5758: 4c 89 75 f8 mov %r14,-0x8(%rbp) 0.00 : 7a575c: 41 89 d6 mov %edx,%r14d 0.00 : 7a575f: 48 89 5d e0 mov %rbx,-0x20(%rbp) 0.00 : 7a5763: 4c 89 65 e8 mov %r12,-0x18(%rbp) 0.00 : 7a5767: 48 83 ec 20 sub $0x20,%rsp : HeapTupleHeader tuple = htup->t_data; 0.00 : 7a576b: 48 8b 5f 10 mov 0x10(%rdi),%rbx : * can't see it.) : */ : bool : HeapTupleSatisfiesMVCC(HeapTuple htup, Snapshot snapshot, : Buffer buffer) : { /home/Computational/mark/src/postgres-andres/src/backend/utils/time/tqual.c:918 2.25 : 7a576f: 49 89 f5 mov %rsi,%r13 : HeapTupleHeader tuple = htup->t_data; : : Assert(ItemPointerIsValid(&htup->t_self)); : Assert(htup->t_tableOid != InvalidOid); : : if (!HeapTupleHeaderXminCommitted(tuple)) /home/Computational/mark/src/postgres-andres/src/backend/utils/time/tqual.c:924 7.87 : 7a5772: 0f b7 4b 14 movzwl 0x14(%rbx),%ecx 68.54 : 7a5776: 0f b7 d1 movzwl %cx,%edx 0.00 : 7a5779: f6 c6 01 test $0x1,%dh 0.00 : 7a577c: 75 72 jne 7a57f0 : { : if (HeapTupleHeaderXminInvalid(tuple)) 0.00 : 7a577e: 89 d0 mov %edx,%eax 0.00 : 7a5780: 25 00 03 00 00 and $0x300,%eax 0.00 : 7a5785: 3d 00 02 00 00 cmp $0x200,%eax 0.00 : 7a578a: 0f 84 06 01 00 00 je 7a5896 : return false; : : /* Used by pre-9.0 binary upgrades */ : if (tuple->t_infomask & HEAP_MOVED_OFF) 0.00 : 7a5790: f6 c6 40 test $0x40,%dh 0.00 : 7a5793: 0f 84 27 01 00 00 je 7a58c0 : { : TransactionId xvac = HeapTupleHeaderGetXvac(tuple); 0.00 : 7a5799: 45 31 e4 xor %r12d,%r12d 0.00 : 7a579c: 66 f7 c2 00 c0 test $0xc000,%dx 0.00 : 7a57a1: 74 04 je 7a57a7 0.00 : 7a57a3: 44 8b 63 08 mov 0x8(%rbx),%r12d : : if (TransactionIdIsCurrentTransactionId(xvac)) 0.00 : 7a57a7: 44 89 e7 mov %r12d,%edi 0.00 : 7a57aa: e8 f1 ec d1 ff callq 4c44a0 0.00 : 7a57af: 84 c0 test %al,%al 0.00 : 7a57b1: 0f 85 df 00 00 00 jne 7a5896 : return false; : if (!TransactionIdIsInProgress(xvac)) 0.00 : 7a57b7: 44 89 e7 mov %r12d,%edi 0.00 : 7a57ba: e8 f1 c4 ed ff callq 681cb0 0.00 : 7a57bf: 84 c0 test %al,%al 0.00 : 7a57c1: 0f 85 1f 01 00 00 jne 7a58e6 : { : if (TransactionIdDidCommit(xvac)) 0.00 : 7a57c7: 44 89 e7 mov %r12d,%edi 0.00 : 7a57ca: e8 11 ab d1 ff callq 4c02e0 0.00 : 7a57cf: 84 c0 test %al,%al 0.00 : 7a57d1: 0f 85 79 02 00 00 jne 7a5a50 : if (!TransactionIdIsCurrentTransactionId(xvac)) : { : if (TransactionIdIsInProgress(xvac)) : return false; : if (TransactionIdDidCommit(xvac)) : SetHintBits(tuple, buffer, HEAP_XMIN_COMMITTED, 0.00 : 7a57d7: ba 00 01 00 00 mov $0x100,%edx 0.00 : 7a57dc: 31 c9 xor %ecx,%ecx 0.00 : 7a57de: 44 89 f6 mov %r14d,%esi 0.00 : 7a57e1: 48 89 df mov %rbx,%rdi 0.00 : 7a57e4: e8 b7 f2 ff ff callq 7a4aa0 0.00 : 7a57e9: 0f b7 53 14 movzwl 0x14(%rbx),%edx 0.00 : 7a57ed: 0f 1f 00 nopl (%rax) : : /* : * By here, the inserting transaction has committed - have to check : * when... : */ : if (!HeapTupleHeaderXminFrozen(tuple) 0.00 : 7a57f0: 89 d0 mov %edx,%eax 0.00 : 7a57f2: 25 00 03 00 00 and $0x300,%eax /home/Computational/mark/src/postgres-andres/src/backend/utils/time/tqual.c:1028 1.12 : 7a57f7: 3d 00 03 00 00 cmp $0x300,%eax 0.00 : 7a57fc: 0f 85 86 00 00 00 jne 7a5888 : return false; /* treat as still in progress */ : : if (tuple->t_infomask & HEAP_XMAX_INVALID) /* xid invalid or aborted */ : return true; : : if (HEAP_XMAX_IS_LOCKED_ONLY(tuple->t_infomask)) /home/Computational/mark/src/postgres-andres/src/backend/utils/time/tqual.c:1035 1.12 : 7a5802: f7 c2 80 08 00 00 test $0x880,%edx 0.00 : 7a5808: 0f 85 a2 00 00 00 jne 7a58b0 0.00 : 7a580e: 89 d0 mov %edx,%eax 0.00 : 7a5810: 25 50 10 00 00 and $0x1050,%eax 0.00 : 7a5815: 83 f8 40 cmp $0x40,%eax 0.00 : 7a5818: 0f 84 92 00 00 00 je 7a58b0 : return true; : : if (tuple->t_infomask & HEAP_XMAX_IS_MULTI) 0.00 : 7a581e: f6 c6 10 test $0x10,%dh 0.00 : 7a5821: 0f 85 b9 01 00 00 jne 7a59e0 : } : /* it must have aborted or crashed */ : return true; : } : : if (!(tuple->t_infomask & HEAP_XMAX_COMMITTED)) 0.00 : 7a5827: 80 e6 04 and $0x4,%dh 0.00 : 7a582a: 75 44 jne 7a5870 : { : if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetRawXmax(tuple))) 0.00 : 7a582c: 8b 7b 04 mov 0x4(%rbx),%edi 0.00 : 7a582f: 90 nop 0.00 : 7a5830: e8 6b ec d1 ff callq 4c44a0 0.00 : 7a5835: 84 c0 test %al,%al 0.00 : 7a5837: 0f 85 43 01 00 00 jne 7a5980 : return true; /* deleted after scan started */ : else : return false; /* deleted before scan started */ : } : : if (TransactionIdIsInProgress(HeapTupleHeaderGetRawXmax(tuple))) 0.00 : 7a583d: 8b 7b 04 mov 0x4(%rbx),%edi 0.00 : 7a5840: e8 6b c4 ed ff callq 681cb0 0.00 : 7a5845: 84 c0 test %al,%al 0.00 : 7a5847: 75 67 jne 7a58b0 : return true; : : if (!TransactionIdDidCommit(HeapTupleHeaderGetRawXmax(tuple))) 0.00 : 7a5849: 8b 7b 04 mov 0x4(%rbx),%edi 0.00 : 7a584c: e8 8f aa d1 ff callq 4c02e0 0.00 : 7a5851: 84 c0 test %al,%al 0.00 : 7a5853: 0f 84 20 02 00 00 je 7a5a79 : InvalidTransactionId); : return true; : } : : /* xmax transaction committed */ : SetHintBits(tuple, buffer, HEAP_XMAX_COMMITTED, 0.00 : 7a5859: 8b 4b 04 mov 0x4(%rbx),%ecx 0.00 : 7a585c: ba 00 04 00 00 mov $0x400,%edx 0.00 : 7a5861: 44 89 f6 mov %r14d,%esi 0.00 : 7a5864: 48 89 df mov %rbx,%rdi 0.00 : 7a5867: e8 34 f2 ff ff callq 7a4aa0 0.00 : 7a586c: 0f 1f 40 00 nopl 0x0(%rax) : } : : /* : * OK, the deleting transaction committed too ... but when? : */ : if (XidInMVCCSnapshot(HeapTupleHeaderGetRawXmax(tuple), snapshot)) 0.00 : 7a5870: 8b 7b 04 mov 0x4(%rbx),%edi 0.00 : 7a5873: 4c 89 ee mov %r13,%rsi 0.00 : 7a5876: e8 85 fd ff ff callq 7a5600 0.00 : 7a587b: 84 c0 test %al,%al 0.00 : 7a587d: 0f 95 c0 setne %al 0.00 : 7a5880: eb 16 jmp 7a5898 0.00 : 7a5882: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : : /* : * By here, the inserting transaction has committed - have to check : * when... : */ : if (!HeapTupleHeaderXminFrozen(tuple) 0.00 : 7a5888: 8b 3b mov (%rbx),%edi /home/Computational/mark/src/postgres-andres/src/backend/utils/time/tqual.c:1028 12.36 : 7a588a: 4c 89 ee mov %r13,%rsi 0.00 : 7a588d: e8 6e fd ff ff callq 7a5600 0.00 : 7a5892: 84 c0 test %al,%al 0.00 : 7a5894: 74 6a je 7a5900 : } : : /* : * OK, the deleting transaction committed too ... but when? : */ : if (XidInMVCCSnapshot(HeapTupleHeaderGetRawXmax(tuple), snapshot)) 0.00 : 7a5896: 31 c0 xor %eax,%eax : return true; /* treat as still in progress */ : : return false; : } /home/Computational/mark/src/postgres-andres/src/backend/utils/time/tqual.c:1103 1.12 : 7a5898: 48 8b 1c 24 mov (%rsp),%rbx 0.00 : 7a589c: 4c 8b 64 24 08 mov 0x8(%rsp),%r12 0.00 : 7a58a1: 4c 8b 6c 24 10 mov 0x10(%rsp),%r13 2.25 : 7a58a6: 4c 8b 74 24 18 mov 0x18(%rsp),%r14 0.00 : 7a58ab: c9 leaveq 2.25 : 7a58ac: c3 retq 0.00 : 7a58ad: 0f 1f 00 nopl (%rax) : } : : /* : * OK, the deleting transaction committed too ... but when? : */ : if (XidInMVCCSnapshot(HeapTupleHeaderGetRawXmax(tuple), snapshot)) /home/Computational/mark/src/postgres-andres/src/backend/utils/time/tqual.c:1099 1.12 : 7a58b0: b8 01 00 00 00 mov $0x1,%eax 0.00 : 7a58b5: eb e1 jmp 7a5898 0.00 : 7a58b7: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 7a58be: 00 00 : SetHintBits(tuple, buffer, HEAP_XMIN_COMMITTED, : InvalidTransactionId); : } : } : /* Used by pre-9.0 binary upgrades */ : else if (tuple->t_infomask & HEAP_MOVED_IN) 0.00 : 7a58c0: 66 85 c9 test %cx,%cx 0.00 : 7a58c3: 79 4b jns 7a5910 : { : TransactionId xvac = HeapTupleHeaderGetXvac(tuple); 0.00 : 7a58c5: 45 31 e4 xor %r12d,%r12d 0.00 : 7a58c8: 66 f7 c2 00 c0 test $0xc000,%dx 0.00 : 7a58cd: 0f 1f 00 nopl (%rax) 0.00 : 7a58d0: 0f 85 fa 00 00 00 jne 7a59d0 : : if (!TransactionIdIsCurrentTransactionId(xvac)) 0.00 : 7a58d6: 44 89 e7 mov %r12d,%edi 0.00 : 7a58d9: e8 c2 eb d1 ff callq 4c44a0 0.00 : 7a58de: 84 c0 test %al,%al 0.00 : 7a58e0: 0f 84 4a 01 00 00 je 7a5a30 : return false; /* deleted before scan started */ : } : else if (TransactionIdIsInProgress(HeapTupleHeaderGetRawXmin(tuple))) : return false; : else if (TransactionIdDidCommit(HeapTupleHeaderGetRawXmin(tuple))) : SetHintBits(tuple, buffer, HEAP_XMIN_COMMITTED, 0.00 : 7a58e6: 0f b7 53 14 movzwl 0x14(%rbx),%edx : : /* : * By here, the inserting transaction has committed - have to check : * when... : */ : if (!HeapTupleHeaderXminFrozen(tuple) 0.00 : 7a58ea: 89 d0 mov %edx,%eax 0.00 : 7a58ec: 25 00 03 00 00 and $0x300,%eax 0.00 : 7a58f1: 3d 00 03 00 00 cmp $0x300,%eax 0.00 : 7a58f6: 0f 84 06 ff ff ff je 7a5802 0.00 : 7a58fc: eb 8a jmp 7a5888 0.00 : 7a58fe: 66 90 xchg %ax,%ax 0.00 : 7a5900: 0f b7 53 14 movzwl 0x14(%rbx),%edx 0.00 : 7a5904: e9 f9 fe ff ff jmpq 7a5802 0.00 : 7a5909: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : InvalidTransactionId); : return false; : } : } : } : else if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetRawXmin(tuple))) 0.00 : 7a5910: 8b 3b mov (%rbx),%edi 0.00 : 7a5912: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 7a5918: e8 83 eb d1 ff callq 4c44a0 0.00 : 7a591d: 84 c0 test %al,%al 0.00 : 7a591f: 90 nop 0.00 : 7a5920: 74 76 je 7a5998 : { : if (HeapTupleHeaderGetCmin(tuple) >= snapshot->curcid) 0.00 : 7a5922: 48 89 df mov %rbx,%rdi 0.00 : 7a5925: e8 96 eb ff ff callq 7a44c0 0.00 : 7a592a: 41 3b 45 2c cmp 0x2c(%r13),%eax 0.00 : 7a592e: 66 90 xchg %ax,%ax 0.00 : 7a5930: 0f 83 60 ff ff ff jae 7a5896 : return false; /* inserted after scan started */ : : if (tuple->t_infomask & HEAP_XMAX_INVALID) /* xid invalid */ 0.00 : 7a5936: 0f b7 53 14 movzwl 0x14(%rbx),%edx : return true; : : if (HEAP_XMAX_IS_LOCKED_ONLY(tuple->t_infomask)) /* not deleter */ 0.00 : 7a593a: f7 c2 80 08 00 00 test $0x880,%edx 0.00 : 7a5940: 0f 85 6a ff ff ff jne 7a58b0 0.00 : 7a5946: 89 d0 mov %edx,%eax 0.00 : 7a5948: 25 50 10 00 00 and $0x1050,%eax 0.00 : 7a594d: 83 f8 40 cmp $0x40,%eax 0.00 : 7a5950: 0f 84 5a ff ff ff je 7a58b0 : return true; : : if (tuple->t_infomask & HEAP_XMAX_IS_MULTI) 0.00 : 7a5956: 80 e6 10 and $0x10,%dh 0.00 : 7a5959: 0f 84 0a 01 00 00 je 7a5a69 : { : TransactionId xmax; : : xmax = HeapTupleGetUpdateXid(tuple); 0.00 : 7a595f: 48 89 df mov %rbx,%rdi 0.00 : 7a5962: e8 b9 17 cf ff callq 497120 0.00 : 7a5967: 89 c7 mov %eax,%edi : : /* not LOCKED_ONLY, so it has to have an xmax */ : Assert(TransactionIdIsValid(xmax)); : : /* updating subtransaction must have aborted */ : if (!TransactionIdIsCurrentTransactionId(xmax)) 0.00 : 7a5969: e8 32 eb d1 ff callq 4c44a0 0.00 : 7a596e: 84 c0 test %al,%al 0.00 : 7a5970: 0f 84 3a ff ff ff je 7a58b0 0.00 : 7a5976: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 0.00 : 7a597d: 00 00 00 : : if (!(tuple->t_infomask & HEAP_XMAX_COMMITTED)) : { : if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetRawXmax(tuple))) : { : if (HeapTupleHeaderGetCmax(tuple) >= snapshot->curcid) 0.00 : 7a5980: 48 89 df mov %rbx,%rdi 0.00 : 7a5983: e8 58 eb ff ff callq 7a44e0 0.00 : 7a5988: 41 3b 45 2c cmp 0x2c(%r13),%eax 0.00 : 7a598c: 0f 93 c0 setae %al 0.00 : 7a598f: e9 04 ff ff ff jmpq 7a5898 0.00 : 7a5994: 0f 1f 40 00 nopl 0x0(%rax) : if (HeapTupleHeaderGetCmax(tuple) >= snapshot->curcid) : return true; /* deleted after scan started */ : else : return false; /* deleted before scan started */ : } : else if (TransactionIdIsInProgress(HeapTupleHeaderGetRawXmin(tuple))) 0.00 : 7a5998: 8b 3b mov (%rbx),%edi 0.00 : 7a599a: e8 11 c3 ed ff callq 681cb0 0.00 : 7a599f: 84 c0 test %al,%al 0.00 : 7a59a1: 0f 85 ef fe ff ff jne 7a5896 : return false; : else if (TransactionIdDidCommit(HeapTupleHeaderGetRawXmin(tuple))) 0.00 : 7a59a7: 8b 3b mov (%rbx),%edi 0.00 : 7a59a9: e8 32 a9 d1 ff callq 4c02e0 0.00 : 7a59ae: 84 c0 test %al,%al 0.00 : 7a59b0: 0f 84 9a 00 00 00 je 7a5a50 : SetHintBits(tuple, buffer, HEAP_XMIN_COMMITTED, 0.00 : 7a59b6: 8b 0b mov (%rbx),%ecx 0.00 : 7a59b8: ba 00 01 00 00 mov $0x100,%edx 0.00 : 7a59bd: 44 89 f6 mov %r14d,%esi 0.00 : 7a59c0: 48 89 df mov %rbx,%rdi 0.00 : 7a59c3: e8 d8 f0 ff ff callq 7a4aa0 0.00 : 7a59c8: e9 19 ff ff ff jmpq 7a58e6 0.00 : 7a59cd: 0f 1f 00 nopl (%rax) : } : } : /* Used by pre-9.0 binary upgrades */ : else if (tuple->t_infomask & HEAP_MOVED_IN) : { : TransactionId xvac = HeapTupleHeaderGetXvac(tuple); 0.00 : 7a59d0: 44 8b 63 08 mov 0x8(%rbx),%r12d 0.00 : 7a59d4: e9 fd fe ff ff jmpq 7a58d6 0.00 : 7a59d9: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : TransactionId xmax; : : /* already checked above */ : Assert(!HEAP_XMAX_IS_LOCKED_ONLY(tuple->t_infomask)); : : xmax = HeapTupleGetUpdateXid(tuple); 0.00 : 7a59e0: 48 89 df mov %rbx,%rdi 0.00 : 7a59e3: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 7a59e8: e8 33 17 cf ff callq 497120 : : /* not LOCKED_ONLY, so it has to have an xmax */ : Assert(TransactionIdIsValid(xmax)); : : if (TransactionIdIsCurrentTransactionId(xmax)) 0.00 : 7a59ed: 89 c7 mov %eax,%edi : TransactionId xmax; : : /* already checked above */ : Assert(!HEAP_XMAX_IS_LOCKED_ONLY(tuple->t_infomask)); : : xmax = HeapTupleGetUpdateXid(tuple); 0.00 : 7a59ef: 41 89 c4 mov %eax,%r12d : : /* not LOCKED_ONLY, so it has to have an xmax */ : Assert(TransactionIdIsValid(xmax)); : : if (TransactionIdIsCurrentTransactionId(xmax)) 0.00 : 7a59f2: e8 a9 ea d1 ff callq 4c44a0 0.00 : 7a59f7: 84 c0 test %al,%al 0.00 : 7a59f9: 75 85 jne 7a5980 : if (HeapTupleHeaderGetCmax(tuple) >= snapshot->curcid) : return true; /* deleted after scan started */ : else : return false; /* deleted before scan started */ : } : if (TransactionIdIsInProgress(xmax)) 0.00 : 7a59fb: 44 89 e7 mov %r12d,%edi 0.00 : 7a59fe: e8 ad c2 ed ff callq 681cb0 0.00 : 7a5a03: 84 c0 test %al,%al 0.00 : 7a5a05: 0f 85 a5 fe ff ff jne 7a58b0 : return true; : if (TransactionIdDidCommit(xmax)) 0.00 : 7a5a0b: 44 89 e7 mov %r12d,%edi 0.00 : 7a5a0e: e8 cd a8 d1 ff callq 4c02e0 0.00 : 7a5a13: 84 c0 test %al,%al 0.00 : 7a5a15: 0f 84 95 fe ff ff je 7a58b0 : { : /* updating transaction committed, but when? */ : if (XidInMVCCSnapshot(xmax, snapshot)) 0.00 : 7a5a1b: 4c 89 ee mov %r13,%rsi 0.00 : 7a5a1e: 44 89 e7 mov %r12d,%edi 0.00 : 7a5a21: e8 da fb ff ff callq 7a5600 0.00 : 7a5a26: 84 c0 test %al,%al 0.00 : 7a5a28: 0f 95 c0 setne %al 0.00 : 7a5a2b: e9 68 fe ff ff jmpq 7a5898 : { : TransactionId xvac = HeapTupleHeaderGetXvac(tuple); : : if (!TransactionIdIsCurrentTransactionId(xvac)) : { : if (TransactionIdIsInProgress(xvac)) 0.00 : 7a5a30: 44 89 e7 mov %r12d,%edi 0.00 : 7a5a33: e8 78 c2 ed ff callq 681cb0 0.00 : 7a5a38: 84 c0 test %al,%al 0.00 : 7a5a3a: 0f 85 56 fe ff ff jne 7a5896 : return false; : if (TransactionIdDidCommit(xvac)) 0.00 : 7a5a40: 44 89 e7 mov %r12d,%edi 0.00 : 7a5a43: e8 98 a8 d1 ff callq 4c02e0 0.00 : 7a5a48: 84 c0 test %al,%al 0.00 : 7a5a4a: 0f 85 87 fd ff ff jne 7a57d7 : SetHintBits(tuple, buffer, HEAP_XMIN_COMMITTED, : HeapTupleHeaderGetRawXmin(tuple)); : else : { : /* it must have aborted or crashed */ : SetHintBits(tuple, buffer, HEAP_XMIN_INVALID, 0.00 : 7a5a50: 31 c9 xor %ecx,%ecx 0.00 : 7a5a52: ba 00 02 00 00 mov $0x200,%edx 0.00 : 7a5a57: 44 89 f6 mov %r14d,%esi 0.00 : 7a5a5a: 48 89 df mov %rbx,%rdi 0.00 : 7a5a5d: e8 3e f0 ff ff callq 7a4aa0 0.00 : 7a5a62: 31 c0 xor %eax,%eax : */ : if (XidInMVCCSnapshot(HeapTupleHeaderGetRawXmax(tuple), snapshot)) : return true; /* treat as still in progress */ : : return false; : } 0.00 : 7a5a64: e9 2f fe ff ff jmpq 7a5898 : return true; /* updated after scan started */ : else : return false; /* updated before scan started */ : } : : if (!TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetRawXmax(tuple))) 0.00 : 7a5a69: 8b 7b 04 mov 0x4(%rbx),%edi 0.00 : 7a5a6c: e8 2f ea d1 ff callq 4c44a0 0.00 : 7a5a71: 84 c0 test %al,%al 0.00 : 7a5a73: 0f 85 07 ff ff ff jne 7a5980 : return true; : : if (!TransactionIdDidCommit(HeapTupleHeaderGetRawXmax(tuple))) : { : /* it must have aborted or crashed */ : SetHintBits(tuple, buffer, HEAP_XMAX_INVALID, 0.00 : 7a5a79: 31 c9 xor %ecx,%ecx 0.00 : 7a5a7b: ba 00 08 00 00 mov $0x800,%edx 0.00 : 7a5a80: 44 89 f6 mov %r14d,%esi 0.00 : 7a5a83: 48 89 df mov %rbx,%rdi 0.00 : 7a5a86: e8 15 f0 ff ff callq 7a4aa0 0.00 : 7a5a8b: b8 01 00 00 00 mov $0x1,%eax : */ : if (XidInMVCCSnapshot(HeapTupleHeaderGetRawXmax(tuple), snapshot)) : return true; /* treat as still in progress */ : : return false; : } 0.00 : 7a5a90: e9 03 fe ff ff jmpq 7a5898 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 16.95 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1128 6.78 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1128 5.08 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1049 5.08 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1085 5.08 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1087 5.08 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1097 5.08 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1126 5.08 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1128 5.08 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1128 5.08 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1128 3.39 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1126 3.39 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1126 3.39 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1120 1.69 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1049 1.69 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1052 1.69 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1067 1.69 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1055 1.69 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1068 1.69 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1083 1.69 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1097 1.69 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1126 1.69 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1126 1.69 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1049 1.69 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1140 1.69 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1099 1.69 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1120 1.69 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1128 1.69 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1126 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 000000000046ef10 : : * re-computing information about previously extracted attributes. : * slot->tts_nvalid is the number of attributes already extracted. : */ : static void : slot_deform_tuple(TupleTableSlot *slot, int natts) : { /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1049 5.08 : 46ef10: 55 push %rbp 0.00 : 46ef11: 48 89 e5 mov %rsp,%rbp 0.00 : 46ef14: 41 57 push %r15 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1049 1.69 : 46ef16: 41 89 f7 mov %esi,%r15d 0.00 : 46ef19: 41 56 push %r14 0.00 : 46ef1b: 49 89 fe mov %rdi,%r14 0.00 : 46ef1e: 41 55 push %r13 0.00 : 46ef20: 41 54 push %r12 0.00 : 46ef22: 53 push %rbx : /* : * Check whether the first call for this tuple, and initialize or restore : * loop state. : */ : attnum = slot->tts_nvalid; : if (attnum == 0) 0.00 : 46ef23: 31 db xor %ebx,%ebx : * re-computing information about previously extracted attributes. : * slot->tts_nvalid is the number of attributes already extracted. : */ : static void : slot_deform_tuple(TupleTableSlot *slot, int natts) : { 0.00 : 46ef25: 48 83 ec 28 sub $0x28,%rsp : HeapTuple tuple = slot->tts_tuple; : TupleDesc tupleDesc = slot->tts_tupleDescriptor; : Datum *values = slot->tts_values; /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1052 1.69 : 46ef29: 48 8b 47 28 mov 0x28(%rdi),%rax 0.00 : 46ef2d: 48 89 45 d0 mov %rax,-0x30(%rbp) : bool *isnull = slot->tts_isnull; : HeapTupleHeader tup = tuple->t_data; 0.00 : 46ef31: 48 8b 47 08 mov 0x8(%rdi),%rax : : /* : * Check whether the first call for this tuple, and initialize or restore : * loop state. : */ : attnum = slot->tts_nvalid; /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1067 1.69 : 46ef35: 8b 77 24 mov 0x24(%rdi),%esi : slot_deform_tuple(TupleTableSlot *slot, int natts) : { : HeapTuple tuple = slot->tts_tuple; : TupleDesc tupleDesc = slot->tts_tupleDescriptor; : Datum *values = slot->tts_values; : bool *isnull = slot->tts_isnull; 0.00 : 46ef38: 4c 8b 5f 30 mov 0x30(%rdi),%r11 : HeapTupleHeader tup = tuple->t_data; 0.00 : 46ef3c: 4c 8b 40 10 mov 0x10(%rax),%r8 : bool hasnulls = HeapTupleHasNulls(tuple); 0.00 : 46ef40: 41 0f b7 40 14 movzwl 0x14(%r8),%eax /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1055 1.69 : 46ef45: 83 e0 01 and $0x1,%eax 0.00 : 46ef48: 41 89 c2 mov %eax,%r10d : Form_pg_attribute *att = tupleDesc->attrs; 0.00 : 46ef4b: 48 8b 47 10 mov 0x10(%rdi),%rax : /* : * Check whether the first call for this tuple, and initialize or restore : * loop state. : */ : attnum = slot->tts_nvalid; : if (attnum == 0) 0.00 : 46ef4f: 31 ff xor %edi,%edi /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1068 1.69 : 46ef51: 85 f6 test %esi,%esi : TupleDesc tupleDesc = slot->tts_tupleDescriptor; : Datum *values = slot->tts_values; : bool *isnull = slot->tts_isnull; : HeapTupleHeader tup = tuple->t_data; : bool hasnulls = HeapTupleHasNulls(tuple); : Form_pg_attribute *att = tupleDesc->attrs; 0.00 : 46ef53: 4c 8b 48 08 mov 0x8(%rax),%r9 : /* : * Check whether the first call for this tuple, and initialize or restore : * loop state. : */ : attnum = slot->tts_nvalid; : if (attnum == 0) 0.00 : 46ef57: 74 09 je 46ef62 : } : else : { : /* Restore state from previous execution */ : off = slot->tts_off; : slow = slot->tts_slow; 0.00 : 46ef59: 41 0f b6 7e 07 movzbl 0x7(%r14),%edi : slow = false; : } : else : { : /* Restore state from previous execution */ : off = slot->tts_off; 0.00 : 46ef5e: 49 8b 5e 58 mov 0x58(%r14),%rbx : slow = slot->tts_slow; : } : : tp = (char *) tup + tup->t_hoff; 0.00 : 46ef62: 41 0f b6 40 16 movzbl 0x16(%r8),%eax : : for (; attnum < natts; attnum++) 0.00 : 46ef67: 44 39 fe cmp %r15d,%esi : /* Restore state from previous execution */ : off = slot->tts_off; : slow = slot->tts_slow; : } : : tp = (char *) tup + tup->t_hoff; 0.00 : 46ef6a: 4d 8d 2c 00 lea (%r8,%rax,1),%r13 : : for (; attnum < natts; attnum++) 0.00 : 46ef6e: 0f 8d c0 00 00 00 jge 46f034 0.00 : 46ef74: 41 89 f4 mov %esi,%r12d 0.00 : 46ef77: eb 40 jmp 46efb9 0.00 : 46ef79: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : { : Form_pg_attribute thisatt = att[attnum]; : : if (hasnulls && att_isnull(attnum, bp)) 0.00 : 46ef80: 44 89 e0 mov %r12d,%eax 0.00 : 46ef83: 44 89 e1 mov %r12d,%ecx 0.00 : 46ef86: c1 f8 03 sar $0x3,%eax 0.00 : 46ef89: 83 e1 07 and $0x7,%ecx 0.00 : 46ef8c: 48 98 cltq 0.00 : 46ef8e: 41 0f b6 44 00 17 movzbl 0x17(%r8,%rax,1),%eax 0.00 : 46ef94: d3 f8 sar %cl,%eax 0.00 : 46ef96: a8 01 test $0x1,%al 0.00 : 46ef98: 75 2b jne 46efc5 : { : values[attnum] = (Datum) 0; 0.00 : 46ef9a: 48 8b 55 d0 mov -0x30(%rbp),%rdx : isnull[attnum] = true; 0.00 : 46ef9e: bf 01 00 00 00 mov $0x1,%edi : { : Form_pg_attribute thisatt = att[attnum]; : : if (hasnulls && att_isnull(attnum, bp)) : { : values[attnum] = (Datum) 0; 0.00 : 46efa3: 48 c7 04 f2 00 00 00 movq $0x0,(%rdx,%rsi,8) 0.00 : 46efaa: 00 : isnull[attnum] = true; 0.00 : 46efab: 41 c6 04 33 01 movb $0x1,(%r11,%rsi,1) : slow = slot->tts_slow; : } : : tp = (char *) tup + tup->t_hoff; : : for (; attnum < natts; attnum++) /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1083 1.69 : 46efb0: 41 83 c4 01 add $0x1,%r12d 0.00 : 46efb4: 45 39 e7 cmp %r12d,%r15d 0.00 : 46efb7: 7e 78 jle 46f031 : { : Form_pg_attribute thisatt = att[attnum]; 0.00 : 46efb9: 49 63 f4 movslq %r12d,%rsi : : if (hasnulls && att_isnull(attnum, bp)) 0.00 : 46efbc: 45 84 d2 test %r10b,%r10b : : tp = (char *) tup + tup->t_hoff; : : for (; attnum < natts; attnum++) : { : Form_pg_attribute thisatt = att[attnum]; /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1085 5.08 : 46efbf: 49 8b 14 f1 mov (%r9,%rsi,8),%rdx : : if (hasnulls && att_isnull(attnum, bp)) /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1087 5.08 : 46efc3: 75 bb jne 46ef80 : continue; : } : : isnull[attnum] = false; : : if (!slow && thisatt->attcacheoff >= 0) 0.00 : 46efc5: 40 84 ff test %dil,%dil : isnull[attnum] = true; : slow = true; /* can't use attcacheoff anymore */ : continue; : } : : isnull[attnum] = false; 0.00 : 46efc8: 41 c6 04 33 00 movb $0x0,(%r11,%rsi,1) : : if (!slow && thisatt->attcacheoff >= 0) /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1097 1.69 : 46efcd: 0f 85 7d 00 00 00 jne 46f050 0.00 : 46efd3: 8b 42 54 mov 0x54(%rdx),%eax /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1097 5.08 : 46efd6: 85 c0 test %eax,%eax 0.00 : 46efd8: 78 76 js 46f050 : off = thisatt->attcacheoff; 0.00 : 46efda: 48 63 d8 movslq %eax,%rbx : : if (!slow) : thisatt->attcacheoff = off; : } : : values[attnum] = fetchatt(thisatt, tp + off); /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1126 5.08 : 46efdd: 80 7a 5c 00 cmpb $0x0,0x5c(%rdx) 0.00 : 46efe1: 49 8d 44 1d 00 lea 0x0(%r13,%rbx,1),%rax /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1126 3.39 : 46efe6: 74 28 je 46f010 3.39 : 46efe8: 0f b7 42 4c movzwl 0x4c(%rdx),%eax 1.69 : 46efec: 66 83 f8 08 cmp $0x8,%ax 0.00 : 46eff0: 0f 84 3a 01 00 00 je 46f130 0.00 : 46eff6: 66 83 f8 04 cmp $0x4,%ax 0.00 : 46effa: 0f 84 90 01 00 00 je 46f190 0.00 : 46f000: 66 83 f8 02 cmp $0x2,%ax 0.00 : 46f004: 0f 84 a6 01 00 00 je 46f1b0 0.00 : 46f00a: 41 0f b6 44 1d 00 movzbl 0x0(%r13,%rbx,1),%eax 0.00 : 46f010: 48 8b 4d d0 mov -0x30(%rbp),%rcx 1.69 : 46f014: 48 89 04 f1 mov %rax,(%rcx,%rsi,8) : : off = att_addlength_pointer(off, thisatt->attlen, tp + off); /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1128 16.95 : 46f018: 0f b7 42 4c movzwl 0x4c(%rdx),%eax 6.78 : 46f01c: 66 85 c0 test %ax,%ax 0.00 : 46f01f: 7e 6f jle 46f090 0.00 : 46f021: 48 0f bf c0 movswq %ax,%rax : slow = slot->tts_slow; : } : : tp = (char *) tup + tup->t_hoff; : : for (; attnum < natts; attnum++) 0.00 : 46f025: 41 83 c4 01 add $0x1,%r12d : thisatt->attcacheoff = off; : } : : values[attnum] = fetchatt(thisatt, tp + off); : : off = att_addlength_pointer(off, thisatt->attlen, tp + off); 5.08 : 46f029: 48 01 c3 add %rax,%rbx : slow = slot->tts_slow; : } : : tp = (char *) tup + tup->t_hoff; : : for (; attnum < natts; attnum++) 0.00 : 46f02c: 45 39 e7 cmp %r12d,%r15d 0.00 : 46f02f: 7f 88 jg 46efb9 : * re-computing information about previously extracted attributes. : * slot->tts_nvalid is the number of attributes already extracted. : */ : static void : slot_deform_tuple(TupleTableSlot *slot, int natts) : { /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1049 1.69 : 46f031: 44 89 fe mov %r15d,%esi : : /* : * Save state for next execution : */ : slot->tts_nvalid = attnum; : slot->tts_off = off; 0.00 : 46f034: 49 89 5e 58 mov %rbx,0x58(%r14) : } : : /* : * Save state for next execution : */ : slot->tts_nvalid = attnum; 0.00 : 46f038: 41 89 76 24 mov %esi,0x24(%r14) : slot->tts_off = off; : slot->tts_slow = slow; 0.00 : 46f03c: 41 88 7e 07 mov %dil,0x7(%r14) : } 0.00 : 46f040: 48 83 c4 28 add $0x28,%rsp 0.00 : 46f044: 5b pop %rbx 0.00 : 46f045: 41 5c pop %r12 0.00 : 46f047: 41 5d pop %r13 0.00 : 46f049: 41 5e pop %r14 0.00 : 46f04b: 41 5f pop %r15 0.00 : 46f04d: c9 leaveq /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1140 1.69 : 46f04e: c3 retq 0.00 : 46f04f: 90 nop : : isnull[attnum] = false; : : if (!slow && thisatt->attcacheoff >= 0) : off = thisatt->attcacheoff; : else if (thisatt->attlen == -1) 0.00 : 46f050: 66 83 7a 4c ff cmpw $0xffff,0x4c(%rdx) /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1099 1.69 : 46f055: 74 71 je 46f0c8 : } : } : else : { : /* not varlena, so safe to use att_align_nominal */ : off = att_align_nominal(off, thisatt->attalign); /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1120 1.69 : 46f057: 0f b6 42 5e movzbl 0x5e(%rdx),%eax 0.00 : 46f05b: 3c 69 cmp $0x69,%al 0.00 : 46f05d: 0f 84 1d 01 00 00 je 46f180 0.00 : 46f063: 3c 63 cmp $0x63,%al 0.00 : 46f065: 74 10 je 46f077 0.00 : 46f067: 3c 64 cmp $0x64,%al 0.00 : 46f069: 0f 84 51 01 00 00 je 46f1c0 0.00 : 46f06f: 48 83 c3 01 add $0x1,%rbx 0.00 : 46f073: 48 83 e3 fe and $0xfffffffffffffffe,%rbx : : if (!slow) 0.00 : 46f077: 40 84 ff test %dil,%dil 0.00 : 46f07a: 0f 85 5d ff ff ff jne 46efdd : thisatt->attcacheoff = off; 0.00 : 46f080: 89 5a 54 mov %ebx,0x54(%rdx) 0.00 : 46f083: e9 55 ff ff ff jmpq 46efdd 0.00 : 46f088: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 46f08f: 00 : } : : values[attnum] = fetchatt(thisatt, tp + off); : : off = att_addlength_pointer(off, thisatt->attlen, tp + off); 0.00 : 46f090: 66 83 c0 01 add $0x1,%ax 0.00 : 46f094: 0f 85 a6 00 00 00 jne 46f140 0.00 : 46f09a: 41 0f b6 44 1d 00 movzbl 0x0(%r13,%rbx,1),%eax /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1128 5.08 : 46f0a0: 3c 01 cmp $0x1,%al 0.00 : 46f0a2: 0f 84 50 01 00 00 je 46f1f8 0.00 : 46f0a8: a8 01 test $0x1,%al 0.00 : 46f0aa: 0f 85 20 01 00 00 jne 46f1d0 0.00 : 46f0b0: 41 8b 44 1d 00 mov 0x0(%r13,%rbx,1),%eax 0.00 : 46f0b5: c1 e8 02 shr $0x2,%eax 0.00 : 46f0b8: 89 c0 mov %eax,%eax /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1128 1.69 : 46f0ba: 48 8d 1c 18 lea (%rax,%rbx,1),%rbx 0.00 : 46f0be: e9 ad 00 00 00 jmpq 46f170 0.00 : 46f0c3: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : * We can only cache the offset for a varlena attribute if the : * offset is already suitably aligned, so that there would be no : * pad bytes in any case: then the offset will be valid for either : * an aligned or unaligned value. : */ : if (!slow && 0.00 : 46f0c8: 40 84 ff test %dil,%dil 0.00 : 46f0cb: 75 26 jne 46f0f3 0.00 : 46f0cd: 0f b6 42 5e movzbl 0x5e(%rdx),%eax 0.00 : 46f0d1: 3c 69 cmp $0x69,%al 0.00 : 46f0d3: 0f 84 4f 01 00 00 je 46f228 0.00 : 46f0d9: 3c 63 cmp $0x63,%al 0.00 : 46f0db: 74 a3 je 46f080 0.00 : 46f0dd: 3c 64 cmp $0x64,%al 0.00 : 46f0df: 90 nop 0.00 : 46f0e0: 0f 84 52 01 00 00 je 46f238 0.00 : 46f0e6: 48 8d 43 01 lea 0x1(%rbx),%rax 0.00 : 46f0ea: 48 83 e0 fe and $0xfffffffffffffffe,%rax 0.00 : 46f0ee: 48 39 d8 cmp %rbx,%rax 0.00 : 46f0f1: 74 8d je 46f080 : off == att_align_nominal(off, thisatt->attalign)) : thisatt->attcacheoff = off; : else : { : off = att_align_pointer(off, thisatt->attalign, -1, 0.00 : 46f0f3: 41 80 7c 1d 00 00 cmpb $0x0,0x0(%r13,%rbx,1) 0.00 : 46f0f9: 0f 85 a1 00 00 00 jne 46f1a0 0.00 : 46f0ff: 0f b6 42 5e movzbl 0x5e(%rdx),%eax 0.00 : 46f103: 3c 69 cmp $0x69,%al 0.00 : 46f105: 0f 84 d5 00 00 00 je 46f1e0 0.00 : 46f10b: 3c 63 cmp $0x63,%al 0.00 : 46f10d: 0f 1f 00 nopl (%rax) 0.00 : 46f110: 0f 84 8a 00 00 00 je 46f1a0 0.00 : 46f116: 3c 64 cmp $0x64,%al 0.00 : 46f118: 0f 84 27 01 00 00 je 46f245 0.00 : 46f11e: 48 83 c3 01 add $0x1,%rbx 0.00 : 46f122: bf 01 00 00 00 mov $0x1,%edi 0.00 : 46f127: 48 83 e3 fe and $0xfffffffffffffffe,%rbx 0.00 : 46f12b: e9 ad fe ff ff jmpq 46efdd : : if (!slow) : thisatt->attcacheoff = off; : } : : values[attnum] = fetchatt(thisatt, tp + off); 0.00 : 46f130: 49 8b 44 1d 00 mov 0x0(%r13,%rbx,1),%rax 0.00 : 46f135: e9 d6 fe ff ff jmpq 46f010 0.00 : 46f13a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : : off = att_addlength_pointer(off, thisatt->attlen, tp + off); 0.00 : 46f140: 49 8d 7c 1d 00 lea 0x0(%r13,%rbx,1),%rdi 0.00 : 46f145: 4c 89 45 c8 mov %r8,-0x38(%rbp) 0.00 : 46f149: 4c 89 4d c0 mov %r9,-0x40(%rbp) 0.00 : 46f14d: 44 88 55 b8 mov %r10b,-0x48(%rbp) 0.00 : 46f151: 4c 89 5d b0 mov %r11,-0x50(%rbp) 0.00 : 46f155: e8 f6 a6 ff ff callq 469850 0.00 : 46f15a: 44 0f b6 55 b8 movzbl -0x48(%rbp),%r10d 0.00 : 46f15f: 4c 8b 45 c8 mov -0x38(%rbp),%r8 0.00 : 46f163: 48 8d 5c 03 01 lea 0x1(%rbx,%rax,1),%rbx 0.00 : 46f168: 4c 8b 4d c0 mov -0x40(%rbp),%r9 0.00 : 46f16c: 4c 8b 5d b0 mov -0x50(%rbp),%r11 : * Save state for next execution : */ : slot->tts_nvalid = attnum; : slot->tts_off = off; : slot->tts_slow = slow; : } 0.00 : 46f170: bf 01 00 00 00 mov $0x1,%edi 0.00 : 46f175: e9 36 fe ff ff jmpq 46efb0 0.00 : 46f17a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : } : } : else : { : /* not varlena, so safe to use att_align_nominal */ : off = att_align_nominal(off, thisatt->attalign); 0.00 : 46f180: 48 83 c3 03 add $0x3,%rbx 0.00 : 46f184: 48 83 e3 fc and $0xfffffffffffffffc,%rbx /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1120 3.39 : 46f188: e9 ea fe ff ff jmpq 46f077 0.00 : 46f18d: 0f 1f 00 nopl (%rax) : : if (!slow) : thisatt->attcacheoff = off; : } : : values[attnum] = fetchatt(thisatt, tp + off); 0.00 : 46f190: 41 8b 44 1d 00 mov 0x0(%r13,%rbx,1),%eax /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1126 1.69 : 46f195: e9 76 fe ff ff jmpq 46f010 0.00 : 46f19a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : { : /* not varlena, so safe to use att_align_nominal */ : off = att_align_nominal(off, thisatt->attalign); : : if (!slow) : thisatt->attcacheoff = off; 0.00 : 46f1a0: bf 01 00 00 00 mov $0x1,%edi 0.00 : 46f1a5: e9 33 fe ff ff jmpq 46efdd 0.00 : 46f1aa: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : } : : values[attnum] = fetchatt(thisatt, tp + off); 0.00 : 46f1b0: 41 0f b7 44 1d 00 movzwl 0x0(%r13,%rbx,1),%eax 0.00 : 46f1b6: e9 55 fe ff ff jmpq 46f010 0.00 : 46f1bb: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : } : } : else : { : /* not varlena, so safe to use att_align_nominal */ : off = att_align_nominal(off, thisatt->attalign); 0.00 : 46f1c0: 48 83 c3 07 add $0x7,%rbx 0.00 : 46f1c4: 48 83 e3 f8 and $0xfffffffffffffff8,%rbx 0.00 : 46f1c8: e9 aa fe ff ff jmpq 46f077 0.00 : 46f1cd: 0f 1f 00 nopl (%rax) : thisatt->attcacheoff = off; : } : : values[attnum] = fetchatt(thisatt, tp + off); : : off = att_addlength_pointer(off, thisatt->attlen, tp + off); 0.00 : 46f1d0: d0 e8 shr %al /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1128 5.08 : 46f1d2: 0f b6 c0 movzbl %al,%eax 0.00 : 46f1d5: e9 e0 fe ff ff jmpq 46f0ba 0.00 : 46f1da: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : if (!slow && : off == att_align_nominal(off, thisatt->attalign)) : thisatt->attcacheoff = off; : else : { : off = att_align_pointer(off, thisatt->attalign, -1, 0.00 : 46f1e0: 48 83 c3 03 add $0x3,%rbx 0.00 : 46f1e4: bf 01 00 00 00 mov $0x1,%edi 0.00 : 46f1e9: 48 83 e3 fc and $0xfffffffffffffffc,%rbx 0.00 : 46f1ed: e9 eb fd ff ff jmpq 46efdd 0.00 : 46f1f2: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : thisatt->attcacheoff = off; : } : : values[attnum] = fetchatt(thisatt, tp + off); : : off = att_addlength_pointer(off, thisatt->attlen, tp + off); 0.00 : 46f1f8: 41 0f b6 54 1d 01 movzbl 0x1(%r13,%rbx,1),%edx 0.00 : 46f1fe: b8 0a 00 00 00 mov $0xa,%eax 0.00 : 46f203: 80 fa 01 cmp $0x1,%dl 0.00 : 46f206: 0f 84 ae fe ff ff je 46f0ba 0.00 : 46f20c: 80 fa 12 cmp $0x12,%dl 0.00 : 46f20f: b8 03 00 00 00 mov $0x3,%eax 0.00 : 46f214: ba 12 00 00 00 mov $0x12,%edx 0.00 : 46f219: 48 0f 44 c2 cmove %rdx,%rax 0.00 : 46f21d: e9 98 fe ff ff jmpq 46f0ba 0.00 : 46f222: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : * We can only cache the offset for a varlena attribute if the : * offset is already suitably aligned, so that there would be no : * pad bytes in any case: then the offset will be valid for either : * an aligned or unaligned value. : */ : if (!slow && 0.00 : 46f228: 48 8d 43 03 lea 0x3(%rbx),%rax 0.00 : 46f22c: 48 83 e0 fc and $0xfffffffffffffffc,%rax 0.00 : 46f230: e9 b9 fe ff ff jmpq 46f0ee 0.00 : 46f235: 0f 1f 00 nopl (%rax) 0.00 : 46f238: 48 8d 43 07 lea 0x7(%rbx),%rax 0.00 : 46f23c: 48 83 e0 f8 and $0xfffffffffffffff8,%rax 0.00 : 46f240: e9 a9 fe ff ff jmpq 46f0ee : off == att_align_nominal(off, thisatt->attalign)) : thisatt->attcacheoff = off; : else : { : off = att_align_pointer(off, thisatt->attalign, -1, 0.00 : 46f245: 48 83 c3 07 add $0x7,%rbx 0.00 : 46f249: bf 01 00 00 00 mov $0x1,%edi 0.00 : 46f24e: 48 83 e3 f8 and $0xfffffffffffffff8,%rbx 0.00 : 46f252: e9 86 fd ff ff jmpq 46efdd Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 7.02 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:289 5.26 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:214 5.26 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:292 5.26 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:306 5.26 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:401 3.51 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:206 3.51 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:265 3.51 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:267 3.51 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:269 3.51 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:286 3.51 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:286 3.51 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:289 3.51 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:292 3.51 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:399 3.51 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:398 1.75 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:63 1.75 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:214 1.75 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:239 1.75 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:239 1.75 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:239 1.75 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:259 1.75 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:260 1.75 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:264 1.75 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:264 1.75 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:266 1.75 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:267 1.75 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:267 1.75 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:267 1.75 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:269 1.75 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:275 1.75 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:284 1.75 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:293 1.75 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:401 1.75 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:393 1.75 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:394 1.75 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:393 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000005baf80 : : * Retrieve next tuple from the BitmapHeapScan node's currentRelation : * ---------------------------------------------------------------- : */ : static TupleTableSlot * : BitmapHeapNext(BitmapHeapScanState *node) : { 0.00 : 5baf80: 55 push %rbp 0.00 : 5baf81: 48 89 e5 mov %rsp,%rbp /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:63 1.75 : 5baf84: 41 57 push %r15 0.00 : 5baf86: 41 56 push %r14 0.00 : 5baf88: 41 55 push %r13 0.00 : 5baf8a: 41 54 push %r12 0.00 : 5baf8c: 53 push %rbx 0.00 : 5baf8d: 48 89 fb mov %rdi,%rbx 0.00 : 5baf90: 48 81 ec d8 00 00 00 sub $0xd8,%rsp : TupleTableSlot *slot; : : /* : * extract necessary information from index scan node : */ : econtext = node->ss.ps.ps_ExprContext; 0.00 : 5baf97: 48 8b 47 60 mov 0x60(%rdi),%rax 0.00 : 5baf9b: 48 89 85 28 ff ff ff mov %rax,-0xd8(%rbp) : slot = node->ss.ss_ScanTupleSlot; 0.00 : 5bafa2: 48 8b 97 88 00 00 00 mov 0x88(%rdi),%rdx 0.00 : 5bafa9: 48 89 95 38 ff ff ff mov %rdx,-0xc8(%rbp) : scan = node->ss.ss_currentScanDesc; : tbm = node->tbm; : tbmiterator = node->tbmiterator; 0.00 : 5bafb0: 48 8b 8f a0 00 00 00 mov 0xa0(%rdi),%rcx : /* : * extract necessary information from index scan node : */ : econtext = node->ss.ps.ps_ExprContext; : slot = node->ss.ss_ScanTupleSlot; : scan = node->ss.ss_currentScanDesc; 0.00 : 5bafb7: 4c 8b a7 80 00 00 00 mov 0x80(%rdi),%r12 : tbm = node->tbm; : tbmiterator = node->tbmiterator; 0.00 : 5bafbe: 48 89 8d 30 ff ff ff mov %rcx,-0xd0(%rbp) : * desired prefetch distance, which starts small and increases up to the : * GUC-controlled maximum, target_prefetch_pages. This is to avoid doing : * a lot of prefetching in a scan that stops after a few tuples because of : * a LIMIT. : */ : if (tbm == NULL) 0.00 : 5bafc5: 48 83 bf 98 00 00 00 cmpq $0x0,0x98(%rdi) 0.00 : 5bafcc: 00 : econtext = node->ss.ps.ps_ExprContext; : slot = node->ss.ss_ScanTupleSlot; : scan = node->ss.ss_currentScanDesc; : tbm = node->tbm; : tbmiterator = node->tbmiterator; : tbmres = node->tbmres; 0.00 : 5bafcd: 48 8b 97 a8 00 00 00 mov 0xa8(%rdi),%rdx : #ifdef USE_PREFETCH : prefetch_iterator = node->prefetch_iterator; 0.00 : 5bafd4: 4c 8b bf c0 00 00 00 mov 0xc0(%rdi),%r15 : * desired prefetch distance, which starts small and increases up to the : * GUC-controlled maximum, target_prefetch_pages. This is to avoid doing : * a lot of prefetching in a scan that stops after a few tuples because of : * a LIMIT. : */ : if (tbm == NULL) 0.00 : 5bafdb: 0f 84 11 06 00 00 je 5bb5f2 : : /* : * Set up the result slot to point to this tuple. Note that the slot : * acquires a pin on the buffer. : */ : ExecStoreTuple(&scan->rs_ctup, 0.00 : 5bafe1: 49 8d 44 24 48 lea 0x48(%r12),%rax : ItemId lp; : : /* : * Get next page of results if needed : */ : if (tbmres == NULL) 0.00 : 5bafe6: 48 85 d2 test %rdx,%rdx : : /* : * Set up the result slot to point to this tuple. Note that the slot : * acquires a pin on the buffer. : */ : ExecStoreTuple(&scan->rs_ctup, 0.00 : 5bafe9: 48 89 85 20 ff ff ff mov %rax,-0xe0(%rbp) : ItemId lp; : : /* : * Get next page of results if needed : */ : if (tbmres == NULL) 0.00 : 5baff0: 0f 84 c4 01 00 00 je 5bb1ba 0.00 : 5baff6: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 0.00 : 5baffd: 00 00 00 : else : { : /* : * Continuing in previously obtained page; advance rs_cindex : */ : scan->rs_cindex++; /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:206 3.51 : 5bb000: 41 83 44 24 70 01 addl $0x1,0x70(%r12) : : /* : * Try to prefetch at least a few pages even before we get to the : * second page if we don't stop reading after the first tuple. : */ : if (node->prefetch_target < target_prefetch_pages) 0.00 : 5bb006: 49 89 d5 mov %rdx,%r13 0.00 : 5bb009: 8b 83 cc 00 00 00 mov 0xcc(%rbx),%eax /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:214 1.75 : 5bb00f: 3b 05 4f 20 5c 00 cmp 0x5c204f(%rip),%eax # b7d064 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:214 5.26 : 5bb015: 7d 0c jge 5bb023 : node->prefetch_target++; 0.00 : 5bb017: 83 c0 01 add $0x1,%eax 0.00 : 5bb01a: 49 89 d5 mov %rdx,%r13 0.00 : 5bb01d: 89 83 cc 00 00 00 mov %eax,0xcc(%rbx) : } : : /* : * Out of range? If so, nothing more to look at on this page : */ : if (scan->rs_cindex < 0 || scan->rs_cindex >= scan->rs_ntuples) 0.00 : 5bb023: 41 8b 44 24 70 mov 0x70(%r12),%eax 0.00 : 5bb028: 85 c0 test %eax,%eax 0.00 : 5bb02a: 0f 88 e0 01 00 00 js 5bb210 0.00 : 5bb030: 41 3b 44 24 78 cmp 0x78(%r12),%eax 0.00 : 5bb035: 0f 8d d5 01 00 00 jge 5bb210 : * to avoid having prefetching interfere with the main I/O. Also, this : * should happen only when we have determined there is still something : * to do on the current page, else we may uselessly prefetch the same : * page we are just about to request for real. : */ : if (prefetch_iterator) 0.00 : 5bb03b: 4d 85 ff test %r15,%r15 0.00 : 5bb03e: 74 55 je 5bb095 : { : while (node->prefetch_pages < node->prefetch_target) /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:239 1.75 : 5bb040: 8b 83 cc 00 00 00 mov 0xcc(%rbx),%eax 1.75 : 5bb046: 3b 83 c8 00 00 00 cmp 0xc8(%rbx),%eax 0.00 : 5bb04c: 7f 24 jg 5bb072 1.75 : 5bb04e: eb 45 jmp 5bb095 : /* No more pages to prefetch */ : tbm_end_iterate(prefetch_iterator); : node->prefetch_iterator = prefetch_iterator = NULL; : break; : } : node->prefetch_pages++; 0.00 : 5bb050: 83 83 c8 00 00 00 01 addl $0x1,0xc8(%rbx) : PrefetchBuffer(scan->rs_rd, MAIN_FORKNUM, tbmpre->blockno); 0.00 : 5bb057: 31 f6 xor %esi,%esi 0.00 : 5bb059: 8b 10 mov (%rax),%edx 0.00 : 5bb05b: 49 8b 3c 24 mov (%r12),%rdi 0.00 : 5bb05f: e8 6c b7 0b 00 callq 6767d0 : * to do on the current page, else we may uselessly prefetch the same : * page we are just about to request for real. : */ : if (prefetch_iterator) : { : while (node->prefetch_pages < node->prefetch_target) 0.00 : 5bb064: 8b 83 c8 00 00 00 mov 0xc8(%rbx),%eax 0.00 : 5bb06a: 3b 83 cc 00 00 00 cmp 0xcc(%rbx),%eax 0.00 : 5bb070: 7d 23 jge 5bb095 : { : TBMIterateResult *tbmpre = tbm_iterate(prefetch_iterator); 0.00 : 5bb072: 4c 89 ff mov %r15,%rdi 0.00 : 5bb075: e8 d6 82 02 00 callq 5e3350 : : if (tbmpre == NULL) 0.00 : 5bb07a: 48 85 c0 test %rax,%rax 0.00 : 5bb07d: 75 d1 jne 5bb050 : { : /* No more pages to prefetch */ : tbm_end_iterate(prefetch_iterator); 0.00 : 5bb07f: 4c 89 ff mov %r15,%rdi : node->prefetch_iterator = prefetch_iterator = NULL; 0.00 : 5bb082: 45 31 ff xor %r15d,%r15d : TBMIterateResult *tbmpre = tbm_iterate(prefetch_iterator); : : if (tbmpre == NULL) : { : /* No more pages to prefetch */ : tbm_end_iterate(prefetch_iterator); 0.00 : 5bb085: e8 86 84 02 00 callq 5e3510 : node->prefetch_iterator = prefetch_iterator = NULL; 0.00 : 5bb08a: 48 c7 83 c0 00 00 00 movq $0x0,0xc0(%rbx) 0.00 : 5bb091: 00 00 00 00 : #endif /* USE_PREFETCH */ : : /* : * Okay to fetch the tuple : */ : targoffset = scan->rs_vistuples[scan->rs_cindex]; /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:259 1.75 : 5bb095: 49 63 44 24 70 movslq 0x70(%r12),%rax : dp = (Page) BufferGetPage(scan->rs_cbuf); 0.00 : 5bb09a: 41 8b 74 24 64 mov 0x64(%r12),%esi 0.00 : 5bb09f: 85 f6 test %esi,%esi : #endif /* USE_PREFETCH */ : : /* : * Okay to fetch the tuple : */ : targoffset = scan->rs_vistuples[scan->rs_cindex]; 0.00 : 5bb0a1: 41 0f b7 7c 44 7c movzwl 0x7c(%r12,%rax,2),%edi : dp = (Page) BufferGetPage(scan->rs_cbuf); /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:260 1.75 : 5bb0a7: 0f 88 73 01 00 00 js 5bb220 0.00 : 5bb0ad: 8d 46 ff lea -0x1(%rsi),%eax 0.00 : 5bb0b0: 48 63 c8 movslq %eax,%rcx 0.00 : 5bb0b3: 48 c1 e1 0d shl $0xd,%rcx 0.00 : 5bb0b7: 48 03 0d 3a 4a 60 00 add 0x604a3a(%rip),%rcx # bbfaf8 : lp = PageGetItemId(dp, targoffset); 0.00 : 5bb0be: 0f b7 d7 movzwl %di,%edx : Assert(ItemIdIsNormal(lp)); : : scan->rs_ctup.t_data = (HeapTupleHeader) PageGetItem((Page) dp, lp); 0.00 : 5bb0c1: 48 83 c2 03 add $0x3,%rdx 0.00 : 5bb0c5: 0f b7 44 91 08 movzwl 0x8(%rcx,%rdx,4),%eax /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:264 1.75 : 5bb0ca: 25 ff 7f 00 00 and $0x7fff,%eax 0.00 : 5bb0cf: 48 8d 04 01 lea (%rcx,%rax,1),%rax 1.75 : 5bb0d3: 49 89 44 24 58 mov %rax,0x58(%r12) : scan->rs_ctup.t_len = ItemIdGetLength(lp); /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:265 3.51 : 5bb0d8: 0f b7 44 91 0a movzwl 0xa(%rcx,%rdx,4),%eax : scan->rs_ctup.t_tableOid = scan->rs_rd->rd_id; 0.00 : 5bb0dd: 49 8b 14 24 mov (%r12),%rdx : dp = (Page) BufferGetPage(scan->rs_cbuf); : lp = PageGetItemId(dp, targoffset); : Assert(ItemIdIsNormal(lp)); : : scan->rs_ctup.t_data = (HeapTupleHeader) PageGetItem((Page) dp, lp); : scan->rs_ctup.t_len = ItemIdGetLength(lp); 0.00 : 5bb0e1: 66 d1 e8 shr %ax 0.00 : 5bb0e4: 0f b7 c0 movzwl %ax,%eax 0.00 : 5bb0e7: 41 89 44 24 48 mov %eax,0x48(%r12) : scan->rs_ctup.t_tableOid = scan->rs_rd->rd_id; 0.00 : 5bb0ec: 8b 42 40 mov 0x40(%rdx),%eax /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:266 1.75 : 5bb0ef: 41 89 44 24 54 mov %eax,0x54(%r12) : ItemPointerSet(&scan->rs_ctup.t_self, tbmres->blockno, targoffset); /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:267 1.75 : 5bb0f4: 41 8b 45 00 mov 0x0(%r13),%eax 3.51 : 5bb0f8: c1 e8 10 shr $0x10,%eax 1.75 : 5bb0fb: 66 41 89 44 24 4c mov %ax,0x4c(%r12) 0.00 : 5bb101: 41 8b 45 00 mov 0x0(%r13),%eax 0.00 : 5bb105: 66 41 89 7c 24 50 mov %di,0x50(%r12) 1.75 : 5bb10b: 66 41 89 44 24 4e mov %ax,0x4e(%r12) : : pgstat_count_heap_fetch(scan->rs_rd); 0.00 : 5bb111: 48 8b 82 38 01 00 00 mov 0x138(%rdx),%rax /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:269 3.51 : 5bb118: 48 85 c0 test %rax,%rax 0.00 : 5bb11b: 74 0a je 5bb127 0.00 : 5bb11d: 48 83 40 20 01 addq $0x1,0x20(%rax) 1.75 : 5bb122: 41 8b 74 24 64 mov 0x64(%r12),%esi : : /* : * Set up the result slot to point to this tuple. Note that the slot : * acquires a pin on the buffer. : */ : ExecStoreTuple(&scan->rs_ctup, 0.00 : 5bb127: 89 f2 mov %esi,%edx 0.00 : 5bb129: 48 8b bd 20 ff ff ff mov -0xe0(%rbp),%rdi 0.00 : 5bb130: 48 8b b5 38 ff ff ff mov -0xc8(%rbp),%rsi /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:275 1.75 : 5bb137: 31 c9 xor %ecx,%ecx 0.00 : 5bb139: e8 42 93 ff ff callq 5b4480 : : /* : * If we are using lossy info, we have to recheck the qual conditions : * at every tuple. : */ : if (tbmres->recheck) /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:284 1.75 : 5bb13e: 41 80 7d 08 00 cmpb $0x0,0x8(%r13) 0.00 : 5bb143: 0f 84 b1 02 00 00 je 5bb3fa : { : econtext->ecxt_scantuple = slot; /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:286 3.51 : 5bb149: 48 8b 95 28 ff ff ff mov -0xd8(%rbp),%rdx 0.00 : 5bb150: 48 8b 8d 38 ff ff ff mov -0xc8(%rbp),%rcx : ResetExprContext(econtext); 0.00 : 5bb157: 48 8b 7a 28 mov 0x28(%rdx),%rdi : * If we are using lossy info, we have to recheck the qual conditions : * at every tuple. : */ : if (tbmres->recheck) : { : econtext->ecxt_scantuple = slot; 3.51 : 5bb15b: 48 89 4a 08 mov %rcx,0x8(%rdx) : ResetExprContext(econtext); 0.00 : 5bb15f: e8 4c d8 1d 00 callq 7989b0 : : if (!ExecQual(node->bitmapqualorig, econtext, false)) 0.00 : 5bb164: 48 8b bb 90 00 00 00 mov 0x90(%rbx),%rdi 0.00 : 5bb16b: 48 8b b5 28 ff ff ff mov -0xd8(%rbp),%rsi /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:289 7.02 : 5bb172: 31 d2 xor %edx,%edx 0.00 : 5bb174: e8 97 1d ff ff callq 5acf10 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:289 3.51 : 5bb179: 84 c0 test %al,%al 0.00 : 5bb17b: 0f 85 79 02 00 00 jne 5bb3fa : { : /* Fails recheck, so drop it and loop back for another */ : InstrCountFiltered2(node, 1); 0.00 : 5bb181: 48 8b 43 18 mov 0x18(%rbx),%rax 0.00 : 5bb185: 48 85 c0 test %rax,%rax 0.00 : 5bb188: 74 18 je 5bb1a2 0.00 : 5bb18a: f2 0f 10 05 c6 3f 1f movsd 0x1f3fc6(%rip),%xmm0 # 7af158 <__func__.15777+0x10> 0.00 : 5bb191: 00 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:292 3.51 : 5bb192: f2 0f 58 80 d0 00 00 addsd 0xd0(%rax),%xmm0 0.00 : 5bb199: 00 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:292 5.26 : 5bb19a: f2 0f 11 80 d0 00 00 movsd %xmm0,0xd0(%rax) 0.00 : 5bb1a1: 00 : ExecClearTuple(slot); /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:293 1.75 : 5bb1a2: 48 8b bd 38 ff ff ff mov -0xc8(%rbp),%rdi 0.00 : 5bb1a9: e8 62 8f ff ff callq 5b4110 : : /* : * Set up the result slot to point to this tuple. Note that the slot : * acquires a pin on the buffer. : */ : ExecStoreTuple(&scan->rs_ctup, 0.00 : 5bb1ae: 4c 89 ea mov %r13,%rdx : ItemId lp; : : /* : * Get next page of results if needed : */ : if (tbmres == NULL) 0.00 : 5bb1b1: 48 85 d2 test %rdx,%rdx 0.00 : 5bb1b4: 0f 85 46 fe ff ff jne 5bb000 : { : node->tbmres = tbmres = tbm_iterate(tbmiterator); 0.00 : 5bb1ba: 48 8b bd 30 ff ff ff mov -0xd0(%rbp),%rdi 0.00 : 5bb1c1: e8 8a 81 02 00 callq 5e3350 : if (tbmres == NULL) 0.00 : 5bb1c6: 48 85 c0 test %rax,%rax : /* : * Get next page of results if needed : */ : if (tbmres == NULL) : { : node->tbmres = tbmres = tbm_iterate(tbmiterator); 0.00 : 5bb1c9: 49 89 c5 mov %rax,%r13 0.00 : 5bb1cc: 48 89 83 a8 00 00 00 mov %rax,0xa8(%rbx) : if (tbmres == NULL) 0.00 : 5bb1d3: 0f 84 0e 02 00 00 je 5bb3e7 : /* no more entries in the bitmap */ : break; : } : : #ifdef USE_PREFETCH : if (node->prefetch_pages > 0) 0.00 : 5bb1d9: 8b 83 c8 00 00 00 mov 0xc8(%rbx),%eax 0.00 : 5bb1df: 85 c0 test %eax,%eax 0.00 : 5bb1e1: 0f 8e ae 01 00 00 jle 5bb395 : { : /* The main iterator has closed the distance by one page */ : node->prefetch_pages--; 0.00 : 5bb1e7: 83 e8 01 sub $0x1,%eax 0.00 : 5bb1ea: 89 83 c8 00 00 00 mov %eax,0xc8(%rbx) 0.00 : 5bb1f0: 41 8b 55 00 mov 0x0(%r13),%edx 0.00 : 5bb1f4: 89 95 7c ff ff ff mov %edx,-0x84(%rbp) : * Ignore any claimed entries past what we think is the end of the : * relation. (This is probably not necessary given that we got at : * least AccessShareLock on the table before performing any of the : * indexscans, but let's be safe.) : */ : if (tbmres->blockno >= scan->rs_nblocks) 0.00 : 5bb1fa: 8b 85 7c ff ff ff mov -0x84(%rbp),%eax 0.00 : 5bb200: 41 39 44 24 28 cmp %eax,0x28(%r12) 0.00 : 5bb205: 77 2f ja 5bb236 0.00 : 5bb207: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 5bb20e: 00 00 : /* : * Out of range? If so, nothing more to look at on this page : */ : if (scan->rs_cindex < 0 || scan->rs_cindex >= scan->rs_ntuples) : { : node->tbmres = tbmres = NULL; 0.00 : 5bb210: 48 c7 83 a8 00 00 00 movq $0x0,0xa8(%rbx) 0.00 : 5bb217: 00 00 00 00 0.00 : 5bb21b: 45 31 ed xor %r13d,%r13d : continue; 0.00 : 5bb21e: eb 8e jmp 5bb1ae : : /* : * Okay to fetch the tuple : */ : targoffset = scan->rs_vistuples[scan->rs_cindex]; : dp = (Page) BufferGetPage(scan->rs_cbuf); 0.00 : 5bb220: 89 f0 mov %esi,%eax 0.00 : 5bb222: 48 8b 15 ef 1e 5c 00 mov 0x5c1eef(%rip),%rdx # b7d118 0.00 : 5bb229: f7 d0 not %eax 0.00 : 5bb22b: 48 98 cltq 0.00 : 5bb22d: 48 8b 0c c2 mov (%rdx,%rax,8),%rcx 0.00 : 5bb231: e9 88 fe ff ff jmpq 5bb0be : /* : * Acquire pin on the target heap page, trading in any pin we held before. : */ : Assert(page < scan->rs_nblocks); : : scan->rs_cbuf = ReleaseAndReadBuffer(scan->rs_cbuf, 0.00 : 5bb236: 41 8b 7c 24 64 mov 0x64(%r12),%edi 0.00 : 5bb23b: 8b 95 7c ff ff ff mov -0x84(%rbp),%edx 0.00 : 5bb241: 49 8b 34 24 mov (%r12),%rsi 0.00 : 5bb245: e8 76 b4 0b 00 callq 6766c0 0.00 : 5bb24a: 89 85 78 ff ff ff mov %eax,-0x88(%rbp) : scan->rs_rd, : page); : buffer = scan->rs_cbuf; : snapshot = scan->rs_snapshot; 0.00 : 5bb250: 49 8b 54 24 08 mov 0x8(%r12),%rdx : ntup = 0; : : /* : * Prune and repair fragmentation for the whole page, if possible. : */ : heap_page_prune_opt(scan->rs_rd, buffer); 0.00 : 5bb255: 89 c6 mov %eax,%esi : /* : * Acquire pin on the target heap page, trading in any pin we held before. : */ : Assert(page < scan->rs_nblocks); : : scan->rs_cbuf = ReleaseAndReadBuffer(scan->rs_cbuf, 0.00 : 5bb257: 41 89 44 24 64 mov %eax,0x64(%r12) : scan->rs_rd, : page); : buffer = scan->rs_cbuf; : snapshot = scan->rs_snapshot; 0.00 : 5bb25c: 48 89 95 58 ff ff ff mov %rdx,-0xa8(%rbp) : ntup = 0; : : /* : * Prune and repair fragmentation for the whole page, if possible. : */ : heap_page_prune_opt(scan->rs_rd, buffer); 0.00 : 5bb263: 49 8b 3c 24 mov (%r12),%rdi 0.00 : 5bb267: e8 e4 43 ee ff callq 49f650 : /* : * We must hold share lock on the buffer content while examining tuple : * visibility. Afterwards, however, the tuples we have found to be : * visible are guaranteed good as long as we hold the buffer pin. : */ : LockBuffer(buffer, BUFFER_LOCK_SHARE); 0.00 : 5bb26c: 8b bd 78 ff ff ff mov -0x88(%rbp),%edi 0.00 : 5bb272: be 01 00 00 00 mov $0x1,%esi 0.00 : 5bb277: e8 94 94 0b 00 callq 674710 : : /* : * We need two separate strategies for lossy and non-lossy cases. : */ : if (tbmres->ntuples >= 0) 0.00 : 5bb27c: 41 83 7d 04 00 cmpl $0x0,0x4(%r13) 0.00 : 5bb281: 0f 8c 97 01 00 00 jl 5bb41e : * tbmres; but we have to follow any HOT chain starting at each such : * offset. : */ : int curslot; : : for (curslot = 0; curslot < tbmres->ntuples; curslot++) 0.00 : 5bb287: 0f 84 c1 01 00 00 je 5bb44e 0.00 : 5bb28d: 8b 8d 7c ff ff ff mov -0x84(%rbp),%ecx 0.00 : 5bb293: 0f b7 85 7c ff ff ff movzwl -0x84(%rbp),%eax 0.00 : 5bb29a: 45 31 f6 xor %r14d,%r14d 0.00 : 5bb29d: c7 85 54 ff ff ff 00 movl $0x0,-0xac(%rbp) 0.00 : 5bb2a4: 00 00 00 0.00 : 5bb2a7: c1 e9 10 shr $0x10,%ecx 0.00 : 5bb2aa: 66 89 4d 80 mov %cx,-0x80(%rbp) 0.00 : 5bb2ae: 66 89 45 9e mov %ax,-0x62(%rbp) 0.00 : 5bb2b2: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : { : OffsetNumber offnum = tbmres->offsets[curslot]; 0.00 : 5bb2b8: 49 63 c6 movslq %r14d,%rax : ItemPointerData tid; : HeapTupleData heapTuple; : : ItemPointerSet(&tid, page, offnum); 0.00 : 5bb2bb: 0f b7 55 80 movzwl -0x80(%rbp),%edx 0.00 : 5bb2bf: 0f b7 4d 9e movzwl -0x62(%rbp),%ecx : */ : int curslot; : : for (curslot = 0; curslot < tbmres->ntuples; curslot++) : { : OffsetNumber offnum = tbmres->offsets[curslot]; 0.00 : 5bb2c3: 41 0f b7 44 45 0a movzwl 0xa(%r13,%rax,2),%eax : ItemPointerData tid; : HeapTupleData heapTuple; : : ItemPointerSet(&tid, page, offnum); : if (heap_hot_search_buffer(&tid, scan->rs_rd, buffer, snapshot, 0.00 : 5bb2c9: c7 04 24 01 00 00 00 movl $0x1,(%rsp) 0.00 : 5bb2d0: 4c 8d 45 a0 lea -0x60(%rbp),%r8 0.00 : 5bb2d4: 48 8d 7d c0 lea -0x40(%rbp),%rdi 0.00 : 5bb2d8: 45 31 c9 xor %r9d,%r9d : { : OffsetNumber offnum = tbmres->offsets[curslot]; : ItemPointerData tid; : HeapTupleData heapTuple; : : ItemPointerSet(&tid, page, offnum); 0.00 : 5bb2db: 66 89 55 c0 mov %dx,-0x40(%rbp) 0.00 : 5bb2df: 66 89 4d c2 mov %cx,-0x3e(%rbp) 0.00 : 5bb2e3: 66 89 45 c4 mov %ax,-0x3c(%rbp) : if (heap_hot_search_buffer(&tid, scan->rs_rd, buffer, snapshot, 0.00 : 5bb2e7: 48 8b 8d 58 ff ff ff mov -0xa8(%rbp),%rcx 0.00 : 5bb2ee: 8b 95 78 ff ff ff mov -0x88(%rbp),%edx 0.00 : 5bb2f4: 49 8b 34 24 mov (%r12),%rsi 0.00 : 5bb2f8: e8 23 1f ee ff callq 49d220 0.00 : 5bb2fd: 84 c0 test %al,%al 0.00 : 5bb2ff: 74 18 je 5bb319 : &heapTuple, NULL, true)) : scan->rs_vistuples[ntup++] = ItemPointerGetOffsetNumber(&tid); 0.00 : 5bb301: 48 63 95 54 ff ff ff movslq -0xac(%rbp),%rdx 0.00 : 5bb308: 0f b7 45 c4 movzwl -0x3c(%rbp),%eax 0.00 : 5bb30c: 66 41 89 44 54 7c mov %ax,0x7c(%r12,%rdx,2) 0.00 : 5bb312: 83 85 54 ff ff ff 01 addl $0x1,-0xac(%rbp) : * tbmres; but we have to follow any HOT chain starting at each such : * offset. : */ : int curslot; : : for (curslot = 0; curslot < tbmres->ntuples; curslot++) 0.00 : 5bb319: 41 83 c6 01 add $0x1,%r14d 0.00 : 5bb31d: 45 3b 75 04 cmp 0x4(%r13),%r14d 0.00 : 5bb321: 7c 95 jl 5bb2b8 : CheckForSerializableConflictOut(valid, scan->rs_rd, &loctup, : buffer, snapshot); : } : } : : LockBuffer(buffer, BUFFER_LOCK_UNLOCK); 0.00 : 5bb323: 8b bd 78 ff ff ff mov -0x88(%rbp),%edi 0.00 : 5bb329: 31 f6 xor %esi,%esi 0.00 : 5bb32b: e8 e0 93 0b 00 callq 674710 : : Assert(ntup <= MaxHeapTuplesPerPage); : scan->rs_ntuples = ntup; 0.00 : 5bb330: 8b 85 54 ff ff ff mov -0xac(%rbp),%eax 0.00 : 5bb336: 41 89 44 24 78 mov %eax,0x78(%r12) : /* : * Fetch the current heap page and identify candidate tuples. : */ : bitgetpage(scan, tbmres); : : if (tbmres->ntuples >= 0) 0.00 : 5bb33b: 41 8b 45 04 mov 0x4(%r13),%eax 0.00 : 5bb33f: 85 c0 test %eax,%eax 0.00 : 5bb341: 0f 88 16 01 00 00 js 5bb45d : node->exact_pages++; 0.00 : 5bb347: 48 83 83 b0 00 00 00 addq $0x1,0xb0(%rbx) 0.00 : 5bb34e: 01 : node->lossy_pages++; : : /* : * Set rs_cindex to first slot to examine : */ : scan->rs_cindex = 0; 0.00 : 5bb34f: 41 c7 44 24 70 00 00 movl $0x0,0x70(%r12) 0.00 : 5bb356: 00 00 : * Increase prefetch target if it's not yet at the max. Note that : * we will increase it to zero after fetching the very first : * page/tuple, then to one after the second tuple is fetched, then : * it doubles as later pages are fetched. : */ : if (node->prefetch_target >= target_prefetch_pages) 0.00 : 5bb358: 8b 8b cc 00 00 00 mov 0xcc(%rbx),%ecx 0.00 : 5bb35e: 31 c0 xor %eax,%eax 0.00 : 5bb360: 8b 15 fe 1c 5c 00 mov 0x5c1cfe(%rip),%edx # b7d064 0.00 : 5bb366: 39 d1 cmp %edx,%ecx 0.00 : 5bb368: 0f 8d c2 fc ff ff jge 5bb030 : /* don't increase any further */ ; : else if (node->prefetch_target >= target_prefetch_pages / 2) 0.00 : 5bb36e: 89 d0 mov %edx,%eax 0.00 : 5bb370: c1 e8 1f shr $0x1f,%eax 0.00 : 5bb373: 01 d0 add %edx,%eax 0.00 : 5bb375: d1 f8 sar %eax 0.00 : 5bb377: 39 c1 cmp %eax,%ecx 0.00 : 5bb379: 0f 8d 94 00 00 00 jge 5bb413 : node->prefetch_target = target_prefetch_pages; : else if (node->prefetch_target > 0) 0.00 : 5bb37f: 85 c9 test %ecx,%ecx 0.00 : 5bb381: 0f 8e 5d 02 00 00 jle 5bb5e4 : node->prefetch_target *= 2; 0.00 : 5bb387: 8d 04 09 lea (%rcx,%rcx,1),%eax 0.00 : 5bb38a: 89 83 cc 00 00 00 mov %eax,0xcc(%rbx) 0.00 : 5bb390: e9 8e fc ff ff jmpq 5bb023 : if (node->prefetch_pages > 0) : { : /* The main iterator has closed the distance by one page */ : node->prefetch_pages--; : } : else if (prefetch_iterator) 0.00 : 5bb395: 4d 85 ff test %r15,%r15 0.00 : 5bb398: 0f 84 cc 00 00 00 je 5bb46a : { : /* Do not let the prefetch iterator get behind the main one */ : TBMIterateResult *tbmpre = tbm_iterate(prefetch_iterator); 0.00 : 5bb39e: 4c 89 ff mov %r15,%rdi 0.00 : 5bb3a1: e8 aa 7f 02 00 callq 5e3350 : : if (tbmpre == NULL || tbmpre->blockno != tbmres->blockno) 0.00 : 5bb3a6: 48 85 c0 test %rax,%rax 0.00 : 5bb3a9: 74 12 je 5bb3bd 0.00 : 5bb3ab: 8b 00 mov (%rax),%eax 0.00 : 5bb3ad: 89 85 7c ff ff ff mov %eax,-0x84(%rbp) 0.00 : 5bb3b3: 41 3b 45 00 cmp 0x0(%r13),%eax 0.00 : 5bb3b7: 0f 84 3d fe ff ff je 5bb1fa : elog(ERROR, "prefetch and main iterators are out of sync"); 0.00 : 5bb3bd: ba b4 b8 88 00 mov $0x88b8b4,%edx 0.00 : 5bb3c2: be 98 00 00 00 mov $0x98,%esi 0.00 : 5bb3c7: bf 72 b8 88 00 mov $0x88b872,%edi 0.00 : 5bb3cc: e8 4f 00 1c 00 callq 77b420 0.00 : 5bb3d1: be 88 b8 88 00 mov $0x88b888,%esi 0.00 : 5bb3d6: bf 14 00 00 00 mov $0x14,%edi 0.00 : 5bb3db: 31 c0 xor %eax,%eax 0.00 : 5bb3dd: e8 4e fe 1b 00 callq 77b230 0.00 : 5bb3e2: e8 e9 e0 ea ff callq 4694d0 : } : : /* : * if we get here it means we are at the end of the scan.. : */ : return ExecClearTuple(slot); 0.00 : 5bb3e7: 48 8b bd 38 ff ff ff mov -0xc8(%rbp),%rdi 0.00 : 5bb3ee: e8 1d 8d ff ff callq 5b4110 0.00 : 5bb3f3: 48 89 85 38 ff ff ff mov %rax,-0xc8(%rbp) : } 0.00 : 5bb3fa: 48 8b 85 38 ff ff ff mov -0xc8(%rbp),%rax /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:306 5.26 : 5bb401: 48 81 c4 d8 00 00 00 add $0xd8,%rsp 0.00 : 5bb408: 5b pop %rbx 0.00 : 5bb409: 41 5c pop %r12 0.00 : 5bb40b: 41 5d pop %r13 0.00 : 5bb40d: 41 5e pop %r14 0.00 : 5bb40f: 41 5f pop %r15 0.00 : 5bb411: c9 leaveq 0.00 : 5bb412: c3 retq : * it doubles as later pages are fetched. : */ : if (node->prefetch_target >= target_prefetch_pages) : /* don't increase any further */ ; : else if (node->prefetch_target >= target_prefetch_pages / 2) : node->prefetch_target = target_prefetch_pages; 0.00 : 5bb413: 89 93 cc 00 00 00 mov %edx,0xcc(%rbx) 0.00 : 5bb419: e9 05 fc ff ff jmpq 5bb023 : { : /* : * Bitmap is lossy, so we must examine each item pointer on the page. : * But we can ignore HOT chains, since we'll check each tuple anyway. : */ : Page dp = (Page) BufferGetPage(buffer); 0.00 : 5bb41e: 8b 95 78 ff ff ff mov -0x88(%rbp),%edx 0.00 : 5bb424: 85 d2 test %edx,%edx 0.00 : 5bb426: 0f 88 9e 01 00 00 js 5bb5ca 0.00 : 5bb42c: 8b 85 78 ff ff ff mov -0x88(%rbp),%eax 0.00 : 5bb432: 83 e8 01 sub $0x1,%eax 0.00 : 5bb435: 4c 63 c8 movslq %eax,%r9 0.00 : 5bb438: 49 c1 e1 0d shl $0xd,%r9 0.00 : 5bb43c: 4c 03 0d b5 46 60 00 add 0x6046b5(%rip),%r9 # bbfaf8 : OffsetNumber maxoff = PageGetMaxOffsetNumber(dp); 0.00 : 5bb443: 41 0f b7 41 0c movzwl 0xc(%r9),%eax 0.00 : 5bb448: 66 83 f8 18 cmp $0x18,%ax 0.00 : 5bb44c: 77 2b ja 5bb479 : OffsetNumber offnum; : : for (offnum = FirstOffsetNumber; offnum <= maxoff; offnum = OffsetNumberNext(offnum)) 0.00 : 5bb44e: c7 85 54 ff ff ff 00 movl $0x0,-0xac(%rbp) 0.00 : 5bb455: 00 00 00 0.00 : 5bb458: e9 c6 fe ff ff jmpq 5bb323 : bitgetpage(scan, tbmres); : : if (tbmres->ntuples >= 0) : node->exact_pages++; : else : node->lossy_pages++; 0.00 : 5bb45d: 48 83 83 b8 00 00 00 addq $0x1,0xb8(%rbx) 0.00 : 5bb464: 01 0.00 : 5bb465: e9 e5 fe ff ff jmpq 5bb34f : { : /* Do not let the prefetch iterator get behind the main one */ : TBMIterateResult *tbmpre = tbm_iterate(prefetch_iterator); : : if (tbmpre == NULL || tbmpre->blockno != tbmres->blockno) : elog(ERROR, "prefetch and main iterators are out of sync"); 0.00 : 5bb46a: 41 8b 4d 00 mov 0x0(%r13),%ecx 0.00 : 5bb46e: 89 8d 7c ff ff ff mov %ecx,-0x84(%rbp) 0.00 : 5bb474: e9 81 fd ff ff jmpq 5bb1fa : /* : * Bitmap is lossy, so we must examine each item pointer on the page. : * But we can ignore HOT chains, since we'll check each tuple anyway. : */ : Page dp = (Page) BufferGetPage(buffer); : OffsetNumber maxoff = PageGetMaxOffsetNumber(dp); 0.00 : 5bb479: 0f b7 c0 movzwl %ax,%eax 0.00 : 5bb47c: 48 83 e8 18 sub $0x18,%rax 0.00 : 5bb480: 48 c1 e8 02 shr $0x2,%rax : OffsetNumber offnum; : : for (offnum = FirstOffsetNumber; offnum <= maxoff; offnum = OffsetNumberNext(offnum)) 0.00 : 5bb484: 66 85 c0 test %ax,%ax : /* : * Bitmap is lossy, so we must examine each item pointer on the page. : * But we can ignore HOT chains, since we'll check each tuple anyway. : */ : Page dp = (Page) BufferGetPage(buffer); : OffsetNumber maxoff = PageGetMaxOffsetNumber(dp); 0.00 : 5bb487: 66 89 85 40 ff ff ff mov %ax,-0xc0(%rbp) : OffsetNumber offnum; : : for (offnum = FirstOffsetNumber; offnum <= maxoff; offnum = OffsetNumberNext(offnum)) 0.00 : 5bb48e: 74 be je 5bb44e : if (!ItemIdIsNormal(lp)) : continue; : loctup.t_data = (HeapTupleHeader) PageGetItem((Page) dp, lp); : loctup.t_len = ItemIdGetLength(lp); : loctup.t_tableOid = scan->rs_rd->rd_id; : ItemPointerSet(&loctup.t_self, page, offnum); 0.00 : 5bb490: 8b 85 7c ff ff ff mov -0x84(%rbp),%eax 0.00 : 5bb496: 41 be 01 00 00 00 mov $0x1,%r14d 0.00 : 5bb49c: c7 85 54 ff ff ff 00 movl $0x0,-0xac(%rbp) 0.00 : 5bb4a3: 00 00 00 0.00 : 5bb4a6: c1 e8 10 shr $0x10,%eax 0.00 : 5bb4a9: 66 89 85 60 ff ff ff mov %ax,-0xa0(%rbp) 0.00 : 5bb4b0: eb 18 jmp 5bb4ca 0.00 : 5bb4b2: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : if (valid) : { : scan->rs_vistuples[ntup++] = offnum; : PredicateLockTuple(scan->rs_rd, &loctup, snapshot); : } : CheckForSerializableConflictOut(valid, scan->rs_rd, &loctup, /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:401 1.75 : 5bb4b8: 41 83 c6 01 add $0x1,%r14d : */ : Page dp = (Page) BufferGetPage(buffer); : OffsetNumber maxoff = PageGetMaxOffsetNumber(dp); : OffsetNumber offnum; : : for (offnum = FirstOffsetNumber; offnum <= maxoff; offnum = OffsetNumberNext(offnum)) 0.00 : 5bb4bc: 66 44 3b b5 40 ff ff cmp -0xc0(%rbp),%r14w 0.00 : 5bb4c3: ff 0.00 : 5bb4c4: 0f 87 59 fe ff ff ja 5bb323 : { : ItemId lp; : HeapTupleData loctup; : bool valid; : : lp = PageGetItemId(dp, offnum); 0.00 : 5bb4ca: 41 0f b7 c6 movzwl %r14w,%eax : if (!ItemIdIsNormal(lp)) 0.00 : 5bb4ce: 48 8d 50 03 lea 0x3(%rax),%rdx 0.00 : 5bb4d2: 41 8b 44 91 08 mov 0x8(%r9,%rdx,4),%eax 0.00 : 5bb4d7: 25 00 80 01 00 and $0x18000,%eax 0.00 : 5bb4dc: 3d 00 80 00 00 cmp $0x8000,%eax 0.00 : 5bb4e1: 75 d5 jne 5bb4b8 : continue; : loctup.t_data = (HeapTupleHeader) PageGetItem((Page) dp, lp); 0.00 : 5bb4e3: 41 0f b7 44 91 08 movzwl 0x8(%r9,%rdx,4),%eax : loctup.t_len = ItemIdGetLength(lp); : loctup.t_tableOid = scan->rs_rd->rd_id; : ItemPointerSet(&loctup.t_self, page, offnum); 0.00 : 5bb4e9: 0f b7 8d 7c ff ff ff movzwl -0x84(%rbp),%ecx : valid = HeapTupleSatisfiesVisibility(&loctup, snapshot, buffer); 0.00 : 5bb4f0: 48 8d 7d a0 lea -0x60(%rbp),%rdi 0.00 : 5bb4f4: 48 8b b5 58 ff ff ff mov -0xa8(%rbp),%rsi : bool valid; : : lp = PageGetItemId(dp, offnum); : if (!ItemIdIsNormal(lp)) : continue; : loctup.t_data = (HeapTupleHeader) PageGetItem((Page) dp, lp); 0.00 : 5bb4fb: 25 ff 7f 00 00 and $0x7fff,%eax 0.00 : 5bb500: 49 8d 04 01 lea (%r9,%rax,1),%rax 0.00 : 5bb504: 48 89 45 b0 mov %rax,-0x50(%rbp) : loctup.t_len = ItemIdGetLength(lp); 0.00 : 5bb508: 41 0f b7 44 91 0a movzwl 0xa(%r9,%rdx,4),%eax : loctup.t_tableOid = scan->rs_rd->rd_id; : ItemPointerSet(&loctup.t_self, page, offnum); 0.00 : 5bb50e: 0f b7 95 60 ff ff ff movzwl -0xa0(%rbp),%edx : : lp = PageGetItemId(dp, offnum); : if (!ItemIdIsNormal(lp)) : continue; : loctup.t_data = (HeapTupleHeader) PageGetItem((Page) dp, lp); : loctup.t_len = ItemIdGetLength(lp); 0.00 : 5bb515: 66 d1 e8 shr %ax 0.00 : 5bb518: 0f b7 c0 movzwl %ax,%eax 0.00 : 5bb51b: 89 45 a0 mov %eax,-0x60(%rbp) : loctup.t_tableOid = scan->rs_rd->rd_id; 0.00 : 5bb51e: 49 8b 04 24 mov (%r12),%rax /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:393 1.75 : 5bb522: 8b 40 40 mov 0x40(%rax),%eax : ItemPointerSet(&loctup.t_self, page, offnum); 0.00 : 5bb525: 66 89 55 a4 mov %dx,-0x5c(%rbp) : valid = HeapTupleSatisfiesVisibility(&loctup, snapshot, buffer); 0.00 : 5bb529: 4c 89 8d 10 ff ff ff mov %r9,-0xf0(%rbp) : if (!ItemIdIsNormal(lp)) : continue; : loctup.t_data = (HeapTupleHeader) PageGetItem((Page) dp, lp); : loctup.t_len = ItemIdGetLength(lp); : loctup.t_tableOid = scan->rs_rd->rd_id; : ItemPointerSet(&loctup.t_self, page, offnum); 0.00 : 5bb530: 66 89 4d a6 mov %cx,-0x5a(%rbp) /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:394 1.75 : 5bb534: 66 44 89 75 a8 mov %r14w,-0x58(%rbp) : valid = HeapTupleSatisfiesVisibility(&loctup, snapshot, buffer); 0.00 : 5bb539: 8b 95 78 ff ff ff mov -0x88(%rbp),%edx : lp = PageGetItemId(dp, offnum); : if (!ItemIdIsNormal(lp)) : continue; : loctup.t_data = (HeapTupleHeader) PageGetItem((Page) dp, lp); : loctup.t_len = ItemIdGetLength(lp); : loctup.t_tableOid = scan->rs_rd->rd_id; /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:393 1.75 : 5bb53f: 89 45 ac mov %eax,-0x54(%rbp) : ItemPointerSet(&loctup.t_self, page, offnum); : valid = HeapTupleSatisfiesVisibility(&loctup, snapshot, buffer); 0.00 : 5bb542: ff 16 callq *(%rsi) : if (valid) 0.00 : 5bb544: 84 c0 test %al,%al : continue; : loctup.t_data = (HeapTupleHeader) PageGetItem((Page) dp, lp); : loctup.t_len = ItemIdGetLength(lp); : loctup.t_tableOid = scan->rs_rd->rd_id; : ItemPointerSet(&loctup.t_self, page, offnum); : valid = HeapTupleSatisfiesVisibility(&loctup, snapshot, buffer); 0.00 : 5bb546: 41 89 c0 mov %eax,%r8d : if (valid) 0.00 : 5bb549: 4c 8b 8d 10 ff ff ff mov -0xf0(%rbp),%r9 0.00 : 5bb550: 75 31 jne 5bb583 : { : scan->rs_vistuples[ntup++] = offnum; : PredicateLockTuple(scan->rs_rd, &loctup, snapshot); : } : CheckForSerializableConflictOut(valid, scan->rs_rd, &loctup, 0.00 : 5bb552: 41 0f be f8 movsbl %r8b,%edi 0.00 : 5bb556: 49 8b 34 24 mov (%r12),%rsi 0.00 : 5bb55a: 4c 8b 85 58 ff ff ff mov -0xa8(%rbp),%r8 0.00 : 5bb561: 8b 8d 78 ff ff ff mov -0x88(%rbp),%ecx /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:401 5.26 : 5bb567: 48 8d 55 a0 lea -0x60(%rbp),%rdx 0.00 : 5bb56b: 4c 89 8d 10 ff ff ff mov %r9,-0xf0(%rbp) 0.00 : 5bb572: e8 e9 90 0d 00 callq 694660 0.00 : 5bb577: 4c 8b 8d 10 ff ff ff mov -0xf0(%rbp),%r9 0.00 : 5bb57e: e9 35 ff ff ff jmpq 5bb4b8 : loctup.t_tableOid = scan->rs_rd->rd_id; : ItemPointerSet(&loctup.t_self, page, offnum); : valid = HeapTupleSatisfiesVisibility(&loctup, snapshot, buffer); : if (valid) : { : scan->rs_vistuples[ntup++] = offnum; 0.00 : 5bb583: 48 63 85 54 ff ff ff movslq -0xac(%rbp),%rax : PredicateLockTuple(scan->rs_rd, &loctup, snapshot); /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:399 3.51 : 5bb58a: 48 8d 75 a0 lea -0x60(%rbp),%rsi : loctup.t_tableOid = scan->rs_rd->rd_id; : ItemPointerSet(&loctup.t_self, page, offnum); : valid = HeapTupleSatisfiesVisibility(&loctup, snapshot, buffer); : if (valid) : { : scan->rs_vistuples[ntup++] = offnum; 0.00 : 5bb58e: 66 45 89 74 44 7c mov %r14w,0x7c(%r12,%rax,2) /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:398 3.51 : 5bb594: 83 85 54 ff ff ff 01 addl $0x1,-0xac(%rbp) : PredicateLockTuple(scan->rs_rd, &loctup, snapshot); 0.00 : 5bb59b: 49 8b 3c 24 mov (%r12),%rdi 0.00 : 5bb59f: 48 8b 95 58 ff ff ff mov -0xa8(%rbp),%rdx 0.00 : 5bb5a6: 44 88 85 18 ff ff ff mov %r8b,-0xe8(%rbp) 0.00 : 5bb5ad: 4c 89 8d 10 ff ff ff mov %r9,-0xf0(%rbp) 0.00 : 5bb5b4: e8 e7 95 0d 00 callq 694ba0 0.00 : 5bb5b9: 4c 8b 8d 10 ff ff ff mov -0xf0(%rbp),%r9 0.00 : 5bb5c0: 44 0f b6 85 18 ff ff movzbl -0xe8(%rbp),%r8d 0.00 : 5bb5c7: ff 0.00 : 5bb5c8: eb 88 jmp 5bb552 : { : /* : * Bitmap is lossy, so we must examine each item pointer on the page. : * But we can ignore HOT chains, since we'll check each tuple anyway. : */ : Page dp = (Page) BufferGetPage(buffer); 0.00 : 5bb5ca: 8b 85 78 ff ff ff mov -0x88(%rbp),%eax 0.00 : 5bb5d0: 48 8b 15 41 1b 5c 00 mov 0x5c1b41(%rip),%rdx # b7d118 0.00 : 5bb5d7: f7 d0 not %eax 0.00 : 5bb5d9: 48 98 cltq 0.00 : 5bb5db: 4c 8b 0c c2 mov (%rdx,%rax,8),%r9 0.00 : 5bb5df: e9 5f fe ff ff jmpq 5bb443 : else if (node->prefetch_target >= target_prefetch_pages / 2) : node->prefetch_target = target_prefetch_pages; : else if (node->prefetch_target > 0) : node->prefetch_target *= 2; : else : node->prefetch_target++; 0.00 : 5bb5e4: 8d 41 01 lea 0x1(%rcx),%eax 0.00 : 5bb5e7: 89 83 cc 00 00 00 mov %eax,0xcc(%rbx) 0.00 : 5bb5ed: e9 31 fa ff ff jmpq 5bb023 : * a lot of prefetching in a scan that stops after a few tuples because of : * a LIMIT. : */ : if (tbm == NULL) : { : tbm = (TIDBitmap *) MultiExecProcNode(outerPlanState(node)); 0.00 : 5bb5f2: 48 8b 7f 30 mov 0x30(%rdi),%rdi 0.00 : 5bb5f6: e8 d5 0d ff ff callq 5ac3d0 : : if (!tbm || !IsA(tbm, TIDBitmap)) 0.00 : 5bb5fb: 48 85 c0 test %rax,%rax : * a lot of prefetching in a scan that stops after a few tuples because of : * a LIMIT. : */ : if (tbm == NULL) : { : tbm = (TIDBitmap *) MultiExecProcNode(outerPlanState(node)); 0.00 : 5bb5fe: 49 89 c5 mov %rax,%r13 : : if (!tbm || !IsA(tbm, TIDBitmap)) 0.00 : 5bb601: 74 08 je 5bb60b 0.00 : 5bb603: 81 38 ba 03 00 00 cmpl $0x3ba,(%rax) 0.00 : 5bb609: 74 2a je 5bb635 : elog(ERROR, "unrecognized result from subplan"); 0.00 : 5bb60b: ba b4 b8 88 00 mov $0x88b8b4,%edx 0.00 : 5bb610: be 6b 00 00 00 mov $0x6b,%esi 0.00 : 5bb615: bf 72 b8 88 00 mov $0x88b872,%edi 0.00 : 5bb61a: e8 01 fe 1b 00 callq 77b420 0.00 : 5bb61f: be c0 b7 88 00 mov $0x88b7c0,%esi 0.00 : 5bb624: bf 14 00 00 00 mov $0x14,%edi 0.00 : 5bb629: 31 c0 xor %eax,%eax 0.00 : 5bb62b: e8 00 fc 1b 00 callq 77b230 0.00 : 5bb630: e8 9b de ea ff callq 4694d0 : : node->tbm = tbm; 0.00 : 5bb635: 48 89 83 98 00 00 00 mov %rax,0x98(%rbx) : node->tbmiterator = tbmiterator = tbm_begin_iterate(tbm); 0.00 : 5bb63c: 48 89 c7 mov %rax,%rdi 0.00 : 5bb63f: e8 dc 7e 02 00 callq 5e3520 : node->tbmres = tbmres = NULL; 0.00 : 5bb644: 48 c7 83 a8 00 00 00 movq $0x0,0xa8(%rbx) 0.00 : 5bb64b: 00 00 00 00 : : if (!tbm || !IsA(tbm, TIDBitmap)) : elog(ERROR, "unrecognized result from subplan"); : : node->tbm = tbm; : node->tbmiterator = tbmiterator = tbm_begin_iterate(tbm); 0.00 : 5bb64f: 48 89 83 a0 00 00 00 mov %rax,0xa0(%rbx) : node->tbmres = tbmres = NULL; : : #ifdef USE_PREFETCH : if (target_prefetch_pages > 0) 0.00 : 5bb656: 31 d2 xor %edx,%edx 0.00 : 5bb658: 8b 0d 06 1a 5c 00 mov 0x5c1a06(%rip),%ecx # b7d064 : : if (!tbm || !IsA(tbm, TIDBitmap)) : elog(ERROR, "unrecognized result from subplan"); : : node->tbm = tbm; : node->tbmiterator = tbmiterator = tbm_begin_iterate(tbm); 0.00 : 5bb65e: 48 89 85 30 ff ff ff mov %rax,-0xd0(%rbp) : node->tbmres = tbmres = NULL; : : #ifdef USE_PREFETCH : if (target_prefetch_pages > 0) 0.00 : 5bb665: 85 c9 test %ecx,%ecx 0.00 : 5bb667: 0f 8e 74 f9 ff ff jle 5bafe1 : { : node->prefetch_iterator = prefetch_iterator = tbm_begin_iterate(tbm); 0.00 : 5bb66d: 4c 89 ef mov %r13,%rdi 0.00 : 5bb670: e8 ab 7e 02 00 callq 5e3520 : node->prefetch_pages = 0; 0.00 : 5bb675: c7 83 c8 00 00 00 00 movl $0x0,0xc8(%rbx) 0.00 : 5bb67c: 00 00 00 : node->tbmres = tbmres = NULL; : : #ifdef USE_PREFETCH : if (target_prefetch_pages > 0) : { : node->prefetch_iterator = prefetch_iterator = tbm_begin_iterate(tbm); 0.00 : 5bb67f: 49 89 c7 mov %rax,%r15 0.00 : 5bb682: 48 89 83 c0 00 00 00 mov %rax,0xc0(%rbx) : node->prefetch_pages = 0; : node->prefetch_target = -1; 0.00 : 5bb689: c7 83 cc 00 00 00 ff movl $0xffffffff,0xcc(%rbx) 0.00 : 5bb690: ff ff ff 0.00 : 5bb693: 31 d2 xor %edx,%edx 0.00 : 5bb695: e9 47 f9 ff ff jmpq 5bafe1 Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 12.12 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:993 9.09 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:977 9.09 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:971 9.09 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:976 9.09 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:977 6.06 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:888 6.06 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:508 3.03 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:856 3.03 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:859 3.03 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:856 3.03 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:887 3.03 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:504 3.03 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:508 3.03 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:540 3.03 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:940 3.03 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:944 3.03 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:973 3.03 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:973 3.03 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:973 3.03 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:1005 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000782f20 : : * degrading performance; or CHashAllocate may enter a tight loop until such : * time as an element is deleted). : */ : bool : CHashInsert(CHashTable table, void *entry) : { 0.00 : 782f20: 55 push %rbp 0.00 : 782f21: 48 89 e5 mov %rsp,%rbp 0.00 : 782f24: 41 57 push %r15 0.00 : 782f26: 41 56 push %r14 0.00 : 782f28: 41 55 push %r13 0.00 : 782f2a: 41 54 push %r12 0.00 : 782f2c: 49 89 fc mov %rdi,%r12 0.00 : 782f2f: 53 push %rbx 0.00 : 782f30: 48 83 ec 38 sub $0x38,%rsp 0.00 : 782f34: 48 89 75 a0 mov %rsi,-0x60(%rbp) : uint32 hashcode = hash_any(entry, table->desc.key_size); 0.00 : 782f38: 0f b7 77 0e movzwl 0xe(%rdi),%esi 0.00 : 782f3c: 48 8b 7d a0 mov -0x60(%rbp),%rdi 0.00 : 782f40: e8 0b d4 d0 ff callq 490350 0.00 : 782f45: 89 45 a8 mov %eax,-0x58(%rbp) : uint32 bucket = hashcode & table->bucket_mask; 0.00 : 782f48: 41 23 44 24 10 and 0x10(%r12),%eax : { : uint32 f_current; : CHashPtr new; : : /* Pick a starting freelist base on our backend ID. */ : f_current = ((uint32) MyBackendId) % CHashTableNFreeLists(table); /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:856 3.03 : 782f4d: 8b 35 b5 5b 3e 00 mov 0x3e5bb5(%rip),%esi # b68b08 0.00 : 782f53: 41 0f b7 7c 24 16 movzwl 0x16(%r12),%edi : */ : bool : CHashInsert(CHashTable table, void *entry) : { : uint32 hashcode = hash_any(entry, table->desc.key_size); : uint32 bucket = hashcode & table->bucket_mask; 0.00 : 782f59: 89 45 ac mov %eax,-0x54(%rbp) : CHashPtr *b = &table->bucket[bucket]; 0.00 : 782f5c: 89 c0 mov %eax,%eax 0.00 : 782f5e: 4c 8d 3c 85 00 00 00 lea 0x0(,%rax,4),%r15 0.00 : 782f65: 00 : : /* Pick a starting freelist base on our backend ID. */ : f_current = ((uint32) MyBackendId) % CHashTableNFreeLists(table); : : /* If this process hasn't initialized gc_next yet, do that now. */ : if (table->gc_pid != MyProcPid) 0.00 : 782f66: 8b 05 78 cd 43 00 mov 0x43cd78(%rip),%eax # bbfce4 : bool : CHashInsert(CHashTable table, void *entry) : { : uint32 hashcode = hash_any(entry, table->desc.key_size); : uint32 bucket = hashcode & table->bucket_mask; : CHashPtr *b = &table->bucket[bucket]; 0.00 : 782f6c: 4d 03 7c 24 20 add 0x20(%r12),%r15 : : /* Pick a starting freelist base on our backend ID. */ : f_current = ((uint32) MyBackendId) % CHashTableNFreeLists(table); : : /* If this process hasn't initialized gc_next yet, do that now. */ : if (table->gc_pid != MyProcPid) /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:859 3.03 : 782f71: 41 39 44 24 38 cmp %eax,0x38(%r12) 0.00 : 782f76: 74 26 je 782f9e : { : table->gc_pid = MyProcPid; : table->gc_next = ((uint32) MyProcPid) % CHashTableNGarbage(table); 0.00 : 782f78: 41 0f b6 4c 24 14 movzbl 0x14(%r12),%ecx 0.00 : 782f7e: 41 8b 54 24 10 mov 0x10(%r12),%edx : f_current = ((uint32) MyBackendId) % CHashTableNFreeLists(table); : : /* If this process hasn't initialized gc_next yet, do that now. */ : if (table->gc_pid != MyProcPid) : { : table->gc_pid = MyProcPid; 0.00 : 782f83: 41 89 44 24 38 mov %eax,0x38(%r12) : table->gc_next = ((uint32) MyProcPid) % CHashTableNGarbage(table); 0.00 : 782f88: 8b 05 56 cd 43 00 mov 0x43cd56(%rip),%eax # bbfce4 0.00 : 782f8e: 83 c2 01 add $0x1,%edx 0.00 : 782f91: d3 ea shr %cl,%edx 0.00 : 782f93: 89 d1 mov %edx,%ecx 0.00 : 782f95: 31 d2 xor %edx,%edx 0.00 : 782f97: f7 f1 div %ecx 0.00 : 782f99: 41 89 54 24 3c mov %edx,0x3c(%r12) : { : uint32 f_current; : CHashPtr new; : : /* Pick a starting freelist base on our backend ID. */ : f_current = ((uint32) MyBackendId) % CHashTableNFreeLists(table); 0.00 : 782f9e: 0f b7 cf movzwl %di,%ecx 0.00 : 782fa1: 89 f0 mov %esi,%eax 0.00 : 782fa3: 31 d2 xor %edx,%edx 0.00 : 782fa5: f7 f1 div %ecx /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:856 3.03 : 782fa7: 41 0f b6 4c 24 15 movzbl 0x15(%r12),%ecx 0.00 : 782fad: 49 8b 74 24 28 mov 0x28(%r12),%rsi : /* If list is empty, fail. */ : if (CHashPtrIsInvalid(garbage)) : return InvalidCHashPtr; : : /* If we're unable to empty the list via compare-and-swap, fail. */ : if (!__sync_bool_compare_and_swap(b, garbage, InvalidCHashPtr)) 0.00 : 782fb2: 41 bb fe ff ff ff mov $0xfffffffe,%r11d : * If we attempt to pop the free-list and fail, we retry immediately : * with the same free-list. This reduces the frequency with which : * we're obliged to update our hazard pointers, which is a material : * savings due to the associated memory barrier. : */ : b = CHashTableGetFreeList(table, f_current); 0.00 : 782fb8: 44 8d 42 01 lea 0x1(%rdx),%r8d 0.00 : 782fbc: 44 89 c0 mov %r8d,%eax 0.00 : 782fbf: d3 e0 shl %cl,%eax 0.00 : 782fc1: 01 d0 add %edx,%eax 0.00 : 782fc3: 48 8d 0c 86 lea (%rsi,%rax,4),%rcx : MyProc->hazard[0] = b; 0.00 : 782fc7: 48 8b 05 7a a9 3f 00 mov 0x3fa97a(%rip),%rax # b7d948 0.00 : 782fce: 48 89 88 e8 02 00 00 mov %rcx,0x2e8(%rax) : pg_memory_barrier(); /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:887 3.03 : 782fd5: f0 83 04 24 00 lock addl $0x0,(%rsp) : new = *b; /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:888 6.06 : 782fda: 8b 19 mov (%rcx),%ebx : while (!CHashPtrIsInvalid(new)) 0.00 : 782fdc: 83 fb fd cmp $0xfffffffd,%ebx 0.00 : 782fdf: 76 23 jbe 783004 0.00 : 782fe1: e9 52 01 00 00 jmpq 783138 0.00 : 782fe6: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 0.00 : 782fed: 00 00 00 : * barrier here. : */ : pg_read_barrier_depends(); : if (__sync_bool_compare_and_swap(b, new, n->un.gcnext)) : return new; : CHashTableIncrementStatistic(table, CHS_Allocate_Fail); 0.00 : 782ff0: 49 83 84 24 a0 00 00 addq $0x1,0xa0(%r12) 0.00 : 782ff7: 00 01 : new = *b; 0.00 : 782ff9: 8b 19 mov (%rcx),%ebx : */ : b = CHashTableGetFreeList(table, f_current); : MyProc->hazard[0] = b; : pg_memory_barrier(); : new = *b; : while (!CHashPtrIsInvalid(new)) 0.00 : 782ffb: 83 fb fd cmp $0xfffffffd,%ebx 0.00 : 782ffe: 0f 87 34 01 00 00 ja 783138 : { : CHashNode *n = CHashTableGetNode(table, new); 0.00 : 783004: 89 de mov %ebx,%esi : * n is computed from table->freelist[f_current], which could : * be modified by concurrent activity, so we need a dependency : * barrier here. : */ : pg_read_barrier_depends(); : if (__sync_bool_compare_and_swap(b, new, n->un.gcnext)) 0.00 : 783006: 49 8b 44 24 30 mov 0x30(%r12),%rax : MyProc->hazard[0] = b; : pg_memory_barrier(); : new = *b; : while (!CHashPtrIsInvalid(new)) : { : CHashNode *n = CHashTableGetNode(table, new); 0.00 : 78300b: d1 ee shr %esi : * n is computed from table->freelist[f_current], which could : * be modified by concurrent activity, so we need a dependency : * barrier here. : */ : pg_read_barrier_depends(); : if (__sync_bool_compare_and_swap(b, new, n->un.gcnext)) 0.00 : 78300d: 89 f2 mov %esi,%edx 0.00 : 78300f: 41 0f af 54 24 1c imul 0x1c(%r12),%edx 0.00 : 783015: 8b 54 10 04 mov 0x4(%rax,%rdx,1),%edx 0.00 : 783019: 89 d8 mov %ebx,%eax 0.00 : 78301b: f0 0f b1 11 lock cmpxchg %edx,(%rcx) 0.00 : 78301f: 75 cf jne 782ff0 : * Allocate and initialize a new entry, on the assumption that the insert : * will succeed. If it ends up failing, we must be sure to put this back : * on some free list, lest it be permanently leaked. : */ : new = CHashAllocate(table); : nnew = CHashTableGetNode(table, new); 0.00 : 783021: 41 89 f5 mov %esi,%r13d : nnew->un.hashcode = hashcode; 0.00 : 783024: 8b 4d a8 mov -0x58(%rbp),%ecx : * Allocate and initialize a new entry, on the assumption that the insert : * will succeed. If it ends up failing, we must be sure to put this back : * on some free list, lest it be permanently leaked. : */ : new = CHashAllocate(table); : nnew = CHashTableGetNode(table, new); 0.00 : 783027: 45 0f af 6c 24 1c imul 0x1c(%r12),%r13d 0.00 : 78302d: 4d 03 6c 24 30 add 0x30(%r12),%r13 : nnew->un.hashcode = hashcode; 0.00 : 783032: 41 89 4d 04 mov %ecx,0x4(%r13) : memcpy(CHashNodeGetItem(nnew), entry, table->desc.element_size); 0.00 : 783036: 41 0f b7 54 24 0c movzwl 0xc(%r12),%edx 0.00 : 78303c: 49 8d 7d 08 lea 0x8(%r13),%rdi 0.00 : 783040: 48 8b 75 a0 mov -0x60(%rbp),%rsi /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:504 3.03 : 783044: e8 a7 6b ce ff callq 469bf0 : : /* Prevent garbage collection for this bucket. */ : MyProc->hazard[0] = CHashTableGetGarbageByBucket(table, bucket); 0.00 : 783049: 41 0f b6 4c 24 14 movzbl 0x14(%r12),%ecx 0.00 : 78304f: 8b 55 ac mov -0x54(%rbp),%edx 0.00 : 783052: d3 ea shr %cl,%edx 0.00 : 783054: 41 0f b6 4c 24 15 movzbl 0x15(%r12),%ecx 0.00 : 78305a: 89 d0 mov %edx,%eax 0.00 : 78305c: d3 e8 shr %cl,%eax 0.00 : 78305e: 01 d0 add %edx,%eax 0.00 : 783060: 48 8b 15 e1 a8 3f 00 mov 0x3fa8e1(%rip),%rdx # b7d948 0.00 : 783067: 48 c1 e0 02 shl $0x2,%rax 0.00 : 78306b: 49 03 44 24 28 add 0x28(%r12),%rax 0.00 : 783070: 48 89 82 e8 02 00 00 mov %rax,0x2e8(%rdx) : pg_memory_barrier(); /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:508 3.03 : 783077: f0 83 04 24 00 lock addl $0x0,(%rsp) /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:508 6.06 : 78307c: 4c 8d 75 b0 lea -0x50(%rbp),%r14 0.00 : 783080: eb 20 jmp 7830a2 0.00 : 783082: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : * where N is the number of buckets and M is the number of elements : * in the table. Even for a quite modestly size table this is likely : * to exceed the number of CPU cores. : */ : Assert(!CHashPtrIsMarked(scan.target)); : nnew->next = scan.target; 0.00 : 783088: 8b 45 b0 mov -0x50(%rbp),%eax 0.00 : 78308b: 41 89 45 00 mov %eax,0x0(%r13) : if (!__sync_bool_compare_and_swap(scan.pointer_to_target, 0.00 : 78308f: 48 8b 55 b8 mov -0x48(%rbp),%rdx 0.00 : 783093: 8b 45 b0 mov -0x50(%rbp),%eax 0.00 : 783096: f0 0f b1 1a lock cmpxchg %ebx,(%rdx) /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:540 3.03 : 78309a: 74 49 je 7830e5 : scan.target, new)) : { : CHashTableIncrementStatistic(table, CHS_Insert_Retry); 0.00 : 78309c: 49 83 44 24 60 01 addq $0x1,0x60(%r12) : * Scan the bucket. If we don't find a match, use compare-and-swap to : * insert the new node at the insert position. If we do find a match, : * return the data to the caller. : */ : retry: : CHashBucketScan(table, b, hashcode, entry, &scan); 0.00 : 7830a2: 48 8b 4d a0 mov -0x60(%rbp),%rcx 0.00 : 7830a6: 8b 55 a8 mov -0x58(%rbp),%edx 0.00 : 7830a9: 4d 89 f0 mov %r14,%r8 0.00 : 7830ac: 4c 89 fe mov %r15,%rsi 0.00 : 7830af: 4c 89 e7 mov %r12,%rdi 0.00 : 7830b2: e8 e9 fb ff ff callq 782ca0 : if (scan.found) 0.00 : 7830b7: 80 7d c8 00 cmpb $0x0,-0x38(%rbp) 0.00 : 7830bb: 74 cb je 783088 : memcpy(((char *) entry) + table->desc.key_size, 0.00 : 7830bd: 41 0f b7 44 24 0e movzwl 0xe(%r12),%eax 0.00 : 7830c3: 48 8b 7d a0 mov -0x60(%rbp),%rdi 0.00 : 7830c7: 41 0f b7 54 24 0c movzwl 0xc(%r12),%edx 0.00 : 7830cd: 0f b7 f0 movzwl %ax,%esi 0.00 : 7830d0: 48 01 f7 add %rsi,%rdi 0.00 : 7830d3: 48 83 c6 08 add $0x8,%rsi 0.00 : 7830d7: 48 03 75 c0 add -0x40(%rbp),%rsi 0.00 : 7830db: 29 c2 sub %eax,%edx 0.00 : 7830dd: 48 63 d2 movslq %edx,%rdx 0.00 : 7830e0: e8 0b 6b ce ff callq 469bf0 : } : } : : /* Allow garbage collection for this bucket. */ : Assert(MyProc->hazard[0] != NULL); : pg_memory_barrier(); 0.00 : 7830e5: f0 83 04 24 00 lock addl $0x0,(%rsp) : MyProc->hazard[0] = NULL; 0.00 : 7830ea: 48 8b 05 57 a8 3f 00 mov 0x3fa857(%rip),%rax # b7d948 0.00 : 7830f1: 48 c7 80 e8 02 00 00 movq $0x0,0x2e8(%rax) 0.00 : 7830f8: 00 00 00 00 : * guarantees that any allocation still in progress at the time this : * element makes it back to the freelist is trying to allocate some : * other node. : */ : CHashTableIncrementStatistic(table, CHS_Insert); : if (scan.found) 0.00 : 7830fc: 31 c0 xor %eax,%eax : * progress at the time we popped the freelist has completed. This : * guarantees that any allocation still in progress at the time this : * element makes it back to the freelist is trying to allocate some : * other node. : */ : CHashTableIncrementStatistic(table, CHS_Insert); 0.00 : 7830fe: 49 83 44 24 50 01 addq $0x1,0x50(%r12) : if (scan.found) 0.00 : 783104: 80 7d c8 00 cmpb $0x0,-0x38(%rbp) 0.00 : 783108: 74 17 je 783121 : { : CHashTableIncrementStatistic(table, CHS_Insert_Failed); 0.00 : 78310a: 49 83 44 24 58 01 addq $0x1,0x58(%r12) : CHashAddToGarbage(table, bucket, new); 0.00 : 783110: 8b 75 ac mov -0x54(%rbp),%esi 0.00 : 783113: 89 da mov %ebx,%edx 0.00 : 783115: 4c 89 e7 mov %r12,%rdi 0.00 : 783118: e8 33 fb ff ff callq 782c50 0.00 : 78311d: 0f b6 45 c8 movzbl -0x38(%rbp),%eax 0.00 : 783121: 84 c0 test %al,%al 0.00 : 783123: 0f 94 c0 sete %al : } : : /* The insert succeeded if and only if no duplicate was found. */ : return !scan.found; : } 0.00 : 783126: 48 83 c4 38 add $0x38,%rsp 0.00 : 78312a: 5b pop %rbx 0.00 : 78312b: 41 5c pop %r12 0.00 : 78312d: 41 5d pop %r13 0.00 : 78312f: 41 5e pop %r14 0.00 : 783131: 41 5f pop %r15 0.00 : 783133: c9 leaveq 0.00 : 783134: c3 retq 0.00 : 783135: 0f 1f 00 nopl (%rax) : CHashPtr new; : CHashNode *n; : uint32 i; : : /* Pick a target freelist based on our backend ID. */ : f_home = ((uint32) MyBackendId) % CHashTableNFreeLists(table); 0.00 : 783138: 41 0f b7 7c 24 16 movzwl 0x16(%r12),%edi 0.00 : 78313e: 8b 05 c4 59 3e 00 mov 0x3e59c4(%rip),%eax # b68b08 0.00 : 783144: 31 d2 xor %edx,%edx : fh = CHashTableGetFreeList(table, f_home); 0.00 : 783146: 41 0f b6 4c 24 15 movzbl 0x15(%r12),%ecx 0.00 : 78314c: 4d 8b 4c 24 28 mov 0x28(%r12),%r9 : CHashPtr new; : CHashNode *n; : uint32 i; : : /* Pick a target freelist based on our backend ID. */ : f_home = ((uint32) MyBackendId) % CHashTableNFreeLists(table); 0.00 : 783151: f7 f7 div %edi : fh = CHashTableGetFreeList(table, f_home); 0.00 : 783153: 8d 42 01 lea 0x1(%rdx),%eax 0.00 : 783156: d3 e0 shl %cl,%eax : : /* Select target garbage list. */ : table->gc_next = (table->gc_next + 1) % CHashTableNGarbage(table); 0.00 : 783158: 41 0f b6 4c 24 14 movzbl 0x14(%r12),%ecx : CHashNode *n; : uint32 i; : : /* Pick a target freelist based on our backend ID. */ : f_home = ((uint32) MyBackendId) % CHashTableNFreeLists(table); : fh = CHashTableGetFreeList(table, f_home); 0.00 : 78315e: 01 d0 add %edx,%eax 0.00 : 783160: 4c 8d 14 85 00 00 00 lea 0x0(,%rax,4),%r10 0.00 : 783167: 00 : : /* Select target garbage list. */ : table->gc_next = (table->gc_next + 1) % CHashTableNGarbage(table); 0.00 : 783168: 41 8b 44 24 3c mov 0x3c(%r12),%eax 0.00 : 78316d: 8d 50 01 lea 0x1(%rax),%edx 0.00 : 783170: 41 8b 44 24 10 mov 0x10(%r12),%eax 0.00 : 783175: 8d 70 01 lea 0x1(%rax),%esi 0.00 : 783178: 89 d0 mov %edx,%eax 0.00 : 78317a: 31 d2 xor %edx,%edx 0.00 : 78317c: d3 ee shr %cl,%esi : b = CHashTableGetGarbageList(table, table->gc_next); 0.00 : 78317e: 41 0f b6 4c 24 15 movzbl 0x15(%r12),%ecx : /* Pick a target freelist based on our backend ID. */ : f_home = ((uint32) MyBackendId) % CHashTableNFreeLists(table); : fh = CHashTableGetFreeList(table, f_home); : : /* Select target garbage list. */ : table->gc_next = (table->gc_next + 1) % CHashTableNGarbage(table); 0.00 : 783184: f7 f6 div %esi : b = CHashTableGetGarbageList(table, table->gc_next); 0.00 : 783186: 4c 89 ce mov %r9,%rsi 0.00 : 783189: 89 d0 mov %edx,%eax : /* Pick a target freelist based on our backend ID. */ : f_home = ((uint32) MyBackendId) % CHashTableNFreeLists(table); : fh = CHashTableGetFreeList(table, f_home); : : /* Select target garbage list. */ : table->gc_next = (table->gc_next + 1) % CHashTableNGarbage(table); 0.00 : 78318b: 41 89 54 24 3c mov %edx,0x3c(%r12) : b = CHashTableGetGarbageList(table, table->gc_next); 0.00 : 783190: d3 e8 shr %cl,%eax 0.00 : 783192: 01 d0 add %edx,%eax 0.00 : 783194: 49 8d 14 81 lea (%r9,%rax,4),%rdx : garbage = *b; 0.00 : 783198: 8b 1a mov (%rdx),%ebx : : /* If list is empty, fail. */ : if (CHashPtrIsInvalid(garbage)) /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:940 3.03 : 78319a: 83 fb fd cmp $0xfffffffd,%ebx 0.00 : 78319d: 76 11 jbe 7831b0 : new = CHashAllocateViaGC(table); : if (!CHashPtrIsInvalid(new)) : return new; : : /* Advance to next freelist. */ : f_current = (f_current + 1) % CHashTableNFreeLists(table); 0.00 : 78319f: 44 89 c0 mov %r8d,%eax 0.00 : 7831a2: 31 d2 xor %edx,%edx 0.00 : 7831a4: f7 f7 div %edi 0.00 : 7831a6: e9 0d fe ff ff jmpq 782fb8 0.00 : 7831ab: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : /* If list is empty, fail. */ : if (CHashPtrIsInvalid(garbage)) : return InvalidCHashPtr; : : /* If we're unable to empty the list via compare-and-swap, fail. */ : if (!__sync_bool_compare_and_swap(b, garbage, InvalidCHashPtr)) 0.00 : 7831b0: 89 d8 mov %ebx,%eax 0.00 : 7831b2: f0 44 0f b1 1a lock cmpxchg %r11d,(%rdx) /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:944 3.03 : 7831b7: 74 1c je 7831d5 : { : CHashTableIncrementStatistic(table, CHS_Garbage_Dequeue_Fail); 0.00 : 7831b9: 49 83 84 24 b0 00 00 addq $0x1,0xb0(%r12) 0.00 : 7831c0: 00 01 0.00 : 7831c2: 49 8b 74 24 28 mov 0x28(%r12),%rsi 0.00 : 7831c7: 41 0f b6 4c 24 15 movzbl 0x15(%r12),%ecx 0.00 : 7831cd: 41 0f b7 7c 24 16 movzwl 0x16(%r12),%edi 0.00 : 7831d3: eb ca jmp 78319f : * requeues the garbage if it's not immediately recycleable, but : * it's not clear that we need such a thing. On the flip side we : * might want to eventually enter a longer sleep here, or PANIC, : * but it's not clear exactly how to calibrate that. : */ : CHashTableIncrementStatistic(table, CHS_GC); 0.00 : 7831d5: 49 83 84 24 b8 00 00 addq $0x1,0xb8(%r12) 0.00 : 7831dc: 00 01 : CHashNode *n; : uint32 i; : : /* Pick a target freelist based on our backend ID. */ : f_home = ((uint32) MyBackendId) % CHashTableNFreeLists(table); : fh = CHashTableGetFreeList(table, f_home); 0.00 : 7831de: 4f 8d 04 11 lea (%r9,%r10,1),%r8 : * it's not clear that we need such a thing. On the flip side we : * might want to eventually enter a longer sleep here, or PANIC, : * but it's not clear exactly how to calibrate that. : */ : CHashTableIncrementStatistic(table, CHS_GC); : MyProc->hazard[0] = NULL; 0.00 : 7831e2: 48 8b 05 5f a7 3f 00 mov 0x3fa75f(%rip),%rax # b7d948 0.00 : 7831e9: 48 c7 80 e8 02 00 00 movq $0x0,0x2e8(%rax) 0.00 : 7831f0: 00 00 00 00 : for (i = 0; i < ProcGlobal->allProcCount; i++) 0.00 : 7831f4: 48 8b 35 5d a7 3f 00 mov 0x3fa75d(%rip),%rsi # b7d958 0.00 : 7831fb: 8b 46 10 mov 0x10(%rsi),%eax 0.00 : 7831fe: 85 c0 test %eax,%eax 0.00 : 783200: 74 5f je 783261 0.00 : 783202: 31 ff xor %edi,%edi 0.00 : 783204: eb 1a jmp 783220 0.00 : 783206: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 0.00 : 78320d: 00 00 00 : { : volatile PGPROC *proc = &ProcGlobal->allProcs[i]; : void *hazard; : : hazard = proc->hazard[0]; : if (hazard == b || hazard == fh) /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:977 9.09 : 783210: 49 39 c8 cmp %rcx,%r8 0.00 : 783213: 74 23 je 783238 : * might want to eventually enter a longer sleep here, or PANIC, : * but it's not clear exactly how to calibrate that. : */ : CHashTableIncrementStatistic(table, CHS_GC); : MyProc->hazard[0] = NULL; : for (i = 0; i < ProcGlobal->allProcCount; i++) 0.00 : 783215: 83 c7 01 add $0x1,%edi 0.00 : 783218: 3b 7e 10 cmp 0x10(%rsi),%edi 0.00 : 78321b: 73 44 jae 783261 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:971 9.09 : 78321d: 0f 1f 00 nopl (%rax) : { : volatile PGPROC *proc = &ProcGlobal->allProcs[i]; /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:973 3.03 : 783220: 89 f8 mov %edi,%eax 3.03 : 783222: 48 69 c0 f0 02 00 00 imul $0x2f0,%rax,%rax 3.03 : 783229: 48 03 06 add (%rsi),%rax : void *hazard; : : hazard = proc->hazard[0]; /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:976 9.09 : 78322c: 48 8b 88 e8 02 00 00 mov 0x2e8(%rax),%rcx : if (hazard == b || hazard == fh) /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:977 9.09 : 783233: 48 39 ca cmp %rcx,%rdx 0.00 : 783236: 75 d8 jne 783210 : { : CHashTableIncrementStatistic(table, CHS_GC_Spin); 0.00 : 783238: 49 83 84 24 c0 00 00 addq $0x1,0xc0(%r12) 0.00 : 78323f: 00 01 : do : { : hazard = proc->hazard[0]; 0.00 : 783241: 48 8b 88 e8 02 00 00 mov 0x2e8(%rax),%rcx : } while (hazard == b || hazard == fh); 0.00 : 783248: 48 39 ca cmp %rcx,%rdx 0.00 : 78324b: 74 f4 je 783241 0.00 : 78324d: 49 39 c8 cmp %rcx,%r8 0.00 : 783250: 74 ef je 783241 0.00 : 783252: 48 8b 35 ff a6 3f 00 mov 0x3fa6ff(%rip),%rsi # b7d958 : * might want to eventually enter a longer sleep here, or PANIC, : * but it's not clear exactly how to calibrate that. : */ : CHashTableIncrementStatistic(table, CHS_GC); : MyProc->hazard[0] = NULL; : for (i = 0; i < ProcGlobal->allProcCount; i++) 0.00 : 783259: 83 c7 01 add $0x1,%edi 0.00 : 78325c: 3b 7e 10 cmp 0x10(%rsi),%edi 0.00 : 78325f: 72 bf jb 783220 : } : } : : /* Remove one item from list to satisfy current allocation. */ : new = garbage; : n = CHashTableGetNode(table, new); 0.00 : 783261: 89 de mov %ebx,%esi : pg_read_barrier_depends(); : fhead = n->un.gcnext; 0.00 : 783263: 49 8b 44 24 30 mov 0x30(%r12),%rax : } : } : : /* Remove one item from list to satisfy current allocation. */ : new = garbage; : n = CHashTableGetNode(table, new); 0.00 : 783268: d1 ee shr %esi : pg_read_barrier_depends(); : fhead = n->un.gcnext; 0.00 : 78326a: 89 f2 mov %esi,%edx 0.00 : 78326c: 41 0f af 54 24 1c imul 0x1c(%r12),%edx 0.00 : 783272: 8b 54 10 04 mov 0x4(%rax,%rdx,1),%edx : : if (CHashPtrIsInvalid(fhead)) /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:993 12.12 : 783276: 83 fa fd cmp $0xfffffffd,%edx 0.00 : 783279: 76 13 jbe 78328e : * before we overwrite n->un.gcnext with a new hashcode. : * (This is only needed when we reclaim exactly one node, : * because in any other case we'll do a compare-and-swap : * before returning, which implies a full barrier.) : */ : pg_memory_barrier(); 0.00 : 78327b: f0 83 04 24 00 lock addl $0x0,(%rsp) : CHashTableIncrementStatistic(table, CHS_GC_Reclaim_Skipped); /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:1005 3.03 : 783280: 49 83 84 24 c8 00 00 addq $0x1,0xc8(%r12) 0.00 : 783287: 00 01 0.00 : 783289: e9 93 fd ff ff jmpq 783021 : } : else if (__sync_bool_compare_and_swap(fh, InvalidCHashPtr, fhead)) 0.00 : 78328e: b8 fe ff ff ff mov $0xfffffffe,%eax 0.00 : 783293: f0 41 0f b1 10 lock cmpxchg %edx,(%r8) 0.00 : 783298: 74 41 je 7832db : { : /* : * Our free list is empty, and we've succesfully pushed the : * reclaimed nodes onto it. So we're done. : */ : CHashTableIncrementStatistic(table, CHS_GC_Reclaim_Fast); 0.00 : 78329a: 4d 8b 4c 24 30 mov 0x30(%r12),%r9 0.00 : 78329f: 41 8b 7c 24 1c mov 0x1c(%r12),%edi 0.00 : 7832a4: 89 d0 mov %edx,%eax : : /* Walk list of reclaimed elements to end. */ : fcurrent = fhead; : for (;;) : { : n = CHashTableGetNode(table, fcurrent); 0.00 : 7832a6: d1 e8 shr %eax 0.00 : 7832a8: 0f af c7 imul %edi,%eax 0.00 : 7832ab: 49 8d 0c 01 lea (%r9,%rax,1),%rcx : fnext = n->un.gcnext; 0.00 : 7832af: 8b 41 04 mov 0x4(%rcx),%eax : if (CHashPtrIsInvalid(fnext)) 0.00 : 7832b2: 83 f8 fd cmp $0xfffffffd,%eax 0.00 : 7832b5: 76 ef jbe 7832a6 0.00 : 7832b7: eb 10 jmp 7832c9 0.00 : 7832b9: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : { : oldhead = *fh; : n->un.gcnext = oldhead; : if (__sync_bool_compare_and_swap(fh, oldhead, fhead)) : break; : CHashTableIncrementStatistic(table, CHS_GC_Reclaim_Retry); 0.00 : 7832c0: 49 83 84 24 d8 00 00 addq $0x1,0xd8(%r12) 0.00 : 7832c7: 00 01 : } : : /* Push reclaimed elements onto home free list. */ : for (;;) : { : oldhead = *fh; 0.00 : 7832c9: 41 8b 00 mov (%r8),%eax : n->un.gcnext = oldhead; 0.00 : 7832cc: 89 41 04 mov %eax,0x4(%rcx) : if (__sync_bool_compare_and_swap(fh, oldhead, fhead)) 0.00 : 7832cf: f0 41 0f b1 10 lock cmpxchg %edx,(%r8) 0.00 : 7832d4: 75 ea jne 7832c0 0.00 : 7832d6: e9 46 fd ff ff jmpq 783021 : { : /* : * Our free list is empty, and we've succesfully pushed the : * reclaimed nodes onto it. So we're done. : */ : CHashTableIncrementStatistic(table, CHS_GC_Reclaim_Fast); 0.00 : 7832db: 49 83 84 24 d0 00 00 addq $0x1,0xd0(%r12) 0.00 : 7832e2: 00 01 0.00 : 7832e4: e9 38 fd ff ff jmpq 783021 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 19.35 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1206 16.13 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1241 9.68 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1176 9.68 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1240 6.45 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1156 6.45 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1215 6.45 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1226 6.45 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1226 3.23 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1156 3.23 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1156 3.23 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1206 3.23 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1242 3.23 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1240 3.23 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1240 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 000000000046f400 : : * slot's tupdesc's last attribute will be considered NULL even : * when the physical tuple is longer than the tupdesc. : */ : Datum : slot_getattr(TupleTableSlot *slot, int attnum, bool *isnull) : { 0.00 : 46f400: 55 push %rbp /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1156 3.23 : 46f401: 48 89 e5 mov %rsp,%rbp 0.00 : 46f404: 48 89 5d e0 mov %rbx,-0x20(%rbp) 0.00 : 46f408: 4c 89 65 e8 mov %r12,-0x18(%rbp) 3.23 : 46f40c: 48 89 fb mov %rdi,%rbx /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1156 6.45 : 46f40f: 4c 89 6d f0 mov %r13,-0x10(%rbp) 0.00 : 46f413: 4c 89 75 f8 mov %r14,-0x8(%rbp) 0.00 : 46f417: 48 83 ec 20 sub $0x20,%rsp : HeapTupleHeader tup; : : /* : * system attributes are handled by heap_getsysattr : */ : if (attnum <= 0) 0.00 : 46f41b: 85 f6 test %esi,%esi : * slot's tupdesc's last attribute will be considered NULL even : * when the physical tuple is longer than the tupdesc. : */ : Datum : slot_getattr(TupleTableSlot *slot, int attnum, bool *isnull) : { 0.00 : 46f41d: 49 89 d4 mov %rdx,%r12 : HeapTuple tuple = slot->tts_tuple; 0.00 : 46f420: 48 8b 7f 08 mov 0x8(%rdi),%rdi : TupleDesc tupleDesc = slot->tts_tupleDescriptor; 0.00 : 46f424: 48 8b 53 10 mov 0x10(%rbx),%rdx : HeapTupleHeader tup; : : /* : * system attributes are handled by heap_getsysattr : */ : if (attnum <= 0) 0.00 : 46f428: 0f 8e a2 00 00 00 jle 46f4d0 : } : : /* : * fast path if desired attribute already cached : */ : if (attnum <= slot->tts_nvalid) /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1176 9.68 : 46f42e: 3b 73 24 cmp 0x24(%rbx),%esi 0.00 : 46f431: 7e 65 jle 46f498 : } : : /* : * return NULL if attnum is out of range according to the tupdesc : */ : if (attnum > tupleDesc->natts) 0.00 : 46f433: 3b 32 cmp (%rdx),%esi 0.00 : 46f435: 7f 51 jg 46f488 : : /* : * otherwise we had better have a physical tuple (tts_nvalid should equal : * natts in all virtual-tuple cases) : */ : if (tuple == NULL) /* internal error */ 0.00 : 46f437: 48 85 ff test %rdi,%rdi 0.00 : 46f43a: 0f 84 34 01 00 00 je 46f574 : * : * (We have to check this separately because of various inheritance and : * table-alteration scenarios: the tuple could be either longer or shorter : * than the tupdesc.) : */ : tup = tuple->t_data; 0.00 : 46f440: 48 8b 7f 10 mov 0x10(%rdi),%rdi : if (attnum > HeapTupleHeaderGetNatts(tup)) 0.00 : 46f444: 0f b7 47 12 movzwl 0x12(%rdi),%eax /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1206 19.35 : 46f448: 25 ff 07 00 00 and $0x7ff,%eax /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1206 3.23 : 46f44d: 39 c6 cmp %eax,%esi 0.00 : 46f44f: 7f 37 jg 46f488 : } : : /* : * check if target attribute is null: no point in groveling through tuple : */ : if (HeapTupleHasNulls(tuple) && att_isnull(attnum - 1, tup->t_bits)) 0.00 : 46f451: f6 47 14 01 testb $0x1,0x14(%rdi) /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1215 6.45 : 46f455: 74 18 je 46f46f 0.00 : 46f457: 8d 4e ff lea -0x1(%rsi),%ecx 0.00 : 46f45a: 89 c8 mov %ecx,%eax 0.00 : 46f45c: 83 e1 07 and $0x7,%ecx 0.00 : 46f45f: c1 f8 03 sar $0x3,%eax 0.00 : 46f462: 48 98 cltq 0.00 : 46f464: 0f b6 44 07 17 movzbl 0x17(%rdi,%rax,1),%eax 0.00 : 46f469: d3 f8 sar %cl,%eax 0.00 : 46f46b: a8 01 test $0x1,%al 0.00 : 46f46d: 74 19 je 46f488 : /* : * If the attribute's column has been dropped, we force a NULL result. : * This case should not happen in normal use, but it could happen if we : * are executing a plan cached before the column was dropped. : */ : if (tupleDesc->attrs[attnum - 1]->attisdropped) /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1226 6.45 : 46f46f: 4c 63 ee movslq %esi,%r13 0.00 : 46f472: 48 8b 42 08 mov 0x8(%rdx),%rax 0.00 : 46f476: 4d 8d 75 ff lea -0x1(%r13),%r14 0.00 : 46f47a: 4a 8b 04 f0 mov (%rax,%r14,8),%rax 0.00 : 46f47e: 80 78 61 00 cmpb $0x0,0x61(%rax) 6.45 : 46f482: 74 7c je 46f500 0.00 : 46f484: 0f 1f 40 00 nopl 0x0(%rax) : { : *isnull = true; 0.00 : 46f488: 41 c6 04 24 01 movb $0x1,(%r12) 0.00 : 46f48d: 31 c0 xor %eax,%eax : /* : * The result is acquired from tts_values array. : */ : *isnull = slot->tts_isnull[attnum - 1]; : return slot->tts_values[attnum - 1]; : } 0.00 : 46f48f: eb 20 jmp 46f4b1 0.00 : 46f491: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : /* : * fast path if desired attribute already cached : */ : if (attnum <= slot->tts_nvalid) : { : *isnull = slot->tts_isnull[attnum - 1]; 0.00 : 46f498: 48 8b 43 30 mov 0x30(%rbx),%rax 0.00 : 46f49c: 48 63 d6 movslq %esi,%rdx 0.00 : 46f49f: 0f b6 44 10 ff movzbl -0x1(%rax,%rdx,1),%eax 0.00 : 46f4a4: 41 88 04 24 mov %al,(%r12) : return slot->tts_values[attnum - 1]; 0.00 : 46f4a8: 48 8b 43 28 mov 0x28(%rbx),%rax 0.00 : 46f4ac: 48 8b 44 d0 f8 mov -0x8(%rax,%rdx,8),%rax : /* : * The result is acquired from tts_values array. : */ : *isnull = slot->tts_isnull[attnum - 1]; : return slot->tts_values[attnum - 1]; : } 0.00 : 46f4b1: 48 8b 1c 24 mov (%rsp),%rbx /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1242 3.23 : 46f4b5: 4c 8b 64 24 08 mov 0x8(%rsp),%r12 0.00 : 46f4ba: 4c 8b 6c 24 10 mov 0x10(%rsp),%r13 0.00 : 46f4bf: 4c 8b 74 24 18 mov 0x18(%rsp),%r14 0.00 : 46f4c4: c9 leaveq 0.00 : 46f4c5: c3 retq 0.00 : 46f4c6: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 0.00 : 46f4cd: 00 00 00 : /* : * system attributes are handled by heap_getsysattr : */ : if (attnum <= 0) : { : if (tuple == NULL) /* internal error */ 0.00 : 46f4d0: 48 85 ff test %rdi,%rdi 0.00 : 46f4d3: 74 4b je 46f520 : elog(ERROR, "cannot extract system attribute from virtual tuple"); : if (tuple == &(slot->tts_minhdr)) /* internal error */ 0.00 : 46f4d5: 48 8d 43 40 lea 0x40(%rbx),%rax 0.00 : 46f4d9: 48 39 c7 cmp %rax,%rdi 0.00 : 46f4dc: 74 6c je 46f54a : elog(ERROR, "cannot extract system attribute from minimal tuple"); : return heap_getsysattr(tuple, attnum, tupleDesc, isnull); 0.00 : 46f4de: 4c 89 e1 mov %r12,%rcx : /* : * The result is acquired from tts_values array. : */ : *isnull = slot->tts_isnull[attnum - 1]; : return slot->tts_values[attnum - 1]; : } 0.00 : 46f4e1: 48 8b 1c 24 mov (%rsp),%rbx 0.00 : 46f4e5: 4c 8b 64 24 08 mov 0x8(%rsp),%r12 0.00 : 46f4ea: 4c 8b 6c 24 10 mov 0x10(%rsp),%r13 0.00 : 46f4ef: 4c 8b 74 24 18 mov 0x18(%rsp),%r14 0.00 : 46f4f4: c9 leaveq : { : if (tuple == NULL) /* internal error */ : elog(ERROR, "cannot extract system attribute from virtual tuple"); : if (tuple == &(slot->tts_minhdr)) /* internal error */ : elog(ERROR, "cannot extract system attribute from minimal tuple"); : return heap_getsysattr(tuple, attnum, tupleDesc, isnull); 0.00 : 46f4f5: e9 d6 f7 ff ff jmpq 46ecd0 0.00 : 46f4fa: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : } : : /* : * Extract the attribute, along with any preceding attributes. : */ : slot_deform_tuple(slot, attnum); 0.00 : 46f500: 48 89 df mov %rbx,%rdi 0.00 : 46f503: e8 08 fa ff ff callq 46ef10 : : /* : * The result is acquired from tts_values array. : */ : *isnull = slot->tts_isnull[attnum - 1]; /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1240 3.23 : 46f508: 48 8b 43 30 mov 0x30(%rbx),%rax 3.23 : 46f50c: 42 0f b6 44 28 ff movzbl -0x1(%rax,%r13,1),%eax /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1240 9.68 : 46f512: 41 88 04 24 mov %al,(%r12) : return slot->tts_values[attnum - 1]; /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1241 16.13 : 46f516: 48 8b 43 28 mov 0x28(%rbx),%rax 0.00 : 46f51a: 4a 8b 04 f0 mov (%rax,%r14,8),%rax : } 0.00 : 46f51e: eb 91 jmp 46f4b1 : * system attributes are handled by heap_getsysattr : */ : if (attnum <= 0) : { : if (tuple == NULL) /* internal error */ : elog(ERROR, "cannot extract system attribute from virtual tuple"); 0.00 : 46f520: ba f1 f6 7a 00 mov $0x7af6f1,%edx 0.00 : 46f525: be 8f 04 00 00 mov $0x48f,%esi 0.00 : 46f52a: bf f4 f5 7a 00 mov $0x7af5f4,%edi 0.00 : 46f52f: e8 ec be 30 00 callq 77b420 0.00 : 46f534: be 40 f7 7a 00 mov $0x7af740,%esi 0.00 : 46f539: bf 14 00 00 00 mov $0x14,%edi 0.00 : 46f53e: 31 c0 xor %eax,%eax 0.00 : 46f540: e8 eb bc 30 00 callq 77b230 0.00 : 46f545: e8 86 9f ff ff callq 4694d0 : if (tuple == &(slot->tts_minhdr)) /* internal error */ : elog(ERROR, "cannot extract system attribute from minimal tuple"); 0.00 : 46f54a: ba f1 f6 7a 00 mov $0x7af6f1,%edx 0.00 : 46f54f: be 91 04 00 00 mov $0x491,%esi 0.00 : 46f554: bf f4 f5 7a 00 mov $0x7af5f4,%edi 0.00 : 46f559: e8 c2 be 30 00 callq 77b420 0.00 : 46f55e: be 78 f7 7a 00 mov $0x7af778,%esi 0.00 : 46f563: bf 14 00 00 00 mov $0x14,%edi 0.00 : 46f568: 31 c0 xor %eax,%eax 0.00 : 46f56a: e8 c1 bc 30 00 callq 77b230 0.00 : 46f56f: e8 5c 9f ff ff callq 4694d0 : /* : * otherwise we had better have a physical tuple (tts_nvalid should equal : * natts in all virtual-tuple cases) : */ : if (tuple == NULL) /* internal error */ : elog(ERROR, "cannot extract attribute from empty tuple slot"); 0.00 : 46f574: ba f1 f6 7a 00 mov $0x7af6f1,%edx 0.00 : 46f579: be ac 04 00 00 mov $0x4ac,%esi 0.00 : 46f57e: bf f4 f5 7a 00 mov $0x7af5f4,%edi 0.00 : 46f583: e8 98 be 30 00 callq 77b420 0.00 : 46f588: be b0 f7 7a 00 mov $0x7af7b0,%esi 0.00 : 46f58d: bf 14 00 00 00 mov $0x14,%edi 0.00 : 46f592: 31 c0 xor %eax,%eax 0.00 : 46f594: e8 97 bc 30 00 callq 77b230 0.00 : 46f599: e8 32 9f ff ff callq 4694d0 Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 22.22 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:415 11.11 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:450 7.41 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:401 7.41 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:468 3.70 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:388 3.70 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:388 3.70 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:389 3.70 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:401 3.70 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:401 3.70 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:421 3.70 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:421 3.70 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:421 3.70 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:468 3.70 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:468 3.70 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:450 3.70 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:450 3.70 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:455 3.70 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:421 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000004acc50 <_bt_compare>: : _bt_compare(Relation rel, : int keysz, : ScanKey scankey, : Page page, : OffsetNumber offnum) : { /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:388 3.70 : 4acc50: 55 push %rbp 3.70 : 4acc51: 48 89 e5 mov %rsp,%rbp 0.00 : 4acc54: 41 57 push %r15 0.00 : 4acc56: 41 89 f7 mov %esi,%r15d 0.00 : 4acc59: 41 56 push %r14 0.00 : 4acc5b: 41 55 push %r13 0.00 : 4acc5d: 41 54 push %r12 0.00 : 4acc5f: 53 push %rbx 0.00 : 4acc60: 48 89 d3 mov %rdx,%rbx 0.00 : 4acc63: 48 83 ec 08 sub $0x8,%rsp : TupleDesc itupdesc = RelationGetDescr(rel); : BTPageOpaque opaque = (BTPageOpaque) PageGetSpecialPointer(page); 0.00 : 4acc67: 0f b7 41 10 movzwl 0x10(%rcx),%eax : int keysz, : ScanKey scankey, : Page page, : OffsetNumber offnum) : { : TupleDesc itupdesc = RelationGetDescr(rel); /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:389 3.70 : 4acc6b: 4c 8b 77 38 mov 0x38(%rdi),%r14 : BTPageOpaque opaque = (BTPageOpaque) PageGetSpecialPointer(page); 0.00 : 4acc6f: 48 8d 04 01 lea (%rcx,%rax,1),%rax : : /* : * Force result ">" if target item is first data item on an internal page : * --- see NOTE above. : */ : if (!P_ISLEAF(opaque) && offnum == P_FIRSTDATAKEY(opaque)) 0.00 : 4acc73: f6 40 0c 01 testb $0x1,0xc(%rax) 0.00 : 4acc77: 75 1a jne 4acc93 <_bt_compare+0x43> 0.00 : 4acc79: 83 78 04 01 cmpl $0x1,0x4(%rax) 0.00 : 4acc7d: 41 0f b7 d0 movzwl %r8w,%edx : : /* if the keys are unequal, return the difference */ : if (result != 0) : return result; : : scankey++; 0.00 : 4acc81: be 01 00 00 00 mov $0x1,%esi : : /* : * Force result ">" if target item is first data item on an internal page : * --- see NOTE above. : */ : if (!P_ISLEAF(opaque) && offnum == P_FIRSTDATAKEY(opaque)) 0.00 : 4acc86: 19 c0 sbb %eax,%eax 0.00 : 4acc88: 83 c0 02 add $0x2,%eax 0.00 : 4acc8b: 39 c2 cmp %eax,%edx 0.00 : 4acc8d: 0f 84 ab 00 00 00 je 4acd3e <_bt_compare+0xee> : return 1; : : itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, offnum)); /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:401 3.70 : 4acc93: 41 0f b7 c0 movzwl %r8w,%eax 0.00 : 4acc97: 0f b7 44 81 14 movzwl 0x14(%rcx,%rax,4),%eax /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:401 7.41 : 4acc9c: 25 ff 7f 00 00 and $0x7fff,%eax : * We don't test for violation of this condition here, however. The : * initial setup for the index scan had better have gotten it right (see : * _bt_first). : */ : : for (i = 1; i <= keysz; i++) 0.00 : 4acca1: 45 85 ff test %r15d,%r15d : * --- see NOTE above. : */ : if (!P_ISLEAF(opaque) && offnum == P_FIRSTDATAKEY(opaque)) : return 1; : : itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, offnum)); /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:401 3.70 : 4acca4: 4c 8d 24 01 lea (%rcx,%rax,1),%r12 : * We don't test for violation of this condition here, however. The : * initial setup for the index scan had better have gotten it right (see : * _bt_first). : */ : : for (i = 1; i <= keysz; i++) 0.00 : 4acca8: 0f 8e a2 01 00 00 jle 4ace50 <_bt_compare+0x200> : { : Datum datum; : bool isNull; : int32 result; : : datum = index_getattr(itup, scankey->sk_attno, itupdesc, &isNull); 0.00 : 4accae: 66 41 83 7c 24 06 00 cmpw $0x0,0x6(%r12) : * We don't test for violation of this condition here, however. The : * initial setup for the index scan had better have gotten it right (see : * _bt_first). : */ : : for (i = 1; i <= keysz; i++) /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:415 22.22 : 4accb5: 41 bd 01 00 00 00 mov $0x1,%r13d : { : Datum datum; : bool isNull; : int32 result; : : datum = index_getattr(itup, scankey->sk_attno, itupdesc, &isNull); 0.00 : 4accbb: 0f 88 d4 00 00 00 js 4acd95 <_bt_compare+0x145> 0.00 : 4accc1: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 0.00 : 4accc8: 0f b7 4b 04 movzwl 0x4(%rbx),%ecx 0.00 : 4acccc: 49 8b 46 08 mov 0x8(%r14),%rax /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:421 3.70 : 4accd0: 48 0f bf d1 movswq %cx,%rdx 0.00 : 4accd4: 48 8b 54 d0 f8 mov -0x8(%rax,%rdx,8),%rdx 0.00 : 4accd9: 8b 42 54 mov 0x54(%rdx),%eax 3.70 : 4accdc: 85 c0 test %eax,%eax 0.00 : 4accde: 0f 88 2c 01 00 00 js 4ace10 <_bt_compare+0x1c0> 0.00 : 4acce4: 80 7a 5c 00 cmpb $0x0,0x5c(%rdx) 0.00 : 4acce8: 0f 84 0a 01 00 00 je 4acdf8 <_bt_compare+0x1a8> 3.70 : 4accee: 0f b7 52 4c movzwl 0x4c(%rdx),%edx 0.00 : 4accf2: 66 83 fa 08 cmp $0x8,%dx 0.00 : 4accf6: 0f 84 1c 01 00 00 je 4ace18 <_bt_compare+0x1c8> 0.00 : 4accfc: 66 83 fa 04 cmp $0x4,%dx 0.00 : 4acd00: 0f 84 2a 01 00 00 je 4ace30 <_bt_compare+0x1e0> 0.00 : 4acd06: 66 83 fa 02 cmp $0x2,%dx 0.00 : 4acd0a: 0f 84 30 01 00 00 je 4ace40 <_bt_compare+0x1f0> 0.00 : 4acd10: 48 98 cltq 0.00 : 4acd12: 31 d2 xor %edx,%edx 0.00 : 4acd14: 45 0f b6 44 04 08 movzbl 0x8(%r12,%rax,1),%r8d 0.00 : 4acd1a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : : /* see comments about NULLs handling in btbuild */ : if (scankey->sk_flags & SK_ISNULL) /* key is NULL */ 0.00 : 4acd20: 8b 03 mov (%rbx),%eax 0.00 : 4acd22: a8 01 test $0x1,%al 0.00 : 4acd24: 0f 84 ae 00 00 00 je 4acdd8 <_bt_compare+0x188> : { : if (isNull) 0.00 : 4acd2a: 84 d2 test %dl,%dl 0.00 : 4acd2c: 75 49 jne 4acd77 <_bt_compare+0x127> : result = 0; /* NULL "=" NULL */ : else if (scankey->sk_flags & SK_BT_NULLS_FIRST) 0.00 : 4acd2e: a9 00 00 00 02 test $0x2000000,%eax 0.00 : 4acd33: 0f 84 b2 00 00 00 je 4acdeb <_bt_compare+0x19b> : : /* if the keys are unequal, return the difference */ : if (result != 0) : return result; : : scankey++; 0.00 : 4acd39: be ff ff ff ff mov $0xffffffff,%esi : } : : /* if we get here, the keys are equal */ : return 0; : } 0.00 : 4acd3e: 48 83 c4 08 add $0x8,%rsp /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:468 3.70 : 4acd42: 89 f0 mov %esi,%eax 0.00 : 4acd44: 5b pop %rbx /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:468 7.41 : 4acd45: 41 5c pop %r12 0.00 : 4acd47: 41 5d pop %r13 0.00 : 4acd49: 41 5e pop %r14 0.00 : 4acd4b: 41 5f pop %r15 0.00 : 4acd4d: c9 leaveq /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:468 3.70 : 4acd4e: c3 retq 0.00 : 4acd4f: 90 nop : * types). Since it is convenient for callers to think of : * _bt_compare as comparing the scankey to the index item, we have : * to flip the sign of the comparison result. (Unless it's a DESC : * column, in which case we *don't* flip the sign.) : */ : result = DatumGetInt32(FunctionCall2Coll(&scankey->sk_func, /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:450 3.70 : 4acd50: 8b 73 0c mov 0xc(%rbx),%esi 0.00 : 4acd53: 48 8b 4b 40 mov 0x40(%rbx),%rcx 0.00 : 4acd57: 48 8d 7b 10 lea 0x10(%rbx),%rdi 0.00 : 4acd5b: 4c 89 c2 mov %r8,%rdx /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:450 11.11 : 4acd5e: e8 cd 12 2d 00 callq 77e030 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:450 3.70 : 4acd63: 89 c6 mov %eax,%esi : scankey->sk_collation, : datum, : scankey->sk_argument)); : : if (!(scankey->sk_flags & SK_BT_DESC)) /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:455 3.70 : 4acd65: 8b 03 mov (%rbx),%eax : result = -result; 0.00 : 4acd67: 89 f2 mov %esi,%edx 0.00 : 4acd69: f7 da neg %edx 0.00 : 4acd6b: a9 00 00 00 01 test $0x1000000,%eax 0.00 : 4acd70: 0f 44 f2 cmove %edx,%esi : } : : /* if the keys are unequal, return the difference */ : if (result != 0) 0.00 : 4acd73: 85 f6 test %esi,%esi 0.00 : 4acd75: 75 c7 jne 4acd3e <_bt_compare+0xee> : * We don't test for violation of this condition here, however. The : * initial setup for the index scan had better have gotten it right (see : * _bt_first). : */ : : for (i = 1; i <= keysz; i++) 0.00 : 4acd77: 41 83 c5 01 add $0x1,%r13d 0.00 : 4acd7b: 45 39 ef cmp %r13d,%r15d 0.00 : 4acd7e: 0f 8c cc 00 00 00 jl 4ace50 <_bt_compare+0x200> : : /* if the keys are unequal, return the difference */ : if (result != 0) : return result; : : scankey++; 0.00 : 4acd84: 48 83 c3 48 add $0x48,%rbx : { : Datum datum; : bool isNull; : int32 result; : : datum = index_getattr(itup, scankey->sk_attno, itupdesc, &isNull); 0.00 : 4acd88: 66 41 83 7c 24 06 00 cmpw $0x0,0x6(%r12) 0.00 : 4acd8f: 0f 89 33 ff ff ff jns 4accc8 <_bt_compare+0x78> 0.00 : 4acd95: 0f bf 73 04 movswl 0x4(%rbx),%esi 0.00 : 4acd99: 45 31 c0 xor %r8d,%r8d 0.00 : 4acd9c: ba 01 00 00 00 mov $0x1,%edx 0.00 : 4acda1: 8d 4e ff lea -0x1(%rsi),%ecx 0.00 : 4acda4: 89 c8 mov %ecx,%eax 0.00 : 4acda6: 83 e1 07 and $0x7,%ecx 0.00 : 4acda9: c1 f8 03 sar $0x3,%eax 0.00 : 4acdac: 48 98 cltq 0.00 : 4acdae: 41 0f be 44 04 08 movsbl 0x8(%r12,%rax,1),%eax 0.00 : 4acdb4: d3 f8 sar %cl,%eax 0.00 : 4acdb6: a8 01 test $0x1,%al 0.00 : 4acdb8: 0f 84 62 ff ff ff je 4acd20 <_bt_compare+0xd0> 0.00 : 4acdbe: 4c 89 f2 mov %r14,%rdx 0.00 : 4acdc1: 4c 89 e7 mov %r12,%rdi 0.00 : 4acdc4: e8 97 3d fc ff callq 470b60 0.00 : 4acdc9: 49 89 c0 mov %rax,%r8 : : /* see comments about NULLs handling in btbuild */ : if (scankey->sk_flags & SK_ISNULL) /* key is NULL */ 0.00 : 4acdcc: 8b 03 mov (%rbx),%eax : { : Datum datum; : bool isNull; : int32 result; : : datum = index_getattr(itup, scankey->sk_attno, itupdesc, &isNull); 0.00 : 4acdce: 31 d2 xor %edx,%edx : : /* see comments about NULLs handling in btbuild */ : if (scankey->sk_flags & SK_ISNULL) /* key is NULL */ 0.00 : 4acdd0: a8 01 test $0x1,%al 0.00 : 4acdd2: 0f 85 52 ff ff ff jne 4acd2a <_bt_compare+0xda> : else if (scankey->sk_flags & SK_BT_NULLS_FIRST) : result = -1; /* NULL "<" NOT_NULL */ : else : result = 1; /* NULL ">" NOT_NULL */ : } : else if (isNull) /* key is NOT_NULL and item is NULL */ 0.00 : 4acdd8: 84 d2 test %dl,%dl 0.00 : 4acdda: 0f 84 70 ff ff ff je 4acd50 <_bt_compare+0x100> : { : if (scankey->sk_flags & SK_BT_NULLS_FIRST) 0.00 : 4acde0: a9 00 00 00 02 test $0x2000000,%eax 0.00 : 4acde5: 0f 84 4e ff ff ff je 4acd39 <_bt_compare+0xe9> : : /* if the keys are unequal, return the difference */ : if (result != 0) : return result; : : scankey++; 0.00 : 4acdeb: be 01 00 00 00 mov $0x1,%esi 0.00 : 4acdf0: e9 49 ff ff ff jmpq 4acd3e <_bt_compare+0xee> 0.00 : 4acdf5: 0f 1f 00 nopl (%rax) : { : Datum datum; : bool isNull; : int32 result; : : datum = index_getattr(itup, scankey->sk_attno, itupdesc, &isNull); 0.00 : 4acdf8: 48 98 cltq 0.00 : 4acdfa: 31 d2 xor %edx,%edx 0.00 : 4acdfc: 4d 8d 44 04 08 lea 0x8(%r12,%rax,1),%r8 0.00 : 4ace01: e9 1a ff ff ff jmpq 4acd20 <_bt_compare+0xd0> 0.00 : 4ace06: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 0.00 : 4ace0d: 00 00 00 0.00 : 4ace10: 0f bf f1 movswl %cx,%esi 0.00 : 4ace13: eb a9 jmp 4acdbe <_bt_compare+0x16e> 0.00 : 4ace15: 0f 1f 00 nopl (%rax) 0.00 : 4ace18: 48 98 cltq 0.00 : 4ace1a: 31 d2 xor %edx,%edx 0.00 : 4ace1c: 4d 8b 44 04 08 mov 0x8(%r12,%rax,1),%r8 0.00 : 4ace21: e9 fa fe ff ff jmpq 4acd20 <_bt_compare+0xd0> 0.00 : 4ace26: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 0.00 : 4ace2d: 00 00 00 0.00 : 4ace30: 48 98 cltq 0.00 : 4ace32: 31 d2 xor %edx,%edx 0.00 : 4ace34: 45 8b 44 04 08 mov 0x8(%r12,%rax,1),%r8d /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:421 3.70 : 4ace39: e9 e2 fe ff ff jmpq 4acd20 <_bt_compare+0xd0> 0.00 : 4ace3e: 66 90 xchg %ax,%ax 0.00 : 4ace40: 48 98 cltq 0.00 : 4ace42: 31 d2 xor %edx,%edx 0.00 : 4ace44: 45 0f b7 44 04 08 movzwl 0x8(%r12,%rax,1),%r8d 0.00 : 4ace4a: e9 d1 fe ff ff jmpq 4acd20 <_bt_compare+0xd0> 0.00 : 4ace4f: 90 nop : : /* if the keys are unequal, return the difference */ : if (result != 0) : return result; : : scankey++; 0.00 : 4ace50: 31 f6 xor %esi,%esi 0.00 : 4ace52: e9 e7 fe ff ff jmpq 4acd3e <_bt_compare+0xee> Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 16.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:164 12.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:164 12.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:164 8.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:146 8.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:146 8.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:168 8.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:304 4.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:146 4.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:164 4.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:149 4.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:168 4.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:160 4.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:304 4.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:304 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000674520 : : * : * Only works for shared buffers. : */ : static PrivateRefCountEntry* : GetPrivateRefCountEntry(Buffer buffer, bool create, bool do_move) : { 0.00 : 674520: 55 push %rbp 0.00 : 674521: 48 89 e5 mov %rsp,%rbp 0.00 : 674524: 41 57 push %r15 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:146 4.00 : 674526: 41 89 f7 mov %esi,%r15d : */ : for (i = 0; i < REFCOUNT_ARRAY_ENTRIES; i++) : { : res = &PrivateRefCountArray[i]; : : if (res->buffer == buffer) 0.00 : 674529: 89 fe mov %edi,%esi : * : * Only works for shared buffers. : */ : static PrivateRefCountEntry* : GetPrivateRefCountEntry(Buffer buffer, bool create, bool do_move) : { 0.00 : 67452b: 41 56 push %r14 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:146 8.00 : 67452d: 41 55 push %r13 0.00 : 67452f: 41 54 push %r12 0.00 : 674531: 41 89 d4 mov %edx,%r12d : */ : for (i = 0; i < REFCOUNT_ARRAY_ENTRIES; i++) : { : res = &PrivateRefCountArray[i]; : : if (res->buffer == buffer) /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:164 4.00 : 674534: ba c0 d0 b7 00 mov $0xb7d0c0,%edx : * : * Only works for shared buffers. : */ : static PrivateRefCountEntry* : GetPrivateRefCountEntry(Buffer buffer, bool create, bool do_move) : { 0.00 : 674539: 53 push %rbx : */ : for (i = 0; i < REFCOUNT_ARRAY_ENTRIES; i++) : { : res = &PrivateRefCountArray[i]; : : if (res->buffer == buffer) 0.00 : 67453a: 31 db xor %ebx,%ebx : * : * Only works for shared buffers. : */ : static PrivateRefCountEntry* : GetPrivateRefCountEntry(Buffer buffer, bool create, bool do_move) : { 0.00 : 67453c: 48 83 ec 18 sub $0x18,%rsp /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:146 8.00 : 674540: 89 7d c4 mov %edi,-0x3c(%rbp) : PrivateRefCountEntry *res; : PrivateRefCountEntry *free = NULL; : bool found = false; /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:149 4.00 : 674543: c6 45 d7 00 movb $0x0,-0x29(%rbp) 0.00 : 674547: eb 14 jmp 67455d 0.00 : 674549: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : : if (res->buffer == buffer) : return res; : : /* Remember where to put a new refcount, should it become necessary. */ : if (free == NULL && res->buffer == InvalidBuffer) 0.00 : 674550: 48 83 c2 08 add $0x8,%rdx : : /* : * First search for references in the array, that'll be sufficient in the : * majority of cases. : */ : for (i = 0; i < REFCOUNT_ARRAY_ENTRIES; i++) 0.00 : 674554: 48 81 fa 00 d1 b7 00 cmp $0xb7d100,%rdx 0.00 : 67455b: 74 2b je 674588 : { : res = &PrivateRefCountArray[i]; : : if (res->buffer == buffer) /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:164 16.00 : 67455d: 8b 0a mov (%rdx),%ecx 12.00 : 67455f: 48 89 d0 mov %rdx,%rax 12.00 : 674562: 39 f1 cmp %esi,%ecx 0.00 : 674564: 0f 84 c8 00 00 00 je 674632 : return res; : : /* Remember where to put a new refcount, should it become necessary. */ : if (free == NULL && res->buffer == InvalidBuffer) 0.00 : 67456a: 48 85 db test %rbx,%rbx 0.00 : 67456d: 75 e1 jne 674550 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:168 8.00 : 67456f: 85 c9 test %ecx,%ecx 0.00 : 674571: 48 0f 44 da cmove %rdx,%rbx /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:168 4.00 : 674575: 48 83 c2 08 add $0x8,%rdx : : /* : * First search for references in the array, that'll be sufficient in the : * majority of cases. : */ : for (i = 0; i < REFCOUNT_ARRAY_ENTRIES; i++) /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:160 4.00 : 674579: 48 81 fa 00 d1 b7 00 cmp $0xb7d100,%rdx 0.00 : 674580: 75 db jne 67455d 0.00 : 674582: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : : /* : * Look up the buffer in the hashtable if we've previously overflowed into : * it. : */ : if (PrivateRefCountOverflowed > 0) 0.00 : 674588: 8b 05 e2 8a 50 00 mov 0x508ae2(%rip),%eax # b7d070 : /* : * By here we know that the buffer, if already pinned, isn't residing in : * the array. : */ : res = NULL; : found = false; 0.00 : 67458e: c6 45 d7 00 movb $0x0,-0x29(%rbp) : : /* : * Look up the buffer in the hashtable if we've previously overflowed into : * it. : */ : if (PrivateRefCountOverflowed > 0) 0.00 : 674592: 85 c0 test %eax,%eax 0.00 : 674594: 0f 8e ee 00 00 00 jle 674688 : { : res = hash_search(PrivateRefCountHash, 0.00 : 67459a: 4c 8d 75 d7 lea -0x29(%rbp),%r14 0.00 : 67459e: 48 8b 3d d3 8a 50 00 mov 0x508ad3(%rip),%rdi # b7d078 0.00 : 6745a5: 48 8d 75 c4 lea -0x3c(%rbp),%rsi 0.00 : 6745a9: 31 d2 xor %edx,%edx 0.00 : 6745ab: 4c 89 f1 mov %r14,%rcx 0.00 : 6745ae: e8 ed 00 11 00 callq 7846a0 : (void *) &buffer, : HASH_FIND, : &found); : } : : if (!found) 0.00 : 6745b3: 80 7d d7 00 cmpb $0x0,-0x29(%rbp) : * Look up the buffer in the hashtable if we've previously overflowed into : * it. : */ : if (PrivateRefCountOverflowed > 0) : { : res = hash_search(PrivateRefCountHash, 0.00 : 6745b7: 49 89 c5 mov %rax,%r13 : (void *) &buffer, : HASH_FIND, : &found); : } : : if (!found) 0.00 : 6745ba: 0f 84 c8 00 00 00 je 674688 : : } : } : else : { : if (!do_move) 0.00 : 6745c0: 45 84 e4 test %r12b,%r12b 0.00 : 6745c3: 74 6d je 674632 : { : return res; : } : else if (found && free != NULL) 0.00 : 6745c5: 48 85 db test %rbx,%rbx 0.00 : 6745c8: 75 7e jne 674648 : */ : PrivateRefCountEntry *arrayent; : PrivateRefCountEntry *hashent; : : /* select victim slot */ : arrayent = &PrivateRefCountArray[ 0.00 : 6745ca: 8b 05 b0 8a 50 00 mov 0x508ab0(%rip),%eax # b7d080 : PrivateRefCountClock++ % REFCOUNT_ARRAY_ENTRIES]; : Assert(arrayent->buffer != InvalidBuffer); : : /* enter victim entry into the hashtable */ : hashent = hash_search(PrivateRefCountHash, 0.00 : 6745d0: 48 8b 3d a1 8a 50 00 mov 0x508aa1(%rip),%rdi # b7d078 0.00 : 6745d7: 4c 89 f1 mov %r14,%rcx 0.00 : 6745da: ba 01 00 00 00 mov $0x1,%edx : */ : PrivateRefCountEntry *arrayent; : PrivateRefCountEntry *hashent; : : /* select victim slot */ : arrayent = &PrivateRefCountArray[ 0.00 : 6745df: 49 89 c4 mov %rax,%r12 0.00 : 6745e2: 83 c0 01 add $0x1,%eax 0.00 : 6745e5: 41 83 e4 07 and $0x7,%r12d 0.00 : 6745e9: 89 05 91 8a 50 00 mov %eax,0x508a91(%rip) # b7d080 0.00 : 6745ef: 4a 8d 1c e5 c0 d0 b7 lea 0xb7d0c0(,%r12,8),%rbx 0.00 : 6745f6: 00 : PrivateRefCountClock++ % REFCOUNT_ARRAY_ENTRIES]; : Assert(arrayent->buffer != InvalidBuffer); : : /* enter victim entry into the hashtable */ : hashent = hash_search(PrivateRefCountHash, 0.00 : 6745f7: 48 89 de mov %rbx,%rsi 0.00 : 6745fa: e8 a1 00 11 00 callq 7846a0 : (void *) &arrayent->buffer, : HASH_ENTER, : &found); : Assert(!found); : hashent->refcount = arrayent->refcount; 0.00 : 6745ff: 8b 53 04 mov 0x4(%rbx),%edx : /* fill now free array entry with previously searched entry */ : arrayent->buffer = res->buffer; : arrayent->refcount = res->refcount; : : /* and remove the old entry */ : hash_search(PrivateRefCountHash, 0.00 : 674602: 4c 89 f1 mov %r14,%rcx 0.00 : 674605: 48 89 de mov %rbx,%rsi : hashent = hash_search(PrivateRefCountHash, : (void *) &arrayent->buffer, : HASH_ENTER, : &found); : Assert(!found); : hashent->refcount = arrayent->refcount; 0.00 : 674608: 89 50 04 mov %edx,0x4(%rax) : : /* fill now free array entry with previously searched entry */ : arrayent->buffer = res->buffer; 0.00 : 67460b: 41 8b 45 00 mov 0x0(%r13),%eax : arrayent->refcount = res->refcount; : : /* and remove the old entry */ : hash_search(PrivateRefCountHash, 0.00 : 67460f: ba 02 00 00 00 mov $0x2,%edx : &found); : Assert(!found); : hashent->refcount = arrayent->refcount; : : /* fill now free array entry with previously searched entry */ : arrayent->buffer = res->buffer; 0.00 : 674614: 42 89 04 e5 c0 d0 b7 mov %eax,0xb7d0c0(,%r12,8) 0.00 : 67461b: 00 : arrayent->refcount = res->refcount; 0.00 : 67461c: 41 8b 45 04 mov 0x4(%r13),%eax 0.00 : 674620: 89 43 04 mov %eax,0x4(%rbx) : : /* and remove the old entry */ : hash_search(PrivateRefCountHash, 0.00 : 674623: 48 8b 3d 4e 8a 50 00 mov 0x508a4e(%rip),%rdi # b7d078 0.00 : 67462a: e8 71 00 11 00 callq 7846a0 0.00 : 67462f: 48 89 d8 mov %rbx,%rax : } : } : : Assert(false); /* unreachable */ : return NULL; : } /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:304 8.00 : 674632: 48 83 c4 18 add $0x18,%rsp 0.00 : 674636: 5b pop %rbx /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:304 4.00 : 674637: 41 5c pop %r12 0.00 : 674639: 41 5d pop %r13 0.00 : 67463b: 41 5e pop %r14 0.00 : 67463d: 41 5f pop %r15 4.00 : 67463f: c9 leaveq 0.00 : 674640: c3 retq 0.00 : 674641: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : else if (found && free != NULL) : { : /* move buffer from hashtable into the free array slot */ : : /* fill array slot */ : free->buffer = buffer; 0.00 : 674648: 8b 45 c4 mov -0x3c(%rbp),%eax : free->refcount = res->refcount; : : /* delete from hashtable */ : hash_search(PrivateRefCountHash, 0.00 : 67464b: 48 8d 75 c4 lea -0x3c(%rbp),%rsi 0.00 : 67464f: 4c 89 f1 mov %r14,%rcx 0.00 : 674652: ba 02 00 00 00 mov $0x2,%edx : else if (found && free != NULL) : { : /* move buffer from hashtable into the free array slot */ : : /* fill array slot */ : free->buffer = buffer; 0.00 : 674657: 89 03 mov %eax,(%rbx) : free->refcount = res->refcount; 0.00 : 674659: 41 8b 45 04 mov 0x4(%r13),%eax 0.00 : 67465d: 89 43 04 mov %eax,0x4(%rbx) : : /* delete from hashtable */ : hash_search(PrivateRefCountHash, 0.00 : 674660: 48 8b 3d 11 8a 50 00 mov 0x508a11(%rip),%rdi # b7d078 0.00 : 674667: e8 34 00 11 00 callq 7846a0 : (void *) &buffer, : HASH_REMOVE, : &found); : Assert(found); : Assert(PrivateRefCountOverflowed > 0); : PrivateRefCountOverflowed--; 0.00 : 67466c: 83 2d fd 89 50 00 01 subl $0x1,0x5089fd(%rip) # b7d070 0.00 : 674673: 48 89 d8 mov %rbx,%rax : } : } : : Assert(false); /* unreachable */ : return NULL; : } 0.00 : 674676: 48 83 c4 18 add $0x18,%rsp 0.00 : 67467a: 5b pop %rbx 0.00 : 67467b: 41 5c pop %r12 0.00 : 67467d: 41 5d pop %r13 0.00 : 67467f: 41 5e pop %r14 0.00 : 674681: 41 5f pop %r15 0.00 : 674683: c9 leaveq 0.00 : 674684: c3 retq 0.00 : 674685: 0f 1f 00 nopl (%rax) : &found); : } : : if (!found) : { : if (!create) 0.00 : 674688: 31 c0 xor %eax,%eax 0.00 : 67468a: 45 84 ff test %r15b,%r15b 0.00 : 67468d: 74 a3 je 674632 : { : /* Neither array nor hash have an entry and no new entry is needed */ : return NULL; : } : else if (free != NULL) 0.00 : 67468f: 48 85 db test %rbx,%rbx 0.00 : 674692: 74 11 je 6746a5 : { : /* add entry into the free array slot */ : free->buffer = buffer; 0.00 : 674694: 8b 45 c4 mov -0x3c(%rbp),%eax : free->refcount = 0; 0.00 : 674697: c7 43 04 00 00 00 00 movl $0x0,0x4(%rbx) : return NULL; : } : else if (free != NULL) : { : /* add entry into the free array slot */ : free->buffer = buffer; 0.00 : 67469e: 89 03 mov %eax,(%rbx) : free->refcount = 0; 0.00 : 6746a0: 48 89 d8 mov %rbx,%rax : } : } : : Assert(false); /* unreachable */ : return NULL; : } 0.00 : 6746a3: eb 8d jmp 674632 : */ : PrivateRefCountEntry *arrayent; : PrivateRefCountEntry *hashent; : : /* select victim slot */ : arrayent = &PrivateRefCountArray[ 0.00 : 6746a5: 8b 05 d5 89 50 00 mov 0x5089d5(%rip),%eax # b7d080 : PrivateRefCountClock++ % REFCOUNT_ARRAY_ENTRIES]; : Assert(arrayent->buffer != InvalidBuffer); : : /* enter victim array entry into hashtable */ : hashent = hash_search(PrivateRefCountHash, 0.00 : 6746ab: 48 8b 3d c6 89 50 00 mov 0x5089c6(%rip),%rdi # b7d078 0.00 : 6746b2: 48 8d 4d d7 lea -0x29(%rbp),%rcx 0.00 : 6746b6: ba 01 00 00 00 mov $0x1,%edx : */ : PrivateRefCountEntry *arrayent; : PrivateRefCountEntry *hashent; : : /* select victim slot */ : arrayent = &PrivateRefCountArray[ 0.00 : 6746bb: 49 89 c4 mov %rax,%r12 0.00 : 6746be: 83 c0 01 add $0x1,%eax 0.00 : 6746c1: 41 83 e4 07 and $0x7,%r12d 0.00 : 6746c5: 89 05 b5 89 50 00 mov %eax,0x5089b5(%rip) # b7d080 0.00 : 6746cb: 4a 8d 1c e5 c0 d0 b7 lea 0xb7d0c0(,%r12,8),%rbx 0.00 : 6746d2: 00 : PrivateRefCountClock++ % REFCOUNT_ARRAY_ENTRIES]; : Assert(arrayent->buffer != InvalidBuffer); : : /* enter victim array entry into hashtable */ : hashent = hash_search(PrivateRefCountHash, 0.00 : 6746d3: 48 89 de mov %rbx,%rsi 0.00 : 6746d6: e8 c5 ff 10 00 callq 7846a0 : (void *) &arrayent->buffer, : HASH_ENTER, : &found); : Assert(!found); : hashent->refcount = arrayent->refcount; 0.00 : 6746db: 8b 53 04 mov 0x4(%rbx),%edx 0.00 : 6746de: 89 50 04 mov %edx,0x4(%rax) : : /* fill the now free array slot */ : arrayent->buffer = buffer; 0.00 : 6746e1: 8b 45 c4 mov -0x3c(%rbp),%eax 0.00 : 6746e4: 42 89 04 e5 c0 d0 b7 mov %eax,0xb7d0c0(,%r12,8) 0.00 : 6746eb: 00 : arrayent->refcount = 0; 0.00 : 6746ec: c7 43 04 00 00 00 00 movl $0x0,0x4(%rbx) : : PrivateRefCountOverflowed++; 0.00 : 6746f3: 48 89 d8 mov %rbx,%rax 0.00 : 6746f6: 83 05 73 89 50 00 01 addl $0x1,0x508973(%rip) # b7d070 : } : } : : Assert(false); /* unreachable */ : return NULL; : } 0.00 : 6746fd: e9 30 ff ff ff jmpq 674632 Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 13.64 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1998 9.09 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1946 9.09 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1966 9.09 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1998 9.09 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1989 4.55 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1966 4.55 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1977 4.55 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1977 4.55 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1979 4.55 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1981 4.55 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1981 4.55 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1998 4.55 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1992 4.55 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1993 4.55 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1995 4.55 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1998 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000005b1430 : : static Datum : ExecMakeFunctionResultNoSets(FuncExprState *fcache, : ExprContext *econtext, : bool *isNull, : ExprDoneCond *isDone) : { /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1946 9.09 : 5b1430: 55 push %rbp 0.00 : 5b1431: 48 89 e5 mov %rsp,%rbp 0.00 : 5b1434: 41 57 push %r15 0.00 : 5b1436: 49 89 d7 mov %rdx,%r15 0.00 : 5b1439: 41 56 push %r14 0.00 : 5b143b: 49 89 f6 mov %rsi,%r14 0.00 : 5b143e: 41 55 push %r13 0.00 : 5b1440: 49 89 fd mov %rdi,%r13 0.00 : 5b1443: 41 54 push %r12 0.00 : 5b1445: 53 push %rbx 0.00 : 5b1446: 48 89 cb mov %rcx,%rbx 0.00 : 5b1449: 48 83 ec 48 sub $0x48,%rsp : FunctionCallInfo fcinfo; : PgStat_FunctionCallUsage fcusage; : int i; : : /* Guard against stack overflow due to overly complex expressions */ : check_stack_depth(); 0.00 : 5b144d: e8 8e a5 0e 00 callq 69b9e0 : : if (isDone) 0.00 : 5b1452: 48 85 db test %rbx,%rbx 0.00 : 5b1455: 74 06 je 5b145d : *isDone = ExprSingleResult; 0.00 : 5b1457: c7 03 00 00 00 00 movl $0x0,(%rbx) : : /* inlined, simplified version of ExecEvalFuncArgs */ : fcinfo = &fcache->fcinfo_data; : i = 0; : foreach(arg, fcache->args) 0.00 : 5b145d: 49 8b 45 18 mov 0x18(%r13),%rax : #endif /* PG_USE_INLINE */ : #if defined(PG_USE_INLINE) || defined(PG_LIST_INCLUDE_DEFINITIONS) : STATIC_IF_INLINE ListCell * : list_head(const List *l) : { : return l ? l->head : NULL; 0.00 : 5b1461: 48 85 c0 test %rax,%rax 0.00 : 5b1464: 0f 84 c2 00 00 00 je 5b152c 0.00 : 5b146a: 4c 8b 60 08 mov 0x8(%rax),%r12 0.00 : 5b146e: 4d 85 e4 test %r12,%r12 0.00 : 5b1471: 0f 84 b5 00 00 00 je 5b152c 0.00 : 5b1477: 31 db xor %ebx,%ebx 0.00 : 5b1479: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : { : ExprState *argstate = (ExprState *) lfirst(arg); 0.00 : 5b1480: 49 8b 04 24 mov (%r12),%rax : : fcinfo->arg[i] = ExecEvalExpr(argstate, 0.00 : 5b1484: 49 8d 94 1d b0 03 00 lea 0x3b0(%r13,%rbx,1),%rdx 0.00 : 5b148b: 00 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1966 4.55 : 5b148c: 31 c9 xor %ecx,%ecx 0.00 : 5b148e: 4c 89 f6 mov %r14,%rsi 0.00 : 5b1491: 48 89 c7 mov %rax,%rdi 0.00 : 5b1494: ff 50 10 callq *0x10(%rax) 0.00 : 5b1497: 49 89 84 dd 90 00 00 mov %rax,0x90(%r13,%rbx,8) 0.00 : 5b149e: 00 : *isDone = ExprSingleResult; : : /* inlined, simplified version of ExecEvalFuncArgs */ : fcinfo = &fcache->fcinfo_data; : i = 0; : foreach(arg, fcache->args) 0.00 : 5b149f: 4d 8b 64 24 08 mov 0x8(%r12),%r12 : { : ExprState *argstate = (ExprState *) lfirst(arg); : : fcinfo->arg[i] = ExecEvalExpr(argstate, /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1966 9.09 : 5b14a4: 8d 53 01 lea 0x1(%rbx),%edx : *isDone = ExprSingleResult; : : /* inlined, simplified version of ExecEvalFuncArgs */ : fcinfo = &fcache->fcinfo_data; : i = 0; : foreach(arg, fcache->args) 0.00 : 5b14a7: 48 83 c3 01 add $0x1,%rbx 0.00 : 5b14ab: 4d 85 e4 test %r12,%r12 0.00 : 5b14ae: 75 d0 jne 5b1480 : : /* : * If function is strict, and there are any NULL arguments, skip calling : * the function and return NULL. : */ : if (fcache->func.fn_strict) 0.00 : 5b14b0: 41 80 7d 2e 00 cmpb $0x0,0x2e(%r13) /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1977 4.55 : 5b14b5: 74 34 je 5b14eb 4.55 : 5b14b7: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 5b14be: 00 00 : { : while (--i >= 0) /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1979 4.55 : 5b14c0: 83 ea 01 sub $0x1,%edx 0.00 : 5b14c3: 78 26 js 5b14eb : { : if (fcinfo->argnull[i]) /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1981 4.55 : 5b14c5: 48 63 c2 movslq %edx,%rax 0.00 : 5b14c8: 41 80 bc 05 b0 03 00 cmpb $0x0,0x3b0(%r13,%rax,1) 0.00 : 5b14cf: 00 00 4.55 : 5b14d1: 74 ed je 5b14c0 : { : *isNull = true; 0.00 : 5b14d3: 41 c6 07 01 movb $0x1,(%r15) 0.00 : 5b14d7: 31 db xor %ebx,%ebx : *isNull = fcinfo->isnull; : : pgstat_end_function_usage(&fcusage, true); : : return result; : } 0.00 : 5b14d9: 48 83 c4 48 add $0x48,%rsp 0.00 : 5b14dd: 48 89 d8 mov %rbx,%rax 0.00 : 5b14e0: 5b pop %rbx /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1998 13.64 : 5b14e1: 41 5c pop %r12 0.00 : 5b14e3: 41 5d pop %r13 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1998 4.55 : 5b14e5: 41 5e pop %r14 0.00 : 5b14e7: 41 5f pop %r15 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1998 9.09 : 5b14e9: c9 leaveq 0.00 : 5b14ea: c3 retq : : if (isDone) : *isDone = ExprSingleResult; : : /* inlined, simplified version of ExecEvalFuncArgs */ : fcinfo = &fcache->fcinfo_data; 0.00 : 5b14eb: 49 8d 5d 70 lea 0x70(%r13),%rbx : return (Datum) 0; : } : } : } : : pgstat_init_function_usage(fcinfo, &fcusage); 0.00 : 5b14ef: 4c 8d 65 90 lea -0x70(%rbp),%r12 0.00 : 5b14f3: 48 89 df mov %rbx,%rdi 0.00 : 5b14f6: 4c 89 e6 mov %r12,%rsi /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1989 9.09 : 5b14f9: e8 82 12 09 00 callq 642780 : : fcinfo->isnull = false; : result = FunctionCallInvoke(fcinfo); 0.00 : 5b14fe: 49 8b 45 70 mov 0x70(%r13),%rax /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1992 4.55 : 5b1502: 48 89 df mov %rbx,%rdi : } : } : : pgstat_init_function_usage(fcinfo, &fcusage); : : fcinfo->isnull = false; 0.00 : 5b1505: 41 c6 85 8c 00 00 00 movb $0x0,0x8c(%r13) 0.00 : 5b150c: 00 : result = FunctionCallInvoke(fcinfo); 0.00 : 5b150d: ff 10 callq *(%rax) 0.00 : 5b150f: 48 89 c3 mov %rax,%rbx : *isNull = fcinfo->isnull; 0.00 : 5b1512: 41 0f b6 85 8c 00 00 movzbl 0x8c(%r13),%eax 0.00 : 5b1519: 00 : : pgstat_end_function_usage(&fcusage, true); 0.00 : 5b151a: be 01 00 00 00 mov $0x1,%esi 0.00 : 5b151f: 4c 89 e7 mov %r12,%rdi : : pgstat_init_function_usage(fcinfo, &fcusage); : : fcinfo->isnull = false; : result = FunctionCallInvoke(fcinfo); : *isNull = fcinfo->isnull; /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1993 4.55 : 5b1522: 41 88 07 mov %al,(%r15) : : pgstat_end_function_usage(&fcusage, true); /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1995 4.55 : 5b1525: e8 a6 10 09 00 callq 6425d0 : : return result; : } /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1998 4.55 : 5b152a: eb ad jmp 5b14d9 : *isDone = ExprSingleResult; : : /* inlined, simplified version of ExecEvalFuncArgs */ : fcinfo = &fcache->fcinfo_data; : i = 0; : foreach(arg, fcache->args) 0.00 : 5b152c: 31 d2 xor %edx,%edx 0.00 : 5b152e: eb 80 jmp 5b14b0 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 72.73 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/freelist.c:242 4.55 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/freelist.c:121 4.55 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/freelist.c:155 4.55 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/freelist.c:272 4.55 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/freelist.c:231 4.55 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/freelist.c:231 4.55 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/freelist.c:231 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000677560 : : * To ensure that no one else can pin the buffer before we do, we must : * return the buffer with the buffer header spinlock still held. : */ : volatile BufferDesc * : StrategyGetBuffer(BufferAccessStrategy strategy) : { 0.00 : 677560: 55 push %rbp 0.00 : 677561: 48 89 e5 mov %rsp,%rbp 0.00 : 677564: 41 57 push %r15 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/freelist.c:121 4.55 : 677566: 41 56 push %r14 0.00 : 677568: 41 55 push %r13 0.00 : 67756a: 49 89 fd mov %rdi,%r13 0.00 : 67756d: 41 54 push %r12 0.00 : 67756f: 53 push %rbx 0.00 : 677570: 48 83 ec 08 sub $0x8,%rsp : : /* : * If given a strategy object, see whether it can select a buffer. We : * assume strategy objects don't need buffer_strategy_lock. : */ : if (strategy != NULL) 0.00 : 677574: 48 85 ff test %rdi,%rdi 0.00 : 677577: 74 65 je 6775de : { : volatile BufferDesc *buf; : Buffer bufnum; : : /* Advance to next ring slot */ : if (++strategy->current >= strategy->ring_size) 0.00 : 677579: 8b 47 08 mov 0x8(%rdi),%eax 0.00 : 67757c: 83 c0 01 add $0x1,%eax 0.00 : 67757f: 3b 47 04 cmp 0x4(%rdi),%eax 0.00 : 677582: 89 47 08 mov %eax,0x8(%rdi) 0.00 : 677585: 7c 09 jl 677590 : strategy->current = 0; 0.00 : 677587: c7 47 08 00 00 00 00 movl $0x0,0x8(%rdi) 0.00 : 67758e: 31 c0 xor %eax,%eax : /* : * If the slot hasn't been filled yet, tell the caller to allocate a new : * buffer with the normal allocation strategy. He will then fill this : * slot by calling AddBufferToRing with the new buffer. : */ : bufnum = strategy->buffers[strategy->current]; 0.00 : 677590: 48 98 cltq 0.00 : 677592: 41 8b 44 85 10 mov 0x10(%r13,%rax,4),%eax : if (bufnum == InvalidBuffer) 0.00 : 677597: 85 c0 test %eax,%eax 0.00 : 677599: 74 3e je 6775d9 : * since our own previous usage of the ring element would have left it : * there, but it might've been decremented by clock sweep since then). A : * higher usage_count indicates someone else has touched the buffer, so we : * shouldn't re-use it. : */ : buf = &BufferDescriptors[bufnum - 1]; 0.00 : 67759b: 48 98 cltq 0.00 : 67759d: 48 8d 58 ff lea -0x1(%rax),%rbx : static __inline__ int : tas(volatile slock_t *lock) : { : register slock_t _res = 1; : : __asm__ __volatile__( 0.00 : 6775a1: b8 01 00 00 00 mov $0x1,%eax 0.00 : 6775a6: 48 c1 e3 06 shl $0x6,%rbx 0.00 : 6775aa: 48 03 1d 4f 85 54 00 add 0x54854f(%rip),%rbx # bbfb00 : LockBufHdr(buf); 0.00 : 6775b1: 48 8d 7b 20 lea 0x20(%rbx),%rdi 0.00 : 6775b5: f0 86 07 lock xchg %al,(%rdi) 0.00 : 6775b8: 84 c0 test %al,%al 0.00 : 6775ba: 0f 85 b8 02 00 00 jne 677878 : if (buf->refcount == 0 && buf->usage_count <= 1) 0.00 : 6775c0: 8b 43 18 mov 0x18(%rbx),%eax 0.00 : 6775c3: 85 c0 test %eax,%eax 0.00 : 6775c5: 75 0e jne 6775d5 0.00 : 6775c7: 0f b7 43 16 movzwl 0x16(%rbx),%eax 0.00 : 6775cb: 66 83 f8 01 cmp $0x1,%ax 0.00 : 6775cf: 0f 86 92 02 00 00 jbe 677867 : { : strategy->current_was_in_ring = true; : return buf; : } : UnlockBufHdr(buf); 0.00 : 6775d5: c6 43 20 00 movb $0x0,0x20(%rbx) : : /* : * Tell caller to allocate a new buffer with the normal allocation : * strategy. He'll then replace this ring element via AddBufferToRing. : */ : strategy->current_was_in_ring = false; 0.00 : 6775d9: 41 c6 45 0c 00 movb $0x0,0xc(%r13) : /* : * We count buffer allocation requests so that the bgwriter can estimate : * the rate of buffer consumption. Note that buffers recycled by a : * strategy object are intentionally not counted here. : */ : pg_atomic_fetch_add_u32(&StrategyControl->numBufferAllocs, 1); 0.00 : 6775de: 48 8b 05 1b 5b 50 00 mov 0x505b1b(%rip),%rax # b7d100 : #define PG_HAVE_ATOMIC_FETCH_ADD_U32 : static inline uint32 : pg_atomic_fetch_add_u32_impl(volatile pg_atomic_uint32 *ptr, int32 add_) : { : uint32 res; : __asm__ __volatile__( 0.00 : 6775e5: ba 01 00 00 00 mov $0x1,%edx 0.00 : 6775ea: 48 83 c0 14 add $0x14,%rax 0.00 : 6775ee: f0 0f c1 10 lock xadd %edx,(%rax) : * Since we're not guaranteed atomic 8 byte reads we need to acquire the : * spinlock if not null to be sure we get a correct pointer. Because we : * don't want to set the latch while holding the buffer_strategy_lock we : * just grab the lock to read and reset the pointer. : */ : bgwriterLatch = LATCHPTR_ACCESS_ONCE(StrategyControl->bgwriterLatch); /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/freelist.c:155 4.55 : 6775f2: 48 8b 15 07 5b 50 00 mov 0x505b07(%rip),%rdx # b7d100 : if (bgwriterLatch) 0.00 : 6775f9: 48 83 7a 18 00 cmpq $0x0,0x18(%rdx) 0.00 : 6775fe: 74 3e je 67763e 0.00 : 677600: b8 01 00 00 00 mov $0x1,%eax 0.00 : 677605: f0 86 02 lock xchg %al,(%rdx) : { : /* we don't have guaranteed atomic 64bit reads */ : SpinLockAcquire(&StrategyControl->buffer_strategy_lock); 0.00 : 677608: 84 c0 test %al,%al 0.00 : 67760a: 0f 85 21 02 00 00 jne 677831 : bgwriterLatch = LATCHPTR_ACCESS_ONCE(StrategyControl->bgwriterLatch); 0.00 : 677610: 48 8b 05 e9 5a 50 00 mov 0x505ae9(%rip),%rax # b7d100 0.00 : 677617: 48 8b 78 18 mov 0x18(%rax),%rdi : StrategyControl->bgwriterLatch = NULL; 0.00 : 67761b: 48 c7 40 18 00 00 00 movq $0x0,0x18(%rax) 0.00 : 677622: 00 : SpinLockRelease(&StrategyControl->buffer_strategy_lock); 0.00 : 677623: 48 8b 05 d6 5a 50 00 mov 0x505ad6(%rip),%rax # b7d100 : : /* recheck */ : if (bgwriterLatch) 0.00 : 67762a: 48 85 ff test %rdi,%rdi : { : /* we don't have guaranteed atomic 64bit reads */ : SpinLockAcquire(&StrategyControl->buffer_strategy_lock); : bgwriterLatch = LATCHPTR_ACCESS_ONCE(StrategyControl->bgwriterLatch); : StrategyControl->bgwriterLatch = NULL; : SpinLockRelease(&StrategyControl->buffer_strategy_lock); 0.00 : 67762d: c6 00 00 movb $0x0,(%rax) : : /* recheck */ : if (bgwriterLatch) 0.00 : 677630: 74 05 je 677637 : SetLatch(bgwriterLatch); 0.00 : 677632: e8 89 1a fc ff callq 6390c0 0.00 : 677637: 48 8b 15 c2 5a 50 00 mov 0x505ac2(%rip),%rdx # b7d100 : * : * Note that the freeNext fields are considered to be protected by : * the buffer_strategy_lock not the individual buffer spinlocks, so it's : * OK to manipulate them without holding the spinlock. : */ : if (INT_ACCESS_ONCE(StrategyControl->firstFreeBuffer) >= 0) 0.00 : 67763e: 8b 42 08 mov 0x8(%rdx),%eax 0.00 : 677641: 85 c0 test %eax,%eax 0.00 : 677643: 0f 88 08 01 00 00 js 677751 0.00 : 677649: b8 01 00 00 00 mov $0x1,%eax 0.00 : 67764e: f0 86 02 lock xchg %al,(%rdx) : { : SpinLockAcquire(&StrategyControl->buffer_strategy_lock); 0.00 : 677651: 84 c0 test %al,%al 0.00 : 677653: 0f 85 f3 01 00 00 jne 67784c 0.00 : 677659: 41 bc 01 00 00 00 mov $0x1,%r12d 0.00 : 67765f: eb 30 jmp 677691 0.00 : 677661: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : * valid buffer in the freelist and then someone else used it before : * we got to it. It's probably impossible altogether as of 8.3, but : * we'd better check anyway.) : */ : LockBufHdr(buf); : if (buf->refcount == 0 && buf->usage_count == 0) 0.00 : 677668: 8b 43 18 mov 0x18(%rbx),%eax 0.00 : 67766b: 85 c0 test %eax,%eax 0.00 : 67766d: 75 0d jne 67767c 0.00 : 67766f: 0f b7 43 16 movzwl 0x16(%rbx),%eax 0.00 : 677673: 66 85 c0 test %ax,%ax 0.00 : 677676: 0f 84 94 00 00 00 je 677710 : { : if (strategy != NULL) : AddBufferToRing(strategy, buf); : return buf; : } : UnlockBufHdr(buf); 0.00 : 67767c: c6 43 20 00 movb $0x0,0x20(%rbx) 0.00 : 677680: 44 89 e0 mov %r12d,%eax : : /* Reacquire the lock and go around for another pass. */ : SpinLockAcquire(&StrategyControl->buffer_strategy_lock); 0.00 : 677683: 48 8b 15 76 5a 50 00 mov 0x505a76(%rip),%rdx # b7d100 0.00 : 67768a: f0 86 02 lock xchg %al,(%rdx) 0.00 : 67768d: 84 c0 test %al,%al 0.00 : 67768f: 75 5f jne 6776f0 : */ : if (INT_ACCESS_ONCE(StrategyControl->firstFreeBuffer) >= 0) : { : SpinLockAcquire(&StrategyControl->buffer_strategy_lock); : : while (StrategyControl->firstFreeBuffer >= 0) 0.00 : 677691: 48 8b 15 68 5a 50 00 mov 0x505a68(%rip),%rdx # b7d100 0.00 : 677698: 8b 42 08 mov 0x8(%rdx),%eax 0.00 : 67769b: 85 c0 test %eax,%eax 0.00 : 67769d: 0f 88 9d 00 00 00 js 677740 : { : buf = &BufferDescriptors[StrategyControl->firstFreeBuffer]; 0.00 : 6776a3: 48 63 d8 movslq %eax,%rbx 0.00 : 6776a6: 48 c1 e3 06 shl $0x6,%rbx 0.00 : 6776aa: 48 03 1d 4f 84 54 00 add 0x54844f(%rip),%rbx # bbfb00 : Assert(buf->freeNext != FREENEXT_NOT_IN_LIST); : : /* Unconditionally remove buffer from freelist */ : StrategyControl->firstFreeBuffer = buf->freeNext; 0.00 : 6776b1: 8b 43 28 mov 0x28(%rbx),%eax 0.00 : 6776b4: 89 42 08 mov %eax,0x8(%rdx) : buf->freeNext = FREENEXT_NOT_IN_LIST; 0.00 : 6776b7: c7 43 28 fe ff ff ff movl $0xfffffffe,0x28(%rbx) : : /* : * Release the lock so someone else can access the freelist (or run : * the clocksweep) while we check out this buffer. : */ : SpinLockRelease(&StrategyControl->buffer_strategy_lock); 0.00 : 6776be: 48 8b 05 3b 5a 50 00 mov 0x505a3b(%rip),%rax # b7d100 : * it; discard it and retry. (This can only happen if VACUUM put a : * valid buffer in the freelist and then someone else used it before : * we got to it. It's probably impossible altogether as of 8.3, but : * we'd better check anyway.) : */ : LockBufHdr(buf); 0.00 : 6776c5: 48 8d 7b 20 lea 0x20(%rbx),%rdi : : /* : * Release the lock so someone else can access the freelist (or run : * the clocksweep) while we check out this buffer. : */ : SpinLockRelease(&StrategyControl->buffer_strategy_lock); 0.00 : 6776c9: c6 00 00 movb $0x0,(%rax) 0.00 : 6776cc: 44 89 e0 mov %r12d,%eax 0.00 : 6776cf: f0 86 07 lock xchg %al,(%rdi) : * it; discard it and retry. (This can only happen if VACUUM put a : * valid buffer in the freelist and then someone else used it before : * we got to it. It's probably impossible altogether as of 8.3, but : * we'd better check anyway.) : */ : LockBufHdr(buf); 0.00 : 6776d2: 84 c0 test %al,%al 0.00 : 6776d4: 74 92 je 677668 0.00 : 6776d6: ba d0 00 00 00 mov $0xd0,%edx 0.00 : 6776db: be ec a0 8a 00 mov $0x8aa0ec,%esi 0.00 : 6776e0: e8 5b 89 01 00 callq 690040 0.00 : 6776e5: eb 81 jmp 677668 0.00 : 6776e7: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 6776ee: 00 00 : return buf; : } : UnlockBufHdr(buf); : : /* Reacquire the lock and go around for another pass. */ : SpinLockAcquire(&StrategyControl->buffer_strategy_lock); 0.00 : 6776f0: 48 8b 3d 09 5a 50 00 mov 0x505a09(%rip),%rdi # b7d100 0.00 : 6776f7: ba da 00 00 00 mov $0xda,%edx 0.00 : 6776fc: be ec a0 8a 00 mov $0x8aa0ec,%esi 0.00 : 677701: e8 3a 89 01 00 callq 690040 0.00 : 677706: eb 89 jmp 677691 0.00 : 677708: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 67770f: 00 : trycounter = NBuffers; : } : else : { : /* Found a usable buffer */ : if (strategy != NULL) 0.00 : 677710: 4d 85 ed test %r13,%r13 0.00 : 677713: 74 0f je 677724 : * is called with the spinlock held, it had better be quite cheap. : */ : static void : AddBufferToRing(BufferAccessStrategy strategy, volatile BufferDesc *buf) : { : strategy->buffers[strategy->current] = BufferDescriptorGetBuffer(buf); 0.00 : 677715: 8b 43 24 mov 0x24(%rbx),%eax 0.00 : 677718: 49 63 55 08 movslq 0x8(%r13),%rdx 0.00 : 67771c: 83 c0 01 add $0x1,%eax 0.00 : 67771f: 41 89 44 95 10 mov %eax,0x10(%r13,%rdx,4) : UnlockBufHdr(buf); : elog(ERROR, "no unpinned buffers available"); : } : UnlockBufHdr(buf); : } : } 0.00 : 677724: 48 83 c4 08 add $0x8,%rsp 0.00 : 677728: 48 89 d8 mov %rbx,%rax 0.00 : 67772b: 5b pop %rbx 0.00 : 67772c: 41 5c pop %r12 0.00 : 67772e: 41 5d pop %r13 0.00 : 677730: 41 5e pop %r14 0.00 : 677732: 41 5f pop %r15 0.00 : 677734: c9 leaveq /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/freelist.c:272 4.55 : 677735: c3 retq 0.00 : 677736: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 0.00 : 67773d: 00 00 00 : UnlockBufHdr(buf); : : /* Reacquire the lock and go around for another pass. */ : SpinLockAcquire(&StrategyControl->buffer_strategy_lock); : } : SpinLockRelease(&StrategyControl->buffer_strategy_lock); 0.00 : 677740: 48 8b 05 b9 59 50 00 mov 0x5059b9(%rip),%rax # b7d100 0.00 : 677747: c6 00 00 movb $0x0,(%rax) 0.00 : 67774a: 48 8b 15 af 59 50 00 mov 0x5059af(%rip),%rdx # b7d100 : } : : /* Nothing on the freelist, so run the "clock sweep" algorithm */ : trycounter = NBuffers; 0.00 : 677751: 44 8b 25 c8 13 4f 00 mov 0x4f13c8(%rip),%r12d # b68b20 0.00 : 677758: 41 be 01 00 00 00 mov $0x1,%r14d 0.00 : 67775e: 41 bf 01 00 00 00 mov $0x1,%r15d 0.00 : 677764: eb 30 jmp 677796 0.00 : 677766: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 0.00 : 67776d: 00 00 00 : * it; decrement the usage_count (unless pinned) and keep scanning. : */ : LockBufHdr(buf); : if (buf->refcount == 0) : { : if (buf->usage_count > 0) 0.00 : 677770: 0f b7 43 16 movzwl 0x16(%rbx),%eax 0.00 : 677774: 66 85 c0 test %ax,%ax 0.00 : 677777: 74 97 je 677710 : { : buf->usage_count--; 0.00 : 677779: 0f b7 43 16 movzwl 0x16(%rbx),%eax 0.00 : 67777d: 83 e8 01 sub $0x1,%eax 0.00 : 677780: 66 89 43 16 mov %ax,0x16(%rbx) : trycounter = NBuffers; 0.00 : 677784: 44 8b 25 95 13 4f 00 mov 0x4f1395(%rip),%r12d # b68b20 : * infinite loop. : */ : UnlockBufHdr(buf); : elog(ERROR, "no unpinned buffers available"); : } : UnlockBufHdr(buf); 0.00 : 67778b: c6 43 20 00 movb $0x0,0x20(%rbx) 0.00 : 67778f: 48 8b 15 6a 59 50 00 mov 0x50596a(%rip),%rdx # b7d100 : trycounter = NBuffers; : for (;;) : { : int victim; : : victim = pg_atomic_fetch_add_u32(&StrategyControl->nextVictimBuffer, 1); 0.00 : 677796: 48 8d 42 04 lea 0x4(%rdx),%rax 0.00 : 67779a: 44 89 f2 mov %r14d,%edx 0.00 : 67779d: f0 0f c1 10 lock xadd %edx,(%rax) : : buf = &BufferDescriptors[victim % NBuffers]; /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/freelist.c:231 4.55 : 6777a1: 89 d0 mov %edx,%eax 0.00 : 6777a3: c1 fa 1f sar $0x1f,%edx 0.00 : 6777a6: f7 3d 74 13 4f 00 idivl 0x4f1374(%rip) # b68b20 4.55 : 6777ac: 48 63 da movslq %edx,%rbx 4.55 : 6777af: 48 c1 e3 06 shl $0x6,%rbx 0.00 : 6777b3: 48 03 1d 46 83 54 00 add 0x548346(%rip),%rbx # bbfb00 : : if (victim % NBuffers == 0) 0.00 : 6777ba: 85 d2 test %edx,%edx 0.00 : 6777bc: 75 12 jne 6777d0 : { : pg_atomic_add_fetch_u32(&StrategyControl->completePasses, 1); 0.00 : 6777be: 48 8b 05 3b 59 50 00 mov 0x50593b(%rip),%rax # b7d100 0.00 : 6777c5: 44 89 f2 mov %r14d,%edx 0.00 : 6777c8: 48 83 c0 10 add $0x10,%rax 0.00 : 6777cc: f0 0f c1 10 lock xadd %edx,(%rax) : : /* : * If the buffer is pinned or has a nonzero usage_count, we cannot use : * it; decrement the usage_count (unless pinned) and keep scanning. : */ : LockBufHdr(buf); 0.00 : 6777d0: 48 8d 7b 20 lea 0x20(%rbx),%rdi 0.00 : 6777d4: 44 89 f8 mov %r15d,%eax 0.00 : 6777d7: f0 86 07 lock xchg %al,(%rdi) /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/freelist.c:242 72.73 : 6777da: 84 c0 test %al,%al 0.00 : 6777dc: 75 42 jne 677820 : if (buf->refcount == 0) 0.00 : 6777de: 8b 43 18 mov 0x18(%rbx),%eax 0.00 : 6777e1: 85 c0 test %eax,%eax 0.00 : 6777e3: 74 8b je 677770 : if (strategy != NULL) : AddBufferToRing(strategy, buf); : return buf; : } : } : else if (--trycounter == 0) 0.00 : 6777e5: 41 83 ec 01 sub $0x1,%r12d 0.00 : 6777e9: 75 a0 jne 67778b : * We could hope that someone will free one eventually, but it's : * probably better to fail than to risk getting stuck in an : * infinite loop. : */ : UnlockBufHdr(buf); : elog(ERROR, "no unpinned buffers available"); 0.00 : 6777eb: ba 80 a1 8a 00 mov $0x8aa180,%edx 0.00 : 6777f0: be 0c 01 00 00 mov $0x10c,%esi 0.00 : 6777f5: bf ec a0 8a 00 mov $0x8aa0ec,%edi : * so all the buffers are pinned (or were when we looked at them). : * We could hope that someone will free one eventually, but it's : * probably better to fail than to risk getting stuck in an : * infinite loop. : */ : UnlockBufHdr(buf); 0.00 : 6777fa: c6 43 20 00 movb $0x0,0x20(%rbx) : elog(ERROR, "no unpinned buffers available"); 0.00 : 6777fe: e8 1d 3c 10 00 callq 77b420 0.00 : 677803: be 0e a1 8a 00 mov $0x8aa10e,%esi 0.00 : 677808: bf 14 00 00 00 mov $0x14,%edi 0.00 : 67780d: 31 c0 xor %eax,%eax 0.00 : 67780f: e8 1c 3a 10 00 callq 77b230 0.00 : 677814: e8 b7 1c df ff callq 4694d0 0.00 : 677819: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : : /* : * If the buffer is pinned or has a nonzero usage_count, we cannot use : * it; decrement the usage_count (unless pinned) and keep scanning. : */ : LockBufHdr(buf); 0.00 : 677820: ba f2 00 00 00 mov $0xf2,%edx 0.00 : 677825: be ec a0 8a 00 mov $0x8aa0ec,%esi 0.00 : 67782a: e8 11 88 01 00 callq 690040 0.00 : 67782f: eb ad jmp 6777de : */ : bgwriterLatch = LATCHPTR_ACCESS_ONCE(StrategyControl->bgwriterLatch); : if (bgwriterLatch) : { : /* we don't have guaranteed atomic 64bit reads */ : SpinLockAcquire(&StrategyControl->buffer_strategy_lock); 0.00 : 677831: 48 8b 3d c8 58 50 00 mov 0x5058c8(%rip),%rdi # b7d100 0.00 : 677838: ba 9f 00 00 00 mov $0x9f,%edx 0.00 : 67783d: be ec a0 8a 00 mov $0x8aa0ec,%esi 0.00 : 677842: e8 f9 87 01 00 callq 690040 0.00 : 677847: e9 c4 fd ff ff jmpq 677610 : * the buffer_strategy_lock not the individual buffer spinlocks, so it's : * OK to manipulate them without holding the spinlock. : */ : if (INT_ACCESS_ONCE(StrategyControl->firstFreeBuffer) >= 0) : { : SpinLockAcquire(&StrategyControl->buffer_strategy_lock); 0.00 : 67784c: 48 8b 3d ad 58 50 00 mov 0x5058ad(%rip),%rdi # b7d100 0.00 : 677853: ba b8 00 00 00 mov $0xb8,%edx 0.00 : 677858: be ec a0 8a 00 mov $0x8aa0ec,%esi 0.00 : 67785d: e8 de 87 01 00 callq 690040 0.00 : 677862: e9 f2 fd ff ff jmpq 677659 : */ : buf = &BufferDescriptors[bufnum - 1]; : LockBufHdr(buf); : if (buf->refcount == 0 && buf->usage_count <= 1) : { : strategy->current_was_in_ring = true; 0.00 : 677867: 41 c6 45 0c 01 movb $0x1,0xc(%r13) 0.00 : 67786c: e9 b3 fe ff ff jmpq 677724 0.00 : 677871: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : * there, but it might've been decremented by clock sweep since then). A : * higher usage_count indicates someone else has touched the buffer, so we : * shouldn't re-use it. : */ : buf = &BufferDescriptors[bufnum - 1]; : LockBufHdr(buf); 0.00 : 677878: ba 20 02 00 00 mov $0x220,%edx 0.00 : 67787d: be ec a0 8a 00 mov $0x8aa0ec,%esi 0.00 : 677882: e8 b9 87 01 00 callq 690040 0.00 : 677887: e9 34 fd ff ff jmpq 6775c0 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 71.43 /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/lwlock.c:666 14.29 /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/lwlock.c:625 4.76 /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/lwlock.c:702 4.76 /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/../../../../src/include/port/atomics/arch-x86.h:202 4.76 /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/../../../../src/include/port/atomics/arch-x86.h:202 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 000000000068eec0 : : * for 'potentially_spurious'. Its value will be set to true if we possibly : * did so. The caller then has to handle that scenario. : */ : static bool : LWLockAttemptLock(LWLock* lock, LWLockMode mode, bool *potentially_spurious) : { 0.00 : 68eec0: 55 push %rbp : lwstats = get_lwlock_stats_entry(lock); : #endif : : AssertArg(mode == LW_EXCLUSIVE || mode == LW_SHARED); : : if (potentially_spurious != NULL) 0.00 : 68eec1: 48 85 d2 test %rdx,%rdx : * for 'potentially_spurious'. Its value will be set to true if we possibly : * did so. The caller then has to handle that scenario. : */ : static bool : LWLockAttemptLock(LWLock* lock, LWLockMode mode, bool *potentially_spurious) : { 0.00 : 68eec4: 48 89 e5 mov %rsp,%rbp : lwstats = get_lwlock_stats_entry(lock); : #endif : : AssertArg(mode == LW_EXCLUSIVE || mode == LW_SHARED); : : if (potentially_spurious != NULL) 0.00 : 68eec7: 74 03 je 68eecc : *potentially_spurious = false; 0.00 : 68eec9: c6 02 00 movb $0x0,(%rdx) : : if (mode == LW_EXCLUSIVE) 0.00 : 68eecc: 85 f6 test %esi,%esi 0.00 : 68eece: 75 28 jne 68eef8 : #ifndef PG_HAVE_ATOMIC_READ_U32 : #define PG_HAVE_ATOMIC_READ_U32 : static inline uint32 : pg_atomic_read_u32_impl(volatile pg_atomic_uint32 *ptr) : { : return *(&ptr->value); 0.00 : 68eed0: 8b 47 04 mov 0x4(%rdi),%eax : * First check whether the variable is free without a atomic : * operation; it's often quite a bit cheaper for contended : * locks. Doing so can cause a superflous shared-exclusive cacheline : * transition, but benchmarks show that it's still worth doing so. : */ : expected = pg_atomic_read_u32(&lock->lockcount); /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/lwlock.c:625 14.29 : 68eed3: 48 8d 57 04 lea 0x4(%rdi),%rdx : : if (expected != 0) 0.00 : 68eed7: 85 c0 test %eax,%eax 0.00 : 68eed9: 75 65 jne 68ef40 : : /* : * Perform cmpxchg and use the zero flag which it implicitly sets when : * equal to measure the success. : */ : __asm__ __volatile__( 0.00 : 68eedb: b9 00 00 00 40 mov $0x40000000,%ecx 0.00 : 68eee0: 89 f0 mov %esi,%eax 0.00 : 68eee2: f0 0f b1 0a lock cmpxchg %ecx,(%rdx) 0.00 : 68eee6: 40 0f 94 c6 sete %sil 0.00 : 68eeea: 40 84 f6 test %sil,%sil 0.00 : 68eeed: 0f 94 c1 sete %cl : return false; : } : } : : pg_unreachable(); : } 0.00 : 68eef0: 89 c8 mov %ecx,%eax /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/lwlock.c:702 4.76 : 68eef2: c9 leaveq 0.00 : 68eef3: c3 retq 0.00 : 68eef4: 0f 1f 40 00 nopl 0x0(%rax) : /* : * If the caller is interested in spurious locks, do an unlocked check : * first. This is useful if potentially spurious results have a : * noticeable cost. : */ : if (potentially_spurious != NULL && 0.00 : 68eef8: 48 85 d2 test %rdx,%rdx 0.00 : 68eefb: 48 8d 77 04 lea 0x4(%rdi),%rsi 0.00 : 68eeff: 74 0e je 68ef0f 0.00 : 68ef01: 8b 47 04 mov 0x4(%rdi),%eax 0.00 : 68ef04: 48 8d 77 04 lea 0x4(%rdi),%rsi 0.00 : 68ef08: 3d ff ff ff 3f cmp $0x3fffffff,%eax 0.00 : 68ef0d: 77 31 ja 68ef40 : #define PG_HAVE_ATOMIC_FETCH_ADD_U32 : static inline uint32 : pg_atomic_fetch_add_u32_impl(volatile pg_atomic_uint32 *ptr, int32 add_) : { : uint32 res; : __asm__ __volatile__( /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/../../../../src/include/port/atomics/arch-x86.h:202 4.76 : 68ef0f: b8 01 00 00 00 mov $0x1,%eax 4.76 : 68ef14: f0 0f c1 06 lock xadd %eax,(%rsi) : * might have to back out again if it turns out somebody else has an : * exclusive lock. : */ : oldstate = pg_atomic_fetch_add_u32(&lock->lockcount, 1); : : if (oldstate >= EXCLUSIVE_LOCK) /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/lwlock.c:666 71.43 : 68ef18: 31 c9 xor %ecx,%ecx 0.00 : 68ef1a: 3d ff ff ff 3f cmp $0x3fffffff,%eax 0.00 : 68ef1f: 76 cf jbe 68eef0 0.00 : 68ef21: b8 ff ff ff ff mov $0xffffffff,%eax 0.00 : 68ef26: f0 0f c1 06 lock xadd %eax,(%rsi) : * problems exist. : */ : pg_atomic_fetch_sub_u32(&lock->lockcount, 1); : : : if (potentially_spurious != NULL) 0.00 : 68ef2a: 48 85 d2 test %rdx,%rdx 0.00 : 68ef2d: 74 11 je 68ef40 : *potentially_spurious = true; 0.00 : 68ef2f: b9 01 00 00 00 mov $0x1,%ecx 0.00 : 68ef34: c6 02 01 movb $0x1,(%rdx) : return false; : } : } : : pg_unreachable(); : } 0.00 : 68ef37: 89 c8 mov %ecx,%eax 0.00 : 68ef39: c9 leaveq 0.00 : 68ef3a: c3 retq 0.00 : 68ef3b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : */ : pg_atomic_fetch_sub_u32(&lock->lockcount, 1); : : : if (potentially_spurious != NULL) : *potentially_spurious = true; 0.00 : 68ef40: b9 01 00 00 00 mov $0x1,%ecx : return false; : } : } : : pg_unreachable(); : } 0.00 : 68ef45: c9 leaveq 0.00 : 68ef46: 89 c8 mov %ecx,%eax Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 62.50 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:1283 31.25 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:1292 6.25 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:1313 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000674c30 : : * Returns TRUE if buffer is BM_VALID, else FALSE. This provision allows : * some callers to avoid an extra spinlock cycle. : */ : static bool : PinBuffer(volatile BufferDesc *buf, BufferAccessStrategy strategy) : { 0.00 : 674c30: 55 push %rbp : int b = buf->buf_id; : bool result; : PrivateRefCountEntry *ref; : : ref = GetPrivateRefCountEntry(b + 1, true, true); 0.00 : 674c31: ba 01 00 00 00 mov $0x1,%edx : * Returns TRUE if buffer is BM_VALID, else FALSE. This provision allows : * some callers to avoid an extra spinlock cycle. : */ : static bool : PinBuffer(volatile BufferDesc *buf, BufferAccessStrategy strategy) : { 0.00 : 674c36: 48 89 e5 mov %rsp,%rbp 0.00 : 674c39: 48 89 5d e0 mov %rbx,-0x20(%rbp) 0.00 : 674c3d: 4c 89 65 e8 mov %r12,-0x18(%rbp) 0.00 : 674c41: 48 89 fb mov %rdi,%rbx 0.00 : 674c44: 4c 89 6d f0 mov %r13,-0x10(%rbp) 0.00 : 674c48: 4c 89 75 f8 mov %r14,-0x8(%rbp) 0.00 : 674c4c: 48 83 ec 20 sub $0x20,%rsp : int b = buf->buf_id; 0.00 : 674c50: 8b 7f 24 mov 0x24(%rdi),%edi : * Returns TRUE if buffer is BM_VALID, else FALSE. This provision allows : * some callers to avoid an extra spinlock cycle. : */ : static bool : PinBuffer(volatile BufferDesc *buf, BufferAccessStrategy strategy) : { /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:1283 62.50 : 674c53: 49 89 f6 mov %rsi,%r14 : int b = buf->buf_id; : bool result; : PrivateRefCountEntry *ref; : : ref = GetPrivateRefCountEntry(b + 1, true, true); 0.00 : 674c56: be 01 00 00 00 mov $0x1,%esi : : if (ref->refcount == 0) 0.00 : 674c5b: 41 bd 01 00 00 00 mov $0x1,%r13d : { : int b = buf->buf_id; : bool result; : PrivateRefCountEntry *ref; : : ref = GetPrivateRefCountEntry(b + 1, true, true); 0.00 : 674c61: 83 c7 01 add $0x1,%edi 0.00 : 674c64: e8 b7 f8 ff ff callq 674520 0.00 : 674c69: 49 89 c4 mov %rax,%r12 : : if (ref->refcount == 0) 0.00 : 674c6c: 8b 40 04 mov 0x4(%rax),%eax 0.00 : 674c6f: 85 c0 test %eax,%eax 0.00 : 674c71: 75 43 jne 674cb6 : { : LockBufHdr(buf); 0.00 : 674c73: 48 8d 7b 20 lea 0x20(%rbx),%rdi : static __inline__ int : tas(volatile slock_t *lock) : { : register slock_t _res = 1; : : __asm__ __volatile__( 0.00 : 674c77: b8 01 00 00 00 mov $0x1,%eax 0.00 : 674c7c: f0 86 07 lock xchg %al,(%rdi) /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:1292 31.25 : 674c7f: 84 c0 test %al,%al 0.00 : 674c81: 75 6d jne 674cf0 : buf->refcount++; 0.00 : 674c83: 8b 43 18 mov 0x18(%rbx),%eax 0.00 : 674c86: 83 c0 01 add $0x1,%eax : if (strategy == NULL) 0.00 : 674c89: 4d 85 f6 test %r14,%r14 : ref = GetPrivateRefCountEntry(b + 1, true, true); : : if (ref->refcount == 0) : { : LockBufHdr(buf); : buf->refcount++; 0.00 : 674c8c: 89 43 18 mov %eax,0x18(%rbx) : if (strategy == NULL) 0.00 : 674c8f: 74 7c je 674d0d : if (buf->usage_count < BM_MAX_USAGE_COUNT) : buf->usage_count++; : } : else : { : if (buf->usage_count == 0) 0.00 : 674c91: 0f b7 43 16 movzwl 0x16(%rbx),%eax 0.00 : 674c95: 66 85 c0 test %ax,%ax 0.00 : 674c98: 75 06 jne 674ca0 : buf->usage_count = 1; 0.00 : 674c9a: 66 c7 43 16 01 00 movw $0x1,0x16(%rbx) : } : result = (buf->flags & BM_VALID) != 0; 0.00 : 674ca0: 0f b7 43 14 movzwl 0x14(%rbx),%eax 0.00 : 674ca4: d1 e8 shr %eax 0.00 : 674ca6: 41 89 c5 mov %eax,%r13d 0.00 : 674ca9: 41 83 e5 01 and $0x1,%r13d : UnlockBufHdr(buf); 0.00 : 674cad: c6 43 20 00 movb $0x0,0x20(%rbx) 0.00 : 674cb1: 41 8b 44 24 04 mov 0x4(%r12),%eax : { : /* If we previously pinned the buffer, it must surely be valid */ : result = true; : } : : ref->refcount++; 0.00 : 674cb6: 83 c0 01 add $0x1,%eax /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:1313 6.25 : 674cb9: 41 89 44 24 04 mov %eax,0x4(%r12) : Assert(ref->refcount > 0); : ResourceOwnerRememberBuffer(CurrentResourceOwner, 0.00 : 674cbe: 8b 73 24 mov 0x24(%rbx),%esi 0.00 : 674cc1: 48 8b 3d f8 5b 54 00 mov 0x545bf8(%rip),%rdi # bba8c0 0.00 : 674cc8: 83 c6 01 add $0x1,%esi 0.00 : 674ccb: e8 d0 54 12 00 callq 79a1a0 : BufferDescriptorGetBuffer(buf)); : return result; : } 0.00 : 674cd0: 44 89 e8 mov %r13d,%eax 0.00 : 674cd3: 48 8b 1c 24 mov (%rsp),%rbx 0.00 : 674cd7: 4c 8b 64 24 08 mov 0x8(%rsp),%r12 0.00 : 674cdc: 4c 8b 6c 24 10 mov 0x10(%rsp),%r13 0.00 : 674ce1: 4c 8b 74 24 18 mov 0x18(%rsp),%r14 0.00 : 674ce6: c9 leaveq 0.00 : 674ce7: c3 retq 0.00 : 674ce8: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 674cef: 00 : : ref = GetPrivateRefCountEntry(b + 1, true, true); : : if (ref->refcount == 0) : { : LockBufHdr(buf); 0.00 : 674cf0: ba 0c 05 00 00 mov $0x50c,%edx 0.00 : 674cf5: be 53 9d 8a 00 mov $0x8a9d53,%esi 0.00 : 674cfa: e8 41 b3 01 00 callq 690040 : buf->refcount++; 0.00 : 674cff: 8b 43 18 mov 0x18(%rbx),%eax 0.00 : 674d02: 83 c0 01 add $0x1,%eax : if (strategy == NULL) 0.00 : 674d05: 4d 85 f6 test %r14,%r14 : ref = GetPrivateRefCountEntry(b + 1, true, true); : : if (ref->refcount == 0) : { : LockBufHdr(buf); : buf->refcount++; 0.00 : 674d08: 89 43 18 mov %eax,0x18(%rbx) : if (strategy == NULL) 0.00 : 674d0b: 75 84 jne 674c91 : { : if (buf->usage_count < BM_MAX_USAGE_COUNT) 0.00 : 674d0d: 0f b7 43 16 movzwl 0x16(%rbx),%eax 0.00 : 674d11: 66 83 f8 04 cmp $0x4,%ax 0.00 : 674d15: 77 89 ja 674ca0 : buf->usage_count++; 0.00 : 674d17: 0f b7 43 16 movzwl 0x16(%rbx),%eax 0.00 : 674d1b: 83 c0 01 add $0x1,%eax 0.00 : 674d1e: 66 89 43 16 mov %ax,0x16(%rbx) 0.00 : 674d22: e9 79 ff ff ff jmpq 674ca0 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 40.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:456 20.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:465 13.33 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:445 6.67 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:444 6.67 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:444 6.67 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:444 6.67 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:457 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000007832f0 : : * from the data in the hash table and return true. If not, it will return : * false. : */ : bool : CHashSearch(CHashTable table, void *entry) : { /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:444 6.67 : 7832f0: 55 push %rbp 6.67 : 7832f1: 48 89 e5 mov %rsp,%rbp 6.67 : 7832f4: 41 54 push %r12 0.00 : 7832f6: 49 89 f4 mov %rsi,%r12 0.00 : 7832f9: 53 push %rbx 0.00 : 7832fa: 48 89 fb mov %rdi,%rbx 0.00 : 7832fd: 48 83 ec 20 sub $0x20,%rsp : uint32 hashcode = hash_any(entry, table->desc.key_size); 0.00 : 783301: 0f b7 77 0e movzwl 0xe(%rdi),%esi /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:445 13.33 : 783305: 4c 89 e7 mov %r12,%rdi 0.00 : 783308: e8 43 d0 d0 ff callq 490350 : CHashPtr *b = &table->bucket[bucket]; : CHashScanResult scan; : : /* Prevent garbage collection for this bucket. */ : Assert(MyProc->hazard[0] == NULL); : MyProc->hazard[0] = CHashTableGetGarbageByBucket(table, bucket); 0.00 : 78330d: 0f b6 4b 14 movzbl 0x14(%rbx),%ecx : */ : bool : CHashSearch(CHashTable table, void *entry) : { : uint32 hashcode = hash_any(entry, table->desc.key_size); : uint32 bucket = hashcode & table->bucket_mask; 0.00 : 783311: 8b 7b 10 mov 0x10(%rbx),%edi 0.00 : 783314: 21 c7 and %eax,%edi : CHashPtr *b = &table->bucket[bucket]; 0.00 : 783316: 89 fe mov %edi,%esi : CHashScanResult scan; : : /* Prevent garbage collection for this bucket. */ : Assert(MyProc->hazard[0] == NULL); : MyProc->hazard[0] = CHashTableGetGarbageByBucket(table, bucket); 0.00 : 783318: d3 ef shr %cl,%edi 0.00 : 78331a: 0f b6 4b 15 movzbl 0x15(%rbx),%ecx 0.00 : 78331e: 89 fa mov %edi,%edx : bool : CHashSearch(CHashTable table, void *entry) : { : uint32 hashcode = hash_any(entry, table->desc.key_size); : uint32 bucket = hashcode & table->bucket_mask; : CHashPtr *b = &table->bucket[bucket]; 0.00 : 783320: 48 c1 e6 02 shl $0x2,%rsi 0.00 : 783324: 48 03 73 20 add 0x20(%rbx),%rsi : CHashScanResult scan; : : /* Prevent garbage collection for this bucket. */ : Assert(MyProc->hazard[0] == NULL); : MyProc->hazard[0] = CHashTableGetGarbageByBucket(table, bucket); 0.00 : 783328: d3 ea shr %cl,%edx 0.00 : 78332a: 48 8b 0d 17 a6 3f 00 mov 0x3fa617(%rip),%rcx # b7d948 0.00 : 783331: 01 fa add %edi,%edx 0.00 : 783333: 48 c1 e2 02 shl $0x2,%rdx 0.00 : 783337: 48 03 53 28 add 0x28(%rbx),%rdx 0.00 : 78333b: 48 89 91 e8 02 00 00 mov %rdx,0x2e8(%rcx) : pg_memory_barrier(); 0.00 : 783342: f0 83 04 24 00 lock addl $0x0,(%rsp) : : /* Scan bucket and return data from any matching entry. */ : CHashBucketScan(table, b, hashcode, entry, &scan); /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:456 40.00 : 783347: 4c 8d 45 d0 lea -0x30(%rbp),%r8 0.00 : 78334b: 4c 89 e1 mov %r12,%rcx 0.00 : 78334e: 89 c2 mov %eax,%edx 0.00 : 783350: 48 89 df mov %rbx,%rdi 0.00 : 783353: e8 48 f9 ff ff callq 782ca0 : if (scan.found) /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:457 6.67 : 783358: 80 7d e8 00 cmpb $0x0,-0x18(%rbp) 0.00 : 78335c: 75 32 jne 783390 : CHashNodeGetItem(scan.target_node) + table->desc.key_size, : table->desc.element_size - table->desc.key_size); : : /* Allow garbage collection for this bucket. */ : Assert(MyProc->hazard[0] != NULL); : pg_memory_barrier(); 0.00 : 78335e: f0 83 04 24 00 lock addl $0x0,(%rsp) : MyProc->hazard[0] = NULL; /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:465 20.00 : 783363: 48 8b 05 de a5 3f 00 mov 0x3fa5de(%rip),%rax # b7d948 0.00 : 78336a: 48 c7 80 e8 02 00 00 movq $0x0,0x2e8(%rax) 0.00 : 783371: 00 00 00 00 : : CHashTableIncrementStatistic(table, CHS_Search); : if (!scan.found) 0.00 : 783375: 0f b6 45 e8 movzbl -0x18(%rbp),%eax : /* Allow garbage collection for this bucket. */ : Assert(MyProc->hazard[0] != NULL); : pg_memory_barrier(); : MyProc->hazard[0] = NULL; : : CHashTableIncrementStatistic(table, CHS_Search); 0.00 : 783379: 48 83 43 40 01 addq $0x1,0x40(%rbx) : if (!scan.found) 0.00 : 78337e: 84 c0 test %al,%al 0.00 : 783380: 75 05 jne 783387 : CHashTableIncrementStatistic(table, CHS_Search_Failed); 0.00 : 783382: 48 83 43 48 01 addq $0x1,0x48(%rbx) : return scan.found; : } 0.00 : 783387: 48 83 c4 20 add $0x20,%rsp 0.00 : 78338b: 5b pop %rbx 0.00 : 78338c: 41 5c pop %r12 0.00 : 78338e: c9 leaveq 0.00 : 78338f: c3 retq : pg_memory_barrier(); : : /* Scan bucket and return data from any matching entry. */ : CHashBucketScan(table, b, hashcode, entry, &scan); : if (scan.found) : memcpy(((char *) entry) + table->desc.key_size, 0.00 : 783390: 0f b7 43 0e movzwl 0xe(%rbx),%eax 0.00 : 783394: 0f b7 53 0c movzwl 0xc(%rbx),%edx 0.00 : 783398: 0f b7 f0 movzwl %ax,%esi 0.00 : 78339b: 29 c2 sub %eax,%edx 0.00 : 78339d: 49 8d 3c 34 lea (%r12,%rsi,1),%rdi 0.00 : 7833a1: 48 83 c6 08 add $0x8,%rsi 0.00 : 7833a5: 48 03 75 e0 add -0x20(%rbp),%rsi 0.00 : 7833a9: 48 63 d2 movslq %edx,%rdx 0.00 : 7833ac: e8 3f 68 ce ff callq 469bf0 0.00 : 7833b1: eb ab jmp 78335e Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 14.29 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:5130 14.29 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:5161 14.29 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:5169 14.29 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:5169 7.14 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:5130 7.14 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:5130 7.14 /home/Computational/mark/src/postgres-andres/src/backend/executor/../../../src/include/nodes/pg_list.h:87 7.14 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:5161 7.14 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:5163 7.14 /home/Computational/mark/src/postgres-andres/src/backend/executor/../../../src/include/utils/palloc.h:95 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000005acf10 : : * : * ---------------------------------------------------------------- : */ : bool : ExecQual(List *qual, ExprContext *econtext, bool resultForNull) : { 0.00 : 5acf10: 55 push %rbp /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:5130 7.14 : 5acf11: 48 89 e5 mov %rsp,%rbp 0.00 : 5acf14: 41 57 push %r15 0.00 : 5acf16: 41 56 push %r14 14.29 : 5acf18: 41 89 d6 mov %edx,%r14d 0.00 : 5acf1b: 41 55 push %r13 0.00 : 5acf1d: 41 54 push %r12 0.00 : 5acf1f: 49 89 f4 mov %rsi,%r12 7.14 : 5acf22: 53 push %rbx 0.00 : 5acf23: 48 83 ec 18 sub $0x18,%rsp : STATIC_IF_INLINE MemoryContext : MemoryContextSwitchTo(MemoryContext context) : { : MemoryContext old = CurrentMemoryContext; : : CurrentMemoryContext = context; 0.00 : 5acf27: 48 8b 46 28 mov 0x28(%rsi),%rax : #endif /* PG_USE_INLINE */ : #if defined(PG_USE_INLINE) || defined(PG_LIST_INCLUDE_DEFINITIONS) : STATIC_IF_INLINE ListCell * : list_head(const List *l) : { : return l ? l->head : NULL; 0.00 : 5acf2b: 48 85 ff test %rdi,%rdi : #endif /* !PG_USE_INLINE */ : #if defined(PG_USE_INLINE) || defined(MCXT_INCLUDE_DEFINITIONS) : STATIC_IF_INLINE MemoryContext : MemoryContextSwitchTo(MemoryContext context) : { : MemoryContext old = CurrentMemoryContext; 0.00 : 5acf2e: 4c 8b 3d 2b d9 60 00 mov 0x60d92b(%rip),%r15 # bba860 : : CurrentMemoryContext = context; 0.00 : 5acf35: 48 89 05 24 d9 60 00 mov %rax,0x60d924(%rip) # bba860 0.00 : 5acf3c: 74 4a je 5acf88 /home/Computational/mark/src/postgres-andres/src/backend/executor/../../../src/include/nodes/pg_list.h:87 7.14 : 5acf3e: 48 8b 5f 08 mov 0x8(%rdi),%rbx : * or more NULL subresult, with all the rest TRUE) and the caller has : * specified resultForNull = TRUE. : */ : result = true; : : foreach(l, qual) /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:5161 7.14 : 5acf42: 48 85 db test %rbx,%rbx 0.00 : 5acf45: 74 41 je 5acf88 0.00 : 5acf47: 4c 8d 6d d7 lea -0x29(%rbp),%r13 0.00 : 5acf4b: eb 11 jmp 5acf5e 0.00 : 5acf4d: 0f 1f 00 nopl (%rax) : : expr_value = ExecEvalExpr(clause, econtext, &isNull, NULL); : : if (isNull) : { : if (resultForNull == false) 0.00 : 5acf50: 45 84 f6 test %r14b,%r14b 0.00 : 5acf53: 74 24 je 5acf79 : * or more NULL subresult, with all the rest TRUE) and the caller has : * specified resultForNull = TRUE. : */ : result = true; : : foreach(l, qual) 0.00 : 5acf55: 48 8b 5b 08 mov 0x8(%rbx),%rbx 14.29 : 5acf59: 48 85 db test %rbx,%rbx 0.00 : 5acf5c: 74 2a je 5acf88 : { : ExprState *clause = (ExprState *) lfirst(l); /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:5163 7.14 : 5acf5e: 48 8b 03 mov (%rbx),%rax : Datum expr_value; : bool isNull; : : expr_value = ExecEvalExpr(clause, econtext, &isNull, NULL); 0.00 : 5acf61: 31 c9 xor %ecx,%ecx 0.00 : 5acf63: 4c 89 ea mov %r13,%rdx 0.00 : 5acf66: 4c 89 e6 mov %r12,%rsi 0.00 : 5acf69: 48 89 c7 mov %rax,%rdi 0.00 : 5acf6c: ff 50 10 callq *0x10(%rax) : : if (isNull) /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:5169 14.29 : 5acf6f: 80 7d d7 00 cmpb $0x0,-0x29(%rbp) 14.29 : 5acf73: 75 db jne 5acf50 : break; : } : } : else : { : if (!DatumGetBool(expr_value)) 0.00 : 5acf75: 84 c0 test %al,%al 0.00 : 5acf77: 75 dc jne 5acf55 : * or more NULL subresult, with all the rest TRUE) and the caller has : * specified resultForNull = TRUE. : */ : result = true; : : foreach(l, qual) 0.00 : 5acf79: 31 c0 xor %eax,%eax 0.00 : 5acf7b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 5acf80: eb 0b jmp 5acf8d 0.00 : 5acf82: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 5acf88: b8 01 00 00 00 mov $0x1,%eax /home/Computational/mark/src/postgres-andres/src/backend/executor/../../../src/include/utils/palloc.h:95 7.14 : 5acf8d: 4c 89 3d cc d8 60 00 mov %r15,0x60d8cc(%rip) # bba860 : } : : MemoryContextSwitchTo(oldContext); : : return result; : } 0.00 : 5acf94: 48 83 c4 18 add $0x18,%rsp 0.00 : 5acf98: 5b pop %rbx 0.00 : 5acf99: 41 5c pop %r12 0.00 : 5acf9b: 41 5d pop %r13 0.00 : 5acf9d: 41 5e pop %r14 0.00 : 5acf9f: 41 5f pop %r15 0.00 : 5acfa1: c9 leaveq Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 21.43 /home/Computational/mark/src/postgres-andres/src/backend/utils/fmgr/fmgr.c:1327 14.29 /home/Computational/mark/src/postgres-andres/src/backend/utils/fmgr/fmgr.c:1317 14.29 /home/Computational/mark/src/postgres-andres/src/backend/utils/fmgr/fmgr.c:1331 14.29 /home/Computational/mark/src/postgres-andres/src/backend/utils/fmgr/fmgr.c:1331 7.14 /home/Computational/mark/src/postgres-andres/src/backend/utils/fmgr/fmgr.c:1309 7.14 /home/Computational/mark/src/postgres-andres/src/backend/utils/fmgr/fmgr.c:1309 7.14 /home/Computational/mark/src/postgres-andres/src/backend/utils/fmgr/fmgr.c:1317 7.14 /home/Computational/mark/src/postgres-andres/src/backend/utils/fmgr/fmgr.c:1321 7.14 /home/Computational/mark/src/postgres-andres/src/backend/utils/fmgr/fmgr.c:1327 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 000000000077e030 : : return result; : } : : Datum : FunctionCall2Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2) : { 0.00 : 77e030: 55 push %rbp 0.00 : 77e031: 48 89 f8 mov %rdi,%rax /home/Computational/mark/src/postgres-andres/src/backend/utils/fmgr/fmgr.c:1309 7.14 : 77e034: 48 89 e5 mov %rsp,%rbp 7.14 : 77e037: 48 81 ec b0 03 00 00 sub $0x3b0,%rsp : * utils/sort/tuplesort.c! : */ : FunctionCallInfoData fcinfo; : Datum result; : : InitFunctionCallInfoData(fcinfo, flinfo, 2, collation, NULL, NULL); 0.00 : 77e03e: 48 89 bd 50 fc ff ff mov %rdi,-0x3b0(%rbp) /home/Computational/mark/src/postgres-andres/src/backend/utils/fmgr/fmgr.c:1317 7.14 : 77e045: 48 c7 85 58 fc ff ff movq $0x0,-0x3a8(%rbp) 0.00 : 77e04c: 00 00 00 00 : fcinfo.arg[0] = arg1; : fcinfo.arg[1] = arg2; : fcinfo.argnull[0] = false; : fcinfo.argnull[1] = false; : : result = FunctionCallInvoke(&fcinfo); 0.00 : 77e050: 48 8d bd 50 fc ff ff lea -0x3b0(%rbp),%rdi : * utils/sort/tuplesort.c! : */ : FunctionCallInfoData fcinfo; : Datum result; : : InitFunctionCallInfoData(fcinfo, flinfo, 2, collation, NULL, NULL); 0.00 : 77e057: 48 c7 85 60 fc ff ff movq $0x0,-0x3a0(%rbp) 0.00 : 77e05e: 00 00 00 00 0.00 : 77e062: 89 b5 68 fc ff ff mov %esi,-0x398(%rbp) 14.29 : 77e068: c6 85 6c fc ff ff 00 movb $0x0,-0x394(%rbp) 0.00 : 77e06f: 66 c7 85 6e fc ff ff movw $0x2,-0x392(%rbp) 0.00 : 77e076: 02 00 : : fcinfo.arg[0] = arg1; 0.00 : 77e078: 48 89 95 70 fc ff ff mov %rdx,-0x390(%rbp) : fcinfo.arg[1] = arg2; 0.00 : 77e07f: 48 89 8d 78 fc ff ff mov %rcx,-0x388(%rbp) : fcinfo.argnull[0] = false; /home/Computational/mark/src/postgres-andres/src/backend/utils/fmgr/fmgr.c:1321 7.14 : 77e086: c6 45 90 00 movb $0x0,-0x70(%rbp) : fcinfo.argnull[1] = false; 0.00 : 77e08a: c6 45 91 00 movb $0x0,-0x6f(%rbp) : : result = FunctionCallInvoke(&fcinfo); 0.00 : 77e08e: ff 10 callq *(%rax) : : /* Check for null result, since caller is clearly not expecting one */ : if (unlikely(fcinfo.isnull)) /home/Computational/mark/src/postgres-andres/src/backend/utils/fmgr/fmgr.c:1327 7.14 : 77e090: 80 bd 6c fc ff ff 00 cmpb $0x0,-0x394(%rbp) 21.43 : 77e097: 75 02 jne 77e09b : elog(ERROR, "function %u returned NULL", fcinfo.flinfo->fn_oid); : : return result; : } /home/Computational/mark/src/postgres-andres/src/backend/utils/fmgr/fmgr.c:1331 14.29 : 77e099: c9 leaveq 14.29 : 77e09a: c3 retq : : result = FunctionCallInvoke(&fcinfo); : : /* Check for null result, since caller is clearly not expecting one */ : if (unlikely(fcinfo.isnull)) : elog(ERROR, "function %u returned NULL", fcinfo.flinfo->fn_oid); 0.00 : 77e09b: ba 40 52 8d 00 mov $0x8d5240,%edx 0.00 : 77e0a0: be 30 05 00 00 mov $0x530,%esi 0.00 : 77e0a5: bf b3 47 8d 00 mov $0x8d47b3,%edi 0.00 : 77e0aa: e8 71 d3 ff ff callq 77b420 0.00 : 77e0af: 48 8b 85 50 fc ff ff mov -0x3b0(%rbp),%rax 0.00 : 77e0b6: be 97 4c 8d 00 mov $0x8d4c97,%esi 0.00 : 77e0bb: bf 14 00 00 00 mov $0x14,%edi 0.00 : 77e0c0: 8b 50 08 mov 0x8(%rax),%edx 0.00 : 77e0c3: 31 c0 xor %eax,%eax 0.00 : 77e0c5: e8 66 d1 ff ff callq 77b230 0.00 : 77e0ca: e8 01 b4 ce ff callq 4694d0 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 100.00 /home/Computational/mark/src/postgres-andres/src/backend/access/heap/pruneheap.c:109 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 000000000049f650 : : * OldestXmin is the cutoff XID used to distinguish whether tuples are DEAD : * or RECENTLY_DEAD (see HeapTupleSatisfiesVacuum). : */ : void : heap_page_prune_opt(Relation relation, Buffer buffer) : { 0.00 : 49f650: 55 push %rbp 0.00 : 49f651: 48 89 e5 mov %rsp,%rbp 0.00 : 49f654: 4c 89 65 e0 mov %r12,-0x20(%rbp) 0.00 : 49f658: 4c 89 75 f0 mov %r14,-0x10(%rbp) 0.00 : 49f65c: 41 89 f4 mov %esi,%r12d 0.00 : 49f65f: 48 89 5d d8 mov %rbx,-0x28(%rbp) 0.00 : 49f663: 4c 89 6d e8 mov %r13,-0x18(%rbp) 0.00 : 49f667: 49 89 fe mov %rdi,%r14 0.00 : 49f66a: 4c 89 7d f8 mov %r15,-0x8(%rbp) 0.00 : 49f66e: 48 83 ec 40 sub $0x40,%rsp : Page page = BufferGetPage(buffer); 0.00 : 49f672: 85 f6 test %esi,%esi 0.00 : 49f674: 0f 88 fe 00 00 00 js 49f778 0.00 : 49f67a: 41 8d 44 24 ff lea -0x1(%r12),%eax 0.00 : 49f67f: 48 63 d8 movslq %eax,%rbx 0.00 : 49f682: 48 c1 e3 0d shl $0xd,%rbx 0.00 : 49f686: 48 03 1d 6b 04 72 00 add 0x72046b(%rip),%rbx # bbfaf8 : /* : * We can't write WAL in recovery mode, so there's no point trying to : * clean the page. The master will likely issue a cleaning WAL record soon : * anyway, so this is no particular loss. : */ : if (RecoveryInProgress()) 0.00 : 49f68d: e8 2e de 02 00 callq 4cd4c0 0.00 : 49f692: 84 c0 test %al,%al 0.00 : 49f694: 74 1a je 49f6b0 : } : : /* And release buffer lock */ : LockBuffer(buffer, BUFFER_LOCK_UNLOCK); : } : } 0.00 : 49f696: 48 8b 5d d8 mov -0x28(%rbp),%rbx 0.00 : 49f69a: 4c 8b 65 e0 mov -0x20(%rbp),%r12 0.00 : 49f69e: 4c 8b 6d e8 mov -0x18(%rbp),%r13 0.00 : 49f6a2: 4c 8b 75 f0 mov -0x10(%rbp),%r14 0.00 : 49f6a6: 4c 8b 7d f8 mov -0x8(%rbp),%r15 0.00 : 49f6aa: c9 leaveq 0.00 : 49f6ab: c3 retq 0.00 : 49f6ac: 0f 1f 40 00 nopl 0x0(%rax) : * catalog relation or a user defined, additional, catalog relation, we : * need to use the horizon that includes slots, otherwise the data-only : * horizon can be used. Note that the toast relation of user defined : * relations are *not* considered catalog relations. : */ : if (IsCatalogRelation(relation) || 0.00 : 49f6b0: 4c 89 f7 mov %r14,%rdi 0.00 : 49f6b3: e8 28 37 04 00 callq 4e2de0 0.00 : 49f6b8: 84 c0 test %al,%al 0.00 : 49f6ba: 0f 84 d0 00 00 00 je 49f790 : RelationIsAccessibleInLogicalDecoding(relation)) : OldestXmin = RecentGlobalXmin; 0.00 : 49f6c0: 44 8b 3d 39 b2 71 00 mov 0x71b239(%rip),%r15d # bba900 : * Let's see if we really need pruning. : * : * Forget it if page is not hinted to contain something prunable that's : * older than OldestXmin. : */ : if (!PageIsPrunable(page, OldestXmin)) 0.00 : 49f6c7: 8b 7b 14 mov 0x14(%rbx),%edi /home/Computational/mark/src/postgres-andres/src/backend/access/heap/pruneheap.c:109 100.00 : 49f6ca: 85 ff test %edi,%edi 0.00 : 49f6cc: 74 c8 je 49f696 0.00 : 49f6ce: 44 89 fe mov %r15d,%esi 0.00 : 49f6d1: e8 0a 09 02 00 callq 4bffe0 0.00 : 49f6d6: 84 c0 test %al,%al 0.00 : 49f6d8: 74 bc je 49f696 : * unlikely to be *seriously* wrong, though, since reading either pd_lower : * or pd_upper is probably atomic. Avoiding taking a lock seems more : * important than sometimes getting a wrong answer in what is after all : * just a heuristic estimate. : */ : minfree = RelationGetTargetPageFreeSpace(relation, 0.00 : 49f6da: 49 8b 96 98 00 00 00 mov 0x98(%r14),%rdx 0.00 : 49f6e1: 41 bd 33 03 00 00 mov $0x333,%r13d 0.00 : 49f6e7: 48 85 d2 test %rdx,%rdx 0.00 : 49f6ea: 74 2f je 49f71b 0.00 : 49f6ec: b9 64 00 00 00 mov $0x64,%ecx 0.00 : 49f6f1: 2b 4a 04 sub 0x4(%rdx),%ecx 0.00 : 49f6f4: ba 1f 85 eb 51 mov $0x51eb851f,%edx 0.00 : 49f6f9: c1 e1 0d shl $0xd,%ecx 0.00 : 49f6fc: 89 c8 mov %ecx,%eax 0.00 : 49f6fe: c1 f9 1f sar $0x1f,%ecx 0.00 : 49f701: f7 ea imul %edx 0.00 : 49f703: b8 33 03 00 00 mov $0x333,%eax 0.00 : 49f708: c1 fa 05 sar $0x5,%edx 0.00 : 49f70b: 29 ca sub %ecx,%edx 0.00 : 49f70d: 4c 63 ea movslq %edx,%r13 0.00 : 49f710: 49 81 fd 33 03 00 00 cmp $0x333,%r13 0.00 : 49f717: 4c 0f 42 e8 cmovb %rax,%r13 : HEAP_DEFAULT_FILLFACTOR); : minfree = Max(minfree, BLCKSZ / 10); : : if (PageIsFull(page) || PageGetHeapFreeSpace(page) < minfree) 0.00 : 49f71b: f6 43 0a 02 testb $0x2,0xa(%rbx) 0.00 : 49f71f: 75 11 jne 49f732 0.00 : 49f721: 48 89 df mov %rbx,%rdi 0.00 : 49f724: e8 37 56 1f 00 callq 694d60 0.00 : 49f729: 4c 39 e8 cmp %r13,%rax 0.00 : 49f72c: 0f 83 64 ff ff ff jae 49f696 : { : /* OK, try to get exclusive buffer lock */ : if (!ConditionalLockBufferForCleanup(buffer)) 0.00 : 49f732: 44 89 e7 mov %r12d,%edi 0.00 : 49f735: e8 26 78 1d 00 callq 676f60 0.00 : 49f73a: 84 c0 test %al,%al 0.00 : 49f73c: 0f 84 54 ff ff ff je 49f696 : * Now that we have buffer lock, get accurate information about the : * page's free space, and recheck the heuristic about whether to : * prune. (We needn't recheck PageIsPrunable, since no one else could : * have pruned while we hold pin.) : */ : if (PageIsFull(page) || PageGetHeapFreeSpace(page) < minfree) 0.00 : 49f742: f6 43 0a 02 testb $0x2,0xa(%rbx) 0.00 : 49f746: 74 68 je 49f7b0 : { : TransactionId ignore = InvalidTransactionId; /* return value not : * needed */ : : /* OK to prune */ : (void) heap_page_prune(relation, buffer, OldestXmin, true, &ignore); 0.00 : 49f748: 4c 8d 45 d4 lea -0x2c(%rbp),%r8 0.00 : 49f74c: b9 01 00 00 00 mov $0x1,%ecx 0.00 : 49f751: 44 89 fa mov %r15d,%edx 0.00 : 49f754: 44 89 e6 mov %r12d,%esi 0.00 : 49f757: 4c 89 f7 mov %r14,%rdi : * prune. (We needn't recheck PageIsPrunable, since no one else could : * have pruned while we hold pin.) : */ : if (PageIsFull(page) || PageGetHeapFreeSpace(page) < minfree) : { : TransactionId ignore = InvalidTransactionId; /* return value not 0.00 : 49f75a: c7 45 d4 00 00 00 00 movl $0x0,-0x2c(%rbp) : * needed */ : : /* OK to prune */ : (void) heap_page_prune(relation, buffer, OldestXmin, true, &ignore); 0.00 : 49f761: e8 5a f4 ff ff callq 49ebc0 : } : : /* And release buffer lock */ : LockBuffer(buffer, BUFFER_LOCK_UNLOCK); 0.00 : 49f766: 31 f6 xor %esi,%esi 0.00 : 49f768: 44 89 e7 mov %r12d,%edi 0.00 : 49f76b: e8 a0 4f 1d 00 callq 674710 0.00 : 49f770: e9 21 ff ff ff jmpq 49f696 0.00 : 49f775: 0f 1f 00 nopl (%rax) : * or RECENTLY_DEAD (see HeapTupleSatisfiesVacuum). : */ : void : heap_page_prune_opt(Relation relation, Buffer buffer) : { : Page page = BufferGetPage(buffer); 0.00 : 49f778: 89 f0 mov %esi,%eax 0.00 : 49f77a: 48 8b 15 97 d9 6d 00 mov 0x6dd997(%rip),%rdx # b7d118 0.00 : 49f781: f7 d0 not %eax 0.00 : 49f783: 48 98 cltq 0.00 : 49f785: 48 8b 1c c2 mov (%rdx,%rax,8),%rbx 0.00 : 49f789: e9 ff fe ff ff jmpq 49f68d 0.00 : 49f78e: 66 90 xchg %ax,%ax : * catalog relation or a user defined, additional, catalog relation, we : * need to use the horizon that includes slots, otherwise the data-only : * horizon can be used. Note that the toast relation of user defined : * relations are *not* considered catalog relations. : */ : if (IsCatalogRelation(relation) || 0.00 : 49f790: 83 3d c5 99 6d 00 02 cmpl $0x2,0x6d99c5(%rip) # b7915c 0.00 : 49f797: 7e 0a jle 49f7a3 0.00 : 49f799: 49 8b 46 30 mov 0x30(%r14),%rax 0.00 : 49f79d: 80 78 6e 70 cmpb $0x70,0x6e(%rax) 0.00 : 49f7a1: 74 25 je 49f7c8 : RelationIsAccessibleInLogicalDecoding(relation)) : OldestXmin = RecentGlobalXmin; : else : OldestXmin = RecentGlobalDataXmin; 0.00 : 49f7a3: 44 8b 3d 5a b1 71 00 mov 0x71b15a(%rip),%r15d # bba904 0.00 : 49f7aa: e9 18 ff ff ff jmpq 49f6c7 0.00 : 49f7af: 90 nop : * Now that we have buffer lock, get accurate information about the : * page's free space, and recheck the heuristic about whether to : * prune. (We needn't recheck PageIsPrunable, since no one else could : * have pruned while we hold pin.) : */ : if (PageIsFull(page) || PageGetHeapFreeSpace(page) < minfree) 0.00 : 49f7b0: 48 89 df mov %rbx,%rdi 0.00 : 49f7b3: e8 a8 55 1f 00 callq 694d60 0.00 : 49f7b8: 4c 39 e8 cmp %r13,%rax 0.00 : 49f7bb: 73 a9 jae 49f766 0.00 : 49f7bd: 0f 1f 00 nopl (%rax) 0.00 : 49f7c0: eb 86 jmp 49f748 0.00 : 49f7c2: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : * catalog relation or a user defined, additional, catalog relation, we : * need to use the horizon that includes slots, otherwise the data-only : * horizon can be used. Note that the toast relation of user defined : * relations are *not* considered catalog relations. : */ : if (IsCatalogRelation(relation) || 0.00 : 49f7c8: 4c 89 f7 mov %r14,%rdi 0.00 : 49f7cb: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 49f7d0: e8 0b 36 04 00 callq 4e2de0 0.00 : 49f7d5: 84 c0 test %al,%al 0.00 : 49f7d7: 0f 85 e3 fe ff ff jne 49f6c0 0.00 : 49f7dd: 49 8b 86 98 00 00 00 mov 0x98(%r14),%rax 0.00 : 49f7e4: 48 85 c0 test %rax,%rax 0.00 : 49f7e7: 74 ba je 49f7a3 0.00 : 49f7e9: 80 78 48 00 cmpb $0x0,0x48(%rax) 0.00 : 49f7ed: 74 b4 je 49f7a3 0.00 : 49f7ef: 90 nop 0.00 : 49f7f0: e9 cb fe ff ff jmpq 49f6c0 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 41.67 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:673 33.33 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:664 8.33 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:664 8.33 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:673 8.33 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:694 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000005b16a0 : : * ---------------------------------------------------------------- : */ : static Datum : ExecEvalScalarVarFast(ExprState *exprstate, ExprContext *econtext, : bool *isNull, ExprDoneCond *isDone) : { /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:664 33.33 : 5b16a0: 55 push %rbp : Var *variable = (Var *) exprstate->expr; : TupleTableSlot *slot; : AttrNumber attnum; : : if (isDone) 0.00 : 5b16a1: 48 85 c9 test %rcx,%rcx : */ : static Datum : ExecEvalScalarVarFast(ExprState *exprstate, ExprContext *econtext, : bool *isNull, ExprDoneCond *isDone) : { : Var *variable = (Var *) exprstate->expr; 0.00 : 5b16a4: 4c 8b 47 08 mov 0x8(%rdi),%r8 : * ---------------------------------------------------------------- : */ : static Datum : ExecEvalScalarVarFast(ExprState *exprstate, ExprContext *econtext, : bool *isNull, ExprDoneCond *isDone) : { 8.33 : 5b16a8: 48 89 e5 mov %rsp,%rbp : Var *variable = (Var *) exprstate->expr; : TupleTableSlot *slot; : AttrNumber attnum; : : if (isDone) 0.00 : 5b16ab: 74 06 je 5b16b3 : *isDone = ExprSingleResult; 0.00 : 5b16ad: c7 01 00 00 00 00 movl $0x0,(%rcx) : : /* Get the input slot and attribute number we want */ : switch (variable->varno) 0.00 : 5b16b3: 41 8b 40 04 mov 0x4(%r8),%eax /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:673 41.67 : 5b16b7: 3d e8 fd 00 00 cmp $0xfde8,%eax 0.00 : 5b16bc: 74 1a je 5b16d8 8.33 : 5b16be: 3d e9 fd 00 00 cmp $0xfde9,%eax 0.00 : 5b16c3: 74 2b je 5b16f0 : : /* INDEX_VAR is handled by default case */ : : default: /* get the tuple from the relation being : * scanned */ : slot = econtext->ecxt_scantuple; 0.00 : 5b16c5: 48 8b 7e 08 mov 0x8(%rsi),%rdi : } : : attnum = variable->varattno; : : /* Fetch the value from the slot */ : return slot_getattr(slot, attnum, isNull); 0.00 : 5b16c9: 41 0f bf 70 08 movswl 0x8(%r8),%esi : } 0.00 : 5b16ce: c9 leaveq : } : : attnum = variable->varattno; : : /* Fetch the value from the slot */ : return slot_getattr(slot, attnum, isNull); /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:694 8.33 : 5b16cf: e9 2c dd eb ff jmpq 46f400 0.00 : 5b16d4: 0f 1f 40 00 nopl 0x0(%rax) : : /* Get the input slot and attribute number we want */ : switch (variable->varno) : { : case INNER_VAR: /* get the tuple from the inner node */ : slot = econtext->ecxt_innertuple; 0.00 : 5b16d8: 48 8b 7e 10 mov 0x10(%rsi),%rdi : } : : attnum = variable->varattno; : : /* Fetch the value from the slot */ : return slot_getattr(slot, attnum, isNull); 0.00 : 5b16dc: 41 0f bf 70 08 movswl 0x8(%r8),%esi : } 0.00 : 5b16e1: c9 leaveq : } : : attnum = variable->varattno; : : /* Fetch the value from the slot */ : return slot_getattr(slot, attnum, isNull); 0.00 : 5b16e2: e9 19 dd eb ff jmpq 46f400 0.00 : 5b16e7: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 5b16ee: 00 00 : case INNER_VAR: /* get the tuple from the inner node */ : slot = econtext->ecxt_innertuple; : break; : : case OUTER_VAR: /* get the tuple from the outer node */ : slot = econtext->ecxt_outertuple; 0.00 : 5b16f0: 48 8b 7e 18 mov 0x18(%rsi),%rdi : } : : attnum = variable->varattno; : : /* Fetch the value from the slot */ : return slot_getattr(slot, attnum, isNull); 0.00 : 5b16f4: 41 0f bf 70 08 movswl 0x8(%r8),%esi : } 0.00 : 5b16f9: c9 leaveq : } : : attnum = variable->varattno; : : /* Fetch the value from the slot */ : return slot_getattr(slot, attnum, isNull); 0.00 : 5b16fa: e9 01 dd eb ff jmpq 46f400 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 20.00 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:331 10.00 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:283 10.00 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:295 10.00 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:294 10.00 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:325 10.00 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:325 10.00 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:329 10.00 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:344 10.00 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:344 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000004ace60 <_bt_binsrch>: : _bt_binsrch(Relation rel, : Buffer buf, : int keysz, : ScanKey scankey, : bool nextkey) : { 0.00 : 4ace60: 55 push %rbp /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:283 10.00 : 4ace61: 48 89 e5 mov %rsp,%rbp 0.00 : 4ace64: 41 57 push %r15 0.00 : 4ace66: 41 56 push %r14 0.00 : 4ace68: 41 55 push %r13 0.00 : 4ace6a: 41 54 push %r12 0.00 : 4ace6c: 53 push %rbx 0.00 : 4ace6d: 48 83 ec 28 sub $0x28,%rsp : OffsetNumber low, : high; : int32 result, : cmpval; : : page = BufferGetPage(buf); 0.00 : 4ace71: 85 f6 test %esi,%esi : _bt_binsrch(Relation rel, : Buffer buf, : int keysz, : ScanKey scankey, : bool nextkey) : { 0.00 : 4ace73: 48 89 4d b0 mov %rcx,-0x50(%rbp) 0.00 : 4ace77: 48 89 7d c0 mov %rdi,-0x40(%rbp) 0.00 : 4ace7b: 89 55 bc mov %edx,-0x44(%rbp) 0.00 : 4ace7e: 44 89 c1 mov %r8d,%ecx : OffsetNumber low, : high; : int32 result, : cmpval; : : page = BufferGetPage(buf); 0.00 : 4ace81: 0f 88 c9 00 00 00 js 4acf50 <_bt_binsrch+0xf0> 0.00 : 4ace87: 8d 46 ff lea -0x1(%rsi),%eax 0.00 : 4ace8a: 4c 63 f0 movslq %eax,%r14 0.00 : 4ace8d: 49 c1 e6 0d shl $0xd,%r14 0.00 : 4ace91: 4c 03 35 60 2c 71 00 add 0x712c60(%rip),%r14 # bbfaf8 : opaque = (BTPageOpaque) PageGetSpecialPointer(page); 0.00 : 4ace98: 41 0f b7 46 10 movzwl 0x10(%r14),%eax 0.00 : 4ace9d: 49 8d 04 06 lea (%r14,%rax,1),%rax 0.00 : 4acea1: 48 89 45 c8 mov %rax,-0x38(%rbp) : : low = P_FIRSTDATAKEY(opaque); 0.00 : 4acea5: 83 78 04 01 cmpl $0x1,0x4(%rax) : high = PageGetMaxOffsetNumber(page); /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:295 10.00 : 4acea9: 41 0f b7 46 0c movzwl 0xc(%r14),%eax : cmpval; : : page = BufferGetPage(buf); : opaque = (BTPageOpaque) PageGetSpecialPointer(page); : : low = P_FIRSTDATAKEY(opaque); 0.00 : 4aceae: 45 19 ed sbb %r13d,%r13d /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:294 10.00 : 4aceb1: 41 83 c5 02 add $0x2,%r13d : high = PageGetMaxOffsetNumber(page); 0.00 : 4aceb5: 66 83 f8 18 cmp $0x18,%ax 0.00 : 4aceb9: 0f 86 7f 00 00 00 jbe 4acf3e <_bt_binsrch+0xde> 0.00 : 4acebf: 0f b7 c0 movzwl %ax,%eax 0.00 : 4acec2: 48 83 e8 18 sub $0x18,%rax 0.00 : 4acec6: 48 c1 e8 02 shr $0x2,%rax : * this covers two cases: the page is really empty (no keys), or it : * contains only a high key. The latter case is possible after vacuuming. : * This can never happen on an internal page, however, since they are : * never empty (an internal page must have children). : */ : if (high < low) 0.00 : 4aceca: 66 41 39 c5 cmp %ax,%r13w 0.00 : 4acece: 77 6e ja 4acf3e <_bt_binsrch+0xde> : * For nextkey=true (cmpval=0), the loop invariant is: all slots before : * 'low' are <= scan key, all slots at or after 'high' are > scan key. : * : * We can fall out when high == low. : */ : high++; /* establish the loop invariant for high */ 0.00 : 4aced0: 44 8d 60 01 lea 0x1(%rax),%r12d : : cmpval = nextkey ? 0 : 1; /* select comparison value */ 0.00 : 4aced4: 31 c0 xor %eax,%eax 0.00 : 4aced6: 84 c9 test %cl,%cl 0.00 : 4aced8: 0f 94 c0 sete %al 0.00 : 4acedb: 89 45 d4 mov %eax,-0x2c(%rbp) : : while (high > low) 0.00 : 4acede: 66 45 39 e5 cmp %r12w,%r13w 0.00 : 4acee2: 73 4c jae 4acf30 <_bt_binsrch+0xd0> 0.00 : 4acee4: 45 0f b7 fd movzwl %r13w,%r15d 0.00 : 4acee8: eb 0f jmp 4acef9 <_bt_binsrch+0x99> 0.00 : 4aceea: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 4acef0: 66 44 39 eb cmp %r13w,%bx 0.00 : 4acef4: 41 89 dc mov %ebx,%r12d 0.00 : 4acef7: 76 37 jbe 4acf30 <_bt_binsrch+0xd0> : { : OffsetNumber mid = low + ((high - low) / 2); 0.00 : 4acef9: 41 0f b7 c4 movzwl %r12w,%eax : : /* We have low <= mid < high, so mid points at a real slot */ : : result = _bt_compare(rel, keysz, scankey, page, mid); 0.00 : 4acefd: 8b 75 bc mov -0x44(%rbp),%esi 0.00 : 4acf00: 48 8b 7d c0 mov -0x40(%rbp),%rdi : : cmpval = nextkey ? 0 : 1; /* select comparison value */ : : while (high > low) : { : OffsetNumber mid = low + ((high - low) / 2); /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:325 10.00 : 4acf04: 44 29 f8 sub %r15d,%eax : : /* We have low <= mid < high, so mid points at a real slot */ : : result = _bt_compare(rel, keysz, scankey, page, mid); 0.00 : 4acf07: 4c 89 f1 mov %r14,%rcx : : cmpval = nextkey ? 0 : 1; /* select comparison value */ : : while (high > low) : { : OffsetNumber mid = low + ((high - low) / 2); 10.00 : 4acf0a: 89 c2 mov %eax,%edx 0.00 : 4acf0c: c1 ea 1f shr $0x1f,%edx 0.00 : 4acf0f: 01 c2 add %eax,%edx 0.00 : 4acf11: d1 fa sar %edx 0.00 : 4acf13: 41 8d 5c 15 00 lea 0x0(%r13,%rdx,1),%ebx : : /* We have low <= mid < high, so mid points at a real slot */ : : result = _bt_compare(rel, keysz, scankey, page, mid); 0.00 : 4acf18: 48 8b 55 b0 mov -0x50(%rbp),%rdx 0.00 : 4acf1c: 44 0f b7 c3 movzwl %bx,%r8d /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:329 10.00 : 4acf20: e8 2b fd ff ff callq 4acc50 <_bt_compare> : : if (result >= cmpval) /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:331 20.00 : 4acf25: 39 45 d4 cmp %eax,-0x2c(%rbp) 0.00 : 4acf28: 7f c6 jg 4acef0 <_bt_binsrch+0x90> : low = mid + 1; 0.00 : 4acf2a: 44 8d 6b 01 lea 0x1(%rbx),%r13d 0.00 : 4acf2e: eb ae jmp 4acede <_bt_binsrch+0x7e> : * past the last slot on the page. : * : * On a leaf page, we always return the first key >= scan key (resp. > : * scan key), which could be the last slot + 1. : */ : if (P_ISLEAF(opaque)) /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:344 10.00 : 4acf30: 48 8b 45 c8 mov -0x38(%rbp),%rax 10.00 : 4acf34: f6 40 0c 01 testb $0x1,0xc(%rax) 0.00 : 4acf38: 75 04 jne 4acf3e <_bt_binsrch+0xde> : * On a non-leaf page, return the last key < scan key (resp. <= scan key). : * There must be one if _bt_compare() is playing by the rules. : */ : Assert(low > P_FIRSTDATAKEY(opaque)); : : return OffsetNumberPrev(low); 0.00 : 4acf3a: 41 83 ed 01 sub $0x1,%r13d : } 0.00 : 4acf3e: 48 83 c4 28 add $0x28,%rsp 0.00 : 4acf42: 44 89 e8 mov %r13d,%eax 0.00 : 4acf45: 5b pop %rbx 0.00 : 4acf46: 41 5c pop %r12 0.00 : 4acf48: 41 5d pop %r13 0.00 : 4acf4a: 41 5e pop %r14 0.00 : 4acf4c: 41 5f pop %r15 0.00 : 4acf4e: c9 leaveq 0.00 : 4acf4f: c3 retq : OffsetNumber low, : high; : int32 result, : cmpval; : : page = BufferGetPage(buf); 0.00 : 4acf50: 48 8b 05 c1 01 6d 00 mov 0x6d01c1(%rip),%rax # b7d118 0.00 : 4acf57: f7 d6 not %esi 0.00 : 4acf59: 48 63 d6 movslq %esi,%rdx 0.00 : 4acf5c: 4c 8b 34 d0 mov (%rax,%rdx,8),%r14 0.00 : 4acf60: e9 33 ff ff ff jmpq 4ace98 <_bt_binsrch+0x38> Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 20.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/execTuples.c:334 10.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/execTuples.c:347 10.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/execTuples.c:334 10.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/execTuples.c:355 10.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/execTuples.c:359 10.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/execTuples.c:383 10.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/execTuples.c:383 10.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/execTuples.c:379 10.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/execTuples.c:379 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000005b4480 : : TupleTableSlot * : ExecStoreTuple(HeapTuple tuple, : TupleTableSlot *slot, : Buffer buffer, : bool shouldFree) : { 0.00 : 5b4480: 55 push %rbp 0.00 : 5b4481: 48 89 e5 mov %rsp,%rbp 0.00 : 5b4484: 48 89 5d e0 mov %rbx,-0x20(%rbp) 0.00 : 5b4488: 4c 89 65 e8 mov %r12,-0x18(%rbp) 0.00 : 5b448c: 48 89 f3 mov %rsi,%rbx 0.00 : 5b448f: 4c 89 6d f0 mov %r13,-0x10(%rbp) 0.00 : 5b4493: 4c 89 75 f8 mov %r14,-0x8(%rbp) /home/Computational/mark/src/postgres-andres/src/backend/executor/execTuples.c:334 20.00 : 5b4497: 48 83 ec 20 sub $0x20,%rsp : Assert(BufferIsValid(buffer) ? (!shouldFree) : true); : : /* : * Free any old physical tuple belonging to the slot. : */ : if (slot->tts_shouldFree) /home/Computational/mark/src/postgres-andres/src/backend/executor/execTuples.c:347 10.00 : 5b449b: 80 7e 05 00 cmpb $0x0,0x5(%rsi) : TupleTableSlot * : ExecStoreTuple(HeapTuple tuple, : TupleTableSlot *slot, : Buffer buffer, : bool shouldFree) : { /home/Computational/mark/src/postgres-andres/src/backend/executor/execTuples.c:334 10.00 : 5b449f: 49 89 fe mov %rdi,%r14 0.00 : 5b44a2: 41 89 d4 mov %edx,%r12d 0.00 : 5b44a5: 41 89 cd mov %ecx,%r13d : Assert(BufferIsValid(buffer) ? (!shouldFree) : true); : : /* : * Free any old physical tuple belonging to the slot. : */ : if (slot->tts_shouldFree) 0.00 : 5b44a8: 0f 85 92 00 00 00 jne 5b4540 : heap_freetuple(slot->tts_tuple); : if (slot->tts_shouldFreeMin) 0.00 : 5b44ae: 80 7b 06 00 cmpb $0x0,0x6(%rbx) 0.00 : 5b44b2: 75 74 jne 5b4528 : * This is coded to optimize the case where the slot previously held a : * tuple on the same disk page: in that case releasing and re-acquiring : * the pin is a waste of cycles. This is a common situation during : * seqscans, so it's worth troubling over. : */ : if (slot->tts_buffer != buffer) 0.00 : 5b44b4: 8b 7b 20 mov 0x20(%rbx),%edi : heap_free_minimal_tuple(slot->tts_mintuple); : : /* : * Store the new tuple into the specified slot. : */ : slot->tts_isempty = false; /home/Computational/mark/src/postgres-andres/src/backend/executor/execTuples.c:355 10.00 : 5b44b7: c6 43 04 00 movb $0x0,0x4(%rbx) : slot->tts_shouldFree = shouldFree; 0.00 : 5b44bb: 44 88 6b 05 mov %r13b,0x5(%rbx) : slot->tts_shouldFreeMin = false; 0.00 : 5b44bf: c6 43 06 00 movb $0x0,0x6(%rbx) : slot->tts_tuple = tuple; 0.00 : 5b44c3: 4c 89 73 08 mov %r14,0x8(%rbx) : slot->tts_mintuple = NULL; /home/Computational/mark/src/postgres-andres/src/backend/executor/execTuples.c:359 10.00 : 5b44c7: 48 c7 43 38 00 00 00 movq $0x0,0x38(%rbx) 0.00 : 5b44ce: 00 : * This is coded to optimize the case where the slot previously held a : * tuple on the same disk page: in that case releasing and re-acquiring : * the pin is a waste of cycles. This is a common situation during : * seqscans, so it's worth troubling over. : */ : if (slot->tts_buffer != buffer) 0.00 : 5b44cf: 44 39 e7 cmp %r12d,%edi : slot->tts_shouldFreeMin = false; : slot->tts_tuple = tuple; : slot->tts_mintuple = NULL; : : /* Mark extracted state invalid */ : slot->tts_nvalid = 0; 0.00 : 5b44d2: c7 43 24 00 00 00 00 movl $0x0,0x24(%rbx) : * This is coded to optimize the case where the slot previously held a : * tuple on the same disk page: in that case releasing and re-acquiring : * the pin is a waste of cycles. This is a common situation during : * seqscans, so it's worth troubling over. : */ : if (slot->tts_buffer != buffer) 0.00 : 5b44d9: 74 0d je 5b44e8 : { : if (BufferIsValid(slot->tts_buffer)) 0.00 : 5b44db: 85 ff test %edi,%edi 0.00 : 5b44dd: 75 31 jne 5b4510 : ReleaseBuffer(slot->tts_buffer); : slot->tts_buffer = buffer; : if (BufferIsValid(buffer)) 0.00 : 5b44df: 45 85 e4 test %r12d,%r12d : */ : if (slot->tts_buffer != buffer) : { : if (BufferIsValid(slot->tts_buffer)) : ReleaseBuffer(slot->tts_buffer); : slot->tts_buffer = buffer; 0.00 : 5b44e2: 44 89 63 20 mov %r12d,0x20(%rbx) : if (BufferIsValid(buffer)) 0.00 : 5b44e6: 75 18 jne 5b4500 : IncrBufferRefCount(buffer); : } : : return slot; : } /home/Computational/mark/src/postgres-andres/src/backend/executor/execTuples.c:383 10.00 : 5b44e8: 48 89 d8 mov %rbx,%rax 0.00 : 5b44eb: 4c 8b 64 24 08 mov 0x8(%rsp),%r12 0.00 : 5b44f0: 48 8b 1c 24 mov (%rsp),%rbx 10.00 : 5b44f4: 4c 8b 6c 24 10 mov 0x10(%rsp),%r13 0.00 : 5b44f9: 4c 8b 74 24 18 mov 0x18(%rsp),%r14 0.00 : 5b44fe: c9 leaveq 0.00 : 5b44ff: c3 retq : { : if (BufferIsValid(slot->tts_buffer)) : ReleaseBuffer(slot->tts_buffer); : slot->tts_buffer = buffer; : if (BufferIsValid(buffer)) : IncrBufferRefCount(buffer); /home/Computational/mark/src/postgres-andres/src/backend/executor/execTuples.c:379 10.00 : 5b4500: 44 89 e7 mov %r12d,%edi 0.00 : 5b4503: e8 58 06 0c 00 callq 674b60 10.00 : 5b4508: eb de jmp 5b44e8 0.00 : 5b450a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : * seqscans, so it's worth troubling over. : */ : if (slot->tts_buffer != buffer) : { : if (BufferIsValid(slot->tts_buffer)) : ReleaseBuffer(slot->tts_buffer); 0.00 : 5b4510: e8 4b 09 0c 00 callq 674e60 : slot->tts_buffer = buffer; : if (BufferIsValid(buffer)) 0.00 : 5b4515: 45 85 e4 test %r12d,%r12d : */ : if (slot->tts_buffer != buffer) : { : if (BufferIsValid(slot->tts_buffer)) : ReleaseBuffer(slot->tts_buffer); : slot->tts_buffer = buffer; 0.00 : 5b4518: 44 89 63 20 mov %r12d,0x20(%rbx) 0.00 : 5b451c: 0f 1f 40 00 nopl 0x0(%rax) : if (BufferIsValid(buffer)) 0.00 : 5b4520: 74 c6 je 5b44e8 0.00 : 5b4522: eb dc jmp 5b4500 0.00 : 5b4524: 0f 1f 40 00 nopl 0x0(%rax) : * Free any old physical tuple belonging to the slot. : */ : if (slot->tts_shouldFree) : heap_freetuple(slot->tts_tuple); : if (slot->tts_shouldFreeMin) : heap_free_minimal_tuple(slot->tts_mintuple); 0.00 : 5b4528: 48 8b 7b 38 mov 0x38(%rbx),%rdi 0.00 : 5b452c: 0f 1f 40 00 nopl 0x0(%rax) 0.00 : 5b4530: e8 7b a7 eb ff callq 46ecb0 0.00 : 5b4535: e9 7a ff ff ff jmpq 5b44b4 0.00 : 5b453a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : : /* : * Free any old physical tuple belonging to the slot. : */ : if (slot->tts_shouldFree) : heap_freetuple(slot->tts_tuple); 0.00 : 5b4540: 48 8b 7e 08 mov 0x8(%rsi),%rdi 0.00 : 5b4544: e8 77 a7 eb ff callq 46ecc0 0.00 : 5b4549: e9 60 ff ff ff jmpq 5b44ae Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 20.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:735 10.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:573 10.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:573 10.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:573 10.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:595 10.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:824 10.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:842 10.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:1039 10.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:974 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000675ca0 : : */ : static Buffer : ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, : BlockNumber blockNum, ReadBufferMode mode, : BufferAccessStrategy strategy, bool *hit) : { 0.00 : 675ca0: 55 push %rbp 0.00 : 675ca1: 48 89 e5 mov %rsp,%rbp /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:573 10.00 : 675ca4: 41 57 push %r15 10.00 : 675ca6: 4d 89 cf mov %r9,%r15 0.00 : 675ca9: 41 56 push %r14 0.00 : 675cab: 41 55 push %r13 0.00 : 675cad: 41 54 push %r12 0.00 : 675caf: 53 push %rbx 10.00 : 675cb0: 48 83 ec 68 sub $0x68,%rsp 0.00 : 675cb4: 48 89 7d 80 mov %rdi,-0x80(%rbp) 0.00 : 675cb8: 89 95 78 ff ff ff mov %edx,-0x88(%rbp) 0.00 : 675cbe: 89 8d 74 ff ff ff mov %ecx,-0x8c(%rbp) 0.00 : 675cc4: 44 89 85 70 ff ff ff mov %r8d,-0x90(%rbp) 0.00 : 675ccb: 40 88 b5 7f ff ff ff mov %sil,-0x81(%rbp) : volatile BufferDesc *bufHdr; : Block bufBlock; : bool found; : bool isExtend; : bool isLocalBuf = SmgrIsTemp(smgr); 0.00 : 675cd2: 83 7f 0c ff cmpl $0xffffffff,0xc(%rdi) : : *hit = false; 0.00 : 675cd6: 48 8b 45 10 mov 0x10(%rbp),%rax : { : volatile BufferDesc *bufHdr; : Block bufBlock; : bool found; : bool isExtend; : bool isLocalBuf = SmgrIsTemp(smgr); 0.00 : 675cda: 0f 95 45 8f setne -0x71(%rbp) : : *hit = false; 0.00 : 675cde: c6 00 00 movb $0x0,(%rax) : : /* Make sure we will have room to remember the buffer pin */ : ResourceOwnerEnlargeBuffers(CurrentResourceOwner); 0.00 : 675ce1: 48 8b 3d d8 4b 54 00 mov 0x544bd8(%rip),%rdi # bba8c0 0.00 : 675ce8: e8 83 51 12 00 callq 79ae70 : : isExtend = (blockNum == P_NEW); 0.00 : 675ced: 83 bd 74 ff ff ff ff cmpl $0xffffffff,-0x8c(%rbp) : smgr->smgr_rnode.node.relNode, : smgr->smgr_rnode.backend, : isExtend); : : /* Substitute proper block number if caller asked for P_NEW */ : if (isExtend) 0.00 : 675cf4: 0f 94 45 8e sete -0x72(%rbp) /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:595 10.00 : 675cf8: 0f 84 2f 05 00 00 je 67622d : blockNum = smgrnblocks(smgr, forkNum); : : if (isLocalBuf) 0.00 : 675cfe: 80 7d 8f 00 cmpb $0x0,-0x71(%rbp) 0.00 : 675d02: 74 7b je 675d7f : { : bufHdr = LocalBufferAlloc(smgr, forkNum, blockNum, &found); 0.00 : 675d04: 8b 95 74 ff ff ff mov -0x8c(%rbp),%edx 0.00 : 675d0a: 8b b5 78 ff ff ff mov -0x88(%rbp),%esi 0.00 : 675d10: 48 8d 4d cf lea -0x31(%rbp),%rcx 0.00 : 675d14: 48 8b 7d 80 mov -0x80(%rbp),%rdi 0.00 : 675d18: e8 c3 20 00 00 callq 677de0 : if (found) 0.00 : 675d1d: 80 7d cf 00 cmpb $0x0,-0x31(%rbp) : if (isExtend) : blockNum = smgrnblocks(smgr, forkNum); : : if (isLocalBuf) : { : bufHdr = LocalBufferAlloc(smgr, forkNum, blockNum, &found); 0.00 : 675d21: 49 89 c6 mov %rax,%r14 : if (found) 0.00 : 675d24: 0f 85 1b 04 00 00 jne 676145 : pgBufferUsage.local_blks_hit++; : else : pgBufferUsage.local_blks_read++; 0.00 : 675d2a: 48 83 05 56 9a 54 00 addq $0x1,0x549a56(%rip) # bbf788 0.00 : 675d31: 01 : } : : /* At this point we do NOT hold any locks. */ : : /* if it was already in the buffer pool, we're done */ : if (found) 0.00 : 675d32: 80 7d cf 00 cmpb $0x0,-0x31(%rbp) 0.00 : 675d36: 0f 84 fa 00 00 00 je 675e36 : { : if (!isExtend) 0.00 : 675d3c: 80 7d 8e 00 cmpb $0x0,-0x72(%rbp) 0.00 : 675d40: 0f 85 01 05 00 00 jne 676247 : { : /* Just need to update stats before we exit */ : *hit = true; 0.00 : 675d46: 48 8b 45 10 mov 0x10(%rbp),%rax 0.00 : 675d4a: c6 00 01 movb $0x1,(%rax) : VacuumPageHit++; 0.00 : 675d4d: 83 05 80 43 54 00 01 addl $0x1,0x544380(%rip) # bba0d4 : : if (VacuumCostActive) 0.00 : 675d54: 80 3d 89 43 54 00 00 cmpb $0x0,0x544389(%rip) # bba0e4 0.00 : 675d5b: 74 0c je 675d69 : VacuumCostBalance += VacuumCostPageHit; 0.00 : 675d5d: 8b 05 c9 2d 4f 00 mov 0x4f2dc9(%rip),%eax # b68b2c 0.00 : 675d63: 01 05 77 43 54 00 add %eax,0x544377(%rip) # bba0e0 : smgr->smgr_rnode.node.relNode, : smgr->smgr_rnode.backend, : isExtend, : found); : : return BufferDescriptorGetBuffer(bufHdr); 0.00 : 675d69: 41 8b 46 24 mov 0x24(%r14),%eax : } 0.00 : 675d6d: 48 83 c4 68 add $0x68,%rsp 0.00 : 675d71: 5b pop %rbx 0.00 : 675d72: 41 5c pop %r12 0.00 : 675d74: 41 5d pop %r13 0.00 : 675d76: 41 5e pop %r14 : smgr->smgr_rnode.node.relNode, : smgr->smgr_rnode.backend, : isExtend, : found); : : return BufferDescriptorGetBuffer(bufHdr); 0.00 : 675d78: 83 c0 01 add $0x1,%eax : } 0.00 : 675d7b: 41 5f pop %r15 0.00 : 675d7d: c9 leaveq 0.00 : 675d7e: c3 retq : int buf_id; : volatile BufferDesc *buf; : bool valid; : : /* create a tag so we can lookup the buffer */ : INIT_BUFFERTAG(newTag, smgr->smgr_rnode.node, forkNum, blockNum); 0.00 : 675d7f: 48 8b 55 80 mov -0x80(%rbp),%rdx /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:824 10.00 : 675d83: 48 8b 02 mov (%rdx),%rax 0.00 : 675d86: 48 89 45 b0 mov %rax,-0x50(%rbp) 0.00 : 675d8a: 8b 42 08 mov 0x8(%rdx),%eax 0.00 : 675d8d: 8b 95 74 ff ff ff mov -0x8c(%rbp),%edx 0.00 : 675d93: 89 45 b8 mov %eax,-0x48(%rbp) 0.00 : 675d96: 8b 85 78 ff ff ff mov -0x88(%rbp),%eax 0.00 : 675d9c: 89 55 c0 mov %edx,-0x40(%rbp) 0.00 : 675d9f: 89 45 bc mov %eax,-0x44(%rbp) 0.00 : 675da2: eb 11 jmp 675db5 0.00 : 675da4: 0f 1f 40 00 nopl 0x0(%rax) : valid = PinBuffer(foundbuf, strategy); : : /* Check whether someone recycled the buffer before we pinned it. */ : if (!BUFFERTAGS_EQUAL(newTag, foundbuf->tag)) : { : UnpinBuffer(foundbuf, true); 0.00 : 675da8: be 01 00 00 00 mov $0x1,%esi 0.00 : 675dad: 48 89 df mov %rbx,%rdi 0.00 : 675db0: e8 7b ef ff ff callq 674d30 : /* create a tag so we can lookup the buffer */ : INIT_BUFFERTAG(newTag, smgr->smgr_rnode.node, forkNum, blockNum); : : /* see if the block is in the buffer pool already */ : start: : buf_id = BufTableLookup(&newTag); 0.00 : 675db5: 48 8d 7d b0 lea -0x50(%rbp),%rdi 0.00 : 675db9: e8 22 e0 ff ff callq 673de0 : if (buf_id >= 0) 0.00 : 675dbe: 85 c0 test %eax,%eax 0.00 : 675dc0: 0f 88 bb 01 00 00 js 675f81 : : /* : * Found it. Now, pin the buffer so no one can steal it from the : * buffer pool. : */ : foundbuf = &BufferDescriptors[buf_id]; 0.00 : 675dc6: 48 63 d8 movslq %eax,%rbx : : valid = PinBuffer(foundbuf, strategy); 0.00 : 675dc9: 4c 89 fe mov %r15,%rsi : : /* : * Found it. Now, pin the buffer so no one can steal it from the : * buffer pool. : */ : foundbuf = &BufferDescriptors[buf_id]; 0.00 : 675dcc: 48 c1 e3 06 shl $0x6,%rbx 0.00 : 675dd0: 48 03 1d 29 9d 54 00 add 0x549d29(%rip),%rbx # bbfb00 : : valid = PinBuffer(foundbuf, strategy); 0.00 : 675dd7: 48 89 df mov %rbx,%rdi 0.00 : 675dda: 49 89 dc mov %rbx,%r12 0.00 : 675ddd: e8 4e ee ff ff callq 674c30 0.00 : 675de2: 89 c2 mov %eax,%edx : : /* Check whether someone recycled the buffer before we pinned it. */ : if (!BUFFERTAGS_EQUAL(newTag, foundbuf->tag)) 0.00 : 675de4: 8b 45 b8 mov -0x48(%rbp),%eax 0.00 : 675de7: 3b 43 08 cmp 0x8(%rbx),%eax 0.00 : 675dea: 75 bc jne 675da8 0.00 : 675dec: 8b 45 b4 mov -0x4c(%rbp),%eax 0.00 : 675def: 3b 43 04 cmp 0x4(%rbx),%eax 0.00 : 675df2: 75 b4 jne 675da8 0.00 : 675df4: 8b 45 b0 mov -0x50(%rbp),%eax 0.00 : 675df7: 3b 03 cmp (%rbx),%eax 0.00 : 675df9: 75 ad jne 675da8 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:842 10.00 : 675dfb: 8b 45 c0 mov -0x40(%rbp),%eax 0.00 : 675dfe: 3b 43 10 cmp 0x10(%rbx),%eax 0.00 : 675e01: 75 a5 jne 675da8 0.00 : 675e03: 8b 45 bc mov -0x44(%rbp),%eax 0.00 : 675e06: 3b 43 0c cmp 0xc(%rbx),%eax 0.00 : 675e09: 75 9d jne 675da8 : } : : *foundPtr = TRUE; : : /* Check to see if the correct data has been loaded into the buffer. */ : if (!valid) 0.00 : 675e0b: 84 d2 test %dl,%dl : { : UnpinBuffer(foundbuf, true); : goto start; : } : : *foundPtr = TRUE; 0.00 : 675e0d: c6 45 cf 01 movb $0x1,-0x31(%rbp) : : /* Check to see if the correct data has been loaded into the buffer. */ : if (!valid) 0.00 : 675e11: 0f 84 33 02 00 00 je 67604a : * lookup the buffer. IO_IN_PROGRESS is set if the requested block is : * not currently in memory. : */ : bufHdr = BufferAlloc(smgr, relpersistence, forkNum, blockNum, : strategy, &found); : if (found) 0.00 : 675e17: 80 7d cf 00 cmpb $0x0,-0x31(%rbp) : pgBufferUsage.shared_blks_hit++; 0.00 : 675e1b: 4d 89 e6 mov %r12,%r14 : * lookup the buffer. IO_IN_PROGRESS is set if the requested block is : * not currently in memory. : */ : bufHdr = BufferAlloc(smgr, relpersistence, forkNum, blockNum, : strategy, &found); : if (found) 0.00 : 675e1e: 0f 84 9a 03 00 00 je 6761be : pgBufferUsage.shared_blks_hit++; 0.00 : 675e24: 48 83 05 34 99 54 00 addq $0x1,0x549934(%rip) # bbf760 0.00 : 675e2b: 01 : } : : /* At this point we do NOT hold any locks. */ : : /* if it was already in the buffer pool, we're done */ : if (found) 0.00 : 675e2c: 80 7d cf 00 cmpb $0x0,-0x31(%rbp) 0.00 : 675e30: 0f 85 06 ff ff ff jne 675d3c : * it's not been recycled) but come right back here to try smgrextend : * again. : */ : Assert(!(bufHdr->flags & BM_VALID)); /* spinlock not needed */ : : bufBlock = isLocalBuf ? LocalBufHdrGetBlock(bufHdr) : BufHdrGetBlock(bufHdr); 0.00 : 675e36: 80 7d 8f 00 cmpb $0x0,-0x71(%rbp) 0.00 : 675e3a: 0f 84 8b 03 00 00 je 6761cb 0.00 : 675e40: 41 8b 46 24 mov 0x24(%r14),%eax 0.00 : 675e44: ba fe ff ff ff mov $0xfffffffe,%edx 0.00 : 675e49: 29 c2 sub %eax,%edx : : if (isExtend) 0.00 : 675e4b: 80 7d 8e 00 cmpb $0x0,-0x72(%rbp) : * it's not been recycled) but come right back here to try smgrextend : * again. : */ : Assert(!(bufHdr->flags & BM_VALID)); /* spinlock not needed */ : : bufBlock = isLocalBuf ? LocalBufHdrGetBlock(bufHdr) : BufHdrGetBlock(bufHdr); 0.00 : 675e4f: 48 8b 05 c2 72 50 00 mov 0x5072c2(%rip),%rax # b7d118 0.00 : 675e56: 48 63 d2 movslq %edx,%rdx 0.00 : 675e59: 4c 8b 24 d0 mov (%rax,%rdx,8),%r12 : : if (isExtend) 0.00 : 675e5d: 0f 85 84 03 00 00 jne 6761e7 : { : /* : * Read in the page, unless the caller intends to overwrite it and : * just wants us to allocate a buffer. : */ : if (mode == RBM_ZERO) 0.00 : 675e63: 83 bd 70 ff ff ff 01 cmpl $0x1,-0x90(%rbp) 0.00 : 675e6a: 74 7e je 675eea : else : { : instr_time io_start, : io_time; : : if (track_io_timing) 0.00 : 675e6c: 80 3d ee 71 50 00 00 cmpb $0x0,0x5071ee(%rip) # b7d061 0.00 : 675e73: 0f 85 d1 04 00 00 jne 67634a : INSTR_TIME_SET_CURRENT(io_start); : : smgrread(smgr, forkNum, blockNum, (char *) bufBlock); 0.00 : 675e79: 8b 95 74 ff ff ff mov -0x8c(%rbp),%edx 0.00 : 675e7f: 8b b5 78 ff ff ff mov -0x88(%rbp),%esi 0.00 : 675e85: 4c 89 e1 mov %r12,%rcx 0.00 : 675e88: 48 8b 7d 80 mov -0x80(%rbp),%rdi 0.00 : 675e8c: e8 7f 35 02 00 callq 699410 : : if (track_io_timing) /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:735 20.00 : 675e91: 80 3d c9 71 50 00 00 cmpb $0x0,0x5071c9(%rip) # b7d061 0.00 : 675e98: 0f 85 bc 04 00 00 jne 67635a : pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); : INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); : } : : /* check for garbage data */ : if (!PageIsVerified((Page) bufBlock, blockNum)) 0.00 : 675e9e: 8b b5 74 ff ff ff mov -0x8c(%rbp),%esi 0.00 : 675ea4: 4c 89 e7 mov %r12,%rdi 0.00 : 675ea7: e8 24 f0 01 00 callq 694ed0 0.00 : 675eac: 84 c0 test %al,%al 0.00 : 675eae: 75 47 jne 675ef7 : { : if (mode == RBM_ZERO_ON_ERROR || zero_damaged_pages) 0.00 : 675eb0: 83 bd 70 ff ff ff 02 cmpl $0x2,-0x90(%rbp) 0.00 : 675eb7: 74 0d je 675ec6 0.00 : 675eb9: 80 3d a0 71 50 00 00 cmpb $0x0,0x5071a0(%rip) # b7d060 0.00 : 675ec0: 0f 84 51 05 00 00 je 676417 : { : ereport(WARNING, 0.00 : 675ec6: 45 31 c0 xor %r8d,%r8d 0.00 : 675ec9: b9 a0 a0 8a 00 mov $0x8aa0a0,%ecx 0.00 : 675ece: ba f0 02 00 00 mov $0x2f0,%edx 0.00 : 675ed3: be 53 9d 8a 00 mov $0x8a9d53,%esi 0.00 : 675ed8: bf 13 00 00 00 mov $0x13,%edi 0.00 : 675edd: e8 de 4b 10 00 callq 77aac0 0.00 : 675ee2: 84 c0 test %al,%al 0.00 : 675ee4: 0f 85 11 04 00 00 jne 6762fb : (errcode(ERRCODE_DATA_CORRUPTED), : errmsg("invalid page in block %u of relation %s; zeroing out page", : blockNum, : relpath(smgr->smgr_rnode, forkNum)))); : MemSet((char *) bufBlock, 0, BLCKSZ); 0.00 : 675eea: b9 00 04 00 00 mov $0x400,%ecx 0.00 : 675eef: 31 c0 xor %eax,%eax 0.00 : 675ef1: 4c 89 e7 mov %r12,%rdi 0.00 : 675ef4: f3 48 ab rep stos %rax,%es:(%rdi) : relpath(smgr->smgr_rnode, forkNum)))); : } : } : } : : if (isLocalBuf) 0.00 : 675ef7: 80 7d 8f 00 cmpb $0x0,-0x71(%rbp) 0.00 : 675efb: 0f 84 18 03 00 00 je 676219 : { : /* Only need to adjust flags */ : bufHdr->flags |= BM_VALID; 0.00 : 675f01: 41 0f b7 46 14 movzwl 0x14(%r14),%eax 0.00 : 675f06: 83 c8 02 or $0x2,%eax 0.00 : 675f09: 66 41 89 46 14 mov %ax,0x14(%r14) : { : /* Set BM_VALID, terminate IO, and wake up any waiters */ : TerminateBufferIO(bufHdr, false, BM_VALID); : } : : VacuumPageMiss++; 0.00 : 675f0e: 83 05 c3 41 54 00 01 addl $0x1,0x5441c3(%rip) # bba0d8 : if (VacuumCostActive) 0.00 : 675f15: 80 3d c8 41 54 00 00 cmpb $0x0,0x5441c8(%rip) # bba0e4 0.00 : 675f1c: 0f 84 47 fe ff ff je 675d69 : VacuumCostBalance += VacuumCostPageMiss; 0.00 : 675f22: 8b 05 08 2c 4f 00 mov 0x4f2c08(%rip),%eax # b68b30 0.00 : 675f28: 01 05 b2 41 54 00 add %eax,0x5441b2(%rip) # bba0e0 0.00 : 675f2e: e9 36 fe ff ff jmpq 675d69 0.00 : 675f33: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : } : : /* : * Need to lock the buffer header too in order to change its tag. : */ : LockBufHdr(buf); 0.00 : 675f38: 49 8d 5e 20 lea 0x20(%r14),%rbx : static __inline__ int : tas(volatile slock_t *lock) : { : register slock_t _res = 1; : : __asm__ __volatile__( 0.00 : 675f3c: b8 01 00 00 00 mov $0x1,%eax 0.00 : 675f41: f0 86 03 lock xchg %al,(%rbx) /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:1039 10.00 : 675f44: 84 c0 test %al,%al 0.00 : 675f46: 0f 85 a4 01 00 00 jne 6760f0 : * Somebody could have pinned or re-dirtied the buffer while we were : * doing the I/O and making the new hashtable entry. If so, we can't : * recycle this buffer; we must undo everything we've done and start : * over with a new victim buffer. : */ : oldFlags = buf->flags; 0.00 : 675f4c: 41 0f b7 56 14 movzwl 0x14(%r14),%edx : if (buf->refcount == 1 && !(oldFlags & BM_DIRTY)) 0.00 : 675f51: 41 8b 46 18 mov 0x18(%r14),%eax 0.00 : 675f55: 83 e8 01 sub $0x1,%eax 0.00 : 675f58: 75 0c jne 675f66 0.00 : 675f5a: 0f b7 d2 movzwl %dx,%edx 0.00 : 675f5d: f6 c2 01 test $0x1,%dl 0.00 : 675f60: 0f 84 ec 01 00 00 je 676152 : break; : : UnlockBufHdr(buf); : BufTableDelete(&newTag); 0.00 : 675f66: 48 8d 7d b0 lea -0x50(%rbp),%rdi : */ : oldFlags = buf->flags; : if (buf->refcount == 1 && !(oldFlags & BM_DIRTY)) : break; : : UnlockBufHdr(buf); 0.00 : 675f6a: 41 c6 46 20 00 movb $0x0,0x20(%r14) : BufTableDelete(&newTag); 0.00 : 675f6f: e8 dc dd ff ff callq 673d50 : UnpinBuffer(buf, true); 0.00 : 675f74: be 01 00 00 00 mov $0x1,%esi 0.00 : 675f79: 4c 89 f7 mov %r14,%rdi 0.00 : 675f7c: e8 af ed ff ff callq 674d30 : { : /* : * Select a victim buffer. The buffer is returned with its header : * spinlock still held! : */ : buf = StrategyGetBuffer(strategy); 0.00 : 675f81: 4c 89 ff mov %r15,%rdi 0.00 : 675f84: e8 d7 15 00 00 callq 677560 : : Assert(buf->refcount == 0); : : /* Must copy buffer flags while we still hold the spinlock */ : oldFlags = buf->flags; 0.00 : 675f89: 0f b7 58 14 movzwl 0x14(%rax),%ebx : : /* Pin the buffer and then release the buffer spinlock */ : PinBuffer_Locked(buf); 0.00 : 675f8d: 48 89 c7 mov %rax,%rdi : { : /* : * Select a victim buffer. The buffer is returned with its header : * spinlock still held! : */ : buf = StrategyGetBuffer(strategy); 0.00 : 675f90: 49 89 c6 mov %rax,%r14 : : /* Must copy buffer flags while we still hold the spinlock */ : oldFlags = buf->flags; : : /* Pin the buffer and then release the buffer spinlock */ : PinBuffer_Locked(buf); 0.00 : 675f93: e8 38 ec ff ff callq 674bd0 : * condition here, in that someone might dirty it after we released it : * above, or even while we are writing it out (since our share-lock : * won't prevent hint-bit updates). We will recheck the dirty bit : * after re-locking the buffer header. : */ : if (oldFlags & BM_DIRTY) 0.00 : 675f98: 0f b7 db movzwl %bx,%ebx 0.00 : 675f9b: f6 c3 01 test $0x1,%bl 0.00 : 675f9e: 0f 85 cc 00 00 00 jne 676070 : : /* : * To change the association of a valid buffer, we'll need to have : * exclusive lock on both the old and new mapping partitions. : */ : if (oldFlags & BM_TAG_VALID) 0.00 : 675fa4: 83 e3 04 and $0x4,%ebx 0.00 : 675fa7: 74 2c je 675fd5 : { : /* Save old tag. */ : oldTag = buf->tag; 0.00 : 675fa9: 49 8b 06 mov (%r14),%rax /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:974 10.00 : 675fac: 48 89 45 90 mov %rax,-0x70(%rbp) 0.00 : 675fb0: 49 8b 46 08 mov 0x8(%r14),%rax 0.00 : 675fb4: 48 89 45 98 mov %rax,-0x68(%rbp) 0.00 : 675fb8: 41 8b 46 10 mov 0x10(%r14),%eax 0.00 : 675fbc: 89 45 a0 mov %eax,-0x60(%rbp) 0.00 : 675fbf: eb 14 jmp 675fd5 0.00 : 675fc1: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : */ : foundbuf = &BufferDescriptors[buf_id]; : valid = PinBuffer(foundbuf, strategy); : if (!BUFFERTAGS_EQUAL(newTag, foundbuf->tag)) : { : UnpinBuffer(foundbuf, true); 0.00 : 675fc8: be 01 00 00 00 mov $0x1,%esi 0.00 : 675fcd: 48 89 df mov %rbx,%rdi 0.00 : 675fd0: e8 5b ed ff ff callq 674d30 : * allocated another buffer for the same block we want to read in. : * Note that we have not yet removed the hashtable entry for the old : * tag. : */ : enter: : buf_id = BufTableInsert(&newTag, buf->buf_id); 0.00 : 675fd5: 41 8b 76 24 mov 0x24(%r14),%esi 0.00 : 675fd9: 48 8d 7d b0 lea -0x50(%rbp),%rdi 0.00 : 675fdd: e8 be dd ff ff callq 673da0 : : if (buf_id >= 0) 0.00 : 675fe2: 85 c0 test %eax,%eax 0.00 : 675fe4: 0f 88 4e ff ff ff js 675f38 : * did what we were about to do. We can handle this as if we had : * found the buffer in the pool in the first place, but we must : * recheck the buffer tag after pinning it, because it could still : * get renamed under us. : */ : foundbuf = &BufferDescriptors[buf_id]; 0.00 : 675fea: 48 63 d8 movslq %eax,%rbx : valid = PinBuffer(foundbuf, strategy); 0.00 : 675fed: 4c 89 fe mov %r15,%rsi : * did what we were about to do. We can handle this as if we had : * found the buffer in the pool in the first place, but we must : * recheck the buffer tag after pinning it, because it could still : * get renamed under us. : */ : foundbuf = &BufferDescriptors[buf_id]; 0.00 : 675ff0: 48 c1 e3 06 shl $0x6,%rbx 0.00 : 675ff4: 48 03 1d 05 9b 54 00 add 0x549b05(%rip),%rbx # bbfb00 : valid = PinBuffer(foundbuf, strategy); 0.00 : 675ffb: 48 89 df mov %rbx,%rdi 0.00 : 675ffe: 49 89 dc mov %rbx,%r12 0.00 : 676001: e8 2a ec ff ff callq 674c30 0.00 : 676006: 41 89 c5 mov %eax,%r13d : if (!BUFFERTAGS_EQUAL(newTag, foundbuf->tag)) 0.00 : 676009: 8b 45 b8 mov -0x48(%rbp),%eax 0.00 : 67600c: 3b 43 08 cmp 0x8(%rbx),%eax 0.00 : 67600f: 75 b7 jne 675fc8 0.00 : 676011: 8b 45 b4 mov -0x4c(%rbp),%eax 0.00 : 676014: 3b 43 04 cmp 0x4(%rbx),%eax 0.00 : 676017: 75 af jne 675fc8 0.00 : 676019: 8b 45 b0 mov -0x50(%rbp),%eax 0.00 : 67601c: 3b 03 cmp (%rbx),%eax 0.00 : 67601e: 75 a8 jne 675fc8 0.00 : 676020: 8b 45 c0 mov -0x40(%rbp),%eax 0.00 : 676023: 3b 43 10 cmp 0x10(%rbx),%eax 0.00 : 676026: 75 a0 jne 675fc8 0.00 : 676028: 8b 45 bc mov -0x44(%rbp),%eax 0.00 : 67602b: 3b 43 0c cmp 0xc(%rbx),%eax 0.00 : 67602e: 75 98 jne 675fc8 : : /* : * Collision confirmed. Give up the buffer we were planning to : * use. : */ : UnpinBuffer(buf, true); 0.00 : 676030: be 01 00 00 00 mov $0x1,%esi 0.00 : 676035: 4c 89 f7 mov %r14,%rdi 0.00 : 676038: e8 f3 ec ff ff callq 674d30 : : *foundPtr = TRUE; : : if (!valid) 0.00 : 67603d: 45 84 ed test %r13b,%r13b : * Collision confirmed. Give up the buffer we were planning to : * use. : */ : UnpinBuffer(buf, true); : : *foundPtr = TRUE; 0.00 : 676040: c6 45 cf 01 movb $0x1,-0x31(%rbp) : : if (!valid) 0.00 : 676044: 0f 85 cd fd ff ff jne 675e17 : * in the page, or (b) a previous read attempt failed. We : * have to wait for any active read attempt to finish, and : * then set up our own read attempt if the page is still not : * BM_VALID. StartBufferIO does it all. : */ : if (StartBufferIO(foundbuf, true)) 0.00 : 67604a: be 01 00 00 00 mov $0x1,%esi 0.00 : 67604f: 4c 89 e7 mov %r12,%rdi 0.00 : 676052: e8 e9 e3 ff ff callq 674440 0.00 : 676057: 84 c0 test %al,%al 0.00 : 676059: 0f 84 b8 fd ff ff je 675e17 : { : /* : * If we get here, previous attempts to read the buffer : * must have failed ... but we shall bravely try again. : */ : *foundPtr = FALSE; 0.00 : 67605f: c6 45 cf 00 movb $0x0,-0x31(%rbp) 0.00 : 676063: e9 af fd ff ff jmpq 675e17 0.00 : 676068: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 67606f: 00 : * (This has been observed to happen when two backends are both : * trying to split btree index pages, and the second one just : * happens to be trying to split the page the first one got from : * StrategyGetBuffer.) : */ : if (LWLockConditionalAcquire(buf->content_lock, LW_SHARED)) 0.00 : 676070: 49 8b 7e 38 mov 0x38(%r14),%rdi 0.00 : 676074: be 01 00 00 00 mov $0x1,%esi 0.00 : 676079: e8 22 8f 01 00 callq 68efa0 0.00 : 67607e: 84 c0 test %al,%al 0.00 : 676080: 0f 84 ee fe ff ff je 675f74 : * would require a WAL flush, let the strategy decide whether : * to go ahead and write/reuse the buffer or to choose another : * victim. We need lock to inspect the page LSN, so this : * can't be done inside StrategyGetBuffer. : */ : if (strategy != NULL) 0.00 : 676086: 4d 85 ff test %r15,%r15 0.00 : 676089: 74 4c je 6760d7 : { : XLogRecPtr lsn; : : /* Read the LSN while holding buffer header lock */ : LockBufHdr(buf); 0.00 : 67608b: 49 8d 7e 20 lea 0x20(%r14),%rdi 0.00 : 67608f: b8 01 00 00 00 mov $0x1,%eax 0.00 : 676094: f0 86 07 lock xchg %al,(%rdi) 0.00 : 676097: 84 c0 test %al,%al 0.00 : 676099: 0f 85 92 00 00 00 jne 676131 : lsn = BufferGetLSN(buf); 0.00 : 67609f: 41 8b 46 24 mov 0x24(%r14),%eax 0.00 : 6760a3: 41 8b 56 24 mov 0x24(%r14),%edx 0.00 : 6760a7: 48 8b 0d 4a 9a 54 00 mov 0x549a4a(%rip),%rcx # bbfaf8 0.00 : 6760ae: 48 98 cltq 0.00 : 6760b0: 48 63 d2 movslq %edx,%rdx 0.00 : 6760b3: 48 c1 e0 0d shl $0xd,%rax 0.00 : 6760b7: 48 c1 e2 0d shl $0xd,%rdx 0.00 : 6760bb: 8b 3c 01 mov (%rcx,%rax,1),%edi 0.00 : 6760be: 8b 44 11 04 mov 0x4(%rcx,%rdx,1),%eax 0.00 : 6760c2: 48 c1 e7 20 shl $0x20,%rdi 0.00 : 6760c6: 48 09 c7 or %rax,%rdi : UnlockBufHdr(buf); 0.00 : 6760c9: 41 c6 46 20 00 movb $0x0,0x20(%r14) : : if (XLogNeedsFlush(lsn) && 0.00 : 6760ce: e8 dd dc e5 ff callq 4d3db0 0.00 : 6760d3: 84 c0 test %al,%al 0.00 : 6760d5: 75 30 jne 676107 : TRACE_POSTGRESQL_BUFFER_WRITE_DIRTY_START(forkNum, blockNum, : smgr->smgr_rnode.node.spcNode, : smgr->smgr_rnode.node.dbNode, : smgr->smgr_rnode.node.relNode); : : FlushBuffer(buf, NULL); 0.00 : 6760d7: 4c 89 f7 mov %r14,%rdi 0.00 : 6760da: 31 f6 xor %esi,%esi 0.00 : 6760dc: e8 6f ee ff ff callq 674f50 : LWLockRelease(buf->content_lock); 0.00 : 6760e1: 49 8b 7e 38 mov 0x38(%r14),%rdi 0.00 : 6760e5: e8 b6 92 01 00 callq 68f3a0 0.00 : 6760ea: e9 b5 fe ff ff jmpq 675fa4 0.00 : 6760ef: 90 nop : } : : /* : * Need to lock the buffer header too in order to change its tag. : */ : LockBufHdr(buf); 0.00 : 6760f0: ba 0f 04 00 00 mov $0x40f,%edx 0.00 : 6760f5: be 53 9d 8a 00 mov $0x8a9d53,%esi 0.00 : 6760fa: 48 89 df mov %rbx,%rdi 0.00 : 6760fd: e8 3e 9f 01 00 callq 690040 0.00 : 676102: e9 45 fe ff ff jmpq 675f4c : /* Read the LSN while holding buffer header lock */ : LockBufHdr(buf); : lsn = BufferGetLSN(buf); : UnlockBufHdr(buf); : : if (XLogNeedsFlush(lsn) && 0.00 : 676107: 4c 89 f6 mov %r14,%rsi 0.00 : 67610a: 4c 89 ff mov %r15,%rdi 0.00 : 67610d: e8 0e 11 00 00 callq 677220 0.00 : 676112: 84 c0 test %al,%al 0.00 : 676114: 74 c1 je 6760d7 : StrategyRejectBuffer(strategy, buf)) : { : /* Drop lock/pin and loop around for another buffer */ : LWLockRelease(buf->content_lock); 0.00 : 676116: 49 8b 7e 38 mov 0x38(%r14),%rdi 0.00 : 67611a: e8 81 92 01 00 callq 68f3a0 : UnpinBuffer(buf, true); 0.00 : 67611f: be 01 00 00 00 mov $0x1,%esi 0.00 : 676124: 4c 89 f7 mov %r14,%rdi 0.00 : 676127: e8 04 ec ff ff callq 674d30 0.00 : 67612c: e9 50 fe ff ff jmpq 675f81 : if (strategy != NULL) : { : XLogRecPtr lsn; : : /* Read the LSN while holding buffer header lock */ : LockBufHdr(buf); 0.00 : 676131: ba a0 03 00 00 mov $0x3a0,%edx 0.00 : 676136: be 53 9d 8a 00 mov $0x8a9d53,%esi 0.00 : 67613b: e8 00 9f 01 00 callq 690040 0.00 : 676140: e9 5a ff ff ff jmpq 67609f : : if (isLocalBuf) : { : bufHdr = LocalBufferAlloc(smgr, forkNum, blockNum, &found); : if (found) : pgBufferUsage.local_blks_hit++; 0.00 : 676145: 48 83 05 33 96 54 00 addq $0x1,0x549633(%rip) # bbf780 0.00 : 67614c: 01 0.00 : 67614d: e9 e0 fb ff ff jmpq 675d32 : * Clearing BM_VALID here is necessary, clearing the dirtybits is just : * paranoia. We also reset the usage_count since any recency of use of : * the old content is no longer relevant. (The usage_count starts out at : * 1 so that the buffer can survive one clock-sweep pass.) : */ : buf->tag = newTag; 0.00 : 676152: 48 8b 45 b0 mov -0x50(%rbp),%rax 0.00 : 676156: 49 89 06 mov %rax,(%r14) 0.00 : 676159: 48 8b 45 b8 mov -0x48(%rbp),%rax 0.00 : 67615d: 49 89 46 08 mov %rax,0x8(%r14) 0.00 : 676161: 8b 45 c0 mov -0x40(%rbp),%eax 0.00 : 676164: 41 89 46 10 mov %eax,0x10(%r14) : buf->flags &= ~(BM_VALID | BM_DIRTY | BM_JUST_DIRTIED | BM_CHECKPOINT_NEEDED | BM_IO_ERROR | BM_PERMANENT); 0.00 : 676168: 41 0f b7 46 14 movzwl 0x14(%r14),%eax 0.00 : 67616d: 66 25 4c fe and $0xfe4c,%ax 0.00 : 676171: 66 41 89 46 14 mov %ax,0x14(%r14) : if (relpersistence == RELPERSISTENCE_PERMANENT) 0.00 : 676176: 80 bd 7f ff ff ff 70 cmpb $0x70,-0x81(%rbp) 0.00 : 67617d: 0f 84 73 02 00 00 je 6763f6 : buf->flags |= BM_TAG_VALID | BM_PERMANENT; : else : buf->flags |= BM_TAG_VALID; 0.00 : 676183: 41 0f b7 46 14 movzwl 0x14(%r14),%eax 0.00 : 676188: 83 c8 04 or $0x4,%eax 0.00 : 67618b: 66 41 89 46 14 mov %ax,0x14(%r14) : buf->usage_count = 1; 0.00 : 676190: 66 41 c7 46 16 01 00 movw $0x1,0x16(%r14) : : UnlockBufHdr(buf); : : if (oldFlags & BM_TAG_VALID) 0.00 : 676197: 83 e2 04 and $0x4,%edx : buf->flags |= BM_TAG_VALID | BM_PERMANENT; : else : buf->flags |= BM_TAG_VALID; : buf->usage_count = 1; : : UnlockBufHdr(buf); 0.00 : 67619a: 41 c6 46 20 00 movb $0x0,0x20(%r14) : : if (oldFlags & BM_TAG_VALID) 0.00 : 67619f: 0f 85 64 02 00 00 jne 676409 : /* : * Buffer contents are currently invalid. Try to get the io_in_progress : * lock. If StartBufferIO returns false, then someone else managed to : * read it before we did, so there's nothing left for BufferAlloc() to do. : */ : if (StartBufferIO(buf, true)) 0.00 : 6761a5: be 01 00 00 00 mov $0x1,%esi 0.00 : 6761aa: 4c 89 f7 mov %r14,%rdi 0.00 : 6761ad: e8 8e e2 ff ff callq 674440 0.00 : 6761b2: 84 c0 test %al,%al 0.00 : 6761b4: 0f 84 d5 00 00 00 je 67628f : *foundPtr = FALSE; 0.00 : 6761ba: c6 45 cf 00 movb $0x0,-0x31(%rbp) : bufHdr = BufferAlloc(smgr, relpersistence, forkNum, blockNum, : strategy, &found); : if (found) : pgBufferUsage.shared_blks_hit++; : else : pgBufferUsage.shared_blks_read++; 0.00 : 6761be: 48 83 05 a2 95 54 00 addq $0x1,0x5495a2(%rip) # bbf768 0.00 : 6761c5: 01 0.00 : 6761c6: e9 67 fb ff ff jmpq 675d32 : * it's not been recycled) but come right back here to try smgrextend : * again. : */ : Assert(!(bufHdr->flags & BM_VALID)); /* spinlock not needed */ : : bufBlock = isLocalBuf ? LocalBufHdrGetBlock(bufHdr) : BufHdrGetBlock(bufHdr); 0.00 : 6761cb: 41 8b 46 24 mov 0x24(%r14),%eax 0.00 : 6761cf: 4c 63 e0 movslq %eax,%r12 0.00 : 6761d2: 49 c1 e4 0d shl $0xd,%r12 0.00 : 6761d6: 4c 03 25 1b 99 54 00 add 0x54991b(%rip),%r12 # bbfaf8 : : if (isExtend) 0.00 : 6761dd: 80 7d 8e 00 cmpb $0x0,-0x72(%rbp) 0.00 : 6761e1: 0f 84 7c fc ff ff je 675e63 : { : /* new buffers are zero-filled */ : MemSet((char *) bufBlock, 0, BLCKSZ); 0.00 : 6761e7: 31 c0 xor %eax,%eax 0.00 : 6761e9: b9 00 04 00 00 mov $0x400,%ecx 0.00 : 6761ee: 4c 89 e7 mov %r12,%rdi 0.00 : 6761f1: f3 48 ab rep stos %rax,%es:(%rdi) : /* don't set checksum for all-zero page */ : smgrextend(smgr, forkNum, blockNum, (char *) bufBlock, false); 0.00 : 6761f4: 45 31 c0 xor %r8d,%r8d 0.00 : 6761f7: 4c 89 e1 mov %r12,%rcx 0.00 : 6761fa: 8b 95 74 ff ff ff mov -0x8c(%rbp),%edx 0.00 : 676200: 8b b5 78 ff ff ff mov -0x88(%rbp),%esi 0.00 : 676206: 48 8b 7d 80 mov -0x80(%rbp),%rdi 0.00 : 67620a: e8 c1 31 02 00 callq 6993d0 : relpath(smgr->smgr_rnode, forkNum)))); : } : } : } : : if (isLocalBuf) 0.00 : 67620f: 80 7d 8f 00 cmpb $0x0,-0x71(%rbp) 0.00 : 676213: 0f 85 e8 fc ff ff jne 675f01 : bufHdr->flags |= BM_VALID; : } : else : { : /* Set BM_VALID, terminate IO, and wake up any waiters */ : TerminateBufferIO(bufHdr, false, BM_VALID); 0.00 : 676219: ba 02 00 00 00 mov $0x2,%edx 0.00 : 67621e: 31 f6 xor %esi,%esi 0.00 : 676220: 4c 89 f7 mov %r14,%rdi 0.00 : 676223: e8 a8 df ff ff callq 6741d0 0.00 : 676228: e9 e1 fc ff ff jmpq 675f0e : smgr->smgr_rnode.backend, : isExtend); : : /* Substitute proper block number if caller asked for P_NEW */ : if (isExtend) : blockNum = smgrnblocks(smgr, forkNum); 0.00 : 67622d: 8b b5 78 ff ff ff mov -0x88(%rbp),%esi 0.00 : 676233: 48 8b 7d 80 mov -0x80(%rbp),%rdi 0.00 : 676237: e8 14 32 02 00 callq 699450 0.00 : 67623c: 89 85 74 ff ff ff mov %eax,-0x8c(%rbp) 0.00 : 676242: e9 b7 fa ff ff jmpq 675cfe : * lseek(SEEK_END) result that doesn't account for a recent write. In : * that situation, the pre-existing buffer would contain valid data : * that we don't want to overwrite. Since the legitimate case should : * always have left a zero-filled buffer, complain if not PageIsNew. : */ : bufBlock = isLocalBuf ? LocalBufHdrGetBlock(bufHdr) : BufHdrGetBlock(bufHdr); 0.00 : 676247: 80 7d 8f 00 cmpb $0x0,-0x71(%rbp) 0.00 : 67624b: 0f 85 8c 00 00 00 jne 6762dd 0.00 : 676251: 41 8b 46 24 mov 0x24(%r14),%eax 0.00 : 676255: 48 98 cltq 0.00 : 676257: 48 c1 e0 0d shl $0xd,%rax 0.00 : 67625b: 48 03 05 96 98 54 00 add 0x549896(%rip),%rax # bbfaf8 : if (!PageIsNew((Page) bufBlock)) 0.00 : 676262: 66 83 78 0e 00 cmpw $0x0,0xe(%rax) 0.00 : 676267: 0f 85 19 02 00 00 jne 676486 : * We *must* do smgrextend before succeeding, else the page will not : * be reserved by the kernel, and the next P_NEW call will decide to : * return the same page. Clear the BM_VALID bit, do the StartBufferIO : * call that BufferAlloc didn't, and proceed. : */ : if (isLocalBuf) 0.00 : 67626d: 80 7d 8f 00 cmpb $0x0,-0x71(%rbp) 0.00 : 676271: 49 8d 5e 20 lea 0x20(%r14),%rbx 0.00 : 676275: 41 bc 01 00 00 00 mov $0x1,%r12d 0.00 : 67627b: 74 54 je 6762d1 : { : /* Only need to adjust flags */ : Assert(bufHdr->flags & BM_VALID); : bufHdr->flags &= ~BM_VALID; 0.00 : 67627d: 41 0f b7 46 14 movzwl 0x14(%r14),%eax 0.00 : 676282: 83 e0 fd and $0xfffffffd,%eax 0.00 : 676285: 66 41 89 46 14 mov %ax,0x14(%r14) 0.00 : 67628a: e9 b1 fb ff ff jmpq 675e40 : * read it before we did, so there's nothing left for BufferAlloc() to do. : */ : if (StartBufferIO(buf, true)) : *foundPtr = FALSE; : else : *foundPtr = TRUE; 0.00 : 67628f: c6 45 cf 01 movb $0x1,-0x31(%rbp) 0.00 : 676293: e9 8c fb ff ff jmpq 675e24 : * BM_VALID between our clearing it and StartBufferIO inspecting : * it. : */ : do : { : LockBufHdr(bufHdr); 0.00 : 676298: ba ae 02 00 00 mov $0x2ae,%edx 0.00 : 67629d: be 53 9d 8a 00 mov $0x8a9d53,%esi 0.00 : 6762a2: 48 89 df mov %rbx,%rdi 0.00 : 6762a5: e8 96 9d 01 00 callq 690040 : Assert(bufHdr->flags & BM_VALID); : bufHdr->flags &= ~BM_VALID; 0.00 : 6762aa: 41 0f b7 46 14 movzwl 0x14(%r14),%eax 0.00 : 6762af: 83 e0 fd and $0xfffffffd,%eax 0.00 : 6762b2: 66 41 89 46 14 mov %ax,0x14(%r14) : UnlockBufHdr(bufHdr); : } while (!StartBufferIO(bufHdr, true)); 0.00 : 6762b7: be 01 00 00 00 mov $0x1,%esi : do : { : LockBufHdr(bufHdr); : Assert(bufHdr->flags & BM_VALID); : bufHdr->flags &= ~BM_VALID; : UnlockBufHdr(bufHdr); 0.00 : 6762bc: 41 c6 46 20 00 movb $0x0,0x20(%r14) : } while (!StartBufferIO(bufHdr, true)); 0.00 : 6762c1: 4c 89 f7 mov %r14,%rdi 0.00 : 6762c4: e8 77 e1 ff ff callq 674440 0.00 : 6762c9: 84 c0 test %al,%al 0.00 : 6762cb: 0f 85 fa fe ff ff jne 6761cb 0.00 : 6762d1: 44 89 e0 mov %r12d,%eax 0.00 : 6762d4: f0 86 03 lock xchg %al,(%rbx) : * BM_VALID between our clearing it and StartBufferIO inspecting : * it. : */ : do : { : LockBufHdr(bufHdr); 0.00 : 6762d7: 84 c0 test %al,%al 0.00 : 6762d9: 74 cf je 6762aa 0.00 : 6762db: eb bb jmp 676298 : * lseek(SEEK_END) result that doesn't account for a recent write. In : * that situation, the pre-existing buffer would contain valid data : * that we don't want to overwrite. Since the legitimate case should : * always have left a zero-filled buffer, complain if not PageIsNew. : */ : bufBlock = isLocalBuf ? LocalBufHdrGetBlock(bufHdr) : BufHdrGetBlock(bufHdr); 0.00 : 6762dd: 41 8b 46 24 mov 0x24(%r14),%eax 0.00 : 6762e1: ba fe ff ff ff mov $0xfffffffe,%edx 0.00 : 6762e6: 29 c2 sub %eax,%edx 0.00 : 6762e8: 48 8b 05 29 6e 50 00 mov 0x506e29(%rip),%rax # b7d118 0.00 : 6762ef: 48 63 d2 movslq %edx,%rdx 0.00 : 6762f2: 48 8b 04 d0 mov (%rax,%rdx,8),%rax 0.00 : 6762f6: e9 67 ff ff ff jmpq 676262 : /* check for garbage data */ : if (!PageIsVerified((Page) bufBlock, blockNum)) : { : if (mode == RBM_ZERO_ON_ERROR || zero_damaged_pages) : { : ereport(WARNING, 0.00 : 6762fb: 48 8b 55 80 mov -0x80(%rbp),%rdx 0.00 : 6762ff: 44 8b 85 78 ff ff ff mov -0x88(%rbp),%r8d 0.00 : 676306: 48 89 d0 mov %rdx,%rax 0.00 : 676309: 8b 4a 0c mov 0xc(%rdx),%ecx 0.00 : 67630c: 8b 52 08 mov 0x8(%rdx),%edx 0.00 : 67630f: 8b 78 04 mov 0x4(%rax),%edi 0.00 : 676312: 8b 30 mov (%rax),%esi 0.00 : 676314: e8 b7 82 13 00 callq 7ae5d0 0.00 : 676319: 8b b5 74 ff ff ff mov -0x8c(%rbp),%esi 0.00 : 67631f: 48 89 c2 mov %rax,%rdx 0.00 : 676322: bf c8 9e 8a 00 mov $0x8a9ec8,%edi 0.00 : 676327: 31 c0 xor %eax,%eax 0.00 : 676329: e8 72 65 10 00 callq 77c8a0 0.00 : 67632e: bf 28 0a 00 01 mov $0x1000a28,%edi 0.00 : 676333: 89 c3 mov %eax,%ebx 0.00 : 676335: e8 16 6a 10 00 callq 77cd50 0.00 : 67633a: 89 de mov %ebx,%esi 0.00 : 67633c: 89 c7 mov %eax,%edi 0.00 : 67633e: 31 c0 xor %eax,%eax 0.00 : 676340: e8 9b 42 10 00 callq 77a5e0 0.00 : 676345: e9 a0 fb ff ff jmpq 675eea : { : instr_time io_start, : io_time; : : if (track_io_timing) : INSTR_TIME_SET_CURRENT(io_start); 0.00 : 67634a: 48 8d 7d 90 lea -0x70(%rbp),%rdi 0.00 : 67634e: 31 f6 xor %esi,%esi 0.00 : 676350: e8 6b 32 df ff callq 4695c0 0.00 : 676355: e9 1f fb ff ff jmpq 675e79 : : smgrread(smgr, forkNum, blockNum, (char *) bufBlock); : : if (track_io_timing) : { : INSTR_TIME_SET_CURRENT(io_time); 0.00 : 67635a: 48 8d 7d b0 lea -0x50(%rbp),%rdi 0.00 : 67635e: 31 f6 xor %esi,%esi 0.00 : 676360: e8 5b 32 df ff callq 4695c0 : INSTR_TIME_SUBTRACT(io_time, io_start); 0.00 : 676365: 48 8b 55 b8 mov -0x48(%rbp),%rdx 0.00 : 676369: 48 2b 55 98 sub -0x68(%rbp),%rdx 0.00 : 67636d: 48 8b 45 b0 mov -0x50(%rbp),%rax 0.00 : 676371: 48 2b 45 90 sub -0x70(%rbp),%rax 0.00 : 676375: 48 85 d2 test %rdx,%rdx 0.00 : 676378: 48 89 55 b8 mov %rdx,-0x48(%rbp) 0.00 : 67637c: 48 89 c1 mov %rax,%rcx 0.00 : 67637f: 48 89 45 b0 mov %rax,-0x50(%rbp) 0.00 : 676383: 79 18 jns 67639d : */ : static Buffer : ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, : BlockNumber blockNum, ReadBufferMode mode, : BufferAccessStrategy strategy, bool *hit) : { 0.00 : 676385: 48 83 e8 01 sub $0x1,%rax : smgrread(smgr, forkNum, blockNum, (char *) bufBlock); : : if (track_io_timing) : { : INSTR_TIME_SET_CURRENT(io_time); : INSTR_TIME_SUBTRACT(io_time, io_start); 0.00 : 676389: 48 81 c2 40 42 0f 00 add $0xf4240,%rdx 0.00 : 676390: 78 f3 js 676385 0.00 : 676392: 48 89 45 b0 mov %rax,-0x50(%rbp) 0.00 : 676396: 48 89 55 b8 mov %rdx,-0x48(%rbp) 0.00 : 67639a: 48 89 c1 mov %rax,%rcx : pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); 0.00 : 67639d: 48 69 c1 40 42 0f 00 imul $0xf4240,%rcx,%rax : INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); 0.00 : 6763a4: 48 01 0d 05 94 54 00 add %rcx,0x549405(%rip) # bbf7b0 : : if (track_io_timing) : { : INSTR_TIME_SET_CURRENT(io_time); : INSTR_TIME_SUBTRACT(io_time, io_start); : pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); 0.00 : 6763ab: 48 8d 04 02 lea (%rdx,%rax,1),%rax 0.00 : 6763af: 48 01 05 0a 58 50 00 add %rax,0x50580a(%rip) # b7bbc0 : INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); 0.00 : 6763b6: 48 8b 05 fb 93 54 00 mov 0x5493fb(%rip),%rax # bbf7b8 0.00 : 6763bd: 48 03 45 b8 add -0x48(%rbp),%rax 0.00 : 6763c1: 48 3d 3f 42 0f 00 cmp $0xf423f,%rax 0.00 : 6763c7: 48 89 05 ea 93 54 00 mov %rax,0x5493ea(%rip) # bbf7b8 0.00 : 6763ce: 0f 8e ca fa ff ff jle 675e9e 0.00 : 6763d4: 48 2d 40 42 0f 00 sub $0xf4240,%rax 0.00 : 6763da: 48 83 05 ce 93 54 00 addq $0x1,0x5493ce(%rip) # bbf7b0 0.00 : 6763e1: 01 0.00 : 6763e2: 48 3d 3f 42 0f 00 cmp $0xf423f,%rax 0.00 : 6763e8: 48 89 05 c9 93 54 00 mov %rax,0x5493c9(%rip) # bbf7b8 0.00 : 6763ef: 7f e3 jg 6763d4 0.00 : 6763f1: e9 a8 fa ff ff jmpq 675e9e : * 1 so that the buffer can survive one clock-sweep pass.) : */ : buf->tag = newTag; : buf->flags &= ~(BM_VALID | BM_DIRTY | BM_JUST_DIRTIED | BM_CHECKPOINT_NEEDED | BM_IO_ERROR | BM_PERMANENT); : if (relpersistence == RELPERSISTENCE_PERMANENT) : buf->flags |= BM_TAG_VALID | BM_PERMANENT; 0.00 : 6763f6: 41 0f b7 46 14 movzwl 0x14(%r14),%eax 0.00 : 6763fb: 66 0d 04 01 or $0x104,%ax 0.00 : 6763ff: 66 41 89 46 14 mov %ax,0x14(%r14) 0.00 : 676404: e9 87 fd ff ff jmpq 676190 : buf->usage_count = 1; : : UnlockBufHdr(buf); : : if (oldFlags & BM_TAG_VALID) : BufTableDelete(&oldTag); 0.00 : 676409: 48 8d 7d 90 lea -0x70(%rbp),%rdi 0.00 : 67640d: e8 3e d9 ff ff callq 673d50 0.00 : 676412: e9 8e fd ff ff jmpq 6761a5 : blockNum, : relpath(smgr->smgr_rnode, forkNum)))); : MemSet((char *) bufBlock, 0, BLCKSZ); : } : else : ereport(ERROR, 0.00 : 676417: 45 31 c0 xor %r8d,%r8d 0.00 : 67641a: b9 a0 a0 8a 00 mov $0x8aa0a0,%ecx 0.00 : 67641f: ba f8 02 00 00 mov $0x2f8,%edx 0.00 : 676424: be 53 9d 8a 00 mov $0x8a9d53,%esi 0.00 : 676429: bf 14 00 00 00 mov $0x14,%edi 0.00 : 67642e: e8 8d 46 10 00 callq 77aac0 0.00 : 676433: 84 c0 test %al,%al 0.00 : 676435: 74 4a je 676481 0.00 : 676437: 48 8b 55 80 mov -0x80(%rbp),%rdx 0.00 : 67643b: 44 8b 85 78 ff ff ff mov -0x88(%rbp),%r8d 0.00 : 676442: 48 89 d0 mov %rdx,%rax 0.00 : 676445: 8b 4a 0c mov 0xc(%rdx),%ecx 0.00 : 676448: 8b 52 08 mov 0x8(%rdx),%edx 0.00 : 67644b: 8b 78 04 mov 0x4(%rax),%edi 0.00 : 67644e: 8b 30 mov (%rax),%esi 0.00 : 676450: e8 7b 81 13 00 callq 7ae5d0 0.00 : 676455: 8b b5 74 ff ff ff mov -0x8c(%rbp),%esi 0.00 : 67645b: 48 89 c2 mov %rax,%rdx 0.00 : 67645e: bf 48 28 88 00 mov $0x882848,%edi 0.00 : 676463: 31 c0 xor %eax,%eax 0.00 : 676465: e8 36 64 10 00 callq 77c8a0 0.00 : 67646a: bf 28 0a 00 01 mov $0x1000a28,%edi 0.00 : 67646f: 89 c3 mov %eax,%ebx 0.00 : 676471: e8 da 68 10 00 callq 77cd50 0.00 : 676476: 89 de mov %ebx,%esi 0.00 : 676478: 89 c7 mov %eax,%edi 0.00 : 67647a: 31 c0 xor %eax,%eax 0.00 : 67647c: e8 5f 41 10 00 callq 77a5e0 0.00 : 676481: e8 4a 30 df ff callq 4694d0 : * that we don't want to overwrite. Since the legitimate case should : * always have left a zero-filled buffer, complain if not PageIsNew. : */ : bufBlock = isLocalBuf ? LocalBufHdrGetBlock(bufHdr) : BufHdrGetBlock(bufHdr); : if (!PageIsNew((Page) bufBlock)) : ereport(ERROR, 0.00 : 676486: 45 31 c0 xor %r8d,%r8d 0.00 : 676489: b9 a0 a0 8a 00 mov $0x8aa0a0,%ecx 0.00 : 67648e: ba 97 02 00 00 mov $0x297,%edx 0.00 : 676493: be 53 9d 8a 00 mov $0x8a9d53,%esi 0.00 : 676498: bf 14 00 00 00 mov $0x14,%edi 0.00 : 67649d: e8 1e 46 10 00 callq 77aac0 0.00 : 6764a2: 84 c0 test %al,%al 0.00 : 6764a4: 74 db je 676481 0.00 : 6764a6: bf 40 9e 8a 00 mov $0x8a9e40,%edi 0.00 : 6764ab: 31 c0 xor %eax,%eax 0.00 : 6764ad: e8 ee 57 10 00 callq 77bca0 0.00 : 6764b2: 48 8b 55 80 mov -0x80(%rbp),%rdx 0.00 : 6764b6: 89 c3 mov %eax,%ebx 0.00 : 6764b8: 44 8b 85 78 ff ff ff mov -0x88(%rbp),%r8d 0.00 : 6764bf: 48 89 d0 mov %rdx,%rax 0.00 : 6764c2: 8b 4a 0c mov 0xc(%rdx),%ecx 0.00 : 6764c5: 8b 52 08 mov 0x8(%rdx),%edx 0.00 : 6764c8: 8b 78 04 mov 0x4(%rax),%edi 0.00 : 6764cb: 8b 30 mov (%rax),%esi 0.00 : 6764cd: e8 fe 80 13 00 callq 7ae5d0 0.00 : 6764d2: 8b b5 74 ff ff ff mov -0x8c(%rbp),%esi 0.00 : 6764d8: 48 89 c2 mov %rax,%rdx 0.00 : 6764db: bf 90 9e 8a 00 mov $0x8a9e90,%edi 0.00 : 6764e0: 31 c0 xor %eax,%eax 0.00 : 6764e2: e8 b9 63 10 00 callq 77c8a0 0.00 : 6764e7: 89 de mov %ebx,%esi 0.00 : 6764e9: 89 c7 mov %eax,%edi 0.00 : 6764eb: 31 c0 xor %eax,%eax 0.00 : 6764ed: e8 ee 40 10 00 callq 77a5e0 0.00 : 6764f2: eb 8d jmp 676481 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 60.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/resowner/resowner.c:615 30.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/resowner/resowner.c:617 10.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/resowner/resowner.c:611 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 000000000079a1a0 : : * We allow the case owner == NULL because the bufmgr is sometimes invoked : * outside any transaction (for example, during WAL recovery). : */ : void : ResourceOwnerRememberBuffer(ResourceOwner owner, Buffer buffer) : { 0.00 : 79a1a0: 55 push %rbp : if (owner != NULL) /home/Computational/mark/src/postgres-andres/src/backend/utils/resowner/resowner.c:611 10.00 : 79a1a1: 48 85 ff test %rdi,%rdi : * We allow the case owner == NULL because the bufmgr is sometimes invoked : * outside any transaction (for example, during WAL recovery). : */ : void : ResourceOwnerRememberBuffer(ResourceOwner owner, Buffer buffer) : { 0.00 : 79a1a4: 48 89 e5 mov %rsp,%rbp : if (owner != NULL) 0.00 : 79a1a7: 74 0f je 79a1b8 : { : Assert(owner->nbuffers < owner->maxbuffers); : owner->buffers[owner->nbuffers] = buffer; 0.00 : 79a1a9: 48 63 57 20 movslq 0x20(%rdi),%rdx 0.00 : 79a1ad: 48 8b 47 28 mov 0x28(%rdi),%rax 0.00 : 79a1b1: 89 34 90 mov %esi,(%rax,%rdx,4) : owner->nbuffers++; /home/Computational/mark/src/postgres-andres/src/backend/utils/resowner/resowner.c:615 60.00 : 79a1b4: 83 47 20 01 addl $0x1,0x20(%rdi) : } : } /home/Computational/mark/src/postgres-andres/src/backend/utils/resowner/resowner.c:617 30.00 : 79a1b8: c9 leaveq Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 20.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/resowner/resowner.c:630 20.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/resowner/resowner.c:641 10.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/resowner/resowner.c:627 10.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/resowner/resowner.c:639 10.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/resowner/resowner.c:641 10.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/resowner/resowner.c:641 10.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/resowner/resowner.c:648 10.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/resowner/resowner.c:655 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 000000000079a900 : : * We allow the case owner == NULL because the bufmgr is sometimes invoked : * outside any transaction (for example, during WAL recovery). : */ : void : ResourceOwnerForgetBuffer(ResourceOwner owner, Buffer buffer) : { 0.00 : 79a900: 55 push %rbp : if (owner != NULL) 0.00 : 79a901: 48 85 ff test %rdi,%rdi : * We allow the case owner == NULL because the bufmgr is sometimes invoked : * outside any transaction (for example, during WAL recovery). : */ : void : ResourceOwnerForgetBuffer(ResourceOwner owner, Buffer buffer) : { 0.00 : 79a904: 48 89 e5 mov %rsp,%rbp 0.00 : 79a907: 41 54 push %r12 /home/Computational/mark/src/postgres-andres/src/backend/utils/resowner/resowner.c:627 10.00 : 79a909: 49 89 fc mov %rdi,%r12 0.00 : 79a90c: 53 push %rbx 0.00 : 79a90d: 89 f3 mov %esi,%ebx : if (owner != NULL) 0.00 : 79a90f: 74 4d je 79a95e : { : Buffer *buffers = owner->buffers; : int nb1 = owner->nbuffers - 1; 0.00 : 79a911: 8b 47 20 mov 0x20(%rdi),%eax : void : ResourceOwnerForgetBuffer(ResourceOwner owner, Buffer buffer) : { : if (owner != NULL) : { : Buffer *buffers = owner->buffers; /home/Computational/mark/src/postgres-andres/src/backend/utils/resowner/resowner.c:630 20.00 : 79a914: 48 8b 77 28 mov 0x28(%rdi),%rsi : /* : * Scan back-to-front because it's more likely we are releasing a : * recently pinned buffer. This isn't always the case of course, but : * it's the way to bet. : */ : for (i = nb1; i >= 0; i--) /home/Computational/mark/src/postgres-andres/src/backend/utils/resowner/resowner.c:639 10.00 : 79a918: 89 c7 mov %eax,%edi 0.00 : 79a91a: 83 ef 01 sub $0x1,%edi 0.00 : 79a91d: 78 49 js 79a968 : { : if (buffers[i] == buffer) /home/Computational/mark/src/postgres-andres/src/backend/utils/resowner/resowner.c:641 10.00 : 79a91f: 48 63 c7 movslq %edi,%rax : while (i < nb1) : { : buffers[i] = buffers[i + 1]; : i++; : } : owner->nbuffers = nb1; 0.00 : 79a922: 89 fa mov %edi,%edx : * recently pinned buffer. This isn't always the case of course, but : * it's the way to bet. : */ : for (i = nb1; i >= 0; i--) : { : if (buffers[i] == buffer) 0.00 : 79a924: 39 1c 86 cmp %ebx,(%rsi,%rax,4) 0.00 : 79a927: 74 30 je 79a959 20.00 : 79a929: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : /* : * Scan back-to-front because it's more likely we are releasing a : * recently pinned buffer. This isn't always the case of course, but : * it's the way to bet. : */ : for (i = nb1; i >= 0; i--) 0.00 : 79a930: 83 ea 01 sub $0x1,%edx 0.00 : 79a933: 78 33 js 79a968 : { : if (buffers[i] == buffer) 0.00 : 79a935: 48 63 ca movslq %edx,%rcx 10.00 : 79a938: 39 1c 8e cmp %ebx,(%rsi,%rcx,4) 0.00 : 79a93b: 75 f3 jne 79a930 : { : while (i < nb1) 0.00 : 79a93d: 39 d7 cmp %edx,%edi 0.00 : 79a93f: 90 nop 0.00 : 79a940: 7f 09 jg 79a94b 0.00 : 79a942: eb 15 jmp 79a959 0.00 : 79a944: 0f 1f 40 00 nopl 0x0(%rax) 0.00 : 79a948: 48 63 ca movslq %edx,%rcx : { : buffers[i] = buffers[i + 1]; 0.00 : 79a94b: 8b 44 8e 04 mov 0x4(%rsi,%rcx,4),%eax : i++; 0.00 : 79a94f: 83 c2 01 add $0x1,%edx : */ : for (i = nb1; i >= 0; i--) : { : if (buffers[i] == buffer) : { : while (i < nb1) 0.00 : 79a952: 39 d7 cmp %edx,%edi : { : buffers[i] = buffers[i + 1]; 0.00 : 79a954: 89 04 8e mov %eax,(%rsi,%rcx,4) : */ : for (i = nb1; i >= 0; i--) : { : if (buffers[i] == buffer) : { : while (i < nb1) 0.00 : 79a957: 7f ef jg 79a948 : { : buffers[i] = buffers[i + 1]; : i++; : } : owner->nbuffers = nb1; /home/Computational/mark/src/postgres-andres/src/backend/utils/resowner/resowner.c:648 10.00 : 79a959: 41 89 7c 24 20 mov %edi,0x20(%r12) : } : } : elog(ERROR, "buffer %d is not owned by resource owner %s", : buffer, owner->name); : } : } 0.00 : 79a95e: 5b pop %rbx 0.00 : 79a95f: 41 5c pop %r12 0.00 : 79a961: c9 leaveq /home/Computational/mark/src/postgres-andres/src/backend/utils/resowner/resowner.c:655 10.00 : 79a962: c3 retq 0.00 : 79a963: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : } : owner->nbuffers = nb1; : return; : } : } : elog(ERROR, "buffer %d is not owned by resource owner %s", 0.00 : 79a968: ba 70 27 8e 00 mov $0x8e2770,%edx 0.00 : 79a96d: be 8d 02 00 00 mov $0x28d,%esi 0.00 : 79a972: bf 90 22 8e 00 mov $0x8e2290,%edi 0.00 : 79a977: e8 a4 0a fe ff callq 77b420 0.00 : 79a97c: 49 8b 4c 24 18 mov 0x18(%r12),%rcx 0.00 : 79a981: 89 da mov %ebx,%edx 0.00 : 79a983: be b8 24 8e 00 mov $0x8e24b8,%esi 0.00 : 79a988: bf 14 00 00 00 mov $0x14,%edi 0.00 : 79a98d: 31 c0 xor %eax,%eax 0.00 : 79a98f: e8 9c 08 fe ff callq 77b230 0.00 : 79a994: e8 37 eb cc ff callq 4694d0 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 12.50 /home/Computational/mark/src/postgres-andres/src/backend/access/hash/hashfunc.c:306 12.50 /home/Computational/mark/src/postgres-andres/src/backend/access/hash/hashfunc.c:327 12.50 /home/Computational/mark/src/postgres-andres/src/backend/access/hash/hashfunc.c:328 12.50 /home/Computational/mark/src/postgres-andres/src/backend/access/hash/hashfunc.c:328 12.50 /home/Computational/mark/src/postgres-andres/src/backend/access/hash/hashfunc.c:375 12.50 /home/Computational/mark/src/postgres-andres/src/backend/access/hash/hashfunc.c:496 12.50 /home/Computational/mark/src/postgres-andres/src/backend/access/hash/hashfunc.c:500 12.50 /home/Computational/mark/src/postgres-andres/src/backend/access/hash/hashfunc.c:388 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000490350 : : * by using the final values of both b and c. b is perhaps a little less : * well mixed than c, however. : */ : Datum : hash_any(register const unsigned char *k, register int keylen) : { /home/Computational/mark/src/postgres-andres/src/backend/access/hash/hashfunc.c:306 12.50 : 490350: 55 push %rbp 0.00 : 490351: 41 89 f2 mov %esi,%r10d : /* Set up the internal state */ : len = keylen; : a = b = c = 0x9e3779b9 + len + 3923095; : : /* If the source pointer is word-aligned, we use word-wide fetches */ : if (((uintptr_t) k & UINT32_ALIGN_MASK) == 0) 0.00 : 490354: 40 f6 c7 03 test $0x3,%dil : c, : len; : : /* Set up the internal state */ : len = keylen; : a = b = c = 0x9e3779b9 + len + 3923095; 0.00 : 490358: 45 8d 82 50 56 73 9e lea -0x618ca9b0(%r10),%r8d : * by using the final values of both b and c. b is perhaps a little less : * well mixed than c, however. : */ : Datum : hash_any(register const unsigned char *k, register int keylen) : { 0.00 : 49035f: 48 89 e5 mov %rsp,%rbp 0.00 : 490362: 53 push %rbx : /* Set up the internal state */ : len = keylen; : a = b = c = 0x9e3779b9 + len + 3923095; : : /* If the source pointer is word-aligned, we use word-wide fetches */ : if (((uintptr_t) k & UINT32_ALIGN_MASK) == 0) 0.00 : 490363: 0f 84 f7 00 00 00 je 490460 : else : { : /* Code path for non-aligned source data */ : : /* handle most of the key */ : while (len >= 12) 0.00 : 490369: 83 fe 0b cmp $0xb,%esi : /* fall through */ : case 2: : a += ((uint32) k[1] << 8); : /* fall through */ : case 1: : a += k[0]; 0.00 : 49036c: 45 89 c1 mov %r8d,%r9d 0.00 : 49036f: 44 89 c2 mov %r8d,%edx : else : { : /* Code path for non-aligned source data */ : : /* handle most of the key */ : while (len >= 12) 0.00 : 490372: 0f 86 7e 02 00 00 jbe 4905f6 0.00 : 490378: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 49037f: 00 : a += (k[3] + ((uint32) k[2] << 8) + ((uint32) k[1] << 16) + ((uint32) k[0] << 24)); : b += (k[7] + ((uint32) k[6] << 8) + ((uint32) k[5] << 16) + ((uint32) k[4] << 24)); : c += (k[11] + ((uint32) k[10] << 8) + ((uint32) k[9] << 16) + ((uint32) k[8] << 24)); : #else /* !WORDS_BIGENDIAN */ : a += (k[0] + ((uint32) k[1] << 8) + ((uint32) k[2] << 16) + ((uint32) k[3] << 24)); : b += (k[4] + ((uint32) k[5] << 8) + ((uint32) k[6] << 16) + ((uint32) k[7] << 24)); 0.00 : 490380: 0f b6 4f 05 movzbl 0x5(%rdi),%ecx 0.00 : 490384: 0f b6 47 06 movzbl 0x6(%rdi),%eax : c += (k[8] + ((uint32) k[9] << 8) + ((uint32) k[10] << 16) + ((uint32) k[11] << 24)); 0.00 : 490388: 0f b6 77 09 movzbl 0x9(%rdi),%esi : a += (k[3] + ((uint32) k[2] << 8) + ((uint32) k[1] << 16) + ((uint32) k[0] << 24)); : b += (k[7] + ((uint32) k[6] << 8) + ((uint32) k[5] << 16) + ((uint32) k[4] << 24)); : c += (k[11] + ((uint32) k[10] << 8) + ((uint32) k[9] << 16) + ((uint32) k[8] << 24)); : #else /* !WORDS_BIGENDIAN */ : a += (k[0] + ((uint32) k[1] << 8) + ((uint32) k[2] << 16) + ((uint32) k[3] << 24)); : b += (k[4] + ((uint32) k[5] << 8) + ((uint32) k[6] << 16) + ((uint32) k[7] << 24)); 0.00 : 49038c: c1 e0 10 shl $0x10,%eax 0.00 : 49038f: c1 e1 08 shl $0x8,%ecx 0.00 : 490392: 01 c1 add %eax,%ecx 0.00 : 490394: 0f b6 47 04 movzbl 0x4(%rdi),%eax : c += (k[8] + ((uint32) k[9] << 8) + ((uint32) k[10] << 16) + ((uint32) k[11] << 24)); 0.00 : 490398: c1 e6 08 shl $0x8,%esi : a += (k[3] + ((uint32) k[2] << 8) + ((uint32) k[1] << 16) + ((uint32) k[0] << 24)); : b += (k[7] + ((uint32) k[6] << 8) + ((uint32) k[5] << 16) + ((uint32) k[4] << 24)); : c += (k[11] + ((uint32) k[10] << 8) + ((uint32) k[9] << 16) + ((uint32) k[8] << 24)); : #else /* !WORDS_BIGENDIAN */ : a += (k[0] + ((uint32) k[1] << 8) + ((uint32) k[2] << 16) + ((uint32) k[3] << 24)); : b += (k[4] + ((uint32) k[5] << 8) + ((uint32) k[6] << 16) + ((uint32) k[7] << 24)); 0.00 : 49039b: 01 c1 add %eax,%ecx 0.00 : 49039d: 0f b6 47 07 movzbl 0x7(%rdi),%eax 0.00 : 4903a1: c1 e0 18 shl $0x18,%eax 0.00 : 4903a4: 01 c1 add %eax,%ecx : c += (k[8] + ((uint32) k[9] << 8) + ((uint32) k[10] << 16) + ((uint32) k[11] << 24)); 0.00 : 4903a6: 0f b6 47 0a movzbl 0xa(%rdi),%eax : a += (k[3] + ((uint32) k[2] << 8) + ((uint32) k[1] << 16) + ((uint32) k[0] << 24)); : b += (k[7] + ((uint32) k[6] << 8) + ((uint32) k[5] << 16) + ((uint32) k[4] << 24)); : c += (k[11] + ((uint32) k[10] << 8) + ((uint32) k[9] << 16) + ((uint32) k[8] << 24)); : #else /* !WORDS_BIGENDIAN */ : a += (k[0] + ((uint32) k[1] << 8) + ((uint32) k[2] << 16) + ((uint32) k[3] << 24)); : b += (k[4] + ((uint32) k[5] << 8) + ((uint32) k[6] << 16) + ((uint32) k[7] << 24)); 0.00 : 4903aa: 01 d1 add %edx,%ecx : #ifdef WORDS_BIGENDIAN : a += (k[3] + ((uint32) k[2] << 8) + ((uint32) k[1] << 16) + ((uint32) k[0] << 24)); : b += (k[7] + ((uint32) k[6] << 8) + ((uint32) k[5] << 16) + ((uint32) k[4] << 24)); : c += (k[11] + ((uint32) k[10] << 8) + ((uint32) k[9] << 16) + ((uint32) k[8] << 24)); : #else /* !WORDS_BIGENDIAN */ : a += (k[0] + ((uint32) k[1] << 8) + ((uint32) k[2] << 16) + ((uint32) k[3] << 24)); 0.00 : 4903ac: 0f b6 57 01 movzbl 0x1(%rdi),%edx : b += (k[4] + ((uint32) k[5] << 8) + ((uint32) k[6] << 16) + ((uint32) k[7] << 24)); : c += (k[8] + ((uint32) k[9] << 8) + ((uint32) k[10] << 16) + ((uint32) k[11] << 24)); 0.00 : 4903b0: c1 e0 10 shl $0x10,%eax 0.00 : 4903b3: 01 c6 add %eax,%esi 0.00 : 4903b5: 0f b6 47 08 movzbl 0x8(%rdi),%eax : #ifdef WORDS_BIGENDIAN : a += (k[3] + ((uint32) k[2] << 8) + ((uint32) k[1] << 16) + ((uint32) k[0] << 24)); : b += (k[7] + ((uint32) k[6] << 8) + ((uint32) k[5] << 16) + ((uint32) k[4] << 24)); : c += (k[11] + ((uint32) k[10] << 8) + ((uint32) k[9] << 16) + ((uint32) k[8] << 24)); : #else /* !WORDS_BIGENDIAN */ : a += (k[0] + ((uint32) k[1] << 8) + ((uint32) k[2] << 16) + ((uint32) k[3] << 24)); 0.00 : 4903b9: c1 e2 08 shl $0x8,%edx : b += (k[4] + ((uint32) k[5] << 8) + ((uint32) k[6] << 16) + ((uint32) k[7] << 24)); : c += (k[8] + ((uint32) k[9] << 8) + ((uint32) k[10] << 16) + ((uint32) k[11] << 24)); 0.00 : 4903bc: 01 c6 add %eax,%esi 0.00 : 4903be: 0f b6 47 0b movzbl 0xb(%rdi),%eax 0.00 : 4903c2: c1 e0 18 shl $0x18,%eax 0.00 : 4903c5: 01 c6 add %eax,%esi : #ifdef WORDS_BIGENDIAN : a += (k[3] + ((uint32) k[2] << 8) + ((uint32) k[1] << 16) + ((uint32) k[0] << 24)); : b += (k[7] + ((uint32) k[6] << 8) + ((uint32) k[5] << 16) + ((uint32) k[4] << 24)); : c += (k[11] + ((uint32) k[10] << 8) + ((uint32) k[9] << 16) + ((uint32) k[8] << 24)); : #else /* !WORDS_BIGENDIAN */ : a += (k[0] + ((uint32) k[1] << 8) + ((uint32) k[2] << 16) + ((uint32) k[3] << 24)); 0.00 : 4903c7: 0f b6 47 02 movzbl 0x2(%rdi),%eax : b += (k[4] + ((uint32) k[5] << 8) + ((uint32) k[6] << 16) + ((uint32) k[7] << 24)); : c += (k[8] + ((uint32) k[9] << 8) + ((uint32) k[10] << 16) + ((uint32) k[11] << 24)); 0.00 : 4903cb: 44 01 c6 add %r8d,%esi : #ifdef WORDS_BIGENDIAN : a += (k[3] + ((uint32) k[2] << 8) + ((uint32) k[1] << 16) + ((uint32) k[0] << 24)); : b += (k[7] + ((uint32) k[6] << 8) + ((uint32) k[5] << 16) + ((uint32) k[4] << 24)); : c += (k[11] + ((uint32) k[10] << 8) + ((uint32) k[9] << 16) + ((uint32) k[8] << 24)); : #else /* !WORDS_BIGENDIAN */ : a += (k[0] + ((uint32) k[1] << 8) + ((uint32) k[2] << 16) + ((uint32) k[3] << 24)); 0.00 : 4903ce: c1 e0 10 shl $0x10,%eax 0.00 : 4903d1: 01 c2 add %eax,%edx 0.00 : 4903d3: 0f b6 07 movzbl (%rdi),%eax 0.00 : 4903d6: 01 c2 add %eax,%edx 0.00 : 4903d8: 0f b6 47 03 movzbl 0x3(%rdi),%eax 0.00 : 4903dc: c1 e0 18 shl $0x18,%eax 0.00 : 4903df: 01 c2 add %eax,%edx : b += (k[4] + ((uint32) k[5] << 8) + ((uint32) k[6] << 16) + ((uint32) k[7] << 24)); : c += (k[8] + ((uint32) k[9] << 8) + ((uint32) k[10] << 16) + ((uint32) k[11] << 24)); : #endif /* WORDS_BIGENDIAN */ : mix(a, b, c); 0.00 : 4903e1: 89 f0 mov %esi,%eax : #ifdef WORDS_BIGENDIAN : a += (k[3] + ((uint32) k[2] << 8) + ((uint32) k[1] << 16) + ((uint32) k[0] << 24)); : b += (k[7] + ((uint32) k[6] << 8) + ((uint32) k[5] << 16) + ((uint32) k[4] << 24)); : c += (k[11] + ((uint32) k[10] << 8) + ((uint32) k[9] << 16) + ((uint32) k[8] << 24)); : #else /* !WORDS_BIGENDIAN */ : a += (k[0] + ((uint32) k[1] << 8) + ((uint32) k[2] << 16) + ((uint32) k[3] << 24)); 0.00 : 4903e3: 44 01 ca add %r9d,%edx : b += (k[4] + ((uint32) k[5] << 8) + ((uint32) k[6] << 16) + ((uint32) k[7] << 24)); : c += (k[8] + ((uint32) k[9] << 8) + ((uint32) k[10] << 16) + ((uint32) k[11] << 24)); : #endif /* WORDS_BIGENDIAN */ : mix(a, b, c); 0.00 : 4903e6: c1 c8 1c ror $0x1c,%eax 0.00 : 4903e9: 29 f2 sub %esi,%edx 0.00 : 4903eb: 01 ce add %ecx,%esi 0.00 : 4903ed: 31 c2 xor %eax,%edx 0.00 : 4903ef: 89 d0 mov %edx,%eax 0.00 : 4903f1: 29 d1 sub %edx,%ecx 0.00 : 4903f3: 01 f2 add %esi,%edx 0.00 : 4903f5: c1 c8 1a ror $0x1a,%eax 0.00 : 4903f8: 31 c8 xor %ecx,%eax 0.00 : 4903fa: 89 c1 mov %eax,%ecx 0.00 : 4903fc: 29 c6 sub %eax,%esi 0.00 : 4903fe: 01 d0 add %edx,%eax 0.00 : 490400: c1 c9 18 ror $0x18,%ecx 0.00 : 490403: 31 f1 xor %esi,%ecx 0.00 : 490405: 89 ce mov %ecx,%esi 0.00 : 490407: 29 ca sub %ecx,%edx 0.00 : 490409: 01 c1 add %eax,%ecx 0.00 : 49040b: c1 ce 10 ror $0x10,%esi : k += 12; : len -= 12; 0.00 : 49040e: 41 83 ea 0c sub $0xc,%r10d : a += (k[0] + ((uint32) k[1] << 8) + ((uint32) k[2] << 16) + ((uint32) k[3] << 24)); : b += (k[4] + ((uint32) k[5] << 8) + ((uint32) k[6] << 16) + ((uint32) k[7] << 24)); : c += (k[8] + ((uint32) k[9] << 8) + ((uint32) k[10] << 16) + ((uint32) k[11] << 24)); : #endif /* WORDS_BIGENDIAN */ : mix(a, b, c); : k += 12; 0.00 : 490412: 48 83 c7 0c add $0xc,%rdi : #else /* !WORDS_BIGENDIAN */ : a += (k[0] + ((uint32) k[1] << 8) + ((uint32) k[2] << 16) + ((uint32) k[3] << 24)); : b += (k[4] + ((uint32) k[5] << 8) + ((uint32) k[6] << 16) + ((uint32) k[7] << 24)); : c += (k[8] + ((uint32) k[9] << 8) + ((uint32) k[10] << 16) + ((uint32) k[11] << 24)); : #endif /* WORDS_BIGENDIAN */ : mix(a, b, c); 0.00 : 490416: 31 d6 xor %edx,%esi 0.00 : 490418: 89 f2 mov %esi,%edx 0.00 : 49041a: 29 f0 sub %esi,%eax 0.00 : 49041c: 44 8d 0c 0e lea (%rsi,%rcx,1),%r9d 0.00 : 490420: c1 ca 0d ror $0xd,%edx 0.00 : 490423: 31 c2 xor %eax,%edx 0.00 : 490425: 41 89 d0 mov %edx,%r8d 0.00 : 490428: 29 d1 sub %edx,%ecx 0.00 : 49042a: 44 01 ca add %r9d,%edx 0.00 : 49042d: 41 c1 c8 1c ror $0x1c,%r8d 0.00 : 490431: 41 31 c8 xor %ecx,%r8d : else : { : /* Code path for non-aligned source data */ : : /* handle most of the key */ : while (len >= 12) 0.00 : 490434: 41 83 fa 0b cmp $0xb,%r10d 0.00 : 490438: 0f 87 42 ff ff ff ja 490380 0.00 : 49043e: 45 89 cb mov %r9d,%r11d 0.00 : 490441: 89 d6 mov %edx,%esi 0.00 : 490443: 44 89 c3 mov %r8d,%ebx : case 1: : a += ((uint32) k[0] << 24); : /* case 0: nothing left to add */ : } : #else /* !WORDS_BIGENDIAN */ : switch (len) /* all the case statements fall through */ 0.00 : 490446: 41 83 fa 0b cmp $0xb,%r10d 0.00 : 49044a: 0f 87 01 01 00 00 ja 490551 0.00 : 490450: 44 89 d0 mov %r10d,%eax 0.00 : 490453: ff 24 c5 18 22 7b 00 jmpq *0x7b2218(,%rax,8) 0.00 : 49045a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : { : /* Code path for aligned source data */ : register const uint32 *ka = (const uint32 *) k; : : /* handle most of the key */ : while (len >= 12) 0.00 : 490460: 83 fe 0b cmp $0xb,%esi 0.00 : 490463: 45 89 c1 mov %r8d,%r9d 0.00 : 490466: 44 89 c1 mov %r8d,%ecx 0.00 : 490469: 0f 86 79 01 00 00 jbe 4905e8 0.00 : 49046f: 90 nop : { : a += ka[0]; : b += ka[1]; : c += ka[2]; 0.00 : 490470: 44 89 c6 mov %r8d,%esi /home/Computational/mark/src/postgres-andres/src/backend/access/hash/hashfunc.c:327 12.50 : 490473: 03 77 08 add 0x8(%rdi),%esi : register const uint32 *ka = (const uint32 *) k; : : /* handle most of the key */ : while (len >= 12) : { : a += ka[0]; 0.00 : 490476: 44 89 c8 mov %r9d,%eax 0.00 : 490479: 03 07 add (%rdi),%eax : b += ka[1]; 0.00 : 49047b: 03 4f 04 add 0x4(%rdi),%ecx : c += ka[2]; : mix(a, b, c); : ka += 3; : len -= 12; 0.00 : 49047e: 41 83 ea 0c sub $0xc,%r10d : { : a += ka[0]; : b += ka[1]; : c += ka[2]; : mix(a, b, c); : ka += 3; 0.00 : 490482: 48 83 c7 0c add $0xc,%rdi : while (len >= 12) : { : a += ka[0]; : b += ka[1]; : c += ka[2]; : mix(a, b, c); 0.00 : 490486: 89 f2 mov %esi,%edx 0.00 : 490488: 29 f0 sub %esi,%eax 0.00 : 49048a: c1 ca 1c ror $0x1c,%edx 0.00 : 49048d: 01 ce add %ecx,%esi 0.00 : 49048f: 31 d0 xor %edx,%eax 0.00 : 490491: 89 c2 mov %eax,%edx 0.00 : 490493: 29 c1 sub %eax,%ecx 0.00 : 490495: 01 f0 add %esi,%eax 0.00 : 490497: c1 ca 1a ror $0x1a,%edx 0.00 : 49049a: 31 ca xor %ecx,%edx 0.00 : 49049c: 89 d1 mov %edx,%ecx 0.00 : 49049e: 29 d6 sub %edx,%esi 0.00 : 4904a0: 01 c2 add %eax,%edx 0.00 : 4904a2: c1 c9 18 ror $0x18,%ecx 0.00 : 4904a5: 31 f1 xor %esi,%ecx 0.00 : 4904a7: 89 ce mov %ecx,%esi 0.00 : 4904a9: 29 c8 sub %ecx,%eax 0.00 : 4904ab: 01 d1 add %edx,%ecx 0.00 : 4904ad: c1 ce 10 ror $0x10,%esi 0.00 : 4904b0: 31 c6 xor %eax,%esi 0.00 : 4904b2: 89 f0 mov %esi,%eax /home/Computational/mark/src/postgres-andres/src/backend/access/hash/hashfunc.c:328 12.50 : 4904b4: 29 f2 sub %esi,%edx 0.00 : 4904b6: 44 8d 0c 0e lea (%rsi,%rcx,1),%r9d 0.00 : 4904ba: c1 c8 0d ror $0xd,%eax 0.00 : 4904bd: 31 d0 xor %edx,%eax 0.00 : 4904bf: 41 89 c0 mov %eax,%r8d 0.00 : 4904c2: 29 c1 sub %eax,%ecx 0.00 : 4904c4: 41 c1 c8 1c ror $0x1c,%r8d 12.50 : 4904c8: 41 31 c8 xor %ecx,%r8d : { : /* Code path for aligned source data */ : register const uint32 *ka = (const uint32 *) k; : : /* handle most of the key */ : while (len >= 12) 0.00 : 4904cb: 41 83 fa 0b cmp $0xb,%r10d : { : a += ka[0]; : b += ka[1]; : c += ka[2]; : mix(a, b, c); 0.00 : 4904cf: 42 8d 0c 08 lea (%rax,%r9,1),%ecx : { : /* Code path for aligned source data */ : register const uint32 *ka = (const uint32 *) k; : : /* handle most of the key */ : while (len >= 12) 0.00 : 4904d3: 77 9b ja 490470 0.00 : 4904d5: 45 89 cb mov %r9d,%r11d 0.00 : 4904d8: 89 ce mov %ecx,%esi 0.00 : 4904da: 44 89 c3 mov %r8d,%ebx : case 1: : a += ((uint32) k[0] << 24); : /* case 0: nothing left to add */ : } : #else /* !WORDS_BIGENDIAN */ : switch (len) 0.00 : 4904dd: 41 83 fa 0b cmp $0xb,%r10d 0.00 : 4904e1: 77 6e ja 490551 /home/Computational/mark/src/postgres-andres/src/backend/access/hash/hashfunc.c:375 12.50 : 4904e3: 44 89 d0 mov %r10d,%eax 0.00 : 4904e6: ff 24 c5 78 22 7b 00 jmpq *0x7b2278(,%rax,8) : } : #else /* !WORDS_BIGENDIAN */ : switch (len) /* all the case statements fall through */ : { : case 11: : c += ((uint32) k[10] << 24); 0.00 : 4904ed: 0f b6 47 0a movzbl 0xa(%rdi),%eax 0.00 : 4904f1: c1 e0 18 shl $0x18,%eax 0.00 : 4904f4: 42 8d 1c 00 lea (%rax,%r8,1),%ebx : case 10: : c += ((uint32) k[9] << 16); 0.00 : 4904f8: 0f b6 47 09 movzbl 0x9(%rdi),%eax 0.00 : 4904fc: c1 e0 10 shl $0x10,%eax 0.00 : 4904ff: 01 c3 add %eax,%ebx : case 9: : c += ((uint32) k[8] << 8); 0.00 : 490501: 0f b6 47 08 movzbl 0x8(%rdi),%eax 0.00 : 490505: c1 e0 08 shl $0x8,%eax 0.00 : 490508: 01 c3 add %eax,%ebx : /* the lowest byte of c is reserved for the length */ : case 8: : b += ((uint32) k[7] << 24); 0.00 : 49050a: 0f b6 47 07 movzbl 0x7(%rdi),%eax 0.00 : 49050e: c1 e0 18 shl $0x18,%eax 0.00 : 490511: 8d 34 10 lea (%rax,%rdx,1),%esi : case 7: : b += ((uint32) k[6] << 16); 0.00 : 490514: 0f b6 47 06 movzbl 0x6(%rdi),%eax 0.00 : 490518: c1 e0 10 shl $0x10,%eax 0.00 : 49051b: 01 c6 add %eax,%esi : case 6: : b += ((uint32) k[5] << 8); 0.00 : 49051d: 0f b6 47 05 movzbl 0x5(%rdi),%eax 0.00 : 490521: c1 e0 08 shl $0x8,%eax 0.00 : 490524: 01 c6 add %eax,%esi : case 5: : b += k[4]; 0.00 : 490526: 0f b6 47 04 movzbl 0x4(%rdi),%eax 0.00 : 49052a: 01 c6 add %eax,%esi : case 4: : a += ((uint32) k[3] << 24); 0.00 : 49052c: 0f b6 47 03 movzbl 0x3(%rdi),%eax 0.00 : 490530: c1 e0 18 shl $0x18,%eax 0.00 : 490533: 46 8d 1c 08 lea (%rax,%r9,1),%r11d : case 3: : a += ((uint32) k[2] << 16); 0.00 : 490537: 0f b6 47 02 movzbl 0x2(%rdi),%eax 0.00 : 49053b: c1 e0 10 shl $0x10,%eax 0.00 : 49053e: 41 01 c3 add %eax,%r11d : case 2: : a += ((uint32) k[1] << 8); 0.00 : 490541: 0f b6 47 01 movzbl 0x1(%rdi),%eax 0.00 : 490545: c1 e0 08 shl $0x8,%eax 0.00 : 490548: 41 01 c3 add %eax,%r11d : case 1: : a += k[0]; 0.00 : 49054b: 0f b6 07 movzbl (%rdi),%eax 0.00 : 49054e: 41 01 c3 add %eax,%r11d : /* case 0: nothing left to add */ : } : #endif /* WORDS_BIGENDIAN */ : } : : final(a, b, c); 0.00 : 490551: 89 da mov %ebx,%edx 0.00 : 490553: 89 f0 mov %esi,%eax 0.00 : 490555: 31 f2 xor %esi,%edx 0.00 : 490557: c1 c8 12 ror $0x12,%eax 0.00 : 49055a: 29 c2 sub %eax,%edx 0.00 : 49055c: 89 d1 mov %edx,%ecx 0.00 : 49055e: 89 d0 mov %edx,%eax 0.00 : 490560: c1 c8 15 ror $0x15,%eax 0.00 : 490563: 44 31 d9 xor %r11d,%ecx 0.00 : 490566: 29 c1 sub %eax,%ecx 0.00 : 490568: 89 c8 mov %ecx,%eax 0.00 : 49056a: 31 ce xor %ecx,%esi 0.00 : 49056c: c1 c8 07 ror $0x7,%eax 0.00 : 49056f: 29 c6 sub %eax,%esi 0.00 : 490571: 89 f0 mov %esi,%eax 0.00 : 490573: 31 d0 xor %edx,%eax 0.00 : 490575: 89 f2 mov %esi,%edx 0.00 : 490577: c1 ca 10 ror $0x10,%edx 0.00 : 49057a: 29 d0 sub %edx,%eax 0.00 : 49057c: 89 c2 mov %eax,%edx 0.00 : 49057e: 31 ca xor %ecx,%edx 0.00 : 490580: 89 c1 mov %eax,%ecx 0.00 : 490582: c1 c9 1c ror $0x1c,%ecx 0.00 : 490585: 29 ca sub %ecx,%edx 0.00 : 490587: 89 d1 mov %edx,%ecx 0.00 : 490589: c1 ca 12 ror $0x12,%edx /home/Computational/mark/src/postgres-andres/src/backend/access/hash/hashfunc.c:496 12.50 : 49058c: 31 f1 xor %esi,%ecx 0.00 : 49058e: 29 d1 sub %edx,%ecx 0.00 : 490590: 31 c8 xor %ecx,%eax 0.00 : 490592: c1 c9 08 ror $0x8,%ecx 0.00 : 490595: 29 c8 sub %ecx,%eax : : /* report the result */ : return UInt32GetDatum(c); : } /home/Computational/mark/src/postgres-andres/src/backend/access/hash/hashfunc.c:500 12.50 : 490597: 5b pop %rbx 0.00 : 490598: c9 leaveq 0.00 : 490599: c3 retq : case 8: : b += ka[1]; : a += ka[0]; : break; : case 7: : b += ((uint32) k[6] << 16); 0.00 : 49059a: 0f b6 47 06 movzbl 0x6(%rdi),%eax 0.00 : 49059e: c1 e0 10 shl $0x10,%eax 0.00 : 4905a1: 8d 34 08 lea (%rax,%rcx,1),%esi : /* fall through */ : case 6: : b += ((uint32) k[5] << 8); 0.00 : 4905a4: 0f b6 47 05 movzbl 0x5(%rdi),%eax 0.00 : 4905a8: c1 e0 08 shl $0x8,%eax 0.00 : 4905ab: 01 c6 add %eax,%esi : /* fall through */ : case 5: : b += k[4]; 0.00 : 4905ad: 0f b6 47 04 movzbl 0x4(%rdi),%eax 0.00 : 4905b1: 01 c6 add %eax,%esi : /* fall through */ : case 4: : a += ka[0]; 0.00 : 4905b3: 45 89 cb mov %r9d,%r11d 0.00 : 4905b6: 44 03 1f add (%rdi),%r11d : break; 0.00 : 4905b9: eb 96 jmp 490551 : } : #else /* !WORDS_BIGENDIAN */ : switch (len) : { : case 11: : c += ((uint32) k[10] << 24); 0.00 : 4905bb: 0f b6 47 0a movzbl 0xa(%rdi),%eax 0.00 : 4905bf: c1 e0 18 shl $0x18,%eax 0.00 : 4905c2: 42 8d 1c 00 lea (%rax,%r8,1),%ebx : /* fall through */ : case 10: : c += ((uint32) k[9] << 16); 0.00 : 4905c6: 0f b6 47 09 movzbl 0x9(%rdi),%eax 0.00 : 4905ca: c1 e0 10 shl $0x10,%eax 0.00 : 4905cd: 01 c3 add %eax,%ebx : /* fall through */ : case 9: : c += ((uint32) k[8] << 8); 0.00 : 4905cf: 0f b6 47 08 movzbl 0x8(%rdi),%eax 0.00 : 4905d3: c1 e0 08 shl $0x8,%eax 0.00 : 4905d6: 01 c3 add %eax,%ebx : /* the lowest byte of c is reserved for the length */ : /* fall through */ : case 8: : b += ka[1]; /home/Computational/mark/src/postgres-andres/src/backend/access/hash/hashfunc.c:388 12.50 : 4905d8: 89 ce mov %ecx,%esi : a += ka[0]; 0.00 : 4905da: 45 89 cb mov %r9d,%r11d : case 9: : c += ((uint32) k[8] << 8); : /* the lowest byte of c is reserved for the length */ : /* fall through */ : case 8: : b += ka[1]; 0.00 : 4905dd: 03 77 04 add 0x4(%rdi),%esi : a += ka[0]; 0.00 : 4905e0: 44 03 1f add (%rdi),%r11d : break; 0.00 : 4905e3: e9 69 ff ff ff jmpq 490551 : { : /* Code path for aligned source data */ : register const uint32 *ka = (const uint32 *) k; : : /* handle most of the key */ : while (len >= 12) 0.00 : 4905e8: 45 89 c3 mov %r8d,%r11d 0.00 : 4905eb: 44 89 c6 mov %r8d,%esi 0.00 : 4905ee: 44 89 c3 mov %r8d,%ebx 0.00 : 4905f1: e9 e7 fe ff ff jmpq 4904dd : else : { : /* Code path for non-aligned source data */ : : /* handle most of the key */ : while (len >= 12) 0.00 : 4905f6: 45 89 c3 mov %r8d,%r11d 0.00 : 4905f9: 44 89 c6 mov %r8d,%esi 0.00 : 4905fc: 44 89 c3 mov %r8d,%ebx 0.00 : 4905ff: e9 42 fe ff ff jmpq 490446 : /* fall through */ : case 4: : a += ka[0]; : break; : case 3: : a += ((uint32) k[2] << 16); 0.00 : 490604: 0f b6 47 02 movzbl 0x2(%rdi),%eax 0.00 : 490608: c1 e0 10 shl $0x10,%eax 0.00 : 49060b: 46 8d 1c 08 lea (%rax,%r9,1),%r11d 0.00 : 49060f: e9 2d ff ff ff jmpq 490541 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 37.50 /home/Computational/mark/src/postgres-andres/src/backend/executor/execTuples.c:450 37.50 /home/Computational/mark/src/postgres-andres/src/backend/executor/execTuples.c:461 12.50 /home/Computational/mark/src/postgres-andres/src/backend/executor/execTuples.c:459 12.50 /home/Computational/mark/src/postgres-andres/src/backend/executor/execTuples.c:484 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000005b4110 : : * NB: only the tuple is cleared, not the tuple descriptor (if any). : * -------------------------------- : */ : TupleTableSlot * /* return: slot passed */ : ExecClearTuple(TupleTableSlot *slot) /* slot in which to store tuple */ : { 0.00 : 5b4110: 55 push %rbp /home/Computational/mark/src/postgres-andres/src/backend/executor/execTuples.c:450 37.50 : 5b4111: 48 89 e5 mov %rsp,%rbp 0.00 : 5b4114: 53 push %rbx 0.00 : 5b4115: 48 89 fb mov %rdi,%rbx 0.00 : 5b4118: 48 83 ec 08 sub $0x8,%rsp : Assert(slot != NULL); : : /* : * Free the old physical tuple if necessary. : */ : if (slot->tts_shouldFree) 0.00 : 5b411c: 80 7f 05 00 cmpb $0x0,0x5(%rdi) /home/Computational/mark/src/postgres-andres/src/backend/executor/execTuples.c:459 12.50 : 5b4120: 75 5e jne 5b4180 : heap_freetuple(slot->tts_tuple); : if (slot->tts_shouldFreeMin) /home/Computational/mark/src/postgres-andres/src/backend/executor/execTuples.c:461 37.50 : 5b4122: 80 7b 06 00 cmpb $0x0,0x6(%rbx) 0.00 : 5b4126: 75 48 jne 5b4170 : slot->tts_shouldFreeMin = false; : : /* : * Drop the pin on the referenced buffer, if there is one. : */ : if (BufferIsValid(slot->tts_buffer)) 0.00 : 5b4128: 8b 7b 20 mov 0x20(%rbx),%edi : if (slot->tts_shouldFree) : heap_freetuple(slot->tts_tuple); : if (slot->tts_shouldFreeMin) : heap_free_minimal_tuple(slot->tts_mintuple); : : slot->tts_tuple = NULL; 0.00 : 5b412b: 48 c7 43 08 00 00 00 movq $0x0,0x8(%rbx) 0.00 : 5b4132: 00 : slot->tts_mintuple = NULL; 0.00 : 5b4133: 48 c7 43 38 00 00 00 movq $0x0,0x38(%rbx) 0.00 : 5b413a: 00 : slot->tts_shouldFree = false; 0.00 : 5b413b: c6 43 05 00 movb $0x0,0x5(%rbx) : slot->tts_shouldFreeMin = false; 0.00 : 5b413f: c6 43 06 00 movb $0x0,0x6(%rbx) : : /* : * Drop the pin on the referenced buffer, if there is one. : */ : if (BufferIsValid(slot->tts_buffer)) 0.00 : 5b4143: 85 ff test %edi,%edi 0.00 : 5b4145: 74 05 je 5b414c : ReleaseBuffer(slot->tts_buffer); 0.00 : 5b4147: e8 14 0d 0c 00 callq 674e60 : : slot->tts_buffer = InvalidBuffer; 0.00 : 5b414c: c7 43 20 00 00 00 00 movl $0x0,0x20(%rbx) : : /* : * Mark it empty. : */ : slot->tts_isempty = true; 0.00 : 5b4153: c6 43 04 01 movb $0x1,0x4(%rbx) : slot->tts_nvalid = 0; : : return slot; : } 0.00 : 5b4157: 48 89 d8 mov %rbx,%rax : : /* : * Mark it empty. : */ : slot->tts_isempty = true; : slot->tts_nvalid = 0; 0.00 : 5b415a: c7 43 24 00 00 00 00 movl $0x0,0x24(%rbx) : : return slot; : } 0.00 : 5b4161: 48 83 c4 08 add $0x8,%rsp 0.00 : 5b4165: 5b pop %rbx 0.00 : 5b4166: c9 leaveq /home/Computational/mark/src/postgres-andres/src/backend/executor/execTuples.c:484 12.50 : 5b4167: c3 retq 0.00 : 5b4168: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 5b416f: 00 : * Free the old physical tuple if necessary. : */ : if (slot->tts_shouldFree) : heap_freetuple(slot->tts_tuple); : if (slot->tts_shouldFreeMin) : heap_free_minimal_tuple(slot->tts_mintuple); 0.00 : 5b4170: 48 8b 7b 38 mov 0x38(%rbx),%rdi 0.00 : 5b4174: e8 37 ab eb ff callq 46ecb0 0.00 : 5b4179: eb ad jmp 5b4128 0.00 : 5b417b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : : /* : * Free the old physical tuple if necessary. : */ : if (slot->tts_shouldFree) : heap_freetuple(slot->tts_tuple); 0.00 : 5b4180: 48 8b 7f 08 mov 0x8(%rdi),%rdi 0.00 : 5b4184: e8 37 ab eb ff callq 46ecc0 0.00 : 5b4189: eb 97 jmp 5b4122 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 75.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:1070 25.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:1071 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000782c50 : : CHashPtr g; : CHashNode *n; : CHashPtr *garbage; : : n = CHashTableGetNode(table, c); : garbage = CHashTableGetGarbageByBucket(table, bucket); 0.00 : 782c50: 0f b6 4f 14 movzbl 0x14(%rdi),%ecx : { : CHashPtr g; : CHashNode *n; : CHashPtr *garbage; : : n = CHashTableGetNode(table, c); 0.00 : 782c54: 89 d0 mov %edx,%eax : * failure to match an already-deleted item shouldn't cause any problems; : * this is why gcnext can share space with the hash value. : */ : static void : CHashAddToGarbage(CHashTable table, uint32 bucket, CHashPtr c) : { 0.00 : 782c56: 55 push %rbp : CHashPtr g; : CHashNode *n; : CHashPtr *garbage; : : n = CHashTableGetNode(table, c); 0.00 : 782c57: d1 e8 shr %eax 0.00 : 782c59: 41 89 c0 mov %eax,%r8d : * failure to match an already-deleted item shouldn't cause any problems; : * this is why gcnext can share space with the hash value. : */ : static void : CHashAddToGarbage(CHashTable table, uint32 bucket, CHashPtr c) : { 0.00 : 782c5c: 48 89 e5 mov %rsp,%rbp : CHashPtr g; : CHashNode *n; : CHashPtr *garbage; : : n = CHashTableGetNode(table, c); 0.00 : 782c5f: 44 0f af 47 1c imul 0x1c(%rdi),%r8d : garbage = CHashTableGetGarbageByBucket(table, bucket); 0.00 : 782c64: d3 ee shr %cl,%esi 0.00 : 782c66: 0f b6 4f 15 movzbl 0x15(%rdi),%ecx 0.00 : 782c6a: 89 f0 mov %esi,%eax : { : CHashPtr g; : CHashNode *n; : CHashPtr *garbage; : : n = CHashTableGetNode(table, c); 0.00 : 782c6c: 4c 03 47 30 add 0x30(%rdi),%r8 : garbage = CHashTableGetGarbageByBucket(table, bucket); 0.00 : 782c70: d3 e8 shr %cl,%eax 0.00 : 782c72: 01 f0 add %esi,%eax 0.00 : 782c74: 48 8d 0c 85 00 00 00 lea 0x0(,%rax,4),%rcx 0.00 : 782c7b: 00 0.00 : 782c7c: 48 03 4f 28 add 0x28(%rdi),%rcx 0.00 : 782c80: eb 0e jmp 782c90 0.00 : 782c82: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : { : g = *garbage; : n->un.gcnext = g; : if (__sync_bool_compare_and_swap(garbage, g, c)) : break; : CHashTableIncrementStatistic(table, CHS_Garbage_Enqueue_Retry); 0.00 : 782c88: 48 83 87 a8 00 00 00 addq $0x1,0xa8(%rdi) 0.00 : 782c8f: 01 : n = CHashTableGetNode(table, c); : garbage = CHashTableGetGarbageByBucket(table, bucket); : : while (1) : { : g = *garbage; 0.00 : 782c90: 8b 01 mov (%rcx),%eax : n->un.gcnext = g; /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:1070 75.00 : 782c92: 41 89 40 04 mov %eax,0x4(%r8) : if (__sync_bool_compare_and_swap(garbage, g, c)) 0.00 : 782c96: f0 0f b1 11 lock cmpxchg %edx,(%rcx) /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:1071 25.00 : 782c9a: 75 ec jne 782c88 : break; : CHashTableIncrementStatistic(table, CHS_Garbage_Enqueue_Retry); : } : } 0.00 : 782c9c: c9 leaveq Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 28.57 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtutils.c:1433 14.29 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtutils.c:1478 14.29 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtutils.c:1534 14.29 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtutils.c:1554 14.29 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtutils.c:1440 14.29 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtutils.c:1549 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000004ae420 <_bt_checkkeys>: : */ : IndexTuple : _bt_checkkeys(IndexScanDesc scan, : Page page, OffsetNumber offnum, : ScanDirection dir, bool *continuescan) : { 0.00 : 4ae420: 55 push %rbp 0.00 : 4ae421: 48 89 e5 mov %rsp,%rbp 0.00 : 4ae424: 41 57 push %r15 0.00 : 4ae426: 41 56 push %r14 0.00 : 4ae428: 41 55 push %r13 0.00 : 4ae42a: 41 54 push %r12 0.00 : 4ae42c: 53 push %rbx 0.00 : 4ae42d: 48 83 ec 18 sub $0x18,%rsp 0.00 : 4ae431: 4c 89 45 c0 mov %r8,-0x40(%rbp) : BTScanOpaque so; : int keysz; : int ikey; : ScanKey key; : : *continuescan = true; /* default assumption */ 0.00 : 4ae435: 48 8b 45 c0 mov -0x40(%rbp),%rax : */ : IndexTuple : _bt_checkkeys(IndexScanDesc scan, : Page page, OffsetNumber offnum, : ScanDirection dir, bool *continuescan) : { 0.00 : 4ae439: 89 4d cc mov %ecx,-0x34(%rbp) : ItemId iid = PageGetItemId(page, offnum); 0.00 : 4ae43c: 0f b7 ca movzwl %dx,%ecx 0.00 : 4ae43f: 4c 8d 41 ff lea -0x1(%rcx),%r8 : BTScanOpaque so; : int keysz; : int ikey; : ScanKey key; : : *continuescan = true; /* default assumption */ 0.00 : 4ae443: c6 00 01 movb $0x1,(%rax) : * not bother examining the tuple's index keys, but just return : * immediately with continuescan = true to proceed to the next tuple. : * However, if this is the last tuple on the page, we should check the : * index keys to prevent uselessly advancing to the next page. : */ : if (scan->ignore_killed_tuples && ItemIdIsDead(iid)) 0.00 : 4ae446: 80 7f 32 00 cmpb $0x0,0x32(%rdi) 0.00 : 4ae44a: 74 14 je 4ae460 <_bt_checkkeys+0x40> 0.00 : 4ae44c: 8b 44 8e 14 mov 0x14(%rsi,%rcx,4),%eax 0.00 : 4ae450: 25 00 80 01 00 and $0x18000,%eax 0.00 : 4ae455: 3d 00 80 01 00 cmp $0x18000,%eax 0.00 : 4ae45a: 0f 84 85 03 00 00 je 4ae7e5 <_bt_checkkeys+0x3c5> : } : else : { : BTPageOpaque opaque = (BTPageOpaque) PageGetSpecialPointer(page); : : if (offnum > P_FIRSTDATAKEY(opaque)) 0.00 : 4ae460: c6 45 d3 01 movb $0x1,-0x2d(%rbp) : tuple_alive = false; : } : else : tuple_alive = true; : : tuple = (IndexTuple) PageGetItem(page, iid); 0.00 : 4ae464: 42 0f b7 44 86 18 movzwl 0x18(%rsi,%r8,4),%eax 0.00 : 4ae46a: 25 ff 7f 00 00 and $0x7fff,%eax 0.00 : 4ae46f: 4c 8d 2c 06 lea (%rsi,%rax,1),%r13 : : tupdesc = RelationGetDescr(scan->indexRelation); 0.00 : 4ae473: 48 8b 47 08 mov 0x8(%rdi),%rax 0.00 : 4ae477: 4c 8b 78 38 mov 0x38(%rax),%r15 : so = (BTScanOpaque) scan->opaque; 0.00 : 4ae47b: 48 8b 47 38 mov 0x38(%rdi),%rax : keysz = so->numberOfKeys; 0.00 : 4ae47f: 8b 50 04 mov 0x4(%rax),%edx : : for (key = so->keyData, ikey = 0; ikey < keysz; key++, ikey++) 0.00 : 4ae482: 85 d2 test %edx,%edx : : tuple = (IndexTuple) PageGetItem(page, iid); : : tupdesc = RelationGetDescr(scan->indexRelation); : so = (BTScanOpaque) scan->opaque; : keysz = so->numberOfKeys; 0.00 : 4ae484: 89 55 d4 mov %edx,-0x2c(%rbp) : : for (key = so->keyData, ikey = 0; ikey < keysz; key++, ikey++) 0.00 : 4ae487: 48 8b 58 08 mov 0x8(%rax),%rbx 0.00 : 4ae48b: 0f 8e df 01 00 00 jle 4ae670 <_bt_checkkeys+0x250> 0.00 : 4ae491: 45 31 f6 xor %r14d,%r14d 0.00 : 4ae494: eb 34 jmp 4ae4ca <_bt_checkkeys+0xaa> 0.00 : 4ae496: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 0.00 : 4ae49d: 00 00 00 : &isNull); : : if (key->sk_flags & SK_ISNULL) : { : /* Handle IS NULL/NOT NULL tests */ : if (key->sk_flags & SK_SEARCHNULL) 0.00 : 4ae4a0: 40 f6 c7 40 test $0x40,%dil 0.00 : 4ae4a4: 0f 84 56 01 00 00 je 4ae600 <_bt_checkkeys+0x1e0> : { : if (isNull) 0.00 : 4ae4aa: 84 c9 test %cl,%cl 0.00 : 4ae4ac: 0f 1f 40 00 nopl 0x0(%rax) 0.00 : 4ae4b0: 0f 84 52 01 00 00 je 4ae608 <_bt_checkkeys+0x1e8> : : tupdesc = RelationGetDescr(scan->indexRelation); : so = (BTScanOpaque) scan->opaque; : keysz = so->numberOfKeys; : : for (key = so->keyData, ikey = 0; ikey < keysz; key++, ikey++) 0.00 : 4ae4b6: 41 83 c6 01 add $0x1,%r14d 0.00 : 4ae4ba: 44 39 75 d4 cmp %r14d,-0x2c(%rbp) 0.00 : 4ae4be: 66 90 xchg %ax,%ax 0.00 : 4ae4c0: 0f 8e aa 01 00 00 jle 4ae670 <_bt_checkkeys+0x250> 0.00 : 4ae4c6: 48 83 c3 48 add $0x48,%rbx : Datum datum; : bool isNull; : Datum test; : : /* row-comparison keys need special processing */ : if (key->sk_flags & SK_ROW_HEADER) 0.00 : 4ae4ca: 8b 3b mov (%rbx),%edi /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtutils.c:1433 28.57 : 4ae4cc: 40 f6 c7 04 test $0x4,%dil 0.00 : 4ae4d0: 0f 85 aa 01 00 00 jne 4ae680 <_bt_checkkeys+0x260> : if (_bt_check_rowcompare(key, tuple, tupdesc, dir, continuescan)) : continue; : return NULL; : } : : datum = index_getattr(tuple, 0.00 : 4ae4d6: 66 41 83 7d 06 00 cmpw $0x0,0x6(%r13) 0.00 : 4ae4dc: 0f 88 c6 00 00 00 js 4ae5a8 <_bt_checkkeys+0x188> 0.00 : 4ae4e2: 0f b7 4b 04 movzwl 0x4(%rbx),%ecx 0.00 : 4ae4e6: 49 8b 47 08 mov 0x8(%r15),%rax 0.00 : 4ae4ea: 48 0f bf d1 movswq %cx,%rdx 0.00 : 4ae4ee: 48 8b 54 d0 f8 mov -0x8(%rax,%rdx,8),%rdx 0.00 : 4ae4f3: 8b 42 54 mov 0x54(%rdx),%eax 0.00 : 4ae4f6: 85 c0 test %eax,%eax 0.00 : 4ae4f8: 0f 88 32 01 00 00 js 4ae630 <_bt_checkkeys+0x210> 0.00 : 4ae4fe: 80 7a 5c 00 cmpb $0x0,0x5c(%rdx) 0.00 : 4ae502: 0f 84 e8 00 00 00 je 4ae5f0 <_bt_checkkeys+0x1d0> 0.00 : 4ae508: 0f b7 52 4c movzwl 0x4c(%rdx),%edx 0.00 : 4ae50c: 66 83 fa 08 cmp $0x8,%dx 0.00 : 4ae510: 0f 84 2a 01 00 00 je 4ae640 <_bt_checkkeys+0x220> 0.00 : 4ae516: 66 83 fa 04 cmp $0x4,%dx 0.00 : 4ae51a: 0f 84 30 01 00 00 je 4ae650 <_bt_checkkeys+0x230> 0.00 : 4ae520: 66 83 fa 02 cmp $0x2,%dx 0.00 : 4ae524: 0f 84 36 01 00 00 je 4ae660 <_bt_checkkeys+0x240> 0.00 : 4ae52a: 48 98 cltq 0.00 : 4ae52c: 31 c9 xor %ecx,%ecx 0.00 : 4ae52e: 41 0f b6 54 05 08 movzbl 0x8(%r13,%rax,1),%edx 0.00 : 4ae534: 0f 1f 40 00 nopl 0x0(%rax) : key->sk_attno, : tupdesc, : &isNull); : : if (key->sk_flags & SK_ISNULL) 0.00 : 4ae538: 40 f6 c7 01 test $0x1,%dil 0.00 : 4ae53c: 0f 85 5e ff ff ff jne 4ae4a0 <_bt_checkkeys+0x80> : * In any case, this indextuple doesn't match the qual. : */ : return NULL; : } : : if (isNull) /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtutils.c:1478 14.29 : 4ae542: 84 c9 test %cl,%cl 0.00 : 4ae544: 0f 85 ec 02 00 00 jne 4ae836 <_bt_checkkeys+0x416> : * In any case, this indextuple doesn't match the qual. : */ : return NULL; : } : : test = FunctionCall2Coll(&key->sk_func, key->sk_collation, 0.00 : 4ae54a: 48 8b 4b 40 mov 0x40(%rbx),%rcx 0.00 : 4ae54e: 8b 73 0c mov 0xc(%rbx),%esi 0.00 : 4ae551: 48 8d 7b 10 lea 0x10(%rbx),%rdi 0.00 : 4ae555: e8 d6 fa 2c 00 callq 77e030 : datum, key->sk_argument); : : if (!DatumGetBool(test)) 0.00 : 4ae55a: 84 c0 test %al,%al 0.00 : 4ae55c: 0f 85 54 ff ff ff jne 4ae4b6 <_bt_checkkeys+0x96> : * Note: because we stop the scan as soon as any required equality : * qual fails, it is critical that equality quals be used for the : * initial positioning in _bt_first() when they are available. See : * comments in _bt_first(). : */ : if ((key->sk_flags & SK_BT_REQFWD) && 0.00 : 4ae562: 8b 03 mov (%rbx),%eax /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtutils.c:1534 14.29 : 4ae564: a9 00 00 01 00 test $0x10000,%eax 0.00 : 4ae569: 74 0b je 4ae576 <_bt_checkkeys+0x156> 0.00 : 4ae56b: 83 7d cc 01 cmpl $0x1,-0x34(%rbp) 0.00 : 4ae56f: 90 nop 0.00 : 4ae570: 0f 84 e0 01 00 00 je 4ae756 <_bt_checkkeys+0x336> : ScanDirectionIsForward(dir)) : *continuescan = false; : else if ((key->sk_flags & SK_BT_REQBKWD) && 0.00 : 4ae576: a9 00 00 02 00 test $0x20000,%eax 0.00 : 4ae57b: 74 13 je 4ae590 <_bt_checkkeys+0x170> 0.00 : 4ae57d: 83 7d cc ff cmpl $0xffffffff,-0x34(%rbp) 0.00 : 4ae581: 0f 84 a0 02 00 00 je 4ae827 <_bt_checkkeys+0x407> 0.00 : 4ae587: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 4ae58e: 00 00 : return NULL; : } : } : : /* Check for failure due to it being a killed tuple. */ : if (!tuple_alive) 0.00 : 4ae590: 45 31 ed xor %r13d,%r13d : return NULL; : : /* If we get here, the tuple passes all index quals. */ : return tuple; : } /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtutils.c:1554 14.29 : 4ae593: 48 83 c4 18 add $0x18,%rsp 0.00 : 4ae597: 4c 89 e8 mov %r13,%rax 0.00 : 4ae59a: 5b pop %rbx 0.00 : 4ae59b: 41 5c pop %r12 0.00 : 4ae59d: 41 5d pop %r13 0.00 : 4ae59f: 41 5e pop %r14 0.00 : 4ae5a1: 41 5f pop %r15 0.00 : 4ae5a3: c9 leaveq 0.00 : 4ae5a4: c3 retq 0.00 : 4ae5a5: 0f 1f 00 nopl (%rax) : if (_bt_check_rowcompare(key, tuple, tupdesc, dir, continuescan)) : continue; : return NULL; : } : : datum = index_getattr(tuple, 0.00 : 4ae5a8: 0f bf 73 04 movswl 0x4(%rbx),%esi 0.00 : 4ae5ac: 31 d2 xor %edx,%edx 0.00 : 4ae5ae: 8d 4e ff lea -0x1(%rsi),%ecx 0.00 : 4ae5b1: 89 c8 mov %ecx,%eax 0.00 : 4ae5b3: 83 e1 07 and $0x7,%ecx 0.00 : 4ae5b6: c1 f8 03 sar $0x3,%eax 0.00 : 4ae5b9: 48 98 cltq 0.00 : 4ae5bb: 41 0f be 44 05 08 movsbl 0x8(%r13,%rax,1),%eax 0.00 : 4ae5c1: d3 f8 sar %cl,%eax 0.00 : 4ae5c3: b9 01 00 00 00 mov $0x1,%ecx 0.00 : 4ae5c8: a8 01 test $0x1,%al 0.00 : 4ae5ca: 0f 84 68 ff ff ff je 4ae538 <_bt_checkkeys+0x118> 0.00 : 4ae5d0: 4c 89 fa mov %r15,%rdx 0.00 : 4ae5d3: 4c 89 ef mov %r13,%rdi 0.00 : 4ae5d6: e8 85 25 fc ff callq 470b60 0.00 : 4ae5db: 8b 3b mov (%rbx),%edi 0.00 : 4ae5dd: 48 89 c2 mov %rax,%rdx 0.00 : 4ae5e0: 31 c9 xor %ecx,%ecx 0.00 : 4ae5e2: e9 51 ff ff ff jmpq 4ae538 <_bt_checkkeys+0x118> 0.00 : 4ae5e7: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 4ae5ee: 00 00 0.00 : 4ae5f0: 48 98 cltq 0.00 : 4ae5f2: 31 c9 xor %ecx,%ecx 0.00 : 4ae5f4: 49 8d 54 05 08 lea 0x8(%r13,%rax,1),%rdx 0.00 : 4ae5f9: e9 3a ff ff ff jmpq 4ae538 <_bt_checkkeys+0x118> 0.00 : 4ae5fe: 66 90 xchg %ax,%ax : continue; /* tuple satisfies this qual */ : } : else : { : Assert(key->sk_flags & SK_SEARCHNOTNULL); : if (!isNull) 0.00 : 4ae600: 84 c9 test %cl,%cl 0.00 : 4ae602: 0f 84 ae fe ff ff je 4ae4b6 <_bt_checkkeys+0x96> : /* : * Tuple fails this qual. If it's a required qual for the current : * scan direction, then we can conclude no further tuples will : * pass, either. : */ : if ((key->sk_flags & SK_BT_REQFWD) && 0.00 : 4ae608: f7 c7 00 00 01 00 test $0x10000,%edi 0.00 : 4ae60e: 74 0a je 4ae61a <_bt_checkkeys+0x1fa> 0.00 : 4ae610: 83 7d cc 01 cmpl $0x1,-0x34(%rbp) 0.00 : 4ae614: 0f 84 3c 01 00 00 je 4ae756 <_bt_checkkeys+0x336> : ScanDirectionIsForward(dir)) : *continuescan = false; : else if ((key->sk_flags & SK_BT_REQBKWD) && 0.00 : 4ae61a: 81 e7 00 00 02 00 and $0x20000,%edi 0.00 : 4ae620: 0f 84 6a ff ff ff je 4ae590 <_bt_checkkeys+0x170> 0.00 : 4ae626: 66 90 xchg %ax,%ax 0.00 : 4ae628: e9 50 ff ff ff jmpq 4ae57d <_bt_checkkeys+0x15d> 0.00 : 4ae62d: 0f 1f 00 nopl (%rax) : if (_bt_check_rowcompare(key, tuple, tupdesc, dir, continuescan)) : continue; : return NULL; : } : : datum = index_getattr(tuple, 0.00 : 4ae630: 0f bf f1 movswl %cx,%esi 0.00 : 4ae633: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 4ae638: eb 96 jmp 4ae5d0 <_bt_checkkeys+0x1b0> 0.00 : 4ae63a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 4ae640: 48 98 cltq 0.00 : 4ae642: 31 c9 xor %ecx,%ecx 0.00 : 4ae644: 49 8b 54 05 08 mov 0x8(%r13,%rax,1),%rdx 0.00 : 4ae649: e9 ea fe ff ff jmpq 4ae538 <_bt_checkkeys+0x118> 0.00 : 4ae64e: 66 90 xchg %ax,%ax /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtutils.c:1440 14.29 : 4ae650: 48 98 cltq 0.00 : 4ae652: 31 c9 xor %ecx,%ecx 0.00 : 4ae654: 41 8b 54 05 08 mov 0x8(%r13,%rax,1),%edx 0.00 : 4ae659: e9 da fe ff ff jmpq 4ae538 <_bt_checkkeys+0x118> 0.00 : 4ae65e: 66 90 xchg %ax,%ax 0.00 : 4ae660: 48 98 cltq 0.00 : 4ae662: 31 c9 xor %ecx,%ecx 0.00 : 4ae664: 41 0f b7 54 05 08 movzwl 0x8(%r13,%rax,1),%edx 0.00 : 4ae66a: e9 c9 fe ff ff jmpq 4ae538 <_bt_checkkeys+0x118> 0.00 : 4ae66f: 90 nop : return NULL; : } : } : : /* Check for failure due to it being a killed tuple. */ : if (!tuple_alive) /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtutils.c:1549 14.29 : 4ae670: 80 7d d3 00 cmpb $0x0,-0x2d(%rbp) 0.00 : 4ae674: 0f 85 19 ff ff ff jne 4ae593 <_bt_checkkeys+0x173> 0.00 : 4ae67a: e9 11 ff ff ff jmpq 4ae590 <_bt_checkkeys+0x170> 0.00 : 4ae67f: 90 nop : */ : static bool : _bt_check_rowcompare(ScanKey skey, IndexTuple tuple, TupleDesc tupdesc, : ScanDirection dir, bool *continuescan) : { : ScanKey subkey = (ScanKey) DatumGetPointer(skey->sk_argument); 0.00 : 4ae680: 4c 8b 63 40 mov 0x40(%rbx),%r12 0.00 : 4ae684: 0f 1f 40 00 nopl 0x0(%rax) 0.00 : 4ae688: eb 7b jmp 4ae705 <_bt_checkkeys+0x2e5> 0.00 : 4ae68a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : Datum datum; : bool isNull; : : Assert(subkey->sk_flags & SK_ROW_MEMBER); : : datum = index_getattr(tuple, 0.00 : 4ae690: 41 0f b7 74 24 04 movzwl 0x4(%r12),%esi 0.00 : 4ae696: 49 8b 47 08 mov 0x8(%r15),%rax 0.00 : 4ae69a: 48 0f bf d6 movswq %si,%rdx 0.00 : 4ae69e: 48 8b 4c d0 f8 mov -0x8(%rax,%rdx,8),%rcx 0.00 : 4ae6a3: 8b 79 54 mov 0x54(%rcx),%edi 0.00 : 4ae6a6: 85 ff test %edi,%edi 0.00 : 4ae6a8: 0f 88 e2 00 00 00 js 4ae790 <_bt_checkkeys+0x370> 0.00 : 4ae6ae: 80 79 5c 00 cmpb $0x0,0x5c(%rcx) 0.00 : 4ae6b2: 48 63 c7 movslq %edi,%rax 0.00 : 4ae6b5: 49 8d 54 05 08 lea 0x8(%r13,%rax,1),%rdx 0.00 : 4ae6ba: 0f 85 a8 00 00 00 jne 4ae768 <_bt_checkkeys+0x348> : * In any case, this indextuple doesn't match the qual. : */ : return false; : } : : if (subkey->sk_flags & SK_ISNULL) 0.00 : 4ae6c0: 41 f6 04 24 01 testb $0x1,(%r12) 0.00 : 4ae6c5: 0f 85 e2 01 00 00 jne 4ae8ad <_bt_checkkeys+0x48d> : *continuescan = false; : return false; : } : : /* Perform the test --- three-way comparison not bool operator */ : cmpresult = DatumGetInt32(FunctionCall2Coll(&subkey->sk_func, 0.00 : 4ae6cb: 49 8b 4c 24 40 mov 0x40(%r12),%rcx 0.00 : 4ae6d0: 41 8b 74 24 0c mov 0xc(%r12),%esi 0.00 : 4ae6d5: 49 8d 7c 24 10 lea 0x10(%r12),%rdi 0.00 : 4ae6da: e8 51 f9 2c 00 callq 77e030 : subkey->sk_collation, : datum, : subkey->sk_argument)); : : if (subkey->sk_flags & SK_BT_DESC) 0.00 : 4ae6df: 41 8b 0c 24 mov (%r12),%ecx : *continuescan = false; : return false; : } : : /* Perform the test --- three-way comparison not bool operator */ : cmpresult = DatumGetInt32(FunctionCall2Coll(&subkey->sk_func, 0.00 : 4ae6e3: 89 c2 mov %eax,%edx : subkey->sk_collation, : datum, : subkey->sk_argument)); : : if (subkey->sk_flags & SK_BT_DESC) : cmpresult = -cmpresult; 0.00 : 4ae6e5: f7 d8 neg %eax 0.00 : 4ae6e7: f7 c1 00 00 00 01 test $0x1000000,%ecx 0.00 : 4ae6ed: 0f 45 d0 cmovne %eax,%edx : : /* Done comparing if unequal, else advance to next column */ : if (cmpresult != 0) 0.00 : 4ae6f0: 85 d2 test %edx,%edx 0.00 : 4ae6f2: 0f 85 6d 01 00 00 jne 4ae865 <_bt_checkkeys+0x445> : break; : : if (subkey->sk_flags & SK_ROW_END) 0.00 : 4ae6f8: f6 c1 10 test $0x10,%cl 0.00 : 4ae6fb: 0f 85 64 01 00 00 jne 4ae865 <_bt_checkkeys+0x445> : break; : subkey++; 0.00 : 4ae701: 49 83 c4 48 add $0x48,%r12 : Datum datum; : bool isNull; : : Assert(subkey->sk_flags & SK_ROW_MEMBER); : : datum = index_getattr(tuple, 0.00 : 4ae705: 66 41 83 7d 06 00 cmpw $0x0,0x6(%r13) 0.00 : 4ae70b: 79 83 jns 4ae690 <_bt_checkkeys+0x270> 0.00 : 4ae70d: 41 0f bf 74 24 04 movswl 0x4(%r12),%esi 0.00 : 4ae713: 8d 4e ff lea -0x1(%rsi),%ecx 0.00 : 4ae716: 89 c8 mov %ecx,%eax 0.00 : 4ae718: 83 e1 07 and $0x7,%ecx 0.00 : 4ae71b: c1 f8 03 sar $0x3,%eax 0.00 : 4ae71e: 48 98 cltq 0.00 : 4ae720: 41 0f be 44 05 08 movsbl 0x8(%r13,%rax,1),%eax 0.00 : 4ae726: d3 f8 sar %cl,%eax 0.00 : 4ae728: a8 01 test $0x1,%al 0.00 : 4ae72a: 0f 85 80 00 00 00 jne 4ae7b0 <_bt_checkkeys+0x390> : tupdesc, : &isNull); : : if (isNull) : { : if (subkey->sk_flags & SK_BT_NULLS_FIRST) 0.00 : 4ae730: 41 8b 04 24 mov (%r12),%eax 0.00 : 4ae734: a9 00 00 00 02 test $0x2000000,%eax 0.00 : 4ae739: 0f 84 11 02 00 00 je 4ae950 <_bt_checkkeys+0x530> : * of whether the qual is > or <, so long as it's required, : * because it's not possible for any future tuples to pass. On : * a forward scan, however, we must keep going, because we may : * have initially positioned to the start of the index. : */ : if ((subkey->sk_flags & (SK_BT_REQFWD | SK_BT_REQBKWD)) && 0.00 : 4ae73f: a9 00 00 03 00 test $0x30000,%eax 0.00 : 4ae744: 0f 84 46 fe ff ff je 4ae590 <_bt_checkkeys+0x170> : * of whether the qual is > or <, so long as it's required, : * because it's not possible for any future tuples to pass. On : * a forward scan, however, we must keep going, because we may : * have initially positioned to the start of the index. : */ : if ((key->sk_flags & (SK_BT_REQFWD | SK_BT_REQBKWD)) && 0.00 : 4ae74a: 83 7d cc ff cmpl $0xffffffff,-0x34(%rbp) 0.00 : 4ae74e: 66 90 xchg %ax,%ax 0.00 : 4ae750: 0f 85 3a fe ff ff jne 4ae590 <_bt_checkkeys+0x170> : * initial positioning in _bt_first() when they are available. See : * comments in _bt_first(). : */ : if ((key->sk_flags & SK_BT_REQFWD) && : ScanDirectionIsForward(dir)) : *continuescan = false; 0.00 : 4ae756: 48 8b 45 c0 mov -0x40(%rbp),%rax 0.00 : 4ae75a: 45 31 ed xor %r13d,%r13d 0.00 : 4ae75d: c6 00 00 movb $0x0,(%rax) 0.00 : 4ae760: e9 2e fe ff ff jmpq 4ae593 <_bt_checkkeys+0x173> 0.00 : 4ae765: 0f 1f 00 nopl (%rax) : Datum datum; : bool isNull; : : Assert(subkey->sk_flags & SK_ROW_MEMBER); : : datum = index_getattr(tuple, 0.00 : 4ae768: 0f b7 41 4c movzwl 0x4c(%rcx),%eax 0.00 : 4ae76c: 66 83 f8 08 cmp $0x8,%ax 0.00 : 4ae770: 74 56 je 4ae7c8 <_bt_checkkeys+0x3a8> 0.00 : 4ae772: 66 83 f8 04 cmp $0x4,%ax 0.00 : 4ae776: 74 60 je 4ae7d8 <_bt_checkkeys+0x3b8> 0.00 : 4ae778: 66 83 f8 02 cmp $0x2,%ax 0.00 : 4ae77c: 0f 84 d3 00 00 00 je 4ae855 <_bt_checkkeys+0x435> 0.00 : 4ae782: 48 63 c7 movslq %edi,%rax 0.00 : 4ae785: 41 0f b6 54 05 08 movzbl 0x8(%r13,%rax,1),%edx 0.00 : 4ae78b: e9 30 ff ff ff jmpq 4ae6c0 <_bt_checkkeys+0x2a0> 0.00 : 4ae790: 4c 89 fa mov %r15,%rdx 0.00 : 4ae793: 0f bf f6 movswl %si,%esi 0.00 : 4ae796: 4c 89 ef mov %r13,%rdi 0.00 : 4ae799: e8 c2 23 fc ff callq 470b60 0.00 : 4ae79e: 48 89 c2 mov %rax,%rdx 0.00 : 4ae7a1: e9 1a ff ff ff jmpq 4ae6c0 <_bt_checkkeys+0x2a0> 0.00 : 4ae7a6: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 0.00 : 4ae7ad: 00 00 00 0.00 : 4ae7b0: 4c 89 fa mov %r15,%rdx 0.00 : 4ae7b3: 4c 89 ef mov %r13,%rdi 0.00 : 4ae7b6: e8 a5 23 fc ff callq 470b60 0.00 : 4ae7bb: 48 89 c2 mov %rax,%rdx 0.00 : 4ae7be: e9 fd fe ff ff jmpq 4ae6c0 <_bt_checkkeys+0x2a0> 0.00 : 4ae7c3: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 4ae7c8: 48 63 c7 movslq %edi,%rax 0.00 : 4ae7cb: 49 8b 54 05 08 mov 0x8(%r13,%rax,1),%rdx 0.00 : 4ae7d0: e9 eb fe ff ff jmpq 4ae6c0 <_bt_checkkeys+0x2a0> 0.00 : 4ae7d5: 0f 1f 00 nopl (%rax) 0.00 : 4ae7d8: 48 63 c7 movslq %edi,%rax 0.00 : 4ae7db: 41 8b 54 05 08 mov 0x8(%r13,%rax,1),%edx 0.00 : 4ae7e0: e9 db fe ff ff jmpq 4ae6c0 <_bt_checkkeys+0x2a0> : * index keys to prevent uselessly advancing to the next page. : */ : if (scan->ignore_killed_tuples && ItemIdIsDead(iid)) : { : /* return immediately if there are more tuples on the page */ : if (ScanDirectionIsForward(dir)) 0.00 : 4ae7e5: 83 7d cc 01 cmpl $0x1,-0x34(%rbp) 0.00 : 4ae7e9: 0f 84 36 01 00 00 je 4ae925 <_bt_checkkeys+0x505> : } : else : { : BTPageOpaque opaque = (BTPageOpaque) PageGetSpecialPointer(page); : : if (offnum > P_FIRSTDATAKEY(opaque)) 0.00 : 4ae7ef: 0f b7 46 10 movzwl 0x10(%rsi),%eax 0.00 : 4ae7f3: 0f b7 d2 movzwl %dx,%edx 0.00 : 4ae7f6: 83 7c 06 04 01 cmpl $0x1,0x4(%rsi,%rax,1) 0.00 : 4ae7fb: 19 c0 sbb %eax,%eax 0.00 : 4ae7fd: 83 c0 02 add $0x2,%eax 0.00 : 4ae800: 39 d0 cmp %edx,%eax 0.00 : 4ae802: 0f 8c 88 fd ff ff jl 4ae590 <_bt_checkkeys+0x170> 0.00 : 4ae808: c6 45 d3 00 movb $0x0,-0x2d(%rbp) 0.00 : 4ae80c: e9 53 fc ff ff jmpq 4ae464 <_bt_checkkeys+0x44> : * whether the qual is > or <, so long as it's required, : * because it's not possible for any future tuples to pass. On : * a backward scan, however, we must keep going, because we : * may have initially positioned to the end of the index. : */ : if ((key->sk_flags & (SK_BT_REQFWD | SK_BT_REQBKWD)) && 0.00 : 4ae811: 81 e7 00 00 03 00 and $0x30000,%edi 0.00 : 4ae817: 0f 84 73 fd ff ff je 4ae590 <_bt_checkkeys+0x170> 0.00 : 4ae81d: 83 7d cc 01 cmpl $0x1,-0x34(%rbp) 0.00 : 4ae821: 0f 85 69 fd ff ff jne 4ae590 <_bt_checkkeys+0x170> : if ((key->sk_flags & SK_BT_REQFWD) && : ScanDirectionIsForward(dir)) : *continuescan = false; : else if ((key->sk_flags & SK_BT_REQBKWD) && : ScanDirectionIsBackward(dir)) : *continuescan = false; 0.00 : 4ae827: 48 8b 55 c0 mov -0x40(%rbp),%rdx 0.00 : 4ae82b: 45 31 ed xor %r13d,%r13d 0.00 : 4ae82e: c6 02 00 movb $0x0,(%rdx) 0.00 : 4ae831: e9 5d fd ff ff jmpq 4ae593 <_bt_checkkeys+0x173> : return NULL; : } : : if (isNull) : { : if (key->sk_flags & SK_BT_NULLS_FIRST) 0.00 : 4ae836: f7 c7 00 00 00 02 test $0x2000000,%edi 0.00 : 4ae83c: 74 d3 je 4ae811 <_bt_checkkeys+0x3f1> : * of whether the qual is > or <, so long as it's required, : * because it's not possible for any future tuples to pass. On : * a forward scan, however, we must keep going, because we may : * have initially positioned to the start of the index. : */ : if ((key->sk_flags & (SK_BT_REQFWD | SK_BT_REQBKWD)) && 0.00 : 4ae83e: 81 e7 00 00 03 00 and $0x30000,%edi 0.00 : 4ae844: 0f 84 46 fd ff ff je 4ae590 <_bt_checkkeys+0x170> 0.00 : 4ae84a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 4ae850: e9 f5 fe ff ff jmpq 4ae74a <_bt_checkkeys+0x32a> : Datum datum; : bool isNull; : : Assert(subkey->sk_flags & SK_ROW_MEMBER); : : datum = index_getattr(tuple, 0.00 : 4ae855: 48 63 c7 movslq %edi,%rax 0.00 : 4ae858: 41 0f b7 54 05 08 movzwl 0x8(%r13,%rax,1),%edx 0.00 : 4ae85e: 66 90 xchg %ax,%ax 0.00 : 4ae860: e9 5b fe ff ff jmpq 4ae6c0 <_bt_checkkeys+0x2a0> : /* : * At this point cmpresult indicates the overall result of the row : * comparison, and subkey points to the deciding column (or the last : * column if the result is "="). : */ : switch (subkey->sk_strategy) 0.00 : 4ae865: 41 0f b7 44 24 06 movzwl 0x6(%r12),%eax 0.00 : 4ae86b: 66 83 f8 02 cmp $0x2,%ax 0.00 : 4ae86f: 90 nop 0.00 : 4ae870: 0f 84 ef 00 00 00 je 4ae965 <_bt_checkkeys+0x545> 0.00 : 4ae876: 77 56 ja 4ae8ce <_bt_checkkeys+0x4ae> 0.00 : 4ae878: 66 83 e8 01 sub $0x1,%ax 0.00 : 4ae87c: 0f 1f 40 00 nopl 0x0(%rax) 0.00 : 4ae880: 75 5c jne 4ae8de <_bt_checkkeys+0x4be> : break; : case BTLessEqualStrategyNumber: : result = (cmpresult <= 0); : break; : case BTGreaterEqualStrategyNumber: : result = (cmpresult >= 0); 0.00 : 4ae882: 89 d0 mov %edx,%eax 0.00 : 4ae884: c1 e8 1f shr $0x1f,%eax : (int) subkey->sk_strategy); : result = 0; /* keep compiler quiet */ : break; : } : : if (!result) 0.00 : 4ae887: 84 c0 test %al,%al 0.00 : 4ae889: 0f 85 27 fc ff ff jne 4ae4b6 <_bt_checkkeys+0x96> : * Tuple fails this qual. If it's a required qual for the current : * scan direction, then we can conclude no further tuples will pass, : * either. Note we have to look at the deciding column, not : * necessarily the first or last column of the row condition. : */ : if ((subkey->sk_flags & SK_BT_REQFWD) && 0.00 : 4ae88f: f7 c1 00 00 01 00 test $0x10000,%ecx 0.00 : 4ae895: 75 77 jne 4ae90e <_bt_checkkeys+0x4ee> : ScanDirectionIsForward(dir)) : *continuescan = false; : else if ((subkey->sk_flags & SK_BT_REQBKWD) && 0.00 : 4ae897: 81 e1 00 00 02 00 and $0x20000,%ecx 0.00 : 4ae89d: 0f 84 ed fc ff ff je 4ae590 <_bt_checkkeys+0x170> 0.00 : 4ae8a3: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 4ae8a8: e9 d0 fc ff ff jmpq 4ae57d <_bt_checkkeys+0x15d> : * But it can never match. If all the earlier row comparison : * columns are required for the scan direction, we can stop the : * scan, because there can't be another tuple that will succeed. : */ : if (subkey != (ScanKey) DatumGetPointer(skey->sk_argument)) : subkey--; 0.00 : 4ae8ad: 4c 3b 63 40 cmp 0x40(%rbx),%r12 0.00 : 4ae8b1: 49 8d 44 24 b8 lea -0x48(%r12),%rax 0.00 : 4ae8b6: 4c 0f 45 e0 cmovne %rax,%r12 : if ((subkey->sk_flags & SK_BT_REQFWD) && 0.00 : 4ae8ba: 41 8b 04 24 mov (%r12),%eax 0.00 : 4ae8be: a9 00 00 01 00 test $0x10000,%eax 0.00 : 4ae8c3: 0f 84 ad fc ff ff je 4ae576 <_bt_checkkeys+0x156> 0.00 : 4ae8c9: e9 9d fc ff ff jmpq 4ae56b <_bt_checkkeys+0x14b> : /* : * At this point cmpresult indicates the overall result of the row : * comparison, and subkey points to the deciding column (or the last : * column if the result is "="). : */ : switch (subkey->sk_strategy) 0.00 : 4ae8ce: 66 83 f8 04 cmp $0x4,%ax 0.00 : 4ae8d2: 74 45 je 4ae919 <_bt_checkkeys+0x4f9> 0.00 : 4ae8d4: 66 83 f8 05 cmp $0x5,%ax 0.00 : 4ae8d8: 0f 84 91 00 00 00 je 4ae96f <_bt_checkkeys+0x54f> : break; : case BTGreaterStrategyNumber: : result = (cmpresult > 0); : break; : default: : elog(ERROR, "unrecognized RowCompareType: %d", 0.00 : 4ae8de: ba 20 4b 7b 00 mov $0x7b4b20,%edx 0.00 : 4ae8e3: be 99 06 00 00 mov $0x699,%esi 0.00 : 4ae8e8: bf 17 49 7b 00 mov $0x7b4917,%edi 0.00 : 4ae8ed: e8 2e cb 2c 00 callq 77b420 0.00 : 4ae8f2: 41 0f b7 54 24 06 movzwl 0x6(%r12),%edx 0.00 : 4ae8f8: be 98 49 7b 00 mov $0x7b4998,%esi 0.00 : 4ae8fd: bf 14 00 00 00 mov $0x14,%edi 0.00 : 4ae902: 31 c0 xor %eax,%eax 0.00 : 4ae904: e8 27 c9 2c 00 callq 77b230 0.00 : 4ae909: e8 c2 ab fb ff callq 4694d0 : * Tuple fails this qual. If it's a required qual for the current : * scan direction, then we can conclude no further tuples will pass, : * either. Note we have to look at the deciding column, not : * necessarily the first or last column of the row condition. : */ : if ((subkey->sk_flags & SK_BT_REQFWD) && 0.00 : 4ae90e: 83 7d cc 01 cmpl $0x1,-0x34(%rbp) 0.00 : 4ae912: 75 83 jne 4ae897 <_bt_checkkeys+0x477> 0.00 : 4ae914: e9 3d fe ff ff jmpq 4ae756 <_bt_checkkeys+0x336> : break; : case BTLessEqualStrategyNumber: : result = (cmpresult <= 0); : break; : case BTGreaterEqualStrategyNumber: : result = (cmpresult >= 0); 0.00 : 4ae919: f7 d2 not %edx 0.00 : 4ae91b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 4ae920: e9 5d ff ff ff jmpq 4ae882 <_bt_checkkeys+0x462> : if (scan->ignore_killed_tuples && ItemIdIsDead(iid)) : { : /* return immediately if there are more tuples on the page */ : if (ScanDirectionIsForward(dir)) : { : if (offnum < PageGetMaxOffsetNumber(page)) 0.00 : 4ae925: 0f b7 46 0c movzwl 0xc(%rsi),%eax 0.00 : 4ae929: 66 83 f8 18 cmp $0x18,%ax 0.00 : 4ae92d: 0f 1f 00 nopl (%rax) 0.00 : 4ae930: 0f 86 d2 fe ff ff jbe 4ae808 <_bt_checkkeys+0x3e8> 0.00 : 4ae936: 0f b7 c0 movzwl %ax,%eax 0.00 : 4ae939: 48 83 e8 18 sub $0x18,%rax 0.00 : 4ae93d: 48 c1 e8 02 shr $0x2,%rax 0.00 : 4ae941: 48 39 c1 cmp %rax,%rcx 0.00 : 4ae944: 0f 82 46 fc ff ff jb 4ae590 <_bt_checkkeys+0x170> 0.00 : 4ae94a: e9 b9 fe ff ff jmpq 4ae808 <_bt_checkkeys+0x3e8> 0.00 : 4ae94f: 90 nop : * whether the qual is > or <, so long as it's required, : * because it's not possible for any future tuples to pass. On : * a backward scan, however, we must keep going, because we : * may have initially positioned to the end of the index. : */ : if ((subkey->sk_flags & (SK_BT_REQFWD | SK_BT_REQBKWD)) && 0.00 : 4ae950: a9 00 00 03 00 test $0x30000,%eax 0.00 : 4ae955: 0f 84 35 fc ff ff je 4ae590 <_bt_checkkeys+0x170> 0.00 : 4ae95b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 4ae960: e9 b8 fe ff ff jmpq 4ae81d <_bt_checkkeys+0x3fd> : /* EQ and NE cases aren't allowed here */ : case BTLessStrategyNumber: : result = (cmpresult < 0); : break; : case BTLessEqualStrategyNumber: : result = (cmpresult <= 0); 0.00 : 4ae965: 85 d2 test %edx,%edx 0.00 : 4ae967: 0f 9e c0 setle %al 0.00 : 4ae96a: e9 18 ff ff ff jmpq 4ae887 <_bt_checkkeys+0x467> : break; : case BTGreaterEqualStrategyNumber: : result = (cmpresult >= 0); : break; : case BTGreaterStrategyNumber: : result = (cmpresult > 0); 0.00 : 4ae96f: 85 d2 test %edx,%edx 0.00 : 4ae971: 0f 9f c0 setg %al 0.00 : 4ae974: e9 0e ff ff ff jmpq 4ae887 <_bt_checkkeys+0x467> Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 14.29 /home/Computational/mark/src/postgres-andres/src/backend/executor/execProcnode.c:509 14.29 /home/Computational/mark/src/postgres-andres/src/backend/executor/execProcnode.c:509 14.29 /home/Computational/mark/src/postgres-andres/src/backend/executor/execProcnode.c:510 14.29 /home/Computational/mark/src/postgres-andres/src/backend/executor/execProcnode.c:510 14.29 /home/Computational/mark/src/postgres-andres/src/backend/executor/execProcnode.c:513 14.29 /home/Computational/mark/src/postgres-andres/src/backend/executor/execProcnode.c:449 14.29 /home/Computational/mark/src/postgres-andres/src/backend/executor/execProcnode.c:404 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000005ac4a0 : : TupleTableSlot * : ExecProcNode(PlanState *node) : { : TupleTableSlot *result; : : CHECK_FOR_INTERRUPTS(); 0.00 : 5ac4a0: 0f b6 05 e9 db 60 00 movzbl 0x60dbe9(%rip),%eax # bba090 : * Execute the given node to return a(nother) tuple. : * ---------------------------------------------------------------- : */ : TupleTableSlot * : ExecProcNode(PlanState *node) : { 0.00 : 5ac4a7: 55 push %rbp 0.00 : 5ac4a8: 48 89 e5 mov %rsp,%rbp 0.00 : 5ac4ab: 41 54 push %r12 0.00 : 5ac4ad: 49 89 fc mov %rdi,%r12 : TupleTableSlot *result; : : CHECK_FOR_INTERRUPTS(); 0.00 : 5ac4b0: 84 c0 test %al,%al : * Execute the given node to return a(nother) tuple. : * ---------------------------------------------------------------- : */ : TupleTableSlot * : ExecProcNode(PlanState *node) : { 0.00 : 5ac4b2: 53 push %rbx : TupleTableSlot *result; : : CHECK_FOR_INTERRUPTS(); 0.00 : 5ac4b3: 75 6b jne 5ac520 : : if (node->chgParam != NULL) /* something changed */ 0.00 : 5ac4b5: 49 83 7c 24 50 00 cmpq $0x0,0x50(%r12) 0.00 : 5ac4bb: 74 08 je 5ac4c5 : ExecReScan(node); /* let ReScan handle this */ 0.00 : 5ac4bd: 4c 89 e7 mov %r12,%rdi 0.00 : 5ac4c0: e8 db bf ff ff callq 5a84a0 : : if (node->instrument) 0.00 : 5ac4c5: 49 8b 7c 24 18 mov 0x18(%r12),%rdi 0.00 : 5ac4ca: 48 85 ff test %rdi,%rdi 0.00 : 5ac4cd: 74 05 je 5ac4d4 : InstrStartNode(node->instrument); 0.00 : 5ac4cf: e8 2c ba 00 00 callq 5b7f00 : : switch (nodeTag(node)) 0.00 : 5ac4d4: 41 8b 04 24 mov (%r12),%eax 0.00 : 5ac4d8: 2d c9 00 00 00 sub $0xc9,%eax 0.00 : 5ac4dd: 83 f8 21 cmp $0x21,%eax 0.00 : 5ac4e0: 76 2e jbe 5ac510 : case T_LimitState: : result = ExecLimit((LimitState *) node); : break; : : default: : elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node)); 0.00 : 5ac4e2: ba e2 a3 88 00 mov $0x88a3e2,%edx 0.00 : 5ac4e7: be f8 01 00 00 mov $0x1f8,%esi 0.00 : 5ac4ec: bf 75 a0 88 00 mov $0x88a075,%edi 0.00 : 5ac4f1: e8 2a ef 1c 00 callq 77b420 0.00 : 5ac4f6: 41 8b 14 24 mov (%r12),%edx 0.00 : 5ac4fa: be 5c 17 87 00 mov $0x87175c,%esi 0.00 : 5ac4ff: bf 14 00 00 00 mov $0x14,%edi 0.00 : 5ac504: 31 c0 xor %eax,%eax 0.00 : 5ac506: e8 25 ed 1c 00 callq 77b230 0.00 : 5ac50b: e8 c0 cf eb ff callq 4694d0 : ExecReScan(node); /* let ReScan handle this */ : : if (node->instrument) : InstrStartNode(node->instrument); : : switch (nodeTag(node)) 0.00 : 5ac510: 89 c0 mov %eax,%eax 0.00 : 5ac512: ff 24 c5 a0 a1 88 00 jmpq *0x88a1a0(,%rax,8) 0.00 : 5ac519: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : TupleTableSlot * : ExecProcNode(PlanState *node) : { : TupleTableSlot *result; : : CHECK_FOR_INTERRUPTS(); 0.00 : 5ac520: e8 7b fd 0e 00 callq 69c2a0 0.00 : 5ac525: eb 8e jmp 5ac4b5 0.00 : 5ac527: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 5ac52e: 00 00 : case T_LockRowsState: : result = ExecLockRows((LockRowsState *) node); : break; : : case T_LimitState: : result = ExecLimit((LimitState *) node); 0.00 : 5ac530: 4c 89 e7 mov %r12,%rdi 0.00 : 5ac533: e8 a8 3c 01 00 callq 5c01e0 0.00 : 5ac538: 48 89 c3 mov %rax,%rbx 0.00 : 5ac53b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node)); : result = NULL; : break; : } : : if (node->instrument) /home/Computational/mark/src/postgres-andres/src/backend/executor/execProcnode.c:509 14.29 : 5ac540: 49 8b 7c 24 18 mov 0x18(%r12),%rdi 14.29 : 5ac545: 48 85 ff test %rdi,%rdi 0.00 : 5ac548: 74 20 je 5ac56a : InstrStopNode(node->instrument, TupIsNull(result) ? 0.0 : 1.0); 0.00 : 5ac54a: 48 85 db test %rbx,%rbx 0.00 : 5ac54d: 0f 84 ed 01 00 00 je 5ac740 0.00 : 5ac553: 80 7b 04 00 cmpb $0x0,0x4(%rbx) /home/Computational/mark/src/postgres-andres/src/backend/executor/execProcnode.c:510 14.29 : 5ac557: 0f 85 e3 01 00 00 jne 5ac740 0.00 : 5ac55d: f2 0f 10 05 f3 2b 20 movsd 0x202bf3(%rip),%xmm0 # 7af158 <__func__.15777+0x10> 0.00 : 5ac564: 00 14.29 : 5ac565: e8 66 b6 00 00 callq 5b7bd0 : : return result; : } 0.00 : 5ac56a: 48 89 d8 mov %rbx,%rax 0.00 : 5ac56d: 5b pop %rbx 0.00 : 5ac56e: 41 5c pop %r12 0.00 : 5ac570: c9 leaveq /home/Computational/mark/src/postgres-andres/src/backend/executor/execProcnode.c:513 14.29 : 5ac571: c3 retq 0.00 : 5ac572: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : case T_SetOpState: : result = ExecSetOp((SetOpState *) node); : break; : : case T_LockRowsState: : result = ExecLockRows((LockRowsState *) node); 0.00 : 5ac578: 4c 89 e7 mov %r12,%rdi 0.00 : 5ac57b: e8 a0 40 01 00 callq 5c0620 0.00 : 5ac580: 48 89 c3 mov %rax,%rbx : break; 0.00 : 5ac583: eb bb jmp 5ac540 0.00 : 5ac585: 0f 1f 00 nopl (%rax) : case T_HashState: : result = ExecHash((HashState *) node); : break; : : case T_SetOpState: : result = ExecSetOp((SetOpState *) node); 0.00 : 5ac588: 4c 89 e7 mov %r12,%rdi 0.00 : 5ac58b: e8 60 98 01 00 callq 5c5df0 0.00 : 5ac590: 48 89 c3 mov %rax,%rbx : break; 0.00 : 5ac593: eb ab jmp 5ac540 0.00 : 5ac595: 0f 1f 00 nopl (%rax) : case T_UniqueState: : result = ExecUnique((UniqueState *) node); : break; : : case T_HashState: : result = ExecHash((HashState *) node); 0.00 : 5ac598: 4c 89 e7 mov %r12,%rdi 0.00 : 5ac59b: e8 d0 02 01 00 callq 5bc870 0.00 : 5ac5a0: 48 89 c3 mov %rax,%rbx : break; 0.00 : 5ac5a3: eb 9b jmp 5ac540 0.00 : 5ac5a5: 0f 1f 00 nopl (%rax) : case T_WindowAggState: : result = ExecWindowAgg((WindowAggState *) node); : break; : : case T_UniqueState: : result = ExecUnique((UniqueState *) node); 0.00 : 5ac5a8: 4c 89 e7 mov %r12,%rdi 0.00 : 5ac5ab: e8 20 a0 01 00 callq 5c65d0 0.00 : 5ac5b0: 48 89 c3 mov %rax,%rbx : break; 0.00 : 5ac5b3: eb 8b jmp 5ac540 0.00 : 5ac5b5: 0f 1f 00 nopl (%rax) : case T_AggState: : result = ExecAgg((AggState *) node); : break; : : case T_WindowAggState: : result = ExecWindowAgg((WindowAggState *) node); 0.00 : 5ac5b8: 4c 89 e7 mov %r12,%rdi 0.00 : 5ac5bb: e8 90 00 02 00 callq 5cc650 0.00 : 5ac5c0: 48 89 c3 mov %rax,%rbx : break; 0.00 : 5ac5c3: e9 78 ff ff ff jmpq 5ac540 0.00 : 5ac5c8: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 5ac5cf: 00 : case T_GroupState: : result = ExecGroup((GroupState *) node); : break; : : case T_AggState: : result = ExecAgg((AggState *) node); 0.00 : 5ac5d0: 4c 89 e7 mov %r12,%rdi 0.00 : 5ac5d3: e8 a8 d7 00 00 callq 5b9d80 0.00 : 5ac5d8: 48 89 c3 mov %rax,%rbx : break; 0.00 : 5ac5db: e9 60 ff ff ff jmpq 5ac540 : case T_SortState: : result = ExecSort((SortState *) node); : break; : : case T_GroupState: : result = ExecGroup((GroupState *) node); 0.00 : 5ac5e0: 4c 89 e7 mov %r12,%rdi 0.00 : 5ac5e3: e8 88 ab 01 00 callq 5c7170 0.00 : 5ac5e8: 48 89 c3 mov %rax,%rbx : break; 0.00 : 5ac5eb: e9 50 ff ff ff jmpq 5ac540 : case T_MaterialState: : result = ExecMaterial((MaterialState *) node); : break; : : case T_SortState: : result = ExecSort((SortState *) node); 0.00 : 5ac5f0: 4c 89 e7 mov %r12,%rdi 0.00 : 5ac5f3: e8 48 9d 01 00 callq 5c6340 0.00 : 5ac5f8: 48 89 c3 mov %rax,%rbx : break; 0.00 : 5ac5fb: e9 40 ff ff ff jmpq 5ac540 : : /* : * materialization nodes : */ : case T_MaterialState: : result = ExecMaterial((MaterialState *) node); 0.00 : 5ac600: 4c 89 e7 mov %r12,%rdi 0.00 : 5ac603: e8 38 47 01 00 callq 5c0d40 0.00 : 5ac608: 48 89 c3 mov %rax,%rbx : break; 0.00 : 5ac60b: e9 30 ff ff ff jmpq 5ac540 : case T_MergeJoinState: : result = ExecMergeJoin((MergeJoinState *) node); : break; : : case T_HashJoinState: : result = ExecHashJoin((HashJoinState *) node); 0.00 : 5ac610: 4c 89 e7 mov %r12,%rdi 0.00 : 5ac613: e8 88 14 01 00 callq 5bdaa0 0.00 : 5ac618: 48 89 c3 mov %rax,%rbx : break; 0.00 : 5ac61b: e9 20 ff ff ff jmpq 5ac540 : case T_NestLoopState: : result = ExecNestLoop((NestLoopState *) node); : break; : : case T_MergeJoinState: : result = ExecMergeJoin((MergeJoinState *) node); 0.00 : 5ac620: 4c 89 e7 mov %r12,%rdi 0.00 : 5ac623: e8 08 5a 01 00 callq 5c2030 0.00 : 5ac628: 48 89 c3 mov %rax,%rbx : break; 0.00 : 5ac62b: e9 10 ff ff ff jmpq 5ac540 : : /* : * join nodes : */ : case T_NestLoopState: : result = ExecNestLoop((NestLoopState *) node); /home/Computational/mark/src/postgres-andres/src/backend/executor/execProcnode.c:449 14.29 : 5ac630: 4c 89 e7 mov %r12,%rdi 0.00 : 5ac633: e8 08 7c 01 00 callq 5c4240 0.00 : 5ac638: 48 89 c3 mov %rax,%rbx : break; 0.00 : 5ac63b: e9 00 ff ff ff jmpq 5ac540 : case T_WorkTableScanState: : result = ExecWorkTableScan((WorkTableScanState *) node); : break; : : case T_ForeignScanState: : result = ExecForeignScan((ForeignScanState *) node); 0.00 : 5ac640: 4c 89 e7 mov %r12,%rdi 0.00 : 5ac643: e8 f8 d2 01 00 callq 5c9940 0.00 : 5ac648: 48 89 c3 mov %rax,%rbx : break; 0.00 : 5ac64b: e9 f0 fe ff ff jmpq 5ac540 : case T_CteScanState: : result = ExecCteScan((CteScanState *) node); : break; : : case T_WorkTableScanState: : result = ExecWorkTableScan((WorkTableScanState *) node); 0.00 : 5ac650: 4c 89 e7 mov %r12,%rdi 0.00 : 5ac653: e8 f8 a8 01 00 callq 5c6f50 0.00 : 5ac658: 48 89 c3 mov %rax,%rbx : break; 0.00 : 5ac65b: e9 e0 fe ff ff jmpq 5ac540 : case T_ValuesScanState: : result = ExecValuesScan((ValuesScanState *) node); : break; : : case T_CteScanState: : result = ExecCteScan((CteScanState *) node); 0.00 : 5ac660: 4c 89 e7 mov %r12,%rdi 0.00 : 5ac663: e8 28 a6 01 00 callq 5c6c90 0.00 : 5ac668: 48 89 c3 mov %rax,%rbx : break; 0.00 : 5ac66b: e9 d0 fe ff ff jmpq 5ac540 : case T_FunctionScanState: : result = ExecFunctionScan((FunctionScanState *) node); : break; : : case T_ValuesScanState: : result = ExecValuesScan((ValuesScanState *) node); 0.00 : 5ac670: 4c 89 e7 mov %r12,%rdi 0.00 : 5ac673: e8 18 a2 01 00 callq 5c6890 0.00 : 5ac678: 48 89 c3 mov %rax,%rbx : break; 0.00 : 5ac67b: e9 c0 fe ff ff jmpq 5ac540 : case T_SubqueryScanState: : result = ExecSubqueryScan((SubqueryScanState *) node); : break; : : case T_FunctionScanState: : result = ExecFunctionScan((FunctionScanState *) node); 0.00 : 5ac680: 4c 89 e7 mov %r12,%rdi 0.00 : 5ac683: e8 28 86 01 00 callq 5c4cb0 0.00 : 5ac688: 48 89 c3 mov %rax,%rbx : break; 0.00 : 5ac68b: e9 b0 fe ff ff jmpq 5ac540 : case T_TidScanState: : result = ExecTidScan((TidScanState *) node); : break; : : case T_SubqueryScanState: : result = ExecSubqueryScan((SubqueryScanState *) node); 0.00 : 5ac690: 4c 89 e7 mov %r12,%rdi 0.00 : 5ac693: e8 d8 c7 01 00 callq 5c8e70 0.00 : 5ac698: 48 89 c3 mov %rax,%rbx : break; 0.00 : 5ac69b: e9 a0 fe ff ff jmpq 5ac540 : case T_BitmapHeapScanState: : result = ExecBitmapHeapScan((BitmapHeapScanState *) node); : break; : : case T_TidScanState: : result = ExecTidScan((TidScanState *) node); 0.00 : 5ac6a0: 4c 89 e7 mov %r12,%rdi 0.00 : 5ac6a3: e8 58 ca 01 00 callq 5c9100 0.00 : 5ac6a8: 48 89 c3 mov %rax,%rbx : break; 0.00 : 5ac6ab: e9 90 fe ff ff jmpq 5ac540 : break; : : /* BitmapIndexScanState does not yield tuples */ : : case T_BitmapHeapScanState: : result = ExecBitmapHeapScan((BitmapHeapScanState *) node); 0.00 : 5ac6b0: 4c 89 e7 mov %r12,%rdi 0.00 : 5ac6b3: e8 68 e8 00 00 callq 5baf20 0.00 : 5ac6b8: 48 89 c3 mov %rax,%rbx : break; 0.00 : 5ac6bb: e9 80 fe ff ff jmpq 5ac540 : case T_IndexScanState: : result = ExecIndexScan((IndexScanState *) node); : break; : : case T_IndexOnlyScanState: : result = ExecIndexOnlyScan((IndexOnlyScanState *) node); 0.00 : 5ac6c0: 4c 89 e7 mov %r12,%rdi 0.00 : 5ac6c3: e8 b8 33 01 00 callq 5bfa80 0.00 : 5ac6c8: 48 89 c3 mov %rax,%rbx : break; 0.00 : 5ac6cb: e9 70 fe ff ff jmpq 5ac540 : case T_SeqScanState: : result = ExecSeqScan((SeqScanState *) node); : break; : : case T_IndexScanState: : result = ExecIndexScan((IndexScanState *) node); /home/Computational/mark/src/postgres-andres/src/backend/executor/execProcnode.c:404 14.29 : 5ac6d0: 4c 89 e7 mov %r12,%rdi 0.00 : 5ac6d3: e8 08 2e 01 00 callq 5bf4e0 0.00 : 5ac6d8: 48 89 c3 mov %rax,%rbx : break; 0.00 : 5ac6db: e9 60 fe ff ff jmpq 5ac540 : : /* : * scan nodes : */ : case T_SeqScanState: : result = ExecSeqScan((SeqScanState *) node); 0.00 : 5ac6e0: 4c 89 e7 mov %r12,%rdi 0.00 : 5ac6e3: e8 28 92 01 00 callq 5c5910 0.00 : 5ac6e8: 48 89 c3 mov %rax,%rbx : break; 0.00 : 5ac6eb: e9 50 fe ff ff jmpq 5ac540 : case T_MergeAppendState: : result = ExecMergeAppend((MergeAppendState *) node); : break; : : case T_RecursiveUnionState: : result = ExecRecursiveUnion((RecursiveUnionState *) node); 0.00 : 5ac6f0: 4c 89 e7 mov %r12,%rdi 0.00 : 5ac6f3: e8 d8 8b 01 00 callq 5c52d0 0.00 : 5ac6f8: 48 89 c3 mov %rax,%rbx : break; 0.00 : 5ac6fb: e9 40 fe ff ff jmpq 5ac540 : case T_AppendState: : result = ExecAppend((AppendState *) node); : break; : : case T_MergeAppendState: : result = ExecMergeAppend((MergeAppendState *) node); 0.00 : 5ac700: 4c 89 e7 mov %r12,%rdi 0.00 : 5ac703: e8 c8 48 01 00 callq 5c0fd0 0.00 : 5ac708: 48 89 c3 mov %rax,%rbx : break; 0.00 : 5ac70b: e9 30 fe ff ff jmpq 5ac540 : case T_ModifyTableState: : result = ExecModifyTable((ModifyTableState *) node); : break; : : case T_AppendState: : result = ExecAppend((AppendState *) node); 0.00 : 5ac710: 4c 89 e7 mov %r12,%rdi 0.00 : 5ac713: e8 68 ba 00 00 callq 5b8180 0.00 : 5ac718: 48 89 c3 mov %rax,%rbx : break; 0.00 : 5ac71b: e9 20 fe ff ff jmpq 5ac540 : case T_ResultState: : result = ExecResult((ResultState *) node); : break; : : case T_ModifyTableState: : result = ExecModifyTable((ModifyTableState *) node); 0.00 : 5ac720: 4c 89 e7 mov %r12,%rdi 0.00 : 5ac723: e8 d8 6a 01 00 callq 5c3200 0.00 : 5ac728: 48 89 c3 mov %rax,%rbx : break; 0.00 : 5ac72b: e9 10 fe ff ff jmpq 5ac540 : { : /* : * control nodes : */ : case T_ResultState: : result = ExecResult((ResultState *) node); 0.00 : 5ac730: 4c 89 e7 mov %r12,%rdi 0.00 : 5ac733: e8 08 8f 01 00 callq 5c5640 0.00 : 5ac738: 48 89 c3 mov %rax,%rbx : break; 0.00 : 5ac73b: e9 00 fe ff ff jmpq 5ac540 : result = NULL; : break; : } : : if (node->instrument) : InstrStopNode(node->instrument, TupIsNull(result) ? 0.0 : 1.0); 0.00 : 5ac740: 66 0f 57 c0 xorpd %xmm0,%xmm0 0.00 : 5ac744: e9 1c fe ff ff jmpq 5ac565 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 28.57 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:2812 28.57 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:2825 14.29 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:2812 14.29 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:2825 14.29 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:2825 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000674b60 : : * This function cannot be used on a buffer we do not have pinned, : * because it doesn't change the shared buffer state. : */ : void : IncrBufferRefCount(Buffer buffer) : { /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:2812 28.57 : 674b60: 55 push %rbp 0.00 : 674b61: 48 89 e5 mov %rsp,%rbp 0.00 : 674b64: 53 push %rbx 14.29 : 674b65: 89 fb mov %edi,%ebx 0.00 : 674b67: 48 83 ec 08 sub $0x8,%rsp : Assert(BufferIsPinned(buffer)); : ResourceOwnerEnlargeBuffers(CurrentResourceOwner); 0.00 : 674b6b: 48 8b 3d 4e 5d 54 00 mov 0x545d4e(%rip),%rdi # bba8c0 0.00 : 674b72: e8 f9 62 12 00 callq 79ae70 : ResourceOwnerRememberBuffer(CurrentResourceOwner, buffer); 0.00 : 674b77: 48 8b 3d 42 5d 54 00 mov 0x545d42(%rip),%rdi # bba8c0 0.00 : 674b7e: 89 de mov %ebx,%esi 0.00 : 674b80: e8 1b 56 12 00 callq 79a1a0 : if (BufferIsLocal(buffer)) 0.00 : 674b85: 85 db test %ebx,%ebx 0.00 : 674b87: 78 1f js 674ba8 : LocalRefCount[-buffer - 1]++; : else : { : PrivateRefCountEntry *ref; : ref = GetPrivateRefCountEntry(buffer, false, true); 0.00 : 674b89: 89 df mov %ebx,%edi 0.00 : 674b8b: ba 01 00 00 00 mov $0x1,%edx 0.00 : 674b90: 31 f6 xor %esi,%esi 0.00 : 674b92: e8 89 f9 ff ff callq 674520 : Assert(ref != NULL); : ref->refcount++; 0.00 : 674b97: 83 40 04 01 addl $0x1,0x4(%rax) : } : } 0.00 : 674b9b: 48 83 c4 08 add $0x8,%rsp /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:2825 14.29 : 674b9f: 5b pop %rbx 14.29 : 674ba0: c9 leaveq 28.57 : 674ba1: c3 retq 0.00 : 674ba2: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : { : Assert(BufferIsPinned(buffer)); : ResourceOwnerEnlargeBuffers(CurrentResourceOwner); : ResourceOwnerRememberBuffer(CurrentResourceOwner, buffer); : if (BufferIsLocal(buffer)) : LocalRefCount[-buffer - 1]++; 0.00 : 674ba8: f7 d3 not %ebx 0.00 : 674baa: 48 63 c3 movslq %ebx,%rax 0.00 : 674bad: 48 c1 e0 02 shl $0x2,%rax 0.00 : 674bb1: 48 03 05 68 85 50 00 add 0x508568(%rip),%rax # b7d120 0.00 : 674bb8: 83 00 01 addl $0x1,(%rax) : PrivateRefCountEntry *ref; : ref = GetPrivateRefCountEntry(buffer, false, true); : Assert(ref != NULL); : ref->refcount++; : } : } 0.00 : 674bbb: 48 83 c4 08 add $0x8,%rsp 0.00 : 674bbf: 5b pop %rbx 0.00 : 674bc0: c9 leaveq Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 28.57 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:2788 14.29 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:2762 14.29 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:2780 14.29 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:2780 14.29 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:2784 14.29 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:2784 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000674e60 : : /* : * ReleaseBuffer -- release the pin on a buffer : */ : void : ReleaseBuffer(Buffer buffer) : { 0.00 : 674e60: 55 push %rbp 0.00 : 674e61: 48 89 e5 mov %rsp,%rbp 0.00 : 674e64: 48 89 5d f0 mov %rbx,-0x10(%rbp) 0.00 : 674e68: 4c 89 65 f8 mov %r12,-0x8(%rbp) 0.00 : 674e6c: 48 83 ec 10 sub $0x10,%rsp : volatile BufferDesc *bufHdr; : PrivateRefCountEntry *ref; : : if (!BufferIsValid(buffer)) 0.00 : 674e70: 85 ff test %edi,%edi : /* : * ReleaseBuffer -- release the pin on a buffer : */ : void : ReleaseBuffer(Buffer buffer) : { /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:2762 14.29 : 674e72: 89 fb mov %edi,%ebx : volatile BufferDesc *bufHdr; : PrivateRefCountEntry *ref; : : if (!BufferIsValid(buffer)) 0.00 : 674e74: 74 7f je 674ef5 : elog(ERROR, "bad buffer ID: %d", buffer); : : ResourceOwnerForgetBuffer(CurrentResourceOwner, buffer); 0.00 : 674e76: 89 fe mov %edi,%esi 0.00 : 674e78: 48 8b 3d 41 5a 54 00 mov 0x545a41(%rip),%rdi # bba8c0 0.00 : 674e7f: e8 7c 5a 12 00 callq 79a900 : : if (BufferIsLocal(buffer)) 0.00 : 674e84: 85 db test %ebx,%ebx 0.00 : 674e86: 78 38 js 674ec0 : return; : } : : bufHdr = &BufferDescriptors[buffer - 1]; : : ref = GetPrivateRefCountEntry(buffer, false, false); 0.00 : 674e88: 31 d2 xor %edx,%edx 0.00 : 674e8a: 31 f6 xor %esi,%esi 0.00 : 674e8c: 89 df mov %ebx,%edi : Assert(LocalRefCount[-buffer - 1] > 0); : LocalRefCount[-buffer - 1]--; : return; : } : : bufHdr = &BufferDescriptors[buffer - 1]; 0.00 : 674e8e: 4c 8b 25 6b ac 54 00 mov 0x54ac6b(%rip),%r12 # bbfb00 : : ref = GetPrivateRefCountEntry(buffer, false, false); /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:2780 14.29 : 674e95: e8 86 f6 ff ff callq 674520 14.29 : 674e9a: 48 89 c2 mov %rax,%rdx : Assert(ref != NULL); : Assert(ref->refcount > 0); : : if (ref->refcount > 1) /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:2784 14.29 : 674e9d: 8b 40 04 mov 0x4(%rax),%eax 14.29 : 674ea0: 83 f8 01 cmp $0x1,%eax 0.00 : 674ea3: 7e 33 jle 674ed8 : ref->refcount--; 0.00 : 674ea5: 83 e8 01 sub $0x1,%eax 0.00 : 674ea8: 89 42 04 mov %eax,0x4(%rdx) : else : UnpinBuffer(bufHdr, false); : } 0.00 : 674eab: 48 8b 1c 24 mov (%rsp),%rbx 0.00 : 674eaf: 4c 8b 64 24 08 mov 0x8(%rsp),%r12 0.00 : 674eb4: c9 leaveq /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:2788 28.57 : 674eb5: c3 retq 0.00 : 674eb6: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 0.00 : 674ebd: 00 00 00 : ResourceOwnerForgetBuffer(CurrentResourceOwner, buffer); : : if (BufferIsLocal(buffer)) : { : Assert(LocalRefCount[-buffer - 1] > 0); : LocalRefCount[-buffer - 1]--; 0.00 : 674ec0: f7 d3 not %ebx 0.00 : 674ec2: 48 63 c3 movslq %ebx,%rax 0.00 : 674ec5: 48 c1 e0 02 shl $0x2,%rax 0.00 : 674ec9: 48 03 05 50 82 50 00 add 0x508250(%rip),%rax # b7d120 0.00 : 674ed0: 83 28 01 subl $0x1,(%rax) : : if (ref->refcount > 1) : ref->refcount--; : else : UnpinBuffer(bufHdr, false); : } 0.00 : 674ed3: eb d6 jmp 674eab 0.00 : 674ed5: 0f 1f 00 nopl (%rax) : Assert(ref->refcount > 0); : : if (ref->refcount > 1) : ref->refcount--; : else : UnpinBuffer(bufHdr, false); 0.00 : 674ed8: 48 63 c3 movslq %ebx,%rax : } 0.00 : 674edb: 48 8b 1c 24 mov (%rsp),%rbx : Assert(ref->refcount > 0); : : if (ref->refcount > 1) : ref->refcount--; : else : UnpinBuffer(bufHdr, false); 0.00 : 674edf: 31 f6 xor %esi,%esi 0.00 : 674ee1: 48 c1 e0 06 shl $0x6,%rax 0.00 : 674ee5: 49 8d 7c 04 c0 lea -0x40(%r12,%rax,1),%rdi : } 0.00 : 674eea: 4c 8b 64 24 08 mov 0x8(%rsp),%r12 0.00 : 674eef: c9 leaveq : Assert(ref->refcount > 0); : : if (ref->refcount > 1) : ref->refcount--; : else : UnpinBuffer(bufHdr, false); 0.00 : 674ef0: e9 3b fe ff ff jmpq 674d30 : { : volatile BufferDesc *bufHdr; : PrivateRefCountEntry *ref; : : if (!BufferIsValid(buffer)) : elog(ERROR, "bad buffer ID: %d", buffer); 0.00 : 674ef5: ba 34 a0 8a 00 mov $0x8aa034,%edx 0.00 : 674efa: be cf 0a 00 00 mov $0xacf,%esi 0.00 : 674eff: bf 53 9d 8a 00 mov $0x8a9d53,%edi 0.00 : 674f04: e8 17 65 10 00 callq 77b420 0.00 : 674f09: 31 d2 xor %edx,%edx 0.00 : 674f0b: be 5c 9d 8a 00 mov $0x8a9d5c,%esi 0.00 : 674f10: bf 14 00 00 00 mov $0x14,%edi 0.00 : 674f15: 31 c0 xor %eax,%eax 0.00 : 674f17: e8 14 63 10 00 callq 77b230 0.00 : 674f1c: e8 af 45 df ff callq 4694d0 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 33.33 /home/Computational/mark/src/postgres-andres/src/backend/executor/instrument.c:53 33.33 /home/Computational/mark/src/postgres-andres/src/backend/executor/instrument.c:64 16.67 /home/Computational/mark/src/postgres-andres/src/backend/executor/instrument.c:64 16.67 /home/Computational/mark/src/postgres-andres/src/backend/executor/instrument.c:65 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000005b7f00 : : } : : /* Entry to a plan node */ : void : InstrStartNode(Instrumentation *instr) : { 0.00 : 5b7f00: 55 push %rbp /home/Computational/mark/src/postgres-andres/src/backend/executor/instrument.c:53 33.33 : 5b7f01: 48 89 e5 mov %rsp,%rbp 0.00 : 5b7f04: 53 push %rbx 0.00 : 5b7f05: 48 89 fb mov %rdi,%rbx 0.00 : 5b7f08: 48 83 ec 08 sub $0x8,%rsp : if (instr->need_timer) 0.00 : 5b7f0c: 80 3f 00 cmpb $0x0,(%rdi) 0.00 : 5b7f0f: 74 4a je 5b7f5b : { : if (INSTR_TIME_IS_ZERO(instr->starttime)) 0.00 : 5b7f11: 48 83 7f 10 00 cmpq $0x0,0x10(%rdi) 0.00 : 5b7f16: 75 07 jne 5b7f1f 0.00 : 5b7f18: 48 83 7f 08 00 cmpq $0x0,0x8(%rdi) 0.00 : 5b7f1d: 74 31 je 5b7f50 : INSTR_TIME_SET_CURRENT(instr->starttime); : else : elog(ERROR, "InstrStartNode called twice in a row"); 0.00 : 5b7f1f: ba 98 b6 88 00 mov $0x88b698,%edx 0.00 : 5b7f24: be 3b 00 00 00 mov $0x3b,%esi 0.00 : 5b7f29: bf fa b5 88 00 mov $0x88b5fa,%edi 0.00 : 5b7f2e: e8 ed 34 1c 00 callq 77b420 0.00 : 5b7f33: be 58 b6 88 00 mov $0x88b658,%esi 0.00 : 5b7f38: bf 14 00 00 00 mov $0x14,%edi 0.00 : 5b7f3d: 31 c0 xor %eax,%eax 0.00 : 5b7f3f: e8 ec 32 1c 00 callq 77b230 0.00 : 5b7f44: e8 87 15 eb ff callq 4694d0 0.00 : 5b7f49: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : InstrStartNode(Instrumentation *instr) : { : if (instr->need_timer) : { : if (INSTR_TIME_IS_ZERO(instr->starttime)) : INSTR_TIME_SET_CURRENT(instr->starttime); 0.00 : 5b7f50: 48 8d 7f 08 lea 0x8(%rdi),%rdi 0.00 : 5b7f54: 31 f6 xor %esi,%esi 0.00 : 5b7f56: e8 65 16 eb ff callq 4695c0 : else : elog(ERROR, "InstrStartNode called twice in a row"); : } : : /* save buffer usage totals at node entry, if needed */ : if (instr->need_bufusage) 0.00 : 5b7f5b: 80 7b 01 00 cmpb $0x0,0x1(%rbx) 0.00 : 5b7f5f: 0f 84 a9 00 00 00 je 5b800e : instr->bufusage_start = pgBufferUsage; 0.00 : 5b7f65: 48 8b 05 f4 77 60 00 mov 0x6077f4(%rip),%rax # bbf760 0.00 : 5b7f6c: 48 89 43 38 mov %rax,0x38(%rbx) 0.00 : 5b7f70: 48 8b 05 f1 77 60 00 mov 0x6077f1(%rip),%rax # bbf768 0.00 : 5b7f77: 48 89 43 40 mov %rax,0x40(%rbx) 0.00 : 5b7f7b: 48 8b 05 ee 77 60 00 mov 0x6077ee(%rip),%rax # bbf770 0.00 : 5b7f82: 48 89 43 48 mov %rax,0x48(%rbx) 0.00 : 5b7f86: 48 8b 05 eb 77 60 00 mov 0x6077eb(%rip),%rax # bbf778 0.00 : 5b7f8d: 48 89 43 50 mov %rax,0x50(%rbx) 0.00 : 5b7f91: 48 8b 05 e8 77 60 00 mov 0x6077e8(%rip),%rax # bbf780 0.00 : 5b7f98: 48 89 43 58 mov %rax,0x58(%rbx) 0.00 : 5b7f9c: 48 8b 05 e5 77 60 00 mov 0x6077e5(%rip),%rax # bbf788 0.00 : 5b7fa3: 48 89 43 60 mov %rax,0x60(%rbx) 0.00 : 5b7fa7: 48 8b 05 e2 77 60 00 mov 0x6077e2(%rip),%rax # bbf790 0.00 : 5b7fae: 48 89 43 68 mov %rax,0x68(%rbx) 0.00 : 5b7fb2: 48 8b 05 df 77 60 00 mov 0x6077df(%rip),%rax # bbf798 0.00 : 5b7fb9: 48 89 43 70 mov %rax,0x70(%rbx) 0.00 : 5b7fbd: 48 8b 05 dc 77 60 00 mov 0x6077dc(%rip),%rax # bbf7a0 0.00 : 5b7fc4: 48 89 43 78 mov %rax,0x78(%rbx) 0.00 : 5b7fc8: 48 8b 05 d9 77 60 00 mov 0x6077d9(%rip),%rax # bbf7a8 0.00 : 5b7fcf: 48 89 83 80 00 00 00 mov %rax,0x80(%rbx) 0.00 : 5b7fd6: 48 8b 05 d3 77 60 00 mov 0x6077d3(%rip),%rax # bbf7b0 0.00 : 5b7fdd: 48 89 83 88 00 00 00 mov %rax,0x88(%rbx) /home/Computational/mark/src/postgres-andres/src/backend/executor/instrument.c:64 16.67 : 5b7fe4: 48 8b 05 cd 77 60 00 mov 0x6077cd(%rip),%rax # bbf7b8 0.00 : 5b7feb: 48 89 83 90 00 00 00 mov %rax,0x90(%rbx) 0.00 : 5b7ff2: 48 8b 05 c7 77 60 00 mov 0x6077c7(%rip),%rax # bbf7c0 0.00 : 5b7ff9: 48 89 83 98 00 00 00 mov %rax,0x98(%rbx) 0.00 : 5b8000: 48 8b 05 c1 77 60 00 mov 0x6077c1(%rip),%rax # bbf7c8 33.33 : 5b8007: 48 89 83 a0 00 00 00 mov %rax,0xa0(%rbx) : } 0.00 : 5b800e: 48 83 c4 08 add $0x8,%rsp 0.00 : 5b8012: 5b pop %rbx /home/Computational/mark/src/postgres-andres/src/backend/executor/instrument.c:65 16.67 : 5b8013: c9 leaveq Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 16.67 /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/lwlock.c:1565 16.67 /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/lwlock.c:1565 16.67 /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/lwlock.c:1565 16.67 /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/../../../../src/include/port/atomics/arch-x86.h:202 16.67 /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/../../../../src/include/port/atomics/generic.h:247 16.67 /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/../../../../src/include/port/atomics/generic.h:247 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 000000000068f3a0 : : /* : * LWLockRelease - release a previously acquired lock : */ : void : LWLockRelease(LWLock *lock) : { 0.00 : 68f3a0: 55 push %rbp 0.00 : 68f3a1: 48 89 e5 mov %rsp,%rbp /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/lwlock.c:1565 16.67 : 68f3a4: 41 55 push %r13 0.00 : 68f3a6: 41 54 push %r12 0.00 : 68f3a8: 49 89 fc mov %rdi,%r12 16.67 : 68f3ab: 53 push %rbx 16.67 : 68f3ac: 48 83 ec 18 sub $0x18,%rsp : : /* : * Remove lock from list of locks held. Usually, but not always, it will : * be the latest-acquired lock; so search array backwards. : */ : for (i = num_held_lwlocks; --i >= 0;) 0.00 : 68f3b0: 8b 35 52 e6 4e 00 mov 0x4ee652(%rip),%esi # b7da08 0.00 : 68f3b6: 89 f0 mov %esi,%eax 0.00 : 68f3b8: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 68f3bf: 00 0.00 : 68f3c0: 83 e8 01 sub $0x1,%eax 0.00 : 68f3c3: 0f 88 1f 02 00 00 js 68f5e8 : { : if (lock == held_lwlocks[i].lock) 0.00 : 68f3c9: 48 63 d0 movslq %eax,%rdx 0.00 : 68f3cc: 41 b9 40 da b7 00 mov $0xb7da40,%r9d 0.00 : 68f3d2: 48 89 d1 mov %rdx,%rcx 0.00 : 68f3d5: 48 c1 e1 04 shl $0x4,%rcx 0.00 : 68f3d9: 48 8b 99 40 da b7 00 mov 0xb7da40(%rcx),%rbx 0.00 : 68f3e0: 4c 39 e3 cmp %r12,%rbx 0.00 : 68f3e3: 75 db jne 68f3c0 : break; : } : } : if (i < 0) : elog(ERROR, "lock %s %d is not held", T_NAME(lock), T_ID(lock)); : num_held_lwlocks--; 0.00 : 68f3e5: 44 8d 46 ff lea -0x1(%rsi),%r8d : */ : for (i = num_held_lwlocks; --i >= 0;) : { : if (lock == held_lwlocks[i].lock) : { : mode = held_lwlocks[i].mode; 0.00 : 68f3e9: 44 8b 91 48 da b7 00 mov 0xb7da48(%rcx),%r10d : } : } : if (i < 0) : elog(ERROR, "lock %s %d is not held", T_NAME(lock), T_ID(lock)); : num_held_lwlocks--; : for (; i < num_held_lwlocks; i++) 0.00 : 68f3f0: 41 39 c0 cmp %eax,%r8d : break; : } : } : if (i < 0) : elog(ERROR, "lock %s %d is not held", T_NAME(lock), T_ID(lock)); : num_held_lwlocks--; 0.00 : 68f3f3: 44 89 05 0e e6 4e 00 mov %r8d,0x4ee60e(%rip) # b7da08 : for (; i < num_held_lwlocks; i++) 0.00 : 68f3fa: 7f 09 jg 68f405 0.00 : 68f3fc: eb 3a jmp 68f438 0.00 : 68f3fe: 66 90 xchg %ax,%ax : : /* : * Remove lock from list of locks held. Usually, but not always, it will : * be the latest-acquired lock; so search array backwards. : */ : for (i = num_held_lwlocks; --i >= 0;) 0.00 : 68f400: 89 f0 mov %esi,%eax 0.00 : 68f402: 48 89 fa mov %rdi,%rdx : } : if (i < 0) : elog(ERROR, "lock %s %d is not held", T_NAME(lock), T_ID(lock)); : num_held_lwlocks--; : for (; i < num_held_lwlocks; i++) : held_lwlocks[i] = held_lwlocks[i + 1]; 0.00 : 68f405: 8d 70 01 lea 0x1(%rax),%esi 0.00 : 68f408: 48 89 d1 mov %rdx,%rcx 0.00 : 68f40b: 48 c1 e1 04 shl $0x4,%rcx 0.00 : 68f40f: 48 63 fe movslq %esi,%rdi 0.00 : 68f412: 48 89 fa mov %rdi,%rdx 0.00 : 68f415: 48 c1 e2 04 shl $0x4,%rdx : } : } : if (i < 0) : elog(ERROR, "lock %s %d is not held", T_NAME(lock), T_ID(lock)); : num_held_lwlocks--; : for (; i < num_held_lwlocks; i++) 0.00 : 68f419: 41 39 f0 cmp %esi,%r8d : held_lwlocks[i] = held_lwlocks[i + 1]; 0.00 : 68f41c: 48 8b 82 40 da b7 00 mov 0xb7da40(%rdx),%rax 0.00 : 68f423: 48 89 81 40 da b7 00 mov %rax,0xb7da40(%rcx) 0.00 : 68f42a: 48 8b 82 48 da b7 00 mov 0xb7da48(%rdx),%rax 0.00 : 68f431: 49 89 44 09 08 mov %rax,0x8(%r9,%rcx,1) : } : } : if (i < 0) : elog(ERROR, "lock %s %d is not held", T_NAME(lock), T_ID(lock)); : num_held_lwlocks--; : for (; i < num_held_lwlocks; i++) 0.00 : 68f436: 7f c8 jg 68f400 : : /* : * Release my hold on lock, after that it can immediately be acquired by : * others, even if we still have to wakeup other waiters. : */ : if (mode == LW_EXCLUSIVE) 0.00 : 68f438: 45 85 d2 test %r10d,%r10d 0.00 : 68f43b: 0f 84 77 01 00 00 je 68f5b8 : lockcount = pg_atomic_sub_fetch_u32(&lock->lockcount, EXCLUSIVE_LOCK); : else : lockcount = pg_atomic_sub_fetch_u32(&lock->lockcount, 1); 0.00 : 68f441: 49 8d 54 24 04 lea 0x4(%r12),%rdx : #define PG_HAVE_ATOMIC_FETCH_ADD_U32 : static inline uint32 : pg_atomic_fetch_add_u32_impl(volatile pg_atomic_uint32 *ptr, int32 add_) : { : uint32 res; : __asm__ __volatile__( /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/../../../../src/include/port/atomics/arch-x86.h:202 16.67 : 68f446: b8 ff ff ff ff mov $0xffffffff,%eax 0.00 : 68f44b: f0 0f c1 02 lock xadd %eax,(%rdx) : #if !defined(PG_HAVE_ATOMIC_SUB_FETCH_U32) && defined(PG_HAVE_ATOMIC_FETCH_SUB_U32) : #define PG_HAVE_ATOMIC_SUB_FETCH_U32 : static inline uint32 : pg_atomic_sub_fetch_u32_impl(volatile pg_atomic_uint32 *ptr, int32 sub_) : { : return pg_atomic_fetch_sub_u32_impl(ptr, sub_) - sub_; /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/../../../../src/include/port/atomics/generic.h:247 16.67 : 68f44f: 8d 50 ff lea -0x1(%rax),%edx : #ifndef PG_HAVE_ATOMIC_READ_U32 : #define PG_HAVE_ATOMIC_READ_U32 : static inline uint32 : pg_atomic_read_u32_impl(volatile pg_atomic_uint32 *ptr) : { : return *(&ptr->value); 0.00 : 68f452: 8b 43 08 mov 0x8(%rbx),%eax : /* : * Anybody we need to wakeup needs to have started queueing before we : * removed ourselves from the queue and the atomic operations above are : * full barriers. So we can just do plain read. : */ : if (pg_atomic_read_u32(&lock->nwaiters) > 0) 0.00 : 68f455: 85 c0 test %eax,%eax 0.00 : 68f457: 0f 84 3a 01 00 00 je 68f597 : /* : * If we just released an exclusive lock always wakeup waiters, even if : * lockcount is still > 0. A shared acquisition temporarily (and : * spuriously) might have increased the value. : */ : if (mode == LW_EXCLUSIVE && have_waiters) 0.00 : 68f45d: 45 85 d2 test %r10d,%r10d 0.00 : 68f460: 0f 85 fc 01 00 00 jne 68f662 : * Previous state will be thrown away without any cleanup. : */ : STATIC_IF_INLINE void : dlist_init(dlist_head *head) : { : head->head.next = head->head.prev = &head->head; 0.00 : 68f466: 4c 8d 6d d0 lea -0x30(%rbp),%r13 0.00 : 68f46a: 4c 89 6d d0 mov %r13,-0x30(%rbp) 0.00 : 68f46e: 4c 89 6d d8 mov %r13,-0x28(%rbp) : /* : * We're still waiting for backends to get scheduled, don't wake them up : * again. : */ : pg_read_barrier(); /* pairs with nwaiters-- */ : if (!BOOL_ACCESS_ONCE(lock->releaseOK)) 0.00 : 68f472: 0f b6 43 01 movzbl 0x1(%rbx),%eax 0.00 : 68f476: 84 c0 test %al,%al 0.00 : 68f478: 0f 84 19 01 00 00 je 68f597 : static __inline__ int : tas(volatile slock_t *lock) : { : register slock_t _res = 1; : : __asm__ __volatile__( 0.00 : 68f47e: b8 01 00 00 00 mov $0x1,%eax 0.00 : 68f483: f0 86 03 lock xchg %al,(%rbx) : : /* Acquire mutex. Time spent holding mutex should be short! */ : #ifdef LWLOCK_STATS : lwstats->spin_delay_count += SpinLockAcquire(&lock->mutex); : #else : SpinLockAcquire(&lock->mutex); 0.00 : 68f486: 84 c0 test %al,%al 0.00 : 68f488: 0f 85 b2 01 00 00 jne 68f640 : #endif : : /* remove the to-be-awakened PGPROCs from the queue */ : releaseOK = true; : : dlist_foreach_modify(iter, &lock->waiters) 0.00 : 68f48e: 48 8b 53 18 mov 0x18(%rbx),%rdx 0.00 : 68f492: 48 85 d2 test %rdx,%rdx 0.00 : 68f495: 0f 84 bc 01 00 00 je 68f657 0.00 : 68f49b: 4d 8d 4c 24 10 lea 0x10(%r12),%r9 0.00 : 68f4a0: 48 8b 72 08 mov 0x8(%rdx),%rsi 0.00 : 68f4a4: 49 39 d1 cmp %rdx,%r9 0.00 : 68f4a7: 0f 84 aa 01 00 00 je 68f657 0.00 : 68f4ad: 31 ff xor %edi,%edi 0.00 : 68f4af: 41 b8 01 00 00 00 mov $0x1,%r8d 0.00 : 68f4b5: eb 23 jmp 68f4da 0.00 : 68f4b7: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 68f4be: 00 00 : { : PGPROC *waiter = dlist_container(PGPROC, lwWaitLink, iter.cur); : : if (wokeup_somebody && waiter->lwWaitMode == LW_EXCLUSIVE) 0.00 : 68f4c0: 80 7a fa 00 cmpb $0x0,-0x6(%rdx) 0.00 : 68f4c4: 75 1d jne 68f4e3 0.00 : 68f4c6: bf 01 00 00 00 mov $0x1,%edi : #endif : : /* remove the to-be-awakened PGPROCs from the queue */ : releaseOK = true; : : dlist_foreach_modify(iter, &lock->waiters) 0.00 : 68f4cb: 49 39 f1 cmp %rsi,%r9 0.00 : 68f4ce: 48 8b 46 08 mov 0x8(%rsi),%rax 0.00 : 68f4d2: 74 6a je 68f53e 0.00 : 68f4d4: 48 89 f2 mov %rsi,%rdx 0.00 : 68f4d7: 48 89 c6 mov %rax,%rsi : { : PGPROC *waiter = dlist_container(PGPROC, lwWaitLink, iter.cur); : : if (wokeup_somebody && waiter->lwWaitMode == LW_EXCLUSIVE) 0.00 : 68f4da: 40 84 ff test %dil,%dil : /* remove the to-be-awakened PGPROCs from the queue */ : releaseOK = true; : : dlist_foreach_modify(iter, &lock->waiters) : { : PGPROC *waiter = dlist_container(PGPROC, lwWaitLink, iter.cur); 0.00 : 68f4dd: 48 8d 4a b8 lea -0x48(%rdx),%rcx : : if (wokeup_somebody && waiter->lwWaitMode == LW_EXCLUSIVE) 0.00 : 68f4e1: 75 dd jne 68f4c0 : * Delete 'node' from its list (it must be in one). : */ : STATIC_IF_INLINE void : dlist_delete(dlist_node *node) : { : node->prev->next = node->next; 0.00 : 68f4e3: 48 8b 51 48 mov 0x48(%rcx),%rdx 0.00 : 68f4e7: 48 8b 41 50 mov 0x50(%rcx),%rax 0.00 : 68f4eb: 48 89 42 08 mov %rax,0x8(%rdx) : node->next->prev = node->prev; 0.00 : 68f4ef: 48 8b 51 50 mov 0x50(%rcx),%rdx 0.00 : 68f4f3: 48 8b 41 48 mov 0x48(%rcx),%rax 0.00 : 68f4f7: 48 89 02 mov %rax,(%rdx) : * Insert a node at the end of the list. : */ : STATIC_IF_INLINE void : dlist_push_tail(dlist_head *head, dlist_node *node) : { : if (head->head.next == NULL) /* convert NULL header to circular */ 0.00 : 68f4fa: 48 83 7d d8 00 cmpq $0x0,-0x28(%rbp) : continue; : : dlist_delete(&waiter->lwWaitLink); : dlist_push_tail(&wakeup, &waiter->lwWaitLink); 0.00 : 68f4ff: 48 8d 51 48 lea 0x48(%rcx),%rdx 0.00 : 68f503: 0f 84 cf 00 00 00 je 68f5d8 : dlist_init(head); : : node->next = &head->head; 0.00 : 68f509: 4c 89 69 50 mov %r13,0x50(%rcx) : node->prev = head->head.prev; 0.00 : 68f50d: 48 8b 45 d0 mov -0x30(%rbp),%rax 0.00 : 68f511: 48 89 41 48 mov %rax,0x48(%rcx) : node->prev->next = node; 0.00 : 68f515: 48 89 50 08 mov %rdx,0x8(%rax) : head->head.prev = node; 0.00 : 68f519: 48 89 55 d0 mov %rdx,-0x30(%rbp) : : if (waiter->lwWaitMode != LW_WAIT_UNTIL_FREE) 0.00 : 68f51d: 0f b6 41 42 movzbl 0x42(%rcx),%eax 0.00 : 68f521: 3c 02 cmp $0x2,%al 0.00 : 68f523: 74 a6 je 68f4cb : : /* : * Once we've woken up an exclusive lock, there's no point in waking : * up anybody else. : */ : if(waiter->lwWaitMode == LW_EXCLUSIVE) 0.00 : 68f525: 84 c0 test %al,%al 0.00 : 68f527: 0f 84 0b 01 00 00 je 68f638 0.00 : 68f52d: 45 31 c0 xor %r8d,%r8d : #endif : : /* remove the to-be-awakened PGPROCs from the queue */ : releaseOK = true; : : dlist_foreach_modify(iter, &lock->waiters) 0.00 : 68f530: 49 39 f1 cmp %rsi,%r9 : : /* : * Once we've woken up an exclusive lock, there's no point in waking : * up anybody else. : */ : if(waiter->lwWaitMode == LW_EXCLUSIVE) 0.00 : 68f533: bf 01 00 00 00 mov $0x1,%edi : #endif : : /* remove the to-be-awakened PGPROCs from the queue */ : releaseOK = true; : : dlist_foreach_modify(iter, &lock->waiters) 0.00 : 68f538: 48 8b 46 08 mov 0x8(%rsi),%rax 0.00 : 68f53c: 75 96 jne 68f4d4 : if(waiter->lwWaitMode == LW_EXCLUSIVE) : break; : } : : /* The SpinLockRelease() below provides barrier semantics */ : BOOL_ACCESS_ONCE(lock->releaseOK) = releaseOK; 0.00 : 68f53e: 44 88 43 01 mov %r8b,0x1(%rbx) : SpinLockRelease(&lock->mutex); : : /* : * Awaken any waiters I removed from the queue. : */ : dlist_foreach_modify(iter, &wakeup) 0.00 : 68f542: 48 8b 4d d8 mov -0x28(%rbp),%rcx : : /* The SpinLockRelease() below provides barrier semantics */ : BOOL_ACCESS_ONCE(lock->releaseOK) = releaseOK; : : /* We are done updating shared state of the lock queue. */ : SpinLockRelease(&lock->mutex); 0.00 : 68f546: 41 c6 04 24 00 movb $0x0,(%r12) : : /* : * Awaken any waiters I removed from the queue. : */ : dlist_foreach_modify(iter, &wakeup) 0.00 : 68f54b: 48 85 c9 test %rcx,%rcx 0.00 : 68f54e: 74 47 je 68f597 0.00 : 68f550: 4c 39 e9 cmp %r13,%rcx 0.00 : 68f553: 48 8b 59 08 mov 0x8(%rcx),%rbx 0.00 : 68f557: 75 0d jne 68f566 0.00 : 68f559: eb 3c jmp 68f597 0.00 : 68f55b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 68f560: 48 89 d9 mov %rbx,%rcx 0.00 : 68f563: 48 89 c3 mov %rax,%rbx : { : PGPROC *waiter = dlist_container(PGPROC, lwWaitLink, iter.cur); 0.00 : 68f566: 48 8d 79 b8 lea -0x48(%rcx),%rdi : * Delete 'node' from its list (it must be in one). : */ : STATIC_IF_INLINE void : dlist_delete(dlist_node *node) : { : node->prev->next = node->next; 0.00 : 68f56a: 48 8b 57 48 mov 0x48(%rdi),%rdx 0.00 : 68f56e: 48 8b 47 50 mov 0x50(%rdi),%rax 0.00 : 68f572: 48 89 42 08 mov %rax,0x8(%rdx) : node->next->prev = node->prev; 0.00 : 68f576: 48 8b 57 50 mov 0x50(%rdi),%rdx 0.00 : 68f57a: 48 8b 47 48 mov 0x48(%rdi),%rax 0.00 : 68f57e: 48 89 02 mov %rax,(%rdx) : : LOG_LWDEBUG("LWLockRelease", lock, "release waiter"); : dlist_delete(&waiter->lwWaitLink); : pg_write_barrier(); : waiter->lwWaiting = false; : PGSemaphoreUnlock(&waiter->sem); 0.00 : 68f581: 48 83 c7 10 add $0x10,%rdi : PGPROC *waiter = dlist_container(PGPROC, lwWaitLink, iter.cur); : : LOG_LWDEBUG("LWLockRelease", lock, "release waiter"); : dlist_delete(&waiter->lwWaitLink); : pg_write_barrier(); : waiter->lwWaiting = false; 0.00 : 68f585: c6 41 f9 00 movb $0x0,-0x7(%rcx) : PGSemaphoreUnlock(&waiter->sem); 0.00 : 68f589: e8 02 8b fa ff callq 638090 : SpinLockRelease(&lock->mutex); : : /* : * Awaken any waiters I removed from the queue. : */ : dlist_foreach_modify(iter, &wakeup) 0.00 : 68f58e: 4c 39 eb cmp %r13,%rbx 0.00 : 68f591: 48 8b 43 08 mov 0x8(%rbx),%rax 0.00 : 68f595: 75 c9 jne 68f560 : TRACE_POSTGRESQL_LWLOCK_RELEASE(T_NAME(lock), T_ID(lock)); : : /* : * Now okay to allow cancel/die interrupts. : */ : RESUME_INTERRUPTS(); 0.00 : 68f597: 8b 05 fb aa 52 00 mov 0x52aafb(%rip),%eax # bba098 0.00 : 68f59d: 83 e8 01 sub $0x1,%eax 0.00 : 68f5a0: 89 05 f2 aa 52 00 mov %eax,0x52aaf2(%rip) # bba098 : } 0.00 : 68f5a6: 48 83 c4 18 add $0x18,%rsp 0.00 : 68f5aa: 5b pop %rbx 0.00 : 68f5ab: 41 5c pop %r12 0.00 : 68f5ad: 41 5d pop %r13 0.00 : 68f5af: c9 leaveq 0.00 : 68f5b0: c3 retq 0.00 : 68f5b1: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : /* : * Release my hold on lock, after that it can immediately be acquired by : * others, even if we still have to wakeup other waiters. : */ : if (mode == LW_EXCLUSIVE) : lockcount = pg_atomic_sub_fetch_u32(&lock->lockcount, EXCLUSIVE_LOCK); 0.00 : 68f5b8: 49 8d 54 24 04 lea 0x4(%r12),%rdx 0.00 : 68f5bd: b8 00 00 00 c0 mov $0xc0000000,%eax 0.00 : 68f5c2: f0 0f c1 02 lock xadd %eax,(%rdx) : #if !defined(PG_HAVE_ATOMIC_SUB_FETCH_U32) && defined(PG_HAVE_ATOMIC_FETCH_SUB_U32) : #define PG_HAVE_ATOMIC_SUB_FETCH_U32 : static inline uint32 : pg_atomic_sub_fetch_u32_impl(volatile pg_atomic_uint32 *ptr, int32 sub_) : { : return pg_atomic_fetch_sub_u32_impl(ptr, sub_) - sub_; 16.67 : 68f5c6: 8d 90 00 00 00 c0 lea -0x40000000(%rax),%edx 0.00 : 68f5cc: e9 81 fe ff ff jmpq 68f452 0.00 : 68f5d1: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : * Previous state will be thrown away without any cleanup. : */ : STATIC_IF_INLINE void : dlist_init(dlist_head *head) : { : head->head.next = head->head.prev = &head->head; 0.00 : 68f5d8: 4c 89 6d d0 mov %r13,-0x30(%rbp) 0.00 : 68f5dc: 4c 89 6d d8 mov %r13,-0x28(%rbp) 0.00 : 68f5e0: e9 24 ff ff ff jmpq 68f509 0.00 : 68f5e5: 0f 1f 00 nopl (%rax) : mode = held_lwlocks[i].mode; : break; : } : } : if (i < 0) : elog(ERROR, "lock %s %d is not held", T_NAME(lock), T_ID(lock)); 0.00 : 68f5e8: ba 10 d1 8a 00 mov $0x8ad110,%edx 0.00 : 68f5ed: be 31 06 00 00 mov $0x631,%esi 0.00 : 68f5f2: bf 85 d0 8a 00 mov $0x8ad085,%edi 0.00 : 68f5f7: e8 24 be 0e 00 callq 77b420 0.00 : 68f5fc: 49 63 54 24 0c movslq 0xc(%r12),%rdx 0.00 : 68f601: 48 8b 05 08 e4 4e 00 mov 0x4ee408(%rip),%rax # b7da10 0.00 : 68f608: bf 14 00 00 00 mov $0x14,%edi 0.00 : 68f60d: 48 8b 34 d0 mov (%rax,%rdx,8),%rsi 0.00 : 68f611: 31 d2 xor %edx,%edx 0.00 : 68f613: 4c 2b 66 08 sub 0x8(%rsi),%r12 0.00 : 68f617: 4c 89 e0 mov %r12,%rax 0.00 : 68f61a: 48 f7 76 10 divq 0x10(%rsi) 0.00 : 68f61e: 48 8b 16 mov (%rsi),%rdx 0.00 : 68f621: be bf d0 8a 00 mov $0x8ad0bf,%esi 0.00 : 68f626: 89 c1 mov %eax,%ecx 0.00 : 68f628: 31 c0 xor %eax,%eax 0.00 : 68f62a: e8 01 bc 0e 00 callq 77b230 0.00 : 68f62f: e8 9c 9e dd ff callq 4694d0 0.00 : 68f634: 0f 1f 40 00 nopl 0x0(%rax) : #endif : : /* remove the to-be-awakened PGPROCs from the queue */ : releaseOK = true; : : dlist_foreach_modify(iter, &lock->waiters) 0.00 : 68f638: 45 31 c0 xor %r8d,%r8d 0.00 : 68f63b: e9 fe fe ff ff jmpq 68f53e : : /* Acquire mutex. Time spent holding mutex should be short! */ : #ifdef LWLOCK_STATS : lwstats->spin_delay_count += SpinLockAcquire(&lock->mutex); : #else : SpinLockAcquire(&lock->mutex); 0.00 : 68f640: ba e1 02 00 00 mov $0x2e1,%edx 0.00 : 68f645: be 85 d0 8a 00 mov $0x8ad085,%esi 0.00 : 68f64a: 48 89 df mov %rbx,%rdi 0.00 : 68f64d: e8 ee 09 00 00 callq 690040 0.00 : 68f652: e9 37 fe ff ff jmpq 68f48e : #endif : : /* remove the to-be-awakened PGPROCs from the queue */ : releaseOK = true; : : dlist_foreach_modify(iter, &lock->waiters) 0.00 : 68f657: 41 b8 01 00 00 00 mov $0x1,%r8d 0.00 : 68f65d: e9 dc fe ff ff jmpq 68f53e : if (mode == LW_EXCLUSIVE && have_waiters) : check_waiters = true; : /* : * nobody has this locked anymore, potential exclusive lockers get a chance : */ : else if (lockcount == 0 && have_waiters) 0.00 : 68f662: 85 d2 test %edx,%edx 0.00 : 68f664: 0f 1f 40 00 nopl 0x0(%rax) 0.00 : 68f668: 0f 84 f8 fd ff ff je 68f466 0.00 : 68f66e: 66 90 xchg %ax,%ax 0.00 : 68f670: e9 22 ff ff ff jmpq 68f597 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 20.00 /home/Computational/mark/src/postgres-andres/src/backend/access/index/indexam.c:531 20.00 /home/Computational/mark/src/postgres-andres/src/backend/access/index/indexam.c:537 20.00 /home/Computational/mark/src/postgres-andres/src/backend/access/index/indexam.c:546 20.00 /home/Computational/mark/src/postgres-andres/src/backend/access/index/indexam.c:546 20.00 /home/Computational/mark/src/postgres-andres/src/backend/access/index/indexam.c:525 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000004a5520 : : * enough information to do it efficiently in the general case. : * ---------------- : */ : HeapTuple : index_fetch_heap(IndexScanDesc scan) : { 0.00 : 4a5520: 55 push %rbp 0.00 : 4a5521: 48 89 e5 mov %rsp,%rbp 0.00 : 4a5524: 41 55 push %r13 0.00 : 4a5526: 41 54 push %r12 0.00 : 4a5528: 49 89 fc mov %rdi,%r12 0.00 : 4a552b: 53 push %rbx 0.00 : 4a552c: 48 83 ec 18 sub $0x18,%rsp : ItemPointer tid = &scan->xs_ctup.t_self; : bool all_dead = false; 0.00 : 4a5530: c6 45 e7 00 movb $0x0,-0x19(%rbp) : bool got_heap_tuple; : : /* We can skip the buffer-switching logic if we're in mid-HOT chain. */ : if (!scan->xs_continue_hot) 0.00 : 4a5534: 80 7f 6d 00 cmpb $0x0,0x6d(%rdi) 0.00 : 4a5538: 0f 84 9a 00 00 00 je 4a55d8 : if (prev_buf != scan->xs_cbuf) : heap_page_prune_opt(scan->heapRelation, scan->xs_cbuf); : } : : /* Obtain share-lock on the buffer so we can examine visibility */ : LockBuffer(scan->xs_cbuf, BUFFER_LOCK_SHARE); 0.00 : 4a553e: 41 8b 7c 24 68 mov 0x68(%r12),%edi 0.00 : 4a5543: be 01 00 00 00 mov $0x1,%esi : got_heap_tuple = heap_hot_search_buffer(tid, scan->heapRelation, 0.00 : 4a5548: 4d 8d 6c 24 50 lea 0x50(%r12),%r13 : if (prev_buf != scan->xs_cbuf) : heap_page_prune_opt(scan->heapRelation, scan->xs_cbuf); : } : : /* Obtain share-lock on the buffer so we can examine visibility */ : LockBuffer(scan->xs_cbuf, BUFFER_LOCK_SHARE); 0.00 : 4a554d: e8 be f1 1c 00 callq 674710 : got_heap_tuple = heap_hot_search_buffer(tid, scan->heapRelation, 0.00 : 4a5552: 31 c0 xor %eax,%eax 0.00 : 4a5554: 41 80 7c 24 6d 00 cmpb $0x0,0x6d(%r12) 0.00 : 4a555a: 49 8b 4c 24 10 mov 0x10(%r12),%rcx 0.00 : 4a555f: 41 8b 54 24 68 mov 0x68(%r12),%edx 0.00 : 4a5564: 49 8b 34 24 mov (%r12),%rsi 0.00 : 4a5568: 49 8d 7c 24 54 lea 0x54(%r12),%rdi 0.00 : 4a556d: 4c 8d 4d e7 lea -0x19(%rbp),%r9 0.00 : 4a5571: 4d 89 e8 mov %r13,%r8 0.00 : 4a5574: 0f 94 c0 sete %al 0.00 : 4a5577: 89 04 24 mov %eax,(%rsp) /home/Computational/mark/src/postgres-andres/src/backend/access/index/indexam.c:531 20.00 : 4a557a: e8 a1 7c ff ff callq 49d220 : scan->xs_cbuf, : scan->xs_snapshot, : &scan->xs_ctup, : &all_dead, : !scan->xs_continue_hot); : LockBuffer(scan->xs_cbuf, BUFFER_LOCK_UNLOCK); 0.00 : 4a557f: 41 8b 7c 24 68 mov 0x68(%r12),%edi : heap_page_prune_opt(scan->heapRelation, scan->xs_cbuf); : } : : /* Obtain share-lock on the buffer so we can examine visibility */ : LockBuffer(scan->xs_cbuf, BUFFER_LOCK_SHARE); : got_heap_tuple = heap_hot_search_buffer(tid, scan->heapRelation, 0.00 : 4a5584: 89 c3 mov %eax,%ebx : scan->xs_cbuf, : scan->xs_snapshot, : &scan->xs_ctup, : &all_dead, : !scan->xs_continue_hot); : LockBuffer(scan->xs_cbuf, BUFFER_LOCK_UNLOCK); /home/Computational/mark/src/postgres-andres/src/backend/access/index/indexam.c:537 20.00 : 4a5586: 31 f6 xor %esi,%esi 0.00 : 4a5588: e8 83 f1 1c 00 callq 674710 : : if (got_heap_tuple) 0.00 : 4a558d: 84 db test %bl,%bl 0.00 : 4a558f: 74 7f je 4a5610 : { : /* : * Only in a non-MVCC snapshot can more than one member of the HOT : * chain be visible. : */ : scan->xs_continue_hot = !IsMVCCSnapshot(scan->xs_snapshot); 0.00 : 4a5591: 49 8b 44 24 10 mov 0x10(%r12),%rax 0.00 : 4a5596: 31 d2 xor %edx,%edx 0.00 : 4a5598: 48 8b 00 mov (%rax),%rax 0.00 : 4a559b: 48 3d 50 57 7a 00 cmp $0x7a5750,%rax 0.00 : 4a55a1: 74 09 je 4a55ac 0.00 : 4a55a3: 48 3d 60 47 7a 00 cmp $0x7a4760,%rax 0.00 : 4a55a9: 0f 95 c2 setne %dl : pgstat_count_heap_fetch(scan->indexRelation); /home/Computational/mark/src/postgres-andres/src/backend/access/index/indexam.c:546 20.00 : 4a55ac: 49 8b 44 24 08 mov 0x8(%r12),%rax : { : /* : * Only in a non-MVCC snapshot can more than one member of the HOT : * chain be visible. : */ : scan->xs_continue_hot = !IsMVCCSnapshot(scan->xs_snapshot); 0.00 : 4a55b1: 41 88 54 24 6d mov %dl,0x6d(%r12) : pgstat_count_heap_fetch(scan->indexRelation); 0.00 : 4a55b6: 48 8b 80 38 01 00 00 mov 0x138(%rax),%rax 20.00 : 4a55bd: 48 85 c0 test %rax,%rax 0.00 : 4a55c0: 74 05 je 4a55c7 0.00 : 4a55c2: 48 83 40 20 01 addq $0x1,0x20(%rax) : */ : if (!scan->xactStartedInRecovery) : scan->kill_prior_tuple = all_dead; : : return NULL; : } 0.00 : 4a55c7: 48 83 c4 18 add $0x18,%rsp 0.00 : 4a55cb: 4c 89 e8 mov %r13,%rax 0.00 : 4a55ce: 5b pop %rbx 0.00 : 4a55cf: 41 5c pop %r12 0.00 : 4a55d1: 41 5d pop %r13 0.00 : 4a55d3: c9 leaveq 0.00 : 4a55d4: c3 retq 0.00 : 4a55d5: 0f 1f 00 nopl (%rax) : if (!scan->xs_continue_hot) : { : /* Switch to correct buffer if we don't have it already */ : Buffer prev_buf = scan->xs_cbuf; : : scan->xs_cbuf = ReleaseAndReadBuffer(scan->xs_cbuf, 0.00 : 4a55d8: 0f b7 57 54 movzwl 0x54(%rdi),%edx 0.00 : 4a55dc: 0f b7 47 56 movzwl 0x56(%rdi),%eax : : /* We can skip the buffer-switching logic if we're in mid-HOT chain. */ : if (!scan->xs_continue_hot) : { : /* Switch to correct buffer if we don't have it already */ : Buffer prev_buf = scan->xs_cbuf; 0.00 : 4a55e0: 8b 5f 68 mov 0x68(%rdi),%ebx : : scan->xs_cbuf = ReleaseAndReadBuffer(scan->xs_cbuf, 0.00 : 4a55e3: 48 8b 37 mov (%rdi),%rsi 0.00 : 4a55e6: c1 e2 10 shl $0x10,%edx 0.00 : 4a55e9: 89 df mov %ebx,%edi 0.00 : 4a55eb: 09 c2 or %eax,%edx 0.00 : 4a55ed: e8 ce 10 1d 00 callq 6766c0 : ItemPointerGetBlockNumber(tid)); : : /* : * Prune page, but only if we weren't already on this page : */ : if (prev_buf != scan->xs_cbuf) /home/Computational/mark/src/postgres-andres/src/backend/access/index/indexam.c:525 20.00 : 4a55f2: 39 c3 cmp %eax,%ebx : if (!scan->xs_continue_hot) : { : /* Switch to correct buffer if we don't have it already */ : Buffer prev_buf = scan->xs_cbuf; : : scan->xs_cbuf = ReleaseAndReadBuffer(scan->xs_cbuf, 0.00 : 4a55f4: 41 89 44 24 68 mov %eax,0x68(%r12) : ItemPointerGetBlockNumber(tid)); : : /* : * Prune page, but only if we weren't already on this page : */ : if (prev_buf != scan->xs_cbuf) 0.00 : 4a55f9: 0f 84 3f ff ff ff je 4a553e : heap_page_prune_opt(scan->heapRelation, scan->xs_cbuf); 0.00 : 4a55ff: 49 8b 3c 24 mov (%r12),%rdi 0.00 : 4a5603: 89 c6 mov %eax,%esi 0.00 : 4a5605: e8 46 a0 ff ff callq 49f650 0.00 : 4a560a: e9 2f ff ff ff jmpq 4a553e 0.00 : 4a560f: 90 nop : * AM to kill its entry for that TID (this will take effect in the next : * amgettuple call, in index_getnext_tid). We do not do this when in : * recovery because it may violate MVCC to do so. See comments in : * RelationGetIndexScan(). : */ : if (!scan->xactStartedInRecovery) 0.00 : 4a5610: 45 31 ed xor %r13d,%r13d 0.00 : 4a5613: 41 80 7c 24 33 00 cmpb $0x0,0x33(%r12) : pgstat_count_heap_fetch(scan->indexRelation); : return &scan->xs_ctup; : } : : /* We've reached the end of the HOT chain. */ : scan->xs_continue_hot = false; 0.00 : 4a5619: 41 c6 44 24 6d 00 movb $0x0,0x6d(%r12) : * AM to kill its entry for that TID (this will take effect in the next : * amgettuple call, in index_getnext_tid). We do not do this when in : * recovery because it may violate MVCC to do so. See comments in : * RelationGetIndexScan(). : */ : if (!scan->xactStartedInRecovery) 0.00 : 4a561f: 75 a6 jne 4a55c7 : scan->kill_prior_tuple = all_dead; 0.00 : 4a5621: 0f b6 45 e7 movzbl -0x19(%rbp),%eax 0.00 : 4a5625: 45 31 ed xor %r13d,%r13d 0.00 : 4a5628: 41 88 44 24 31 mov %al,0x31(%r12) 0.00 : 4a562d: eb 98 jmp 4a55c7 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 40.00 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtcompare.c:103 20.00 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtcompare.c:95 20.00 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtcompare.c:93 20.00 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtcompare.c:103 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000004a5c40 : : : Datum : btint4cmp(PG_FUNCTION_ARGS) : { : int32 a = PG_GETARG_INT32(0); : int32 b = PG_GETARG_INT32(1); /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtcompare.c:95 20.00 : 4a5c40: 8b 47 28 mov 0x28(%rdi),%eax : : if (a > b) 0.00 : 4a5c43: 39 47 20 cmp %eax,0x20(%rdi) 0.00 : 4a5c46: ba 01 00 00 00 mov $0x1,%edx : PG_RETURN_VOID(); : } : : Datum : btint4cmp(PG_FUNCTION_ARGS) : { /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtcompare.c:93 20.00 : 4a5c4b: 55 push %rbp 0.00 : 4a5c4c: 48 89 e5 mov %rsp,%rbp : int32 a = PG_GETARG_INT32(0); : int32 b = PG_GETARG_INT32(1); : : if (a > b) 0.00 : 4a5c4f: 7f 0e jg 4a5c5f : PG_RETURN_INT32(1); : else if (a == b) 0.00 : 4a5c51: ba ff ff ff ff mov $0xffffffff,%edx 0.00 : 4a5c56: b8 00 00 00 00 mov $0x0,%eax 0.00 : 4a5c5b: 48 0f 44 d0 cmove %rax,%rdx : PG_RETURN_INT32(0); : else : PG_RETURN_INT32(-1); : } 0.00 : 4a5c5f: 48 89 d0 mov %rdx,%rax /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtcompare.c:103 60.00 : 4a5c62: c9 leaveq Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 40.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1057 40.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1059 20.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1057 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000005aca20 : : * ---------------------------------------------------------------- : */ : static Datum : ExecEvalConst(ExprState *exprstate, ExprContext *econtext, : bool *isNull, ExprDoneCond *isDone) : { 0.00 : 5aca20: 55 push %rbp : Const *con = (Const *) exprstate->expr; : : if (isDone) 0.00 : 5aca21: 48 85 c9 test %rcx,%rcx : */ : static Datum : ExecEvalConst(ExprState *exprstate, ExprContext *econtext, : bool *isNull, ExprDoneCond *isDone) : { : Const *con = (Const *) exprstate->expr; 0.00 : 5aca24: 48 8b 77 08 mov 0x8(%rdi),%rsi : * ---------------------------------------------------------------- : */ : static Datum : ExecEvalConst(ExprState *exprstate, ExprContext *econtext, : bool *isNull, ExprDoneCond *isDone) : { 0.00 : 5aca28: 48 89 e5 mov %rsp,%rbp : Const *con = (Const *) exprstate->expr; : : if (isDone) 0.00 : 5aca2b: 74 06 je 5aca33 : *isDone = ExprSingleResult; 0.00 : 5aca2d: c7 01 00 00 00 00 movl $0x0,(%rcx) : : *isNull = con->constisnull; 0.00 : 5aca33: 0f b6 46 20 movzbl 0x20(%rsi),%eax /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1057 40.00 : 5aca37: 88 02 mov %al,(%rdx) 20.00 : 5aca39: 48 8b 46 18 mov 0x18(%rsi),%rax : return con->constvalue; : } /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1059 40.00 : 5aca3d: c9 leaveq Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 40.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/execScan.c:230 20.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/execScan.c:122 20.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/execScan.c:82 20.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/execScan.c:43 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000005b3750 : : */ : TupleTableSlot * : ExecScan(ScanState *node, : ExecScanAccessMtd accessMtd, /* function returning a tuple */ : ExecScanRecheckMtd recheckMtd) : { 0.00 : 5b3750: 55 push %rbp 0.00 : 5b3751: 48 89 e5 mov %rsp,%rbp 0.00 : 5b3754: 41 57 push %r15 0.00 : 5b3756: 41 56 push %r14 0.00 : 5b3758: 41 55 push %r13 0.00 : 5b375a: 41 54 push %r12 0.00 : 5b375c: 49 89 fc mov %rdi,%r12 0.00 : 5b375f: 53 push %rbx 0.00 : 5b3760: 48 83 ec 28 sub $0x28,%rsp 0.00 : 5b3764: 48 89 75 b8 mov %rsi,-0x48(%rbp) 0.00 : 5b3768: 48 89 55 b0 mov %rdx,-0x50(%rbp) : TupleTableSlot *resultSlot; : : /* : * Fetch data from node : */ : qual = node->ps.qual; 0.00 : 5b376c: 48 8b 47 28 mov 0x28(%rdi),%rax : : /* : * If we have neither a qual to check nor a projection to do, just skip : * all the overhead and return the raw scan tuple. : */ : if (!qual && !projInfo) 0.00 : 5b3770: 48 85 c0 test %rax,%rax : TupleTableSlot *resultSlot; : : /* : * Fetch data from node : */ : qual = node->ps.qual; 0.00 : 5b3773: 48 89 45 c0 mov %rax,-0x40(%rbp) : projInfo = node->ps.ps_ProjInfo; /home/Computational/mark/src/postgres-andres/src/backend/executor/execScan.c:122 20.00 : 5b3777: 4c 8b 77 68 mov 0x68(%rdi),%r14 : econtext = node->ps.ps_ExprContext; 0.00 : 5b377b: 4c 8b 6f 60 mov 0x60(%rdi),%r13 : : /* : * If we have neither a qual to check nor a projection to do, just skip : * all the overhead and return the raw scan tuple. : */ : if (!qual && !projInfo) 0.00 : 5b377f: 41 0f 94 c7 sete %r15b 0.00 : 5b3783: 75 09 jne 5b378e 0.00 : 5b3785: 4d 85 f6 test %r14,%r14 0.00 : 5b3788: 0f 84 d6 01 00 00 je 5b3964 : /* : * Check to see if we're still projecting out tuples from a previous scan : * tuple (because there is a function-returning-set in the projection : * expressions). If so, try to project another one. : */ : if (node->ps.ps_TupFromTlist) 0.00 : 5b378e: 41 80 7c 24 70 00 cmpb $0x0,0x70(%r12) 0.00 : 5b3794: 0f 85 a6 01 00 00 jne 5b3940 0.00 : 5b379a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : /* : * Reset per-tuple memory context to free any expression evaluation : * storage allocated in the previous tuple cycle. Note this can't happen : * until we're done projecting out tuples from a scan tuple. : */ : ResetExprContext(econtext); 0.00 : 5b37a0: 49 8b 7d 28 mov 0x28(%r13),%rdi 0.00 : 5b37a4: e8 07 52 1e 00 callq 7989b0 : */ : for (;;) : { : TupleTableSlot *slot; : : CHECK_FOR_INTERRUPTS(); 0.00 : 5b37a9: 0f b6 05 e0 68 60 00 movzbl 0x6068e0(%rip),%eax # bba090 0.00 : 5b37b0: 84 c0 test %al,%al 0.00 : 5b37b2: 0f 85 50 01 00 00 jne 5b3908 : static inline TupleTableSlot * : ExecScanFetch(ScanState *node, : ExecScanAccessMtd accessMtd, : ExecScanRecheckMtd recheckMtd) : { : EState *estate = node->ps.state; 0.00 : 5b37b8: 49 8b 54 24 10 mov 0x10(%r12),%rdx : : if (estate->es_epqTuple != NULL) 0.00 : 5b37bd: 48 83 ba d0 00 00 00 cmpq $0x0,0xd0(%rdx) 0.00 : 5b37c4: 00 0.00 : 5b37c5: 0f 84 0d 01 00 00 je 5b38d8 : * conditions. : */ : Index scanrelid = ((Scan *) node->ps.plan)->scanrelid; : : Assert(scanrelid > 0); : if (estate->es_epqTupleSet[scanrelid - 1]) 0.00 : 5b37cb: 49 8b 44 24 08 mov 0x8(%r12),%rax 0.00 : 5b37d0: 8b 40 60 mov 0x60(%rax),%eax 0.00 : 5b37d3: 8d 48 ff lea -0x1(%rax),%ecx 0.00 : 5b37d6: 48 8b 82 d8 00 00 00 mov 0xd8(%rdx),%rax 0.00 : 5b37dd: 80 3c 08 00 cmpb $0x0,(%rax,%rcx,1) 0.00 : 5b37e1: 0f 84 f1 00 00 00 je 5b38d8 : { : TupleTableSlot *slot = node->ss_ScanTupleSlot; : : /* Return empty slot if we already returned a tuple */ : if (estate->es_epqScanDone[scanrelid - 1]) 0.00 : 5b37e7: 48 89 c8 mov %rcx,%rax 0.00 : 5b37ea: 48 03 82 e0 00 00 00 add 0xe0(%rdx),%rax : Index scanrelid = ((Scan *) node->ps.plan)->scanrelid; : : Assert(scanrelid > 0); : if (estate->es_epqTupleSet[scanrelid - 1]) : { : TupleTableSlot *slot = node->ss_ScanTupleSlot; 0.00 : 5b37f1: 49 8b 9c 24 88 00 00 mov 0x88(%r12),%rbx 0.00 : 5b37f8: 00 : : /* Return empty slot if we already returned a tuple */ : if (estate->es_epqScanDone[scanrelid - 1]) 0.00 : 5b37f9: 80 38 00 cmpb $0x0,(%rax) 0.00 : 5b37fc: 0f 85 16 01 00 00 jne 5b3918 : return ExecClearTuple(slot); : /* Else mark to remember that we shouldn't return more */ : estate->es_epqScanDone[scanrelid - 1] = true; 0.00 : 5b3802: c6 00 01 movb $0x1,(%rax) : : /* Return empty slot if we haven't got a test tuple */ : if (estate->es_epqTuple[scanrelid - 1] == NULL) 0.00 : 5b3805: 48 8b 82 d0 00 00 00 mov 0xd0(%rdx),%rax 0.00 : 5b380c: 48 8b 3c c8 mov (%rax,%rcx,8),%rdi 0.00 : 5b3810: 48 85 ff test %rdi,%rdi 0.00 : 5b3813: 0f 84 ff 00 00 00 je 5b3918 : return ExecClearTuple(slot); : : /* Store test tuple in the plan node's scan slot */ : ExecStoreTuple(estate->es_epqTuple[scanrelid - 1], 0.00 : 5b3819: 31 c9 xor %ecx,%ecx 0.00 : 5b381b: 31 d2 xor %edx,%edx 0.00 : 5b381d: 48 89 de mov %rbx,%rsi 0.00 : 5b3820: e8 5b 0c 00 00 callq 5b4480 : slot, InvalidBuffer, false); : : /* Check if it meets the access-method conditions */ : if (!(*recheckMtd) (node, slot)) 0.00 : 5b3825: 48 89 de mov %rbx,%rsi 0.00 : 5b3828: 4c 89 e7 mov %r12,%rdi 0.00 : 5b382b: ff 55 b0 callq *-0x50(%rbp) 0.00 : 5b382e: 84 c0 test %al,%al 0.00 : 5b3830: 0f 84 fa 00 00 00 je 5b3930 : * if the slot returned by the accessMtd contains NULL, then it means : * there is nothing more to scan so we just return an empty slot, : * being careful to use the projection result slot so it has correct : * tupleDesc. : */ : if (TupIsNull(slot)) 0.00 : 5b3836: 48 85 db test %rbx,%rbx 0.00 : 5b3839: 0f 84 ab 00 00 00 je 5b38ea 0.00 : 5b383f: 80 7b 04 00 cmpb $0x0,0x4(%rbx) 0.00 : 5b3843: 0f 85 a1 00 00 00 jne 5b38ea : * : * check for non-nil qual here to avoid a function call to ExecQual() : * when the qual is nil ... saves only a few cycles, but they add up : * ... : */ : if (!qual || ExecQual(qual, econtext, false)) 0.00 : 5b3849: 45 84 ff test %r15b,%r15b : } : : /* : * place the current tuple into the expr context : */ : econtext->ecxt_scantuple = slot; 0.00 : 5b384c: 49 89 5d 08 mov %rbx,0x8(%r13) : * : * check for non-nil qual here to avoid a function call to ExecQual() : * when the qual is nil ... saves only a few cycles, but they add up : * ... : */ : if (!qual || ExecQual(qual, econtext, false)) 0.00 : 5b3850: 75 3e jne 5b3890 0.00 : 5b3852: 48 8b 7d c0 mov -0x40(%rbp),%rdi 0.00 : 5b3856: 31 d2 xor %edx,%edx 0.00 : 5b3858: 4c 89 ee mov %r13,%rsi 0.00 : 5b385b: e8 b0 96 ff ff callq 5acf10 0.00 : 5b3860: 84 c0 test %al,%al 0.00 : 5b3862: 75 2c jne 5b3890 : */ : return slot; : } : } : else : InstrCountFiltered1(node, 1); 0.00 : 5b3864: 49 8b 44 24 18 mov 0x18(%r12),%rax 0.00 : 5b3869: 48 85 c0 test %rax,%rax 0.00 : 5b386c: 0f 84 2e ff ff ff je 5b37a0 0.00 : 5b3872: f2 0f 10 05 de b8 1f movsd 0x1fb8de(%rip),%xmm0 # 7af158 <__func__.15777+0x10> 0.00 : 5b3879: 00 0.00 : 5b387a: f2 0f 58 80 c8 00 00 addsd 0xc8(%rax),%xmm0 0.00 : 5b3881: 00 0.00 : 5b3882: f2 0f 11 80 c8 00 00 movsd %xmm0,0xc8(%rax) 0.00 : 5b3889: 00 0.00 : 5b388a: e9 11 ff ff ff jmpq 5b37a0 0.00 : 5b388f: 90 nop : if (!qual || ExecQual(qual, econtext, false)) : { : /* : * Found a satisfactory scan tuple. : */ : if (projInfo) 0.00 : 5b3890: 4d 85 f6 test %r14,%r14 0.00 : 5b3893: 74 2b je 5b38c0 : /* : * Form a projection tuple, store it in the result tuple slot : * and return it --- unless we find we can project no tuples : * from this scan tuple, in which case continue scan. : */ : resultSlot = ExecProject(projInfo, &isDone); 0.00 : 5b3895: 48 8d 75 d4 lea -0x2c(%rbp),%rsi 0.00 : 5b3899: 4c 89 f7 mov %r14,%rdi 0.00 : 5b389c: e8 5f 97 ff ff callq 5ad000 0.00 : 5b38a1: 48 89 c3 mov %rax,%rbx : if (isDone != ExprEndResult) 0.00 : 5b38a4: 8b 45 d4 mov -0x2c(%rbp),%eax 0.00 : 5b38a7: 83 f8 02 cmp $0x2,%eax 0.00 : 5b38aa: 0f 84 f0 fe ff ff je 5b37a0 : { : node->ps.ps_TupFromTlist = (isDone == ExprMultipleResult); 0.00 : 5b38b0: 83 e8 01 sub $0x1,%eax 0.00 : 5b38b3: 41 0f 94 44 24 70 sete 0x70(%r12) 0.00 : 5b38b9: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : /* : * Tuple fails qual, so free per-tuple memory and try again. : */ : ResetExprContext(econtext); : } : } 0.00 : 5b38c0: 48 83 c4 28 add $0x28,%rsp 0.00 : 5b38c4: 48 89 d8 mov %rbx,%rax 0.00 : 5b38c7: 5b pop %rbx 0.00 : 5b38c8: 41 5c pop %r12 /home/Computational/mark/src/postgres-andres/src/backend/executor/execScan.c:230 40.00 : 5b38ca: 41 5d pop %r13 0.00 : 5b38cc: 41 5e pop %r14 0.00 : 5b38ce: 41 5f pop %r15 0.00 : 5b38d0: c9 leaveq 0.00 : 5b38d1: c3 retq 0.00 : 5b38d2: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : } : : /* : * Run the node-type-specific access method function to get the next tuple : */ : return (*accessMtd) (node); 0.00 : 5b38d8: 4c 89 e7 mov %r12,%rdi 0.00 : 5b38db: ff 55 b8 callq *-0x48(%rbp) /home/Computational/mark/src/postgres-andres/src/backend/executor/execScan.c:82 20.00 : 5b38de: 48 89 c3 mov %rax,%rbx : * if the slot returned by the accessMtd contains NULL, then it means : * there is nothing more to scan so we just return an empty slot, : * being careful to use the projection result slot so it has correct : * tupleDesc. : */ : if (TupIsNull(slot)) 0.00 : 5b38e1: 48 85 db test %rbx,%rbx 0.00 : 5b38e4: 0f 85 55 ff ff ff jne 5b383f : { : if (projInfo) 0.00 : 5b38ea: 4d 85 f6 test %r14,%r14 0.00 : 5b38ed: 0f 1f 00 nopl (%rax) 0.00 : 5b38f0: 74 ce je 5b38c0 : return ExecClearTuple(projInfo->pi_slot); 0.00 : 5b38f2: 49 8b 7e 18 mov 0x18(%r14),%rdi 0.00 : 5b38f6: e8 15 08 00 00 callq 5b4110 0.00 : 5b38fb: 48 89 c3 mov %rax,%rbx 0.00 : 5b38fe: 66 90 xchg %ax,%ax : /* : * Tuple fails qual, so free per-tuple memory and try again. : */ : ResetExprContext(econtext); : } : } 0.00 : 5b3900: eb be jmp 5b38c0 0.00 : 5b3902: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : */ : for (;;) : { : TupleTableSlot *slot; : : CHECK_FOR_INTERRUPTS(); 0.00 : 5b3908: e8 93 89 0e 00 callq 69c2a0 0.00 : 5b390d: 0f 1f 00 nopl (%rax) 0.00 : 5b3910: e9 a3 fe ff ff jmpq 5b37b8 0.00 : 5b3915: 0f 1f 00 nopl (%rax) : /* Else mark to remember that we shouldn't return more */ : estate->es_epqScanDone[scanrelid - 1] = true; : : /* Return empty slot if we haven't got a test tuple */ : if (estate->es_epqTuple[scanrelid - 1] == NULL) : return ExecClearTuple(slot); 0.00 : 5b3918: 48 89 df mov %rbx,%rdi 0.00 : 5b391b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 5b3920: e8 eb 07 00 00 callq 5b4110 0.00 : 5b3925: 48 89 c3 mov %rax,%rbx 0.00 : 5b3928: e9 09 ff ff ff jmpq 5b3836 0.00 : 5b392d: 0f 1f 00 nopl (%rax) : ExecStoreTuple(estate->es_epqTuple[scanrelid - 1], : slot, InvalidBuffer, false); : : /* Check if it meets the access-method conditions */ : if (!(*recheckMtd) (node, slot)) : ExecClearTuple(slot); /* would not be returned by scan */ 0.00 : 5b3930: 48 89 df mov %rbx,%rdi 0.00 : 5b3933: e8 d8 07 00 00 callq 5b4110 0.00 : 5b3938: e9 f9 fe ff ff jmpq 5b3836 0.00 : 5b393d: 0f 1f 00 nopl (%rax) : * expressions). If so, try to project another one. : */ : if (node->ps.ps_TupFromTlist) : { : Assert(projInfo); /* can't get here if not projecting */ : resultSlot = ExecProject(projInfo, &isDone); 0.00 : 5b3940: 48 8d 75 d4 lea -0x2c(%rbp),%rsi 0.00 : 5b3944: 4c 89 f7 mov %r14,%rdi 0.00 : 5b3947: e8 b4 96 ff ff callq 5ad000 : if (isDone == ExprMultipleResult) 0.00 : 5b394c: 83 7d d4 01 cmpl $0x1,-0x2c(%rbp) : * expressions). If so, try to project another one. : */ : if (node->ps.ps_TupFromTlist) : { : Assert(projInfo); /* can't get here if not projecting */ : resultSlot = ExecProject(projInfo, &isDone); 0.00 : 5b3950: 48 89 c3 mov %rax,%rbx : if (isDone == ExprMultipleResult) 0.00 : 5b3953: 0f 84 67 ff ff ff je 5b38c0 : return resultSlot; : /* Done with that source tuple... */ : node->ps.ps_TupFromTlist = false; 0.00 : 5b3959: 41 c6 44 24 70 00 movb $0x0,0x70(%r12) 0.00 : 5b395f: e9 3c fe ff ff jmpq 5b37a0 : * If we have neither a qual to check nor a projection to do, just skip : * all the overhead and return the raw scan tuple. : */ : if (!qual && !projInfo) : { : ResetExprContext(econtext); 0.00 : 5b3964: 49 8b 7d 28 mov 0x28(%r13),%rdi 0.00 : 5b3968: e8 43 50 1e 00 callq 7989b0 : static inline TupleTableSlot * : ExecScanFetch(ScanState *node, : ExecScanAccessMtd accessMtd, : ExecScanRecheckMtd recheckMtd) : { : EState *estate = node->ps.state; 0.00 : 5b396d: 49 8b 54 24 10 mov 0x10(%r12),%rdx : : if (estate->es_epqTuple != NULL) 0.00 : 5b3972: 48 83 ba d0 00 00 00 cmpq $0x0,0xd0(%rdx) 0.00 : 5b3979: 00 /home/Computational/mark/src/postgres-andres/src/backend/executor/execScan.c:43 20.00 : 5b397a: 74 74 je 5b39f0 : * conditions. : */ : Index scanrelid = ((Scan *) node->ps.plan)->scanrelid; : : Assert(scanrelid > 0); : if (estate->es_epqTupleSet[scanrelid - 1]) 0.00 : 5b397c: 49 8b 44 24 08 mov 0x8(%r12),%rax 0.00 : 5b3981: 8b 40 60 mov 0x60(%rax),%eax 0.00 : 5b3984: 8d 48 ff lea -0x1(%rax),%ecx 0.00 : 5b3987: 48 8b 82 d8 00 00 00 mov 0xd8(%rdx),%rax 0.00 : 5b398e: 80 3c 08 00 cmpb $0x0,(%rax,%rcx,1) 0.00 : 5b3992: 74 5c je 5b39f0 : { : TupleTableSlot *slot = node->ss_ScanTupleSlot; : : /* Return empty slot if we already returned a tuple */ : if (estate->es_epqScanDone[scanrelid - 1]) 0.00 : 5b3994: 48 89 c8 mov %rcx,%rax 0.00 : 5b3997: 48 03 82 e0 00 00 00 add 0xe0(%rdx),%rax : Index scanrelid = ((Scan *) node->ps.plan)->scanrelid; : : Assert(scanrelid > 0); : if (estate->es_epqTupleSet[scanrelid - 1]) : { : TupleTableSlot *slot = node->ss_ScanTupleSlot; 0.00 : 5b399e: 49 8b 9c 24 88 00 00 mov 0x88(%r12),%rbx 0.00 : 5b39a5: 00 : : /* Return empty slot if we already returned a tuple */ : if (estate->es_epqScanDone[scanrelid - 1]) 0.00 : 5b39a6: 80 38 00 cmpb $0x0,(%rax) 0.00 : 5b39a9: 75 5a jne 5b3a05 : return ExecClearTuple(slot); : /* Else mark to remember that we shouldn't return more */ : estate->es_epqScanDone[scanrelid - 1] = true; 0.00 : 5b39ab: c6 00 01 movb $0x1,(%rax) : : /* Return empty slot if we haven't got a test tuple */ : if (estate->es_epqTuple[scanrelid - 1] == NULL) 0.00 : 5b39ae: 48 8b 82 d0 00 00 00 mov 0xd0(%rdx),%rax 0.00 : 5b39b5: 48 8b 3c c8 mov (%rax,%rcx,8),%rdi 0.00 : 5b39b9: 48 85 ff test %rdi,%rdi 0.00 : 5b39bc: 74 47 je 5b3a05 : return ExecClearTuple(slot); : : /* Store test tuple in the plan node's scan slot */ : ExecStoreTuple(estate->es_epqTuple[scanrelid - 1], 0.00 : 5b39be: 31 c9 xor %ecx,%ecx 0.00 : 5b39c0: 31 d2 xor %edx,%edx 0.00 : 5b39c2: 48 89 de mov %rbx,%rsi 0.00 : 5b39c5: e8 b6 0a 00 00 callq 5b4480 : slot, InvalidBuffer, false); : : /* Check if it meets the access-method conditions */ : if (!(*recheckMtd) (node, slot)) 0.00 : 5b39ca: 48 89 de mov %rbx,%rsi 0.00 : 5b39cd: 4c 89 e7 mov %r12,%rdi 0.00 : 5b39d0: ff 55 b0 callq *-0x50(%rbp) 0.00 : 5b39d3: 84 c0 test %al,%al 0.00 : 5b39d5: 0f 85 e5 fe ff ff jne 5b38c0 : ExecClearTuple(slot); /* would not be returned by scan */ 0.00 : 5b39db: 48 89 df mov %rbx,%rdi 0.00 : 5b39de: e8 2d 07 00 00 callq 5b4110 0.00 : 5b39e3: e9 d8 fe ff ff jmpq 5b38c0 0.00 : 5b39e8: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 5b39ef: 00 : } : : /* : * Run the node-type-specific access method function to get the next tuple : */ : return (*accessMtd) (node); 0.00 : 5b39f0: 4c 89 e7 mov %r12,%rdi 0.00 : 5b39f3: ff 55 b8 callq *-0x48(%rbp) 0.00 : 5b39f6: 48 89 c3 mov %rax,%rbx 0.00 : 5b39f9: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 0.00 : 5b3a00: e9 bb fe ff ff jmpq 5b38c0 : /* Else mark to remember that we shouldn't return more */ : estate->es_epqScanDone[scanrelid - 1] = true; : : /* Return empty slot if we haven't got a test tuple */ : if (estate->es_epqTuple[scanrelid - 1] == NULL) : return ExecClearTuple(slot); 0.00 : 5b3a05: 48 89 df mov %rbx,%rdi 0.00 : 5b3a08: e8 03 07 00 00 callq 5b4110 0.00 : 5b3a0d: 48 89 c3 mov %rax,%rbx 0.00 : 5b3a10: e9 ab fe ff ff jmpq 5b38c0 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 80.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:1870 20.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:1858 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000675260 : : * : * Note: caller must have done ResourceOwnerEnlargeBuffers. : */ : static int : SyncOneBuffer(int buf_id, bool skip_recently_used) : { 0.00 : 675260: 55 push %rbp : static __inline__ int : tas(volatile slock_t *lock) : { : register slock_t _res = 1; : : __asm__ __volatile__( 0.00 : 675261: b8 01 00 00 00 mov $0x1,%eax 0.00 : 675266: 48 89 e5 mov %rsp,%rbp 0.00 : 675269: 48 89 5d e8 mov %rbx,-0x18(%rbp) : volatile BufferDesc *bufHdr = &BufferDescriptors[buf_id]; /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:1858 20.00 : 67526d: 48 63 df movslq %edi,%rbx : * : * Note: caller must have done ResourceOwnerEnlargeBuffers. : */ : static int : SyncOneBuffer(int buf_id, bool skip_recently_used) : { 0.00 : 675270: 4c 89 6d f8 mov %r13,-0x8(%rbp) 0.00 : 675274: 4c 89 65 f0 mov %r12,-0x10(%rbp) : volatile BufferDesc *bufHdr = &BufferDescriptors[buf_id]; 0.00 : 675278: 48 c1 e3 06 shl $0x6,%rbx : * : * Note: caller must have done ResourceOwnerEnlargeBuffers. : */ : static int : SyncOneBuffer(int buf_id, bool skip_recently_used) : { 0.00 : 67527c: 48 83 ec 20 sub $0x20,%rsp : volatile BufferDesc *bufHdr = &BufferDescriptors[buf_id]; 0.00 : 675280: 48 03 1d 79 a8 54 00 add 0x54a879(%rip),%rbx # bbfb00 : * : * Note: caller must have done ResourceOwnerEnlargeBuffers. : */ : static int : SyncOneBuffer(int buf_id, bool skip_recently_used) : { 0.00 : 675287: 41 89 f5 mov %esi,%r13d : * as we mark pages dirty in access methods *before* logging changes with : * XLogInsert(): if someone marks the buffer dirty just after our check we : * don't worry because our checkpoint.redo points before log record for : * upcoming changes and so we are not required to write such dirty buffer. : */ : LockBufHdr(bufHdr); 0.00 : 67528a: 48 8d 7b 20 lea 0x20(%rbx),%rdi 0.00 : 67528e: f0 86 07 lock xchg %al,(%rdi) /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:1870 80.00 : 675291: 84 c0 test %al,%al 0.00 : 675293: 75 5b jne 6752f0 : : if (bufHdr->refcount == 0 && bufHdr->usage_count == 0) 0.00 : 675295: 8b 43 18 mov 0x18(%rbx),%eax 0.00 : 675298: 85 c0 test %eax,%eax 0.00 : 67529a: 75 0f jne 6752ab 0.00 : 67529c: 0f b7 43 16 movzwl 0x16(%rbx),%eax : result |= BUF_REUSABLE; : else if (skip_recently_used) : { : /* Caller told us not to write recently-used buffers */ : UnlockBufHdr(bufHdr); 0.00 : 6752a0: 41 bc 02 00 00 00 mov $0x2,%r12d : * don't worry because our checkpoint.redo points before log record for : * upcoming changes and so we are not required to write such dirty buffer. : */ : LockBufHdr(bufHdr); : : if (bufHdr->refcount == 0 && bufHdr->usage_count == 0) 0.00 : 6752a6: 66 85 c0 test %ax,%ax 0.00 : 6752a9: 74 08 je 6752b3 : result |= BUF_REUSABLE; : else if (skip_recently_used) 0.00 : 6752ab: 45 31 e4 xor %r12d,%r12d 0.00 : 6752ae: 45 84 ed test %r13b,%r13b 0.00 : 6752b1: 75 2d jne 6752e0 : /* Caller told us not to write recently-used buffers */ : UnlockBufHdr(bufHdr); : return result; : } : : if (!(bufHdr->flags & BM_VALID) || !(bufHdr->flags & BM_DIRTY)) 0.00 : 6752b3: 0f b7 43 14 movzwl 0x14(%rbx),%eax 0.00 : 6752b7: a8 02 test $0x2,%al 0.00 : 6752b9: 74 08 je 6752c3 0.00 : 6752bb: 0f b7 43 14 movzwl 0x14(%rbx),%eax 0.00 : 6752bf: a8 01 test $0x1,%al 0.00 : 6752c1: 75 45 jne 675308 : { : /* It's clean, so nothing to do */ : UnlockBufHdr(bufHdr); 0.00 : 6752c3: c6 43 20 00 movb $0x0,0x20(%rbx) : : LWLockRelease(bufHdr->content_lock); : UnpinBuffer(bufHdr, true); : : return result | BUF_WRITTEN; : } 0.00 : 6752c7: 44 89 e0 mov %r12d,%eax 0.00 : 6752ca: 48 8b 5d e8 mov -0x18(%rbp),%rbx 0.00 : 6752ce: 4c 8b 65 f0 mov -0x10(%rbp),%r12 0.00 : 6752d2: 4c 8b 6d f8 mov -0x8(%rbp),%r13 0.00 : 6752d6: c9 leaveq 0.00 : 6752d7: c3 retq 0.00 : 6752d8: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 6752df: 00 : if (bufHdr->refcount == 0 && bufHdr->usage_count == 0) : result |= BUF_REUSABLE; : else if (skip_recently_used) : { : /* Caller told us not to write recently-used buffers */ : UnlockBufHdr(bufHdr); 0.00 : 6752e0: 45 31 e4 xor %r12d,%r12d 0.00 : 6752e3: c6 43 20 00 movb $0x0,0x20(%rbx) : : LWLockRelease(bufHdr->content_lock); : UnpinBuffer(bufHdr, true); : : return result | BUF_WRITTEN; : } 0.00 : 6752e7: eb de jmp 6752c7 0.00 : 6752e9: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : * as we mark pages dirty in access methods *before* logging changes with : * XLogInsert(): if someone marks the buffer dirty just after our check we : * don't worry because our checkpoint.redo points before log record for : * upcoming changes and so we are not required to write such dirty buffer. : */ : LockBufHdr(bufHdr); 0.00 : 6752f0: ba 4e 07 00 00 mov $0x74e,%edx 0.00 : 6752f5: be 53 9d 8a 00 mov $0x8a9d53,%esi 0.00 : 6752fa: e8 41 ad 01 00 callq 690040 0.00 : 6752ff: eb 94 jmp 675295 0.00 : 675301: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : : /* : * Pin it, share-lock it, write it. (FlushBuffer will do nothing if the : * buffer is clean by the time we've locked it.) : */ : PinBuffer_Locked(bufHdr); 0.00 : 675308: 48 89 df mov %rbx,%rdi : FlushBuffer(bufHdr, NULL); : : LWLockRelease(bufHdr->content_lock); : UnpinBuffer(bufHdr, true); : : return result | BUF_WRITTEN; 0.00 : 67530b: 41 83 cc 01 or $0x1,%r12d : : /* : * Pin it, share-lock it, write it. (FlushBuffer will do nothing if the : * buffer is clean by the time we've locked it.) : */ : PinBuffer_Locked(bufHdr); 0.00 : 67530f: e8 bc f8 ff ff callq 674bd0 : LWLockAcquire(bufHdr->content_lock, LW_SHARED); 0.00 : 675314: 48 8b 7b 38 mov 0x38(%rbx),%rdi 0.00 : 675318: be 01 00 00 00 mov $0x1,%esi 0.00 : 67531d: e8 ce a7 01 00 callq 68faf0 : : FlushBuffer(bufHdr, NULL); 0.00 : 675322: 31 f6 xor %esi,%esi 0.00 : 675324: 48 89 df mov %rbx,%rdi 0.00 : 675327: e8 24 fc ff ff callq 674f50 : : LWLockRelease(bufHdr->content_lock); 0.00 : 67532c: 48 8b 7b 38 mov 0x38(%rbx),%rdi 0.00 : 675330: e8 6b a0 01 00 callq 68f3a0 : UnpinBuffer(bufHdr, true); 0.00 : 675335: be 01 00 00 00 mov $0x1,%esi 0.00 : 67533a: 48 89 df mov %rbx,%rdi 0.00 : 67533d: e8 ee f9 ff ff callq 674d30 : : return result | BUF_WRITTEN; : } 0.00 : 675342: eb 83 jmp 6752c7 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 20.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:509 20.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:521 20.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:530 20.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:530 20.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:536 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000676570 : : * See buffer/README for details. : */ : Buffer : ReadBufferExtended(Relation reln, ForkNumber forkNum, BlockNumber blockNum, : ReadBufferMode mode, BufferAccessStrategy strategy) : { 0.00 : 676570: 55 push %rbp 0.00 : 676571: 48 89 e5 mov %rsp,%rbp 0.00 : 676574: 48 89 5d d8 mov %rbx,-0x28(%rbp) 0.00 : 676578: 4c 89 65 e0 mov %r12,-0x20(%rbp) 0.00 : 67657c: 48 89 fb mov %rdi,%rbx 0.00 : 67657f: 4c 89 6d e8 mov %r13,-0x18(%rbp) 0.00 : 676583: 4c 89 75 f0 mov %r14,-0x10(%rbp) 0.00 : 676587: 41 89 cd mov %ecx,%r13d 0.00 : 67658a: 4c 89 7d f8 mov %r15,-0x8(%rbp) 0.00 : 67658e: 48 83 ec 40 sub $0x40,%rsp : bool hit; : Buffer buf; : : /* Open it at the smgr level if not already done */ : RelationOpenSmgr(reln); 0.00 : 676592: 48 83 7f 10 00 cmpq $0x0,0x10(%rdi) : * See buffer/README for details. : */ : Buffer : ReadBufferExtended(Relation reln, ForkNumber forkNum, BlockNumber blockNum, : ReadBufferMode mode, BufferAccessStrategy strategy) : { 0.00 : 676597: 41 89 f7 mov %esi,%r15d /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:509 20.00 : 67659a: 41 89 d6 mov %edx,%r14d 0.00 : 67659d: 4d 89 c4 mov %r8,%r12 : bool hit; : Buffer buf; : : /* Open it at the smgr level if not already done */ : RelationOpenSmgr(reln); 0.00 : 6765a0: 0f 84 aa 00 00 00 je 676650 : /* : * Reject attempts to read non-local temporary relations; we would be : * likely to get wrong data since we have no visibility into the owning : * session's local buffers. : */ : if (RELATION_IS_OTHER_TEMP(reln)) 0.00 : 6765a6: 48 8b 43 30 mov 0x30(%rbx),%rax 0.00 : 6765aa: 0f b6 50 6e movzbl 0x6e(%rax),%edx /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:521 20.00 : 6765ae: 80 fa 74 cmp $0x74,%dl 0.00 : 6765b1: 74 6d je 676620 : : /* : * Read the buffer, and update pgstat counters to reflect a cache hit or : * miss. : */ : pgstat_count_buffer_read(reln); /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:530 20.00 : 6765b3: 48 8b 83 38 01 00 00 mov 0x138(%rbx),%rax 0.00 : 6765ba: 48 85 c0 test %rax,%rax 0.00 : 6765bd: 74 0d je 6765cc 0.00 : 6765bf: 48 83 40 60 01 addq $0x1,0x60(%rax) 20.00 : 6765c4: 48 8b 43 30 mov 0x30(%rbx),%rax 0.00 : 6765c8: 0f b6 50 6e movzbl 0x6e(%rax),%edx : buf = ReadBuffer_common(reln->rd_smgr, reln->rd_rel->relpersistence, 0.00 : 6765cc: 48 8b 7b 10 mov 0x10(%rbx),%rdi 0.00 : 6765d0: 48 8d 45 d7 lea -0x29(%rbp),%rax 0.00 : 6765d4: 0f be f2 movsbl %dl,%esi 0.00 : 6765d7: 4d 89 e1 mov %r12,%r9 0.00 : 6765da: 45 89 e8 mov %r13d,%r8d 0.00 : 6765dd: 44 89 f1 mov %r14d,%ecx 0.00 : 6765e0: 44 89 fa mov %r15d,%edx 0.00 : 6765e3: 48 89 04 24 mov %rax,(%rsp) 0.00 : 6765e7: e8 b4 f6 ff ff callq 675ca0 : forkNum, blockNum, mode, strategy, &hit); : if (hit) 0.00 : 6765ec: 80 7d d7 00 cmpb $0x0,-0x29(%rbp) 0.00 : 6765f0: 74 11 je 676603 : pgstat_count_buffer_hit(reln); 0.00 : 6765f2: 48 8b 93 38 01 00 00 mov 0x138(%rbx),%rdx 0.00 : 6765f9: 48 85 d2 test %rdx,%rdx 0.00 : 6765fc: 74 05 je 676603 0.00 : 6765fe: 48 83 42 68 01 addq $0x1,0x68(%rdx) : return buf; : } 0.00 : 676603: 48 8b 5d d8 mov -0x28(%rbp),%rbx /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:536 20.00 : 676607: 4c 8b 65 e0 mov -0x20(%rbp),%r12 0.00 : 67660b: 4c 8b 6d e8 mov -0x18(%rbp),%r13 0.00 : 67660f: 4c 8b 75 f0 mov -0x10(%rbp),%r14 0.00 : 676613: 4c 8b 7d f8 mov -0x8(%rbp),%r15 0.00 : 676617: c9 leaveq 0.00 : 676618: c3 retq 0.00 : 676619: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : /* : * Reject attempts to read non-local temporary relations; we would be : * likely to get wrong data since we have no visibility into the owning : * session's local buffers. : */ : if (RELATION_IS_OTHER_TEMP(reln)) 0.00 : 676620: 80 7b 20 00 cmpb $0x0,0x20(%rbx) 0.00 : 676624: 75 8d jne 6765b3 : ereport(ERROR, 0.00 : 676626: 45 31 c0 xor %r8d,%r8d 0.00 : 676629: b9 c0 a0 8a 00 mov $0x8aa0c0,%ecx 0.00 : 67662e: ba 0c 02 00 00 mov $0x20c,%edx 0.00 : 676633: be 53 9d 8a 00 mov $0x8a9d53,%esi 0.00 : 676638: bf 14 00 00 00 mov $0x14,%edi 0.00 : 67663d: e8 7e 44 10 00 callq 77aac0 0.00 : 676642: 84 c0 test %al,%al 0.00 : 676644: 75 29 jne 67666f 0.00 : 676646: e8 85 2e df ff callq 4694d0 0.00 : 67664b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : { : bool hit; : Buffer buf; : : /* Open it at the smgr level if not already done */ : RelationOpenSmgr(reln); 0.00 : 676650: 8b 57 1c mov 0x1c(%rdi),%edx 0.00 : 676653: 8b 73 08 mov 0x8(%rbx),%esi 0.00 : 676656: 48 8b 3f mov (%rdi),%rdi 0.00 : 676659: e8 d2 33 02 00 callq 699a30 0.00 : 67665e: 48 8d 7b 10 lea 0x10(%rbx),%rdi 0.00 : 676662: 48 89 c6 mov %rax,%rsi 0.00 : 676665: e8 96 2c 02 00 callq 699300 0.00 : 67666a: e9 37 ff ff ff jmpq 6765a6 : * Reject attempts to read non-local temporary relations; we would be : * likely to get wrong data since we have no visibility into the owning : * session's local buffers. : */ : if (RELATION_IS_OTHER_TEMP(reln)) : ereport(ERROR, 0.00 : 67666f: bf 08 9f 8a 00 mov $0x8a9f08,%edi 0.00 : 676674: 31 c0 xor %eax,%eax 0.00 : 676676: e8 25 62 10 00 callq 77c8a0 0.00 : 67667b: bf 40 04 00 00 mov $0x440,%edi 0.00 : 676680: 89 c3 mov %eax,%ebx 0.00 : 676682: e8 c9 66 10 00 callq 77cd50 0.00 : 676687: 89 de mov %ebx,%esi 0.00 : 676689: 89 c7 mov %eax,%edi 0.00 : 67668b: 31 c0 xor %eax,%eax 0.00 : 67668d: e8 4e 3f 10 00 callq 77a5e0 0.00 : 676692: eb b2 jmp 676646 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 20.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/predicate.c:3871 20.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/predicate.c:491 20.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/predicate.c:4064 20.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/predicate.c:4064 20.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/predicate.c:4064 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000694660 : : */ : void : CheckForSerializableConflictOut(bool visible, Relation relation, : HeapTuple tuple, Buffer buffer, : Snapshot snapshot) : { /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/predicate.c:3871 20.00 : 694660: 55 push %rbp 0.00 : 694661: 48 89 e5 mov %rsp,%rbp 0.00 : 694664: 4c 89 65 f0 mov %r12,-0x10(%rbp) 0.00 : 694668: 4c 89 6d f8 mov %r13,-0x8(%rbp) 0.00 : 69466c: 49 89 d4 mov %rdx,%r12 0.00 : 69466f: 48 89 5d e8 mov %rbx,-0x18(%rbp) 0.00 : 694673: 48 83 ec 30 sub $0x30,%rsp : */ : static inline bool : SerializationNeededForRead(Relation relation, Snapshot snapshot) : { : /* Nothing to do if this is not a serializable transaction */ : if (MySerializableXact == InvalidSerializableXact) /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/predicate.c:491 20.00 : 694677: 48 8b 15 42 a0 4e 00 mov 0x4ea042(%rip),%rdx # b7e6c0 : */ : void : CheckForSerializableConflictOut(bool visible, Relation relation, : HeapTuple tuple, Buffer buffer, : Snapshot snapshot) : { 0.00 : 69467e: 41 89 fd mov %edi,%r13d : */ : static inline bool : SerializationNeededForRead(Relation relation, Snapshot snapshot) : { : /* Nothing to do if this is not a serializable transaction */ : if (MySerializableXact == InvalidSerializableXact) 0.00 : 694681: 48 85 d2 test %rdx,%rdx 0.00 : 694684: 74 13 je 694699 : * This excludes things like CLUSTER and REINDEX. They use the wholesale : * functions TransferPredicateLocksToHeapRelation() and : * CheckTableForSerializableConflictIn() to participate serialization, but : * the scans involved don't need serialization. : */ : if (!IsMVCCSnapshot(snapshot)) 0.00 : 694686: 49 8b 00 mov (%r8),%rax 0.00 : 694689: 48 3d 50 57 7a 00 cmp $0x7a5750,%rax 0.00 : 69468f: 74 1f je 6946b0 0.00 : 694691: 48 3d 60 47 7a 00 cmp $0x7a4760,%rax 0.00 : 694697: 74 17 je 6946b0 : * Flag the conflict. But first, if this conflict creates a dangerous : * structure, ereport an error. : */ : FlagRWConflict(MySerializableXact, sxact); : LWLockRelease(SerializableXactHashLock); : } 0.00 : 694699: 48 8b 5d e8 mov -0x18(%rbp),%rbx /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/predicate.c:4064 20.00 : 69469d: 4c 8b 65 f0 mov -0x10(%rbp),%r12 0.00 : 6946a1: 4c 8b 6d f8 mov -0x8(%rbp),%r13 20.00 : 6946a5: c9 leaveq 20.00 : 6946a6: c3 retq 0.00 : 6946a7: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 6946ae: 00 00 : * : * A transaction is flagged as RO_SAFE if all concurrent R/W transactions : * commit without having conflicts out to an earlier snapshot, thus : * ensuring that no conflicts are possible for this transaction. : */ : if (SxactIsROSafe(MySerializableXact)) 0.00 : 6946b0: 8b 52 7c mov 0x7c(%rdx),%edx 0.00 : 6946b3: 84 d2 test %dl,%dl 0.00 : 6946b5: 78 69 js 694720 : * relations are exempt, as are materialized views. : */ : static inline bool : PredicateLockingNeededForRelation(Relation relation) : { : return !(relation->rd_id < FirstBootstrapObjectId || 0.00 : 6946b7: 81 7e 40 0f 27 00 00 cmpl $0x270f,0x40(%rsi) 0.00 : 6946be: 76 d9 jbe 694699 0.00 : 6946c0: 48 8b 46 30 mov 0x30(%rsi),%rax 0.00 : 6946c4: 80 78 6e 74 cmpb $0x74,0x6e(%rax) 0.00 : 6946c8: 74 cf je 694699 0.00 : 6946ca: 80 78 6f 6d cmpb $0x6d,0x6f(%rax) 0.00 : 6946ce: 66 90 xchg %ax,%ax 0.00 : 6946d0: 74 c7 je 694699 : : if (!SerializationNeededForRead(relation, snapshot)) : return; : : /* Check if someone else has already decided that we need to die */ : if (SxactIsDoomed(MySerializableXact)) 0.00 : 6946d2: 83 e2 08 and $0x8,%edx 0.00 : 6946d5: 0f 85 55 02 00 00 jne 694930 : * transaction, either to create it not visible to us, or to delete it : * while it is visible to us. The "visible" bool indicates whether the : * tuple is visible to us, while HeapTupleSatisfiesVacuum checks what else : * is going on with it. : */ : htsvResult = HeapTupleSatisfiesVacuum(tuple, TransactionXmin, buffer); 0.00 : 6946db: 8b 35 77 e0 4d 00 mov 0x4de077(%rip),%esi # b72758 0.00 : 6946e1: 89 ca mov %ecx,%edx 0.00 : 6946e3: 4c 89 e7 mov %r12,%rdi 0.00 : 6946e6: e8 35 04 11 00 callq 7a4b20 : switch (htsvResult) 0.00 : 6946eb: 83 f8 04 cmp $0x4,%eax : * transaction, either to create it not visible to us, or to delete it : * while it is visible to us. The "visible" bool indicates whether the : * tuple is visible to us, while HeapTupleSatisfiesVacuum checks what else : * is going on with it. : */ : htsvResult = HeapTupleSatisfiesVacuum(tuple, TransactionXmin, buffer); 0.00 : 6946ee: 89 c3 mov %eax,%ebx : switch (htsvResult) 0.00 : 6946f0: 76 3e jbe 694730 : /* : * The only way to get to this default clause is if a new value is : * added to the enum type without adding it to this switch : * statement. That's a bug, so elog. : */ : elog(ERROR, "unrecognized return value from HeapTupleSatisfiesVacuum: %u", htsvResult); 0.00 : 6946f2: ba e0 da 8a 00 mov $0x8adae0,%edx 0.00 : 6946f7: be 56 0f 00 00 mov $0xf56,%esi 0.00 : 6946fc: bf d3 d1 8a 00 mov $0x8ad1d3,%edi 0.00 : 694701: e8 1a 6d 0e 00 callq 77b420 0.00 : 694706: 89 da mov %ebx,%edx 0.00 : 694708: be a0 d8 8a 00 mov $0x8ad8a0,%esi 0.00 : 69470d: bf 14 00 00 00 mov $0x14,%edi 0.00 : 694712: 31 c0 xor %eax,%eax 0.00 : 694714: e8 17 6b 0e 00 callq 77b230 0.00 : 694719: e8 b2 4d dd ff callq 4694d0 0.00 : 69471e: 66 90 xchg %ax,%ax : * commit without having conflicts out to an earlier snapshot, thus : * ensuring that no conflicts are possible for this transaction. : */ : if (SxactIsROSafe(MySerializableXact)) : { : ReleasePredicateLocks(false); 0.00 : 694720: 31 ff xor %edi,%edi 0.00 : 694722: e8 c9 e1 ff ff callq 6928f0 0.00 : 694727: e9 6d ff ff ff jmpq 694699 0.00 : 69472c: 0f 1f 40 00 nopl 0x0(%rax) : * while it is visible to us. The "visible" bool indicates whether the : * tuple is visible to us, while HeapTupleSatisfiesVacuum checks what else : * is going on with it. : */ : htsvResult = HeapTupleSatisfiesVacuum(tuple, TransactionXmin, buffer); : switch (htsvResult) 0.00 : 694730: 89 c0 mov %eax,%eax 0.00 : 694732: ff 24 c5 c0 d9 8a 00 jmpq *0x8ad9c0(,%rax,8) 0.00 : 694739: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : if (visible) : return; : xid = HeapTupleHeaderGetXmin(tuple->t_data); : break; : case HEAPTUPLE_RECENTLY_DEAD: : if (!visible) 0.00 : 694740: 45 84 ed test %r13b,%r13b 0.00 : 694743: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 694748: 0f 84 4b ff ff ff je 694699 : return; : xid = HeapTupleHeaderGetUpdateXid(tuple->t_data); : break; : case HEAPTUPLE_DELETE_IN_PROGRESS: : xid = HeapTupleHeaderGetUpdateXid(tuple->t_data); 0.00 : 69474e: 49 8b 7c 24 10 mov 0x10(%r12),%rdi 0.00 : 694753: 0f b7 57 14 movzwl 0x14(%rdi),%edx 0.00 : 694757: 89 d0 mov %edx,%eax 0.00 : 694759: 25 00 18 00 00 and $0x1800,%eax 0.00 : 69475e: 3d 00 10 00 00 cmp $0x1000,%eax 0.00 : 694763: 0f 84 f7 00 00 00 je 694860 0.00 : 694769: 8b 5f 04 mov 0x4(%rdi),%ebx : : /* : * Find top level xid. Bail out if xid is too early to be a conflict, or : * if it's our own xid. : */ : if (TransactionIdEquals(xid, GetTopTransactionIdIfAny())) 0.00 : 69476c: e8 0f c4 e2 ff callq 4c0b80 0.00 : 694771: 39 d8 cmp %ebx,%eax 0.00 : 694773: 0f 84 20 ff ff ff je 694699 : return; : xid = SubTransGetTopmostTransaction(xid); 0.00 : 694779: 89 df mov %ebx,%edi 0.00 : 69477b: e8 70 21 e3 ff callq 4c68f0 : if (TransactionIdPrecedes(xid, TransactionXmin)) 0.00 : 694780: 8b 35 d2 df 4d 00 mov 0x4ddfd2(%rip),%esi # b72758 0.00 : 694786: 89 c7 mov %eax,%edi : * Find top level xid. Bail out if xid is too early to be a conflict, or : * if it's our own xid. : */ : if (TransactionIdEquals(xid, GetTopTransactionIdIfAny())) : return; : xid = SubTransGetTopmostTransaction(xid); 0.00 : 694788: 89 c3 mov %eax,%ebx : if (TransactionIdPrecedes(xid, TransactionXmin)) 0.00 : 69478a: e8 51 b8 e2 ff callq 4bffe0 0.00 : 69478f: 84 c0 test %al,%al 0.00 : 694791: 0f 85 02 ff ff ff jne 694699 : return; : if (TransactionIdEquals(xid, GetTopTransactionIdIfAny())) 0.00 : 694797: e8 e4 c3 e2 ff callq 4c0b80 0.00 : 69479c: 39 c3 cmp %eax,%ebx 0.00 : 69479e: 66 90 xchg %ax,%ax 0.00 : 6947a0: 0f 84 f3 fe ff ff je 694699 : : /* : * Find sxact or summarized info for the top level xid. : */ : sxidtag.xid = xid; : LWLockAcquire(SerializableXactHashLock, LW_EXCLUSIVE); 0.00 : 6947a6: 48 8b 3d 53 92 4e 00 mov 0x4e9253(%rip),%rdi # b7da00 0.00 : 6947ad: 31 f6 xor %esi,%esi : return; : : /* : * Find sxact or summarized info for the top level xid. : */ : sxidtag.xid = xid; 0.00 : 6947af: 89 5d d0 mov %ebx,-0x30(%rbp) : LWLockAcquire(SerializableXactHashLock, LW_EXCLUSIVE); 0.00 : 6947b2: 48 81 c7 80 03 00 00 add $0x380,%rdi 0.00 : 6947b9: e8 32 b3 ff ff callq 68faf0 : sxid = (SERIALIZABLEXID *) 0.00 : 6947be: 48 8b 3d 93 9f 4e 00 mov 0x4e9f93(%rip),%rdi # b7e758 0.00 : 6947c5: 48 8d 75 d0 lea -0x30(%rbp),%rsi 0.00 : 6947c9: 31 c9 xor %ecx,%ecx 0.00 : 6947cb: 31 d2 xor %edx,%edx 0.00 : 6947cd: e8 ce fe 0e 00 callq 7846a0 : hash_search(SerializableXidHash, &sxidtag, HASH_FIND, NULL); : if (!sxid) 0.00 : 6947d2: 48 85 c0 test %rax,%rax 0.00 : 6947d5: 0f 84 c5 01 00 00 je 6949a0 : : /* It's not serializable or otherwise not important. */ : LWLockRelease(SerializableXactHashLock); : return; : } : sxact = sxid->myXact; 0.00 : 6947db: 4c 8b 60 08 mov 0x8(%rax),%r12 : Assert(TransactionIdEquals(sxact->topXid, xid)); : if (sxact == MySerializableXact || SxactIsDoomed(sxact)) 0.00 : 6947df: 48 8b 0d da 9e 4e 00 mov 0x4e9eda(%rip),%rcx # b7e6c0 0.00 : 6947e6: 49 39 cc cmp %rcx,%r12 0.00 : 6947e9: 0f 84 b1 00 00 00 je 6948a0 0.00 : 6947ef: 41 8b 54 24 7c mov 0x7c(%r12),%edx 0.00 : 6947f4: f6 c2 08 test $0x8,%dl 0.00 : 6947f7: 0f 85 a3 00 00 00 jne 6948a0 : * We have a conflict out to a transaction which has a conflict out to a : * summarized transaction. That summarized transaction must have : * committed first, and we can't tell when it committed in relation to our : * snapshot acquisition, so something needs to be canceled. : */ : if (SxactHasSummaryConflictOut(sxact)) 0.00 : 6947fd: f6 c6 04 test $0x4,%dh 0.00 : 694800: 0f 84 b2 00 00 00 je 6948b8 : { : if (!SxactIsPrepared(sxact)) 0.00 : 694806: f6 c2 02 test $0x2,%dl 0.00 : 694809: 0f 85 39 03 00 00 jne 694b48 : { : sxact->flags |= SXACT_FLAG_DOOMED; 0.00 : 69480f: 83 ca 08 or $0x8,%edx 0.00 : 694812: 41 89 54 24 7c mov %edx,0x7c(%r12) : LWLockRelease(SerializableXactHashLock); 0.00 : 694817: 48 8b 3d e2 91 4e 00 mov 0x4e91e2(%rip),%rdi # b7da00 0.00 : 69481e: 48 81 c7 80 03 00 00 add $0x380,%rdi 0.00 : 694825: e8 76 ab ff ff callq 68f3a0 : * Flag the conflict. But first, if this conflict creates a dangerous : * structure, ereport an error. : */ : FlagRWConflict(MySerializableXact, sxact); : LWLockRelease(SerializableXactHashLock); : } 0.00 : 69482a: e9 6a fe ff ff jmpq 694699 0.00 : 69482f: 90 nop : */ : htsvResult = HeapTupleSatisfiesVacuum(tuple, TransactionXmin, buffer); : switch (htsvResult) : { : case HEAPTUPLE_LIVE: : if (visible) 0.00 : 694830: 45 84 ed test %r13b,%r13b 0.00 : 694833: 0f 85 60 fe ff ff jne 694699 : break; : case HEAPTUPLE_DELETE_IN_PROGRESS: : xid = HeapTupleHeaderGetUpdateXid(tuple->t_data); : break; : case HEAPTUPLE_INSERT_IN_PROGRESS: : xid = HeapTupleHeaderGetXmin(tuple->t_data); 0.00 : 694839: 49 8b 54 24 10 mov 0x10(%r12),%rdx : /* : * The only way to get to this default clause is if a new value is : * added to the enum type without adding it to this switch : * statement. That's a bug, so elog. : */ : elog(ERROR, "unrecognized return value from HeapTupleSatisfiesVacuum: %u", htsvResult); 0.00 : 69483e: bb 02 00 00 00 mov $0x2,%ebx : break; : case HEAPTUPLE_DELETE_IN_PROGRESS: : xid = HeapTupleHeaderGetUpdateXid(tuple->t_data); : break; : case HEAPTUPLE_INSERT_IN_PROGRESS: : xid = HeapTupleHeaderGetXmin(tuple->t_data); 0.00 : 694843: 0f b7 42 14 movzwl 0x14(%rdx),%eax 0.00 : 694847: 25 00 03 00 00 and $0x300,%eax 0.00 : 69484c: 3d 00 03 00 00 cmp $0x300,%eax 0.00 : 694851: 0f 84 15 ff ff ff je 69476c 0.00 : 694857: 8b 1a mov (%rdx),%ebx 0.00 : 694859: e9 0e ff ff ff jmpq 69476c 0.00 : 69485e: 66 90 xchg %ax,%ax : if (!visible) : return; : xid = HeapTupleHeaderGetUpdateXid(tuple->t_data); : break; : case HEAPTUPLE_DELETE_IN_PROGRESS: : xid = HeapTupleHeaderGetUpdateXid(tuple->t_data); 0.00 : 694860: 84 d2 test %dl,%dl 0.00 : 694862: 0f 88 01 ff ff ff js 694769 0.00 : 694868: e8 b3 28 e0 ff callq 497120 0.00 : 69486d: 89 c3 mov %eax,%ebx 0.00 : 69486f: 90 nop 0.00 : 694870: e9 f7 fe ff ff jmpq 69476c : /* This write was already in our snapshot; no conflict. */ : LWLockRelease(SerializableXactHashLock); : return; : } : : if (RWConflictExists(MySerializableXact, sxact)) 0.00 : 694875: 48 8b 3d 44 9e 4e 00 mov 0x4e9e44(%rip),%rdi # b7e6c0 0.00 : 69487c: 4c 89 e6 mov %r12,%rsi 0.00 : 69487f: e8 1c cc ff ff callq 6914a0 0.00 : 694884: 84 c0 test %al,%al 0.00 : 694886: 75 18 jne 6948a0 : : /* : * Flag the conflict. But first, if this conflict creates a dangerous : * structure, ereport an error. : */ : FlagRWConflict(MySerializableXact, sxact); 0.00 : 694888: 48 8b 3d 31 9e 4e 00 mov 0x4e9e31(%rip),%rdi # b7e6c0 0.00 : 69488f: 4c 89 e6 mov %r12,%rsi 0.00 : 694892: e8 79 c5 ff ff callq 690e10 0.00 : 694897: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 69489e: 00 00 : LWLockRelease(SerializableXactHashLock); 0.00 : 6948a0: 48 8b 3d 59 91 4e 00 mov 0x4e9159(%rip),%rdi # b7da00 0.00 : 6948a7: 48 81 c7 80 03 00 00 add $0x380,%rdi 0.00 : 6948ae: e8 ed aa ff ff callq 68f3a0 0.00 : 6948b3: e9 e1 fd ff ff jmpq 694699 : /* : * If this is a read-only transaction and the writing transaction has : * committed, and it doesn't have a rw-conflict to a transaction which : * committed before it, no conflict. : */ : if (SxactIsReadOnly(MySerializableXact) 0.00 : 6948b8: f6 41 7c 20 testb $0x20,0x7c(%rcx) 0.00 : 6948bc: 74 10 je 6948ce 0.00 : 6948be: 89 d0 mov %edx,%eax 0.00 : 6948c0: 25 01 04 00 00 and $0x401,%eax 0.00 : 6948c5: 83 e8 01 sub $0x1,%eax 0.00 : 6948c8: 0f 84 e9 01 00 00 je 694ab7 : uint32 i; : : Assert(TransactionIdIsValid(xid)); : Assert(!TransactionIdEquals(xid, GetTopTransactionIdIfAny())); : : snap = GetTransactionSnapshot(); 0.00 : 6948ce: e8 3d 2d 11 00 callq 7a7610 : : if (TransactionIdPrecedes(xid, snap->xmin)) 0.00 : 6948d3: 8b 70 08 mov 0x8(%rax),%esi 0.00 : 6948d6: 89 df mov %ebx,%edi : uint32 i; : : Assert(TransactionIdIsValid(xid)); : Assert(!TransactionIdEquals(xid, GetTopTransactionIdIfAny())); : : snap = GetTransactionSnapshot(); 0.00 : 6948d8: 49 89 c5 mov %rax,%r13 : : if (TransactionIdPrecedes(xid, snap->xmin)) 0.00 : 6948db: e8 00 b7 e2 ff callq 4bffe0 0.00 : 6948e0: 84 c0 test %al,%al 0.00 : 6948e2: 75 bc jne 6948a0 : return false; : : if (TransactionIdFollowsOrEquals(xid, snap->xmax)) 0.00 : 6948e4: 41 8b 75 0c mov 0xc(%r13),%esi 0.00 : 6948e8: 89 df mov %ebx,%edi 0.00 : 6948ea: e8 81 b7 e2 ff callq 4c0070 0.00 : 6948ef: 84 c0 test %al,%al 0.00 : 6948f1: 75 82 jne 694875 : return true; : : for (i = 0; i < snap->xcnt; i++) 0.00 : 6948f3: 41 8b 75 18 mov 0x18(%r13),%esi 0.00 : 6948f7: 85 f6 test %esi,%esi 0.00 : 6948f9: 74 a5 je 6948a0 : { : if (xid == snap->xip[i]) 0.00 : 6948fb: 49 8b 45 10 mov 0x10(%r13),%rax 0.00 : 6948ff: 31 d2 xor %edx,%edx 0.00 : 694901: 3b 18 cmp (%rax),%ebx 0.00 : 694903: 48 89 c1 mov %rax,%rcx 0.00 : 694906: 75 17 jne 69491f 0.00 : 694908: e9 68 ff ff ff jmpq 694875 0.00 : 69490d: 0f 1f 00 nopl (%rax) 0.00 : 694910: 8b 41 04 mov 0x4(%rcx),%eax 0.00 : 694913: 48 83 c1 04 add $0x4,%rcx 0.00 : 694917: 39 c3 cmp %eax,%ebx 0.00 : 694919: 0f 84 56 ff ff ff je 694875 : return false; : : if (TransactionIdFollowsOrEquals(xid, snap->xmax)) : return true; : : for (i = 0; i < snap->xcnt; i++) 0.00 : 69491f: 83 c2 01 add $0x1,%edx 0.00 : 694922: 39 f2 cmp %esi,%edx 0.00 : 694924: 72 ea jb 694910 0.00 : 694926: e9 75 ff ff ff jmpq 6948a0 0.00 : 69492b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : return; : : /* Check if someone else has already decided that we need to die */ : if (SxactIsDoomed(MySerializableXact)) : { : ereport(ERROR, 0.00 : 694930: 45 31 c0 xor %r8d,%r8d 0.00 : 694933: b9 e0 da 8a 00 mov $0x8adae0,%ecx 0.00 : 694938: ba 30 0f 00 00 mov $0xf30,%edx 0.00 : 69493d: be d3 d1 8a 00 mov $0x8ad1d3,%esi 0.00 : 694942: bf 14 00 00 00 mov $0x14,%edi 0.00 : 694947: e8 74 61 0e 00 callq 77aac0 0.00 : 69494c: 84 c0 test %al,%al 0.00 : 69494e: 0f 84 c5 fd ff ff je 694719 0.00 : 694954: bf c8 d2 8a 00 mov $0x8ad2c8,%edi 0.00 : 694959: 31 c0 xor %eax,%eax 0.00 : 69495b: e8 40 73 0e 00 callq 77bca0 0.00 : 694960: bf 48 d8 8a 00 mov $0x8ad848,%edi 0.00 : 694965: 41 89 c5 mov %eax,%r13d : return; : } : else : { : LWLockRelease(SerializableXactHashLock); : ereport(ERROR, 0.00 : 694968: 31 c0 xor %eax,%eax 0.00 : 69496a: e8 11 7a 0e 00 callq 77c380 0.00 : 69496f: 89 c3 mov %eax,%ebx 0.00 : 694971: bf 48 d3 8a 00 mov $0x8ad348,%edi 0.00 : 694976: 31 c0 xor %eax,%eax 0.00 : 694978: e8 23 7f 0e 00 callq 77c8a0 0.00 : 69497d: bf 04 00 00 01 mov $0x1000004,%edi 0.00 : 694982: 41 89 c4 mov %eax,%r12d 0.00 : 694985: e8 c6 83 0e 00 callq 77cd50 0.00 : 69498a: 44 89 e9 mov %r13d,%ecx 0.00 : 69498d: 89 c7 mov %eax,%edi 0.00 : 69498f: 89 da mov %ebx,%edx 0.00 : 694991: 44 89 e6 mov %r12d,%esi 0.00 : 694994: 31 c0 xor %eax,%eax 0.00 : 694996: e8 45 5c 0e 00 callq 77a5e0 0.00 : 69499b: e9 79 fd ff ff jmpq 694719 : SerCommitSeqNo val; : int slotno; : : Assert(TransactionIdIsValid(xid)); : : LWLockAcquire(OldSerXidLock, LW_SHARED); 0.00 : 6949a0: 48 8b 3d 59 90 4e 00 mov 0x4e9059(%rip),%rdi # b7da00 0.00 : 6949a7: be 01 00 00 00 mov $0x1,%esi 0.00 : 6949ac: 48 81 c7 e0 03 00 00 add $0x3e0,%rdi 0.00 : 6949b3: e8 38 b1 ff ff callq 68faf0 : headXid = oldSerXidControl->headXid; 0.00 : 6949b8: 48 8b 05 79 9d 4e 00 mov 0x4e9d79(%rip),%rax # b7e738 : tailXid = oldSerXidControl->tailXid; : LWLockRelease(OldSerXidLock); 0.00 : 6949bf: 48 8b 3d 3a 90 4e 00 mov 0x4e903a(%rip),%rdi # b7da00 : int slotno; : : Assert(TransactionIdIsValid(xid)); : : LWLockAcquire(OldSerXidLock, LW_SHARED); : headXid = oldSerXidControl->headXid; 0.00 : 6949c6: 44 8b 60 04 mov 0x4(%rax),%r12d : tailXid = oldSerXidControl->tailXid; : LWLockRelease(OldSerXidLock); 0.00 : 6949ca: 48 81 c7 e0 03 00 00 add $0x3e0,%rdi : : Assert(TransactionIdIsValid(xid)); : : LWLockAcquire(OldSerXidLock, LW_SHARED); : headXid = oldSerXidControl->headXid; : tailXid = oldSerXidControl->tailXid; 0.00 : 6949d1: 44 8b 68 08 mov 0x8(%rax),%r13d : LWLockRelease(OldSerXidLock); 0.00 : 6949d5: e8 c6 a9 ff ff callq 68f3a0 : : if (!TransactionIdIsValid(headXid)) 0.00 : 6949da: 45 85 e4 test %r12d,%r12d 0.00 : 6949dd: 0f 84 bd fe ff ff je 6948a0 : return 0; : : Assert(TransactionIdIsValid(tailXid)); : : if (TransactionIdPrecedes(xid, tailXid) 0.00 : 6949e3: 44 89 ee mov %r13d,%esi 0.00 : 6949e6: 89 df mov %ebx,%edi 0.00 : 6949e8: e8 f3 b5 e2 ff callq 4bffe0 0.00 : 6949ed: 84 c0 test %al,%al 0.00 : 6949ef: 0f 85 ab fe ff ff jne 6948a0 0.00 : 6949f5: 44 89 e6 mov %r12d,%esi 0.00 : 6949f8: 89 df mov %ebx,%edi 0.00 : 6949fa: e8 41 b6 e2 ff callq 4c0040 0.00 : 6949ff: 84 c0 test %al,%al 0.00 : 694a01: 0f 85 99 fe ff ff jne 6948a0 : : /* : * The following function must be called without holding OldSerXidLock, : * but will return with that lock held, which must then be released. : */ : slotno = SimpleLruReadPage_ReadOnly(OldSerXidSlruCtl, 0.00 : 694a07: 89 de mov %ebx,%esi 0.00 : 694a09: 89 da mov %ebx,%edx 0.00 : 694a0b: bf e0 e6 b7 00 mov $0xb7e6e0,%edi 0.00 : 694a10: c1 ee 0a shr $0xa,%esi 0.00 : 694a13: 81 e6 ff ff 1f 00 and $0x1fffff,%esi 0.00 : 694a19: e8 02 1a e3 ff callq 4c6420 : OldSerXidPage(xid), xid); : val = OldSerXidValue(slotno, xid); 0.00 : 694a1e: 48 8b 15 bb 9c 4e 00 mov 0x4e9cbb(%rip),%rdx # b7e6e0 0.00 : 694a25: 48 98 cltq 0.00 : 694a27: 48 89 d9 mov %rbx,%rcx 0.00 : 694a2a: 81 e1 ff 03 00 00 and $0x3ff,%ecx : LWLockRelease(OldSerXidLock); 0.00 : 694a30: 48 8b 3d c9 8f 4e 00 mov 0x4e8fc9(%rip),%rdi # b7da00 : * The following function must be called without holding OldSerXidLock, : * but will return with that lock held, which must then be released. : */ : slotno = SimpleLruReadPage_ReadOnly(OldSerXidSlruCtl, : OldSerXidPage(xid), xid); : val = OldSerXidValue(slotno, xid); 0.00 : 694a37: 48 8b 52 10 mov 0x10(%rdx),%rdx : LWLockRelease(OldSerXidLock); 0.00 : 694a3b: 48 81 c7 e0 03 00 00 add $0x3e0,%rdi : * The following function must be called without holding OldSerXidLock, : * but will return with that lock held, which must then be released. : */ : slotno = SimpleLruReadPage_ReadOnly(OldSerXidSlruCtl, : OldSerXidPage(xid), xid); : val = OldSerXidValue(slotno, xid); 0.00 : 694a42: 48 8b 04 c2 mov (%rdx,%rax,8),%rax 0.00 : 694a46: 4c 8b 24 c8 mov (%rax,%rcx,8),%r12 : LWLockRelease(OldSerXidLock); 0.00 : 694a4a: e8 51 a9 ff ff callq 68f3a0 : * got pushed out to SLRU storage for "old committed" transactions. : */ : SerCommitSeqNo conflictCommitSeqNo; : : conflictCommitSeqNo = OldSerXidGetMinConflictCommitSeqNo(xid); : if (conflictCommitSeqNo != 0) 0.00 : 694a4f: 4d 85 e4 test %r12,%r12 0.00 : 694a52: 0f 84 48 fe ff ff je 6948a0 : { : if (conflictCommitSeqNo != InvalidSerCommitSeqNo 0.00 : 694a58: 49 83 fc ff cmp $0xffffffffffffffff,%r12 0.00 : 694a5c: 74 77 je 694ad5 0.00 : 694a5e: 48 8b 05 5b 9c 4e 00 mov 0x4e9c5b(%rip),%rax # b7e6c0 0.00 : 694a65: f6 40 7c 20 testb $0x20,0x7c(%rax) 0.00 : 694a69: 74 06 je 694a71 0.00 : 694a6b: 4c 39 60 18 cmp %r12,0x18(%rax) 0.00 : 694a6f: 72 6b jb 694adc : && (!SxactIsReadOnly(MySerializableXact) : || conflictCommitSeqNo : <= MySerializableXact->SeqNo.lastCommitBeforeSnapshot)) : ereport(ERROR, 0.00 : 694a71: 45 31 c0 xor %r8d,%r8d 0.00 : 694a74: b9 e0 da 8a 00 mov $0x8adae0,%ecx 0.00 : 694a79: ba 89 0f 00 00 mov $0xf89,%edx 0.00 : 694a7e: be d3 d1 8a 00 mov $0x8ad1d3,%esi 0.00 : 694a83: bf 14 00 00 00 mov $0x14,%edi 0.00 : 694a88: e8 33 60 0e 00 callq 77aac0 0.00 : 694a8d: 84 c0 test %al,%al 0.00 : 694a8f: 0f 84 84 fc ff ff je 694719 0.00 : 694a95: bf c8 d2 8a 00 mov $0x8ad2c8,%edi 0.00 : 694a9a: 31 c0 xor %eax,%eax 0.00 : 694a9c: e8 ff 71 0e 00 callq 77bca0 0.00 : 694aa1: 89 de mov %ebx,%esi 0.00 : 694aa3: 41 89 c5 mov %eax,%r13d 0.00 : 694aa6: bf e0 d8 8a 00 mov $0x8ad8e0,%edi 0.00 : 694aab: 31 c0 xor %eax,%eax 0.00 : 694aad: e8 ce 78 0e 00 callq 77c380 0.00 : 694ab2: e9 b8 fe ff ff jmpq 69496f : /* : * If this is a read-only transaction and the writing transaction has : * committed, and it doesn't have a rw-conflict to a transaction which : * committed before it, no conflict. : */ : if (SxactIsReadOnly(MySerializableXact) 0.00 : 694ab7: 83 e2 10 and $0x10,%edx 0.00 : 694aba: 0f 84 e0 fd ff ff je 6948a0 0.00 : 694ac0: 49 8b 44 24 18 mov 0x18(%r12),%rax 0.00 : 694ac5: 48 39 41 18 cmp %rax,0x18(%rcx) 0.00 : 694ac9: 0f 83 ff fd ff ff jae 6948ce 0.00 : 694acf: 90 nop 0.00 : 694ad0: e9 cb fd ff ff jmpq 6948a0 0.00 : 694ad5: 48 8b 05 e4 9b 4e 00 mov 0x4e9be4(%rip),%rax # b7e6c0 : (errcode(ERRCODE_T_R_SERIALIZATION_FAILURE), : errmsg("could not serialize access due to read/write dependencies among transactions"), : errdetail_internal("Reason code: Canceled on conflict out to old pivot %u.", xid), : errhint("The transaction might succeed if retried."))); : : if (SxactHasSummaryConflictIn(MySerializableXact) 0.00 : 694adc: f6 40 7d 02 testb $0x2,0x7d(%rax) 0.00 : 694ae0: 75 0d jne 694aef 0.00 : 694ae2: 48 8d 78 30 lea 0x30(%rax),%rdi 0.00 : 694ae6: e8 25 ea fe ff callq 683510 0.00 : 694aeb: 84 c0 test %al,%al 0.00 : 694aed: 75 46 jne 694b35 : || !SHMQueueEmpty(&MySerializableXact->inConflicts)) : ereport(ERROR, 0.00 : 694aef: 45 31 c0 xor %r8d,%r8d 0.00 : 694af2: b9 e0 da 8a 00 mov $0x8adae0,%ecx 0.00 : 694af7: ba 91 0f 00 00 mov $0xf91,%edx 0.00 : 694afc: be d3 d1 8a 00 mov $0x8ad1d3,%esi 0.00 : 694b01: bf 14 00 00 00 mov $0x14,%edi 0.00 : 694b06: e8 b5 5f 0e 00 callq 77aac0 0.00 : 694b0b: 84 c0 test %al,%al 0.00 : 694b0d: 0f 84 06 fc ff ff je 694719 0.00 : 694b13: bf c8 d2 8a 00 mov $0x8ad2c8,%edi 0.00 : 694b18: 31 c0 xor %eax,%eax 0.00 : 694b1a: e8 81 71 0e 00 callq 77bca0 0.00 : 694b1f: 89 de mov %ebx,%esi 0.00 : 694b21: 41 89 c5 mov %eax,%r13d 0.00 : 694b24: bf 18 d9 8a 00 mov $0x8ad918,%edi 0.00 : 694b29: 31 c0 xor %eax,%eax 0.00 : 694b2b: e8 50 78 0e 00 callq 77c380 0.00 : 694b30: e9 3a fe ff ff jmpq 69496f : (errcode(ERRCODE_T_R_SERIALIZATION_FAILURE), : errmsg("could not serialize access due to read/write dependencies among transactions"), : errdetail_internal("Reason code: Canceled on identification as a pivot, with conflict out to old committed transaction %u.", xid), : errhint("The transaction might succeed if retried."))); : : MySerializableXact->flags |= SXACT_FLAG_SUMMARY_CONFLICT_OUT; 0.00 : 694b35: 48 8b 05 84 9b 4e 00 mov 0x4e9b84(%rip),%rax # b7e6c0 0.00 : 694b3c: 81 48 7c 00 04 00 00 orl $0x400,0x7c(%rax) 0.00 : 694b43: e9 58 fd ff ff jmpq 6948a0 : LWLockRelease(SerializableXactHashLock); : return; : } : else : { : LWLockRelease(SerializableXactHashLock); 0.00 : 694b48: 48 8b 3d b1 8e 4e 00 mov 0x4e8eb1(%rip),%rdi # b7da00 0.00 : 694b4f: 48 81 c7 80 03 00 00 add $0x380,%rdi 0.00 : 694b56: e8 45 a8 ff ff callq 68f3a0 : ereport(ERROR, 0.00 : 694b5b: 45 31 c0 xor %r8d,%r8d 0.00 : 694b5e: b9 e0 da 8a 00 mov $0x8adae0,%ecx 0.00 : 694b63: ba b8 0f 00 00 mov $0xfb8,%edx 0.00 : 694b68: be d3 d1 8a 00 mov $0x8ad1d3,%esi 0.00 : 694b6d: bf 14 00 00 00 mov $0x14,%edi 0.00 : 694b72: e8 49 5f 0e 00 callq 77aac0 0.00 : 694b77: 84 c0 test %al,%al 0.00 : 694b79: 0f 84 9a fb ff ff je 694719 0.00 : 694b7f: bf c8 d2 8a 00 mov $0x8ad2c8,%edi 0.00 : 694b84: 31 c0 xor %eax,%eax 0.00 : 694b86: e8 15 71 0e 00 callq 77bca0 0.00 : 694b8b: bf 80 d9 8a 00 mov $0x8ad980,%edi 0.00 : 694b90: 41 89 c5 mov %eax,%r13d 0.00 : 694b93: e9 d0 fd ff ff jmpq 694968 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 40.00 /home/Computational/mark/src/postgres-andres/src/backend/tcop/postgres.c:3089 40.00 /home/Computational/mark/src/postgres-andres/src/backend/tcop/postgres.c:3122 20.00 /home/Computational/mark/src/postgres-andres/src/backend/tcop/postgres.c:3073 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 000000000069b9e0 : : * overflow as an unrecoverable SIGSEGV, so we want to error out ourselves : * before hitting the hardware limit. : */ : void : check_stack_depth(void) : { 0.00 : 69b9e0: 55 push %rbp 0.00 : 69b9e1: 48 89 e5 mov %rsp,%rbp 0.00 : 69b9e4: 48 89 5d f0 mov %rbx,-0x10(%rbp) 0.00 : 69b9e8: 4c 89 65 f8 mov %r12,-0x8(%rbp) 0.00 : 69b9ec: 48 83 ec 20 sub $0x20,%rsp : long stack_depth; : : /* : * Compute distance from reference point to my local variables : */ : stack_depth = (long) (stack_base_ptr - &stack_top_loc); 0.00 : 69b9f0: 48 8b 0d f9 2d 4e 00 mov 0x4e2df9(%rip),%rcx # b7e7f0 0.00 : 69b9f7: 48 8d 45 ef lea -0x11(%rbp),%rax /home/Computational/mark/src/postgres-andres/src/backend/tcop/postgres.c:3073 20.00 : 69b9fb: 48 89 ca mov %rcx,%rdx 0.00 : 69b9fe: 48 29 c2 sub %rax,%rdx 0.00 : 69ba01: 48 89 d0 mov %rdx,%rax : * The test on stack_base_ptr prevents us from erroring out if called : * during process setup or in a non-backend process. Logically it should : * be done first, but putting it here avoids wasting cycles during normal : * cases. : */ : if (stack_depth > max_stack_depth_bytes && 0.00 : 69ba04: 48 c1 fa 3f sar $0x3f,%rdx 0.00 : 69ba08: 48 31 d0 xor %rdx,%rax 0.00 : 69ba0b: 48 29 d0 sub %rdx,%rax 0.00 : 69ba0e: 48 39 05 a3 cd 4c 00 cmp %rax,0x4ccda3(%rip) # b687b8 /home/Computational/mark/src/postgres-andres/src/backend/tcop/postgres.c:3089 40.00 : 69ba15: 7d 05 jge 69ba1c 0.00 : 69ba17: 48 85 c9 test %rcx,%rcx 0.00 : 69ba1a: 75 0a jne 69ba26 : errhint("Increase the configuration parameter \"max_stack_depth\" (currently %dkB), " : "after ensuring the platform's stack depth limit is adequate.", : max_stack_depth))); : } : #endif /* IA64 */ : } 0.00 : 69ba1c: 48 8b 5d f0 mov -0x10(%rbp),%rbx 0.00 : 69ba20: 4c 8b 65 f8 mov -0x8(%rbp),%r12 0.00 : 69ba24: c9 leaveq /home/Computational/mark/src/postgres-andres/src/backend/tcop/postgres.c:3122 40.00 : 69ba25: c3 retq : * cases. : */ : if (stack_depth > max_stack_depth_bytes && : stack_base_ptr != NULL) : { : ereport(ERROR, 0.00 : 69ba26: 45 31 c0 xor %r8d,%r8d 0.00 : 69ba29: b9 e0 00 8b 00 mov $0x8b00e0,%ecx 0.00 : 69ba2e: ba 19 0c 00 00 mov $0xc19,%edx 0.00 : 69ba33: be d0 e8 8a 00 mov $0x8ae8d0,%esi 0.00 : 69ba38: bf 14 00 00 00 mov $0x14,%edi 0.00 : 69ba3d: e8 7e f0 0d 00 callq 77aac0 0.00 : 69ba42: 84 c0 test %al,%al 0.00 : 69ba44: 75 05 jne 69ba4b 0.00 : 69ba46: e8 85 da dc ff callq 4694d0 0.00 : 69ba4b: 8b 35 5b cd 4c 00 mov 0x4ccd5b(%rip),%esi # b687ac 0.00 : 69ba51: bf 60 f0 8a 00 mov $0x8af060,%edi 0.00 : 69ba56: 31 c0 xor %eax,%eax 0.00 : 69ba58: e8 43 02 0e 00 callq 77bca0 0.00 : 69ba5d: bf 00 ea 8a 00 mov $0x8aea00,%edi 0.00 : 69ba62: 41 89 c4 mov %eax,%r12d 0.00 : 69ba65: 31 c0 xor %eax,%eax 0.00 : 69ba67: e8 34 0e 0e 00 callq 77c8a0 0.00 : 69ba6c: bf 05 01 00 01 mov $0x1000105,%edi 0.00 : 69ba71: 89 c3 mov %eax,%ebx 0.00 : 69ba73: e8 d8 12 0e 00 callq 77cd50 0.00 : 69ba78: 44 89 e2 mov %r12d,%edx 0.00 : 69ba7b: 89 c7 mov %eax,%edi 0.00 : 69ba7d: 89 de mov %ebx,%esi 0.00 : 69ba7f: 31 c0 xor %eax,%eax 0.00 : 69ba81: e8 5a eb 0d 00 callq 77a5e0 0.00 : 69ba86: eb be jmp 69ba46 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 40.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/mmgr/mcxt.c:147 40.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/mmgr/mcxt.c:158 20.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/mmgr/mcxt.c:143 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000007989b0 : : * The type-specific reset routine handles the context itself, but we : * have to do the recursion for the children. : */ : void : MemoryContextReset(MemoryContext context) : { 0.00 : 7989b0: 55 push %rbp 0.00 : 7989b1: 48 89 e5 mov %rsp,%rbp 0.00 : 7989b4: 53 push %rbx /home/Computational/mark/src/postgres-andres/src/backend/utils/mmgr/mcxt.c:143 20.00 : 7989b5: 48 89 fb mov %rdi,%rbx 0.00 : 7989b8: 48 83 ec 08 sub $0x8,%rsp : AssertArg(MemoryContextIsValid(context)); : : /* save a function call in common case where there are no children */ : if (context->firstchild != NULL) 0.00 : 7989bc: 48 83 7f 18 00 cmpq $0x0,0x18(%rdi) /home/Computational/mark/src/postgres-andres/src/backend/utils/mmgr/mcxt.c:147 40.00 : 7989c1: 74 05 je 7989c8 : MemoryContextResetChildren(context); 0.00 : 7989c3: e8 b8 ff ff ff callq 798980 : : /* Nothing to do if no pallocs since startup or last reset */ : if (!context->isReset) 0.00 : 7989c8: 80 7b 30 00 cmpb $0x0,0x30(%rbx) 0.00 : 7989cc: 75 0e jne 7989dc : { : (*context->methods->reset) (context); 0.00 : 7989ce: 48 8b 43 08 mov 0x8(%rbx),%rax 0.00 : 7989d2: 48 89 df mov %rbx,%rdi 0.00 : 7989d5: ff 50 20 callq *0x20(%rax) : context->isReset = true; 0.00 : 7989d8: c6 43 30 01 movb $0x1,0x30(%rbx) : VALGRIND_DESTROY_MEMPOOL(context); : VALGRIND_CREATE_MEMPOOL(context, 0, false); : } : } 0.00 : 7989dc: 48 83 c4 08 add $0x8,%rsp 0.00 : 7989e0: 5b pop %rbx /home/Computational/mark/src/postgres-andres/src/backend/utils/mmgr/mcxt.c:158 40.00 : 7989e1: c9 leaveq Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 100.00 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtpage.c:503 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000004a8ad0 <_bt_checkpage>: : /* : * _bt_checkpage() -- Verify that a freshly-read page looks sane. : */ : void : _bt_checkpage(Relation rel, Buffer buf) : { 0.00 : 4a8ad0: 55 push %rbp 0.00 : 4a8ad1: 48 89 e5 mov %rsp,%rbp 0.00 : 4a8ad4: 48 89 5d e8 mov %rbx,-0x18(%rbp) 0.00 : 4a8ad8: 4c 89 6d f8 mov %r13,-0x8(%rbp) 0.00 : 4a8adc: 89 f3 mov %esi,%ebx 0.00 : 4a8ade: 4c 89 65 f0 mov %r12,-0x10(%rbp) 0.00 : 4a8ae2: 48 83 ec 20 sub $0x20,%rsp : Page page = BufferGetPage(buf); 0.00 : 4a8ae6: 85 f6 test %esi,%esi : /* : * _bt_checkpage() -- Verify that a freshly-read page looks sane. : */ : void : _bt_checkpage(Relation rel, Buffer buf) : { 0.00 : 4a8ae8: 49 89 fd mov %rdi,%r13 : Page page = BufferGetPage(buf); 0.00 : 4a8aeb: 78 3b js 4a8b28 <_bt_checkpage+0x58> 0.00 : 4a8aed: 8d 43 ff lea -0x1(%rbx),%eax 0.00 : 4a8af0: 48 63 d0 movslq %eax,%rdx 0.00 : 4a8af3: 48 c1 e2 0d shl $0xd,%rdx 0.00 : 4a8af7: 48 03 15 fa 6f 71 00 add 0x716ffa(%rip),%rdx # bbfaf8 : * ReadBuffer verifies that every newly-read page passes : * PageHeaderIsValid, which means it either contains a reasonably sane : * page header or is all-zero. We have to defend against the all-zero : * case, however. : */ : if (PageIsNew(page)) 0.00 : 4a8afe: 66 83 7a 0e 00 cmpw $0x0,0xe(%rdx) /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtpage.c:503 100.00 : 4a8b03: 74 36 je 4a8b3b <_bt_checkpage+0x6b> : errhint("Please REINDEX it."))); : : /* : * Additionally check that the special area looks sane. : */ : if (PageGetSpecialSize(page) != MAXALIGN(sizeof(BTPageOpaqueData))) 0.00 : 4a8b05: 0f b7 42 12 movzwl 0x12(%rdx),%eax 0.00 : 4a8b09: 30 c0 xor %al,%al 0.00 : 4a8b0b: 66 2b 42 10 sub 0x10(%rdx),%ax 0.00 : 4a8b0f: 66 83 f8 10 cmp $0x10,%ax 0.00 : 4a8b13: 75 4b jne 4a8b60 <_bt_checkpage+0x90> : (errcode(ERRCODE_INDEX_CORRUPTED), : errmsg("index \"%s\" contains corrupted page at block %u", : RelationGetRelationName(rel), : BufferGetBlockNumber(buf)), : errhint("Please REINDEX it."))); : } 0.00 : 4a8b15: 48 8b 5d e8 mov -0x18(%rbp),%rbx 0.00 : 4a8b19: 4c 8b 65 f0 mov -0x10(%rbp),%r12 0.00 : 4a8b1d: 4c 8b 6d f8 mov -0x8(%rbp),%r13 0.00 : 4a8b21: c9 leaveq 0.00 : 4a8b22: c3 retq 0.00 : 4a8b23: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : * _bt_checkpage() -- Verify that a freshly-read page looks sane. : */ : void : _bt_checkpage(Relation rel, Buffer buf) : { : Page page = BufferGetPage(buf); 0.00 : 4a8b28: 89 f0 mov %esi,%eax 0.00 : 4a8b2a: 48 8b 15 e7 45 6d 00 mov 0x6d45e7(%rip),%rdx # b7d118 0.00 : 4a8b31: f7 d0 not %eax 0.00 : 4a8b33: 48 98 cltq 0.00 : 4a8b35: 48 8b 14 c2 mov (%rdx,%rax,8),%rdx 0.00 : 4a8b39: eb c3 jmp 4a8afe <_bt_checkpage+0x2e> : * PageHeaderIsValid, which means it either contains a reasonably sane : * page header or is all-zero. We have to defend against the all-zero : * case, however. : */ : if (PageIsNew(page)) : ereport(ERROR, 0.00 : 4a8b3b: 45 31 c0 xor %r8d,%r8d 0.00 : 4a8b3e: b9 04 47 7b 00 mov $0x7b4704,%ecx 0.00 : 4a8b43: ba fd 01 00 00 mov $0x1fd,%edx 0.00 : 4a8b48: be 22 43 7b 00 mov $0x7b4322,%esi 0.00 : 4a8b4d: bf 14 00 00 00 mov $0x14,%edi 0.00 : 4a8b52: e8 69 1f 2d 00 callq 77aac0 0.00 : 4a8b57: 84 c0 test %al,%al 0.00 : 4a8b59: 75 69 jne 4a8bc4 <_bt_checkpage+0xf4> : : /* : * Additionally check that the special area looks sane. : */ : if (PageGetSpecialSize(page) != MAXALIGN(sizeof(BTPageOpaqueData))) : ereport(ERROR, 0.00 : 4a8b5b: e8 70 09 fc ff callq 4694d0 0.00 : 4a8b60: 45 31 c0 xor %r8d,%r8d 0.00 : 4a8b63: b9 04 47 7b 00 mov $0x7b4704,%ecx 0.00 : 4a8b68: ba 08 02 00 00 mov $0x208,%edx 0.00 : 4a8b6d: be 22 43 7b 00 mov $0x7b4322,%esi 0.00 : 4a8b72: bf 14 00 00 00 mov $0x14,%edi 0.00 : 4a8b77: e8 44 1f 2d 00 callq 77aac0 0.00 : 4a8b7c: 84 c0 test %al,%al 0.00 : 4a8b7e: 74 db je 4a8b5b <_bt_checkpage+0x8b> 0.00 : 4a8b80: bf 12 15 7b 00 mov $0x7b1512,%edi 0.00 : 4a8b85: 31 c0 xor %eax,%eax 0.00 : 4a8b87: e8 14 31 2d 00 callq 77bca0 0.00 : 4a8b8c: 89 df mov %ebx,%edi 0.00 : 4a8b8e: 41 89 c4 mov %eax,%r12d 0.00 : 4a8b91: e8 9a b4 1c 00 callq 674030 0.00 : 4a8b96: 49 8b 75 30 mov 0x30(%r13),%rsi 0.00 : 4a8b9a: 89 c2 mov %eax,%edx 0.00 : 4a8b9c: bf 38 17 7b 00 mov $0x7b1738,%edi 0.00 : 4a8ba1: 31 c0 xor %eax,%eax 0.00 : 4a8ba3: e8 f8 3c 2d 00 callq 77c8a0 0.00 : 4a8ba8: bf 28 0a 00 02 mov $0x2000a28,%edi 0.00 : 4a8bad: 89 c3 mov %eax,%ebx 0.00 : 4a8baf: e8 9c 41 2d 00 callq 77cd50 0.00 : 4a8bb4: 44 89 e2 mov %r12d,%edx 0.00 : 4a8bb7: 89 c7 mov %eax,%edi 0.00 : 4a8bb9: 89 de mov %ebx,%esi 0.00 : 4a8bbb: 31 c0 xor %eax,%eax 0.00 : 4a8bbd: e8 1e 1a 2d 00 callq 77a5e0 0.00 : 4a8bc2: eb 97 jmp 4a8b5b <_bt_checkpage+0x8b> : * PageHeaderIsValid, which means it either contains a reasonably sane : * page header or is all-zero. We have to defend against the all-zero : * case, however. : */ : if (PageIsNew(page)) : ereport(ERROR, 0.00 : 4a8bc4: bf 12 15 7b 00 mov $0x7b1512,%edi 0.00 : 4a8bc9: 31 c0 xor %eax,%eax 0.00 : 4a8bcb: e8 d0 30 2d 00 callq 77bca0 0.00 : 4a8bd0: 89 df mov %ebx,%edi 0.00 : 4a8bd2: 41 89 c4 mov %eax,%r12d 0.00 : 4a8bd5: e8 56 b4 1c 00 callq 674030 0.00 : 4a8bda: 49 8b 75 30 mov 0x30(%r13),%rsi 0.00 : 4a8bde: 89 c2 mov %eax,%edx 0.00 : 4a8be0: bf 00 17 7b 00 mov $0x7b1700,%edi 0.00 : 4a8be5: eb ba jmp 4a8ba1 <_bt_checkpage+0xd1> Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 25.00 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:1116 25.00 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:1116 25.00 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:1202 25.00 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:1204 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000004ac3e0 <_bt_readpage>: : * : * Returns true if any matching items found on the page, false if none. : */ : static bool : _bt_readpage(IndexScanDesc scan, ScanDirection dir, OffsetNumber offnum) : { 0.00 : 4ac3e0: 55 push %rbp 0.00 : 4ac3e1: 89 d1 mov %edx,%ecx 0.00 : 4ac3e3: 48 89 e5 mov %rsp,%rbp 0.00 : 4ac3e6: 41 57 push %r15 0.00 : 4ac3e8: 41 56 push %r14 0.00 : 4ac3ea: 41 55 push %r13 0.00 : 4ac3ec: 41 54 push %r12 0.00 : 4ac3ee: 53 push %rbx 0.00 : 4ac3ef: 48 83 ec 58 sub $0x58,%rsp 0.00 : 4ac3f3: 48 89 7d 98 mov %rdi,-0x68(%rbp) 0.00 : 4ac3f7: 89 75 94 mov %esi,-0x6c(%rbp) : BTScanOpaque so = (BTScanOpaque) scan->opaque; 0.00 : 4ac3fa: 4c 8b 67 38 mov 0x38(%rdi),%r12 : bool continuescan; : : /* we must have the buffer pinned and locked */ : Assert(BufferIsValid(so->currPos.buf)); : : page = BufferGetPage(so->currPos.buf); 0.00 : 4ac3fe: 41 8b 44 24 54 mov 0x54(%r12),%eax 0.00 : 4ac403: 85 c0 test %eax,%eax 0.00 : 4ac405: 0f 88 55 02 00 00 js 4ac660 <_bt_readpage+0x280> 0.00 : 4ac40b: 83 e8 01 sub $0x1,%eax 0.00 : 4ac40e: 4c 63 f8 movslq %eax,%r15 0.00 : 4ac411: 49 c1 e7 0d shl $0xd,%r15 0.00 : 4ac415: 4c 03 3d dc 36 71 00 add 0x7136dc(%rip),%r15 # bbfaf8 : opaque = (BTPageOpaque) PageGetSpecialPointer(page); : minoff = P_FIRSTDATAKEY(opaque); /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:1116 25.00 : 4ac41c: 41 0f b7 47 10 movzwl 0x10(%r15),%eax 0.00 : 4ac421: 41 8b 54 07 04 mov 0x4(%r15,%rax,1),%edx 25.00 : 4ac426: 83 fa 01 cmp $0x1,%edx 0.00 : 4ac429: 19 c0 sbb %eax,%eax 0.00 : 4ac42b: 83 c0 02 add $0x2,%eax 0.00 : 4ac42e: 66 89 45 a0 mov %ax,-0x60(%rbp) : maxoff = PageGetMaxOffsetNumber(page); 0.00 : 4ac432: 41 0f b7 47 0c movzwl 0xc(%r15),%eax 0.00 : 4ac437: 66 c7 45 b0 00 00 movw $0x0,-0x50(%rbp) 0.00 : 4ac43d: 66 83 f8 18 cmp $0x18,%ax 0.00 : 4ac441: 76 0f jbe 4ac452 <_bt_readpage+0x72> 0.00 : 4ac443: 0f b7 c0 movzwl %ax,%eax 0.00 : 4ac446: 48 83 e8 18 sub $0x18,%rax 0.00 : 4ac44a: 48 c1 e8 02 shr $0x2,%rax 0.00 : 4ac44e: 66 89 45 b0 mov %ax,-0x50(%rbp) : /* : * we must save the page's right-link while scanning it; this tells us : * where to step right to after we're done with these items. There is no : * corresponding need for the left-link, since splits always go right. : */ : so->currPos.nextPage = opaque->btpo_next; 0.00 : 4ac452: 41 89 54 24 58 mov %edx,0x58(%r12) : : /* initialize tuple workspace to empty */ : so->currPos.nextTupleOffset = 0; 0.00 : 4ac457: 41 c7 44 24 60 00 00 movl $0x0,0x60(%r12) 0.00 : 4ac45e: 00 00 : : if (ScanDirectionIsForward(dir)) 0.00 : 4ac460: 83 7d 94 01 cmpl $0x1,-0x6c(%rbp) 0.00 : 4ac464: 0f 84 06 01 00 00 je 4ac570 <_bt_readpage+0x190> : else : { : /* load items[] in descending order */ : itemIndex = MaxIndexTuplesPerPage; : : offnum = Min(offnum, maxoff); 0.00 : 4ac46a: 66 39 4d b0 cmp %cx,-0x50(%rbp) 0.00 : 4ac46e: 44 0f b7 6d b0 movzwl -0x50(%rbp),%r13d 0.00 : 4ac473: 48 8d 45 cf lea -0x31(%rbp),%rax : : while (offnum >= minoff) 0.00 : 4ac477: 41 be 98 01 00 00 mov $0x198,%r14d 0.00 : 4ac47d: 48 89 45 88 mov %rax,-0x78(%rbp) : else : { : /* load items[] in descending order */ : itemIndex = MaxIndexTuplesPerPage; : : offnum = Min(offnum, maxoff); 0.00 : 4ac481: 44 0f 47 e9 cmova %ecx,%r13d : : while (offnum >= minoff) 0.00 : 4ac485: 66 44 39 6d a0 cmp %r13w,-0x60(%rbp) 0.00 : 4ac48a: 76 1b jbe 4ac4a7 <_bt_readpage+0xc7> 0.00 : 4ac48c: e9 a2 00 00 00 jmpq 4ac533 <_bt_readpage+0x153> 0.00 : 4ac491: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : } : if (!continuescan) : { : /* there can't be any more matches, so stop */ : so->currPos.moreLeft = false; : break; 0.00 : 4ac498: 41 83 ed 01 sub $0x1,%r13d : /* load items[] in descending order */ : itemIndex = MaxIndexTuplesPerPage; : : offnum = Min(offnum, maxoff); : : while (offnum >= minoff) 0.00 : 4ac49c: 66 44 39 6d a0 cmp %r13w,-0x60(%rbp) 0.00 : 4ac4a1: 0f 87 8c 00 00 00 ja 4ac533 <_bt_readpage+0x153> : { : itup = _bt_checkkeys(scan, page, offnum, dir, &continuescan); 0.00 : 4ac4a7: 8b 4d 94 mov -0x6c(%rbp),%ecx 0.00 : 4ac4aa: 4c 8b 45 88 mov -0x78(%rbp),%r8 0.00 : 4ac4ae: 41 0f b7 d5 movzwl %r13w,%edx 0.00 : 4ac4b2: 48 8b 7d 98 mov -0x68(%rbp),%rdi 0.00 : 4ac4b6: 4c 89 fe mov %r15,%rsi 0.00 : 4ac4b9: e8 62 1f 00 00 callq 4ae420 <_bt_checkkeys> : if (itup != NULL) 0.00 : 4ac4be: 48 85 c0 test %rax,%rax : : offnum = Min(offnum, maxoff); : : while (offnum >= minoff) : { : itup = _bt_checkkeys(scan, page, offnum, dir, &continuescan); 0.00 : 4ac4c1: 48 89 c1 mov %rax,%rcx : if (itup != NULL) 0.00 : 4ac4c4: 74 5d je 4ac523 <_bt_readpage+0x143> : { : /* tuple passes all scan key conditions, so remember it */ : itemIndex--; 0.00 : 4ac4c6: 41 83 ee 01 sub $0x1,%r14d : /* Save an index item into so->currPos.items[itemIndex] */ : static void : _bt_saveitem(BTScanOpaque so, int itemIndex, : OffsetNumber offnum, IndexTuple itup) : { : BTScanPosItem *currItem = &so->currPos.items[itemIndex]; 0.00 : 4ac4ca: 49 63 c6 movslq %r14d,%rax : : currItem->heapTid = itup->t_tid; 0.00 : 4ac4cd: 48 8d 04 80 lea (%rax,%rax,4),%rax 0.00 : 4ac4d1: 49 8d 54 44 60 lea 0x60(%r12,%rax,2),%rdx 0.00 : 4ac4d6: 8b 01 mov (%rcx),%eax 0.00 : 4ac4d8: 89 42 10 mov %eax,0x10(%rdx) 0.00 : 4ac4db: 0f b7 41 04 movzwl 0x4(%rcx),%eax : currItem->indexOffset = offnum; 0.00 : 4ac4df: 66 44 89 6a 16 mov %r13w,0x16(%rdx) : _bt_saveitem(BTScanOpaque so, int itemIndex, : OffsetNumber offnum, IndexTuple itup) : { : BTScanPosItem *currItem = &so->currPos.items[itemIndex]; : : currItem->heapTid = itup->t_tid; 0.00 : 4ac4e4: 66 89 42 14 mov %ax,0x14(%rdx) : currItem->indexOffset = offnum; : if (so->currTuples) 0.00 : 4ac4e8: 49 83 7c 24 40 00 cmpq $0x0,0x40(%r12) 0.00 : 4ac4ee: 74 33 je 4ac523 <_bt_readpage+0x143> : { : Size itupsz = IndexTupleSize(itup); : : currItem->tupleOffset = so->currPos.nextTupleOffset; 0.00 : 4ac4f0: 41 8b 44 24 60 mov 0x60(%r12),%eax : : currItem->heapTid = itup->t_tid; : currItem->indexOffset = offnum; : if (so->currTuples) : { : Size itupsz = IndexTupleSize(itup); 0.00 : 4ac4f5: 0f b7 59 06 movzwl 0x6(%rcx),%ebx : : currItem->tupleOffset = so->currPos.nextTupleOffset; : memcpy(so->currTuples + so->currPos.nextTupleOffset, itup, itupsz); 0.00 : 4ac4f9: 48 89 ce mov %rcx,%rsi : currItem->indexOffset = offnum; : if (so->currTuples) : { : Size itupsz = IndexTupleSize(itup); : : currItem->tupleOffset = so->currPos.nextTupleOffset; 0.00 : 4ac4fc: 66 89 42 18 mov %ax,0x18(%rdx) : memcpy(so->currTuples + so->currPos.nextTupleOffset, itup, itupsz); 0.00 : 4ac500: 49 63 7c 24 60 movslq 0x60(%r12),%rdi 0.00 : 4ac505: 49 03 7c 24 40 add 0x40(%r12),%rdi : : currItem->heapTid = itup->t_tid; : currItem->indexOffset = offnum; : if (so->currTuples) : { : Size itupsz = IndexTupleSize(itup); 0.00 : 4ac50a: 81 e3 ff 1f 00 00 and $0x1fff,%ebx : : currItem->tupleOffset = so->currPos.nextTupleOffset; : memcpy(so->currTuples + so->currPos.nextTupleOffset, itup, itupsz); 0.00 : 4ac510: 48 89 da mov %rbx,%rdx : so->currPos.nextTupleOffset += MAXALIGN(itupsz); 0.00 : 4ac513: 83 c3 07 add $0x7,%ebx 0.00 : 4ac516: 83 e3 f8 and $0xfffffff8,%ebx : if (so->currTuples) : { : Size itupsz = IndexTupleSize(itup); : : currItem->tupleOffset = so->currPos.nextTupleOffset; : memcpy(so->currTuples + so->currPos.nextTupleOffset, itup, itupsz); 0.00 : 4ac519: e8 d2 d6 fb ff callq 469bf0 : so->currPos.nextTupleOffset += MAXALIGN(itupsz); 0.00 : 4ac51e: 41 01 5c 24 60 add %ebx,0x60(%r12) : { : /* tuple passes all scan key conditions, so remember it */ : itemIndex--; : _bt_saveitem(so, itemIndex, offnum, itup); : } : if (!continuescan) 0.00 : 4ac523: 80 7d cf 00 cmpb $0x0,-0x31(%rbp) 0.00 : 4ac527: 0f 85 6b ff ff ff jne 4ac498 <_bt_readpage+0xb8> : { : /* there can't be any more matches, so stop */ : so->currPos.moreLeft = false; 0.00 : 4ac52d: 41 c6 44 24 5c 00 movb $0x0,0x5c(%r12) : : offnum = OffsetNumberPrev(offnum); : } : : Assert(itemIndex >= 0); : so->currPos.firstItem = itemIndex; 0.00 : 4ac533: 45 89 74 24 64 mov %r14d,0x64(%r12) : so->currPos.lastItem = MaxIndexTuplesPerPage - 1; 0.00 : 4ac538: 41 c7 44 24 68 97 01 movl $0x197,0x68(%r12) 0.00 : 4ac53f: 00 00 : so->currPos.itemIndex = MaxIndexTuplesPerPage - 1; 0.00 : 4ac541: 41 c7 44 24 6c 97 01 movl $0x197,0x6c(%r12) 0.00 : 4ac548: 00 00 0.00 : 4ac54a: 41 8b 44 24 64 mov 0x64(%r12),%eax 0.00 : 4ac54f: 41 3b 44 24 68 cmp 0x68(%r12),%eax 0.00 : 4ac554: 0f 9e c0 setle %al : } : : return (so->currPos.firstItem <= so->currPos.lastItem); : } 0.00 : 4ac557: 48 83 c4 58 add $0x58,%rsp 0.00 : 4ac55b: 5b pop %rbx 0.00 : 4ac55c: 41 5c pop %r12 0.00 : 4ac55e: 41 5d pop %r13 0.00 : 4ac560: 41 5e pop %r14 0.00 : 4ac562: 41 5f pop %r15 0.00 : 4ac564: c9 leaveq 0.00 : 4ac565: c3 retq 0.00 : 4ac566: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 0.00 : 4ac56d: 00 00 00 : if (ScanDirectionIsForward(dir)) : { : /* load items[] in ascending order */ : itemIndex = 0; : : offnum = Max(offnum, minoff); 0.00 : 4ac570: 66 39 4d a0 cmp %cx,-0x60(%rbp) 0.00 : 4ac574: 44 0f b7 6d a0 movzwl -0x60(%rbp),%r13d 0.00 : 4ac579: 48 8d 45 cf lea -0x31(%rbp),%rax 0.00 : 4ac57d: 48 89 45 88 mov %rax,-0x78(%rbp) : : while (offnum <= maxoff) 0.00 : 4ac581: b8 ff ff ff ff mov $0xffffffff,%eax : if (ScanDirectionIsForward(dir)) : { : /* load items[] in ascending order */ : itemIndex = 0; : : offnum = Max(offnum, minoff); 0.00 : 4ac586: 44 0f 42 e9 cmovb %ecx,%r13d : : while (offnum <= maxoff) 0.00 : 4ac58a: 45 31 f6 xor %r14d,%r14d 0.00 : 4ac58d: 66 44 39 6d b0 cmp %r13w,-0x50(%rbp) 0.00 : 4ac592: 73 1b jae 4ac5af <_bt_readpage+0x1cf> 0.00 : 4ac594: e9 a8 00 00 00 jmpq 4ac641 <_bt_readpage+0x261> 0.00 : 4ac599: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : } : if (!continuescan) : { : /* there can't be any more matches, so stop */ : so->currPos.moreRight = false; : break; 0.00 : 4ac5a0: 41 83 c5 01 add $0x1,%r13d : /* load items[] in ascending order */ : itemIndex = 0; : : offnum = Max(offnum, minoff); : : while (offnum <= maxoff) 0.00 : 4ac5a4: 66 44 3b 6d b0 cmp -0x50(%rbp),%r13w 0.00 : 4ac5a9: 0f 87 c9 00 00 00 ja 4ac678 <_bt_readpage+0x298> : { : itup = _bt_checkkeys(scan, page, offnum, dir, &continuescan); 0.00 : 4ac5af: 4c 8b 45 88 mov -0x78(%rbp),%r8 0.00 : 4ac5b3: 48 8b 7d 98 mov -0x68(%rbp),%rdi 0.00 : 4ac5b7: b9 01 00 00 00 mov $0x1,%ecx 0.00 : 4ac5bc: 41 0f b7 d5 movzwl %r13w,%edx 0.00 : 4ac5c0: 4c 89 fe mov %r15,%rsi 0.00 : 4ac5c3: e8 58 1e 00 00 callq 4ae420 <_bt_checkkeys> : if (itup != NULL) 0.00 : 4ac5c8: 48 85 c0 test %rax,%rax : : offnum = Max(offnum, minoff); : : while (offnum <= maxoff) : { : itup = _bt_checkkeys(scan, page, offnum, dir, &continuescan); 0.00 : 4ac5cb: 48 89 c1 mov %rax,%rcx : if (itup != NULL) 0.00 : 4ac5ce: 74 5d je 4ac62d <_bt_readpage+0x24d> : /* Save an index item into so->currPos.items[itemIndex] */ : static void : _bt_saveitem(BTScanOpaque so, int itemIndex, : OffsetNumber offnum, IndexTuple itup) : { : BTScanPosItem *currItem = &so->currPos.items[itemIndex]; 0.00 : 4ac5d0: 49 63 c6 movslq %r14d,%rax : : currItem->heapTid = itup->t_tid; 0.00 : 4ac5d3: 48 8d 04 80 lea (%rax,%rax,4),%rax 0.00 : 4ac5d7: 49 8d 54 44 60 lea 0x60(%r12,%rax,2),%rdx 0.00 : 4ac5dc: 8b 01 mov (%rcx),%eax 0.00 : 4ac5de: 89 42 10 mov %eax,0x10(%rdx) /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:1202 25.00 : 4ac5e1: 0f b7 41 04 movzwl 0x4(%rcx),%eax : currItem->indexOffset = offnum; 0.00 : 4ac5e5: 66 44 89 6a 16 mov %r13w,0x16(%rdx) : _bt_saveitem(BTScanOpaque so, int itemIndex, : OffsetNumber offnum, IndexTuple itup) : { : BTScanPosItem *currItem = &so->currPos.items[itemIndex]; : : currItem->heapTid = itup->t_tid; 0.00 : 4ac5ea: 66 89 42 14 mov %ax,0x14(%rdx) : currItem->indexOffset = offnum; : if (so->currTuples) /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:1204 25.00 : 4ac5ee: 49 83 7c 24 40 00 cmpq $0x0,0x40(%r12) 0.00 : 4ac5f4: 74 33 je 4ac629 <_bt_readpage+0x249> : { : Size itupsz = IndexTupleSize(itup); : : currItem->tupleOffset = so->currPos.nextTupleOffset; 0.00 : 4ac5f6: 41 8b 44 24 60 mov 0x60(%r12),%eax : : currItem->heapTid = itup->t_tid; : currItem->indexOffset = offnum; : if (so->currTuples) : { : Size itupsz = IndexTupleSize(itup); 0.00 : 4ac5fb: 0f b7 59 06 movzwl 0x6(%rcx),%ebx : : currItem->tupleOffset = so->currPos.nextTupleOffset; : memcpy(so->currTuples + so->currPos.nextTupleOffset, itup, itupsz); 0.00 : 4ac5ff: 48 89 ce mov %rcx,%rsi : currItem->indexOffset = offnum; : if (so->currTuples) : { : Size itupsz = IndexTupleSize(itup); : : currItem->tupleOffset = so->currPos.nextTupleOffset; 0.00 : 4ac602: 66 89 42 18 mov %ax,0x18(%rdx) : memcpy(so->currTuples + so->currPos.nextTupleOffset, itup, itupsz); 0.00 : 4ac606: 49 63 7c 24 60 movslq 0x60(%r12),%rdi 0.00 : 4ac60b: 49 03 7c 24 40 add 0x40(%r12),%rdi : : currItem->heapTid = itup->t_tid; : currItem->indexOffset = offnum; : if (so->currTuples) : { : Size itupsz = IndexTupleSize(itup); 0.00 : 4ac610: 81 e3 ff 1f 00 00 and $0x1fff,%ebx : : currItem->tupleOffset = so->currPos.nextTupleOffset; : memcpy(so->currTuples + so->currPos.nextTupleOffset, itup, itupsz); 0.00 : 4ac616: 48 89 da mov %rbx,%rdx : so->currPos.nextTupleOffset += MAXALIGN(itupsz); 0.00 : 4ac619: 83 c3 07 add $0x7,%ebx 0.00 : 4ac61c: 83 e3 f8 and $0xfffffff8,%ebx : if (so->currTuples) : { : Size itupsz = IndexTupleSize(itup); : : currItem->tupleOffset = so->currPos.nextTupleOffset; : memcpy(so->currTuples + so->currPos.nextTupleOffset, itup, itupsz); 0.00 : 4ac61f: e8 cc d5 fb ff callq 469bf0 : so->currPos.nextTupleOffset += MAXALIGN(itupsz); 0.00 : 4ac624: 41 01 5c 24 60 add %ebx,0x60(%r12) : itup = _bt_checkkeys(scan, page, offnum, dir, &continuescan); : if (itup != NULL) : { : /* tuple passes all scan key conditions, so remember it */ : _bt_saveitem(so, itemIndex, offnum, itup); : itemIndex++; 0.00 : 4ac629: 41 83 c6 01 add $0x1,%r14d : } : if (!continuescan) 0.00 : 4ac62d: 80 7d cf 00 cmpb $0x0,-0x31(%rbp) 0.00 : 4ac631: 0f 85 69 ff ff ff jne 4ac5a0 <_bt_readpage+0x1c0> : { : /* there can't be any more matches, so stop */ : so->currPos.moreRight = false; 0.00 : 4ac637: 41 8d 46 ff lea -0x1(%r14),%eax 0.00 : 4ac63b: 41 c6 44 24 5d 00 movb $0x0,0x5d(%r12) : : offnum = OffsetNumberNext(offnum); : } : : Assert(itemIndex <= MaxIndexTuplesPerPage); : so->currPos.firstItem = 0; 0.00 : 4ac641: 41 c7 44 24 64 00 00 movl $0x0,0x64(%r12) 0.00 : 4ac648: 00 00 : so->currPos.lastItem = itemIndex - 1; 0.00 : 4ac64a: 41 89 44 24 68 mov %eax,0x68(%r12) : so->currPos.itemIndex = 0; 0.00 : 4ac64f: 41 c7 44 24 6c 00 00 movl $0x0,0x6c(%r12) 0.00 : 4ac656: 00 00 0.00 : 4ac658: e9 ed fe ff ff jmpq 4ac54a <_bt_readpage+0x16a> 0.00 : 4ac65d: 0f 1f 00 nopl (%rax) : bool continuescan; : : /* we must have the buffer pinned and locked */ : Assert(BufferIsValid(so->currPos.buf)); : : page = BufferGetPage(so->currPos.buf); 0.00 : 4ac660: f7 d0 not %eax 0.00 : 4ac662: 48 63 d0 movslq %eax,%rdx 0.00 : 4ac665: 48 8b 05 ac 0a 6d 00 mov 0x6d0aac(%rip),%rax # b7d118 0.00 : 4ac66c: 4c 8b 3c d0 mov (%rax,%rdx,8),%r15 0.00 : 4ac670: e9 a7 fd ff ff jmpq 4ac41c <_bt_readpage+0x3c> 0.00 : 4ac675: 0f 1f 00 nopl (%rax) : /* load items[] in ascending order */ : itemIndex = 0; : : offnum = Max(offnum, minoff); : : while (offnum <= maxoff) 0.00 : 4ac678: 41 8d 46 ff lea -0x1(%r14),%eax 0.00 : 4ac67c: eb c3 jmp 4ac641 <_bt_readpage+0x261> Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 25.00 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:1017 25.00 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:890 25.00 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:890 25.00 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:965 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000004ad290 <_bt_first>: : * Within this routine, we build a temporary insertion-type scankey to use : * in locating the scan start position. : */ : bool : _bt_first(IndexScanDesc scan, ScanDirection dir) : { 0.00 : 4ad290: 55 push %rbp 0.00 : 4ad291: 48 89 e5 mov %rsp,%rbp 0.00 : 4ad294: 41 57 push %r15 0.00 : 4ad296: 41 56 push %r14 0.00 : 4ad298: 41 55 push %r13 0.00 : 4ad29a: 41 54 push %r12 0.00 : 4ad29c: 53 push %rbx 0.00 : 4ad29d: 48 81 ec 68 13 00 00 sub $0x1368,%rsp 0.00 : 4ad2a4: 48 89 bd a0 ec ff ff mov %rdi,-0x1360(%rbp) 0.00 : 4ad2ab: 89 b5 9c ec ff ff mov %esi,-0x1364(%rbp) : Relation rel = scan->indexRelation; 0.00 : 4ad2b1: 48 8b 47 08 mov 0x8(%rdi),%rax 0.00 : 4ad2b5: 48 89 85 a8 ec ff ff mov %rax,-0x1358(%rbp) : BTScanOpaque so = (BTScanOpaque) scan->opaque; 0.00 : 4ad2bc: 48 8b 57 38 mov 0x38(%rdi),%rdx 0.00 : 4ad2c0: 48 89 95 b0 ec ff ff mov %rdx,-0x1350(%rbp) : int keysCount = 0; : int i; : StrategyNumber strat_total; : BTScanPosItem *currItem; : : pgstat_count_index_scan(rel); 0.00 : 4ad2c7: 48 8b 80 38 01 00 00 mov 0x138(%rax),%rax 0.00 : 4ad2ce: 48 85 c0 test %rax,%rax 0.00 : 4ad2d1: 74 05 je 4ad2d8 <_bt_first+0x48> 0.00 : 4ad2d3: 48 83 40 10 01 addq $0x1,0x10(%rax) : : /* : * Examine the scan keys and eliminate any redundant keys; also mark the : * keys that must be matched to continue the scan. : */ : _bt_preprocess_keys(scan); 0.00 : 4ad2d8: 48 8b bd a0 ec ff ff mov -0x1360(%rbp),%rdi 0.00 : 4ad2df: e8 ec 18 00 00 callq 4aebd0 <_bt_preprocess_keys> : : /* : * Quit now if _bt_preprocess_keys() discovered that the scan keys can : * never be satisfied (eg, x == 1 AND x > 2). : */ : if (!so->qual_ok) 0.00 : 4ad2e4: 48 8b 85 b0 ec ff ff mov -0x1350(%rbp),%rax 0.00 : 4ad2eb: 80 38 00 cmpb $0x0,(%rax) 0.00 : 4ad2ee: 0f 84 cc 00 00 00 je 4ad3c0 <_bt_first+0x130> : * The selected scan keys (at most one per index column) are remembered by : * storing their addresses into the local startKeys[] array. : *---------- : */ : strat_total = BTEqualStrategyNumber; : if (so->numberOfKeys > 0) 0.00 : 4ad2f4: 8b 50 04 mov 0x4(%rax),%edx 0.00 : 4ad2f7: 85 d2 test %edx,%edx 0.00 : 4ad2f9: 0f 8e 31 04 00 00 jle 4ad730 <_bt_first+0x4a0> : /* : * Loop iterates from 0 to numberOfKeys inclusive; we use the last : * pass to handle after-last-key processing. Actual exit from the : * loop is at one of the "break" statements below. : */ : for (cur = so->keyData, i = 0;; cur++, i++) 0.00 : 4ad2ff: 4c 8b 60 08 mov 0x8(%rax),%r12 0.00 : 4ad303: 45 31 ff xor %r15d,%r15d 0.00 : 4ad306: 45 31 ed xor %r13d,%r13d 0.00 : 4ad309: 66 c7 85 be ec ff ff movw $0x3,-0x1342(%rbp) 0.00 : 4ad310: 03 00 0.00 : 4ad312: 41 be 01 00 00 00 mov $0x1,%r14d 0.00 : 4ad318: 31 db xor %ebx,%ebx 0.00 : 4ad31a: 31 f6 xor %esi,%esi 0.00 : 4ad31c: 0f 1f 40 00 nopl 0x0(%rax) : { : if (i >= so->numberOfKeys || cur->sk_attno != curattr) 0.00 : 4ad320: 41 39 d5 cmp %edx,%r13d 0.00 : 4ad323: 7d 0c jge 4ad331 <_bt_first+0xa1> 0.00 : 4ad325: 41 0f b7 4c 24 04 movzwl 0x4(%r12),%ecx 0.00 : 4ad32b: 66 44 39 f1 cmp %r14w,%cx 0.00 : 4ad32f: 74 74 je 4ad3a5 <_bt_first+0x115> : { : /* : * Done looking at keys for curattr. If we didn't find a : * usable boundary key, see if we can deduce a NOT NULL key. : */ : if (chosen == NULL && impliesNN != NULL && 0.00 : 4ad331: 48 85 db test %rbx,%rbx 0.00 : 4ad334: 0f 84 fe 00 00 00 je 4ad438 <_bt_first+0x1a8> : * If we still didn't find a usable boundary key, quit; else : * save the boundary key pointer in startKeys. : */ : if (chosen == NULL) : break; : startKeys[keysCount++] = chosen; 0.00 : 4ad33a: 49 63 c7 movslq %r15d,%rax 0.00 : 4ad33d: 41 83 c7 01 add $0x1,%r15d 0.00 : 4ad341: 48 89 9c c5 c0 fe ff mov %rbx,-0x140(%rbp,%rax,8) 0.00 : 4ad348: ff : : /* : * Adjust strat_total, and quit if we have stored a > or < : * key. : */ : strat = chosen->sk_strategy; 0.00 : 4ad349: 0f b7 43 06 movzwl 0x6(%rbx),%eax : if (strat != BTEqualStrategyNumber) 0.00 : 4ad34d: 66 83 f8 03 cmp $0x3,%ax 0.00 : 4ad351: 74 1b je 4ad36e <_bt_first+0xde> : { : strat_total = strat; : if (strat == BTGreaterStrategyNumber || 0.00 : 4ad353: 66 83 f8 05 cmp $0x5,%ax 0.00 : 4ad357: 0f 84 33 05 00 00 je 4ad890 <_bt_first+0x600> 0.00 : 4ad35d: 66 83 f8 01 cmp $0x1,%ax 0.00 : 4ad361: 0f 84 29 05 00 00 je 4ad890 <_bt_first+0x600> : strat == BTLessStrategyNumber) : break; 0.00 : 4ad367: 66 89 85 be ec ff ff mov %ax,-0x1342(%rbp) : /* : * Done if that was the last attribute, or if next key is not : * in sequence (implying no boundary key is available for the : * next attribute). : */ : if (i >= so->numberOfKeys || 0.00 : 4ad36e: 48 8b 95 b0 ec ff ff mov -0x1350(%rbp),%rdx 0.00 : 4ad375: 44 3b 6a 04 cmp 0x4(%rdx),%r13d 0.00 : 4ad379: 0f 8d e0 00 00 00 jge 4ad45f <_bt_first+0x1cf> 0.00 : 4ad37f: 41 0f b7 4c 24 04 movzwl 0x4(%r12),%ecx 0.00 : 4ad385: 41 0f bf c6 movswl %r14w,%eax 0.00 : 4ad389: 83 c0 01 add $0x1,%eax 0.00 : 4ad38c: 0f bf d1 movswl %cx,%edx 0.00 : 4ad38f: 39 c2 cmp %eax,%edx 0.00 : 4ad391: 0f 85 c8 00 00 00 jne 4ad45f <_bt_first+0x1cf> 0.00 : 4ad397: 48 8b 85 b0 ec ff ff mov -0x1350(%rbp),%rax 0.00 : 4ad39e: 31 db xor %ebx,%ebx 0.00 : 4ad3a0: 31 f6 xor %esi,%esi 0.00 : 4ad3a2: 8b 50 04 mov 0x4(%rax),%edx : * : * If not, does it imply a NOT NULL constraint? (Because : * SK_SEARCHNULL keys are always assigned BTEqualStrategyNumber, : * *any* inequality key works for that; we need not test.) : */ : switch (cur->sk_strategy) 0.00 : 4ad3a5: 66 41 83 7c 24 06 05 cmpw $0x5,0x6(%r12) 0.00 : 4ad3ac: 77 4a ja 4ad3f8 <_bt_first+0x168> 0.00 : 4ad3ae: 41 0f b7 44 24 06 movzwl 0x6(%r12),%eax 0.00 : 4ad3b4: ff 24 c5 60 48 7b 00 jmpq *0x7b4860(,%rax,8) 0.00 : 4ad3bb: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : : /* OK, itemIndex says what to return */ : currItem = &so->currPos.items[so->currPos.itemIndex]; : scan->xs_ctup.t_self = currItem->heapTid; : if (scan->xs_want_itup) : scan->xs_itup = (IndexTuple) (so->currTuples + currItem->tupleOffset); 0.00 : 4ad3c0: 31 d2 xor %edx,%edx : : return true; : } 0.00 : 4ad3c2: 48 81 c4 68 13 00 00 add $0x1368,%rsp 0.00 : 4ad3c9: 89 d0 mov %edx,%eax 0.00 : 4ad3cb: 5b pop %rbx 0.00 : 4ad3cc: 41 5c pop %r12 0.00 : 4ad3ce: 41 5d pop %r13 0.00 : 4ad3d0: 41 5e pop %r14 0.00 : 4ad3d2: 41 5f pop %r15 0.00 : 4ad3d4: c9 leaveq 0.00 : 4ad3d5: c3 retq 0.00 : 4ad3d6: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 0.00 : 4ad3dd: 00 00 00 : /* override any non-equality choice */ : chosen = cur; : break; : case BTGreaterEqualStrategyNumber: : case BTGreaterStrategyNumber: : if (chosen == NULL) 0.00 : 4ad3e0: 48 85 db test %rbx,%rbx 0.00 : 4ad3e3: 75 13 jne 4ad3f8 <_bt_first+0x168> : { : if (ScanDirectionIsForward(dir)) 0.00 : 4ad3e5: 83 bd 9c ec ff ff 01 cmpl $0x1,-0x1364(%rbp) 0.00 : 4ad3ec: 74 32 je 4ad420 <_bt_first+0x190> 0.00 : 4ad3ee: 4c 89 e6 mov %r12,%rsi 0.00 : 4ad3f1: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : /* : * Loop iterates from 0 to numberOfKeys inclusive; we use the last : * pass to handle after-last-key processing. Actual exit from the : * loop is at one of the "break" statements below. : */ : for (cur = so->keyData, i = 0;; cur++, i++) 0.00 : 4ad3f8: 49 83 c4 48 add $0x48,%r12 0.00 : 4ad3fc: 41 83 c5 01 add $0x1,%r13d 0.00 : 4ad400: 41 89 ce mov %ecx,%r14d : else : impliesNN = cur; : } : break; : } : } 0.00 : 4ad403: e9 18 ff ff ff jmpq 4ad320 <_bt_first+0x90> 0.00 : 4ad408: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 4ad40f: 00 : */ : switch (cur->sk_strategy) : { : case BTLessStrategyNumber: : case BTLessEqualStrategyNumber: : if (chosen == NULL) 0.00 : 4ad410: 48 85 db test %rbx,%rbx 0.00 : 4ad413: 75 e3 jne 4ad3f8 <_bt_first+0x168> : { : if (ScanDirectionIsBackward(dir)) 0.00 : 4ad415: 83 bd 9c ec ff ff ff cmpl $0xffffffff,-0x1364(%rbp) 0.00 : 4ad41c: 75 d0 jne 4ad3ee <_bt_first+0x15e> 0.00 : 4ad41e: 66 90 xchg %ax,%ax : break; : case BTGreaterEqualStrategyNumber: : case BTGreaterStrategyNumber: : if (chosen == NULL) : { : if (ScanDirectionIsForward(dir)) 0.00 : 4ad420: 4c 89 e3 mov %r12,%rbx : /* : * Loop iterates from 0 to numberOfKeys inclusive; we use the last : * pass to handle after-last-key processing. Actual exit from the : * loop is at one of the "break" statements below. : */ : for (cur = so->keyData, i = 0;; cur++, i++) 0.00 : 4ad423: 41 83 c5 01 add $0x1,%r13d 0.00 : 4ad427: 49 83 c4 48 add $0x48,%r12 0.00 : 4ad42b: 41 89 ce mov %ecx,%r14d 0.00 : 4ad42e: e9 ed fe ff ff jmpq 4ad320 <_bt_first+0x90> 0.00 : 4ad433: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : { : /* : * Done looking at keys for curattr. If we didn't find a : * usable boundary key, see if we can deduce a NOT NULL key. : */ : if (chosen == NULL && impliesNN != NULL && 0.00 : 4ad438: 48 85 f6 test %rsi,%rsi 0.00 : 4ad43b: 74 22 je 4ad45f <_bt_first+0x1cf> 0.00 : 4ad43d: 8b 36 mov (%rsi),%esi 0.00 : 4ad43f: 89 f2 mov %esi,%edx 0.00 : 4ad441: 81 e2 00 00 00 02 and $0x2000000,%edx 0.00 : 4ad447: 0f 84 73 02 00 00 je 4ad6c0 <_bt_first+0x430> 0.00 : 4ad44d: 83 bd 9c ec ff ff 01 cmpl $0x1,-0x1364(%rbp) 0.00 : 4ad454: 0f 94 c0 sete %al 0.00 : 4ad457: 84 c0 test %al,%al 0.00 : 4ad459: 0f 85 09 02 00 00 jne 4ad668 <_bt_first+0x3d8> : /* : * If we found no usable boundary keys, we have to start from one end of : * the tree. Walk down that edge to the first or last key, and scan from : * there. : */ : if (keysCount == 0) 0.00 : 4ad45f: 41 83 ff 00 cmp $0x0,%r15d 0.00 : 4ad463: 0f 84 c7 02 00 00 je 4ad730 <_bt_first+0x4a0> : * insertion scankey we can use to search for the boundary point we : * identified above. The insertion scankey is built in the local : * scankeys[] array, using the keys identified by startKeys[]. : */ : Assert(keysCount <= INDEX_MAX_KEYS); : for (i = 0; i < keysCount; i++) 0.00 : 4ad469: 0f 8e b5 01 00 00 jle 4ad624 <_bt_first+0x394> : : /* OK, itemIndex says what to return */ : currItem = &so->currPos.items[so->currPos.itemIndex]; : scan->xs_ctup.t_self = currItem->heapTid; : if (scan->xs_want_itup) : scan->xs_itup = (IndexTuple) (so->currTuples + currItem->tupleOffset); 0.00 : 4ad46f: 48 8d 8d c0 f5 ff ff lea -0xa40(%rbp),%rcx : * scheme. But, by the same token, if we aren't able to use all : * the row members, then the part of the row comparison that we : * did use has to be treated as just a ">=" or "<=" condition, and : * so we'd better adjust strat_total accordingly. : */ : if (i == keysCount - 1) 0.00 : 4ad476: 41 8d 47 ff lea -0x1(%r15),%eax : : /* OK, itemIndex says what to return */ : currItem = &so->currPos.items[so->currPos.itemIndex]; : scan->xs_ctup.t_self = currItem->heapTid; : if (scan->xs_want_itup) : scan->xs_itup = (IndexTuple) (so->currTuples + currItem->tupleOffset); 0.00 : 4ad47a: 45 31 ed xor %r13d,%r13d 0.00 : 4ad47d: 45 31 f6 xor %r14d,%r14d 0.00 : 4ad480: 48 89 8d 90 ec ff ff mov %rcx,-0x1370(%rbp) 0.00 : 4ad487: 48 89 cb mov %rcx,%rbx : * scheme. But, by the same token, if we aren't able to use all : * the row members, then the part of the row comparison that we : * did use has to be treated as just a ">=" or "<=" condition, and : * so we'd better adjust strat_total accordingly. : */ : if (i == keysCount - 1) 0.00 : 4ad48a: 89 85 8c ec ff ff mov %eax,-0x1374(%rbp) 0.00 : 4ad490: eb 7c jmp 4ad50e <_bt_first+0x27e> 0.00 : 4ad492: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : * have sk_func = 3-way-comparison function), but we have to watch : * out for nulls, which _bt_preprocess_keys didn't check. A null : * in the first row member makes the condition unmatchable, just : * like qual_ok = false. : */ : ScanKey subkey = (ScanKey) DatumGetPointer(cur->sk_argument); 0.00 : 4ad498: 49 8b 4c 24 40 mov 0x40(%r12),%rcx : : Assert(subkey->sk_flags & SK_ROW_MEMBER); : if (subkey->sk_flags & SK_ISNULL) 0.00 : 4ad49d: f6 01 01 testb $0x1,(%rcx) 0.00 : 4ad4a0: 0f 85 1a ff ff ff jne 4ad3c0 <_bt_first+0x130> : return false; : memcpy(scankeys + i, subkey, sizeof(ScanKeyData)); 0.00 : 4ad4a6: 48 8b 01 mov (%rcx),%rax 0.00 : 4ad4a9: 48 89 03 mov %rax,(%rbx) 0.00 : 4ad4ac: 48 8b 41 08 mov 0x8(%rcx),%rax 0.00 : 4ad4b0: 48 89 43 08 mov %rax,0x8(%rbx) 0.00 : 4ad4b4: 48 8b 41 10 mov 0x10(%rcx),%rax 0.00 : 4ad4b8: 48 89 43 10 mov %rax,0x10(%rbx) 0.00 : 4ad4bc: 48 8b 41 18 mov 0x18(%rcx),%rax 0.00 : 4ad4c0: 48 89 43 18 mov %rax,0x18(%rbx) 0.00 : 4ad4c4: 48 8b 41 20 mov 0x20(%rcx),%rax 0.00 : 4ad4c8: 48 89 43 20 mov %rax,0x20(%rbx) 0.00 : 4ad4cc: 48 8b 41 28 mov 0x28(%rcx),%rax 0.00 : 4ad4d0: 48 89 43 28 mov %rax,0x28(%rbx) 0.00 : 4ad4d4: 48 8b 41 30 mov 0x30(%rcx),%rax 0.00 : 4ad4d8: 48 89 43 30 mov %rax,0x30(%rbx) 0.00 : 4ad4dc: 48 8b 41 38 mov 0x38(%rcx),%rax 0.00 : 4ad4e0: 48 89 43 38 mov %rax,0x38(%rbx) 0.00 : 4ad4e4: 48 8b 41 40 mov 0x40(%rcx),%rax 0.00 : 4ad4e8: 48 89 43 40 mov %rax,0x40(%rbx) : * scheme. But, by the same token, if we aren't able to use all : * the row members, then the part of the row comparison that we : * did use has to be treated as just a ">=" or "<=" condition, and : * so we'd better adjust strat_total accordingly. : */ : if (i == keysCount - 1) 0.00 : 4ad4ec: 44 39 ad 8c ec ff ff cmp %r13d,-0x1374(%rbp) 0.00 : 4ad4f3: 0f 84 9a 00 00 00 je 4ad593 <_bt_first+0x303> : * insertion scankey we can use to search for the boundary point we : * identified above. The insertion scankey is built in the local : * scankeys[] array, using the keys identified by startKeys[]. : */ : Assert(keysCount <= INDEX_MAX_KEYS); : for (i = 0; i < keysCount; i++) 0.00 : 4ad4f9: 41 83 c5 01 add $0x1,%r13d 0.00 : 4ad4fd: 48 83 c3 48 add $0x48,%rbx 0.00 : 4ad501: 49 83 c6 04 add $0x4,%r14 0.00 : 4ad505: 45 39 ef cmp %r13d,%r15d 0.00 : 4ad508: 0f 8e 16 01 00 00 jle 4ad624 <_bt_first+0x394> : { : ScanKey cur = startKeys[i]; 0.00 : 4ad50e: 4e 8b a4 75 c0 fe ff mov -0x140(%rbp,%r14,2),%r12 0.00 : 4ad515: ff : : Assert(cur->sk_attno == i + 1); : : if (cur->sk_flags & SK_ROW_HEADER) 0.00 : 4ad516: 41 f6 04 24 04 testb $0x4,(%r12) 0.00 : 4ad51b: 0f 85 77 ff ff ff jne 4ad498 <_bt_first+0x208> : * : * We support the convention that sk_subtype == InvalidOid means : * the opclass input type; this is a hack to simplify life for : * ScanKeyInit(). : */ : if (cur->sk_subtype == rel->rd_opcintype[i] || 0.00 : 4ad521: 48 8b 8d a8 ec ff ff mov -0x1358(%rbp),%rcx 0.00 : 4ad528: 41 8b 54 24 08 mov 0x8(%r12),%edx 0.00 : 4ad52d: 48 8b 81 d0 00 00 00 mov 0xd0(%rcx),%rax 0.00 : 4ad534: 42 8b 34 30 mov (%rax,%r14,1),%esi 0.00 : 4ad538: 39 f2 cmp %esi,%edx 0.00 : 4ad53a: 74 08 je 4ad544 <_bt_first+0x2b4> 0.00 : 4ad53c: 85 d2 test %edx,%edx 0.00 : 4ad53e: 0f 85 8c 01 00 00 jne 4ad6d0 <_bt_first+0x440> : cur->sk_subtype == InvalidOid) : { : FmgrInfo *procinfo; : : procinfo = index_getprocinfo(rel, cur->sk_attno, BTORDER_PROC); 0.00 : 4ad544: 41 0f bf 74 24 04 movswl 0x4(%r12),%esi 0.00 : 4ad54a: 48 8b bd a8 ec ff ff mov -0x1358(%rbp),%rdi 0.00 : 4ad551: ba 01 00 00 00 mov $0x1,%edx 0.00 : 4ad556: e8 65 7b ff ff callq 4a50c0 : ScanKeyEntryInitializeWithInfo(scankeys + i, 0.00 : 4ad55b: 49 8b 4c 24 40 mov 0x40(%r12),%rcx 0.00 : 4ad560: 41 0f bf 54 24 04 movswl 0x4(%r12),%edx 0.00 : 4ad566: 48 89 df mov %rbx,%rdi 0.00 : 4ad569: 45 8b 4c 24 0c mov 0xc(%r12),%r9d 0.00 : 4ad56e: 45 8b 44 24 08 mov 0x8(%r12),%r8d 0.00 : 4ad573: 48 89 04 24 mov %rax,(%rsp) 0.00 : 4ad577: 48 89 4c 24 08 mov %rcx,0x8(%rsp) 0.00 : 4ad57c: 41 8b 34 24 mov (%r12),%esi 0.00 : 4ad580: 31 c9 xor %ecx,%ecx 0.00 : 4ad582: e8 b9 65 fc ff callq 473b40 : * : * We support the convention that sk_subtype == InvalidOid means : * the opclass input type; this is a hack to simplify life for : * ScanKeyInit(). : */ : if (cur->sk_subtype == rel->rd_opcintype[i] || 0.00 : 4ad587: e9 6d ff ff ff jmpq 4ad4f9 <_bt_first+0x269> 0.00 : 4ad58c: 0f 1f 40 00 nopl 0x0(%rax) : if (subkey->sk_flags & SK_ISNULL) : break; /* can't use null keys */ : Assert(keysCount < INDEX_MAX_KEYS); : memcpy(scankeys + keysCount, subkey, sizeof(ScanKeyData)); : keysCount++; : if (subkey->sk_flags & SK_ROW_END) 0.00 : 4ad590: 41 89 f7 mov %esi,%r15d : bool used_all_subkeys = false; : : Assert(!(subkey->sk_flags & SK_ROW_END)); : for (;;) : { : subkey++; 0.00 : 4ad593: 48 83 c1 48 add $0x48,%rcx : Assert(subkey->sk_flags & SK_ROW_MEMBER); : if (subkey->sk_attno != keysCount + 1) 0.00 : 4ad597: 41 8d 47 01 lea 0x1(%r15),%eax 0.00 : 4ad59b: 0f bf 71 04 movswl 0x4(%rcx),%esi 0.00 : 4ad59f: 39 c6 cmp %eax,%esi 0.00 : 4ad5a1: 0f 85 f1 05 00 00 jne 4adb98 <_bt_first+0x908> : break; /* out-of-sequence, can't use it */ : if (subkey->sk_strategy != cur->sk_strategy) 0.00 : 4ad5a7: 0f b7 41 06 movzwl 0x6(%rcx),%eax 0.00 : 4ad5ab: 66 41 3b 44 24 06 cmp 0x6(%r12),%ax 0.00 : 4ad5b1: 0f 85 e1 05 00 00 jne 4adb98 <_bt_first+0x908> : break; /* wrong direction, can't use it */ : if (subkey->sk_flags & SK_ISNULL) 0.00 : 4ad5b7: f6 01 01 testb $0x1,(%rcx) 0.00 : 4ad5ba: 0f 85 d8 05 00 00 jne 4adb98 <_bt_first+0x908> : break; /* can't use null keys */ : Assert(keysCount < INDEX_MAX_KEYS); : memcpy(scankeys + keysCount, subkey, sizeof(ScanKeyData)); 0.00 : 4ad5c0: 48 8b 95 90 ec ff ff mov -0x1370(%rbp),%rdx 0.00 : 4ad5c7: 49 63 c7 movslq %r15d,%rax 0.00 : 4ad5ca: 48 8d 04 c0 lea (%rax,%rax,8),%rax 0.00 : 4ad5ce: 48 8d 04 c2 lea (%rdx,%rax,8),%rax 0.00 : 4ad5d2: 48 8b 11 mov (%rcx),%rdx 0.00 : 4ad5d5: 48 89 10 mov %rdx,(%rax) 0.00 : 4ad5d8: 48 8b 51 08 mov 0x8(%rcx),%rdx 0.00 : 4ad5dc: 48 89 50 08 mov %rdx,0x8(%rax) 0.00 : 4ad5e0: 48 8b 51 10 mov 0x10(%rcx),%rdx 0.00 : 4ad5e4: 48 89 50 10 mov %rdx,0x10(%rax) 0.00 : 4ad5e8: 48 8b 51 18 mov 0x18(%rcx),%rdx 0.00 : 4ad5ec: 48 89 50 18 mov %rdx,0x18(%rax) 0.00 : 4ad5f0: 48 8b 51 20 mov 0x20(%rcx),%rdx 0.00 : 4ad5f4: 48 89 50 20 mov %rdx,0x20(%rax) 0.00 : 4ad5f8: 48 8b 51 28 mov 0x28(%rcx),%rdx 0.00 : 4ad5fc: 48 89 50 28 mov %rdx,0x28(%rax) 0.00 : 4ad600: 48 8b 51 30 mov 0x30(%rcx),%rdx 0.00 : 4ad604: 48 89 50 30 mov %rdx,0x30(%rax) 0.00 : 4ad608: 48 8b 51 38 mov 0x38(%rcx),%rdx 0.00 : 4ad60c: 48 89 50 38 mov %rdx,0x38(%rax) 0.00 : 4ad610: 48 8b 51 40 mov 0x40(%rcx),%rdx 0.00 : 4ad614: 48 89 50 40 mov %rdx,0x40(%rax) : keysCount++; : if (subkey->sk_flags & SK_ROW_END) 0.00 : 4ad618: f6 01 10 testb $0x10,(%rcx) 0.00 : 4ad61b: 0f 84 6f ff ff ff je 4ad590 <_bt_first+0x300> 0.00 : 4ad621: 41 89 f7 mov %esi,%r15d : * : * If goback = true, we will then step back one item, while if : * goback = false, we will start the scan on the located item. : *---------- : */ : switch (strat_total) 0.00 : 4ad624: 66 83 bd be ec ff ff cmpw $0x5,-0x1342(%rbp) 0.00 : 4ad62b: 05 0.00 : 4ad62c: 0f 86 4e 02 00 00 jbe 4ad880 <_bt_first+0x5f0> : goback = false; : break; : : default: : /* can't get here, but keep compiler quiet */ : elog(ERROR, "unrecognized strat_total: %d", (int) strat_total); 0.00 : 4ad632: ba df 48 7b 00 mov $0x7b48df,%edx 0.00 : 4ad637: be a4 03 00 00 mov $0x3a4,%esi 0.00 : 4ad63c: bf 70 47 7b 00 mov $0x7b4770,%edi 0.00 : 4ad641: e8 da dd 2c 00 callq 77b420 0.00 : 4ad646: 0f b7 95 be ec ff ff movzwl -0x1342(%rbp),%edx 0.00 : 4ad64d: be 97 47 7b 00 mov $0x7b4797,%esi 0.00 : 4ad652: bf 14 00 00 00 mov $0x14,%edi 0.00 : 4ad657: 31 c0 xor %eax,%eax 0.00 : 4ad659: e8 d2 db 2c 00 callq 77b230 0.00 : 4ad65e: e8 6d be fb ff callq 4694d0 0.00 : 4ad663: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : ((impliesNN->sk_flags & SK_BT_NULLS_FIRST) ? : ScanDirectionIsForward(dir) : : ScanDirectionIsBackward(dir))) : { : /* Yes, so build the key in notnullkeys[keysCount] */ : chosen = ¬nullkeys[keysCount]; 0.00 : 4ad668: 49 63 c7 movslq %r15d,%rax : ScanKeyEntryInitialize(chosen, 0.00 : 4ad66b: 83 fa 01 cmp $0x1,%edx 0.00 : 4ad66e: 41 0f bf d6 movswl %r14w,%edx : ((impliesNN->sk_flags & SK_BT_NULLS_FIRST) ? : ScanDirectionIsForward(dir) : : ScanDirectionIsBackward(dir))) : { : /* Yes, so build the key in notnullkeys[keysCount] */ : chosen = ¬nullkeys[keysCount]; 0.00 : 4ad672: 48 8d 04 c0 lea (%rax,%rax,8),%rax : ScanKeyEntryInitialize(chosen, 0.00 : 4ad676: 19 c9 sbb %ecx,%ecx 0.00 : 4ad678: 81 e6 00 00 00 03 and $0x3000000,%esi 0.00 : 4ad67e: 83 e1 fc and $0xfffffffc,%ecx 0.00 : 4ad681: 40 80 ce 81 or $0x81,%sil 0.00 : 4ad685: 45 31 c9 xor %r9d,%r9d : ((impliesNN->sk_flags & SK_BT_NULLS_FIRST) ? : ScanDirectionIsForward(dir) : : ScanDirectionIsBackward(dir))) : { : /* Yes, so build the key in notnullkeys[keysCount] */ : chosen = ¬nullkeys[keysCount]; 0.00 : 4ad688: 48 8d 9c c5 c0 ec ff lea -0x1340(%rbp,%rax,8),%rbx 0.00 : 4ad68f: ff : ScanKeyEntryInitialize(chosen, 0.00 : 4ad690: 83 c1 05 add $0x5,%ecx 0.00 : 4ad693: 45 31 c0 xor %r8d,%r8d 0.00 : 4ad696: 48 c7 44 24 08 00 00 movq $0x0,0x8(%rsp) 0.00 : 4ad69d: 00 00 0.00 : 4ad69f: c7 04 24 00 00 00 00 movl $0x0,(%rsp) 0.00 : 4ad6a6: 48 89 df mov %rbx,%rdi 0.00 : 4ad6a9: e8 02 65 fc ff callq 473bb0 : : /* : * If we still didn't find a usable boundary key, quit; else : * save the boundary key pointer in startKeys. : */ : if (chosen == NULL) 0.00 : 4ad6ae: 48 85 db test %rbx,%rbx 0.00 : 4ad6b1: 0f 85 83 fc ff ff jne 4ad33a <_bt_first+0xaa> 0.00 : 4ad6b7: e9 a3 fd ff ff jmpq 4ad45f <_bt_first+0x1cf> 0.00 : 4ad6bc: 0f 1f 40 00 nopl 0x0(%rax) : { : /* : * Done looking at keys for curattr. If we didn't find a : * usable boundary key, see if we can deduce a NOT NULL key. : */ : if (chosen == NULL && impliesNN != NULL && 0.00 : 4ad6c0: 83 bd 9c ec ff ff ff cmpl $0xffffffff,-0x1364(%rbp) 0.00 : 4ad6c7: 0f 94 c0 sete %al 0.00 : 4ad6ca: e9 88 fd ff ff jmpq 4ad457 <_bt_first+0x1c7> 0.00 : 4ad6cf: 90 nop : } : else : { : RegProcedure cmp_proc; : : cmp_proc = get_opfamily_proc(rel->rd_opfamily[i], 0.00 : 4ad6d0: 48 8b 8d a8 ec ff ff mov -0x1358(%rbp),%rcx 0.00 : 4ad6d7: 48 8b 81 c8 00 00 00 mov 0xc8(%rcx),%rax 0.00 : 4ad6de: b9 01 00 00 00 mov $0x1,%ecx 0.00 : 4ad6e3: 42 8b 3c 30 mov (%rax,%r14,1),%edi 0.00 : 4ad6e7: e8 c4 51 2c 00 callq 7728b0 : rel->rd_opcintype[i], : cur->sk_subtype, : BTORDER_PROC); : if (!RegProcedureIsValid(cmp_proc)) 0.00 : 4ad6ec: 85 c0 test %eax,%eax : } : else : { : RegProcedure cmp_proc; : : cmp_proc = get_opfamily_proc(rel->rd_opfamily[i], 0.00 : 4ad6ee: 89 c1 mov %eax,%ecx : rel->rd_opcintype[i], : cur->sk_subtype, : BTORDER_PROC); : if (!RegProcedureIsValid(cmp_proc)) 0.00 : 4ad6f0: 0f 84 4e 04 00 00 je 4adb44 <_bt_first+0x8b4> : elog(ERROR, "missing support function %d(%u,%u) for attribute %d of index \"%s\"", : BTORDER_PROC, rel->rd_opcintype[i], cur->sk_subtype, : cur->sk_attno, RelationGetRelationName(rel)); : ScanKeyEntryInitialize(scankeys + i, 0.00 : 4ad6f6: 49 8b 44 24 40 mov 0x40(%r12),%rax 0.00 : 4ad6fb: 41 0f bf 54 24 04 movswl 0x4(%r12),%edx 0.00 : 4ad701: 48 89 df mov %rbx,%rdi 0.00 : 4ad704: 45 8b 4c 24 0c mov 0xc(%r12),%r9d 0.00 : 4ad709: 45 8b 44 24 08 mov 0x8(%r12),%r8d 0.00 : 4ad70e: 89 0c 24 mov %ecx,(%rsp) 0.00 : 4ad711: 31 c9 xor %ecx,%ecx 0.00 : 4ad713: 48 89 44 24 08 mov %rax,0x8(%rsp) 0.00 : 4ad718: 41 8b 34 24 mov (%r12),%esi 0.00 : 4ad71c: e8 8f 64 fc ff callq 473bb0 0.00 : 4ad721: e9 d3 fd ff ff jmpq 4ad4f9 <_bt_first+0x269> 0.00 : 4ad726: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 0.00 : 4ad72d: 00 00 00 : * same as for _bt_first(). : */ : static bool : _bt_endpoint(IndexScanDesc scan, ScanDirection dir) : { : Relation rel = scan->indexRelation; 0.00 : 4ad730: 48 8b 95 a0 ec ff ff mov -0x1360(%rbp),%rdx 0.00 : 4ad737: 4c 8b 6a 08 mov 0x8(%rdx),%r13 : BTScanOpaque so = (BTScanOpaque) scan->opaque; 0.00 : 4ad73b: 4c 8b 72 38 mov 0x38(%rdx),%r14 : /* : * Scan down to the leftmost or rightmost leaf page. This is a simplified : * version of _bt_search(). We don't maintain a stack since we know we : * won't need it. : */ : buf = _bt_get_endpoint(rel, 0, ScanDirectionIsBackward(dir)); 0.00 : 4ad73f: 31 d2 xor %edx,%edx 0.00 : 4ad741: 83 bd 9c ec ff ff ff cmpl $0xffffffff,-0x1364(%rbp) 0.00 : 4ad748: 4c 89 ef mov %r13,%rdi 0.00 : 4ad74b: 0f 94 c2 sete %dl 0.00 : 4ad74e: 31 f6 xor %esi,%esi 0.00 : 4ad750: e8 eb ea ff ff callq 4ac240 <_bt_get_endpoint> : : if (!BufferIsValid(buf)) 0.00 : 4ad755: 85 c0 test %eax,%eax : /* : * Scan down to the leftmost or rightmost leaf page. This is a simplified : * version of _bt_search(). We don't maintain a stack since we know we : * won't need it. : */ : buf = _bt_get_endpoint(rel, 0, ScanDirectionIsBackward(dir)); 0.00 : 4ad757: 41 89 c4 mov %eax,%r12d : : if (!BufferIsValid(buf)) 0.00 : 4ad75a: 0f 84 3c 01 00 00 je 4ad89c <_bt_first+0x60c> : PredicateLockRelation(rel, scan->xs_snapshot); : so->currPos.buf = InvalidBuffer; : return false; : } : : PredicateLockPage(rel, BufferGetBlockNumber(buf), scan->xs_snapshot); 0.00 : 4ad760: 48 8b 85 a0 ec ff ff mov -0x1360(%rbp),%rax 0.00 : 4ad767: 44 89 e7 mov %r12d,%edi 0.00 : 4ad76a: 48 8b 58 10 mov 0x10(%rax),%rbx 0.00 : 4ad76e: e8 bd 68 1c 00 callq 674030 0.00 : 4ad773: 4c 89 ef mov %r13,%rdi 0.00 : 4ad776: 89 c6 mov %eax,%esi 0.00 : 4ad778: 48 89 da mov %rbx,%rdx 0.00 : 4ad77b: e8 e0 5a 1e 00 callq 693260 : page = BufferGetPage(buf); 0.00 : 4ad780: 45 85 e4 test %r12d,%r12d 0.00 : 4ad783: 0f 88 91 03 00 00 js 4adb1a <_bt_first+0x88a> 0.00 : 4ad789: 41 8d 44 24 ff lea -0x1(%r12),%eax 0.00 : 4ad78e: 48 63 d0 movslq %eax,%rdx 0.00 : 4ad791: 48 c1 e2 0d shl $0xd,%rdx 0.00 : 4ad795: 48 03 15 5c 23 71 00 add 0x71235c(%rip),%rdx # bbfaf8 : opaque = (BTPageOpaque) PageGetSpecialPointer(page); : Assert(P_ISLEAF(opaque)); : : if (ScanDirectionIsForward(dir)) 0.00 : 4ad79c: 83 bd 9c ec ff ff 01 cmpl $0x1,-0x1364(%rbp) : return false; : } : : PredicateLockPage(rel, BufferGetBlockNumber(buf), scan->xs_snapshot); : page = BufferGetPage(buf); : opaque = (BTPageOpaque) PageGetSpecialPointer(page); 0.00 : 4ad7a3: 0f b7 42 10 movzwl 0x10(%rdx),%eax : Assert(P_ISLEAF(opaque)); : : if (ScanDirectionIsForward(dir)) 0.00 : 4ad7a7: 0f 84 4d 03 00 00 je 4adafa <_bt_first+0x86a> : /* There could be dead pages to the left, so not this: */ : /* Assert(P_LEFTMOST(opaque)); */ : : start = P_FIRSTDATAKEY(opaque); : } : else if (ScanDirectionIsBackward(dir)) 0.00 : 4ad7ad: 83 bd 9c ec ff ff ff cmpl $0xffffffff,-0x1364(%rbp) 0.00 : 4ad7b4: 0f 85 ff 03 00 00 jne 4adbb9 <_bt_first+0x929> : { : Assert(P_RIGHTMOST(opaque)); : : start = PageGetMaxOffsetNumber(page); 0.00 : 4ad7ba: 0f b7 42 0c movzwl 0xc(%rdx),%eax : : /* OK, itemIndex says what to return */ : currItem = &so->currPos.items[so->currPos.itemIndex]; : scan->xs_ctup.t_self = currItem->heapTid; : if (scan->xs_want_itup) : scan->xs_itup = (IndexTuple) (so->currTuples + currItem->tupleOffset); 0.00 : 4ad7be: 31 d2 xor %edx,%edx : } : else if (ScanDirectionIsBackward(dir)) : { : Assert(P_RIGHTMOST(opaque)); : : start = PageGetMaxOffsetNumber(page); 0.00 : 4ad7c0: 66 83 f8 18 cmp $0x18,%ax 0.00 : 4ad7c4: 0f 87 f4 00 00 00 ja 4ad8be <_bt_first+0x62e> : elog(ERROR, "invalid scan direction: %d", (int) dir); : start = 0; /* keep compiler quiet */ : } : : /* remember which buffer we have pinned */ : so->currPos.buf = buf; 0.00 : 4ad7ca: 45 89 66 54 mov %r12d,0x54(%r14) : so->currPos.moreLeft = false; : so->currPos.moreRight = true; : } : else : { : so->currPos.moreLeft = true; 0.00 : 4ad7ce: 41 c6 46 5c 01 movb $0x1,0x5c(%r14) : so->currPos.moreRight = false; 0.00 : 4ad7d3: 41 c6 46 5d 00 movb $0x0,0x5d(%r14) : } : so->numKilled = 0; /* just paranoia */ 0.00 : 4ad7d8: 41 c7 46 38 00 00 00 movl $0x0,0x38(%r14) 0.00 : 4ad7df: 00 : so->markItemIndex = -1; /* ditto */ 0.00 : 4ad7e0: 41 c7 46 50 ff ff ff movl $0xffffffff,0x50(%r14) 0.00 : 4ad7e7: ff : : /* : * Now load data from the first page of the scan. : */ : if (!_bt_readpage(scan, dir, start)) 0.00 : 4ad7e8: 8b b5 9c ec ff ff mov -0x1364(%rbp),%esi 0.00 : 4ad7ee: 48 8b bd a0 ec ff ff mov -0x1360(%rbp),%rdi 0.00 : 4ad7f5: e8 e6 eb ff ff callq 4ac3e0 <_bt_readpage> 0.00 : 4ad7fa: 84 c0 test %al,%al 0.00 : 4ad7fc: 75 1c jne 4ad81a <_bt_first+0x58a> : { : /* : * There's no actually-matching data on this page. Try to advance to : * the next page. Return false if there's no matching data at all. : */ : if (!_bt_steppage(scan, dir)) 0.00 : 4ad7fe: 8b b5 9c ec ff ff mov -0x1364(%rbp),%esi 0.00 : 4ad804: 48 8b bd a0 ec ff ff mov -0x1360(%rbp),%rdi 0.00 : 4ad80b: e8 70 ee ff ff callq 4ac680 <_bt_steppage> 0.00 : 4ad810: 31 d2 xor %edx,%edx 0.00 : 4ad812: 84 c0 test %al,%al 0.00 : 4ad814: 0f 84 a8 fb ff ff je 4ad3c2 <_bt_first+0x132> : return false; : } : : /* Drop the lock, but not pin, on the current page */ : LockBuffer(so->currPos.buf, BUFFER_LOCK_UNLOCK); 0.00 : 4ad81a: 41 8b 7e 54 mov 0x54(%r14),%edi 0.00 : 4ad81e: 31 f6 xor %esi,%esi 0.00 : 4ad820: e8 eb 6e 1c 00 callq 674710 : : /* OK, itemIndex says what to return */ : currItem = &so->currPos.items[so->currPos.itemIndex]; 0.00 : 4ad825: 49 63 46 6c movslq 0x6c(%r14),%rax : scan->xs_ctup.t_self = currItem->heapTid; 0.00 : 4ad829: 48 8b 95 a0 ec ff ff mov -0x1360(%rbp),%rdx 0.00 : 4ad830: 48 8d 04 80 lea (%rax,%rax,4),%rax 0.00 : 4ad834: 49 8d 4c 46 60 lea 0x60(%r14,%rax,2),%rcx 0.00 : 4ad839: 8b 41 10 mov 0x10(%rcx),%eax 0.00 : 4ad83c: 89 42 54 mov %eax,0x54(%rdx) 0.00 : 4ad83f: 0f b7 41 14 movzwl 0x14(%rcx),%eax 0.00 : 4ad843: 66 89 42 58 mov %ax,0x58(%rdx) : if (scan->xs_want_itup) 0.00 : 4ad847: 48 8b 85 a0 ec ff ff mov -0x1360(%rbp),%rax 0.00 : 4ad84e: ba 01 00 00 00 mov $0x1,%edx 0.00 : 4ad853: 80 78 30 00 cmpb $0x0,0x30(%rax) 0.00 : 4ad857: 0f 84 65 fb ff ff je 4ad3c2 <_bt_first+0x132> : scan->xs_itup = (IndexTuple) (so->currTuples + currItem->tupleOffset); 0.00 : 4ad85d: 0f b7 41 18 movzwl 0x18(%rcx),%eax 0.00 : 4ad861: 48 8b 95 a0 ec ff ff mov -0x1360(%rbp),%rdx 0.00 : 4ad868: 49 03 46 40 add 0x40(%r14),%rax 0.00 : 4ad86c: 48 89 42 40 mov %rax,0x40(%rdx) 0.00 : 4ad870: ba 01 00 00 00 mov $0x1,%edx 0.00 : 4ad875: e9 48 fb ff ff jmpq 4ad3c2 <_bt_first+0x132> 0.00 : 4ad87a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : * : * If goback = true, we will then step back one item, while if : * goback = false, we will start the scan on the located item. : *---------- : */ : switch (strat_total) 0.00 : 4ad880: 0f b7 85 be ec ff ff movzwl -0x1342(%rbp),%eax 0.00 : 4ad887: ff 24 c5 90 48 7b 00 jmpq *0x7b4890(,%rax,8) 0.00 : 4ad88e: 66 90 xchg %ax,%ax : else : impliesNN = cur; : } : break; : } : } 0.00 : 4ad890: 66 89 85 be ec ff ff mov %ax,-0x1342(%rbp) 0.00 : 4ad897: e9 c3 fb ff ff jmpq 4ad45f <_bt_first+0x1cf> : { : /* : * Empty index. Lock the whole relation, as nothing finer to lock : * exists. : */ : PredicateLockRelation(rel, scan->xs_snapshot); 0.00 : 4ad89c: 48 8b 8d a0 ec ff ff mov -0x1360(%rbp),%rcx 0.00 : 4ad8a3: 4c 89 ef mov %r13,%rdi 0.00 : 4ad8a6: 48 8b 71 10 mov 0x10(%rcx),%rsi 0.00 : 4ad8aa: e8 21 6d 1e 00 callq 6945d0 : so->currPos.buf = InvalidBuffer; 0.00 : 4ad8af: 41 c7 46 54 00 00 00 movl $0x0,0x54(%r14) 0.00 : 4ad8b6: 00 0.00 : 4ad8b7: 31 d2 xor %edx,%edx 0.00 : 4ad8b9: e9 04 fb ff ff jmpq 4ad3c2 <_bt_first+0x132> : } : else if (ScanDirectionIsBackward(dir)) : { : Assert(P_RIGHTMOST(opaque)); : : start = PageGetMaxOffsetNumber(page); 0.00 : 4ad8be: 0f b7 c0 movzwl %ax,%eax 0.00 : 4ad8c1: 48 83 e8 18 sub $0x18,%rax 0.00 : 4ad8c5: 48 c1 e8 02 shr $0x2,%rax 0.00 : 4ad8c9: 0f b7 d0 movzwl %ax,%edx 0.00 : 4ad8cc: e9 f9 fe ff ff jmpq 4ad7ca <_bt_first+0x53a> 0.00 : 4ad8d1: 48 8d 95 c0 f5 ff ff lea -0xa40(%rbp),%rdx : * : * If goback = true, we will then step back one item, while if : * goback = false, we will start the scan on the located item. : *---------- : */ : switch (strat_total) 0.00 : 4ad8d8: 45 31 ed xor %r13d,%r13d 0.00 : 4ad8db: 41 bc 01 00 00 00 mov $0x1,%r12d 0.00 : 4ad8e1: 48 89 95 90 ec ff ff mov %rdx,-0x1370(%rbp) 0.00 : 4ad8e8: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 4ad8ef: 00 : : /* : * Use the manufactured insertion scan key to descend the tree and : * position ourselves on the target leaf page. : */ : stack = _bt_search(rel, keysCount, scankeys, nextkey, &buf, BT_READ); 0.00 : 4ad8f0: 48 8b 95 90 ec ff ff mov -0x1370(%rbp),%rdx 0.00 : 4ad8f7: 48 8b bd a8 ec ff ff mov -0x1358(%rbp),%rdi 0.00 : 4ad8fe: 4c 8d 45 cc lea -0x34(%rbp),%r8 0.00 : 4ad902: 44 89 e1 mov %r12d,%ecx 0.00 : 4ad905: 41 b9 01 00 00 00 mov $0x1,%r9d 0.00 : 4ad90b: 44 89 fe mov %r15d,%esi 0.00 : 4ad90e: e8 ed f7 ff ff callq 4ad100 <_bt_search> 0.00 : 4ad913: 48 89 c7 mov %rax,%rdi : : /* don't need to keep the stack around... */ : _bt_freestack(stack); 0.00 : 4ad916: e8 55 1f 00 00 callq 4af870 <_bt_freestack> : : /* remember which buffer we have pinned, if any */ : so->currPos.buf = buf; 0.00 : 4ad91b: 8b 45 cc mov -0x34(%rbp),%eax 0.00 : 4ad91e: 48 8b 8d b0 ec ff ff mov -0x1350(%rbp),%rcx 0.00 : 4ad925: 89 41 54 mov %eax,0x54(%rcx) : : if (!BufferIsValid(buf)) 0.00 : 4ad928: 8b 7d cc mov -0x34(%rbp),%edi 0.00 : 4ad92b: 85 ff test %edi,%edi 0.00 : 4ad92d: 0f 84 95 01 00 00 je 4adac8 <_bt_first+0x838> : */ : PredicateLockRelation(rel, scan->xs_snapshot); : return false; : } : else : PredicateLockPage(rel, BufferGetBlockNumber(buf), 0.00 : 4ad933: 48 8b 95 a0 ec ff ff mov -0x1360(%rbp),%rdx 0.00 : 4ad93a: 48 8b 5a 10 mov 0x10(%rdx),%rbx 0.00 : 4ad93e: e8 ed 66 1c 00 callq 674030 0.00 : 4ad943: 48 8b bd a8 ec ff ff mov -0x1358(%rbp),%rdi 0.00 : 4ad94a: 89 c6 mov %eax,%esi 0.00 : 4ad94c: 48 89 da mov %rbx,%rdx 0.00 : 4ad94f: e8 0c 59 1e 00 callq 693260 : scan->xs_snapshot); : : /* initialize moreLeft/moreRight appropriately for scan direction */ : if (ScanDirectionIsForward(dir)) 0.00 : 4ad954: 83 bd 9c ec ff ff 01 cmpl $0x1,-0x1364(%rbp) 0.00 : 4ad95b: 0f 84 85 01 00 00 je 4adae6 <_bt_first+0x856> : so->currPos.moreLeft = false; : so->currPos.moreRight = true; : } : else : { : so->currPos.moreLeft = true; 0.00 : 4ad961: 48 8b 85 b0 ec ff ff mov -0x1350(%rbp),%rax 0.00 : 4ad968: c6 40 5c 01 movb $0x1,0x5c(%rax) : so->currPos.moreRight = false; 0.00 : 4ad96c: c6 40 5d 00 movb $0x0,0x5d(%rax) : } : so->numKilled = 0; /* just paranoia */ 0.00 : 4ad970: 48 8b 95 b0 ec ff ff mov -0x1350(%rbp),%rdx : so->markItemIndex = -1; /* ditto */ : : /* position to the precise item on the page */ : offnum = _bt_binsrch(rel, buf, keysCount, scankeys, nextkey); 0.00 : 4ad977: 45 89 e0 mov %r12d,%r8d : else : { : so->currPos.moreLeft = true; : so->currPos.moreRight = false; : } : so->numKilled = 0; /* just paranoia */ 0.00 : 4ad97a: c7 42 38 00 00 00 00 movl $0x0,0x38(%rdx) : so->markItemIndex = -1; /* ditto */ 0.00 : 4ad981: c7 42 50 ff ff ff ff movl $0xffffffff,0x50(%rdx) : : /* position to the precise item on the page */ : offnum = _bt_binsrch(rel, buf, keysCount, scankeys, nextkey); 0.00 : 4ad988: 44 89 fa mov %r15d,%edx 0.00 : 4ad98b: 8b 75 cc mov -0x34(%rbp),%esi 0.00 : 4ad98e: 48 8b 8d 90 ec ff ff mov -0x1370(%rbp),%rcx 0.00 : 4ad995: 48 8b bd a8 ec ff ff mov -0x1358(%rbp),%rdi 0.00 : 4ad99c: e8 bf f4 ff ff callq 4ace60 <_bt_binsrch> : * this results in an offset before the first item or after the last one, : * _bt_readpage will report no items found, and then we'll step to the : * next page as needed.) : */ : if (goback) : offnum = OffsetNumberPrev(offnum); 0.00 : 4ad9a1: 41 80 fd 01 cmp $0x1,%r13b : : /* : * Now load data from the first page of the scan. : */ : if (!_bt_readpage(scan, dir, offnum)) 0.00 : 4ad9a5: 8b b5 9c ec ff ff mov -0x1364(%rbp),%esi 0.00 : 4ad9ab: 48 8b bd a0 ec ff ff mov -0x1360(%rbp),%rdi : * this results in an offset before the first item or after the last one, : * _bt_readpage will report no items found, and then we'll step to the : * next page as needed.) : */ : if (goback) : offnum = OffsetNumberPrev(offnum); 0.00 : 4ad9b2: 66 83 d0 ff adc $0xffff,%ax : : /* : * Now load data from the first page of the scan. : */ : if (!_bt_readpage(scan, dir, offnum)) 0.00 : 4ad9b6: 0f b7 d0 movzwl %ax,%edx 0.00 : 4ad9b9: e8 22 ea ff ff callq 4ac3e0 <_bt_readpage> 0.00 : 4ad9be: 84 c0 test %al,%al 0.00 : 4ad9c0: 75 1a jne 4ad9dc <_bt_first+0x74c> : { : /* : * There's no actually-matching data on this page. Try to advance to : * the next page. Return false if there's no matching data at all. : */ : if (!_bt_steppage(scan, dir)) 0.00 : 4ad9c2: 8b b5 9c ec ff ff mov -0x1364(%rbp),%esi 0.00 : 4ad9c8: 48 8b bd a0 ec ff ff mov -0x1360(%rbp),%rdi 0.00 : 4ad9cf: e8 ac ec ff ff callq 4ac680 <_bt_steppage> 0.00 : 4ad9d4: 84 c0 test %al,%al 0.00 : 4ad9d6: 0f 84 e4 f9 ff ff je 4ad3c0 <_bt_first+0x130> : return false; : } : : /* Drop the lock, but not pin, on the current page */ : LockBuffer(so->currPos.buf, BUFFER_LOCK_UNLOCK); 0.00 : 4ad9dc: 48 8b 8d b0 ec ff ff mov -0x1350(%rbp),%rcx 0.00 : 4ad9e3: 31 f6 xor %esi,%esi 0.00 : 4ad9e5: 8b 79 54 mov 0x54(%rcx),%edi 0.00 : 4ad9e8: e8 23 6d 1c 00 callq 674710 : : /* OK, itemIndex says what to return */ : currItem = &so->currPos.items[so->currPos.itemIndex]; 0.00 : 4ad9ed: 48 8b 95 b0 ec ff ff mov -0x1350(%rbp),%rdx 0.00 : 4ad9f4: 48 63 42 6c movslq 0x6c(%rdx),%rax : scan->xs_ctup.t_self = currItem->heapTid; 0.00 : 4ad9f8: 48 8d 04 80 lea (%rax,%rax,4),%rax 0.00 : 4ad9fc: 48 8d 4c 42 60 lea 0x60(%rdx,%rax,2),%rcx 0.00 : 4ada01: 48 8b 95 a0 ec ff ff mov -0x1360(%rbp),%rdx 0.00 : 4ada08: 8b 41 10 mov 0x10(%rcx),%eax 0.00 : 4ada0b: 89 42 54 mov %eax,0x54(%rdx) /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:1017 25.00 : 4ada0e: 0f b7 41 14 movzwl 0x14(%rcx),%eax 0.00 : 4ada12: 66 89 42 58 mov %ax,0x58(%rdx) : if (scan->xs_want_itup) 0.00 : 4ada16: 48 8b 85 a0 ec ff ff mov -0x1360(%rbp),%rax 0.00 : 4ada1d: ba 01 00 00 00 mov $0x1,%edx 0.00 : 4ada22: 80 78 30 00 cmpb $0x0,0x30(%rax) 0.00 : 4ada26: 0f 84 96 f9 ff ff je 4ad3c2 <_bt_first+0x132> : scan->xs_itup = (IndexTuple) (so->currTuples + currItem->tupleOffset); 0.00 : 4ada2c: 48 8b 95 b0 ec ff ff mov -0x1350(%rbp),%rdx 0.00 : 4ada33: 0f b7 41 18 movzwl 0x18(%rcx),%eax 0.00 : 4ada37: 48 8b 8d a0 ec ff ff mov -0x1360(%rbp),%rcx 0.00 : 4ada3e: 48 03 42 40 add 0x40(%rdx),%rax 0.00 : 4ada42: ba 01 00 00 00 mov $0x1,%edx 0.00 : 4ada47: 48 89 41 40 mov %rax,0x40(%rcx) 0.00 : 4ada4b: e9 72 f9 ff ff jmpq 4ad3c2 <_bt_first+0x132> : : /* : * If a backward scan was specified, need to start with last equal : * item not first one. : */ : if (ScanDirectionIsBackward(dir)) /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:890 25.00 : 4ada50: 83 bd 9c ec ff ff ff cmpl $0xffffffff,-0x1364(%rbp) 25.00 : 4ada57: 48 8d 85 c0 f5 ff ff lea -0xa40(%rbp),%rax 0.00 : 4ada5e: 48 89 85 90 ec ff ff mov %rax,-0x1370(%rbp) 0.00 : 4ada65: 0f 84 c6 00 00 00 je 4adb31 <_bt_first+0x8a1> : goback = false; : break; : : default: : /* can't get here, but keep compiler quiet */ : elog(ERROR, "unrecognized strat_total: %d", (int) strat_total); 0.00 : 4ada6b: 45 31 ed xor %r13d,%r13d 0.00 : 4ada6e: 45 31 e4 xor %r12d,%r12d 0.00 : 4ada71: e9 7a fe ff ff jmpq 4ad8f0 <_bt_first+0x660> 0.00 : 4ada76: 48 8d 8d c0 f5 ff ff lea -0xa40(%rbp),%rcx : * : * If goback = true, we will then step back one item, while if : * goback = false, we will start the scan on the located item. : *---------- : */ : switch (strat_total) 0.00 : 4ada7d: 41 bd 01 00 00 00 mov $0x1,%r13d 0.00 : 4ada83: 45 31 e4 xor %r12d,%r12d 0.00 : 4ada86: 48 89 8d 90 ec ff ff mov %rcx,-0x1370(%rbp) 0.00 : 4ada8d: e9 5e fe ff ff jmpq 4ad8f0 <_bt_first+0x660> 0.00 : 4ada92: 48 8d 8d c0 f5 ff ff lea -0xa40(%rbp),%rcx 0.00 : 4ada99: 48 89 8d 90 ec ff ff mov %rcx,-0x1370(%rbp) 0.00 : 4adaa0: eb c9 jmp 4ada6b <_bt_first+0x7db> 0.00 : 4adaa2: 48 8d 85 c0 f5 ff ff lea -0xa40(%rbp),%rax 0.00 : 4adaa9: 48 89 85 90 ec ff ff mov %rax,-0x1370(%rbp) : goback = false; : break; : : default: : /* can't get here, but keep compiler quiet */ : elog(ERROR, "unrecognized strat_total: %d", (int) strat_total); 0.00 : 4adab0: 41 bd 01 00 00 00 mov $0x1,%r13d 0.00 : 4adab6: 41 bc 01 00 00 00 mov $0x1,%r12d 0.00 : 4adabc: e9 2f fe ff ff jmpq 4ad8f0 <_bt_first+0x660> 0.00 : 4adac1: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : { : /* : * We only get here if the index is completely empty. Lock relation : * because nothing finer to lock exists. : */ : PredicateLockRelation(rel, scan->xs_snapshot); 0.00 : 4adac8: 48 8b 85 a0 ec ff ff mov -0x1360(%rbp),%rax 0.00 : 4adacf: 48 8b bd a8 ec ff ff mov -0x1358(%rbp),%rdi 0.00 : 4adad6: 48 8b 70 10 mov 0x10(%rax),%rsi 0.00 : 4adada: e8 f1 6a 1e 00 callq 6945d0 0.00 : 4adadf: 31 d2 xor %edx,%edx : scan->xs_ctup.t_self = currItem->heapTid; : if (scan->xs_want_itup) : scan->xs_itup = (IndexTuple) (so->currTuples + currItem->tupleOffset); : : return true; : } 0.00 : 4adae1: e9 dc f8 ff ff jmpq 4ad3c2 <_bt_first+0x132> : scan->xs_snapshot); : : /* initialize moreLeft/moreRight appropriately for scan direction */ : if (ScanDirectionIsForward(dir)) : { : so->currPos.moreLeft = false; 0.00 : 4adae6: 48 8b 8d b0 ec ff ff mov -0x1350(%rbp),%rcx 0.00 : 4adaed: c6 41 5c 00 movb $0x0,0x5c(%rcx) : so->currPos.moreRight = true; /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:965 25.00 : 4adaf1: c6 41 5d 01 movb $0x1,0x5d(%rcx) 0.00 : 4adaf5: e9 76 fe ff ff jmpq 4ad970 <_bt_first+0x6e0> : if (ScanDirectionIsForward(dir)) : { : /* There could be dead pages to the left, so not this: */ : /* Assert(P_LEFTMOST(opaque)); */ : : start = P_FIRSTDATAKEY(opaque); 0.00 : 4adafa: 0f b7 c0 movzwl %ax,%eax 0.00 : 4adafd: 83 7c 02 04 01 cmpl $0x1,0x4(%rdx,%rax,1) : elog(ERROR, "invalid scan direction: %d", (int) dir); : start = 0; /* keep compiler quiet */ : } : : /* remember which buffer we have pinned */ : so->currPos.buf = buf; 0.00 : 4adb02: 45 89 66 54 mov %r12d,0x54(%r14) : : /* initialize moreLeft/moreRight appropriately for scan direction */ : if (ScanDirectionIsForward(dir)) : { : so->currPos.moreLeft = false; 0.00 : 4adb06: 41 c6 46 5c 00 movb $0x0,0x5c(%r14) : so->currPos.moreRight = true; 0.00 : 4adb0b: 41 c6 46 5d 01 movb $0x1,0x5d(%r14) : if (ScanDirectionIsForward(dir)) : { : /* There could be dead pages to the left, so not this: */ : /* Assert(P_LEFTMOST(opaque)); */ : : start = P_FIRSTDATAKEY(opaque); 0.00 : 4adb10: 19 d2 sbb %edx,%edx 0.00 : 4adb12: 83 c2 02 add $0x2,%edx 0.00 : 4adb15: e9 be fc ff ff jmpq 4ad7d8 <_bt_first+0x548> : so->currPos.buf = InvalidBuffer; : return false; : } : : PredicateLockPage(rel, BufferGetBlockNumber(buf), scan->xs_snapshot); : page = BufferGetPage(buf); 0.00 : 4adb1a: 44 89 e0 mov %r12d,%eax 0.00 : 4adb1d: 48 8b 15 f4 f5 6c 00 mov 0x6cf5f4(%rip),%rdx # b7d118 0.00 : 4adb24: f7 d0 not %eax 0.00 : 4adb26: 48 98 cltq 0.00 : 4adb28: 48 8b 14 c2 mov (%rdx,%rax,8),%rdx 0.00 : 4adb2c: e9 6b fc ff ff jmpq 4ad79c <_bt_first+0x50c> 0.00 : 4adb31: 48 8d 95 c0 f5 ff ff lea -0xa40(%rbp),%rdx 0.00 : 4adb38: 48 89 95 90 ec ff ff mov %rdx,-0x1370(%rbp) 0.00 : 4adb3f: e9 6c ff ff ff jmpq 4adab0 <_bt_first+0x820> : cmp_proc = get_opfamily_proc(rel->rd_opfamily[i], : rel->rd_opcintype[i], : cur->sk_subtype, : BTORDER_PROC); : if (!RegProcedureIsValid(cmp_proc)) : elog(ERROR, "missing support function %d(%u,%u) for attribute %d of index \"%s\"", 0.00 : 4adb44: ba df 48 7b 00 mov $0x7b48df,%edx 0.00 : 4adb49: be 40 03 00 00 mov $0x340,%esi 0.00 : 4adb4e: bf 70 47 7b 00 mov $0x7b4770,%edi 0.00 : 4adb53: e8 c8 d8 2c 00 callq 77b420 0.00 : 4adb58: 48 8b 95 a8 ec ff ff mov -0x1358(%rbp),%rdx 0.00 : 4adb5f: 45 0f bf 4c 24 04 movswl 0x4(%r12),%r9d 0.00 : 4adb65: be 18 48 7b 00 mov $0x7b4818,%esi 0.00 : 4adb6a: 45 8b 44 24 08 mov 0x8(%r12),%r8d 0.00 : 4adb6f: bf 14 00 00 00 mov $0x14,%edi 0.00 : 4adb74: 48 8b 82 d0 00 00 00 mov 0xd0(%rdx),%rax 0.00 : 4adb7b: 42 8b 0c 30 mov (%rax,%r14,1),%ecx 0.00 : 4adb7f: 48 8b 42 30 mov 0x30(%rdx),%rax 0.00 : 4adb83: ba 01 00 00 00 mov $0x1,%edx 0.00 : 4adb88: 48 89 04 24 mov %rax,(%rsp) 0.00 : 4adb8c: 31 c0 xor %eax,%eax 0.00 : 4adb8e: e8 9d d6 2c 00 callq 77b230 0.00 : 4adb93: e8 38 b9 fb ff callq 4694d0 : break; : } : } : if (!used_all_subkeys) : { : switch (strat_total) 0.00 : 4adb98: 66 83 bd be ec ff ff cmpw $0x1,-0x1342(%rbp) 0.00 : 4adb9f: 01 0.00 : 4adba0: 0f 84 0a ff ff ff je 4adab0 <_bt_first+0x820> 0.00 : 4adba6: 66 83 bd be ec ff ff cmpw $0x5,-0x1342(%rbp) 0.00 : 4adbad: 05 0.00 : 4adbae: 0f 85 70 fa ff ff jne 4ad624 <_bt_first+0x394> 0.00 : 4adbb4: e9 b2 fe ff ff jmpq 4ada6b <_bt_first+0x7db> : : start = PageGetMaxOffsetNumber(page); : } : else : { : elog(ERROR, "invalid scan direction: %d", (int) dir); 0.00 : 4adbb9: ba e9 48 7b 00 mov $0x7b48e9,%edx 0.00 : 4adbbe: be 44 06 00 00 mov $0x644,%esi 0.00 : 4adbc3: bf 70 47 7b 00 mov $0x7b4770,%edi 0.00 : 4adbc8: e8 53 d8 2c 00 callq 77b420 0.00 : 4adbcd: 8b 95 9c ec ff ff mov -0x1364(%rbp),%edx 0.00 : 4adbd3: be 7c 47 7b 00 mov $0x7b477c,%esi 0.00 : 4adbd8: bf 14 00 00 00 mov $0x14,%edi 0.00 : 4adbdd: 31 c0 xor %eax,%eax 0.00 : 4adbdf: e8 4c d6 2c 00 callq 77b230 0.00 : 4adbe4: e8 e7 b8 fb ff callq 4694d0 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 25.00 /home/Computational/mark/src/postgres-andres/src/backend/access/transam/transam.c:301 25.00 /home/Computational/mark/src/postgres-andres/src/backend/access/transam/transam.c:308 25.00 /home/Computational/mark/src/postgres-andres/src/backend/access/transam/transam.c:308 25.00 /home/Computational/mark/src/postgres-andres/src/backend/access/transam/transam.c:312 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000004bffe0 : : /* : * TransactionIdPrecedes --- is id1 logically < id2? : */ : bool : TransactionIdPrecedes(TransactionId id1, TransactionId id2) : { /home/Computational/mark/src/postgres-andres/src/backend/access/transam/transam.c:301 25.00 : 4bffe0: 55 push %rbp : * If either ID is a permanent XID then we can just do unsigned : * comparison. If both are normal, do a modulo-2^32 comparison. : */ : int32 diff; : : if (!TransactionIdIsNormal(id1) || !TransactionIdIsNormal(id2)) /home/Computational/mark/src/postgres-andres/src/backend/access/transam/transam.c:308 25.00 : 4bffe1: 83 ff 02 cmp $0x2,%edi : /* : * TransactionIdPrecedes --- is id1 logically < id2? : */ : bool : TransactionIdPrecedes(TransactionId id1, TransactionId id2) : { 0.00 : 4bffe4: 48 89 e5 mov %rsp,%rbp : * If either ID is a permanent XID then we can just do unsigned : * comparison. If both are normal, do a modulo-2^32 comparison. : */ : int32 diff; : : if (!TransactionIdIsNormal(id1) || !TransactionIdIsNormal(id2)) 25.00 : 4bffe7: 76 17 jbe 4c0000 0.00 : 4bffe9: 83 fe 02 cmp $0x2,%esi 0.00 : 4bffec: 76 12 jbe 4c0000 : return (id1 < id2); : : diff = (int32) (id1 - id2); : return (diff < 0); 0.00 : 4bffee: 29 f7 sub %esi,%edi : } 0.00 : 4bfff0: c9 leaveq : : if (!TransactionIdIsNormal(id1) || !TransactionIdIsNormal(id2)) : return (id1 < id2); : : diff = (int32) (id1 - id2); : return (diff < 0); 0.00 : 4bfff1: 89 f8 mov %edi,%eax /home/Computational/mark/src/postgres-andres/src/backend/access/transam/transam.c:312 25.00 : 4bfff3: c1 e8 1f shr $0x1f,%eax : } 0.00 : 4bfff6: c3 retq 0.00 : 4bfff7: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 4bfffe: 00 00 : * comparison. If both are normal, do a modulo-2^32 comparison. : */ : int32 diff; : : if (!TransactionIdIsNormal(id1) || !TransactionIdIsNormal(id2)) : return (id1 < id2); 0.00 : 4c0000: 39 f7 cmp %esi,%edi : : diff = (int32) (id1 - id2); : return (diff < 0); : } 0.00 : 4c0002: c9 leaveq : * comparison. If both are normal, do a modulo-2^32 comparison. : */ : int32 diff; : : if (!TransactionIdIsNormal(id1) || !TransactionIdIsNormal(id2)) : return (id1 < id2); 0.00 : 4c0003: 0f 92 c0 setb %al Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 50.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:5386 25.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:5403 25.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:5450 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000005ad000 : : * data will be valid, he must call ExecMaterializeSlot on the : * result slot. : */ : TupleTableSlot * : ExecProject(ProjectionInfo *projInfo, ExprDoneCond *isDone) : { 0.00 : 5ad000: 55 push %rbp /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:5386 50.00 : 5ad001: 48 89 e5 mov %rsp,%rbp 0.00 : 5ad004: 41 57 push %r15 0.00 : 5ad006: 41 56 push %r14 0.00 : 5ad008: 41 55 push %r13 0.00 : 5ad00a: 41 54 push %r12 0.00 : 5ad00c: 53 push %rbx 0.00 : 5ad00d: 48 89 fb mov %rdi,%rbx 0.00 : 5ad010: 48 83 ec 48 sub $0x48,%rsp 0.00 : 5ad014: 48 89 75 90 mov %rsi,-0x70(%rbp) : Assert(projInfo != NULL); : : /* : * get the projection info we want : */ : slot = projInfo->pi_slot; 0.00 : 5ad018: 48 8b 47 18 mov 0x18(%rdi),%rax : econtext = projInfo->pi_exprContext; : : /* Assume single result row until proven otherwise */ : if (isDone) /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:5403 25.00 : 5ad01c: 48 85 f6 test %rsi,%rsi : Assert(projInfo != NULL); : : /* : * get the projection info we want : */ : slot = projInfo->pi_slot; 0.00 : 5ad01f: 48 89 45 b0 mov %rax,-0x50(%rbp) : econtext = projInfo->pi_exprContext; 0.00 : 5ad023: 4c 8b 77 10 mov 0x10(%rdi),%r14 : : /* Assume single result row until proven otherwise */ : if (isDone) 0.00 : 5ad027: 74 06 je 5ad02f : *isDone = ExprSingleResult; 0.00 : 5ad029: c7 06 00 00 00 00 movl $0x0,(%rsi) : /* : * Clear any former contents of the result slot. This makes it safe for : * us to use the slot's Datum/isnull arrays as workspace. (Also, we can : * return the slot as-is if we decide no rows can be projected.) : */ : ExecClearTuple(slot); 0.00 : 5ad02f: 48 8b 7d b0 mov -0x50(%rbp),%rdi 0.00 : 5ad033: e8 d8 70 00 00 callq 5b4110 : /* : * Force extraction of all input values that we'll need. The : * Var-extraction loops below depend on this, and we are also prefetching : * all attributes that will be referenced in the generic expressions. : */ : if (projInfo->pi_lastInnerVar > 0) 0.00 : 5ad038: 8b 73 48 mov 0x48(%rbx),%esi 0.00 : 5ad03b: 85 f6 test %esi,%esi 0.00 : 5ad03d: 7e 09 jle 5ad048 : slot_getsomeattrs(econtext->ecxt_innertuple, 0.00 : 5ad03f: 49 8b 7e 10 mov 0x10(%r14),%rdi 0.00 : 5ad043: e8 18 22 ec ff callq 46f260 : projInfo->pi_lastInnerVar); : if (projInfo->pi_lastOuterVar > 0) 0.00 : 5ad048: 8b 73 4c mov 0x4c(%rbx),%esi 0.00 : 5ad04b: 85 f6 test %esi,%esi 0.00 : 5ad04d: 7e 09 jle 5ad058 : slot_getsomeattrs(econtext->ecxt_outertuple, 0.00 : 5ad04f: 49 8b 7e 18 mov 0x18(%r14),%rdi 0.00 : 5ad053: e8 08 22 ec ff callq 46f260 : projInfo->pi_lastOuterVar); : if (projInfo->pi_lastScanVar > 0) 0.00 : 5ad058: 8b 73 50 mov 0x50(%rbx),%esi 0.00 : 5ad05b: 85 f6 test %esi,%esi 0.00 : 5ad05d: 7e 09 jle 5ad068 : slot_getsomeattrs(econtext->ecxt_scantuple, 0.00 : 5ad05f: 49 8b 7e 08 mov 0x8(%r14),%rdi 0.00 : 5ad063: e8 f8 21 ec ff callq 46f260 : : /* : * Assign simple Vars to result by direct extraction of fields from source : * slots ... a mite ugly, but fast ... : */ : numSimpleVars = projInfo->pi_numSimpleVars; 0.00 : 5ad068: 44 8b 43 2c mov 0x2c(%rbx),%r8d : if (numSimpleVars > 0) 0.00 : 5ad06c: 45 85 c0 test %r8d,%r8d 0.00 : 5ad06f: 7e 5d jle 5ad0ce : bool *isnull = slot->tts_isnull; : int *varSlotOffsets = projInfo->pi_varSlotOffsets; : int *varNumbers = projInfo->pi_varNumbers; : int i; : : if (projInfo->pi_directMap) 0.00 : 5ad071: 80 7b 28 00 cmpb $0x0,0x28(%rbx) : * slots ... a mite ugly, but fast ... : */ : numSimpleVars = projInfo->pi_numSimpleVars; : if (numSimpleVars > 0) : { : Datum *values = slot->tts_values; 0.00 : 5ad075: 48 8b 55 b0 mov -0x50(%rbp),%rdx : bool *isnull = slot->tts_isnull; : int *varSlotOffsets = projInfo->pi_varSlotOffsets; 0.00 : 5ad079: 4c 8b 5b 30 mov 0x30(%rbx),%r11 : int *varNumbers = projInfo->pi_varNumbers; 0.00 : 5ad07d: 4c 8b 53 38 mov 0x38(%rbx),%r10 : * slots ... a mite ugly, but fast ... : */ : numSimpleVars = projInfo->pi_numSimpleVars; : if (numSimpleVars > 0) : { : Datum *values = slot->tts_values; 0.00 : 5ad081: 4c 8b 6a 28 mov 0x28(%rdx),%r13 : bool *isnull = slot->tts_isnull; 0.00 : 5ad085: 4c 8b 62 30 mov 0x30(%rdx),%r12 : int *varSlotOffsets = projInfo->pi_varSlotOffsets; : int *varNumbers = projInfo->pi_varNumbers; : int i; : : if (projInfo->pi_directMap) 0.00 : 5ad089: 0f 84 e1 01 00 00 je 5ad270 0.00 : 5ad08f: 4c 89 df mov %r11,%rdi 0.00 : 5ad092: 31 f6 xor %esi,%esi 0.00 : 5ad094: 0f 1f 40 00 nopl 0x0(%rax) : { : /* especially simple case where vars go to output in order */ : for (i = 0; i < numSimpleVars; i++) : { : char *slotptr = ((char *) econtext) + varSlotOffsets[i]; : TupleTableSlot *varSlot = *((TupleTableSlot **) slotptr); 0.00 : 5ad098: 48 63 07 movslq (%rdi),%rax : int varNumber = varNumbers[i] - 1; : : values[i] = varSlot->tts_values[varNumber]; : isnull[i] = varSlot->tts_isnull[varNumber]; 0.00 : 5ad09b: 48 83 c7 04 add $0x4,%rdi : { : /* especially simple case where vars go to output in order */ : for (i = 0; i < numSimpleVars; i++) : { : char *slotptr = ((char *) econtext) + varSlotOffsets[i]; : TupleTableSlot *varSlot = *((TupleTableSlot **) slotptr); 0.00 : 5ad09f: 49 8b 0c 06 mov (%r14,%rax,1),%rcx : int varNumber = varNumbers[i] - 1; : : values[i] = varSlot->tts_values[varNumber]; 0.00 : 5ad0a3: 41 8b 04 b2 mov (%r10,%rsi,4),%eax /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:5450 25.00 : 5ad0a7: 48 8b 51 28 mov 0x28(%rcx),%rdx 0.00 : 5ad0ab: 83 e8 01 sub $0x1,%eax 0.00 : 5ad0ae: 48 98 cltq 0.00 : 5ad0b0: 48 8b 14 c2 mov (%rdx,%rax,8),%rdx 0.00 : 5ad0b4: 49 89 54 f5 00 mov %rdx,0x0(%r13,%rsi,8) : isnull[i] = varSlot->tts_isnull[varNumber]; 0.00 : 5ad0b9: 48 8b 51 30 mov 0x30(%rcx),%rdx 0.00 : 5ad0bd: 0f b6 04 02 movzbl (%rdx,%rax,1),%eax 0.00 : 5ad0c1: 41 88 04 34 mov %al,(%r12,%rsi,1) 0.00 : 5ad0c5: 48 83 c6 01 add $0x1,%rsi : int i; : : if (projInfo->pi_directMap) : { : /* especially simple case where vars go to output in order */ : for (i = 0; i < numSimpleVars; i++) 0.00 : 5ad0c9: 41 39 f0 cmp %esi,%r8d 0.00 : 5ad0cc: 7f ca jg 5ad098 : * If there are any generic expressions, evaluate them. It's possible : * that there are set-returning functions in such expressions; if so and : * we have reached the end of the set, we return the result slot, which we : * already marked empty. : */ : if (projInfo->pi_targetlist) 0.00 : 5ad0ce: 48 8b 43 08 mov 0x8(%rbx),%rax 0.00 : 5ad0d2: 48 85 c0 test %rax,%rax 0.00 : 5ad0d5: 48 89 45 98 mov %rax,-0x68(%rbp) 0.00 : 5ad0d9: 0f 84 fc 00 00 00 je 5ad1db : { : if (!ExecTargetList(projInfo->pi_targetlist, 0.00 : 5ad0df: 48 8b 55 b0 mov -0x50(%rbp),%rdx 0.00 : 5ad0e3: 48 8b 45 b0 mov -0x50(%rbp),%rax 0.00 : 5ad0e7: 4c 8b 7b 20 mov 0x20(%rbx),%r15 0.00 : 5ad0eb: 48 8b 52 30 mov 0x30(%rdx),%rdx 0.00 : 5ad0ef: 48 89 55 a0 mov %rdx,-0x60(%rbp) : #endif /* !PG_USE_INLINE */ : #if defined(PG_USE_INLINE) || defined(MCXT_INCLUDE_DEFINITIONS) : STATIC_IF_INLINE MemoryContext : MemoryContextSwitchTo(MemoryContext context) : { : MemoryContext old = CurrentMemoryContext; 0.00 : 5ad0f3: 48 8b 15 66 d7 60 00 mov 0x60d766(%rip),%rdx # bba860 0.00 : 5ad0fa: 48 8b 40 28 mov 0x28(%rax),%rax 0.00 : 5ad0fe: 48 89 55 c8 mov %rdx,-0x38(%rbp) 0.00 : 5ad102: 48 89 45 a8 mov %rax,-0x58(%rbp) : : CurrentMemoryContext = context; 0.00 : 5ad106: 49 8b 46 28 mov 0x28(%r14),%rax 0.00 : 5ad10a: 48 89 05 4f d7 60 00 mov %rax,0x60d74f(%rip) # bba860 : #endif /* PG_USE_INLINE */ : #if defined(PG_USE_INLINE) || defined(PG_LIST_INCLUDE_DEFINITIONS) : STATIC_IF_INLINE ListCell * : list_head(const List *l) : { : return l ? l->head : NULL; 0.00 : 5ad111: 48 8b 45 98 mov -0x68(%rbp),%rax 0.00 : 5ad115: 4c 8b 68 08 mov 0x8(%rax),%r13 : /* : * evaluate all the expressions in the target list : */ : haveDoneSets = false; /* any exhausted set exprs in tlist? */ : : foreach(tl, targetlist) 0.00 : 5ad119: 4d 85 ed test %r13,%r13 0.00 : 5ad11c: 0f 84 ae 00 00 00 je 5ad1d0 0.00 : 5ad122: c6 45 c7 00 movb $0x0,-0x39(%rbp) 0.00 : 5ad126: eb 15 jmp 5ad13d 0.00 : 5ad128: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 5ad12f: 00 : /* We have a set-valued expression in the tlist */ : if (isDone == NULL) : ereport(ERROR, : (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), : errmsg("set-valued function called in context that cannot accept a set"))); : if (itemIsDone[resind] == ExprMultipleResult) 0.00 : 5ad130: c6 45 c7 01 movb $0x1,-0x39(%rbp) : /* : * evaluate all the expressions in the target list : */ : haveDoneSets = false; /* any exhausted set exprs in tlist? */ : : foreach(tl, targetlist) 0.00 : 5ad134: 4d 8b 6d 08 mov 0x8(%r13),%r13 0.00 : 5ad138: 4d 85 ed test %r13,%r13 0.00 : 5ad13b: 74 63 je 5ad1a0 : { : GenericExprState *gstate = (GenericExprState *) lfirst(tl); 0.00 : 5ad13d: 49 8b 55 00 mov 0x0(%r13),%rdx : TargetEntry *tle = (TargetEntry *) gstate->xprstate.expr; : AttrNumber resind = tle->resno - 1; : : values[resind] = ExecEvalExpr(gstate->arg, 0.00 : 5ad141: 4c 89 f6 mov %r14,%rsi 0.00 : 5ad144: 48 8b 42 08 mov 0x8(%rdx),%rax 0.00 : 5ad148: 0f b7 58 10 movzwl 0x10(%rax),%ebx 0.00 : 5ad14c: 48 8b 42 18 mov 0x18(%rdx),%rax 0.00 : 5ad150: 48 8b 55 a0 mov -0x60(%rbp),%rdx 0.00 : 5ad154: 48 89 c7 mov %rax,%rdi 0.00 : 5ad157: 83 eb 01 sub $0x1,%ebx 0.00 : 5ad15a: 48 0f bf db movswq %bx,%rbx 0.00 : 5ad15e: 4d 8d 24 9f lea (%r15,%rbx,4),%r12 0.00 : 5ad162: 48 01 da add %rbx,%rdx 0.00 : 5ad165: 4c 89 e1 mov %r12,%rcx 0.00 : 5ad168: ff 50 10 callq *0x10(%rax) 0.00 : 5ad16b: 48 8b 55 a8 mov -0x58(%rbp),%rdx 0.00 : 5ad16f: 48 89 04 da mov %rax,(%rdx,%rbx,8) : econtext, : &isnull[resind], : &itemIsDone[resind]); : : if (itemIsDone[resind] != ExprSingleResult) 0.00 : 5ad173: 41 8b 04 24 mov (%r12),%eax 0.00 : 5ad177: 85 c0 test %eax,%eax 0.00 : 5ad179: 74 b9 je 5ad134 : { : /* We have a set-valued expression in the tlist */ : if (isDone == NULL) 0.00 : 5ad17b: 48 83 7d 90 00 cmpq $0x0,-0x70(%rbp) 0.00 : 5ad180: 0f 84 fd 01 00 00 je 5ad383 : ereport(ERROR, : (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), : errmsg("set-valued function called in context that cannot accept a set"))); : if (itemIsDone[resind] == ExprMultipleResult) 0.00 : 5ad186: 83 e8 01 sub $0x1,%eax 0.00 : 5ad189: 75 a5 jne 5ad130 : { : /* we have undone sets in the tlist, set flag */ : *isDone = ExprMultipleResult; 0.00 : 5ad18b: 48 8b 45 90 mov -0x70(%rbp),%rax 0.00 : 5ad18f: c7 00 01 00 00 00 movl $0x1,(%rax) : /* : * evaluate all the expressions in the target list : */ : haveDoneSets = false; /* any exhausted set exprs in tlist? */ : : foreach(tl, targetlist) 0.00 : 5ad195: 4d 8b 6d 08 mov 0x8(%r13),%r13 0.00 : 5ad199: 4d 85 ed test %r13,%r13 0.00 : 5ad19c: 75 9f jne 5ad13d 0.00 : 5ad19e: 66 90 xchg %ax,%ax : haveDoneSets = true; : } : } : } : : if (haveDoneSets) 0.00 : 5ad1a0: 80 7d c7 00 cmpb $0x0,-0x39(%rbp) 0.00 : 5ad1a4: 74 2a je 5ad1d0 : { : /* : * note: can't get here unless we verified isDone != NULL : */ : if (*isDone == ExprSingleResult) 0.00 : 5ad1a6: 48 8b 55 90 mov -0x70(%rbp),%rdx 0.00 : 5ad1aa: 8b 02 mov (%rdx),%eax 0.00 : 5ad1ac: 85 c0 test %eax,%eax 0.00 : 5ad1ae: 0f 84 bc 01 00 00 je 5ad370 0.00 : 5ad1b4: 48 8b 55 98 mov -0x68(%rbp),%rdx 0.00 : 5ad1b8: 4c 8b 6a 08 mov 0x8(%rdx),%r13 : { : /* : * We have some done and some undone sets. Restart the done ones : * so that we can deliver a tuple (if possible). : */ : foreach(tl, targetlist) 0.00 : 5ad1bc: 4d 85 ed test %r13,%r13 0.00 : 5ad1bf: 75 6f jne 5ad230 : * have to cycle the nonempty sets to completion, else resources : * will not be released from subplans etc. : * : * XXX is that still necessary? : */ : if (*isDone == ExprEndResult) 0.00 : 5ad1c1: 83 f8 02 cmp $0x2,%eax 0.00 : 5ad1c4: 0f 84 02 01 00 00 je 5ad2cc 0.00 : 5ad1ca: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 5ad1d0: 48 8b 45 c8 mov -0x38(%rbp),%rax 0.00 : 5ad1d4: 48 89 05 85 d6 60 00 mov %rax,0x60d685(%rip) # bba860 : : /* : * Successfully formed a result row. Mark the result slot as containing a : * valid virtual tuple. : */ : return ExecStoreVirtualTuple(slot); 0.00 : 5ad1db: 48 8b 7d b0 mov -0x50(%rbp),%rdi : } 0.00 : 5ad1df: 48 83 c4 48 add $0x48,%rsp 0.00 : 5ad1e3: 5b pop %rbx 0.00 : 5ad1e4: 41 5c pop %r12 0.00 : 5ad1e6: 41 5d pop %r13 0.00 : 5ad1e8: 41 5e pop %r14 0.00 : 5ad1ea: 41 5f pop %r15 0.00 : 5ad1ec: c9 leaveq : : /* : * Successfully formed a result row. Mark the result slot as containing a : * valid virtual tuple. : */ : return ExecStoreVirtualTuple(slot); 0.00 : 5ad1ed: e9 2e 68 00 00 jmpq 5b3a20 0.00 : 5ad1f2: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : TargetEntry *tle = (TargetEntry *) gstate->xprstate.expr; : AttrNumber resind = tle->resno - 1; : : if (itemIsDone[resind] == ExprEndResult) : { : values[resind] = ExecEvalExpr(gstate->arg, 0.00 : 5ad1f8: 48 8b 42 18 mov 0x18(%rdx),%rax 0.00 : 5ad1fc: 48 8b 55 a0 mov -0x60(%rbp),%rdx 0.00 : 5ad200: 4c 89 e1 mov %r12,%rcx 0.00 : 5ad203: 4c 89 f6 mov %r14,%rsi 0.00 : 5ad206: 48 01 da add %rbx,%rdx 0.00 : 5ad209: 48 89 c7 mov %rax,%rdi 0.00 : 5ad20c: ff 50 10 callq *0x10(%rax) 0.00 : 5ad20f: 48 8b 55 a8 mov -0x58(%rbp),%rdx 0.00 : 5ad213: 48 89 04 da mov %rax,(%rdx,%rbx,8) : econtext, : &isnull[resind], : &itemIsDone[resind]); : : if (itemIsDone[resind] == ExprEndResult) 0.00 : 5ad217: 41 83 3c 24 02 cmpl $0x2,(%r12) 0.00 : 5ad21c: 0f 84 a0 00 00 00 je 5ad2c2 : { : /* : * We have some done and some undone sets. Restart the done ones : * so that we can deliver a tuple (if possible). : */ : foreach(tl, targetlist) 0.00 : 5ad222: 4d 8b 6d 08 mov 0x8(%r13),%r13 0.00 : 5ad226: 4d 85 ed test %r13,%r13 0.00 : 5ad229: 74 2c je 5ad257 0.00 : 5ad22b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : { : GenericExprState *gstate = (GenericExprState *) lfirst(tl); 0.00 : 5ad230: 49 8b 55 00 mov 0x0(%r13),%rdx : TargetEntry *tle = (TargetEntry *) gstate->xprstate.expr; : AttrNumber resind = tle->resno - 1; : : if (itemIsDone[resind] == ExprEndResult) 0.00 : 5ad234: 48 8b 42 08 mov 0x8(%rdx),%rax 0.00 : 5ad238: 0f b7 40 10 movzwl 0x10(%rax),%eax 0.00 : 5ad23c: 83 e8 01 sub $0x1,%eax 0.00 : 5ad23f: 48 0f bf d8 movswq %ax,%rbx 0.00 : 5ad243: 4d 8d 24 9f lea (%r15,%rbx,4),%r12 0.00 : 5ad247: 41 83 3c 24 02 cmpl $0x2,(%r12) 0.00 : 5ad24c: 74 aa je 5ad1f8 : { : /* : * We have some done and some undone sets. Restart the done ones : * so that we can deliver a tuple (if possible). : */ : foreach(tl, targetlist) 0.00 : 5ad24e: 4d 8b 6d 08 mov 0x8(%r13),%r13 0.00 : 5ad252: 4d 85 ed test %r13,%r13 0.00 : 5ad255: 75 d9 jne 5ad230 0.00 : 5ad257: 48 8b 55 90 mov -0x70(%rbp),%rdx 0.00 : 5ad25b: 8b 02 mov (%rdx),%eax : * have to cycle the nonempty sets to completion, else resources : * will not be released from subplans etc. : * : * XXX is that still necessary? : */ : if (*isDone == ExprEndResult) 0.00 : 5ad25d: 83 f8 02 cmp $0x2,%eax 0.00 : 5ad260: 0f 85 6a ff ff ff jne 5ad1d0 0.00 : 5ad266: eb 64 jmp 5ad2cc 0.00 : 5ad268: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 5ad26f: 00 : } : } : else : { : /* we have to pay attention to varOutputCols[] */ : int *varOutputCols = projInfo->pi_varOutputCols; 0.00 : 5ad270: 4c 8b 4b 40 mov 0x40(%rbx),%r9 0.00 : 5ad274: 31 ff xor %edi,%edi 0.00 : 5ad276: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 0.00 : 5ad27d: 00 00 00 : : for (i = 0; i < numSimpleVars; i++) : { : char *slotptr = ((char *) econtext) + varSlotOffsets[i]; : TupleTableSlot *varSlot = *((TupleTableSlot **) slotptr); 0.00 : 5ad280: 49 63 04 bb movslq (%r11,%rdi,4),%rax : int varNumber = varNumbers[i] - 1; : int varOutputCol = varOutputCols[i] - 1; : : values[varOutputCol] = varSlot->tts_values[varNumber]; 0.00 : 5ad284: 41 8b 0c b9 mov (%r9,%rdi,4),%ecx 0.00 : 5ad288: 83 e9 01 sub $0x1,%ecx : int *varOutputCols = projInfo->pi_varOutputCols; : : for (i = 0; i < numSimpleVars; i++) : { : char *slotptr = ((char *) econtext) + varSlotOffsets[i]; : TupleTableSlot *varSlot = *((TupleTableSlot **) slotptr); 0.00 : 5ad28b: 49 8b 34 06 mov (%r14,%rax,1),%rsi : int varNumber = varNumbers[i] - 1; : int varOutputCol = varOutputCols[i] - 1; : : values[varOutputCol] = varSlot->tts_values[varNumber]; 0.00 : 5ad28f: 41 8b 04 ba mov (%r10,%rdi,4),%eax 0.00 : 5ad293: 48 63 c9 movslq %ecx,%rcx : isnull[varOutputCol] = varSlot->tts_isnull[varNumber]; 0.00 : 5ad296: 48 83 c7 01 add $0x1,%rdi : char *slotptr = ((char *) econtext) + varSlotOffsets[i]; : TupleTableSlot *varSlot = *((TupleTableSlot **) slotptr); : int varNumber = varNumbers[i] - 1; : int varOutputCol = varOutputCols[i] - 1; : : values[varOutputCol] = varSlot->tts_values[varNumber]; 0.00 : 5ad29a: 48 8b 56 28 mov 0x28(%rsi),%rdx 0.00 : 5ad29e: 83 e8 01 sub $0x1,%eax : else : { : /* we have to pay attention to varOutputCols[] */ : int *varOutputCols = projInfo->pi_varOutputCols; : : for (i = 0; i < numSimpleVars; i++) 0.00 : 5ad2a1: 41 39 f8 cmp %edi,%r8d : char *slotptr = ((char *) econtext) + varSlotOffsets[i]; : TupleTableSlot *varSlot = *((TupleTableSlot **) slotptr); : int varNumber = varNumbers[i] - 1; : int varOutputCol = varOutputCols[i] - 1; : : values[varOutputCol] = varSlot->tts_values[varNumber]; 0.00 : 5ad2a4: 48 98 cltq 0.00 : 5ad2a6: 48 8b 14 c2 mov (%rdx,%rax,8),%rdx 0.00 : 5ad2aa: 49 89 54 cd 00 mov %rdx,0x0(%r13,%rcx,8) : isnull[varOutputCol] = varSlot->tts_isnull[varNumber]; 0.00 : 5ad2af: 48 8b 56 30 mov 0x30(%rsi),%rdx 0.00 : 5ad2b3: 0f b6 04 02 movzbl (%rdx,%rax,1),%eax 0.00 : 5ad2b7: 41 88 04 0c mov %al,(%r12,%rcx,1) : else : { : /* we have to pay attention to varOutputCols[] */ : int *varOutputCols = projInfo->pi_varOutputCols; : : for (i = 0; i < numSimpleVars; i++) 0.00 : 5ad2bb: 7f c3 jg 5ad280 0.00 : 5ad2bd: e9 0c fe ff ff jmpq 5ad0ce : { : /* : * Oh dear, this item is returning an empty set. Guess : * we can't make a tuple after all. : */ : *isDone = ExprEndResult; 0.00 : 5ad2c2: 48 8b 45 90 mov -0x70(%rbp),%rax 0.00 : 5ad2c6: c7 00 02 00 00 00 movl $0x2,(%rax) 0.00 : 5ad2cc: 48 8b 45 98 mov -0x68(%rbp),%rax 0.00 : 5ad2d0: 48 8b 40 08 mov 0x8(%rax),%rax : * : * XXX is that still necessary? : */ : if (*isDone == ExprEndResult) : { : foreach(tl, targetlist) 0.00 : 5ad2d4: 48 85 c0 test %rax,%rax 0.00 : 5ad2d7: 48 89 45 d0 mov %rax,-0x30(%rbp) 0.00 : 5ad2db: 74 6c je 5ad349 0.00 : 5ad2dd: 0f 1f 00 nopl (%rax) : { : GenericExprState *gstate = (GenericExprState *) lfirst(tl); 0.00 : 5ad2e0: 48 8b 55 d0 mov -0x30(%rbp),%rdx 0.00 : 5ad2e4: 48 8b 12 mov (%rdx),%rdx 0.00 : 5ad2e7: 48 89 55 b8 mov %rdx,-0x48(%rbp) : TargetEntry *tle = (TargetEntry *) gstate->xprstate.expr; : AttrNumber resind = tle->resno - 1; : : while (itemIsDone[resind] == ExprMultipleResult) 0.00 : 5ad2eb: 48 8b 42 08 mov 0x8(%rdx),%rax 0.00 : 5ad2ef: 0f b7 40 10 movzwl 0x10(%rax),%eax 0.00 : 5ad2f3: 83 e8 01 sub $0x1,%eax 0.00 : 5ad2f6: 48 0f bf c0 movswq %ax,%rax 0.00 : 5ad2fa: 49 8d 1c 87 lea (%r15,%rax,4),%rbx 0.00 : 5ad2fe: 83 3b 01 cmpl $0x1,(%rbx) 0.00 : 5ad301: 75 35 jne 5ad338 0.00 : 5ad303: 48 8b 55 a8 mov -0x58(%rbp),%rdx 0.00 : 5ad307: 4c 8b 65 a0 mov -0x60(%rbp),%r12 0.00 : 5ad30b: 4c 8d 2c c2 lea (%rdx,%rax,8),%r13 0.00 : 5ad30f: 49 01 c4 add %rax,%r12 0.00 : 5ad312: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : { : values[resind] = ExecEvalExpr(gstate->arg, 0.00 : 5ad318: 48 8b 55 b8 mov -0x48(%rbp),%rdx 0.00 : 5ad31c: 48 89 d9 mov %rbx,%rcx 0.00 : 5ad31f: 4c 89 f6 mov %r14,%rsi 0.00 : 5ad322: 48 8b 42 18 mov 0x18(%rdx),%rax 0.00 : 5ad326: 4c 89 e2 mov %r12,%rdx 0.00 : 5ad329: 48 89 c7 mov %rax,%rdi 0.00 : 5ad32c: ff 50 10 callq *0x10(%rax) 0.00 : 5ad32f: 49 89 45 00 mov %rax,0x0(%r13) : { : GenericExprState *gstate = (GenericExprState *) lfirst(tl); : TargetEntry *tle = (TargetEntry *) gstate->xprstate.expr; : AttrNumber resind = tle->resno - 1; : : while (itemIsDone[resind] == ExprMultipleResult) 0.00 : 5ad333: 83 3b 01 cmpl $0x1,(%rbx) 0.00 : 5ad336: 74 e0 je 5ad318 : * : * XXX is that still necessary? : */ : if (*isDone == ExprEndResult) : { : foreach(tl, targetlist) 0.00 : 5ad338: 48 8b 45 d0 mov -0x30(%rbp),%rax 0.00 : 5ad33c: 48 8b 40 08 mov 0x8(%rax),%rax 0.00 : 5ad340: 48 85 c0 test %rax,%rax 0.00 : 5ad343: 48 89 45 d0 mov %rax,-0x30(%rbp) 0.00 : 5ad347: 75 97 jne 5ad2e0 0.00 : 5ad349: 48 8b 55 c8 mov -0x38(%rbp),%rdx 0.00 : 5ad34d: 48 89 15 0c d5 60 00 mov %rdx,0x60d50c(%rip) # bba860 : /* : * Successfully formed a result row. Mark the result slot as containing a : * valid virtual tuple. : */ : return ExecStoreVirtualTuple(slot); : } 0.00 : 5ad354: 48 8b 45 b0 mov -0x50(%rbp),%rax 0.00 : 5ad358: 48 83 c4 48 add $0x48,%rsp 0.00 : 5ad35c: 5b pop %rbx 0.00 : 5ad35d: 41 5c pop %r12 0.00 : 5ad35f: 41 5d pop %r13 0.00 : 5ad361: 41 5e pop %r14 0.00 : 5ad363: 41 5f pop %r15 0.00 : 5ad365: c9 leaveq 0.00 : 5ad366: c3 retq 0.00 : 5ad367: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 5ad36e: 00 00 : if (*isDone == ExprSingleResult) : { : /* : * all sets are done, so report that tlist expansion is complete. : */ : *isDone = ExprEndResult; 0.00 : 5ad370: c7 02 02 00 00 00 movl $0x2,(%rdx) 0.00 : 5ad376: 48 8b 45 c8 mov -0x38(%rbp),%rax 0.00 : 5ad37a: 48 89 05 df d4 60 00 mov %rax,0x60d4df(%rip) # bba860 0.00 : 5ad381: eb d1 jmp 5ad354 : : if (itemIsDone[resind] != ExprSingleResult) : { : /* We have a set-valued expression in the tlist */ : if (isDone == NULL) : ereport(ERROR, 0.00 : 5ad383: 45 31 c0 xor %r8d,%r8d 0.00 : 5ad386: b9 f0 ad 88 00 mov $0x88adf0,%ecx 0.00 : 5ad38b: ba 9c 14 00 00 mov $0x149c,%edx 0.00 : 5ad390: be fc a3 88 00 mov $0x88a3fc,%esi 0.00 : 5ad395: bf 14 00 00 00 mov $0x14,%edi 0.00 : 5ad39a: e8 21 d7 1c 00 callq 77aac0 0.00 : 5ad39f: 84 c0 test %al,%al 0.00 : 5ad3a1: 75 05 jne 5ad3a8 0.00 : 5ad3a3: e8 28 c1 eb ff callq 4694d0 0.00 : 5ad3a8: bf 30 b3 87 00 mov $0x87b330,%edi 0.00 : 5ad3ad: 31 c0 xor %eax,%eax 0.00 : 5ad3af: e8 ec f4 1c 00 callq 77c8a0 0.00 : 5ad3b4: bf 40 04 00 00 mov $0x440,%edi 0.00 : 5ad3b9: 89 c3 mov %eax,%ebx 0.00 : 5ad3bb: e8 90 f9 1c 00 callq 77cd50 0.00 : 5ad3c0: 89 de mov %ebx,%esi 0.00 : 5ad3c2: 89 c7 mov %eax,%edi 0.00 : 5ad3c4: 31 c0 xor %eax,%eax 0.00 : 5ad3c6: e8 15 d2 1c 00 callq 77a5e0 0.00 : 5ad3cb: eb d6 jmp 5ad3a3 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 50.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/instrument.c:115 25.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/instrument.c:124 25.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/instrument.c:120 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000005b7ae0 : : } : : /* Finish a run cycle for a plan node */ : void : InstrEndLoop(Instrumentation *instr) : { 0.00 : 5b7ae0: 55 push %rbp : double totaltime; : : /* Skip if nothing has happened, or already shut down */ : if (!instr->running) 0.00 : 5b7ae1: 80 7f 02 00 cmpb $0x0,0x2(%rdi) : } : : /* Finish a run cycle for a plan node */ : void : InstrEndLoop(Instrumentation *instr) : { 0.00 : 5b7ae5: 48 89 e5 mov %rsp,%rbp : double totaltime; : : /* Skip if nothing has happened, or already shut down */ : if (!instr->running) 0.00 : 5b7ae8: 0f 84 da 00 00 00 je 5b7bc8 : return; : : if (!INSTR_TIME_IS_ZERO(instr->starttime)) 0.00 : 5b7aee: 48 83 7f 10 00 cmpq $0x0,0x10(%rdi) 0.00 : 5b7af3: 75 07 jne 5b7afc 0.00 : 5b7af5: 48 83 7f 08 00 cmpq $0x0,0x8(%rdi) 0.00 : 5b7afa: 74 34 je 5b7b30 : elog(ERROR, "InstrEndLoop called on running node"); 0.00 : 5b7afc: ba 7d b6 88 00 mov $0x88b67d,%edx 0.00 : 5b7b01: be 70 00 00 00 mov $0x70,%esi 0.00 : 5b7b06: bf fa b5 88 00 mov $0x88b5fa,%edi 0.00 : 5b7b0b: e8 10 39 1c 00 callq 77b420 0.00 : 5b7b10: be 08 b6 88 00 mov $0x88b608,%esi 0.00 : 5b7b15: bf 14 00 00 00 mov $0x14,%edi 0.00 : 5b7b1a: 31 c0 xor %eax,%eax 0.00 : 5b7b1c: e8 0f 37 1c 00 callq 77b230 0.00 : 5b7b21: e8 aa 19 eb ff callq 4694d0 0.00 : 5b7b26: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 0.00 : 5b7b2d: 00 00 00 : : /* Accumulate per-cycle statistics into totals */ : totaltime = INSTR_TIME_GET_DOUBLE(instr->counter); 0.00 : 5b7b30: f2 48 0f 2a 47 20 cvtsi2sdq 0x20(%rdi),%xmm0 0.00 : 5b7b36: f2 0f 5e 05 a2 4a 2c divsd 0x2c4aa2(%rip),%xmm0 # 87c5e0 <__func__.18742+0x1b> 0.00 : 5b7b3d: 00 /home/Computational/mark/src/postgres-andres/src/backend/executor/instrument.c:115 50.00 : 5b7b3e: f2 48 0f 2a 4f 18 cvtsi2sdq 0x18(%rdi),%xmm1 : : /* Reset for next cycle (if any) */ : instr->running = false; : INSTR_TIME_SET_ZERO(instr->starttime); : INSTR_TIME_SET_ZERO(instr->counter); : instr->firsttuple = 0; 0.00 : 5b7b44: 31 c0 xor %eax,%eax : instr->total += totaltime; : instr->ntuples += instr->tuplecount; : instr->nloops += 1; : : /* Reset for next cycle (if any) */ : instr->running = false; 0.00 : 5b7b46: c6 47 02 00 movb $0x0,0x2(%rdi) : INSTR_TIME_SET_ZERO(instr->starttime); 0.00 : 5b7b4a: 48 c7 47 08 00 00 00 movq $0x0,0x8(%rdi) 0.00 : 5b7b51: 00 /home/Computational/mark/src/postgres-andres/src/backend/executor/instrument.c:124 25.00 : 5b7b52: 48 c7 47 10 00 00 00 movq $0x0,0x10(%rdi) 0.00 : 5b7b59: 00 : INSTR_TIME_SET_ZERO(instr->counter); 0.00 : 5b7b5a: 48 c7 47 18 00 00 00 movq $0x0,0x18(%rdi) 0.00 : 5b7b61: 00 0.00 : 5b7b62: 48 c7 47 20 00 00 00 movq $0x0,0x20(%rdi) 0.00 : 5b7b69: 00 : : if (!INSTR_TIME_IS_ZERO(instr->starttime)) : elog(ERROR, "InstrEndLoop called on running node"); : : /* Accumulate per-cycle statistics into totals */ : totaltime = INSTR_TIME_GET_DOUBLE(instr->counter); 0.00 : 5b7b6a: f2 0f 58 c8 addsd %xmm0,%xmm1 : : instr->startup += instr->firsttuple; 0.00 : 5b7b6e: f2 0f 10 87 a8 00 00 movsd 0xa8(%rdi),%xmm0 0.00 : 5b7b75: 00 0.00 : 5b7b76: f2 0f 58 47 28 addsd 0x28(%rdi),%xmm0 : : /* Reset for next cycle (if any) */ : instr->running = false; : INSTR_TIME_SET_ZERO(instr->starttime); : INSTR_TIME_SET_ZERO(instr->counter); : instr->firsttuple = 0; 0.00 : 5b7b7b: 48 89 47 28 mov %rax,0x28(%rdi) : : /* Accumulate per-cycle statistics into totals */ : totaltime = INSTR_TIME_GET_DOUBLE(instr->counter); : : instr->startup += instr->firsttuple; : instr->total += totaltime; 0.00 : 5b7b7f: f2 0f 58 8f b0 00 00 addsd 0xb0(%rdi),%xmm1 0.00 : 5b7b86: 00 : elog(ERROR, "InstrEndLoop called on running node"); : : /* Accumulate per-cycle statistics into totals */ : totaltime = INSTR_TIME_GET_DOUBLE(instr->counter); : : instr->startup += instr->firsttuple; 0.00 : 5b7b87: f2 0f 11 87 a8 00 00 movsd %xmm0,0xa8(%rdi) 0.00 : 5b7b8e: 00 : instr->total += totaltime; : instr->ntuples += instr->tuplecount; 0.00 : 5b7b8f: f2 0f 10 87 b8 00 00 movsd 0xb8(%rdi),%xmm0 0.00 : 5b7b96: 00 : : /* Accumulate per-cycle statistics into totals */ : totaltime = INSTR_TIME_GET_DOUBLE(instr->counter); : : instr->startup += instr->firsttuple; : instr->total += totaltime; 0.00 : 5b7b97: f2 0f 11 8f b0 00 00 movsd %xmm1,0xb0(%rdi) 0.00 : 5b7b9e: 00 : instr->ntuples += instr->tuplecount; 0.00 : 5b7b9f: f2 0f 58 47 30 addsd 0x30(%rdi),%xmm0 : /* Reset for next cycle (if any) */ : instr->running = false; : INSTR_TIME_SET_ZERO(instr->starttime); : INSTR_TIME_SET_ZERO(instr->counter); : instr->firsttuple = 0; : instr->tuplecount = 0; 0.00 : 5b7ba4: 48 89 47 30 mov %rax,0x30(%rdi) : /* Accumulate per-cycle statistics into totals */ : totaltime = INSTR_TIME_GET_DOUBLE(instr->counter); : : instr->startup += instr->firsttuple; : instr->total += totaltime; : instr->ntuples += instr->tuplecount; 0.00 : 5b7ba8: f2 0f 11 87 b8 00 00 movsd %xmm0,0xb8(%rdi) 0.00 : 5b7baf: 00 : instr->nloops += 1; 0.00 : 5b7bb0: f2 0f 10 05 a0 75 1f movsd 0x1f75a0(%rip),%xmm0 # 7af158 <__func__.15777+0x10> 0.00 : 5b7bb7: 00 /home/Computational/mark/src/postgres-andres/src/backend/executor/instrument.c:120 25.00 : 5b7bb8: f2 0f 58 87 c0 00 00 addsd 0xc0(%rdi),%xmm0 0.00 : 5b7bbf: 00 0.00 : 5b7bc0: f2 0f 11 87 c0 00 00 movsd %xmm0,0xc0(%rdi) 0.00 : 5b7bc7: 00 : instr->running = false; : INSTR_TIME_SET_ZERO(instr->starttime); : INSTR_TIME_SET_ZERO(instr->counter); : instr->firsttuple = 0; : instr->tuplecount = 0; : } 0.00 : 5b7bc8: c9 leaveq Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 50.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeAgg.c:1043 25.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeAgg.c:1029 25.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeAgg.c:1359 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000005b9d80 : : * stored in the expression context to be used when ExecProject evaluates : * the result tuple. : */ : TupleTableSlot * : ExecAgg(AggState *node) : { 0.00 : 5b9d80: 55 push %rbp 0.00 : 5b9d81: 48 89 e5 mov %rsp,%rbp 0.00 : 5b9d84: 41 57 push %r15 0.00 : 5b9d86: 41 56 push %r14 0.00 : 5b9d88: 49 89 fe mov %rdi,%r14 0.00 : 5b9d8b: 41 55 push %r13 0.00 : 5b9d8d: 41 54 push %r12 0.00 : 5b9d8f: 53 push %rbx 0.00 : 5b9d90: 48 81 ec d8 00 00 00 sub $0xd8,%rsp : /* : * Check to see if we're still projecting out tuples from a previous agg : * tuple (because there is a function-returning-set in the projection : * expressions). If so, try to project another one. : */ : if (node->ss.ps.ps_TupFromTlist) 0.00 : 5b9d97: 80 7f 70 00 cmpb $0x0,0x70(%rdi) 0.00 : 5b9d9b: 74 1c je 5b9db9 : { : TupleTableSlot *result; : ExprDoneCond isDone; : : result = ExecProject(node->ss.ps.ps_ProjInfo, &isDone); 0.00 : 5b9d9d: 48 8b 7f 68 mov 0x68(%rdi),%rdi 0.00 : 5b9da1: 48 8d 75 d4 lea -0x2c(%rbp),%rsi 0.00 : 5b9da5: e8 56 32 ff ff callq 5ad000 : if (isDone == ExprMultipleResult) 0.00 : 5b9daa: 83 7d d4 01 cmpl $0x1,-0x2c(%rbp) 0.00 : 5b9dae: 0f 84 04 02 00 00 je 5b9fb8 : return result; : /* Done with that source tuple... */ : node->ss.ps.ps_TupFromTlist = false; 0.00 : 5b9db4: 41 c6 46 70 00 movb $0x0,0x70(%r14) : /* : * Exit if nothing left to do. (We must do the ps_TupFromTlist check : * first, because in some cases agg_done gets set before we emit the final : * aggregate tuple, and we have to finish running SRFs for it.) : */ : if (node->agg_done) 0.00 : 5b9db9: 31 c0 xor %eax,%eax 0.00 : 5b9dbb: 41 80 be d0 00 00 00 cmpb $0x0,0xd0(%r14) 0.00 : 5b9dc2: 00 0.00 : 5b9dc3: 0f 85 ef 01 00 00 jne 5b9fb8 : return NULL; : : /* Dispatch based on strategy */ : if (((Agg *) node->ss.ps.plan)->aggstrategy == AGG_HASHED) 0.00 : 5b9dc9: 49 8b 46 08 mov 0x8(%r14),%rax 0.00 : 5b9dcd: 48 89 85 10 ff ff ff mov %rax,-0xf0(%rbp) 0.00 : 5b9dd4: 83 78 60 02 cmpl $0x2,0x60(%rax) 0.00 : 5b9dd8: 0f 85 ec 01 00 00 jne 5b9fca : { : if (!node->table_filled) 0.00 : 5b9dde: 31 c0 xor %eax,%eax 0.00 : 5b9de0: 41 80 be 00 01 00 00 cmpb $0x0,0x100(%r14) 0.00 : 5b9de7: 00 0.00 : 5b9de8: 4d 8d be 08 01 00 00 lea 0x108(%r14),%r15 0.00 : 5b9def: 0f 84 5d 07 00 00 je 5ba552 : : /* : * get state info from node : */ : /* econtext is the per-output-tuple expression context */ : econtext = aggstate->ss.ps.ps_ExprContext; 0.00 : 5b9df5: 4d 8b 6e 60 mov 0x60(%r14),%r13 : aggvalues = econtext->ecxt_aggvalues; 0.00 : 5b9df9: 49 8b 55 40 mov 0x40(%r13),%rdx 0.00 : 5b9dfd: 48 89 95 30 ff ff ff mov %rdx,-0xd0(%rbp) : aggnulls = econtext->ecxt_aggnulls; 0.00 : 5b9e04: 49 8b 55 48 mov 0x48(%r13),%rdx 0.00 : 5b9e08: 48 89 95 28 ff ff ff mov %rdx,-0xd8(%rbp) : peragg = aggstate->peragg; 0.00 : 5b9e0f: 49 8b 96 b0 00 00 00 mov 0xb0(%r14),%rdx 0.00 : 5b9e16: 48 89 95 20 ff ff ff mov %rdx,-0xe0(%rbp) : firstSlot = aggstate->ss.ss_ScanTupleSlot; 0.00 : 5b9e1d: 49 8b 96 88 00 00 00 mov 0x88(%r14),%rdx 0.00 : 5b9e24: 48 89 95 18 ff ff ff mov %rdx,-0xe8(%rbp) : : /* : * We loop retrieving groups until we find one satisfying : * aggstate->ss.ps.qual : */ : while (!aggstate->agg_done) 0.00 : 5b9e2b: 84 c0 test %al,%al 0.00 : 5b9e2d: 0f 85 83 01 00 00 jne 5b9fb6 : { : /* : * Find the next entry in the hash table : */ : entry = (AggHashEntry) ScanTupleHashTable(&aggstate->hashiter); 0.00 : 5b9e33: 4c 89 ff mov %r15,%rdi 0.00 : 5b9e36: e8 85 9c 1c 00 callq 783ac0 : if (entry == NULL) 0.00 : 5b9e3b: 48 85 c0 test %rax,%rax : while (!aggstate->agg_done) : { : /* : * Find the next entry in the hash table : */ : entry = (AggHashEntry) ScanTupleHashTable(&aggstate->hashiter); 0.00 : 5b9e3e: 49 89 c4 mov %rax,%r12 : if (entry == NULL) 0.00 : 5b9e41: 0f 84 fc 06 00 00 je 5ba543 : * : * We intentionally don't use ReScanExprContext here; if any aggs have : * registered shutdown callbacks, they mustn't be called yet, since we : * might not be done with that agg. : */ : ResetExprContext(econtext); 0.00 : 5b9e47: 49 8b 7d 28 mov 0x28(%r13),%rdi 0.00 : 5b9e4b: e8 60 eb 1d 00 callq 7989b0 : : /* : * Store the copied first input tuple in the tuple table slot reserved : * for it, so that it can be used in ExecProject. : */ : ExecStoreMinimalTuple(entry->shared.firstTuple, 0.00 : 5b9e50: 48 8b b5 18 ff ff ff mov -0xe8(%rbp),%rsi 0.00 : 5b9e57: 49 8b 3c 24 mov (%r12),%rdi 0.00 : 5b9e5b: 31 d2 xor %edx,%edx 0.00 : 5b9e5d: e8 7e a5 ff ff callq 5b43e0 : : /* : * Finalize each aggregate calculation, and stash results in the : * per-output-tuple context. : */ : for (aggno = 0; aggno < aggstate->numaggs; aggno++) 0.00 : 5b9e62: 41 8b 96 98 00 00 00 mov 0x98(%r14),%edx 0.00 : 5b9e69: 85 d2 test %edx,%edx 0.00 : 5b9e6b: 7e 49 jle 5b9eb6 0.00 : 5b9e6d: 31 db xor %ebx,%ebx : { : AggStatePerAgg peraggstate = &peragg[aggno]; : AggStatePerGroup pergroupstate = &pergroup[aggno]; : : Assert(peraggstate->numSortCols == 0); : finalize_aggregate(aggstate, peraggstate, pergroupstate, 0.00 : 5b9e6f: 48 8b 85 30 ff ff ff mov -0xd0(%rbp),%rax : * Finalize each aggregate calculation, and stash results in the : * per-output-tuple context. : */ : for (aggno = 0; aggno < aggstate->numaggs; aggno++) : { : AggStatePerAgg peraggstate = &peragg[aggno]; 0.00 : 5b9e76: 48 63 fb movslq %ebx,%rdi : : /* : * Finalize each aggregate calculation, and stash results in the : * per-output-tuple context. : */ : for (aggno = 0; aggno < aggstate->numaggs; aggno++) 0.00 : 5b9e79: 83 c3 01 add $0x1,%ebx : { : AggStatePerAgg peraggstate = &peragg[aggno]; : AggStatePerGroup pergroupstate = &pergroup[aggno]; : : Assert(peraggstate->numSortCols == 0); : finalize_aggregate(aggstate, peraggstate, pergroupstate, 0.00 : 5b9e7c: 48 69 f7 a8 04 00 00 imul $0x4a8,%rdi,%rsi 0.00 : 5b9e83: 48 03 b5 20 ff ff ff add -0xe0(%rbp),%rsi 0.00 : 5b9e8a: 48 8d 0c f8 lea (%rax,%rdi,8),%rcx 0.00 : 5b9e8e: 48 89 f8 mov %rdi,%rax 0.00 : 5b9e91: 48 c1 e0 04 shl $0x4,%rax 0.00 : 5b9e95: 49 8d 54 04 08 lea 0x8(%r12,%rax,1),%rdx 0.00 : 5b9e9a: 48 8b 85 28 ff ff ff mov -0xd8(%rbp),%rax 0.00 : 5b9ea1: 4c 8d 04 38 lea (%rax,%rdi,1),%r8 0.00 : 5b9ea5: 4c 89 f7 mov %r14,%rdi 0.00 : 5b9ea8: e8 13 fc ff ff callq 5b9ac0 : : /* : * Finalize each aggregate calculation, and stash results in the : * per-output-tuple context. : */ : for (aggno = 0; aggno < aggstate->numaggs; aggno++) 0.00 : 5b9ead: 41 3b 9e 98 00 00 00 cmp 0x98(%r14),%ebx 0.00 : 5b9eb4: 7c b9 jl 5b9e6f : : /* : * Use the representative input tuple for any references to : * non-aggregated input columns in the qual and tlist. : */ : econtext->ecxt_outertuple = firstSlot; 0.00 : 5b9eb6: 48 8b 95 18 ff ff ff mov -0xe8(%rbp),%rdx : : /* : * Check the qual (HAVING clause); if the group does not match, ignore : * it and loop back to try to process another group. : */ : if (ExecQual(aggstate->ss.ps.qual, econtext, false)) 0.00 : 5b9ebd: 4c 89 ee mov %r13,%rsi : : /* : * Use the representative input tuple for any references to : * non-aggregated input columns in the qual and tlist. : */ : econtext->ecxt_outertuple = firstSlot; 0.00 : 5b9ec0: 49 89 55 18 mov %rdx,0x18(%r13) : : /* : * Check the qual (HAVING clause); if the group does not match, ignore : * it and loop back to try to process another group. : */ : if (ExecQual(aggstate->ss.ps.qual, econtext, false)) 0.00 : 5b9ec4: 49 8b 7e 28 mov 0x28(%r14),%rdi 0.00 : 5b9ec8: 31 d2 xor %edx,%edx 0.00 : 5b9eca: e8 41 30 ff ff callq 5acf10 0.00 : 5b9ecf: 84 c0 test %al,%al 0.00 : 5b9ed1: 0f 85 4e 06 00 00 jne 5ba525 : (isDone == ExprMultipleResult); : return result; : } : } : else : InstrCountFiltered1(aggstate, 1); 0.00 : 5b9ed7: 49 8b 46 18 mov 0x18(%r14),%rax 0.00 : 5b9edb: 48 85 c0 test %rax,%rax 0.00 : 5b9ede: 74 18 je 5b9ef8 0.00 : 5b9ee0: f2 0f 10 05 70 52 1f movsd 0x1f5270(%rip),%xmm0 # 7af158 <__func__.15777+0x10> 0.00 : 5b9ee7: 00 0.00 : 5b9ee8: f2 0f 58 80 c8 00 00 addsd 0xc8(%rax),%xmm0 0.00 : 5b9eef: 00 0.00 : 5b9ef0: f2 0f 11 80 c8 00 00 movsd %xmm0,0xc8(%rax) 0.00 : 5b9ef7: 00 0.00 : 5b9ef8: 41 0f b6 86 d0 00 00 movzbl 0xd0(%r14),%eax 0.00 : 5b9eff: 00 0.00 : 5b9f00: e9 26 ff ff ff jmpq 5b9e2b : MemoryContextReset(workcontext); : : ExecClearTuple(slot1); : } : : if (slot2) 0.00 : 5b9f05: 4d 85 ff test %r15,%r15 0.00 : 5b9f08: 74 08 je 5b9f12 : ExecClearTuple(slot2); 0.00 : 5b9f0a: 4c 89 ff mov %r15,%rdi 0.00 : 5b9f0d: e8 fe a1 ff ff callq 5b4110 : : tuplesort_end(peraggstate->sortstate); 0.00 : 5b9f12: 49 8b bc 24 f8 00 00 mov 0xf8(%r12),%rdi 0.00 : 5b9f19: 00 0.00 : 5b9f1a: e8 c1 52 1e 00 callq 79f1e0 : peraggstate->sortstate = NULL; 0.00 : 5b9f1f: 49 c7 84 24 f8 00 00 movq $0x0,0xf8(%r12) 0.00 : 5b9f26: 00 00 00 00 00 : process_ordered_aggregate_multi(aggstate, : peraggstate, : pergroupstate); : } : : finalize_aggregate(aggstate, peraggstate, pergroupstate, 0.00 : 5b9f2b: 48 8b 55 88 mov -0x78(%rbp),%rdx 0.00 : 5b9f2f: 48 8b 85 68 ff ff ff mov -0x98(%rbp),%rax 0.00 : 5b9f36: 4c 89 e6 mov %r12,%rsi 0.00 : 5b9f39: 4c 89 f7 mov %r14,%rdi 0.00 : 5b9f3c: 48 8d 0c d0 lea (%rax,%rdx,8),%rcx 0.00 : 5b9f40: 48 8b 85 60 ff ff ff mov -0xa0(%rbp),%rax 0.00 : 5b9f47: 4c 8d 04 10 lea (%rax,%rdx,1),%r8 0.00 : 5b9f4b: 48 8b 95 38 ff ff ff mov -0xc8(%rbp),%rdx 0.00 : 5b9f52: e8 69 fb ff ff callq 5b9ac0 : : /* : * Done scanning input tuple group. Finalize each aggregate : * calculation, and stash results in the per-output-tuple context. : */ : for (aggno = 0; aggno < aggstate->numaggs; aggno++) 0.00 : 5b9f57: 83 85 44 ff ff ff 01 addl $0x1,-0xbc(%rbp) 0.00 : 5b9f5e: 8b 95 44 ff ff ff mov -0xbc(%rbp),%edx 0.00 : 5b9f64: 41 3b 96 98 00 00 00 cmp 0x98(%r14),%edx 0.00 : 5b9f6b: 0f 8c f6 01 00 00 jl 5ba167 : : /* : * Check the qual (HAVING clause); if the group does not match, ignore : * it and loop back to try to process another group. : */ : if (ExecQual(aggstate->ss.ps.qual, econtext, false)) 0.00 : 5b9f71: 49 8b 7e 28 mov 0x28(%r14),%rdi 0.00 : 5b9f75: 48 8b b5 78 ff ff ff mov -0x88(%rbp),%rsi 0.00 : 5b9f7c: 31 d2 xor %edx,%edx 0.00 : 5b9f7e: e8 8d 2f ff ff callq 5acf10 0.00 : 5b9f83: 84 c0 test %al,%al 0.00 : 5b9f85: 0f 85 18 05 00 00 jne 5ba4a3 : (isDone == ExprMultipleResult); : return result; : } : } : else : InstrCountFiltered1(aggstate, 1); 0.00 : 5b9f8b: 49 8b 46 18 mov 0x18(%r14),%rax 0.00 : 5b9f8f: 48 85 c0 test %rax,%rax 0.00 : 5b9f92: 74 18 je 5b9fac 0.00 : 5b9f94: f2 0f 10 05 bc 51 1f movsd 0x1f51bc(%rip),%xmm0 # 7af158 <__func__.15777+0x10> 0.00 : 5b9f9b: 00 0.00 : 5b9f9c: f2 0f 58 80 c8 00 00 addsd 0xc8(%rax),%xmm0 0.00 : 5b9fa3: 00 0.00 : 5b9fa4: f2 0f 11 80 c8 00 00 movsd %xmm0,0xc8(%rax) 0.00 : 5b9fab: 00 : : /* : * We loop retrieving groups until we find one matching : * aggstate->ss.ps.qual : */ : while (!aggstate->agg_done) 0.00 : 5b9fac: 41 80 be d0 00 00 00 cmpb $0x0,0xd0(%r14) 0.00 : 5b9fb3: 00 0.00 : 5b9fb4: 74 75 je 5ba02b 0.00 : 5b9fb6: 31 c0 xor %eax,%eax : agg_fill_hash_table(node); : return agg_retrieve_hash_table(node); : } : else : return agg_retrieve_direct(node); : } 0.00 : 5b9fb8: 48 81 c4 d8 00 00 00 add $0xd8,%rsp 0.00 : 5b9fbf: 5b pop %rbx 0.00 : 5b9fc0: 41 5c pop %r12 0.00 : 5b9fc2: 41 5d pop %r13 0.00 : 5b9fc4: 41 5e pop %r14 0.00 : 5b9fc6: 41 5f pop %r15 0.00 : 5b9fc8: c9 leaveq 0.00 : 5b9fc9: c3 retq : /* : * get state info from node : */ : outerPlan = outerPlanState(aggstate); : /* econtext is the per-output-tuple expression context */ : econtext = aggstate->ss.ps.ps_ExprContext; 0.00 : 5b9fca: 49 8b 56 60 mov 0x60(%r14),%rdx : int aggno; : : /* : * get state info from node : */ : outerPlan = outerPlanState(aggstate); 0.00 : 5b9fce: 49 8b 46 30 mov 0x30(%r14),%rax : /* econtext is the per-output-tuple expression context */ : econtext = aggstate->ss.ps.ps_ExprContext; 0.00 : 5b9fd2: 48 89 95 78 ff ff ff mov %rdx,-0x88(%rbp) : int aggno; : : /* : * get state info from node : */ : outerPlan = outerPlanState(aggstate); 0.00 : 5b9fd9: 48 89 45 80 mov %rax,-0x80(%rbp) : /* econtext is the per-output-tuple expression context */ : econtext = aggstate->ss.ps.ps_ExprContext; : aggvalues = econtext->ecxt_aggvalues; 0.00 : 5b9fdd: 48 8b 42 40 mov 0x40(%rdx),%rax 0.00 : 5b9fe1: 48 89 85 68 ff ff ff mov %rax,-0x98(%rbp) : aggnulls = econtext->ecxt_aggnulls; 0.00 : 5b9fe8: 48 8b 52 48 mov 0x48(%rdx),%rdx : /* tmpcontext is the per-input-tuple expression context */ : tmpcontext = aggstate->tmpcontext; 0.00 : 5b9fec: 49 8b 86 c0 00 00 00 mov 0xc0(%r14),%rax : */ : outerPlan = outerPlanState(aggstate); : /* econtext is the per-output-tuple expression context */ : econtext = aggstate->ss.ps.ps_ExprContext; : aggvalues = econtext->ecxt_aggvalues; : aggnulls = econtext->ecxt_aggnulls; 0.00 : 5b9ff3: 48 89 95 60 ff ff ff mov %rdx,-0xa0(%rbp) : /* tmpcontext is the per-input-tuple expression context */ : tmpcontext = aggstate->tmpcontext; : peragg = aggstate->peragg; 0.00 : 5b9ffa: 49 8b 96 b0 00 00 00 mov 0xb0(%r14),%rdx : /* econtext is the per-output-tuple expression context */ : econtext = aggstate->ss.ps.ps_ExprContext; : aggvalues = econtext->ecxt_aggvalues; : aggnulls = econtext->ecxt_aggnulls; : /* tmpcontext is the per-input-tuple expression context */ : tmpcontext = aggstate->tmpcontext; 0.00 : 5ba001: 48 89 85 70 ff ff ff mov %rax,-0x90(%rbp) : peragg = aggstate->peragg; : pergroup = aggstate->pergroup; 0.00 : 5ba008: 49 8b 86 d8 00 00 00 mov 0xd8(%r14),%rax : econtext = aggstate->ss.ps.ps_ExprContext; : aggvalues = econtext->ecxt_aggvalues; : aggnulls = econtext->ecxt_aggnulls; : /* tmpcontext is the per-input-tuple expression context */ : tmpcontext = aggstate->tmpcontext; : peragg = aggstate->peragg; 0.00 : 5ba00f: 48 89 95 58 ff ff ff mov %rdx,-0xa8(%rbp) : pergroup = aggstate->pergroup; : firstSlot = aggstate->ss.ss_ScanTupleSlot; 0.00 : 5ba016: 49 8b 96 88 00 00 00 mov 0x88(%r14),%rdx : aggvalues = econtext->ecxt_aggvalues; : aggnulls = econtext->ecxt_aggnulls; : /* tmpcontext is the per-input-tuple expression context */ : tmpcontext = aggstate->tmpcontext; : peragg = aggstate->peragg; : pergroup = aggstate->pergroup; 0.00 : 5ba01d: 48 89 85 50 ff ff ff mov %rax,-0xb0(%rbp) : firstSlot = aggstate->ss.ss_ScanTupleSlot; 0.00 : 5ba024: 48 89 95 48 ff ff ff mov %rdx,-0xb8(%rbp) : { : /* : * If we don't already have the first tuple of the new group, fetch it : * from the outer plan. : */ : if (aggstate->grp_firstTuple == NULL) 0.00 : 5ba02b: 49 83 be e0 00 00 00 cmpq $0x0,0xe0(%r14) 0.00 : 5ba032: 00 0.00 : 5ba033: 0f 84 a4 04 00 00 je 5ba4dd : * We use ReScanExprContext not just ResetExprContext because we want : * any registered shutdown callbacks to be called. That allows : * aggregate functions to ensure they've cleaned up any non-memory : * resources. : */ : ReScanExprContext(econtext); 0.00 : 5ba039: 48 8b bd 78 ff ff ff mov -0x88(%rbp),%rdi 0.00 : 5ba040: e8 3b b1 ff ff callq 5b5180 : : MemoryContextResetAndDeleteChildren(aggstate->aggcontext); 0.00 : 5ba045: 49 8b be b8 00 00 00 mov 0xb8(%r14),%rdi 0.00 : 5ba04c: e8 bf eb 1d 00 callq 798c10 : : /* : * Initialize working state for a new input tuple group : */ : initialize_aggregates(aggstate, peragg, pergroup); 0.00 : 5ba051: 48 8b 95 50 ff ff ff mov -0xb0(%rbp),%rdx 0.00 : 5ba058: 48 8b b5 58 ff ff ff mov -0xa8(%rbp),%rsi 0.00 : 5ba05f: 4c 89 f7 mov %r14,%rdi 0.00 : 5ba062: e8 69 f5 ff ff callq 5b95d0 : : if (aggstate->grp_firstTuple != NULL) 0.00 : 5ba067: 49 8b be e0 00 00 00 mov 0xe0(%r14),%rdi 0.00 : 5ba06e: 48 85 ff test %rdi,%rdi 0.00 : 5ba071: 0f 84 c5 00 00 00 je 5ba13c : /* : * Store the copied first input tuple in the tuple table slot : * reserved for it. The tuple will be deleted when it is cleared : * from the slot. : */ : ExecStoreTuple(aggstate->grp_firstTuple, 0.00 : 5ba077: 48 8b b5 48 ff ff ff mov -0xb8(%rbp),%rsi 0.00 : 5ba07e: 31 d2 xor %edx,%edx 0.00 : 5ba080: b9 01 00 00 00 mov $0x1,%ecx 0.00 : 5ba085: e8 f6 a3 ff ff callq 5b4480 : InvalidBuffer, : true); : aggstate->grp_firstTuple = NULL; /* don't keep two pointers */ : : /* set up for first advance_aggregates call */ : tmpcontext->ecxt_outertuple = firstSlot; 0.00 : 5ba08a: 48 8b 85 48 ff ff ff mov -0xb8(%rbp),%rax 0.00 : 5ba091: 48 8b 95 70 ff ff ff mov -0x90(%rbp),%rdx : */ : ExecStoreTuple(aggstate->grp_firstTuple, : firstSlot, : InvalidBuffer, : true); : aggstate->grp_firstTuple = NULL; /* don't keep two pointers */ 0.00 : 5ba098: 49 c7 86 e0 00 00 00 movq $0x0,0xe0(%r14) 0.00 : 5ba09f: 00 00 00 00 : : /* set up for first advance_aggregates call */ : tmpcontext->ecxt_outertuple = firstSlot; 0.00 : 5ba0a3: 48 89 42 18 mov %rax,0x18(%rdx) : * Process each outer-plan tuple, and then fetch the next one, : * until we exhaust the outer plan or cross a group boundary. : */ : for (;;) : { : advance_aggregates(aggstate, pergroup); 0.00 : 5ba0a7: 48 8b b5 50 ff ff ff mov -0xb0(%rbp),%rsi 0.00 : 5ba0ae: 4c 89 f7 mov %r14,%rdi 0.00 : 5ba0b1: e8 9a f8 ff ff callq 5b9950 : : /* Reset per-input-tuple context after each tuple */ : ResetExprContext(tmpcontext); 0.00 : 5ba0b6: 48 8b 95 70 ff ff ff mov -0x90(%rbp),%rdx 0.00 : 5ba0bd: 48 8b 7a 28 mov 0x28(%rdx),%rdi 0.00 : 5ba0c1: e8 ea e8 1d 00 callq 7989b0 : : outerslot = ExecProcNode(outerPlan); 0.00 : 5ba0c6: 48 8b 7d 80 mov -0x80(%rbp),%rdi 0.00 : 5ba0ca: e8 d1 23 ff ff callq 5ac4a0 : if (TupIsNull(outerslot)) 0.00 : 5ba0cf: 48 85 c0 test %rax,%rax : advance_aggregates(aggstate, pergroup); : : /* Reset per-input-tuple context after each tuple */ : ResetExprContext(tmpcontext); : : outerslot = ExecProcNode(outerPlan); 0.00 : 5ba0d2: 48 89 c3 mov %rax,%rbx : if (TupIsNull(outerslot)) 0.00 : 5ba0d5: 0f 84 f5 03 00 00 je 5ba4d0 0.00 : 5ba0db: 80 78 04 00 cmpb $0x0,0x4(%rax) 0.00 : 5ba0df: 0f 85 eb 03 00 00 jne 5ba4d0 : /* no more outer-plan tuples available */ : aggstate->agg_done = true; : break; : } : /* set up for next advance_aggregates call */ : tmpcontext->ecxt_outertuple = outerslot; 0.00 : 5ba0e5: 48 8b 85 70 ff ff ff mov -0x90(%rbp),%rax 0.00 : 5ba0ec: 48 89 58 18 mov %rbx,0x18(%rax) : : /* : * If we are grouping, check whether we've crossed a group : * boundary. : */ : if (node->aggstrategy == AGG_SORTED) 0.00 : 5ba0f0: 48 8b 95 10 ff ff ff mov -0xf0(%rbp),%rdx 0.00 : 5ba0f7: 83 7a 60 01 cmpl $0x1,0x60(%rdx) 0.00 : 5ba0fb: 75 aa jne 5ba0a7 : { : if (!execTuplesMatch(firstSlot, 0.00 : 5ba0fd: 48 8b 85 70 ff ff ff mov -0x90(%rbp),%rax 0.00 : 5ba104: 48 8b 4a 68 mov 0x68(%rdx),%rcx 0.00 : 5ba108: 48 89 de mov %rbx,%rsi 0.00 : 5ba10b: 8b 52 64 mov 0x64(%rdx),%edx 0.00 : 5ba10e: 4d 8b 86 a0 00 00 00 mov 0xa0(%r14),%r8 0.00 : 5ba115: 48 8b bd 48 ff ff ff mov -0xb8(%rbp),%rdi 0.00 : 5ba11c: 4c 8b 48 28 mov 0x28(%rax),%r9 0.00 : 5ba120: e8 1b f3 fe ff callq 5a9440 0.00 : 5ba125: 84 c0 test %al,%al 0.00 : 5ba127: 0f 85 7a ff ff ff jne 5ba0a7 : tmpcontext->ecxt_per_tuple_memory)) : { : /* : * Save the first input tuple of the next group. : */ : aggstate->grp_firstTuple = ExecCopySlotTuple(outerslot); 0.00 : 5ba12d: 48 89 df mov %rbx,%rdi 0.00 : 5ba130: e8 7b 9e ff ff callq 5b3fb0 0.00 : 5ba135: 49 89 86 e0 00 00 00 mov %rax,0xe0(%r14) : * qual, and the tlist. (If we are not grouping, and there are no : * input rows at all, we will come here with an empty firstSlot ... : * but if not grouping, there can't be any references to : * non-aggregated input columns, so no problem.) : */ : econtext->ecxt_outertuple = firstSlot; 0.00 : 5ba13c: 48 8b 85 48 ff ff ff mov -0xb8(%rbp),%rax 0.00 : 5ba143: 48 8b 95 78 ff ff ff mov -0x88(%rbp),%rdx 0.00 : 5ba14a: 48 89 42 18 mov %rax,0x18(%rdx) : : /* : * Done scanning input tuple group. Finalize each aggregate : * calculation, and stash results in the per-output-tuple context. : */ : for (aggno = 0; aggno < aggstate->numaggs; aggno++) 0.00 : 5ba14e: 41 8b 86 98 00 00 00 mov 0x98(%r14),%eax 0.00 : 5ba155: 85 c0 test %eax,%eax 0.00 : 5ba157: 0f 8e 14 fe ff ff jle 5b9f71 0.00 : 5ba15d: c7 85 44 ff ff ff 00 movl $0x0,-0xbc(%rbp) 0.00 : 5ba164: 00 00 00 : { : AggStatePerAgg peraggstate = &peragg[aggno]; 0.00 : 5ba167: 48 63 95 44 ff ff ff movslq -0xbc(%rbp),%rdx 0.00 : 5ba16e: 4c 8b a5 58 ff ff ff mov -0xa8(%rbp),%r12 0.00 : 5ba175: 48 69 c2 a8 04 00 00 imul $0x4a8,%rdx,%rax 0.00 : 5ba17c: 48 89 55 88 mov %rdx,-0x78(%rbp) 0.00 : 5ba180: 49 01 c4 add %rax,%r12 : AggStatePerGroup pergroupstate = &pergroup[aggno]; 0.00 : 5ba183: 48 89 d0 mov %rdx,%rax 0.00 : 5ba186: 48 c1 e0 04 shl $0x4,%rax 0.00 : 5ba18a: 48 03 85 50 ff ff ff add -0xb0(%rbp),%rax 0.00 : 5ba191: 48 89 85 38 ff ff ff mov %rax,-0xc8(%rbp) : : if (peraggstate->numSortCols > 0) 0.00 : 5ba198: 41 8b 84 24 8c 00 00 mov 0x8c(%r12),%eax 0.00 : 5ba19f: 00 0.00 : 5ba1a0: 85 c0 test %eax,%eax 0.00 : 5ba1a2: 0f 8e 83 fd ff ff jle 5b9f2b : { : if (peraggstate->numInputs == 1) 0.00 : 5ba1a8: 41 83 7c 24 14 01 cmpl $0x1,0x14(%r12) 0.00 : 5ba1ae: 0f 84 3e 01 00 00 je 5ba2f2 : static void : process_ordered_aggregate_multi(AggState *aggstate, : AggStatePerAgg peraggstate, : AggStatePerGroup pergroupstate) : { : MemoryContext workcontext = aggstate->tmpcontext->ecxt_per_tuple_memory; 0.00 : 5ba1b4: 49 8b 86 c0 00 00 00 mov 0xc0(%r14),%rax 0.00 : 5ba1bb: 48 8b 40 28 mov 0x28(%rax),%rax 0.00 : 5ba1bf: 48 89 45 c0 mov %rax,-0x40(%rbp) : FunctionCallInfo fcinfo = &peraggstate->transfn_fcinfo; : TupleTableSlot *slot1 = peraggstate->evalslot; : TupleTableSlot *slot2 = peraggstate->uniqslot; : int numTransInputs = peraggstate->numTransInputs; : int numDistinctCols = peraggstate->numDistinctCols; 0.00 : 5ba1c3: 41 8b 84 24 90 00 00 mov 0x90(%r12),%eax 0.00 : 5ba1ca: 00 : AggStatePerAgg peraggstate, : AggStatePerGroup pergroupstate) : { : MemoryContext workcontext = aggstate->tmpcontext->ecxt_per_tuple_memory; : FunctionCallInfo fcinfo = &peraggstate->transfn_fcinfo; : TupleTableSlot *slot1 = peraggstate->evalslot; 0.00 : 5ba1cb: 49 8b 9c 24 e8 00 00 mov 0xe8(%r12),%rbx 0.00 : 5ba1d2: 00 : TupleTableSlot *slot2 = peraggstate->uniqslot; 0.00 : 5ba1d3: 4d 8b bc 24 f0 00 00 mov 0xf0(%r12),%r15 0.00 : 5ba1da: 00 : int numTransInputs = peraggstate->numTransInputs; 0.00 : 5ba1db: 45 8b 6c 24 18 mov 0x18(%r12),%r13d : int numDistinctCols = peraggstate->numDistinctCols; 0.00 : 5ba1e0: 89 45 bc mov %eax,-0x44(%rbp) : bool haveOldValue = false; : int i; : : tuplesort_performsort(peraggstate->sortstate); 0.00 : 5ba1e3: 49 8b bc 24 f8 00 00 mov 0xf8(%r12),%rdi 0.00 : 5ba1ea: 00 0.00 : 5ba1eb: e8 00 7e 1e 00 callq 7a1ff0 : : ExecClearTuple(slot1); 0.00 : 5ba1f0: 48 89 df mov %rbx,%rdi 0.00 : 5ba1f3: e8 18 9f ff ff callq 5b4110 : if (slot2) 0.00 : 5ba1f8: 4d 85 ff test %r15,%r15 0.00 : 5ba1fb: 74 08 je 5ba205 : ExecClearTuple(slot2); 0.00 : 5ba1fd: 4c 89 ff mov %r15,%rdi 0.00 : 5ba200: e8 0b 9f ff ff callq 5b4110 0.00 : 5ba205: c6 45 bb 00 movb $0x0,-0x45(%rbp) 0.00 : 5ba209: eb 3d jmp 5ba248 : * transfn. (This will help execTuplesMatch too, so we do it : * immediately.) : */ : slot_getsomeattrs(slot1, numTransInputs); : : if (numDistinctCols == 0 || 0.00 : 5ba20b: 80 7d bb 00 cmpb $0x0,-0x45(%rbp) 0.00 : 5ba20f: 90 nop 0.00 : 5ba210: 74 6c je 5ba27e 0.00 : 5ba212: 49 8b 8c 24 98 00 00 mov 0x98(%r12),%rcx 0.00 : 5ba219: 00 0.00 : 5ba21a: 4c 8b 4d c0 mov -0x40(%rbp),%r9 0.00 : 5ba21e: 4c 89 fe mov %r15,%rsi 0.00 : 5ba221: 4d 8b 84 24 b8 00 00 mov 0xb8(%r12),%r8 0.00 : 5ba228: 00 0.00 : 5ba229: 8b 55 bc mov -0x44(%rbp),%edx 0.00 : 5ba22c: 48 89 df mov %rbx,%rdi 0.00 : 5ba22f: e8 0c f2 fe ff callq 5a9440 0.00 : 5ba234: 84 c0 test %al,%al 0.00 : 5ba236: 74 46 je 5ba27e 0.00 : 5ba238: c6 45 bb 01 movb $0x1,-0x45(%rbp) 0.00 : 5ba23c: 0f 1f 40 00 nopl 0x0(%rax) : : /* Reset context each time, unless execTuplesMatch did it for us */ : if (numDistinctCols == 0) : MemoryContextReset(workcontext); : : ExecClearTuple(slot1); 0.00 : 5ba240: 48 89 df mov %rbx,%rdi 0.00 : 5ba243: e8 c8 9e ff ff callq 5b4110 : : ExecClearTuple(slot1); : if (slot2) : ExecClearTuple(slot2); : : while (tuplesort_gettupleslot(peraggstate->sortstate, true, slot1)) 0.00 : 5ba248: 49 8b bc 24 f8 00 00 mov 0xf8(%r12),%rdi 0.00 : 5ba24f: 00 0.00 : 5ba250: 48 89 da mov %rbx,%rdx 0.00 : 5ba253: be 01 00 00 00 mov $0x1,%esi 0.00 : 5ba258: e8 33 40 1e 00 callq 79e290 0.00 : 5ba25d: 84 c0 test %al,%al 0.00 : 5ba25f: 0f 84 a0 fc ff ff je 5b9f05 : /* : * Extract the first numTransInputs columns as datums to pass to the : * transfn. (This will help execTuplesMatch too, so we do it : * immediately.) : */ : slot_getsomeattrs(slot1, numTransInputs); 0.00 : 5ba265: 44 89 ee mov %r13d,%esi 0.00 : 5ba268: 48 89 df mov %rbx,%rdi 0.00 : 5ba26b: e8 f0 4f eb ff callq 46f260 : : if (numDistinctCols == 0 || 0.00 : 5ba270: 8b 45 bc mov -0x44(%rbp),%eax 0.00 : 5ba273: 85 c0 test %eax,%eax 0.00 : 5ba275: 0f 94 85 0f ff ff ff sete -0xf1(%rbp) 0.00 : 5ba27c: 75 8d jne 5ba20b : peraggstate->equalfns, : workcontext)) : { : /* Load values into fcinfo */ : /* Start from 1, since the 0th arg will be the transition value */ : for (i = 0; i < numTransInputs; i++) 0.00 : 5ba27e: 45 85 ed test %r13d,%r13d 0.00 : 5ba281: 7e 2e jle 5ba2b1 0.00 : 5ba283: 31 d2 xor %edx,%edx 0.00 : 5ba285: 0f 1f 00 nopl (%rax) : { : fcinfo->arg[i + 1] = slot1->tts_values[i]; 0.00 : 5ba288: 48 8b 43 28 mov 0x28(%rbx),%rax 0.00 : 5ba28c: 48 8b 04 d0 mov (%rax,%rdx,8),%rax 0.00 : 5ba290: 49 89 84 d4 28 01 00 mov %rax,0x128(%r12,%rdx,8) 0.00 : 5ba297: 00 : fcinfo->argnull[i + 1] = slot1->tts_isnull[i]; 0.00 : 5ba298: 48 8b 43 30 mov 0x30(%rbx),%rax 0.00 : 5ba29c: 0f b6 04 10 movzbl (%rax,%rdx,1),%eax 0.00 : 5ba2a0: 41 88 84 14 41 04 00 mov %al,0x441(%r12,%rdx,1) 0.00 : 5ba2a7: 00 0.00 : 5ba2a8: 48 83 c2 01 add $0x1,%rdx : peraggstate->equalfns, : workcontext)) : { : /* Load values into fcinfo */ : /* Start from 1, since the 0th arg will be the transition value */ : for (i = 0; i < numTransInputs; i++) 0.00 : 5ba2ac: 41 39 d5 cmp %edx,%r13d 0.00 : 5ba2af: 7f d7 jg 5ba288 : { : fcinfo->arg[i + 1] = slot1->tts_values[i]; : fcinfo->argnull[i + 1] = slot1->tts_isnull[i]; : } : : advance_transition_function(aggstate, peraggstate, pergroupstate); 0.00 : 5ba2b1: 48 8b 95 38 ff ff ff mov -0xc8(%rbp),%rdx 0.00 : 5ba2b8: 4c 89 e6 mov %r12,%rsi 0.00 : 5ba2bb: 4c 89 f7 mov %r14,%rdi 0.00 : 5ba2be: e8 cd f4 ff ff callq 5b9790 : : if (numDistinctCols > 0) 0.00 : 5ba2c3: 8b 45 bc mov -0x44(%rbp),%eax 0.00 : 5ba2c6: 85 c0 test %eax,%eax 0.00 : 5ba2c8: 7e 0d jle 5ba2d7 0.00 : 5ba2ca: 48 89 df mov %rbx,%rdi 0.00 : 5ba2cd: c6 45 bb 01 movb $0x1,-0x45(%rbp) 0.00 : 5ba2d1: 4c 89 fb mov %r15,%rbx 0.00 : 5ba2d4: 49 89 ff mov %rdi,%r15 : haveOldValue = true; : } : } : : /* Reset context each time, unless execTuplesMatch did it for us */ : if (numDistinctCols == 0) 0.00 : 5ba2d7: 80 bd 0f ff ff ff 00 cmpb $0x0,-0xf1(%rbp) 0.00 : 5ba2de: 0f 84 5c ff ff ff je 5ba240 : MemoryContextReset(workcontext); 0.00 : 5ba2e4: 48 8b 7d c0 mov -0x40(%rbp),%rdi 0.00 : 5ba2e8: e8 c3 e6 1d 00 callq 7989b0 0.00 : 5ba2ed: e9 4e ff ff ff jmpq 5ba240 : AggStatePerGroup pergroupstate) : { : Datum oldVal = (Datum) 0; : bool oldIsNull = true; : bool haveOldVal = false; : MemoryContext workcontext = aggstate->tmpcontext->ecxt_per_tuple_memory; 0.00 : 5ba2f2: 49 8b 86 c0 00 00 00 mov 0xc0(%r14),%rax : : tuplesort_performsort(peraggstate->sortstate); : : /* Load the column into argument 1 (arg 0 will be transition value) */ : newVal = fcinfo->arg + 1; : isNull = fcinfo->argnull + 1; 0.00 : 5ba2f9: 45 31 ed xor %r13d,%r13d 0.00 : 5ba2fc: bb 01 00 00 00 mov $0x1,%ebx 0.00 : 5ba301: 45 31 ff xor %r15d,%r15d : AggStatePerGroup pergroupstate) : { : Datum oldVal = (Datum) 0; : bool oldIsNull = true; : bool haveOldVal = false; : MemoryContext workcontext = aggstate->tmpcontext->ecxt_per_tuple_memory; 0.00 : 5ba304: 48 8b 40 28 mov 0x28(%rax),%rax 0.00 : 5ba308: 48 89 45 a8 mov %rax,-0x58(%rbp) : MemoryContext oldContext; : bool isDistinct = (peraggstate->numDistinctCols > 0); 0.00 : 5ba30c: 41 8b 84 24 90 00 00 mov 0x90(%r12),%eax 0.00 : 5ba313: 00 0.00 : 5ba314: 89 45 b4 mov %eax,-0x4c(%rbp) : Datum *newVal; : bool *isNull; : : Assert(peraggstate->numDistinctCols < 2); : : tuplesort_performsort(peraggstate->sortstate); 0.00 : 5ba317: 49 8b bc 24 f8 00 00 mov 0xf8(%r12),%rdi 0.00 : 5ba31e: 00 0.00 : 5ba31f: e8 cc 7c 1e 00 callq 7a1ff0 : : /* Load the column into argument 1 (arg 0 will be transition value) */ : newVal = fcinfo->arg + 1; 0.00 : 5ba324: 49 8d 94 24 28 01 00 lea 0x128(%r12),%rdx 0.00 : 5ba32b: 00 : isNull = fcinfo->argnull + 1; 0.00 : 5ba32c: 49 8d 84 24 41 04 00 lea 0x441(%r12),%rax 0.00 : 5ba333: 00 : Assert(peraggstate->numDistinctCols < 2); : : tuplesort_performsort(peraggstate->sortstate); : : /* Load the column into argument 1 (arg 0 will be transition value) */ : newVal = fcinfo->arg + 1; 0.00 : 5ba334: 48 89 55 98 mov %rdx,-0x68(%rbp) : isNull = fcinfo->argnull + 1; 0.00 : 5ba338: 48 89 45 90 mov %rax,-0x70(%rbp) 0.00 : 5ba33c: eb 3c jmp 5ba37a : if (!peraggstate->inputtypeByVal && !*isNull) : pfree(DatumGetPointer(*newVal)); : } : else : { : advance_transition_function(aggstate, peraggstate, pergroupstate); 0.00 : 5ba33e: 48 8b 95 38 ff ff ff mov -0xc8(%rbp),%rdx 0.00 : 5ba345: 4c 89 e6 mov %r12,%rsi 0.00 : 5ba348: 4c 89 f7 mov %r14,%rdi 0.00 : 5ba34b: e8 40 f4 ff ff callq 5b9790 : /* forget the old value, if any */ : if (!oldIsNull && !peraggstate->inputtypeByVal) 0.00 : 5ba350: 84 db test %bl,%bl 0.00 : 5ba352: 0f 84 98 00 00 00 je 5ba3f0 : pfree(DatumGetPointer(oldVal)); : /* and remember the new one for subsequent equality checks */ : oldVal = *newVal; : oldIsNull = *isNull; 0.00 : 5ba358: 41 0f b6 9c 24 41 04 movzbl 0x441(%r12),%ebx 0.00 : 5ba35f: 00 00 : advance_transition_function(aggstate, peraggstate, pergroupstate); : /* forget the old value, if any */ : if (!oldIsNull && !peraggstate->inputtypeByVal) : pfree(DatumGetPointer(oldVal)); : /* and remember the new one for subsequent equality checks */ : oldVal = *newVal; 0.00 : 5ba361: 4d 8b bc 24 28 01 00 mov 0x128(%r12),%r15 0.00 : 5ba368: 00 : STATIC_IF_INLINE MemoryContext : MemoryContextSwitchTo(MemoryContext context) : { : MemoryContext old = CurrentMemoryContext; : : CurrentMemoryContext = context; 0.00 : 5ba369: 48 8b 55 a0 mov -0x60(%rbp),%rdx 0.00 : 5ba36d: 41 bd 01 00 00 00 mov $0x1,%r13d 0.00 : 5ba373: 48 89 15 e6 04 60 00 mov %rdx,0x6004e6(%rip) # bba860 : * Note: if input type is pass-by-ref, the datums returned by the sort are : * freshly palloc'd in the per-query context, so we must be careful to : * pfree them when they are no longer needed. : */ : : while (tuplesort_getdatum(peraggstate->sortstate, true, 0.00 : 5ba37a: 49 8b bc 24 f8 00 00 mov 0xf8(%r12),%rdi 0.00 : 5ba381: 00 0.00 : 5ba382: 48 8b 4d 90 mov -0x70(%rbp),%rcx 0.00 : 5ba386: be 01 00 00 00 mov $0x1,%esi 0.00 : 5ba38b: 48 8b 55 98 mov -0x68(%rbp),%rdx 0.00 : 5ba38f: e8 2c 3e 1e 00 callq 79e1c0 0.00 : 5ba394: 84 c0 test %al,%al 0.00 : 5ba396: 0f 84 e0 00 00 00 je 5ba47c : { : /* : * Clear and select the working context for evaluation of the equality : * function and transition function. : */ : MemoryContextReset(workcontext); 0.00 : 5ba39c: 48 8b 7d a8 mov -0x58(%rbp),%rdi 0.00 : 5ba3a0: e8 0b e6 1d 00 callq 7989b0 0.00 : 5ba3a5: 48 8b 45 a8 mov -0x58(%rbp),%rax : #endif /* !PG_USE_INLINE */ : #if defined(PG_USE_INLINE) || defined(MCXT_INCLUDE_DEFINITIONS) : STATIC_IF_INLINE MemoryContext : MemoryContextSwitchTo(MemoryContext context) : { : MemoryContext old = CurrentMemoryContext; 0.00 : 5ba3a9: 48 8b 15 b0 04 60 00 mov 0x6004b0(%rip),%rdx # bba860 : : CurrentMemoryContext = context; 0.00 : 5ba3b0: 48 89 05 a9 04 60 00 mov %rax,0x6004a9(%rip) # bba860 : /* : * If DISTINCT mode, and not distinct from prior, skip it. : * : * Note: we assume equality functions don't care about collation. : */ : if (isDistinct && 0.00 : 5ba3b7: 8b 45 b4 mov -0x4c(%rbp),%eax : #endif /* !PG_USE_INLINE */ : #if defined(PG_USE_INLINE) || defined(MCXT_INCLUDE_DEFINITIONS) : STATIC_IF_INLINE MemoryContext : MemoryContextSwitchTo(MemoryContext context) : { : MemoryContext old = CurrentMemoryContext; 0.00 : 5ba3ba: 48 89 55 a0 mov %rdx,-0x60(%rbp) 0.00 : 5ba3be: 85 c0 test %eax,%eax 0.00 : 5ba3c0: 0f 8e 78 ff ff ff jle 5ba33e 0.00 : 5ba3c6: 45 84 ed test %r13b,%r13b 0.00 : 5ba3c9: 0f 84 6f ff ff ff je 5ba33e 0.00 : 5ba3cf: 84 db test %bl,%bl 0.00 : 5ba3d1: 75 39 jne 5ba40c 0.00 : 5ba3d3: 41 80 bc 24 41 04 00 cmpb $0x0,0x441(%r12) 0.00 : 5ba3da: 00 00 0.00 : 5ba3dc: 74 50 je 5ba42e : if (!peraggstate->inputtypeByVal && !*isNull) : pfree(DatumGetPointer(*newVal)); : } : else : { : advance_transition_function(aggstate, peraggstate, pergroupstate); 0.00 : 5ba3de: 48 8b 95 38 ff ff ff mov -0xc8(%rbp),%rdx 0.00 : 5ba3e5: 4c 89 e6 mov %r12,%rsi 0.00 : 5ba3e8: 4c 89 f7 mov %r14,%rdi 0.00 : 5ba3eb: e8 a0 f3 ff ff callq 5b9790 : /* forget the old value, if any */ : if (!oldIsNull && !peraggstate->inputtypeByVal) 0.00 : 5ba3f0: 41 80 bc 24 d0 00 00 cmpb $0x0,0xd0(%r12) 0.00 : 5ba3f7: 00 00 0.00 : 5ba3f9: 0f 85 59 ff ff ff jne 5ba358 : pfree(DatumGetPointer(oldVal)); 0.00 : 5ba3ff: 4c 89 ff mov %r15,%rdi 0.00 : 5ba402: e8 79 e7 1d 00 callq 798b80 0.00 : 5ba407: e9 4c ff ff ff jmpq 5ba358 : /* : * If DISTINCT mode, and not distinct from prior, skip it. : * : * Note: we assume equality functions don't care about collation. : */ : if (isDistinct && 0.00 : 5ba40c: 41 80 bc 24 41 04 00 cmpb $0x0,0x441(%r12) 0.00 : 5ba413: 00 00 0.00 : 5ba415: 75 35 jne 5ba44c : if (!peraggstate->inputtypeByVal && !*isNull) : pfree(DatumGetPointer(*newVal)); : } : else : { : advance_transition_function(aggstate, peraggstate, pergroupstate); 0.00 : 5ba417: 48 8b 95 38 ff ff ff mov -0xc8(%rbp),%rdx 0.00 : 5ba41e: 4c 89 e6 mov %r12,%rsi 0.00 : 5ba421: 4c 89 f7 mov %r14,%rdi 0.00 : 5ba424: e8 67 f3 ff ff callq 5b9790 0.00 : 5ba429: e9 2a ff ff ff jmpq 5ba358 : /* : * If DISTINCT mode, and not distinct from prior, skip it. : * : * Note: we assume equality functions don't care about collation. : */ : if (isDistinct && 0.00 : 5ba42e: 49 8b 8c 24 28 01 00 mov 0x128(%r12),%rcx 0.00 : 5ba435: 00 0.00 : 5ba436: 49 8b bc 24 b8 00 00 mov 0xb8(%r12),%rdi 0.00 : 5ba43d: 00 0.00 : 5ba43e: 31 f6 xor %esi,%esi 0.00 : 5ba440: 4c 89 fa mov %r15,%rdx 0.00 : 5ba443: e8 e8 3b 1c 00 callq 77e030 0.00 : 5ba448: 84 c0 test %al,%al 0.00 : 5ba44a: 74 92 je 5ba3de : (!oldIsNull && !*isNull && : DatumGetBool(FunctionCall2(&peraggstate->equalfns[0], : oldVal, *newVal))))) : { : /* equal to prior, so forget this one */ : if (!peraggstate->inputtypeByVal && !*isNull) 0.00 : 5ba44c: 41 80 bc 24 d0 00 00 cmpb $0x0,0xd0(%r12) 0.00 : 5ba453: 00 00 0.00 : 5ba455: 0f 85 0e ff ff ff jne 5ba369 0.00 : 5ba45b: 41 80 bc 24 41 04 00 cmpb $0x0,0x441(%r12) 0.00 : 5ba462: 00 00 0.00 : 5ba464: 0f 85 ff fe ff ff jne 5ba369 : pfree(DatumGetPointer(*newVal)); 0.00 : 5ba46a: 49 8b bc 24 28 01 00 mov 0x128(%r12),%rdi 0.00 : 5ba471: 00 0.00 : 5ba472: e8 09 e7 1d 00 callq 798b80 0.00 : 5ba477: e9 ed fe ff ff jmpq 5ba369 : } : : MemoryContextSwitchTo(oldContext); : } : : if (!oldIsNull && !peraggstate->inputtypeByVal) 0.00 : 5ba47c: 84 db test %bl,%bl 0.00 : 5ba47e: 0f 85 8e fa ff ff jne 5b9f12 0.00 : 5ba484: 41 80 bc 24 d0 00 00 cmpb $0x0,0xd0(%r12) 0.00 : 5ba48b: 00 00 0.00 : 5ba48d: 0f 1f 00 nopl (%rax) 0.00 : 5ba490: 0f 85 7c fa ff ff jne 5b9f12 : pfree(DatumGetPointer(oldVal)); 0.00 : 5ba496: 4c 89 ff mov %r15,%rdi 0.00 : 5ba499: e8 e2 e6 1d 00 callq 798b80 0.00 : 5ba49e: e9 6f fa ff ff jmpq 5b9f12 : * and the representative input tuple. : */ : TupleTableSlot *result; : ExprDoneCond isDone; : : result = ExecProject(aggstate->ss.ps.ps_ProjInfo, &isDone); 0.00 : 5ba4a3: 49 8b 7e 68 mov 0x68(%r14),%rdi 0.00 : 5ba4a7: 48 8d 75 d4 lea -0x2c(%rbp),%rsi 0.00 : 5ba4ab: e8 50 2b ff ff callq 5ad000 : : if (isDone != ExprEndResult) 0.00 : 5ba4b0: 8b 55 d4 mov -0x2c(%rbp),%edx 0.00 : 5ba4b3: 83 fa 02 cmp $0x2,%edx 0.00 : 5ba4b6: 0f 84 f0 fa ff ff je 5b9fac : { : aggstate->ss.ps.ps_TupFromTlist = 0.00 : 5ba4bc: 83 ea 01 sub $0x1,%edx 0.00 : 5ba4bf: 41 0f 94 46 70 sete 0x70(%r14) 0.00 : 5ba4c4: e9 ef fa ff ff jmpq 5b9fb8 0.00 : 5ba4c9: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : : outerslot = ExecProcNode(outerPlan); : if (TupIsNull(outerslot)) : { : /* no more outer-plan tuples available */ : aggstate->agg_done = true; 0.00 : 5ba4d0: 41 c6 86 d0 00 00 00 movb $0x1,0xd0(%r14) 0.00 : 5ba4d7: 01 0.00 : 5ba4d8: e9 5f fc ff ff jmpq 5ba13c : * If we don't already have the first tuple of the new group, fetch it : * from the outer plan. : */ : if (aggstate->grp_firstTuple == NULL) : { : outerslot = ExecProcNode(outerPlan); 0.00 : 5ba4dd: 48 8b 7d 80 mov -0x80(%rbp),%rdi 0.00 : 5ba4e1: e8 ba 1f ff ff callq 5ac4a0 : if (!TupIsNull(outerslot)) 0.00 : 5ba4e6: 48 85 c0 test %rax,%rax : * If we don't already have the first tuple of the new group, fetch it : * from the outer plan. : */ : if (aggstate->grp_firstTuple == NULL) : { : outerslot = ExecProcNode(outerPlan); 0.00 : 5ba4e9: 48 89 c7 mov %rax,%rdi : if (!TupIsNull(outerslot)) 0.00 : 5ba4ec: 74 06 je 5ba4f4 0.00 : 5ba4ee: 80 78 04 00 cmpb $0x0,0x4(%rax) 0.00 : 5ba4f2: 74 1f je 5ba513 : else : { : /* outer plan produced no tuples at all */ : aggstate->agg_done = true; : /* If we are grouping, we should produce no tuples too */ : if (node->aggstrategy != AGG_PLAIN) 0.00 : 5ba4f4: 48 8b 85 10 ff ff ff mov -0xf0(%rbp),%rax : aggstate->grp_firstTuple = ExecCopySlotTuple(outerslot); : } : else : { : /* outer plan produced no tuples at all */ : aggstate->agg_done = true; 0.00 : 5ba4fb: 41 c6 86 d0 00 00 00 movb $0x1,0xd0(%r14) 0.00 : 5ba502: 01 : /* If we are grouping, we should produce no tuples too */ : if (node->aggstrategy != AGG_PLAIN) 0.00 : 5ba503: 8b 40 60 mov 0x60(%rax),%eax 0.00 : 5ba506: 85 c0 test %eax,%eax 0.00 : 5ba508: 0f 84 2b fb ff ff je 5ba039 0.00 : 5ba50e: e9 a3 fa ff ff jmpq 5b9fb6 : { : /* : * Make a copy of the first input tuple; we will use this for : * comparisons (in group mode) and for projection. : */ : aggstate->grp_firstTuple = ExecCopySlotTuple(outerslot); 0.00 : 5ba513: e8 98 9a ff ff callq 5b3fb0 0.00 : 5ba518: 49 89 86 e0 00 00 00 mov %rax,0xe0(%r14) 0.00 : 5ba51f: 90 nop 0.00 : 5ba520: e9 14 fb ff ff jmpq 5ba039 : * and the representative input tuple. : */ : TupleTableSlot *result; : ExprDoneCond isDone; : : result = ExecProject(aggstate->ss.ps.ps_ProjInfo, &isDone); 0.00 : 5ba525: 49 8b 7e 68 mov 0x68(%r14),%rdi 0.00 : 5ba529: 48 8d 75 d4 lea -0x2c(%rbp),%rsi 0.00 : 5ba52d: e8 ce 2a ff ff callq 5ad000 : : if (isDone != ExprEndResult) 0.00 : 5ba532: 8b 55 d4 mov -0x2c(%rbp),%edx 0.00 : 5ba535: 83 fa 02 cmp $0x2,%edx 0.00 : 5ba538: 0f 84 ba f9 ff ff je 5b9ef8 0.00 : 5ba53e: e9 79 ff ff ff jmpq 5ba4bc : */ : entry = (AggHashEntry) ScanTupleHashTable(&aggstate->hashiter); : if (entry == NULL) : { : /* No more entries in hashtable, so done */ : aggstate->agg_done = TRUE; 0.00 : 5ba543: 41 c6 86 d0 00 00 00 movb $0x1,0xd0(%r14) 0.00 : 5ba54a: 01 0.00 : 5ba54b: 31 c0 xor %eax,%eax 0.00 : 5ba54d: e9 66 fa ff ff jmpq 5b9fb8 : TupleTableSlot *outerslot; : : /* : * get state info from node : */ : outerPlan = outerPlanState(aggstate); 0.00 : 5ba552: 4d 8b 6e 30 mov 0x30(%r14),%r13 : /* tmpcontext is the per-input-tuple expression context */ : tmpcontext = aggstate->tmpcontext; 0.00 : 5ba556: 4d 8b be c0 00 00 00 mov 0xc0(%r14),%r15 : * Process each outer-plan tuple, and then fetch the next one, until we : * exhaust the outer plan. : */ : for (;;) : { : outerslot = ExecProcNode(outerPlan); 0.00 : 5ba55d: 4c 89 ef mov %r13,%rdi 0.00 : 5ba560: e8 3b 1f ff ff callq 5ac4a0 : if (TupIsNull(outerslot)) 0.00 : 5ba565: 48 85 c0 test %rax,%rax : * Process each outer-plan tuple, and then fetch the next one, until we : * exhaust the outer plan. : */ : for (;;) : { : outerslot = ExecProcNode(outerPlan); 0.00 : 5ba568: 48 89 c3 mov %rax,%rbx : if (TupIsNull(outerslot)) 0.00 : 5ba56b: 0f 84 db 00 00 00 je 5ba64c 0.00 : 5ba571: 80 78 04 00 cmpb $0x0,0x4(%rax) 0.00 : 5ba575: 0f 85 d1 00 00 00 jne 5ba64c : break; : /* set up for advance_aggregates call */ : tmpcontext->ecxt_outertuple = outerslot; 0.00 : 5ba57b: 49 89 47 18 mov %rax,0x18(%r15) : * When called, CurrentMemoryContext should be the per-query context. : */ : static AggHashEntry : lookup_hash_entry(AggState *aggstate, TupleTableSlot *inputslot) : { : TupleTableSlot *hashslot = aggstate->hashslot; /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeAgg.c:1029 25.00 : 5ba57f: 4d 8b a6 f0 00 00 00 mov 0xf0(%r14),%r12 : ListCell *l; : AggHashEntry entry; : bool isnew; : : /* if first time through, initialize hashslot by cloning input slot */ : if (hashslot->tts_tupleDescriptor == NULL) 0.00 : 5ba586: 49 83 7c 24 10 00 cmpq $0x0,0x10(%r12) 0.00 : 5ba58c: 75 14 jne 5ba5a2 : { : ExecSetSlotDescriptor(hashslot, inputslot->tts_tupleDescriptor); 0.00 : 5ba58e: 48 8b 70 10 mov 0x10(%rax),%rsi 0.00 : 5ba592: 4c 89 e7 mov %r12,%rdi 0.00 : 5ba595: e8 16 a0 ff ff callq 5b45b0 : /* Make sure all unused columns are NULLs */ : ExecStoreAllNullTuple(hashslot); 0.00 : 5ba59a: 4c 89 e7 mov %r12,%rdi 0.00 : 5ba59d: e8 1e 9d ff ff callq 5b42c0 : } : : /* transfer just the needed columns into hashslot */ : slot_getsomeattrs(inputslot, linitial_int(aggstate->hash_needed)); 0.00 : 5ba5a2: 49 8b 96 f8 00 00 00 mov 0xf8(%r14),%rdx : #endif /* PG_USE_INLINE */ : #if defined(PG_USE_INLINE) || defined(PG_LIST_INCLUDE_DEFINITIONS) : STATIC_IF_INLINE ListCell * : list_head(const List *l) : { : return l ? l->head : NULL; 0.00 : 5ba5a9: 31 c0 xor %eax,%eax 0.00 : 5ba5ab: 48 85 d2 test %rdx,%rdx 0.00 : 5ba5ae: 74 04 je 5ba5b4 0.00 : 5ba5b0: 48 8b 42 08 mov 0x8(%rdx),%rax 0.00 : 5ba5b4: 8b 30 mov (%rax),%esi /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeAgg.c:1043 50.00 : 5ba5b6: 48 89 df mov %rbx,%rdi 0.00 : 5ba5b9: e8 a2 4c eb ff callq 46f260 : foreach(l, aggstate->hash_needed) 0.00 : 5ba5be: 49 8b 86 f8 00 00 00 mov 0xf8(%r14),%rax 0.00 : 5ba5c5: 48 85 c0 test %rax,%rax 0.00 : 5ba5c8: 74 3a je 5ba604 0.00 : 5ba5ca: 48 8b 70 08 mov 0x8(%rax),%rsi 0.00 : 5ba5ce: 48 85 f6 test %rsi,%rsi 0.00 : 5ba5d1: 74 31 je 5ba604 : { : int varNumber = lfirst_int(l) - 1; : : hashslot->tts_values[varNumber] = inputslot->tts_values[varNumber]; 0.00 : 5ba5d3: 8b 06 mov (%rsi),%eax 0.00 : 5ba5d5: 48 8b 53 28 mov 0x28(%rbx),%rdx 0.00 : 5ba5d9: 49 8b 4c 24 28 mov 0x28(%r12),%rcx 0.00 : 5ba5de: 83 e8 01 sub $0x1,%eax 0.00 : 5ba5e1: 48 98 cltq 0.00 : 5ba5e3: 48 8b 14 c2 mov (%rdx,%rax,8),%rdx 0.00 : 5ba5e7: 48 89 14 c1 mov %rdx,(%rcx,%rax,8) : hashslot->tts_isnull[varNumber] = inputslot->tts_isnull[varNumber]; 0.00 : 5ba5eb: 48 8b 53 30 mov 0x30(%rbx),%rdx 0.00 : 5ba5ef: 49 8b 4c 24 30 mov 0x30(%r12),%rcx 0.00 : 5ba5f4: 0f b6 14 02 movzbl (%rdx,%rax,1),%edx 0.00 : 5ba5f8: 88 14 01 mov %dl,(%rcx,%rax,1) : ExecStoreAllNullTuple(hashslot); : } : : /* transfer just the needed columns into hashslot */ : slot_getsomeattrs(inputslot, linitial_int(aggstate->hash_needed)); : foreach(l, aggstate->hash_needed) 0.00 : 5ba5fb: 48 8b 76 08 mov 0x8(%rsi),%rsi 0.00 : 5ba5ff: 48 85 f6 test %rsi,%rsi 0.00 : 5ba602: 75 cf jne 5ba5d3 : hashslot->tts_values[varNumber] = inputslot->tts_values[varNumber]; : hashslot->tts_isnull[varNumber] = inputslot->tts_isnull[varNumber]; : } : : /* find or create the hashtable entry using the filtered tuple */ : entry = (AggHashEntry) LookupTupleHashEntry(aggstate->hashtable, 0.00 : 5ba604: 49 8b be e8 00 00 00 mov 0xe8(%r14),%rdi 0.00 : 5ba60b: 48 8d 55 d4 lea -0x2c(%rbp),%rdx 0.00 : 5ba60f: 4c 89 e6 mov %r12,%rsi 0.00 : 5ba612: e8 59 e8 fe ff callq 5a8e70 : hashslot, : &isnew); : : if (isnew) 0.00 : 5ba617: 80 7d d4 00 cmpb $0x0,-0x2c(%rbp) 0.00 : 5ba61b: 48 8d 58 08 lea 0x8(%rax),%rbx 0.00 : 5ba61f: 74 12 je 5ba633 : { : /* initialize aggregates for new tuple group */ : initialize_aggregates(aggstate, aggstate->peragg, entry->pergroup); 0.00 : 5ba621: 49 8b b6 b0 00 00 00 mov 0xb0(%r14),%rsi 0.00 : 5ba628: 48 89 da mov %rbx,%rdx 0.00 : 5ba62b: 4c 89 f7 mov %r14,%rdi 0.00 : 5ba62e: e8 9d ef ff ff callq 5b95d0 : : /* Find or build hashtable entry for this tuple's group */ : entry = lookup_hash_entry(aggstate, outerslot); : : /* Advance the aggregates */ : advance_aggregates(aggstate, entry->pergroup); /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeAgg.c:1359 25.00 : 5ba633: 4c 89 f7 mov %r14,%rdi 0.00 : 5ba636: 48 89 de mov %rbx,%rsi 0.00 : 5ba639: e8 12 f3 ff ff callq 5b9950 : : /* Reset per-input-tuple context after each tuple */ : ResetExprContext(tmpcontext); 0.00 : 5ba63e: 49 8b 7f 28 mov 0x28(%r15),%rdi 0.00 : 5ba642: e8 69 e3 1d 00 callq 7989b0 0.00 : 5ba647: e9 11 ff ff ff jmpq 5ba55d : } : : aggstate->table_filled = true; : /* Initialize to walk the hash table */ : ResetTupleHashIterator(aggstate->hashtable, &aggstate->hashiter); 0.00 : 5ba64c: 49 8b 86 e8 00 00 00 mov 0xe8(%r14),%rax : : /* Reset per-input-tuple context after each tuple */ : ResetExprContext(tmpcontext); : } : : aggstate->table_filled = true; 0.00 : 5ba653: 41 c6 86 00 01 00 00 movb $0x1,0x100(%r14) 0.00 : 5ba65a: 01 : /* Initialize to walk the hash table */ : ResetTupleHashIterator(aggstate->hashtable, &aggstate->hashiter); 0.00 : 5ba65b: 4d 8d be 08 01 00 00 lea 0x108(%r14),%r15 0.00 : 5ba662: 48 8b 38 mov (%rax),%rdi 0.00 : 5ba665: e8 f6 92 1c 00 callq 783960 0.00 : 5ba66a: 49 8b 86 e8 00 00 00 mov 0xe8(%r14),%rax 0.00 : 5ba671: 4c 89 ff mov %r15,%rdi 0.00 : 5ba674: 48 8b 30 mov (%rax),%rsi 0.00 : 5ba677: e8 b4 97 1c 00 callq 783e30 0.00 : 5ba67c: 41 0f b6 86 d0 00 00 movzbl 0xd0(%r14),%eax 0.00 : 5ba683: 00 0.00 : 5ba684: e9 6c f7 ff ff jmpq 5b9df5 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 50.00 /home/Computational/mark/src/postgres-andres/src/backend/postmaster/pgstat.c:1504 25.00 /home/Computational/mark/src/postgres-andres/src/backend/postmaster/pgstat.c:1504 25.00 /home/Computational/mark/src/postgres-andres/src/backend/postmaster/pgstat.c:1546 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000642780 : : * Called by the executor before invoking a function. : */ : void : pgstat_init_function_usage(FunctionCallInfoData *fcinfo, : PgStat_FunctionCallUsage *fcu) : { 0.00 : 642780: 55 push %rbp /home/Computational/mark/src/postgres-andres/src/backend/postmaster/pgstat.c:1504 50.00 : 642781: 48 89 e5 mov %rsp,%rbp 0.00 : 642784: 41 54 push %r12 0.00 : 642786: 49 89 fc mov %rdi,%r12 0.00 : 642789: 53 push %rbx 25.00 : 64278a: 48 89 f3 mov %rsi,%rbx 0.00 : 64278d: 48 83 ec 70 sub $0x70,%rsp : PgStat_BackendFunctionEntry *htabent; : bool found; : : if (pgstat_track_functions <= fcinfo->flinfo->fn_stats) 0.00 : 642791: 48 8b 17 mov (%rdi),%rdx 0.00 : 642794: 0f b6 42 10 movzbl 0x10(%rdx),%eax 0.00 : 642798: 3b 05 06 94 53 00 cmp 0x539406(%rip),%eax # b7bba4 0.00 : 64279e: 0f 8d ac 00 00 00 jge 642850 : /* stats not wanted */ : fcu->fs = NULL; : return; : } : : if (!pgStatFunctions) 0.00 : 6427a4: 48 83 3d 04 95 53 00 cmpq $0x0,0x539504(%rip) # b7bcb0 0.00 : 6427ab: 00 0.00 : 6427ac: 0f 84 de 00 00 00 je 642890 : &hash_ctl, : HASH_ELEM | HASH_FUNCTION); : } : : /* Get the stats entry for this function, create if necessary */ : htabent = hash_search(pgStatFunctions, &fcinfo->flinfo->fn_oid, 0.00 : 6427b2: 48 8b 3d f7 94 53 00 mov 0x5394f7(%rip),%rdi # b7bcb0 0.00 : 6427b9: 48 8d 72 08 lea 0x8(%rdx),%rsi 0.00 : 6427bd: 48 8d 4d ef lea -0x11(%rbp),%rcx 0.00 : 6427c1: ba 01 00 00 00 mov $0x1,%edx 0.00 : 6427c6: e8 d5 1e 14 00 callq 7846a0 : HASH_ENTER, &found); : if (!found) 0.00 : 6427cb: 80 7d ef 00 cmpb $0x0,-0x11(%rbp) : &hash_ctl, : HASH_ELEM | HASH_FUNCTION); : } : : /* Get the stats entry for this function, create if necessary */ : htabent = hash_search(pgStatFunctions, &fcinfo->flinfo->fn_oid, 0.00 : 6427cf: 48 89 c2 mov %rax,%rdx 0.00 : 6427d2: 48 8d 40 08 lea 0x8(%rax),%rax : HASH_ENTER, &found); : if (!found) 0.00 : 6427d6: 74 40 je 642818 : MemSet(&htabent->f_counts, 0, sizeof(PgStat_FunctionCounts)); : : fcu->fs = &htabent->f_counts; 0.00 : 6427d8: 48 89 03 mov %rax,(%rbx) : : /* save stats for this function, later used to compensate for recursion */ : fcu->save_f_total_time = htabent->f_counts.f_total_time; 0.00 : 6427db: 48 8b 42 10 mov 0x10(%rdx),%rax : : /* save current backend-wide total time */ : fcu->save_total = total_func_time; : : /* get clock time as of function start */ : INSTR_TIME_SET_CURRENT(fcu->f_start); 0.00 : 6427df: 48 8d 7b 28 lea 0x28(%rbx),%rdi 0.00 : 6427e3: 31 f6 xor %esi,%esi : MemSet(&htabent->f_counts, 0, sizeof(PgStat_FunctionCounts)); : : fcu->fs = &htabent->f_counts; : : /* save stats for this function, later used to compensate for recursion */ : fcu->save_f_total_time = htabent->f_counts.f_total_time; 0.00 : 6427e5: 48 89 43 08 mov %rax,0x8(%rbx) 0.00 : 6427e9: 48 8b 42 18 mov 0x18(%rdx),%rax 0.00 : 6427ed: 48 89 43 10 mov %rax,0x10(%rbx) : : /* save current backend-wide total time */ : fcu->save_total = total_func_time; 0.00 : 6427f1: 48 8b 05 28 97 53 00 mov 0x539728(%rip),%rax # b7bf20 0.00 : 6427f8: 48 89 43 18 mov %rax,0x18(%rbx) 0.00 : 6427fc: 48 8b 05 25 97 53 00 mov 0x539725(%rip),%rax # b7bf28 0.00 : 642803: 48 89 43 20 mov %rax,0x20(%rbx) : : /* get clock time as of function start */ : INSTR_TIME_SET_CURRENT(fcu->f_start); 0.00 : 642807: e8 b4 6d e2 ff callq 4695c0 : } 0.00 : 64280c: 48 83 c4 70 add $0x70,%rsp 0.00 : 642810: 5b pop %rbx 0.00 : 642811: 41 5c pop %r12 0.00 : 642813: c9 leaveq 0.00 : 642814: c3 retq 0.00 : 642815: 0f 1f 00 nopl (%rax) : : /* Get the stats entry for this function, create if necessary */ : htabent = hash_search(pgStatFunctions, &fcinfo->flinfo->fn_oid, : HASH_ENTER, &found); : if (!found) : MemSet(&htabent->f_counts, 0, sizeof(PgStat_FunctionCounts)); 0.00 : 642818: a8 07 test $0x7,%al 0.00 : 64281a: 75 44 jne 642860 0.00 : 64281c: 48 c7 42 08 00 00 00 movq $0x0,0x8(%rdx) 0.00 : 642823: 00 0.00 : 642824: 48 c7 42 10 00 00 00 movq $0x0,0x10(%rdx) 0.00 : 64282b: 00 0.00 : 64282c: 48 c7 42 18 00 00 00 movq $0x0,0x18(%rdx) 0.00 : 642833: 00 0.00 : 642834: 48 c7 42 20 00 00 00 movq $0x0,0x20(%rdx) 0.00 : 64283b: 00 0.00 : 64283c: 48 c7 42 28 00 00 00 movq $0x0,0x28(%rdx) 0.00 : 642843: 00 0.00 : 642844: eb 92 jmp 6427d8 0.00 : 642846: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 0.00 : 64284d: 00 00 00 : bool found; : : if (pgstat_track_functions <= fcinfo->flinfo->fn_stats) : { : /* stats not wanted */ : fcu->fs = NULL; 0.00 : 642850: 48 c7 06 00 00 00 00 movq $0x0,(%rsi) : /* save current backend-wide total time */ : fcu->save_total = total_func_time; : : /* get clock time as of function start */ : INSTR_TIME_SET_CURRENT(fcu->f_start); : } 0.00 : 642857: 48 83 c4 70 add $0x70,%rsp 0.00 : 64285b: 5b pop %rbx 0.00 : 64285c: 41 5c pop %r12 0.00 : 64285e: c9 leaveq /home/Computational/mark/src/postgres-andres/src/backend/postmaster/pgstat.c:1546 25.00 : 64285f: c3 retq : : /* Get the stats entry for this function, create if necessary */ : htabent = hash_search(pgStatFunctions, &fcinfo->flinfo->fn_oid, : HASH_ENTER, &found); : if (!found) : MemSet(&htabent->f_counts, 0, sizeof(PgStat_FunctionCounts)); 0.00 : 642860: 48 c7 42 08 00 00 00 movq $0x0,0x8(%rdx) 0.00 : 642867: 00 0.00 : 642868: 48 c7 40 08 00 00 00 movq $0x0,0x8(%rax) 0.00 : 64286f: 00 0.00 : 642870: 48 c7 40 10 00 00 00 movq $0x0,0x10(%rax) 0.00 : 642877: 00 0.00 : 642878: 48 c7 40 18 00 00 00 movq $0x0,0x18(%rax) 0.00 : 64287f: 00 0.00 : 642880: 48 c7 40 20 00 00 00 movq $0x0,0x20(%rax) 0.00 : 642887: 00 0.00 : 642888: e9 4b ff ff ff jmpq 6427d8 0.00 : 64288d: 0f 1f 00 nopl (%rax) : if (!pgStatFunctions) : { : /* First time through - initialize function stat table */ : HASHCTL hash_ctl; : : memset(&hash_ctl, 0, sizeof(hash_ctl)); 0.00 : 642890: 48 8d 55 80 lea -0x80(%rbp),%rdx 0.00 : 642894: 31 c0 xor %eax,%eax 0.00 : 642896: b9 0d 00 00 00 mov $0xd,%ecx : hash_ctl.keysize = sizeof(Oid); : hash_ctl.entrysize = sizeof(PgStat_BackendFunctionEntry); : hash_ctl.hash = oid_hash; : pgStatFunctions = hash_create("Function stat entries", 0.00 : 64289b: be 00 02 00 00 mov $0x200,%esi : if (!pgStatFunctions) : { : /* First time through - initialize function stat table */ : HASHCTL hash_ctl; : : memset(&hash_ctl, 0, sizeof(hash_ctl)); 0.00 : 6428a0: 48 89 d7 mov %rdx,%rdi 0.00 : 6428a3: f3 48 ab rep stos %rax,%es:(%rdi) : hash_ctl.keysize = sizeof(Oid); 0.00 : 6428a6: 48 c7 45 a8 04 00 00 movq $0x4,-0x58(%rbp) 0.00 : 6428ad: 00 : hash_ctl.entrysize = sizeof(PgStat_BackendFunctionEntry); 0.00 : 6428ae: 48 c7 45 b0 30 00 00 movq $0x30,-0x50(%rbp) 0.00 : 6428b5: 00 : hash_ctl.hash = oid_hash; : pgStatFunctions = hash_create("Function stat entries", 0.00 : 6428b6: bf 1c f0 89 00 mov $0x89f01c,%edi : HASHCTL hash_ctl; : : memset(&hash_ctl, 0, sizeof(hash_ctl)); : hash_ctl.keysize = sizeof(Oid); : hash_ctl.entrysize = sizeof(PgStat_BackendFunctionEntry); : hash_ctl.hash = oid_hash; 0.00 : 6428bb: 48 c7 45 b8 50 4f 78 movq $0x784f50,-0x48(%rbp) 0.00 : 6428c2: 00 : pgStatFunctions = hash_create("Function stat entries", 0.00 : 6428c3: b1 30 mov $0x30,%cl 0.00 : 6428c5: e8 e6 1f 14 00 callq 7848b0 0.00 : 6428ca: 48 89 05 df 93 53 00 mov %rax,0x5393df(%rip) # b7bcb0 0.00 : 6428d1: 49 8b 14 24 mov (%r12),%rdx 0.00 : 6428d5: e9 d8 fe ff ff jmpq 6427b2 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 50.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/buf_table.c:83 25.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/buf_table.c:87 25.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/buf_table.c:87 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000673de0 : : * BufTableLookup : * Lookup the given BufferTag; return buffer ID, or -1 if not found : */ : int : BufTableLookup(BufferTag *tagPtr) : { 0.00 : 673de0: 55 push %rbp /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/buf_table.c:83 50.00 : 673de1: 48 89 e5 mov %rsp,%rbp 0.00 : 673de4: 48 83 ec 20 sub $0x20,%rsp : BufferLookupEnt ent; : : ent.key = *tagPtr; 0.00 : 673de8: 48 8b 07 mov (%rdi),%rax : if (!CHashSearch(SharedBufHash, &ent)) /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/buf_table.c:87 25.00 : 673deb: 48 8d 75 e0 lea -0x20(%rbp),%rsi : int : BufTableLookup(BufferTag *tagPtr) : { : BufferLookupEnt ent; : : ent.key = *tagPtr; 0.00 : 673def: 48 89 45 e0 mov %rax,-0x20(%rbp) 0.00 : 673df3: 48 8b 47 08 mov 0x8(%rdi),%rax 0.00 : 673df7: 48 89 45 e8 mov %rax,-0x18(%rbp) 0.00 : 673dfb: 8b 47 10 mov 0x10(%rdi),%eax : if (!CHashSearch(SharedBufHash, &ent)) 0.00 : 673dfe: 48 8b 3d 53 92 50 00 mov 0x509253(%rip),%rdi # b7d058 : int : BufTableLookup(BufferTag *tagPtr) : { : BufferLookupEnt ent; : : ent.key = *tagPtr; 0.00 : 673e05: 89 45 f0 mov %eax,-0x10(%rbp) : if (!CHashSearch(SharedBufHash, &ent)) 0.00 : 673e08: e8 e3 f4 10 00 callq 7832f0 25.00 : 673e0d: 89 c2 mov %eax,%edx 0.00 : 673e0f: b8 ff ff ff ff mov $0xffffffff,%eax 0.00 : 673e14: 84 d2 test %dl,%dl 0.00 : 673e16: 0f 45 45 f4 cmovne -0xc(%rbp),%eax : return -1; : : return ent.id; : } 0.00 : 673e1a: c9 leaveq Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 75.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:3003 25.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:3003 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000674710 : : /* : * Acquire or release the content_lock for the buffer. : */ : void : LockBuffer(Buffer buffer, int mode) : { /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:3003 75.00 : 674710: 55 push %rbp 0.00 : 674711: 48 89 e5 mov %rsp,%rbp 0.00 : 674714: 53 push %rbx 25.00 : 674715: 89 f3 mov %esi,%ebx 0.00 : 674717: 48 83 ec 08 sub $0x8,%rsp : volatile BufferDesc *buf; : : Assert(BufferIsValid(buffer)); : if (BufferIsLocal(buffer)) 0.00 : 67471b: 85 ff test %edi,%edi 0.00 : 67471d: 78 31 js 674750 : return; /* local buffers need no lock */ : : buf = &(BufferDescriptors[buffer - 1]); 0.00 : 67471f: 48 63 c7 movslq %edi,%rax 0.00 : 674722: 48 83 e8 01 sub $0x1,%rax 0.00 : 674726: 48 c1 e0 06 shl $0x6,%rax 0.00 : 67472a: 48 03 05 cf b3 54 00 add 0x54b3cf(%rip),%rax # bbfb00 : : if (mode == BUFFER_LOCK_UNLOCK) 0.00 : 674731: 85 f6 test %esi,%esi 0.00 : 674733: 74 2b je 674760 : LWLockRelease(buf->content_lock); : else if (mode == BUFFER_LOCK_SHARE) 0.00 : 674735: 83 fe 01 cmp $0x1,%esi 0.00 : 674738: 74 36 je 674770 : LWLockAcquire(buf->content_lock, LW_SHARED); : else if (mode == BUFFER_LOCK_EXCLUSIVE) 0.00 : 67473a: 83 fe 02 cmp $0x2,%esi 0.00 : 67473d: 75 45 jne 674784 : LWLockAcquire(buf->content_lock, LW_EXCLUSIVE); 0.00 : 67473f: 48 8b 78 38 mov 0x38(%rax),%rdi : else : elog(ERROR, "unrecognized buffer lock mode: %d", mode); : } 0.00 : 674743: 48 83 c4 08 add $0x8,%rsp : if (mode == BUFFER_LOCK_UNLOCK) : LWLockRelease(buf->content_lock); : else if (mode == BUFFER_LOCK_SHARE) : LWLockAcquire(buf->content_lock, LW_SHARED); : else if (mode == BUFFER_LOCK_EXCLUSIVE) : LWLockAcquire(buf->content_lock, LW_EXCLUSIVE); 0.00 : 674747: 31 f6 xor %esi,%esi : else : elog(ERROR, "unrecognized buffer lock mode: %d", mode); : } 0.00 : 674749: 5b pop %rbx 0.00 : 67474a: c9 leaveq : if (mode == BUFFER_LOCK_UNLOCK) : LWLockRelease(buf->content_lock); : else if (mode == BUFFER_LOCK_SHARE) : LWLockAcquire(buf->content_lock, LW_SHARED); : else if (mode == BUFFER_LOCK_EXCLUSIVE) : LWLockAcquire(buf->content_lock, LW_EXCLUSIVE); 0.00 : 67474b: e9 a0 b3 01 00 jmpq 68faf0 : else : elog(ERROR, "unrecognized buffer lock mode: %d", mode); : } 0.00 : 674750: 48 83 c4 08 add $0x8,%rsp 0.00 : 674754: 5b pop %rbx 0.00 : 674755: c9 leaveq 0.00 : 674756: c3 retq 0.00 : 674757: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 67475e: 00 00 : return; /* local buffers need no lock */ : : buf = &(BufferDescriptors[buffer - 1]); : : if (mode == BUFFER_LOCK_UNLOCK) : LWLockRelease(buf->content_lock); 0.00 : 674760: 48 8b 78 38 mov 0x38(%rax),%rdi : LWLockAcquire(buf->content_lock, LW_SHARED); : else if (mode == BUFFER_LOCK_EXCLUSIVE) : LWLockAcquire(buf->content_lock, LW_EXCLUSIVE); : else : elog(ERROR, "unrecognized buffer lock mode: %d", mode); : } 0.00 : 674764: 48 83 c4 08 add $0x8,%rsp 0.00 : 674768: 5b pop %rbx 0.00 : 674769: c9 leaveq : return; /* local buffers need no lock */ : : buf = &(BufferDescriptors[buffer - 1]); : : if (mode == BUFFER_LOCK_UNLOCK) : LWLockRelease(buf->content_lock); 0.00 : 67476a: e9 31 ac 01 00 jmpq 68f3a0 0.00 : 67476f: 90 nop : else if (mode == BUFFER_LOCK_SHARE) : LWLockAcquire(buf->content_lock, LW_SHARED); 0.00 : 674770: 48 8b 78 38 mov 0x38(%rax),%rdi : else if (mode == BUFFER_LOCK_EXCLUSIVE) : LWLockAcquire(buf->content_lock, LW_EXCLUSIVE); : else : elog(ERROR, "unrecognized buffer lock mode: %d", mode); : } 0.00 : 674774: 48 83 c4 08 add $0x8,%rsp : buf = &(BufferDescriptors[buffer - 1]); : : if (mode == BUFFER_LOCK_UNLOCK) : LWLockRelease(buf->content_lock); : else if (mode == BUFFER_LOCK_SHARE) : LWLockAcquire(buf->content_lock, LW_SHARED); 0.00 : 674778: be 01 00 00 00 mov $0x1,%esi : else if (mode == BUFFER_LOCK_EXCLUSIVE) : LWLockAcquire(buf->content_lock, LW_EXCLUSIVE); : else : elog(ERROR, "unrecognized buffer lock mode: %d", mode); : } 0.00 : 67477d: 5b pop %rbx 0.00 : 67477e: c9 leaveq : buf = &(BufferDescriptors[buffer - 1]); : : if (mode == BUFFER_LOCK_UNLOCK) : LWLockRelease(buf->content_lock); : else if (mode == BUFFER_LOCK_SHARE) : LWLockAcquire(buf->content_lock, LW_SHARED); 0.00 : 67477f: e9 6c b3 01 00 jmpq 68faf0 : else if (mode == BUFFER_LOCK_EXCLUSIVE) : LWLockAcquire(buf->content_lock, LW_EXCLUSIVE); : else : elog(ERROR, "unrecognized buffer lock mode: %d", mode); 0.00 : 674784: ba 15 a0 8a 00 mov $0x8aa015,%edx 0.00 : 674789: be cb 0b 00 00 mov $0xbcb,%esi 0.00 : 67478e: bf 53 9d 8a 00 mov $0x8a9d53,%edi 0.00 : 674793: e8 88 6c 10 00 callq 77b420 0.00 : 674798: 89 da mov %ebx,%edx 0.00 : 67479a: be f8 9d 8a 00 mov $0x8a9df8,%esi 0.00 : 67479f: bf 14 00 00 00 mov $0x14,%edi 0.00 : 6747a4: 31 c0 xor %eax,%eax 0.00 : 6747a6: e8 85 6a 10 00 callq 77b230 0.00 : 6747ab: e8 20 4d df ff callq 4694d0 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 25.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/file/fd.c:1271 25.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/file/fd.c:1286 25.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/file/fd.c:1289 25.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/file/fd.c:1322 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000679df0 : : #endif : } : : int : FileRead(File file, char *buffer, int amount) : { 0.00 : 679df0: 55 push %rbp 0.00 : 679df1: 48 89 e5 mov %rsp,%rbp 0.00 : 679df4: 41 56 push %r14 0.00 : 679df6: 49 89 f6 mov %rsi,%r14 0.00 : 679df9: 41 55 push %r13 /home/Computational/mark/src/postgres-andres/src/backend/storage/file/fd.c:1271 25.00 : 679dfb: 41 89 d5 mov %edx,%r13d 0.00 : 679dfe: 41 54 push %r12 0.00 : 679e00: 41 89 fc mov %edi,%r12d 0.00 : 679e03: 53 push %rbx : DO_DB(elog(LOG, "FileRead: %d (%s) " INT64_FORMAT " %d %p", : file, VfdCache[file].fileName, : (int64) VfdCache[file].seekPos, : amount, buffer)); : : returnCode = FileAccess(file); 0.00 : 679e04: e8 17 fb ff ff callq 679920 : if (returnCode < 0) 0.00 : 679e09: 85 c0 test %eax,%eax : DO_DB(elog(LOG, "FileRead: %d (%s) " INT64_FORMAT " %d %p", : file, VfdCache[file].fileName, : (int64) VfdCache[file].seekPos, : amount, buffer)); : : returnCode = FileAccess(file); 0.00 : 679e0b: 89 c3 mov %eax,%ebx : if (returnCode < 0) 0.00 : 679e0d: 78 47 js 679e56 0.00 : 679e0f: 4d 63 e4 movslq %r12d,%r12 0.00 : 679e12: 4d 63 ed movslq %r13d,%r13 0.00 : 679e15: 49 c1 e4 06 shl $0x6,%r12 0.00 : 679e19: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : return returnCode; : : retry: : returnCode = read(VfdCache[file].fd, buffer, amount); 0.00 : 679e20: 48 8b 05 71 33 50 00 mov 0x503371(%rip),%rax # b7d198 0.00 : 679e27: 4c 89 ea mov %r13,%rdx 0.00 : 679e2a: 4c 89 f6 mov %r14,%rsi 0.00 : 679e2d: 42 8b 3c 20 mov (%rax,%r12,1),%edi 0.00 : 679e31: e8 da f7 de ff callq 469610 : : if (returnCode >= 0) 0.00 : 679e36: 85 c0 test %eax,%eax : returnCode = FileAccess(file); : if (returnCode < 0) : return returnCode; : : retry: : returnCode = read(VfdCache[file].fd, buffer, amount); /home/Computational/mark/src/postgres-andres/src/backend/storage/file/fd.c:1286 25.00 : 679e38: 89 c3 mov %eax,%ebx : : if (returnCode >= 0) 0.00 : 679e3a: 79 2c jns 679e68 : _dosmaperr(error); : break; : } : #endif : /* OK to retry if interrupted */ : if (errno == EINTR) 0.00 : 679e3c: e8 7f fe de ff callq 469cc0 <__errno_location@plt> 0.00 : 679e41: 83 38 04 cmpl $0x4,(%rax) 0.00 : 679e44: 74 da je 679e20 : goto retry; : : /* Trouble, so assume we don't know the file position anymore */ : VfdCache[file].seekPos = FileUnknownPos; 0.00 : 679e46: 48 8b 05 4b 33 50 00 mov 0x50334b(%rip),%rax # b7d198 0.00 : 679e4d: 4a c7 44 20 20 ff ff movq $0xffffffffffffffff,0x20(%rax,%r12,1) 0.00 : 679e54: ff ff : } : : return returnCode; : } 0.00 : 679e56: 89 d8 mov %ebx,%eax 0.00 : 679e58: 5b pop %rbx 0.00 : 679e59: 41 5c pop %r12 0.00 : 679e5b: 41 5d pop %r13 0.00 : 679e5d: 41 5e pop %r14 0.00 : 679e5f: c9 leaveq 0.00 : 679e60: c3 retq 0.00 : 679e61: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : : retry: : returnCode = read(VfdCache[file].fd, buffer, amount); : : if (returnCode >= 0) : VfdCache[file].seekPos += returnCode; 0.00 : 679e68: 4c 03 25 29 33 50 00 add 0x503329(%rip),%r12 # b7d198 /home/Computational/mark/src/postgres-andres/src/backend/storage/file/fd.c:1289 25.00 : 679e6f: 48 98 cltq 0.00 : 679e71: 49 01 44 24 20 add %rax,0x20(%r12) : /* Trouble, so assume we don't know the file position anymore */ : VfdCache[file].seekPos = FileUnknownPos; : } : : return returnCode; : } /home/Computational/mark/src/postgres-andres/src/backend/storage/file/fd.c:1322 25.00 : 679e76: 89 d8 mov %ebx,%eax 0.00 : 679e78: 5b pop %rbx 0.00 : 679e79: 41 5c pop %r12 0.00 : 679e7b: 41 5d pop %r13 0.00 : 679e7d: 41 5e pop %r14 0.00 : 679e7f: c9 leaveq Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 25.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/predicate.c:2466 25.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/predicate.c:2466 25.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/predicate.c:2518 25.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/predicate.c:2518 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000694ba0 : : * Skip if not in full serializable transaction isolation level. : * Skip if this is a temporary table. : */ : void : PredicateLockTuple(Relation relation, HeapTuple tuple, Snapshot snapshot) : { /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/predicate.c:2466 25.00 : 694ba0: 55 push %rbp 25.00 : 694ba1: 48 89 e5 mov %rsp,%rbp 0.00 : 694ba4: 48 89 5d e0 mov %rbx,-0x20(%rbp) 0.00 : 694ba8: 4c 89 65 e8 mov %r12,-0x18(%rbp) 0.00 : 694bac: 48 89 fb mov %rdi,%rbx 0.00 : 694baf: 4c 89 6d f0 mov %r13,-0x10(%rbp) 0.00 : 694bb3: 4c 89 75 f8 mov %r14,-0x8(%rbp) 0.00 : 694bb7: 48 83 ec 30 sub $0x30,%rsp : */ : static inline bool : SerializationNeededForRead(Relation relation, Snapshot snapshot) : { : /* Nothing to do if this is not a serializable transaction */ : if (MySerializableXact == InvalidSerializableXact) 0.00 : 694bbb: 48 8b 0d fe 9a 4e 00 mov 0x4e9afe(%rip),%rcx # b7e6c0 : * Skip if not in full serializable transaction isolation level. : * Skip if this is a temporary table. : */ : void : PredicateLockTuple(Relation relation, HeapTuple tuple, Snapshot snapshot) : { 0.00 : 694bc2: 49 89 f4 mov %rsi,%r12 : */ : static inline bool : SerializationNeededForRead(Relation relation, Snapshot snapshot) : { : /* Nothing to do if this is not a serializable transaction */ : if (MySerializableXact == InvalidSerializableXact) 0.00 : 694bc5: 48 85 c9 test %rcx,%rcx 0.00 : 694bc8: 74 13 je 694bdd : * This excludes things like CLUSTER and REINDEX. They use the wholesale : * functions TransferPredicateLocksToHeapRelation() and : * CheckTableForSerializableConflictIn() to participate serialization, but : * the scans involved don't need serialization. : */ : if (!IsMVCCSnapshot(snapshot)) 0.00 : 694bca: 48 8b 02 mov (%rdx),%rax 0.00 : 694bcd: 48 3d 50 57 7a 00 cmp $0x7a5750,%rax 0.00 : 694bd3: 74 1b je 694bf0 0.00 : 694bd5: 48 3d 60 47 7a 00 cmp $0x7a4760,%rax 0.00 : 694bdb: 74 13 je 694bf0 : relation->rd_node.dbNode, : relation->rd_id, : ItemPointerGetBlockNumber(tid), : ItemPointerGetOffsetNumber(tid)); : PredicateLockAcquire(&tag); : } /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/predicate.c:2518 25.00 : 694bdd: 48 8b 5d e0 mov -0x20(%rbp),%rbx 0.00 : 694be1: 4c 8b 65 e8 mov -0x18(%rbp),%r12 0.00 : 694be5: 4c 8b 6d f0 mov -0x10(%rbp),%r13 0.00 : 694be9: 4c 8b 75 f8 mov -0x8(%rbp),%r14 0.00 : 694bed: c9 leaveq 25.00 : 694bee: c3 retq 0.00 : 694bef: 90 nop : * : * A transaction is flagged as RO_SAFE if all concurrent R/W transactions : * commit without having conflicts out to an earlier snapshot, thus : * ensuring that no conflicts are possible for this transaction. : */ : if (SxactIsROSafe(MySerializableXact)) 0.00 : 694bf0: 80 79 7c 00 cmpb $0x0,0x7c(%rcx) 0.00 : 694bf4: 0f 88 9e 00 00 00 js 694c98 : * relations are exempt, as are materialized views. : */ : static inline bool : PredicateLockingNeededForRelation(Relation relation) : { : return !(relation->rd_id < FirstBootstrapObjectId || 0.00 : 694bfa: 8b 53 40 mov 0x40(%rbx),%edx 0.00 : 694bfd: 81 fa 0f 27 00 00 cmp $0x270f,%edx 0.00 : 694c03: 76 d8 jbe 694bdd 0.00 : 694c05: 48 8b 43 30 mov 0x30(%rbx),%rax 0.00 : 694c09: 80 78 6e 74 cmpb $0x74,0x6e(%rax) 0.00 : 694c0d: 74 ce je 694bdd 0.00 : 694c0f: 80 78 6f 6d cmpb $0x6d,0x6f(%rax) 0.00 : 694c13: 74 c8 je 694bdd : return; : : /* : * If it's a heap tuple, return if this xact wrote it. : */ : if (relation->rd_index == NULL) 0.00 : 694c15: 48 83 bb a0 00 00 00 cmpq $0x0,0xa0(%rbx) 0.00 : 694c1c: 00 0.00 : 694c1d: 0f 84 85 00 00 00 je 694ca8 : * Do quick-but-not-definitive test for a relation lock first. This will : * never cause a return when the relation is *not* locked, but will : * occasionally let the check continue when there really *is* a relation : * level lock. : */ : SET_PREDICATELOCKTARGETTAG_RELATION(tag, 0.00 : 694c23: 8b 43 04 mov 0x4(%rbx),%eax : PredicateLockExists(const PREDICATELOCKTARGETTAG *targettag) : { : LOCALPREDICATELOCK *lock; : : /* check local hash table */ : lock = (LOCALPREDICATELOCK *) hash_search(LocalPredicateLockHash, 0.00 : 694c26: 4c 8d 6d d0 lea -0x30(%rbp),%r13 0.00 : 694c2a: 48 8b 3d 9f 9a 4e 00 mov 0x4e9a9f(%rip),%rdi # b7e6d0 : * Do quick-but-not-definitive test for a relation lock first. This will : * never cause a return when the relation is *not* locked, but will : * occasionally let the check continue when there really *is* a relation : * level lock. : */ : SET_PREDICATELOCKTARGETTAG_RELATION(tag, 0.00 : 694c31: 89 55 d4 mov %edx,-0x2c(%rbp) : PredicateLockExists(const PREDICATELOCKTARGETTAG *targettag) : { : LOCALPREDICATELOCK *lock; : : /* check local hash table */ : lock = (LOCALPREDICATELOCK *) hash_search(LocalPredicateLockHash, 0.00 : 694c34: 31 c9 xor %ecx,%ecx 0.00 : 694c36: 31 d2 xor %edx,%edx 0.00 : 694c38: 4c 89 ee mov %r13,%rsi : * Do quick-but-not-definitive test for a relation lock first. This will : * never cause a return when the relation is *not* locked, but will : * occasionally let the check continue when there really *is* a relation : * level lock. : */ : SET_PREDICATELOCKTARGETTAG_RELATION(tag, 0.00 : 694c3b: c7 45 d8 ff ff ff ff movl $0xffffffff,-0x28(%rbp) 0.00 : 694c42: c7 45 dc 00 00 00 00 movl $0x0,-0x24(%rbp) 0.00 : 694c49: 89 45 d0 mov %eax,-0x30(%rbp) : PredicateLockExists(const PREDICATELOCKTARGETTAG *targettag) : { : LOCALPREDICATELOCK *lock; : : /* check local hash table */ : lock = (LOCALPREDICATELOCK *) hash_search(LocalPredicateLockHash, 0.00 : 694c4c: e8 4f fa 0e 00 callq 7846a0 : targettag, : HASH_FIND, NULL); : : if (!lock) 0.00 : 694c51: 48 85 c0 test %rax,%rax 0.00 : 694c54: 74 06 je 694c5c : * level lock. : */ : SET_PREDICATELOCKTARGETTAG_RELATION(tag, : relation->rd_node.dbNode, : relation->rd_id); : if (PredicateLockExists(&tag)) 0.00 : 694c56: 80 78 10 00 cmpb $0x0,0x10(%rax) 0.00 : 694c5a: 75 81 jne 694bdd : return; : : tid = &(tuple->t_self); : SET_PREDICATELOCKTARGETTAG_TUPLE(tag, 0.00 : 694c5c: 8b 43 04 mov 0x4(%rbx),%eax 0.00 : 694c5f: 41 0f b7 54 24 06 movzwl 0x6(%r12),%edx : relation->rd_node.dbNode, : relation->rd_id, : ItemPointerGetBlockNumber(tid), : ItemPointerGetOffsetNumber(tid)); : PredicateLockAcquire(&tag); 0.00 : 694c65: 4c 89 ef mov %r13,%rdi : relation->rd_id); : if (PredicateLockExists(&tag)) : return; : : tid = &(tuple->t_self); : SET_PREDICATELOCKTARGETTAG_TUPLE(tag, 0.00 : 694c68: 89 45 d0 mov %eax,-0x30(%rbp) 0.00 : 694c6b: 8b 43 40 mov 0x40(%rbx),%eax 0.00 : 694c6e: 89 45 d4 mov %eax,-0x2c(%rbp) 0.00 : 694c71: 41 0f b7 44 24 04 movzwl 0x4(%r12),%eax 0.00 : 694c77: c1 e0 10 shl $0x10,%eax 0.00 : 694c7a: 09 d0 or %edx,%eax 0.00 : 694c7c: 89 45 d8 mov %eax,-0x28(%rbp) 0.00 : 694c7f: 41 0f b7 44 24 08 movzwl 0x8(%r12),%eax 0.00 : 694c85: 89 45 dc mov %eax,-0x24(%rbp) : relation->rd_node.dbNode, : relation->rd_id, : ItemPointerGetBlockNumber(tid), : ItemPointerGetOffsetNumber(tid)); : PredicateLockAcquire(&tag); 0.00 : 694c88: e8 a3 d3 ff ff callq 692030 0.00 : 694c8d: e9 4b ff ff ff jmpq 694bdd 0.00 : 694c92: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : * commit without having conflicts out to an earlier snapshot, thus : * ensuring that no conflicts are possible for this transaction. : */ : if (SxactIsROSafe(MySerializableXact)) : { : ReleasePredicateLocks(false); 0.00 : 694c98: 31 ff xor %edi,%edi 0.00 : 694c9a: e8 51 dc ff ff callq 6928f0 0.00 : 694c9f: 90 nop 0.00 : 694ca0: e9 38 ff ff ff jmpq 694bdd 0.00 : 694ca5: 0f 1f 00 nopl (%rax) : */ : if (relation->rd_index == NULL) : { : TransactionId myxid; : : targetxmin = HeapTupleHeaderGetXmin(tuple->t_data); 0.00 : 694ca8: 49 8b 54 24 10 mov 0x10(%r12),%rdx 0.00 : 694cad: 41 bd 02 00 00 00 mov $0x2,%r13d 0.00 : 694cb3: 0f b7 42 14 movzwl 0x14(%rdx),%eax 0.00 : 694cb7: 25 00 03 00 00 and $0x300,%eax 0.00 : 694cbc: 3d 00 03 00 00 cmp $0x300,%eax 0.00 : 694cc1: 74 03 je 694cc6 0.00 : 694cc3: 44 8b 2a mov (%rdx),%r13d : : myxid = GetTopTransactionIdIfAny(); 0.00 : 694cc6: e8 b5 be e2 ff callq 4c0b80 : if (TransactionIdIsValid(myxid)) 0.00 : 694ccb: 85 c0 test %eax,%eax : { : TransactionId myxid; : : targetxmin = HeapTupleHeaderGetXmin(tuple->t_data); : : myxid = GetTopTransactionIdIfAny(); 0.00 : 694ccd: 41 89 c6 mov %eax,%r14d : if (TransactionIdIsValid(myxid)) 0.00 : 694cd0: 75 0e jne 694ce0 : TransactionId xid = SubTransGetTopmostTransaction(targetxmin); : : if (TransactionIdEquals(xid, myxid)) : { : /* We wrote it; we already have a write lock. */ : return; 0.00 : 694cd2: 8b 53 40 mov 0x40(%rbx),%edx 0.00 : 694cd5: e9 49 ff ff ff jmpq 694c23 0.00 : 694cda: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : targetxmin = HeapTupleHeaderGetXmin(tuple->t_data); : : myxid = GetTopTransactionIdIfAny(); : if (TransactionIdIsValid(myxid)) : { : if (TransactionIdFollowsOrEquals(targetxmin, TransactionXmin)) 0.00 : 694ce0: 8b 35 72 da 4d 00 mov 0x4dda72(%rip),%esi # b72758 0.00 : 694ce6: 44 89 ef mov %r13d,%edi 0.00 : 694ce9: e8 82 b3 e2 ff callq 4c0070 0.00 : 694cee: 84 c0 test %al,%al 0.00 : 694cf0: 74 e0 je 694cd2 : { : TransactionId xid = SubTransGetTopmostTransaction(targetxmin); 0.00 : 694cf2: 44 89 ef mov %r13d,%edi 0.00 : 694cf5: e8 f6 1b e3 ff callq 4c68f0 : : if (TransactionIdEquals(xid, myxid)) 0.00 : 694cfa: 41 39 c6 cmp %eax,%r14d 0.00 : 694cfd: 75 d3 jne 694cd2 0.00 : 694cff: 90 nop 0.00 : 694d00: e9 d8 fe ff ff jmpq 694bdd Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 25.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/page/bufpage.c:82 25.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/page/bufpage.c:82 25.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/page/bufpage.c:94 25.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/page/bufpage.c:110 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000694ed0 : : * treat such a page as empty and without free space. Eventually, VACUUM : * will clean up such a page and make it usable. : */ : bool : PageIsVerified(Page page, BlockNumber blkno) : { 0.00 : 694ed0: 55 push %rbp /home/Computational/mark/src/postgres-andres/src/backend/storage/page/bufpage.c:82 25.00 : 694ed1: 48 89 e5 mov %rsp,%rbp 0.00 : 694ed4: 41 55 push %r13 25.00 : 694ed6: 41 54 push %r12 0.00 : 694ed8: 41 89 f4 mov %esi,%r12d 0.00 : 694edb: 53 push %rbx 0.00 : 694edc: 48 89 fb mov %rdi,%rbx 0.00 : 694edf: 48 83 ec 08 sub $0x8,%rsp : uint16 checksum = 0; : : /* : * Don't verify page data unless the page passes basic non-zero test : */ : if (!PageIsNew(page)) 0.00 : 694ee3: 66 83 7f 0e 00 cmpw $0x0,0xe(%rdi) /home/Computational/mark/src/postgres-andres/src/backend/storage/page/bufpage.c:94 25.00 : 694ee8: 75 56 jne 694f40 0.00 : 694eea: 45 31 e4 xor %r12d,%r12d 0.00 : 694eed: 45 31 ed xor %r13d,%r13d 0.00 : 694ef0: 31 c9 xor %ecx,%ecx : p->pd_upper <= p->pd_special && : p->pd_special <= BLCKSZ && : p->pd_special == MAXALIGN(p->pd_special)) : header_sane = true; : : if (header_sane && !checksum_failure) 0.00 : 694ef2: 31 c0 xor %eax,%eax 0.00 : 694ef4: eb 16 jmp 694f0c 0.00 : 694ef6: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 0.00 : 694efd: 00 00 00 : /* Check all-zeroes case */ : all_zeroes = true; : pagebytes = (char *) page; : for (i = 0; i < BLCKSZ; i++) : { : if (pagebytes[i] != 0) 0.00 : 694f00: 48 83 c0 01 add $0x1,%rax : } : : /* Check all-zeroes case */ : all_zeroes = true; : pagebytes = (char *) page; : for (i = 0; i < BLCKSZ; i++) 0.00 : 694f04: 48 3d 00 20 00 00 cmp $0x2000,%rax 0.00 : 694f0a: 74 24 je 694f30 : { : if (pagebytes[i] != 0) 0.00 : 694f0c: 80 3c 03 00 cmpb $0x0,(%rbx,%rax,1) 0.00 : 694f10: 74 ee je 694f00 : : /* : * Throw a WARNING if the checksum fails, but only after we've checked for : * the all-zeroes case. : */ : if (checksum_failure) 0.00 : 694f12: 84 c9 test %cl,%cl 0.00 : 694f14: 0f 85 86 00 00 00 jne 694fa0 : ereport(WARNING, : (ERRCODE_DATA_CORRUPTED, : errmsg("page verification failed, calculated checksum %u but expected %u", : checksum, p->pd_checksum))); : : if (header_sane && ignore_checksum_failure) 0.00 : 694f1a: 31 c0 xor %eax,%eax : return true; : } : : return false; : } 0.00 : 694f1c: 48 83 c4 08 add $0x8,%rsp 0.00 : 694f20: 5b pop %rbx 0.00 : 694f21: 41 5c pop %r12 0.00 : 694f23: 41 5d pop %r13 0.00 : 694f25: c9 leaveq 0.00 : 694f26: c3 retq 0.00 : 694f27: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 694f2e: 00 00 0.00 : 694f30: 48 83 c4 08 add $0x8,%rsp : ereport(WARNING, : (ERRCODE_DATA_CORRUPTED, : errmsg("page verification failed, calculated checksum %u but expected %u", : checksum, p->pd_checksum))); : : if (header_sane && ignore_checksum_failure) 0.00 : 694f34: b8 01 00 00 00 mov $0x1,%eax : return true; : } : : return false; : } 0.00 : 694f39: 5b pop %rbx 0.00 : 694f3a: 41 5c pop %r12 0.00 : 694f3c: 41 5d pop %r13 0.00 : 694f3e: c9 leaveq 0.00 : 694f3f: c3 retq : /* : * Don't verify page data unless the page passes basic non-zero test : */ : if (!PageIsNew(page)) : { : if (DataChecksumsEnabled()) 0.00 : 694f40: e8 7b 80 e3 ff callq 4ccfc0 0.00 : 694f45: 45 31 ed xor %r13d,%r13d 0.00 : 694f48: 31 c9 xor %ecx,%ecx 0.00 : 694f4a: 84 c0 test %al,%al 0.00 : 694f4c: 0f 85 96 00 00 00 jne 694fe8 : * The following checks don't prove the header is correct, only that : * it looks sane enough to allow into the buffer pool. Later usage of : * the block can still reveal problems, which is why we offer the : * checksum option. : */ : if ((p->pd_flags & ~PD_VALID_FLAG_BITS) == 0 && 0.00 : 694f52: 0f b7 43 0a movzwl 0xa(%rbx),%eax 0.00 : 694f56: a9 f8 ff 00 00 test $0xfff8,%eax 0.00 : 694f5b: 0f 85 7f 00 00 00 jne 694fe0 0.00 : 694f61: 0f b7 43 0e movzwl 0xe(%rbx),%eax 0.00 : 694f65: 66 39 43 0c cmp %ax,0xc(%rbx) 0.00 : 694f69: 77 75 ja 694fe0 0.00 : 694f6b: 0f b7 53 10 movzwl 0x10(%rbx),%edx 0.00 : 694f6f: 66 39 d0 cmp %dx,%ax 0.00 : 694f72: 77 6c ja 694fe0 0.00 : 694f74: 66 81 fa 00 20 cmp $0x2000,%dx 0.00 : 694f79: 77 65 ja 694fe0 0.00 : 694f7b: 0f b7 d2 movzwl %dx,%edx /home/Computational/mark/src/postgres-andres/src/backend/storage/page/bufpage.c:110 25.00 : 694f7e: 48 8d 42 07 lea 0x7(%rdx),%rax 0.00 : 694f82: 48 83 e0 f8 and $0xfffffffffffffff8,%rax 0.00 : 694f86: 48 39 c2 cmp %rax,%rdx 0.00 : 694f89: 75 55 jne 694fe0 : p->pd_upper <= p->pd_special && : p->pd_special <= BLCKSZ && : p->pd_special == MAXALIGN(p->pd_special)) : header_sane = true; : : if (header_sane && !checksum_failure) 0.00 : 694f8b: 84 c9 test %cl,%cl 0.00 : 694f8d: 74 a1 je 694f30 0.00 : 694f8f: 41 bc 01 00 00 00 mov $0x1,%r12d 0.00 : 694f95: b9 01 00 00 00 mov $0x1,%ecx 0.00 : 694f9a: e9 53 ff ff ff jmpq 694ef2 0.00 : 694f9f: 90 nop : * Throw a WARNING if the checksum fails, but only after we've checked for : * the all-zeroes case. : */ : if (checksum_failure) : { : ereport(WARNING, 0.00 : 694fa0: 45 31 c0 xor %r8d,%r8d 0.00 : 694fa3: b9 e4 de 8a 00 mov $0x8adee4,%ecx 0.00 : 694fa8: ba 91 00 00 00 mov $0x91,%edx 0.00 : 694fad: be 33 dc 8a 00 mov $0x8adc33,%esi 0.00 : 694fb2: bf 13 00 00 00 mov $0x13,%edi 0.00 : 694fb7: e8 04 5b 0e 00 callq 77aac0 0.00 : 694fbc: 84 c0 test %al,%al 0.00 : 694fbe: 75 42 jne 695002 : (ERRCODE_DATA_CORRUPTED, : errmsg("page verification failed, calculated checksum %u but expected %u", : checksum, p->pd_checksum))); : : if (header_sane && ignore_checksum_failure) 0.00 : 694fc0: 45 84 e4 test %r12b,%r12b 0.00 : 694fc3: 0f 84 51 ff ff ff je 694f1a 0.00 : 694fc9: 80 3d b8 97 4e 00 00 cmpb $0x0,0x4e97b8(%rip) # b7e788 0.00 : 694fd0: 0f 95 c0 setne %al 0.00 : 694fd3: e9 44 ff ff ff jmpq 694f1c 0.00 : 694fd8: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 694fdf: 00 : p->pd_upper <= p->pd_special && : p->pd_special <= BLCKSZ && : p->pd_special == MAXALIGN(p->pd_special)) : header_sane = true; : : if (header_sane && !checksum_failure) 0.00 : 694fe0: 45 31 e4 xor %r12d,%r12d 0.00 : 694fe3: e9 0a ff ff ff jmpq 694ef2 : */ : if (!PageIsNew(page)) : { : if (DataChecksumsEnabled()) : { : checksum = pg_checksum_page((char *) page, blkno); 0.00 : 694fe8: 44 89 e6 mov %r12d,%esi 0.00 : 694feb: 48 89 df mov %rbx,%rdi 0.00 : 694fee: e8 7d 13 00 00 callq 696370 : : if (checksum != p->pd_checksum) 0.00 : 694ff3: 66 3b 43 08 cmp 0x8(%rbx),%ax : */ : if (!PageIsNew(page)) : { : if (DataChecksumsEnabled()) : { : checksum = pg_checksum_page((char *) page, blkno); 0.00 : 694ff7: 41 89 c5 mov %eax,%r13d : : if (checksum != p->pd_checksum) 0.00 : 694ffa: 0f 95 c1 setne %cl 0.00 : 694ffd: e9 50 ff ff ff jmpq 694f52 : * Throw a WARNING if the checksum fails, but only after we've checked for : * the all-zeroes case. : */ : if (checksum_failure) : { : ereport(WARNING, 0.00 : 695002: 0f b7 53 08 movzwl 0x8(%rbx),%edx 0.00 : 695006: 41 0f b7 f5 movzwl %r13w,%esi 0.00 : 69500a: bf 78 dc 8a 00 mov $0x8adc78,%edi 0.00 : 69500f: 31 c0 xor %eax,%eax 0.00 : 695011: e8 8a 78 0e 00 callq 77c8a0 0.00 : 695016: bf 28 0a 00 01 mov $0x1000a28,%edi 0.00 : 69501b: 89 c6 mov %eax,%esi 0.00 : 69501d: 31 c0 xor %eax,%eax 0.00 : 69501f: e8 bc 55 0e 00 callq 77a5e0 0.00 : 695024: eb 9a jmp 694fc0 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 50.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/adt/date.c:339 50.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/adt/date.c:339 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000006c6b50 : : PG_RETURN_BOOL(dateVal1 > dateVal2); : } : : Datum : date_ge(PG_FUNCTION_ARGS) : { /home/Computational/mark/src/postgres-andres/src/backend/utils/adt/date.c:339 50.00 : 6c6b50: 48 8b 47 28 mov 0x28(%rdi),%rax 0.00 : 6c6b54: 39 47 20 cmp %eax,0x20(%rdi) 50.00 : 6c6b57: 55 push %rbp 0.00 : 6c6b58: 48 89 e5 mov %rsp,%rbp : DateADT dateVal1 = PG_GETARG_DATEADT(0); : DateADT dateVal2 = PG_GETARG_DATEADT(1); : : PG_RETURN_BOOL(dateVal1 >= dateVal2); : } 0.00 : 6c6b5b: c9 leaveq : PG_RETURN_BOOL(dateVal1 > dateVal2); : } : : Datum : date_ge(PG_FUNCTION_ARGS) : { 0.00 : 6c6b5c: 0f 9d c0 setge %al 0.00 : 6c6b5f: 0f b6 c0 movzbl %al,%eax Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 75.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/fmgr/fmgr.c:587 25.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/fmgr/fmgr.c:587 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 000000000077f740 : : * instead, meaning that subsidiary info will have to be recomputed. : */ : void : fmgr_info_copy(FmgrInfo *dstinfo, FmgrInfo *srcinfo, : MemoryContext destcxt) : { 0.00 : 77f740: 55 push %rbp /home/Computational/mark/src/postgres-andres/src/backend/utils/fmgr/fmgr.c:587 75.00 : 77f741: 48 89 e5 mov %rsp,%rbp 0.00 : 77f744: 41 54 push %r12 25.00 : 77f746: 49 89 fc mov %rdi,%r12 0.00 : 77f749: 53 push %rbx : memcpy(dstinfo, srcinfo, sizeof(FmgrInfo)); 0.00 : 77f74a: 48 8b 06 mov (%rsi),%rax : * instead, meaning that subsidiary info will have to be recomputed. : */ : void : fmgr_info_copy(FmgrInfo *dstinfo, FmgrInfo *srcinfo, : MemoryContext destcxt) : { 0.00 : 77f74d: 48 89 f3 mov %rsi,%rbx : memcpy(dstinfo, srcinfo, sizeof(FmgrInfo)); 0.00 : 77f750: 48 89 07 mov %rax,(%rdi) 0.00 : 77f753: 48 8b 46 08 mov 0x8(%rsi),%rax : dstinfo->fn_mcxt = destcxt; : if (dstinfo->fn_addr == fmgr_oldstyle) 0.00 : 77f757: 48 81 3f 30 ed 77 00 cmpq $0x77ed30,(%rdi) : */ : void : fmgr_info_copy(FmgrInfo *dstinfo, FmgrInfo *srcinfo, : MemoryContext destcxt) : { : memcpy(dstinfo, srcinfo, sizeof(FmgrInfo)); 0.00 : 77f75e: 48 89 47 08 mov %rax,0x8(%rdi) 0.00 : 77f762: 48 8b 46 10 mov 0x10(%rsi),%rax 0.00 : 77f766: 48 89 47 10 mov %rax,0x10(%rdi) 0.00 : 77f76a: 48 8b 46 18 mov 0x18(%rsi),%rax 0.00 : 77f76e: 48 89 47 18 mov %rax,0x18(%rdi) 0.00 : 77f772: 48 8b 46 20 mov 0x20(%rsi),%rax 0.00 : 77f776: 48 89 47 20 mov %rax,0x20(%rdi) 0.00 : 77f77a: 48 8b 46 28 mov 0x28(%rsi),%rax : dstinfo->fn_mcxt = destcxt; 0.00 : 77f77e: 48 89 57 20 mov %rdx,0x20(%rdi) : */ : void : fmgr_info_copy(FmgrInfo *dstinfo, FmgrInfo *srcinfo, : MemoryContext destcxt) : { : memcpy(dstinfo, srcinfo, sizeof(FmgrInfo)); 0.00 : 77f782: 48 89 47 28 mov %rax,0x28(%rdi) : dstinfo->fn_mcxt = destcxt; : if (dstinfo->fn_addr == fmgr_oldstyle) 0.00 : 77f786: 74 10 je 77f798 : MemoryContextAlloc(destcxt, sizeof(Oldstyle_fnextra)); : memcpy(fnextra, srcinfo->fn_extra, sizeof(Oldstyle_fnextra)); : dstinfo->fn_extra = (void *) fnextra; : } : else : dstinfo->fn_extra = NULL; 0.00 : 77f788: 48 c7 47 18 00 00 00 movq $0x0,0x18(%rdi) 0.00 : 77f78f: 00 : } 0.00 : 77f790: 5b pop %rbx 0.00 : 77f791: 41 5c pop %r12 0.00 : 77f793: c9 leaveq 0.00 : 77f794: c3 retq 0.00 : 77f795: 0f 1f 00 nopl (%rax) : if (dstinfo->fn_addr == fmgr_oldstyle) : { : /* For oldstyle functions we must copy fn_extra */ : Oldstyle_fnextra *fnextra; : : fnextra = (Oldstyle_fnextra *) 0.00 : 77f798: 48 89 d7 mov %rdx,%rdi 0.00 : 77f79b: be 70 00 00 00 mov $0x70,%esi 0.00 : 77f7a0: e8 eb 96 01 00 callq 798e90 : MemoryContextAlloc(destcxt, sizeof(Oldstyle_fnextra)); : memcpy(fnextra, srcinfo->fn_extra, sizeof(Oldstyle_fnextra)); 0.00 : 77f7a5: 48 8b 4b 18 mov 0x18(%rbx),%rcx 0.00 : 77f7a9: 48 8b 11 mov (%rcx),%rdx 0.00 : 77f7ac: 48 89 10 mov %rdx,(%rax) 0.00 : 77f7af: 48 8b 51 08 mov 0x8(%rcx),%rdx 0.00 : 77f7b3: 48 89 50 08 mov %rdx,0x8(%rax) 0.00 : 77f7b7: 48 8b 51 10 mov 0x10(%rcx),%rdx 0.00 : 77f7bb: 48 89 50 10 mov %rdx,0x10(%rax) 0.00 : 77f7bf: 48 8b 51 18 mov 0x18(%rcx),%rdx 0.00 : 77f7c3: 48 89 50 18 mov %rdx,0x18(%rax) 0.00 : 77f7c7: 48 8b 51 20 mov 0x20(%rcx),%rdx 0.00 : 77f7cb: 48 89 50 20 mov %rdx,0x20(%rax) 0.00 : 77f7cf: 48 8b 51 28 mov 0x28(%rcx),%rdx 0.00 : 77f7d3: 48 89 50 28 mov %rdx,0x28(%rax) 0.00 : 77f7d7: 48 8b 51 30 mov 0x30(%rcx),%rdx 0.00 : 77f7db: 48 89 50 30 mov %rdx,0x30(%rax) 0.00 : 77f7df: 48 8b 51 38 mov 0x38(%rcx),%rdx 0.00 : 77f7e3: 48 89 50 38 mov %rdx,0x38(%rax) 0.00 : 77f7e7: 48 8b 51 40 mov 0x40(%rcx),%rdx 0.00 : 77f7eb: 48 89 50 40 mov %rdx,0x40(%rax) 0.00 : 77f7ef: 48 8b 51 48 mov 0x48(%rcx),%rdx 0.00 : 77f7f3: 48 89 50 48 mov %rdx,0x48(%rax) 0.00 : 77f7f7: 48 8b 51 50 mov 0x50(%rcx),%rdx 0.00 : 77f7fb: 48 89 50 50 mov %rdx,0x50(%rax) 0.00 : 77f7ff: 48 8b 51 58 mov 0x58(%rcx),%rdx 0.00 : 77f803: 48 89 50 58 mov %rdx,0x58(%rax) 0.00 : 77f807: 48 8b 51 60 mov 0x60(%rcx),%rdx 0.00 : 77f80b: 48 89 50 60 mov %rdx,0x60(%rax) 0.00 : 77f80f: 48 8b 51 68 mov 0x68(%rcx),%rdx 0.00 : 77f813: 48 89 50 68 mov %rdx,0x68(%rax) : dstinfo->fn_extra = (void *) fnextra; 0.00 : 77f817: 49 89 44 24 18 mov %rax,0x18(%r12) 0.00 : 77f81c: e9 6f ff ff ff jmpq 77f790 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 66.67 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1312 33.33 /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1305 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 000000000046f260 : : * This function forces the entries of the slot's Datum/isnull : * arrays to be valid at least up through the attnum'th entry. : */ : void : slot_getsomeattrs(TupleTableSlot *slot, int attnum) : { 0.00 : 46f260: 55 push %rbp 0.00 : 46f261: 48 89 e5 mov %rsp,%rbp 0.00 : 46f264: 4c 89 65 f0 mov %r12,-0x10(%rbp) 0.00 : 46f268: 4c 89 6d f8 mov %r13,-0x8(%rbp) 0.00 : 46f26c: 49 89 fc mov %rdi,%r12 0.00 : 46f26f: 48 89 5d e8 mov %rbx,-0x18(%rbp) 0.00 : 46f273: 48 83 ec 20 sub $0x20,%rsp : HeapTuple tuple; : int attno; : : /* Quick out if we have 'em all already */ : if (slot->tts_nvalid >= attnum) 0.00 : 46f277: 39 77 24 cmp %esi,0x24(%rdi) : * This function forces the entries of the slot's Datum/isnull : * arrays to be valid at least up through the attnum'th entry. : */ : void : slot_getsomeattrs(TupleTableSlot *slot, int attnum) : { 0.00 : 46f27a: 41 89 f5 mov %esi,%r13d : HeapTuple tuple; : int attno; : : /* Quick out if we have 'em all already */ : if (slot->tts_nvalid >= attnum) 0.00 : 46f27d: 7d 67 jge 46f2e6 : return; : : /* Check for caller error */ : if (attnum <= 0 || attnum > slot->tts_tupleDescriptor->natts) 33.33 : 46f27f: 85 f6 test %esi,%esi 0.00 : 46f281: 7e 75 jle 46f2f8 0.00 : 46f283: 48 8b 47 10 mov 0x10(%rdi),%rax 0.00 : 46f287: 3b 30 cmp (%rax),%esi 0.00 : 46f289: 7f 6d jg 46f2f8 : : /* : * otherwise we had better have a physical tuple (tts_nvalid should equal : * natts in all virtual-tuple cases) : */ : tuple = slot->tts_tuple; /home/Computational/mark/src/postgres-andres/src/backend/access/common/heaptuple.c:1312 66.67 : 46f28b: 48 8b 47 08 mov 0x8(%rdi),%rax : if (tuple == NULL) /* internal error */ 0.00 : 46f28f: 48 85 c0 test %rax,%rax 0.00 : 46f292: 0f 84 8d 00 00 00 je 46f325 : elog(ERROR, "cannot extract attribute from empty tuple slot"); : : /* : * load up any slots available from physical tuple : */ : attno = HeapTupleHeaderGetNatts(tuple->t_data); 0.00 : 46f298: 48 8b 40 10 mov 0x10(%rax),%rax 0.00 : 46f29c: 0f b7 40 12 movzwl 0x12(%rax),%eax 0.00 : 46f2a0: 25 ff 07 00 00 and $0x7ff,%eax : attno = Min(attno, attnum); 0.00 : 46f2a5: 39 c6 cmp %eax,%esi 0.00 : 46f2a7: 89 c3 mov %eax,%ebx 0.00 : 46f2a9: 0f 4e de cmovle %esi,%ebx : : slot_deform_tuple(slot, attno); 0.00 : 46f2ac: 89 de mov %ebx,%esi 0.00 : 46f2ae: e8 5d fc ff ff callq 46ef10 : : /* : * If tuple doesn't have all the atts indicated by tupleDesc, read the : * rest as null : */ : for (; attno < attnum; attno++) 0.00 : 46f2b3: 41 39 dd cmp %ebx,%r13d 0.00 : 46f2b6: 7e 29 jle 46f2e1 0.00 : 46f2b8: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 46f2bf: 00 : { : slot->tts_values[attno] = (Datum) 0; 0.00 : 46f2c0: 49 8b 54 24 28 mov 0x28(%r12),%rdx 0.00 : 46f2c5: 48 63 c3 movslq %ebx,%rax : : /* : * If tuple doesn't have all the atts indicated by tupleDesc, read the : * rest as null : */ : for (; attno < attnum; attno++) 0.00 : 46f2c8: 83 c3 01 add $0x1,%ebx 0.00 : 46f2cb: 41 39 dd cmp %ebx,%r13d : { : slot->tts_values[attno] = (Datum) 0; 0.00 : 46f2ce: 48 c7 04 c2 00 00 00 movq $0x0,(%rdx,%rax,8) 0.00 : 46f2d5: 00 : slot->tts_isnull[attno] = true; 0.00 : 46f2d6: 49 8b 54 24 30 mov 0x30(%r12),%rdx 0.00 : 46f2db: c6 04 02 01 movb $0x1,(%rdx,%rax,1) : : /* : * If tuple doesn't have all the atts indicated by tupleDesc, read the : * rest as null : */ : for (; attno < attnum; attno++) 0.00 : 46f2df: 7f df jg 46f2c0 : { : slot->tts_values[attno] = (Datum) 0; : slot->tts_isnull[attno] = true; : } : slot->tts_nvalid = attnum; 0.00 : 46f2e1: 45 89 6c 24 24 mov %r13d,0x24(%r12) : } 0.00 : 46f2e6: 48 8b 5d e8 mov -0x18(%rbp),%rbx 0.00 : 46f2ea: 4c 8b 65 f0 mov -0x10(%rbp),%r12 0.00 : 46f2ee: 4c 8b 6d f8 mov -0x8(%rbp),%r13 0.00 : 46f2f2: c9 leaveq 0.00 : 46f2f3: c3 retq 0.00 : 46f2f4: 0f 1f 40 00 nopl 0x0(%rax) : if (slot->tts_nvalid >= attnum) : return; : : /* Check for caller error */ : if (attnum <= 0 || attnum > slot->tts_tupleDescriptor->natts) : elog(ERROR, "invalid attribute number %d", attnum); 0.00 : 46f2f8: ba c0 f6 7a 00 mov $0x7af6c0,%edx 0.00 : 46f2fd: be 1a 05 00 00 mov $0x51a,%esi 0.00 : 46f302: bf f4 f5 7a 00 mov $0x7af5f4,%edi 0.00 : 46f307: e8 14 c1 30 00 callq 77b420 0.00 : 46f30c: 44 89 ea mov %r13d,%edx 0.00 : 46f30f: be 13 f6 7a 00 mov $0x7af613,%esi 0.00 : 46f314: bf 14 00 00 00 mov $0x14,%edi 0.00 : 46f319: 31 c0 xor %eax,%eax 0.00 : 46f31b: e8 10 bf 30 00 callq 77b230 0.00 : 46f320: e8 ab a1 ff ff callq 4694d0 : * otherwise we had better have a physical tuple (tts_nvalid should equal : * natts in all virtual-tuple cases) : */ : tuple = slot->tts_tuple; : if (tuple == NULL) /* internal error */ : elog(ERROR, "cannot extract attribute from empty tuple slot"); 0.00 : 46f325: ba c0 f6 7a 00 mov $0x7af6c0,%edx 0.00 : 46f32a: be 22 05 00 00 mov $0x522,%esi 0.00 : 46f32f: bf f4 f5 7a 00 mov $0x7af5f4,%edi 0.00 : 46f334: e8 e7 c0 30 00 callq 77b420 0.00 : 46f339: be b0 f7 7a 00 mov $0x7af7b0,%esi 0.00 : 46f33e: bf 14 00 00 00 mov $0x14,%edi 0.00 : 46f343: 31 c0 xor %eax,%eax 0.00 : 46f345: e8 e6 be 30 00 callq 77b230 0.00 : 46f34a: e8 81 a1 ff ff callq 4694d0 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 33.33 /home/Computational/mark/src/postgres-andres/src/backend/access/index/indexam.c:452 33.33 /home/Computational/mark/src/postgres-andres/src/backend/access/index/indexam.c:484 33.33 /home/Computational/mark/src/postgres-andres/src/backend/access/index/indexam.c:485 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000004a5630 : : * or NULL if no more matching tuples exist. : * ---------------- : */ : ItemPointer : index_getnext_tid(IndexScanDesc scan, ScanDirection direction) : { 0.00 : 4a5630: 55 push %rbp 0.00 : 4a5631: 48 89 e5 mov %rsp,%rbp 0.00 : 4a5634: 48 89 5d e8 mov %rbx,-0x18(%rbp) 0.00 : 4a5638: 4c 89 65 f0 mov %r12,-0x10(%rbp) 0.00 : 4a563c: 48 89 fb mov %rdi,%rbx 0.00 : 4a563f: 4c 89 6d f8 mov %r13,-0x8(%rbp) 0.00 : 4a5643: 48 83 ec 20 sub $0x20,%rsp : FmgrInfo *procedure; : bool found; : : SCAN_CHECKS; : GET_SCAN_PROCEDURE(amgettuple); 0.00 : 4a5647: 48 8b 57 08 mov 0x8(%rdi),%rdx : * or NULL if no more matching tuples exist. : * ---------------- : */ : ItemPointer : index_getnext_tid(IndexScanDesc scan, ScanDirection direction) : { 0.00 : 4a564b: 41 89 f5 mov %esi,%r13d : FmgrInfo *procedure; : bool found; : : SCAN_CHECKS; : GET_SCAN_PROCEDURE(amgettuple); 0.00 : 4a564e: 48 8b 82 c0 00 00 00 mov 0xc0(%rdx),%rax 0.00 : 4a5655: 44 8b 40 68 mov 0x68(%rax),%r8d /home/Computational/mark/src/postgres-andres/src/backend/access/index/indexam.c:452 33.33 : 4a5659: 4c 8d 60 60 lea 0x60(%rax),%r12 0.00 : 4a565d: 45 85 c0 test %r8d,%r8d 0.00 : 4a5660: 75 1d jne 4a567f 0.00 : 4a5662: 48 8b 82 b0 00 00 00 mov 0xb0(%rdx),%rax 0.00 : 4a5669: 8b 78 5c mov 0x5c(%rax),%edi 0.00 : 4a566c: 85 ff test %edi,%edi 0.00 : 4a566e: 74 69 je 4a56d9 0.00 : 4a5670: 48 8b 92 b8 00 00 00 mov 0xb8(%rdx),%rdx 0.00 : 4a5677: 4c 89 e6 mov %r12,%rsi 0.00 : 4a567a: e8 d1 a9 2d 00 callq 780050 : * The AM's amgettuple proc finds the next index entry matching the scan : * keys, and puts the TID into scan->xs_ctup.t_self. It should also set : * scan->xs_recheck and possibly scan->xs_itup, though we pay no attention : * to those fields here. : */ : found = DatumGetBool(FunctionCall2(procedure, 0.00 : 4a567f: 31 f6 xor %esi,%esi 0.00 : 4a5681: 44 89 e9 mov %r13d,%ecx 0.00 : 4a5684: 48 89 da mov %rbx,%rdx 0.00 : 4a5687: 4c 89 e7 mov %r12,%rdi 0.00 : 4a568a: e8 a1 89 2d 00 callq 77e030 : : /* Reset kill flag immediately for safety */ : scan->kill_prior_tuple = false; : : /* If we're out of index entries, we're done */ : if (!found) 0.00 : 4a568f: 84 c0 test %al,%al : found = DatumGetBool(FunctionCall2(procedure, : PointerGetDatum(scan), : Int32GetDatum(direction))); : : /* Reset kill flag immediately for safety */ : scan->kill_prior_tuple = false; 0.00 : 4a5691: c6 43 31 00 movb $0x0,0x31(%rbx) : : /* If we're out of index entries, we're done */ : if (!found) 0.00 : 4a5695: 74 29 je 4a56c0 : scan->xs_cbuf = InvalidBuffer; : } : return NULL; : } : : pgstat_count_index_tuples(scan->indexRelation, 1); 0.00 : 4a5697: 48 8b 43 08 mov 0x8(%rbx),%rax 0.00 : 4a569b: 48 8b 80 38 01 00 00 mov 0x138(%rax),%rax 0.00 : 4a56a2: 48 85 c0 test %rax,%rax 0.00 : 4a56a5: 74 05 je 4a56ac 0.00 : 4a56a7: 48 83 40 18 01 addq $0x1,0x18(%rax) : : /* Return the TID of the tuple we found. */ : return &scan->xs_ctup.t_self; /home/Computational/mark/src/postgres-andres/src/backend/access/index/indexam.c:484 33.33 : 4a56ac: 48 8d 43 54 lea 0x54(%rbx),%rax : } 0.00 : 4a56b0: 48 8b 5d e8 mov -0x18(%rbp),%rbx 0.00 : 4a56b4: 4c 8b 65 f0 mov -0x10(%rbp),%r12 0.00 : 4a56b8: 4c 8b 6d f8 mov -0x8(%rbp),%r13 /home/Computational/mark/src/postgres-andres/src/backend/access/index/indexam.c:485 33.33 : 4a56bc: c9 leaveq 0.00 : 4a56bd: c3 retq 0.00 : 4a56be: 66 90 xchg %ax,%ax : : /* If we're out of index entries, we're done */ : if (!found) : { : /* ... but first, release any held pin on a heap page */ : if (BufferIsValid(scan->xs_cbuf)) 0.00 : 4a56c0: 8b 7b 68 mov 0x68(%rbx),%edi 0.00 : 4a56c3: 31 c0 xor %eax,%eax 0.00 : 4a56c5: 85 ff test %edi,%edi 0.00 : 4a56c7: 74 e7 je 4a56b0 : { : ReleaseBuffer(scan->xs_cbuf); 0.00 : 4a56c9: e8 92 f7 1c 00 callq 674e60 : scan->xs_cbuf = InvalidBuffer; 0.00 : 4a56ce: c7 43 68 00 00 00 00 movl $0x0,0x68(%rbx) 0.00 : 4a56d5: 31 c0 xor %eax,%eax 0.00 : 4a56d7: eb d7 jmp 4a56b0 : { : FmgrInfo *procedure; : bool found; : : SCAN_CHECKS; : GET_SCAN_PROCEDURE(amgettuple); 0.00 : 4a56d9: ba 50 3c 7b 00 mov $0x7b3c50,%edx 0.00 : 4a56de: be c4 01 00 00 mov $0x1c4,%esi 0.00 : 4a56e3: bf 33 3b 7b 00 mov $0x7b3b33,%edi 0.00 : 4a56e8: e8 33 5d 2d 00 callq 77b420 0.00 : 4a56ed: ba 8e 3b 7b 00 mov $0x7b3b8e,%edx 0.00 : 4a56f2: be 48 3b 7b 00 mov $0x7b3b48,%esi 0.00 : 4a56f7: bf 14 00 00 00 mov $0x14,%edi 0.00 : 4a56fc: 31 c0 xor %eax,%eax 0.00 : 4a56fe: e8 2d 5b 2d 00 callq 77b230 0.00 : 4a5703: e8 c8 3d fc ff callq 4694d0 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 33.33 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtree.c:287 33.33 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtree.c:318 33.33 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtree.c:324 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000004abe70 : : /* : * btgettuple() -- Get the next tuple in the scan. : */ : Datum : btgettuple(PG_FUNCTION_ARGS) : { 0.00 : 4abe70: 55 push %rbp 0.00 : 4abe71: 48 89 e5 mov %rsp,%rbp 0.00 : 4abe74: 41 55 push %r13 0.00 : 4abe76: 41 54 push %r12 0.00 : 4abe78: 53 push %rbx 0.00 : 4abe79: 48 83 ec 08 sub $0x8,%rsp : IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0); 0.00 : 4abe7d: 4c 8b 67 20 mov 0x20(%rdi),%r12 : ScanDirection dir = (ScanDirection) PG_GETARG_INT32(1); 0.00 : 4abe81: 48 8b 4f 28 mov 0x28(%rdi),%rcx : BTScanOpaque so = (BTScanOpaque) scan->opaque; 0.00 : 4abe85: 49 8b 5c 24 38 mov 0x38(%r12),%rbx : bool res; : : /* btree indexes are never lossy */ : scan->xs_recheck = false; 0.00 : 4abe8a: 41 c6 44 24 6c 00 movb $0x0,0x6c(%r12) : */ : Datum : btgettuple(PG_FUNCTION_ARGS) : { : IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0); : ScanDirection dir = (ScanDirection) PG_GETARG_INT32(1); 0.00 : 4abe90: 41 89 cd mov %ecx,%r13d : /* : * If we have any array keys, initialize them during first call for a : * scan. We can't do this in btrescan because we don't know the scan : * direction at that time. : */ : if (so->numArrayKeys && !BTScanPosIsValid(so->currPos)) 0.00 : 4abe93: 8b 53 18 mov 0x18(%rbx),%edx 0.00 : 4abe96: 85 d2 test %edx,%edx 0.00 : 4abe98: 74 7b je 4abf15 0.00 : 4abe9a: 8b 43 54 mov 0x54(%rbx),%eax 0.00 : 4abe9d: 85 c0 test %eax,%eax 0.00 : 4abe9f: 75 74 jne 4abf15 : { : /* punt if we have any unsatisfiable array keys */ : if (so->numArrayKeys < 0) 0.00 : 4abea1: 31 c0 xor %eax,%eax 0.00 : 4abea3: 85 d2 test %edx,%edx 0.00 : 4abea5: 0f 88 97 00 00 00 js 4abf42 : PG_RETURN_BOOL(false); : : _bt_start_array_keys(scan, dir); 0.00 : 4abeab: 89 ce mov %ecx,%esi 0.00 : 4abead: 4c 89 e7 mov %r12,%rdi 0.00 : 4abeb0: e8 3b 1d 00 00 callq 4adbf0 <_bt_start_array_keys> : /* : * If we've already initialized this scan, we can just advance it in : * the appropriate direction. If we haven't done so yet, we call : * _bt_first() to get the first item in the scan. : */ : if (!BTScanPosIsValid(so->currPos)) 0.00 : 4abeb5: 8b 43 54 mov 0x54(%rbx),%eax 0.00 : 4abeb8: 85 c0 test %eax,%eax 0.00 : 4abeba: 74 60 je 4abf1c 0.00 : 4abebc: 0f 1f 40 00 nopl 0x0(%rax) : else : { : /* : * Check to see if we should kill the previously-fetched tuple. : */ : if (scan->kill_prior_tuple) 0.00 : 4abec0: 41 80 7c 24 31 00 cmpb $0x0,0x31(%r12) 0.00 : 4abec6: 74 28 je 4abef0 : * caller reverses direction in the indexscan then the same : * item might get entered multiple times. It's not worth : * trying to optimize that, so we don't detect it, but instead : * just forget any excess entries. : */ : if (so->killedItems == NULL) 0.00 : 4abec8: 48 83 7b 30 00 cmpq $0x0,0x30(%rbx) 0.00 : 4abecd: 0f 1f 00 nopl (%rax) 0.00 : 4abed0: 74 7e je 4abf50 : so->killedItems = (int *) : palloc(MaxIndexTuplesPerPage * sizeof(int)); : if (so->numKilled < MaxIndexTuplesPerPage) 0.00 : 4abed2: 8b 73 38 mov 0x38(%rbx),%esi 0.00 : 4abed5: 81 fe 97 01 00 00 cmp $0x197,%esi 0.00 : 4abedb: 7f 13 jg 4abef0 : so->killedItems[so->numKilled++] = so->currPos.itemIndex; 0.00 : 4abedd: 8b 43 6c mov 0x6c(%rbx),%eax 0.00 : 4abee0: 48 8b 53 30 mov 0x30(%rbx),%rdx 0.00 : 4abee4: 48 63 ce movslq %esi,%rcx 0.00 : 4abee7: 89 04 8a mov %eax,(%rdx,%rcx,4) 0.00 : 4abeea: 8d 46 01 lea 0x1(%rsi),%eax 0.00 : 4abeed: 89 43 38 mov %eax,0x38(%rbx) : } : : /* : * Now continue the scan. : */ : res = _bt_next(scan, dir); 0.00 : 4abef0: 44 89 ee mov %r13d,%esi 0.00 : 4abef3: 4c 89 e7 mov %r12,%rdi 0.00 : 4abef6: e8 75 0c 00 00 callq 4acb70 <_bt_next> : } : : /* If we have a tuple, return it ... */ : if (res) 0.00 : 4abefb: 84 c0 test %al,%al 0.00 : 4abefd: 75 2c jne 4abf2b : break; : /* ... otherwise see if we have more array keys to deal with */ : } while (so->numArrayKeys && _bt_advance_array_keys(scan, dir)); 0.00 : 4abeff: 8b 43 18 mov 0x18(%rbx),%eax 0.00 : 4abf02: 85 c0 test %eax,%eax 0.00 : 4abf04: 74 3a je 4abf40 0.00 : 4abf06: 44 89 ee mov %r13d,%esi 0.00 : 4abf09: 4c 89 e7 mov %r12,%rdi 0.00 : 4abf0c: e8 5f 1d 00 00 callq 4adc70 <_bt_advance_array_keys> 0.00 : 4abf11: 84 c0 test %al,%al 0.00 : 4abf13: 74 2b je 4abf40 : /* : * If we've already initialized this scan, we can just advance it in : * the appropriate direction. If we haven't done so yet, we call : * _bt_first() to get the first item in the scan. : */ : if (!BTScanPosIsValid(so->currPos)) 0.00 : 4abf15: 8b 43 54 mov 0x54(%rbx),%eax 0.00 : 4abf18: 85 c0 test %eax,%eax 0.00 : 4abf1a: 75 a4 jne 4abec0 : res = _bt_first(scan, dir); /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtree.c:287 33.33 : 4abf1c: 44 89 ee mov %r13d,%esi 0.00 : 4abf1f: 4c 89 e7 mov %r12,%rdi 0.00 : 4abf22: e8 69 13 00 00 callq 4ad290 <_bt_first> : */ : res = _bt_next(scan, dir); : } : : /* If we have a tuple, return it ... */ : if (res) /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtree.c:318 33.33 : 4abf27: 84 c0 test %al,%al 0.00 : 4abf29: 74 d4 je 4abeff : break; : /* ... otherwise see if we have more array keys to deal with */ : } while (so->numArrayKeys && _bt_advance_array_keys(scan, dir)); : : PG_RETURN_BOOL(res); : } /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtree.c:324 33.33 : 4abf2b: 48 83 c4 08 add $0x8,%rsp : res = _bt_next(scan, dir); : } : : /* If we have a tuple, return it ... */ : if (res) : break; 0.00 : 4abf2f: b8 01 00 00 00 mov $0x1,%eax : /* ... otherwise see if we have more array keys to deal with */ : } while (so->numArrayKeys && _bt_advance_array_keys(scan, dir)); : : PG_RETURN_BOOL(res); : } 0.00 : 4abf34: 5b pop %rbx 0.00 : 4abf35: 41 5c pop %r12 0.00 : 4abf37: 41 5d pop %r13 0.00 : 4abf39: c9 leaveq 0.00 : 4abf3a: c3 retq 0.00 : 4abf3b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : : /* If we have a tuple, return it ... */ : if (res) : break; : /* ... otherwise see if we have more array keys to deal with */ : } while (so->numArrayKeys && _bt_advance_array_keys(scan, dir)); 0.00 : 4abf40: 31 c0 xor %eax,%eax : : PG_RETURN_BOOL(res); : } 0.00 : 4abf42: 48 83 c4 08 add $0x8,%rsp 0.00 : 4abf46: 5b pop %rbx 0.00 : 4abf47: 41 5c pop %r12 0.00 : 4abf49: 41 5d pop %r13 0.00 : 4abf4b: c9 leaveq 0.00 : 4abf4c: c3 retq 0.00 : 4abf4d: 0f 1f 00 nopl (%rax) : * item might get entered multiple times. It's not worth : * trying to optimize that, so we don't detect it, but instead : * just forget any excess entries. : */ : if (so->killedItems == NULL) : so->killedItems = (int *) 0.00 : 4abf50: bf 60 06 00 00 mov $0x660,%edi 0.00 : 4abf55: e8 f6 cd 2e 00 callq 798d50 0.00 : 4abf5a: 48 89 43 30 mov %rax,0x30(%rbx) 0.00 : 4abf5e: e9 6f ff ff ff jmpq 4abed2 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 66.67 /home/Computational/mark/src/postgres-andres/src/backend/access/transam/xlog.c:4648 33.33 /home/Computational/mark/src/postgres-andres/src/backend/access/transam/xlog.c:4651 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000004ccfc0 : : /* : * Are checksums enabled for data pages? : */ : bool : DataChecksumsEnabled(void) : { 0.00 : 4ccfc0: 48 8b 05 d9 c1 6a 00 mov 0x6ac1d9(%rip),%rax # b791a0 /home/Computational/mark/src/postgres-andres/src/backend/access/transam/xlog.c:4648 66.67 : 4ccfc7: 55 push %rbp 0.00 : 4ccfc8: 48 89 e5 mov %rsp,%rbp 0.00 : 4ccfcb: 8b 80 ec 00 00 00 mov 0xec(%rax),%eax : Assert(ControlFile != NULL); : return (ControlFile->data_checksum_version > 0); : } /home/Computational/mark/src/postgres-andres/src/backend/access/transam/xlog.c:4651 33.33 : 4ccfd1: c9 leaveq : /* : * Are checksums enabled for data pages? : */ : bool : DataChecksumsEnabled(void) : { 0.00 : 4ccfd2: 85 c0 test %eax,%eax 0.00 : 4ccfd4: 0f 95 c0 setne %al Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 33.33 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeAgg.c:544 33.33 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeAgg.c:534 33.33 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeAgg.c:603 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000005b9950 : : * : * When called, CurrentMemoryContext should be the per-query context. : */ : static void : advance_aggregates(AggState *aggstate, AggStatePerGroup pergroup) : { 0.00 : 5b9950: 55 push %rbp 0.00 : 5b9951: 48 89 e5 mov %rsp,%rbp 0.00 : 5b9954: 41 57 push %r15 0.00 : 5b9956: 49 89 ff mov %rdi,%r15 0.00 : 5b9959: 41 56 push %r14 0.00 : 5b995b: 41 55 push %r13 0.00 : 5b995d: 41 54 push %r12 0.00 : 5b995f: 53 push %rbx 0.00 : 5b9960: 48 83 ec 18 sub $0x18,%rsp 0.00 : 5b9964: 48 89 75 c0 mov %rsi,-0x40(%rbp) : int aggno; : : for (aggno = 0; aggno < aggstate->numaggs; aggno++) 0.00 : 5b9968: 44 8b 9f 98 00 00 00 mov 0x98(%rdi),%r11d 0.00 : 5b996f: 45 85 db test %r11d,%r11d 0.00 : 5b9972: 0f 8e c1 00 00 00 jle 5b9a39 0.00 : 5b9978: 45 31 f6 xor %r14d,%r14d 0.00 : 5b997b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : { : AggStatePerAgg peraggstate = &aggstate->peragg[aggno]; 0.00 : 5b9980: 4d 63 ee movslq %r14d,%r13 0.00 : 5b9983: 49 69 dd a8 04 00 00 imul $0x4a8,%r13,%rbx 0.00 : 5b998a: 49 03 9f b0 00 00 00 add 0xb0(%r15),%rbx : AggStatePerGroup pergroupstate = &pergroup[aggno]; : ExprState *filter = peraggstate->aggrefstate->aggfilter; 0.00 : 5b9991: 48 8b 03 mov (%rbx),%rax : int numTransInputs = peraggstate->numTransInputs; 0.00 : 5b9994: 44 8b 63 18 mov 0x18(%rbx),%r12d : : for (aggno = 0; aggno < aggstate->numaggs; aggno++) : { : AggStatePerAgg peraggstate = &aggstate->peragg[aggno]; : AggStatePerGroup pergroupstate = &pergroup[aggno]; : ExprState *filter = peraggstate->aggrefstate->aggfilter; 0.00 : 5b9998: 48 8b 78 28 mov 0x28(%rax),%rdi : int numTransInputs = peraggstate->numTransInputs; : int i; : TupleTableSlot *slot; : : /* Skip anything FILTERed out */ : if (filter) /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeAgg.c:544 33.33 : 5b999c: 48 85 ff test %rdi,%rdi 0.00 : 5b999f: 74 1c je 5b99bd : { : Datum res; : bool isnull; : : res = ExecEvalExprSwitchContext(filter, aggstate->tmpcontext, 0.00 : 5b99a1: 49 8b b7 c0 00 00 00 mov 0xc0(%r15),%rsi 0.00 : 5b99a8: 48 8d 55 d7 lea -0x29(%rbp),%rdx 0.00 : 5b99ac: 31 c9 xor %ecx,%ecx 0.00 : 5b99ae: e8 2d 35 ff ff callq 5acee0 : &isnull, NULL); : if (isnull || !DatumGetBool(res)) 0.00 : 5b99b3: 80 7d d7 00 cmpb $0x0,-0x29(%rbp) 0.00 : 5b99b7: 75 6f jne 5b9a28 0.00 : 5b99b9: 84 c0 test %al,%al 0.00 : 5b99bb: 74 6b je 5b9a28 : continue; : } : : /* Evaluate the current input expressions for this aggregate */ : slot = ExecProject(peraggstate->evalproj, NULL); 0.00 : 5b99bd: 48 8b bb e0 00 00 00 mov 0xe0(%rbx),%rdi 0.00 : 5b99c4: 31 f6 xor %esi,%esi 0.00 : 5b99c6: e8 35 36 ff ff callq 5ad000 : : if (peraggstate->numSortCols > 0) 0.00 : 5b99cb: 44 8b 93 8c 00 00 00 mov 0x8c(%rbx),%r10d : if (isnull || !DatumGetBool(res)) : continue; : } : : /* Evaluate the current input expressions for this aggregate */ : slot = ExecProject(peraggstate->evalproj, NULL); 0.00 : 5b99d2: 48 89 c1 mov %rax,%rcx : : if (peraggstate->numSortCols > 0) 0.00 : 5b99d5: 45 85 d2 test %r10d,%r10d 0.00 : 5b99d8: 7e 76 jle 5b9a50 : * storing the row in the sorter, to save space if there are a lot : * of nulls. Note that we must only check numTransInputs columns, : * not numInputs, since nullity in columns used only for sorting : * is not relevant here. : */ : if (peraggstate->transfn.fn_strict) 0.00 : 5b99da: 80 7b 36 00 cmpb $0x0,0x36(%rbx) 0.00 : 5b99de: 74 2c je 5b9a0c : { : for (i = 0; i < numTransInputs; i++) 0.00 : 5b99e0: 45 85 e4 test %r12d,%r12d 0.00 : 5b99e3: 7e 27 jle 5b9a0c : { : if (slot->tts_isnull[i]) 0.00 : 5b99e5: 48 8b 40 30 mov 0x30(%rax),%rax 0.00 : 5b99e9: 31 d2 xor %edx,%edx 0.00 : 5b99eb: 80 38 00 cmpb $0x0,(%rax) 0.00 : 5b99ee: 48 89 c6 mov %rax,%rsi 0.00 : 5b99f1: 74 11 je 5b9a04 0.00 : 5b99f3: eb 33 jmp 5b9a28 0.00 : 5b99f5: 0f 1f 00 nopl (%rax) 0.00 : 5b99f8: 0f b6 46 01 movzbl 0x1(%rsi),%eax 0.00 : 5b99fc: 48 83 c6 01 add $0x1,%rsi 0.00 : 5b9a00: 84 c0 test %al,%al 0.00 : 5b9a02: 75 24 jne 5b9a28 : * not numInputs, since nullity in columns used only for sorting : * is not relevant here. : */ : if (peraggstate->transfn.fn_strict) : { : for (i = 0; i < numTransInputs; i++) 0.00 : 5b9a04: 83 c2 01 add $0x1,%edx 0.00 : 5b9a07: 41 39 d4 cmp %edx,%r12d 0.00 : 5b9a0a: 7f ec jg 5b99f8 : if (i < numTransInputs) : continue; : } : : /* OK, put the tuple into the tuplesort object */ : if (peraggstate->numInputs == 1) 0.00 : 5b9a0c: 83 7b 14 01 cmpl $0x1,0x14(%rbx) 0.00 : 5b9a10: 0f 84 8a 00 00 00 je 5b9aa0 : tuplesort_putdatum(peraggstate->sortstate, : slot->tts_values[0], : slot->tts_isnull[0]); : else : tuplesort_puttupleslot(peraggstate->sortstate, slot); 0.00 : 5b9a16: 48 8b bb f8 00 00 00 mov 0xf8(%rbx),%rdi 0.00 : 5b9a1d: 48 89 ce mov %rcx,%rsi 0.00 : 5b9a20: e8 0b 56 1e 00 callq 79f030 0.00 : 5b9a25: 0f 1f 00 nopl (%rax) : static void : advance_aggregates(AggState *aggstate, AggStatePerGroup pergroup) : { : int aggno; : : for (aggno = 0; aggno < aggstate->numaggs; aggno++) 0.00 : 5b9a28: 41 83 c6 01 add $0x1,%r14d /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeAgg.c:534 33.33 : 5b9a2c: 45 39 b7 98 00 00 00 cmp %r14d,0x98(%r15) 0.00 : 5b9a33: 0f 8f 47 ff ff ff jg 5b9980 : } : : advance_transition_function(aggstate, peraggstate, pergroupstate); : } : } : } 0.00 : 5b9a39: 48 83 c4 18 add $0x18,%rsp 0.00 : 5b9a3d: 5b pop %rbx 0.00 : 5b9a3e: 41 5c pop %r12 0.00 : 5b9a40: 41 5d pop %r13 0.00 : 5b9a42: 41 5e pop %r14 0.00 : 5b9a44: 41 5f pop %r15 0.00 : 5b9a46: c9 leaveq 0.00 : 5b9a47: c3 retq 0.00 : 5b9a48: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 5b9a4f: 00 : if (peraggstate->numInputs == 1) : tuplesort_putdatum(peraggstate->sortstate, : slot->tts_values[0], : slot->tts_isnull[0]); : else : tuplesort_puttupleslot(peraggstate->sortstate, slot); 0.00 : 5b9a50: 31 d2 xor %edx,%edx : FunctionCallInfo fcinfo = &peraggstate->transfn_fcinfo; : : /* Load values into fcinfo */ : /* Start from 1, since the 0th arg will be the transition value */ : Assert(slot->tts_nvalid >= numTransInputs); : for (i = 0; i < numTransInputs; i++) 0.00 : 5b9a52: 45 85 e4 test %r12d,%r12d 0.00 : 5b9a55: 7e 31 jle 5b9a88 0.00 : 5b9a57: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 5b9a5e: 00 00 : { : fcinfo->arg[i + 1] = slot->tts_values[i]; 0.00 : 5b9a60: 48 8b 41 28 mov 0x28(%rcx),%rax 0.00 : 5b9a64: 48 8b 04 d0 mov (%rax,%rdx,8),%rax 0.00 : 5b9a68: 48 89 84 d3 28 01 00 mov %rax,0x128(%rbx,%rdx,8) 0.00 : 5b9a6f: 00 : fcinfo->argnull[i + 1] = slot->tts_isnull[i]; 0.00 : 5b9a70: 48 8b 41 30 mov 0x30(%rcx),%rax 0.00 : 5b9a74: 0f b6 04 10 movzbl (%rax,%rdx,1),%eax 0.00 : 5b9a78: 88 84 13 41 04 00 00 mov %al,0x441(%rbx,%rdx,1) 0.00 : 5b9a7f: 48 83 c2 01 add $0x1,%rdx : FunctionCallInfo fcinfo = &peraggstate->transfn_fcinfo; : : /* Load values into fcinfo */ : /* Start from 1, since the 0th arg will be the transition value */ : Assert(slot->tts_nvalid >= numTransInputs); : for (i = 0; i < numTransInputs; i++) 0.00 : 5b9a83: 41 39 d4 cmp %edx,%r12d 0.00 : 5b9a86: 7f d8 jg 5b9a60 : { : fcinfo->arg[i + 1] = slot->tts_values[i]; : fcinfo->argnull[i + 1] = slot->tts_isnull[i]; : } : : advance_transition_function(aggstate, peraggstate, pergroupstate); /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeAgg.c:603 33.33 : 5b9a88: 48 8b 55 c0 mov -0x40(%rbp),%rdx 0.00 : 5b9a8c: 49 c1 e5 04 shl $0x4,%r13 0.00 : 5b9a90: 48 89 de mov %rbx,%rsi 0.00 : 5b9a93: 4c 89 ff mov %r15,%rdi 0.00 : 5b9a96: 4c 01 ea add %r13,%rdx 0.00 : 5b9a99: e8 f2 fc ff ff callq 5b9790 0.00 : 5b9a9e: eb 88 jmp 5b9a28 : continue; : } : : /* OK, put the tuple into the tuplesort object */ : if (peraggstate->numInputs == 1) : tuplesort_putdatum(peraggstate->sortstate, 0.00 : 5b9aa0: 48 8b 41 30 mov 0x30(%rcx),%rax 0.00 : 5b9aa4: 48 8b bb f8 00 00 00 mov 0xf8(%rbx),%rdi 0.00 : 5b9aab: 0f be 10 movsbl (%rax),%edx 0.00 : 5b9aae: 48 8b 41 28 mov 0x28(%rcx),%rax 0.00 : 5b9ab2: 48 8b 30 mov (%rax),%rsi 0.00 : 5b9ab5: e8 66 54 1e 00 callq 79ef20 0.00 : 5b9aba: e9 69 ff ff ff jmpq 5b9a28 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 33.33 /home/Computational/mark/src/postgres-andres/src/backend/postmaster/pgstat.c:1576 33.33 /home/Computational/mark/src/postgres-andres/src/backend/postmaster/pgstat.c:1576 33.33 /home/Computational/mark/src/postgres-andres/src/backend/postmaster/pgstat.c:1616 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000006425d0 : : * calls for what the user considers a single call of the function. The : * finalize flag should be TRUE on the last call. : */ : void : pgstat_end_function_usage(PgStat_FunctionCallUsage *fcu, bool finalize) : { 0.00 : 6425d0: 55 push %rbp /home/Computational/mark/src/postgres-andres/src/backend/postmaster/pgstat.c:1576 33.33 : 6425d1: 48 89 e5 mov %rsp,%rbp 33.33 : 6425d4: 41 55 push %r13 0.00 : 6425d6: 41 89 f5 mov %esi,%r13d 0.00 : 6425d9: 41 54 push %r12 0.00 : 6425db: 49 89 fc mov %rdi,%r12 0.00 : 6425de: 53 push %rbx 0.00 : 6425df: 48 83 ec 18 sub $0x18,%rsp : PgStat_FunctionCounts *fs = fcu->fs; 0.00 : 6425e3: 48 8b 1f mov (%rdi),%rbx : instr_time f_total; : instr_time f_others; : instr_time f_self; : : /* stats not wanted? */ : if (fs == NULL) 0.00 : 6425e6: 48 85 db test %rbx,%rbx 0.00 : 6425e9: 0f 84 6f 01 00 00 je 64275e : return; : : /* total elapsed time in this function call */ : INSTR_TIME_SET_CURRENT(f_total); 0.00 : 6425ef: 48 8d 7d d0 lea -0x30(%rbp),%rdi 0.00 : 6425f3: 31 f6 xor %esi,%esi 0.00 : 6425f5: e8 c6 6f e2 ff callq 4695c0 : INSTR_TIME_SUBTRACT(f_total, fcu->f_start); 0.00 : 6425fa: 48 8b 4d d8 mov -0x28(%rbp),%rcx 0.00 : 6425fe: 49 2b 4c 24 30 sub 0x30(%r12),%rcx 0.00 : 642603: 48 8b 45 d0 mov -0x30(%rbp),%rax 0.00 : 642607: 49 2b 44 24 28 sub 0x28(%r12),%rax 0.00 : 64260c: 48 85 c9 test %rcx,%rcx 0.00 : 64260f: 48 89 4d d8 mov %rcx,-0x28(%rbp) 0.00 : 642613: 49 89 c1 mov %rax,%r9 0.00 : 642616: 48 89 45 d0 mov %rax,-0x30(%rbp) 0.00 : 64261a: 79 1c jns 642638 0.00 : 64261c: 0f 1f 40 00 nopl 0x0(%rax) : * calls for what the user considers a single call of the function. The : * finalize flag should be TRUE on the last call. : */ : void : pgstat_end_function_usage(PgStat_FunctionCallUsage *fcu, bool finalize) : { 0.00 : 642620: 48 83 e8 01 sub $0x1,%rax : if (fs == NULL) : return; : : /* total elapsed time in this function call */ : INSTR_TIME_SET_CURRENT(f_total); : INSTR_TIME_SUBTRACT(f_total, fcu->f_start); 0.00 : 642624: 48 81 c1 40 42 0f 00 add $0xf4240,%rcx 0.00 : 64262b: 78 f3 js 642620 0.00 : 64262d: 48 89 45 d0 mov %rax,-0x30(%rbp) 0.00 : 642631: 48 89 4d d8 mov %rcx,-0x28(%rbp) 0.00 : 642635: 49 89 c1 mov %rax,%r9 : : /* self usage: elapsed minus anything already charged to other calls */ : f_others = total_func_time; 0.00 : 642638: 4c 8b 05 e9 98 53 00 mov 0x5398e9(%rip),%r8 # b7bf28 0.00 : 64263f: 4c 8b 15 da 98 53 00 mov 0x5398da(%rip),%r10 # b7bf20 : INSTR_TIME_SUBTRACT(f_others, fcu->save_total); 0.00 : 642646: 4c 89 c0 mov %r8,%rax 0.00 : 642649: 4c 89 d2 mov %r10,%rdx 0.00 : 64264c: 49 2b 54 24 18 sub 0x18(%r12),%rdx 0.00 : 642651: 49 2b 44 24 20 sub 0x20(%r12),%rax 0.00 : 642656: 79 14 jns 64266c 0.00 : 642658: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 64265f: 00 0.00 : 642660: 48 83 ea 01 sub $0x1,%rdx 0.00 : 642664: 48 05 40 42 0f 00 add $0xf4240,%rax 0.00 : 64266a: 78 f4 js 642660 : f_self = f_total; : INSTR_TIME_SUBTRACT(f_self, f_others); 0.00 : 64266c: 4c 89 cf mov %r9,%rdi 0.00 : 64266f: 48 89 ce mov %rcx,%rsi 0.00 : 642672: 48 29 d7 sub %rdx,%rdi 0.00 : 642675: 48 29 c6 sub %rax,%rsi 0.00 : 642678: 79 13 jns 64268d 0.00 : 64267a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 642680: 48 83 ef 01 sub $0x1,%rdi 0.00 : 642684: 48 81 c6 40 42 0f 00 add $0xf4240,%rsi 0.00 : 64268b: 78 f3 js 642680 : : /* update backend-wide total time */ : INSTR_TIME_ADD(total_func_time, f_self); 0.00 : 64268d: 4a 8d 04 06 lea (%rsi,%r8,1),%rax 0.00 : 642691: 4a 8d 14 17 lea (%rdi,%r10,1),%rdx 0.00 : 642695: 48 3d 3f 42 0f 00 cmp $0xf423f,%rax 0.00 : 64269b: 48 89 15 7e 98 53 00 mov %rdx,0x53987e(%rip) # b7bf20 0.00 : 6426a2: 48 89 05 7f 98 53 00 mov %rax,0x53987f(%rip) # b7bf28 0.00 : 6426a9: 7e 25 jle 6426d0 0.00 : 6426ab: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 6426b0: 48 2d 40 42 0f 00 sub $0xf4240,%rax : * calls for what the user considers a single call of the function. The : * finalize flag should be TRUE on the last call. : */ : void : pgstat_end_function_usage(PgStat_FunctionCallUsage *fcu, bool finalize) : { 0.00 : 6426b6: 48 83 c2 01 add $0x1,%rdx : INSTR_TIME_SUBTRACT(f_others, fcu->save_total); : f_self = f_total; : INSTR_TIME_SUBTRACT(f_self, f_others); : : /* update backend-wide total time */ : INSTR_TIME_ADD(total_func_time, f_self); 0.00 : 6426ba: 48 3d 3f 42 0f 00 cmp $0xf423f,%rax 0.00 : 6426c0: 7f ee jg 6426b0 0.00 : 6426c2: 48 89 15 57 98 53 00 mov %rdx,0x539857(%rip) # b7bf20 0.00 : 6426c9: 48 89 05 58 98 53 00 mov %rax,0x539858(%rip) # b7bf28 : * pre-call value of f_total_time. This is necessary to avoid : * double-counting any time taken by recursive calls of myself. (We do : * not need any similar kluge for self time, since that already excludes : * any recursive calls.) : */ : INSTR_TIME_ADD(f_total, fcu->save_f_total_time); 0.00 : 6426d0: 48 89 c8 mov %rcx,%rax 0.00 : 6426d3: 49 03 44 24 10 add 0x10(%r12),%rax 0.00 : 6426d8: 4c 89 ca mov %r9,%rdx 0.00 : 6426db: 49 03 54 24 08 add 0x8(%r12),%rdx 0.00 : 6426e0: 48 3d 3f 42 0f 00 cmp $0xf423f,%rax 0.00 : 6426e6: 48 89 45 d8 mov %rax,-0x28(%rbp) 0.00 : 6426ea: 48 89 55 d0 mov %rdx,-0x30(%rbp) 0.00 : 6426ee: 7e 1a jle 64270a 0.00 : 6426f0: 48 2d 40 42 0f 00 sub $0xf4240,%rax : * calls for what the user considers a single call of the function. The : * finalize flag should be TRUE on the last call. : */ : void : pgstat_end_function_usage(PgStat_FunctionCallUsage *fcu, bool finalize) : { 0.00 : 6426f6: 48 83 c2 01 add $0x1,%rdx : * pre-call value of f_total_time. This is necessary to avoid : * double-counting any time taken by recursive calls of myself. (We do : * not need any similar kluge for self time, since that already excludes : * any recursive calls.) : */ : INSTR_TIME_ADD(f_total, fcu->save_f_total_time); 0.00 : 6426fa: 48 3d 3f 42 0f 00 cmp $0xf423f,%rax 0.00 : 642700: 7f ee jg 6426f0 0.00 : 642702: 48 89 55 d0 mov %rdx,-0x30(%rbp) 0.00 : 642706: 48 89 45 d8 mov %rax,-0x28(%rbp) : : /* update counters in function stats table */ : if (finalize) 0.00 : 64270a: 45 84 ed test %r13b,%r13b 0.00 : 64270d: 75 61 jne 642770 : fs->f_numcalls++; : fs->f_total_time = f_total; 0.00 : 64270f: 48 8b 45 d0 mov -0x30(%rbp),%rax 0.00 : 642713: 48 89 43 08 mov %rax,0x8(%rbx) 0.00 : 642717: 48 8b 45 d8 mov -0x28(%rbp),%rax : INSTR_TIME_ADD(fs->f_self_time, f_self); 0.00 : 64271b: 48 01 7b 18 add %rdi,0x18(%rbx) : INSTR_TIME_ADD(f_total, fcu->save_f_total_time); : : /* update counters in function stats table */ : if (finalize) : fs->f_numcalls++; : fs->f_total_time = f_total; 0.00 : 64271f: 48 89 43 10 mov %rax,0x10(%rbx) : INSTR_TIME_ADD(fs->f_self_time, f_self); 0.00 : 642723: 48 89 f0 mov %rsi,%rax 0.00 : 642726: 48 03 43 20 add 0x20(%rbx),%rax 0.00 : 64272a: 48 3d 3f 42 0f 00 cmp $0xf423f,%rax 0.00 : 642730: 48 89 43 20 mov %rax,0x20(%rbx) 0.00 : 642734: 7e 21 jle 642757 0.00 : 642736: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 0.00 : 64273d: 00 00 00 0.00 : 642740: 48 2d 40 42 0f 00 sub $0xf4240,%rax 0.00 : 642746: 48 83 43 18 01 addq $0x1,0x18(%rbx) 0.00 : 64274b: 48 3d 3f 42 0f 00 cmp $0xf423f,%rax 0.00 : 642751: 48 89 43 20 mov %rax,0x20(%rbx) 0.00 : 642755: 7f e9 jg 642740 : : /* indicate that we have something to send */ : have_function_stats = true; 0.00 : 642757: c6 05 4a 95 53 00 01 movb $0x1,0x53954a(%rip) # b7bca8 : } /home/Computational/mark/src/postgres-andres/src/backend/postmaster/pgstat.c:1616 33.33 : 64275e: 48 83 c4 18 add $0x18,%rsp 0.00 : 642762: 5b pop %rbx 0.00 : 642763: 41 5c pop %r12 0.00 : 642765: 41 5d pop %r13 0.00 : 642767: c9 leaveq 0.00 : 642768: c3 retq 0.00 : 642769: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : */ : INSTR_TIME_ADD(f_total, fcu->save_f_total_time); : : /* update counters in function stats table */ : if (finalize) : fs->f_numcalls++; 0.00 : 642770: 48 83 03 01 addq $0x1,(%rbx) 0.00 : 642774: eb 99 jmp 64270f Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 66.67 /home/Computational/mark/src/postgres-andres/src/backend/utils/adt/date.c:312 33.33 /home/Computational/mark/src/postgres-andres/src/backend/utils/adt/date.c:312 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000006c6af0 : : PG_RETURN_BOOL(dateVal1 != dateVal2); : } : : Datum : date_lt(PG_FUNCTION_ARGS) : { 0.00 : 6c6af0: 48 8b 47 28 mov 0x28(%rdi),%rax /home/Computational/mark/src/postgres-andres/src/backend/utils/adt/date.c:312 33.33 : 6c6af4: 39 47 20 cmp %eax,0x20(%rdi) 0.00 : 6c6af7: 55 push %rbp 0.00 : 6c6af8: 48 89 e5 mov %rsp,%rbp : DateADT dateVal1 = PG_GETARG_DATEADT(0); : DateADT dateVal2 = PG_GETARG_DATEADT(1); : : PG_RETURN_BOOL(dateVal1 < dateVal2); : } 0.00 : 6c6afb: c9 leaveq : PG_RETURN_BOOL(dateVal1 != dateVal2); : } : : Datum : date_lt(PG_FUNCTION_ARGS) : { 66.67 : 6c6afc: 0f 9c c0 setl %al 0.00 : 6c6aff: 0f b6 c0 movzbl %al,%eax Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 66.67 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:593 33.33 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:614 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000782de0 : : * Delete from a concurrent hash table. entry need only contain the key field. : * Returns true if we find and delete a matching key and false otherwise. : */ : bool : CHashDelete(CHashTable table, void *entry) : { 0.00 : 782de0: 55 push %rbp 0.00 : 782de1: 48 89 e5 mov %rsp,%rbp 0.00 : 782de4: 41 57 push %r15 0.00 : 782de6: 41 56 push %r14 0.00 : 782de8: 49 89 f6 mov %rsi,%r14 0.00 : 782deb: 41 55 push %r13 0.00 : 782ded: 41 54 push %r12 0.00 : 782def: 53 push %rbx 0.00 : 782df0: 48 89 fb mov %rdi,%rbx 0.00 : 782df3: 48 83 ec 58 sub $0x58,%rsp : uint32 hashcode = hash_any(entry, table->desc.key_size); 0.00 : 782df7: 0f b7 77 0e movzwl 0xe(%rdi),%esi 0.00 : 782dfb: 4c 89 f7 mov %r14,%rdi 0.00 : 782dfe: e8 4d d5 d0 ff callq 490350 0.00 : 782e03: 41 89 c5 mov %eax,%r13d : uint32 bucket = hashcode & table->bucket_mask; 0.00 : 782e06: 8b 43 10 mov 0x10(%rbx),%eax : CHashPtr *b = &table->bucket[bucket]; : CHashScanResult scan; : : /* Prevent garbage collection for this bucket. */ : Assert(MyProc->hazard[0] == NULL); : MyProc->hazard[0] = CHashTableGetGarbageByBucket(table, bucket); 0.00 : 782e09: 0f b6 4b 14 movzbl 0x14(%rbx),%ecx : */ : bool : CHashDelete(CHashTable table, void *entry) : { : uint32 hashcode = hash_any(entry, table->desc.key_size); : uint32 bucket = hashcode & table->bucket_mask; 0.00 : 782e0d: 44 21 e8 and %r13d,%eax 0.00 : 782e10: 89 45 8c mov %eax,-0x74(%rbp) : CHashPtr *b = &table->bucket[bucket]; : CHashScanResult scan; : : /* Prevent garbage collection for this bucket. */ : Assert(MyProc->hazard[0] == NULL); : MyProc->hazard[0] = CHashTableGetGarbageByBucket(table, bucket); 0.00 : 782e13: 8b 55 8c mov -0x74(%rbp),%edx : bool : CHashDelete(CHashTable table, void *entry) : { : uint32 hashcode = hash_any(entry, table->desc.key_size); : uint32 bucket = hashcode & table->bucket_mask; : CHashPtr *b = &table->bucket[bucket]; 0.00 : 782e16: 89 c0 mov %eax,%eax 0.00 : 782e18: 4c 8d 24 85 00 00 00 lea 0x0(,%rax,4),%r12 0.00 : 782e1f: 00 0.00 : 782e20: 4c 03 63 20 add 0x20(%rbx),%r12 : CHashScanResult scan; : : /* Prevent garbage collection for this bucket. */ : Assert(MyProc->hazard[0] == NULL); : MyProc->hazard[0] = CHashTableGetGarbageByBucket(table, bucket); 0.00 : 782e24: d3 ea shr %cl,%edx 0.00 : 782e26: 0f b6 4b 15 movzbl 0x15(%rbx),%ecx 0.00 : 782e2a: 89 d0 mov %edx,%eax 0.00 : 782e2c: d3 e8 shr %cl,%eax 0.00 : 782e2e: 01 d0 add %edx,%eax 0.00 : 782e30: 48 8b 15 11 ab 3f 00 mov 0x3fab11(%rip),%rdx # b7d948 0.00 : 782e37: 48 c1 e0 02 shl $0x2,%rax 0.00 : 782e3b: 48 03 43 28 add 0x28(%rbx),%rax 0.00 : 782e3f: 48 89 82 e8 02 00 00 mov %rax,0x2e8(%rdx) : pg_memory_barrier(); 0.00 : 782e46: f0 83 04 24 00 lock addl $0x0,(%rsp) /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:593 66.67 : 782e4b: 4c 8d 7d b0 lea -0x50(%rbp),%r15 0.00 : 782e4f: eb 1e jmp 782e6f 0.00 : 782e51: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : if (scan.found) : { : Assert(!CHashPtrIsMarked(scan.next)); : : /* Attempt to apply delete-mark. */ : if (!__sync_bool_compare_and_swap(&scan.target_node->next, 0.00 : 782e58: 8b 45 b4 mov -0x4c(%rbp),%eax 0.00 : 782e5b: 48 8b 55 c0 mov -0x40(%rbp),%rdx 0.00 : 782e5f: 89 c1 mov %eax,%ecx 0.00 : 782e61: 83 c9 01 or $0x1,%ecx 0.00 : 782e64: f0 0f b1 0a lock cmpxchg %ecx,(%rdx) 0.00 : 782e68: 74 5e je 782ec8 : scan.next, : CHashPtrMark(scan.next))) : { : CHashTableIncrementStatistic(table, CHS_Delete_Retry); 0.00 : 782e6a: 48 83 43 78 01 addq $0x1,0x78(%rbx) : MyProc->hazard[0] = CHashTableGetGarbageByBucket(table, bucket); : pg_memory_barrier(); : : /* Scan bucket. */ : retry: : CHashBucketScan(table, b, hashcode, entry, &scan); 0.00 : 782e6f: 4d 89 f8 mov %r15,%r8 0.00 : 782e72: 4c 89 f1 mov %r14,%rcx 0.00 : 782e75: 44 89 ea mov %r13d,%edx 0.00 : 782e78: 4c 89 e6 mov %r12,%rsi 0.00 : 782e7b: 48 89 df mov %rbx,%rdi 0.00 : 782e7e: e8 1d fe ff ff callq 782ca0 : : /* If we found it, try to delete it. */ : if (scan.found) 0.00 : 782e83: 80 7d c8 00 cmpb $0x0,-0x38(%rbp) 0.00 : 782e87: 75 cf jne 782e58 : } : } : : /* Allow garbage collection for this bucket. */ : Assert(MyProc->hazard[0] != NULL); : pg_memory_barrier(); 0.00 : 782e89: f0 83 04 24 00 lock addl $0x0,(%rsp) : MyProc->hazard[0] = NULL; 0.00 : 782e8e: 48 8b 05 b3 aa 3f 00 mov 0x3faab3(%rip),%rax # b7d948 0.00 : 782e95: 48 c7 80 e8 02 00 00 movq $0x0,0x2e8(%rax) 0.00 : 782e9c: 00 00 00 00 : : /* We're done. */ : CHashTableIncrementStatistic(table, CHS_Delete); : if (!scan.found) 0.00 : 782ea0: 0f b6 45 c8 movzbl -0x38(%rbp),%eax : Assert(MyProc->hazard[0] != NULL); : pg_memory_barrier(); : MyProc->hazard[0] = NULL; : : /* We're done. */ : CHashTableIncrementStatistic(table, CHS_Delete); 0.00 : 782ea4: 48 83 43 68 01 addq $0x1,0x68(%rbx) : if (!scan.found) 0.00 : 782ea9: 84 c0 test %al,%al 0.00 : 782eab: 75 05 jne 782eb2 : CHashTableIncrementStatistic(table, CHS_Delete_Failed); 0.00 : 782ead: 48 83 43 70 01 addq $0x1,0x70(%rbx) : return scan.found; : } 0.00 : 782eb2: 48 83 c4 58 add $0x58,%rsp 0.00 : 782eb6: 5b pop %rbx 0.00 : 782eb7: 41 5c pop %r12 0.00 : 782eb9: 41 5d pop %r13 0.00 : 782ebb: 41 5e pop %r14 0.00 : 782ebd: 41 5f pop %r15 0.00 : 782ebf: c9 leaveq 0.00 : 782ec0: c3 retq 0.00 : 782ec1: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : CHashTableIncrementStatistic(table, CHS_Delete_Retry); : goto retry; : } : : /* Deletion is done; attempt to remove node from list. */ : if (__sync_bool_compare_and_swap(scan.pointer_to_target, 0.00 : 782ec8: 8b 55 b0 mov -0x50(%rbp),%edx 0.00 : 782ecb: 48 8b 75 b8 mov -0x48(%rbp),%rsi 0.00 : 782ecf: 8b 4d b4 mov -0x4c(%rbp),%ecx 0.00 : 782ed2: 89 d0 mov %edx,%eax 0.00 : 782ed4: f0 0f b1 0e lock cmpxchg %ecx,(%rsi) /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/chash.c:614 33.33 : 782ed8: 75 16 jne 782ef0 : scan.target, : scan.next)) : CHashAddToGarbage(table, bucket, scan.target); 0.00 : 782eda: 8b 55 b0 mov -0x50(%rbp),%edx 0.00 : 782edd: 8b 75 8c mov -0x74(%rbp),%esi 0.00 : 782ee0: 48 89 df mov %rbx,%rdi 0.00 : 782ee3: e8 68 fd ff ff callq 782c50 0.00 : 782ee8: eb 9f jmp 782e89 0.00 : 782eea: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : * like a regular bucket scan, except that we don't care : * about the results. We're just doing it to achieve the : * side-effect of removing delete-marked nodes from the : * bucket chain. : */ : CHashTableIncrementStatistic(table, CHS_Cleanup_Scan); 0.00 : 782ef0: 48 83 83 98 00 00 00 addq $0x1,0x98(%rbx) 0.00 : 782ef7: 01 : CHashBucketScan(table, b, hashcode, entry, &cleanup_scan); 0.00 : 782ef8: 4c 8d 45 90 lea -0x70(%rbp),%r8 0.00 : 782efc: 4c 89 f1 mov %r14,%rcx 0.00 : 782eff: 44 89 ea mov %r13d,%edx 0.00 : 782f02: 4c 89 e6 mov %r12,%rsi 0.00 : 782f05: 48 89 df mov %rbx,%rdi 0.00 : 782f08: e8 93 fd ff ff callq 782ca0 0.00 : 782f0d: e9 77 ff ff ff jmpq 782e89 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 33.33 /home/Computational/mark/src/postgres-andres/src/backend/utils/mmgr/aset.c:736 33.33 /home/Computational/mark/src/postgres-andres/src/backend/utils/mmgr/aset.c:740 33.33 /home/Computational/mark/src/postgres-andres/src/backend/utils/mmgr/aset.c:740 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000798110 : : * MAXALIGN_DOWN(SIZE_MAX) - ALLOC_BLOCKHDRSZ - ALLOC_CHUNKHDRSZ : * All callers use a much-lower limit. : */ : static void * : AllocSetAlloc(MemoryContext context, Size size) : { 0.00 : 798110: 55 push %rbp 0.00 : 798111: 48 89 e5 mov %rsp,%rbp 0.00 : 798114: 4c 89 65 e0 mov %r12,-0x20(%rbp) 0.00 : 798118: 4c 89 75 f0 mov %r14,-0x10(%rbp) 0.00 : 79811c: 49 89 fc mov %rdi,%r12 0.00 : 79811f: 48 89 5d d8 mov %rbx,-0x28(%rbp) 0.00 : 798123: 4c 89 6d e8 mov %r13,-0x18(%rbp) 0.00 : 798127: 49 89 f6 mov %rsi,%r14 0.00 : 79812a: 4c 89 7d f8 mov %r15,-0x8(%rbp) 0.00 : 79812e: 48 83 ec 30 sub $0x30,%rsp : : /* : * If requested size exceeds maximum for chunks, allocate an entire block : * for this request. : */ : if (size > set->allocChunkLimit) 0.00 : 798132: 48 39 b7 b0 00 00 00 cmp %rsi,0xb0(%rdi) 0.00 : 798139: 72 6d jb 7981a8 : { : int idx; : unsigned int t, : tsize; : : if (size > (1 << ALLOC_MINBITS)) 0.00 : 79813b: 31 f6 xor %esi,%esi 0.00 : 79813d: 49 83 fe 08 cmp $0x8,%r14 0.00 : 798141: 77 3d ja 798180 : * corresponding free list to see if there is a free chunk we could reuse. : * If one is found, remove it from the free list, make it again a member : * of the alloc set and return its data address. : */ : fidx = AllocSetFreeIndex(size); : chunk = set->freelist[fidx]; 0.00 : 798143: 48 63 c6 movslq %esi,%rax 0.00 : 798146: 48 8d 48 08 lea 0x8(%rax),%rcx 0.00 : 79814a: 49 8b 14 cc mov (%r12,%rcx,8),%rdx : if (chunk != NULL) /home/Computational/mark/src/postgres-andres/src/backend/utils/mmgr/aset.c:736 33.33 : 79814e: 48 85 d2 test %rdx,%rdx 0.00 : 798151: 0f 84 c9 00 00 00 je 798220 : { : Assert(chunk->size >= size); : : set->freelist[fidx] = (AllocChunk) chunk->aset; /home/Computational/mark/src/postgres-andres/src/backend/utils/mmgr/aset.c:740 33.33 : 798157: 48 8b 02 mov (%rdx),%rax 33.33 : 79815a: 49 89 04 cc mov %rax,(%r12,%rcx,8) : /* fill the allocated space with junk */ : randomize_mem((char *) AllocChunkGetPointer(chunk), size); : #endif : : AllocAllocInfo(set, chunk); : return AllocChunkGetPointer(chunk); 0.00 : 79815e: 48 8d 42 10 lea 0x10(%rdx),%rax : { : Assert(chunk->size >= size); : : set->freelist[fidx] = (AllocChunk) chunk->aset; : : chunk->aset = (void *) set; 0.00 : 798162: 4c 89 22 mov %r12,(%rdx) : randomize_mem((char *) AllocChunkGetPointer(chunk), size); : #endif : : AllocAllocInfo(set, chunk); : return AllocChunkGetPointer(chunk); : } 0.00 : 798165: 48 8b 5d d8 mov -0x28(%rbp),%rbx 0.00 : 798169: 4c 8b 65 e0 mov -0x20(%rbp),%r12 0.00 : 79816d: 4c 8b 6d e8 mov -0x18(%rbp),%r13 0.00 : 798171: 4c 8b 75 f0 mov -0x10(%rbp),%r14 0.00 : 798175: 4c 8b 7d f8 mov -0x8(%rbp),%r15 0.00 : 798179: c9 leaveq 0.00 : 79817a: c3 retq 0.00 : 79817b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : unsigned int t, : tsize; : : if (size > (1 << ALLOC_MINBITS)) : { : tsize = (size - 1) >> ALLOC_MINBITS; 0.00 : 798180: 49 8d 46 ff lea -0x1(%r14),%rax 0.00 : 798184: 48 89 c2 mov %rax,%rdx 0.00 : 798187: 48 c1 ea 03 shr $0x3,%rdx : * justify micro-optimization effort. The best approach seems to be : * to use a lookup table. Note that this code assumes that : * ALLOCSET_NUM_FREELISTS <= 17, since we only cope with two bytes of : * the tsize value. : */ : t = tsize >> 8; 0.00 : 79818b: 89 d0 mov %edx,%eax 0.00 : 79818d: c1 e8 08 shr $0x8,%eax : idx = t ? LogTable256[t] + 8 : LogTable256[tsize]; 0.00 : 798190: 85 c0 test %eax,%eax 0.00 : 798192: 74 7c je 798210 0.00 : 798194: 89 c0 mov %eax,%eax 0.00 : 798196: 0f b6 80 80 1e 8e 00 movzbl 0x8e1e80(%rax),%eax 0.00 : 79819d: 8d 70 08 lea 0x8(%rax),%esi 0.00 : 7981a0: eb a1 jmp 798143 0.00 : 7981a2: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : * If requested size exceeds maximum for chunks, allocate an entire block : * for this request. : */ : if (size > set->allocChunkLimit) : { : chunk_size = MAXALIGN(size); 0.00 : 7981a8: 48 8d 5e 07 lea 0x7(%rsi),%rbx 0.00 : 7981ac: 48 83 e3 f8 and $0xfffffffffffffff8,%rbx : blksize = chunk_size + ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ; 0.00 : 7981b0: 4c 8d 6b 30 lea 0x30(%rbx),%r13 : block = (AllocBlock) malloc(blksize); 0.00 : 7981b4: 4c 89 ef mov %r13,%rdi 0.00 : 7981b7: e8 74 14 cd ff callq 469630 : if (block == NULL) 0.00 : 7981bc: 48 85 c0 test %rax,%rax : */ : if (size > set->allocChunkLimit) : { : chunk_size = MAXALIGN(size); : blksize = chunk_size + ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ; : block = (AllocBlock) malloc(blksize); 0.00 : 7981bf: 48 89 c2 mov %rax,%rdx : if (block == NULL) 0.00 : 7981c2: 0f 84 2e 02 00 00 je 7983f6 : ereport(ERROR, : (errcode(ERRCODE_OUT_OF_MEMORY), : errmsg("out of memory"), : errdetail("Failed on request of size %zu.", size))); : } : block->aset = set; 0.00 : 7981c8: 4c 89 20 mov %r12,(%rax) : block->freeptr = block->endptr = ((char *) block) + blksize; : : chunk = (AllocChunk) (((char *) block) + ALLOC_BLOCKHDRSZ); 0.00 : 7981cb: 48 8d 72 20 lea 0x20(%rdx),%rsi : (errcode(ERRCODE_OUT_OF_MEMORY), : errmsg("out of memory"), : errdetail("Failed on request of size %zu.", size))); : } : block->aset = set; : block->freeptr = block->endptr = ((char *) block) + blksize; 0.00 : 7981cf: 4a 8d 04 28 lea (%rax,%r13,1),%rax : : chunk = (AllocChunk) (((char *) block) + ALLOC_BLOCKHDRSZ); : chunk->aset = set; 0.00 : 7981d3: 4c 89 62 20 mov %r12,0x20(%rdx) : (errcode(ERRCODE_OUT_OF_MEMORY), : errmsg("out of memory"), : errdetail("Failed on request of size %zu.", size))); : } : block->aset = set; : block->freeptr = block->endptr = ((char *) block) + blksize; 0.00 : 7981d7: 48 89 42 18 mov %rax,0x18(%rdx) 0.00 : 7981db: 48 89 42 10 mov %rax,0x10(%rdx) : : chunk = (AllocChunk) (((char *) block) + ALLOC_BLOCKHDRSZ); : chunk->aset = set; : chunk->size = chunk_size; 0.00 : 7981df: 48 89 5e 08 mov %rbx,0x8(%rsi) : : /* : * Stick the new block underneath the active allocation block, so that : * we don't lose the use of the space remaining therein. : */ : if (set->blocks != NULL) 0.00 : 7981e3: 49 8b 4c 24 38 mov 0x38(%r12),%rcx 0.00 : 7981e8: 48 85 c9 test %rcx,%rcx 0.00 : 7981eb: 0f 84 cf 01 00 00 je 7983c0 : { : block->next = set->blocks->next; 0.00 : 7981f1: 48 8b 41 08 mov 0x8(%rcx),%rax 0.00 : 7981f5: 48 89 42 08 mov %rax,0x8(%rdx) : set->blocks->next = block; 0.00 : 7981f9: 48 89 51 08 mov %rdx,0x8(%rcx) : * if any, NOACCESS. : */ : VALGRIND_MAKE_MEM_NOACCESS((char *) chunk + ALLOC_CHUNK_PUBLIC, : chunk_size + ALLOC_CHUNKHDRSZ - ALLOC_CHUNK_PUBLIC); : : return AllocChunkGetPointer(chunk); 0.00 : 7981fd: 48 8d 46 10 lea 0x10(%rsi),%rax : randomize_mem((char *) AllocChunkGetPointer(chunk), size); : #endif : : AllocAllocInfo(set, chunk); : return AllocChunkGetPointer(chunk); : } 0.00 : 798201: e9 5f ff ff ff jmpq 798165 0.00 : 798206: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 0.00 : 79820d: 00 00 00 : * to use a lookup table. Note that this code assumes that : * ALLOCSET_NUM_FREELISTS <= 17, since we only cope with two bytes of : * the tsize value. : */ : t = tsize >> 8; : idx = t ? LogTable256[t] + 8 : LogTable256[tsize]; 0.00 : 798210: 89 d0 mov %edx,%eax 0.00 : 798212: 0f b6 b0 80 1e 8e 00 movzbl 0x8e1e80(%rax),%esi 0.00 : 798219: e9 25 ff ff ff jmpq 798143 0.00 : 79821e: 66 90 xchg %ax,%ax : : /* : * If there is enough room in the active allocation block, we will put the : * chunk into that block. Else must start a new one. : */ : if ((block = set->blocks) != NULL) 0.00 : 798220: 4d 8b 4c 24 38 mov 0x38(%r12),%r9 : } : : /* : * Choose the actual chunk size to allocate. : */ : chunk_size = (1 << ALLOC_MINBITS) << fidx; 0.00 : 798225: b8 08 00 00 00 mov $0x8,%eax 0.00 : 79822a: 89 f1 mov %esi,%ecx 0.00 : 79822c: d3 e0 shl %cl,%eax 0.00 : 79822e: 4c 63 f8 movslq %eax,%r15 : : /* : * If there is enough room in the active allocation block, we will put the : * chunk into that block. Else must start a new one. : */ : if ((block = set->blocks) != NULL) 0.00 : 798231: 4d 85 c9 test %r9,%r9 0.00 : 798234: 0f 84 ce 00 00 00 je 798308 : { : Size availspace = block->endptr - block->freeptr; 0.00 : 79823a: 49 8b 79 10 mov 0x10(%r9),%rdi 0.00 : 79823e: 4d 8b 41 18 mov 0x18(%r9),%r8 : : if (availspace < (chunk_size + ALLOC_CHUNKHDRSZ)) 0.00 : 798242: 49 8d 47 10 lea 0x10(%r15),%rax : * If there is enough room in the active allocation block, we will put the : * chunk into that block. Else must start a new one. : */ : if ((block = set->blocks) != NULL) : { : Size availspace = block->endptr - block->freeptr; 0.00 : 798246: 49 29 f8 sub %rdi,%r8 : : if (availspace < (chunk_size + ALLOC_CHUNKHDRSZ)) 0.00 : 798249: 49 39 c0 cmp %rax,%r8 0.00 : 79824c: 0f 83 52 01 00 00 jae 7983a4 : * : * Because we can only get here when there's less than : * ALLOC_CHUNK_LIMIT left in the block, this loop cannot iterate : * more than ALLOCSET_NUM_FREELISTS-1 times. : */ : while (availspace >= ((1 << ALLOC_MINBITS) + ALLOC_CHUNKHDRSZ)) 0.00 : 798252: 49 83 f8 17 cmp $0x17,%r8 0.00 : 798256: 0f 86 ac 00 00 00 jbe 798308 : * to use a lookup table. Note that this code assumes that : * ALLOCSET_NUM_FREELISTS <= 17, since we only cope with two bytes of : * the tsize value. : */ : t = tsize >> 8; : idx = t ? LogTable256[t] + 8 : LogTable256[tsize]; 0.00 : 79825c: 41 ba 01 00 00 00 mov $0x1,%r10d : : /* Prepare to initialize the chunk header. */ : VALGRIND_MAKE_MEM_UNDEFINED(chunk, ALLOC_CHUNK_USED); : : block->freeptr += (availchunk + ALLOC_CHUNKHDRSZ); : availspace -= (availchunk + ALLOC_CHUNKHDRSZ); 0.00 : 798262: 49 c7 c3 f0 ff ff ff mov $0xfffffffffffffff0,%r11 0.00 : 798269: eb 5d jmp 7982c8 0.00 : 79826b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : * to use a lookup table. Note that this code assumes that : * ALLOCSET_NUM_FREELISTS <= 17, since we only cope with two bytes of : * the tsize value. : */ : t = tsize >> 8; : idx = t ? LogTable256[t] + 8 : LogTable256[tsize]; 0.00 : 798270: 89 c0 mov %eax,%eax 0.00 : 798272: 0f b6 88 80 1e 8e 00 movzbl 0x8e1e80(%rax),%ecx 0.00 : 798279: 4c 89 d0 mov %r10,%rax 0.00 : 79827c: 8d 51 08 lea 0x8(%rcx),%edx 0.00 : 79827f: 83 c1 0b add $0xb,%ecx 0.00 : 798282: 48 d3 e0 shl %cl,%rax : /* : * In most cases, we'll get back the index of the next larger : * freelist than the one we need to put this chunk on. The : * exception is when availchunk is exactly a power of 2. : */ : if (availchunk != ((Size) 1 << (a_fidx + ALLOC_MINBITS))) 0.00 : 798285: 48 39 c6 cmp %rax,%rsi 0.00 : 798288: 74 0c je 798296 : { : a_fidx--; 0.00 : 79828a: 83 ea 01 sub $0x1,%edx : Assert(a_fidx >= 0); : availchunk = ((Size) 1 << (a_fidx + ALLOC_MINBITS)); 0.00 : 79828d: 4c 89 d6 mov %r10,%rsi 0.00 : 798290: 8d 4a 03 lea 0x3(%rdx),%ecx 0.00 : 798293: 48 d3 e6 shl %cl,%rsi : chunk = (AllocChunk) (block->freeptr); : : /* Prepare to initialize the chunk header. */ : VALGRIND_MAKE_MEM_UNDEFINED(chunk, ALLOC_CHUNK_USED); : : block->freeptr += (availchunk + ALLOC_CHUNKHDRSZ); 0.00 : 798296: 48 8d 44 37 10 lea 0x10(%rdi,%rsi,1),%rax 0.00 : 79829b: 49 89 41 10 mov %rax,0x10(%r9) : availspace -= (availchunk + ALLOC_CHUNKHDRSZ); 0.00 : 79829f: 4c 89 d8 mov %r11,%rax : : chunk->size = availchunk; 0.00 : 7982a2: 48 89 77 08 mov %rsi,0x8(%rdi) : : /* Prepare to initialize the chunk header. */ : VALGRIND_MAKE_MEM_UNDEFINED(chunk, ALLOC_CHUNK_USED); : : block->freeptr += (availchunk + ALLOC_CHUNKHDRSZ); : availspace -= (availchunk + ALLOC_CHUNKHDRSZ); 0.00 : 7982a6: 48 29 f0 sub %rsi,%rax 0.00 : 7982a9: 49 01 c0 add %rax,%r8 : : chunk->size = availchunk; : #ifdef MEMORY_CONTEXT_CHECKING : chunk->requested_size = 0; /* mark it free */ : #endif : chunk->aset = (void *) set->freelist[a_fidx]; 0.00 : 7982ac: 48 63 c2 movslq %edx,%rax 0.00 : 7982af: 48 83 c0 08 add $0x8,%rax : * : * Because we can only get here when there's less than : * ALLOC_CHUNK_LIMIT left in the block, this loop cannot iterate : * more than ALLOCSET_NUM_FREELISTS-1 times. : */ : while (availspace >= ((1 << ALLOC_MINBITS) + ALLOC_CHUNKHDRSZ)) 0.00 : 7982b3: 49 83 f8 17 cmp $0x17,%r8 : : chunk->size = availchunk; : #ifdef MEMORY_CONTEXT_CHECKING : chunk->requested_size = 0; /* mark it free */ : #endif : chunk->aset = (void *) set->freelist[a_fidx]; 0.00 : 7982b7: 49 8b 14 c4 mov (%r12,%rax,8),%rdx 0.00 : 7982bb: 48 89 17 mov %rdx,(%rdi) : set->freelist[a_fidx] = chunk; 0.00 : 7982be: 49 89 3c c4 mov %rdi,(%r12,%rax,8) : * : * Because we can only get here when there's less than : * ALLOC_CHUNK_LIMIT left in the block, this loop cannot iterate : * more than ALLOCSET_NUM_FREELISTS-1 times. : */ : while (availspace >= ((1 << ALLOC_MINBITS) + ALLOC_CHUNKHDRSZ)) 0.00 : 7982c2: 76 44 jbe 798308 0.00 : 7982c4: 49 8b 79 10 mov 0x10(%r9),%rdi : { : Size availchunk = availspace - ALLOC_CHUNKHDRSZ; 0.00 : 7982c8: 49 8d 70 f0 lea -0x10(%r8),%rsi : { : int idx; : unsigned int t, : tsize; : : if (size > (1 << ALLOC_MINBITS)) 0.00 : 7982cc: 31 d2 xor %edx,%edx 0.00 : 7982ce: b8 08 00 00 00 mov $0x8,%eax 0.00 : 7982d3: 48 83 fe 08 cmp $0x8,%rsi 0.00 : 7982d7: 76 ac jbe 798285 : { : tsize = (size - 1) >> ALLOC_MINBITS; 0.00 : 7982d9: 49 8d 40 ef lea -0x11(%r8),%rax 0.00 : 7982dd: 48 89 c2 mov %rax,%rdx 0.00 : 7982e0: 48 c1 ea 03 shr $0x3,%rdx : * justify micro-optimization effort. The best approach seems to be : * to use a lookup table. Note that this code assumes that : * ALLOCSET_NUM_FREELISTS <= 17, since we only cope with two bytes of : * the tsize value. : */ : t = tsize >> 8; 0.00 : 7982e4: 89 d0 mov %edx,%eax 0.00 : 7982e6: c1 e8 08 shr $0x8,%eax : idx = t ? LogTable256[t] + 8 : LogTable256[tsize]; 0.00 : 7982e9: 85 c0 test %eax,%eax 0.00 : 7982eb: 75 83 jne 798270 0.00 : 7982ed: 89 d0 mov %edx,%eax 0.00 : 7982ef: 0f b6 90 80 1e 8e 00 movzbl 0x8e1e80(%rax),%edx 0.00 : 7982f6: 4c 89 d0 mov %r10,%rax 0.00 : 7982f9: 8d 4a 03 lea 0x3(%rdx),%ecx 0.00 : 7982fc: 48 d3 e0 shl %cl,%rax 0.00 : 7982ff: eb 84 jmp 798285 0.00 : 798301: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : : /* : * The first such block has size initBlockSize, and we double the : * space in each succeeding block, but not more than maxBlockSize. : */ : blksize = set->nextBlockSize; 0.00 : 798308: 49 8b 94 24 a8 00 00 mov 0xa8(%r12),%rdx 0.00 : 79830f: 00 : set->nextBlockSize <<= 1; : if (set->nextBlockSize > set->maxBlockSize) 0.00 : 798310: 49 8b 8c 24 a0 00 00 mov 0xa0(%r12),%rcx 0.00 : 798317: 00 : /* : * The first such block has size initBlockSize, and we double the : * space in each succeeding block, but not more than maxBlockSize. : */ : blksize = set->nextBlockSize; : set->nextBlockSize <<= 1; 0.00 : 798318: 48 8d 04 12 lea (%rdx,%rdx,1),%rax : if (set->nextBlockSize > set->maxBlockSize) 0.00 : 79831c: 48 39 c8 cmp %rcx,%rax : /* : * The first such block has size initBlockSize, and we double the : * space in each succeeding block, but not more than maxBlockSize. : */ : blksize = set->nextBlockSize; : set->nextBlockSize <<= 1; 0.00 : 79831f: 49 89 84 24 a8 00 00 mov %rax,0xa8(%r12) 0.00 : 798326: 00 : if (set->nextBlockSize > set->maxBlockSize) 0.00 : 798327: 76 08 jbe 798331 : set->nextBlockSize = set->maxBlockSize; 0.00 : 798329: 49 89 8c 24 a8 00 00 mov %rcx,0xa8(%r12) 0.00 : 798330: 00 : : /* : * If initBlockSize is less than ALLOC_CHUNK_LIMIT, we could need more : * space... but try to keep it a power of 2. : */ : required_size = chunk_size + ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ; 0.00 : 798331: 4d 8d 6f 30 lea 0x30(%r15),%r13 : while (blksize < required_size) 0.00 : 798335: 4c 39 ea cmp %r13,%rdx 0.00 : 798338: 73 0e jae 798348 0.00 : 79833a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : blksize <<= 1; 0.00 : 798340: 48 01 d2 add %rdx,%rdx : /* : * If initBlockSize is less than ALLOC_CHUNK_LIMIT, we could need more : * space... but try to keep it a power of 2. : */ : required_size = chunk_size + ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ; : while (blksize < required_size) 0.00 : 798343: 49 39 d5 cmp %rdx,%r13 0.00 : 798346: 77 f8 ja 798340 0.00 : 798348: 48 89 d3 mov %rdx,%rbx 0.00 : 79834b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : while (block == NULL && blksize > 1024 * 1024) : { : blksize >>= 1; : if (blksize < required_size) : break; : block = (AllocBlock) malloc(blksize); 0.00 : 798350: 48 89 df mov %rbx,%rdi 0.00 : 798353: e8 d8 12 cd ff callq 469630 : : /* : * We could be asking for pretty big blocks here, so cope if malloc : * fails. But give up if there's less than a meg or so available... : */ : while (block == NULL && blksize > 1024 * 1024) 0.00 : 798358: 48 85 c0 test %rax,%rax : { : blksize >>= 1; : if (blksize < required_size) : break; : block = (AllocBlock) malloc(blksize); 0.00 : 79835b: 48 89 c2 mov %rax,%rdx : : /* : * We could be asking for pretty big blocks here, so cope if malloc : * fails. But give up if there's less than a meg or so available... : */ : while (block == NULL && blksize > 1024 * 1024) 0.00 : 79835e: 74 78 je 7983d8 : if (blksize < required_size) : break; : block = (AllocBlock) malloc(blksize); : } : : if (block == NULL) 0.00 : 798360: 48 85 d2 test %rdx,%rdx : : /* : * We could be asking for pretty big blocks here, so cope if malloc : * fails. But give up if there's less than a meg or so available... : */ : while (block == NULL && blksize > 1024 * 1024) 0.00 : 798363: 49 89 d1 mov %rdx,%r9 : if (blksize < required_size) : break; : block = (AllocBlock) malloc(blksize); : } : : if (block == NULL) 0.00 : 798366: 0f 84 10 01 00 00 je 79847c : errmsg("out of memory"), : errdetail("Failed on request of size %zu.", size))); : } : : block->aset = set; : block->freeptr = ((char *) block) + ALLOC_BLOCKHDRSZ; 0.00 : 79836c: 48 8d 42 20 lea 0x20(%rdx),%rax : (errcode(ERRCODE_OUT_OF_MEMORY), : errmsg("out of memory"), : errdetail("Failed on request of size %zu.", size))); : } : : block->aset = set; 0.00 : 798370: 4c 89 22 mov %r12,(%rdx) : block->freeptr = ((char *) block) + ALLOC_BLOCKHDRSZ; 0.00 : 798373: 48 89 42 10 mov %rax,0x10(%rdx) : block->endptr = ((char *) block) + blksize; 0.00 : 798377: 48 8d 04 1a lea (%rdx,%rbx,1),%rax 0.00 : 79837b: 48 89 42 18 mov %rax,0x18(%rdx) : * cycling even for contexts created with minContextSize = 0; that way : * we don't have to force space to be allocated in contexts that might : * never need any space. Don't mark an oversize block as a keeper, : * however. : */ : if (set->keeper == NULL && blksize == set->initBlockSize) 0.00 : 79837f: 49 83 bc 24 b8 00 00 cmpq $0x0,0xb8(%r12) 0.00 : 798386: 00 00 0.00 : 798388: 0f 84 99 00 00 00 je 798427 : : /* Mark unallocated space NOACCESS. */ : VALGRIND_MAKE_MEM_NOACCESS(block->freeptr, : blksize - ALLOC_BLOCKHDRSZ); : : block->next = set->blocks; 0.00 : 79838e: 49 8b 44 24 38 mov 0x38(%r12),%rax 0.00 : 798393: 48 89 42 08 mov %rax,0x8(%rdx) : set->blocks = block; 0.00 : 798397: 49 89 54 24 38 mov %rdx,0x38(%r12) 0.00 : 79839c: 49 8d 47 10 lea 0x10(%r15),%rax 0.00 : 7983a0: 48 8b 7a 10 mov 0x10(%rdx),%rdi : chunk = (AllocChunk) (block->freeptr); : : /* Prepare to initialize the chunk header. */ : VALGRIND_MAKE_MEM_UNDEFINED(chunk, ALLOC_CHUNK_USED); : : block->freeptr += (chunk_size + ALLOC_CHUNKHDRSZ); 0.00 : 7983a4: 48 8d 04 07 lea (%rdi,%rax,1),%rax 0.00 : 7983a8: 49 89 41 10 mov %rax,0x10(%r9) : Assert(block->freeptr <= block->endptr); : : chunk->aset = (void *) set; 0.00 : 7983ac: 4c 89 27 mov %r12,(%rdi) : /* fill the allocated space with junk */ : randomize_mem((char *) AllocChunkGetPointer(chunk), size); : #endif : : AllocAllocInfo(set, chunk); : return AllocChunkGetPointer(chunk); 0.00 : 7983af: 48 8d 47 10 lea 0x10(%rdi),%rax : : block->freeptr += (chunk_size + ALLOC_CHUNKHDRSZ); : Assert(block->freeptr <= block->endptr); : : chunk->aset = (void *) set; : chunk->size = chunk_size; 0.00 : 7983b3: 4c 89 7f 08 mov %r15,0x8(%rdi) : randomize_mem((char *) AllocChunkGetPointer(chunk), size); : #endif : : AllocAllocInfo(set, chunk); : return AllocChunkGetPointer(chunk); : } 0.00 : 7983b7: e9 a9 fd ff ff jmpq 798165 0.00 : 7983bc: 0f 1f 40 00 nopl 0x0(%rax) : block->next = set->blocks->next; : set->blocks->next = block; : } : else : { : block->next = NULL; 0.00 : 7983c0: 48 c7 42 08 00 00 00 movq $0x0,0x8(%rdx) 0.00 : 7983c7: 00 : set->blocks = block; 0.00 : 7983c8: 49 89 54 24 38 mov %rdx,0x38(%r12) 0.00 : 7983cd: e9 2b fe ff ff jmpq 7981fd 0.00 : 7983d2: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : : /* : * We could be asking for pretty big blocks here, so cope if malloc : * fails. But give up if there's less than a meg or so available... : */ : while (block == NULL && blksize > 1024 * 1024) 0.00 : 7983d8: 48 81 fb 00 00 10 00 cmp $0x100000,%rbx 0.00 : 7983df: 0f 86 7b ff ff ff jbe 798360 : { : blksize >>= 1; 0.00 : 7983e5: 48 d1 eb shr %rbx : if (blksize < required_size) 0.00 : 7983e8: 49 39 dd cmp %rbx,%r13 0.00 : 7983eb: 0f 86 5f ff ff ff jbe 798350 0.00 : 7983f1: e9 6a ff ff ff jmpq 798360 : chunk_size = MAXALIGN(size); : blksize = chunk_size + ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ; : block = (AllocBlock) malloc(blksize); : if (block == NULL) : { : MemoryContextStats(TopMemoryContext); 0.00 : 7983f6: 48 8b 3d 6b 24 42 00 mov 0x42246b(%rip),%rdi # bba868 0.00 : 7983fd: e8 3e 07 00 00 callq 798b40 : ereport(ERROR, 0.00 : 798402: 45 31 c0 xor %r8d,%r8d 0.00 : 798405: b9 80 1f 8e 00 mov $0x8e1f80,%ecx 0.00 : 79840a: ba a7 02 00 00 mov $0x2a7,%edx : } : : if (block == NULL) : { : MemoryContextStats(TopMemoryContext); : ereport(ERROR, 0.00 : 79840f: be 6d 1d 8e 00 mov $0x8e1d6d,%esi 0.00 : 798414: bf 14 00 00 00 mov $0x14,%edi 0.00 : 798419: e8 a2 26 fe ff callq 77aac0 0.00 : 79841e: 84 c0 test %al,%al 0.00 : 798420: 75 20 jne 798442 0.00 : 798422: e8 a9 10 cd ff callq 4694d0 : * cycling even for contexts created with minContextSize = 0; that way : * we don't have to force space to be allocated in contexts that might : * never need any space. Don't mark an oversize block as a keeper, : * however. : */ : if (set->keeper == NULL && blksize == set->initBlockSize) 0.00 : 798427: 49 39 9c 24 98 00 00 cmp %rbx,0x98(%r12) 0.00 : 79842e: 00 0.00 : 79842f: 0f 85 59 ff ff ff jne 79838e : set->keeper = block; 0.00 : 798435: 49 89 94 24 b8 00 00 mov %rdx,0xb8(%r12) 0.00 : 79843c: 00 0.00 : 79843d: e9 4c ff ff ff jmpq 79838e : } : : if (block == NULL) : { : MemoryContextStats(TopMemoryContext); : ereport(ERROR, 0.00 : 798442: 4c 89 f6 mov %r14,%rsi 0.00 : 798445: bf a8 1d 8e 00 mov $0x8e1da8,%edi 0.00 : 79844a: 31 c0 xor %eax,%eax 0.00 : 79844c: e8 df 40 fe ff callq 77c530 0.00 : 798451: bf 04 9c 7b 00 mov $0x7b9c04,%edi 0.00 : 798456: 41 89 c4 mov %eax,%r12d 0.00 : 798459: 31 c0 xor %eax,%eax 0.00 : 79845b: e8 40 44 fe ff callq 77c8a0 0.00 : 798460: bf c5 20 00 00 mov $0x20c5,%edi 0.00 : 798465: 89 c3 mov %eax,%ebx 0.00 : 798467: e8 e4 48 fe ff callq 77cd50 0.00 : 79846c: 44 89 e2 mov %r12d,%edx 0.00 : 79846f: 89 c7 mov %eax,%edi 0.00 : 798471: 89 de mov %ebx,%esi 0.00 : 798473: 31 c0 xor %eax,%eax 0.00 : 798475: e8 66 21 fe ff callq 77a5e0 0.00 : 79847a: eb a6 jmp 798422 : block = (AllocBlock) malloc(blksize); : } : : if (block == NULL) : { : MemoryContextStats(TopMemoryContext); 0.00 : 79847c: 48 8b 3d e5 23 42 00 mov 0x4223e5(%rip),%rdi # bba868 0.00 : 798483: e8 b8 06 00 00 callq 798b40 : ereport(ERROR, 0.00 : 798488: 45 31 c0 xor %r8d,%r8d 0.00 : 79848b: b9 80 1f 8e 00 mov $0x8e1f80,%ecx 0.00 : 798490: ba 69 03 00 00 mov $0x369,%edx 0.00 : 798495: e9 75 ff ff ff jmpq 79840f Sorted summary for file /lib64/libc-2.11.3.so ---------------------------------------------- 33.33 ??:0 33.33 ??:0 33.33 ??:0 Percent | Source code & Disassembly of /lib64/libc-2.11.3.so ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000099390 <__gettimeofday>: 0.00 : 99390: 48 83 ec 08 sub $0x8,%rsp 0.00 : 99394: 48 8b 05 ad de 2d 00 mov 0x2ddead(%rip),%rax # 377248 <__vdso_gettimeofday> 33.33 : 9939b: 48 c1 c8 11 ror $0x11,%rax 33.33 : 9939f: 64 48 33 04 25 30 00 xor %fs:0x30,%rax 0.00 : 993a6: 00 00 33.33 : 993a8: ff d0 callq *%rax 0.00 : 993aa: 3d 01 f0 ff ff cmp $0xfffff001,%eax 0.00 : 993af: 73 05 jae 993b6 <__gettimeofday+0x26> 0.00 : 993b1: 48 83 c4 08 add $0x8,%rsp 0.00 : 993b5: c3 retq 0.00 : 993b6: 48 8b 0d 7b 8a 2d 00 mov 0x2d8a7b(%rip),%rcx # 371e38 <_DYNAMIC+0x2d8> 0.00 : 993bd: 31 d2 xor %edx,%edx 0.00 : 993bf: 48 29 c2 sub %rax,%rdx 0.00 : 993c2: 64 89 11 mov %edx,%fs:(%rcx) 0.00 : 993c5: 48 83 c8 ff or $0xffffffffffffffff,%rax 0.00 : 993c9: eb e6 jmp 993b1 <__gettimeofday+0x21> Sorted summary for file /lib64/libc-2.11.3.so ---------------------------------------------- 66.67 ??:0 33.33 ??:0 Percent | Source code & Disassembly of /lib64/libc-2.11.3.so ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000122bb0 <__memmove_ssse3>: 0.00 : 122bb0: 48 89 f8 mov %rdi,%rax 0.00 : 122bb3: 48 39 f7 cmp %rsi,%rdi 0.00 : 122bb6: 72 0e jb 122bc6 <__memmove_ssse3+0x16> 0.00 : 122bb8: 0f 84 7a 1a 00 00 je 124638 <__memmove_ssse3+0x1a88> 0.00 : 122bbe: 48 83 fa 4f cmp $0x4f,%rdx 0.00 : 122bc2: 76 02 jbe 122bc6 <__memmove_ssse3+0x16> 0.00 : 122bc4: eb 7a jmp 122c40 <__memmove_ssse3+0x90> 0.00 : 122bc6: 48 83 fa 4f cmp $0x4f,%rdx 0.00 : 122bca: 4c 8d 1d cf 16 02 00 lea 0x216cf(%rip),%r11 # 1442a0 0.00 : 122bd1: 77 1d ja 122bf0 <__memmove_ssse3+0x40> 0.00 : 122bd3: 4d 63 0c 93 movslq (%r11,%rdx,4),%r9 0.00 : 122bd7: 48 01 d6 add %rdx,%rsi 0.00 : 122bda: 48 01 d7 add %rdx,%rdi 0.00 : 122bdd: 4d 01 d9 add %r11,%r9 0.00 : 122be0: 41 ff e1 jmpq *%r9 0.00 : 122be3: 0f 0b ud2 0.00 : 122be5: 66 66 2e 0f 1f 84 00 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 122bec: 00 00 00 00 0.00 : 122bf0: f3 0f 6f 06 movdqu (%rsi),%xmm0 0.00 : 122bf4: 48 89 f9 mov %rdi,%rcx 0.00 : 122bf7: 48 83 e7 f0 and $0xfffffffffffffff0,%rdi 0.00 : 122bfb: 48 83 c7 10 add $0x10,%rdi 0.00 : 122bff: 49 89 c8 mov %rcx,%r8 0.00 : 122c02: 48 29 f9 sub %rdi,%rcx 0.00 : 122c05: 48 01 ca add %rcx,%rdx 0.00 : 122c08: 48 29 ce sub %rcx,%rsi 0.00 : 122c0b: 48 8b 0d 1e f5 24 00 mov 0x24f51e(%rip),%rcx # 372130 <__x86_64_shared_cache_size_half> 0.00 : 122c12: 48 39 ca cmp %rcx,%rdx 0.00 : 122c15: 49 89 f1 mov %rsi,%r9 0.00 : 122c18: 0f 87 92 27 00 00 ja 1253b0 <__memmove_ssse3+0x2800> 0.00 : 122c1e: 49 83 e1 0f and $0xf,%r9 0.00 : 122c22: 74 7c je 122ca0 <__memmove_ssse3+0xf0> 0.00 : 122c24: 48 8b 0d e5 f4 24 00 mov 0x24f4e5(%rip),%rcx # 372110 <__x86_64_data_cache_size_half> 0.00 : 122c2b: 4c 8d 1d ae 17 02 00 lea 0x217ae(%rip),%r11 # 1443e0 0.00 : 122c32: 4f 63 0c 8b movslq (%r11,%r9,4),%r9 0.00 : 122c36: 4f 8d 0c 0b lea (%r11,%r9,1),%r9 0.00 : 122c3a: 41 ff e1 jmpq *%r9 0.00 : 122c3d: 0f 0b ud2 0.00 : 122c3f: 90 nop 0.00 : 122c40: f3 0f 6f 44 16 f0 movdqu -0x10(%rsi,%rdx,1),%xmm0 0.00 : 122c46: 48 01 d6 add %rdx,%rsi 0.00 : 122c49: 4c 8d 44 17 f0 lea -0x10(%rdi,%rdx,1),%r8 0.00 : 122c4e: 48 01 d7 add %rdx,%rdi 0.00 : 122c51: 48 89 f9 mov %rdi,%rcx 0.00 : 122c54: 48 83 e1 0f and $0xf,%rcx 0.00 : 122c58: 48 31 cf xor %rcx,%rdi 0.00 : 122c5b: 48 29 ca sub %rcx,%rdx 0.00 : 122c5e: 48 29 ce sub %rcx,%rsi 0.00 : 122c61: 48 8b 0d c8 f4 24 00 mov 0x24f4c8(%rip),%rcx # 372130 <__x86_64_shared_cache_size_half> 0.00 : 122c68: 48 39 ca cmp %rcx,%rdx 0.00 : 122c6b: 49 89 f1 mov %rsi,%r9 0.00 : 122c6e: 0f 87 fc 28 00 00 ja 125570 <__memmove_ssse3+0x29c0> 0.00 : 122c74: 49 83 e1 0f and $0xf,%r9 0.00 : 122c78: 0f 84 42 02 00 00 je 122ec0 <__memmove_ssse3+0x310> 0.00 : 122c7e: 48 8b 0d 8b f4 24 00 mov 0x24f48b(%rip),%rcx # 372110 <__x86_64_data_cache_size_half> 0.00 : 122c85: 4c 8d 1d 94 17 02 00 lea 0x21794(%rip),%r11 # 144420 0.00 : 122c8c: 4f 63 0c 8b movslq (%r11,%r9,4),%r9 0.00 : 122c90: 4f 8d 0c 0b lea (%r11,%r9,1),%r9 0.00 : 122c94: 41 ff e1 jmpq *%r9 0.00 : 122c97: 0f 0b ud2 0.00 : 122c99: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 0.00 : 122ca0: 48 83 ea 10 sub $0x10,%rdx 0.00 : 122ca4: 66 0f 6f 0e movdqa (%rsi),%xmm1 0.00 : 122ca8: 48 83 c6 10 add $0x10,%rsi 0.00 : 122cac: 66 0f 7f 0f movdqa %xmm1,(%rdi) 0.00 : 122cb0: 48 83 c7 10 add $0x10,%rdi 0.00 : 122cb4: 48 81 fa 80 00 00 00 cmp $0x80,%rdx 0.00 : 122cbb: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 122cc0: 77 4e ja 122d10 <__memmove_ssse3+0x160> 0.00 : 122cc2: 48 83 fa 40 cmp $0x40,%rdx 0.00 : 122cc6: 72 2a jb 122cf2 <__memmove_ssse3+0x142> 0.00 : 122cc8: 0f 28 26 movaps (%rsi),%xmm4 0.00 : 122ccb: 0f 28 4e 10 movaps 0x10(%rsi),%xmm1 0.00 : 122ccf: 0f 28 56 20 movaps 0x20(%rsi),%xmm2 0.00 : 122cd3: 0f 28 5e 30 movaps 0x30(%rsi),%xmm3 0.00 : 122cd7: 0f 29 27 movaps %xmm4,(%rdi) 0.00 : 122cda: 0f 29 4f 10 movaps %xmm1,0x10(%rdi) 0.00 : 122cde: 0f 29 57 20 movaps %xmm2,0x20(%rdi) 0.00 : 122ce2: 0f 29 5f 30 movaps %xmm3,0x30(%rdi) 0.00 : 122ce6: 48 83 ea 40 sub $0x40,%rdx 0.00 : 122cea: 48 83 c6 40 add $0x40,%rsi 0.00 : 122cee: 48 83 c7 40 add $0x40,%rdi 0.00 : 122cf2: 48 01 d6 add %rdx,%rsi 0.00 : 122cf5: 48 01 d7 add %rdx,%rdi 0.00 : 122cf8: 4c 8d 1d a1 15 02 00 lea 0x215a1(%rip),%r11 # 1442a0 0.00 : 122cff: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 122d03: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 122d07: ff e2 jmpq *%rdx 0.00 : 122d09: 0f 0b ud2 0.00 : 122d0b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 122d10: 48 3b 15 f9 f3 24 00 cmp 0x24f3f9(%rip),%rdx # 372110 <__x86_64_data_cache_size_half> 0.00 : 122d17: 48 8d 52 80 lea -0x80(%rdx),%rdx 0.00 : 122d1b: 0f 83 af 00 00 00 jae 122dd0 <__memmove_ssse3+0x220> 0.00 : 122d21: 66 0f 6f 26 movdqa (%rsi),%xmm4 0.00 : 122d25: 0f 28 4e 10 movaps 0x10(%rsi),%xmm1 0.00 : 122d29: 0f 28 56 20 movaps 0x20(%rsi),%xmm2 0.00 : 122d2d: 0f 28 5e 30 movaps 0x30(%rsi),%xmm3 0.00 : 122d31: 66 0f 7f 27 movdqa %xmm4,(%rdi) 0.00 : 122d35: 0f 29 4f 10 movaps %xmm1,0x10(%rdi) 0.00 : 122d39: 0f 29 57 20 movaps %xmm2,0x20(%rdi) 0.00 : 122d3d: 0f 29 5f 30 movaps %xmm3,0x30(%rdi) 0.00 : 122d41: 48 81 ea 80 00 00 00 sub $0x80,%rdx 0.00 : 122d48: 0f 28 66 40 movaps 0x40(%rsi),%xmm4 0.00 : 122d4c: 0f 28 6e 50 movaps 0x50(%rsi),%xmm5 0.00 : 122d50: 0f 28 76 60 movaps 0x60(%rsi),%xmm6 0.00 : 122d54: 0f 28 7e 70 movaps 0x70(%rsi),%xmm7 0.00 : 122d58: 48 8d b6 80 00 00 00 lea 0x80(%rsi),%rsi 0.00 : 122d5f: 0f 29 67 40 movaps %xmm4,0x40(%rdi) 0.00 : 122d63: 0f 29 6f 50 movaps %xmm5,0x50(%rdi) 0.00 : 122d67: 0f 29 77 60 movaps %xmm6,0x60(%rdi) 0.00 : 122d6b: 0f 29 7f 70 movaps %xmm7,0x70(%rdi) 0.00 : 122d6f: 48 8d bf 80 00 00 00 lea 0x80(%rdi),%rdi 0.00 : 122d76: 73 a9 jae 122d21 <__memmove_ssse3+0x171> 0.00 : 122d78: 48 83 fa c0 cmp $0xffffffffffffffc0,%rdx 0.00 : 122d7c: 48 8d 92 80 00 00 00 lea 0x80(%rdx),%rdx 0.00 : 122d83: 7c 32 jl 122db7 <__memmove_ssse3+0x207> 0.00 : 122d85: 66 0f 6f 26 movdqa (%rsi),%xmm4 0.00 : 122d89: 48 83 ea 40 sub $0x40,%rdx 0.00 : 122d8d: 66 0f 6f 4e 10 movdqa 0x10(%rsi),%xmm1 0.00 : 122d92: 66 0f 7f 27 movdqa %xmm4,(%rdi) 0.00 : 122d96: 66 0f 7f 4f 10 movdqa %xmm1,0x10(%rdi) 0.00 : 122d9b: 66 0f 6f 66 20 movdqa 0x20(%rsi),%xmm4 0.00 : 122da0: 66 0f 6f 4e 30 movdqa 0x30(%rsi),%xmm1 0.00 : 122da5: 48 83 c6 40 add $0x40,%rsi 0.00 : 122da9: 66 0f 7f 67 20 movdqa %xmm4,0x20(%rdi) 0.00 : 122dae: 66 0f 7f 4f 30 movdqa %xmm1,0x30(%rdi) 0.00 : 122db3: 48 83 c7 40 add $0x40,%rdi 0.00 : 122db7: 48 01 d6 add %rdx,%rsi 0.00 : 122dba: 48 01 d7 add %rdx,%rdi 0.00 : 122dbd: 4c 8d 1d dc 14 02 00 lea 0x214dc(%rip),%r11 # 1442a0 0.00 : 122dc4: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 122dc8: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 122dcc: ff e2 jmpq *%rdx 0.00 : 122dce: 0f 0b ud2 0.00 : 122dd0: 0f 18 8e c0 01 00 00 prefetcht0 0x1c0(%rsi) 0.00 : 122dd7: 0f 18 8e 80 02 00 00 prefetcht0 0x280(%rsi) 0.00 : 122dde: 66 0f 6f 06 movdqa (%rsi),%xmm0 0.00 : 122de2: 66 0f 6f 4e 10 movdqa 0x10(%rsi),%xmm1 0.00 : 122de7: 66 0f 6f 56 20 movdqa 0x20(%rsi),%xmm2 0.00 : 122dec: 66 0f 6f 5e 30 movdqa 0x30(%rsi),%xmm3 0.00 : 122df1: 66 0f 6f 66 40 movdqa 0x40(%rsi),%xmm4 0.00 : 122df6: 66 0f 6f 6e 50 movdqa 0x50(%rsi),%xmm5 0.00 : 122dfb: 66 0f 6f 76 60 movdqa 0x60(%rsi),%xmm6 0.00 : 122e00: 66 0f 6f 7e 70 movdqa 0x70(%rsi),%xmm7 0.00 : 122e05: 48 8d b6 80 00 00 00 lea 0x80(%rsi),%rsi 0.00 : 122e0c: 48 81 ea 80 00 00 00 sub $0x80,%rdx 0.00 : 122e13: 66 0f 7f 07 movdqa %xmm0,(%rdi) 0.00 : 122e17: 66 0f 7f 4f 10 movdqa %xmm1,0x10(%rdi) 0.00 : 122e1c: 66 0f 7f 57 20 movdqa %xmm2,0x20(%rdi) 0.00 : 122e21: 66 0f 7f 5f 30 movdqa %xmm3,0x30(%rdi) 0.00 : 122e26: 66 0f 7f 67 40 movdqa %xmm4,0x40(%rdi) 0.00 : 122e2b: 66 0f 7f 6f 50 movdqa %xmm5,0x50(%rdi) 0.00 : 122e30: 66 0f 7f 77 60 movdqa %xmm6,0x60(%rdi) 0.00 : 122e35: 66 0f 7f 7f 70 movdqa %xmm7,0x70(%rdi) 0.00 : 122e3a: 48 8d bf 80 00 00 00 lea 0x80(%rdi),%rdi 0.00 : 122e41: 73 8d jae 122dd0 <__memmove_ssse3+0x220> 0.00 : 122e43: 48 83 fa c0 cmp $0xffffffffffffffc0,%rdx 0.00 : 122e47: 48 8d 92 80 00 00 00 lea 0x80(%rdx),%rdx 0.00 : 122e4e: 7c 32 jl 122e82 <__memmove_ssse3+0x2d2> 0.00 : 122e50: 66 0f 6f 06 movdqa (%rsi),%xmm0 0.00 : 122e54: 48 83 ea 40 sub $0x40,%rdx 0.00 : 122e58: 66 0f 6f 4e 10 movdqa 0x10(%rsi),%xmm1 0.00 : 122e5d: 66 0f 7f 07 movdqa %xmm0,(%rdi) 0.00 : 122e61: 66 0f 7f 4f 10 movdqa %xmm1,0x10(%rdi) 0.00 : 122e66: 66 0f 6f 46 20 movdqa 0x20(%rsi),%xmm0 0.00 : 122e6b: 66 0f 6f 4e 30 movdqa 0x30(%rsi),%xmm1 0.00 : 122e70: 48 83 c6 40 add $0x40,%rsi 0.00 : 122e74: 66 0f 7f 47 20 movdqa %xmm0,0x20(%rdi) 0.00 : 122e79: 66 0f 7f 4f 30 movdqa %xmm1,0x30(%rdi) 0.00 : 122e7e: 48 83 c7 40 add $0x40,%rdi 0.00 : 122e82: 48 83 fa 20 cmp $0x20,%rdx 0.00 : 122e86: 72 1e jb 122ea6 <__memmove_ssse3+0x2f6> 0.00 : 122e88: 66 0f 6f 06 movdqa (%rsi),%xmm0 0.00 : 122e8c: 48 83 ea 20 sub $0x20,%rdx 0.00 : 122e90: 66 0f 6f 4e 10 movdqa 0x10(%rsi),%xmm1 0.00 : 122e95: 48 83 c6 20 add $0x20,%rsi 0.00 : 122e99: 66 0f 7f 07 movdqa %xmm0,(%rdi) 0.00 : 122e9d: 66 0f 7f 4f 10 movdqa %xmm1,0x10(%rdi) 0.00 : 122ea2: 48 83 c7 20 add $0x20,%rdi 0.00 : 122ea6: 48 01 d7 add %rdx,%rdi 0.00 : 122ea9: 48 01 d6 add %rdx,%rsi 0.00 : 122eac: 4c 8d 1d ed 13 02 00 lea 0x213ed(%rip),%r11 # 1442a0 0.00 : 122eb3: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 122eb7: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 122ebb: ff e2 jmpq *%rdx 0.00 : 122ebd: 0f 0b ud2 0.00 : 122ebf: 90 nop 0.00 : 122ec0: 48 83 ea 10 sub $0x10,%rdx 0.00 : 122ec4: 66 0f 6f 4e f0 movdqa -0x10(%rsi),%xmm1 0.00 : 122ec9: 48 83 ee 10 sub $0x10,%rsi 0.00 : 122ecd: 66 0f 7f 4f f0 movdqa %xmm1,-0x10(%rdi) 0.00 : 122ed2: 48 83 ef 10 sub $0x10,%rdi 0.00 : 122ed6: 48 81 fa 80 00 00 00 cmp $0x80,%rdx 0.00 : 122edd: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 122ee2: 77 4c ja 122f30 <__memmove_ssse3+0x380> 0.00 : 122ee4: 48 83 fa 40 cmp $0x40,%rdx 0.00 : 122ee8: 72 2c jb 122f16 <__memmove_ssse3+0x366> 0.00 : 122eea: 0f 28 46 f0 movaps -0x10(%rsi),%xmm0 0.00 : 122eee: 0f 28 4e e0 movaps -0x20(%rsi),%xmm1 0.00 : 122ef2: 0f 28 56 d0 movaps -0x30(%rsi),%xmm2 0.00 : 122ef6: 0f 28 5e c0 movaps -0x40(%rsi),%xmm3 0.00 : 122efa: 0f 29 47 f0 movaps %xmm0,-0x10(%rdi) 0.00 : 122efe: 0f 29 4f e0 movaps %xmm1,-0x20(%rdi) 0.00 : 122f02: 0f 29 57 d0 movaps %xmm2,-0x30(%rdi) 0.00 : 122f06: 0f 29 5f c0 movaps %xmm3,-0x40(%rdi) 0.00 : 122f0a: 48 83 ea 40 sub $0x40,%rdx 0.00 : 122f0e: 48 83 ee 40 sub $0x40,%rsi 0.00 : 122f12: 48 83 ef 40 sub $0x40,%rdi 0.00 : 122f16: 4c 8d 1d 83 13 02 00 lea 0x21383(%rip),%r11 # 1442a0 0.00 : 122f1d: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 122f21: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 122f25: ff e2 jmpq *%rdx 0.00 : 122f27: 0f 0b ud2 0.00 : 122f29: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 0.00 : 122f30: 48 3b 15 d9 f1 24 00 cmp 0x24f1d9(%rip),%rdx # 372110 <__x86_64_data_cache_size_half> 0.00 : 122f37: 48 8d 52 80 lea -0x80(%rdx),%rdx 0.00 : 122f3b: 0f 83 af 00 00 00 jae 122ff0 <__memmove_ssse3+0x440> 0.00 : 122f41: 66 0f 6f 46 f0 movdqa -0x10(%rsi),%xmm0 0.00 : 122f46: 0f 28 4e e0 movaps -0x20(%rsi),%xmm1 0.00 : 122f4a: 0f 28 56 d0 movaps -0x30(%rsi),%xmm2 0.00 : 122f4e: 0f 28 5e c0 movaps -0x40(%rsi),%xmm3 0.00 : 122f52: 66 0f 7f 47 f0 movdqa %xmm0,-0x10(%rdi) 0.00 : 122f57: 0f 29 4f e0 movaps %xmm1,-0x20(%rdi) 0.00 : 122f5b: 0f 29 57 d0 movaps %xmm2,-0x30(%rdi) 0.00 : 122f5f: 0f 29 5f c0 movaps %xmm3,-0x40(%rdi) 0.00 : 122f63: 48 81 ea 80 00 00 00 sub $0x80,%rdx 0.00 : 122f6a: 0f 28 66 b0 movaps -0x50(%rsi),%xmm4 0.00 : 122f6e: 0f 28 6e a0 movaps -0x60(%rsi),%xmm5 0.00 : 122f72: 0f 28 76 90 movaps -0x70(%rsi),%xmm6 0.00 : 122f76: 0f 28 7e 80 movaps -0x80(%rsi),%xmm7 0.00 : 122f7a: 48 8d 76 80 lea -0x80(%rsi),%rsi 0.00 : 122f7e: 0f 29 67 b0 movaps %xmm4,-0x50(%rdi) 0.00 : 122f82: 0f 29 6f a0 movaps %xmm5,-0x60(%rdi) 0.00 : 122f86: 0f 29 77 90 movaps %xmm6,-0x70(%rdi) 0.00 : 122f8a: 0f 29 7f 80 movaps %xmm7,-0x80(%rdi) 0.00 : 122f8e: 48 8d 7f 80 lea -0x80(%rdi),%rdi 0.00 : 122f92: 73 ad jae 122f41 <__memmove_ssse3+0x391> 0.00 : 122f94: 48 83 fa c0 cmp $0xffffffffffffffc0,%rdx 0.00 : 122f98: 48 8d 92 80 00 00 00 lea 0x80(%rdx),%rdx 0.00 : 122f9f: 7c 34 jl 122fd5 <__memmove_ssse3+0x425> 0.00 : 122fa1: 66 0f 6f 46 f0 movdqa -0x10(%rsi),%xmm0 0.00 : 122fa6: 48 83 ea 40 sub $0x40,%rdx 0.00 : 122faa: 66 0f 6f 4e e0 movdqa -0x20(%rsi),%xmm1 0.00 : 122faf: 66 0f 7f 47 f0 movdqa %xmm0,-0x10(%rdi) 0.00 : 122fb4: 66 0f 7f 4f e0 movdqa %xmm1,-0x20(%rdi) 0.00 : 122fb9: 66 0f 6f 46 d0 movdqa -0x30(%rsi),%xmm0 0.00 : 122fbe: 66 0f 6f 4e c0 movdqa -0x40(%rsi),%xmm1 0.00 : 122fc3: 48 83 ee 40 sub $0x40,%rsi 0.00 : 122fc7: 66 0f 7f 47 d0 movdqa %xmm0,-0x30(%rdi) 0.00 : 122fcc: 66 0f 7f 4f c0 movdqa %xmm1,-0x40(%rdi) 0.00 : 122fd1: 48 83 ef 40 sub $0x40,%rdi 0.00 : 122fd5: 4c 8d 1d c4 12 02 00 lea 0x212c4(%rip),%r11 # 1442a0 0.00 : 122fdc: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 122fe0: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 122fe4: ff e2 jmpq *%rdx 0.00 : 122fe6: 0f 0b ud2 0.00 : 122fe8: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 122fef: 00 0.00 : 122ff0: 0f 18 8e 40 fe ff ff prefetcht0 -0x1c0(%rsi) 0.00 : 122ff7: 0f 18 8e 80 fd ff ff prefetcht0 -0x280(%rsi) 0.00 : 122ffe: 66 0f 6f 46 f0 movdqa -0x10(%rsi),%xmm0 0.00 : 123003: 66 0f 6f 4e e0 movdqa -0x20(%rsi),%xmm1 0.00 : 123008: 66 0f 6f 56 d0 movdqa -0x30(%rsi),%xmm2 0.00 : 12300d: 66 0f 6f 5e c0 movdqa -0x40(%rsi),%xmm3 0.00 : 123012: 66 0f 6f 66 b0 movdqa -0x50(%rsi),%xmm4 0.00 : 123017: 66 0f 6f 6e a0 movdqa -0x60(%rsi),%xmm5 0.00 : 12301c: 66 0f 6f 76 90 movdqa -0x70(%rsi),%xmm6 0.00 : 123021: 66 0f 6f 7e 80 movdqa -0x80(%rsi),%xmm7 0.00 : 123026: 48 8d 76 80 lea -0x80(%rsi),%rsi 0.00 : 12302a: 48 81 ea 80 00 00 00 sub $0x80,%rdx 0.00 : 123031: 66 0f 7f 47 f0 movdqa %xmm0,-0x10(%rdi) 0.00 : 123036: 66 0f 7f 4f e0 movdqa %xmm1,-0x20(%rdi) 0.00 : 12303b: 66 0f 7f 57 d0 movdqa %xmm2,-0x30(%rdi) 0.00 : 123040: 66 0f 7f 5f c0 movdqa %xmm3,-0x40(%rdi) 0.00 : 123045: 66 0f 7f 67 b0 movdqa %xmm4,-0x50(%rdi) 0.00 : 12304a: 66 0f 7f 6f a0 movdqa %xmm5,-0x60(%rdi) 0.00 : 12304f: 66 0f 7f 77 90 movdqa %xmm6,-0x70(%rdi) 0.00 : 123054: 66 0f 7f 7f 80 movdqa %xmm7,-0x80(%rdi) 0.00 : 123059: 48 8d 7f 80 lea -0x80(%rdi),%rdi 0.00 : 12305d: 73 91 jae 122ff0 <__memmove_ssse3+0x440> 0.00 : 12305f: 48 83 fa c0 cmp $0xffffffffffffffc0,%rdx 0.00 : 123063: 48 8d 92 80 00 00 00 lea 0x80(%rdx),%rdx 0.00 : 12306a: 7c 34 jl 1230a0 <__memmove_ssse3+0x4f0> 0.00 : 12306c: 66 0f 6f 46 f0 movdqa -0x10(%rsi),%xmm0 0.00 : 123071: 48 83 ea 40 sub $0x40,%rdx 0.00 : 123075: 66 0f 6f 4e e0 movdqa -0x20(%rsi),%xmm1 0.00 : 12307a: 66 0f 7f 47 f0 movdqa %xmm0,-0x10(%rdi) 0.00 : 12307f: 66 0f 7f 4f e0 movdqa %xmm1,-0x20(%rdi) 0.00 : 123084: 66 0f 6f 46 d0 movdqa -0x30(%rsi),%xmm0 0.00 : 123089: 66 0f 6f 4e c0 movdqa -0x40(%rsi),%xmm1 0.00 : 12308e: 48 83 ee 40 sub $0x40,%rsi 0.00 : 123092: 66 0f 7f 47 d0 movdqa %xmm0,-0x30(%rdi) 0.00 : 123097: 66 0f 7f 4f c0 movdqa %xmm1,-0x40(%rdi) 0.00 : 12309c: 48 83 ef 40 sub $0x40,%rdi 0.00 : 1230a0: 48 83 fa 20 cmp $0x20,%rdx 0.00 : 1230a4: 72 20 jb 1230c6 <__memmove_ssse3+0x516> 0.00 : 1230a6: 66 0f 6f 46 f0 movdqa -0x10(%rsi),%xmm0 0.00 : 1230ab: 48 83 ea 20 sub $0x20,%rdx 0.00 : 1230af: 66 0f 6f 4e e0 movdqa -0x20(%rsi),%xmm1 0.00 : 1230b4: 48 83 ee 20 sub $0x20,%rsi 0.00 : 1230b8: 66 0f 7f 47 f0 movdqa %xmm0,-0x10(%rdi) 0.00 : 1230bd: 66 0f 7f 4f e0 movdqa %xmm1,-0x20(%rdi) 0.00 : 1230c2: 48 83 ef 20 sub $0x20,%rdi 0.00 : 1230c6: 4c 8d 1d d3 11 02 00 lea 0x211d3(%rip),%r11 # 1442a0 0.00 : 1230cd: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 1230d1: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 1230d5: ff e2 jmpq *%rdx 0.00 : 1230d7: 0f 0b ud2 0.00 : 1230d9: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 0.00 : 1230e0: 4d 8d 89 27 00 00 00 lea 0x27(%r9),%r9 0.00 : 1230e7: 48 39 ca cmp %rcx,%rdx 0.00 : 1230ea: 0f 28 4e ff movaps -0x1(%rsi),%xmm1 0.00 : 1230ee: 72 07 jb 1230f7 <__memmove_ssse3+0x547> 0.00 : 1230f0: 4d 8d 89 f9 ff ff ff lea -0x7(%r9),%r9 0.00 : 1230f7: 48 8d 52 c0 lea -0x40(%rdx),%rdx 0.00 : 1230fb: 41 ff e1 jmpq *%r9 0.00 : 1230fe: 0f 0b ud2 0.00 : 123100: 0f 18 86 c0 01 00 00 prefetchnta 0x1c0(%rsi) 0.00 : 123107: 48 83 ea 40 sub $0x40,%rdx 0.00 : 12310b: 0f 28 56 0f movaps 0xf(%rsi),%xmm2 0.00 : 12310f: 0f 28 5e 1f movaps 0x1f(%rsi),%xmm3 0.00 : 123113: 0f 28 66 2f movaps 0x2f(%rsi),%xmm4 0.00 : 123117: 0f 28 6e 3f movaps 0x3f(%rsi),%xmm5 0.00 : 12311b: 66 0f 6f f5 movdqa %xmm5,%xmm6 0.00 : 12311f: 66 0f 3a 0f ec 01 palignr $0x1,%xmm4,%xmm5 0.00 : 123125: 48 8d 76 40 lea 0x40(%rsi),%rsi 0.00 : 123129: 66 0f 3a 0f e3 01 palignr $0x1,%xmm3,%xmm4 0.00 : 12312f: 66 0f 3a 0f da 01 palignr $0x1,%xmm2,%xmm3 0.00 : 123135: 48 8d 7f 40 lea 0x40(%rdi),%rdi 0.00 : 123139: 66 0f 3a 0f d1 01 palignr $0x1,%xmm1,%xmm2 0.00 : 12313f: 66 0f 6f ce movdqa %xmm6,%xmm1 0.00 : 123143: 66 0f 7f 57 c0 movdqa %xmm2,-0x40(%rdi) 0.00 : 123148: 0f 29 5f d0 movaps %xmm3,-0x30(%rdi) 0.00 : 12314c: 72 0d jb 12315b <__memmove_ssse3+0x5ab> 0.00 : 12314e: 0f 29 67 e0 movaps %xmm4,-0x20(%rdi) 0.00 : 123152: 0f 29 6f f0 movaps %xmm5,-0x10(%rdi) 0.00 : 123156: 41 ff e1 jmpq *%r9 0.00 : 123159: 0f 0b ud2 0.00 : 12315b: 0f 29 67 e0 movaps %xmm4,-0x20(%rdi) 0.00 : 12315f: 48 8d 52 40 lea 0x40(%rdx),%rdx 0.00 : 123163: 0f 29 6f f0 movaps %xmm5,-0x10(%rdi) 0.00 : 123167: 48 01 d7 add %rdx,%rdi 0.00 : 12316a: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 12316f: 48 01 d6 add %rdx,%rsi 0.00 : 123172: 4c 8d 1d 27 11 02 00 lea 0x21127(%rip),%r11 # 1442a0 0.00 : 123179: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 12317d: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 123181: ff e2 jmpq *%rdx 0.00 : 123183: 0f 0b ud2 0.00 : 123185: 66 66 2e 0f 1f 84 00 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 12318c: 00 00 00 00 0.00 : 123190: 4d 8d 89 27 00 00 00 lea 0x27(%r9),%r9 0.00 : 123197: 48 39 ca cmp %rcx,%rdx 0.00 : 12319a: 0f 28 4e ff movaps -0x1(%rsi),%xmm1 0.00 : 12319e: 72 07 jb 1231a7 <__memmove_ssse3+0x5f7> 0.00 : 1231a0: 4d 8d 89 f9 ff ff ff lea -0x7(%r9),%r9 0.00 : 1231a7: 48 8d 52 c0 lea -0x40(%rdx),%rdx 0.00 : 1231ab: 41 ff e1 jmpq *%r9 0.00 : 1231ae: 0f 0b ud2 0.00 : 1231b0: 0f 18 86 40 fe ff ff prefetchnta -0x1c0(%rsi) 0.00 : 1231b7: 0f 28 56 ef movaps -0x11(%rsi),%xmm2 0.00 : 1231bb: 48 83 ea 40 sub $0x40,%rdx 0.00 : 1231bf: 0f 28 5e df movaps -0x21(%rsi),%xmm3 0.00 : 1231c3: 0f 28 66 cf movaps -0x31(%rsi),%xmm4 0.00 : 1231c7: 0f 28 6e bf movaps -0x41(%rsi),%xmm5 0.00 : 1231cb: 48 8d 76 c0 lea -0x40(%rsi),%rsi 0.00 : 1231cf: 66 0f 3a 0f ca 01 palignr $0x1,%xmm2,%xmm1 0.00 : 1231d5: 66 0f 3a 0f d3 01 palignr $0x1,%xmm3,%xmm2 0.00 : 1231db: 66 0f 3a 0f dc 01 palignr $0x1,%xmm4,%xmm3 0.00 : 1231e1: 66 0f 3a 0f e5 01 palignr $0x1,%xmm5,%xmm4 0.00 : 1231e7: 0f 29 4f f0 movaps %xmm1,-0x10(%rdi) 0.00 : 1231eb: 0f 28 cd movaps %xmm5,%xmm1 0.00 : 1231ee: 0f 29 57 e0 movaps %xmm2,-0x20(%rdi) 0.00 : 1231f2: 48 8d 7f c0 lea -0x40(%rdi),%rdi 0.00 : 1231f6: 0f 29 5f 10 movaps %xmm3,0x10(%rdi) 0.00 : 1231fa: 72 08 jb 123204 <__memmove_ssse3+0x654> 0.00 : 1231fc: 0f 29 27 movaps %xmm4,(%rdi) 0.00 : 1231ff: 41 ff e1 jmpq *%r9 0.00 : 123202: 0f 0b ud2 0.00 : 123204: 0f 29 27 movaps %xmm4,(%rdi) 0.00 : 123207: 48 8d 52 40 lea 0x40(%rdx),%rdx 0.00 : 12320b: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 123210: 4c 8d 1d 89 10 02 00 lea 0x21089(%rip),%r11 # 1442a0 0.00 : 123217: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 12321b: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 12321f: ff e2 jmpq *%rdx 0.00 : 123221: 0f 0b ud2 0.00 : 123223: 66 66 66 66 2e 0f 1f data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 12322a: 84 00 00 00 00 00 0.00 : 123230: 4d 8d 89 27 00 00 00 lea 0x27(%r9),%r9 0.00 : 123237: 48 39 ca cmp %rcx,%rdx 0.00 : 12323a: 0f 28 4e fe movaps -0x2(%rsi),%xmm1 0.00 : 12323e: 72 07 jb 123247 <__memmove_ssse3+0x697> 0.00 : 123240: 4d 8d 89 f9 ff ff ff lea -0x7(%r9),%r9 0.00 : 123247: 48 8d 52 c0 lea -0x40(%rdx),%rdx 0.00 : 12324b: 41 ff e1 jmpq *%r9 0.00 : 12324e: 0f 0b ud2 0.00 : 123250: 0f 18 86 c0 01 00 00 prefetchnta 0x1c0(%rsi) 0.00 : 123257: 48 83 ea 40 sub $0x40,%rdx 0.00 : 12325b: 0f 28 56 0e movaps 0xe(%rsi),%xmm2 0.00 : 12325f: 0f 28 5e 1e movaps 0x1e(%rsi),%xmm3 0.00 : 123263: 0f 28 66 2e movaps 0x2e(%rsi),%xmm4 0.00 : 123267: 0f 28 6e 3e movaps 0x3e(%rsi),%xmm5 0.00 : 12326b: 66 0f 6f f5 movdqa %xmm5,%xmm6 0.00 : 12326f: 66 0f 3a 0f ec 02 palignr $0x2,%xmm4,%xmm5 0.00 : 123275: 48 8d 76 40 lea 0x40(%rsi),%rsi 0.00 : 123279: 66 0f 3a 0f e3 02 palignr $0x2,%xmm3,%xmm4 0.00 : 12327f: 66 0f 3a 0f da 02 palignr $0x2,%xmm2,%xmm3 0.00 : 123285: 48 8d 7f 40 lea 0x40(%rdi),%rdi 0.00 : 123289: 66 0f 3a 0f d1 02 palignr $0x2,%xmm1,%xmm2 0.00 : 12328f: 66 0f 6f ce movdqa %xmm6,%xmm1 0.00 : 123293: 66 0f 7f 57 c0 movdqa %xmm2,-0x40(%rdi) 0.00 : 123298: 0f 29 5f d0 movaps %xmm3,-0x30(%rdi) 0.00 : 12329c: 72 0d jb 1232ab <__memmove_ssse3+0x6fb> 0.00 : 12329e: 0f 29 67 e0 movaps %xmm4,-0x20(%rdi) 0.00 : 1232a2: 0f 29 6f f0 movaps %xmm5,-0x10(%rdi) 0.00 : 1232a6: 41 ff e1 jmpq *%r9 0.00 : 1232a9: 0f 0b ud2 0.00 : 1232ab: 0f 29 67 e0 movaps %xmm4,-0x20(%rdi) 0.00 : 1232af: 48 8d 52 40 lea 0x40(%rdx),%rdx 0.00 : 1232b3: 0f 29 6f f0 movaps %xmm5,-0x10(%rdi) 0.00 : 1232b7: 48 01 d7 add %rdx,%rdi 0.00 : 1232ba: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 1232bf: 48 01 d6 add %rdx,%rsi 0.00 : 1232c2: 4c 8d 1d d7 0f 02 00 lea 0x20fd7(%rip),%r11 # 1442a0 0.00 : 1232c9: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 1232cd: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 1232d1: ff e2 jmpq *%rdx 0.00 : 1232d3: 0f 0b ud2 0.00 : 1232d5: 66 66 2e 0f 1f 84 00 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 1232dc: 00 00 00 00 0.00 : 1232e0: 4d 8d 89 27 00 00 00 lea 0x27(%r9),%r9 0.00 : 1232e7: 48 39 ca cmp %rcx,%rdx 0.00 : 1232ea: 0f 28 4e fe movaps -0x2(%rsi),%xmm1 0.00 : 1232ee: 72 07 jb 1232f7 <__memmove_ssse3+0x747> 0.00 : 1232f0: 4d 8d 89 f9 ff ff ff lea -0x7(%r9),%r9 0.00 : 1232f7: 48 8d 52 c0 lea -0x40(%rdx),%rdx 0.00 : 1232fb: 41 ff e1 jmpq *%r9 0.00 : 1232fe: 0f 0b ud2 0.00 : 123300: 0f 18 86 40 fe ff ff prefetchnta -0x1c0(%rsi) 0.00 : 123307: 0f 28 56 ee movaps -0x12(%rsi),%xmm2 0.00 : 12330b: 48 83 ea 40 sub $0x40,%rdx 0.00 : 12330f: 0f 28 5e de movaps -0x22(%rsi),%xmm3 0.00 : 123313: 0f 28 66 ce movaps -0x32(%rsi),%xmm4 0.00 : 123317: 0f 28 6e be movaps -0x42(%rsi),%xmm5 0.00 : 12331b: 48 8d 76 c0 lea -0x40(%rsi),%rsi 0.00 : 12331f: 66 0f 3a 0f ca 02 palignr $0x2,%xmm2,%xmm1 0.00 : 123325: 66 0f 3a 0f d3 02 palignr $0x2,%xmm3,%xmm2 0.00 : 12332b: 66 0f 3a 0f dc 02 palignr $0x2,%xmm4,%xmm3 0.00 : 123331: 66 0f 3a 0f e5 02 palignr $0x2,%xmm5,%xmm4 0.00 : 123337: 0f 29 4f f0 movaps %xmm1,-0x10(%rdi) 0.00 : 12333b: 0f 28 cd movaps %xmm5,%xmm1 0.00 : 12333e: 0f 29 57 e0 movaps %xmm2,-0x20(%rdi) 0.00 : 123342: 48 8d 7f c0 lea -0x40(%rdi),%rdi 0.00 : 123346: 0f 29 5f 10 movaps %xmm3,0x10(%rdi) 0.00 : 12334a: 72 08 jb 123354 <__memmove_ssse3+0x7a4> 0.00 : 12334c: 0f 29 27 movaps %xmm4,(%rdi) 0.00 : 12334f: 41 ff e1 jmpq *%r9 0.00 : 123352: 0f 0b ud2 0.00 : 123354: 0f 29 27 movaps %xmm4,(%rdi) 0.00 : 123357: 48 8d 52 40 lea 0x40(%rdx),%rdx 0.00 : 12335b: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 123360: 4c 8d 1d 39 0f 02 00 lea 0x20f39(%rip),%r11 # 1442a0 0.00 : 123367: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 12336b: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 12336f: ff e2 jmpq *%rdx 0.00 : 123371: 0f 0b ud2 0.00 : 123373: 66 66 66 66 2e 0f 1f data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 12337a: 84 00 00 00 00 00 0.00 : 123380: 4d 8d 89 27 00 00 00 lea 0x27(%r9),%r9 0.00 : 123387: 48 39 ca cmp %rcx,%rdx 0.00 : 12338a: 0f 28 4e fd movaps -0x3(%rsi),%xmm1 0.00 : 12338e: 72 07 jb 123397 <__memmove_ssse3+0x7e7> 0.00 : 123390: 4d 8d 89 f9 ff ff ff lea -0x7(%r9),%r9 0.00 : 123397: 48 8d 52 c0 lea -0x40(%rdx),%rdx 0.00 : 12339b: 41 ff e1 jmpq *%r9 0.00 : 12339e: 0f 0b ud2 0.00 : 1233a0: 0f 18 86 c0 01 00 00 prefetchnta 0x1c0(%rsi) 0.00 : 1233a7: 48 83 ea 40 sub $0x40,%rdx 0.00 : 1233ab: 0f 28 56 0d movaps 0xd(%rsi),%xmm2 0.00 : 1233af: 0f 28 5e 1d movaps 0x1d(%rsi),%xmm3 0.00 : 1233b3: 0f 28 66 2d movaps 0x2d(%rsi),%xmm4 0.00 : 1233b7: 0f 28 6e 3d movaps 0x3d(%rsi),%xmm5 0.00 : 1233bb: 66 0f 6f f5 movdqa %xmm5,%xmm6 0.00 : 1233bf: 66 0f 3a 0f ec 03 palignr $0x3,%xmm4,%xmm5 0.00 : 1233c5: 48 8d 76 40 lea 0x40(%rsi),%rsi 0.00 : 1233c9: 66 0f 3a 0f e3 03 palignr $0x3,%xmm3,%xmm4 0.00 : 1233cf: 66 0f 3a 0f da 03 palignr $0x3,%xmm2,%xmm3 0.00 : 1233d5: 48 8d 7f 40 lea 0x40(%rdi),%rdi 0.00 : 1233d9: 66 0f 3a 0f d1 03 palignr $0x3,%xmm1,%xmm2 0.00 : 1233df: 66 0f 6f ce movdqa %xmm6,%xmm1 0.00 : 1233e3: 66 0f 7f 57 c0 movdqa %xmm2,-0x40(%rdi) 0.00 : 1233e8: 0f 29 5f d0 movaps %xmm3,-0x30(%rdi) 0.00 : 1233ec: 72 0d jb 1233fb <__memmove_ssse3+0x84b> 0.00 : 1233ee: 0f 29 67 e0 movaps %xmm4,-0x20(%rdi) 0.00 : 1233f2: 0f 29 6f f0 movaps %xmm5,-0x10(%rdi) 0.00 : 1233f6: 41 ff e1 jmpq *%r9 0.00 : 1233f9: 0f 0b ud2 0.00 : 1233fb: 0f 29 67 e0 movaps %xmm4,-0x20(%rdi) 0.00 : 1233ff: 48 8d 52 40 lea 0x40(%rdx),%rdx 0.00 : 123403: 0f 29 6f f0 movaps %xmm5,-0x10(%rdi) 0.00 : 123407: 48 01 d7 add %rdx,%rdi 0.00 : 12340a: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 12340f: 48 01 d6 add %rdx,%rsi 0.00 : 123412: 4c 8d 1d 87 0e 02 00 lea 0x20e87(%rip),%r11 # 1442a0 0.00 : 123419: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 12341d: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 123421: ff e2 jmpq *%rdx 0.00 : 123423: 0f 0b ud2 0.00 : 123425: 66 66 2e 0f 1f 84 00 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 12342c: 00 00 00 00 0.00 : 123430: 4d 8d 89 27 00 00 00 lea 0x27(%r9),%r9 0.00 : 123437: 48 39 ca cmp %rcx,%rdx 0.00 : 12343a: 0f 28 4e fd movaps -0x3(%rsi),%xmm1 0.00 : 12343e: 72 07 jb 123447 <__memmove_ssse3+0x897> 0.00 : 123440: 4d 8d 89 f9 ff ff ff lea -0x7(%r9),%r9 0.00 : 123447: 48 8d 52 c0 lea -0x40(%rdx),%rdx 0.00 : 12344b: 41 ff e1 jmpq *%r9 0.00 : 12344e: 0f 0b ud2 0.00 : 123450: 0f 18 86 40 fe ff ff prefetchnta -0x1c0(%rsi) 0.00 : 123457: 0f 28 56 ed movaps -0x13(%rsi),%xmm2 0.00 : 12345b: 48 83 ea 40 sub $0x40,%rdx 0.00 : 12345f: 0f 28 5e dd movaps -0x23(%rsi),%xmm3 0.00 : 123463: 0f 28 66 cd movaps -0x33(%rsi),%xmm4 0.00 : 123467: 0f 28 6e bd movaps -0x43(%rsi),%xmm5 0.00 : 12346b: 48 8d 76 c0 lea -0x40(%rsi),%rsi 0.00 : 12346f: 66 0f 3a 0f ca 03 palignr $0x3,%xmm2,%xmm1 0.00 : 123475: 66 0f 3a 0f d3 03 palignr $0x3,%xmm3,%xmm2 0.00 : 12347b: 66 0f 3a 0f dc 03 palignr $0x3,%xmm4,%xmm3 0.00 : 123481: 66 0f 3a 0f e5 03 palignr $0x3,%xmm5,%xmm4 0.00 : 123487: 0f 29 4f f0 movaps %xmm1,-0x10(%rdi) 0.00 : 12348b: 0f 28 cd movaps %xmm5,%xmm1 0.00 : 12348e: 0f 29 57 e0 movaps %xmm2,-0x20(%rdi) 0.00 : 123492: 48 8d 7f c0 lea -0x40(%rdi),%rdi 0.00 : 123496: 0f 29 5f 10 movaps %xmm3,0x10(%rdi) 0.00 : 12349a: 72 08 jb 1234a4 <__memmove_ssse3+0x8f4> 0.00 : 12349c: 0f 29 27 movaps %xmm4,(%rdi) 0.00 : 12349f: 41 ff e1 jmpq *%r9 0.00 : 1234a2: 0f 0b ud2 0.00 : 1234a4: 0f 29 27 movaps %xmm4,(%rdi) 0.00 : 1234a7: 48 8d 52 40 lea 0x40(%rdx),%rdx 0.00 : 1234ab: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 1234b0: 4c 8d 1d e9 0d 02 00 lea 0x20de9(%rip),%r11 # 1442a0 0.00 : 1234b7: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 1234bb: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 1234bf: ff e2 jmpq *%rdx 0.00 : 1234c1: 0f 0b ud2 0.00 : 1234c3: 66 66 66 66 2e 0f 1f data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 1234ca: 84 00 00 00 00 00 0.00 : 1234d0: 4d 8d 89 27 00 00 00 lea 0x27(%r9),%r9 0.00 : 1234d7: 48 39 ca cmp %rcx,%rdx 0.00 : 1234da: 0f 28 4e fc movaps -0x4(%rsi),%xmm1 0.00 : 1234de: 72 07 jb 1234e7 <__memmove_ssse3+0x937> 0.00 : 1234e0: 4d 8d 89 f9 ff ff ff lea -0x7(%r9),%r9 0.00 : 1234e7: 48 8d 52 c0 lea -0x40(%rdx),%rdx 0.00 : 1234eb: 41 ff e1 jmpq *%r9 0.00 : 1234ee: 0f 0b ud2 0.00 : 1234f0: 0f 18 86 c0 01 00 00 prefetchnta 0x1c0(%rsi) 0.00 : 1234f7: 48 83 ea 40 sub $0x40,%rdx 0.00 : 1234fb: 0f 28 56 0c movaps 0xc(%rsi),%xmm2 0.00 : 1234ff: 0f 28 5e 1c movaps 0x1c(%rsi),%xmm3 0.00 : 123503: 0f 28 66 2c movaps 0x2c(%rsi),%xmm4 0.00 : 123507: 0f 28 6e 3c movaps 0x3c(%rsi),%xmm5 0.00 : 12350b: 66 0f 6f f5 movdqa %xmm5,%xmm6 0.00 : 12350f: 66 0f 3a 0f ec 04 palignr $0x4,%xmm4,%xmm5 0.00 : 123515: 48 8d 76 40 lea 0x40(%rsi),%rsi 0.00 : 123519: 66 0f 3a 0f e3 04 palignr $0x4,%xmm3,%xmm4 0.00 : 12351f: 66 0f 3a 0f da 04 palignr $0x4,%xmm2,%xmm3 0.00 : 123525: 48 8d 7f 40 lea 0x40(%rdi),%rdi 0.00 : 123529: 66 0f 3a 0f d1 04 palignr $0x4,%xmm1,%xmm2 0.00 : 12352f: 66 0f 6f ce movdqa %xmm6,%xmm1 0.00 : 123533: 66 0f 7f 57 c0 movdqa %xmm2,-0x40(%rdi) 0.00 : 123538: 0f 29 5f d0 movaps %xmm3,-0x30(%rdi) 0.00 : 12353c: 72 0d jb 12354b <__memmove_ssse3+0x99b> 0.00 : 12353e: 0f 29 67 e0 movaps %xmm4,-0x20(%rdi) 0.00 : 123542: 0f 29 6f f0 movaps %xmm5,-0x10(%rdi) 0.00 : 123546: 41 ff e1 jmpq *%r9 0.00 : 123549: 0f 0b ud2 0.00 : 12354b: 0f 29 67 e0 movaps %xmm4,-0x20(%rdi) 0.00 : 12354f: 48 8d 52 40 lea 0x40(%rdx),%rdx 0.00 : 123553: 0f 29 6f f0 movaps %xmm5,-0x10(%rdi) 0.00 : 123557: 48 01 d7 add %rdx,%rdi 0.00 : 12355a: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 12355f: 48 01 d6 add %rdx,%rsi 0.00 : 123562: 4c 8d 1d 37 0d 02 00 lea 0x20d37(%rip),%r11 # 1442a0 0.00 : 123569: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 12356d: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 123571: ff e2 jmpq *%rdx 0.00 : 123573: 0f 0b ud2 0.00 : 123575: 66 66 2e 0f 1f 84 00 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 12357c: 00 00 00 00 0.00 : 123580: 4d 8d 89 27 00 00 00 lea 0x27(%r9),%r9 0.00 : 123587: 48 39 ca cmp %rcx,%rdx 0.00 : 12358a: 0f 28 4e fc movaps -0x4(%rsi),%xmm1 0.00 : 12358e: 72 07 jb 123597 <__memmove_ssse3+0x9e7> 0.00 : 123590: 4d 8d 89 f9 ff ff ff lea -0x7(%r9),%r9 0.00 : 123597: 48 8d 52 c0 lea -0x40(%rdx),%rdx 0.00 : 12359b: 41 ff e1 jmpq *%r9 0.00 : 12359e: 0f 0b ud2 0.00 : 1235a0: 0f 18 86 40 fe ff ff prefetchnta -0x1c0(%rsi) 0.00 : 1235a7: 0f 28 56 ec movaps -0x14(%rsi),%xmm2 0.00 : 1235ab: 48 83 ea 40 sub $0x40,%rdx 0.00 : 1235af: 0f 28 5e dc movaps -0x24(%rsi),%xmm3 0.00 : 1235b3: 0f 28 66 cc movaps -0x34(%rsi),%xmm4 0.00 : 1235b7: 0f 28 6e bc movaps -0x44(%rsi),%xmm5 0.00 : 1235bb: 48 8d 76 c0 lea -0x40(%rsi),%rsi 0.00 : 1235bf: 66 0f 3a 0f ca 04 palignr $0x4,%xmm2,%xmm1 0.00 : 1235c5: 66 0f 3a 0f d3 04 palignr $0x4,%xmm3,%xmm2 0.00 : 1235cb: 66 0f 3a 0f dc 04 palignr $0x4,%xmm4,%xmm3 0.00 : 1235d1: 66 0f 3a 0f e5 04 palignr $0x4,%xmm5,%xmm4 0.00 : 1235d7: 0f 29 4f f0 movaps %xmm1,-0x10(%rdi) 0.00 : 1235db: 0f 28 cd movaps %xmm5,%xmm1 0.00 : 1235de: 0f 29 57 e0 movaps %xmm2,-0x20(%rdi) 0.00 : 1235e2: 48 8d 7f c0 lea -0x40(%rdi),%rdi 0.00 : 1235e6: 0f 29 5f 10 movaps %xmm3,0x10(%rdi) 0.00 : 1235ea: 72 08 jb 1235f4 <__memmove_ssse3+0xa44> 0.00 : 1235ec: 0f 29 27 movaps %xmm4,(%rdi) 0.00 : 1235ef: 41 ff e1 jmpq *%r9 0.00 : 1235f2: 0f 0b ud2 0.00 : 1235f4: 0f 29 27 movaps %xmm4,(%rdi) 0.00 : 1235f7: 48 8d 52 40 lea 0x40(%rdx),%rdx 0.00 : 1235fb: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 123600: 4c 8d 1d 99 0c 02 00 lea 0x20c99(%rip),%r11 # 1442a0 0.00 : 123607: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 12360b: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 12360f: ff e2 jmpq *%rdx 0.00 : 123611: 0f 0b ud2 0.00 : 123613: 66 66 66 66 2e 0f 1f data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 12361a: 84 00 00 00 00 00 0.00 : 123620: 4d 8d 89 27 00 00 00 lea 0x27(%r9),%r9 0.00 : 123627: 48 39 ca cmp %rcx,%rdx 0.00 : 12362a: 0f 28 4e fb movaps -0x5(%rsi),%xmm1 0.00 : 12362e: 72 07 jb 123637 <__memmove_ssse3+0xa87> 0.00 : 123630: 4d 8d 89 f9 ff ff ff lea -0x7(%r9),%r9 0.00 : 123637: 48 8d 52 c0 lea -0x40(%rdx),%rdx 0.00 : 12363b: 41 ff e1 jmpq *%r9 0.00 : 12363e: 0f 0b ud2 0.00 : 123640: 0f 18 86 c0 01 00 00 prefetchnta 0x1c0(%rsi) 0.00 : 123647: 48 83 ea 40 sub $0x40,%rdx 0.00 : 12364b: 0f 28 56 0b movaps 0xb(%rsi),%xmm2 0.00 : 12364f: 0f 28 5e 1b movaps 0x1b(%rsi),%xmm3 0.00 : 123653: 0f 28 66 2b movaps 0x2b(%rsi),%xmm4 0.00 : 123657: 0f 28 6e 3b movaps 0x3b(%rsi),%xmm5 0.00 : 12365b: 66 0f 6f f5 movdqa %xmm5,%xmm6 0.00 : 12365f: 66 0f 3a 0f ec 05 palignr $0x5,%xmm4,%xmm5 0.00 : 123665: 48 8d 76 40 lea 0x40(%rsi),%rsi 0.00 : 123669: 66 0f 3a 0f e3 05 palignr $0x5,%xmm3,%xmm4 0.00 : 12366f: 66 0f 3a 0f da 05 palignr $0x5,%xmm2,%xmm3 0.00 : 123675: 48 8d 7f 40 lea 0x40(%rdi),%rdi 0.00 : 123679: 66 0f 3a 0f d1 05 palignr $0x5,%xmm1,%xmm2 0.00 : 12367f: 66 0f 6f ce movdqa %xmm6,%xmm1 0.00 : 123683: 66 0f 7f 57 c0 movdqa %xmm2,-0x40(%rdi) 0.00 : 123688: 0f 29 5f d0 movaps %xmm3,-0x30(%rdi) 0.00 : 12368c: 72 0d jb 12369b <__memmove_ssse3+0xaeb> 0.00 : 12368e: 0f 29 67 e0 movaps %xmm4,-0x20(%rdi) 0.00 : 123692: 0f 29 6f f0 movaps %xmm5,-0x10(%rdi) 0.00 : 123696: 41 ff e1 jmpq *%r9 0.00 : 123699: 0f 0b ud2 0.00 : 12369b: 0f 29 67 e0 movaps %xmm4,-0x20(%rdi) 0.00 : 12369f: 48 8d 52 40 lea 0x40(%rdx),%rdx 0.00 : 1236a3: 0f 29 6f f0 movaps %xmm5,-0x10(%rdi) 0.00 : 1236a7: 48 01 d7 add %rdx,%rdi 0.00 : 1236aa: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 1236af: 48 01 d6 add %rdx,%rsi 0.00 : 1236b2: 4c 8d 1d e7 0b 02 00 lea 0x20be7(%rip),%r11 # 1442a0 0.00 : 1236b9: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 1236bd: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 1236c1: ff e2 jmpq *%rdx 0.00 : 1236c3: 0f 0b ud2 0.00 : 1236c5: 66 66 2e 0f 1f 84 00 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 1236cc: 00 00 00 00 0.00 : 1236d0: 4d 8d 89 27 00 00 00 lea 0x27(%r9),%r9 0.00 : 1236d7: 48 39 ca cmp %rcx,%rdx 0.00 : 1236da: 0f 28 4e fb movaps -0x5(%rsi),%xmm1 0.00 : 1236de: 72 07 jb 1236e7 <__memmove_ssse3+0xb37> 0.00 : 1236e0: 4d 8d 89 f9 ff ff ff lea -0x7(%r9),%r9 0.00 : 1236e7: 48 8d 52 c0 lea -0x40(%rdx),%rdx 0.00 : 1236eb: 41 ff e1 jmpq *%r9 0.00 : 1236ee: 0f 0b ud2 0.00 : 1236f0: 0f 18 86 40 fe ff ff prefetchnta -0x1c0(%rsi) 0.00 : 1236f7: 0f 28 56 eb movaps -0x15(%rsi),%xmm2 0.00 : 1236fb: 48 83 ea 40 sub $0x40,%rdx 0.00 : 1236ff: 0f 28 5e db movaps -0x25(%rsi),%xmm3 0.00 : 123703: 0f 28 66 cb movaps -0x35(%rsi),%xmm4 0.00 : 123707: 0f 28 6e bb movaps -0x45(%rsi),%xmm5 0.00 : 12370b: 48 8d 76 c0 lea -0x40(%rsi),%rsi 0.00 : 12370f: 66 0f 3a 0f ca 05 palignr $0x5,%xmm2,%xmm1 0.00 : 123715: 66 0f 3a 0f d3 05 palignr $0x5,%xmm3,%xmm2 0.00 : 12371b: 66 0f 3a 0f dc 05 palignr $0x5,%xmm4,%xmm3 0.00 : 123721: 66 0f 3a 0f e5 05 palignr $0x5,%xmm5,%xmm4 0.00 : 123727: 0f 29 4f f0 movaps %xmm1,-0x10(%rdi) 0.00 : 12372b: 0f 28 cd movaps %xmm5,%xmm1 0.00 : 12372e: 0f 29 57 e0 movaps %xmm2,-0x20(%rdi) 0.00 : 123732: 48 8d 7f c0 lea -0x40(%rdi),%rdi 0.00 : 123736: 0f 29 5f 10 movaps %xmm3,0x10(%rdi) 0.00 : 12373a: 72 08 jb 123744 <__memmove_ssse3+0xb94> 0.00 : 12373c: 0f 29 27 movaps %xmm4,(%rdi) 0.00 : 12373f: 41 ff e1 jmpq *%r9 0.00 : 123742: 0f 0b ud2 0.00 : 123744: 0f 29 27 movaps %xmm4,(%rdi) 0.00 : 123747: 48 8d 52 40 lea 0x40(%rdx),%rdx 0.00 : 12374b: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 123750: 4c 8d 1d 49 0b 02 00 lea 0x20b49(%rip),%r11 # 1442a0 0.00 : 123757: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 12375b: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 12375f: ff e2 jmpq *%rdx 0.00 : 123761: 0f 0b ud2 0.00 : 123763: 66 66 66 66 2e 0f 1f data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 12376a: 84 00 00 00 00 00 0.00 : 123770: 4d 8d 89 27 00 00 00 lea 0x27(%r9),%r9 0.00 : 123777: 48 39 ca cmp %rcx,%rdx 0.00 : 12377a: 0f 28 4e fa movaps -0x6(%rsi),%xmm1 0.00 : 12377e: 72 07 jb 123787 <__memmove_ssse3+0xbd7> 0.00 : 123780: 4d 8d 89 f9 ff ff ff lea -0x7(%r9),%r9 0.00 : 123787: 48 8d 52 c0 lea -0x40(%rdx),%rdx 0.00 : 12378b: 41 ff e1 jmpq *%r9 0.00 : 12378e: 0f 0b ud2 0.00 : 123790: 0f 18 86 c0 01 00 00 prefetchnta 0x1c0(%rsi) 0.00 : 123797: 48 83 ea 40 sub $0x40,%rdx 0.00 : 12379b: 0f 28 56 0a movaps 0xa(%rsi),%xmm2 0.00 : 12379f: 0f 28 5e 1a movaps 0x1a(%rsi),%xmm3 0.00 : 1237a3: 0f 28 66 2a movaps 0x2a(%rsi),%xmm4 0.00 : 1237a7: 0f 28 6e 3a movaps 0x3a(%rsi),%xmm5 0.00 : 1237ab: 66 0f 6f f5 movdqa %xmm5,%xmm6 0.00 : 1237af: 66 0f 3a 0f ec 06 palignr $0x6,%xmm4,%xmm5 0.00 : 1237b5: 48 8d 76 40 lea 0x40(%rsi),%rsi 0.00 : 1237b9: 66 0f 3a 0f e3 06 palignr $0x6,%xmm3,%xmm4 0.00 : 1237bf: 66 0f 3a 0f da 06 palignr $0x6,%xmm2,%xmm3 0.00 : 1237c5: 48 8d 7f 40 lea 0x40(%rdi),%rdi 0.00 : 1237c9: 66 0f 3a 0f d1 06 palignr $0x6,%xmm1,%xmm2 0.00 : 1237cf: 66 0f 6f ce movdqa %xmm6,%xmm1 0.00 : 1237d3: 66 0f 7f 57 c0 movdqa %xmm2,-0x40(%rdi) 0.00 : 1237d8: 0f 29 5f d0 movaps %xmm3,-0x30(%rdi) 0.00 : 1237dc: 72 0d jb 1237eb <__memmove_ssse3+0xc3b> 0.00 : 1237de: 0f 29 67 e0 movaps %xmm4,-0x20(%rdi) 0.00 : 1237e2: 0f 29 6f f0 movaps %xmm5,-0x10(%rdi) 0.00 : 1237e6: 41 ff e1 jmpq *%r9 0.00 : 1237e9: 0f 0b ud2 0.00 : 1237eb: 0f 29 67 e0 movaps %xmm4,-0x20(%rdi) 0.00 : 1237ef: 48 8d 52 40 lea 0x40(%rdx),%rdx 0.00 : 1237f3: 0f 29 6f f0 movaps %xmm5,-0x10(%rdi) 0.00 : 1237f7: 48 01 d7 add %rdx,%rdi 0.00 : 1237fa: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 1237ff: 48 01 d6 add %rdx,%rsi 0.00 : 123802: 4c 8d 1d 97 0a 02 00 lea 0x20a97(%rip),%r11 # 1442a0 0.00 : 123809: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 12380d: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 123811: ff e2 jmpq *%rdx 0.00 : 123813: 0f 0b ud2 0.00 : 123815: 66 66 2e 0f 1f 84 00 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 12381c: 00 00 00 00 0.00 : 123820: 4d 8d 89 27 00 00 00 lea 0x27(%r9),%r9 0.00 : 123827: 48 39 ca cmp %rcx,%rdx 0.00 : 12382a: 0f 28 4e fa movaps -0x6(%rsi),%xmm1 0.00 : 12382e: 72 07 jb 123837 <__memmove_ssse3+0xc87> 0.00 : 123830: 4d 8d 89 f9 ff ff ff lea -0x7(%r9),%r9 0.00 : 123837: 48 8d 52 c0 lea -0x40(%rdx),%rdx 0.00 : 12383b: 41 ff e1 jmpq *%r9 0.00 : 12383e: 0f 0b ud2 0.00 : 123840: 0f 18 86 40 fe ff ff prefetchnta -0x1c0(%rsi) 0.00 : 123847: 0f 28 56 ea movaps -0x16(%rsi),%xmm2 0.00 : 12384b: 48 83 ea 40 sub $0x40,%rdx 0.00 : 12384f: 0f 28 5e da movaps -0x26(%rsi),%xmm3 0.00 : 123853: 0f 28 66 ca movaps -0x36(%rsi),%xmm4 0.00 : 123857: 0f 28 6e ba movaps -0x46(%rsi),%xmm5 0.00 : 12385b: 48 8d 76 c0 lea -0x40(%rsi),%rsi 0.00 : 12385f: 66 0f 3a 0f ca 06 palignr $0x6,%xmm2,%xmm1 0.00 : 123865: 66 0f 3a 0f d3 06 palignr $0x6,%xmm3,%xmm2 0.00 : 12386b: 66 0f 3a 0f dc 06 palignr $0x6,%xmm4,%xmm3 0.00 : 123871: 66 0f 3a 0f e5 06 palignr $0x6,%xmm5,%xmm4 0.00 : 123877: 0f 29 4f f0 movaps %xmm1,-0x10(%rdi) 0.00 : 12387b: 0f 28 cd movaps %xmm5,%xmm1 0.00 : 12387e: 0f 29 57 e0 movaps %xmm2,-0x20(%rdi) 0.00 : 123882: 48 8d 7f c0 lea -0x40(%rdi),%rdi 0.00 : 123886: 0f 29 5f 10 movaps %xmm3,0x10(%rdi) 0.00 : 12388a: 72 08 jb 123894 <__memmove_ssse3+0xce4> 0.00 : 12388c: 0f 29 27 movaps %xmm4,(%rdi) 0.00 : 12388f: 41 ff e1 jmpq *%r9 0.00 : 123892: 0f 0b ud2 0.00 : 123894: 0f 29 27 movaps %xmm4,(%rdi) 0.00 : 123897: 48 8d 52 40 lea 0x40(%rdx),%rdx 0.00 : 12389b: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 1238a0: 4c 8d 1d f9 09 02 00 lea 0x209f9(%rip),%r11 # 1442a0 0.00 : 1238a7: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 1238ab: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 1238af: ff e2 jmpq *%rdx 0.00 : 1238b1: 0f 0b ud2 0.00 : 1238b3: 66 66 66 66 2e 0f 1f data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 1238ba: 84 00 00 00 00 00 0.00 : 1238c0: 4d 8d 89 27 00 00 00 lea 0x27(%r9),%r9 0.00 : 1238c7: 48 39 ca cmp %rcx,%rdx 0.00 : 1238ca: 0f 28 4e f9 movaps -0x7(%rsi),%xmm1 0.00 : 1238ce: 72 07 jb 1238d7 <__memmove_ssse3+0xd27> 0.00 : 1238d0: 4d 8d 89 f9 ff ff ff lea -0x7(%r9),%r9 0.00 : 1238d7: 48 8d 52 c0 lea -0x40(%rdx),%rdx 0.00 : 1238db: 41 ff e1 jmpq *%r9 0.00 : 1238de: 0f 0b ud2 0.00 : 1238e0: 0f 18 86 c0 01 00 00 prefetchnta 0x1c0(%rsi) 0.00 : 1238e7: 48 83 ea 40 sub $0x40,%rdx 0.00 : 1238eb: 0f 28 56 09 movaps 0x9(%rsi),%xmm2 0.00 : 1238ef: 0f 28 5e 19 movaps 0x19(%rsi),%xmm3 0.00 : 1238f3: 0f 28 66 29 movaps 0x29(%rsi),%xmm4 0.00 : 1238f7: 0f 28 6e 39 movaps 0x39(%rsi),%xmm5 0.00 : 1238fb: 66 0f 6f f5 movdqa %xmm5,%xmm6 0.00 : 1238ff: 66 0f 3a 0f ec 07 palignr $0x7,%xmm4,%xmm5 0.00 : 123905: 48 8d 76 40 lea 0x40(%rsi),%rsi 0.00 : 123909: 66 0f 3a 0f e3 07 palignr $0x7,%xmm3,%xmm4 0.00 : 12390f: 66 0f 3a 0f da 07 palignr $0x7,%xmm2,%xmm3 0.00 : 123915: 48 8d 7f 40 lea 0x40(%rdi),%rdi 0.00 : 123919: 66 0f 3a 0f d1 07 palignr $0x7,%xmm1,%xmm2 0.00 : 12391f: 66 0f 6f ce movdqa %xmm6,%xmm1 0.00 : 123923: 66 0f 7f 57 c0 movdqa %xmm2,-0x40(%rdi) 0.00 : 123928: 0f 29 5f d0 movaps %xmm3,-0x30(%rdi) 0.00 : 12392c: 72 0d jb 12393b <__memmove_ssse3+0xd8b> 0.00 : 12392e: 0f 29 67 e0 movaps %xmm4,-0x20(%rdi) 0.00 : 123932: 0f 29 6f f0 movaps %xmm5,-0x10(%rdi) 0.00 : 123936: 41 ff e1 jmpq *%r9 0.00 : 123939: 0f 0b ud2 0.00 : 12393b: 0f 29 67 e0 movaps %xmm4,-0x20(%rdi) 0.00 : 12393f: 48 8d 52 40 lea 0x40(%rdx),%rdx 0.00 : 123943: 0f 29 6f f0 movaps %xmm5,-0x10(%rdi) 0.00 : 123947: 48 01 d7 add %rdx,%rdi 0.00 : 12394a: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 12394f: 48 01 d6 add %rdx,%rsi 0.00 : 123952: 4c 8d 1d 47 09 02 00 lea 0x20947(%rip),%r11 # 1442a0 0.00 : 123959: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 12395d: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 123961: ff e2 jmpq *%rdx 0.00 : 123963: 0f 0b ud2 0.00 : 123965: 66 66 2e 0f 1f 84 00 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 12396c: 00 00 00 00 0.00 : 123970: 4d 8d 89 27 00 00 00 lea 0x27(%r9),%r9 0.00 : 123977: 48 39 ca cmp %rcx,%rdx 0.00 : 12397a: 0f 28 4e f9 movaps -0x7(%rsi),%xmm1 0.00 : 12397e: 72 07 jb 123987 <__memmove_ssse3+0xdd7> 0.00 : 123980: 4d 8d 89 f9 ff ff ff lea -0x7(%r9),%r9 0.00 : 123987: 48 8d 52 c0 lea -0x40(%rdx),%rdx 0.00 : 12398b: 41 ff e1 jmpq *%r9 0.00 : 12398e: 0f 0b ud2 0.00 : 123990: 0f 18 86 40 fe ff ff prefetchnta -0x1c0(%rsi) 0.00 : 123997: 0f 28 56 e9 movaps -0x17(%rsi),%xmm2 0.00 : 12399b: 48 83 ea 40 sub $0x40,%rdx 0.00 : 12399f: 0f 28 5e d9 movaps -0x27(%rsi),%xmm3 0.00 : 1239a3: 0f 28 66 c9 movaps -0x37(%rsi),%xmm4 0.00 : 1239a7: 0f 28 6e b9 movaps -0x47(%rsi),%xmm5 0.00 : 1239ab: 48 8d 76 c0 lea -0x40(%rsi),%rsi 0.00 : 1239af: 66 0f 3a 0f ca 07 palignr $0x7,%xmm2,%xmm1 0.00 : 1239b5: 66 0f 3a 0f d3 07 palignr $0x7,%xmm3,%xmm2 0.00 : 1239bb: 66 0f 3a 0f dc 07 palignr $0x7,%xmm4,%xmm3 0.00 : 1239c1: 66 0f 3a 0f e5 07 palignr $0x7,%xmm5,%xmm4 0.00 : 1239c7: 0f 29 4f f0 movaps %xmm1,-0x10(%rdi) 0.00 : 1239cb: 0f 28 cd movaps %xmm5,%xmm1 0.00 : 1239ce: 0f 29 57 e0 movaps %xmm2,-0x20(%rdi) 0.00 : 1239d2: 48 8d 7f c0 lea -0x40(%rdi),%rdi 0.00 : 1239d6: 0f 29 5f 10 movaps %xmm3,0x10(%rdi) 0.00 : 1239da: 72 08 jb 1239e4 <__memmove_ssse3+0xe34> 0.00 : 1239dc: 0f 29 27 movaps %xmm4,(%rdi) 0.00 : 1239df: 41 ff e1 jmpq *%r9 0.00 : 1239e2: 0f 0b ud2 0.00 : 1239e4: 0f 29 27 movaps %xmm4,(%rdi) 0.00 : 1239e7: 48 8d 52 40 lea 0x40(%rdx),%rdx 0.00 : 1239eb: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 1239f0: 4c 8d 1d a9 08 02 00 lea 0x208a9(%rip),%r11 # 1442a0 0.00 : 1239f7: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 1239fb: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 1239ff: ff e2 jmpq *%rdx 0.00 : 123a01: 0f 0b ud2 0.00 : 123a03: 66 66 66 66 2e 0f 1f data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 123a0a: 84 00 00 00 00 00 0.00 : 123a10: 4d 8d 89 25 00 00 00 lea 0x25(%r9),%r9 0.00 : 123a17: 48 39 ca cmp %rcx,%rdx 0.00 : 123a1a: 0f 28 4e f8 movaps -0x8(%rsi),%xmm1 0.00 : 123a1e: 72 07 jb 123a27 <__memmove_ssse3+0xe77> 0.00 : 123a20: 4d 8d 89 f9 ff ff ff lea -0x7(%r9),%r9 0.00 : 123a27: 48 8d 52 c0 lea -0x40(%rdx),%rdx 0.00 : 123a2b: 41 ff e1 jmpq *%r9 0.00 : 123a2e: 0f 18 86 c0 01 00 00 prefetchnta 0x1c0(%rsi) 0.00 : 123a35: 48 83 ea 40 sub $0x40,%rdx 0.00 : 123a39: 0f 28 56 08 movaps 0x8(%rsi),%xmm2 0.00 : 123a3d: 0f 28 5e 18 movaps 0x18(%rsi),%xmm3 0.00 : 123a41: 0f 28 66 28 movaps 0x28(%rsi),%xmm4 0.00 : 123a45: 0f 28 6e 38 movaps 0x38(%rsi),%xmm5 0.00 : 123a49: 66 0f 6f f5 movdqa %xmm5,%xmm6 0.00 : 123a4d: 66 0f 3a 0f ec 08 palignr $0x8,%xmm4,%xmm5 0.00 : 123a53: 48 8d 76 40 lea 0x40(%rsi),%rsi 0.00 : 123a57: 66 0f 3a 0f e3 08 palignr $0x8,%xmm3,%xmm4 0.00 : 123a5d: 66 0f 3a 0f da 08 palignr $0x8,%xmm2,%xmm3 0.00 : 123a63: 48 8d 7f 40 lea 0x40(%rdi),%rdi 0.00 : 123a67: 66 0f 3a 0f d1 08 palignr $0x8,%xmm1,%xmm2 0.00 : 123a6d: 66 0f 6f ce movdqa %xmm6,%xmm1 0.00 : 123a71: 66 0f 7f 57 c0 movdqa %xmm2,-0x40(%rdi) 0.00 : 123a76: 0f 29 5f d0 movaps %xmm3,-0x30(%rdi) 0.00 : 123a7a: 72 14 jb 123a90 <__memmove_ssse3+0xee0> 0.00 : 123a7c: 0f 29 67 e0 movaps %xmm4,-0x20(%rdi) 0.00 : 123a80: 0f 29 6f f0 movaps %xmm5,-0x10(%rdi) 0.00 : 123a84: 41 ff e1 jmpq *%r9 0.00 : 123a87: 0f 0b ud2 0.00 : 123a89: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 0.00 : 123a90: 48 8d 52 40 lea 0x40(%rdx),%rdx 0.00 : 123a94: 0f 29 67 e0 movaps %xmm4,-0x20(%rdi) 0.00 : 123a98: 48 01 d6 add %rdx,%rsi 0.00 : 123a9b: 0f 29 6f f0 movaps %xmm5,-0x10(%rdi) 0.00 : 123a9f: 48 01 d7 add %rdx,%rdi 0.00 : 123aa2: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 123aa7: 4c 8d 1d f2 07 02 00 lea 0x207f2(%rip),%r11 # 1442a0 0.00 : 123aae: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 123ab2: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 123ab6: ff e2 jmpq *%rdx 0.00 : 123ab8: 0f 0b ud2 0.00 : 123aba: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 123ac0: 4d 8d 89 27 00 00 00 lea 0x27(%r9),%r9 0.00 : 123ac7: 48 39 ca cmp %rcx,%rdx 0.00 : 123aca: 0f 28 4e f8 movaps -0x8(%rsi),%xmm1 0.00 : 123ace: 72 07 jb 123ad7 <__memmove_ssse3+0xf27> 0.00 : 123ad0: 4d 8d 89 f9 ff ff ff lea -0x7(%r9),%r9 0.00 : 123ad7: 48 8d 52 c0 lea -0x40(%rdx),%rdx 0.00 : 123adb: 41 ff e1 jmpq *%r9 0.00 : 123ade: 0f 0b ud2 0.00 : 123ae0: 0f 18 86 40 fe ff ff prefetchnta -0x1c0(%rsi) 0.00 : 123ae7: 0f 28 56 e8 movaps -0x18(%rsi),%xmm2 0.00 : 123aeb: 48 83 ea 40 sub $0x40,%rdx 0.00 : 123aef: 0f 28 5e d8 movaps -0x28(%rsi),%xmm3 0.00 : 123af3: 0f 28 66 c8 movaps -0x38(%rsi),%xmm4 0.00 : 123af7: 0f 28 6e b8 movaps -0x48(%rsi),%xmm5 0.00 : 123afb: 48 8d 76 c0 lea -0x40(%rsi),%rsi 0.00 : 123aff: 66 0f 3a 0f ca 08 palignr $0x8,%xmm2,%xmm1 0.00 : 123b05: 66 0f 3a 0f d3 08 palignr $0x8,%xmm3,%xmm2 0.00 : 123b0b: 66 0f 3a 0f dc 08 palignr $0x8,%xmm4,%xmm3 0.00 : 123b11: 66 0f 3a 0f e5 08 palignr $0x8,%xmm5,%xmm4 0.00 : 123b17: 0f 29 4f f0 movaps %xmm1,-0x10(%rdi) 0.00 : 123b1b: 0f 28 cd movaps %xmm5,%xmm1 0.00 : 123b1e: 0f 29 57 e0 movaps %xmm2,-0x20(%rdi) 0.00 : 123b22: 48 8d 7f c0 lea -0x40(%rdi),%rdi 0.00 : 123b26: 0f 29 5f 10 movaps %xmm3,0x10(%rdi) 0.00 : 123b2a: 72 08 jb 123b34 <__memmove_ssse3+0xf84> 0.00 : 123b2c: 0f 29 27 movaps %xmm4,(%rdi) 0.00 : 123b2f: 41 ff e1 jmpq *%r9 0.00 : 123b32: 0f 0b ud2 0.00 : 123b34: 0f 29 27 movaps %xmm4,(%rdi) 0.00 : 123b37: 48 8d 52 40 lea 0x40(%rdx),%rdx 0.00 : 123b3b: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 123b40: 4c 8d 1d 59 07 02 00 lea 0x20759(%rip),%r11 # 1442a0 0.00 : 123b47: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 123b4b: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 123b4f: ff e2 jmpq *%rdx 0.00 : 123b51: 0f 0b ud2 0.00 : 123b53: 66 66 66 66 2e 0f 1f data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 123b5a: 84 00 00 00 00 00 0.00 : 123b60: 4d 8d 89 27 00 00 00 lea 0x27(%r9),%r9 0.00 : 123b67: 48 39 ca cmp %rcx,%rdx 0.00 : 123b6a: 0f 28 4e f7 movaps -0x9(%rsi),%xmm1 0.00 : 123b6e: 72 07 jb 123b77 <__memmove_ssse3+0xfc7> 0.00 : 123b70: 4d 8d 89 f9 ff ff ff lea -0x7(%r9),%r9 0.00 : 123b77: 48 8d 52 c0 lea -0x40(%rdx),%rdx 0.00 : 123b7b: 41 ff e1 jmpq *%r9 0.00 : 123b7e: 0f 0b ud2 0.00 : 123b80: 0f 18 86 c0 01 00 00 prefetchnta 0x1c0(%rsi) 0.00 : 123b87: 48 83 ea 40 sub $0x40,%rdx 0.00 : 123b8b: 0f 28 56 07 movaps 0x7(%rsi),%xmm2 0.00 : 123b8f: 0f 28 5e 17 movaps 0x17(%rsi),%xmm3 0.00 : 123b93: 0f 28 66 27 movaps 0x27(%rsi),%xmm4 0.00 : 123b97: 0f 28 6e 37 movaps 0x37(%rsi),%xmm5 0.00 : 123b9b: 66 0f 6f f5 movdqa %xmm5,%xmm6 0.00 : 123b9f: 66 0f 3a 0f ec 09 palignr $0x9,%xmm4,%xmm5 0.00 : 123ba5: 48 8d 76 40 lea 0x40(%rsi),%rsi 0.00 : 123ba9: 66 0f 3a 0f e3 09 palignr $0x9,%xmm3,%xmm4 0.00 : 123baf: 66 0f 3a 0f da 09 palignr $0x9,%xmm2,%xmm3 0.00 : 123bb5: 48 8d 7f 40 lea 0x40(%rdi),%rdi 0.00 : 123bb9: 66 0f 3a 0f d1 09 palignr $0x9,%xmm1,%xmm2 0.00 : 123bbf: 66 0f 6f ce movdqa %xmm6,%xmm1 0.00 : 123bc3: 66 0f 7f 57 c0 movdqa %xmm2,-0x40(%rdi) 0.00 : 123bc8: 0f 29 5f d0 movaps %xmm3,-0x30(%rdi) 0.00 : 123bcc: 72 0d jb 123bdb <__memmove_ssse3+0x102b> 0.00 : 123bce: 0f 29 67 e0 movaps %xmm4,-0x20(%rdi) 0.00 : 123bd2: 0f 29 6f f0 movaps %xmm5,-0x10(%rdi) 0.00 : 123bd6: 41 ff e1 jmpq *%r9 0.00 : 123bd9: 0f 0b ud2 0.00 : 123bdb: 0f 29 67 e0 movaps %xmm4,-0x20(%rdi) 0.00 : 123bdf: 48 8d 52 40 lea 0x40(%rdx),%rdx 0.00 : 123be3: 0f 29 6f f0 movaps %xmm5,-0x10(%rdi) 0.00 : 123be7: 48 01 d7 add %rdx,%rdi 0.00 : 123bea: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 123bef: 48 01 d6 add %rdx,%rsi 0.00 : 123bf2: 4c 8d 1d a7 06 02 00 lea 0x206a7(%rip),%r11 # 1442a0 0.00 : 123bf9: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 123bfd: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 123c01: ff e2 jmpq *%rdx 0.00 : 123c03: 0f 0b ud2 0.00 : 123c05: 66 66 2e 0f 1f 84 00 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 123c0c: 00 00 00 00 0.00 : 123c10: 4d 8d 89 27 00 00 00 lea 0x27(%r9),%r9 0.00 : 123c17: 48 39 ca cmp %rcx,%rdx 0.00 : 123c1a: 0f 28 4e f7 movaps -0x9(%rsi),%xmm1 0.00 : 123c1e: 72 07 jb 123c27 <__memmove_ssse3+0x1077> 0.00 : 123c20: 4d 8d 89 f9 ff ff ff lea -0x7(%r9),%r9 0.00 : 123c27: 48 8d 52 c0 lea -0x40(%rdx),%rdx 0.00 : 123c2b: 41 ff e1 jmpq *%r9 0.00 : 123c2e: 0f 0b ud2 0.00 : 123c30: 0f 18 86 40 fe ff ff prefetchnta -0x1c0(%rsi) 0.00 : 123c37: 0f 28 56 e7 movaps -0x19(%rsi),%xmm2 0.00 : 123c3b: 48 83 ea 40 sub $0x40,%rdx 0.00 : 123c3f: 0f 28 5e d7 movaps -0x29(%rsi),%xmm3 0.00 : 123c43: 0f 28 66 c7 movaps -0x39(%rsi),%xmm4 0.00 : 123c47: 0f 28 6e b7 movaps -0x49(%rsi),%xmm5 0.00 : 123c4b: 48 8d 76 c0 lea -0x40(%rsi),%rsi 0.00 : 123c4f: 66 0f 3a 0f ca 09 palignr $0x9,%xmm2,%xmm1 0.00 : 123c55: 66 0f 3a 0f d3 09 palignr $0x9,%xmm3,%xmm2 0.00 : 123c5b: 66 0f 3a 0f dc 09 palignr $0x9,%xmm4,%xmm3 0.00 : 123c61: 66 0f 3a 0f e5 09 palignr $0x9,%xmm5,%xmm4 0.00 : 123c67: 0f 29 4f f0 movaps %xmm1,-0x10(%rdi) 0.00 : 123c6b: 0f 28 cd movaps %xmm5,%xmm1 0.00 : 123c6e: 0f 29 57 e0 movaps %xmm2,-0x20(%rdi) 0.00 : 123c72: 48 8d 7f c0 lea -0x40(%rdi),%rdi 0.00 : 123c76: 0f 29 5f 10 movaps %xmm3,0x10(%rdi) 0.00 : 123c7a: 72 08 jb 123c84 <__memmove_ssse3+0x10d4> 0.00 : 123c7c: 0f 29 27 movaps %xmm4,(%rdi) 0.00 : 123c7f: 41 ff e1 jmpq *%r9 0.00 : 123c82: 0f 0b ud2 0.00 : 123c84: 0f 29 27 movaps %xmm4,(%rdi) 0.00 : 123c87: 48 8d 52 40 lea 0x40(%rdx),%rdx 0.00 : 123c8b: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 123c90: 4c 8d 1d 09 06 02 00 lea 0x20609(%rip),%r11 # 1442a0 0.00 : 123c97: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 123c9b: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 123c9f: ff e2 jmpq *%rdx 0.00 : 123ca1: 0f 0b ud2 0.00 : 123ca3: 66 66 66 66 2e 0f 1f data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 123caa: 84 00 00 00 00 00 0.00 : 123cb0: 4d 8d 89 27 00 00 00 lea 0x27(%r9),%r9 0.00 : 123cb7: 48 39 ca cmp %rcx,%rdx 0.00 : 123cba: 0f 28 4e f6 movaps -0xa(%rsi),%xmm1 0.00 : 123cbe: 72 07 jb 123cc7 <__memmove_ssse3+0x1117> 0.00 : 123cc0: 4d 8d 89 f9 ff ff ff lea -0x7(%r9),%r9 0.00 : 123cc7: 48 8d 52 c0 lea -0x40(%rdx),%rdx 0.00 : 123ccb: 41 ff e1 jmpq *%r9 0.00 : 123cce: 0f 0b ud2 0.00 : 123cd0: 0f 18 86 c0 01 00 00 prefetchnta 0x1c0(%rsi) 0.00 : 123cd7: 48 83 ea 40 sub $0x40,%rdx 0.00 : 123cdb: 0f 28 56 06 movaps 0x6(%rsi),%xmm2 0.00 : 123cdf: 0f 28 5e 16 movaps 0x16(%rsi),%xmm3 0.00 : 123ce3: 0f 28 66 26 movaps 0x26(%rsi),%xmm4 0.00 : 123ce7: 0f 28 6e 36 movaps 0x36(%rsi),%xmm5 0.00 : 123ceb: 66 0f 6f f5 movdqa %xmm5,%xmm6 0.00 : 123cef: 66 0f 3a 0f ec 0a palignr $0xa,%xmm4,%xmm5 0.00 : 123cf5: 48 8d 76 40 lea 0x40(%rsi),%rsi 0.00 : 123cf9: 66 0f 3a 0f e3 0a palignr $0xa,%xmm3,%xmm4 0.00 : 123cff: 66 0f 3a 0f da 0a palignr $0xa,%xmm2,%xmm3 0.00 : 123d05: 48 8d 7f 40 lea 0x40(%rdi),%rdi 0.00 : 123d09: 66 0f 3a 0f d1 0a palignr $0xa,%xmm1,%xmm2 0.00 : 123d0f: 66 0f 6f ce movdqa %xmm6,%xmm1 0.00 : 123d13: 66 0f 7f 57 c0 movdqa %xmm2,-0x40(%rdi) 0.00 : 123d18: 0f 29 5f d0 movaps %xmm3,-0x30(%rdi) 0.00 : 123d1c: 72 0d jb 123d2b <__memmove_ssse3+0x117b> 0.00 : 123d1e: 0f 29 67 e0 movaps %xmm4,-0x20(%rdi) 0.00 : 123d22: 0f 29 6f f0 movaps %xmm5,-0x10(%rdi) 0.00 : 123d26: 41 ff e1 jmpq *%r9 0.00 : 123d29: 0f 0b ud2 0.00 : 123d2b: 0f 29 67 e0 movaps %xmm4,-0x20(%rdi) 0.00 : 123d2f: 48 8d 52 40 lea 0x40(%rdx),%rdx 0.00 : 123d33: 0f 29 6f f0 movaps %xmm5,-0x10(%rdi) 0.00 : 123d37: 48 01 d7 add %rdx,%rdi 0.00 : 123d3a: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 123d3f: 48 01 d6 add %rdx,%rsi 0.00 : 123d42: 4c 8d 1d 57 05 02 00 lea 0x20557(%rip),%r11 # 1442a0 0.00 : 123d49: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 123d4d: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 123d51: ff e2 jmpq *%rdx 0.00 : 123d53: 0f 0b ud2 0.00 : 123d55: 66 66 2e 0f 1f 84 00 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 123d5c: 00 00 00 00 0.00 : 123d60: 4d 8d 89 27 00 00 00 lea 0x27(%r9),%r9 0.00 : 123d67: 48 39 ca cmp %rcx,%rdx 0.00 : 123d6a: 0f 28 4e f6 movaps -0xa(%rsi),%xmm1 0.00 : 123d6e: 72 07 jb 123d77 <__memmove_ssse3+0x11c7> 0.00 : 123d70: 4d 8d 89 f9 ff ff ff lea -0x7(%r9),%r9 0.00 : 123d77: 48 8d 52 c0 lea -0x40(%rdx),%rdx 0.00 : 123d7b: 41 ff e1 jmpq *%r9 0.00 : 123d7e: 0f 0b ud2 0.00 : 123d80: 0f 18 86 40 fe ff ff prefetchnta -0x1c0(%rsi) 0.00 : 123d87: 0f 28 56 e6 movaps -0x1a(%rsi),%xmm2 0.00 : 123d8b: 48 83 ea 40 sub $0x40,%rdx 0.00 : 123d8f: 0f 28 5e d6 movaps -0x2a(%rsi),%xmm3 0.00 : 123d93: 0f 28 66 c6 movaps -0x3a(%rsi),%xmm4 0.00 : 123d97: 0f 28 6e b6 movaps -0x4a(%rsi),%xmm5 0.00 : 123d9b: 48 8d 76 c0 lea -0x40(%rsi),%rsi 0.00 : 123d9f: 66 0f 3a 0f ca 0a palignr $0xa,%xmm2,%xmm1 0.00 : 123da5: 66 0f 3a 0f d3 0a palignr $0xa,%xmm3,%xmm2 0.00 : 123dab: 66 0f 3a 0f dc 0a palignr $0xa,%xmm4,%xmm3 0.00 : 123db1: 66 0f 3a 0f e5 0a palignr $0xa,%xmm5,%xmm4 0.00 : 123db7: 0f 29 4f f0 movaps %xmm1,-0x10(%rdi) 0.00 : 123dbb: 0f 28 cd movaps %xmm5,%xmm1 0.00 : 123dbe: 0f 29 57 e0 movaps %xmm2,-0x20(%rdi) 0.00 : 123dc2: 48 8d 7f c0 lea -0x40(%rdi),%rdi 0.00 : 123dc6: 0f 29 5f 10 movaps %xmm3,0x10(%rdi) 0.00 : 123dca: 72 08 jb 123dd4 <__memmove_ssse3+0x1224> 0.00 : 123dcc: 0f 29 27 movaps %xmm4,(%rdi) 0.00 : 123dcf: 41 ff e1 jmpq *%r9 0.00 : 123dd2: 0f 0b ud2 0.00 : 123dd4: 0f 29 27 movaps %xmm4,(%rdi) 0.00 : 123dd7: 48 8d 52 40 lea 0x40(%rdx),%rdx 0.00 : 123ddb: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 123de0: 4c 8d 1d b9 04 02 00 lea 0x204b9(%rip),%r11 # 1442a0 0.00 : 123de7: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 123deb: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 123def: ff e2 jmpq *%rdx 0.00 : 123df1: 0f 0b ud2 0.00 : 123df3: 66 66 66 66 2e 0f 1f data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 123dfa: 84 00 00 00 00 00 0.00 : 123e00: 4d 8d 89 27 00 00 00 lea 0x27(%r9),%r9 0.00 : 123e07: 48 39 ca cmp %rcx,%rdx 0.00 : 123e0a: 0f 28 4e f5 movaps -0xb(%rsi),%xmm1 0.00 : 123e0e: 72 07 jb 123e17 <__memmove_ssse3+0x1267> 0.00 : 123e10: 4d 8d 89 f9 ff ff ff lea -0x7(%r9),%r9 0.00 : 123e17: 48 8d 52 c0 lea -0x40(%rdx),%rdx 0.00 : 123e1b: 41 ff e1 jmpq *%r9 0.00 : 123e1e: 0f 0b ud2 0.00 : 123e20: 0f 18 86 c0 01 00 00 prefetchnta 0x1c0(%rsi) 0.00 : 123e27: 48 83 ea 40 sub $0x40,%rdx 0.00 : 123e2b: 0f 28 56 05 movaps 0x5(%rsi),%xmm2 0.00 : 123e2f: 0f 28 5e 15 movaps 0x15(%rsi),%xmm3 0.00 : 123e33: 0f 28 66 25 movaps 0x25(%rsi),%xmm4 0.00 : 123e37: 0f 28 6e 35 movaps 0x35(%rsi),%xmm5 0.00 : 123e3b: 66 0f 6f f5 movdqa %xmm5,%xmm6 0.00 : 123e3f: 66 0f 3a 0f ec 0b palignr $0xb,%xmm4,%xmm5 0.00 : 123e45: 48 8d 76 40 lea 0x40(%rsi),%rsi 0.00 : 123e49: 66 0f 3a 0f e3 0b palignr $0xb,%xmm3,%xmm4 0.00 : 123e4f: 66 0f 3a 0f da 0b palignr $0xb,%xmm2,%xmm3 0.00 : 123e55: 48 8d 7f 40 lea 0x40(%rdi),%rdi 0.00 : 123e59: 66 0f 3a 0f d1 0b palignr $0xb,%xmm1,%xmm2 0.00 : 123e5f: 66 0f 6f ce movdqa %xmm6,%xmm1 0.00 : 123e63: 66 0f 7f 57 c0 movdqa %xmm2,-0x40(%rdi) 0.00 : 123e68: 0f 29 5f d0 movaps %xmm3,-0x30(%rdi) 0.00 : 123e6c: 72 0d jb 123e7b <__memmove_ssse3+0x12cb> 0.00 : 123e6e: 0f 29 67 e0 movaps %xmm4,-0x20(%rdi) 0.00 : 123e72: 0f 29 6f f0 movaps %xmm5,-0x10(%rdi) 0.00 : 123e76: 41 ff e1 jmpq *%r9 0.00 : 123e79: 0f 0b ud2 0.00 : 123e7b: 0f 29 67 e0 movaps %xmm4,-0x20(%rdi) 0.00 : 123e7f: 48 8d 52 40 lea 0x40(%rdx),%rdx 0.00 : 123e83: 0f 29 6f f0 movaps %xmm5,-0x10(%rdi) 0.00 : 123e87: 48 01 d7 add %rdx,%rdi 0.00 : 123e8a: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 123e8f: 48 01 d6 add %rdx,%rsi 0.00 : 123e92: 4c 8d 1d 07 04 02 00 lea 0x20407(%rip),%r11 # 1442a0 0.00 : 123e99: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 123e9d: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 123ea1: ff e2 jmpq *%rdx 0.00 : 123ea3: 0f 0b ud2 0.00 : 123ea5: 66 66 2e 0f 1f 84 00 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 123eac: 00 00 00 00 0.00 : 123eb0: 4d 8d 89 27 00 00 00 lea 0x27(%r9),%r9 0.00 : 123eb7: 48 39 ca cmp %rcx,%rdx 0.00 : 123eba: 0f 28 4e f5 movaps -0xb(%rsi),%xmm1 0.00 : 123ebe: 72 07 jb 123ec7 <__memmove_ssse3+0x1317> 0.00 : 123ec0: 4d 8d 89 f9 ff ff ff lea -0x7(%r9),%r9 0.00 : 123ec7: 48 8d 52 c0 lea -0x40(%rdx),%rdx 0.00 : 123ecb: 41 ff e1 jmpq *%r9 0.00 : 123ece: 0f 0b ud2 0.00 : 123ed0: 0f 18 86 40 fe ff ff prefetchnta -0x1c0(%rsi) 0.00 : 123ed7: 0f 28 56 e5 movaps -0x1b(%rsi),%xmm2 0.00 : 123edb: 48 83 ea 40 sub $0x40,%rdx 0.00 : 123edf: 0f 28 5e d5 movaps -0x2b(%rsi),%xmm3 0.00 : 123ee3: 0f 28 66 c5 movaps -0x3b(%rsi),%xmm4 0.00 : 123ee7: 0f 28 6e b5 movaps -0x4b(%rsi),%xmm5 0.00 : 123eeb: 48 8d 76 c0 lea -0x40(%rsi),%rsi 0.00 : 123eef: 66 0f 3a 0f ca 0b palignr $0xb,%xmm2,%xmm1 0.00 : 123ef5: 66 0f 3a 0f d3 0b palignr $0xb,%xmm3,%xmm2 0.00 : 123efb: 66 0f 3a 0f dc 0b palignr $0xb,%xmm4,%xmm3 0.00 : 123f01: 66 0f 3a 0f e5 0b palignr $0xb,%xmm5,%xmm4 0.00 : 123f07: 0f 29 4f f0 movaps %xmm1,-0x10(%rdi) 0.00 : 123f0b: 0f 28 cd movaps %xmm5,%xmm1 0.00 : 123f0e: 0f 29 57 e0 movaps %xmm2,-0x20(%rdi) 0.00 : 123f12: 48 8d 7f c0 lea -0x40(%rdi),%rdi 0.00 : 123f16: 0f 29 5f 10 movaps %xmm3,0x10(%rdi) 0.00 : 123f1a: 72 08 jb 123f24 <__memmove_ssse3+0x1374> 0.00 : 123f1c: 0f 29 27 movaps %xmm4,(%rdi) 0.00 : 123f1f: 41 ff e1 jmpq *%r9 0.00 : 123f22: 0f 0b ud2 0.00 : 123f24: 0f 29 27 movaps %xmm4,(%rdi) 0.00 : 123f27: 48 8d 52 40 lea 0x40(%rdx),%rdx 0.00 : 123f2b: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 123f30: 4c 8d 1d 69 03 02 00 lea 0x20369(%rip),%r11 # 1442a0 0.00 : 123f37: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 123f3b: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 123f3f: ff e2 jmpq *%rdx 0.00 : 123f41: 0f 0b ud2 0.00 : 123f43: 66 66 66 66 2e 0f 1f data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 123f4a: 84 00 00 00 00 00 0.00 : 123f50: 4d 8d 89 27 00 00 00 lea 0x27(%r9),%r9 0.00 : 123f57: 48 39 ca cmp %rcx,%rdx 0.00 : 123f5a: 0f 28 4e f4 movaps -0xc(%rsi),%xmm1 0.00 : 123f5e: 72 07 jb 123f67 <__memmove_ssse3+0x13b7> 0.00 : 123f60: 4d 8d 89 f9 ff ff ff lea -0x7(%r9),%r9 0.00 : 123f67: 48 8d 52 c0 lea -0x40(%rdx),%rdx 0.00 : 123f6b: 41 ff e1 jmpq *%r9 0.00 : 123f6e: 0f 0b ud2 0.00 : 123f70: 0f 18 86 c0 01 00 00 prefetchnta 0x1c0(%rsi) 0.00 : 123f77: 48 83 ea 40 sub $0x40,%rdx 0.00 : 123f7b: 0f 28 56 04 movaps 0x4(%rsi),%xmm2 0.00 : 123f7f: 0f 28 5e 14 movaps 0x14(%rsi),%xmm3 0.00 : 123f83: 0f 28 66 24 movaps 0x24(%rsi),%xmm4 0.00 : 123f87: 0f 28 6e 34 movaps 0x34(%rsi),%xmm5 0.00 : 123f8b: 66 0f 6f f5 movdqa %xmm5,%xmm6 0.00 : 123f8f: 66 0f 3a 0f ec 0c palignr $0xc,%xmm4,%xmm5 0.00 : 123f95: 48 8d 76 40 lea 0x40(%rsi),%rsi 0.00 : 123f99: 66 0f 3a 0f e3 0c palignr $0xc,%xmm3,%xmm4 0.00 : 123f9f: 66 0f 3a 0f da 0c palignr $0xc,%xmm2,%xmm3 0.00 : 123fa5: 48 8d 7f 40 lea 0x40(%rdi),%rdi 0.00 : 123fa9: 66 0f 3a 0f d1 0c palignr $0xc,%xmm1,%xmm2 0.00 : 123faf: 66 0f 6f ce movdqa %xmm6,%xmm1 0.00 : 123fb3: 66 0f 7f 57 c0 movdqa %xmm2,-0x40(%rdi) 0.00 : 123fb8: 0f 29 5f d0 movaps %xmm3,-0x30(%rdi) 0.00 : 123fbc: 72 0d jb 123fcb <__memmove_ssse3+0x141b> 0.00 : 123fbe: 0f 29 67 e0 movaps %xmm4,-0x20(%rdi) 0.00 : 123fc2: 0f 29 6f f0 movaps %xmm5,-0x10(%rdi) 0.00 : 123fc6: 41 ff e1 jmpq *%r9 0.00 : 123fc9: 0f 0b ud2 0.00 : 123fcb: 0f 29 67 e0 movaps %xmm4,-0x20(%rdi) 0.00 : 123fcf: 48 8d 52 40 lea 0x40(%rdx),%rdx 0.00 : 123fd3: 0f 29 6f f0 movaps %xmm5,-0x10(%rdi) 0.00 : 123fd7: 48 01 d7 add %rdx,%rdi 0.00 : 123fda: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 123fdf: 48 01 d6 add %rdx,%rsi 0.00 : 123fe2: 4c 8d 1d b7 02 02 00 lea 0x202b7(%rip),%r11 # 1442a0 0.00 : 123fe9: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 123fed: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 123ff1: ff e2 jmpq *%rdx 0.00 : 123ff3: 0f 0b ud2 0.00 : 123ff5: 66 66 2e 0f 1f 84 00 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 123ffc: 00 00 00 00 0.00 : 124000: 4d 8d 89 27 00 00 00 lea 0x27(%r9),%r9 0.00 : 124007: 48 39 ca cmp %rcx,%rdx 0.00 : 12400a: 0f 28 4e f4 movaps -0xc(%rsi),%xmm1 0.00 : 12400e: 72 07 jb 124017 <__memmove_ssse3+0x1467> 0.00 : 124010: 4d 8d 89 f9 ff ff ff lea -0x7(%r9),%r9 0.00 : 124017: 48 8d 52 c0 lea -0x40(%rdx),%rdx 0.00 : 12401b: 41 ff e1 jmpq *%r9 0.00 : 12401e: 0f 0b ud2 0.00 : 124020: 0f 18 86 40 fe ff ff prefetchnta -0x1c0(%rsi) 0.00 : 124027: 0f 28 56 e4 movaps -0x1c(%rsi),%xmm2 0.00 : 12402b: 48 83 ea 40 sub $0x40,%rdx 0.00 : 12402f: 0f 28 5e d4 movaps -0x2c(%rsi),%xmm3 0.00 : 124033: 0f 28 66 c4 movaps -0x3c(%rsi),%xmm4 0.00 : 124037: 0f 28 6e b4 movaps -0x4c(%rsi),%xmm5 0.00 : 12403b: 48 8d 76 c0 lea -0x40(%rsi),%rsi 0.00 : 12403f: 66 0f 3a 0f ca 0c palignr $0xc,%xmm2,%xmm1 0.00 : 124045: 66 0f 3a 0f d3 0c palignr $0xc,%xmm3,%xmm2 0.00 : 12404b: 66 0f 3a 0f dc 0c palignr $0xc,%xmm4,%xmm3 0.00 : 124051: 66 0f 3a 0f e5 0c palignr $0xc,%xmm5,%xmm4 0.00 : 124057: 0f 29 4f f0 movaps %xmm1,-0x10(%rdi) 0.00 : 12405b: 0f 28 cd movaps %xmm5,%xmm1 0.00 : 12405e: 0f 29 57 e0 movaps %xmm2,-0x20(%rdi) 0.00 : 124062: 48 8d 7f c0 lea -0x40(%rdi),%rdi 0.00 : 124066: 0f 29 5f 10 movaps %xmm3,0x10(%rdi) 0.00 : 12406a: 72 08 jb 124074 <__memmove_ssse3+0x14c4> 0.00 : 12406c: 0f 29 27 movaps %xmm4,(%rdi) 0.00 : 12406f: 41 ff e1 jmpq *%r9 0.00 : 124072: 0f 0b ud2 0.00 : 124074: 0f 29 27 movaps %xmm4,(%rdi) 0.00 : 124077: 48 8d 52 40 lea 0x40(%rdx),%rdx 0.00 : 12407b: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 124080: 4c 8d 1d 19 02 02 00 lea 0x20219(%rip),%r11 # 1442a0 0.00 : 124087: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 12408b: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 12408f: ff e2 jmpq *%rdx 0.00 : 124091: 0f 0b ud2 0.00 : 124093: 66 66 66 66 2e 0f 1f data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 12409a: 84 00 00 00 00 00 0.00 : 1240a0: 4d 8d 89 27 00 00 00 lea 0x27(%r9),%r9 0.00 : 1240a7: 48 39 ca cmp %rcx,%rdx 0.00 : 1240aa: 0f 28 4e f3 movaps -0xd(%rsi),%xmm1 0.00 : 1240ae: 72 07 jb 1240b7 <__memmove_ssse3+0x1507> 0.00 : 1240b0: 4d 8d 89 f9 ff ff ff lea -0x7(%r9),%r9 0.00 : 1240b7: 48 8d 52 c0 lea -0x40(%rdx),%rdx 0.00 : 1240bb: 41 ff e1 jmpq *%r9 0.00 : 1240be: 0f 0b ud2 0.00 : 1240c0: 0f 18 86 c0 01 00 00 prefetchnta 0x1c0(%rsi) 0.00 : 1240c7: 48 83 ea 40 sub $0x40,%rdx 0.00 : 1240cb: 0f 28 56 03 movaps 0x3(%rsi),%xmm2 0.00 : 1240cf: 0f 28 5e 13 movaps 0x13(%rsi),%xmm3 0.00 : 1240d3: 0f 28 66 23 movaps 0x23(%rsi),%xmm4 0.00 : 1240d7: 0f 28 6e 33 movaps 0x33(%rsi),%xmm5 0.00 : 1240db: 66 0f 6f f5 movdqa %xmm5,%xmm6 0.00 : 1240df: 66 0f 3a 0f ec 0d palignr $0xd,%xmm4,%xmm5 0.00 : 1240e5: 48 8d 76 40 lea 0x40(%rsi),%rsi 0.00 : 1240e9: 66 0f 3a 0f e3 0d palignr $0xd,%xmm3,%xmm4 0.00 : 1240ef: 66 0f 3a 0f da 0d palignr $0xd,%xmm2,%xmm3 0.00 : 1240f5: 48 8d 7f 40 lea 0x40(%rdi),%rdi 0.00 : 1240f9: 66 0f 3a 0f d1 0d palignr $0xd,%xmm1,%xmm2 0.00 : 1240ff: 66 0f 6f ce movdqa %xmm6,%xmm1 0.00 : 124103: 66 0f 7f 57 c0 movdqa %xmm2,-0x40(%rdi) 0.00 : 124108: 0f 29 5f d0 movaps %xmm3,-0x30(%rdi) 0.00 : 12410c: 72 0d jb 12411b <__memmove_ssse3+0x156b> 0.00 : 12410e: 0f 29 67 e0 movaps %xmm4,-0x20(%rdi) 0.00 : 124112: 0f 29 6f f0 movaps %xmm5,-0x10(%rdi) 0.00 : 124116: 41 ff e1 jmpq *%r9 0.00 : 124119: 0f 0b ud2 0.00 : 12411b: 0f 29 67 e0 movaps %xmm4,-0x20(%rdi) 0.00 : 12411f: 48 8d 52 40 lea 0x40(%rdx),%rdx 0.00 : 124123: 0f 29 6f f0 movaps %xmm5,-0x10(%rdi) 0.00 : 124127: 48 01 d7 add %rdx,%rdi 0.00 : 12412a: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 12412f: 48 01 d6 add %rdx,%rsi 0.00 : 124132: 4c 8d 1d 67 01 02 00 lea 0x20167(%rip),%r11 # 1442a0 0.00 : 124139: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 12413d: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 124141: ff e2 jmpq *%rdx 0.00 : 124143: 0f 0b ud2 0.00 : 124145: 66 66 2e 0f 1f 84 00 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 12414c: 00 00 00 00 0.00 : 124150: 4d 8d 89 27 00 00 00 lea 0x27(%r9),%r9 0.00 : 124157: 48 39 ca cmp %rcx,%rdx 0.00 : 12415a: 0f 28 4e f3 movaps -0xd(%rsi),%xmm1 0.00 : 12415e: 72 07 jb 124167 <__memmove_ssse3+0x15b7> 0.00 : 124160: 4d 8d 89 f9 ff ff ff lea -0x7(%r9),%r9 0.00 : 124167: 48 8d 52 c0 lea -0x40(%rdx),%rdx 0.00 : 12416b: 41 ff e1 jmpq *%r9 0.00 : 12416e: 0f 0b ud2 0.00 : 124170: 0f 18 86 40 fe ff ff prefetchnta -0x1c0(%rsi) 0.00 : 124177: 0f 28 56 e3 movaps -0x1d(%rsi),%xmm2 0.00 : 12417b: 48 83 ea 40 sub $0x40,%rdx 0.00 : 12417f: 0f 28 5e d3 movaps -0x2d(%rsi),%xmm3 0.00 : 124183: 0f 28 66 c3 movaps -0x3d(%rsi),%xmm4 0.00 : 124187: 0f 28 6e b3 movaps -0x4d(%rsi),%xmm5 0.00 : 12418b: 48 8d 76 c0 lea -0x40(%rsi),%rsi 0.00 : 12418f: 66 0f 3a 0f ca 0d palignr $0xd,%xmm2,%xmm1 0.00 : 124195: 66 0f 3a 0f d3 0d palignr $0xd,%xmm3,%xmm2 0.00 : 12419b: 66 0f 3a 0f dc 0d palignr $0xd,%xmm4,%xmm3 0.00 : 1241a1: 66 0f 3a 0f e5 0d palignr $0xd,%xmm5,%xmm4 0.00 : 1241a7: 0f 29 4f f0 movaps %xmm1,-0x10(%rdi) 0.00 : 1241ab: 0f 28 cd movaps %xmm5,%xmm1 0.00 : 1241ae: 0f 29 57 e0 movaps %xmm2,-0x20(%rdi) 0.00 : 1241b2: 48 8d 7f c0 lea -0x40(%rdi),%rdi 0.00 : 1241b6: 0f 29 5f 10 movaps %xmm3,0x10(%rdi) 0.00 : 1241ba: 72 08 jb 1241c4 <__memmove_ssse3+0x1614> 0.00 : 1241bc: 0f 29 27 movaps %xmm4,(%rdi) 0.00 : 1241bf: 41 ff e1 jmpq *%r9 0.00 : 1241c2: 0f 0b ud2 0.00 : 1241c4: 0f 29 27 movaps %xmm4,(%rdi) 0.00 : 1241c7: 48 8d 52 40 lea 0x40(%rdx),%rdx 0.00 : 1241cb: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 1241d0: 4c 8d 1d c9 00 02 00 lea 0x200c9(%rip),%r11 # 1442a0 0.00 : 1241d7: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 1241db: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 1241df: ff e2 jmpq *%rdx 0.00 : 1241e1: 0f 0b ud2 0.00 : 1241e3: 66 66 66 66 2e 0f 1f data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 1241ea: 84 00 00 00 00 00 0.00 : 1241f0: 4d 8d 89 27 00 00 00 lea 0x27(%r9),%r9 0.00 : 1241f7: 48 39 ca cmp %rcx,%rdx 0.00 : 1241fa: 0f 28 4e f2 movaps -0xe(%rsi),%xmm1 0.00 : 1241fe: 72 07 jb 124207 <__memmove_ssse3+0x1657> 0.00 : 124200: 4d 8d 89 f9 ff ff ff lea -0x7(%r9),%r9 0.00 : 124207: 48 8d 52 c0 lea -0x40(%rdx),%rdx 0.00 : 12420b: 41 ff e1 jmpq *%r9 0.00 : 12420e: 0f 0b ud2 0.00 : 124210: 0f 18 86 c0 01 00 00 prefetchnta 0x1c0(%rsi) 0.00 : 124217: 48 83 ea 40 sub $0x40,%rdx 0.00 : 12421b: 0f 28 56 02 movaps 0x2(%rsi),%xmm2 0.00 : 12421f: 0f 28 5e 12 movaps 0x12(%rsi),%xmm3 0.00 : 124223: 0f 28 66 22 movaps 0x22(%rsi),%xmm4 0.00 : 124227: 0f 28 6e 32 movaps 0x32(%rsi),%xmm5 0.00 : 12422b: 66 0f 6f f5 movdqa %xmm5,%xmm6 0.00 : 12422f: 66 0f 3a 0f ec 0e palignr $0xe,%xmm4,%xmm5 0.00 : 124235: 48 8d 76 40 lea 0x40(%rsi),%rsi 0.00 : 124239: 66 0f 3a 0f e3 0e palignr $0xe,%xmm3,%xmm4 0.00 : 12423f: 66 0f 3a 0f da 0e palignr $0xe,%xmm2,%xmm3 0.00 : 124245: 48 8d 7f 40 lea 0x40(%rdi),%rdi 0.00 : 124249: 66 0f 3a 0f d1 0e palignr $0xe,%xmm1,%xmm2 0.00 : 12424f: 66 0f 6f ce movdqa %xmm6,%xmm1 0.00 : 124253: 66 0f 7f 57 c0 movdqa %xmm2,-0x40(%rdi) 0.00 : 124258: 0f 29 5f d0 movaps %xmm3,-0x30(%rdi) 0.00 : 12425c: 72 0d jb 12426b <__memmove_ssse3+0x16bb> 0.00 : 12425e: 0f 29 67 e0 movaps %xmm4,-0x20(%rdi) 0.00 : 124262: 0f 29 6f f0 movaps %xmm5,-0x10(%rdi) 0.00 : 124266: 41 ff e1 jmpq *%r9 0.00 : 124269: 0f 0b ud2 0.00 : 12426b: 0f 29 67 e0 movaps %xmm4,-0x20(%rdi) 0.00 : 12426f: 48 8d 52 40 lea 0x40(%rdx),%rdx 0.00 : 124273: 0f 29 6f f0 movaps %xmm5,-0x10(%rdi) 0.00 : 124277: 48 01 d7 add %rdx,%rdi 0.00 : 12427a: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 12427f: 48 01 d6 add %rdx,%rsi 0.00 : 124282: 4c 8d 1d 17 00 02 00 lea 0x20017(%rip),%r11 # 1442a0 0.00 : 124289: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 12428d: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 124291: ff e2 jmpq *%rdx 0.00 : 124293: 0f 0b ud2 0.00 : 124295: 66 66 2e 0f 1f 84 00 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 12429c: 00 00 00 00 0.00 : 1242a0: 4d 8d 89 27 00 00 00 lea 0x27(%r9),%r9 0.00 : 1242a7: 48 39 ca cmp %rcx,%rdx 0.00 : 1242aa: 0f 28 4e f2 movaps -0xe(%rsi),%xmm1 0.00 : 1242ae: 72 07 jb 1242b7 <__memmove_ssse3+0x1707> 0.00 : 1242b0: 4d 8d 89 f9 ff ff ff lea -0x7(%r9),%r9 0.00 : 1242b7: 48 8d 52 c0 lea -0x40(%rdx),%rdx 0.00 : 1242bb: 41 ff e1 jmpq *%r9 0.00 : 1242be: 0f 0b ud2 0.00 : 1242c0: 0f 18 86 40 fe ff ff prefetchnta -0x1c0(%rsi) 0.00 : 1242c7: 0f 28 56 e2 movaps -0x1e(%rsi),%xmm2 0.00 : 1242cb: 48 83 ea 40 sub $0x40,%rdx 0.00 : 1242cf: 0f 28 5e d2 movaps -0x2e(%rsi),%xmm3 0.00 : 1242d3: 0f 28 66 c2 movaps -0x3e(%rsi),%xmm4 0.00 : 1242d7: 0f 28 6e b2 movaps -0x4e(%rsi),%xmm5 0.00 : 1242db: 48 8d 76 c0 lea -0x40(%rsi),%rsi 0.00 : 1242df: 66 0f 3a 0f ca 0e palignr $0xe,%xmm2,%xmm1 0.00 : 1242e5: 66 0f 3a 0f d3 0e palignr $0xe,%xmm3,%xmm2 0.00 : 1242eb: 66 0f 3a 0f dc 0e palignr $0xe,%xmm4,%xmm3 0.00 : 1242f1: 66 0f 3a 0f e5 0e palignr $0xe,%xmm5,%xmm4 0.00 : 1242f7: 0f 29 4f f0 movaps %xmm1,-0x10(%rdi) 0.00 : 1242fb: 0f 28 cd movaps %xmm5,%xmm1 0.00 : 1242fe: 0f 29 57 e0 movaps %xmm2,-0x20(%rdi) 0.00 : 124302: 48 8d 7f c0 lea -0x40(%rdi),%rdi 0.00 : 124306: 0f 29 5f 10 movaps %xmm3,0x10(%rdi) 0.00 : 12430a: 72 08 jb 124314 <__memmove_ssse3+0x1764> 0.00 : 12430c: 0f 29 27 movaps %xmm4,(%rdi) 0.00 : 12430f: 41 ff e1 jmpq *%r9 0.00 : 124312: 0f 0b ud2 0.00 : 124314: 0f 29 27 movaps %xmm4,(%rdi) 0.00 : 124317: 48 8d 52 40 lea 0x40(%rdx),%rdx 0.00 : 12431b: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 124320: 4c 8d 1d 79 ff 01 00 lea 0x1ff79(%rip),%r11 # 1442a0 0.00 : 124327: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 12432b: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 12432f: ff e2 jmpq *%rdx 0.00 : 124331: 0f 0b ud2 0.00 : 124333: 66 66 66 66 2e 0f 1f data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 12433a: 84 00 00 00 00 00 0.00 : 124340: 4d 8d 89 27 00 00 00 lea 0x27(%r9),%r9 0.00 : 124347: 48 39 ca cmp %rcx,%rdx 0.00 : 12434a: 0f 28 4e f1 movaps -0xf(%rsi),%xmm1 0.00 : 12434e: 72 07 jb 124357 <__memmove_ssse3+0x17a7> 0.00 : 124350: 4d 8d 89 f9 ff ff ff lea -0x7(%r9),%r9 0.00 : 124357: 48 8d 52 c0 lea -0x40(%rdx),%rdx 0.00 : 12435b: 41 ff e1 jmpq *%r9 0.00 : 12435e: 0f 0b ud2 0.00 : 124360: 0f 18 86 c0 01 00 00 prefetchnta 0x1c0(%rsi) 0.00 : 124367: 48 83 ea 40 sub $0x40,%rdx 0.00 : 12436b: 0f 28 56 01 movaps 0x1(%rsi),%xmm2 0.00 : 12436f: 0f 28 5e 11 movaps 0x11(%rsi),%xmm3 0.00 : 124373: 0f 28 66 21 movaps 0x21(%rsi),%xmm4 0.00 : 124377: 0f 28 6e 31 movaps 0x31(%rsi),%xmm5 0.00 : 12437b: 66 0f 6f f5 movdqa %xmm5,%xmm6 0.00 : 12437f: 66 0f 3a 0f ec 0f palignr $0xf,%xmm4,%xmm5 0.00 : 124385: 48 8d 76 40 lea 0x40(%rsi),%rsi 0.00 : 124389: 66 0f 3a 0f e3 0f palignr $0xf,%xmm3,%xmm4 0.00 : 12438f: 66 0f 3a 0f da 0f palignr $0xf,%xmm2,%xmm3 0.00 : 124395: 48 8d 7f 40 lea 0x40(%rdi),%rdi 0.00 : 124399: 66 0f 3a 0f d1 0f palignr $0xf,%xmm1,%xmm2 0.00 : 12439f: 66 0f 6f ce movdqa %xmm6,%xmm1 0.00 : 1243a3: 66 0f 7f 57 c0 movdqa %xmm2,-0x40(%rdi) 0.00 : 1243a8: 0f 29 5f d0 movaps %xmm3,-0x30(%rdi) 0.00 : 1243ac: 72 0d jb 1243bb <__memmove_ssse3+0x180b> 0.00 : 1243ae: 0f 29 67 e0 movaps %xmm4,-0x20(%rdi) 0.00 : 1243b2: 0f 29 6f f0 movaps %xmm5,-0x10(%rdi) 0.00 : 1243b6: 41 ff e1 jmpq *%r9 0.00 : 1243b9: 0f 0b ud2 0.00 : 1243bb: 0f 29 67 e0 movaps %xmm4,-0x20(%rdi) 0.00 : 1243bf: 48 8d 52 40 lea 0x40(%rdx),%rdx 0.00 : 1243c3: 0f 29 6f f0 movaps %xmm5,-0x10(%rdi) 0.00 : 1243c7: 48 01 d7 add %rdx,%rdi 0.00 : 1243ca: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 1243cf: 48 01 d6 add %rdx,%rsi 0.00 : 1243d2: 4c 8d 1d c7 fe 01 00 lea 0x1fec7(%rip),%r11 # 1442a0 0.00 : 1243d9: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 1243dd: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 1243e1: ff e2 jmpq *%rdx 0.00 : 1243e3: 0f 0b ud2 0.00 : 1243e5: 66 66 2e 0f 1f 84 00 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 1243ec: 00 00 00 00 0.00 : 1243f0: 4d 8d 89 27 00 00 00 lea 0x27(%r9),%r9 0.00 : 1243f7: 48 39 ca cmp %rcx,%rdx 0.00 : 1243fa: 0f 28 4e f1 movaps -0xf(%rsi),%xmm1 0.00 : 1243fe: 72 07 jb 124407 <__memmove_ssse3+0x1857> 0.00 : 124400: 4d 8d 89 f9 ff ff ff lea -0x7(%r9),%r9 0.00 : 124407: 48 8d 52 c0 lea -0x40(%rdx),%rdx 0.00 : 12440b: 41 ff e1 jmpq *%r9 0.00 : 12440e: 0f 0b ud2 0.00 : 124410: 0f 18 86 40 fe ff ff prefetchnta -0x1c0(%rsi) 0.00 : 124417: 0f 28 56 e1 movaps -0x1f(%rsi),%xmm2 0.00 : 12441b: 48 83 ea 40 sub $0x40,%rdx 0.00 : 12441f: 0f 28 5e d1 movaps -0x2f(%rsi),%xmm3 0.00 : 124423: 0f 28 66 c1 movaps -0x3f(%rsi),%xmm4 0.00 : 124427: 0f 28 6e b1 movaps -0x4f(%rsi),%xmm5 0.00 : 12442b: 48 8d 76 c0 lea -0x40(%rsi),%rsi 0.00 : 12442f: 66 0f 3a 0f ca 0f palignr $0xf,%xmm2,%xmm1 0.00 : 124435: 66 0f 3a 0f d3 0f palignr $0xf,%xmm3,%xmm2 0.00 : 12443b: 66 0f 3a 0f dc 0f palignr $0xf,%xmm4,%xmm3 0.00 : 124441: 66 0f 3a 0f e5 0f palignr $0xf,%xmm5,%xmm4 0.00 : 124447: 0f 29 4f f0 movaps %xmm1,-0x10(%rdi) 0.00 : 12444b: 0f 28 cd movaps %xmm5,%xmm1 0.00 : 12444e: 0f 29 57 e0 movaps %xmm2,-0x20(%rdi) 0.00 : 124452: 48 8d 7f c0 lea -0x40(%rdi),%rdi 0.00 : 124456: 0f 29 5f 10 movaps %xmm3,0x10(%rdi) 0.00 : 12445a: 72 08 jb 124464 <__memmove_ssse3+0x18b4> 0.00 : 12445c: 0f 29 27 movaps %xmm4,(%rdi) 0.00 : 12445f: 41 ff e1 jmpq *%r9 0.00 : 124462: 0f 0b ud2 0.00 : 124464: 0f 29 27 movaps %xmm4,(%rdi) 0.00 : 124467: 48 8d 52 40 lea 0x40(%rdx),%rdx 0.00 : 12446b: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 124470: 4c 8d 1d 29 fe 01 00 lea 0x1fe29(%rip),%r11 # 1442a0 0.00 : 124477: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 12447b: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 12447f: ff e2 jmpq *%rdx 0.00 : 124481: 0f 0b ud2 0.00 : 124483: 66 66 66 66 2e 0f 1f data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 12448a: 84 00 00 00 00 00 0.00 : 124490: f3 0f 6f 46 b8 movdqu -0x48(%rsi),%xmm0 66.67 : 124495: f3 0f 6f 4e c8 movdqu -0x38(%rsi),%xmm1 0.00 : 12449a: 4c 8b 46 d8 mov -0x28(%rsi),%r8 0.00 : 12449e: 4c 8b 4e e0 mov -0x20(%rsi),%r9 0.00 : 1244a2: 4c 8b 56 e8 mov -0x18(%rsi),%r10 0.00 : 1244a6: 4c 8b 5e f0 mov -0x10(%rsi),%r11 0.00 : 1244aa: 48 8b 4e f8 mov -0x8(%rsi),%rcx 0.00 : 1244ae: f3 0f 7f 47 b8 movdqu %xmm0,-0x48(%rdi) 0.00 : 1244b3: f3 0f 7f 4f c8 movdqu %xmm1,-0x38(%rdi) 0.00 : 1244b8: 4c 89 47 d8 mov %r8,-0x28(%rdi) 0.00 : 1244bc: 4c 89 4f e0 mov %r9,-0x20(%rdi) 33.33 : 1244c0: 4c 89 57 e8 mov %r10,-0x18(%rdi) 0.00 : 1244c4: 4c 89 5f f0 mov %r11,-0x10(%rdi) 0.00 : 1244c8: 48 89 4f f8 mov %rcx,-0x8(%rdi) 0.00 : 1244cc: c3 retq 0.00 : 1244cd: 0f 1f 00 nopl (%rax) 0.00 : 1244d0: f3 0f 6f 46 c0 movdqu -0x40(%rsi),%xmm0 0.00 : 1244d5: 48 8b 4e d0 mov -0x30(%rsi),%rcx 0.00 : 1244d9: 4c 8b 46 d8 mov -0x28(%rsi),%r8 0.00 : 1244dd: 4c 8b 4e e0 mov -0x20(%rsi),%r9 0.00 : 1244e1: 4c 8b 56 e8 mov -0x18(%rsi),%r10 0.00 : 1244e5: 4c 8b 5e f0 mov -0x10(%rsi),%r11 0.00 : 1244e9: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 1244ed: f3 0f 7f 47 c0 movdqu %xmm0,-0x40(%rdi) 0.00 : 1244f2: 48 89 4f d0 mov %rcx,-0x30(%rdi) 0.00 : 1244f6: 4c 89 47 d8 mov %r8,-0x28(%rdi) 0.00 : 1244fa: 4c 89 4f e0 mov %r9,-0x20(%rdi) 0.00 : 1244fe: 4c 89 57 e8 mov %r10,-0x18(%rdi) 0.00 : 124502: 4c 89 5f f0 mov %r11,-0x10(%rdi) 0.00 : 124506: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 12450a: c3 retq 0.00 : 12450b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 124510: f3 0f 6f 46 c8 movdqu -0x38(%rsi),%xmm0 0.00 : 124515: 4c 8b 46 d8 mov -0x28(%rsi),%r8 0.00 : 124519: 4c 8b 4e e0 mov -0x20(%rsi),%r9 0.00 : 12451d: 4c 8b 56 e8 mov -0x18(%rsi),%r10 0.00 : 124521: 4c 8b 5e f0 mov -0x10(%rsi),%r11 0.00 : 124525: 48 8b 4e f8 mov -0x8(%rsi),%rcx 0.00 : 124529: f3 0f 7f 47 c8 movdqu %xmm0,-0x38(%rdi) 0.00 : 12452e: 4c 89 47 d8 mov %r8,-0x28(%rdi) 0.00 : 124532: 4c 89 4f e0 mov %r9,-0x20(%rdi) 0.00 : 124536: 4c 89 57 e8 mov %r10,-0x18(%rdi) 0.00 : 12453a: 4c 89 5f f0 mov %r11,-0x10(%rdi) 0.00 : 12453e: 48 89 4f f8 mov %rcx,-0x8(%rdi) 0.00 : 124542: c3 retq 0.00 : 124543: 66 66 66 66 2e 0f 1f data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 12454a: 84 00 00 00 00 00 0.00 : 124550: 48 8b 4e d0 mov -0x30(%rsi),%rcx 0.00 : 124554: 4c 8b 46 d8 mov -0x28(%rsi),%r8 0.00 : 124558: 4c 8b 4e e0 mov -0x20(%rsi),%r9 0.00 : 12455c: 4c 8b 56 e8 mov -0x18(%rsi),%r10 0.00 : 124560: 4c 8b 5e f0 mov -0x10(%rsi),%r11 0.00 : 124564: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 124568: 48 89 4f d0 mov %rcx,-0x30(%rdi) 0.00 : 12456c: 4c 89 47 d8 mov %r8,-0x28(%rdi) 0.00 : 124570: 4c 89 4f e0 mov %r9,-0x20(%rdi) 0.00 : 124574: 4c 89 57 e8 mov %r10,-0x18(%rdi) 0.00 : 124578: 4c 89 5f f0 mov %r11,-0x10(%rdi) 0.00 : 12457c: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 124580: c3 retq 0.00 : 124581: 66 66 66 66 66 66 2e data32 data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 124588: 0f 1f 84 00 00 00 00 0.00 : 12458f: 00 0.00 : 124590: 4c 8b 46 d8 mov -0x28(%rsi),%r8 0.00 : 124594: 4c 8b 4e e0 mov -0x20(%rsi),%r9 0.00 : 124598: 4c 8b 56 e8 mov -0x18(%rsi),%r10 0.00 : 12459c: 4c 8b 5e f0 mov -0x10(%rsi),%r11 0.00 : 1245a0: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 1245a4: 4c 89 47 d8 mov %r8,-0x28(%rdi) 0.00 : 1245a8: 4c 89 4f e0 mov %r9,-0x20(%rdi) 0.00 : 1245ac: 4c 89 57 e8 mov %r10,-0x18(%rdi) 0.00 : 1245b0: 4c 89 5f f0 mov %r11,-0x10(%rdi) 0.00 : 1245b4: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 1245b8: c3 retq 0.00 : 1245b9: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 0.00 : 1245c0: 4c 8b 4e e0 mov -0x20(%rsi),%r9 0.00 : 1245c4: 4c 8b 56 e8 mov -0x18(%rsi),%r10 0.00 : 1245c8: 4c 8b 5e f0 mov -0x10(%rsi),%r11 0.00 : 1245cc: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 1245d0: 4c 89 4f e0 mov %r9,-0x20(%rdi) 0.00 : 1245d4: 4c 89 57 e8 mov %r10,-0x18(%rdi) 0.00 : 1245d8: 4c 89 5f f0 mov %r11,-0x10(%rdi) 0.00 : 1245dc: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 1245e0: c3 retq 0.00 : 1245e1: 66 66 66 66 66 66 2e data32 data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 1245e8: 0f 1f 84 00 00 00 00 0.00 : 1245ef: 00 0.00 : 1245f0: 4c 8b 56 e8 mov -0x18(%rsi),%r10 0.00 : 1245f4: 4c 8b 5e f0 mov -0x10(%rsi),%r11 0.00 : 1245f8: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 1245fc: 4c 89 57 e8 mov %r10,-0x18(%rdi) 0.00 : 124600: 4c 89 5f f0 mov %r11,-0x10(%rdi) 0.00 : 124604: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 124608: c3 retq 0.00 : 124609: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 0.00 : 124610: 4c 8b 5e f0 mov -0x10(%rsi),%r11 0.00 : 124614: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 124618: 4c 89 5f f0 mov %r11,-0x10(%rdi) 0.00 : 12461c: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 124620: c3 retq 0.00 : 124621: 66 66 66 66 66 66 2e data32 data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 124628: 0f 1f 84 00 00 00 00 0.00 : 12462f: 00 0.00 : 124630: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 124634: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 124638: c3 retq 0.00 : 124639: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 0.00 : 124640: f3 0f 6f 46 b7 movdqu -0x49(%rsi),%xmm0 0.00 : 124645: f3 0f 6f 4e c7 movdqu -0x39(%rsi),%xmm1 0.00 : 12464a: 48 8b 4e d7 mov -0x29(%rsi),%rcx 0.00 : 12464e: 4c 8b 4e df mov -0x21(%rsi),%r9 0.00 : 124652: 4c 8b 56 e7 mov -0x19(%rsi),%r10 0.00 : 124656: 4c 8b 5e ef mov -0x11(%rsi),%r11 0.00 : 12465a: 4c 8b 46 f7 mov -0x9(%rsi),%r8 0.00 : 12465e: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 124661: f3 0f 7f 47 b7 movdqu %xmm0,-0x49(%rdi) 0.00 : 124666: f3 0f 7f 4f c7 movdqu %xmm1,-0x39(%rdi) 0.00 : 12466b: 48 89 4f d7 mov %rcx,-0x29(%rdi) 0.00 : 12466f: 4c 89 4f df mov %r9,-0x21(%rdi) 0.00 : 124673: 4c 89 57 e7 mov %r10,-0x19(%rdi) 0.00 : 124677: 4c 89 5f ef mov %r11,-0x11(%rdi) 0.00 : 12467b: 4c 89 47 f7 mov %r8,-0x9(%rdi) 0.00 : 12467f: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 124682: c3 retq 0.00 : 124683: 66 66 66 66 2e 0f 1f data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 12468a: 84 00 00 00 00 00 0.00 : 124690: f3 0f 6f 46 bf movdqu -0x41(%rsi),%xmm0 0.00 : 124695: f3 0f 6f 4e cf movdqu -0x31(%rsi),%xmm1 0.00 : 12469a: 4c 8b 4e df mov -0x21(%rsi),%r9 0.00 : 12469e: 4c 8b 56 e7 mov -0x19(%rsi),%r10 0.00 : 1246a2: 4c 8b 5e ef mov -0x11(%rsi),%r11 0.00 : 1246a6: 48 8b 4e f7 mov -0x9(%rsi),%rcx 0.00 : 1246aa: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 1246ad: f3 0f 7f 47 bf movdqu %xmm0,-0x41(%rdi) 0.00 : 1246b2: f3 0f 7f 4f cf movdqu %xmm1,-0x31(%rdi) 0.00 : 1246b7: 4c 89 4f df mov %r9,-0x21(%rdi) 0.00 : 1246bb: 4c 89 57 e7 mov %r10,-0x19(%rdi) 0.00 : 1246bf: 4c 89 5f ef mov %r11,-0x11(%rdi) 0.00 : 1246c3: 48 89 4f f7 mov %rcx,-0x9(%rdi) 0.00 : 1246c7: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 1246ca: c3 retq 0.00 : 1246cb: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 1246d0: f3 0f 6f 46 c7 movdqu -0x39(%rsi),%xmm0 0.00 : 1246d5: 4c 8b 46 d7 mov -0x29(%rsi),%r8 0.00 : 1246d9: 4c 8b 4e df mov -0x21(%rsi),%r9 0.00 : 1246dd: 4c 8b 56 e7 mov -0x19(%rsi),%r10 0.00 : 1246e1: 4c 8b 5e ef mov -0x11(%rsi),%r11 0.00 : 1246e5: 48 8b 4e f7 mov -0x9(%rsi),%rcx 0.00 : 1246e9: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 1246ec: f3 0f 7f 47 c7 movdqu %xmm0,-0x39(%rdi) 0.00 : 1246f1: 4c 89 47 d7 mov %r8,-0x29(%rdi) 0.00 : 1246f5: 4c 89 4f df mov %r9,-0x21(%rdi) 0.00 : 1246f9: 4c 89 57 e7 mov %r10,-0x19(%rdi) 0.00 : 1246fd: 4c 89 5f ef mov %r11,-0x11(%rdi) 0.00 : 124701: 48 89 4f f7 mov %rcx,-0x9(%rdi) 0.00 : 124705: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 124708: c3 retq 0.00 : 124709: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 0.00 : 124710: f3 0f 6f 46 cf movdqu -0x31(%rsi),%xmm0 0.00 : 124715: 4c 8b 4e df mov -0x21(%rsi),%r9 0.00 : 124719: 4c 8b 56 e7 mov -0x19(%rsi),%r10 0.00 : 12471d: 4c 8b 5e ef mov -0x11(%rsi),%r11 0.00 : 124721: 48 8b 4e f7 mov -0x9(%rsi),%rcx 0.00 : 124725: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 124728: f3 0f 7f 47 cf movdqu %xmm0,-0x31(%rdi) 0.00 : 12472d: 4c 89 4f df mov %r9,-0x21(%rdi) 0.00 : 124731: 4c 89 57 e7 mov %r10,-0x19(%rdi) 0.00 : 124735: 4c 89 5f ef mov %r11,-0x11(%rdi) 0.00 : 124739: 48 89 4f f7 mov %rcx,-0x9(%rdi) 0.00 : 12473d: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 124740: c3 retq 0.00 : 124741: 66 66 66 66 66 66 2e data32 data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 124748: 0f 1f 84 00 00 00 00 0.00 : 12474f: 00 0.00 : 124750: 4c 8b 46 d7 mov -0x29(%rsi),%r8 0.00 : 124754: 4c 8b 4e df mov -0x21(%rsi),%r9 0.00 : 124758: 4c 8b 56 e7 mov -0x19(%rsi),%r10 0.00 : 12475c: 4c 8b 5e ef mov -0x11(%rsi),%r11 0.00 : 124760: 48 8b 4e f7 mov -0x9(%rsi),%rcx 0.00 : 124764: 8a 56 ff mov -0x1(%rsi),%dl 0.00 : 124767: 4c 89 47 d7 mov %r8,-0x29(%rdi) 0.00 : 12476b: 4c 89 4f df mov %r9,-0x21(%rdi) 0.00 : 12476f: 4c 89 57 e7 mov %r10,-0x19(%rdi) 0.00 : 124773: 4c 89 5f ef mov %r11,-0x11(%rdi) 0.00 : 124777: 48 89 4f f7 mov %rcx,-0x9(%rdi) 0.00 : 12477b: 88 57 ff mov %dl,-0x1(%rdi) 0.00 : 12477e: c3 retq 0.00 : 12477f: 90 nop 0.00 : 124780: 4c 8b 4e df mov -0x21(%rsi),%r9 0.00 : 124784: 4c 8b 56 e7 mov -0x19(%rsi),%r10 0.00 : 124788: 4c 8b 5e ef mov -0x11(%rsi),%r11 0.00 : 12478c: 48 8b 4e f7 mov -0x9(%rsi),%rcx 0.00 : 124790: 8a 56 ff mov -0x1(%rsi),%dl 0.00 : 124793: 4c 89 4f df mov %r9,-0x21(%rdi) 0.00 : 124797: 4c 89 57 e7 mov %r10,-0x19(%rdi) 0.00 : 12479b: 4c 89 5f ef mov %r11,-0x11(%rdi) 0.00 : 12479f: 48 89 4f f7 mov %rcx,-0x9(%rdi) 0.00 : 1247a3: 88 57 ff mov %dl,-0x1(%rdi) 0.00 : 1247a6: c3 retq 0.00 : 1247a7: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 1247ae: 00 00 0.00 : 1247b0: 4c 8b 56 e7 mov -0x19(%rsi),%r10 0.00 : 1247b4: 4c 8b 5e ef mov -0x11(%rsi),%r11 0.00 : 1247b8: 48 8b 4e f7 mov -0x9(%rsi),%rcx 0.00 : 1247bc: 8a 56 ff mov -0x1(%rsi),%dl 0.00 : 1247bf: 4c 89 57 e7 mov %r10,-0x19(%rdi) 0.00 : 1247c3: 4c 89 5f ef mov %r11,-0x11(%rdi) 0.00 : 1247c7: 48 89 4f f7 mov %rcx,-0x9(%rdi) 0.00 : 1247cb: 88 57 ff mov %dl,-0x1(%rdi) 0.00 : 1247ce: c3 retq 0.00 : 1247cf: 90 nop 0.00 : 1247d0: 4c 8b 5e ef mov -0x11(%rsi),%r11 0.00 : 1247d4: 48 8b 4e f7 mov -0x9(%rsi),%rcx 0.00 : 1247d8: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 1247db: 4c 89 5f ef mov %r11,-0x11(%rdi) 0.00 : 1247df: 48 89 4f f7 mov %rcx,-0x9(%rdi) 0.00 : 1247e3: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 1247e6: c3 retq 0.00 : 1247e7: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 1247ee: 00 00 0.00 : 1247f0: 48 8b 4e f7 mov -0x9(%rsi),%rcx 0.00 : 1247f4: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 1247f7: 48 89 4f f7 mov %rcx,-0x9(%rdi) 0.00 : 1247fb: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 1247fe: c3 retq 0.00 : 1247ff: 90 nop 0.00 : 124800: 8a 56 ff mov -0x1(%rsi),%dl 0.00 : 124803: 88 57 ff mov %dl,-0x1(%rdi) 0.00 : 124806: c3 retq 0.00 : 124807: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 12480e: 00 00 0.00 : 124810: f3 0f 6f 46 b6 movdqu -0x4a(%rsi),%xmm0 0.00 : 124815: f3 0f 6f 4e c6 movdqu -0x3a(%rsi),%xmm1 0.00 : 12481a: 4c 8b 46 d6 mov -0x2a(%rsi),%r8 0.00 : 12481e: 4c 8b 4e de mov -0x22(%rsi),%r9 0.00 : 124822: 4c 8b 56 e6 mov -0x1a(%rsi),%r10 0.00 : 124826: 4c 8b 5e ee mov -0x12(%rsi),%r11 0.00 : 12482a: 48 8b 4e f6 mov -0xa(%rsi),%rcx 0.00 : 12482e: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 124831: f3 0f 7f 47 b6 movdqu %xmm0,-0x4a(%rdi) 0.00 : 124836: f3 0f 7f 4f c6 movdqu %xmm1,-0x3a(%rdi) 0.00 : 12483b: 4c 89 47 d6 mov %r8,-0x2a(%rdi) 0.00 : 12483f: 4c 89 4f de mov %r9,-0x22(%rdi) 0.00 : 124843: 4c 89 57 e6 mov %r10,-0x1a(%rdi) 0.00 : 124847: 4c 89 5f ee mov %r11,-0x12(%rdi) 0.00 : 12484b: 48 89 4f f6 mov %rcx,-0xa(%rdi) 0.00 : 12484f: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 124852: c3 retq 0.00 : 124853: 66 66 66 66 2e 0f 1f data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 12485a: 84 00 00 00 00 00 0.00 : 124860: f3 0f 6f 46 be movdqu -0x42(%rsi),%xmm0 0.00 : 124865: f3 0f 6f 4e ce movdqu -0x32(%rsi),%xmm1 0.00 : 12486a: 4c 8b 46 d6 mov -0x2a(%rsi),%r8 0.00 : 12486e: 4c 8b 4e de mov -0x22(%rsi),%r9 0.00 : 124872: 4c 8b 56 e6 mov -0x1a(%rsi),%r10 0.00 : 124876: 4c 8b 5e ee mov -0x12(%rsi),%r11 0.00 : 12487a: 48 8b 4e f6 mov -0xa(%rsi),%rcx 0.00 : 12487e: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 124881: f3 0f 7f 47 be movdqu %xmm0,-0x42(%rdi) 0.00 : 124886: f3 0f 7f 4f ce movdqu %xmm1,-0x32(%rdi) 0.00 : 12488b: 4c 89 47 d6 mov %r8,-0x2a(%rdi) 0.00 : 12488f: 4c 89 4f de mov %r9,-0x22(%rdi) 0.00 : 124893: 4c 89 57 e6 mov %r10,-0x1a(%rdi) 0.00 : 124897: 4c 89 5f ee mov %r11,-0x12(%rdi) 0.00 : 12489b: 48 89 4f f6 mov %rcx,-0xa(%rdi) 0.00 : 12489f: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 1248a2: c3 retq 0.00 : 1248a3: 66 66 66 66 2e 0f 1f data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 1248aa: 84 00 00 00 00 00 0.00 : 1248b0: f3 0f 6f 4e c6 movdqu -0x3a(%rsi),%xmm1 0.00 : 1248b5: 4c 8b 46 d6 mov -0x2a(%rsi),%r8 0.00 : 1248b9: 4c 8b 4e de mov -0x22(%rsi),%r9 0.00 : 1248bd: 4c 8b 56 e6 mov -0x1a(%rsi),%r10 0.00 : 1248c1: 4c 8b 5e ee mov -0x12(%rsi),%r11 0.00 : 1248c5: 48 8b 4e f6 mov -0xa(%rsi),%rcx 0.00 : 1248c9: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 1248cc: f3 0f 7f 4f c6 movdqu %xmm1,-0x3a(%rdi) 0.00 : 1248d1: 4c 89 47 d6 mov %r8,-0x2a(%rdi) 0.00 : 1248d5: 4c 89 4f de mov %r9,-0x22(%rdi) 0.00 : 1248d9: 4c 89 57 e6 mov %r10,-0x1a(%rdi) 0.00 : 1248dd: 4c 89 5f ee mov %r11,-0x12(%rdi) 0.00 : 1248e1: 48 89 4f f6 mov %rcx,-0xa(%rdi) 0.00 : 1248e5: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 1248e8: c3 retq 0.00 : 1248e9: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 0.00 : 1248f0: f3 0f 6f 46 ce movdqu -0x32(%rsi),%xmm0 0.00 : 1248f5: 4c 8b 4e de mov -0x22(%rsi),%r9 0.00 : 1248f9: 4c 8b 56 e6 mov -0x1a(%rsi),%r10 0.00 : 1248fd: 4c 8b 5e ee mov -0x12(%rsi),%r11 0.00 : 124901: 48 8b 4e f6 mov -0xa(%rsi),%rcx 0.00 : 124905: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 124908: f3 0f 7f 47 ce movdqu %xmm0,-0x32(%rdi) 0.00 : 12490d: 4c 89 4f de mov %r9,-0x22(%rdi) 0.00 : 124911: 4c 89 57 e6 mov %r10,-0x1a(%rdi) 0.00 : 124915: 4c 89 5f ee mov %r11,-0x12(%rdi) 0.00 : 124919: 48 89 4f f6 mov %rcx,-0xa(%rdi) 0.00 : 12491d: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 124920: c3 retq 0.00 : 124921: 66 66 66 66 66 66 2e data32 data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 124928: 0f 1f 84 00 00 00 00 0.00 : 12492f: 00 0.00 : 124930: 4c 8b 46 d6 mov -0x2a(%rsi),%r8 0.00 : 124934: 4c 8b 4e de mov -0x22(%rsi),%r9 0.00 : 124938: 4c 8b 56 e6 mov -0x1a(%rsi),%r10 0.00 : 12493c: 4c 8b 5e ee mov -0x12(%rsi),%r11 0.00 : 124940: 48 8b 4e f6 mov -0xa(%rsi),%rcx 0.00 : 124944: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 124947: 4c 89 47 d6 mov %r8,-0x2a(%rdi) 0.00 : 12494b: 4c 89 4f de mov %r9,-0x22(%rdi) 0.00 : 12494f: 4c 89 57 e6 mov %r10,-0x1a(%rdi) 0.00 : 124953: 4c 89 5f ee mov %r11,-0x12(%rdi) 0.00 : 124957: 48 89 4f f6 mov %rcx,-0xa(%rdi) 0.00 : 12495b: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 12495e: c3 retq 0.00 : 12495f: 90 nop 0.00 : 124960: 4c 8b 4e de mov -0x22(%rsi),%r9 0.00 : 124964: 4c 8b 56 e6 mov -0x1a(%rsi),%r10 0.00 : 124968: 4c 8b 5e ee mov -0x12(%rsi),%r11 0.00 : 12496c: 48 8b 4e f6 mov -0xa(%rsi),%rcx 0.00 : 124970: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 124973: 4c 89 4f de mov %r9,-0x22(%rdi) 0.00 : 124977: 4c 89 57 e6 mov %r10,-0x1a(%rdi) 0.00 : 12497b: 4c 89 5f ee mov %r11,-0x12(%rdi) 0.00 : 12497f: 48 89 4f f6 mov %rcx,-0xa(%rdi) 0.00 : 124983: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 124986: c3 retq 0.00 : 124987: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 12498e: 00 00 0.00 : 124990: 4c 8b 56 e6 mov -0x1a(%rsi),%r10 0.00 : 124994: 4c 8b 5e ee mov -0x12(%rsi),%r11 0.00 : 124998: 48 8b 4e f6 mov -0xa(%rsi),%rcx 0.00 : 12499c: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 12499f: 4c 89 57 e6 mov %r10,-0x1a(%rdi) 0.00 : 1249a3: 4c 89 5f ee mov %r11,-0x12(%rdi) 0.00 : 1249a7: 48 89 4f f6 mov %rcx,-0xa(%rdi) 0.00 : 1249ab: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 1249ae: c3 retq 0.00 : 1249af: 90 nop 0.00 : 1249b0: 4c 8b 5e ee mov -0x12(%rsi),%r11 0.00 : 1249b4: 48 8b 4e f6 mov -0xa(%rsi),%rcx 0.00 : 1249b8: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 1249bb: 4c 89 5f ee mov %r11,-0x12(%rdi) 0.00 : 1249bf: 48 89 4f f6 mov %rcx,-0xa(%rdi) 0.00 : 1249c3: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 1249c6: c3 retq 0.00 : 1249c7: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 1249ce: 00 00 0.00 : 1249d0: 48 8b 4e f6 mov -0xa(%rsi),%rcx 0.00 : 1249d4: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 1249d7: 48 89 4f f6 mov %rcx,-0xa(%rdi) 0.00 : 1249db: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 1249de: c3 retq 0.00 : 1249df: 90 nop 0.00 : 1249e0: 66 8b 56 fe mov -0x2(%rsi),%dx 0.00 : 1249e4: 66 89 57 fe mov %dx,-0x2(%rdi) 0.00 : 1249e8: c3 retq 0.00 : 1249e9: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 0.00 : 1249f0: f3 0f 6f 46 b5 movdqu -0x4b(%rsi),%xmm0 0.00 : 1249f5: f3 0f 6f 4e c5 movdqu -0x3b(%rsi),%xmm1 0.00 : 1249fa: 4c 8b 46 d5 mov -0x2b(%rsi),%r8 0.00 : 1249fe: 4c 8b 4e dd mov -0x23(%rsi),%r9 0.00 : 124a02: 4c 8b 56 e5 mov -0x1b(%rsi),%r10 0.00 : 124a06: 4c 8b 5e ed mov -0x13(%rsi),%r11 0.00 : 124a0a: 48 8b 4e f5 mov -0xb(%rsi),%rcx 0.00 : 124a0e: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 124a11: f3 0f 7f 47 b5 movdqu %xmm0,-0x4b(%rdi) 0.00 : 124a16: f3 0f 7f 4f c5 movdqu %xmm1,-0x3b(%rdi) 0.00 : 124a1b: 4c 89 47 d5 mov %r8,-0x2b(%rdi) 0.00 : 124a1f: 4c 89 4f dd mov %r9,-0x23(%rdi) 0.00 : 124a23: 4c 89 57 e5 mov %r10,-0x1b(%rdi) 0.00 : 124a27: 4c 89 5f ed mov %r11,-0x13(%rdi) 0.00 : 124a2b: 48 89 4f f5 mov %rcx,-0xb(%rdi) 0.00 : 124a2f: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 124a32: c3 retq 0.00 : 124a33: 66 66 66 66 2e 0f 1f data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 124a3a: 84 00 00 00 00 00 0.00 : 124a40: f3 0f 6f 46 bd movdqu -0x43(%rsi),%xmm0 0.00 : 124a45: f3 0f 6f 4e c5 movdqu -0x3b(%rsi),%xmm1 0.00 : 124a4a: 4c 8b 46 d5 mov -0x2b(%rsi),%r8 0.00 : 124a4e: 4c 8b 4e dd mov -0x23(%rsi),%r9 0.00 : 124a52: 4c 8b 56 e5 mov -0x1b(%rsi),%r10 0.00 : 124a56: 4c 8b 5e ed mov -0x13(%rsi),%r11 0.00 : 124a5a: 48 8b 4e f5 mov -0xb(%rsi),%rcx 0.00 : 124a5e: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 124a61: f3 0f 7f 47 bd movdqu %xmm0,-0x43(%rdi) 0.00 : 124a66: f3 0f 7f 4f c5 movdqu %xmm1,-0x3b(%rdi) 0.00 : 124a6b: 4c 89 47 d5 mov %r8,-0x2b(%rdi) 0.00 : 124a6f: 4c 89 4f dd mov %r9,-0x23(%rdi) 0.00 : 124a73: 4c 89 57 e5 mov %r10,-0x1b(%rdi) 0.00 : 124a77: 4c 89 5f ed mov %r11,-0x13(%rdi) 0.00 : 124a7b: 48 89 4f f5 mov %rcx,-0xb(%rdi) 0.00 : 124a7f: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 124a82: c3 retq 0.00 : 124a83: 66 66 66 66 2e 0f 1f data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 124a8a: 84 00 00 00 00 00 0.00 : 124a90: f3 0f 6f 46 c5 movdqu -0x3b(%rsi),%xmm0 0.00 : 124a95: 4c 8b 46 d5 mov -0x2b(%rsi),%r8 0.00 : 124a99: 4c 8b 4e dd mov -0x23(%rsi),%r9 0.00 : 124a9d: 4c 8b 56 e5 mov -0x1b(%rsi),%r10 0.00 : 124aa1: 4c 8b 5e ed mov -0x13(%rsi),%r11 0.00 : 124aa5: 48 8b 4e f5 mov -0xb(%rsi),%rcx 0.00 : 124aa9: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 124aac: f3 0f 7f 47 c5 movdqu %xmm0,-0x3b(%rdi) 0.00 : 124ab1: 4c 89 47 d5 mov %r8,-0x2b(%rdi) 0.00 : 124ab5: 4c 89 4f dd mov %r9,-0x23(%rdi) 0.00 : 124ab9: 4c 89 57 e5 mov %r10,-0x1b(%rdi) 0.00 : 124abd: 4c 89 5f ed mov %r11,-0x13(%rdi) 0.00 : 124ac1: 48 89 4f f5 mov %rcx,-0xb(%rdi) 0.00 : 124ac5: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 124ac8: c3 retq 0.00 : 124ac9: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 0.00 : 124ad0: f3 0f 6f 46 cd movdqu -0x33(%rsi),%xmm0 0.00 : 124ad5: 4c 8b 4e dd mov -0x23(%rsi),%r9 0.00 : 124ad9: 4c 8b 56 e5 mov -0x1b(%rsi),%r10 0.00 : 124add: 4c 8b 5e ed mov -0x13(%rsi),%r11 0.00 : 124ae1: 48 8b 4e f5 mov -0xb(%rsi),%rcx 0.00 : 124ae5: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 124ae8: f3 0f 7f 47 cd movdqu %xmm0,-0x33(%rdi) 0.00 : 124aed: 4c 89 4f dd mov %r9,-0x23(%rdi) 0.00 : 124af1: 4c 89 57 e5 mov %r10,-0x1b(%rdi) 0.00 : 124af5: 4c 89 5f ed mov %r11,-0x13(%rdi) 0.00 : 124af9: 48 89 4f f5 mov %rcx,-0xb(%rdi) 0.00 : 124afd: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 124b00: c3 retq 0.00 : 124b01: 66 66 66 66 66 66 2e data32 data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 124b08: 0f 1f 84 00 00 00 00 0.00 : 124b0f: 00 0.00 : 124b10: 4c 8b 46 d5 mov -0x2b(%rsi),%r8 0.00 : 124b14: 4c 8b 4e dd mov -0x23(%rsi),%r9 0.00 : 124b18: 4c 8b 56 e5 mov -0x1b(%rsi),%r10 0.00 : 124b1c: 4c 8b 5e ed mov -0x13(%rsi),%r11 0.00 : 124b20: 48 8b 4e f5 mov -0xb(%rsi),%rcx 0.00 : 124b24: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 124b27: 4c 89 47 d5 mov %r8,-0x2b(%rdi) 0.00 : 124b2b: 4c 89 4f dd mov %r9,-0x23(%rdi) 0.00 : 124b2f: 4c 89 57 e5 mov %r10,-0x1b(%rdi) 0.00 : 124b33: 4c 89 5f ed mov %r11,-0x13(%rdi) 0.00 : 124b37: 48 89 4f f5 mov %rcx,-0xb(%rdi) 0.00 : 124b3b: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 124b3e: c3 retq 0.00 : 124b3f: 90 nop 0.00 : 124b40: 4c 8b 4e dd mov -0x23(%rsi),%r9 0.00 : 124b44: 4c 8b 56 e5 mov -0x1b(%rsi),%r10 0.00 : 124b48: 4c 8b 5e ed mov -0x13(%rsi),%r11 0.00 : 124b4c: 48 8b 4e f5 mov -0xb(%rsi),%rcx 0.00 : 124b50: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 124b53: 4c 89 4f dd mov %r9,-0x23(%rdi) 0.00 : 124b57: 4c 89 57 e5 mov %r10,-0x1b(%rdi) 0.00 : 124b5b: 4c 89 5f ed mov %r11,-0x13(%rdi) 0.00 : 124b5f: 48 89 4f f5 mov %rcx,-0xb(%rdi) 0.00 : 124b63: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 124b66: c3 retq 0.00 : 124b67: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 124b6e: 00 00 0.00 : 124b70: 4c 8b 56 e5 mov -0x1b(%rsi),%r10 0.00 : 124b74: 4c 8b 5e ed mov -0x13(%rsi),%r11 0.00 : 124b78: 48 8b 4e f5 mov -0xb(%rsi),%rcx 0.00 : 124b7c: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 124b7f: 4c 89 57 e5 mov %r10,-0x1b(%rdi) 0.00 : 124b83: 4c 89 5f ed mov %r11,-0x13(%rdi) 0.00 : 124b87: 48 89 4f f5 mov %rcx,-0xb(%rdi) 0.00 : 124b8b: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 124b8e: c3 retq 0.00 : 124b8f: 90 nop 0.00 : 124b90: 4c 8b 5e ed mov -0x13(%rsi),%r11 0.00 : 124b94: 48 8b 4e f5 mov -0xb(%rsi),%rcx 0.00 : 124b98: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 124b9b: 4c 89 5f ed mov %r11,-0x13(%rdi) 0.00 : 124b9f: 48 89 4f f5 mov %rcx,-0xb(%rdi) 0.00 : 124ba3: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 124ba6: c3 retq 0.00 : 124ba7: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 124bae: 00 00 0.00 : 124bb0: 48 8b 4e f5 mov -0xb(%rsi),%rcx 0.00 : 124bb4: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 124bb7: 48 89 4f f5 mov %rcx,-0xb(%rdi) 0.00 : 124bbb: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 124bbe: c3 retq 0.00 : 124bbf: 90 nop 0.00 : 124bc0: 66 8b 56 fd mov -0x3(%rsi),%dx 0.00 : 124bc4: 66 8b 4e fe mov -0x2(%rsi),%cx 0.00 : 124bc8: 66 89 57 fd mov %dx,-0x3(%rdi) 0.00 : 124bcc: 66 89 4f fe mov %cx,-0x2(%rdi) 0.00 : 124bd0: c3 retq 0.00 : 124bd1: 66 66 66 66 66 66 2e data32 data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 124bd8: 0f 1f 84 00 00 00 00 0.00 : 124bdf: 00 0.00 : 124be0: f3 0f 6f 46 b4 movdqu -0x4c(%rsi),%xmm0 0.00 : 124be5: f3 0f 6f 4e c4 movdqu -0x3c(%rsi),%xmm1 0.00 : 124bea: 4c 8b 46 d4 mov -0x2c(%rsi),%r8 0.00 : 124bee: 4c 8b 4e dc mov -0x24(%rsi),%r9 0.00 : 124bf2: 4c 8b 56 e4 mov -0x1c(%rsi),%r10 0.00 : 124bf6: 4c 8b 5e ec mov -0x14(%rsi),%r11 0.00 : 124bfa: 48 8b 4e f4 mov -0xc(%rsi),%rcx 0.00 : 124bfe: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 124c01: f3 0f 7f 47 b4 movdqu %xmm0,-0x4c(%rdi) 0.00 : 124c06: f3 0f 7f 4f c4 movdqu %xmm1,-0x3c(%rdi) 0.00 : 124c0b: 4c 89 47 d4 mov %r8,-0x2c(%rdi) 0.00 : 124c0f: 4c 89 4f dc mov %r9,-0x24(%rdi) 0.00 : 124c13: 4c 89 57 e4 mov %r10,-0x1c(%rdi) 0.00 : 124c17: 4c 89 5f ec mov %r11,-0x14(%rdi) 0.00 : 124c1b: 48 89 4f f4 mov %rcx,-0xc(%rdi) 0.00 : 124c1f: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 124c22: c3 retq 0.00 : 124c23: 66 66 66 66 2e 0f 1f data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 124c2a: 84 00 00 00 00 00 0.00 : 124c30: f3 0f 6f 46 bc movdqu -0x44(%rsi),%xmm0 0.00 : 124c35: f3 0f 6f 4e cc movdqu -0x34(%rsi),%xmm1 0.00 : 124c3a: 4c 8b 4e dc mov -0x24(%rsi),%r9 0.00 : 124c3e: 4c 8b 56 e4 mov -0x1c(%rsi),%r10 0.00 : 124c42: 4c 8b 5e ec mov -0x14(%rsi),%r11 0.00 : 124c46: 48 8b 4e f4 mov -0xc(%rsi),%rcx 0.00 : 124c4a: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 124c4d: f3 0f 7f 47 bc movdqu %xmm0,-0x44(%rdi) 0.00 : 124c52: f3 0f 7f 4f cc movdqu %xmm1,-0x34(%rdi) 0.00 : 124c57: 4c 89 4f dc mov %r9,-0x24(%rdi) 0.00 : 124c5b: 4c 89 57 e4 mov %r10,-0x1c(%rdi) 0.00 : 124c5f: 4c 89 5f ec mov %r11,-0x14(%rdi) 0.00 : 124c63: 48 89 4f f4 mov %rcx,-0xc(%rdi) 0.00 : 124c67: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 124c6a: c3 retq 0.00 : 124c6b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 124c70: f3 0f 6f 46 c4 movdqu -0x3c(%rsi),%xmm0 0.00 : 124c75: 4c 8b 46 d4 mov -0x2c(%rsi),%r8 0.00 : 124c79: 4c 8b 4e dc mov -0x24(%rsi),%r9 0.00 : 124c7d: 4c 8b 56 e4 mov -0x1c(%rsi),%r10 0.00 : 124c81: 4c 8b 5e ec mov -0x14(%rsi),%r11 0.00 : 124c85: 48 8b 4e f4 mov -0xc(%rsi),%rcx 0.00 : 124c89: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 124c8c: f3 0f 7f 47 c4 movdqu %xmm0,-0x3c(%rdi) 0.00 : 124c91: 4c 89 47 d4 mov %r8,-0x2c(%rdi) 0.00 : 124c95: 4c 89 4f dc mov %r9,-0x24(%rdi) 0.00 : 124c99: 4c 89 57 e4 mov %r10,-0x1c(%rdi) 0.00 : 124c9d: 4c 89 5f ec mov %r11,-0x14(%rdi) 0.00 : 124ca1: 48 89 4f f4 mov %rcx,-0xc(%rdi) 0.00 : 124ca5: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 124ca8: c3 retq 0.00 : 124ca9: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 0.00 : 124cb0: f3 0f 6f 46 cc movdqu -0x34(%rsi),%xmm0 0.00 : 124cb5: 4c 8b 4e dc mov -0x24(%rsi),%r9 0.00 : 124cb9: 4c 8b 56 e4 mov -0x1c(%rsi),%r10 0.00 : 124cbd: 4c 8b 5e ec mov -0x14(%rsi),%r11 0.00 : 124cc1: 48 8b 4e f4 mov -0xc(%rsi),%rcx 0.00 : 124cc5: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 124cc8: f3 0f 7f 47 cc movdqu %xmm0,-0x34(%rdi) 0.00 : 124ccd: 4c 89 4f dc mov %r9,-0x24(%rdi) 0.00 : 124cd1: 4c 89 57 e4 mov %r10,-0x1c(%rdi) 0.00 : 124cd5: 4c 89 5f ec mov %r11,-0x14(%rdi) 0.00 : 124cd9: 48 89 4f f4 mov %rcx,-0xc(%rdi) 0.00 : 124cdd: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 124ce0: c3 retq 0.00 : 124ce1: 66 66 66 66 66 66 2e data32 data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 124ce8: 0f 1f 84 00 00 00 00 0.00 : 124cef: 00 0.00 : 124cf0: 4c 8b 46 d4 mov -0x2c(%rsi),%r8 0.00 : 124cf4: 4c 8b 4e dc mov -0x24(%rsi),%r9 0.00 : 124cf8: 4c 8b 56 e4 mov -0x1c(%rsi),%r10 0.00 : 124cfc: 4c 8b 5e ec mov -0x14(%rsi),%r11 0.00 : 124d00: 48 8b 4e f4 mov -0xc(%rsi),%rcx 0.00 : 124d04: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 124d07: 4c 89 47 d4 mov %r8,-0x2c(%rdi) 0.00 : 124d0b: 4c 89 4f dc mov %r9,-0x24(%rdi) 0.00 : 124d0f: 4c 89 57 e4 mov %r10,-0x1c(%rdi) 0.00 : 124d13: 4c 89 5f ec mov %r11,-0x14(%rdi) 0.00 : 124d17: 48 89 4f f4 mov %rcx,-0xc(%rdi) 0.00 : 124d1b: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 124d1e: c3 retq 0.00 : 124d1f: 90 nop 0.00 : 124d20: 4c 8b 4e dc mov -0x24(%rsi),%r9 0.00 : 124d24: 4c 8b 56 e4 mov -0x1c(%rsi),%r10 0.00 : 124d28: 4c 8b 5e ec mov -0x14(%rsi),%r11 0.00 : 124d2c: 48 8b 4e f4 mov -0xc(%rsi),%rcx 0.00 : 124d30: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 124d33: 4c 89 4f dc mov %r9,-0x24(%rdi) 0.00 : 124d37: 4c 89 57 e4 mov %r10,-0x1c(%rdi) 0.00 : 124d3b: 4c 89 5f ec mov %r11,-0x14(%rdi) 0.00 : 124d3f: 48 89 4f f4 mov %rcx,-0xc(%rdi) 0.00 : 124d43: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 124d46: c3 retq 0.00 : 124d47: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 124d4e: 00 00 0.00 : 124d50: 4c 8b 56 e4 mov -0x1c(%rsi),%r10 0.00 : 124d54: 4c 8b 5e ec mov -0x14(%rsi),%r11 0.00 : 124d58: 48 8b 4e f4 mov -0xc(%rsi),%rcx 0.00 : 124d5c: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 124d5f: 4c 89 57 e4 mov %r10,-0x1c(%rdi) 0.00 : 124d63: 4c 89 5f ec mov %r11,-0x14(%rdi) 0.00 : 124d67: 48 89 4f f4 mov %rcx,-0xc(%rdi) 0.00 : 124d6b: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 124d6e: c3 retq 0.00 : 124d6f: 90 nop 0.00 : 124d70: 4c 8b 5e ec mov -0x14(%rsi),%r11 0.00 : 124d74: 48 8b 4e f4 mov -0xc(%rsi),%rcx 0.00 : 124d78: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 124d7b: 4c 89 5f ec mov %r11,-0x14(%rdi) 0.00 : 124d7f: 48 89 4f f4 mov %rcx,-0xc(%rdi) 0.00 : 124d83: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 124d86: c3 retq 0.00 : 124d87: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 124d8e: 00 00 0.00 : 124d90: 48 8b 4e f4 mov -0xc(%rsi),%rcx 0.00 : 124d94: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 124d97: 48 89 4f f4 mov %rcx,-0xc(%rdi) 0.00 : 124d9b: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 124d9e: c3 retq 0.00 : 124d9f: 90 nop 0.00 : 124da0: 8b 56 fc mov -0x4(%rsi),%edx 0.00 : 124da3: 89 57 fc mov %edx,-0x4(%rdi) 0.00 : 124da6: c3 retq 0.00 : 124da7: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 124dae: 00 00 0.00 : 124db0: f3 0f 6f 46 b3 movdqu -0x4d(%rsi),%xmm0 0.00 : 124db5: f3 0f 6f 4e c3 movdqu -0x3d(%rsi),%xmm1 0.00 : 124dba: 4c 8b 46 d3 mov -0x2d(%rsi),%r8 0.00 : 124dbe: 4c 8b 4e db mov -0x25(%rsi),%r9 0.00 : 124dc2: 4c 8b 56 e3 mov -0x1d(%rsi),%r10 0.00 : 124dc6: 4c 8b 5e eb mov -0x15(%rsi),%r11 0.00 : 124dca: 48 8b 4e f3 mov -0xd(%rsi),%rcx 0.00 : 124dce: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 124dd2: f3 0f 7f 47 b3 movdqu %xmm0,-0x4d(%rdi) 0.00 : 124dd7: f3 0f 7f 4f c3 movdqu %xmm1,-0x3d(%rdi) 0.00 : 124ddc: 4c 89 47 d3 mov %r8,-0x2d(%rdi) 0.00 : 124de0: 4c 89 4f db mov %r9,-0x25(%rdi) 0.00 : 124de4: 4c 89 57 e3 mov %r10,-0x1d(%rdi) 0.00 : 124de8: 4c 89 5f eb mov %r11,-0x15(%rdi) 0.00 : 124dec: 48 89 4f f3 mov %rcx,-0xd(%rdi) 0.00 : 124df0: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 124df4: c3 retq 0.00 : 124df5: 66 66 2e 0f 1f 84 00 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 124dfc: 00 00 00 00 0.00 : 124e00: f3 0f 6f 46 bb movdqu -0x45(%rsi),%xmm0 0.00 : 124e05: f3 0f 6f 4e cb movdqu -0x35(%rsi),%xmm1 0.00 : 124e0a: 4c 8b 4e db mov -0x25(%rsi),%r9 0.00 : 124e0e: 4c 8b 56 e3 mov -0x1d(%rsi),%r10 0.00 : 124e12: 4c 8b 5e eb mov -0x15(%rsi),%r11 0.00 : 124e16: 48 8b 4e f3 mov -0xd(%rsi),%rcx 0.00 : 124e1a: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 124e1e: f3 0f 7f 47 bb movdqu %xmm0,-0x45(%rdi) 0.00 : 124e23: f3 0f 7f 4f cb movdqu %xmm1,-0x35(%rdi) 0.00 : 124e28: 4c 89 4f db mov %r9,-0x25(%rdi) 0.00 : 124e2c: 4c 89 57 e3 mov %r10,-0x1d(%rdi) 0.00 : 124e30: 4c 89 5f eb mov %r11,-0x15(%rdi) 0.00 : 124e34: 48 89 4f f3 mov %rcx,-0xd(%rdi) 0.00 : 124e38: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 124e3c: c3 retq 0.00 : 124e3d: 0f 1f 00 nopl (%rax) 0.00 : 124e40: f3 0f 6f 46 c3 movdqu -0x3d(%rsi),%xmm0 0.00 : 124e45: 4c 8b 46 d3 mov -0x2d(%rsi),%r8 0.00 : 124e49: 4c 8b 4e db mov -0x25(%rsi),%r9 0.00 : 124e4d: 4c 8b 56 e3 mov -0x1d(%rsi),%r10 0.00 : 124e51: 4c 8b 5e eb mov -0x15(%rsi),%r11 0.00 : 124e55: 48 8b 4e f3 mov -0xd(%rsi),%rcx 0.00 : 124e59: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 124e5d: f3 0f 7f 47 c3 movdqu %xmm0,-0x3d(%rdi) 0.00 : 124e62: 4c 89 47 d3 mov %r8,-0x2d(%rdi) 0.00 : 124e66: 4c 89 4f db mov %r9,-0x25(%rdi) 0.00 : 124e6a: 4c 89 57 e3 mov %r10,-0x1d(%rdi) 0.00 : 124e6e: 4c 89 5f eb mov %r11,-0x15(%rdi) 0.00 : 124e72: 48 89 4f f3 mov %rcx,-0xd(%rdi) 0.00 : 124e76: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 124e7a: c3 retq 0.00 : 124e7b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 124e80: f3 0f 6f 46 cb movdqu -0x35(%rsi),%xmm0 0.00 : 124e85: 4c 8b 46 d3 mov -0x2d(%rsi),%r8 0.00 : 124e89: 4c 8b 4e db mov -0x25(%rsi),%r9 0.00 : 124e8d: 4c 8b 56 e3 mov -0x1d(%rsi),%r10 0.00 : 124e91: 4c 8b 5e eb mov -0x15(%rsi),%r11 0.00 : 124e95: 48 8b 4e f3 mov -0xd(%rsi),%rcx 0.00 : 124e99: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 124e9d: f3 0f 7f 47 cb movdqu %xmm0,-0x35(%rdi) 0.00 : 124ea2: 4c 89 4f db mov %r9,-0x25(%rdi) 0.00 : 124ea6: 4c 89 57 e3 mov %r10,-0x1d(%rdi) 0.00 : 124eaa: 4c 89 5f eb mov %r11,-0x15(%rdi) 0.00 : 124eae: 48 89 4f f3 mov %rcx,-0xd(%rdi) 0.00 : 124eb2: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 124eb6: c3 retq 0.00 : 124eb7: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 124ebe: 00 00 0.00 : 124ec0: 4c 8b 46 d3 mov -0x2d(%rsi),%r8 0.00 : 124ec4: 4c 8b 4e db mov -0x25(%rsi),%r9 0.00 : 124ec8: 4c 8b 56 e3 mov -0x1d(%rsi),%r10 0.00 : 124ecc: 4c 8b 5e eb mov -0x15(%rsi),%r11 0.00 : 124ed0: 48 8b 4e f3 mov -0xd(%rsi),%rcx 0.00 : 124ed4: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 124ed8: 4c 89 47 d3 mov %r8,-0x2d(%rdi) 0.00 : 124edc: 4c 89 4f db mov %r9,-0x25(%rdi) 0.00 : 124ee0: 4c 89 57 e3 mov %r10,-0x1d(%rdi) 0.00 : 124ee4: 4c 89 5f eb mov %r11,-0x15(%rdi) 0.00 : 124ee8: 48 89 4f f3 mov %rcx,-0xd(%rdi) 0.00 : 124eec: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 124ef0: c3 retq 0.00 : 124ef1: 66 66 66 66 66 66 2e data32 data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 124ef8: 0f 1f 84 00 00 00 00 0.00 : 124eff: 00 0.00 : 124f00: 4c 8b 4e db mov -0x25(%rsi),%r9 0.00 : 124f04: 4c 8b 56 e3 mov -0x1d(%rsi),%r10 0.00 : 124f08: 4c 8b 5e eb mov -0x15(%rsi),%r11 0.00 : 124f0c: 48 8b 4e f3 mov -0xd(%rsi),%rcx 0.00 : 124f10: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 124f14: 4c 89 4f db mov %r9,-0x25(%rdi) 0.00 : 124f18: 4c 89 57 e3 mov %r10,-0x1d(%rdi) 0.00 : 124f1c: 4c 89 5f eb mov %r11,-0x15(%rdi) 0.00 : 124f20: 48 89 4f f3 mov %rcx,-0xd(%rdi) 0.00 : 124f24: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 124f28: c3 retq 0.00 : 124f29: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 0.00 : 124f30: 4c 8b 56 e3 mov -0x1d(%rsi),%r10 0.00 : 124f34: 4c 8b 5e eb mov -0x15(%rsi),%r11 0.00 : 124f38: 48 8b 4e f3 mov -0xd(%rsi),%rcx 0.00 : 124f3c: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 124f40: 4c 89 57 e3 mov %r10,-0x1d(%rdi) 0.00 : 124f44: 4c 89 5f eb mov %r11,-0x15(%rdi) 0.00 : 124f48: 48 89 4f f3 mov %rcx,-0xd(%rdi) 0.00 : 124f4c: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 124f50: c3 retq 0.00 : 124f51: 66 66 66 66 66 66 2e data32 data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 124f58: 0f 1f 84 00 00 00 00 0.00 : 124f5f: 00 0.00 : 124f60: 4c 8b 5e eb mov -0x15(%rsi),%r11 0.00 : 124f64: 48 8b 4e f3 mov -0xd(%rsi),%rcx 0.00 : 124f68: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 124f6c: 4c 89 5f eb mov %r11,-0x15(%rdi) 0.00 : 124f70: 48 89 4f f3 mov %rcx,-0xd(%rdi) 0.00 : 124f74: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 124f78: c3 retq 0.00 : 124f79: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 0.00 : 124f80: 48 8b 4e f3 mov -0xd(%rsi),%rcx 0.00 : 124f84: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 124f88: 48 89 4f f3 mov %rcx,-0xd(%rdi) 0.00 : 124f8c: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 124f90: c3 retq 0.00 : 124f91: 66 66 66 66 66 66 2e data32 data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 124f98: 0f 1f 84 00 00 00 00 0.00 : 124f9f: 00 0.00 : 124fa0: 8b 56 fb mov -0x5(%rsi),%edx 0.00 : 124fa3: 8b 4e fc mov -0x4(%rsi),%ecx 0.00 : 124fa6: 89 57 fb mov %edx,-0x5(%rdi) 0.00 : 124fa9: 89 4f fc mov %ecx,-0x4(%rdi) 0.00 : 124fac: c3 retq 0.00 : 124fad: 0f 1f 00 nopl (%rax) 0.00 : 124fb0: f3 0f 6f 46 b2 movdqu -0x4e(%rsi),%xmm0 0.00 : 124fb5: f3 0f 6f 4e c2 movdqu -0x3e(%rsi),%xmm1 0.00 : 124fba: 4c 8b 46 d2 mov -0x2e(%rsi),%r8 0.00 : 124fbe: 4c 8b 4e da mov -0x26(%rsi),%r9 0.00 : 124fc2: 4c 8b 56 e2 mov -0x1e(%rsi),%r10 0.00 : 124fc6: 4c 8b 5e ea mov -0x16(%rsi),%r11 0.00 : 124fca: 48 8b 4e f2 mov -0xe(%rsi),%rcx 0.00 : 124fce: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 124fd2: f3 0f 7f 47 b2 movdqu %xmm0,-0x4e(%rdi) 0.00 : 124fd7: f3 0f 7f 4f c2 movdqu %xmm1,-0x3e(%rdi) 0.00 : 124fdc: 4c 89 47 d2 mov %r8,-0x2e(%rdi) 0.00 : 124fe0: 4c 89 4f da mov %r9,-0x26(%rdi) 0.00 : 124fe4: 4c 89 57 e2 mov %r10,-0x1e(%rdi) 0.00 : 124fe8: 4c 89 5f ea mov %r11,-0x16(%rdi) 0.00 : 124fec: 48 89 4f f2 mov %rcx,-0xe(%rdi) 0.00 : 124ff0: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 124ff4: c3 retq 0.00 : 124ff5: 66 66 2e 0f 1f 84 00 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 124ffc: 00 00 00 00 0.00 : 125000: f3 0f 6f 46 ba movdqu -0x46(%rsi),%xmm0 0.00 : 125005: f3 0f 6f 4e ca movdqu -0x36(%rsi),%xmm1 0.00 : 12500a: 4c 8b 4e da mov -0x26(%rsi),%r9 0.00 : 12500e: 4c 8b 56 e2 mov -0x1e(%rsi),%r10 0.00 : 125012: 4c 8b 5e ea mov -0x16(%rsi),%r11 0.00 : 125016: 48 8b 4e f2 mov -0xe(%rsi),%rcx 0.00 : 12501a: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 12501e: f3 0f 7f 47 ba movdqu %xmm0,-0x46(%rdi) 0.00 : 125023: f3 0f 7f 4f ca movdqu %xmm1,-0x36(%rdi) 0.00 : 125028: 4c 89 4f da mov %r9,-0x26(%rdi) 0.00 : 12502c: 4c 89 57 e2 mov %r10,-0x1e(%rdi) 0.00 : 125030: 4c 89 5f ea mov %r11,-0x16(%rdi) 0.00 : 125034: 48 89 4f f2 mov %rcx,-0xe(%rdi) 0.00 : 125038: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 12503c: c3 retq 0.00 : 12503d: 0f 1f 00 nopl (%rax) 0.00 : 125040: f3 0f 6f 46 c2 movdqu -0x3e(%rsi),%xmm0 0.00 : 125045: 4c 8b 46 d2 mov -0x2e(%rsi),%r8 0.00 : 125049: 4c 8b 4e da mov -0x26(%rsi),%r9 0.00 : 12504d: 4c 8b 56 e2 mov -0x1e(%rsi),%r10 0.00 : 125051: 4c 8b 5e ea mov -0x16(%rsi),%r11 0.00 : 125055: 48 8b 4e f2 mov -0xe(%rsi),%rcx 0.00 : 125059: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 12505d: f3 0f 7f 47 c2 movdqu %xmm0,-0x3e(%rdi) 0.00 : 125062: 4c 89 47 d2 mov %r8,-0x2e(%rdi) 0.00 : 125066: 4c 89 4f da mov %r9,-0x26(%rdi) 0.00 : 12506a: 4c 89 57 e2 mov %r10,-0x1e(%rdi) 0.00 : 12506e: 4c 89 5f ea mov %r11,-0x16(%rdi) 0.00 : 125072: 48 89 4f f2 mov %rcx,-0xe(%rdi) 0.00 : 125076: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 12507a: c3 retq 0.00 : 12507b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 125080: f3 0f 6f 46 ca movdqu -0x36(%rsi),%xmm0 0.00 : 125085: 4c 8b 4e da mov -0x26(%rsi),%r9 0.00 : 125089: 4c 8b 56 e2 mov -0x1e(%rsi),%r10 0.00 : 12508d: 4c 8b 5e ea mov -0x16(%rsi),%r11 0.00 : 125091: 48 8b 4e f2 mov -0xe(%rsi),%rcx 0.00 : 125095: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 125099: f3 0f 7f 47 ca movdqu %xmm0,-0x36(%rdi) 0.00 : 12509e: 4c 89 4f da mov %r9,-0x26(%rdi) 0.00 : 1250a2: 4c 89 57 e2 mov %r10,-0x1e(%rdi) 0.00 : 1250a6: 4c 89 5f ea mov %r11,-0x16(%rdi) 0.00 : 1250aa: 48 89 4f f2 mov %rcx,-0xe(%rdi) 0.00 : 1250ae: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 1250b2: c3 retq 0.00 : 1250b3: 66 66 66 66 2e 0f 1f data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 1250ba: 84 00 00 00 00 00 0.00 : 1250c0: 4c 8b 46 d2 mov -0x2e(%rsi),%r8 0.00 : 1250c4: 4c 8b 4e da mov -0x26(%rsi),%r9 0.00 : 1250c8: 4c 8b 56 e2 mov -0x1e(%rsi),%r10 0.00 : 1250cc: 4c 8b 5e ea mov -0x16(%rsi),%r11 0.00 : 1250d0: 48 8b 4e f2 mov -0xe(%rsi),%rcx 0.00 : 1250d4: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 1250d8: 4c 89 47 d2 mov %r8,-0x2e(%rdi) 0.00 : 1250dc: 4c 89 4f da mov %r9,-0x26(%rdi) 0.00 : 1250e0: 4c 89 57 e2 mov %r10,-0x1e(%rdi) 0.00 : 1250e4: 4c 89 5f ea mov %r11,-0x16(%rdi) 0.00 : 1250e8: 48 89 4f f2 mov %rcx,-0xe(%rdi) 0.00 : 1250ec: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 1250f0: c3 retq 0.00 : 1250f1: 66 66 66 66 66 66 2e data32 data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 1250f8: 0f 1f 84 00 00 00 00 0.00 : 1250ff: 00 0.00 : 125100: 4c 8b 4e da mov -0x26(%rsi),%r9 0.00 : 125104: 4c 8b 56 e2 mov -0x1e(%rsi),%r10 0.00 : 125108: 4c 8b 5e ea mov -0x16(%rsi),%r11 0.00 : 12510c: 48 8b 4e f2 mov -0xe(%rsi),%rcx 0.00 : 125110: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 125114: 4c 89 4f da mov %r9,-0x26(%rdi) 0.00 : 125118: 4c 89 57 e2 mov %r10,-0x1e(%rdi) 0.00 : 12511c: 4c 89 5f ea mov %r11,-0x16(%rdi) 0.00 : 125120: 48 89 4f f2 mov %rcx,-0xe(%rdi) 0.00 : 125124: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 125128: c3 retq 0.00 : 125129: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 0.00 : 125130: 4c 8b 56 e2 mov -0x1e(%rsi),%r10 0.00 : 125134: 4c 8b 5e ea mov -0x16(%rsi),%r11 0.00 : 125138: 48 8b 4e f2 mov -0xe(%rsi),%rcx 0.00 : 12513c: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 125140: 4c 89 57 e2 mov %r10,-0x1e(%rdi) 0.00 : 125144: 4c 89 5f ea mov %r11,-0x16(%rdi) 0.00 : 125148: 48 89 4f f2 mov %rcx,-0xe(%rdi) 0.00 : 12514c: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 125150: c3 retq 0.00 : 125151: 66 66 66 66 66 66 2e data32 data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 125158: 0f 1f 84 00 00 00 00 0.00 : 12515f: 00 0.00 : 125160: 4c 8b 5e ea mov -0x16(%rsi),%r11 0.00 : 125164: 48 8b 4e f2 mov -0xe(%rsi),%rcx 0.00 : 125168: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 12516c: 4c 89 5f ea mov %r11,-0x16(%rdi) 0.00 : 125170: 48 89 4f f2 mov %rcx,-0xe(%rdi) 0.00 : 125174: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 125178: c3 retq 0.00 : 125179: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 0.00 : 125180: 48 8b 4e f2 mov -0xe(%rsi),%rcx 0.00 : 125184: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 125188: 48 89 4f f2 mov %rcx,-0xe(%rdi) 0.00 : 12518c: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 125190: c3 retq 0.00 : 125191: 66 66 66 66 66 66 2e data32 data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 125198: 0f 1f 84 00 00 00 00 0.00 : 12519f: 00 0.00 : 1251a0: 8b 56 fa mov -0x6(%rsi),%edx 0.00 : 1251a3: 8b 4e fc mov -0x4(%rsi),%ecx 0.00 : 1251a6: 89 57 fa mov %edx,-0x6(%rdi) 0.00 : 1251a9: 89 4f fc mov %ecx,-0x4(%rdi) 0.00 : 1251ac: c3 retq 0.00 : 1251ad: 0f 1f 00 nopl (%rax) 0.00 : 1251b0: f3 0f 6f 46 b1 movdqu -0x4f(%rsi),%xmm0 0.00 : 1251b5: f3 0f 6f 4e c1 movdqu -0x3f(%rsi),%xmm1 0.00 : 1251ba: 4c 8b 46 d1 mov -0x2f(%rsi),%r8 0.00 : 1251be: 4c 8b 4e d9 mov -0x27(%rsi),%r9 0.00 : 1251c2: 4c 8b 56 e1 mov -0x1f(%rsi),%r10 0.00 : 1251c6: 4c 8b 5e e9 mov -0x17(%rsi),%r11 0.00 : 1251ca: 48 8b 4e f1 mov -0xf(%rsi),%rcx 0.00 : 1251ce: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 1251d2: f3 0f 7f 47 b1 movdqu %xmm0,-0x4f(%rdi) 0.00 : 1251d7: f3 0f 7f 4f c1 movdqu %xmm1,-0x3f(%rdi) 0.00 : 1251dc: 4c 89 47 d1 mov %r8,-0x2f(%rdi) 0.00 : 1251e0: 4c 89 4f d9 mov %r9,-0x27(%rdi) 0.00 : 1251e4: 4c 89 57 e1 mov %r10,-0x1f(%rdi) 0.00 : 1251e8: 4c 89 5f e9 mov %r11,-0x17(%rdi) 0.00 : 1251ec: 48 89 4f f1 mov %rcx,-0xf(%rdi) 0.00 : 1251f0: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 1251f4: c3 retq 0.00 : 1251f5: 66 66 2e 0f 1f 84 00 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 1251fc: 00 00 00 00 0.00 : 125200: f3 0f 6f 46 b9 movdqu -0x47(%rsi),%xmm0 0.00 : 125205: f3 0f 6f 4e c9 movdqu -0x37(%rsi),%xmm1 0.00 : 12520a: 4c 8b 4e d9 mov -0x27(%rsi),%r9 0.00 : 12520e: 4c 8b 56 e1 mov -0x1f(%rsi),%r10 0.00 : 125212: 4c 8b 5e e9 mov -0x17(%rsi),%r11 0.00 : 125216: 48 8b 4e f1 mov -0xf(%rsi),%rcx 0.00 : 12521a: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 12521e: f3 0f 7f 47 b9 movdqu %xmm0,-0x47(%rdi) 0.00 : 125223: f3 0f 7f 4f c9 movdqu %xmm1,-0x37(%rdi) 0.00 : 125228: 4c 89 4f d9 mov %r9,-0x27(%rdi) 0.00 : 12522c: 4c 89 57 e1 mov %r10,-0x1f(%rdi) 0.00 : 125230: 4c 89 5f e9 mov %r11,-0x17(%rdi) 0.00 : 125234: 48 89 4f f1 mov %rcx,-0xf(%rdi) 0.00 : 125238: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 12523c: c3 retq 0.00 : 12523d: 0f 1f 00 nopl (%rax) 0.00 : 125240: f3 0f 6f 46 c1 movdqu -0x3f(%rsi),%xmm0 0.00 : 125245: 4c 8b 46 d1 mov -0x2f(%rsi),%r8 0.00 : 125249: 4c 8b 4e d9 mov -0x27(%rsi),%r9 0.00 : 12524d: 4c 8b 56 e1 mov -0x1f(%rsi),%r10 0.00 : 125251: 4c 8b 5e e9 mov -0x17(%rsi),%r11 0.00 : 125255: 48 8b 4e f1 mov -0xf(%rsi),%rcx 0.00 : 125259: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 12525d: f3 0f 7f 47 c1 movdqu %xmm0,-0x3f(%rdi) 0.00 : 125262: 4c 89 47 d1 mov %r8,-0x2f(%rdi) 0.00 : 125266: 4c 89 4f d9 mov %r9,-0x27(%rdi) 0.00 : 12526a: 4c 89 57 e1 mov %r10,-0x1f(%rdi) 0.00 : 12526e: 4c 89 5f e9 mov %r11,-0x17(%rdi) 0.00 : 125272: 48 89 4f f1 mov %rcx,-0xf(%rdi) 0.00 : 125276: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 12527a: c3 retq 0.00 : 12527b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 125280: f3 0f 6f 46 c9 movdqu -0x37(%rsi),%xmm0 0.00 : 125285: 4c 8b 4e d9 mov -0x27(%rsi),%r9 0.00 : 125289: 4c 8b 56 e1 mov -0x1f(%rsi),%r10 0.00 : 12528d: 4c 8b 5e e9 mov -0x17(%rsi),%r11 0.00 : 125291: 48 8b 4e f1 mov -0xf(%rsi),%rcx 0.00 : 125295: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 125299: f3 0f 7f 47 c9 movdqu %xmm0,-0x37(%rdi) 0.00 : 12529e: 4c 89 4f d9 mov %r9,-0x27(%rdi) 0.00 : 1252a2: 4c 89 57 e1 mov %r10,-0x1f(%rdi) 0.00 : 1252a6: 4c 89 5f e9 mov %r11,-0x17(%rdi) 0.00 : 1252aa: 48 89 4f f1 mov %rcx,-0xf(%rdi) 0.00 : 1252ae: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 1252b2: c3 retq 0.00 : 1252b3: 66 66 66 66 2e 0f 1f data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 1252ba: 84 00 00 00 00 00 0.00 : 1252c0: 4c 8b 46 d1 mov -0x2f(%rsi),%r8 0.00 : 1252c4: 4c 8b 4e d9 mov -0x27(%rsi),%r9 0.00 : 1252c8: 4c 8b 56 e1 mov -0x1f(%rsi),%r10 0.00 : 1252cc: 4c 8b 5e e9 mov -0x17(%rsi),%r11 0.00 : 1252d0: 48 8b 4e f1 mov -0xf(%rsi),%rcx 0.00 : 1252d4: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 1252d8: 4c 89 47 d1 mov %r8,-0x2f(%rdi) 0.00 : 1252dc: 4c 89 4f d9 mov %r9,-0x27(%rdi) 0.00 : 1252e0: 4c 89 57 e1 mov %r10,-0x1f(%rdi) 0.00 : 1252e4: 4c 89 5f e9 mov %r11,-0x17(%rdi) 0.00 : 1252e8: 48 89 4f f1 mov %rcx,-0xf(%rdi) 0.00 : 1252ec: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 1252f0: c3 retq 0.00 : 1252f1: 66 66 66 66 66 66 2e data32 data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 1252f8: 0f 1f 84 00 00 00 00 0.00 : 1252ff: 00 0.00 : 125300: 4c 8b 4e d9 mov -0x27(%rsi),%r9 0.00 : 125304: 4c 8b 56 e1 mov -0x1f(%rsi),%r10 0.00 : 125308: 4c 8b 5e e9 mov -0x17(%rsi),%r11 0.00 : 12530c: 48 8b 4e f1 mov -0xf(%rsi),%rcx 0.00 : 125310: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 125314: 4c 89 4f d9 mov %r9,-0x27(%rdi) 0.00 : 125318: 4c 89 57 e1 mov %r10,-0x1f(%rdi) 0.00 : 12531c: 4c 89 5f e9 mov %r11,-0x17(%rdi) 0.00 : 125320: 48 89 4f f1 mov %rcx,-0xf(%rdi) 0.00 : 125324: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 125328: c3 retq 0.00 : 125329: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 0.00 : 125330: 4c 8b 56 e1 mov -0x1f(%rsi),%r10 0.00 : 125334: 4c 8b 5e e9 mov -0x17(%rsi),%r11 0.00 : 125338: 48 8b 4e f1 mov -0xf(%rsi),%rcx 0.00 : 12533c: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 125340: 4c 89 57 e1 mov %r10,-0x1f(%rdi) 0.00 : 125344: 4c 89 5f e9 mov %r11,-0x17(%rdi) 0.00 : 125348: 48 89 4f f1 mov %rcx,-0xf(%rdi) 0.00 : 12534c: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 125350: c3 retq 0.00 : 125351: 66 66 66 66 66 66 2e data32 data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 125358: 0f 1f 84 00 00 00 00 0.00 : 12535f: 00 0.00 : 125360: 4c 8b 5e e9 mov -0x17(%rsi),%r11 0.00 : 125364: 48 8b 4e f1 mov -0xf(%rsi),%rcx 0.00 : 125368: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 12536c: 4c 89 5f e9 mov %r11,-0x17(%rdi) 0.00 : 125370: 48 89 4f f1 mov %rcx,-0xf(%rdi) 0.00 : 125374: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 125378: c3 retq 0.00 : 125379: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 0.00 : 125380: 48 8b 4e f1 mov -0xf(%rsi),%rcx 0.00 : 125384: 48 8b 56 f8 mov -0x8(%rsi),%rdx 0.00 : 125388: 48 89 4f f1 mov %rcx,-0xf(%rdi) 0.00 : 12538c: 48 89 57 f8 mov %rdx,-0x8(%rdi) 0.00 : 125390: c3 retq 0.00 : 125391: 66 66 66 66 66 66 2e data32 data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 125398: 0f 1f 84 00 00 00 00 0.00 : 12539f: 00 0.00 : 1253a0: 8b 56 f9 mov -0x7(%rsi),%edx 0.00 : 1253a3: 8b 4e fc mov -0x4(%rsi),%ecx 0.00 : 1253a6: 89 57 f9 mov %edx,-0x7(%rdi) 0.00 : 1253a9: 89 4f fc mov %ecx,-0x4(%rdi) 0.00 : 1253ac: c3 retq 0.00 : 1253ad: 0f 1f 00 nopl (%rax) 0.00 : 1253b0: f3 0f 6f 0e movdqu (%rsi),%xmm1 0.00 : 1253b4: 48 8d 76 10 lea 0x10(%rsi),%rsi 0.00 : 1253b8: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 1253bd: 66 0f e7 0f movntdq %xmm1,(%rdi) 0.00 : 1253c1: 48 8d 7f 10 lea 0x10(%rdi),%rdi 0.00 : 1253c5: 48 8d 92 70 ff ff ff lea -0x90(%rdx),%rdx 0.00 : 1253cc: 49 89 f1 mov %rsi,%r9 0.00 : 1253cf: 49 29 f9 sub %rdi,%r9 0.00 : 1253d2: 49 39 d1 cmp %rdx,%r9 0.00 : 1253d5: 73 0d jae 1253e4 <__memmove_ssse3+0x2834> 0.00 : 1253d7: 48 c1 e1 02 shl $0x2,%rcx 0.00 : 1253db: 48 39 ca cmp %rcx,%rdx 0.00 : 1253de: 0f 82 cc 00 00 00 jb 1254b0 <__memmove_ssse3+0x2900> 0.00 : 1253e4: f3 0f 6f 06 movdqu (%rsi),%xmm0 0.00 : 1253e8: f3 0f 6f 4e 10 movdqu 0x10(%rsi),%xmm1 0.00 : 1253ed: f3 0f 6f 56 20 movdqu 0x20(%rsi),%xmm2 0.00 : 1253f2: f3 0f 6f 5e 30 movdqu 0x30(%rsi),%xmm3 0.00 : 1253f7: f3 0f 6f 66 40 movdqu 0x40(%rsi),%xmm4 0.00 : 1253fc: f3 0f 6f 6e 50 movdqu 0x50(%rsi),%xmm5 0.00 : 125401: f3 0f 6f 76 60 movdqu 0x60(%rsi),%xmm6 0.00 : 125406: f3 0f 6f 7e 70 movdqu 0x70(%rsi),%xmm7 0.00 : 12540b: 48 8d b6 80 00 00 00 lea 0x80(%rsi),%rsi 0.00 : 125412: 48 81 ea 80 00 00 00 sub $0x80,%rdx 0.00 : 125419: 66 0f e7 07 movntdq %xmm0,(%rdi) 0.00 : 12541d: 66 0f e7 4f 10 movntdq %xmm1,0x10(%rdi) 0.00 : 125422: 66 0f e7 57 20 movntdq %xmm2,0x20(%rdi) 0.00 : 125427: 66 0f e7 5f 30 movntdq %xmm3,0x30(%rdi) 0.00 : 12542c: 66 0f e7 67 40 movntdq %xmm4,0x40(%rdi) 0.00 : 125431: 66 0f e7 6f 50 movntdq %xmm5,0x50(%rdi) 0.00 : 125436: 66 0f e7 77 60 movntdq %xmm6,0x60(%rdi) 0.00 : 12543b: 66 0f e7 7f 70 movntdq %xmm7,0x70(%rdi) 0.00 : 125440: 48 8d bf 80 00 00 00 lea 0x80(%rdi),%rdi 0.00 : 125447: 73 9b jae 1253e4 <__memmove_ssse3+0x2834> 0.00 : 125449: 48 83 fa c0 cmp $0xffffffffffffffc0,%rdx 0.00 : 12544d: 48 8d 92 80 00 00 00 lea 0x80(%rdx),%rdx 0.00 : 125454: 7c 32 jl 125488 <__memmove_ssse3+0x28d8> 0.00 : 125456: f3 0f 6f 06 movdqu (%rsi),%xmm0 0.00 : 12545a: f3 0f 6f 4e 10 movdqu 0x10(%rsi),%xmm1 0.00 : 12545f: f3 0f 6f 56 20 movdqu 0x20(%rsi),%xmm2 0.00 : 125464: f3 0f 6f 5e 30 movdqu 0x30(%rsi),%xmm3 0.00 : 125469: 48 8d 76 40 lea 0x40(%rsi),%rsi 0.00 : 12546d: 66 0f e7 07 movntdq %xmm0,(%rdi) 0.00 : 125471: 66 0f e7 4f 10 movntdq %xmm1,0x10(%rdi) 0.00 : 125476: 66 0f e7 57 20 movntdq %xmm2,0x20(%rdi) 0.00 : 12547b: 66 0f e7 5f 30 movntdq %xmm3,0x30(%rdi) 0.00 : 125480: 48 8d 7f 40 lea 0x40(%rdi),%rdi 0.00 : 125484: 48 83 ea 40 sub $0x40,%rdx 0.00 : 125488: 48 01 d6 add %rdx,%rsi 0.00 : 12548b: 48 01 d7 add %rdx,%rdi 0.00 : 12548e: 0f ae f8 sfence 0.00 : 125491: 4c 8d 1d 08 ee 01 00 lea 0x1ee08(%rip),%r11 # 1442a0 0.00 : 125498: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 12549c: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 1254a0: ff e2 jmpq *%rdx 0.00 : 1254a2: 0f 0b ud2 0.00 : 1254a4: 66 66 66 2e 0f 1f 84 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 1254ab: 00 00 00 00 00 0.00 : 1254b0: 0f 18 8e c0 01 00 00 prefetcht0 0x1c0(%rsi) 0.00 : 1254b7: 0f 18 8e 00 02 00 00 prefetcht0 0x200(%rsi) 0.00 : 1254be: f3 0f 6f 06 movdqu (%rsi),%xmm0 0.00 : 1254c2: f3 0f 6f 4e 10 movdqu 0x10(%rsi),%xmm1 0.00 : 1254c7: f3 0f 6f 56 20 movdqu 0x20(%rsi),%xmm2 0.00 : 1254cc: f3 0f 6f 5e 30 movdqu 0x30(%rsi),%xmm3 0.00 : 1254d1: f3 0f 6f 66 40 movdqu 0x40(%rsi),%xmm4 0.00 : 1254d6: f3 0f 6f 6e 50 movdqu 0x50(%rsi),%xmm5 0.00 : 1254db: f3 0f 6f 76 60 movdqu 0x60(%rsi),%xmm6 0.00 : 1254e0: f3 0f 6f 7e 70 movdqu 0x70(%rsi),%xmm7 0.00 : 1254e5: 48 8d b6 80 00 00 00 lea 0x80(%rsi),%rsi 0.00 : 1254ec: 48 81 ea 80 00 00 00 sub $0x80,%rdx 0.00 : 1254f3: 0f 29 07 movaps %xmm0,(%rdi) 0.00 : 1254f6: 0f 29 4f 10 movaps %xmm1,0x10(%rdi) 0.00 : 1254fa: 0f 29 57 20 movaps %xmm2,0x20(%rdi) 0.00 : 1254fe: 0f 29 5f 30 movaps %xmm3,0x30(%rdi) 0.00 : 125502: 0f 29 67 40 movaps %xmm4,0x40(%rdi) 0.00 : 125506: 0f 29 6f 50 movaps %xmm5,0x50(%rdi) 0.00 : 12550a: 0f 29 77 60 movaps %xmm6,0x60(%rdi) 0.00 : 12550e: 0f 29 7f 70 movaps %xmm7,0x70(%rdi) 0.00 : 125512: 48 8d bf 80 00 00 00 lea 0x80(%rdi),%rdi 0.00 : 125519: 73 95 jae 1254b0 <__memmove_ssse3+0x2900> 0.00 : 12551b: 48 83 fa c0 cmp $0xffffffffffffffc0,%rdx 0.00 : 12551f: 48 8d 92 80 00 00 00 lea 0x80(%rdx),%rdx 0.00 : 125526: 7c 2e jl 125556 <__memmove_ssse3+0x29a6> 0.00 : 125528: f3 0f 6f 06 movdqu (%rsi),%xmm0 0.00 : 12552c: f3 0f 6f 4e 10 movdqu 0x10(%rsi),%xmm1 0.00 : 125531: f3 0f 6f 56 20 movdqu 0x20(%rsi),%xmm2 0.00 : 125536: f3 0f 6f 5e 30 movdqu 0x30(%rsi),%xmm3 0.00 : 12553b: 48 8d 76 40 lea 0x40(%rsi),%rsi 0.00 : 12553f: 0f 29 07 movaps %xmm0,(%rdi) 0.00 : 125542: 0f 29 4f 10 movaps %xmm1,0x10(%rdi) 0.00 : 125546: 0f 29 57 20 movaps %xmm2,0x20(%rdi) 0.00 : 12554a: 0f 29 5f 30 movaps %xmm3,0x30(%rdi) 0.00 : 12554e: 48 8d 7f 40 lea 0x40(%rdi),%rdi 0.00 : 125552: 48 83 ea 40 sub $0x40,%rdx 0.00 : 125556: 48 01 d6 add %rdx,%rsi 0.00 : 125559: 48 01 d7 add %rdx,%rdi 0.00 : 12555c: 4c 8d 1d 3d ed 01 00 lea 0x1ed3d(%rip),%r11 # 1442a0 0.00 : 125563: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 125567: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 12556b: ff e2 jmpq *%rdx 0.00 : 12556d: 0f 0b ud2 0.00 : 12556f: 90 nop 0.00 : 125570: f3 0f 6f 4e f0 movdqu -0x10(%rsi),%xmm1 0.00 : 125575: 48 8d 76 f0 lea -0x10(%rsi),%rsi 0.00 : 125579: f3 41 0f 7f 00 movdqu %xmm0,(%r8) 0.00 : 12557e: 66 0f 7f 4f f0 movdqa %xmm1,-0x10(%rdi) 0.00 : 125583: 48 8d 7f f0 lea -0x10(%rdi),%rdi 0.00 : 125587: 48 8d 92 70 ff ff ff lea -0x90(%rdx),%rdx 0.00 : 12558e: 49 89 f9 mov %rdi,%r9 0.00 : 125591: 49 29 f1 sub %rsi,%r9 0.00 : 125594: 49 39 d1 cmp %rdx,%r9 0.00 : 125597: 73 09 jae 1255a2 <__memmove_ssse3+0x29f2> 0.00 : 125599: 49 39 c9 cmp %rcx,%r9 0.00 : 12559c: 0f 82 be 00 00 00 jb 125660 <__memmove_ssse3+0x2ab0> 0.00 : 1255a2: f3 0f 6f 46 f0 movdqu -0x10(%rsi),%xmm0 0.00 : 1255a7: f3 0f 6f 4e e0 movdqu -0x20(%rsi),%xmm1 0.00 : 1255ac: f3 0f 6f 56 d0 movdqu -0x30(%rsi),%xmm2 0.00 : 1255b1: f3 0f 6f 5e c0 movdqu -0x40(%rsi),%xmm3 0.00 : 1255b6: f3 0f 6f 66 b0 movdqu -0x50(%rsi),%xmm4 0.00 : 1255bb: f3 0f 6f 6e a0 movdqu -0x60(%rsi),%xmm5 0.00 : 1255c0: f3 0f 6f 76 90 movdqu -0x70(%rsi),%xmm6 0.00 : 1255c5: f3 0f 6f 7e 80 movdqu -0x80(%rsi),%xmm7 0.00 : 1255ca: 48 8d 76 80 lea -0x80(%rsi),%rsi 0.00 : 1255ce: 48 81 ea 80 00 00 00 sub $0x80,%rdx 0.00 : 1255d5: 66 0f e7 47 f0 movntdq %xmm0,-0x10(%rdi) 0.00 : 1255da: 66 0f e7 4f e0 movntdq %xmm1,-0x20(%rdi) 0.00 : 1255df: 66 0f e7 57 d0 movntdq %xmm2,-0x30(%rdi) 0.00 : 1255e4: 66 0f e7 5f c0 movntdq %xmm3,-0x40(%rdi) 0.00 : 1255e9: 66 0f e7 67 b0 movntdq %xmm4,-0x50(%rdi) 0.00 : 1255ee: 66 0f e7 6f a0 movntdq %xmm5,-0x60(%rdi) 0.00 : 1255f3: 66 0f e7 77 90 movntdq %xmm6,-0x70(%rdi) 0.00 : 1255f8: 66 0f e7 7f 80 movntdq %xmm7,-0x80(%rdi) 0.00 : 1255fd: 48 8d 7f 80 lea -0x80(%rdi),%rdi 0.00 : 125601: 73 9f jae 1255a2 <__memmove_ssse3+0x29f2> 0.00 : 125603: 48 83 fa c0 cmp $0xffffffffffffffc0,%rdx 0.00 : 125607: 48 8d 92 80 00 00 00 lea 0x80(%rdx),%rdx 0.00 : 12560e: 7c 34 jl 125644 <__memmove_ssse3+0x2a94> 0.00 : 125610: f3 0f 6f 46 f0 movdqu -0x10(%rsi),%xmm0 0.00 : 125615: f3 0f 6f 4e e0 movdqu -0x20(%rsi),%xmm1 0.00 : 12561a: f3 0f 6f 56 d0 movdqu -0x30(%rsi),%xmm2 0.00 : 12561f: f3 0f 6f 5e c0 movdqu -0x40(%rsi),%xmm3 0.00 : 125624: 48 8d 76 c0 lea -0x40(%rsi),%rsi 0.00 : 125628: 66 0f e7 47 f0 movntdq %xmm0,-0x10(%rdi) 0.00 : 12562d: 66 0f e7 4f e0 movntdq %xmm1,-0x20(%rdi) 0.00 : 125632: 66 0f e7 57 d0 movntdq %xmm2,-0x30(%rdi) 0.00 : 125637: 66 0f e7 5f c0 movntdq %xmm3,-0x40(%rdi) 0.00 : 12563c: 48 8d 7f c0 lea -0x40(%rdi),%rdi 0.00 : 125640: 48 83 ea 40 sub $0x40,%rdx 0.00 : 125644: 0f ae f8 sfence 0.00 : 125647: 4c 8d 1d 52 ec 01 00 lea 0x1ec52(%rip),%r11 # 1442a0 0.00 : 12564e: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 125652: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 125656: ff e2 jmpq *%rdx 0.00 : 125658: 0f 0b ud2 0.00 : 12565a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 125660: 0f 18 8e 40 fe ff ff prefetcht0 -0x1c0(%rsi) 0.00 : 125667: 0f 18 8e 00 fe ff ff prefetcht0 -0x200(%rsi) 0.00 : 12566e: f3 0f 6f 46 f0 movdqu -0x10(%rsi),%xmm0 0.00 : 125673: f3 0f 6f 4e e0 movdqu -0x20(%rsi),%xmm1 0.00 : 125678: f3 0f 6f 56 d0 movdqu -0x30(%rsi),%xmm2 0.00 : 12567d: f3 0f 6f 5e c0 movdqu -0x40(%rsi),%xmm3 0.00 : 125682: f3 0f 6f 66 b0 movdqu -0x50(%rsi),%xmm4 0.00 : 125687: f3 0f 6f 6e a0 movdqu -0x60(%rsi),%xmm5 0.00 : 12568c: f3 0f 6f 76 90 movdqu -0x70(%rsi),%xmm6 0.00 : 125691: f3 0f 6f 7e 80 movdqu -0x80(%rsi),%xmm7 0.00 : 125696: 48 8d 76 80 lea -0x80(%rsi),%rsi 0.00 : 12569a: 48 81 ea 80 00 00 00 sub $0x80,%rdx 0.00 : 1256a1: 0f 29 47 f0 movaps %xmm0,-0x10(%rdi) 0.00 : 1256a5: 0f 29 4f e0 movaps %xmm1,-0x20(%rdi) 0.00 : 1256a9: 0f 29 57 d0 movaps %xmm2,-0x30(%rdi) 0.00 : 1256ad: 0f 29 5f c0 movaps %xmm3,-0x40(%rdi) 0.00 : 1256b1: 0f 29 67 b0 movaps %xmm4,-0x50(%rdi) 0.00 : 1256b5: 0f 29 6f a0 movaps %xmm5,-0x60(%rdi) 0.00 : 1256b9: 0f 29 77 90 movaps %xmm6,-0x70(%rdi) 0.00 : 1256bd: 0f 29 7f 80 movaps %xmm7,-0x80(%rdi) 0.00 : 1256c1: 48 8d 7f 80 lea -0x80(%rdi),%rdi 0.00 : 1256c5: 73 99 jae 125660 <__memmove_ssse3+0x2ab0> 0.00 : 1256c7: 48 83 fa c0 cmp $0xffffffffffffffc0,%rdx 0.00 : 1256cb: 48 8d 92 80 00 00 00 lea 0x80(%rdx),%rdx 0.00 : 1256d2: 7c 30 jl 125704 <__memmove_ssse3+0x2b54> 0.00 : 1256d4: f3 0f 6f 46 f0 movdqu -0x10(%rsi),%xmm0 0.00 : 1256d9: f3 0f 6f 4e e0 movdqu -0x20(%rsi),%xmm1 0.00 : 1256de: f3 0f 6f 56 d0 movdqu -0x30(%rsi),%xmm2 0.00 : 1256e3: f3 0f 6f 5e c0 movdqu -0x40(%rsi),%xmm3 0.00 : 1256e8: 48 8d 76 c0 lea -0x40(%rsi),%rsi 0.00 : 1256ec: 0f 29 47 f0 movaps %xmm0,-0x10(%rdi) 0.00 : 1256f0: 0f 29 4f e0 movaps %xmm1,-0x20(%rdi) 0.00 : 1256f4: 0f 29 57 d0 movaps %xmm2,-0x30(%rdi) 0.00 : 1256f8: 0f 29 5f c0 movaps %xmm3,-0x40(%rdi) 0.00 : 1256fc: 48 8d 7f c0 lea -0x40(%rdi),%rdi 0.00 : 125700: 48 83 ea 40 sub $0x40,%rdx 0.00 : 125704: 4c 8d 1d 95 eb 01 00 lea 0x1eb95(%rip),%r11 # 1442a0 0.00 : 12570b: 49 63 14 93 movslq (%r11,%rdx,4),%rdx 0.00 : 12570f: 49 8d 14 13 lea (%r11,%rdx,1),%rdx 0.00 : 125713: ff e2 jmpq *%rdx 0.00 : 125715: 0f 0b ud2 Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 50.00 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:101 50.00 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:138 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000004ad100 <_bt_search>: : * any incomplete splits encountered during the search will be finished. : */ : BTStack : _bt_search(Relation rel, int keysz, ScanKey scankey, bool nextkey, : Buffer *bufP, int access) : { 0.00 : 4ad100: 55 push %rbp 0.00 : 4ad101: 48 89 e5 mov %rsp,%rbp 0.00 : 4ad104: 41 57 push %r15 0.00 : 4ad106: 41 56 push %r14 0.00 : 4ad108: 41 55 push %r13 0.00 : 4ad10a: 41 54 push %r12 0.00 : 4ad10c: 41 89 cc mov %ecx,%r12d 0.00 : 4ad10f: 53 push %rbx 0.00 : 4ad110: 44 89 cb mov %r9d,%ebx 0.00 : 4ad113: 48 83 ec 48 sub $0x48,%rsp 0.00 : 4ad117: 89 75 bc mov %esi,-0x44(%rbp) : BTStack stack_in = NULL; : : /* Get the root page to start with */ : *bufP = _bt_getroot(rel, access); 0.00 : 4ad11a: 44 89 ce mov %r9d,%esi : * any incomplete splits encountered during the search will be finished. : */ : BTStack : _bt_search(Relation rel, int keysz, ScanKey scankey, bool nextkey, : Buffer *bufP, int access) : { 0.00 : 4ad11d: 48 89 7d c0 mov %rdi,-0x40(%rbp) 0.00 : 4ad121: 48 89 55 b0 mov %rdx,-0x50(%rbp) 0.00 : 4ad125: 4c 89 45 a8 mov %r8,-0x58(%rbp) : BTStack stack_in = NULL; : : /* Get the root page to start with */ : *bufP = _bt_getroot(rel, access); 0.00 : 4ad129: e8 f2 da ff ff callq 4aac20 <_bt_getroot> 0.00 : 4ad12e: 89 c6 mov %eax,%esi 0.00 : 4ad130: 48 8b 45 a8 mov -0x58(%rbp),%rax : : /* If index is empty and access = BT_READ, no root page is created. */ : if (!BufferIsValid(*bufP)) 0.00 : 4ad134: 85 f6 test %esi,%esi : Buffer *bufP, int access) : { : BTStack stack_in = NULL; : : /* Get the root page to start with */ : *bufP = _bt_getroot(rel, access); 0.00 : 4ad136: 89 30 mov %esi,(%rax) : /* drop the read lock on the parent page, acquire one on the child */ : *bufP = _bt_relandgetbuf(rel, *bufP, blkno, BT_READ); : : /* okay, all set to move down a level */ : stack_in = new_stack; : } 0.00 : 4ad138: 48 c7 45 c8 00 00 00 movq $0x0,-0x38(%rbp) 0.00 : 4ad13f: 00 : : /* Get the root page to start with */ : *bufP = _bt_getroot(rel, access); : : /* If index is empty and access = BT_READ, no root page is created. */ : if (!BufferIsValid(*bufP)) 0.00 : 4ad140: 0f 84 2a 01 00 00 je 4ad270 <_bt_search+0x170> 0.00 : 4ad146: 31 c0 xor %eax,%eax 0.00 : 4ad148: 83 fb 02 cmp $0x2,%ebx 0.00 : 4ad14b: 45 0f be e4 movsbl %r12b,%r12d 0.00 : 4ad14f: 0f 94 c0 sete %al 0.00 : 4ad152: 44 89 65 d0 mov %r12d,-0x30(%rbp) 0.00 : 4ad156: 89 45 d4 mov %eax,-0x2c(%rbp) 0.00 : 4ad159: e9 b5 00 00 00 jmpq 4ad213 <_bt_search+0x113> 0.00 : 4ad15e: 66 90 xchg %ax,%ax : *bufP = _bt_moveright(rel, *bufP, keysz, scankey, nextkey, : (access == BT_WRITE), stack_in, : BT_READ); : : /* if this is a leaf page, we're done */ : page = BufferGetPage(*bufP); 0.00 : 4ad160: 8d 46 ff lea -0x1(%rsi),%eax 0.00 : 4ad163: 4c 63 e0 movslq %eax,%r12 0.00 : 4ad166: 49 c1 e4 0d shl $0xd,%r12 0.00 : 4ad16a: 4c 03 25 87 29 71 00 add 0x712987(%rip),%r12 # bbfaf8 : opaque = (BTPageOpaque) PageGetSpecialPointer(page); : if (P_ISLEAF(opaque)) 0.00 : 4ad171: 41 0f b7 44 24 10 movzwl 0x10(%r12),%eax 0.00 : 4ad177: 41 f6 44 04 0c 01 testb $0x1,0xc(%r12,%rax,1) /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:101 50.00 : 4ad17d: 0f 85 ed 00 00 00 jne 4ad270 <_bt_search+0x170> : : /* : * Find the appropriate item on the internal page, and get the child : * page that it points to. : */ : offnum = _bt_binsrch(rel, *bufP, keysz, scankey, nextkey); 0.00 : 4ad183: 44 8b 45 d0 mov -0x30(%rbp),%r8d 0.00 : 4ad187: 48 8b 4d b0 mov -0x50(%rbp),%rcx 0.00 : 4ad18b: 8b 55 bc mov -0x44(%rbp),%edx 0.00 : 4ad18e: 48 8b 7d c0 mov -0x40(%rbp),%rdi 0.00 : 4ad192: e8 c9 fc ff ff callq 4ace60 <_bt_binsrch> 0.00 : 4ad197: 41 89 c7 mov %eax,%r15d : itemid = PageGetItemId(page, offnum); : itup = (IndexTuple) PageGetItem(page, itemid); 0.00 : 4ad19a: 0f b7 c0 movzwl %ax,%eax 0.00 : 4ad19d: 41 0f b7 5c 84 14 movzwl 0x14(%r12,%rax,4),%ebx 0.00 : 4ad1a3: 81 e3 ff 7f 00 00 and $0x7fff,%ebx 0.00 : 4ad1a9: 49 8d 1c 1c lea (%r12,%rbx,1),%rbx : blkno = ItemPointerGetBlockNumber(&(itup->t_tid)); 0.00 : 4ad1ad: 44 0f b7 2b movzwl (%rbx),%r13d 0.00 : 4ad1b1: 0f b7 43 02 movzwl 0x2(%rbx),%eax 0.00 : 4ad1b5: 41 c1 e5 10 shl $0x10,%r13d 0.00 : 4ad1b9: 41 09 c5 or %eax,%r13d : par_blkno = BufferGetBlockNumber(*bufP); 0.00 : 4ad1bc: 48 8b 45 a8 mov -0x58(%rbp),%rax 0.00 : 4ad1c0: 8b 38 mov (%rax),%edi 0.00 : 4ad1c2: e8 69 6e 1c 00 callq 674030 : * moves right while we're working lower in the tree. See the paper : * by Lehman and Yao for how this is detected and handled. (We use the : * child link to disambiguate duplicate keys in the index -- Lehman : * and Yao disallow duplicate keys.) : */ : new_stack = (BTStack) palloc(sizeof(BTStackData)); 0.00 : 4ad1c7: bf 18 00 00 00 mov $0x18,%edi : */ : offnum = _bt_binsrch(rel, *bufP, keysz, scankey, nextkey); : itemid = PageGetItemId(page, offnum); : itup = (IndexTuple) PageGetItem(page, itemid); : blkno = ItemPointerGetBlockNumber(&(itup->t_tid)); : par_blkno = BufferGetBlockNumber(*bufP); 0.00 : 4ad1cc: 41 89 c6 mov %eax,%r14d : * moves right while we're working lower in the tree. See the paper : * by Lehman and Yao for how this is detected and handled. (We use the : * child link to disambiguate duplicate keys in the index -- Lehman : * and Yao disallow duplicate keys.) : */ : new_stack = (BTStack) palloc(sizeof(BTStackData)); 0.00 : 4ad1cf: e8 7c bb 2e 00 callq 798d50 : new_stack->bts_blkno = par_blkno; 0.00 : 4ad1d4: 44 89 30 mov %r14d,(%rax) : new_stack->bts_offset = offnum; 0.00 : 4ad1d7: 66 44 89 78 04 mov %r15w,0x4(%rax) : * moves right while we're working lower in the tree. See the paper : * by Lehman and Yao for how this is detected and handled. (We use the : * child link to disambiguate duplicate keys in the index -- Lehman : * and Yao disallow duplicate keys.) : */ : new_stack = (BTStack) palloc(sizeof(BTStackData)); 0.00 : 4ad1dc: 49 89 c4 mov %rax,%r12 : new_stack->bts_blkno = par_blkno; : new_stack->bts_offset = offnum; : memcpy(&new_stack->bts_btentry, itup, sizeof(IndexTupleData)); 0.00 : 4ad1df: 48 8b 03 mov (%rbx),%rax : new_stack->bts_parent = stack_in; : : /* drop the read lock on the parent page, acquire one on the child */ : *bufP = _bt_relandgetbuf(rel, *bufP, blkno, BT_READ); 0.00 : 4ad1e2: b9 01 00 00 00 mov $0x1,%ecx 0.00 : 4ad1e7: 44 89 ea mov %r13d,%edx : * and Yao disallow duplicate keys.) : */ : new_stack = (BTStack) palloc(sizeof(BTStackData)); : new_stack->bts_blkno = par_blkno; : new_stack->bts_offset = offnum; : memcpy(&new_stack->bts_btentry, itup, sizeof(IndexTupleData)); 0.00 : 4ad1ea: 49 89 44 24 06 mov %rax,0x6(%r12) : new_stack->bts_parent = stack_in; 0.00 : 4ad1ef: 48 8b 45 c8 mov -0x38(%rbp),%rax 0.00 : 4ad1f3: 49 89 44 24 10 mov %rax,0x10(%r12) : : /* drop the read lock on the parent page, acquire one on the child */ : *bufP = _bt_relandgetbuf(rel, *bufP, blkno, BT_READ); 0.00 : 4ad1f8: 48 8b 45 a8 mov -0x58(%rbp),%rax 0.00 : 4ad1fc: 48 8b 7d c0 mov -0x40(%rbp),%rdi 0.00 : 4ad200: 8b 30 mov (%rax),%esi 0.00 : 4ad202: e8 d9 bd ff ff callq 4a8fe0 <_bt_relandgetbuf> 0.00 : 4ad207: 89 c6 mov %eax,%esi 0.00 : 4ad209: 48 8b 45 a8 mov -0x58(%rbp),%rax 0.00 : 4ad20d: 89 30 mov %esi,(%rax) 0.00 : 4ad20f: 4c 89 65 c8 mov %r12,-0x38(%rbp) : * incomplete split on the leaf page we're about to insert to, not on : * any of the upper levels (they is taken care of in _bt_getstackbuf, : * if the leaf page is split and we insert to the parent page). But : * this is a good opportunity to finish splits of internal pages too. : */ : *bufP = _bt_moveright(rel, *bufP, keysz, scankey, nextkey, 0.00 : 4ad213: 48 8b 45 c8 mov -0x38(%rbp),%rax 0.00 : 4ad217: 44 8b 4d d4 mov -0x2c(%rbp),%r9d 0.00 : 4ad21b: 44 8b 45 d0 mov -0x30(%rbp),%r8d 0.00 : 4ad21f: 48 8b 4d b0 mov -0x50(%rbp),%rcx 0.00 : 4ad223: 8b 55 bc mov -0x44(%rbp),%edx 0.00 : 4ad226: 48 8b 7d c0 mov -0x40(%rbp),%rdi 0.00 : 4ad22a: c7 44 24 08 01 00 00 movl $0x1,0x8(%rsp) 0.00 : 4ad231: 00 0.00 : 4ad232: 48 89 04 24 mov %rax,(%rsp) 0.00 : 4ad236: e8 35 fd ff ff callq 4acf70 <_bt_moveright> 0.00 : 4ad23b: 89 c6 mov %eax,%esi 0.00 : 4ad23d: 48 8b 45 a8 mov -0x58(%rbp),%rax : (access == BT_WRITE), stack_in, : BT_READ); : : /* if this is a leaf page, we're done */ : page = BufferGetPage(*bufP); 0.00 : 4ad241: 85 f6 test %esi,%esi : * incomplete split on the leaf page we're about to insert to, not on : * any of the upper levels (they is taken care of in _bt_getstackbuf, : * if the leaf page is split and we insert to the parent page). But : * this is a good opportunity to finish splits of internal pages too. : */ : *bufP = _bt_moveright(rel, *bufP, keysz, scankey, nextkey, 0.00 : 4ad243: 89 30 mov %esi,(%rax) : (access == BT_WRITE), stack_in, : BT_READ); : : /* if this is a leaf page, we're done */ : page = BufferGetPage(*bufP); 0.00 : 4ad245: 0f 89 15 ff ff ff jns 4ad160 <_bt_search+0x60> 0.00 : 4ad24b: 89 f0 mov %esi,%eax 0.00 : 4ad24d: 48 8b 15 c4 fe 6c 00 mov 0x6cfec4(%rip),%rdx # b7d118 0.00 : 4ad254: f7 d0 not %eax 0.00 : 4ad256: 48 98 cltq 0.00 : 4ad258: 4c 8b 24 c2 mov (%rdx,%rax,8),%r12 : opaque = (BTPageOpaque) PageGetSpecialPointer(page); : if (P_ISLEAF(opaque)) 0.00 : 4ad25c: 41 0f b7 44 24 10 movzwl 0x10(%r12),%eax 0.00 : 4ad262: 41 f6 44 04 0c 01 testb $0x1,0xc(%r12,%rax,1) 0.00 : 4ad268: 0f 84 15 ff ff ff je 4ad183 <_bt_search+0x83> 0.00 : 4ad26e: 66 90 xchg %ax,%ax : /* okay, all set to move down a level */ : stack_in = new_stack; : } : : return stack_in; : } 0.00 : 4ad270: 48 8b 45 c8 mov -0x38(%rbp),%rax 0.00 : 4ad274: 48 83 c4 48 add $0x48,%rsp 0.00 : 4ad278: 5b pop %rbx 0.00 : 4ad279: 41 5c pop %r12 0.00 : 4ad27b: 41 5d pop %r13 0.00 : 4ad27d: 41 5e pop %r14 0.00 : 4ad27f: 41 5f pop %r15 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:138 50.00 : 4ad281: c9 leaveq Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 50.00 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtutils.c:784 50.00 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtutils.c:772 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000004aebd0 <_bt_preprocess_keys>: : * key argument values, which could change on a rescan or after moving to : * new elements of array keys. Therefore we can't overwrite the source data. : */ : void : _bt_preprocess_keys(IndexScanDesc scan) : { 0.00 : 4aebd0: 55 push %rbp 0.00 : 4aebd1: 48 89 e5 mov %rsp,%rbp 0.00 : 4aebd4: 41 57 push %r15 0.00 : 4aebd6: 41 56 push %r14 0.00 : 4aebd8: 41 55 push %r13 0.00 : 4aebda: 41 54 push %r12 0.00 : 4aebdc: 53 push %rbx 0.00 : 4aebdd: 48 81 ec 98 00 00 00 sub $0x98,%rsp 0.00 : 4aebe4: 48 89 bd 60 ff ff ff mov %rdi,-0xa0(%rbp) : BTScanOpaque so = (BTScanOpaque) scan->opaque; 0.00 : 4aebeb: 48 8b 47 38 mov 0x38(%rdi),%rax 0.00 : 4aebef: 48 89 85 68 ff ff ff mov %rax,-0x98(%rbp) : int numberOfKeys = scan->numberOfKeys; 0.00 : 4aebf6: 8b 57 18 mov 0x18(%rdi),%edx : int i, : j; : AttrNumber attno; : : /* initialize result variables */ : so->qual_ok = true; 0.00 : 4aebf9: 48 8b 8d 68 ff ff ff mov -0x98(%rbp),%rcx : */ : void : _bt_preprocess_keys(IndexScanDesc scan) : { : BTScanOpaque so = (BTScanOpaque) scan->opaque; : int numberOfKeys = scan->numberOfKeys; 0.00 : 4aec00: 89 95 74 ff ff ff mov %edx,-0x8c(%rbp) : int16 *indoption = scan->indexRelation->rd_indoption; 0.00 : 4aec06: 48 8b 47 08 mov 0x8(%rdi),%rax : : /* initialize result variables */ : so->qual_ok = true; : so->numberOfKeys = 0; : : if (numberOfKeys < 1) 0.00 : 4aec0a: 85 d2 test %edx,%edx : void : _bt_preprocess_keys(IndexScanDesc scan) : { : BTScanOpaque so = (BTScanOpaque) scan->opaque; : int numberOfKeys = scan->numberOfKeys; : int16 *indoption = scan->indexRelation->rd_indoption; 0.00 : 4aec0c: 48 8b 80 e8 00 00 00 mov 0xe8(%rax),%rax 0.00 : 4aec13: 48 89 85 78 ff ff ff mov %rax,-0x88(%rbp) : int i, : j; : AttrNumber attno; : : /* initialize result variables */ : so->qual_ok = true; 0.00 : 4aec1a: c6 01 01 movb $0x1,(%rcx) : so->numberOfKeys = 0; 0.00 : 4aec1d: c7 41 04 00 00 00 00 movl $0x0,0x4(%rcx) : : if (numberOfKeys < 1) 0.00 : 4aec24: 0f 8e 5e 03 00 00 jle 4aef88 <_bt_preprocess_keys+0x3b8> : return; /* done if qual-less scan */ : : /* : * Read so->arrayKeyData if array keys are present, else scan->keyData : */ : if (so->arrayKeyData != NULL) 0.00 : 4aec2a: 48 8b 59 10 mov 0x10(%rcx),%rbx 0.00 : 4aec2e: 48 85 db test %rbx,%rbx 0.00 : 4aec31: 0f 84 c6 04 00 00 je 4af0fd <_bt_preprocess_keys+0x52d> : inkeys = so->arrayKeyData; : else : inkeys = scan->keyData; : : outkeys = so->keyData; 0.00 : 4aec37: 48 8b 95 68 ff ff ff mov -0x98(%rbp),%rdx : cur = &inkeys[0]; : /* we check that input keys are correctly ordered */ : if (cur->sk_attno < 1) : elog(ERROR, "btree index keys must be ordered by attribute"); 0.00 : 4aec3e: be 0a 03 00 00 mov $0x30a,%esi : if (so->arrayKeyData != NULL) : inkeys = so->arrayKeyData; : else : inkeys = scan->keyData; : : outkeys = so->keyData; 0.00 : 4aec43: 48 8b 52 08 mov 0x8(%rdx),%rdx 0.00 : 4aec47: 48 89 55 88 mov %rdx,-0x78(%rbp) : cur = &inkeys[0]; : /* we check that input keys are correctly ordered */ : if (cur->sk_attno < 1) 0.00 : 4aec4b: 66 83 7b 04 00 cmpw $0x0,0x4(%rbx) : elog(ERROR, "btree index keys must be ordered by attribute"); 0.00 : 4aec50: ba 40 4b 7b 00 mov $0x7b4b40,%edx : inkeys = scan->keyData; : : outkeys = so->keyData; : cur = &inkeys[0]; : /* we check that input keys are correctly ordered */ : if (cur->sk_attno < 1) 0.00 : 4aec55: 0f 8e cc 04 00 00 jle 4af127 <_bt_preprocess_keys+0x557> : elog(ERROR, "btree index keys must be ordered by attribute"); : : /* We can short-circuit most of the work if there's just one key */ : if (numberOfKeys == 1) 0.00 : 4aec5b: 83 bd 74 ff ff ff 01 cmpl $0x1,-0x8c(%rbp) 0.00 : 4aec62: 0f 84 08 04 00 00 je 4af070 <_bt_preprocess_keys+0x4a0> : &test_result)) : { : if (test_result) : xform[BTGreaterEqualStrategyNumber - 1] = NULL; : else : xform[BTGreaterStrategyNumber - 1] = NULL; 0.00 : 4aec68: 48 8d 45 a0 lea -0x60(%rbp),%rax : * unsatisfiable in combination with any other index condition. By : * the time we get here, that's been classified as an equality : * check, and we've rejected any combination of it with a regular : * equality condition; but not with other types of conditions. : */ : if (xform[BTEqualStrategyNumber - 1]) 0.00 : 4aec6c: 48 8d 4d a0 lea -0x60(%rbp),%rcx : * : * xform[i] points to the currently best scan key of strategy type i+1; it : * is NULL if we haven't yet found such a key for this attr. : */ : attno = 1; : memset(xform, 0, sizeof(xform)); 0.00 : 4aec70: 45 31 ff xor %r15d,%r15d 0.00 : 4aec73: c7 45 94 00 00 00 00 movl $0x0,-0x6c(%rbp) 0.00 : 4aec7a: 48 8d 55 98 lea -0x68(%rbp),%rdx 0.00 : 4aec7e: 48 c7 45 a0 00 00 00 movq $0x0,-0x60(%rbp) 0.00 : 4aec85: 00 : &test_result)) : { : if (test_result) : xform[BTGreaterEqualStrategyNumber - 1] = NULL; : else : xform[BTGreaterStrategyNumber - 1] = NULL; 0.00 : 4aec86: 48 83 c0 18 add $0x18,%rax : * unsatisfiable in combination with any other index condition. By : * the time we get here, that's been classified as an equality : * check, and we've rejected any combination of it with a regular : * equality condition; but not with other types of conditions. : */ : if (xform[BTEqualStrategyNumber - 1]) 0.00 : 4aec8a: 48 83 c1 20 add $0x20,%rcx : * : * xform[i] points to the currently best scan key of strategy type i+1; it : * is NULL if we haven't yet found such a key for this attr. : */ : attno = 1; : memset(xform, 0, sizeof(xform)); 0.00 : 4aec8e: 48 c7 45 a8 00 00 00 movq $0x0,-0x58(%rbp) 0.00 : 4aec95: 00 : &test_result)) : { : if (test_result) : xform[BTGreaterEqualStrategyNumber - 1] = NULL; : else : xform[BTGreaterStrategyNumber - 1] = NULL; 0.00 : 4aec96: 48 89 85 58 ff ff ff mov %rax,-0xa8(%rbp) : * handle after-last-key processing. Actual exit from the loop is at the : * "break" statement below. : */ : for (i = 0;; cur++, i++) : { : if (i < numberOfKeys) 0.00 : 4aec9d: 8b 85 74 ff ff ff mov -0x8c(%rbp),%eax : * : * xform[i] points to the currently best scan key of strategy type i+1; it : * is NULL if we haven't yet found such a key for this attr. : */ : attno = 1; : memset(xform, 0, sizeof(xform)); 0.00 : 4aeca3: 49 89 de mov %rbx,%r14 : * handle after-last-key processing. Actual exit from the loop is at the : * "break" statement below. : */ : for (i = 0;; cur++, i++) : { : if (i < numberOfKeys) 0.00 : 4aeca6: 39 45 94 cmp %eax,-0x6c(%rbp) : * : * xform[i] points to the currently best scan key of strategy type i+1; it : * is NULL if we haven't yet found such a key for this attr. : */ : attno = 1; : memset(xform, 0, sizeof(xform)); 0.00 : 4aeca9: 48 c7 45 b0 00 00 00 movq $0x0,-0x50(%rbp) 0.00 : 4aecb0: 00 0.00 : 4aecb1: 48 c7 45 b8 00 00 00 movq $0x0,-0x48(%rbp) 0.00 : 4aecb8: 00 0.00 : 4aecb9: 48 c7 45 c0 00 00 00 movq $0x0,-0x40(%rbp) 0.00 : 4aecc0: 00 0.00 : 4aecc1: c7 45 84 00 00 00 00 movl $0x0,-0x7c(%rbp) 0.00 : 4aecc8: 66 c7 45 9a 01 00 movw $0x1,-0x66(%rbp) 0.00 : 4aecce: 48 89 95 48 ff ff ff mov %rdx,-0xb8(%rbp) : * unsatisfiable in combination with any other index condition. By : * the time we get here, that's been classified as an equality : * check, and we've rejected any combination of it with a regular : * equality condition; but not with other types of conditions. : */ : if (xform[BTEqualStrategyNumber - 1]) 0.00 : 4aecd5: 48 89 8d 50 ff ff ff mov %rcx,-0xb0(%rbp) : * handle after-last-key processing. Actual exit from the loop is at the : * "break" statement below. : */ : for (i = 0;; cur++, i++) : { : if (i < numberOfKeys) 0.00 : 4aecdc: 0f 8c 80 02 00 00 jl 4aef62 <_bt_preprocess_keys+0x392> 0.00 : 4aece2: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : : /* : * If we are at the end of the keys for a particular attr, finish up : * processing and emit the cleaned-up keys. : */ : if (i == numberOfKeys || cur->sk_attno != attno) 0.00 : 4aece8: 8b 8d 74 ff ff ff mov -0x8c(%rbp),%ecx 0.00 : 4aecee: 39 4d 94 cmp %ecx,-0x6c(%rbp) 0.00 : 4aecf1: 74 2c je 4aed1f <_bt_preprocess_keys+0x14f> 0.00 : 4aecf3: 45 0f b7 6e 04 movzwl 0x4(%r14),%r13d 0.00 : 4aecf8: 8b 45 84 mov -0x7c(%rbp),%eax 0.00 : 4aecfb: 66 44 3b 6d 9a cmp -0x66(%rbp),%r13w 0.00 : 4aed00: 89 45 9c mov %eax,-0x64(%rbp) 0.00 : 4aed03: 0f 84 d3 01 00 00 je 4aeedc <_bt_preprocess_keys+0x30c> : { : int priorNumberOfEqualCols = numberOfEqualCols; : : /* check input keys are correctly ordered */ : if (i < numberOfKeys && cur->sk_attno < attno) 0.00 : 4aed09: 8b 95 74 ff ff ff mov -0x8c(%rbp),%edx 0.00 : 4aed0f: 39 55 94 cmp %edx,-0x6c(%rbp) 0.00 : 4aed12: 7d 0b jge 4aed1f <_bt_preprocess_keys+0x14f> 0.00 : 4aed14: 66 44 39 6d 9a cmp %r13w,-0x66(%rbp) 0.00 : 4aed19: 0f 8f fe 03 00 00 jg 4af11d <_bt_preprocess_keys+0x54d> : * unsatisfiable in combination with any other index condition. By : * the time we get here, that's been classified as an equality : * check, and we've rejected any combination of it with a regular : * equality condition; but not with other types of conditions. : */ : if (xform[BTEqualStrategyNumber - 1]) 0.00 : 4aed1f: 4c 8b 6d b0 mov -0x50(%rbp),%r13 0.00 : 4aed23: 8b 4d 84 mov -0x7c(%rbp),%ecx 0.00 : 4aed26: 4d 85 ed test %r13,%r13 0.00 : 4aed29: 89 4d 9c mov %ecx,-0x64(%rbp) 0.00 : 4aed2c: 74 66 je 4aed94 <_bt_preprocess_keys+0x1c4> 0.00 : 4aed2e: 4c 8b a5 50 ff ff ff mov -0xb0(%rbp),%r12 0.00 : 4aed35: bb 04 00 00 00 mov $0x4,%ebx : { : ScanKey eq = xform[BTEqualStrategyNumber - 1]; : : for (j = BTMaxStrategyNumber; --j >= 0;) : { : ScanKey chk = xform[j]; 0.00 : 4aed3a: 49 8b 34 24 mov (%r12),%rsi : : if (!chk || j == (BTEqualStrategyNumber - 1)) 0.00 : 4aed3e: 48 85 f6 test %rsi,%rsi 0.00 : 4aed41: 74 3c je 4aed7f <_bt_preprocess_keys+0x1af> 0.00 : 4aed43: 83 fb 02 cmp $0x2,%ebx 0.00 : 4aed46: 74 37 je 4aed7f <_bt_preprocess_keys+0x1af> : continue; : : if (eq->sk_flags & SK_SEARCHNULL) 0.00 : 4aed48: 41 f6 45 00 40 testb $0x40,0x0(%r13) 0.00 : 4aed4d: 0f 85 0d 03 00 00 jne 4af060 <_bt_preprocess_keys+0x490> : /* IS NULL is contradictory to anything else */ : so->qual_ok = false; : return; : } : : if (_bt_compare_scankey_args(scan, chk, eq, chk, 0.00 : 4aed53: 48 8b bd 60 ff ff ff mov -0xa0(%rbp),%rdi 0.00 : 4aed5a: 4c 8d 45 cf lea -0x31(%rbp),%r8 0.00 : 4aed5e: 48 89 f1 mov %rsi,%rcx 0.00 : 4aed61: 4c 89 ea mov %r13,%rdx 0.00 : 4aed64: e8 57 fc ff ff callq 4ae9c0 <_bt_compare_scankey_args> 0.00 : 4aed69: 84 c0 test %al,%al 0.00 : 4aed6b: 74 12 je 4aed7f <_bt_preprocess_keys+0x1af> : &test_result)) : { : if (!test_result) 0.00 : 4aed6d: 80 7d cf 00 cmpb $0x0,-0x31(%rbp) 0.00 : 4aed71: 0f 84 02 02 00 00 je 4aef79 <_bt_preprocess_keys+0x3a9> : /* keys proven mutually contradictory */ : so->qual_ok = false; : return; : } : /* else discard the redundant non-equality key */ : xform[j] = NULL; 0.00 : 4aed77: 49 c7 04 24 00 00 00 movq $0x0,(%r12) 0.00 : 4aed7e: 00 : */ : if (xform[BTEqualStrategyNumber - 1]) : { : ScanKey eq = xform[BTEqualStrategyNumber - 1]; : : for (j = BTMaxStrategyNumber; --j >= 0;) 0.00 : 4aed7f: 83 eb 01 sub $0x1,%ebx 0.00 : 4aed82: 49 83 ec 08 sub $0x8,%r12 0.00 : 4aed86: 83 fb ff cmp $0xffffffff,%ebx 0.00 : 4aed89: 75 af jne 4aed3a <_bt_preprocess_keys+0x16a> : xform[j] = NULL; : } : /* else, cannot determine redundancy, keep both keys */ : } : /* track number of attrs for which we have "=" keys */ : numberOfEqualCols++; 0.00 : 4aed8b: 8b 4d 84 mov -0x7c(%rbp),%ecx 0.00 : 4aed8e: 83 c1 01 add $0x1,%ecx 0.00 : 4aed91: 89 4d 9c mov %ecx,-0x64(%rbp) : } : : /* try to keep only one of <, <= */ : if (xform[BTLessStrategyNumber - 1] 0.00 : 4aed94: 48 8b 55 a0 mov -0x60(%rbp),%rdx 0.00 : 4aed98: 48 85 d2 test %rdx,%rdx 0.00 : 4aed9b: 74 33 je 4aedd0 <_bt_preprocess_keys+0x200> 0.00 : 4aed9d: 48 8b 75 a8 mov -0x58(%rbp),%rsi 0.00 : 4aeda1: 48 85 f6 test %rsi,%rsi 0.00 : 4aeda4: 74 2a je 4aedd0 <_bt_preprocess_keys+0x200> : && xform[BTLessEqualStrategyNumber - 1]) : { : ScanKey lt = xform[BTLessStrategyNumber - 1]; : ScanKey le = xform[BTLessEqualStrategyNumber - 1]; : : if (_bt_compare_scankey_args(scan, le, lt, le, 0.00 : 4aeda6: 48 8b bd 60 ff ff ff mov -0xa0(%rbp),%rdi 0.00 : 4aedad: 4c 8d 45 cf lea -0x31(%rbp),%r8 0.00 : 4aedb1: 48 89 f1 mov %rsi,%rcx 0.00 : 4aedb4: e8 07 fc ff ff callq 4ae9c0 <_bt_compare_scankey_args> 0.00 : 4aedb9: 84 c0 test %al,%al 0.00 : 4aedbb: 74 13 je 4aedd0 <_bt_preprocess_keys+0x200> : &test_result)) : { : if (test_result) 0.00 : 4aedbd: 80 7d cf 00 cmpb $0x0,-0x31(%rbp) 0.00 : 4aedc1: 0f 84 71 02 00 00 je 4af038 <_bt_preprocess_keys+0x468> : xform[BTLessEqualStrategyNumber - 1] = NULL; 0.00 : 4aedc7: 48 c7 45 a8 00 00 00 movq $0x0,-0x58(%rbp) 0.00 : 4aedce: 00 0.00 : 4aedcf: 90 nop : xform[BTLessStrategyNumber - 1] = NULL; : } : } : : /* try to keep only one of >, >= */ : if (xform[BTGreaterStrategyNumber - 1] 0.00 : 4aedd0: 48 8b 55 c0 mov -0x40(%rbp),%rdx 0.00 : 4aedd4: 48 85 d2 test %rdx,%rdx 0.00 : 4aedd7: 74 36 je 4aee0f <_bt_preprocess_keys+0x23f> 0.00 : 4aedd9: 48 8b 75 b8 mov -0x48(%rbp),%rsi 0.00 : 4aeddd: 48 85 f6 test %rsi,%rsi 0.00 : 4aede0: 74 2d je 4aee0f <_bt_preprocess_keys+0x23f> : && xform[BTGreaterEqualStrategyNumber - 1]) : { : ScanKey gt = xform[BTGreaterStrategyNumber - 1]; : ScanKey ge = xform[BTGreaterEqualStrategyNumber - 1]; : : if (_bt_compare_scankey_args(scan, ge, gt, ge, 0.00 : 4aede2: 48 8b bd 60 ff ff ff mov -0xa0(%rbp),%rdi 0.00 : 4aede9: 4c 8d 45 cf lea -0x31(%rbp),%r8 0.00 : 4aeded: 48 89 f1 mov %rsi,%rcx 0.00 : 4aedf0: e8 cb fb ff ff callq 4ae9c0 <_bt_compare_scankey_args> 0.00 : 4aedf5: 84 c0 test %al,%al 0.00 : 4aedf7: 74 12 je 4aee0b <_bt_preprocess_keys+0x23b> : &test_result)) : { : if (test_result) 0.00 : 4aedf9: 80 7d cf 00 cmpb $0x0,-0x31(%rbp) 0.00 : 4aedfd: 0f 84 45 02 00 00 je 4af048 <_bt_preprocess_keys+0x478> : xform[BTGreaterEqualStrategyNumber - 1] = NULL; 0.00 : 4aee03: 48 c7 45 b8 00 00 00 movq $0x0,-0x48(%rbp) 0.00 : 4aee0a: 00 0.00 : 4aee0b: 48 8b 55 c0 mov -0x40(%rbp),%rdx : if (xform[j]) : { : ScanKey outkey = &outkeys[new_numberOfKeys++]; : : memcpy(outkey, xform[j], sizeof(ScanKeyData)); : if (priorNumberOfEqualCols == attno - 1) 0.00 : 4aee0f: 0f bf 45 9a movswl -0x66(%rbp),%eax : * mark them if they are required. They are required (possibly : * only in one direction) if all attrs before this one had "=". : */ : for (j = BTMaxStrategyNumber; --j >= 0;) : { : if (xform[j]) 0.00 : 4aee13: 48 85 d2 test %rdx,%rdx : &test_result)) : { : if (test_result) : xform[BTGreaterEqualStrategyNumber - 1] = NULL; : else : xform[BTGreaterStrategyNumber - 1] = NULL; 0.00 : 4aee16: 48 8b 9d 58 ff ff ff mov -0xa8(%rbp),%rbx : if (xform[j]) : { : ScanKey outkey = &outkeys[new_numberOfKeys++]; : : memcpy(outkey, xform[j], sizeof(ScanKeyData)); : if (priorNumberOfEqualCols == attno - 1) 0.00 : 4aee1d: 44 8d 60 ff lea -0x1(%rax),%r12d : * mark them if they are required. They are required (possibly : * only in one direction) if all attrs before this one had "=". : */ : for (j = BTMaxStrategyNumber; --j >= 0;) : { : if (xform[j]) 0.00 : 4aee21: 74 63 je 4aee86 <_bt_preprocess_keys+0x2b6> : { : ScanKey outkey = &outkeys[new_numberOfKeys++]; 0.00 : 4aee23: 48 8b 4d 88 mov -0x78(%rbp),%rcx 0.00 : 4aee27: 49 63 c7 movslq %r15d,%rax 0.00 : 4aee2a: 41 83 c7 01 add $0x1,%r15d 0.00 : 4aee2e: 48 8d 04 c0 lea (%rax,%rax,8),%rax 0.00 : 4aee32: 48 8d 3c c1 lea (%rcx,%rax,8),%rdi : : memcpy(outkey, xform[j], sizeof(ScanKeyData)); 0.00 : 4aee36: 48 8b 02 mov (%rdx),%rax 0.00 : 4aee39: 48 89 07 mov %rax,(%rdi) 0.00 : 4aee3c: 48 8b 42 08 mov 0x8(%rdx),%rax 0.00 : 4aee40: 48 89 47 08 mov %rax,0x8(%rdi) 0.00 : 4aee44: 48 8b 42 10 mov 0x10(%rdx),%rax 0.00 : 4aee48: 48 89 47 10 mov %rax,0x10(%rdi) 0.00 : 4aee4c: 48 8b 42 18 mov 0x18(%rdx),%rax 0.00 : 4aee50: 48 89 47 18 mov %rax,0x18(%rdi) 0.00 : 4aee54: 48 8b 42 20 mov 0x20(%rdx),%rax 0.00 : 4aee58: 48 89 47 20 mov %rax,0x20(%rdi) 0.00 : 4aee5c: 48 8b 42 28 mov 0x28(%rdx),%rax 0.00 : 4aee60: 48 89 47 28 mov %rax,0x28(%rdi) 0.00 : 4aee64: 48 8b 42 30 mov 0x30(%rdx),%rax 0.00 : 4aee68: 48 89 47 30 mov %rax,0x30(%rdi) 0.00 : 4aee6c: 48 8b 42 38 mov 0x38(%rdx),%rax 0.00 : 4aee70: 48 89 47 38 mov %rax,0x38(%rdi) 0.00 : 4aee74: 48 8b 42 40 mov 0x40(%rdx),%rax 0.00 : 4aee78: 48 89 47 40 mov %rax,0x40(%rdi) : if (priorNumberOfEqualCols == attno - 1) 0.00 : 4aee7c: 44 39 65 84 cmp %r12d,-0x7c(%rbp) 0.00 : 4aee80: 0f 84 1a 01 00 00 je 4aefa0 <_bt_preprocess_keys+0x3d0> : /* : * Emit the cleaned-up keys into the outkeys[] array, and then : * mark them if they are required. They are required (possibly : * only in one direction) if all attrs before this one had "=". : */ : for (j = BTMaxStrategyNumber; --j >= 0;) 0.00 : 4aee86: 48 3b 9d 48 ff ff ff cmp -0xb8(%rbp),%rbx 0.00 : 4aee8d: 74 11 je 4aeea0 <_bt_preprocess_keys+0x2d0> 0.00 : 4aee8f: 48 8b 13 mov (%rbx),%rdx 0.00 : 4aee92: 48 83 eb 08 sub $0x8,%rbx : { : if (xform[j]) 0.00 : 4aee96: 48 85 d2 test %rdx,%rdx 0.00 : 4aee99: 75 88 jne 4aee23 <_bt_preprocess_keys+0x253> 0.00 : 4aee9b: eb e9 jmp 4aee86 <_bt_preprocess_keys+0x2b6> 0.00 : 4aee9d: 0f 1f 00 nopl (%rax) : } : : /* : * Exit loop here if done. : */ : if (i == numberOfKeys) 0.00 : 4aeea0: 8b 85 74 ff ff ff mov -0x8c(%rbp),%eax 0.00 : 4aeea6: 39 45 94 cmp %eax,-0x6c(%rbp) 0.00 : 4aeea9: 0f 84 5e 02 00 00 je 4af10d <_bt_preprocess_keys+0x53d> : break; : : /* Re-initialize for new attno */ : attno = cur->sk_attno; 0.00 : 4aeeaf: 45 0f b7 6e 04 movzwl 0x4(%r14),%r13d : memset(xform, 0, sizeof(xform)); 0.00 : 4aeeb4: 48 c7 45 a0 00 00 00 movq $0x0,-0x60(%rbp) 0.00 : 4aeebb: 00 0.00 : 4aeebc: 48 c7 45 a8 00 00 00 movq $0x0,-0x58(%rbp) 0.00 : 4aeec3: 00 0.00 : 4aeec4: 48 c7 45 b0 00 00 00 movq $0x0,-0x50(%rbp) 0.00 : 4aeecb: 00 0.00 : 4aeecc: 48 c7 45 b8 00 00 00 movq $0x0,-0x48(%rbp) 0.00 : 4aeed3: 00 0.00 : 4aeed4: 48 c7 45 c0 00 00 00 movq $0x0,-0x40(%rbp) 0.00 : 4aeedb: 00 : : /* check strategy this key's operator corresponds to */ : j = cur->sk_strategy - 1; : : /* if row comparison, push it directly to the output array */ : if (cur->sk_flags & SK_ROW_HEADER) 0.00 : 4aeedc: 41 f6 06 04 testb $0x4,(%r14) : attno = cur->sk_attno; : memset(xform, 0, sizeof(xform)); : } : : /* check strategy this key's operator corresponds to */ : j = cur->sk_strategy - 1; 0.00 : 4aeee0: 41 0f b7 46 06 movzwl 0x6(%r14),%eax : : /* if row comparison, push it directly to the output array */ : if (cur->sk_flags & SK_ROW_HEADER) 0.00 : 4aeee5: 0f 85 c5 00 00 00 jne 4aefb0 <_bt_preprocess_keys+0x3e0> : attno = cur->sk_attno; : memset(xform, 0, sizeof(xform)); : } : : /* check strategy this key's operator corresponds to */ : j = cur->sk_strategy - 1; 0.00 : 4aeeeb: 0f b7 c0 movzwl %ax,%eax 0.00 : 4aeeee: 44 8d 60 ff lea -0x1(%rax),%r12d : Assert(j != (BTEqualStrategyNumber - 1)); : continue; : } : : /* have we seen one of these before? */ : if (xform[j] == NULL) 0.00 : 4aeef2: 49 63 dc movslq %r12d,%rbx 0.00 : 4aeef5: 48 8b 4c dd a0 mov -0x60(%rbp,%rbx,8),%rcx 0.00 : 4aeefa: 48 85 c9 test %rcx,%rcx 0.00 : 4aeefd: 0f 84 25 01 00 00 je 4af028 <_bt_preprocess_keys+0x458> : xform[j] = cur; : } : else : { : /* yup, keep only the more restrictive key */ : if (_bt_compare_scankey_args(scan, cur, cur, xform[j], 0.00 : 4aef03: 48 8b bd 60 ff ff ff mov -0xa0(%rbp),%rdi 0.00 : 4aef0a: 4c 8d 45 cf lea -0x31(%rbp),%r8 0.00 : 4aef0e: 4c 89 f2 mov %r14,%rdx 0.00 : 4aef11: 4c 89 f6 mov %r14,%rsi 0.00 : 4aef14: e8 a7 fa ff ff callq 4ae9c0 <_bt_compare_scankey_args> 0.00 : 4aef19: 84 c0 test %al,%al 0.00 : 4aef1b: 0f 84 8f 00 00 00 je 4aefb0 <_bt_preprocess_keys+0x3e0> : &test_result)) : { : if (test_result) 0.00 : 4aef21: 80 7d cf 00 cmpb $0x0,-0x31(%rbp) 0.00 : 4aef25: 0f 85 fd 00 00 00 jne 4af028 <_bt_preprocess_keys+0x458> : xform[j] = cur; : else if (j == (BTEqualStrategyNumber - 1)) 0.00 : 4aef2b: 41 83 fc 02 cmp $0x2,%r12d 0.00 : 4aef2f: 90 nop 0.00 : 4aef30: 0f 84 11 02 00 00 je 4af147 <_bt_preprocess_keys+0x577> 0.00 : 4aef36: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 0.00 : 4aef3d: 00 00 00 : /* : * Loop iterates from 0 to numberOfKeys inclusive; we use the last pass to : * handle after-last-key processing. Actual exit from the loop is at the : * "break" statement below. : */ : for (i = 0;; cur++, i++) 0.00 : 4aef40: 83 45 94 01 addl $0x1,-0x6c(%rbp) 0.00 : 4aef44: 49 83 c6 48 add $0x48,%r14 : { : if (i < numberOfKeys) 0.00 : 4aef48: 8b 85 74 ff ff ff mov -0x8c(%rbp),%eax 0.00 : 4aef4e: 39 45 94 cmp %eax,-0x6c(%rbp) : /* : * Loop iterates from 0 to numberOfKeys inclusive; we use the last pass to : * handle after-last-key processing. Actual exit from the loop is at the : * "break" statement below. : */ : for (i = 0;; cur++, i++) 0.00 : 4aef51: 8b 4d 9c mov -0x64(%rbp),%ecx 0.00 : 4aef54: 66 44 89 6d 9a mov %r13w,-0x66(%rbp) 0.00 : 4aef59: 89 4d 84 mov %ecx,-0x7c(%rbp) : { : if (i < numberOfKeys) 0.00 : 4aef5c: 0f 8d 86 fd ff ff jge 4aece8 <_bt_preprocess_keys+0x118> : { : /* Apply indoption to scankey (might change sk_strategy!) */ : if (!_bt_fix_scankey_strategy(cur, indoption)) 0.00 : 4aef62: 48 8b b5 78 ff ff ff mov -0x88(%rbp),%rsi 0.00 : 4aef69: 4c 89 f7 mov %r14,%rdi 0.00 : 4aef6c: e8 ef ed ff ff callq 4add60 <_bt_fix_scankey_strategy> 0.00 : 4aef71: 84 c0 test %al,%al 0.00 : 4aef73: 0f 85 6f fd ff ff jne 4aece8 <_bt_preprocess_keys+0x118> : &test_result)) : { : if (!test_result) : { : /* keys proven mutually contradictory */ : so->qual_ok = false; 0.00 : 4aef79: 48 8b 95 68 ff ff ff mov -0x98(%rbp),%rdx 0.00 : 4aef80: c6 02 00 movb $0x0,(%rdx) 0.00 : 4aef83: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : } : } : } : : so->numberOfKeys = new_numberOfKeys; : } 0.00 : 4aef88: 48 81 c4 98 00 00 00 add $0x98,%rsp 0.00 : 4aef8f: 5b pop %rbx 0.00 : 4aef90: 41 5c pop %r12 0.00 : 4aef92: 41 5d pop %r13 0.00 : 4aef94: 41 5e pop %r14 0.00 : 4aef96: 41 5f pop %r15 0.00 : 4aef98: c9 leaveq 0.00 : 4aef99: c3 retq 0.00 : 4aef9a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : { : ScanKey outkey = &outkeys[new_numberOfKeys++]; : : memcpy(outkey, xform[j], sizeof(ScanKeyData)); : if (priorNumberOfEqualCols == attno - 1) : _bt_mark_scankey_required(outkey); 0.00 : 4aefa0: e8 0b f2 ff ff callq 4ae1b0 <_bt_mark_scankey_required> 0.00 : 4aefa5: e9 dc fe ff ff jmpq 4aee86 <_bt_preprocess_keys+0x2b6> 0.00 : 4aefaa: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : /* : * We can't determine which key is more restrictive. Keep the : * previous one in xform[j] and push this one directly to the : * output array. : */ : ScanKey outkey = &outkeys[new_numberOfKeys++]; 0.00 : 4aefb0: 48 8b 55 88 mov -0x78(%rbp),%rdx 0.00 : 4aefb4: 49 63 c7 movslq %r15d,%rax 0.00 : 4aefb7: 41 83 c7 01 add $0x1,%r15d 0.00 : 4aefbb: 48 8d 04 c0 lea (%rax,%rax,8),%rax 0.00 : 4aefbf: 48 8d 3c c2 lea (%rdx,%rax,8),%rdi : : memcpy(outkey, cur, sizeof(ScanKeyData)); 0.00 : 4aefc3: 49 8b 06 mov (%r14),%rax 0.00 : 4aefc6: 48 89 07 mov %rax,(%rdi) 0.00 : 4aefc9: 49 8b 46 08 mov 0x8(%r14),%rax 0.00 : 4aefcd: 48 89 47 08 mov %rax,0x8(%rdi) 0.00 : 4aefd1: 49 8b 46 10 mov 0x10(%r14),%rax 0.00 : 4aefd5: 48 89 47 10 mov %rax,0x10(%rdi) 0.00 : 4aefd9: 49 8b 46 18 mov 0x18(%r14),%rax 0.00 : 4aefdd: 48 89 47 18 mov %rax,0x18(%rdi) 0.00 : 4aefe1: 49 8b 46 20 mov 0x20(%r14),%rax 0.00 : 4aefe5: 48 89 47 20 mov %rax,0x20(%rdi) 0.00 : 4aefe9: 49 8b 46 28 mov 0x28(%r14),%rax 0.00 : 4aefed: 48 89 47 28 mov %rax,0x28(%rdi) 0.00 : 4aeff1: 49 8b 46 30 mov 0x30(%r14),%rax 0.00 : 4aeff5: 48 89 47 30 mov %rax,0x30(%rdi) 0.00 : 4aeff9: 49 8b 46 38 mov 0x38(%r14),%rax 0.00 : 4aeffd: 48 89 47 38 mov %rax,0x38(%rdi) 0.00 : 4af001: 49 8b 46 40 mov 0x40(%r14),%rax 0.00 : 4af005: 48 89 47 40 mov %rax,0x40(%rdi) : if (numberOfEqualCols == attno - 1) 0.00 : 4af009: 41 0f bf c5 movswl %r13w,%eax 0.00 : 4af00d: 83 e8 01 sub $0x1,%eax 0.00 : 4af010: 3b 45 9c cmp -0x64(%rbp),%eax 0.00 : 4af013: 0f 85 27 ff ff ff jne 4aef40 <_bt_preprocess_keys+0x370> : _bt_mark_scankey_required(outkey); 0.00 : 4af019: e8 92 f1 ff ff callq 4ae1b0 <_bt_mark_scankey_required> 0.00 : 4af01e: e9 1d ff ff ff jmpq 4aef40 <_bt_preprocess_keys+0x370> 0.00 : 4af023: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : /* yup, keep only the more restrictive key */ : if (_bt_compare_scankey_args(scan, cur, cur, xform[j], : &test_result)) : { : if (test_result) : xform[j] = cur; 0.00 : 4af028: 4c 89 74 dd a0 mov %r14,-0x60(%rbp,%rbx,8) 0.00 : 4af02d: 0f 1f 00 nopl (%rax) 0.00 : 4af030: e9 0b ff ff ff jmpq 4aef40 <_bt_preprocess_keys+0x370> 0.00 : 4af035: 0f 1f 00 nopl (%rax) : &test_result)) : { : if (test_result) : xform[BTLessEqualStrategyNumber - 1] = NULL; : else : xform[BTLessStrategyNumber - 1] = NULL; 0.00 : 4af038: 48 c7 45 a0 00 00 00 movq $0x0,-0x60(%rbp) 0.00 : 4af03f: 00 0.00 : 4af040: e9 8b fd ff ff jmpq 4aedd0 <_bt_preprocess_keys+0x200> 0.00 : 4af045: 0f 1f 00 nopl (%rax) : &test_result)) : { : if (test_result) : xform[BTGreaterEqualStrategyNumber - 1] = NULL; : else : xform[BTGreaterStrategyNumber - 1] = NULL; 0.00 : 4af048: 48 c7 45 c0 00 00 00 movq $0x0,-0x40(%rbp) 0.00 : 4af04f: 00 0.00 : 4af050: 31 d2 xor %edx,%edx 0.00 : 4af052: e9 b8 fd ff ff jmpq 4aee0f <_bt_preprocess_keys+0x23f> 0.00 : 4af057: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 4af05e: 00 00 : continue; : : if (eq->sk_flags & SK_SEARCHNULL) : { : /* IS NULL is contradictory to anything else */ : so->qual_ok = false; 0.00 : 4af060: 48 8b 85 68 ff ff ff mov -0x98(%rbp),%rax 0.00 : 4af067: c6 00 00 movb $0x0,(%rax) : } : } : } : : so->numberOfKeys = new_numberOfKeys; : } 0.00 : 4af06a: e9 19 ff ff ff jmpq 4aef88 <_bt_preprocess_keys+0x3b8> 0.00 : 4af06f: 90 nop : : /* We can short-circuit most of the work if there's just one key */ : if (numberOfKeys == 1) : { : /* Apply indoption to scankey (might change sk_strategy!) */ : if (!_bt_fix_scankey_strategy(cur, indoption)) 0.00 : 4af070: 48 8b b5 78 ff ff ff mov -0x88(%rbp),%rsi /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtutils.c:784 50.00 : 4af077: 48 89 df mov %rbx,%rdi 0.00 : 4af07a: e8 e1 ec ff ff callq 4add60 <_bt_fix_scankey_strategy> 0.00 : 4af07f: 84 c0 test %al,%al 0.00 : 4af081: 75 0a jne 4af08d <_bt_preprocess_keys+0x4bd> : so->qual_ok = false; 0.00 : 4af083: 48 8b 8d 68 ff ff ff mov -0x98(%rbp),%rcx 0.00 : 4af08a: c6 01 00 movb $0x0,(%rcx) : memcpy(outkeys, cur, sizeof(ScanKeyData)); 0.00 : 4af08d: 48 8b 03 mov (%rbx),%rax 0.00 : 4af090: 48 8b 55 88 mov -0x78(%rbp),%rdx 0.00 : 4af094: 48 89 02 mov %rax,(%rdx) 0.00 : 4af097: 48 8b 43 08 mov 0x8(%rbx),%rax 0.00 : 4af09b: 48 89 42 08 mov %rax,0x8(%rdx) 0.00 : 4af09f: 48 8b 43 10 mov 0x10(%rbx),%rax 0.00 : 4af0a3: 48 89 42 10 mov %rax,0x10(%rdx) 0.00 : 4af0a7: 48 8b 43 18 mov 0x18(%rbx),%rax 0.00 : 4af0ab: 48 89 42 18 mov %rax,0x18(%rdx) 0.00 : 4af0af: 48 8b 43 20 mov 0x20(%rbx),%rax 0.00 : 4af0b3: 48 89 42 20 mov %rax,0x20(%rdx) 0.00 : 4af0b7: 48 8b 43 28 mov 0x28(%rbx),%rax 0.00 : 4af0bb: 48 89 42 28 mov %rax,0x28(%rdx) 0.00 : 4af0bf: 48 8b 43 30 mov 0x30(%rbx),%rax 0.00 : 4af0c3: 48 89 42 30 mov %rax,0x30(%rdx) 0.00 : 4af0c7: 48 8b 43 38 mov 0x38(%rbx),%rax 0.00 : 4af0cb: 48 89 42 38 mov %rax,0x38(%rdx) 0.00 : 4af0cf: 48 8b 43 40 mov 0x40(%rbx),%rax 0.00 : 4af0d3: 48 89 42 40 mov %rax,0x40(%rdx) : so->numberOfKeys = 1; 0.00 : 4af0d7: 48 8b 8d 68 ff ff ff mov -0x98(%rbp),%rcx 0.00 : 4af0de: c7 41 04 01 00 00 00 movl $0x1,0x4(%rcx) : /* We can mark the qual as required if it's for first index col */ : if (cur->sk_attno == 1) 0.00 : 4af0e5: 66 83 7b 04 01 cmpw $0x1,0x4(%rbx) 0.00 : 4af0ea: 0f 85 98 fe ff ff jne 4aef88 <_bt_preprocess_keys+0x3b8> : _bt_mark_scankey_required(outkeys); 0.00 : 4af0f0: 48 89 d7 mov %rdx,%rdi 0.00 : 4af0f3: e8 b8 f0 ff ff callq 4ae1b0 <_bt_mark_scankey_required> 0.00 : 4af0f8: e9 8b fe ff ff jmpq 4aef88 <_bt_preprocess_keys+0x3b8> : * Read so->arrayKeyData if array keys are present, else scan->keyData : */ : if (so->arrayKeyData != NULL) : inkeys = so->arrayKeyData; : else : inkeys = scan->keyData; 0.00 : 4af0fd: 48 8b 85 60 ff ff ff mov -0xa0(%rbp),%rax /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtutils.c:772 50.00 : 4af104: 48 8b 58 20 mov 0x20(%rax),%rbx 0.00 : 4af108: e9 2a fb ff ff jmpq 4aec37 <_bt_preprocess_keys+0x67> : _bt_mark_scankey_required(outkey); : } : } : } : : so->numberOfKeys = new_numberOfKeys; 0.00 : 4af10d: 48 8b 85 68 ff ff ff mov -0x98(%rbp),%rax 0.00 : 4af114: 44 89 78 04 mov %r15d,0x4(%rax) 0.00 : 4af118: e9 6b fe ff ff jmpq 4aef88 <_bt_preprocess_keys+0x3b8> : { : int priorNumberOfEqualCols = numberOfEqualCols; : : /* check input keys are correctly ordered */ : if (i < numberOfKeys && cur->sk_attno < attno) : elog(ERROR, "btree index keys must be ordered by attribute"); 0.00 : 4af11d: ba 40 4b 7b 00 mov $0x7b4b40,%edx 0.00 : 4af122: be 45 03 00 00 mov $0x345,%esi 0.00 : 4af127: bf 17 49 7b 00 mov $0x7b4917,%edi 0.00 : 4af12c: e8 ef c2 2c 00 callq 77b420 0.00 : 4af131: be b8 49 7b 00 mov $0x7b49b8,%esi 0.00 : 4af136: bf 14 00 00 00 mov $0x14,%edi 0.00 : 4af13b: 31 c0 xor %eax,%eax 0.00 : 4af13d: e8 ee c0 2c 00 callq 77b230 0.00 : 4af142: e8 89 a3 fb ff callq 4694d0 : if (test_result) : xform[j] = cur; : else if (j == (BTEqualStrategyNumber - 1)) : { : /* key == a && key == b, but a != b */ : so->qual_ok = false; 0.00 : 4af147: 48 8b 8d 68 ff ff ff mov -0x98(%rbp),%rcx 0.00 : 4af14e: c6 01 00 movb $0x0,(%rcx) : } : } : } : : so->numberOfKeys = new_numberOfKeys; : } 0.00 : 4af151: e9 32 fe ff ff jmpq 4aef88 <_bt_preprocess_keys+0x3b8> Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 50.00 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtutils.c:193 50.00 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtutils.c:224 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000004af350 <_bt_preprocess_array_keys>: : * on scan->keyData, is that callers are permitted to call btrescan without : * supplying a new set of scankey data. : */ : void : _bt_preprocess_array_keys(IndexScanDesc scan) : { 0.00 : 4af350: 55 push %rbp /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtutils.c:193 50.00 : 4af351: 48 89 e5 mov %rsp,%rbp 0.00 : 4af354: 41 57 push %r15 0.00 : 4af356: 41 56 push %r14 0.00 : 4af358: 41 55 push %r13 0.00 : 4af35a: 41 54 push %r12 0.00 : 4af35c: 53 push %rbx 0.00 : 4af35d: 48 81 ec b8 00 00 00 sub $0xb8,%rsp 0.00 : 4af364: 48 89 bd 38 ff ff ff mov %rdi,-0xc8(%rbp) : BTScanOpaque so = (BTScanOpaque) scan->opaque; 0.00 : 4af36b: 48 8b 47 38 mov 0x38(%rdi),%rax 0.00 : 4af36f: 48 89 85 40 ff ff ff mov %rax,-0xc0(%rbp) : int numberOfKeys = scan->numberOfKeys; 0.00 : 4af376: 8b 57 18 mov 0x18(%rdi),%edx 0.00 : 4af379: 89 95 4c ff ff ff mov %edx,-0xb4(%rbp) : int16 *indoption = scan->indexRelation->rd_indoption; 0.00 : 4af37f: 48 8b 47 08 mov 0x8(%rdi),%rax : int i; : MemoryContext oldContext; : : /* Quick check to see if there are any array keys */ : numArrayKeys = 0; : for (i = 0; i < numberOfKeys; i++) 0.00 : 4af383: 85 d2 test %edx,%edx : void : _bt_preprocess_array_keys(IndexScanDesc scan) : { : BTScanOpaque so = (BTScanOpaque) scan->opaque; : int numberOfKeys = scan->numberOfKeys; : int16 *indoption = scan->indexRelation->rd_indoption; 0.00 : 4af385: 48 8b 80 e8 00 00 00 mov 0xe8(%rax),%rax 0.00 : 4af38c: 48 89 85 50 ff ff ff mov %rax,-0xb0(%rbp) : int i; : MemoryContext oldContext; : : /* Quick check to see if there are any array keys */ : numArrayKeys = 0; : for (i = 0; i < numberOfKeys; i++) 0.00 : 4af393: 0f 8e 07 02 00 00 jle 4af5a0 <_bt_preprocess_array_keys+0x250> 0.00 : 4af399: 48 8b 77 20 mov 0x20(%rdi),%rsi 0.00 : 4af39d: 31 db xor %ebx,%ebx 0.00 : 4af39f: 31 c9 xor %ecx,%ecx 0.00 : 4af3a1: 31 d2 xor %edx,%edx 0.00 : 4af3a3: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : { : cur = &scan->keyData[i]; : if (cur->sk_flags & SK_SEARCHARRAY) 0.00 : 4af3a8: 8b 04 16 mov (%rsi,%rdx,1),%eax 0.00 : 4af3ab: a8 20 test $0x20,%al 0.00 : 4af3ad: 74 0b je 4af3ba <_bt_preprocess_array_keys+0x6a> : { : numArrayKeys++; : Assert(!(cur->sk_flags & (SK_ROW_HEADER | SK_SEARCHNULL | SK_SEARCHNOTNULL))); : /* If any arrays are null as a whole, we can quit right now. */ : if (cur->sk_flags & SK_ISNULL) 0.00 : 4af3af: a8 01 test $0x1,%al 0.00 : 4af3b1: 0f 85 d9 03 00 00 jne 4af790 <_bt_preprocess_array_keys+0x440> : for (i = 0; i < numberOfKeys; i++) : { : cur = &scan->keyData[i]; : if (cur->sk_flags & SK_SEARCHARRAY) : { : numArrayKeys++; 0.00 : 4af3b7: 83 c3 01 add $0x1,%ebx : int i; : MemoryContext oldContext; : : /* Quick check to see if there are any array keys */ : numArrayKeys = 0; : for (i = 0; i < numberOfKeys; i++) 0.00 : 4af3ba: 83 c1 01 add $0x1,%ecx 0.00 : 4af3bd: 48 83 c2 48 add $0x48,%rdx 0.00 : 4af3c1: 39 8d 4c ff ff ff cmp %ecx,-0xb4(%rbp) 0.00 : 4af3c7: 7f df jg 4af3a8 <_bt_preprocess_array_keys+0x58> : } : } : } : : /* Quit if nothing to do. */ : if (numArrayKeys == 0) 0.00 : 4af3c9: 85 db test %ebx,%ebx 0.00 : 4af3cb: 0f 84 cf 01 00 00 je 4af5a0 <_bt_preprocess_array_keys+0x250> : : /* : * Make a scan-lifespan context to hold array-associated data, or reset it : * if we already have one from a previous rescan cycle. : */ : if (so->arrayContext == NULL) 0.00 : 4af3d1: 48 8b 95 40 ff ff ff mov -0xc0(%rbp),%rdx 0.00 : 4af3d8: 48 8b 7a 28 mov 0x28(%rdx),%rdi 0.00 : 4af3dc: 48 85 ff test %rdi,%rdi 0.00 : 4af3df: 0f 84 0b 04 00 00 je 4af7f0 <_bt_preprocess_array_keys+0x4a0> : "BTree Array Context", : ALLOCSET_SMALL_MINSIZE, : ALLOCSET_SMALL_INITSIZE, : ALLOCSET_SMALL_MAXSIZE); : else : MemoryContextReset(so->arrayContext); 0.00 : 4af3e5: e8 c6 95 2e 00 callq 7989b0 : #endif /* !PG_USE_INLINE */ : #if defined(PG_USE_INLINE) || defined(MCXT_INCLUDE_DEFINITIONS) : STATIC_IF_INLINE MemoryContext : MemoryContextSwitchTo(MemoryContext context) : { : MemoryContext old = CurrentMemoryContext; 0.00 : 4af3ea: 48 8b 05 6f b4 70 00 mov 0x70b46f(%rip),%rax # bba860 : : CurrentMemoryContext = context; 0.00 : 4af3f1: 48 8b 95 40 ff ff ff mov -0xc0(%rbp),%rdx : #endif /* !PG_USE_INLINE */ : #if defined(PG_USE_INLINE) || defined(MCXT_INCLUDE_DEFINITIONS) : STATIC_IF_INLINE MemoryContext : MemoryContextSwitchTo(MemoryContext context) : { : MemoryContext old = CurrentMemoryContext; 0.00 : 4af3f8: 48 89 85 58 ff ff ff mov %rax,-0xa8(%rbp) : : CurrentMemoryContext = context; 0.00 : 4af3ff: 48 8b 42 28 mov 0x28(%rdx),%rax 0.00 : 4af403: 48 89 05 56 b4 70 00 mov %rax,0x70b456(%rip) # bba860 : : oldContext = MemoryContextSwitchTo(so->arrayContext); : : /* Create modifiable copy of scan->keyData in the workspace context */ : so->arrayKeyData = (ScanKey) palloc(scan->numberOfKeys * sizeof(ScanKeyData)); 0.00 : 4af40a: 48 8b 85 38 ff ff ff mov -0xc8(%rbp),%rax 0.00 : 4af411: 48 63 78 18 movslq 0x18(%rax),%rdi 0.00 : 4af415: 48 8d 3c ff lea (%rdi,%rdi,8),%rdi 0.00 : 4af419: 48 c1 e7 03 shl $0x3,%rdi 0.00 : 4af41d: e8 2e 99 2e 00 callq 798d50 0.00 : 4af422: 48 8b 95 40 ff ff ff mov -0xc0(%rbp),%rdx 0.00 : 4af429: 48 89 c7 mov %rax,%rdi 0.00 : 4af42c: 48 89 42 10 mov %rax,0x10(%rdx) : memcpy(so->arrayKeyData, 0.00 : 4af430: 48 8b 85 38 ff ff ff mov -0xc8(%rbp),%rax 0.00 : 4af437: 48 63 50 18 movslq 0x18(%rax),%rdx 0.00 : 4af43b: 48 8b 70 20 mov 0x20(%rax),%rsi 0.00 : 4af43f: 48 8d 14 d2 lea (%rdx,%rdx,8),%rdx 0.00 : 4af443: 48 c1 e2 03 shl $0x3,%rdx 0.00 : 4af447: e8 a4 a7 fb ff callq 469bf0 : scan->keyData, : scan->numberOfKeys * sizeof(ScanKeyData)); : : /* Allocate space for per-array data in the workspace context */ : so->arrayKeys = (BTArrayKeyInfo *) palloc0(numArrayKeys * sizeof(BTArrayKeyInfo)); 0.00 : 4af44c: 48 63 fb movslq %ebx,%rdi 0.00 : 4af44f: 48 8d 3c 7f lea (%rdi,%rdi,2),%rdi 0.00 : 4af453: 48 c1 e7 03 shl $0x3,%rdi 0.00 : 4af457: e8 14 9b 2e 00 callq 798f70 0.00 : 4af45c: 48 8b 95 40 ff ff ff mov -0xc0(%rbp),%rdx 0.00 : 4af463: 48 89 42 20 mov %rax,0x20(%rdx) 0.00 : 4af467: c7 85 6c ff ff ff 00 movl $0x0,-0x94(%rbp) 0.00 : 4af46e: 00 00 00 0.00 : 4af471: c7 85 7c ff ff ff 00 movl $0x0,-0x84(%rbp) 0.00 : 4af478: 00 00 00 0.00 : 4af47b: 48 c7 85 60 ff ff ff movq $0x0,-0xa0(%rbp) 0.00 : 4af482: 00 00 00 00 0.00 : 4af486: eb 29 jmp 4af4b1 <_bt_preprocess_array_keys+0x161> 0.00 : 4af488: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 4af48f: 00 : : /* Now process each array key */ : numArrayKeys = 0; : for (i = 0; i < numberOfKeys; i++) 0.00 : 4af490: 83 85 7c ff ff ff 01 addl $0x1,-0x84(%rbp) 0.00 : 4af497: 48 83 85 60 ff ff ff addq $0x48,-0xa0(%rbp) 0.00 : 4af49e: 48 0.00 : 4af49f: 8b 85 7c ff ff ff mov -0x84(%rbp),%eax 0.00 : 4af4a5: 39 85 4c ff ff ff cmp %eax,-0xb4(%rbp) 0.00 : 4af4ab: 0f 8e 04 03 00 00 jle 4af7b5 <_bt_preprocess_array_keys+0x465> : Datum *elem_values; : bool *elem_nulls; : int num_nonnulls; : int j; : : cur = &so->arrayKeyData[i]; 0.00 : 4af4b1: 48 8b 9d 40 ff ff ff mov -0xc0(%rbp),%rbx 0.00 : 4af4b8: 4c 8b a5 60 ff ff ff mov -0xa0(%rbp),%r12 0.00 : 4af4bf: 4c 03 63 10 add 0x10(%rbx),%r12 : if (!(cur->sk_flags & SK_SEARCHARRAY)) 0.00 : 4af4c3: 41 f6 04 24 20 testb $0x20,(%r12) 0.00 : 4af4c8: 74 c6 je 4af490 <_bt_preprocess_array_keys+0x140> : /* : * First, deconstruct the array into elements. Anything allocated : * here (including a possibly detoasted array value) is in the : * workspace context. : */ : arrayval = DatumGetArrayTypeP(cur->sk_argument); 0.00 : 4af4ca: 49 8b 7c 24 40 mov 0x40(%r12),%rdi 0.00 : 4af4cf: e8 3c f8 2c 00 callq 77ed10 : /* We could cache this data, but not clear it's worth it */ : get_typlenbyvalalign(ARR_ELEMTYPE(arrayval), 0.00 : 4af4d4: 8b 78 0c mov 0xc(%rax),%edi 0.00 : 4af4d7: 48 8d 4d ce lea -0x32(%rbp),%rcx 0.00 : 4af4db: 48 8d 55 cf lea -0x31(%rbp),%rdx 0.00 : 4af4df: 48 8d 75 cc lea -0x34(%rbp),%rsi : /* : * First, deconstruct the array into elements. Anything allocated : * here (including a possibly detoasted array value) is in the : * workspace context. : */ : arrayval = DatumGetArrayTypeP(cur->sk_argument); 0.00 : 4af4e3: 48 89 c3 mov %rax,%rbx : /* We could cache this data, but not clear it's worth it */ : get_typlenbyvalalign(ARR_ELEMTYPE(arrayval), 0.00 : 4af4e6: e8 85 39 2c 00 callq 772e70 : &elmlen, &elmbyval, &elmalign); : deconstruct_array(arrayval, 0.00 : 4af4eb: 48 8d 45 c8 lea -0x38(%rbp),%rax 0.00 : 4af4ef: 44 0f be 45 ce movsbl -0x32(%rbp),%r8d 0.00 : 4af4f4: 0f be 4d cf movsbl -0x31(%rbp),%ecx 0.00 : 4af4f8: 0f bf 55 cc movswl -0x34(%rbp),%edx 0.00 : 4af4fc: 8b 73 0c mov 0xc(%rbx),%esi 0.00 : 4af4ff: 4c 8d 4d c0 lea -0x40(%rbp),%r9 0.00 : 4af503: 48 89 44 24 08 mov %rax,0x8(%rsp) 0.00 : 4af508: 48 8d 45 b8 lea -0x48(%rbp),%rax 0.00 : 4af50c: 48 89 df mov %rbx,%rdi 0.00 : 4af50f: 48 89 04 24 mov %rax,(%rsp) 0.00 : 4af513: e8 48 97 20 00 callq 6b8c60 : /* : * Compress out any null elements. We can ignore them since we assume : * all btree operators are strict. : */ : num_nonnulls = 0; : for (j = 0; j < num_elems; j++) 0.00 : 4af518: 8b 7d c8 mov -0x38(%rbp),%edi 0.00 : 4af51b: 85 ff test %edi,%edi 0.00 : 4af51d: 0f 8e 88 02 00 00 jle 4af7ab <_bt_preprocess_array_keys+0x45b> 0.00 : 4af523: 31 db xor %ebx,%ebx 0.00 : 4af525: 31 f6 xor %esi,%esi 0.00 : 4af527: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 4af52e: 00 00 : { : if (!elem_nulls[j]) 0.00 : 4af530: 48 8b 45 b8 mov -0x48(%rbp),%rax 0.00 : 4af534: 48 63 d6 movslq %esi,%rdx 0.00 : 4af537: 80 3c 10 00 cmpb $0x0,(%rax,%rdx,1) 0.00 : 4af53b: 75 12 jne 4af54f <_bt_preprocess_array_keys+0x1ff> : elem_values[num_nonnulls++] = elem_values[j]; 0.00 : 4af53d: 48 8b 45 c0 mov -0x40(%rbp),%rax 0.00 : 4af541: 48 63 cb movslq %ebx,%rcx 0.00 : 4af544: 83 c3 01 add $0x1,%ebx 0.00 : 4af547: 48 8b 14 d0 mov (%rax,%rdx,8),%rdx 0.00 : 4af54b: 48 89 14 c8 mov %rdx,(%rax,%rcx,8) : /* : * Compress out any null elements. We can ignore them since we assume : * all btree operators are strict. : */ : num_nonnulls = 0; : for (j = 0; j < num_elems; j++) 0.00 : 4af54f: 83 c6 01 add $0x1,%esi 0.00 : 4af552: 39 75 c8 cmp %esi,-0x38(%rbp) 0.00 : 4af555: 7f d9 jg 4af530 <_bt_preprocess_array_keys+0x1e0> : } : : /* We could pfree(elem_nulls) now, but not worth the cycles */ : : /* If there's no non-nulls, the scan qual is unsatisfiable */ : if (num_nonnulls == 0) 0.00 : 4af557: 85 db test %ebx,%ebx 0.00 : 4af559: 0f 84 4c 02 00 00 je 4af7ab <_bt_preprocess_array_keys+0x45b> : /* : * If the comparison operator is not equality, then the array qual : * degenerates to a simple comparison against the smallest or largest : * non-null array element, as appropriate. : */ : switch (cur->sk_strategy) 0.00 : 4af55f: 66 41 83 7c 24 06 05 cmpw $0x5,0x6(%r12) 0.00 : 4af566: 76 68 jbe 4af5d0 <_bt_preprocess_array_keys+0x280> : _bt_find_extreme_element(scan, cur, : BTLessStrategyNumber, : elem_values, num_nonnulls); : continue; : default: : elog(ERROR, "unrecognized StrategyNumber: %d", 0.00 : 4af568: ba a0 4b 7b 00 mov $0x7b4ba0,%edx 0.00 : 4af56d: be 4b 01 00 00 mov $0x14b,%esi 0.00 : 4af572: bf 17 49 7b 00 mov $0x7b4917,%edi 0.00 : 4af577: e8 a4 be 2c 00 callq 77b420 0.00 : 4af57c: 41 0f b7 54 24 06 movzwl 0x6(%r12),%edx 0.00 : 4af582: be 78 49 7b 00 mov $0x7b4978,%esi 0.00 : 4af587: bf 14 00 00 00 mov $0x14,%edi 0.00 : 4af58c: 31 c0 xor %eax,%eax 0.00 : 4af58e: e8 9d bc 2c 00 callq 77b230 0.00 : 4af593: e8 38 9f fb ff callq 4694d0 0.00 : 4af598: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 4af59f: 00 : } : : /* Quit if nothing to do. */ : if (numArrayKeys == 0) : { : so->numArrayKeys = 0; /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtutils.c:224 50.00 : 4af5a0: 48 8b 85 40 ff ff ff mov -0xc0(%rbp),%rax 0.00 : 4af5a7: c7 40 18 00 00 00 00 movl $0x0,0x18(%rax) : so->arrayKeyData = NULL; 0.00 : 4af5ae: 48 c7 40 10 00 00 00 movq $0x0,0x10(%rax) 0.00 : 4af5b5: 00 : } : : so->numArrayKeys = numArrayKeys; : : MemoryContextSwitchTo(oldContext); : } 0.00 : 4af5b6: 48 81 c4 b8 00 00 00 add $0xb8,%rsp 0.00 : 4af5bd: 5b pop %rbx 0.00 : 4af5be: 41 5c pop %r12 0.00 : 4af5c0: 41 5d pop %r13 0.00 : 4af5c2: 41 5e pop %r14 0.00 : 4af5c4: 41 5f pop %r15 0.00 : 4af5c6: c9 leaveq 0.00 : 4af5c7: c3 retq 0.00 : 4af5c8: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 4af5cf: 00 : /* : * If the comparison operator is not equality, then the array qual : * degenerates to a simple comparison against the smallest or largest : * non-null array element, as appropriate. : */ : switch (cur->sk_strategy) 0.00 : 4af5d0: 41 0f b7 44 24 06 movzwl 0x6(%r12),%eax 0.00 : 4af5d6: ff 24 c5 d0 4a 7b 00 jmpq *0x7b4ad0(,%rax,8) : case BTEqualStrategyNumber: : /* proceed with rest of loop */ : break; : case BTGreaterEqualStrategyNumber: : case BTGreaterStrategyNumber: : cur->sk_argument = 0.00 : 4af5dd: 48 8b 4d c0 mov -0x40(%rbp),%rcx 0.00 : 4af5e1: 48 8b bd 38 ff ff ff mov -0xc8(%rbp),%rdi 0.00 : 4af5e8: 41 89 d8 mov %ebx,%r8d 0.00 : 4af5eb: ba 01 00 00 00 mov $0x1,%edx 0.00 : 4af5f0: 4c 89 e6 mov %r12,%rsi 0.00 : 4af5f3: e8 e8 fb ff ff callq 4af1e0 <_bt_find_extreme_element> 0.00 : 4af5f8: 49 89 44 24 40 mov %rax,0x40(%r12) : _bt_find_extreme_element(scan, cur, : BTLessStrategyNumber, : elem_values, num_nonnulls); : continue; 0.00 : 4af5fd: e9 8e fe ff ff jmpq 4af490 <_bt_preprocess_array_keys+0x140> : /* : * Sort the non-null elements and eliminate any duplicates. We must : * sort in the same ordering used by the index column, so that the : * successive primitive indexscans produce data in index order. : */ : num_elems = _bt_sort_array_elements(scan, cur, 0.00 : 4af602: 48 8b 55 c0 mov -0x40(%rbp),%rdx : RegProcedure cmp_proc; : BTSortArrayContext cxt; : int last_non_dup; : int i; : : if (nelems <= 1) 0.00 : 4af606: 83 fb 01 cmp $0x1,%ebx : /* : * Sort the non-null elements and eliminate any duplicates. We must : * sort in the same ordering used by the index column, so that the : * successive primitive indexscans produce data in index order. : */ : num_elems = _bt_sort_array_elements(scan, cur, 0.00 : 4af609: 48 89 95 70 ff ff ff mov %rdx,-0x90(%rbp) 0.00 : 4af610: 49 0f bf 44 24 04 movswq 0x4(%r12),%rax : static int : _bt_sort_array_elements(IndexScanDesc scan, ScanKey skey, : bool reverse, : Datum *elems, int nelems) : { : Relation rel = scan->indexRelation; 0.00 : 4af616: 48 8b 95 38 ff ff ff mov -0xc8(%rbp),%rdx : /* : * Sort the non-null elements and eliminate any duplicates. We must : * sort in the same ordering used by the index column, so that the : * successive primitive indexscans produce data in index order. : */ : num_elems = _bt_sort_array_elements(scan, cur, 0.00 : 4af61d: 48 8d 78 ff lea -0x1(%rax),%rdi 0.00 : 4af621: 48 8b 85 50 ff ff ff mov -0xb0(%rbp),%rax : static int : _bt_sort_array_elements(IndexScanDesc scan, ScanKey skey, : bool reverse, : Datum *elems, int nelems) : { : Relation rel = scan->indexRelation; 0.00 : 4af628: 4c 8b 72 08 mov 0x8(%rdx),%r14 : /* : * Sort the non-null elements and eliminate any duplicates. We must : * sort in the same ordering used by the index column, so that the : * successive primitive indexscans produce data in index order. : */ : num_elems = _bt_sort_array_elements(scan, cur, 0.00 : 4af62c: 44 0f b7 3c 78 movzwl (%rax,%rdi,2),%r15d : RegProcedure cmp_proc; : BTSortArrayContext cxt; : int last_non_dup; : int i; : : if (nelems <= 1) 0.00 : 4af631: 0f 8e d1 00 00 00 jle 4af708 <_bt_preprocess_array_keys+0x3b8> : /* : * Determine the nominal datatype of the array elements. We have to : * support the convention that sk_subtype == InvalidOid means the opclass : * input type; this is a hack to simplify life for ScanKeyInit(). : */ : elemtype = skey->sk_subtype; 0.00 : 4af637: 45 8b 6c 24 08 mov 0x8(%r12),%r13d : if (elemtype == InvalidOid) 0.00 : 4af63c: 45 85 ed test %r13d,%r13d 0.00 : 4af63f: 0f 84 93 01 00 00 je 4af7d8 <_bt_preprocess_array_keys+0x488> 0.00 : 4af645: 4c 8d 0c bd 00 00 00 lea 0x0(,%rdi,4),%r9 0.00 : 4af64c: 00 : * Note: it's possible that this would fail, if the opfamily is : * incomplete, but it seems quite unlikely that an opfamily would omit : * non-cross-type support functions for any datatype that it supports at : * all. : */ : cmp_proc = get_opfamily_proc(rel->rd_opfamily[skey->sk_attno - 1], 0.00 : 4af64d: 49 8b 86 c8 00 00 00 mov 0xc8(%r14),%rax 0.00 : 4af654: b9 01 00 00 00 mov $0x1,%ecx 0.00 : 4af659: 44 89 ea mov %r13d,%edx 0.00 : 4af65c: 44 89 ee mov %r13d,%esi 0.00 : 4af65f: 42 8b 3c 08 mov (%rax,%r9,1),%edi 0.00 : 4af663: e8 48 32 2c 00 callq 7728b0 : elemtype, : elemtype, : BTORDER_PROC); : if (!RegProcedureIsValid(cmp_proc)) 0.00 : 4af668: 85 c0 test %eax,%eax : * Note: it's possible that this would fail, if the opfamily is : * incomplete, but it seems quite unlikely that an opfamily would omit : * non-cross-type support functions for any datatype that it supports at : * all. : */ : cmp_proc = get_opfamily_proc(rel->rd_opfamily[skey->sk_attno - 1], 0.00 : 4af66a: 89 c7 mov %eax,%edi : elemtype, : elemtype, : BTORDER_PROC); : if (!RegProcedureIsValid(cmp_proc)) 0.00 : 4af66c: 0f 84 ac 01 00 00 je 4af81e <_bt_preprocess_array_keys+0x4ce> : elog(ERROR, "missing support function %d(%u,%u) in opfamily %u", : BTORDER_PROC, elemtype, elemtype, : rel->rd_opfamily[skey->sk_attno - 1]); : : /* Sort the array elements */ : fmgr_info(cmp_proc, &cxt.flinfo); 0.00 : 4af672: 48 8d 75 80 lea -0x80(%rbp),%rsi : cxt.collation = skey->sk_collation; : cxt.reverse = reverse; : qsort_arg((void *) elems, nelems, sizeof(Datum), 0.00 : 4af676: 41 bd 01 00 00 00 mov $0x1,%r13d 0.00 : 4af67c: 45 31 f6 xor %r14d,%r14d : elog(ERROR, "missing support function %d(%u,%u) in opfamily %u", : BTORDER_PROC, elemtype, elemtype, : rel->rd_opfamily[skey->sk_attno - 1]); : : /* Sort the array elements */ : fmgr_info(cmp_proc, &cxt.flinfo); 0.00 : 4af67f: e8 dc 09 2d 00 callq 780060 : cxt.collation = skey->sk_collation; 0.00 : 4af684: 41 8b 44 24 0c mov 0xc(%r12),%eax : cxt.reverse = reverse; : qsort_arg((void *) elems, nelems, sizeof(Datum), 0.00 : 4af689: 48 8b bd 70 ff ff ff mov -0x90(%rbp),%rdi 0.00 : 4af690: 4c 8d 45 80 lea -0x80(%rbp),%r8 0.00 : 4af694: 48 63 f3 movslq %ebx,%rsi 0.00 : 4af697: b9 80 e9 4a 00 mov $0x4ae980,%ecx 0.00 : 4af69c: ba 08 00 00 00 mov $0x8,%edx : BTORDER_PROC, elemtype, elemtype, : rel->rd_opfamily[skey->sk_attno - 1]); : : /* Sort the array elements */ : fmgr_info(cmp_proc, &cxt.flinfo); : cxt.collation = skey->sk_collation; 0.00 : 4af6a1: 89 45 b0 mov %eax,-0x50(%rbp) : cxt.reverse = reverse; 0.00 : 4af6a4: 44 89 f8 mov %r15d,%eax : qsort_arg((void *) elems, nelems, sizeof(Datum), 0.00 : 4af6a7: 45 31 ff xor %r15d,%r15d : rel->rd_opfamily[skey->sk_attno - 1]); : : /* Sort the array elements */ : fmgr_info(cmp_proc, &cxt.flinfo); : cxt.collation = skey->sk_collation; : cxt.reverse = reverse; 0.00 : 4af6aa: 83 e0 01 and $0x1,%eax 0.00 : 4af6ad: 88 45 b4 mov %al,-0x4c(%rbp) : qsort_arg((void *) elems, nelems, sizeof(Datum), 0.00 : 4af6b0: e8 7b db 2f 00 callq 7ad230 0.00 : 4af6b5: 4c 8b a5 70 ff ff ff mov -0x90(%rbp),%r12 0.00 : 4af6bc: 0f 1f 40 00 nopl 0x0(%rax) : last_non_dup = 0; : for (i = 1; i < nelems; i++) : { : int32 compare; : : compare = DatumGetInt32(FunctionCall2Coll(&cxt.flinfo, 0.00 : 4af6c0: 48 8b 85 70 ff ff ff mov -0x90(%rbp),%rax 0.00 : 4af6c7: 49 8b 4c 24 08 mov 0x8(%r12),%rcx 0.00 : 4af6cc: 48 8d 7d 80 lea -0x80(%rbp),%rdi 0.00 : 4af6d0: 8b 75 b0 mov -0x50(%rbp),%esi 0.00 : 4af6d3: 4a 8b 14 f0 mov (%rax,%r14,8),%rdx 0.00 : 4af6d7: e8 54 e9 2c 00 callq 77e030 : cxt.collation, : elems[last_non_dup], : elems[i])); : if (compare != 0) 0.00 : 4af6dc: 85 c0 test %eax,%eax 0.00 : 4af6de: 74 17 je 4af6f7 <_bt_preprocess_array_keys+0x3a7> : elems[++last_non_dup] = elems[i]; 0.00 : 4af6e0: 49 8b 44 24 08 mov 0x8(%r12),%rax 0.00 : 4af6e5: 48 8b 95 70 ff ff ff mov -0x90(%rbp),%rdx 0.00 : 4af6ec: 41 83 c7 01 add $0x1,%r15d 0.00 : 4af6f0: 4d 63 f7 movslq %r15d,%r14 0.00 : 4af6f3: 4a 89 04 f2 mov %rax,(%rdx,%r14,8) : qsort_arg((void *) elems, nelems, sizeof(Datum), : _bt_compare_array_elements, (void *) &cxt); : : /* Now scan the sorted elements and remove duplicates */ : last_non_dup = 0; : for (i = 1; i < nelems; i++) 0.00 : 4af6f7: 41 83 c5 01 add $0x1,%r13d 0.00 : 4af6fb: 49 83 c4 08 add $0x8,%r12 0.00 : 4af6ff: 44 39 eb cmp %r13d,%ebx 0.00 : 4af702: 7f bc jg 4af6c0 <_bt_preprocess_array_keys+0x370> : elems[i])); : if (compare != 0) : elems[++last_non_dup] = elems[i]; : } : : return last_non_dup + 1; 0.00 : 4af704: 41 8d 5f 01 lea 0x1(%r15),%ebx : /* : * Sort the non-null elements and eliminate any duplicates. We must : * sort in the same ordering used by the index column, so that the : * successive primitive indexscans produce data in index order. : */ : num_elems = _bt_sort_array_elements(scan, cur, 0.00 : 4af708: 89 5d c8 mov %ebx,-0x38(%rbp) : elem_values, num_nonnulls); : : /* : * And set up the BTArrayKeyInfo data. : */ : so->arrayKeys[numArrayKeys].scan_key = i; 0.00 : 4af70b: 48 63 85 6c ff ff ff movslq -0x94(%rbp),%rax 0.00 : 4af712: 48 8b 9d 40 ff ff ff mov -0xc0(%rbp),%rbx 0.00 : 4af719: 48 8b 53 20 mov 0x20(%rbx),%rdx 0.00 : 4af71d: 8b 9d 7c ff ff ff mov -0x84(%rbp),%ebx 0.00 : 4af723: 48 8d 04 40 lea (%rax,%rax,2),%rax 0.00 : 4af727: 48 8d 0c c5 00 00 00 lea 0x0(,%rax,8),%rcx 0.00 : 4af72e: 00 0.00 : 4af72f: 89 1c c2 mov %ebx,(%rdx,%rax,8) : so->arrayKeys[numArrayKeys].num_elems = num_elems; 0.00 : 4af732: 48 8b 85 40 ff ff ff mov -0xc0(%rbp),%rax 0.00 : 4af739: 48 8b 50 20 mov 0x20(%rax),%rdx 0.00 : 4af73d: 8b 45 c8 mov -0x38(%rbp),%eax 0.00 : 4af740: 89 44 0a 0c mov %eax,0xc(%rdx,%rcx,1) : so->arrayKeys[numArrayKeys].elem_values = elem_values; 0.00 : 4af744: 48 8b 9d 40 ff ff ff mov -0xc0(%rbp),%rbx 0.00 : 4af74b: 48 8b 45 c0 mov -0x40(%rbp),%rax 0.00 : 4af74f: 48 8b 53 20 mov 0x20(%rbx),%rdx 0.00 : 4af753: 48 89 44 0a 10 mov %rax,0x10(%rdx,%rcx,1) : numArrayKeys++; 0.00 : 4af758: 83 85 6c ff ff ff 01 addl $0x1,-0x94(%rbp) 0.00 : 4af75f: e9 2c fd ff ff jmpq 4af490 <_bt_preprocess_array_keys+0x140> : */ : switch (cur->sk_strategy) : { : case BTLessStrategyNumber: : case BTLessEqualStrategyNumber: : cur->sk_argument = 0.00 : 4af764: 48 8b 4d c0 mov -0x40(%rbp),%rcx 0.00 : 4af768: 48 8b bd 38 ff ff ff mov -0xc8(%rbp),%rdi 0.00 : 4af76f: 41 89 d8 mov %ebx,%r8d 0.00 : 4af772: ba 05 00 00 00 mov $0x5,%edx 0.00 : 4af777: 4c 89 e6 mov %r12,%rsi 0.00 : 4af77a: e8 61 fa ff ff callq 4af1e0 <_bt_find_extreme_element> 0.00 : 4af77f: 49 89 44 24 40 mov %rax,0x40(%r12) : _bt_find_extreme_element(scan, cur, : BTGreaterStrategyNumber, : elem_values, num_nonnulls); : continue; 0.00 : 4af784: e9 07 fd ff ff jmpq 4af490 <_bt_preprocess_array_keys+0x140> 0.00 : 4af789: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : numArrayKeys++; : Assert(!(cur->sk_flags & (SK_ROW_HEADER | SK_SEARCHNULL | SK_SEARCHNOTNULL))); : /* If any arrays are null as a whole, we can quit right now. */ : if (cur->sk_flags & SK_ISNULL) : { : so->numArrayKeys = -1; 0.00 : 4af790: 48 8b 9d 40 ff ff ff mov -0xc0(%rbp),%rbx 0.00 : 4af797: c7 43 18 ff ff ff ff movl $0xffffffff,0x18(%rbx) : so->arrayKeyData = NULL; 0.00 : 4af79e: 48 c7 43 10 00 00 00 movq $0x0,0x10(%rbx) 0.00 : 4af7a5: 00 : } : : so->numArrayKeys = numArrayKeys; : : MemoryContextSwitchTo(oldContext); : } 0.00 : 4af7a6: e9 0b fe ff ff jmpq 4af5b6 <_bt_preprocess_array_keys+0x266> : /* Allocate space for per-array data in the workspace context */ : so->arrayKeys = (BTArrayKeyInfo *) palloc0(numArrayKeys * sizeof(BTArrayKeyInfo)); : : /* Now process each array key */ : numArrayKeys = 0; : for (i = 0; i < numberOfKeys; i++) 0.00 : 4af7ab: c7 85 6c ff ff ff ff movl $0xffffffff,-0x94(%rbp) 0.00 : 4af7b2: ff ff ff : so->arrayKeys[numArrayKeys].num_elems = num_elems; : so->arrayKeys[numArrayKeys].elem_values = elem_values; : numArrayKeys++; : } : : so->numArrayKeys = numArrayKeys; 0.00 : 4af7b5: 8b 9d 6c ff ff ff mov -0x94(%rbp),%ebx 0.00 : 4af7bb: 48 8b 95 40 ff ff ff mov -0xc0(%rbp),%rdx 0.00 : 4af7c2: 89 5a 18 mov %ebx,0x18(%rdx) 0.00 : 4af7c5: 48 8b 85 58 ff ff ff mov -0xa8(%rbp),%rax 0.00 : 4af7cc: 48 89 05 8d b0 70 00 mov %rax,0x70b08d(%rip) # bba860 0.00 : 4af7d3: e9 de fd ff ff jmpq 4af5b6 <_bt_preprocess_array_keys+0x266> : * support the convention that sk_subtype == InvalidOid means the opclass : * input type; this is a hack to simplify life for ScanKeyInit(). : */ : elemtype = skey->sk_subtype; : if (elemtype == InvalidOid) : elemtype = rel->rd_opcintype[skey->sk_attno - 1]; 0.00 : 4af7d8: 49 8b 86 d0 00 00 00 mov 0xd0(%r14),%rax 0.00 : 4af7df: 4c 8d 0c bd 00 00 00 lea 0x0(,%rdi,4),%r9 0.00 : 4af7e6: 00 0.00 : 4af7e7: 44 8b 2c b8 mov (%rax,%rdi,4),%r13d 0.00 : 4af7eb: e9 5d fe ff ff jmpq 4af64d <_bt_preprocess_array_keys+0x2fd> : /* : * Make a scan-lifespan context to hold array-associated data, or reset it : * if we already have one from a previous rescan cycle. : */ : if (so->arrayContext == NULL) : so->arrayContext = AllocSetContextCreate(CurrentMemoryContext, 0.00 : 4af7f0: 48 8b 3d 69 b0 70 00 mov 0x70b069(%rip),%rdi # bba860 0.00 : 4af7f7: 31 d2 xor %edx,%edx 0.00 : 4af7f9: 41 b8 00 20 00 00 mov $0x2000,%r8d 0.00 : 4af7ff: b9 00 04 00 00 mov $0x400,%ecx 0.00 : 4af804: be 39 49 7b 00 mov $0x7b4939,%esi 0.00 : 4af809: e8 82 87 2e 00 callq 797f90 0.00 : 4af80e: 48 8b 95 40 ff ff ff mov -0xc0(%rbp),%rdx 0.00 : 4af815: 48 89 42 28 mov %rax,0x28(%rdx) 0.00 : 4af819: e9 cc fb ff ff jmpq 4af3ea <_bt_preprocess_array_keys+0x9a> : cmp_proc = get_opfamily_proc(rel->rd_opfamily[skey->sk_attno - 1], : elemtype, : elemtype, : BTORDER_PROC); : if (!RegProcedureIsValid(cmp_proc)) : elog(ERROR, "missing support function %d(%u,%u) in opfamily %u", 0.00 : 4af81e: ba e0 4b 7b 00 mov $0x7b4be0,%edx 0.00 : 4af823: be d7 01 00 00 mov $0x1d7,%esi 0.00 : 4af828: bf 17 49 7b 00 mov $0x7b4917,%edi 0.00 : 4af82d: e8 ee bb 2c 00 callq 77b420 0.00 : 4af832: 49 0f bf 54 24 04 movswq 0x4(%r12),%rdx 0.00 : 4af838: 49 8b 86 c8 00 00 00 mov 0xc8(%r14),%rax 0.00 : 4af83f: 45 89 e8 mov %r13d,%r8d 0.00 : 4af842: 44 89 e9 mov %r13d,%ecx 0.00 : 4af845: be 38 4a 7b 00 mov $0x7b4a38,%esi 0.00 : 4af84a: bf 14 00 00 00 mov $0x14,%edi 0.00 : 4af84f: 44 8b 4c 90 fc mov -0x4(%rax,%rdx,4),%r9d 0.00 : 4af854: ba 01 00 00 00 mov $0x1,%edx 0.00 : 4af859: 31 c0 xor %eax,%eax 0.00 : 4af85b: e8 d0 b9 2c 00 callq 77b230 0.00 : 4af860: e8 6b 9c fb ff callq 4694d0 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 50.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/execAmi.c:69 50.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/execAmi.c:111 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000005a84a0 : : * Note that if the plan node has parameters that have changed value, : * the output might be different from last time. : */ : void : ExecReScan(PlanState *node) : { 0.00 : 5a84a0: 55 push %rbp /home/Computational/mark/src/postgres-andres/src/backend/executor/execAmi.c:69 50.00 : 5a84a1: 48 89 e5 mov %rsp,%rbp 0.00 : 5a84a4: 41 56 push %r14 0.00 : 5a84a6: 49 89 fe mov %rdi,%r14 0.00 : 5a84a9: 41 55 push %r13 0.00 : 5a84ab: 41 54 push %r12 0.00 : 5a84ad: 53 push %rbx : /* If collecting timing stats, update them */ : if (node->instrument) 0.00 : 5a84ae: 48 8b 7f 18 mov 0x18(%rdi),%rdi 0.00 : 5a84b2: 48 85 ff test %rdi,%rdi 0.00 : 5a84b5: 74 05 je 5a84bc : InstrEndLoop(node->instrument); 0.00 : 5a84b7: e8 24 f6 00 00 callq 5b7ae0 : * the limited ways in which one InitPlan could depend on another, but : * eventually we might need to work harder (or else make the planner : * enlarge the extParam/allParam sets to include the params of depended-on : * InitPlans). : */ : if (node->chgParam != NULL) 0.00 : 5a84bc: 49 83 7e 50 00 cmpq $0x0,0x50(%r14) 0.00 : 5a84c1: 0f 84 b1 00 00 00 je 5a8578 : { : ListCell *l; : : foreach(l, node->initPlan) 0.00 : 5a84c7: 49 8b 46 40 mov 0x40(%r14),%rax : #endif /* PG_USE_INLINE */ : #if defined(PG_USE_INLINE) || defined(PG_LIST_INCLUDE_DEFINITIONS) : STATIC_IF_INLINE ListCell * : list_head(const List *l) : { : return l ? l->head : NULL; 0.00 : 5a84cb: 48 85 c0 test %rax,%rax 0.00 : 5a84ce: 66 90 xchg %ax,%ax 0.00 : 5a84d0: 74 49 je 5a851b 0.00 : 5a84d2: 4c 8b 60 08 mov 0x8(%rax),%r12 0.00 : 5a84d6: 4d 85 e4 test %r12,%r12 0.00 : 5a84d9: 74 40 je 5a851b 0.00 : 5a84db: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : { : SubPlanState *sstate = (SubPlanState *) lfirst(l); 0.00 : 5a84e0: 4d 8b 2c 24 mov (%r12),%r13 : PlanState *splan = sstate->planstate; 0.00 : 5a84e4: 49 8b 5d 18 mov 0x18(%r13),%rbx : : if (splan->plan->extParam != NULL) /* don't care about child 0.00 : 5a84e8: 48 8b 43 08 mov 0x8(%rbx),%rax 0.00 : 5a84ec: 48 83 78 50 00 cmpq $0x0,0x50(%rax) 0.00 : 5a84f1: 74 0c je 5a84ff : * local Params */ : UpdateChangedParamSet(splan, node->chgParam); 0.00 : 5a84f3: 49 8b 76 50 mov 0x50(%r14),%rsi 0.00 : 5a84f7: 48 89 df mov %rbx,%rdi 0.00 : 5a84fa: e8 d1 c5 00 00 callq 5b4ad0 : if (splan->chgParam != NULL) 0.00 : 5a84ff: 48 83 7b 50 00 cmpq $0x0,0x50(%rbx) 0.00 : 5a8504: 74 0b je 5a8511 : ExecReScanSetParamPlan(sstate, node); 0.00 : 5a8506: 4c 89 f6 mov %r14,%rsi 0.00 : 5a8509: 4c 89 ef mov %r13,%rdi 0.00 : 5a850c: e8 2f fb 01 00 callq 5c8040 : */ : if (node->chgParam != NULL) : { : ListCell *l; : : foreach(l, node->initPlan) 0.00 : 5a8511: 4d 8b 64 24 08 mov 0x8(%r12),%r12 0.00 : 5a8516: 4d 85 e4 test %r12,%r12 0.00 : 5a8519: 75 c5 jne 5a84e0 : * local Params */ : UpdateChangedParamSet(splan, node->chgParam); : if (splan->chgParam != NULL) : ExecReScanSetParamPlan(sstate, node); : } : foreach(l, node->subPlan) 0.00 : 5a851b: 49 8b 46 48 mov 0x48(%r14),%rax 0.00 : 5a851f: 48 85 c0 test %rax,%rax 0.00 : 5a8522: 74 30 je 5a8554 0.00 : 5a8524: 48 8b 58 08 mov 0x8(%rax),%rbx 0.00 : 5a8528: 48 85 db test %rbx,%rbx 0.00 : 5a852b: 74 27 je 5a8554 0.00 : 5a852d: 0f 1f 00 nopl (%rax) : { : SubPlanState *sstate = (SubPlanState *) lfirst(l); : PlanState *splan = sstate->planstate; 0.00 : 5a8530: 48 8b 03 mov (%rbx),%rax 0.00 : 5a8533: 48 8b 78 18 mov 0x18(%rax),%rdi : : if (splan->plan->extParam != NULL) 0.00 : 5a8537: 48 8b 47 08 mov 0x8(%rdi),%rax 0.00 : 5a853b: 48 83 78 50 00 cmpq $0x0,0x50(%rax) 0.00 : 5a8540: 74 09 je 5a854b : UpdateChangedParamSet(splan, node->chgParam); 0.00 : 5a8542: 49 8b 76 50 mov 0x50(%r14),%rsi 0.00 : 5a8546: e8 85 c5 00 00 callq 5b4ad0 : * local Params */ : UpdateChangedParamSet(splan, node->chgParam); : if (splan->chgParam != NULL) : ExecReScanSetParamPlan(sstate, node); : } : foreach(l, node->subPlan) 0.00 : 5a854b: 48 8b 5b 08 mov 0x8(%rbx),%rbx 0.00 : 5a854f: 48 85 db test %rbx,%rbx 0.00 : 5a8552: 75 dc jne 5a8530 : : if (splan->plan->extParam != NULL) : UpdateChangedParamSet(splan, node->chgParam); : } : /* Well. Now set chgParam for left/right trees. */ : if (node->lefttree != NULL) /home/Computational/mark/src/postgres-andres/src/backend/executor/execAmi.c:111 50.00 : 5a8554: 49 8b 7e 30 mov 0x30(%r14),%rdi 0.00 : 5a8558: 48 85 ff test %rdi,%rdi 0.00 : 5a855b: 74 09 je 5a8566 : UpdateChangedParamSet(node->lefttree, node->chgParam); 0.00 : 5a855d: 49 8b 76 50 mov 0x50(%r14),%rsi 0.00 : 5a8561: e8 6a c5 00 00 callq 5b4ad0 : if (node->righttree != NULL) 0.00 : 5a8566: 49 8b 7e 38 mov 0x38(%r14),%rdi 0.00 : 5a856a: 48 85 ff test %rdi,%rdi 0.00 : 5a856d: 74 09 je 5a8578 : UpdateChangedParamSet(node->righttree, node->chgParam); 0.00 : 5a856f: 49 8b 76 50 mov 0x50(%r14),%rsi 0.00 : 5a8573: e8 58 c5 00 00 callq 5b4ad0 : } : : /* Shut down any SRFs in the plan node's targetlist */ : if (node->ps_ExprContext) 0.00 : 5a8578: 49 8b 7e 60 mov 0x60(%r14),%rdi 0.00 : 5a857c: 48 85 ff test %rdi,%rdi 0.00 : 5a857f: 74 05 je 5a8586 : ReScanExprContext(node->ps_ExprContext); 0.00 : 5a8581: e8 fa cb 00 00 callq 5b5180 : : /* And do node-type-specific processing */ : switch (nodeTag(node)) 0.00 : 5a8586: 41 8b 06 mov (%r14),%eax 0.00 : 5a8589: 2d c9 00 00 00 sub $0xc9,%eax 0.00 : 5a858e: 83 f8 21 cmp $0x21,%eax 0.00 : 5a8591: 76 2d jbe 5a85c0 : case T_LimitState: : ExecReScanLimit((LimitState *) node); : break; : : default: : elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node)); 0.00 : 5a8593: ba 13 93 88 00 mov $0x889313,%edx 0.00 : 5a8598: be fd 00 00 00 mov $0xfd,%esi 0.00 : 5a859d: bf 08 8f 88 00 mov $0x888f08,%edi 0.00 : 5a85a2: e8 79 2e 1d 00 callq 77b420 0.00 : 5a85a7: 41 8b 16 mov (%r14),%edx 0.00 : 5a85aa: be 5c 17 87 00 mov $0x87175c,%esi 0.00 : 5a85af: bf 14 00 00 00 mov $0x14,%edi 0.00 : 5a85b4: 31 c0 xor %eax,%eax 0.00 : 5a85b6: e8 75 2c 1d 00 callq 77b230 0.00 : 5a85bb: e8 10 0f ec ff callq 4694d0 : /* Shut down any SRFs in the plan node's targetlist */ : if (node->ps_ExprContext) : ReScanExprContext(node->ps_ExprContext); : : /* And do node-type-specific processing */ : switch (nodeTag(node)) 0.00 : 5a85c0: 89 c0 mov %eax,%eax 0.00 : 5a85c2: ff 24 c5 d0 91 88 00 jmpq *0x8891d0(,%rax,8) : case T_LockRowsState: : ExecReScanLockRows((LockRowsState *) node); : break; : : case T_LimitState: : ExecReScanLimit((LimitState *) node); 0.00 : 5a85c9: 4c 89 f7 mov %r14,%rdi 0.00 : 5a85cc: e8 df 7a 01 00 callq 5c00b0 0.00 : 5a85d1: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : default: : elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node)); : break; : } : : if (node->chgParam != NULL) 0.00 : 5a85d8: 49 8b 7e 50 mov 0x50(%r14),%rdi 0.00 : 5a85dc: 48 85 ff test %rdi,%rdi 0.00 : 5a85df: 74 0d je 5a85ee : { : bms_free(node->chgParam); 0.00 : 5a85e1: e8 ca a7 03 00 callq 5e2db0 : node->chgParam = NULL; 0.00 : 5a85e6: 49 c7 46 50 00 00 00 movq $0x0,0x50(%r14) 0.00 : 5a85ed: 00 : } : } 0.00 : 5a85ee: 5b pop %rbx 0.00 : 5a85ef: 41 5c pop %r12 0.00 : 5a85f1: 41 5d pop %r13 0.00 : 5a85f3: 41 5e pop %r14 0.00 : 5a85f5: c9 leaveq 0.00 : 5a85f6: c3 retq : case T_SetOpState: : ExecReScanSetOp((SetOpState *) node); : break; : : case T_LockRowsState: : ExecReScanLockRows((LockRowsState *) node); 0.00 : 5a85f7: 4c 89 f7 mov %r14,%rdi 0.00 : 5a85fa: e8 81 7e 01 00 callq 5c0480 : break; 0.00 : 5a85ff: eb d7 jmp 5a85d8 : case T_HashState: : ExecReScanHash((HashState *) node); : break; : : case T_SetOpState: : ExecReScanSetOp((SetOpState *) node); 0.00 : 5a8601: 4c 89 f7 mov %r14,%rdi 0.00 : 5a8604: e8 97 d3 01 00 callq 5c59a0 : break; 0.00 : 5a8609: eb cd jmp 5a85d8 : case T_UniqueState: : ExecReScanUnique((UniqueState *) node); : break; : : case T_HashState: : ExecReScanHash((HashState *) node); 0.00 : 5a860b: 4c 89 f7 mov %r14,%rdi 0.00 : 5a860e: e8 fd 35 01 00 callq 5bbc10 : break; 0.00 : 5a8613: eb c3 jmp 5a85d8 : case T_WindowAggState: : ExecReScanWindowAgg((WindowAggState *) node); : break; : : case T_UniqueState: : ExecReScanUnique((UniqueState *) node); 0.00 : 5a8615: 4c 89 f7 mov %r14,%rdi 0.00 : 5a8618: e8 83 de 01 00 callq 5c64a0 0.00 : 5a861d: 0f 1f 00 nopl (%rax) : break; 0.00 : 5a8620: eb b6 jmp 5a85d8 : case T_AggState: : ExecReScanAgg((AggState *) node); : break; : : case T_WindowAggState: : ExecReScanWindowAgg((WindowAggState *) node); 0.00 : 5a8622: 4c 89 f7 mov %r14,%rdi 0.00 : 5a8625: e8 56 25 02 00 callq 5cab80 0.00 : 5a862a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : break; 0.00 : 5a8630: eb a6 jmp 5a85d8 : case T_GroupState: : ExecReScanGroup((GroupState *) node); : break; : : case T_AggState: : ExecReScanAgg((AggState *) node); 0.00 : 5a8632: 4c 89 f7 mov %r14,%rdi 0.00 : 5a8635: e8 76 fe 00 00 callq 5b84b0 0.00 : 5a863a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : break; 0.00 : 5a8640: eb 96 jmp 5a85d8 : case T_SortState: : ExecReScanSort((SortState *) node); : break; : : case T_GroupState: : ExecReScanGroup((GroupState *) node); 0.00 : 5a8642: 4c 89 f7 mov %r14,%rdi 0.00 : 5a8645: e8 b6 e9 01 00 callq 5c7000 0.00 : 5a864a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : break; 0.00 : 5a8650: eb 86 jmp 5a85d8 : case T_MaterialState: : ExecReScanMaterial((MaterialState *) node); : break; : : case T_SortState: : ExecReScanSort((SortState *) node); 0.00 : 5a8652: 4c 89 f7 mov %r14,%rdi 0.00 : 5a8655: e8 d6 da 01 00 callq 5c6130 0.00 : 5a865a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : break; 0.00 : 5a8660: e9 73 ff ff ff jmpq 5a85d8 : case T_HashJoinState: : ExecReScanHashJoin((HashJoinState *) node); : break; : : case T_MaterialState: : ExecReScanMaterial((MaterialState *) node); 0.00 : 5a8665: 4c 89 f7 mov %r14,%rdi 0.00 : 5a8668: e8 a3 84 01 00 callq 5c0b10 0.00 : 5a866d: 0f 1f 00 nopl (%rax) : break; 0.00 : 5a8670: e9 63 ff ff ff jmpq 5a85d8 : case T_MergeJoinState: : ExecReScanMergeJoin((MergeJoinState *) node); : break; : : case T_HashJoinState: : ExecReScanHashJoin((HashJoinState *) node); 0.00 : 5a8675: 4c 89 f7 mov %r14,%rdi 0.00 : 5a8678: e8 e3 4d 01 00 callq 5bd460 0.00 : 5a867d: 0f 1f 00 nopl (%rax) : break; 0.00 : 5a8680: e9 53 ff ff ff jmpq 5a85d8 : case T_NestLoopState: : ExecReScanNestLoop((NestLoopState *) node); : break; : : case T_MergeJoinState: : ExecReScanMergeJoin((MergeJoinState *) node); 0.00 : 5a8685: 4c 89 f7 mov %r14,%rdi 0.00 : 5a8688: e8 73 8d 01 00 callq 5c1400 0.00 : 5a868d: 0f 1f 00 nopl (%rax) : break; 0.00 : 5a8690: e9 43 ff ff ff jmpq 5a85d8 : case T_ForeignScanState: : ExecReScanForeignScan((ForeignScanState *) node); : break; : : case T_NestLoopState: : ExecReScanNestLoop((NestLoopState *) node); 0.00 : 5a8695: 4c 89 f7 mov %r14,%rdi 0.00 : 5a8698: e8 b3 b9 01 00 callq 5c4050 0.00 : 5a869d: 0f 1f 00 nopl (%rax) : break; 0.00 : 5a86a0: e9 33 ff ff ff jmpq 5a85d8 : case T_WorkTableScanState: : ExecReScanWorkTableScan((WorkTableScanState *) node); : break; : : case T_ForeignScanState: : ExecReScanForeignScan((ForeignScanState *) node); 0.00 : 5a86a5: 4c 89 f7 mov %r14,%rdi 0.00 : 5a86a8: e8 13 11 02 00 callq 5c97c0 0.00 : 5a86ad: 0f 1f 00 nopl (%rax) : break; 0.00 : 5a86b0: e9 23 ff ff ff jmpq 5a85d8 : case T_CteScanState: : ExecReScanCteScan((CteScanState *) node); : break; : : case T_WorkTableScanState: : ExecReScanWorkTableScan((WorkTableScanState *) node); 0.00 : 5a86b5: 4c 89 f7 mov %r14,%rdi 0.00 : 5a86b8: e8 63 e7 01 00 callq 5c6e20 0.00 : 5a86bd: 0f 1f 00 nopl (%rax) : break; 0.00 : 5a86c0: e9 13 ff ff ff jmpq 5a85d8 : case T_ValuesScanState: : ExecReScanValuesScan((ValuesScanState *) node); : break; : : case T_CteScanState: : ExecReScanCteScan((CteScanState *) node); 0.00 : 5a86c5: 4c 89 f7 mov %r14,%rdi 0.00 : 5a86c8: e8 43 e3 01 00 callq 5c6a10 0.00 : 5a86cd: 0f 1f 00 nopl (%rax) : break; 0.00 : 5a86d0: e9 03 ff ff ff jmpq 5a85d8 : case T_FunctionScanState: : ExecReScanFunctionScan((FunctionScanState *) node); : break; : : case T_ValuesScanState: : ExecReScanValuesScan((ValuesScanState *) node); 0.00 : 5a86d5: 4c 89 f7 mov %r14,%rdi 0.00 : 5a86d8: e8 e3 df 01 00 callq 5c66c0 0.00 : 5a86dd: 0f 1f 00 nopl (%rax) : break; 0.00 : 5a86e0: e9 f3 fe ff ff jmpq 5a85d8 : case T_SubqueryScanState: : ExecReScanSubqueryScan((SubqueryScanState *) node); : break; : : case T_FunctionScanState: : ExecReScanFunctionScan((FunctionScanState *) node); 0.00 : 5a86e5: 4c 89 f7 mov %r14,%rdi 0.00 : 5a86e8: e8 73 be 01 00 callq 5c4560 0.00 : 5a86ed: 0f 1f 00 nopl (%rax) : break; 0.00 : 5a86f0: e9 e3 fe ff ff jmpq 5a85d8 : case T_TidScanState: : ExecReScanTidScan((TidScanState *) node); : break; : : case T_SubqueryScanState: : ExecReScanSubqueryScan((SubqueryScanState *) node); 0.00 : 5a86f5: 4c 89 f7 mov %r14,%rdi 0.00 : 5a86f8: e8 03 06 02 00 callq 5c8d00 0.00 : 5a86fd: 0f 1f 00 nopl (%rax) : break; 0.00 : 5a8700: e9 d3 fe ff ff jmpq 5a85d8 : case T_BitmapHeapScanState: : ExecReScanBitmapHeapScan((BitmapHeapScanState *) node); : break; : : case T_TidScanState: : ExecReScanTidScan((TidScanState *) node); 0.00 : 5a8705: 4c 89 f7 mov %r14,%rdi 0.00 : 5a8708: e8 a3 09 02 00 callq 5c90b0 0.00 : 5a870d: 0f 1f 00 nopl (%rax) : break; 0.00 : 5a8710: e9 c3 fe ff ff jmpq 5a85d8 : case T_BitmapIndexScanState: : ExecReScanBitmapIndexScan((BitmapIndexScanState *) node); : break; : : case T_BitmapHeapScanState: : ExecReScanBitmapHeapScan((BitmapHeapScanState *) node); 0.00 : 5a8715: 4c 89 f7 mov %r14,%rdi 0.00 : 5a8718: e8 53 27 01 00 callq 5bae70 0.00 : 5a871d: 0f 1f 00 nopl (%rax) : break; 0.00 : 5a8720: e9 b3 fe ff ff jmpq 5a85d8 : case T_IndexOnlyScanState: : ExecReScanIndexOnlyScan((IndexOnlyScanState *) node); : break; : : case T_BitmapIndexScanState: : ExecReScanBitmapIndexScan((BitmapIndexScanState *) node); 0.00 : 5a8725: 4c 89 f7 mov %r14,%rdi 0.00 : 5a8728: e8 93 31 01 00 callq 5bb8c0 0.00 : 5a872d: 0f 1f 00 nopl (%rax) : break; 0.00 : 5a8730: e9 a3 fe ff ff jmpq 5a85d8 : case T_IndexScanState: : ExecReScanIndexScan((IndexScanState *) node); : break; : : case T_IndexOnlyScanState: : ExecReScanIndexOnlyScan((IndexOnlyScanState *) node); 0.00 : 5a8735: 4c 89 f7 mov %r14,%rdi 0.00 : 5a8738: e8 b3 72 01 00 callq 5bf9f0 0.00 : 5a873d: 0f 1f 00 nopl (%rax) : break; 0.00 : 5a8740: e9 93 fe ff ff jmpq 5a85d8 : case T_SeqScanState: : ExecReScanSeqScan((SeqScanState *) node); : break; : : case T_IndexScanState: : ExecReScanIndexScan((IndexScanState *) node); 0.00 : 5a8745: 4c 89 f7 mov %r14,%rdi 0.00 : 5a8748: e8 03 6d 01 00 callq 5bf450 0.00 : 5a874d: 0f 1f 00 nopl (%rax) : break; 0.00 : 5a8750: e9 83 fe ff ff jmpq 5a85d8 : case T_BitmapOrState: : ExecReScanBitmapOr((BitmapOrState *) node); : break; : : case T_SeqScanState: : ExecReScanSeqScan((SeqScanState *) node); 0.00 : 5a8755: 4c 89 f7 mov %r14,%rdi 0.00 : 5a8758: e8 33 d0 01 00 callq 5c5790 0.00 : 5a875d: 0f 1f 00 nopl (%rax) : break; 0.00 : 5a8760: e9 73 fe ff ff jmpq 5a85d8 : case T_BitmapAndState: : ExecReScanBitmapAnd((BitmapAndState *) node); : break; : : case T_BitmapOrState: : ExecReScanBitmapOr((BitmapOrState *) node); 0.00 : 5a8765: 4c 89 f7 mov %r14,%rdi 0.00 : 5a8768: e8 e3 21 01 00 callq 5ba950 0.00 : 5a876d: 0f 1f 00 nopl (%rax) : break; 0.00 : 5a8770: e9 63 fe ff ff jmpq 5a85d8 : case T_RecursiveUnionState: : ExecReScanRecursiveUnion((RecursiveUnionState *) node); : break; : : case T_BitmapAndState: : ExecReScanBitmapAnd((BitmapAndState *) node); 0.00 : 5a8775: 4c 89 f7 mov %r14,%rdi 0.00 : 5a8778: e8 13 1f 01 00 callq 5ba690 0.00 : 5a877d: 0f 1f 00 nopl (%rax) : break; 0.00 : 5a8780: e9 53 fe ff ff jmpq 5a85d8 : case T_MergeAppendState: : ExecReScanMergeAppend((MergeAppendState *) node); : break; : : case T_RecursiveUnionState: : ExecReScanRecursiveUnion((RecursiveUnionState *) node); 0.00 : 5a8785: 4c 89 f7 mov %r14,%rdi 0.00 : 5a8788: e8 13 c8 01 00 callq 5c4fa0 0.00 : 5a878d: 0f 1f 00 nopl (%rax) : break; 0.00 : 5a8790: e9 43 fe ff ff jmpq 5a85d8 : case T_AppendState: : ExecReScanAppend((AppendState *) node); : break; : : case T_MergeAppendState: : ExecReScanMergeAppend((MergeAppendState *) node); 0.00 : 5a8795: 4c 89 f7 mov %r14,%rdi 0.00 : 5a8798: e8 63 87 01 00 callq 5c0f00 0.00 : 5a879d: 0f 1f 00 nopl (%rax) : break; 0.00 : 5a87a0: e9 33 fe ff ff jmpq 5a85d8 : case T_ModifyTableState: : ExecReScanModifyTable((ModifyTableState *) node); : break; : : case T_AppendState: : ExecReScanAppend((AppendState *) node); 0.00 : 5a87a5: 4c 89 f7 mov %r14,%rdi 0.00 : 5a87a8: e8 f3 f8 00 00 callq 5b80a0 0.00 : 5a87ad: 0f 1f 00 nopl (%rax) : break; 0.00 : 5a87b0: e9 23 fe ff ff jmpq 5a85d8 : case T_ResultState: : ExecReScanResult((ResultState *) node); : break; : : case T_ModifyTableState: : ExecReScanModifyTable((ModifyTableState *) node); 0.00 : 5a87b5: 4c 89 f7 mov %r14,%rdi 0.00 : 5a87b8: e8 e3 9f 01 00 callq 5c27a0 0.00 : 5a87bd: 0f 1f 00 nopl (%rax) : break; 0.00 : 5a87c0: e9 13 fe ff ff jmpq 5a85d8 : : /* And do node-type-specific processing */ : switch (nodeTag(node)) : { : case T_ResultState: : ExecReScanResult((ResultState *) node); 0.00 : 5a87c5: 4c 89 f7 mov %r14,%rdi 0.00 : 5a87c8: e8 93 cc 01 00 callq 5c5460 0.00 : 5a87cd: 0f 1f 00 nopl (%rax) : break; 0.00 : 5a87d0: e9 03 fe ff ff jmpq 5a85d8 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 50.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/execGrouping.c:77 50.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/execGrouping.c:100 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000005a9440 : : TupleTableSlot *slot2, : int numCols, : AttrNumber *matchColIdx, : FmgrInfo *eqfunctions, : MemoryContext evalContext) : { 0.00 : 5a9440: 55 push %rbp 0.00 : 5a9441: 48 89 e5 mov %rsp,%rbp 0.00 : 5a9444: 41 57 push %r15 0.00 : 5a9446: 49 89 cf mov %rcx,%r15 0.00 : 5a9449: 41 56 push %r14 0.00 : 5a944b: 41 55 push %r13 0.00 : 5a944d: 41 54 push %r12 0.00 : 5a944f: 41 89 d4 mov %edx,%r12d : STATIC_IF_INLINE MemoryContext : MemoryContextSwitchTo(MemoryContext context) : { : MemoryContext old = CurrentMemoryContext; : : CurrentMemoryContext = context; 0.00 : 5a9452: 45 89 e5 mov %r12d,%r13d 0.00 : 5a9455: 53 push %rbx 0.00 : 5a9456: 4c 89 cb mov %r9,%rbx 0.00 : 5a9459: 48 83 ec 38 sub $0x38,%rsp 0.00 : 5a945d: 48 89 7d b8 mov %rdi,-0x48(%rbp) : MemoryContext oldContext; : bool result; : int i; : : /* Reset and switch into the temp context. */ : MemoryContextReset(evalContext); 0.00 : 5a9461: 4c 89 cf mov %r9,%rdi : TupleTableSlot *slot2, : int numCols, : AttrNumber *matchColIdx, : FmgrInfo *eqfunctions, : MemoryContext evalContext) : { 0.00 : 5a9464: 48 89 75 b0 mov %rsi,-0x50(%rbp) 0.00 : 5a9468: 4c 89 45 a8 mov %r8,-0x58(%rbp) : MemoryContext oldContext; : bool result; : int i; : : /* Reset and switch into the temp context. */ : MemoryContextReset(evalContext); 0.00 : 5a946c: e8 3f f5 1e 00 callq 7989b0 : #endif /* !PG_USE_INLINE */ : #if defined(PG_USE_INLINE) || defined(MCXT_INCLUDE_DEFINITIONS) : STATIC_IF_INLINE MemoryContext : MemoryContextSwitchTo(MemoryContext context) : { : MemoryContext old = CurrentMemoryContext; 0.00 : 5a9471: 48 8b 05 e8 13 61 00 mov 0x6113e8(%rip),%rax # bba860 : : CurrentMemoryContext = context; 0.00 : 5a9478: 48 89 1d e1 13 61 00 mov %rbx,0x6113e1(%rip) # bba860 : #endif /* !PG_USE_INLINE */ : #if defined(PG_USE_INLINE) || defined(MCXT_INCLUDE_DEFINITIONS) : STATIC_IF_INLINE MemoryContext : MemoryContextSwitchTo(MemoryContext context) : { : MemoryContext old = CurrentMemoryContext; 0.00 : 5a947f: 48 89 45 c0 mov %rax,-0x40(%rbp) 0.00 : 5a9483: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : * comparing at the last field (least significant sort key). That's the : * most likely to be different if we are dealing with sorted input. : */ : result = true; : : for (i = numCols; --i >= 0;) /home/Computational/mark/src/postgres-andres/src/backend/executor/execGrouping.c:77 50.00 : 5a9488: 41 83 ed 01 sub $0x1,%r13d 0.00 : 5a948c: 78 72 js 5a9500 : { : AttrNumber att = matchColIdx[i]; 0.00 : 5a948e: 4d 63 e5 movslq %r13d,%r12 : Datum attr1, : attr2; : bool isNull1, : isNull2; : : attr1 = slot_getattr(slot1, att, &isNull1); 0.00 : 5a9491: 48 8b 7d b8 mov -0x48(%rbp),%rdi 0.00 : 5a9495: 48 8d 55 d7 lea -0x29(%rbp),%rdx 0.00 : 5a9499: 43 0f bf 1c 67 movswl (%r15,%r12,2),%ebx 0.00 : 5a949e: 89 de mov %ebx,%esi 0.00 : 5a94a0: e8 5b 5f ec ff callq 46f400 : : attr2 = slot_getattr(slot2, att, &isNull2); 0.00 : 5a94a5: 48 8b 7d b0 mov -0x50(%rbp),%rdi 0.00 : 5a94a9: 48 8d 55 d6 lea -0x2a(%rbp),%rdx 0.00 : 5a94ad: 89 de mov %ebx,%esi : Datum attr1, : attr2; : bool isNull1, : isNull2; : : attr1 = slot_getattr(slot1, att, &isNull1); 0.00 : 5a94af: 49 89 c6 mov %rax,%r14 : : attr2 = slot_getattr(slot2, att, &isNull2); 0.00 : 5a94b2: e8 49 5f ec ff callq 46f400 : : if (isNull1 != isNull2) 0.00 : 5a94b7: 0f b6 55 d7 movzbl -0x29(%rbp),%edx 0.00 : 5a94bb: 3a 55 d6 cmp -0x2a(%rbp),%dl 0.00 : 5a94be: 75 21 jne 5a94e1 : { : result = false; /* one null and one not; they aren't equal */ : break; : } : : if (isNull1) 0.00 : 5a94c0: 84 d2 test %dl,%dl 0.00 : 5a94c2: 75 c4 jne 5a9488 : continue; /* both are null, treat as equal */ : : /* Apply the type-specific equality function */ : : if (!DatumGetBool(FunctionCall2(&eqfunctions[i], 0.00 : 5a94c4: 4b 8d 3c 64 lea (%r12,%r12,2),%rdi 0.00 : 5a94c8: 31 f6 xor %esi,%esi 0.00 : 5a94ca: 48 89 c1 mov %rax,%rcx 0.00 : 5a94cd: 4c 89 f2 mov %r14,%rdx 0.00 : 5a94d0: 48 c1 e7 04 shl $0x4,%rdi 0.00 : 5a94d4: 48 03 7d a8 add -0x58(%rbp),%rdi 0.00 : 5a94d8: e8 53 4b 1d 00 callq 77e030 /home/Computational/mark/src/postgres-andres/src/backend/executor/execGrouping.c:100 50.00 : 5a94dd: 84 c0 test %al,%al 0.00 : 5a94df: 75 a7 jne 5a9488 : * comparing at the last field (least significant sort key). That's the : * most likely to be different if we are dealing with sorted input. : */ : result = true; : : for (i = numCols; --i >= 0;) 0.00 : 5a94e1: 31 c0 xor %eax,%eax : : CurrentMemoryContext = context; 0.00 : 5a94e3: 48 8b 55 c0 mov -0x40(%rbp),%rdx 0.00 : 5a94e7: 48 89 15 72 13 61 00 mov %rdx,0x611372(%rip) # bba860 : } : : MemoryContextSwitchTo(oldContext); : : return result; : } 0.00 : 5a94ee: 48 83 c4 38 add $0x38,%rsp 0.00 : 5a94f2: 5b pop %rbx 0.00 : 5a94f3: 41 5c pop %r12 0.00 : 5a94f5: 41 5d pop %r13 0.00 : 5a94f7: 41 5e pop %r14 0.00 : 5a94f9: 41 5f pop %r15 0.00 : 5a94fb: c9 leaveq 0.00 : 5a94fc: c3 retq 0.00 : 5a94fd: 0f 1f 00 nopl (%rax) : * comparing at the last field (least significant sort key). That's the : * most likely to be different if we are dealing with sorted input. : */ : result = true; : : for (i = numCols; --i >= 0;) 0.00 : 5a9500: b8 01 00 00 00 mov $0x1,%eax 0.00 : 5a9505: eb dc jmp 5a94e3 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 50.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1070 50.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1083 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000005b2630 : : * ---------------------------------------------------------------- : */ : static Datum : ExecEvalParamExec(ExprState *exprstate, ExprContext *econtext, : bool *isNull, ExprDoneCond *isDone) : { /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1070 50.00 : 5b2630: 55 push %rbp : Param *expression = (Param *) exprstate->expr; : int thisParamId = expression->paramid; : ParamExecData *prm; : : if (isDone) 0.00 : 5b2631: 48 85 c9 test %rcx,%rcx : * ---------------------------------------------------------------- : */ : static Datum : ExecEvalParamExec(ExprState *exprstate, ExprContext *econtext, : bool *isNull, ExprDoneCond *isDone) : { 0.00 : 5b2634: 48 89 e5 mov %rsp,%rbp 0.00 : 5b2637: 41 54 push %r12 0.00 : 5b2639: 49 89 d4 mov %rdx,%r12 0.00 : 5b263c: 53 push %rbx : Param *expression = (Param *) exprstate->expr; : int thisParamId = expression->paramid; 0.00 : 5b263d: 48 8b 47 08 mov 0x8(%rdi),%rax 0.00 : 5b2641: 8b 40 08 mov 0x8(%rax),%eax : ParamExecData *prm; : : if (isDone) 0.00 : 5b2644: 74 06 je 5b264c : *isDone = ExprSingleResult; 0.00 : 5b2646: c7 01 00 00 00 00 movl $0x0,(%rcx) : : /* : * PARAM_EXEC params (internal executor parameters) are stored in the : * ecxt_param_exec_vals array, and can be accessed by array index. : */ : prm = &(econtext->ecxt_param_exec_vals[thisParamId]); 0.00 : 5b264c: 48 98 cltq 0.00 : 5b264e: 48 8d 04 40 lea (%rax,%rax,2),%rax 0.00 : 5b2652: 48 8d 1c c5 00 00 00 lea 0x0(,%rax,8),%rbx 0.00 : 5b2659: 00 0.00 : 5b265a: 48 03 5e 30 add 0x30(%rsi),%rbx : if (prm->execPlan != NULL) 0.00 : 5b265e: 48 8b 3b mov (%rbx),%rdi /home/Computational/mark/src/postgres-andres/src/backend/executor/execQual.c:1083 50.00 : 5b2661: 48 85 ff test %rdi,%rdi 0.00 : 5b2664: 74 05 je 5b266b : { : /* Parameter not evaluated yet, so go do it */ : ExecSetParamPlan(prm->execPlan, econtext); 0.00 : 5b2666: e8 f5 5a 01 00 callq 5c8160 : /* ExecSetParamPlan should have processed this param... */ : Assert(prm->execPlan == NULL); : } : *isNull = prm->isnull; 0.00 : 5b266b: 0f b6 43 10 movzbl 0x10(%rbx),%eax 0.00 : 5b266f: 41 88 04 24 mov %al,(%r12) 0.00 : 5b2673: 48 8b 43 08 mov 0x8(%rbx),%rax : return prm->value; : } 0.00 : 5b2677: 5b pop %rbx 0.00 : 5b2678: 41 5c pop %r12 0.00 : 5b267a: c9 leaveq Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 50.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/execUtils.c:1480 50.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/execUtils.c:1480 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000005b4a00 : : * If isCommit is false, just clean the callback list but don't call 'em. : * (See comment for FreeExprContext.) : */ : static void : ShutdownExprContext(ExprContext *econtext, bool isCommit) : { /home/Computational/mark/src/postgres-andres/src/backend/executor/execUtils.c:1480 50.00 : 5b4a00: 55 push %rbp 50.00 : 5b4a01: 48 89 e5 mov %rsp,%rbp 0.00 : 5b4a04: 41 56 push %r14 0.00 : 5b4a06: 41 55 push %r13 0.00 : 5b4a08: 41 89 f5 mov %esi,%r13d 0.00 : 5b4a0b: 41 54 push %r12 0.00 : 5b4a0d: 49 89 fc mov %rdi,%r12 0.00 : 5b4a10: 53 push %rbx : ExprContext_CB *ecxt_callback; : MemoryContext oldcontext; : : /* Fast path in normal case where there's nothing to do. */ : if (econtext->ecxt_callbacks == NULL) 0.00 : 5b4a11: 48 83 7f 78 00 cmpq $0x0,0x78(%rdi) 0.00 : 5b4a16: 74 57 je 5b4a6f : STATIC_IF_INLINE MemoryContext : MemoryContextSwitchTo(MemoryContext context) : { : MemoryContext old = CurrentMemoryContext; : : CurrentMemoryContext = context; 0.00 : 5b4a18: 48 8b 47 28 mov 0x28(%rdi),%rax : #endif /* !PG_USE_INLINE */ : #if defined(PG_USE_INLINE) || defined(MCXT_INCLUDE_DEFINITIONS) : STATIC_IF_INLINE MemoryContext : MemoryContextSwitchTo(MemoryContext context) : { : MemoryContext old = CurrentMemoryContext; 0.00 : 5b4a1c: 4c 8b 35 3d 5e 60 00 mov 0x605e3d(%rip),%r14 # bba860 : : CurrentMemoryContext = context; 0.00 : 5b4a23: 48 89 05 36 5e 60 00 mov %rax,0x605e36(%rip) # bba860 : oldcontext = MemoryContextSwitchTo(econtext->ecxt_per_tuple_memory); : : /* : * Call each callback function in reverse registration order. : */ : while ((ecxt_callback = econtext->ecxt_callbacks) != NULL) 0.00 : 5b4a2a: 48 8b 5f 78 mov 0x78(%rdi),%rbx 0.00 : 5b4a2e: 48 85 db test %rbx,%rbx 0.00 : 5b4a31: 75 17 jne 5b4a4a 0.00 : 5b4a33: eb 33 jmp 5b4a68 0.00 : 5b4a35: 0f 1f 00 nopl (%rax) : { : econtext->ecxt_callbacks = ecxt_callback->next; : if (isCommit) : (*ecxt_callback->function) (ecxt_callback->arg); : pfree(ecxt_callback); 0.00 : 5b4a38: 48 89 df mov %rbx,%rdi 0.00 : 5b4a3b: e8 40 41 1e 00 callq 798b80 : oldcontext = MemoryContextSwitchTo(econtext->ecxt_per_tuple_memory); : : /* : * Call each callback function in reverse registration order. : */ : while ((ecxt_callback = econtext->ecxt_callbacks) != NULL) 0.00 : 5b4a40: 49 8b 5c 24 78 mov 0x78(%r12),%rbx 0.00 : 5b4a45: 48 85 db test %rbx,%rbx 0.00 : 5b4a48: 74 1e je 5b4a68 : { : econtext->ecxt_callbacks = ecxt_callback->next; 0.00 : 5b4a4a: 48 8b 03 mov (%rbx),%rax : if (isCommit) 0.00 : 5b4a4d: 45 84 ed test %r13b,%r13b : /* : * Call each callback function in reverse registration order. : */ : while ((ecxt_callback = econtext->ecxt_callbacks) != NULL) : { : econtext->ecxt_callbacks = ecxt_callback->next; 0.00 : 5b4a50: 49 89 44 24 78 mov %rax,0x78(%r12) : if (isCommit) 0.00 : 5b4a55: 74 e1 je 5b4a38 : (*ecxt_callback->function) (ecxt_callback->arg); 0.00 : 5b4a57: 48 8b 7b 10 mov 0x10(%rbx),%rdi 0.00 : 5b4a5b: ff 53 08 callq *0x8(%rbx) 0.00 : 5b4a5e: 66 90 xchg %ax,%ax 0.00 : 5b4a60: eb d6 jmp 5b4a38 0.00 : 5b4a62: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 5b4a68: 4c 89 35 f1 5d 60 00 mov %r14,0x605df1(%rip) # bba860 : pfree(ecxt_callback); : } : : MemoryContextSwitchTo(oldcontext); : } 0.00 : 5b4a6f: 5b pop %rbx 0.00 : 5b4a70: 41 5c pop %r12 0.00 : 5b4a72: 41 5d pop %r13 0.00 : 5b4a74: 41 5e pop %r14 0.00 : 5b4a76: c9 leaveq Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 50.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/instrument.c:70 50.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/instrument.c:77 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000005b7bd0 : : } : : /* Exit from a plan node */ : void : InstrStopNode(Instrumentation *instr, double nTuples) : { 0.00 : 5b7bd0: 55 push %rbp /home/Computational/mark/src/postgres-andres/src/backend/executor/instrument.c:70 50.00 : 5b7bd1: 48 89 e5 mov %rsp,%rbp 0.00 : 5b7bd4: 53 push %rbx 0.00 : 5b7bd5: 48 89 fb mov %rdi,%rbx 0.00 : 5b7bd8: 48 83 ec 18 sub $0x18,%rsp : : /* count the returned tuples */ : instr->tuplecount += nTuples; : : /* let's update the time only if the timer was requested */ : if (instr->need_timer) /home/Computational/mark/src/postgres-andres/src/backend/executor/instrument.c:77 50.00 : 5b7bdc: 80 3f 00 cmpb $0x0,(%rdi) : InstrStopNode(Instrumentation *instr, double nTuples) : { : instr_time endtime; : : /* count the returned tuples */ : instr->tuplecount += nTuples; 0.00 : 5b7bdf: f2 0f 58 47 30 addsd 0x30(%rdi),%xmm0 0.00 : 5b7be4: f2 0f 11 47 30 movsd %xmm0,0x30(%rdi) : : /* let's update the time only if the timer was requested */ : if (instr->need_timer) 0.00 : 5b7be9: 0f 84 90 00 00 00 je 5b7c7f : { : if (INSTR_TIME_IS_ZERO(instr->starttime)) 0.00 : 5b7bef: 48 83 7f 10 00 cmpq $0x0,0x10(%rdi) 0.00 : 5b7bf4: 75 0b jne 5b7c01 0.00 : 5b7bf6: 48 83 7f 08 00 cmpq $0x0,0x8(%rdi) 0.00 : 5b7bfb: 0f 84 d1 02 00 00 je 5b7ed2 : elog(ERROR, "InstrStopNode called without start"); : : INSTR_TIME_SET_CURRENT(endtime); 0.00 : 5b7c01: 48 8d 7d e0 lea -0x20(%rbp),%rdi 0.00 : 5b7c05: 31 f6 xor %esi,%esi 0.00 : 5b7c07: e8 b4 19 eb ff callq 4695c0 : INSTR_TIME_ACCUM_DIFF(instr->counter, endtime, instr->starttime); 0.00 : 5b7c0c: 48 8b 45 e0 mov -0x20(%rbp),%rax 0.00 : 5b7c10: 48 03 43 18 add 0x18(%rbx),%rax 0.00 : 5b7c14: 48 2b 43 08 sub 0x8(%rbx),%rax 0.00 : 5b7c18: 48 89 43 18 mov %rax,0x18(%rbx) 0.00 : 5b7c1c: 48 8b 45 e8 mov -0x18(%rbp),%rax 0.00 : 5b7c20: 48 03 43 20 add 0x20(%rbx),%rax 0.00 : 5b7c24: 48 2b 43 10 sub 0x10(%rbx),%rax 0.00 : 5b7c28: 48 85 c0 test %rax,%rax 0.00 : 5b7c2b: 48 89 43 20 mov %rax,0x20(%rbx) 0.00 : 5b7c2f: 79 36 jns 5b7c67 0.00 : 5b7c31: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 0.00 : 5b7c38: 48 05 40 42 0f 00 add $0xf4240,%rax 0.00 : 5b7c3e: 48 83 6b 18 01 subq $0x1,0x18(%rbx) 0.00 : 5b7c43: 48 85 c0 test %rax,%rax 0.00 : 5b7c46: 48 89 43 20 mov %rax,0x20(%rbx) 0.00 : 5b7c4a: 78 ec js 5b7c38 0.00 : 5b7c4c: 48 3d 3f 42 0f 00 cmp $0xf423f,%rax 0.00 : 5b7c52: 7e 1b jle 5b7c6f 0.00 : 5b7c54: 0f 1f 40 00 nopl 0x0(%rax) 0.00 : 5b7c58: 48 83 43 18 01 addq $0x1,0x18(%rbx) 0.00 : 5b7c5d: 48 2d 40 42 0f 00 sub $0xf4240,%rax 0.00 : 5b7c63: 48 89 43 20 mov %rax,0x20(%rbx) 0.00 : 5b7c67: 48 3d 3f 42 0f 00 cmp $0xf423f,%rax 0.00 : 5b7c6d: 7f e9 jg 5b7c58 : : INSTR_TIME_SET_ZERO(instr->starttime); 0.00 : 5b7c6f: 48 c7 43 08 00 00 00 movq $0x0,0x8(%rbx) 0.00 : 5b7c76: 00 0.00 : 5b7c77: 48 c7 43 10 00 00 00 movq $0x0,0x10(%rbx) 0.00 : 5b7c7e: 00 : } : : /* Add delta of buffer usage since entry to node's totals */ : if (instr->need_bufusage) 0.00 : 5b7c7f: 80 7b 01 00 cmpb $0x0,0x1(%rbx) 0.00 : 5b7c83: 75 33 jne 5b7cb8 : BufferUsageAccumDiff(&instr->bufusage, : &pgBufferUsage, &instr->bufusage_start); : : /* Is this the first tuple of this cycle? */ : if (!instr->running) 0.00 : 5b7c85: 80 7b 02 00 cmpb $0x0,0x2(%rbx) 0.00 : 5b7c89: 75 21 jne 5b7cac : { : instr->running = true; : instr->firsttuple = INSTR_TIME_GET_DOUBLE(instr->counter); 0.00 : 5b7c8b: f2 48 0f 2a 43 20 cvtsi2sdq 0x20(%rbx),%xmm0 0.00 : 5b7c91: f2 0f 5e 05 47 49 2c divsd 0x2c4947(%rip),%xmm0 # 87c5e0 <__func__.18742+0x1b> 0.00 : 5b7c98: 00 0.00 : 5b7c99: f2 48 0f 2a 4b 18 cvtsi2sdq 0x18(%rbx),%xmm1 : &pgBufferUsage, &instr->bufusage_start); : : /* Is this the first tuple of this cycle? */ : if (!instr->running) : { : instr->running = true; 0.00 : 5b7c9f: c6 43 02 01 movb $0x1,0x2(%rbx) : instr->firsttuple = INSTR_TIME_GET_DOUBLE(instr->counter); 0.00 : 5b7ca3: f2 0f 58 c8 addsd %xmm0,%xmm1 0.00 : 5b7ca7: f2 0f 11 4b 28 movsd %xmm1,0x28(%rbx) : } : } 0.00 : 5b7cac: 48 83 c4 18 add $0x18,%rsp 0.00 : 5b7cb0: 5b pop %rbx 0.00 : 5b7cb1: c9 leaveq 0.00 : 5b7cb2: c3 retq 0.00 : 5b7cb3: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : static void : BufferUsageAccumDiff(BufferUsage *dst, : const BufferUsage *add, : const BufferUsage *sub) : { : dst->shared_blks_hit += add->shared_blks_hit - sub->shared_blks_hit; 0.00 : 5b7cb8: 48 8b 05 a1 7a 60 00 mov 0x607aa1(%rip),%rax # bbf760 0.00 : 5b7cbf: 48 03 83 d8 00 00 00 add 0xd8(%rbx),%rax 0.00 : 5b7cc6: 48 2b 43 38 sub 0x38(%rbx),%rax 0.00 : 5b7cca: 48 89 83 d8 00 00 00 mov %rax,0xd8(%rbx) : dst->shared_blks_read += add->shared_blks_read - sub->shared_blks_read; 0.00 : 5b7cd1: 48 8b 05 90 7a 60 00 mov 0x607a90(%rip),%rax # bbf768 0.00 : 5b7cd8: 48 03 83 e0 00 00 00 add 0xe0(%rbx),%rax 0.00 : 5b7cdf: 48 2b 43 40 sub 0x40(%rbx),%rax 0.00 : 5b7ce3: 48 89 83 e0 00 00 00 mov %rax,0xe0(%rbx) : dst->shared_blks_dirtied += add->shared_blks_dirtied - sub->shared_blks_dirtied; 0.00 : 5b7cea: 48 8b 05 7f 7a 60 00 mov 0x607a7f(%rip),%rax # bbf770 0.00 : 5b7cf1: 48 03 83 e8 00 00 00 add 0xe8(%rbx),%rax 0.00 : 5b7cf8: 48 2b 43 48 sub 0x48(%rbx),%rax 0.00 : 5b7cfc: 48 89 83 e8 00 00 00 mov %rax,0xe8(%rbx) : dst->shared_blks_written += add->shared_blks_written - sub->shared_blks_written; 0.00 : 5b7d03: 48 8b 05 6e 7a 60 00 mov 0x607a6e(%rip),%rax # bbf778 0.00 : 5b7d0a: 48 03 83 f0 00 00 00 add 0xf0(%rbx),%rax 0.00 : 5b7d11: 48 2b 43 50 sub 0x50(%rbx),%rax 0.00 : 5b7d15: 48 89 83 f0 00 00 00 mov %rax,0xf0(%rbx) : dst->local_blks_hit += add->local_blks_hit - sub->local_blks_hit; 0.00 : 5b7d1c: 48 8b 05 5d 7a 60 00 mov 0x607a5d(%rip),%rax # bbf780 0.00 : 5b7d23: 48 03 83 f8 00 00 00 add 0xf8(%rbx),%rax 0.00 : 5b7d2a: 48 2b 43 58 sub 0x58(%rbx),%rax 0.00 : 5b7d2e: 48 89 83 f8 00 00 00 mov %rax,0xf8(%rbx) : dst->local_blks_read += add->local_blks_read - sub->local_blks_read; 0.00 : 5b7d35: 48 8b 05 4c 7a 60 00 mov 0x607a4c(%rip),%rax # bbf788 0.00 : 5b7d3c: 48 03 83 00 01 00 00 add 0x100(%rbx),%rax 0.00 : 5b7d43: 48 2b 43 60 sub 0x60(%rbx),%rax 0.00 : 5b7d47: 48 89 83 00 01 00 00 mov %rax,0x100(%rbx) : dst->local_blks_dirtied += add->local_blks_dirtied - sub->local_blks_dirtied; 0.00 : 5b7d4e: 48 8b 05 3b 7a 60 00 mov 0x607a3b(%rip),%rax # bbf790 0.00 : 5b7d55: 48 03 83 08 01 00 00 add 0x108(%rbx),%rax 0.00 : 5b7d5c: 48 2b 43 68 sub 0x68(%rbx),%rax 0.00 : 5b7d60: 48 89 83 08 01 00 00 mov %rax,0x108(%rbx) : dst->local_blks_written += add->local_blks_written - sub->local_blks_written; 0.00 : 5b7d67: 48 8b 05 2a 7a 60 00 mov 0x607a2a(%rip),%rax # bbf798 0.00 : 5b7d6e: 48 03 83 10 01 00 00 add 0x110(%rbx),%rax 0.00 : 5b7d75: 48 2b 43 70 sub 0x70(%rbx),%rax 0.00 : 5b7d79: 48 89 83 10 01 00 00 mov %rax,0x110(%rbx) : dst->temp_blks_read += add->temp_blks_read - sub->temp_blks_read; 0.00 : 5b7d80: 48 8b 05 19 7a 60 00 mov 0x607a19(%rip),%rax # bbf7a0 0.00 : 5b7d87: 48 03 83 18 01 00 00 add 0x118(%rbx),%rax 0.00 : 5b7d8e: 48 2b 43 78 sub 0x78(%rbx),%rax 0.00 : 5b7d92: 48 89 83 18 01 00 00 mov %rax,0x118(%rbx) : dst->temp_blks_written += add->temp_blks_written - sub->temp_blks_written; 0.00 : 5b7d99: 48 8b 05 08 7a 60 00 mov 0x607a08(%rip),%rax # bbf7a8 0.00 : 5b7da0: 48 03 83 20 01 00 00 add 0x120(%rbx),%rax 0.00 : 5b7da7: 48 2b 83 80 00 00 00 sub 0x80(%rbx),%rax 0.00 : 5b7dae: 48 89 83 20 01 00 00 mov %rax,0x120(%rbx) : INSTR_TIME_ACCUM_DIFF(dst->blk_read_time, 0.00 : 5b7db5: 48 8b 05 f4 79 60 00 mov 0x6079f4(%rip),%rax # bbf7b0 0.00 : 5b7dbc: 48 03 83 28 01 00 00 add 0x128(%rbx),%rax 0.00 : 5b7dc3: 48 2b 83 88 00 00 00 sub 0x88(%rbx),%rax 0.00 : 5b7dca: 48 89 83 28 01 00 00 mov %rax,0x128(%rbx) 0.00 : 5b7dd1: 48 8b 05 e0 79 60 00 mov 0x6079e0(%rip),%rax # bbf7b8 0.00 : 5b7dd8: 48 03 83 30 01 00 00 add 0x130(%rbx),%rax 0.00 : 5b7ddf: 48 2b 83 90 00 00 00 sub 0x90(%rbx),%rax 0.00 : 5b7de6: 48 85 c0 test %rax,%rax 0.00 : 5b7de9: 48 89 83 30 01 00 00 mov %rax,0x130(%rbx) 0.00 : 5b7df0: 79 43 jns 5b7e35 0.00 : 5b7df2: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 5b7df8: 48 05 40 42 0f 00 add $0xf4240,%rax 0.00 : 5b7dfe: 48 83 ab 28 01 00 00 subq $0x1,0x128(%rbx) 0.00 : 5b7e05: 01 0.00 : 5b7e06: 48 85 c0 test %rax,%rax 0.00 : 5b7e09: 48 89 83 30 01 00 00 mov %rax,0x130(%rbx) 0.00 : 5b7e10: 78 e6 js 5b7df8 0.00 : 5b7e12: 48 3d 3f 42 0f 00 cmp $0xf423f,%rax 0.00 : 5b7e18: 7e 23 jle 5b7e3d 0.00 : 5b7e1a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 5b7e20: 48 83 83 28 01 00 00 addq $0x1,0x128(%rbx) 0.00 : 5b7e27: 01 0.00 : 5b7e28: 48 2d 40 42 0f 00 sub $0xf4240,%rax 0.00 : 5b7e2e: 48 89 83 30 01 00 00 mov %rax,0x130(%rbx) 0.00 : 5b7e35: 48 3d 3f 42 0f 00 cmp $0xf423f,%rax 0.00 : 5b7e3b: 7f e3 jg 5b7e20 : add->blk_read_time, sub->blk_read_time); : INSTR_TIME_ACCUM_DIFF(dst->blk_write_time, 0.00 : 5b7e3d: 48 8b 05 7c 79 60 00 mov 0x60797c(%rip),%rax # bbf7c0 0.00 : 5b7e44: 48 03 83 38 01 00 00 add 0x138(%rbx),%rax 0.00 : 5b7e4b: 48 2b 83 98 00 00 00 sub 0x98(%rbx),%rax 0.00 : 5b7e52: 48 89 83 38 01 00 00 mov %rax,0x138(%rbx) 0.00 : 5b7e59: 48 8b 05 68 79 60 00 mov 0x607968(%rip),%rax # bbf7c8 0.00 : 5b7e60: 48 03 83 40 01 00 00 add 0x140(%rbx),%rax 0.00 : 5b7e67: 48 2b 83 a0 00 00 00 sub 0xa0(%rbx),%rax 0.00 : 5b7e6e: 48 85 c0 test %rax,%rax 0.00 : 5b7e71: 48 89 83 40 01 00 00 mov %rax,0x140(%rbx) 0.00 : 5b7e78: 79 4b jns 5b7ec5 0.00 : 5b7e7a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 5b7e80: 48 05 40 42 0f 00 add $0xf4240,%rax 0.00 : 5b7e86: 48 83 ab 38 01 00 00 subq $0x1,0x138(%rbx) 0.00 : 5b7e8d: 01 0.00 : 5b7e8e: 48 85 c0 test %rax,%rax 0.00 : 5b7e91: 48 89 83 40 01 00 00 mov %rax,0x140(%rbx) 0.00 : 5b7e98: 78 e6 js 5b7e80 0.00 : 5b7e9a: 48 3d 3f 42 0f 00 cmp $0xf423f,%rax 0.00 : 5b7ea0: 0f 8e df fd ff ff jle 5b7c85 0.00 : 5b7ea6: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 0.00 : 5b7ead: 00 00 00 0.00 : 5b7eb0: 48 83 83 38 01 00 00 addq $0x1,0x138(%rbx) 0.00 : 5b7eb7: 01 0.00 : 5b7eb8: 48 2d 40 42 0f 00 sub $0xf4240,%rax 0.00 : 5b7ebe: 48 89 83 40 01 00 00 mov %rax,0x140(%rbx) 0.00 : 5b7ec5: 48 3d 3f 42 0f 00 cmp $0xf423f,%rax 0.00 : 5b7ecb: 7f e3 jg 5b7eb0 0.00 : 5b7ecd: e9 b3 fd ff ff jmpq 5b7c85 : : /* let's update the time only if the timer was requested */ : if (instr->need_timer) : { : if (INSTR_TIME_IS_ZERO(instr->starttime)) : elog(ERROR, "InstrStopNode called without start"); 0.00 : 5b7ed2: ba 8a b6 88 00 mov $0x88b68a,%edx 0.00 : 5b7ed7: be 50 00 00 00 mov $0x50,%esi 0.00 : 5b7edc: bf fa b5 88 00 mov $0x88b5fa,%edi 0.00 : 5b7ee1: e8 3a 35 1c 00 callq 77b420 0.00 : 5b7ee6: be 30 b6 88 00 mov $0x88b630,%esi 0.00 : 5b7eeb: bf 14 00 00 00 mov $0x14,%edi 0.00 : 5b7ef0: 31 c0 xor %eax,%eax 0.00 : 5b7ef2: e8 39 33 1c 00 callq 77b230 0.00 : 5b7ef7: e8 d4 15 eb ff callq 4694d0 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 100.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeNestloop.c:154 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000005c4240 : : * are prepared to return the first tuple. : * ---------------------------------------------------------------- : */ : TupleTableSlot * : ExecNestLoop(NestLoopState *node) : { 0.00 : 5c4240: 55 push %rbp 0.00 : 5c4241: 48 89 e5 mov %rsp,%rbp 0.00 : 5c4244: 41 57 push %r15 0.00 : 5c4246: 41 56 push %r14 0.00 : 5c4248: 49 89 fe mov %rdi,%r14 0.00 : 5c424b: 41 55 push %r13 0.00 : 5c424d: 41 54 push %r12 0.00 : 5c424f: 53 push %rbx 0.00 : 5c4250: 48 83 ec 48 sub $0x48,%rsp : /* : * get information from the node : */ : ENL1_printf("getting info from node"); : : nl = (NestLoop *) node->js.ps.plan; 0.00 : 5c4254: 48 8b 47 08 mov 0x8(%rdi),%rax 0.00 : 5c4258: 48 89 45 98 mov %rax,-0x68(%rbp) : joinqual = node->js.joinqual; 0.00 : 5c425c: 48 8b 97 80 00 00 00 mov 0x80(%rdi),%rdx 0.00 : 5c4263: 48 89 55 b8 mov %rdx,-0x48(%rbp) : otherqual = node->js.ps.qual; 0.00 : 5c4267: 48 8b 47 28 mov 0x28(%rdi),%rax 0.00 : 5c426b: 48 89 45 c0 mov %rax,-0x40(%rbp) : outerPlan = outerPlanState(node); 0.00 : 5c426f: 48 8b 57 30 mov 0x30(%rdi),%rdx 0.00 : 5c4273: 48 89 55 a8 mov %rdx,-0x58(%rbp) : innerPlan = innerPlanState(node); 0.00 : 5c4277: 48 8b 47 38 mov 0x38(%rdi),%rax 0.00 : 5c427b: 48 89 45 a0 mov %rax,-0x60(%rbp) : /* : * Check to see if we're still projecting out tuples from a previous join : * tuple (because there is a function-returning-set in the projection : * expressions). If so, try to project another one. : */ : if (node->js.ps.ps_TupFromTlist) 0.00 : 5c427f: 80 7f 70 00 cmpb $0x0,0x70(%rdi) : nl = (NestLoop *) node->js.ps.plan; : joinqual = node->js.joinqual; : otherqual = node->js.ps.qual; : outerPlan = outerPlanState(node); : innerPlan = innerPlanState(node); : econtext = node->js.ps.ps_ExprContext; 0.00 : 5c4283: 4c 8b 7f 60 mov 0x60(%rdi),%r15 : /* : * Check to see if we're still projecting out tuples from a previous join : * tuple (because there is a function-returning-set in the projection : * expressions). If so, try to project another one. : */ : if (node->js.ps.ps_TupFromTlist) 0.00 : 5c4287: 74 1f je 5c42a8 : { : TupleTableSlot *result; : ExprDoneCond isDone; : : result = ExecProject(node->js.ps.ps_ProjInfo, &isDone); 0.00 : 5c4289: 48 8b 7f 68 mov 0x68(%rdi),%rdi 0.00 : 5c428d: 48 8d 75 d4 lea -0x2c(%rbp),%rsi 0.00 : 5c4291: e8 6a 8d fe ff callq 5ad000 : if (isDone == ExprMultipleResult) 0.00 : 5c4296: 83 7d d4 01 cmpl $0x1,-0x2c(%rbp) 0.00 : 5c429a: 0f 84 71 01 00 00 je 5c4411 : return result; : /* Done with that source tuple... */ : node->js.ps.ps_TupFromTlist = false; 0.00 : 5c42a0: 41 c6 46 70 00 movb $0x0,0x70(%r14) 0.00 : 5c42a5: 0f 1f 00 nopl (%rax) : /* : * Reset per-tuple memory context to free any expression evaluation : * storage allocated in the previous tuple cycle. Note this can't happen : * until we're done projecting out tuples from a join tuple. : */ : ResetExprContext(econtext); 0.00 : 5c42a8: 49 8b 7f 28 mov 0x28(%r15),%rdi 0.00 : 5c42ac: e8 ff 46 1d 00 callq 7989b0 : { : /* : * If we don't have an outer tuple, get the next one and reset the : * inner scan. : */ : if (node->nl_NeedNewOuter) 0.00 : 5c42b1: 41 80 be 88 00 00 00 cmpb $0x0,0x88(%r14) 0.00 : 5c42b8: 00 0.00 : 5c42b9: 0f 85 a1 00 00 00 jne 5c4360 : /* : * we have an outerTuple, try to get the next inner tuple. : */ : ENL1_printf("getting new inner tuple"); : : innerTupleSlot = ExecProcNode(innerPlan); 0.00 : 5c42bf: 48 8b 7d a0 mov -0x60(%rbp),%rdi 0.00 : 5c42c3: e8 d8 81 fe ff callq 5ac4a0 : econtext->ecxt_innertuple = innerTupleSlot; : : if (TupIsNull(innerTupleSlot)) 0.00 : 5c42c8: 48 85 c0 test %rax,%rax : * we have an outerTuple, try to get the next inner tuple. : */ : ENL1_printf("getting new inner tuple"); : : innerTupleSlot = ExecProcNode(innerPlan); : econtext->ecxt_innertuple = innerTupleSlot; 0.00 : 5c42cb: 49 89 47 10 mov %rax,0x10(%r15) : : if (TupIsNull(innerTupleSlot)) 0.00 : 5c42cf: 74 0a je 5c42db 0.00 : 5c42d1: 80 78 04 00 cmpb $0x0,0x4(%rax) 0.00 : 5c42d5: 0f 84 45 01 00 00 je 5c4420 : { : ENL1_printf("no inner tuple, need new outer tuple"); : : node->nl_NeedNewOuter = true; : : if (!node->nl_MatchedOuter && 0.00 : 5c42db: 41 80 be 89 00 00 00 cmpb $0x0,0x89(%r14) 0.00 : 5c42e2: 00 : : if (TupIsNull(innerTupleSlot)) : { : ENL1_printf("no inner tuple, need new outer tuple"); : : node->nl_NeedNewOuter = true; 0.00 : 5c42e3: 41 c6 86 88 00 00 00 movb $0x1,0x88(%r14) 0.00 : 5c42ea: 01 : : if (!node->nl_MatchedOuter && 0.00 : 5c42eb: 75 c4 jne 5c42b1 0.00 : 5c42ed: 41 8b 46 78 mov 0x78(%r14),%eax 0.00 : 5c42f1: 83 f8 01 cmp $0x1,%eax 0.00 : 5c42f4: 74 05 je 5c42fb 0.00 : 5c42f6: 83 f8 05 cmp $0x5,%eax 0.00 : 5c42f9: 75 b6 jne 5c42b1 : * We are doing an outer join and there were no join matches : * for this outer tuple. Generate a fake join tuple with : * nulls for the inner tuple, and return it if it passes the : * non-join quals. : */ : econtext->ecxt_innertuple = node->nl_NullInnerTupleSlot; 0.00 : 5c42fb: 49 8b 86 90 00 00 00 mov 0x90(%r14),%rax 0.00 : 5c4302: 49 89 47 10 mov %rax,0x10(%r15) : : ENL1_printf("testing qualification for outer-join tuple"); : : if (otherqual == NIL || ExecQual(otherqual, econtext, false)) 0.00 : 5c4306: 48 83 7d c0 00 cmpq $0x0,-0x40(%rbp) 0.00 : 5c430b: 0f 84 bf 01 00 00 je 5c44d0 0.00 : 5c4311: 48 8b 7d c0 mov -0x40(%rbp),%rdi 0.00 : 5c4315: 31 d2 xor %edx,%edx 0.00 : 5c4317: 4c 89 fe mov %r15,%rsi 0.00 : 5c431a: e8 f1 8b fe ff callq 5acf10 0.00 : 5c431f: 84 c0 test %al,%al 0.00 : 5c4321: 0f 85 a9 01 00 00 jne 5c44d0 : (isDone == ExprMultipleResult); : return result; : } : } : else : InstrCountFiltered2(node, 1); 0.00 : 5c4327: 49 8b 46 18 mov 0x18(%r14),%rax 0.00 : 5c432b: 48 85 c0 test %rax,%rax 0.00 : 5c432e: 74 81 je 5c42b1 0.00 : 5c4330: f2 0f 10 05 20 ae 1e movsd 0x1eae20(%rip),%xmm0 # 7af158 <__func__.15777+0x10> 0.00 : 5c4337: 00 0.00 : 5c4338: f2 0f 58 80 d0 00 00 addsd 0xd0(%rax),%xmm0 0.00 : 5c433f: 00 0.00 : 5c4340: f2 0f 11 80 d0 00 00 movsd %xmm0,0xd0(%rax) 0.00 : 5c4347: 00 : { : /* : * If we don't have an outer tuple, get the next one and reset the : * inner scan. : */ : if (node->nl_NeedNewOuter) 0.00 : 5c4348: 41 80 be 88 00 00 00 cmpb $0x0,0x88(%r14) 0.00 : 5c434f: 00 0.00 : 5c4350: 0f 84 69 ff ff ff je 5c42bf 0.00 : 5c4356: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 0.00 : 5c435d: 00 00 00 : { : ENL1_printf("getting new outer tuple"); : outerTupleSlot = ExecProcNode(outerPlan); 0.00 : 5c4360: 48 8b 7d a8 mov -0x58(%rbp),%rdi 0.00 : 5c4364: e8 37 81 fe ff callq 5ac4a0 : : /* : * if there are no more outer tuples, then the join is complete.. : */ : if (TupIsNull(outerTupleSlot)) 0.00 : 5c4369: 48 85 c0 test %rax,%rax : * inner scan. : */ : if (node->nl_NeedNewOuter) : { : ENL1_printf("getting new outer tuple"); : outerTupleSlot = ExecProcNode(outerPlan); 0.00 : 5c436c: 48 89 45 b0 mov %rax,-0x50(%rbp) : : /* : * if there are no more outer tuples, then the join is complete.. : */ : if (TupIsNull(outerTupleSlot)) 0.00 : 5c4370: 0f 84 99 00 00 00 je 5c440f 0.00 : 5c4376: 80 78 04 00 cmpb $0x0,0x4(%rax) 0.00 : 5c437a: 0f 85 8f 00 00 00 jne 5c440f : ENL1_printf("no outer tuple, ending join"); : return NULL; : } : : ENL1_printf("saving new outer tuple information"); : econtext->ecxt_outertuple = outerTupleSlot; 0.00 : 5c4380: 49 89 47 18 mov %rax,0x18(%r15) : node->nl_NeedNewOuter = false; 0.00 : 5c4384: 41 c6 86 88 00 00 00 movb $0x0,0x88(%r14) 0.00 : 5c438b: 00 : node->nl_MatchedOuter = false; 0.00 : 5c438c: 41 c6 86 89 00 00 00 movb $0x0,0x89(%r14) 0.00 : 5c4393: 00 : : /* : * fetch the values of any outer Vars that must be passed to the : * inner scan, and store them in the appropriate PARAM_EXEC slots. : */ : foreach(lc, nl->nestParams) 0.00 : 5c4394: 48 8b 55 98 mov -0x68(%rbp),%rdx 0.00 : 5c4398: 48 8b 42 70 mov 0x70(%rdx),%rax : #endif /* PG_USE_INLINE */ : #if defined(PG_USE_INLINE) || defined(PG_LIST_INCLUDE_DEFINITIONS) : STATIC_IF_INLINE ListCell * : list_head(const List *l) : { : return l ? l->head : NULL; 0.00 : 5c439c: 48 85 c0 test %rax,%rax 0.00 : 5c439f: 74 60 je 5c4401 0.00 : 5c43a1: 4c 8b 68 08 mov 0x8(%rax),%r13 0.00 : 5c43a5: 4d 85 ed test %r13,%r13 0.00 : 5c43a8: 74 57 je 5c4401 0.00 : 5c43aa: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : { : NestLoopParam *nlp = (NestLoopParam *) lfirst(lc); 0.00 : 5c43b0: 49 8b 45 00 mov 0x0(%r13),%rax : prm = &(econtext->ecxt_param_exec_vals[paramno]); : /* Param value should be an OUTER_VAR var */ : Assert(IsA(nlp->paramval, Var)); : Assert(nlp->paramval->varno == OUTER_VAR); : Assert(nlp->paramval->varattno > 0); : prm->value = slot_getattr(outerTupleSlot, 0.00 : 5c43b4: 48 8b 7d b0 mov -0x50(%rbp),%rdi : * inner scan, and store them in the appropriate PARAM_EXEC slots. : */ : foreach(lc, nl->nestParams) : { : NestLoopParam *nlp = (NestLoopParam *) lfirst(lc); : int paramno = nlp->paramno; 0.00 : 5c43b8: 44 8b 60 04 mov 0x4(%rax),%r12d : prm = &(econtext->ecxt_param_exec_vals[paramno]); : /* Param value should be an OUTER_VAR var */ : Assert(IsA(nlp->paramval, Var)); : Assert(nlp->paramval->varno == OUTER_VAR); : Assert(nlp->paramval->varattno > 0); : prm->value = slot_getattr(outerTupleSlot, /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeNestloop.c:154 100.00 : 5c43bc: 48 8b 40 08 mov 0x8(%rax),%rax : { : NestLoopParam *nlp = (NestLoopParam *) lfirst(lc); : int paramno = nlp->paramno; : ParamExecData *prm; : : prm = &(econtext->ecxt_param_exec_vals[paramno]); 0.00 : 5c43c0: 49 63 dc movslq %r12d,%rbx : /* Param value should be an OUTER_VAR var */ : Assert(IsA(nlp->paramval, Var)); : Assert(nlp->paramval->varno == OUTER_VAR); : Assert(nlp->paramval->varattno > 0); : prm->value = slot_getattr(outerTupleSlot, 0.00 : 5c43c3: 0f bf 70 08 movswl 0x8(%rax),%esi : { : NestLoopParam *nlp = (NestLoopParam *) lfirst(lc); : int paramno = nlp->paramno; : ParamExecData *prm; : : prm = &(econtext->ecxt_param_exec_vals[paramno]); 0.00 : 5c43c7: 48 8d 1c 5b lea (%rbx,%rbx,2),%rbx 0.00 : 5c43cb: 48 c1 e3 03 shl $0x3,%rbx 0.00 : 5c43cf: 49 03 5f 30 add 0x30(%r15),%rbx : /* Param value should be an OUTER_VAR var */ : Assert(IsA(nlp->paramval, Var)); : Assert(nlp->paramval->varno == OUTER_VAR); : Assert(nlp->paramval->varattno > 0); : prm->value = slot_getattr(outerTupleSlot, 0.00 : 5c43d3: 48 8d 53 10 lea 0x10(%rbx),%rdx 0.00 : 5c43d7: e8 24 b0 ea ff callq 46f400 0.00 : 5c43dc: 48 89 43 08 mov %rax,0x8(%rbx) : nlp->paramval->varattno, : &(prm->isnull)); : /* Flag parameter value as changed */ : innerPlan->chgParam = bms_add_member(innerPlan->chgParam, 0.00 : 5c43e0: 48 8b 45 a0 mov -0x60(%rbp),%rax 0.00 : 5c43e4: 44 89 e6 mov %r12d,%esi 0.00 : 5c43e7: 48 8b 78 50 mov 0x50(%rax),%rdi 0.00 : 5c43eb: e8 10 ec 01 00 callq 5e3000 0.00 : 5c43f0: 48 8b 55 a0 mov -0x60(%rbp),%rdx 0.00 : 5c43f4: 48 89 42 50 mov %rax,0x50(%rdx) : : /* : * fetch the values of any outer Vars that must be passed to the : * inner scan, and store them in the appropriate PARAM_EXEC slots. : */ : foreach(lc, nl->nestParams) 0.00 : 5c43f8: 4d 8b 6d 08 mov 0x8(%r13),%r13 0.00 : 5c43fc: 4d 85 ed test %r13,%r13 0.00 : 5c43ff: 75 af jne 5c43b0 : : /* : * now rescan the inner plan : */ : ENL1_printf("rescanning inner plan"); : ExecReScan(innerPlan); 0.00 : 5c4401: 48 8b 7d a0 mov -0x60(%rbp),%rdi 0.00 : 5c4405: e8 96 40 fe ff callq 5a84a0 0.00 : 5c440a: e9 b0 fe ff ff jmpq 5c42bf : InstrCountFiltered1(node, 1); : : /* : * Tuple fails qual, so free per-tuple memory and try again. : */ : ResetExprContext(econtext); 0.00 : 5c440f: 31 c0 xor %eax,%eax : : ENL1_printf("qualification failed, looping"); : } : } 0.00 : 5c4411: 48 83 c4 48 add $0x48,%rsp 0.00 : 5c4415: 5b pop %rbx 0.00 : 5c4416: 41 5c pop %r12 0.00 : 5c4418: 41 5d pop %r13 0.00 : 5c441a: 41 5e pop %r14 0.00 : 5c441c: 41 5f pop %r15 0.00 : 5c441e: c9 leaveq 0.00 : 5c441f: c3 retq : * Only the joinquals determine MatchedOuter status, but all quals : * must pass to actually return the tuple. : */ : ENL1_printf("testing qualification"); : : if (ExecQual(joinqual, econtext, false)) 0.00 : 5c4420: 48 8b 7d b8 mov -0x48(%rbp),%rdi 0.00 : 5c4424: 31 d2 xor %edx,%edx 0.00 : 5c4426: 4c 89 fe mov %r15,%rsi 0.00 : 5c4429: e8 e2 8a fe ff callq 5acf10 0.00 : 5c442e: 84 c0 test %al,%al 0.00 : 5c4430: 74 6e je 5c44a0 : { : node->nl_MatchedOuter = true; : : /* In an antijoin, we never return a matched tuple */ : if (node->js.jointype == JOIN_ANTI) 0.00 : 5c4432: 41 8b 46 78 mov 0x78(%r14),%eax : */ : ENL1_printf("testing qualification"); : : if (ExecQual(joinqual, econtext, false)) : { : node->nl_MatchedOuter = true; 0.00 : 5c4436: 41 c6 86 89 00 00 00 movb $0x1,0x89(%r14) 0.00 : 5c443d: 01 : : /* In an antijoin, we never return a matched tuple */ : if (node->js.jointype == JOIN_ANTI) 0.00 : 5c443e: 83 f8 05 cmp $0x5,%eax 0.00 : 5c4441: 0f 84 e1 00 00 00 je 5c4528 : : /* : * In a semijoin, we'll consider returning the first match, but : * after that we're done with this outer tuple. : */ : if (node->js.jointype == JOIN_SEMI) 0.00 : 5c4447: 83 f8 04 cmp $0x4,%eax 0.00 : 5c444a: 0f 84 e8 00 00 00 je 5c4538 : node->nl_NeedNewOuter = true; : : if (otherqual == NIL || ExecQual(otherqual, econtext, false)) 0.00 : 5c4450: 48 83 7d c0 00 cmpq $0x0,-0x40(%rbp) 0.00 : 5c4455: 0f 84 a5 00 00 00 je 5c4500 0.00 : 5c445b: 48 8b 7d c0 mov -0x40(%rbp),%rdi 0.00 : 5c445f: 31 d2 xor %edx,%edx 0.00 : 5c4461: 4c 89 fe mov %r15,%rsi 0.00 : 5c4464: e8 a7 8a fe ff callq 5acf10 0.00 : 5c4469: 84 c0 test %al,%al 0.00 : 5c446b: 0f 85 8f 00 00 00 jne 5c4500 : (isDone == ExprMultipleResult); : return result; : } : } : else : InstrCountFiltered2(node, 1); 0.00 : 5c4471: 49 8b 46 18 mov 0x18(%r14),%rax 0.00 : 5c4475: 48 85 c0 test %rax,%rax 0.00 : 5c4478: 0f 84 2a fe ff ff je 5c42a8 0.00 : 5c447e: f2 0f 10 05 d2 ac 1e movsd 0x1eacd2(%rip),%xmm0 # 7af158 <__func__.15777+0x10> 0.00 : 5c4485: 00 0.00 : 5c4486: f2 0f 58 80 d0 00 00 addsd 0xd0(%rax),%xmm0 0.00 : 5c448d: 00 0.00 : 5c448e: f2 0f 11 80 d0 00 00 movsd %xmm0,0xd0(%rax) 0.00 : 5c4495: 00 0.00 : 5c4496: e9 0d fe ff ff jmpq 5c42a8 0.00 : 5c449b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : } : else : InstrCountFiltered1(node, 1); 0.00 : 5c44a0: 49 8b 46 18 mov 0x18(%r14),%rax 0.00 : 5c44a4: 48 85 c0 test %rax,%rax 0.00 : 5c44a7: 0f 84 fb fd ff ff je 5c42a8 0.00 : 5c44ad: f2 0f 10 05 a3 ac 1e movsd 0x1eaca3(%rip),%xmm0 # 7af158 <__func__.15777+0x10> 0.00 : 5c44b4: 00 0.00 : 5c44b5: f2 0f 58 80 c8 00 00 addsd 0xc8(%rax),%xmm0 0.00 : 5c44bc: 00 0.00 : 5c44bd: f2 0f 11 80 c8 00 00 movsd %xmm0,0xc8(%rax) 0.00 : 5c44c4: 00 0.00 : 5c44c5: e9 de fd ff ff jmpq 5c42a8 0.00 : 5c44ca: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : TupleTableSlot *result; : ExprDoneCond isDone; : : ENL1_printf("qualification succeeded, projecting tuple"); : : result = ExecProject(node->js.ps.ps_ProjInfo, &isDone); 0.00 : 5c44d0: 49 8b 7e 68 mov 0x68(%r14),%rdi 0.00 : 5c44d4: 48 8d 75 d4 lea -0x2c(%rbp),%rsi 0.00 : 5c44d8: e8 23 8b fe ff callq 5ad000 : : if (isDone != ExprEndResult) 0.00 : 5c44dd: 8b 55 d4 mov -0x2c(%rbp),%edx 0.00 : 5c44e0: 83 fa 02 cmp $0x2,%edx 0.00 : 5c44e3: 0f 84 c8 fd ff ff je 5c42b1 : : result = ExecProject(node->js.ps.ps_ProjInfo, &isDone); : : if (isDone != ExprEndResult) : { : node->js.ps.ps_TupFromTlist = 0.00 : 5c44e9: 83 ea 01 sub $0x1,%edx 0.00 : 5c44ec: 41 0f 94 46 70 sete 0x70(%r14) : */ : ResetExprContext(econtext); : : ENL1_printf("qualification failed, looping"); : } : } 0.00 : 5c44f1: 48 83 c4 48 add $0x48,%rsp 0.00 : 5c44f5: 5b pop %rbx 0.00 : 5c44f6: 41 5c pop %r12 0.00 : 5c44f8: 41 5d pop %r13 0.00 : 5c44fa: 41 5e pop %r14 0.00 : 5c44fc: 41 5f pop %r15 0.00 : 5c44fe: c9 leaveq 0.00 : 5c44ff: c3 retq : TupleTableSlot *result; : ExprDoneCond isDone; : : ENL1_printf("qualification succeeded, projecting tuple"); : : result = ExecProject(node->js.ps.ps_ProjInfo, &isDone); 0.00 : 5c4500: 49 8b 7e 68 mov 0x68(%r14),%rdi 0.00 : 5c4504: 48 8d 75 d4 lea -0x2c(%rbp),%rsi 0.00 : 5c4508: e8 f3 8a fe ff callq 5ad000 : : if (isDone != ExprEndResult) 0.00 : 5c450d: 8b 55 d4 mov -0x2c(%rbp),%edx 0.00 : 5c4510: 83 fa 02 cmp $0x2,%edx 0.00 : 5c4513: 0f 84 8f fd ff ff je 5c42a8 : { : node->js.ps.ps_TupFromTlist = 0.00 : 5c4519: 83 ea 01 sub $0x1,%edx 0.00 : 5c451c: 41 0f 94 46 70 sete 0x70(%r14) 0.00 : 5c4521: eb ce jmp 5c44f1 0.00 : 5c4523: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : node->nl_MatchedOuter = true; : : /* In an antijoin, we never return a matched tuple */ : if (node->js.jointype == JOIN_ANTI) : { : node->nl_NeedNewOuter = true; 0.00 : 5c4528: 41 c6 86 88 00 00 00 movb $0x1,0x88(%r14) 0.00 : 5c452f: 01 : continue; /* return to top of loop */ 0.00 : 5c4530: e9 7c fd ff ff jmpq 5c42b1 0.00 : 5c4535: 0f 1f 00 nopl (%rax) : /* : * In a semijoin, we'll consider returning the first match, but : * after that we're done with this outer tuple. : */ : if (node->js.jointype == JOIN_SEMI) : node->nl_NeedNewOuter = true; 0.00 : 5c4538: 41 c6 86 88 00 00 00 movb $0x1,0x88(%r14) 0.00 : 5c453f: 01 0.00 : 5c4540: e9 0b ff ff ff jmpq 5c4450 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 100.00 /home/Computational/mark/src/postgres-andres/src/backend/nodes/bitmapset.c:179 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000005e2f70 : : /* : * bms_make_singleton - build a bitmapset containing a single member : */ : Bitmapset * : bms_make_singleton(int x) : { 0.00 : 5e2f70: 55 push %rbp /home/Computational/mark/src/postgres-andres/src/backend/nodes/bitmapset.c:179 100.00 : 5e2f71: 48 89 e5 mov %rsp,%rbp 0.00 : 5e2f74: 4c 89 6d f8 mov %r13,-0x8(%rbp) 0.00 : 5e2f78: 48 89 5d e8 mov %rbx,-0x18(%rbp) 0.00 : 5e2f7c: 41 89 fd mov %edi,%r13d 0.00 : 5e2f7f: 4c 89 65 f0 mov %r12,-0x10(%rbp) 0.00 : 5e2f83: 48 83 ec 20 sub $0x20,%rsp : Bitmapset *result; : int wordnum, : bitnum; : : if (x < 0) 0.00 : 5e2f87: 85 ff test %edi,%edi 0.00 : 5e2f89: 78 3f js 5e2fca : elog(ERROR, "negative bitmapset member not allowed"); : wordnum = WORDNUM(x); 0.00 : 5e2f8b: 89 fb mov %edi,%ebx : bitnum = BITNUM(x); : result = (Bitmapset *) palloc0(BITMAPSET_SIZE(wordnum + 1)); : result->nwords = wordnum + 1; : result->words[wordnum] = ((bitmapword) 1 << bitnum); 0.00 : 5e2f8d: 41 83 e5 1f and $0x1f,%r13d : int wordnum, : bitnum; : : if (x < 0) : elog(ERROR, "negative bitmapset member not allowed"); : wordnum = WORDNUM(x); 0.00 : 5e2f91: c1 fb 05 sar $0x5,%ebx : bitnum = BITNUM(x); : result = (Bitmapset *) palloc0(BITMAPSET_SIZE(wordnum + 1)); 0.00 : 5e2f94: 44 8d 63 01 lea 0x1(%rbx),%r12d : result->nwords = wordnum + 1; : result->words[wordnum] = ((bitmapword) 1 << bitnum); 0.00 : 5e2f98: 48 63 db movslq %ebx,%rbx : : if (x < 0) : elog(ERROR, "negative bitmapset member not allowed"); : wordnum = WORDNUM(x); : bitnum = BITNUM(x); : result = (Bitmapset *) palloc0(BITMAPSET_SIZE(wordnum + 1)); 0.00 : 5e2f9b: 49 63 fc movslq %r12d,%rdi 0.00 : 5e2f9e: 48 8d 3c bd 04 00 00 lea 0x4(,%rdi,4),%rdi 0.00 : 5e2fa5: 00 0.00 : 5e2fa6: e8 c5 5f 1b 00 callq 798f70 : result->nwords = wordnum + 1; : result->words[wordnum] = ((bitmapword) 1 << bitnum); 0.00 : 5e2fab: 44 89 e9 mov %r13d,%ecx 0.00 : 5e2fae: ba 01 00 00 00 mov $0x1,%edx : if (x < 0) : elog(ERROR, "negative bitmapset member not allowed"); : wordnum = WORDNUM(x); : bitnum = BITNUM(x); : result = (Bitmapset *) palloc0(BITMAPSET_SIZE(wordnum + 1)); : result->nwords = wordnum + 1; 0.00 : 5e2fb3: 44 89 20 mov %r12d,(%rax) : result->words[wordnum] = ((bitmapword) 1 << bitnum); 0.00 : 5e2fb6: d3 e2 shl %cl,%edx 0.00 : 5e2fb8: 89 54 98 04 mov %edx,0x4(%rax,%rbx,4) : return result; : } 0.00 : 5e2fbc: 48 8b 5d e8 mov -0x18(%rbp),%rbx 0.00 : 5e2fc0: 4c 8b 65 f0 mov -0x10(%rbp),%r12 0.00 : 5e2fc4: 4c 8b 6d f8 mov -0x8(%rbp),%r13 0.00 : 5e2fc8: c9 leaveq 0.00 : 5e2fc9: c3 retq : Bitmapset *result; : int wordnum, : bitnum; : : if (x < 0) : elog(ERROR, "negative bitmapset member not allowed"); 0.00 : 5e2fca: ba b0 24 89 00 mov $0x8924b0,%edx 0.00 : 5e2fcf: be b9 00 00 00 mov $0xb9,%esi 0.00 : 5e2fd4: bf e2 21 89 00 mov $0x8921e2,%edi 0.00 : 5e2fd9: e8 42 84 19 00 callq 77b420 0.00 : 5e2fde: be 08 22 89 00 mov $0x892208,%esi 0.00 : 5e2fe3: bf 14 00 00 00 mov $0x14,%edi 0.00 : 5e2fe8: 31 c0 xor %eax,%eax 0.00 : 5e2fea: e8 41 82 19 00 callq 77b230 0.00 : 5e2fef: e8 dc 64 e8 ff callq 4694d0 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 50.00 /home/Computational/mark/src/postgres-andres/src/backend/postmaster/pgstat.c:5014 50.00 /home/Computational/mark/src/postgres-andres/src/backend/postmaster/pgstat.c:5015 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000643b20 : : * The argc/argv parameters are valid only in EXEC_BACKEND case. : * ---------- : */ : NON_EXEC_STATIC void : PgstatCollectorMain(int argc, char *argv[]) : { 0.00 : 643b20: 55 push %rbp 0.00 : 643b21: 48 89 e5 mov %rsp,%rbp 0.00 : 643b24: 41 57 push %r15 0.00 : 643b26: 41 56 push %r14 0.00 : 643b28: 41 55 push %r13 0.00 : 643b2a: 41 54 push %r12 0.00 : 643b2c: 53 push %rbx 0.00 : 643b2d: 48 81 ec 18 08 00 00 sub $0x818,%rsp : int len; : PgStat_Msg msg; : int wr; : : IsUnderPostmaster = true; /* we are a postmaster subprocess now */ 0.00 : 643b34: c6 05 82 65 57 00 01 movb $0x1,0x576582(%rip) # bba0bd : : MyProcPid = getpid(); /* reset MyProcPid */ 0.00 : 643b3b: e8 10 5c e2 ff callq 469750 : : MyStartTime = time(NULL); /* record Start Time for logging */ 0.00 : 643b40: 31 ff xor %edi,%edi : PgStat_Msg msg; : int wr; : : IsUnderPostmaster = true; /* we are a postmaster subprocess now */ : : MyProcPid = getpid(); /* reset MyProcPid */ 0.00 : 643b42: 89 05 9c c1 57 00 mov %eax,0x57c19c(%rip) # bbfce4 : : MyStartTime = time(NULL); /* record Start Time for logging */ 0.00 : 643b48: e8 53 66 e2 ff callq 46a1a0 0.00 : 643b4d: 48 89 05 b4 c9 57 00 mov %rax,0x57c9b4(%rip) # bc0508 : * can signal any child processes too. (pgstat probably never has any : * child processes, but for consistency we make all postmaster child : * processes do this.) : */ : #ifdef HAVE_SETSID : if (setsid() < 0) 0.00 : 643b54: e8 07 59 e2 ff callq 469460 0.00 : 643b59: 85 c0 test %eax,%eax 0.00 : 643b5b: 0f 88 56 0d 00 00 js 6448b7 : elog(FATAL, "setsid() failed: %m"); : #endif : : InitializeLatchSupport(); /* needed for latch waits */ 0.00 : 643b61: e8 fa 59 ff ff callq 639560 : : /* Initialize private latch for use by signal handlers */ : InitLatch(&pgStatLatch); 0.00 : 643b66: bf 58 bd b7 00 mov $0xb7bd58,%edi : */ : #ifdef WIN32 : pgwin32_noblock = 1; : #endif : : len = recv(pgStatSock, (char *) &msg, 0.00 : 643b6b: 4c 8d ad e0 fb ff ff lea -0x420(%rbp),%r13 : #endif : : InitializeLatchSupport(); /* needed for latch waits */ : : /* Initialize private latch for use by signal handlers */ : InitLatch(&pgStatLatch); 0.00 : 643b72: e8 79 54 ff ff callq 638ff0 : /* : * Ignore all signals usually bound to some action in the postmaster, : * except SIGHUP and SIGQUIT. Note we don't need a SIGUSR1 handler to : * support latch operations, because pgStatLatch is local not shared. : */ : pqsignal(SIGHUP, pgstat_sighup_handler); 0.00 : 643b77: be e0 49 64 00 mov $0x6449e0,%esi 0.00 : 643b7c: bf 01 00 00 00 mov $0x1,%edi 0.00 : 643b81: e8 7a 8f 16 00 callq 7acb00 : pqsignal(SIGINT, SIG_IGN); 0.00 : 643b86: be 01 00 00 00 mov $0x1,%esi 0.00 : 643b8b: bf 02 00 00 00 mov $0x2,%edi 0.00 : 643b90: e8 6b 8f 16 00 callq 7acb00 : pqsignal(SIGTERM, SIG_IGN); 0.00 : 643b95: be 01 00 00 00 mov $0x1,%esi 0.00 : 643b9a: bf 0f 00 00 00 mov $0xf,%edi 0.00 : 643b9f: e8 5c 8f 16 00 callq 7acb00 : pqsignal(SIGQUIT, pgstat_exit); 0.00 : 643ba4: be a0 49 64 00 mov $0x6449a0,%esi 0.00 : 643ba9: bf 03 00 00 00 mov $0x3,%edi 0.00 : 643bae: e8 4d 8f 16 00 callq 7acb00 : pqsignal(SIGALRM, SIG_IGN); 0.00 : 643bb3: be 01 00 00 00 mov $0x1,%esi 0.00 : 643bb8: bf 0e 00 00 00 mov $0xe,%edi 0.00 : 643bbd: e8 3e 8f 16 00 callq 7acb00 : pqsignal(SIGPIPE, SIG_IGN); 0.00 : 643bc2: be 01 00 00 00 mov $0x1,%esi 0.00 : 643bc7: bf 0d 00 00 00 mov $0xd,%edi 0.00 : 643bcc: e8 2f 8f 16 00 callq 7acb00 : pqsignal(SIGUSR1, SIG_IGN); 0.00 : 643bd1: be 01 00 00 00 mov $0x1,%esi 0.00 : 643bd6: bf 0a 00 00 00 mov $0xa,%edi 0.00 : 643bdb: e8 20 8f 16 00 callq 7acb00 : pqsignal(SIGUSR2, SIG_IGN); 0.00 : 643be0: be 01 00 00 00 mov $0x1,%esi 0.00 : 643be5: bf 0c 00 00 00 mov $0xc,%edi 0.00 : 643bea: e8 11 8f 16 00 callq 7acb00 : pqsignal(SIGCHLD, SIG_DFL); 0.00 : 643bef: 31 f6 xor %esi,%esi 0.00 : 643bf1: bf 11 00 00 00 mov $0x11,%edi 0.00 : 643bf6: e8 05 8f 16 00 callq 7acb00 : pqsignal(SIGTTIN, SIG_DFL); 0.00 : 643bfb: 31 f6 xor %esi,%esi 0.00 : 643bfd: bf 15 00 00 00 mov $0x15,%edi 0.00 : 643c02: e8 f9 8e 16 00 callq 7acb00 : pqsignal(SIGTTOU, SIG_DFL); 0.00 : 643c07: 31 f6 xor %esi,%esi 0.00 : 643c09: bf 16 00 00 00 mov $0x16,%edi 0.00 : 643c0e: e8 ed 8e 16 00 callq 7acb00 : pqsignal(SIGCONT, SIG_DFL); 0.00 : 643c13: 31 f6 xor %esi,%esi 0.00 : 643c15: bf 12 00 00 00 mov $0x12,%edi 0.00 : 643c1a: e8 e1 8e 16 00 callq 7acb00 : pqsignal(SIGWINCH, SIG_DFL); 0.00 : 643c1f: 31 f6 xor %esi,%esi 0.00 : 643c21: bf 1c 00 00 00 mov $0x1c,%edi 0.00 : 643c26: e8 d5 8e 16 00 callq 7acb00 : PG_SETMASK(&UnBlockSig); 0.00 : 643c2b: 31 d2 xor %edx,%edx 0.00 : 643c2d: be 40 f8 bb 00 mov $0xbbf840,%esi 0.00 : 643c32: bf 02 00 00 00 mov $0x2,%edi 0.00 : 643c37: e8 84 5e e2 ff callq 469ac0 : : /* : * Identify myself via ps : */ : init_ps_display("stats collector process", "", "", ""); 0.00 : 643c3c: b9 96 16 8e 00 mov $0x8e1696,%ecx 0.00 : 643c41: bf 7d f0 89 00 mov $0x89f07d,%edi 0.00 : 643c46: 48 89 ca mov %rcx,%rdx 0.00 : 643c49: 48 89 ce mov %rcx,%rsi 0.00 : 643c4c: e8 8f 20 15 00 callq 795ce0 : /* : * Read in an existing statistics stats file or initialize the stats to : * zero. : */ : pgStatRunningInCollector = true; : pgStatDBHash = pgstat_read_statsfiles(InvalidOid, true, true); 0.00 : 643c51: ba 01 00 00 00 mov $0x1,%edx 0.00 : 643c56: be 01 00 00 00 mov $0x1,%esi 0.00 : 643c5b: 31 ff xor %edi,%edi : : /* : * Read in an existing statistics stats file or initialize the stats to : * zero. : */ : pgStatRunningInCollector = true; 0.00 : 643c5d: c6 05 24 80 53 00 01 movb $0x1,0x538024(%rip) # b7bc88 : pgStatDBHash = pgstat_read_statsfiles(InvalidOid, true, true); 0.00 : 643c64: e8 97 d4 ff ff callq 641100 : } : else : { : /* Successful archival operation */ : ++archiverStats.archived_count; : memcpy(archiverStats.last_archived_wal, msg->m_xlog, 0.00 : 643c69: 49 8d 55 09 lea 0x9(%r13),%rdx : /* : * Read in an existing statistics stats file or initialize the stats to : * zero. : */ : pgStatRunningInCollector = true; : pgStatDBHash = pgstat_read_statsfiles(InvalidOid, true, true); 0.00 : 643c6d: 48 89 05 64 7f 53 00 mov %rax,0x537f64(%rip) # b7bbd8 : dbentry = pgstat_get_db_entry(msg->m_databaseid, true); : : /* : * Process all function entries in the message. : */ : for (i = 0; i < msg->m_nentries; i++, funcmsg++) 0.00 : 643c74: 49 8d 45 10 lea 0x10(%r13),%rax : } : else : { : /* Successful archival operation */ : ++archiverStats.archived_count; : memcpy(archiverStats.last_archived_wal, msg->m_xlog, 0.00 : 643c78: 48 89 95 c8 f7 ff ff mov %rdx,-0x838(%rbp) : dbentry = pgstat_get_db_entry(msg->m_databaseid, true); : : /* : * Process all function entries in the message. : */ : for (i = 0; i < msg->m_nentries; i++, funcmsg++) 0.00 : 643c7f: 48 89 85 d0 f7 ff ff mov %rax,-0x830(%rbp) 0.00 : 643c86: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 0.00 : 643c8d: 00 00 00 : * action. : */ : for (;;) : { : /* Clear any already-pending wakeups */ : ResetLatch(&pgStatLatch); 0.00 : 643c90: bf 58 bd b7 00 mov $0xb7bd58,%edi 0.00 : 643c95: e8 a6 53 ff ff callq 639040 : : /* : * Quit if we get SIGQUIT from the postmaster. : */ : if (need_exit) 0.00 : 643c9a: 0f b6 05 a7 80 53 00 movzbl 0x5380a7(%rip),%eax # b7bd48 0.00 : 643ca1: 84 c0 test %al,%al 0.00 : 643ca3: 74 40 je 643ce5 0.00 : 643ca5: e9 aa 00 00 00 jmpq 643d54 0.00 : 643caa: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : * ---------- : */ : static bool : pgstat_write_statsfile_needed(void) : { : if (!slist_is_empty(&last_statrequests)) 0.00 : 643cb0: 48 83 3d 98 80 53 00 cmpq $0x0,0x538098(%rip) # b7bd50 0.00 : 643cb7: 00 0.00 : 643cb8: 74 09 je 643cc3 : /* : * Write the stats file if a new request has arrived that is not : * satisfied by existing file. : */ : if (pgstat_write_statsfile_needed()) : pgstat_write_statsfiles(false, false); 0.00 : 643cba: 31 f6 xor %esi,%esi 0.00 : 643cbc: 31 ff xor %edi,%edi 0.00 : 643cbe: e8 1d fb ff ff callq 6437e0 : */ : #ifdef WIN32 : pgwin32_noblock = 1; : #endif : : len = recv(pgStatSock, (char *) &msg, 0.00 : 643cc3: 8b 3d 47 49 52 00 mov 0x524947(%rip),%edi # b68610 0.00 : 643cc9: 31 c9 xor %ecx,%ecx 0.00 : 643ccb: ba e8 03 00 00 mov $0x3e8,%edx 0.00 : 643cd0: 4c 89 ee mov %r13,%rsi 0.00 : 643cd3: e8 88 59 e2 ff callq 469660 : : #ifdef WIN32 : pgwin32_noblock = 0; : #endif : : if (len < 0) 0.00 : 643cd8: 85 c0 test %eax,%eax 0.00 : 643cda: 0f 88 90 00 00 00 js 643d70 : } : : /* : * We ignore messages that are smaller than our common header : */ : if (len < sizeof(PgStat_MsgHdr)) 0.00 : 643ce0: 83 f8 07 cmp $0x7,%eax 0.00 : 643ce3: 77 2b ja 643d10 : : /* : * Inner loop iterates as long as we keep getting messages, or until : * need_exit becomes set. : */ : while (!need_exit) 0.00 : 643ce5: 0f b6 05 5c 80 53 00 movzbl 0x53805c(%rip),%eax # b7bd48 0.00 : 643cec: 84 c0 test %al,%al 0.00 : 643cee: 75 40 jne 643d30 : { : /* : * Reload configuration if we got SIGHUP from the postmaster. : */ : if (got_SIGHUP) 0.00 : 643cf0: 0f b6 05 52 80 53 00 movzbl 0x538052(%rip),%eax # b7bd49 0.00 : 643cf7: 84 c0 test %al,%al 0.00 : 643cf9: 74 b5 je 643cb0 : { : got_SIGHUP = false; : ProcessConfigFile(PGC_SIGHUP); 0.00 : 643cfb: bf 02 00 00 00 mov $0x2,%edi : /* : * Reload configuration if we got SIGHUP from the postmaster. : */ : if (got_SIGHUP) : { : got_SIGHUP = false; 0.00 : 643d00: c6 05 42 80 53 00 00 movb $0x0,0x538042(%rip) # b7bd49 : ProcessConfigFile(PGC_SIGHUP); 0.00 : 643d07: e8 f4 0a 15 00 callq 794800 0.00 : 643d0c: eb a2 jmp 643cb0 0.00 : 643d0e: 66 90 xchg %ax,%ax : continue; : : /* : * The received length must match the length in the header : */ : if (msg.msg_hdr.m_size != len) 0.00 : 643d10: 39 85 e4 fb ff ff cmp %eax,-0x41c(%rbp) 0.00 : 643d16: 75 cd jne 643ce5 : continue; : : /* : * O.K. - we accept this message. Process it. : */ : switch (msg.msg_hdr.m_type) 0.00 : 643d18: 83 bd e0 fb ff ff 11 cmpl $0x11,-0x420(%rbp) 0.00 : 643d1f: 77 c4 ja 643ce5 0.00 : 643d21: 8b 85 e0 fb ff ff mov -0x420(%rbp),%eax 0.00 : 643d27: ff 24 c5 80 f7 89 00 jmpq *0x89f780(,%rax,8) 0.00 : 643d2e: 66 90 xchg %ax,%ax : } : } /* end of inner message-processing loop */ : : /* Sleep until there's something to do */ : #ifndef WIN32 : wr = WaitLatchOrSocket(&pgStatLatch, 0.00 : 643d30: 8b 15 da 48 52 00 mov 0x5248da(%rip),%edx # b68610 0.00 : 643d36: 48 c7 c1 ff ff ff ff mov $0xffffffffffffffff,%rcx 0.00 : 643d3d: be 13 00 00 00 mov $0x13,%esi 0.00 : 643d42: bf 58 bd b7 00 mov $0xb7bd58,%edi 0.00 : 643d47: e8 04 54 ff ff callq 639150 : : /* : * Emergency bailout if postmaster has died. This is to avoid the : * necessity for manual cleanup of all postmaster children. : */ : if (wr & WL_POSTMASTER_DEATH) 0.00 : 643d4c: a8 10 test $0x10,%al 0.00 : 643d4e: 0f 84 3c ff ff ff je 643c90 : } /* end of outer loop */ : : /* : * Save the final stats to reuse at next startup. : */ : pgstat_write_statsfiles(true, true); 0.00 : 643d54: bf 01 00 00 00 mov $0x1,%edi 0.00 : 643d59: be 01 00 00 00 mov $0x1,%esi 0.00 : 643d5e: e8 7d fa ff ff callq 6437e0 : : exit(0); 0.00 : 643d63: 31 ff xor %edi,%edi 0.00 : 643d65: e8 26 58 e2 ff callq 469590 0.00 : 643d6a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : pgwin32_noblock = 0; : #endif : : if (len < 0) : { : if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) 0.00 : 643d70: e8 4b 5f e2 ff callq 469cc0 <__errno_location@plt> 0.00 : 643d75: 8b 00 mov (%rax),%eax 0.00 : 643d77: 83 f8 0b cmp $0xb,%eax 0.00 : 643d7a: 74 b4 je 643d30 0.00 : 643d7c: 83 f8 04 cmp $0x4,%eax 0.00 : 643d7f: 90 nop 0.00 : 643d80: 74 ae je 643d30 : break; /* out of inner loop */ : ereport(ERROR, 0.00 : 643d82: 45 31 c0 xor %r8d,%r8d 0.00 : 643d85: b9 60 f9 89 00 mov $0x89f960,%ecx 0.00 : 643d8a: ba d0 0c 00 00 mov $0xcd0,%edx 0.00 : 643d8f: be 88 ef 89 00 mov $0x89ef88,%esi 0.00 : 643d94: bf 14 00 00 00 mov $0x14,%edi 0.00 : 643d99: e8 22 6d 13 00 callq 77aac0 0.00 : 643d9e: 84 c0 test %al,%al 0.00 : 643da0: 0f 85 af 0a 00 00 jne 644855 : hash_destroy(dbentry->functions); : : if (hash_search(pgStatDBHash, : (void *) &dbid, : HASH_REMOVE, NULL) == NULL) : ereport(ERROR, 0.00 : 643da6: e8 25 57 e2 ff callq 4694d0 : static void : pgstat_recv_deadlock(PgStat_MsgDeadlock *msg, int len) : { : PgStat_StatDBEntry *dbentry; : : dbentry = pgstat_get_db_entry(msg->m_databaseid, true); 0.00 : 643dab: 8b bd e8 fb ff ff mov -0x418(%rbp),%edi 0.00 : 643db1: be 01 00 00 00 mov $0x1,%esi 0.00 : 643db6: e8 55 d1 ff ff callq 640f10 : : dbentry->n_deadlocks++; 0.00 : 643dbb: 48 83 80 90 00 00 00 addq $0x1,0x90(%rax) 0.00 : 643dc2: 01 : pgstat_recv_recoveryconflict((PgStat_MsgRecoveryConflict *) &msg, len); : break; : : case PGSTAT_MTYPE_DEADLOCK: : pgstat_recv_deadlock((PgStat_MsgDeadlock *) &msg, len); : break; 0.00 : 643dc3: e9 1d ff ff ff jmpq 643ce5 : { : slist_iter iter; : DBWriteRequest *newreq; : PgStat_StatDBEntry *dbentry; : : elog(DEBUG2, "received inquiry for %d", msg->databaseid); 0.00 : 643dc8: ba 80 f9 89 00 mov $0x89f980,%edx 0.00 : 643dcd: be bf 11 00 00 mov $0x11bf,%esi 0.00 : 643dd2: bf 88 ef 89 00 mov $0x89ef88,%edi 0.00 : 643dd7: e8 44 76 13 00 callq 77b420 0.00 : 643ddc: 8b 95 f8 fb ff ff mov -0x408(%rbp),%edx 0.00 : 643de2: 31 c0 xor %eax,%eax 0.00 : 643de4: be 95 f0 89 00 mov $0x89f095,%esi 0.00 : 643de9: bf 0d 00 00 00 mov $0xd,%edi 0.00 : 643dee: e8 3d 74 13 00 callq 77b230 : * Note that if a request is found, we return early and skip the below : * check for clock skew. This is okay, since the only way for a DB : * request to be present in the list is that we have been here since the : * last write round. : */ : slist_foreach(iter, &last_statrequests) 0.00 : 643df3: 48 8b 05 56 7f 53 00 mov 0x537f56(%rip),%rax # b7bd50 0.00 : 643dfa: 48 85 c0 test %rax,%rax 0.00 : 643dfd: 74 2e je 643e2d : { : DBWriteRequest *req = slist_container(DBWriteRequest, next, iter.cur); : : if (req->databaseid != msg->databaseid) 0.00 : 643dff: 8b 8d f8 fb ff ff mov -0x408(%rbp),%ecx 0.00 : 643e05: 39 48 f0 cmp %ecx,-0x10(%rax) : * request to be present in the list is that we have been here since the : * last write round. : */ : slist_foreach(iter, &last_statrequests) : { : DBWriteRequest *req = slist_container(DBWriteRequest, next, iter.cur); 0.00 : 643e08: 48 8d 50 f0 lea -0x10(%rax),%rdx : : if (req->databaseid != msg->databaseid) 0.00 : 643e0c: 75 17 jne 643e25 0.00 : 643e0e: e9 5f 09 00 00 jmpq 644772 0.00 : 643e13: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 643e18: 39 48 f0 cmp %ecx,-0x10(%rax) : * request to be present in the list is that we have been here since the : * last write round. : */ : slist_foreach(iter, &last_statrequests) : { : DBWriteRequest *req = slist_container(DBWriteRequest, next, iter.cur); 0.00 : 643e1b: 48 8d 50 f0 lea -0x10(%rax),%rdx : : if (req->databaseid != msg->databaseid) 0.00 : 643e1f: 0f 84 4d 09 00 00 je 644772 : * Note that if a request is found, we return early and skip the below : * check for clock skew. This is okay, since the only way for a DB : * request to be present in the list is that we have been here since the : * last write round. : */ : slist_foreach(iter, &last_statrequests) 0.00 : 643e25: 48 8b 00 mov (%rax),%rax 0.00 : 643e28: 48 85 c0 test %rax,%rax 0.00 : 643e2b: 75 eb jne 643e18 : } : : /* : * There's no request for this DB yet, so create one. : */ : newreq = palloc(sizeof(DBWriteRequest)); 0.00 : 643e2d: bf 18 00 00 00 mov $0x18,%edi 0.00 : 643e32: e8 19 4f 15 00 callq 798d50 0.00 : 643e37: 48 89 85 d8 f7 ff ff mov %rax,-0x828(%rbp) : : newreq->databaseid = msg->databaseid; 0.00 : 643e3e: 8b 85 f8 fb ff ff mov -0x408(%rbp),%eax : * the more likely explanation is just delayed message receipt. It is : * worth expending a GetCurrentTimestamp call to be sure, since a large : * retreat in the system clock reading could otherwise cause us to neglect : * to update the stats file for a long time. : */ : dbentry = pgstat_get_db_entry(msg->databaseid, false); 0.00 : 643e44: 31 f6 xor %esi,%esi : /* : * There's no request for this DB yet, so create one. : */ : newreq = palloc(sizeof(DBWriteRequest)); : : newreq->databaseid = msg->databaseid; 0.00 : 643e46: 48 8b 95 d8 f7 ff ff mov -0x828(%rbp),%rdx 0.00 : 643e4d: 89 02 mov %eax,(%rdx) : newreq->request_time = msg->clock_time; 0.00 : 643e4f: 48 8b 85 e8 fb ff ff mov -0x418(%rbp),%rax 0.00 : 643e56: 48 89 42 08 mov %rax,0x8(%rdx) : * Insert a node at the beginning of the list. : */ : STATIC_IF_INLINE void : slist_push_head(slist_head *head, slist_node *node) : { : node->next = head->head.next; 0.00 : 643e5a: 48 8b 05 ef 7e 53 00 mov 0x537eef(%rip),%rax # b7bd50 0.00 : 643e61: 48 89 42 10 mov %rax,0x10(%rdx) : * the more likely explanation is just delayed message receipt. It is : * worth expending a GetCurrentTimestamp call to be sure, since a large : * retreat in the system clock reading could otherwise cause us to neglect : * to update the stats file for a long time. : */ : dbentry = pgstat_get_db_entry(msg->databaseid, false); 0.00 : 643e65: 8b bd f8 fb ff ff mov -0x408(%rbp),%edi : head->head.next = node; 0.00 : 643e6b: 48 89 d0 mov %rdx,%rax 0.00 : 643e6e: 48 83 c0 10 add $0x10,%rax 0.00 : 643e72: 48 89 05 d7 7e 53 00 mov %rax,0x537ed7(%rip) # b7bd50 0.00 : 643e79: e8 92 d0 ff ff callq 640f10 : if ((dbentry != NULL) && (msg->clock_time < dbentry->stats_timestamp)) 0.00 : 643e7e: 48 85 c0 test %rax,%rax : * the more likely explanation is just delayed message receipt. It is : * worth expending a GetCurrentTimestamp call to be sure, since a large : * retreat in the system clock reading could otherwise cause us to neglect : * to update the stats file for a long time. : */ : dbentry = pgstat_get_db_entry(msg->databaseid, false); 0.00 : 643e81: 49 89 c6 mov %rax,%r14 : if ((dbentry != NULL) && (msg->clock_time < dbentry->stats_timestamp)) 0.00 : 643e84: 0f 84 5b fe ff ff je 643ce5 0.00 : 643e8a: 48 8b 80 b0 00 00 00 mov 0xb0(%rax),%rax 0.00 : 643e91: 48 39 85 e8 fb ff ff cmp %rax,-0x418(%rbp) 0.00 : 643e98: 0f 8d 47 fe ff ff jge 643ce5 : { : TimestampTz cur_ts = GetCurrentTimestamp(); 0.00 : 643e9e: e8 cd 24 10 00 callq 746370 : : if (cur_ts < dbentry->stats_timestamp) 0.00 : 643ea3: 49 8b be b0 00 00 00 mov 0xb0(%r14),%rdi : * to update the stats file for a long time. : */ : dbentry = pgstat_get_db_entry(msg->databaseid, false); : if ((dbentry != NULL) && (msg->clock_time < dbentry->stats_timestamp)) : { : TimestampTz cur_ts = GetCurrentTimestamp(); 0.00 : 643eaa: 49 89 c7 mov %rax,%r15 : : if (cur_ts < dbentry->stats_timestamp) 0.00 : 643ead: 48 39 f8 cmp %rdi,%rax 0.00 : 643eb0: 0f 8d 2f fe ff ff jge 643ce5 : */ : char *writetime; : char *mytime; : : /* Copy because timestamptz_to_str returns a static buffer */ : writetime = pstrdup(timestamptz_to_str(dbentry->stats_timestamp)); 0.00 : 643eb6: e8 f5 23 10 00 callq 7462b0 0.00 : 643ebb: 48 89 c7 mov %rax,%rdi 0.00 : 643ebe: e8 8d 50 15 00 callq 798f50 : mytime = pstrdup(timestamptz_to_str(cur_ts)); 0.00 : 643ec3: 4c 89 ff mov %r15,%rdi : */ : char *writetime; : char *mytime; : : /* Copy because timestamptz_to_str returns a static buffer */ : writetime = pstrdup(timestamptz_to_str(dbentry->stats_timestamp)); 0.00 : 643ec6: 49 89 c4 mov %rax,%r12 : mytime = pstrdup(timestamptz_to_str(cur_ts)); 0.00 : 643ec9: e8 e2 23 10 00 callq 7462b0 0.00 : 643ece: 48 89 c7 mov %rax,%rdi 0.00 : 643ed1: e8 7a 50 15 00 callq 798f50 : elog(LOG, 0.00 : 643ed6: ba 80 f9 89 00 mov $0x89f980,%edx 0.00 : 643edb: be fa 11 00 00 mov $0x11fa,%esi 0.00 : 643ee0: bf 88 ef 89 00 mov $0x89ef88,%edi : char *writetime; : char *mytime; : : /* Copy because timestamptz_to_str returns a static buffer */ : writetime = pstrdup(timestamptz_to_str(dbentry->stats_timestamp)); : mytime = pstrdup(timestamptz_to_str(cur_ts)); 0.00 : 643ee5: 48 89 c3 mov %rax,%rbx : elog(LOG, 0.00 : 643ee8: e8 33 75 13 00 callq 77b420 0.00 : 643eed: 45 8b 06 mov (%r14),%r8d 0.00 : 643ef0: 4c 89 e2 mov %r12,%rdx 0.00 : 643ef3: 31 c0 xor %eax,%eax 0.00 : 643ef5: 48 89 d9 mov %rbx,%rcx 0.00 : 643ef8: be c0 f3 89 00 mov $0x89f3c0,%esi 0.00 : 643efd: bf 0f 00 00 00 mov $0xf,%edi 0.00 : 643f02: e8 29 73 13 00 callq 77b230 : "stats_timestamp %s is later than collector's time %s for db %d", : writetime, mytime, dbentry->databaseid); : pfree(writetime); 0.00 : 643f07: 4c 89 e7 mov %r12,%rdi 0.00 : 643f0a: e8 71 4c 15 00 callq 798b80 : pfree(mytime); 0.00 : 643f0f: 48 89 df mov %rbx,%rdi 0.00 : 643f12: e8 69 4c 15 00 callq 798b80 : : newreq->request_time = cur_ts; 0.00 : 643f17: 48 8b 95 d8 f7 ff ff mov -0x828(%rbp),%rdx : dbentry->stats_timestamp = cur_ts - 1; 0.00 : 643f1e: 49 8d 47 ff lea -0x1(%r15),%rax : "stats_timestamp %s is later than collector's time %s for db %d", : writetime, mytime, dbentry->databaseid); : pfree(writetime); : pfree(mytime); : : newreq->request_time = cur_ts; 0.00 : 643f22: 4c 89 7a 08 mov %r15,0x8(%rdx) : dbentry->stats_timestamp = cur_ts - 1; 0.00 : 643f26: 49 89 86 b0 00 00 00 mov %rax,0xb0(%r14) 0.00 : 643f2d: e9 b3 fd ff ff jmpq 643ce5 : PgStat_StatDBEntry *dbentry; : PgStat_StatTabEntry *tabentry; : int i; : bool found; : : dbentry = pgstat_get_db_entry(msg->m_databaseid, true); 0.00 : 643f32: 8b bd e8 fb ff ff mov -0x418(%rbp),%edi 0.00 : 643f38: be 01 00 00 00 mov $0x1,%esi 0.00 : 643f3d: e8 ce cf ff ff callq 640f10 0.00 : 643f42: 49 89 c4 mov %rax,%r12 : : /* : * Update database-wide stats. : */ : dbentry->n_xact_commit += (PgStat_Counter) (msg->m_xact_commit); 0.00 : 643f45: 48 63 85 f0 fb ff ff movslq -0x410(%rbp),%rax 0.00 : 643f4c: 49 01 44 24 08 add %rax,0x8(%r12) : dbentry->n_xact_rollback += (PgStat_Counter) (msg->m_xact_rollback); 0.00 : 643f51: 48 63 85 f4 fb ff ff movslq -0x40c(%rbp),%rax 0.00 : 643f58: 49 01 44 24 10 add %rax,0x10(%r12) : dbentry->n_block_read_time += msg->m_block_read_time; 0.00 : 643f5d: 48 8b 85 f8 fb ff ff mov -0x408(%rbp),%rax 0.00 : 643f64: 49 01 84 24 98 00 00 add %rax,0x98(%r12) 0.00 : 643f6b: 00 : dbentry->n_block_write_time += msg->m_block_write_time; 0.00 : 643f6c: 48 8b 85 00 fc ff ff mov -0x400(%rbp),%rax 0.00 : 643f73: 49 01 84 24 a0 00 00 add %rax,0xa0(%r12) 0.00 : 643f7a: 00 : : /* : * Process all table entries in the message. : */ : for (i = 0; i < msg->m_nentries; i++) 0.00 : 643f7b: 44 8b 9d ec fb ff ff mov -0x414(%rbp),%r11d 0.00 : 643f82: 45 85 db test %r11d,%r11d 0.00 : 643f85: 0f 8e 5a fd ff ff jle 643ce5 0.00 : 643f8b: 45 31 ff xor %r15d,%r15d 0.00 : 643f8e: e9 7d 01 00 00 jmpq 644110 : { : /* : * If it's a new table entry, initialize counters to the values we : * just got. : */ : tabentry->numscans = tabmsg->t_counts.t_numscans; 0.00 : 643f93: 48 8b 84 1d 10 fc ff mov -0x3f0(%rbp,%rbx,1),%rax 0.00 : 643f9a: ff 0.00 : 643f9b: 48 89 42 08 mov %rax,0x8(%rdx) : tabentry->tuples_returned = tabmsg->t_counts.t_tuples_returned; 0.00 : 643f9f: 48 8b 84 1d 18 fc ff mov -0x3e8(%rbp,%rbx,1),%rax 0.00 : 643fa6: ff 0.00 : 643fa7: 48 89 42 10 mov %rax,0x10(%rdx) : tabentry->tuples_fetched = tabmsg->t_counts.t_tuples_fetched; 0.00 : 643fab: 48 8b 84 1d 20 fc ff mov -0x3e0(%rbp,%rbx,1),%rax 0.00 : 643fb2: ff 0.00 : 643fb3: 48 89 42 18 mov %rax,0x18(%rdx) : tabentry->tuples_inserted = tabmsg->t_counts.t_tuples_inserted; 0.00 : 643fb7: 48 8b 84 1d 28 fc ff mov -0x3d8(%rbp,%rbx,1),%rax 0.00 : 643fbe: ff 0.00 : 643fbf: 48 89 42 20 mov %rax,0x20(%rdx) : tabentry->tuples_updated = tabmsg->t_counts.t_tuples_updated; 0.00 : 643fc3: 48 8b 84 1d 30 fc ff mov -0x3d0(%rbp,%rbx,1),%rax 0.00 : 643fca: ff 0.00 : 643fcb: 48 89 42 28 mov %rax,0x28(%rdx) : tabentry->tuples_deleted = tabmsg->t_counts.t_tuples_deleted; 0.00 : 643fcf: 48 8b 84 1d 38 fc ff mov -0x3c8(%rbp,%rbx,1),%rax 0.00 : 643fd6: ff 0.00 : 643fd7: 48 89 42 30 mov %rax,0x30(%rdx) : tabentry->tuples_hot_updated = tabmsg->t_counts.t_tuples_hot_updated; 0.00 : 643fdb: 48 8b 84 1d 40 fc ff mov -0x3c0(%rbp,%rbx,1),%rax 0.00 : 643fe2: ff 0.00 : 643fe3: 48 89 42 38 mov %rax,0x38(%rdx) : tabentry->n_live_tuples = tabmsg->t_counts.t_delta_live_tuples; 0.00 : 643fe7: 48 8b 84 1d 48 fc ff mov -0x3b8(%rbp,%rbx,1),%rax 0.00 : 643fee: ff 0.00 : 643fef: 48 89 42 40 mov %rax,0x40(%rdx) : tabentry->n_dead_tuples = tabmsg->t_counts.t_delta_dead_tuples; 0.00 : 643ff3: 48 8b 84 1d 50 fc ff mov -0x3b0(%rbp,%rbx,1),%rax 0.00 : 643ffa: ff 0.00 : 643ffb: 48 89 42 48 mov %rax,0x48(%rdx) : tabentry->changes_since_analyze = tabmsg->t_counts.t_changed_tuples; 0.00 : 643fff: 48 8b 84 1d 58 fc ff mov -0x3a8(%rbp,%rbx,1),%rax 0.00 : 644006: ff 0.00 : 644007: 48 89 42 50 mov %rax,0x50(%rdx) : tabentry->blocks_fetched = tabmsg->t_counts.t_blocks_fetched; 0.00 : 64400b: 48 8b 84 1d 60 fc ff mov -0x3a0(%rbp,%rbx,1),%rax 0.00 : 644012: ff 0.00 : 644013: 48 89 42 58 mov %rax,0x58(%rdx) : tabentry->blocks_hit = tabmsg->t_counts.t_blocks_hit; 0.00 : 644017: 48 8b 84 1d 68 fc ff mov -0x398(%rbp,%rbx,1),%rax 0.00 : 64401e: ff : : tabentry->vacuum_timestamp = 0; 0.00 : 64401f: 48 c7 42 68 00 00 00 movq $0x0,0x68(%rdx) 0.00 : 644026: 00 : tabentry->vacuum_count = 0; 0.00 : 644027: 48 c7 42 70 00 00 00 movq $0x0,0x70(%rdx) 0.00 : 64402e: 00 : tabentry->autovac_vacuum_timestamp = 0; 0.00 : 64402f: 48 c7 42 78 00 00 00 movq $0x0,0x78(%rdx) 0.00 : 644036: 00 : tabentry->autovac_vacuum_count = 0; 0.00 : 644037: 48 c7 82 80 00 00 00 movq $0x0,0x80(%rdx) 0.00 : 64403e: 00 00 00 00 : tabentry->tuples_hot_updated = tabmsg->t_counts.t_tuples_hot_updated; : tabentry->n_live_tuples = tabmsg->t_counts.t_delta_live_tuples; : tabentry->n_dead_tuples = tabmsg->t_counts.t_delta_dead_tuples; : tabentry->changes_since_analyze = tabmsg->t_counts.t_changed_tuples; : tabentry->blocks_fetched = tabmsg->t_counts.t_blocks_fetched; : tabentry->blocks_hit = tabmsg->t_counts.t_blocks_hit; 0.00 : 644042: 48 89 42 60 mov %rax,0x60(%rdx) : : tabentry->vacuum_timestamp = 0; : tabentry->vacuum_count = 0; : tabentry->autovac_vacuum_timestamp = 0; : tabentry->autovac_vacuum_count = 0; : tabentry->analyze_timestamp = 0; 0.00 : 644046: 48 c7 82 88 00 00 00 movq $0x0,0x88(%rdx) 0.00 : 64404d: 00 00 00 00 : tabentry->analyze_count = 0; 0.00 : 644051: 48 c7 82 90 00 00 00 movq $0x0,0x90(%rdx) 0.00 : 644058: 00 00 00 00 : tabentry->autovac_analyze_timestamp = 0; 0.00 : 64405c: 48 c7 82 98 00 00 00 movq $0x0,0x98(%rdx) 0.00 : 644063: 00 00 00 00 : tabentry->autovac_analyze_count = 0; 0.00 : 644067: 48 c7 82 a0 00 00 00 movq $0x0,0xa0(%rdx) 0.00 : 64406e: 00 00 00 00 : tabentry->blocks_fetched += tabmsg->t_counts.t_blocks_fetched; : tabentry->blocks_hit += tabmsg->t_counts.t_blocks_hit; : } : : /* Clamp n_live_tuples in case of negative delta_live_tuples */ : tabentry->n_live_tuples = Max(tabentry->n_live_tuples, 0); 0.00 : 644072: 48 83 7a 40 00 cmpq $0x0,0x40(%rdx) 0.00 : 644077: b8 00 00 00 00 mov $0x0,%eax 0.00 : 64407c: 48 0f 49 42 40 cmovns 0x40(%rdx),%rax : /* Likewise for n_dead_tuples */ : tabentry->n_dead_tuples = Max(tabentry->n_dead_tuples, 0); 0.00 : 644081: 48 83 7a 48 00 cmpq $0x0,0x48(%rdx) : tabentry->blocks_fetched += tabmsg->t_counts.t_blocks_fetched; : tabentry->blocks_hit += tabmsg->t_counts.t_blocks_hit; : } : : /* Clamp n_live_tuples in case of negative delta_live_tuples */ : tabentry->n_live_tuples = Max(tabentry->n_live_tuples, 0); 0.00 : 644086: 48 89 42 40 mov %rax,0x40(%rdx) : /* Likewise for n_dead_tuples */ : tabentry->n_dead_tuples = Max(tabentry->n_dead_tuples, 0); 0.00 : 64408a: b8 00 00 00 00 mov $0x0,%eax 0.00 : 64408f: 48 0f 49 42 48 cmovns 0x48(%rdx),%rax : dbentry->n_block_write_time += msg->m_block_write_time; : : /* : * Process all table entries in the message. : */ : for (i = 0; i < msg->m_nentries; i++) 0.00 : 644094: 41 83 c7 01 add $0x1,%r15d : } : : /* Clamp n_live_tuples in case of negative delta_live_tuples */ : tabentry->n_live_tuples = Max(tabentry->n_live_tuples, 0); : /* Likewise for n_dead_tuples */ : tabentry->n_dead_tuples = Max(tabentry->n_dead_tuples, 0); 0.00 : 644098: 48 89 42 48 mov %rax,0x48(%rdx) : : /* : * Add per-table stats to the per-database entry, too. : */ : dbentry->n_tuples_returned += tabmsg->t_counts.t_tuples_returned; 0.00 : 64409c: 4b 8d 04 76 lea (%r14,%r14,2),%rax 0.00 : 6440a0: 49 8d 04 86 lea (%r14,%rax,4),%rax 0.00 : 6440a4: 48 c1 e0 03 shl $0x3,%rax 0.00 : 6440a8: 48 8b 94 05 18 fc ff mov -0x3e8(%rbp,%rax,1),%rdx 0.00 : 6440af: ff 0.00 : 6440b0: 49 01 54 24 28 add %rdx,0x28(%r12) : dbentry->n_tuples_fetched += tabmsg->t_counts.t_tuples_fetched; 0.00 : 6440b5: 48 8b 94 05 20 fc ff mov -0x3e0(%rbp,%rax,1),%rdx 0.00 : 6440bc: ff 0.00 : 6440bd: 49 01 54 24 30 add %rdx,0x30(%r12) : dbentry->n_tuples_inserted += tabmsg->t_counts.t_tuples_inserted; 0.00 : 6440c2: 48 8b 94 05 28 fc ff mov -0x3d8(%rbp,%rax,1),%rdx 0.00 : 6440c9: ff 0.00 : 6440ca: 49 01 54 24 38 add %rdx,0x38(%r12) : dbentry->n_tuples_updated += tabmsg->t_counts.t_tuples_updated; 0.00 : 6440cf: 48 8b 94 05 30 fc ff mov -0x3d0(%rbp,%rax,1),%rdx 0.00 : 6440d6: ff 0.00 : 6440d7: 49 01 54 24 40 add %rdx,0x40(%r12) : dbentry->n_tuples_deleted += tabmsg->t_counts.t_tuples_deleted; 0.00 : 6440dc: 48 8b 94 05 38 fc ff mov -0x3c8(%rbp,%rax,1),%rdx 0.00 : 6440e3: ff 0.00 : 6440e4: 49 01 54 24 48 add %rdx,0x48(%r12) : dbentry->n_blocks_fetched += tabmsg->t_counts.t_blocks_fetched; 0.00 : 6440e9: 48 8b 94 05 60 fc ff mov -0x3a0(%rbp,%rax,1),%rdx 0.00 : 6440f0: ff 0.00 : 6440f1: 49 01 54 24 18 add %rdx,0x18(%r12) : dbentry->n_blocks_hit += tabmsg->t_counts.t_blocks_hit; 0.00 : 6440f6: 48 8b 84 05 68 fc ff mov -0x398(%rbp,%rax,1),%rax 0.00 : 6440fd: ff 0.00 : 6440fe: 49 01 44 24 20 add %rax,0x20(%r12) : dbentry->n_block_write_time += msg->m_block_write_time; : : /* : * Process all table entries in the message. : */ : for (i = 0; i < msg->m_nentries; i++) 0.00 : 644103: 44 3b bd ec fb ff ff cmp -0x414(%rbp),%r15d 0.00 : 64410a: 0f 8d d5 fb ff ff jge 643ce5 : { : PgStat_TableEntry *tabmsg = &(msg->m_entry[i]); 0.00 : 644110: 4d 63 f7 movslq %r15d,%r14 : : tabentry = (PgStat_StatTabEntry *) hash_search(dbentry->tables, 0.00 : 644113: 49 8b bc 24 b8 00 00 mov 0xb8(%r12),%rdi 0.00 : 64411a: 00 0.00 : 64411b: 48 8d 4d cc lea -0x34(%rbp),%rcx 0.00 : 64411f: 4b 8d 04 76 lea (%r14,%r14,2),%rax 0.00 : 644123: ba 01 00 00 00 mov $0x1,%edx 0.00 : 644128: 49 8d 04 86 lea (%r14,%rax,4),%rax 0.00 : 64412c: 48 8d 1c c5 00 00 00 lea 0x0(,%rax,8),%rbx 0.00 : 644133: 00 0.00 : 644134: 49 8d 74 1d 28 lea 0x28(%r13,%rbx,1),%rsi 0.00 : 644139: e8 62 05 14 00 callq 7846a0 : (void *) &(tabmsg->t_id), : HASH_ENTER, &found); : : if (!found) 0.00 : 64413e: 80 7d cc 00 cmpb $0x0,-0x34(%rbp) : */ : for (i = 0; i < msg->m_nentries; i++) : { : PgStat_TableEntry *tabmsg = &(msg->m_entry[i]); : : tabentry = (PgStat_StatTabEntry *) hash_search(dbentry->tables, 0.00 : 644142: 48 89 c2 mov %rax,%rdx : (void *) &(tabmsg->t_id), : HASH_ENTER, &found); : : if (!found) 0.00 : 644145: 0f 84 48 fe ff ff je 643f93 : else : { : /* : * Otherwise add the values to the existing entry. : */ : tabentry->numscans += tabmsg->t_counts.t_numscans; 0.00 : 64414b: 48 8b 84 1d 10 fc ff mov -0x3f0(%rbp,%rbx,1),%rax 0.00 : 644152: ff 0.00 : 644153: 48 01 42 08 add %rax,0x8(%rdx) : tabentry->tuples_returned += tabmsg->t_counts.t_tuples_returned; 0.00 : 644157: 48 8b 84 1d 18 fc ff mov -0x3e8(%rbp,%rbx,1),%rax 0.00 : 64415e: ff 0.00 : 64415f: 48 01 42 10 add %rax,0x10(%rdx) : tabentry->tuples_fetched += tabmsg->t_counts.t_tuples_fetched; 0.00 : 644163: 48 8b 84 1d 20 fc ff mov -0x3e0(%rbp,%rbx,1),%rax 0.00 : 64416a: ff 0.00 : 64416b: 48 01 42 18 add %rax,0x18(%rdx) : tabentry->tuples_inserted += tabmsg->t_counts.t_tuples_inserted; 0.00 : 64416f: 48 8b 84 1d 28 fc ff mov -0x3d8(%rbp,%rbx,1),%rax 0.00 : 644176: ff 0.00 : 644177: 48 01 42 20 add %rax,0x20(%rdx) : tabentry->tuples_updated += tabmsg->t_counts.t_tuples_updated; 0.00 : 64417b: 48 8b 84 1d 30 fc ff mov -0x3d0(%rbp,%rbx,1),%rax 0.00 : 644182: ff 0.00 : 644183: 48 01 42 28 add %rax,0x28(%rdx) : tabentry->tuples_deleted += tabmsg->t_counts.t_tuples_deleted; 0.00 : 644187: 48 8b 84 1d 38 fc ff mov -0x3c8(%rbp,%rbx,1),%rax 0.00 : 64418e: ff 0.00 : 64418f: 48 01 42 30 add %rax,0x30(%rdx) : tabentry->tuples_hot_updated += tabmsg->t_counts.t_tuples_hot_updated; 0.00 : 644193: 48 8b 84 1d 40 fc ff mov -0x3c0(%rbp,%rbx,1),%rax 0.00 : 64419a: ff 0.00 : 64419b: 48 01 42 38 add %rax,0x38(%rdx) : tabentry->n_live_tuples += tabmsg->t_counts.t_delta_live_tuples; 0.00 : 64419f: 48 8b 84 1d 48 fc ff mov -0x3b8(%rbp,%rbx,1),%rax 0.00 : 6441a6: ff 0.00 : 6441a7: 48 01 42 40 add %rax,0x40(%rdx) : tabentry->n_dead_tuples += tabmsg->t_counts.t_delta_dead_tuples; 0.00 : 6441ab: 48 8b 84 1d 50 fc ff mov -0x3b0(%rbp,%rbx,1),%rax 0.00 : 6441b2: ff 0.00 : 6441b3: 48 01 42 48 add %rax,0x48(%rdx) : tabentry->changes_since_analyze += tabmsg->t_counts.t_changed_tuples; 0.00 : 6441b7: 48 8b 84 1d 58 fc ff mov -0x3a8(%rbp,%rbx,1),%rax 0.00 : 6441be: ff 0.00 : 6441bf: 48 01 42 50 add %rax,0x50(%rdx) : tabentry->blocks_fetched += tabmsg->t_counts.t_blocks_fetched; 0.00 : 6441c3: 48 8b 84 1d 60 fc ff mov -0x3a0(%rbp,%rbx,1),%rax 0.00 : 6441ca: ff 0.00 : 6441cb: 48 01 42 58 add %rax,0x58(%rdx) : tabentry->blocks_hit += tabmsg->t_counts.t_blocks_hit; 0.00 : 6441cf: 48 8b 84 1d 68 fc ff mov -0x398(%rbp,%rbx,1),%rax 0.00 : 6441d6: ff 0.00 : 6441d7: 48 01 42 60 add %rax,0x60(%rdx) 0.00 : 6441db: e9 92 fe ff ff jmpq 644072 : PgStat_StatTabEntry *tabentry; : : /* : * Store the data in the table's hashtable entry. : */ : dbentry = pgstat_get_db_entry(msg->m_databaseid, true); 0.00 : 6441e0: 8b bd e8 fb ff ff mov -0x418(%rbp),%edi 0.00 : 6441e6: be 01 00 00 00 mov $0x1,%esi 0.00 : 6441eb: e8 20 cd ff ff callq 640f10 : : tabentry = pgstat_get_tab_entry(dbentry, msg->m_tableoid, true); 0.00 : 6441f0: 8b b5 ec fb ff ff mov -0x414(%rbp),%esi 0.00 : 6441f6: ba 01 00 00 00 mov $0x1,%edx : PgStat_StatTabEntry *tabentry; : : /* : * Store the data in the table's hashtable entry. : */ : dbentry = pgstat_get_db_entry(msg->m_databaseid, true); 0.00 : 6441fb: 48 89 c7 mov %rax,%rdi : : tabentry = pgstat_get_tab_entry(dbentry, msg->m_tableoid, true); 0.00 : 6441fe: e8 6d cd ff ff callq 640f70 0.00 : 644203: 48 89 c2 mov %rax,%rdx : : tabentry->n_live_tuples = msg->m_live_tuples; 0.00 : 644206: 48 8b 85 00 fc ff ff mov -0x400(%rbp),%rax 0.00 : 64420d: 48 89 42 40 mov %rax,0x40(%rdx) : tabentry->n_dead_tuples = msg->m_dead_tuples; 0.00 : 644211: 48 8b 85 08 fc ff ff mov -0x3f8(%rbp),%rax 0.00 : 644218: 48 89 42 48 mov %rax,0x48(%rdx) : : if (msg->m_autovacuum) 0.00 : 64421c: 80 bd f0 fb ff ff 00 cmpb $0x0,-0x410(%rbp) 0.00 : 644223: 0f 84 e0 05 00 00 je 644809 : { : tabentry->autovac_vacuum_timestamp = msg->m_vacuumtime; 0.00 : 644229: 48 8b 85 f8 fb ff ff mov -0x408(%rbp),%rax : tabentry->autovac_vacuum_count++; 0.00 : 644230: 48 83 82 80 00 00 00 addq $0x1,0x80(%rdx) 0.00 : 644237: 01 : tabentry->n_live_tuples = msg->m_live_tuples; : tabentry->n_dead_tuples = msg->m_dead_tuples; : : if (msg->m_autovacuum) : { : tabentry->autovac_vacuum_timestamp = msg->m_vacuumtime; 0.00 : 644238: 48 89 42 78 mov %rax,0x78(%rdx) 0.00 : 64423c: e9 a4 fa ff ff jmpq 643ce5 : PgStat_StatTabEntry *tabentry; : : /* : * Store the data in the table's hashtable entry. : */ : dbentry = pgstat_get_db_entry(msg->m_databaseid, true); 0.00 : 644241: 8b bd e8 fb ff ff mov -0x418(%rbp),%edi 0.00 : 644247: be 01 00 00 00 mov $0x1,%esi 0.00 : 64424c: e8 bf cc ff ff callq 640f10 : : tabentry = pgstat_get_tab_entry(dbentry, msg->m_tableoid, true); 0.00 : 644251: 8b b5 ec fb ff ff mov -0x414(%rbp),%esi 0.00 : 644257: ba 01 00 00 00 mov $0x1,%edx : PgStat_StatTabEntry *tabentry; : : /* : * Store the data in the table's hashtable entry. : */ : dbentry = pgstat_get_db_entry(msg->m_databaseid, true); 0.00 : 64425c: 48 89 c7 mov %rax,%rdi : : tabentry = pgstat_get_tab_entry(dbentry, msg->m_tableoid, true); 0.00 : 64425f: e8 0c cd ff ff callq 640f70 0.00 : 644264: 48 89 c2 mov %rax,%rdx : : tabentry->n_live_tuples = msg->m_live_tuples; 0.00 : 644267: 48 8b 85 00 fc ff ff mov -0x400(%rbp),%rax 0.00 : 64426e: 48 89 42 40 mov %rax,0x40(%rdx) : tabentry->n_dead_tuples = msg->m_dead_tuples; 0.00 : 644272: 48 8b 85 08 fc ff ff mov -0x3f8(%rbp),%rax : : /* : * We reset changes_since_analyze to zero, forgetting any changes that : * occurred while the ANALYZE was in progress. : */ : tabentry->changes_since_analyze = 0; 0.00 : 644279: 48 c7 42 50 00 00 00 movq $0x0,0x50(%rdx) 0.00 : 644280: 00 : dbentry = pgstat_get_db_entry(msg->m_databaseid, true); : : tabentry = pgstat_get_tab_entry(dbentry, msg->m_tableoid, true); : : tabentry->n_live_tuples = msg->m_live_tuples; : tabentry->n_dead_tuples = msg->m_dead_tuples; 0.00 : 644281: 48 89 42 48 mov %rax,0x48(%rdx) : * We reset changes_since_analyze to zero, forgetting any changes that : * occurred while the ANALYZE was in progress. : */ : tabentry->changes_since_analyze = 0; : : if (msg->m_autovacuum) 0.00 : 644285: 80 bd f0 fb ff ff 00 cmpb $0x0,-0x410(%rbp) 0.00 : 64428c: 0f 84 5c 05 00 00 je 6447ee : { : tabentry->autovac_analyze_timestamp = msg->m_analyzetime; 0.00 : 644292: 48 8b 85 f8 fb ff ff mov -0x408(%rbp),%rax : tabentry->autovac_analyze_count++; 0.00 : 644299: 48 83 82 a0 00 00 00 addq $0x1,0xa0(%rdx) 0.00 : 6442a0: 01 : */ : tabentry->changes_since_analyze = 0; : : if (msg->m_autovacuum) : { : tabentry->autovac_analyze_timestamp = msg->m_analyzetime; 0.00 : 6442a1: 48 89 82 98 00 00 00 mov %rax,0x98(%rdx) 0.00 : 6442a8: e9 38 fa ff ff jmpq 643ce5 : PgStat_StatDBEntry *dbentry; : : /* : * Lookup the database in the hashtable. Nothing to do if not there. : */ : dbentry = pgstat_get_db_entry(msg->m_databaseid, false); 0.00 : 6442ad: 8b bd e8 fb ff ff mov -0x418(%rbp),%edi 0.00 : 6442b3: 31 f6 xor %esi,%esi 0.00 : 6442b5: e8 56 cc ff ff callq 640f10 : : if (!dbentry) 0.00 : 6442ba: 48 85 c0 test %rax,%rax : PgStat_StatDBEntry *dbentry; : : /* : * Lookup the database in the hashtable. Nothing to do if not there. : */ : dbentry = pgstat_get_db_entry(msg->m_databaseid, false); 0.00 : 6442bd: 48 89 c3 mov %rax,%rbx : : if (!dbentry) 0.00 : 6442c0: 0f 84 1f fa ff ff je 643ce5 : : /* : * We simply throw away all the database's table entries by recreating a : * new hash table for them. : */ : if (dbentry->tables != NULL) 0.00 : 6442c6: 48 8b b8 b8 00 00 00 mov 0xb8(%rax),%rdi 0.00 : 6442cd: 48 85 ff test %rdi,%rdi 0.00 : 6442d0: 74 05 je 6442d7 : hash_destroy(dbentry->tables); 0.00 : 6442d2: e8 29 04 14 00 callq 784700 : if (dbentry->functions != NULL) 0.00 : 6442d7: 48 8b bb c0 00 00 00 mov 0xc0(%rbx),%rdi 0.00 : 6442de: 48 85 ff test %rdi,%rdi 0.00 : 6442e1: 74 05 je 6442e8 : hash_destroy(dbentry->functions); 0.00 : 6442e3: e8 18 04 14 00 callq 784700 : : dbentry->tables = NULL; 0.00 : 6442e8: 48 c7 83 b8 00 00 00 movq $0x0,0xb8(%rbx) 0.00 : 6442ef: 00 00 00 00 : dbentry->functions = NULL; 0.00 : 6442f3: 48 c7 83 c0 00 00 00 movq $0x0,0xc0(%rbx) 0.00 : 6442fa: 00 00 00 00 : : /* : * Reset database-level stats, too. This creates empty hash tables for : * tables and functions. : */ : reset_dbentry_counters(dbentry); 0.00 : 6442fe: 48 89 df mov %rbx,%rdi 0.00 : 644301: e8 7a ca ff ff callq 640d80 0.00 : 644306: e9 da f9 ff ff jmpq 643ce5 : PgStat_StatDBEntry *dbentry; : PgStat_StatFuncEntry *funcentry; : int i; : bool found; : : dbentry = pgstat_get_db_entry(msg->m_databaseid, true); 0.00 : 64430b: 8b bd e8 fb ff ff mov -0x418(%rbp),%edi 0.00 : 644311: be 01 00 00 00 mov $0x1,%esi 0.00 : 644316: e8 f5 cb ff ff callq 640f10 : : /* : * Process all function entries in the message. : */ : for (i = 0; i < msg->m_nentries; i++, funcmsg++) 0.00 : 64431b: 44 8b 8d ec fb ff ff mov -0x414(%rbp),%r9d : PgStat_StatDBEntry *dbentry; : PgStat_StatFuncEntry *funcentry; : int i; : bool found; : : dbentry = pgstat_get_db_entry(msg->m_databaseid, true); 0.00 : 644322: 49 89 c6 mov %rax,%r14 : : /* : * Process all function entries in the message. : */ : for (i = 0; i < msg->m_nentries; i++, funcmsg++) 0.00 : 644325: 45 85 c9 test %r9d,%r9d 0.00 : 644328: 0f 8e b7 f9 ff ff jle 643ce5 0.00 : 64432e: 48 8b 9d d0 f7 ff ff mov -0x830(%rbp),%rbx 0.00 : 644335: 45 31 e4 xor %r12d,%r12d 0.00 : 644338: eb 2d jmp 644367 : { : /* : * If it's a new function entry, initialize counters to the values : * we just got. : */ : funcentry->f_numcalls = funcmsg->f_numcalls; 0.00 : 64433a: 48 8b 43 08 mov 0x8(%rbx),%rax 0.00 : 64433e: 48 89 42 08 mov %rax,0x8(%rdx) : funcentry->f_total_time = funcmsg->f_total_time; 0.00 : 644342: 48 8b 43 10 mov 0x10(%rbx),%rax 0.00 : 644346: 48 89 42 10 mov %rax,0x10(%rdx) : funcentry->f_self_time = funcmsg->f_self_time; 0.00 : 64434a: 48 8b 43 18 mov 0x18(%rbx),%rax 0.00 : 64434e: 48 89 42 18 mov %rax,0x18(%rdx) : dbentry = pgstat_get_db_entry(msg->m_databaseid, true); : : /* : * Process all function entries in the message. : */ : for (i = 0; i < msg->m_nentries; i++, funcmsg++) 0.00 : 644352: 41 83 c4 01 add $0x1,%r12d 0.00 : 644356: 44 3b a5 ec fb ff ff cmp -0x414(%rbp),%r12d 0.00 : 64435d: 0f 8d 82 f9 ff ff jge 643ce5 0.00 : 644363: 48 83 c3 20 add $0x20,%rbx : { : funcentry = (PgStat_StatFuncEntry *) hash_search(dbentry->functions, 0.00 : 644367: 49 8b be c0 00 00 00 mov 0xc0(%r14),%rdi 0.00 : 64436e: 48 8d 4d cc lea -0x34(%rbp),%rcx 0.00 : 644372: ba 01 00 00 00 mov $0x1,%edx 0.00 : 644377: 48 89 de mov %rbx,%rsi 0.00 : 64437a: e8 21 03 14 00 callq 7846a0 : (void *) &(funcmsg->f_id), : HASH_ENTER, &found); : : if (!found) 0.00 : 64437f: 80 7d cc 00 cmpb $0x0,-0x34(%rbp) : /* : * Process all function entries in the message. : */ : for (i = 0; i < msg->m_nentries; i++, funcmsg++) : { : funcentry = (PgStat_StatFuncEntry *) hash_search(dbentry->functions, 0.00 : 644383: 48 89 c2 mov %rax,%rdx : (void *) &(funcmsg->f_id), : HASH_ENTER, &found); : : if (!found) 0.00 : 644386: 74 b2 je 64433a : else : { : /* : * Otherwise add the values to the existing entry. : */ : funcentry->f_numcalls += funcmsg->f_numcalls; 0.00 : 644388: 48 8b 43 08 mov 0x8(%rbx),%rax 0.00 : 64438c: 48 01 42 08 add %rax,0x8(%rdx) : funcentry->f_total_time += funcmsg->f_total_time; 0.00 : 644390: 48 8b 43 10 mov 0x10(%rbx),%rax 0.00 : 644394: 48 01 42 10 add %rax,0x10(%rdx) : funcentry->f_self_time += funcmsg->f_self_time; 0.00 : 644398: 48 8b 43 18 mov 0x18(%rbx),%rax 0.00 : 64439c: 48 01 42 18 add %rax,0x18(%rdx) 0.00 : 6443a0: eb b0 jmp 644352 : pgstat_recv_funcpurge(PgStat_MsgFuncpurge *msg, int len) : { : PgStat_StatDBEntry *dbentry; : int i; : : dbentry = pgstat_get_db_entry(msg->m_databaseid, false); 0.00 : 6443a2: 8b bd e8 fb ff ff mov -0x418(%rbp),%edi 0.00 : 6443a8: 31 f6 xor %esi,%esi 0.00 : 6443aa: e8 61 cb ff ff callq 640f10 : : /* : * No need to purge if we don't even know the database. : */ : if (!dbentry || !dbentry->functions) 0.00 : 6443af: 48 85 c0 test %rax,%rax : pgstat_recv_funcpurge(PgStat_MsgFuncpurge *msg, int len) : { : PgStat_StatDBEntry *dbentry; : int i; : : dbentry = pgstat_get_db_entry(msg->m_databaseid, false); 0.00 : 6443b2: 49 89 c4 mov %rax,%r12 : : /* : * No need to purge if we don't even know the database. : */ : if (!dbentry || !dbentry->functions) 0.00 : 6443b5: 0f 84 2a f9 ff ff je 643ce5 0.00 : 6443bb: 48 8b b8 c0 00 00 00 mov 0xc0(%rax),%rdi 0.00 : 6443c2: 48 85 ff test %rdi,%rdi 0.00 : 6443c5: 0f 84 1a f9 ff ff je 643ce5 : return; : : /* : * Process all function entries in the message. : */ : for (i = 0; i < msg->m_nentries; i++) 0.00 : 6443cb: 44 8b 85 ec fb ff ff mov -0x414(%rbp),%r8d 0.00 : 6443d2: 45 85 c0 test %r8d,%r8d 0.00 : 6443d5: 0f 8e 0a f9 ff ff jle 643ce5 0.00 : 6443db: 31 db xor %ebx,%ebx 0.00 : 6443dd: eb 09 jmp 6443e8 0.00 : 6443df: 90 nop 0.00 : 6443e0: 49 8b bc 24 c0 00 00 mov 0xc0(%r12),%rdi 0.00 : 6443e7: 00 : { : /* Remove from hashtable if present; we don't care if it's not. */ : (void) hash_search(dbentry->functions, 0.00 : 6443e8: 48 63 f3 movslq %ebx,%rsi 0.00 : 6443eb: 31 c9 xor %ecx,%ecx 0.00 : 6443ed: ba 02 00 00 00 mov $0x2,%edx 0.00 : 6443f2: 49 8d 74 b5 10 lea 0x10(%r13,%rsi,4),%rsi : return; : : /* : * Process all function entries in the message. : */ : for (i = 0; i < msg->m_nentries; i++) 0.00 : 6443f7: 83 c3 01 add $0x1,%ebx : { : /* Remove from hashtable if present; we don't care if it's not. */ : (void) hash_search(dbentry->functions, 0.00 : 6443fa: e8 a1 02 14 00 callq 7846a0 : return; : : /* : * Process all function entries in the message. : */ : for (i = 0; i < msg->m_nentries; i++) 0.00 : 6443ff: 3b 9d ec fb ff ff cmp -0x414(%rbp),%ebx 0.00 : 644405: 7c d9 jl 6443e0 0.00 : 644407: e9 d9 f8 ff ff jmpq 643ce5 : static void : pgstat_recv_recoveryconflict(PgStat_MsgRecoveryConflict *msg, int len) : { : PgStat_StatDBEntry *dbentry; : : dbentry = pgstat_get_db_entry(msg->m_databaseid, true); 0.00 : 64440c: 8b bd e8 fb ff ff mov -0x418(%rbp),%edi 0.00 : 644412: be 01 00 00 00 mov $0x1,%esi 0.00 : 644417: e8 f4 ca ff ff callq 640f10 0.00 : 64441c: 48 89 c2 mov %rax,%rdx : : switch (msg->m_reason) 0.00 : 64441f: 8b 85 ec fb ff ff mov -0x414(%rbp),%eax 0.00 : 644425: 83 e8 03 sub $0x3,%eax 0.00 : 644428: 83 f8 04 cmp $0x4,%eax 0.00 : 64442b: 0f 87 b4 f8 ff ff ja 643ce5 0.00 : 644431: 89 c0 mov %eax,%eax 0.00 : 644433: ff 24 c5 10 f8 89 00 jmpq *0x89f810(,%rax,8) : static void : pgstat_recv_tempfile(PgStat_MsgTempFile *msg, int len) : { : PgStat_StatDBEntry *dbentry; : : dbentry = pgstat_get_db_entry(msg->m_databaseid, true); 0.00 : 64443a: 41 8b 7d 08 mov 0x8(%r13),%edi 0.00 : 64443e: be 01 00 00 00 mov $0x1,%esi 0.00 : 644443: e8 c8 ca ff ff callq 640f10 : : dbentry->n_temp_bytes += msg->m_filesize; 0.00 : 644448: 49 8b 55 10 mov 0x10(%r13),%rdx : dbentry->n_temp_files += 1; 0.00 : 64444c: 48 83 80 80 00 00 00 addq $0x1,0x80(%rax) 0.00 : 644453: 01 : { : PgStat_StatDBEntry *dbentry; : : dbentry = pgstat_get_db_entry(msg->m_databaseid, true); : : dbentry->n_temp_bytes += msg->m_filesize; 0.00 : 644454: 48 01 90 88 00 00 00 add %rdx,0x88(%rax) 0.00 : 64445b: e9 85 f8 ff ff jmpq 643ce5 : * ---------- : */ : static void : pgstat_recv_archiver(PgStat_MsgArchiver *msg, int len) : { : if (msg->m_failed) 0.00 : 644460: 80 bd e8 fb ff ff 00 cmpb $0x0,-0x418(%rbp) 0.00 : 644467: 0f 84 1f 03 00 00 je 64478c : { : /* Failed archival attempt */ : ++archiverStats.failed_count; : memcpy(archiverStats.last_failed_wal, msg->m_xlog, 0.00 : 64446d: 48 8b 95 c8 f7 ff ff mov -0x838(%rbp),%rdx : pgstat_recv_archiver(PgStat_MsgArchiver *msg, int len) : { : if (msg->m_failed) : { : /* Failed archival attempt */ : ++archiverStats.failed_count; 0.00 : 644474: 48 83 05 e4 79 53 00 addq $0x1,0x5379e4(%rip) # b7be60 0.00 : 64447b: 01 : memcpy(archiverStats.last_failed_wal, msg->m_xlog, 0.00 : 64447c: 48 8b 02 mov (%rdx),%rax 0.00 : 64447f: 48 89 05 e2 79 53 00 mov %rax,0x5379e2(%rip) # b7be68 0.00 : 644486: 48 8b 42 08 mov 0x8(%rdx),%rax 0.00 : 64448a: 48 89 05 df 79 53 00 mov %rax,0x5379df(%rip) # b7be70 0.00 : 644491: 48 8b 42 10 mov 0x10(%rdx),%rax 0.00 : 644495: 48 89 05 dc 79 53 00 mov %rax,0x5379dc(%rip) # b7be78 0.00 : 64449c: 48 8b 42 18 mov 0x18(%rdx),%rax 0.00 : 6444a0: 48 89 05 d9 79 53 00 mov %rax,0x5379d9(%rip) # b7be80 0.00 : 6444a7: 48 8b 42 20 mov 0x20(%rdx),%rax 0.00 : 6444ab: 48 89 05 d6 79 53 00 mov %rax,0x5379d6(%rip) # b7be88 0.00 : 6444b2: 0f b6 42 28 movzbl 0x28(%rdx),%eax 0.00 : 6444b6: 88 05 d4 79 53 00 mov %al,0x5379d4(%rip) # b7be90 : sizeof(archiverStats.last_failed_wal)); : archiverStats.last_failed_timestamp = msg->m_timestamp; 0.00 : 6444bc: 48 8b 85 18 fc ff ff mov -0x3e8(%rbp),%rax 0.00 : 6444c3: 48 89 05 ce 79 53 00 mov %rax,0x5379ce(%rip) # b7be98 0.00 : 6444ca: e9 16 f8 ff ff jmpq 643ce5 : * ---------- : */ : static void : pgstat_recv_bgwriter(PgStat_MsgBgWriter *msg, int len) : { : globalStats.timed_checkpoints += msg->m_timed_checkpoints; /home/Computational/mark/src/postgres-andres/src/backend/postmaster/pgstat.c:5014 50.00 : 6444cf: 48 8b 85 e8 fb ff ff mov -0x418(%rbp),%rax 0.00 : 6444d6: 48 01 05 eb 79 53 00 add %rax,0x5379eb(%rip) # b7bec8 : globalStats.requested_checkpoints += msg->m_requested_checkpoints; /home/Computational/mark/src/postgres-andres/src/backend/postmaster/pgstat.c:5015 50.00 : 6444dd: 48 8b 85 f0 fb ff ff mov -0x410(%rbp),%rax 0.00 : 6444e4: 48 01 05 e5 79 53 00 add %rax,0x5379e5(%rip) # b7bed0 : globalStats.checkpoint_write_time += msg->m_checkpoint_write_time; 0.00 : 6444eb: 48 8b 85 28 fc ff ff mov -0x3d8(%rbp),%rax 0.00 : 6444f2: 48 01 05 df 79 53 00 add %rax,0x5379df(%rip) # b7bed8 : globalStats.checkpoint_sync_time += msg->m_checkpoint_sync_time; 0.00 : 6444f9: 48 8b 85 30 fc ff ff mov -0x3d0(%rbp),%rax 0.00 : 644500: 48 01 05 d9 79 53 00 add %rax,0x5379d9(%rip) # b7bee0 : globalStats.buf_written_checkpoints += msg->m_buf_written_checkpoints; 0.00 : 644507: 48 8b 85 f8 fb ff ff mov -0x408(%rbp),%rax 0.00 : 64450e: 48 01 05 d3 79 53 00 add %rax,0x5379d3(%rip) # b7bee8 : globalStats.buf_written_clean += msg->m_buf_written_clean; 0.00 : 644515: 48 8b 85 00 fc ff ff mov -0x400(%rbp),%rax 0.00 : 64451c: 48 01 05 cd 79 53 00 add %rax,0x5379cd(%rip) # b7bef0 : globalStats.maxwritten_clean += msg->m_maxwritten_clean; 0.00 : 644523: 48 8b 85 08 fc ff ff mov -0x3f8(%rbp),%rax 0.00 : 64452a: 48 01 05 c7 79 53 00 add %rax,0x5379c7(%rip) # b7bef8 : globalStats.buf_written_backend += msg->m_buf_written_backend; 0.00 : 644531: 48 8b 85 10 fc ff ff mov -0x3f0(%rbp),%rax 0.00 : 644538: 48 01 05 c1 79 53 00 add %rax,0x5379c1(%rip) # b7bf00 : globalStats.buf_fsync_backend += msg->m_buf_fsync_backend; 0.00 : 64453f: 48 8b 85 18 fc ff ff mov -0x3e8(%rbp),%rax 0.00 : 644546: 48 01 05 bb 79 53 00 add %rax,0x5379bb(%rip) # b7bf08 : globalStats.buf_alloc += msg->m_buf_alloc; 0.00 : 64454d: 48 8b 85 20 fc ff ff mov -0x3e0(%rbp),%rax 0.00 : 644554: 48 01 05 b5 79 53 00 add %rax,0x5379b5(%rip) # b7bf10 : pgstat_recv_archiver((PgStat_MsgArchiver *) &msg, len); : break; : : case PGSTAT_MTYPE_BGWRITER: : pgstat_recv_bgwriter((PgStat_MsgBgWriter *) &msg, len); : break; 0.00 : 64455b: e9 85 f7 ff ff jmpq 643ce5 : pgstat_recv_tabpurge(PgStat_MsgTabpurge *msg, int len) : { : PgStat_StatDBEntry *dbentry; : int i; : : dbentry = pgstat_get_db_entry(msg->m_databaseid, false); 0.00 : 644560: 8b bd e8 fb ff ff mov -0x418(%rbp),%edi 0.00 : 644566: 31 f6 xor %esi,%esi 0.00 : 644568: e8 a3 c9 ff ff callq 640f10 : : /* : * No need to purge if we don't even know the database. : */ : if (!dbentry || !dbentry->tables) 0.00 : 64456d: 48 85 c0 test %rax,%rax : pgstat_recv_tabpurge(PgStat_MsgTabpurge *msg, int len) : { : PgStat_StatDBEntry *dbentry; : int i; : : dbentry = pgstat_get_db_entry(msg->m_databaseid, false); 0.00 : 644570: 49 89 c4 mov %rax,%r12 : : /* : * No need to purge if we don't even know the database. : */ : if (!dbentry || !dbentry->tables) 0.00 : 644573: 0f 84 6c f7 ff ff je 643ce5 0.00 : 644579: 48 8b b8 b8 00 00 00 mov 0xb8(%rax),%rdi 0.00 : 644580: 48 85 ff test %rdi,%rdi 0.00 : 644583: 0f 84 5c f7 ff ff je 643ce5 : return; : : /* : * Process all table entries in the message. : */ : for (i = 0; i < msg->m_nentries; i++) 0.00 : 644589: 44 8b 95 ec fb ff ff mov -0x414(%rbp),%r10d 0.00 : 644590: 45 85 d2 test %r10d,%r10d 0.00 : 644593: 0f 8e 4c f7 ff ff jle 643ce5 0.00 : 644599: 31 db xor %ebx,%ebx 0.00 : 64459b: eb 0b jmp 6445a8 0.00 : 64459d: 0f 1f 00 nopl (%rax) 0.00 : 6445a0: 49 8b bc 24 b8 00 00 mov 0xb8(%r12),%rdi 0.00 : 6445a7: 00 : { : /* Remove from hashtable if present; we don't care if it's not. */ : (void) hash_search(dbentry->tables, 0.00 : 6445a8: 48 63 f3 movslq %ebx,%rsi 0.00 : 6445ab: 31 c9 xor %ecx,%ecx 0.00 : 6445ad: ba 02 00 00 00 mov $0x2,%edx 0.00 : 6445b2: 49 8d 74 b5 10 lea 0x10(%r13,%rsi,4),%rsi : return; : : /* : * Process all table entries in the message. : */ : for (i = 0; i < msg->m_nentries; i++) 0.00 : 6445b7: 83 c3 01 add $0x1,%ebx : { : /* Remove from hashtable if present; we don't care if it's not. */ : (void) hash_search(dbentry->tables, 0.00 : 6445ba: e8 e1 00 14 00 callq 7846a0 : return; : : /* : * Process all table entries in the message. : */ : for (i = 0; i < msg->m_nentries; i++) 0.00 : 6445bf: 3b 9d ec fb ff ff cmp -0x414(%rbp),%ebx 0.00 : 6445c5: 7c d9 jl 6445a0 0.00 : 6445c7: e9 19 f7 ff ff jmpq 643ce5 : * ---------- : */ : static void : pgstat_recv_dropdb(PgStat_MsgDropdb *msg, int len) : { : Oid dbid = msg->m_databaseid; 0.00 : 6445cc: 8b bd e8 fb ff ff mov -0x418(%rbp),%edi : PgStat_StatDBEntry *dbentry; : : /* : * Lookup the database in the hashtable. : */ : dbentry = pgstat_get_db_entry(dbid, false); 0.00 : 6445d2: 31 f6 xor %esi,%esi : * ---------- : */ : static void : pgstat_recv_dropdb(PgStat_MsgDropdb *msg, int len) : { : Oid dbid = msg->m_databaseid; 0.00 : 6445d4: 89 7d cc mov %edi,-0x34(%rbp) : PgStat_StatDBEntry *dbentry; : : /* : * Lookup the database in the hashtable. : */ : dbentry = pgstat_get_db_entry(dbid, false); 0.00 : 6445d7: e8 34 c9 ff ff callq 640f10 : : /* : * If found, remove it (along with the db statfile). : */ : if (dbentry) 0.00 : 6445dc: 48 85 c0 test %rax,%rax : PgStat_StatDBEntry *dbentry; : : /* : * Lookup the database in the hashtable. : */ : dbentry = pgstat_get_db_entry(dbid, false); 0.00 : 6445df: 48 89 c3 mov %rax,%rbx : : /* : * If found, remove it (along with the db statfile). : */ : if (dbentry) 0.00 : 6445e2: 0f 84 fd f6 ff ff je 643ce5 : { : char statfile[MAXPGPATH]; : : get_dbstat_filename(false, false, dbid, statfile, MAXPGPATH); 0.00 : 6445e8: 8b 55 cc mov -0x34(%rbp),%edx 0.00 : 6445eb: 48 8d 8d e0 f7 ff ff lea -0x820(%rbp),%rcx 0.00 : 6445f2: 41 b8 00 04 00 00 mov $0x400,%r8d 0.00 : 6445f8: 31 f6 xor %esi,%esi 0.00 : 6445fa: 31 ff xor %edi,%edi 0.00 : 6445fc: e8 7f ca ff ff callq 641080 : : elog(DEBUG2, "removing %s", statfile); 0.00 : 644601: ba a0 f9 89 00 mov $0x89f9a0,%edx 0.00 : 644606: be a5 12 00 00 mov $0x12a5,%esi 0.00 : 64460b: bf 88 ef 89 00 mov $0x89ef88,%edi 0.00 : 644610: e8 0b 6e 13 00 callq 77b420 0.00 : 644615: 48 8d 95 e0 f7 ff ff lea -0x820(%rbp),%rdx 0.00 : 64461c: 31 c0 xor %eax,%eax 0.00 : 64461e: be ad f0 89 00 mov $0x89f0ad,%esi 0.00 : 644623: bf 0d 00 00 00 mov $0xd,%edi 0.00 : 644628: e8 03 6c 13 00 callq 77b230 : unlink(statfile); 0.00 : 64462d: 48 8d bd e0 f7 ff ff lea -0x820(%rbp),%rdi 0.00 : 644634: e8 77 50 e2 ff callq 4696b0 : : if (dbentry->tables != NULL) 0.00 : 644639: 48 8b bb b8 00 00 00 mov 0xb8(%rbx),%rdi 0.00 : 644640: 48 85 ff test %rdi,%rdi 0.00 : 644643: 74 05 je 64464a : hash_destroy(dbentry->tables); 0.00 : 644645: e8 b6 00 14 00 callq 784700 : if (dbentry->functions != NULL) 0.00 : 64464a: 48 8b bb c0 00 00 00 mov 0xc0(%rbx),%rdi 0.00 : 644651: 48 85 ff test %rdi,%rdi 0.00 : 644654: 74 05 je 64465b : hash_destroy(dbentry->functions); 0.00 : 644656: e8 a5 00 14 00 callq 784700 : : if (hash_search(pgStatDBHash, 0.00 : 64465b: 48 8b 3d 76 75 53 00 mov 0x537576(%rip),%rdi # b7bbd8 0.00 : 644662: 48 8d 75 cc lea -0x34(%rbp),%rsi 0.00 : 644666: 31 c9 xor %ecx,%ecx 0.00 : 644668: ba 02 00 00 00 mov $0x2,%edx 0.00 : 64466d: e8 2e 00 14 00 callq 7846a0 0.00 : 644672: 48 85 c0 test %rax,%rax 0.00 : 644675: 0f 85 6a f6 ff ff jne 643ce5 : (void *) &dbid, : HASH_REMOVE, NULL) == NULL) : ereport(ERROR, 0.00 : 64467b: 45 31 c0 xor %r8d,%r8d 0.00 : 64467e: b9 a0 f9 89 00 mov $0x89f9a0,%ecx 0.00 : 644683: ba b1 12 00 00 mov $0x12b1,%edx 0.00 : 644688: be 88 ef 89 00 mov $0x89ef88,%esi 0.00 : 64468d: bf 14 00 00 00 mov $0x14,%edi 0.00 : 644692: e8 29 64 13 00 callq 77aac0 0.00 : 644697: 84 c0 test %al,%al 0.00 : 644699: 0f 84 07 f7 ff ff je 643da6 0.00 : 64469f: bf 00 f4 89 00 mov $0x89f400,%edi 0.00 : 6446a4: 31 c0 xor %eax,%eax 0.00 : 6446a6: e8 f5 81 13 00 callq 77c8a0 0.00 : 6446ab: 89 c7 mov %eax,%edi 0.00 : 6446ad: 31 c0 xor %eax,%eax 0.00 : 6446af: e8 2c 5f 13 00 callq 77a5e0 0.00 : 6446b4: e9 ed f6 ff ff jmpq 643da6 0.00 : 6446b9: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : static void : pgstat_recv_resetsinglecounter(PgStat_MsgResetsinglecounter *msg, int len) : { : PgStat_StatDBEntry *dbentry; : : dbentry = pgstat_get_db_entry(msg->m_databaseid, false); 0.00 : 6446c0: 8b bd e8 fb ff ff mov -0x418(%rbp),%edi 0.00 : 6446c6: 31 f6 xor %esi,%esi 0.00 : 6446c8: e8 43 c8 ff ff callq 640f10 : : if (!dbentry) 0.00 : 6446cd: 48 85 c0 test %rax,%rax : static void : pgstat_recv_resetsinglecounter(PgStat_MsgResetsinglecounter *msg, int len) : { : PgStat_StatDBEntry *dbentry; : : dbentry = pgstat_get_db_entry(msg->m_databaseid, false); 0.00 : 6446d0: 48 89 c3 mov %rax,%rbx : : if (!dbentry) 0.00 : 6446d3: 0f 84 0c f6 ff ff je 643ce5 : return; : : /* Set the reset timestamp for the whole database */ : dbentry->stat_reset_timestamp = GetCurrentTimestamp(); 0.00 : 6446d9: e8 92 1c 10 00 callq 746370 0.00 : 6446de: 48 89 83 a8 00 00 00 mov %rax,0xa8(%rbx) : : /* Remove object if it exists, ignore it if not */ : if (msg->m_resettype == RESET_TABLE) 0.00 : 6446e5: 8b 85 ec fb ff ff mov -0x414(%rbp),%eax 0.00 : 6446eb: 85 c0 test %eax,%eax 0.00 : 6446ed: 0f 84 a5 01 00 00 je 644898 : (void) hash_search(dbentry->tables, (void *) &(msg->m_objectid), : HASH_REMOVE, NULL); : else if (msg->m_resettype == RESET_FUNCTION) 0.00 : 6446f3: 83 e8 01 sub $0x1,%eax 0.00 : 6446f6: 0f 85 e9 f5 ff ff jne 643ce5 : (void) hash_search(dbentry->functions, (void *) &(msg->m_objectid), 0.00 : 6446fc: 48 8b bb c0 00 00 00 mov 0xc0(%rbx),%rdi 0.00 : 644703: 48 8b b5 d0 f7 ff ff mov -0x830(%rbp),%rsi 0.00 : 64470a: 31 c9 xor %ecx,%ecx 0.00 : 64470c: ba 02 00 00 00 mov $0x2,%edx 0.00 : 644711: e8 8a ff 13 00 callq 7846a0 0.00 : 644716: e9 ca f5 ff ff jmpq 643ce5 : PgStat_StatDBEntry *dbentry; : : /* : * Store the last autovacuum time in the database's hashtable entry. : */ : dbentry = pgstat_get_db_entry(msg->m_databaseid, true); 0.00 : 64471b: 8b bd e8 fb ff ff mov -0x418(%rbp),%edi 0.00 : 644721: be 01 00 00 00 mov $0x1,%esi 0.00 : 644726: e8 e5 c7 ff ff callq 640f10 : : dbentry->last_autovac_time = msg->m_start_time; 0.00 : 64472b: 48 8b 95 f0 fb ff ff mov -0x410(%rbp),%rdx 0.00 : 644732: 48 89 50 50 mov %rdx,0x50(%rax) : len); : break; : : case PGSTAT_MTYPE_AUTOVAC_START: : pgstat_recv_autovac((PgStat_MsgAutovacStart *) &msg, len); : break; 0.00 : 644736: e9 aa f5 ff ff jmpq 643ce5 : * ---------- : */ : static void : pgstat_recv_resetsharedcounter(PgStat_MsgResetsharedcounter *msg, int len) : { : if (msg->m_resettarget == RESET_BGWRITER) 0.00 : 64473b: 8b 85 e8 fb ff ff mov -0x418(%rbp),%eax 0.00 : 644741: 83 f8 01 cmp $0x1,%eax 0.00 : 644744: 0f 84 2e 01 00 00 je 644878 : { : /* Reset the global background writer statistics for the cluster. */ : memset(&globalStats, 0, sizeof(globalStats)); : globalStats.stat_reset_timestamp = GetCurrentTimestamp(); : } : else if (msg->m_resettarget == RESET_ARCHIVER) 0.00 : 64474a: 85 c0 test %eax,%eax 0.00 : 64474c: 0f 85 93 f5 ff ff jne 643ce5 : { : /* Reset the archiver statistics for the cluster. */ : memset(&archiverStats, 0, sizeof(archiverStats)); 0.00 : 644752: 31 c0 xor %eax,%eax 0.00 : 644754: bf 20 be b7 00 mov $0xb7be20,%edi 0.00 : 644759: b9 11 00 00 00 mov $0x11,%ecx 0.00 : 64475e: f3 48 ab rep stos %rax,%es:(%rdi) : archiverStats.stat_reset_timestamp = GetCurrentTimestamp(); 0.00 : 644761: e8 0a 1c 10 00 callq 746370 0.00 : 644766: 48 89 05 33 77 53 00 mov %rax,0x537733(%rip) # b7bea0 0.00 : 64476d: e9 73 f5 ff ff jmpq 643ce5 : DBWriteRequest *req = slist_container(DBWriteRequest, next, iter.cur); : : if (req->databaseid != msg->databaseid) : continue; : : if (msg->cutoff_time > req->request_time) 0.00 : 644772: 48 8b 85 f0 fb ff ff mov -0x410(%rbp),%rax 0.00 : 644779: 48 3b 42 08 cmp 0x8(%rdx),%rax 0.00 : 64477d: 0f 8e 62 f5 ff ff jle 643ce5 : req->request_time = msg->cutoff_time; 0.00 : 644783: 48 89 42 08 mov %rax,0x8(%rdx) 0.00 : 644787: e9 59 f5 ff ff jmpq 643ce5 : } : else : { : /* Successful archival operation */ : ++archiverStats.archived_count; : memcpy(archiverStats.last_archived_wal, msg->m_xlog, 0.00 : 64478c: 48 8b 95 c8 f7 ff ff mov -0x838(%rbp),%rdx : archiverStats.last_failed_timestamp = msg->m_timestamp; : } : else : { : /* Successful archival operation */ : ++archiverStats.archived_count; 0.00 : 644793: 48 83 05 85 76 53 00 addq $0x1,0x537685(%rip) # b7be20 0.00 : 64479a: 01 : memcpy(archiverStats.last_archived_wal, msg->m_xlog, 0.00 : 64479b: 48 8b 02 mov (%rdx),%rax 0.00 : 64479e: 48 89 05 83 76 53 00 mov %rax,0x537683(%rip) # b7be28 0.00 : 6447a5: 48 8b 42 08 mov 0x8(%rdx),%rax 0.00 : 6447a9: 48 89 05 80 76 53 00 mov %rax,0x537680(%rip) # b7be30 0.00 : 6447b0: 48 8b 42 10 mov 0x10(%rdx),%rax 0.00 : 6447b4: 48 89 05 7d 76 53 00 mov %rax,0x53767d(%rip) # b7be38 0.00 : 6447bb: 48 8b 42 18 mov 0x18(%rdx),%rax 0.00 : 6447bf: 48 89 05 7a 76 53 00 mov %rax,0x53767a(%rip) # b7be40 0.00 : 6447c6: 48 8b 42 20 mov 0x20(%rdx),%rax 0.00 : 6447ca: 48 89 05 77 76 53 00 mov %rax,0x537677(%rip) # b7be48 0.00 : 6447d1: 0f b6 42 28 movzbl 0x28(%rdx),%eax 0.00 : 6447d5: 88 05 75 76 53 00 mov %al,0x537675(%rip) # b7be50 : sizeof(archiverStats.last_archived_wal)); : archiverStats.last_archived_timestamp = msg->m_timestamp; 0.00 : 6447db: 48 8b 85 18 fc ff ff mov -0x3e8(%rbp),%rax 0.00 : 6447e2: 48 89 05 6f 76 53 00 mov %rax,0x53766f(%rip) # b7be58 0.00 : 6447e9: e9 f7 f4 ff ff jmpq 643ce5 : tabentry->autovac_analyze_timestamp = msg->m_analyzetime; : tabentry->autovac_analyze_count++; : } : else : { : tabentry->analyze_timestamp = msg->m_analyzetime; 0.00 : 6447ee: 48 8b 85 f8 fb ff ff mov -0x408(%rbp),%rax : tabentry->analyze_count++; 0.00 : 6447f5: 48 83 82 90 00 00 00 addq $0x1,0x90(%rdx) 0.00 : 6447fc: 01 : tabentry->autovac_analyze_timestamp = msg->m_analyzetime; : tabentry->autovac_analyze_count++; : } : else : { : tabentry->analyze_timestamp = msg->m_analyzetime; 0.00 : 6447fd: 48 89 82 88 00 00 00 mov %rax,0x88(%rdx) 0.00 : 644804: e9 dc f4 ff ff jmpq 643ce5 : tabentry->autovac_vacuum_timestamp = msg->m_vacuumtime; : tabentry->autovac_vacuum_count++; : } : else : { : tabentry->vacuum_timestamp = msg->m_vacuumtime; 0.00 : 644809: 48 8b 85 f8 fb ff ff mov -0x408(%rbp),%rax : tabentry->vacuum_count++; 0.00 : 644810: 48 83 42 70 01 addq $0x1,0x70(%rdx) : tabentry->autovac_vacuum_timestamp = msg->m_vacuumtime; : tabentry->autovac_vacuum_count++; : } : else : { : tabentry->vacuum_timestamp = msg->m_vacuumtime; 0.00 : 644815: 48 89 42 68 mov %rax,0x68(%rdx) 0.00 : 644819: e9 c7 f4 ff ff jmpq 643ce5 : break; : case PROCSIG_RECOVERY_CONFLICT_SNAPSHOT: : dbentry->n_conflict_snapshot++; : break; : case PROCSIG_RECOVERY_CONFLICT_BUFFERPIN: : dbentry->n_conflict_bufferpin++; 0.00 : 64481e: 48 83 42 70 01 addq $0x1,0x70(%rdx) 0.00 : 644823: e9 bd f4 ff ff jmpq 643ce5 : break; : case PROCSIG_RECOVERY_CONFLICT_LOCK: : dbentry->n_conflict_lock++; : break; : case PROCSIG_RECOVERY_CONFLICT_SNAPSHOT: : dbentry->n_conflict_snapshot++; 0.00 : 644828: 48 83 42 68 01 addq $0x1,0x68(%rdx) 0.00 : 64482d: e9 b3 f4 ff ff jmpq 643ce5 : break; : case PROCSIG_RECOVERY_CONFLICT_TABLESPACE: : dbentry->n_conflict_tablespace++; : break; : case PROCSIG_RECOVERY_CONFLICT_LOCK: : dbentry->n_conflict_lock++; 0.00 : 644832: 48 83 42 60 01 addq $0x1,0x60(%rdx) 0.00 : 644837: e9 a9 f4 ff ff jmpq 643ce5 : * Since we drop the information about the database as soon as it : * replicates, there is no point in counting these conflicts. : */ : break; : case PROCSIG_RECOVERY_CONFLICT_TABLESPACE: : dbentry->n_conflict_tablespace++; 0.00 : 64483c: 48 83 42 58 01 addq $0x1,0x58(%rdx) 0.00 : 644841: e9 9f f4 ff ff jmpq 643ce5 : break; : case PROCSIG_RECOVERY_CONFLICT_BUFFERPIN: : dbentry->n_conflict_bufferpin++; : break; : case PROCSIG_RECOVERY_CONFLICT_STARTUP_DEADLOCK: : dbentry->n_conflict_startup_deadlock++; 0.00 : 644846: 48 83 42 78 01 addq $0x1,0x78(%rdx) 0.00 : 64484b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 644850: e9 90 f4 ff ff jmpq 643ce5 : : if (len < 0) : { : if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) : break; /* out of inner loop */ : ereport(ERROR, 0.00 : 644855: bf 98 f3 89 00 mov $0x89f398,%edi 0.00 : 64485a: 31 c0 xor %eax,%eax 0.00 : 64485c: e8 3f 80 13 00 callq 77c8a0 0.00 : 644861: 89 c3 mov %eax,%ebx 0.00 : 644863: e8 e8 81 13 00 callq 77ca50 0.00 : 644868: 89 de mov %ebx,%esi 0.00 : 64486a: 89 c7 mov %eax,%edi 0.00 : 64486c: 31 c0 xor %eax,%eax 0.00 : 64486e: e8 6d 5d 13 00 callq 77a5e0 0.00 : 644873: e9 2e f5 ff ff jmpq 643da6 : pgstat_recv_resetsharedcounter(PgStat_MsgResetsharedcounter *msg, int len) : { : if (msg->m_resettarget == RESET_BGWRITER) : { : /* Reset the global background writer statistics for the cluster. */ : memset(&globalStats, 0, sizeof(globalStats)); 0.00 : 644878: 31 c0 xor %eax,%eax 0.00 : 64487a: b9 0c 00 00 00 mov $0xc,%ecx 0.00 : 64487f: bf c0 be b7 00 mov $0xb7bec0,%edi 0.00 : 644884: f3 48 ab rep stos %rax,%es:(%rdi) : globalStats.stat_reset_timestamp = GetCurrentTimestamp(); 0.00 : 644887: e8 e4 1a 10 00 callq 746370 0.00 : 64488c: 48 89 05 85 76 53 00 mov %rax,0x537685(%rip) # b7bf18 0.00 : 644893: e9 4d f4 ff ff jmpq 643ce5 : /* Set the reset timestamp for the whole database */ : dbentry->stat_reset_timestamp = GetCurrentTimestamp(); : : /* Remove object if it exists, ignore it if not */ : if (msg->m_resettype == RESET_TABLE) : (void) hash_search(dbentry->tables, (void *) &(msg->m_objectid), 0.00 : 644898: 48 8b bb b8 00 00 00 mov 0xb8(%rbx),%rdi 0.00 : 64489f: 48 8b b5 d0 f7 ff ff mov -0x830(%rbp),%rsi 0.00 : 6448a6: 31 c9 xor %ecx,%ecx 0.00 : 6448a8: ba 02 00 00 00 mov $0x2,%edx 0.00 : 6448ad: e8 ee fd 13 00 callq 7846a0 0.00 : 6448b2: e9 2e f4 ff ff jmpq 643ce5 : * child processes, but for consistency we make all postmaster child : * processes do this.) : */ : #ifdef HAVE_SETSID : if (setsid() < 0) : elog(FATAL, "setsid() failed: %m"); 0.00 : 6448b7: ba 60 f9 89 00 mov $0x89f960,%edx 0.00 : 6448bc: be 60 0c 00 00 mov $0xc60,%esi 0.00 : 6448c1: bf 88 ef 89 00 mov $0x89ef88,%edi 0.00 : 6448c6: e8 55 6b 13 00 callq 77b420 0.00 : 6448cb: be 83 fe 7b 00 mov $0x7bfe83,%esi 0.00 : 6448d0: bf 15 00 00 00 mov $0x15,%edi 0.00 : 6448d5: 31 c0 xor %eax,%eax 0.00 : 6448d7: e8 54 69 13 00 callq 77b230 0.00 : 6448dc: e8 ef 4b e2 ff callq 4694d0 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 50.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:3329 50.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:3335 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000006741d0 : : * be 0, or BM_VALID if we just finished reading in the page. : */ : static void : TerminateBufferIO(volatile BufferDesc *buf, bool clear_dirty, : int set_flag_bits) : { 0.00 : 6741d0: 55 push %rbp : static __inline__ int : tas(volatile slock_t *lock) : { : register slock_t _res = 1; : : __asm__ __volatile__( 0.00 : 6741d1: b8 01 00 00 00 mov $0x1,%eax 0.00 : 6741d6: 48 89 e5 mov %rsp,%rbp 0.00 : 6741d9: 48 89 5d e8 mov %rbx,-0x18(%rbp) 0.00 : 6741dd: 4c 89 65 f0 mov %r12,-0x10(%rbp) 0.00 : 6741e1: 48 89 fb mov %rdi,%rbx 0.00 : 6741e4: 4c 89 6d f8 mov %r13,-0x8(%rbp) 0.00 : 6741e8: 41 89 f4 mov %esi,%r12d 0.00 : 6741eb: 48 83 ec 20 sub $0x20,%rsp 0.00 : 6741ef: 41 89 d5 mov %edx,%r13d : Assert(buf == InProgressBuf); : : LockBufHdr(buf); 0.00 : 6741f2: 48 8d 7f 20 lea 0x20(%rdi),%rdi 0.00 : 6741f6: f0 86 07 lock xchg %al,(%rdi) /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:3329 50.00 : 6741f9: 84 c0 test %al,%al 0.00 : 6741fb: 75 53 jne 674250 : : Assert(buf->flags & BM_IO_IN_PROGRESS); : buf->flags &= ~(BM_IO_IN_PROGRESS | BM_IO_ERROR); 0.00 : 6741fd: 0f b7 43 14 movzwl 0x14(%rbx),%eax 0.00 : 674201: 83 e0 e7 and $0xffffffe7,%eax : if (clear_dirty && !(buf->flags & BM_JUST_DIRTIED)) 0.00 : 674204: 45 84 e4 test %r12b,%r12b : Assert(buf == InProgressBuf); : : LockBufHdr(buf); : : Assert(buf->flags & BM_IO_IN_PROGRESS); : buf->flags &= ~(BM_IO_IN_PROGRESS | BM_IO_ERROR); 0.00 : 674207: 66 89 43 14 mov %ax,0x14(%rbx) : if (clear_dirty && !(buf->flags & BM_JUST_DIRTIED)) 0.00 : 67420b: 74 12 je 67421f 0.00 : 67420d: 0f b7 43 14 movzwl 0x14(%rbx),%eax 0.00 : 674211: a8 20 test $0x20,%al 0.00 : 674213: 75 0a jne 67421f : buf->flags &= ~(BM_DIRTY | BM_CHECKPOINT_NEEDED); 0.00 : 674215: 0f b7 43 14 movzwl 0x14(%rbx),%eax 0.00 : 674219: 24 7e and $0x7e,%al 0.00 : 67421b: 66 89 43 14 mov %ax,0x14(%rbx) : buf->flags |= set_flag_bits; 0.00 : 67421f: 0f b7 43 14 movzwl 0x14(%rbx),%eax /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:3335 50.00 : 674223: 44 09 e8 or %r13d,%eax 0.00 : 674226: 66 89 43 14 mov %ax,0x14(%rbx) : : UnlockBufHdr(buf); 0.00 : 67422a: c6 43 20 00 movb $0x0,0x20(%rbx) : : InProgressBuf = NULL; 0.00 : 67422e: 48 c7 05 2f 8e 50 00 movq $0x0,0x508e2f(%rip) # b7d068 0.00 : 674235: 00 00 00 00 : : LWLockRelease(buf->io_in_progress_lock); 0.00 : 674239: 48 8b 7b 30 mov 0x30(%rbx),%rdi : } 0.00 : 67423d: 4c 8b 65 f0 mov -0x10(%rbp),%r12 0.00 : 674241: 48 8b 5d e8 mov -0x18(%rbp),%rbx 0.00 : 674245: 4c 8b 6d f8 mov -0x8(%rbp),%r13 0.00 : 674249: c9 leaveq : : UnlockBufHdr(buf); : : InProgressBuf = NULL; : : LWLockRelease(buf->io_in_progress_lock); 0.00 : 67424a: e9 51 b1 01 00 jmpq 68f3a0 0.00 : 67424f: 90 nop : TerminateBufferIO(volatile BufferDesc *buf, bool clear_dirty, : int set_flag_bits) : { : Assert(buf == InProgressBuf); : : LockBufHdr(buf); 0.00 : 674250: ba 01 0d 00 00 mov $0xd01,%edx 0.00 : 674255: be 53 9d 8a 00 mov $0x8a9d53,%esi 0.00 : 67425a: e8 e1 bd 01 00 callq 690040 0.00 : 67425f: eb 9c jmp 6741fd Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 50.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:1368 50.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:1368 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000674d30 : : * Most but not all callers want CurrentResourceOwner to be adjusted. : * Those that don't should pass fixOwner = FALSE. : */ : static void : UnpinBuffer(volatile BufferDesc *buf, bool fixOwner) : { 0.00 : 674d30: 55 push %rbp : PrivateRefCountEntry *ref; : int b = buf->buf_id; : : ref = GetPrivateRefCountEntry(b + 1, false, false); 0.00 : 674d31: 31 d2 xor %edx,%edx : * Most but not all callers want CurrentResourceOwner to be adjusted. : * Those that don't should pass fixOwner = FALSE. : */ : static void : UnpinBuffer(volatile BufferDesc *buf, bool fixOwner) : { 0.00 : 674d33: 48 89 e5 mov %rsp,%rbp 0.00 : 674d36: 48 89 5d e8 mov %rbx,-0x18(%rbp) 0.00 : 674d3a: 4c 89 65 f0 mov %r12,-0x10(%rbp) 0.00 : 674d3e: 48 89 fb mov %rdi,%rbx 0.00 : 674d41: 4c 89 6d f8 mov %r13,-0x8(%rbp) 0.00 : 674d45: 48 83 ec 30 sub $0x30,%rsp : PrivateRefCountEntry *ref; : int b = buf->buf_id; 0.00 : 674d49: 8b 7f 24 mov 0x24(%rdi),%edi : * Most but not all callers want CurrentResourceOwner to be adjusted. : * Those that don't should pass fixOwner = FALSE. : */ : static void : UnpinBuffer(volatile BufferDesc *buf, bool fixOwner) : { 0.00 : 674d4c: 41 89 f4 mov %esi,%r12d : PrivateRefCountEntry *ref; : int b = buf->buf_id; : : ref = GetPrivateRefCountEntry(b + 1, false, false); 0.00 : 674d4f: 31 f6 xor %esi,%esi 0.00 : 674d51: 83 c7 01 add $0x1,%edi 0.00 : 674d54: e8 c7 f7 ff ff callq 674520 : Assert(ref != NULL); : : if (fixOwner) 0.00 : 674d59: 45 84 e4 test %r12b,%r12b : UnpinBuffer(volatile BufferDesc *buf, bool fixOwner) : { : PrivateRefCountEntry *ref; : int b = buf->buf_id; : : ref = GetPrivateRefCountEntry(b + 1, false, false); 0.00 : 674d5c: 49 89 c5 mov %rax,%r13 : Assert(ref != NULL); : : if (fixOwner) 0.00 : 674d5f: 0f 85 b3 00 00 00 jne 674e18 : ResourceOwnerForgetBuffer(CurrentResourceOwner, : BufferDescriptorGetBuffer(buf)); : : Assert(ref->refcount > 0); : ref->refcount--; 0.00 : 674d65: 41 8b 45 04 mov 0x4(%r13),%eax 0.00 : 674d69: 83 e8 01 sub $0x1,%eax : if (ref->refcount == 0) 0.00 : 674d6c: 85 c0 test %eax,%eax : if (fixOwner) : ResourceOwnerForgetBuffer(CurrentResourceOwner, : BufferDescriptorGetBuffer(buf)); : : Assert(ref->refcount > 0); : ref->refcount--; 0.00 : 674d6e: 41 89 45 04 mov %eax,0x4(%r13) : if (ref->refcount == 0) 0.00 : 674d72: 75 66 jne 674dda : { : /* I'd better not still hold any locks on the buffer */ : Assert(!LWLockHeldByMe(buf->content_lock)); : Assert(!LWLockHeldByMe(buf->io_in_progress_lock)); : : LockBufHdr(buf); 0.00 : 674d74: 48 8d 7b 20 lea 0x20(%rbx),%rdi : static __inline__ int : tas(volatile slock_t *lock) : { : register slock_t _res = 1; : : __asm__ __volatile__( 0.00 : 674d78: b8 01 00 00 00 mov $0x1,%eax 0.00 : 674d7d: f0 86 07 lock xchg %al,(%rdi) 0.00 : 674d80: 84 c0 test %al,%al 0.00 : 674d82: 0f 85 a8 00 00 00 jne 674e30 : : /* Decrement the shared reference count */ : Assert(buf->refcount > 0); : buf->refcount--; 0.00 : 674d88: 8b 43 18 mov 0x18(%rbx),%eax 0.00 : 674d8b: 83 e8 01 sub $0x1,%eax 0.00 : 674d8e: 89 43 18 mov %eax,0x18(%rbx) : : /* Support LockBufferForCleanup() */ : if ((buf->flags & BM_PIN_COUNT_WAITER) && 0.00 : 674d91: 0f b7 43 14 movzwl 0x14(%rbx),%eax 0.00 : 674d95: a8 40 test $0x40,%al 0.00 : 674d97: 75 57 jne 674df0 : buf->flags &= ~BM_PIN_COUNT_WAITER; : UnlockBufHdr(buf); : ProcSendSignal(wait_backend_pid); : } : else : UnlockBufHdr(buf); 0.00 : 674d99: c6 43 20 00 movb $0x0,0x20(%rbx) : static void : ForgetPrivateRefCountEntry(PrivateRefCountEntry *ref) : { : Assert(ref->refcount == 0); : : if (ref >= &PrivateRefCountArray[0] && 0.00 : 674d9d: 49 81 fd c0 d0 b7 00 cmp $0xb7d0c0,%r13 0.00 : 674da4: 72 0d jb 674db3 0.00 : 674da6: 49 81 fd 00 d1 b7 00 cmp $0xb7d100,%r13 0.00 : 674dad: 0f 82 95 00 00 00 jb 674e48 : ref->buffer = InvalidBuffer; : } : else : { : bool found; : Buffer buffer = ref->buffer; 0.00 : 674db3: 41 8b 45 00 mov 0x0(%r13),%eax : hash_search(PrivateRefCountHash, 0.00 : 674db7: 48 8b 3d ba 82 50 00 mov 0x5082ba(%rip),%rdi # b7d078 0.00 : 674dbe: 48 8d 4d e7 lea -0x19(%rbp),%rcx 0.00 : 674dc2: 48 8d 75 e0 lea -0x20(%rbp),%rsi 0.00 : 674dc6: ba 02 00 00 00 mov $0x2,%edx : ref->buffer = InvalidBuffer; : } : else : { : bool found; : Buffer buffer = ref->buffer; 0.00 : 674dcb: 89 45 e0 mov %eax,-0x20(%rbp) : hash_search(PrivateRefCountHash, 0.00 : 674dce: e8 cd f8 10 00 callq 7846a0 : (void *) &buffer, : HASH_REMOVE, : &found); : Assert(found); : Assert(PrivateRefCountOverflowed > 0); : PrivateRefCountOverflowed--; 0.00 : 674dd3: 83 2d 96 82 50 00 01 subl $0x1,0x508296(%rip) # b7d070 : else : UnlockBufHdr(buf); : : ForgetPrivateRefCountEntry(ref); : } : } 0.00 : 674dda: 48 8b 5d e8 mov -0x18(%rbp),%rbx 0.00 : 674dde: 4c 8b 65 f0 mov -0x10(%rbp),%r12 0.00 : 674de2: 4c 8b 6d f8 mov -0x8(%rbp),%r13 0.00 : 674de6: c9 leaveq 0.00 : 674de7: c3 retq 0.00 : 674de8: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 674def: 00 : /* Decrement the shared reference count */ : Assert(buf->refcount > 0); : buf->refcount--; : : /* Support LockBufferForCleanup() */ : if ((buf->flags & BM_PIN_COUNT_WAITER) && 0.00 : 674df0: 8b 43 18 mov 0x18(%rbx),%eax 0.00 : 674df3: 83 e8 01 sub $0x1,%eax 0.00 : 674df6: 75 a1 jne 674d99 : buf->refcount == 1) : { : /* we just released the last pin other than the waiter's */ : int wait_backend_pid = buf->wait_backend_pid; 0.00 : 674df8: 8b 7b 1c mov 0x1c(%rbx),%edi : : buf->flags &= ~BM_PIN_COUNT_WAITER; 0.00 : 674dfb: 0f b7 43 14 movzwl 0x14(%rbx),%eax 0.00 : 674dff: 83 e0 bf and $0xffffffbf,%eax 0.00 : 674e02: 66 89 43 14 mov %ax,0x14(%rbx) : UnlockBufHdr(buf); 0.00 : 674e06: c6 43 20 00 movb $0x0,0x20(%rbx) : ProcSendSignal(wait_backend_pid); 0.00 : 674e0a: e8 b1 76 01 00 callq 68c4c0 : /* Decrement the shared reference count */ : Assert(buf->refcount > 0); : buf->refcount--; : : /* Support LockBufferForCleanup() */ : if ((buf->flags & BM_PIN_COUNT_WAITER) && 0.00 : 674e0f: eb 8c jmp 674d9d 0.00 : 674e11: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : : ref = GetPrivateRefCountEntry(b + 1, false, false); : Assert(ref != NULL); : : if (fixOwner) : ResourceOwnerForgetBuffer(CurrentResourceOwner, 0.00 : 674e18: 8b 73 24 mov 0x24(%rbx),%esi /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:1368 50.00 : 674e1b: 48 8b 3d 9e 5a 54 00 mov 0x545a9e(%rip),%rdi # bba8c0 0.00 : 674e22: 83 c6 01 add $0x1,%esi 50.00 : 674e25: e8 d6 5a 12 00 callq 79a900 0.00 : 674e2a: e9 36 ff ff ff jmpq 674d65 0.00 : 674e2f: 90 nop : { : /* I'd better not still hold any locks on the buffer */ : Assert(!LWLockHeldByMe(buf->content_lock)); : Assert(!LWLockHeldByMe(buf->io_in_progress_lock)); : : LockBufHdr(buf); 0.00 : 674e30: ba 63 05 00 00 mov $0x563,%edx 0.00 : 674e35: be 53 9d 8a 00 mov $0x8a9d53,%esi 0.00 : 674e3a: e8 01 b2 01 00 callq 690040 0.00 : 674e3f: e9 44 ff ff ff jmpq 674d88 0.00 : 674e44: 0f 1f 40 00 nopl 0x0(%rax) : Assert(ref->refcount == 0); : : if (ref >= &PrivateRefCountArray[0] && : ref < &PrivateRefCountArray[REFCOUNT_ARRAY_ENTRIES]) : { : ref->buffer = InvalidBuffer; 0.00 : 674e48: 41 c7 45 00 00 00 00 movl $0x0,0x0(%r13) 0.00 : 674e4f: 00 0.00 : 674e50: eb 88 jmp 674dda Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 100.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:1252 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000006766c0 : : */ : Buffer : ReleaseAndReadBuffer(Buffer buffer, : Relation relation, : BlockNumber blockNum) : { 0.00 : 6766c0: 55 push %rbp 0.00 : 6766c1: 89 f9 mov %edi,%ecx 0.00 : 6766c3: 48 89 e5 mov %rsp,%rbp 0.00 : 6766c6: 48 89 5d e8 mov %rbx,-0x18(%rbp) 0.00 : 6766ca: 4c 89 65 f0 mov %r12,-0x10(%rbp) 0.00 : 6766ce: 48 89 f3 mov %rsi,%rbx 0.00 : 6766d1: 4c 89 6d f8 mov %r13,-0x8(%rbp) 0.00 : 6766d5: 48 83 ec 20 sub $0x20,%rsp : ForkNumber forkNum = MAIN_FORKNUM; : volatile BufferDesc *bufHdr; : : if (BufferIsValid(buffer)) 0.00 : 6766d9: 83 ff 00 cmp $0x0,%edi : */ : Buffer : ReleaseAndReadBuffer(Buffer buffer, : Relation relation, : BlockNumber blockNum) : { 0.00 : 6766dc: 41 89 d4 mov %edx,%r12d : ForkNumber forkNum = MAIN_FORKNUM; : volatile BufferDesc *bufHdr; : : if (BufferIsValid(buffer)) 0.00 : 6766df: 74 2d je 67670e : { : Assert(BufferIsPinned(buffer)); : if (BufferIsLocal(buffer)) 0.00 : 6766e1: 7c 4d jl 676730 : ResourceOwnerForgetBuffer(CurrentResourceOwner, buffer); : LocalRefCount[-buffer - 1]--; : } : else : { : bufHdr = &BufferDescriptors[buffer - 1]; 0.00 : 6766e3: 48 63 c7 movslq %edi,%rax 0.00 : 6766e6: 48 8d 78 ff lea -0x1(%rax),%rdi 0.00 : 6766ea: 48 c1 e7 06 shl $0x6,%rdi 0.00 : 6766ee: 48 03 3d 0b 94 54 00 add 0x54940b(%rip),%rdi # bbfb00 : /* we have pin, so it's ok to examine tag without spinlock */ : if (bufHdr->tag.blockNum == blockNum && 0.00 : 6766f5: 8b 47 10 mov 0x10(%rdi),%eax 100.00 : 6766f8: 39 d0 cmp %edx,%eax 0.00 : 6766fa: 75 08 jne 676704 0.00 : 6766fc: 8b 47 08 mov 0x8(%rdi),%eax 0.00 : 6766ff: 3b 46 08 cmp 0x8(%rsi),%eax 0.00 : 676702: 74 7c je 676780 : RelFileNodeEquals(bufHdr->tag.rnode, relation->rd_node) && : bufHdr->tag.forkNum == forkNum) : return buffer; : UnpinBuffer(bufHdr, true); 0.00 : 676704: be 01 00 00 00 mov $0x1,%esi 0.00 : 676709: e8 22 e6 ff ff callq 674d30 : } : } : : return ReadBuffer(relation, blockNum); 0.00 : 67670e: 44 89 e6 mov %r12d,%esi 0.00 : 676711: 48 89 df mov %rbx,%rdi : } 0.00 : 676714: 4c 8b 65 f0 mov -0x10(%rbp),%r12 0.00 : 676718: 48 8b 5d e8 mov -0x18(%rbp),%rbx 0.00 : 67671c: 4c 8b 6d f8 mov -0x8(%rbp),%r13 0.00 : 676720: c9 leaveq : return buffer; : UnpinBuffer(bufHdr, true); : } : } : : return ReadBuffer(relation, blockNum); 0.00 : 676721: e9 7a ff ff ff jmpq 6766a0 0.00 : 676726: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 0.00 : 67672d: 00 00 00 : if (BufferIsValid(buffer)) : { : Assert(BufferIsPinned(buffer)); : if (BufferIsLocal(buffer)) : { : bufHdr = &LocalBufferDescriptors[-buffer - 1]; 0.00 : 676730: 89 f8 mov %edi,%eax 0.00 : 676732: f7 d0 not %eax 0.00 : 676734: 4c 63 e8 movslq %eax,%r13 0.00 : 676737: 4c 89 ea mov %r13,%rdx 0.00 : 67673a: 48 c1 e2 06 shl $0x6,%rdx 0.00 : 67673e: 48 03 15 cb 69 50 00 add 0x5069cb(%rip),%rdx # b7d110 : if (bufHdr->tag.blockNum == blockNum && 0.00 : 676745: 8b 42 10 mov 0x10(%rdx),%eax 0.00 : 676748: 44 39 e0 cmp %r12d,%eax 0.00 : 67674b: 75 08 jne 676755 0.00 : 67674d: 8b 42 08 mov 0x8(%rdx),%eax 0.00 : 676750: 3b 46 08 cmp 0x8(%rsi),%eax 0.00 : 676753: 74 53 je 6767a8 : RelFileNodeEquals(bufHdr->tag.rnode, relation->rd_node) && : bufHdr->tag.forkNum == forkNum) : return buffer; : ResourceOwnerForgetBuffer(CurrentResourceOwner, buffer); 0.00 : 676755: 48 8b 3d 64 41 54 00 mov 0x544164(%rip),%rdi # bba8c0 0.00 : 67675c: 89 ce mov %ecx,%esi 0.00 : 67675e: e8 9d 41 12 00 callq 79a900 : LocalRefCount[-buffer - 1]--; 0.00 : 676763: 4a 8d 04 ad 00 00 00 lea 0x0(,%r13,4),%rax 0.00 : 67676a: 00 0.00 : 67676b: 48 03 05 ae 69 50 00 add 0x5069ae(%rip),%rax # b7d120 0.00 : 676772: 83 28 01 subl $0x1,(%rax) 0.00 : 676775: eb 97 jmp 67670e 0.00 : 676777: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 67677e: 00 00 : } : else : { : bufHdr = &BufferDescriptors[buffer - 1]; : /* we have pin, so it's ok to examine tag without spinlock */ : if (bufHdr->tag.blockNum == blockNum && 0.00 : 676780: 8b 47 04 mov 0x4(%rdi),%eax 0.00 : 676783: 3b 46 04 cmp 0x4(%rsi),%eax 0.00 : 676786: 0f 85 78 ff ff ff jne 676704 0.00 : 67678c: 8b 07 mov (%rdi),%eax 0.00 : 67678e: 3b 06 cmp (%rsi),%eax 0.00 : 676790: 0f 85 6e ff ff ff jne 676704 0.00 : 676796: 8b 47 0c mov 0xc(%rdi),%eax 0.00 : 676799: 85 c0 test %eax,%eax 0.00 : 67679b: 0f 85 63 ff ff ff jne 676704 0.00 : 6767a1: eb 1c jmp 6767bf 0.00 : 6767a3: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : { : Assert(BufferIsPinned(buffer)); : if (BufferIsLocal(buffer)) : { : bufHdr = &LocalBufferDescriptors[-buffer - 1]; : if (bufHdr->tag.blockNum == blockNum && 0.00 : 6767a8: 8b 42 04 mov 0x4(%rdx),%eax 0.00 : 6767ab: 3b 46 04 cmp 0x4(%rsi),%eax 0.00 : 6767ae: 66 90 xchg %ax,%ax 0.00 : 6767b0: 75 a3 jne 676755 0.00 : 6767b2: 8b 02 mov (%rdx),%eax 0.00 : 6767b4: 3b 06 cmp (%rsi),%eax 0.00 : 6767b6: 75 9d jne 676755 0.00 : 6767b8: 8b 42 0c mov 0xc(%rdx),%eax 0.00 : 6767bb: 85 c0 test %eax,%eax 0.00 : 6767bd: 75 96 jne 676755 : UnpinBuffer(bufHdr, true); : } : } : : return ReadBuffer(relation, blockNum); : } 0.00 : 6767bf: 89 c8 mov %ecx,%eax 0.00 : 6767c1: 48 8b 5d e8 mov -0x18(%rbp),%rbx 0.00 : 6767c5: 4c 8b 65 f0 mov -0x10(%rbp),%r12 0.00 : 6767c9: 4c 8b 6d f8 mov -0x8(%rbp),%r13 0.00 : 6767cd: c9 leaveq Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 50.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/predicate.c:2444 50.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/predicate.c:491 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000693260 : : * Skip if a coarser predicate lock already covers this page. : * Clear any finer-grained predicate locks this session has on the relation. : */ : void : PredicateLockPage(Relation relation, BlockNumber blkno, Snapshot snapshot) : { 0.00 : 693260: 55 push %rbp /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/predicate.c:2444 50.00 : 693261: 48 89 e5 mov %rsp,%rbp 0.00 : 693264: 48 83 ec 10 sub $0x10,%rsp : */ : static inline bool : SerializationNeededForRead(Relation relation, Snapshot snapshot) : { : /* Nothing to do if this is not a serializable transaction */ : if (MySerializableXact == InvalidSerializableXact) 0.00 : 693268: 48 8b 0d 51 b4 4e 00 mov 0x4eb451(%rip),%rcx # b7e6c0 /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/predicate.c:491 50.00 : 69326f: 48 85 c9 test %rcx,%rcx 0.00 : 693272: 74 13 je 693287 : * This excludes things like CLUSTER and REINDEX. They use the wholesale : * functions TransferPredicateLocksToHeapRelation() and : * CheckTableForSerializableConflictIn() to participate serialization, but : * the scans involved don't need serialization. : */ : if (!IsMVCCSnapshot(snapshot)) 0.00 : 693274: 48 8b 02 mov (%rdx),%rax 0.00 : 693277: 48 3d 50 57 7a 00 cmp $0x7a5750,%rax 0.00 : 69327d: 74 11 je 693290 0.00 : 69327f: 48 3d 60 47 7a 00 cmp $0x7a4760,%rax 0.00 : 693285: 74 09 je 693290 : SET_PREDICATELOCKTARGETTAG_PAGE(tag, : relation->rd_node.dbNode, : relation->rd_id, : blkno); : PredicateLockAcquire(&tag); : } 0.00 : 693287: c9 leaveq 0.00 : 693288: c3 retq 0.00 : 693289: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : * : * A transaction is flagged as RO_SAFE if all concurrent R/W transactions : * commit without having conflicts out to an earlier snapshot, thus : * ensuring that no conflicts are possible for this transaction. : */ : if (SxactIsROSafe(MySerializableXact)) 0.00 : 693290: 80 79 7c 00 cmpb $0x0,0x7c(%rcx) 0.00 : 693294: 78 3a js 6932d0 : * relations are exempt, as are materialized views. : */ : static inline bool : PredicateLockingNeededForRelation(Relation relation) : { : return !(relation->rd_id < FirstBootstrapObjectId || 0.00 : 693296: 8b 57 40 mov 0x40(%rdi),%edx 0.00 : 693299: 81 fa 0f 27 00 00 cmp $0x270f,%edx 0.00 : 69329f: 90 nop 0.00 : 6932a0: 76 e5 jbe 693287 0.00 : 6932a2: 48 8b 47 30 mov 0x30(%rdi),%rax 0.00 : 6932a6: 80 78 6e 74 cmpb $0x74,0x6e(%rax) 0.00 : 6932aa: 74 db je 693287 0.00 : 6932ac: 80 78 6f 6d cmpb $0x6d,0x6f(%rax) 0.00 : 6932b0: 74 d5 je 693287 : PREDICATELOCKTARGETTAG tag; : : if (!SerializationNeededForRead(relation, snapshot)) : return; : : SET_PREDICATELOCKTARGETTAG_PAGE(tag, 0.00 : 6932b2: 8b 47 04 mov 0x4(%rdi),%eax : relation->rd_node.dbNode, : relation->rd_id, : blkno); : PredicateLockAcquire(&tag); 0.00 : 6932b5: 48 8d 7d f0 lea -0x10(%rbp),%rdi : PREDICATELOCKTARGETTAG tag; : : if (!SerializationNeededForRead(relation, snapshot)) : return; : : SET_PREDICATELOCKTARGETTAG_PAGE(tag, 0.00 : 6932b9: 89 55 f4 mov %edx,-0xc(%rbp) 0.00 : 6932bc: 89 75 f8 mov %esi,-0x8(%rbp) 0.00 : 6932bf: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%rbp) 0.00 : 6932c6: 89 45 f0 mov %eax,-0x10(%rbp) : relation->rd_node.dbNode, : relation->rd_id, : blkno); : PredicateLockAcquire(&tag); 0.00 : 6932c9: e8 62 ed ff ff callq 692030 : } 0.00 : 6932ce: c9 leaveq 0.00 : 6932cf: c3 retq : * commit without having conflicts out to an earlier snapshot, thus : * ensuring that no conflicts are possible for this transaction. : */ : if (SxactIsROSafe(MySerializableXact)) : { : ReleasePredicateLocks(false); 0.00 : 6932d0: 31 ff xor %edi,%edi 0.00 : 6932d2: e8 19 f6 ff ff callq 6928f0 : SET_PREDICATELOCKTARGETTAG_PAGE(tag, : relation->rd_node.dbNode, : relation->rd_id, : blkno); : PredicateLockAcquire(&tag); : } 0.00 : 6932d7: c9 leaveq Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 100.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/adt/int8.c:678 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000006ed180 : : } : : : Datum : int8inc(PG_FUNCTION_ARGS) : { 0.00 : 6ed180: 55 push %rbp /home/Computational/mark/src/postgres-andres/src/backend/utils/adt/int8.c:678 100.00 : 6ed181: 48 89 e5 mov %rsp,%rbp 0.00 : 6ed184: 53 push %rbx 0.00 : 6ed185: 48 83 ec 08 sub $0x8,%rsp : } : else : #endif : { : /* Not called as an aggregate, so just do it the dumb way */ : int64 arg = PG_GETARG_INT64(0); 0.00 : 6ed189: 48 8b 57 20 mov 0x20(%rdi),%rdx : int64 result; : : result = arg + 1; : /* Overflow check */ : if (result < 0 && arg > 0) 0.00 : 6ed18d: 48 89 d0 mov %rdx,%rax 0.00 : 6ed190: 48 83 c0 01 add $0x1,%rax 0.00 : 6ed194: 78 0a js 6ed1a0 : (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), : errmsg("bigint out of range"))); : : PG_RETURN_INT64(result); : } : } 0.00 : 6ed196: 48 83 c4 08 add $0x8,%rsp 0.00 : 6ed19a: 5b pop %rbx 0.00 : 6ed19b: c9 leaveq 0.00 : 6ed19c: c3 retq 0.00 : 6ed19d: 0f 1f 00 nopl (%rax) : int64 arg = PG_GETARG_INT64(0); : int64 result; : : result = arg + 1; : /* Overflow check */ : if (result < 0 && arg > 0) 0.00 : 6ed1a0: 48 85 d2 test %rdx,%rdx 0.00 : 6ed1a3: 7e f1 jle 6ed196 : ereport(ERROR, 0.00 : 6ed1a5: 45 31 c0 xor %r8d,%r8d 0.00 : 6ed1a8: b9 3a ee 8b 00 mov $0x8bee3a,%ecx 0.00 : 6ed1ad: ba ca 02 00 00 mov $0x2ca,%edx 0.00 : 6ed1b2: be d3 ec 8b 00 mov $0x8becd3,%esi 0.00 : 6ed1b7: bf 14 00 00 00 mov $0x14,%edi 0.00 : 6ed1bc: e8 ff d8 08 00 callq 77aac0 0.00 : 6ed1c1: 84 c0 test %al,%al 0.00 : 6ed1c3: 75 05 jne 6ed1ca 0.00 : 6ed1c5: e8 06 c3 d7 ff callq 4694d0 0.00 : 6ed1ca: bf eb ec 8b 00 mov $0x8beceb,%edi 0.00 : 6ed1cf: 31 c0 xor %eax,%eax 0.00 : 6ed1d1: e8 ca f6 08 00 callq 77c8a0 0.00 : 6ed1d6: bf 82 00 00 03 mov $0x3000082,%edi 0.00 : 6ed1db: 89 c3 mov %eax,%ebx 0.00 : 6ed1dd: e8 6e fb 08 00 callq 77cd50 0.00 : 6ed1e2: 89 de mov %ebx,%esi 0.00 : 6ed1e4: 89 c7 mov %eax,%edi 0.00 : 6ed1e6: 31 c0 xor %eax,%eax 0.00 : 6ed1e8: e8 f3 d3 08 00 callq 77a5e0 0.00 : 6ed1ed: eb d6 jmp 6ed1c5 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 50.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/dynahash.c:869 50.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/dynahash.c:855 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000784050 : : hash_search_with_hash_value(HTAB *hashp, : const void *keyPtr, : uint32 hashvalue, : HASHACTION action, : bool *foundPtr) : { 0.00 : 784050: 55 push %rbp 0.00 : 784051: 48 89 e5 mov %rsp,%rbp 0.00 : 784054: 41 57 push %r15 0.00 : 784056: 41 89 d7 mov %edx,%r15d 0.00 : 784059: 41 56 push %r14 0.00 : 78405b: 49 89 fe mov %rdi,%r14 0.00 : 78405e: 41 55 push %r13 0.00 : 784060: 41 54 push %r12 0.00 : 784062: 53 push %rbx 0.00 : 784063: 48 83 ec 68 sub $0x68,%rsp 0.00 : 784067: 89 8d 7c ff ff ff mov %ecx,-0x84(%rbp) 0.00 : 78406d: 48 89 75 80 mov %rsi,-0x80(%rbp) 0.00 : 784071: 4c 89 85 70 ff ff ff mov %r8,-0x90(%rbp) : HASHHDR *hctl = hashp->hctl; 0.00 : 784078: 48 8b 07 mov (%rdi),%rax : * NOTE: failure to expand table is not a fatal error, it just means we : * have to run at higher fill factor than we wanted. However, if we're : * using the palloc allocator then it will throw error anyway on : * out-of-memory, so we must do this before modifying the table. : */ : if (action == HASH_ENTER || action == HASH_ENTER_NULL) 0.00 : 78407b: 83 f9 03 cmp $0x3,%ecx 0.00 : 78407e: 0f 94 45 8f sete -0x71(%rbp) 0.00 : 784082: 83 e9 01 sub $0x1,%ecx : const void *keyPtr, : uint32 hashvalue, : HASHACTION action, : bool *foundPtr) : { : HASHHDR *hctl = hashp->hctl; 0.00 : 784085: 48 89 45 90 mov %rax,-0x70(%rbp) : * NOTE: failure to expand table is not a fatal error, it just means we : * have to run at higher fill factor than we wanted. However, if we're : * using the palloc allocator then it will throw error anyway on : * out-of-memory, so we must do this before modifying the table. : */ : if (action == HASH_ENTER || action == HASH_ENTER_NULL) 0.00 : 784089: 0f 84 d9 00 00 00 je 784168 0.00 : 78408f: 80 7d 8f 00 cmpb $0x0,-0x71(%rbp) 0.00 : 784093: 0f 85 cf 00 00 00 jne 784168 : newlink = &currElement->link; : } : } : /* don't forget to terminate the rebuilt hash chains... */ : *oldlink = NULL; : *newlink = NULL; 0.00 : 784099: 8b 70 28 mov 0x28(%rax),%esi 0.00 : 78409c: 49 8b 46 50 mov 0x50(%r14),%rax 0.00 : 7840a0: 41 8b 4e 58 mov 0x58(%r14),%ecx 0.00 : 7840a4: 4c 8d 68 ff lea -0x1(%rax),%r13 : static inline uint32 : calc_bucket(HASHHDR *hctl, uint32 hash_val) : { : uint32 bucket; : : bucket = hash_val & hctl->high_mask; 0.00 : 7840a8: 48 8b 55 90 mov -0x70(%rbp),%rdx 0.00 : 7840ac: 44 89 fb mov %r15d,%ebx 0.00 : 7840af: 23 5a 2c and 0x2c(%rdx),%ebx : if (bucket > hctl->max_bucket) 0.00 : 7840b2: 39 f3 cmp %esi,%ebx 0.00 : 7840b4: 76 03 jbe 7840b9 : bucket = bucket & hctl->low_mask; 0.00 : 7840b6: 23 5a 30 and 0x30(%rdx),%ebx : bucket = calc_bucket(hctl, hashvalue); : : segment_num = bucket >> hashp->sshift; : segment_ndx = MOD(bucket, hashp->ssize); : : segp = hashp->dir[segment_num]; 0.00 : 7840b9: 89 d8 mov %ebx,%eax /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/dynahash.c:869 50.00 : 7840bb: 49 8b 56 08 mov 0x8(%r14),%rdx 0.00 : 7840bf: d3 e8 shr %cl,%eax 0.00 : 7840c1: 89 c0 mov %eax,%eax 0.00 : 7840c3: 4c 8b 24 c2 mov (%rdx,%rax,8),%r12 : : if (segp == NULL) 0.00 : 7840c7: 4d 85 e4 test %r12,%r12 0.00 : 7840ca: 0f 84 b7 02 00 00 je 784387 : hash_corrupted(hashp); : : prevBucketPtr = &segp[segment_ndx]; 0.00 : 7840d0: 89 d8 mov %ebx,%eax 0.00 : 7840d2: 44 21 e8 and %r13d,%eax : currBucket = *prevBucketPtr; : : /* : * Follow collision chain looking for matching key : */ : match = hashp->match; /* save one fetch in inner loop */ 0.00 : 7840d5: 4d 8b 6e 18 mov 0x18(%r14),%r13 : segp = hashp->dir[segment_num]; : : if (segp == NULL) : hash_corrupted(hashp); : : prevBucketPtr = &segp[segment_ndx]; 0.00 : 7840d9: 4d 8d 24 c4 lea (%r12,%rax,8),%r12 : : /* : * Follow collision chain looking for matching key : */ : match = hashp->match; /* save one fetch in inner loop */ : keysize = hashp->keysize; /* ditto */ 0.00 : 7840dd: 49 8b 46 48 mov 0x48(%r14),%rax : : if (segp == NULL) : hash_corrupted(hashp); : : prevBucketPtr = &segp[segment_ndx]; : currBucket = *prevBucketPtr; 0.00 : 7840e1: 49 8b 1c 24 mov (%r12),%rbx : : /* : * Follow collision chain looking for matching key : */ : match = hashp->match; /* save one fetch in inner loop */ : keysize = hashp->keysize; /* ditto */ 0.00 : 7840e5: 48 89 45 98 mov %rax,-0x68(%rbp) : : while (currBucket != NULL) 0.00 : 7840e9: 48 85 db test %rbx,%rbx 0.00 : 7840ec: 75 0d jne 7840fb 0.00 : 7840ee: eb 28 jmp 784118 : { : if (currBucket->hashvalue == hashvalue && : match(ELEMENTKEY(currBucket), keyPtr, keysize) == 0) : break; : prevBucketPtr = &(currBucket->link); 0.00 : 7840f0: 49 89 dc mov %rbx,%r12 : currBucket = *prevBucketPtr; 0.00 : 7840f3: 48 8b 1b mov (%rbx),%rbx : * Follow collision chain looking for matching key : */ : match = hashp->match; /* save one fetch in inner loop */ : keysize = hashp->keysize; /* ditto */ : : while (currBucket != NULL) 0.00 : 7840f6: 48 85 db test %rbx,%rbx 0.00 : 7840f9: 74 1d je 784118 : { : if (currBucket->hashvalue == hashvalue && 0.00 : 7840fb: 44 39 7b 08 cmp %r15d,0x8(%rbx) 0.00 : 7840ff: 90 nop 0.00 : 784100: 75 ee jne 7840f0 0.00 : 784102: 48 8d 7b 10 lea 0x10(%rbx),%rdi 0.00 : 784106: 48 8b 55 98 mov -0x68(%rbp),%rdx 0.00 : 78410a: 48 8b 75 80 mov -0x80(%rbp),%rsi 0.00 : 78410e: 41 ff d5 callq *%r13 0.00 : 784111: 85 c0 test %eax,%eax 0.00 : 784113: 75 db jne 7840f0 0.00 : 784115: 0f 1f 00 nopl (%rax) : hash_collisions++; : hctl->collisions++; : #endif : } : : if (foundPtr) 0.00 : 784118: 48 83 bd 70 ff ff ff cmpq $0x0,-0x90(%rbp) 0.00 : 78411f: 00 0.00 : 784120: 74 0d je 78412f : *foundPtr = (bool) (currBucket != NULL); 0.00 : 784122: 48 8b 95 70 ff ff ff mov -0x90(%rbp),%rdx 0.00 : 784129: 48 85 db test %rbx,%rbx 0.00 : 78412c: 0f 95 02 setne (%rdx) : : /* : * OK, now what? : */ : switch (action) 0.00 : 78412f: 83 bd 7c ff ff ff 01 cmpl $0x1,-0x84(%rbp) 0.00 : 784136: 0f 84 5c 01 00 00 je 784298 0.00 : 78413c: 0f 83 ee 00 00 00 jae 784230 : { : case HASH_FIND: : if (currBucket != NULL) 0.00 : 784142: 48 85 db test %rbx,%rbx 0.00 : 784145: 0f 84 35 02 00 00 je 784380 : /* FALL THRU */ : : case HASH_ENTER: : /* Return existing element if found, else create one */ : if (currBucket != NULL) : return (void *) ELEMENTKEY(currBucket); 0.00 : 78414b: 48 83 c3 10 add $0x10,%rbx : } : : elog(ERROR, "unrecognized hash action code: %d", (int) action); : : return NULL; /* keep compiler quiet */ : } 0.00 : 78414f: 48 83 c4 68 add $0x68,%rsp 0.00 : 784153: 48 89 d8 mov %rbx,%rax 0.00 : 784156: 5b pop %rbx 0.00 : 784157: 41 5c pop %r12 0.00 : 784159: 41 5d pop %r13 0.00 : 78415b: 41 5e pop %r14 0.00 : 78415d: 41 5f pop %r15 0.00 : 78415f: c9 leaveq 0.00 : 784160: c3 retq 0.00 : 784161: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : /* : * Can't split if running in partitioned mode, nor if frozen, nor if : * table is the subject of any active hash_seq_search scans. Strange : * order of these tests is to try to check cheaper conditions first. : */ : if (!IS_PARTITIONED(hctl) && !hashp->frozen && 0.00 : 784168: 48 8b 55 90 mov -0x70(%rbp),%rdx 0.00 : 78416c: 48 83 7a 48 00 cmpq $0x0,0x48(%rdx) /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/dynahash.c:855 50.00 : 784171: 0f 85 09 01 00 00 jne 784280 0.00 : 784177: 41 80 7e 42 00 cmpb $0x0,0x42(%r14) 0.00 : 78417c: 0f 85 e6 01 00 00 jne 784368 0.00 : 784182: 48 8b 45 90 mov -0x70(%rbp),%rax 0.00 : 784186: 48 8b 5d 90 mov -0x70(%rbp),%rbx 0.00 : 78418a: 8b 70 28 mov 0x28(%rax),%esi 0.00 : 78418d: 8d 56 01 lea 0x1(%rsi),%edx 0.00 : 784190: 41 89 f0 mov %esi,%r8d 0.00 : 784193: 89 55 d4 mov %edx,-0x2c(%rbp) 0.00 : 784196: 41 89 d4 mov %edx,%r12d 0.00 : 784199: 48 8b 50 08 mov 0x8(%rax),%rdx 0.00 : 78419d: 48 89 d0 mov %rdx,%rax 0.00 : 7841a0: 48 c1 fa 3f sar $0x3f,%rdx 0.00 : 7841a4: 49 f7 fc idiv %r12 0.00 : 7841a7: 48 3b 43 50 cmp 0x50(%rbx),%rax 0.00 : 7841ab: 0f 8c eb fe ff ff jl 78409c : static bool : has_seq_scans(HTAB *hashp) : { : int i; : : for (i = 0; i < num_seq_scans; i++) 0.00 : 7841b1: 8b 3d 09 5a 43 00 mov 0x435a09(%rip),%edi # bb9bc0 0.00 : 7841b7: 85 ff test %edi,%edi 0.00 : 7841b9: 7e 2c jle 7841e7 : { : if (seq_scan_tables[i] == hashp) 0.00 : 7841bb: 31 d2 xor %edx,%edx 0.00 : 7841bd: 4c 3b 35 1c 5a 43 00 cmp 0x435a1c(%rip),%r14 # bb9be0 0.00 : 7841c4: b9 e8 9b bb 00 mov $0xbb9be8,%ecx 0.00 : 7841c9: 75 15 jne 7841e0 0.00 : 7841cb: e9 cc fe ff ff jmpq 78409c 0.00 : 7841d0: 48 8b 01 mov (%rcx),%rax 0.00 : 7841d3: 48 83 c1 08 add $0x8,%rcx 0.00 : 7841d7: 49 39 c6 cmp %rax,%r14 0.00 : 7841da: 0f 84 bc fe ff ff je 78409c : static bool : has_seq_scans(HTAB *hashp) : { : int i; : : for (i = 0; i < num_seq_scans; i++) 0.00 : 7841e0: 83 c2 01 add $0x1,%edx 0.00 : 7841e3: 39 fa cmp %edi,%edx 0.00 : 7841e5: 7c e9 jl 7841d0 : hash_expansions++; : #endif : : new_bucket = hctl->max_bucket + 1; : new_segnum = new_bucket >> hashp->sshift; : new_segndx = MOD(new_bucket, hashp->ssize); 0.00 : 7841e7: 49 8b 46 50 mov 0x50(%r14),%rax : #ifdef HASH_STATISTICS : hash_expansions++; : #endif : : new_bucket = hctl->max_bucket + 1; : new_segnum = new_bucket >> hashp->sshift; 0.00 : 7841eb: 41 8b 4e 58 mov 0x58(%r14),%ecx 0.00 : 7841ef: 4c 89 e3 mov %r12,%rbx : new_segndx = MOD(new_bucket, hashp->ssize); 0.00 : 7841f2: 4c 8d 68 ff lea -0x1(%rax),%r13 : : if (new_segnum >= hctl->nsegs) 0.00 : 7841f6: 48 8b 45 90 mov -0x70(%rbp),%rax : #ifdef HASH_STATISTICS : hash_expansions++; : #endif : : new_bucket = hctl->max_bucket + 1; : new_segnum = new_bucket >> hashp->sshift; 0.00 : 7841fa: 48 d3 fb sar %cl,%rbx 0.00 : 7841fd: 48 89 5d c0 mov %rbx,-0x40(%rbp) : new_segndx = MOD(new_bucket, hashp->ssize); : : if (new_segnum >= hctl->nsegs) 0.00 : 784201: 48 3b 58 20 cmp 0x20(%rax),%rbx 0.00 : 784205: 0f 8c 05 02 00 00 jl 784410 : { : /* Allocate new segment if necessary -- could fail if dir full */ : if (new_segnum >= hctl->dsize) 0.00 : 78420b: 48 8b 45 90 mov -0x70(%rbp),%rax 0.00 : 78420f: 48 8b 58 18 mov 0x18(%rax),%rbx 0.00 : 784213: 48 39 5d c0 cmp %rbx,-0x40(%rbp) 0.00 : 784217: 0f 8c 1d 03 00 00 jl 78453a : HASHSEGMENT *old_p; : long new_dsize; : long old_dirsize; : long new_dirsize; : : if (hashp->hctl->max_dsize != NO_MAX_DSIZE) 0.00 : 78421d: 48 83 78 58 ff cmpq $0xffffffffffffffff,0x58(%rax) 0.00 : 784222: 0f 84 4a 03 00 00 je 784572 : hashp->dir = p; : hashp->hctl->dsize = new_dsize; : : /* XXX assume the allocator is palloc, so we know how to free */ : Assert(hashp->alloc == DynaHashAlloc); : pfree(old_p); 0.00 : 784228: 44 89 c6 mov %r8d,%esi 0.00 : 78422b: e9 78 fe ff ff jmpq 7840a8 : *foundPtr = (bool) (currBucket != NULL); : : /* : * OK, now what? : */ : switch (action) 0.00 : 784230: 83 bd 7c ff ff ff 02 cmpl $0x2,-0x84(%rbp) 0.00 : 784237: 0f 84 d6 00 00 00 je 784313 0.00 : 78423d: 83 bd 7c ff ff ff 03 cmpl $0x3,-0x84(%rbp) 0.00 : 784244: 74 52 je 784298 : */ : : return (void *) ELEMENTKEY(currBucket); : } : : elog(ERROR, "unrecognized hash action code: %d", (int) action); 0.00 : 784246: ba f0 5b 8d 00 mov $0x8d5bf0,%edx 0.00 : 78424b: be df 03 00 00 mov $0x3df,%esi 0.00 : 784250: bf 33 59 8d 00 mov $0x8d5933,%edi 0.00 : 784255: e8 c6 71 ff ff callq 77b420 0.00 : 78425a: 8b 95 7c ff ff ff mov -0x84(%rbp),%edx 0.00 : 784260: be f0 5a 8d 00 mov $0x8d5af0,%esi 0.00 : 784265: bf 14 00 00 00 mov $0x14,%edi 0.00 : 78426a: 31 c0 xor %eax,%eax 0.00 : 78426c: e8 bf 6f ff ff callq 77b230 0.00 : 784271: e8 5a 52 ce ff callq 4694d0 0.00 : 784276: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 0.00 : 78427d: 00 00 00 : /* : * Can't split if running in partitioned mode, nor if frozen, nor if : * table is the subject of any active hash_seq_search scans. Strange : * order of these tests is to try to check cheaper conditions first. : */ : if (!IS_PARTITIONED(hctl) && !hashp->frozen && 0.00 : 784280: 49 8b 46 50 mov 0x50(%r14),%rax 0.00 : 784284: 8b 72 28 mov 0x28(%rdx),%esi 0.00 : 784287: 41 8b 4e 58 mov 0x58(%r14),%ecx 0.00 : 78428b: 4c 8d 68 ff lea -0x1(%rax),%r13 0.00 : 78428f: e9 14 fe ff ff jmpq 7840a8 0.00 : 784294: 0f 1f 40 00 nopl 0x0(%rax) : Assert(hashp->alloc != DynaHashAlloc); : /* FALL THRU */ : : case HASH_ENTER: : /* Return existing element if found, else create one */ : if (currBucket != NULL) 0.00 : 784298: 48 85 db test %rbx,%rbx 0.00 : 78429b: 0f 85 aa fe ff ff jne 78414b : return (void *) ELEMENTKEY(currBucket); : : /* disallow inserts if frozen */ : if (hashp->frozen) 0.00 : 7842a1: 41 80 7e 42 00 cmpb $0x0,0x42(%r14) 0.00 : 7842a6: 0f 85 a3 03 00 00 jne 78464f : */ : static HASHBUCKET : get_hash_entry(HTAB *hashp) : { : /* use volatile pointer to prevent code rearrangement */ : volatile HASHHDR *hctlv = hashp->hctl; 0.00 : 7842ac: 49 8b 1e mov (%r14),%rbx : static __inline__ int : tas(volatile slock_t *lock) : { : register slock_t _res = 1; : : __asm__ __volatile__( 0.00 : 7842af: 41 bd 01 00 00 00 mov $0x1,%r13d 0.00 : 7842b5: eb 35 jmp 7842ec 0.00 : 7842b7: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 7842be: 00 00 : /* if partitioned, must lock to touch nentries and freeList */ : if (IS_PARTITIONED(hctlv)) : SpinLockAcquire(&hctlv->mutex); : : /* try to get an entry from the freelist */ : newElement = hctlv->freeList; 0.00 : 7842c0: 48 8b 53 10 mov 0x10(%rbx),%rdx : if (newElement != NULL) 0.00 : 7842c4: 48 85 d2 test %rdx,%rdx 0.00 : 7842c7: 0f 85 04 02 00 00 jne 7844d1 : break; : : /* no free elements. allocate another chunk of buckets */ : if (IS_PARTITIONED(hctlv)) 0.00 : 7842cd: 48 8b 43 48 mov 0x48(%rbx),%rax 0.00 : 7842d1: 48 85 c0 test %rax,%rax 0.00 : 7842d4: 74 03 je 7842d9 : SpinLockRelease(&hctlv->mutex); 0.00 : 7842d6: c6 03 00 movb $0x0,(%rbx) : : if (!element_alloc(hashp, hctlv->nelem_alloc)) 0.00 : 7842d9: 8b 73 6c mov 0x6c(%rbx),%esi 0.00 : 7842dc: 4c 89 f7 mov %r14,%rdi 0.00 : 7842df: e8 dc fb ff ff callq 783ec0 0.00 : 7842e4: 84 c0 test %al,%al 0.00 : 7842e6: 0f 84 be 00 00 00 je 7843aa : HASHBUCKET newElement; : : for (;;) : { : /* if partitioned, must lock to touch nentries and freeList */ : if (IS_PARTITIONED(hctlv)) 0.00 : 7842ec: 48 8b 43 48 mov 0x48(%rbx),%rax 0.00 : 7842f0: 48 85 c0 test %rax,%rax 0.00 : 7842f3: 74 cb je 7842c0 0.00 : 7842f5: 44 89 e8 mov %r13d,%eax 0.00 : 7842f8: f0 86 03 lock xchg %al,(%rbx) : SpinLockAcquire(&hctlv->mutex); 0.00 : 7842fb: 84 c0 test %al,%al 0.00 : 7842fd: 74 c1 je 7842c0 0.00 : 7842ff: ba 87 04 00 00 mov $0x487,%edx 0.00 : 784304: be 33 59 8d 00 mov $0x8d5933,%esi 0.00 : 784309: 48 89 df mov %rbx,%rdi 0.00 : 78430c: e8 2f bd f0 ff callq 690040 0.00 : 784311: eb ad jmp 7842c0 : if (currBucket != NULL) : return (void *) ELEMENTKEY(currBucket); : return NULL; : : case HASH_REMOVE: : if (currBucket != NULL) 0.00 : 784313: 48 85 db test %rbx,%rbx 0.00 : 784316: 74 68 je 784380 : { : /* use volatile pointer to prevent code rearrangement */ : volatile HASHHDR *hctlv = hctl; : : /* if partitioned, must lock to touch nentries and freeList */ : if (IS_PARTITIONED(hctlv)) 0.00 : 784318: 48 8b 55 90 mov -0x70(%rbp),%rdx 0.00 : 78431c: 48 8b 42 48 mov 0x48(%rdx),%rax 0.00 : 784320: 48 85 c0 test %rax,%rax 0.00 : 784323: 74 0c je 784331 0.00 : 784325: b8 01 00 00 00 mov $0x1,%eax 0.00 : 78432a: f0 86 02 lock xchg %al,(%rdx) : SpinLockAcquire(&hctlv->mutex); 0.00 : 78432d: 84 c0 test %al,%al 0.00 : 78432f: 75 64 jne 784395 : : Assert(hctlv->nentries > 0); : hctlv->nentries--; 0.00 : 784331: 48 8b 55 90 mov -0x70(%rbp),%rdx 0.00 : 784335: 48 8b 42 08 mov 0x8(%rdx),%rax 0.00 : 784339: 48 83 e8 01 sub $0x1,%rax 0.00 : 78433d: 48 89 42 08 mov %rax,0x8(%rdx) : : /* remove record from hash bucket's chain. */ : *prevBucketPtr = currBucket->link; 0.00 : 784341: 48 8b 03 mov (%rbx),%rax 0.00 : 784344: 49 89 04 24 mov %rax,(%r12) : : /* add the record to the freelist for this table. */ : currBucket->link = hctlv->freeList; 0.00 : 784348: 48 8b 42 10 mov 0x10(%rdx),%rax 0.00 : 78434c: 48 89 03 mov %rax,(%rbx) : hctlv->freeList = currBucket; 0.00 : 78434f: 48 89 5a 10 mov %rbx,0x10(%rdx) : : if (IS_PARTITIONED(hctlv)) 0.00 : 784353: 48 8b 42 48 mov 0x48(%rdx),%rax 0.00 : 784357: 48 85 c0 test %rax,%rax 0.00 : 78435a: 0f 84 eb fd ff ff je 78414b : SpinLockRelease(&hctlv->mutex); 0.00 : 784360: c6 02 00 movb $0x0,(%rdx) 0.00 : 784363: e9 e3 fd ff ff jmpq 78414b : /* : * Can't split if running in partitioned mode, nor if frozen, nor if : * table is the subject of any active hash_seq_search scans. Strange : * order of these tests is to try to check cheaper conditions first. : */ : if (!IS_PARTITIONED(hctl) && !hashp->frozen && 0.00 : 784368: 48 8b 5d 90 mov -0x70(%rbp),%rbx 0.00 : 78436c: 49 8b 46 50 mov 0x50(%r14),%rax 0.00 : 784370: 41 8b 4e 58 mov 0x58(%r14),%ecx 0.00 : 784374: 8b 73 28 mov 0x28(%rbx),%esi 0.00 : 784377: 4c 8d 68 ff lea -0x1(%rax),%r13 0.00 : 78437b: e9 28 fd ff ff jmpq 7840a8 : */ : : return (void *) ELEMENTKEY(currBucket); : } : : elog(ERROR, "unrecognized hash action code: %d", (int) action); 0.00 : 784380: 31 db xor %ebx,%ebx 0.00 : 784382: e9 c8 fd ff ff jmpq 78414f : segment_ndx = MOD(bucket, hashp->ssize); : : segp = hashp->dir[segment_num]; : : if (segp == NULL) : hash_corrupted(hashp); 0.00 : 784387: 4c 89 f7 mov %r14,%rdi 0.00 : 78438a: e8 01 f8 ff ff callq 783b90 0.00 : 78438f: 90 nop 0.00 : 784390: e9 3b fd ff ff jmpq 7840d0 : /* use volatile pointer to prevent code rearrangement */ : volatile HASHHDR *hctlv = hctl; : : /* if partitioned, must lock to touch nentries and freeList */ : if (IS_PARTITIONED(hctlv)) : SpinLockAcquire(&hctlv->mutex); 0.00 : 784395: 48 8b 7d 90 mov -0x70(%rbp),%rdi 0.00 : 784399: ba 95 03 00 00 mov $0x395,%edx 0.00 : 78439e: be 33 59 8d 00 mov $0x8d5933,%esi 0.00 : 7843a3: e8 98 bc f0 ff callq 690040 0.00 : 7843a8: eb 87 jmp 784331 : : currBucket = get_hash_entry(hashp); : if (currBucket == NULL) : { : /* out of memory */ : if (action == HASH_ENTER_NULL) 0.00 : 7843aa: 80 7d 8f 00 cmpb $0x0,-0x71(%rbp) 0.00 : 7843ae: 75 d0 jne 784380 : return NULL; : /* report a generic message */ : if (hashp->isshared) 0.00 : 7843b0: 41 80 7e 40 00 cmpb $0x0,0x40(%r14) 0.00 : 7843b5: 0f 1f 00 nopl (%rax) 0.00 : 7843b8: 0f 84 4a 02 00 00 je 784608 : ereport(ERROR, 0.00 : 7843be: 45 31 c0 xor %r8d,%r8d 0.00 : 7843c1: bf 14 00 00 00 mov $0x14,%edi 0.00 : 7843c6: b9 f0 5b 8d 00 mov $0x8d5bf0,%ecx 0.00 : 7843cb: ba c6 03 00 00 mov $0x3c6,%edx 0.00 : 7843d0: be 33 59 8d 00 mov $0x8d5933,%esi 0.00 : 7843d5: e8 e6 66 ff ff callq 77aac0 0.00 : 7843da: 84 c0 test %al,%al 0.00 : 7843dc: bf 47 ba 8a 00 mov $0x8aba47,%edi 0.00 : 7843e1: 0f 84 8a fe ff ff je 784271 : (errcode(ERRCODE_OUT_OF_MEMORY), : errmsg("out of shared memory"))); : else : ereport(ERROR, 0.00 : 7843e7: 31 c0 xor %eax,%eax 0.00 : 7843e9: e8 b2 84 ff ff callq 77c8a0 0.00 : 7843ee: bf c5 20 00 00 mov $0x20c5,%edi 0.00 : 7843f3: 89 c3 mov %eax,%ebx 0.00 : 7843f5: e8 56 89 ff ff callq 77cd50 0.00 : 7843fa: 89 de mov %ebx,%esi 0.00 : 7843fc: 89 c7 mov %eax,%edi 0.00 : 7843fe: 31 c0 xor %eax,%eax 0.00 : 784400: e8 db 61 ff ff callq 77a5e0 0.00 : 784405: e9 67 fe ff ff jmpq 784271 0.00 : 78440a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : : new_bucket = hctl->max_bucket + 1; : new_segnum = new_bucket >> hashp->sshift; : new_segndx = MOD(new_bucket, hashp->ssize); : : if (new_segnum >= hctl->nsegs) 0.00 : 784410: 8b 45 d4 mov -0x2c(%rbp),%eax 0.00 : 784413: 48 c1 e3 03 shl $0x3,%rbx 0.00 : 784417: 48 89 5d c8 mov %rbx,-0x38(%rbp) : return false; : hctl->nsegs++; : } : : /* OK, we created a new bucket */ : hctl->max_bucket++; 0.00 : 78441b: 48 8b 5d 90 mov -0x70(%rbp),%rbx : * *Before* changing masks, find old bucket corresponding to same hash : * values; values in that bucket may need to be relocated to new bucket. : * Note that new_bucket is certainly larger than low_mask at this point, : * so we can skip the first step of the regular hash mask calc. : */ : old_bucket = (new_bucket & hctl->low_mask); 0.00 : 78441f: 4d 89 e1 mov %r12,%r9 : return false; : hctl->nsegs++; : } : : /* OK, we created a new bucket */ : hctl->max_bucket++; 0.00 : 784422: 89 43 28 mov %eax,0x28(%rbx) : * *Before* changing masks, find old bucket corresponding to same hash : * values; values in that bucket may need to be relocated to new bucket. : * Note that new_bucket is certainly larger than low_mask at this point, : * so we can skip the first step of the regular hash mask calc. : */ : old_bucket = (new_bucket & hctl->low_mask); 0.00 : 784425: 8b 43 30 mov 0x30(%rbx),%eax 0.00 : 784428: 49 21 c1 and %rax,%r9 : : /* : * If we crossed a power of 2, readjust masks. : */ : if ((uint32) new_bucket > hctl->high_mask) 0.00 : 78442b: 8b 43 2c mov 0x2c(%rbx),%eax 0.00 : 78442e: 39 45 d4 cmp %eax,-0x2c(%rbp) 0.00 : 784431: 76 0c jbe 78443f : { : hctl->low_mask = hctl->high_mask; 0.00 : 784433: 89 43 30 mov %eax,0x30(%rbx) : hctl->high_mask = (uint32) new_bucket | hctl->low_mask; 0.00 : 784436: 09 45 d4 or %eax,-0x2c(%rbp) 0.00 : 784439: 8b 45 d4 mov -0x2c(%rbp),%eax 0.00 : 78443c: 89 43 2c mov %eax,0x2c(%rbx) : old_segndx = MOD(old_bucket, hashp->ssize); : : old_seg = hashp->dir[old_segnum]; : new_seg = hashp->dir[new_segnum]; : : oldlink = &old_seg[old_segndx]; 0.00 : 78443f: 49 8b 46 50 mov 0x50(%r14),%rax 0.00 : 784443: 41 8b 4e 58 mov 0x58(%r14),%ecx 0.00 : 784447: 4c 89 ca mov %r9,%rdx : * that might not be true! : */ : old_segnum = old_bucket >> hashp->sshift; : old_segndx = MOD(old_bucket, hashp->ssize); : : old_seg = hashp->dir[old_segnum]; 0.00 : 78444a: 49 8b 76 08 mov 0x8(%r14),%rsi : new_seg = hashp->dir[new_segnum]; : : oldlink = &old_seg[old_segndx]; : newlink = &new_seg[new_segndx]; 0.00 : 78444e: 4d 21 ec and %r13,%r12 0.00 : 784451: 4a 8d 3c e5 00 00 00 lea 0x0(,%r12,8),%rdi 0.00 : 784458: 00 : old_segndx = MOD(old_bucket, hashp->ssize); : : old_seg = hashp->dir[old_segnum]; : new_seg = hashp->dir[new_segnum]; : : oldlink = &old_seg[old_segndx]; 0.00 : 784459: 48 83 e8 01 sub $0x1,%rax 0.00 : 78445d: 48 d3 fa sar %cl,%rdx 0.00 : 784460: 4c 21 c8 and %r9,%rax 0.00 : 784463: 4c 8d 04 c5 00 00 00 lea 0x0(,%rax,8),%r8 0.00 : 78446a: 00 0.00 : 78446b: 4c 03 04 d6 add (%rsi,%rdx,8),%r8 : newlink = &new_seg[new_segndx]; 0.00 : 78446f: 48 8b 55 c8 mov -0x38(%rbp),%rdx 0.00 : 784473: 48 03 3c 16 add (%rsi,%rdx,1),%rdi : : for (currElement = *oldlink; 0.00 : 784477: 49 8b 10 mov (%r8),%rdx : currElement != NULL; 0.00 : 78447a: 48 85 d2 test %rdx,%rdx 0.00 : 78447d: 75 17 jne 784496 0.00 : 78447f: eb 39 jmp 7844ba 0.00 : 784481: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : *oldlink = currElement; : oldlink = &currElement->link; : } : else : { : *newlink = currElement; 0.00 : 784488: 48 89 17 mov %rdx,(%rdi) : newlink = &currElement->link; 0.00 : 78448b: 48 89 d7 mov %rdx,%rdi : : oldlink = &old_seg[old_segndx]; : newlink = &new_seg[new_segndx]; : : for (currElement = *oldlink; : currElement != NULL; 0.00 : 78448e: 48 85 c9 test %rcx,%rcx 0.00 : 784491: 74 27 je 7844ba 0.00 : 784493: 48 89 ca mov %rcx,%rdx : static inline uint32 : calc_bucket(HASHHDR *hctl, uint32 hash_val) : { : uint32 bucket; : : bucket = hash_val & hctl->high_mask; 0.00 : 784496: 48 8b 5d 90 mov -0x70(%rbp),%rbx : : for (currElement = *oldlink; : currElement != NULL; : currElement = nextElement) : { : nextElement = currElement->link; 0.00 : 78449a: 48 8b 0a mov (%rdx),%rcx : static inline uint32 : calc_bucket(HASHHDR *hctl, uint32 hash_val) : { : uint32 bucket; : : bucket = hash_val & hctl->high_mask; 0.00 : 78449d: 8b 43 2c mov 0x2c(%rbx),%eax 0.00 : 7844a0: 23 42 08 and 0x8(%rdx),%eax : if (bucket > hctl->max_bucket) 0.00 : 7844a3: 3b 43 28 cmp 0x28(%rbx),%eax 0.00 : 7844a6: 76 03 jbe 7844ab : bucket = bucket & hctl->low_mask; 0.00 : 7844a8: 23 43 30 and 0x30(%rbx),%eax : for (currElement = *oldlink; : currElement != NULL; : currElement = nextElement) : { : nextElement = currElement->link; : if ((long) calc_bucket(hctl, currElement->hashvalue) == old_bucket) 0.00 : 7844ab: 89 c0 mov %eax,%eax 0.00 : 7844ad: 49 39 c1 cmp %rax,%r9 0.00 : 7844b0: 75 d6 jne 784488 : { : *oldlink = currElement; 0.00 : 7844b2: 49 89 10 mov %rdx,(%r8) : oldlink = &currElement->link; 0.00 : 7844b5: 49 89 d0 mov %rdx,%r8 0.00 : 7844b8: eb d4 jmp 78448e : *newlink = currElement; : newlink = &currElement->link; : } : } : /* don't forget to terminate the rebuilt hash chains... */ : *oldlink = NULL; 0.00 : 7844ba: 49 c7 00 00 00 00 00 movq $0x0,(%r8) : *newlink = NULL; 0.00 : 7844c1: 48 c7 07 00 00 00 00 movq $0x0,(%rdi) 0.00 : 7844c8: 48 8b 45 90 mov -0x70(%rbp),%rax 0.00 : 7844cc: e9 c8 fb ff ff jmpq 784099 : return NULL; : } : } : : /* remove entry from freelist, bump nentries */ : hctlv->freeList = newElement->link; 0.00 : 7844d1: 48 8b 02 mov (%rdx),%rax 0.00 : 7844d4: 48 89 43 10 mov %rax,0x10(%rbx) : hctlv->nentries++; 0.00 : 7844d8: 48 8b 43 08 mov 0x8(%rbx),%rax 0.00 : 7844dc: 48 83 c0 01 add $0x1,%rax 0.00 : 7844e0: 48 89 43 08 mov %rax,0x8(%rbx) : : if (IS_PARTITIONED(hctlv)) 0.00 : 7844e4: 48 8b 43 48 mov 0x48(%rbx),%rax 0.00 : 7844e8: 48 85 c0 test %rax,%rax 0.00 : 7844eb: 74 03 je 7844f0 : SpinLockRelease(&hctlv->mutex); 0.00 : 7844ed: c6 03 00 movb $0x0,(%rbx) : *prevBucketPtr = currBucket; : currBucket->link = NULL; : : /* copy key into record */ : currBucket->hashvalue = hashvalue; : hashp->keycopy(ELEMENTKEY(currBucket), keyPtr, keysize); 0.00 : 7844f0: 48 8d 5a 10 lea 0x10(%rdx),%rbx : (errcode(ERRCODE_OUT_OF_MEMORY), : errmsg("out of memory"))); : } : : /* link into hashbucket chain */ : *prevBucketPtr = currBucket; 0.00 : 7844f4: 49 89 14 24 mov %rdx,(%r12) : currBucket->link = NULL; : : /* copy key into record */ : currBucket->hashvalue = hashvalue; 0.00 : 7844f8: 44 89 7a 08 mov %r15d,0x8(%rdx) : errmsg("out of memory"))); : } : : /* link into hashbucket chain */ : *prevBucketPtr = currBucket; : currBucket->link = NULL; 0.00 : 7844fc: 48 c7 02 00 00 00 00 movq $0x0,(%rdx) : : /* copy key into record */ : currBucket->hashvalue = hashvalue; : hashp->keycopy(ELEMENTKEY(currBucket), keyPtr, keysize); 0.00 : 784503: 48 8b 55 98 mov -0x68(%rbp),%rdx 0.00 : 784507: 48 8b 75 80 mov -0x80(%rbp),%rsi 0.00 : 78450b: 48 89 df mov %rbx,%rdi 0.00 : 78450e: 41 ff 56 20 callq *0x20(%r14) : } : : elog(ERROR, "unrecognized hash action code: %d", (int) action); : : return NULL; /* keep compiler quiet */ : } 0.00 : 784512: e9 38 fc ff ff jmpq 78414f : p = (HASHSEGMENT *) hashp->alloc((Size) new_dirsize); : : if (p != NULL) : { : memcpy(p, old_p, old_dirsize); : MemSet(((char *) p) + old_dirsize, 0, new_dirsize - old_dirsize); 0.00 : 784517: 31 f6 xor %esi,%esi 0.00 : 784519: e8 02 4f ce ff callq 469420 : hashp->dir = p; 0.00 : 78451e: 48 8b 45 a8 mov -0x58(%rbp),%rax : hashp->hctl->dsize = new_dsize; 0.00 : 784522: 48 8b 55 b8 mov -0x48(%rbp),%rdx : : if (p != NULL) : { : memcpy(p, old_p, old_dirsize); : MemSet(((char *) p) + old_dirsize, 0, new_dirsize - old_dirsize); : hashp->dir = p; 0.00 : 784526: 49 89 46 08 mov %rax,0x8(%r14) : hashp->hctl->dsize = new_dsize; 0.00 : 78452a: 49 8b 06 mov (%r14),%rax 0.00 : 78452d: 48 89 50 18 mov %rdx,0x18(%rax) : : /* XXX assume the allocator is palloc, so we know how to free */ : Assert(hashp->alloc == DynaHashAlloc); : pfree(old_p); 0.00 : 784531: 48 8b 7d b0 mov -0x50(%rbp),%rdi 0.00 : 784535: e8 46 46 01 00 callq 798b80 : { : /* Allocate new segment if necessary -- could fail if dir full */ : if (new_segnum >= hctl->dsize) : if (!dir_realloc(hashp)) : return false; : if (!(hashp->dir[new_segnum] = seg_alloc(hashp))) 0.00 : 78453a: 48 8b 5d c0 mov -0x40(%rbp),%rbx 0.00 : 78453e: 4c 89 f7 mov %r14,%rdi 0.00 : 784541: 48 c1 e3 03 shl $0x3,%rbx 0.00 : 784545: 48 89 5d c8 mov %rbx,-0x38(%rbp) 0.00 : 784549: 49 03 5e 08 add 0x8(%r14),%rbx 0.00 : 78454d: e8 7e fa ff ff callq 783fd0 0.00 : 784552: 48 85 c0 test %rax,%rax 0.00 : 784555: 48 89 03 mov %rax,(%rbx) 0.00 : 784558: 0f 84 1f 01 00 00 je 78467d : return false; : hctl->nsegs++; 0.00 : 78455e: 48 8b 55 90 mov -0x70(%rbp),%rdx 0.00 : 784562: 8b 42 28 mov 0x28(%rdx),%eax 0.00 : 784565: 48 83 42 20 01 addq $0x1,0x20(%rdx) 0.00 : 78456a: 83 c0 01 add $0x1,%eax 0.00 : 78456d: e9 a9 fe ff ff jmpq 78441b : : if (hashp->hctl->max_dsize != NO_MAX_DSIZE) : return false; : : /* Reallocate directory */ : new_dsize = hashp->hctl->dsize << 1; 0.00 : 784572: 48 8d 14 1b lea (%rbx,%rbx,1),%rdx : old_dirsize = hashp->hctl->dsize * sizeof(HASHSEGMENT); : new_dirsize = new_dsize * sizeof(HASHSEGMENT); 0.00 : 784576: 48 89 d8 mov %rbx,%rax 0.00 : 784579: 48 c1 e0 04 shl $0x4,%rax 0.00 : 78457d: 48 89 45 a0 mov %rax,-0x60(%rbp) : : if (hashp->hctl->max_dsize != NO_MAX_DSIZE) : return false; : : /* Reallocate directory */ : new_dsize = hashp->hctl->dsize << 1; 0.00 : 784581: 48 89 55 b8 mov %rdx,-0x48(%rbp) : old_dirsize = hashp->hctl->dsize * sizeof(HASHSEGMENT); : new_dirsize = new_dsize * sizeof(HASHSEGMENT); : : old_p = hashp->dir; : CurrentDynaHashCxt = hashp->hcxt; 0.00 : 784585: 49 8b 46 30 mov 0x30(%r14),%rax : /* Reallocate directory */ : new_dsize = hashp->hctl->dsize << 1; : old_dirsize = hashp->hctl->dsize * sizeof(HASHSEGMENT); : new_dirsize = new_dsize * sizeof(HASHSEGMENT); : : old_p = hashp->dir; 0.00 : 784589: 49 8b 56 08 mov 0x8(%r14),%rdx : CurrentDynaHashCxt = hashp->hcxt; : p = (HASHSEGMENT *) hashp->alloc((Size) new_dirsize); 0.00 : 78458d: 48 8b 7d a0 mov -0x60(%rbp),%rdi : /* Reallocate directory */ : new_dsize = hashp->hctl->dsize << 1; : old_dirsize = hashp->hctl->dsize * sizeof(HASHSEGMENT); : new_dirsize = new_dsize * sizeof(HASHSEGMENT); : : old_p = hashp->dir; 0.00 : 784591: 48 89 55 b0 mov %rdx,-0x50(%rbp) : CurrentDynaHashCxt = hashp->hcxt; 0.00 : 784595: 48 89 05 2c 56 43 00 mov %rax,0x43562c(%rip) # bb9bc8 : p = (HASHSEGMENT *) hashp->alloc((Size) new_dirsize); 0.00 : 78459c: 41 ff 56 28 callq *0x28(%r14) : : if (p != NULL) 0.00 : 7845a0: 48 85 c0 test %rax,%rax : old_dirsize = hashp->hctl->dsize * sizeof(HASHSEGMENT); : new_dirsize = new_dsize * sizeof(HASHSEGMENT); : : old_p = hashp->dir; : CurrentDynaHashCxt = hashp->hcxt; : p = (HASHSEGMENT *) hashp->alloc((Size) new_dirsize); 0.00 : 7845a3: 48 89 45 a8 mov %rax,-0x58(%rbp) : : if (p != NULL) 0.00 : 7845a7: 0f 84 89 00 00 00 je 784636 : { : memcpy(p, old_p, old_dirsize); 0.00 : 7845ad: 48 8b 7d a8 mov -0x58(%rbp),%rdi 0.00 : 7845b1: 48 8b 75 b0 mov -0x50(%rbp),%rsi : if (hashp->hctl->max_dsize != NO_MAX_DSIZE) : return false; : : /* Reallocate directory */ : new_dsize = hashp->hctl->dsize << 1; : old_dirsize = hashp->hctl->dsize * sizeof(HASHSEGMENT); 0.00 : 7845b5: 48 c1 e3 03 shl $0x3,%rbx : CurrentDynaHashCxt = hashp->hcxt; : p = (HASHSEGMENT *) hashp->alloc((Size) new_dirsize); : : if (p != NULL) : { : memcpy(p, old_p, old_dirsize); 0.00 : 7845b9: 48 89 da mov %rbx,%rdx 0.00 : 7845bc: e8 2f 56 ce ff callq 469bf0 : MemSet(((char *) p) + old_dirsize, 0, new_dirsize - old_dirsize); 0.00 : 7845c1: 48 8b 7d a8 mov -0x58(%rbp),%rdi 0.00 : 7845c5: 48 8b 55 a0 mov -0x60(%rbp),%rdx 0.00 : 7845c9: 48 01 df add %rbx,%rdi 0.00 : 7845cc: 48 29 da sub %rbx,%rdx 0.00 : 7845cf: 40 f6 c7 07 test $0x7,%dil 0.00 : 7845d3: 0f 85 3e ff ff ff jne 784517 0.00 : 7845d9: 48 81 fa 00 04 00 00 cmp $0x400,%rdx 0.00 : 7845e0: 0f 87 31 ff ff ff ja 784517 0.00 : 7845e6: 48 8d 04 17 lea (%rdi,%rdx,1),%rax 0.00 : 7845ea: 48 39 c7 cmp %rax,%rdi 0.00 : 7845ed: 0f 83 2b ff ff ff jae 78451e 0.00 : 7845f3: 48 c7 07 00 00 00 00 movq $0x0,(%rdi) 0.00 : 7845fa: 48 83 c7 08 add $0x8,%rdi 0.00 : 7845fe: 48 39 f8 cmp %rdi,%rax 0.00 : 784601: 77 f0 ja 7845f3 0.00 : 784603: e9 16 ff ff ff jmpq 78451e : if (hashp->isshared) : ereport(ERROR, : (errcode(ERRCODE_OUT_OF_MEMORY), : errmsg("out of shared memory"))); : else : ereport(ERROR, 0.00 : 784608: 45 31 c0 xor %r8d,%r8d 0.00 : 78460b: b9 f0 5b 8d 00 mov $0x8d5bf0,%ecx 0.00 : 784610: ba ca 03 00 00 mov $0x3ca,%edx 0.00 : 784615: be 33 59 8d 00 mov $0x8d5933,%esi 0.00 : 78461a: bf 14 00 00 00 mov $0x14,%edi 0.00 : 78461f: e8 9c 64 ff ff callq 77aac0 0.00 : 784624: 84 c0 test %al,%al 0.00 : 784626: 0f 84 45 fc ff ff je 784271 0.00 : 78462c: bf 04 9c 7b 00 mov $0x7b9c04,%edi 0.00 : 784631: e9 b1 fd ff ff jmpq 7843e7 : : old_p = hashp->dir; : CurrentDynaHashCxt = hashp->hcxt; : p = (HASHSEGMENT *) hashp->alloc((Size) new_dirsize); : : if (p != NULL) 0.00 : 784636: 49 8b 46 50 mov 0x50(%r14),%rax 0.00 : 78463a: 48 8b 5d 90 mov -0x70(%rbp),%rbx 0.00 : 78463e: 41 8b 4e 58 mov 0x58(%r14),%ecx 0.00 : 784642: 4c 8d 68 ff lea -0x1(%rax),%r13 0.00 : 784646: 44 8b 43 28 mov 0x28(%rbx),%r8d 0.00 : 78464a: e9 d9 fb ff ff jmpq 784228 : if (currBucket != NULL) : return (void *) ELEMENTKEY(currBucket); : : /* disallow inserts if frozen */ : if (hashp->frozen) : elog(ERROR, "cannot insert into frozen hashtable \"%s\"", 0.00 : 78464f: ba f0 5b 8d 00 mov $0x8d5bf0,%edx 0.00 : 784654: be ba 03 00 00 mov $0x3ba,%esi 0.00 : 784659: bf 33 59 8d 00 mov $0x8d5933,%edi 0.00 : 78465e: e8 bd 6d ff ff callq 77b420 0.00 : 784663: 49 8b 56 38 mov 0x38(%r14),%rdx 0.00 : 784667: be c0 5a 8d 00 mov $0x8d5ac0,%esi 0.00 : 78466c: bf 14 00 00 00 mov $0x14,%edi 0.00 : 784671: 31 c0 xor %eax,%eax 0.00 : 784673: e8 b8 6b ff ff callq 77b230 0.00 : 784678: e8 53 4e ce ff callq 4694d0 : { : /* Allocate new segment if necessary -- could fail if dir full */ : if (new_segnum >= hctl->dsize) : if (!dir_realloc(hashp)) : return false; : if (!(hashp->dir[new_segnum] = seg_alloc(hashp))) 0.00 : 78467d: 48 8b 45 90 mov -0x70(%rbp),%rax 0.00 : 784681: 41 8b 4e 58 mov 0x58(%r14),%ecx 0.00 : 784685: 8b 70 28 mov 0x28(%rax),%esi 0.00 : 784688: 49 8b 46 50 mov 0x50(%r14),%rax 0.00 : 78468c: 4c 8d 68 ff lea -0x1(%rax),%r13 0.00 : 784690: e9 13 fa ff ff jmpq 7840a8 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 50.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/resowner/resowner.c:577 50.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/resowner/resowner.c:580 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 000000000079ae70 : : * We allow the case owner == NULL because the bufmgr is sometimes invoked : * outside any transaction (for example, during WAL recovery). : */ : void : ResourceOwnerEnlargeBuffers(ResourceOwner owner) : { 0.00 : 79ae70: 55 push %rbp 0.00 : 79ae71: 48 89 e5 mov %rsp,%rbp 0.00 : 79ae74: 4c 89 65 f8 mov %r12,-0x8(%rbp) 0.00 : 79ae78: 48 89 5d f0 mov %rbx,-0x10(%rbp) /home/Computational/mark/src/postgres-andres/src/backend/utils/resowner/resowner.c:577 50.00 : 79ae7c: 48 83 ec 10 sub $0x10,%rsp : int newmax; : : if (owner == NULL || 0.00 : 79ae80: 48 85 ff test %rdi,%rdi : * We allow the case owner == NULL because the bufmgr is sometimes invoked : * outside any transaction (for example, during WAL recovery). : */ : void : ResourceOwnerEnlargeBuffers(ResourceOwner owner) : { 0.00 : 79ae83: 49 89 fc mov %rdi,%r12 : int newmax; : : if (owner == NULL || 0.00 : 79ae86: 74 2a je 79aeb2 0.00 : 79ae88: 8b 47 30 mov 0x30(%rdi),%eax /home/Computational/mark/src/postgres-andres/src/backend/utils/resowner/resowner.c:580 50.00 : 79ae8b: 39 47 20 cmp %eax,0x20(%rdi) 0.00 : 79ae8e: 7c 22 jl 79aeb2 : owner->nbuffers < owner->maxbuffers) : return; /* nothing to do */ : : if (owner->buffers == NULL) 0.00 : 79ae90: 48 8b 7f 28 mov 0x28(%rdi),%rdi 0.00 : 79ae94: 48 85 ff test %rdi,%rdi 0.00 : 79ae97: 74 27 je 79aec0 : MemoryContextAlloc(TopMemoryContext, newmax * sizeof(Buffer)); : owner->maxbuffers = newmax; : } : else : { : newmax = owner->maxbuffers * 2; 0.00 : 79ae99: 8d 1c 00 lea (%rax,%rax,1),%ebx : owner->buffers = (Buffer *) 0.00 : 79ae9c: 48 63 f3 movslq %ebx,%rsi 0.00 : 79ae9f: 48 c1 e6 02 shl $0x2,%rsi 0.00 : 79aea3: e8 48 de ff ff callq 798cf0 : repalloc(owner->buffers, newmax * sizeof(Buffer)); : owner->maxbuffers = newmax; 0.00 : 79aea8: 41 89 5c 24 30 mov %ebx,0x30(%r12) : owner->maxbuffers = newmax; : } : else : { : newmax = owner->maxbuffers * 2; : owner->buffers = (Buffer *) 0.00 : 79aead: 49 89 44 24 28 mov %rax,0x28(%r12) : repalloc(owner->buffers, newmax * sizeof(Buffer)); : owner->maxbuffers = newmax; : } : } 0.00 : 79aeb2: 48 8b 1c 24 mov (%rsp),%rbx 0.00 : 79aeb6: 4c 8b 64 24 08 mov 0x8(%rsp),%r12 0.00 : 79aebb: c9 leaveq 0.00 : 79aebc: c3 retq 0.00 : 79aebd: 0f 1f 00 nopl (%rax) : return; /* nothing to do */ : : if (owner->buffers == NULL) : { : newmax = 16; : owner->buffers = (Buffer *) 0.00 : 79aec0: 48 8b 3d a1 f9 41 00 mov 0x41f9a1(%rip),%rdi # bba868 0.00 : 79aec7: be 40 00 00 00 mov $0x40,%esi 0.00 : 79aecc: e8 bf df ff ff callq 798e90 : MemoryContextAlloc(TopMemoryContext, newmax * sizeof(Buffer)); : owner->maxbuffers = newmax; 0.00 : 79aed1: 41 c7 44 24 30 10 00 movl $0x10,0x30(%r12) 0.00 : 79aed8: 00 00 : return; /* nothing to do */ : : if (owner->buffers == NULL) : { : newmax = 16; : owner->buffers = (Buffer *) 0.00 : 79aeda: 49 89 44 24 28 mov %rax,0x28(%r12) 0.00 : 79aedf: eb d1 jmp 79aeb2 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 50.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/time/tqual.c:1423 50.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/time/tqual.c:1525 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000007a5600 : : * by this function. This is OK for current uses, because we actually only : * apply this for known-committed XIDs. : */ : static bool : XidInMVCCSnapshot(TransactionId xid, Snapshot snapshot) : { 0.00 : 7a5600: 55 push %rbp 0.00 : 7a5601: 48 89 e5 mov %rsp,%rbp 0.00 : 7a5604: 41 54 push %r12 0.00 : 7a5606: 49 89 f4 mov %rsi,%r12 /home/Computational/mark/src/postgres-andres/src/backend/utils/time/tqual.c:1423 50.00 : 7a5609: 53 push %rbx : * a parent with XID < xmin, while one with XID >= xmax must belong to a : * parent that was not yet committed at the time of this snapshot. : */ : : /* Any xid < xmin is not in-progress */ : if (TransactionIdPrecedes(xid, snapshot->xmin)) 0.00 : 7a560a: 8b 76 08 mov 0x8(%rsi),%esi : * by this function. This is OK for current uses, because we actually only : * apply this for known-committed XIDs. : */ : static bool : XidInMVCCSnapshot(TransactionId xid, Snapshot snapshot) : { 0.00 : 7a560d: 89 fb mov %edi,%ebx : * a parent with XID < xmin, while one with XID >= xmax must belong to a : * parent that was not yet committed at the time of this snapshot. : */ : : /* Any xid < xmin is not in-progress */ : if (TransactionIdPrecedes(xid, snapshot->xmin)) 0.00 : 7a560f: e8 cc a9 d1 ff callq 4bffe0 0.00 : 7a5614: 84 c0 test %al,%al 0.00 : 7a5616: 74 08 je 7a5620 : return true; : } : } : : return false; : } 0.00 : 7a5618: 5b pop %rbx : /* : * We now have either a top-level xid higher than xmin or an : * indeterminate xid. We don't know whether it's top level or subxact : * but it doesn't matter. If it's present, the xid is visible. : */ : for (j = 0; j < snapshot->subxcnt; j++) 0.00 : 7a5619: 31 c0 xor %eax,%eax : return true; : } : } : : return false; : } 0.00 : 7a561b: 41 5c pop %r12 0.00 : 7a561d: c9 leaveq /home/Computational/mark/src/postgres-andres/src/backend/utils/time/tqual.c:1525 50.00 : 7a561e: c3 retq 0.00 : 7a561f: 90 nop : : /* Any xid < xmin is not in-progress */ : if (TransactionIdPrecedes(xid, snapshot->xmin)) : return false; : /* Any xid >= xmax is in-progress */ : if (TransactionIdFollowsOrEquals(xid, snapshot->xmax)) 0.00 : 7a5620: 41 8b 74 24 0c mov 0xc(%r12),%esi 0.00 : 7a5625: 89 df mov %ebx,%edi 0.00 : 7a5627: e8 44 aa d1 ff callq 4c0070 0.00 : 7a562c: 84 c0 test %al,%al 0.00 : 7a562e: 0f 85 7c 00 00 00 jne 7a56b0 : : /* : * Snapshot information is stored slightly differently in snapshots taken : * during recovery. : */ : if (!snapshot->takenDuringRecovery) 0.00 : 7a5634: 41 80 7c 24 29 00 cmpb $0x0,0x29(%r12) 0.00 : 7a563a: 0f 85 80 00 00 00 jne 7a56c0 : * check things is just to compare the given XID against both subxact : * XIDs and top-level XIDs. If the snapshot overflowed, we have to : * use pg_subtrans to convert a subxact XID to its parent XID, but : * then we need only look at top-level XIDs not subxacts. : */ : if (!snapshot->suboverflowed) 0.00 : 7a5640: 41 80 7c 24 28 00 cmpb $0x0,0x28(%r12) 0.00 : 7a5646: 0f 85 b4 00 00 00 jne 7a5700 : { : /* full data, so search subxip */ : int32 j; : : for (j = 0; j < snapshot->subxcnt; j++) 0.00 : 7a564c: 41 8b 74 24 1c mov 0x1c(%r12),%esi 0.00 : 7a5651: 85 f6 test %esi,%esi 0.00 : 7a5653: 7e 25 jle 7a567a : { : if (TransactionIdEquals(xid, snapshot->subxip[j])) 0.00 : 7a5655: 49 8b 44 24 20 mov 0x20(%r12),%rax 0.00 : 7a565a: 31 d2 xor %edx,%edx 0.00 : 7a565c: 39 18 cmp %ebx,(%rax) 0.00 : 7a565e: 48 89 c1 mov %rax,%rcx 0.00 : 7a5661: 75 10 jne 7a5673 0.00 : 7a5663: eb 4b jmp 7a56b0 0.00 : 7a5665: 0f 1f 00 nopl (%rax) 0.00 : 7a5668: 8b 41 04 mov 0x4(%rcx),%eax 0.00 : 7a566b: 48 83 c1 04 add $0x4,%rcx 0.00 : 7a566f: 39 d8 cmp %ebx,%eax 0.00 : 7a5671: 74 3d je 7a56b0 : if (!snapshot->suboverflowed) : { : /* full data, so search subxip */ : int32 j; : : for (j = 0; j < snapshot->subxcnt; j++) 0.00 : 7a5673: 83 c2 01 add $0x1,%edx 0.00 : 7a5676: 39 f2 cmp %esi,%edx 0.00 : 7a5678: 7c ee jl 7a5668 : */ : if (TransactionIdPrecedes(xid, snapshot->xmin)) : return false; : } : : for (i = 0; i < snapshot->xcnt; i++) 0.00 : 7a567a: 41 8b 74 24 18 mov 0x18(%r12),%esi 0.00 : 7a567f: 85 f6 test %esi,%esi 0.00 : 7a5681: 74 95 je 7a5618 : { : if (TransactionIdEquals(xid, snapshot->xip[i])) 0.00 : 7a5683: 49 8b 44 24 10 mov 0x10(%r12),%rax 0.00 : 7a5688: 31 d2 xor %edx,%edx 0.00 : 7a568a: 39 18 cmp %ebx,(%rax) 0.00 : 7a568c: 48 89 c1 mov %rax,%rcx 0.00 : 7a568f: 75 12 jne 7a56a3 0.00 : 7a5691: eb 1d jmp 7a56b0 0.00 : 7a5693: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 7a5698: 8b 41 04 mov 0x4(%rcx),%eax 0.00 : 7a569b: 48 83 c1 04 add $0x4,%rcx 0.00 : 7a569f: 39 d8 cmp %ebx,%eax 0.00 : 7a56a1: 74 0d je 7a56b0 : */ : if (TransactionIdPrecedes(xid, snapshot->xmin)) : return false; : } : : for (i = 0; i < snapshot->xcnt; i++) 0.00 : 7a56a3: 83 c2 01 add $0x1,%edx 0.00 : 7a56a6: 39 f2 cmp %esi,%edx 0.00 : 7a56a8: 72 ee jb 7a5698 0.00 : 7a56aa: e9 69 ff ff ff jmpq 7a5618 0.00 : 7a56af: 90 nop : return true; : } : } : : return false; : } 0.00 : 7a56b0: 5b pop %rbx : /* : * We now have either a top-level xid higher than xmin or an : * indeterminate xid. We don't know whether it's top level or subxact : * but it doesn't matter. If it's present, the xid is visible. : */ : for (j = 0; j < snapshot->subxcnt; j++) 0.00 : 7a56b1: b8 01 00 00 00 mov $0x1,%eax : return true; : } : } : : return false; : } 0.00 : 7a56b6: 41 5c pop %r12 0.00 : 7a56b8: c9 leaveq 0.00 : 7a56b9: c3 retq 0.00 : 7a56ba: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : * far the bigger array, and we mostly don't know which xids are : * top-level and which are subxacts. The xip array is empty. : * : * We start by searching subtrans, if we overflowed. : */ : if (snapshot->suboverflowed) 0.00 : 7a56c0: 41 80 7c 24 28 00 cmpb $0x0,0x28(%r12) 0.00 : 7a56c6: 75 60 jne 7a5728 : /* : * We now have either a top-level xid higher than xmin or an : * indeterminate xid. We don't know whether it's top level or subxact : * but it doesn't matter. If it's present, the xid is visible. : */ : for (j = 0; j < snapshot->subxcnt; j++) 0.00 : 7a56c8: 41 8b 74 24 1c mov 0x1c(%r12),%esi 0.00 : 7a56cd: 85 f6 test %esi,%esi 0.00 : 7a56cf: 0f 8e 43 ff ff ff jle 7a5618 : { : if (TransactionIdEquals(xid, snapshot->subxip[j])) 0.00 : 7a56d5: 49 8b 44 24 20 mov 0x20(%r12),%rax 0.00 : 7a56da: 31 d2 xor %edx,%edx 0.00 : 7a56dc: 39 18 cmp %ebx,(%rax) 0.00 : 7a56de: 48 89 c1 mov %rax,%rcx 0.00 : 7a56e1: 75 10 jne 7a56f3 0.00 : 7a56e3: eb cb jmp 7a56b0 0.00 : 7a56e5: 0f 1f 00 nopl (%rax) 0.00 : 7a56e8: 8b 41 04 mov 0x4(%rcx),%eax 0.00 : 7a56eb: 48 83 c1 04 add $0x4,%rcx 0.00 : 7a56ef: 39 d8 cmp %ebx,%eax 0.00 : 7a56f1: 74 bd je 7a56b0 : /* : * We now have either a top-level xid higher than xmin or an : * indeterminate xid. We don't know whether it's top level or subxact : * but it doesn't matter. If it's present, the xid is visible. : */ : for (j = 0; j < snapshot->subxcnt; j++) 0.00 : 7a56f3: 83 c2 01 add $0x1,%edx 0.00 : 7a56f6: 39 f2 cmp %esi,%edx 0.00 : 7a56f8: 7c ee jl 7a56e8 0.00 : 7a56fa: e9 19 ff ff ff jmpq 7a5618 0.00 : 7a56ff: 90 nop : /* not there, fall through to search xip[] */ : } : else : { : /* overflowed, so convert xid to top-level */ : xid = SubTransGetTopmostTransaction(xid); 0.00 : 7a5700: 89 df mov %ebx,%edi 0.00 : 7a5702: e8 e9 11 d2 ff callq 4c68f0 : /* : * If xid was indeed a subxact, we might now have an xid < xmin, : * so recheck to avoid an array scan. No point in rechecking : * xmax. : */ : if (TransactionIdPrecedes(xid, snapshot->xmin)) 0.00 : 7a5707: 41 8b 74 24 08 mov 0x8(%r12),%esi 0.00 : 7a570c: 89 c7 mov %eax,%edi : /* not there, fall through to search xip[] */ : } : else : { : /* overflowed, so convert xid to top-level */ : xid = SubTransGetTopmostTransaction(xid); 0.00 : 7a570e: 89 c3 mov %eax,%ebx : /* : * If xid was indeed a subxact, we might now have an xid < xmin, : * so recheck to avoid an array scan. No point in rechecking : * xmax. : */ : if (TransactionIdPrecedes(xid, snapshot->xmin)) 0.00 : 7a5710: e8 cb a8 d1 ff callq 4bffe0 0.00 : 7a5715: 84 c0 test %al,%al 0.00 : 7a5717: 0f 84 5d ff ff ff je 7a567a 0.00 : 7a571d: e9 f6 fe ff ff jmpq 7a5618 0.00 : 7a5722: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : * We start by searching subtrans, if we overflowed. : */ : if (snapshot->suboverflowed) : { : /* overflowed, so convert xid to top-level */ : xid = SubTransGetTopmostTransaction(xid); 0.00 : 7a5728: 89 df mov %ebx,%edi 0.00 : 7a572a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 7a5730: e8 bb 11 d2 ff callq 4c68f0 : /* : * If xid was indeed a subxact, we might now have an xid < xmin, : * so recheck to avoid an array scan. No point in rechecking : * xmax. : */ : if (TransactionIdPrecedes(xid, snapshot->xmin)) 0.00 : 7a5735: 41 8b 74 24 08 mov 0x8(%r12),%esi 0.00 : 7a573a: 89 c7 mov %eax,%edi : * We start by searching subtrans, if we overflowed. : */ : if (snapshot->suboverflowed) : { : /* overflowed, so convert xid to top-level */ : xid = SubTransGetTopmostTransaction(xid); 0.00 : 7a573c: 89 c3 mov %eax,%ebx : /* : * If xid was indeed a subxact, we might now have an xid < xmin, : * so recheck to avoid an array scan. No point in rechecking : * xmax. : */ : if (TransactionIdPrecedes(xid, snapshot->xmin)) 0.00 : 7a573e: e8 9d a8 d1 ff callq 4bffe0 0.00 : 7a5743: 84 c0 test %al,%al 0.00 : 7a5745: 74 81 je 7a56c8 0.00 : 7a5747: e9 cc fe ff ff jmpq 7a5618 Sorted summary for file /lib64/libc-2.11.3.so ---------------------------------------------- 50.00 ??:0 50.00 ??:0 Percent | Source code & Disassembly of /lib64/libc-2.11.3.so ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000000cd5c0 <__read>: ??:0 50.00 : cd5c0: 83 3d ed a0 2a 00 00 cmpl $0x0,0x2aa0ed(%rip) # 3776b4 <__libc_multiple_threads> 50.00 : cd5c7: 75 10 jne cd5d9 <__read_nocancel+0x10> : : 00000000000cd5c9 <__read_nocancel>: 0.00 : cd5c9: b8 00 00 00 00 mov $0x0,%eax 0.00 : cd5ce: 0f 05 syscall 0.00 : cd5d0: 48 3d 01 f0 ff ff cmp $0xfffffffffffff001,%rax 0.00 : cd5d6: 73 31 jae cd609 <__read_nocancel+0x40> 0.00 : cd5d8: c3 retq 0.00 : cd5d9: 48 83 ec 08 sub $0x8,%rsp 0.00 : cd5dd: e8 4e ac 01 00 callq e8230 <__libc_enable_asynccancel> 0.00 : cd5e2: 48 89 04 24 mov %rax,(%rsp) 0.00 : cd5e6: b8 00 00 00 00 mov $0x0,%eax 0.00 : cd5eb: 0f 05 syscall 0.00 : cd5ed: 48 8b 3c 24 mov (%rsp),%rdi 0.00 : cd5f1: 48 89 c2 mov %rax,%rdx 0.00 : cd5f4: e8 97 ac 01 00 callq e8290 <__libc_disable_asynccancel> 0.00 : cd5f9: 48 89 d0 mov %rdx,%rax 0.00 : cd5fc: 48 83 c4 08 add $0x8,%rsp 0.00 : cd600: 48 3d 01 f0 ff ff cmp $0xfffffffffffff001,%rax 0.00 : cd606: 73 01 jae cd609 <__read_nocancel+0x40> 0.00 : cd608: c3 retq 0.00 : cd609: 48 8b 0d 28 48 2a 00 mov 0x2a4828(%rip),%rcx # 371e38 <_DYNAMIC+0x2d8> 0.00 : cd610: 31 d2 xor %edx,%edx 0.00 : cd612: 48 29 c2 sub %rax,%rdx 0.00 : cd615: 64 89 11 mov %edx,%fs:(%rcx) 0.00 : cd618: 48 83 c8 ff or $0xffffffffffffffff,%rax 0.00 : cd61c: eb ea jmp cd608 <__read_nocancel+0x3f> Sorted summary for file /lib64/libc-2.11.3.so ---------------------------------------------- 100.00 ??:0 Percent | Source code & Disassembly of /lib64/libc-2.11.3.so ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000000db0c0 <__lseek>: 0.00 : db0c0: 83 3d ed c5 29 00 00 cmpl $0x0,0x29c5ed(%rip) # 3776b4 <__libc_multiple_threads> ??:0 100.00 : db0c7: 75 10 jne db0d9 <__lseek_nocancel+0x10> : : 00000000000db0c9 <__lseek_nocancel>: 0.00 : db0c9: b8 08 00 00 00 mov $0x8,%eax 0.00 : db0ce: 0f 05 syscall 0.00 : db0d0: 48 3d 01 f0 ff ff cmp $0xfffffffffffff001,%rax 0.00 : db0d6: 73 31 jae db109 <__lseek_nocancel+0x40> 0.00 : db0d8: c3 retq 0.00 : db0d9: 48 83 ec 08 sub $0x8,%rsp 0.00 : db0dd: e8 4e d1 00 00 callq e8230 <__libc_enable_asynccancel> 0.00 : db0e2: 48 89 04 24 mov %rax,(%rsp) 0.00 : db0e6: b8 08 00 00 00 mov $0x8,%eax 0.00 : db0eb: 0f 05 syscall 0.00 : db0ed: 48 8b 3c 24 mov (%rsp),%rdi 0.00 : db0f1: 48 89 c2 mov %rax,%rdx 0.00 : db0f4: e8 97 d1 00 00 callq e8290 <__libc_disable_asynccancel> 0.00 : db0f9: 48 89 d0 mov %rdx,%rax 0.00 : db0fc: 48 83 c4 08 add $0x8,%rsp 0.00 : db100: 48 3d 01 f0 ff ff cmp $0xfffffffffffff001,%rax 0.00 : db106: 73 01 jae db109 <__lseek_nocancel+0x40> 0.00 : db108: c3 retq 0.00 : db109: 48 8b 0d 28 6d 29 00 mov 0x296d28(%rip),%rcx # 371e38 <_DYNAMIC+0x2d8> 0.00 : db110: 31 d2 xor %edx,%edx 0.00 : db112: 48 29 c2 sub %rax,%rdx 0.00 : db115: 64 89 11 mov %edx,%fs:(%rcx) 0.00 : db118: 48 83 c8 ff or $0xffffffffffffffff,%rax 0.00 : db11c: eb ea jmp db108 <__lseek_nocancel+0x3f> Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 100.00 ??:0 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .plt: : : 00000000004695c0 : ??:0 100.00 : 4695c0: ff 25 82 db 6f 00 jmpq *0x6fdb82(%rip) # b67148 <_GLOBAL_OFFSET_TABLE_+0x148> 0.00 : 4695c6: 68 26 00 00 00 pushq $0x26 0.00 : 4695cb: e9 80 fd ff ff jmpq 469350 <_init+0x20> Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 100.00 /home/Computational/mark/src/postgres-andres/src/backend/access/common/scankey.c:109 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000473b40 : : StrategyNumber strategy, : Oid subtype, : Oid collation, : FmgrInfo *finfo, : Datum argument) : { /home/Computational/mark/src/postgres-andres/src/backend/access/common/scankey.c:109 100.00 : 473b40: 55 push %rbp 0.00 : 473b41: 48 89 e5 mov %rsp,%rbp 0.00 : 473b44: 4c 8b 55 10 mov 0x10(%rbp),%r10 : entry->sk_flags = flags; 0.00 : 473b48: 89 37 mov %esi,(%rdi) : entry->sk_attno = attributeNumber; 0.00 : 473b4a: 66 89 57 04 mov %dx,0x4(%rdi) : entry->sk_strategy = strategy; 0.00 : 473b4e: 66 89 4f 06 mov %cx,0x6(%rdi) : entry->sk_subtype = subtype; 0.00 : 473b52: 44 89 47 08 mov %r8d,0x8(%rdi) : entry->sk_collation = collation; 0.00 : 473b56: 44 89 4f 0c mov %r9d,0xc(%rdi) : entry->sk_argument = argument; 0.00 : 473b5a: 48 8b 45 18 mov 0x18(%rbp),%rax : fmgr_info_copy(&entry->sk_func, finfo, CurrentMemoryContext); 0.00 : 473b5e: 4c 89 d6 mov %r10,%rsi : entry->sk_flags = flags; : entry->sk_attno = attributeNumber; : entry->sk_strategy = strategy; : entry->sk_subtype = subtype; : entry->sk_collation = collation; : entry->sk_argument = argument; 0.00 : 473b61: 48 89 47 40 mov %rax,0x40(%rdi) : fmgr_info_copy(&entry->sk_func, finfo, CurrentMemoryContext); 0.00 : 473b65: 48 8b 15 f4 6c 74 00 mov 0x746cf4(%rip),%rdx # bba860 0.00 : 473b6c: 48 83 c7 10 add $0x10,%rdi : } 0.00 : 473b70: c9 leaveq : entry->sk_attno = attributeNumber; : entry->sk_strategy = strategy; : entry->sk_subtype = subtype; : entry->sk_collation = collation; : entry->sk_argument = argument; : fmgr_info_copy(&entry->sk_func, finfo, CurrentMemoryContext); 0.00 : 473b71: e9 ca bb 30 00 jmpq 77f740 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 100.00 /home/Computational/mark/src/postgres-andres/src/backend/access/heap/heapam.c:1735 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 000000000049d220 : : */ : bool : heap_hot_search_buffer(ItemPointer tid, Relation relation, Buffer buffer, : Snapshot snapshot, HeapTuple heapTuple, : bool *all_dead, bool first_call) : { 0.00 : 49d220: 55 push %rbp 0.00 : 49d221: 48 89 e5 mov %rsp,%rbp 0.00 : 49d224: 41 57 push %r15 0.00 : 49d226: 4d 89 cf mov %r9,%r15 0.00 : 49d229: 41 56 push %r14 0.00 : 49d22b: 4d 89 c6 mov %r8,%r14 0.00 : 49d22e: 41 55 push %r13 0.00 : 49d230: 41 54 push %r12 0.00 : 49d232: 53 push %rbx 0.00 : 49d233: 48 83 ec 28 sub $0x28,%rsp : Page dp = (Page) BufferGetPage(buffer); 0.00 : 49d237: 85 d2 test %edx,%edx : */ : bool : heap_hot_search_buffer(ItemPointer tid, Relation relation, Buffer buffer, : Snapshot snapshot, HeapTuple heapTuple, : bool *all_dead, bool first_call) : { 0.00 : 49d239: 48 89 4d b8 mov %rcx,-0x48(%rbp) 0.00 : 49d23d: 48 89 7d d0 mov %rdi,-0x30(%rbp) 0.00 : 49d241: 48 89 75 c8 mov %rsi,-0x38(%rbp) 0.00 : 49d245: 89 55 c4 mov %edx,-0x3c(%rbp) 0.00 : 49d248: 0f b6 4d 10 movzbl 0x10(%rbp),%ecx : Page dp = (Page) BufferGetPage(buffer); 0.00 : 49d24c: 0f 88 5e 02 00 00 js 49d4b0 0.00 : 49d252: 8b 45 c4 mov -0x3c(%rbp),%eax 0.00 : 49d255: 83 e8 01 sub $0x1,%eax 0.00 : 49d258: 4c 63 e8 movslq %eax,%r13 0.00 : 49d25b: 49 c1 e5 0d shl $0xd,%r13 0.00 : 49d25f: 4c 03 2d 92 28 72 00 add 0x722892(%rip),%r13 # bbfaf8 : bool at_chain_start; : bool valid; : bool skip; : : /* If this is not the first call, previous call returned a (live!) tuple */ : if (all_dead) 0.00 : 49d266: 4d 85 ff test %r15,%r15 0.00 : 49d269: 74 03 je 49d26e : *all_dead = first_call; 0.00 : 49d26b: 41 88 0f mov %cl,(%r15) : : Assert(TransactionIdIsValid(RecentGlobalXmin)); : : Assert(ItemPointerGetBlockNumber(tid) == BufferGetBlockNumber(buffer)); : offnum = ItemPointerGetOffsetNumber(tid); 0.00 : 49d26e: 48 8b 45 d0 mov -0x30(%rbp),%rax 0.00 : 49d272: 44 0f b7 60 04 movzwl 0x4(%rax),%r12d : at_chain_start = first_call; : skip = !first_call; : : heapTuple->t_self = *tid; 0.00 : 49d277: 48 89 c2 mov %rax,%rdx 0.00 : 49d27a: 8b 00 mov (%rax),%eax 0.00 : 49d27c: 41 89 46 04 mov %eax,0x4(%r14) 0.00 : 49d280: 0f b7 42 04 movzwl 0x4(%rdx),%eax : for (;;) : { : ItemId lp; : : /* check for bogus TID */ : if (offnum < FirstOffsetNumber || offnum > PageGetMaxOffsetNumber(dp)) 0.00 : 49d284: 66 45 85 e4 test %r12w,%r12w : Assert(ItemPointerGetBlockNumber(tid) == BufferGetBlockNumber(buffer)); : offnum = ItemPointerGetOffsetNumber(tid); : at_chain_start = first_call; : skip = !first_call; : : heapTuple->t_self = *tid; 0.00 : 49d288: 66 41 89 46 08 mov %ax,0x8(%r14) : for (;;) : { : ItemId lp; : : /* check for bogus TID */ : if (offnum < FirstOffsetNumber || offnum > PageGetMaxOffsetNumber(dp)) 0.00 : 49d28d: 74 4e je 49d2dd : Assert(TransactionIdIsValid(RecentGlobalXmin)); : : Assert(ItemPointerGetBlockNumber(tid) == BufferGetBlockNumber(buffer)); : offnum = ItemPointerGetOffsetNumber(tid); : at_chain_start = first_call; : skip = !first_call; 0.00 : 49d28f: 84 c9 test %cl,%cl 0.00 : 49d291: 89 ce mov %ecx,%esi 0.00 : 49d293: 41 0f 94 c0 sete %r8b 0.00 : 49d297: 31 ff xor %edi,%edi 0.00 : 49d299: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : for (;;) : { : ItemId lp; : : /* check for bogus TID */ : if (offnum < FirstOffsetNumber || offnum > PageGetMaxOffsetNumber(dp)) 0.00 : 49d2a0: 41 0f b7 55 0c movzwl 0xc(%r13),%edx 0.00 : 49d2a5: 31 c0 xor %eax,%eax 0.00 : 49d2a7: 41 0f b7 cc movzwl %r12w,%ecx 0.00 : 49d2ab: 66 83 fa 18 cmp $0x18,%dx 0.00 : 49d2af: 76 0b jbe 49d2bc 0.00 : 49d2b1: 0f b7 c2 movzwl %dx,%eax 0.00 : 49d2b4: 48 83 e8 18 sub $0x18,%rax 0.00 : 49d2b8: 48 c1 e8 02 shr $0x2,%rax 0.00 : 49d2bc: 48 39 c8 cmp %rcx,%rax 0.00 : 49d2bf: 72 1c jb 49d2dd : break; : : lp = PageGetItemId(dp, offnum); : : /* check for unused, dead, or redirected items */ : if (!ItemIdIsNormal(lp)) 0.00 : 49d2c1: 48 8d 51 03 lea 0x3(%rcx),%rdx 0.00 : 49d2c5: 41 8b 44 95 08 mov 0x8(%r13,%rdx,4),%eax 0.00 : 49d2ca: 25 00 80 01 00 and $0x18000,%eax 0.00 : 49d2cf: 3d 00 80 00 00 cmp $0x8000,%eax 0.00 : 49d2d4: 74 3a je 49d310 : { : /* We should only see a redirect at start of chain */ : if (ItemIdIsRedirected(lp) && at_chain_start) 0.00 : 49d2d6: 3d 00 00 01 00 cmp $0x10000,%eax 0.00 : 49d2db: 74 13 je 49d2f0 : { : Assert(ItemPointerGetBlockNumber(&heapTuple->t_data->t_ctid) == : ItemPointerGetBlockNumber(tid)); : offnum = ItemPointerGetOffsetNumber(&heapTuple->t_data->t_ctid); : at_chain_start = false; : prev_xmax = HeapTupleHeaderGetUpdateXid(heapTuple->t_data); 0.00 : 49d2dd: 31 c0 xor %eax,%eax : else : break; /* end of chain */ : } : : return false; : } 0.00 : 49d2df: 48 83 c4 28 add $0x28,%rsp 0.00 : 49d2e3: 5b pop %rbx 0.00 : 49d2e4: 41 5c pop %r12 0.00 : 49d2e6: 41 5d pop %r13 0.00 : 49d2e8: 41 5e pop %r14 0.00 : 49d2ea: 41 5f pop %r15 0.00 : 49d2ec: c9 leaveq 0.00 : 49d2ed: c3 retq 0.00 : 49d2ee: 66 90 xchg %ax,%ax : : /* check for unused, dead, or redirected items */ : if (!ItemIdIsNormal(lp)) : { : /* We should only see a redirect at start of chain */ : if (ItemIdIsRedirected(lp) && at_chain_start) 0.00 : 49d2f0: 40 84 f6 test %sil,%sil 0.00 : 49d2f3: 74 e8 je 49d2dd : { : /* Follow the redirect */ : offnum = ItemIdGetRedirect(lp); 0.00 : 49d2f5: 45 0f b7 64 95 08 movzwl 0x8(%r13,%rdx,4),%r12d 0.00 : 49d2fb: 66 41 81 e4 ff 7f and $0x7fff,%r12w : Assert(TransactionIdIsValid(RecentGlobalXmin)); : : Assert(ItemPointerGetBlockNumber(tid) == BufferGetBlockNumber(buffer)); : offnum = ItemPointerGetOffsetNumber(tid); : at_chain_start = first_call; : skip = !first_call; 0.00 : 49d301: 31 f6 xor %esi,%esi : for (;;) : { : ItemId lp; : : /* check for bogus TID */ : if (offnum < FirstOffsetNumber || offnum > PageGetMaxOffsetNumber(dp)) 0.00 : 49d303: 66 45 85 e4 test %r12w,%r12w 0.00 : 49d307: 75 97 jne 49d2a0 0.00 : 49d309: eb d2 jmp 49d2dd 0.00 : 49d30b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : } : /* else must be end of chain */ : break; : } : : heapTuple->t_data = (HeapTupleHeader) PageGetItem(dp, lp); 0.00 : 49d310: 41 0f b7 44 95 08 movzwl 0x8(%r13,%rdx,4),%eax 0.00 : 49d316: 25 ff 7f 00 00 and $0x7fff,%eax 0.00 : 49d31b: 49 8d 4c 05 00 lea 0x0(%r13,%rax,1),%rcx 0.00 : 49d320: 49 89 4e 10 mov %rcx,0x10(%r14) : heapTuple->t_len = ItemIdGetLength(lp); 0.00 : 49d324: 41 0f b7 44 95 0a movzwl 0xa(%r13,%rdx,4),%eax : heapTuple->t_tableOid = RelationGetRelid(relation); 0.00 : 49d32a: 48 8b 55 c8 mov -0x38(%rbp),%rdx : /* else must be end of chain */ : break; : } : : heapTuple->t_data = (HeapTupleHeader) PageGetItem(dp, lp); : heapTuple->t_len = ItemIdGetLength(lp); /home/Computational/mark/src/postgres-andres/src/backend/access/heap/heapam.c:1735 100.00 : 49d32e: 66 d1 e8 shr %ax : ItemPointerSetOffsetNumber(&heapTuple->t_self, offnum); : : /* : * Shouldn't see a HEAP_ONLY tuple at chain start. : */ : if (at_chain_start && HeapTupleIsHeapOnly(heapTuple)) 0.00 : 49d331: 40 84 f6 test %sil,%sil : /* else must be end of chain */ : break; : } : : heapTuple->t_data = (HeapTupleHeader) PageGetItem(dp, lp); : heapTuple->t_len = ItemIdGetLength(lp); 0.00 : 49d334: 0f b7 c0 movzwl %ax,%eax 0.00 : 49d337: 41 89 06 mov %eax,(%r14) : heapTuple->t_tableOid = RelationGetRelid(relation); 0.00 : 49d33a: 8b 42 40 mov 0x40(%rdx),%eax : ItemPointerSetOffsetNumber(&heapTuple->t_self, offnum); 0.00 : 49d33d: 66 45 89 66 08 mov %r12w,0x8(%r14) : break; : } : : heapTuple->t_data = (HeapTupleHeader) PageGetItem(dp, lp); : heapTuple->t_len = ItemIdGetLength(lp); : heapTuple->t_tableOid = RelationGetRelid(relation); 0.00 : 49d342: 41 89 46 0c mov %eax,0xc(%r14) : ItemPointerSetOffsetNumber(&heapTuple->t_self, offnum); : : /* : * Shouldn't see a HEAP_ONLY tuple at chain start. : */ : if (at_chain_start && HeapTupleIsHeapOnly(heapTuple)) 0.00 : 49d346: 74 07 je 49d34f 0.00 : 49d348: 66 83 79 12 00 cmpw $0x0,0x12(%rcx) 0.00 : 49d34d: 78 8e js 49d2dd : : /* : * The xmin should match the previous xmax value, else chain is : * broken. : */ : if (TransactionIdIsValid(prev_xmax) && 0.00 : 49d34f: 85 ff test %edi,%edi 0.00 : 49d351: 74 23 je 49d376 0.00 : 49d353: 49 8b 4e 10 mov 0x10(%r14),%rcx 0.00 : 49d357: ba 02 00 00 00 mov $0x2,%edx 0.00 : 49d35c: 0f b7 41 14 movzwl 0x14(%rcx),%eax 0.00 : 49d360: 25 00 03 00 00 and $0x300,%eax 0.00 : 49d365: 3d 00 03 00 00 cmp $0x300,%eax 0.00 : 49d36a: 74 02 je 49d36e 0.00 : 49d36c: 8b 11 mov (%rcx),%edx 0.00 : 49d36e: 39 fa cmp %edi,%edx 0.00 : 49d370: 0f 85 67 ff ff ff jne 49d2dd : * return the first tuple we find. But on later passes, heapTuple : * will initially be pointing to the tuple we returned last time. : * Returning it again would be incorrect (and would loop forever), so : * we skip it and return the next match we find. : */ : if (!skip) 0.00 : 49d376: 45 84 c0 test %r8b,%r8b 0.00 : 49d379: 74 65 je 49d3e0 : /* : * If we can't see it, maybe no one else can either. At caller : * request, check whether all chain members are dead to all : * transactions. : */ : if (all_dead && *all_dead && 0.00 : 49d37b: 4d 85 ff test %r15,%r15 0.00 : 49d37e: 66 90 xchg %ax,%ax 0.00 : 49d380: 74 0a je 49d38c 0.00 : 49d382: 41 80 3f 00 cmpb $0x0,(%r15) 0.00 : 49d386: 0f 85 04 01 00 00 jne 49d490 : : /* : * Check to see if HOT chain continues past this tuple; if so fetch : * the next offnum and loop around. : */ : if (HeapTupleIsHotUpdated(heapTuple)) 0.00 : 49d38c: 49 8b 7e 10 mov 0x10(%r14),%rdi 0.00 : 49d390: f6 47 13 40 testb $0x40,0x13(%rdi) 0.00 : 49d394: 0f 84 43 ff ff ff je 49d2dd 0.00 : 49d39a: 0f b7 57 14 movzwl 0x14(%rdi),%edx 0.00 : 49d39e: f6 c6 08 test $0x8,%dh 0.00 : 49d3a1: 0f 85 36 ff ff ff jne 49d2dd 0.00 : 49d3a7: 89 d0 mov %edx,%eax 0.00 : 49d3a9: 25 00 03 00 00 and $0x300,%eax 0.00 : 49d3ae: 3d 00 02 00 00 cmp $0x200,%eax 0.00 : 49d3b3: 0f 84 24 ff ff ff je 49d2dd : { : Assert(ItemPointerGetBlockNumber(&heapTuple->t_data->t_ctid) == : ItemPointerGetBlockNumber(tid)); : offnum = ItemPointerGetOffsetNumber(&heapTuple->t_data->t_ctid); : at_chain_start = false; : prev_xmax = HeapTupleHeaderGetUpdateXid(heapTuple->t_data); 0.00 : 49d3b9: 89 d0 mov %edx,%eax : */ : if (HeapTupleIsHotUpdated(heapTuple)) : { : Assert(ItemPointerGetBlockNumber(&heapTuple->t_data->t_ctid) == : ItemPointerGetBlockNumber(tid)); : offnum = ItemPointerGetOffsetNumber(&heapTuple->t_data->t_ctid); 0.00 : 49d3bb: 44 0f b7 67 10 movzwl 0x10(%rdi),%r12d : at_chain_start = false; : prev_xmax = HeapTupleHeaderGetUpdateXid(heapTuple->t_data); 0.00 : 49d3c0: 25 00 18 00 00 and $0x1800,%eax 0.00 : 49d3c5: 3d 00 10 00 00 cmp $0x1000,%eax 0.00 : 49d3ca: 0f 84 a8 00 00 00 je 49d478 0.00 : 49d3d0: 8b 7f 04 mov 0x4(%rdi),%edi 0.00 : 49d3d3: 45 31 c0 xor %r8d,%r8d 0.00 : 49d3d6: e9 26 ff ff ff jmpq 49d301 0.00 : 49d3db: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : * element of the HOT chain we're currently investigating instead : * of the root tuple of the HOT chain. This is important because : * the *Satisfies routine for historical mvcc snapshots needs the : * correct tid to decide about the visibility in some cases. : */ : ItemPointerSet(&(heapTuple->t_self), BufferGetBlockNumber(buffer), offnum); 0.00 : 49d3e0: 8b 7d c4 mov -0x3c(%rbp),%edi 0.00 : 49d3e3: e8 48 6c 1d 00 callq 674030 0.00 : 49d3e8: 8b 7d c4 mov -0x3c(%rbp),%edi 0.00 : 49d3eb: c1 e8 10 shr $0x10,%eax 0.00 : 49d3ee: 66 41 89 46 04 mov %ax,0x4(%r14) 0.00 : 49d3f3: e8 38 6c 1d 00 callq 674030 : : /* If it's visible per the snapshot, we must return it */ : valid = HeapTupleSatisfiesVisibility(heapTuple, snapshot, buffer); 0.00 : 49d3f8: 48 8b 75 b8 mov -0x48(%rbp),%rsi 0.00 : 49d3fc: 8b 55 c4 mov -0x3c(%rbp),%edx 0.00 : 49d3ff: 4c 89 f7 mov %r14,%rdi : * element of the HOT chain we're currently investigating instead : * of the root tuple of the HOT chain. This is important because : * the *Satisfies routine for historical mvcc snapshots needs the : * correct tid to decide about the visibility in some cases. : */ : ItemPointerSet(&(heapTuple->t_self), BufferGetBlockNumber(buffer), offnum); 0.00 : 49d402: 66 41 89 46 06 mov %ax,0x6(%r14) 0.00 : 49d407: 66 45 89 66 08 mov %r12w,0x8(%r14) : : /* If it's visible per the snapshot, we must return it */ : valid = HeapTupleSatisfiesVisibility(heapTuple, snapshot, buffer); 0.00 : 49d40c: ff 16 callq *(%rsi) : CheckForSerializableConflictOut(valid, relation, heapTuple, 0.00 : 49d40e: 8b 4d c4 mov -0x3c(%rbp),%ecx 0.00 : 49d411: 4c 8b 45 b8 mov -0x48(%rbp),%r8 0.00 : 49d415: 0f be f8 movsbl %al,%edi 0.00 : 49d418: 48 8b 75 c8 mov -0x38(%rbp),%rsi 0.00 : 49d41c: 4c 89 f2 mov %r14,%rdx : * correct tid to decide about the visibility in some cases. : */ : ItemPointerSet(&(heapTuple->t_self), BufferGetBlockNumber(buffer), offnum); : : /* If it's visible per the snapshot, we must return it */ : valid = HeapTupleSatisfiesVisibility(heapTuple, snapshot, buffer); 0.00 : 49d41f: 89 c3 mov %eax,%ebx : CheckForSerializableConflictOut(valid, relation, heapTuple, 0.00 : 49d421: e8 3a 72 1f 00 callq 694660 : buffer, snapshot); : /* reset to original, non-redirected, tid */ : heapTuple->t_self = *tid; 0.00 : 49d426: 48 8b 4d d0 mov -0x30(%rbp),%rcx : : if (valid) 0.00 : 49d42a: 84 db test %bl,%bl : /* If it's visible per the snapshot, we must return it */ : valid = HeapTupleSatisfiesVisibility(heapTuple, snapshot, buffer); : CheckForSerializableConflictOut(valid, relation, heapTuple, : buffer, snapshot); : /* reset to original, non-redirected, tid */ : heapTuple->t_self = *tid; 0.00 : 49d42c: 8b 01 mov (%rcx),%eax 0.00 : 49d42e: 41 89 46 04 mov %eax,0x4(%r14) 0.00 : 49d432: 0f b7 41 04 movzwl 0x4(%rcx),%eax 0.00 : 49d436: 66 41 89 46 08 mov %ax,0x8(%r14) : : if (valid) 0.00 : 49d43b: 0f 84 3a ff ff ff je 49d37b : { : ItemPointerSetOffsetNumber(tid, offnum); 0.00 : 49d441: 66 44 89 61 04 mov %r12w,0x4(%rcx) : PredicateLockTuple(relation, heapTuple, snapshot); 0.00 : 49d446: 48 8b 55 b8 mov -0x48(%rbp),%rdx 0.00 : 49d44a: 4c 89 f6 mov %r14,%rsi 0.00 : 49d44d: 48 8b 7d c8 mov -0x38(%rbp),%rdi 0.00 : 49d451: e8 4a 77 1f 00 callq 694ba0 : if (all_dead) 0.00 : 49d456: 4d 85 ff test %r15,%r15 0.00 : 49d459: b8 01 00 00 00 mov $0x1,%eax 0.00 : 49d45e: 0f 84 7b fe ff ff je 49d2df : *all_dead = false; 0.00 : 49d464: 41 c6 07 00 movb $0x0,(%r15) 0.00 : 49d468: b8 01 00 00 00 mov $0x1,%eax 0.00 : 49d46d: e9 6d fe ff ff jmpq 49d2df 0.00 : 49d472: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : { : Assert(ItemPointerGetBlockNumber(&heapTuple->t_data->t_ctid) == : ItemPointerGetBlockNumber(tid)); : offnum = ItemPointerGetOffsetNumber(&heapTuple->t_data->t_ctid); : at_chain_start = false; : prev_xmax = HeapTupleHeaderGetUpdateXid(heapTuple->t_data); 0.00 : 49d478: 84 d2 test %dl,%dl 0.00 : 49d47a: 0f 88 50 ff ff ff js 49d3d0 0.00 : 49d480: e8 9b 9c ff ff callq 497120 0.00 : 49d485: 45 31 c0 xor %r8d,%r8d 0.00 : 49d488: 89 c7 mov %eax,%edi 0.00 : 49d48a: e9 72 fe ff ff jmpq 49d301 0.00 : 49d48f: 90 nop : /* : * If we can't see it, maybe no one else can either. At caller : * request, check whether all chain members are dead to all : * transactions. : */ : if (all_dead && *all_dead && 0.00 : 49d490: 8b 35 6a d4 71 00 mov 0x71d46a(%rip),%esi # bba900 0.00 : 49d496: 4c 89 f7 mov %r14,%rdi 0.00 : 49d499: e8 62 72 30 00 callq 7a4700 0.00 : 49d49e: 84 c0 test %al,%al 0.00 : 49d4a0: 0f 85 e6 fe ff ff jne 49d38c : !HeapTupleIsSurelyDead(heapTuple, RecentGlobalXmin)) : *all_dead = false; 0.00 : 49d4a6: 41 c6 07 00 movb $0x0,(%r15) 0.00 : 49d4aa: e9 dd fe ff ff jmpq 49d38c 0.00 : 49d4af: 90 nop : bool : heap_hot_search_buffer(ItemPointer tid, Relation relation, Buffer buffer, : Snapshot snapshot, HeapTuple heapTuple, : bool *all_dead, bool first_call) : { : Page dp = (Page) BufferGetPage(buffer); 0.00 : 49d4b0: 89 d0 mov %edx,%eax 0.00 : 49d4b2: 48 8b 15 5f fc 6d 00 mov 0x6dfc5f(%rip),%rdx # b7d118 0.00 : 49d4b9: f7 d0 not %eax 0.00 : 49d4bb: 48 98 cltq 0.00 : 49d4bd: 4c 8b 2c c2 mov (%rdx,%rax,8),%r13 0.00 : 49d4c1: e9 a0 fd ff ff jmpq 49d266 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 100.00 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtpage.c:314 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000004aac20 <_bt_getroot>: : * On successful return, the root page is pinned and read-locked. : * The metadata page is not locked or pinned on exit. : */ : Buffer : _bt_getroot(Relation rel, int access) : { 0.00 : 4aac20: 55 push %rbp 0.00 : 4aac21: 48 89 e5 mov %rsp,%rbp 0.00 : 4aac24: 41 57 push %r15 0.00 : 4aac26: 41 56 push %r14 0.00 : 4aac28: 49 89 fe mov %rdi,%r14 0.00 : 4aac2b: 41 55 push %r13 0.00 : 4aac2d: 41 89 f5 mov %esi,%r13d 0.00 : 4aac30: 41 54 push %r12 0.00 : 4aac32: 53 push %rbx 0.00 : 4aac33: 48 83 ec 58 sub $0x58,%rsp : /* : * Try to use previously-cached metapage data to find the root. This : * normally saves one buffer access per index search, which is a very : * helpful savings in bufmgr traffic and hence contention. : */ : if (rel->rd_amcache != NULL) 0.00 : 4aac37: 48 8b 87 18 01 00 00 mov 0x118(%rdi),%rax 0.00 : 4aac3e: 48 85 c0 test %rax,%rax 0.00 : 4aac41: 74 6a je 4aacad <_bt_getroot+0x8d> : : rootblkno = metad->btm_fastroot; : Assert(rootblkno != P_NONE); : rootlevel = metad->btm_fastlevel; : : rootbuf = _bt_getbuf(rel, rootblkno, BT_READ); 0.00 : 4aac43: 8b 70 10 mov 0x10(%rax),%esi 0.00 : 4aac46: ba 01 00 00 00 mov $0x1,%edx : Assert(metad->btm_version == BTREE_VERSION); : Assert(metad->btm_root != P_NONE); : : rootblkno = metad->btm_fastroot; : Assert(rootblkno != P_NONE); : rootlevel = metad->btm_fastlevel; 0.00 : 4aac4b: 8b 58 14 mov 0x14(%rax),%ebx : : rootbuf = _bt_getbuf(rel, rootblkno, BT_READ); 0.00 : 4aac4e: e8 fd e3 ff ff callq 4a9050 <_bt_getbuf> : rootpage = BufferGetPage(rootbuf); 0.00 : 4aac53: 85 c0 test %eax,%eax : : rootblkno = metad->btm_fastroot; : Assert(rootblkno != P_NONE); : rootlevel = metad->btm_fastlevel; : : rootbuf = _bt_getbuf(rel, rootblkno, BT_READ); 0.00 : 4aac55: 41 89 c4 mov %eax,%r12d : rootpage = BufferGetPage(rootbuf); 0.00 : 4aac58: 0f 88 6a 02 00 00 js 4aaec8 <_bt_getroot+0x2a8> 0.00 : 4aac5e: 41 8d 44 24 ff lea -0x1(%r12),%eax 0.00 : 4aac63: 48 63 d0 movslq %eax,%rdx 0.00 : 4aac66: 48 c1 e2 0d shl $0xd,%rdx 0.00 : 4aac6a: 48 03 15 87 4e 71 00 add 0x714e87(%rip),%rdx # bbfaf8 : rootopaque = (BTPageOpaque) PageGetSpecialPointer(rootpage); 0.00 : 4aac71: 0f b7 42 10 movzwl 0x10(%rdx),%eax 0.00 : 4aac75: 48 01 c2 add %rax,%rdx : * here than normal. We *must* check that it's not deleted. If it's : * not alone on its level, then we reject too --- this may be overly : * paranoid but better safe than sorry. Note we don't check P_ISROOT, : * because that's not set in a "fast root". : */ : if (!P_IGNORE(rootopaque) && 0.00 : 4aac78: 0f b7 42 0c movzwl 0xc(%rdx),%eax 0.00 : 4aac7c: a8 14 test $0x14,%al 0.00 : 4aac7e: 75 09 jne 4aac89 <_bt_getroot+0x69> 0.00 : 4aac80: 39 5a 08 cmp %ebx,0x8(%rdx) 0.00 : 4aac83: 0f 84 57 02 00 00 je 4aaee0 <_bt_getroot+0x2c0> : * Lock and pin (refcount) are both dropped. : */ : void : _bt_relbuf(Relation rel, Buffer buf) : { : UnlockReleaseBuffer(buf); 0.00 : 4aac89: 44 89 e7 mov %r12d,%edi 0.00 : 4aac8c: e8 9f a2 1c 00 callq 674f30 : /* OK, accept cached page as the root */ : return rootbuf; : } : _bt_relbuf(rel, rootbuf); : /* Cache is stale, throw it away */ : if (rel->rd_amcache) 0.00 : 4aac91: 49 8b be 18 01 00 00 mov 0x118(%r14),%rdi 0.00 : 4aac98: 48 85 ff test %rdi,%rdi 0.00 : 4aac9b: 74 05 je 4aaca2 <_bt_getroot+0x82> : pfree(rel->rd_amcache); 0.00 : 4aac9d: e8 de de 2e 00 callq 798b80 : rel->rd_amcache = NULL; 0.00 : 4aaca2: 49 c7 86 18 01 00 00 movq $0x0,0x118(%r14) 0.00 : 4aaca9: 00 00 00 00 : } : : metabuf = _bt_getbuf(rel, BTREE_METAPAGE, BT_READ); 0.00 : 4aacad: 31 f6 xor %esi,%esi 0.00 : 4aacaf: ba 01 00 00 00 mov $0x1,%edx 0.00 : 4aacb4: 4c 89 f7 mov %r14,%rdi 0.00 : 4aacb7: e8 94 e3 ff ff callq 4a9050 <_bt_getbuf> : metapg = BufferGetPage(metabuf); 0.00 : 4aacbc: 85 c0 test %eax,%eax : if (rel->rd_amcache) : pfree(rel->rd_amcache); : rel->rd_amcache = NULL; : } : : metabuf = _bt_getbuf(rel, BTREE_METAPAGE, BT_READ); 0.00 : 4aacbe: 41 89 c0 mov %eax,%r8d : metapg = BufferGetPage(metabuf); 0.00 : 4aacc1: 0f 88 e9 01 00 00 js 4aaeb0 <_bt_getroot+0x290> 0.00 : 4aacc7: 41 8d 40 ff lea -0x1(%r8),%eax 0.00 : 4aaccb: 48 63 d8 movslq %eax,%rbx 0.00 : 4aacce: 48 c1 e3 0d shl $0xd,%rbx 0.00 : 4aacd2: 48 03 1d 1f 4e 71 00 add 0x714e1f(%rip),%rbx # bbfaf8 : metaopaque = (BTPageOpaque) PageGetSpecialPointer(metapg); : metad = BTPageGetMeta(metapg); : : /* sanity-check the metapage */ : if (!(metaopaque->btpo_flags & BTP_META) || 0.00 : 4aacd9: 0f b7 43 10 movzwl 0x10(%rbx),%eax 0.00 : 4aacdd: f6 44 03 0c 08 testb $0x8,0xc(%rbx,%rax,1) 0.00 : 4aace2: 74 0d je 4aacf1 <_bt_getroot+0xd1> 0.00 : 4aace4: 81 7b 18 62 31 05 00 cmpl $0x53162,0x18(%rbx) : } : : metabuf = _bt_getbuf(rel, BTREE_METAPAGE, BT_READ); : metapg = BufferGetPage(metabuf); : metaopaque = (BTPageOpaque) PageGetSpecialPointer(metapg); : metad = BTPageGetMeta(metapg); 0.00 : 4aaceb: 4c 8d 7b 18 lea 0x18(%rbx),%r15 : : /* sanity-check the metapage */ : if (!(metaopaque->btpo_flags & BTP_META) || 0.00 : 4aacef: 74 5f je 4aad50 <_bt_getroot+0x130> : metad->btm_magic != BTREE_MAGIC) : ereport(ERROR, 0.00 : 4aacf1: 45 31 c0 xor %r8d,%r8d 0.00 : 4aacf4: b9 50 47 7b 00 mov $0x7b4750,%ecx 0.00 : 4aacf9: ba a7 00 00 00 mov $0xa7,%edx 0.00 : 4aacfe: be 22 43 7b 00 mov $0x7b4322,%esi 0.00 : 4aad03: bf 14 00 00 00 mov $0x14,%edi 0.00 : 4aad08: e8 b3 fd 2c 00 callq 77aac0 0.00 : 4aad0d: 84 c0 test %al,%al 0.00 : 4aad0f: 75 0f jne 4aad20 <_bt_getroot+0x100> : rootblkno = rootopaque->btpo_next; : } : : /* Note: can't check btpo.level on deleted pages */ : if (rootopaque->btpo.level != rootlevel) : elog(ERROR, "root page %u of index \"%s\" has level %u, expected %u", 0.00 : 4aad11: e8 ba e7 fb ff callq 4694d0 0.00 : 4aad16: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 0.00 : 4aad1d: 00 00 00 : metad = BTPageGetMeta(metapg); : : /* sanity-check the metapage */ : if (!(metaopaque->btpo_flags & BTP_META) || : metad->btm_magic != BTREE_MAGIC) : ereport(ERROR, 0.00 : 4aad20: 49 8b 76 30 mov 0x30(%r14),%rsi 0.00 : 4aad24: bf 4a 43 7b 00 mov $0x7b434a,%edi 0.00 : 4aad29: 31 c0 xor %eax,%eax 0.00 : 4aad2b: e8 70 1b 2d 00 callq 77c8a0 : (errcode(ERRCODE_INDEX_CORRUPTED), : errmsg("index \"%s\" is not a btree", : RelationGetRelationName(rel)))); : : if (metad->btm_version != BTREE_VERSION) : ereport(ERROR, 0.00 : 4aad30: 89 c3 mov %eax,%ebx 0.00 : 4aad32: bf 28 0a 00 02 mov $0x2000a28,%edi 0.00 : 4aad37: e8 14 20 2d 00 callq 77cd50 0.00 : 4aad3c: 89 de mov %ebx,%esi 0.00 : 4aad3e: 89 c7 mov %eax,%edi 0.00 : 4aad40: 31 c0 xor %eax,%eax 0.00 : 4aad42: e8 99 f8 2c 00 callq 77a5e0 : rootblkno = rootopaque->btpo_next; : } : : /* Note: can't check btpo.level on deleted pages */ : if (rootopaque->btpo.level != rootlevel) : elog(ERROR, "root page %u of index \"%s\" has level %u, expected %u", 0.00 : 4aad47: e8 84 e7 fb ff callq 4694d0 0.00 : 4aad4c: 0f 1f 40 00 nopl 0x0(%rax) : ereport(ERROR, : (errcode(ERRCODE_INDEX_CORRUPTED), : errmsg("index \"%s\" is not a btree", : RelationGetRelationName(rel)))); : : if (metad->btm_version != BTREE_VERSION) 0.00 : 4aad50: 41 83 7f 04 02 cmpl $0x2,0x4(%r15) 0.00 : 4aad55: 0f 85 7b 03 00 00 jne 4ab0d6 <_bt_getroot+0x4b6> : errmsg("version mismatch in index \"%s\": file version %d, code version %d", : RelationGetRelationName(rel), : metad->btm_version, BTREE_VERSION))); : : /* if no root page initialized yet, do it */ : if (metad->btm_root == P_NONE) 0.00 : 4aad5b: 45 8b 57 08 mov 0x8(%r15),%r10d 0.00 : 4aad5f: 45 85 d2 test %r10d,%r10d 0.00 : 4aad62: 0f 85 a8 01 00 00 jne 4aaf10 <_bt_getroot+0x2f0> : { : /* If access = BT_READ, caller doesn't want us to create root yet */ : if (access == BT_READ) 0.00 : 4aad68: 41 83 fd 01 cmp $0x1,%r13d 0.00 : 4aad6c: 0f 84 8e 01 00 00 je 4aaf00 <_bt_getroot+0x2e0> : _bt_relbuf(rel, metabuf); : return InvalidBuffer; : } : : /* trade in our read lock for a write lock */ : LockBuffer(metabuf, BUFFER_LOCK_UNLOCK); 0.00 : 4aad72: 31 f6 xor %esi,%esi 0.00 : 4aad74: 44 89 c7 mov %r8d,%edi 0.00 : 4aad77: 44 89 45 80 mov %r8d,-0x80(%rbp) 0.00 : 4aad7b: e8 90 99 1c 00 callq 674710 : LockBuffer(metabuf, BT_WRITE); 0.00 : 4aad80: 44 8b 45 80 mov -0x80(%rbp),%r8d 0.00 : 4aad84: be 02 00 00 00 mov $0x2,%esi 0.00 : 4aad89: 44 89 c7 mov %r8d,%edi 0.00 : 4aad8c: e8 7f 99 1c 00 callq 674710 : /* : * Race condition: if someone else initialized the metadata between : * the time we released the read lock and acquired the write lock, we : * must avoid doing it again. : */ : if (metad->btm_root != P_NONE) 0.00 : 4aad91: 45 8b 4f 08 mov 0x8(%r15),%r9d 0.00 : 4aad95: 44 8b 45 80 mov -0x80(%rbp),%r8d 0.00 : 4aad99: 45 85 c9 test %r9d,%r9d 0.00 : 4aad9c: 0f 85 66 02 00 00 jne 4ab008 <_bt_getroot+0x3e8> : /* : * Get, initialize, write, and leave a lock of the appropriate type on : * the new root page. Since this is the first page in the tree, it's : * a leaf as well as the root. : */ : rootbuf = _bt_getbuf(rel, P_NEW, BT_WRITE); 0.00 : 4aada2: ba 02 00 00 00 mov $0x2,%edx 0.00 : 4aada7: be ff ff ff ff mov $0xffffffff,%esi 0.00 : 4aadac: 4c 89 f7 mov %r14,%rdi 0.00 : 4aadaf: 44 89 45 80 mov %r8d,-0x80(%rbp) 0.00 : 4aadb3: e8 98 e2 ff ff callq 4a9050 <_bt_getbuf> 0.00 : 4aadb8: 41 89 c4 mov %eax,%r12d : rootblkno = BufferGetBlockNumber(rootbuf); 0.00 : 4aadbb: 89 c7 mov %eax,%edi 0.00 : 4aadbd: e8 6e 92 1c 00 callq 674030 : rootpage = BufferGetPage(rootbuf); 0.00 : 4aadc2: 45 85 e4 test %r12d,%r12d : * Get, initialize, write, and leave a lock of the appropriate type on : * the new root page. Since this is the first page in the tree, it's : * a leaf as well as the root. : */ : rootbuf = _bt_getbuf(rel, P_NEW, BT_WRITE); : rootblkno = BufferGetBlockNumber(rootbuf); 0.00 : 4aadc5: 89 45 88 mov %eax,-0x78(%rbp) : rootpage = BufferGetPage(rootbuf); 0.00 : 4aadc8: 44 8b 45 80 mov -0x80(%rbp),%r8d 0.00 : 4aadcc: 0f 88 56 02 00 00 js 4ab028 <_bt_getroot+0x408> 0.00 : 4aadd2: 41 8d 44 24 ff lea -0x1(%r12),%eax 0.00 : 4aadd7: 4c 63 e8 movslq %eax,%r13 0.00 : 4aadda: 49 c1 e5 0d shl $0xd,%r13 0.00 : 4aadde: 4c 03 2d 13 4d 71 00 add 0x714d13(%rip),%r13 # bbfaf8 : rootopaque = (BTPageOpaque) PageGetSpecialPointer(rootpage); 0.00 : 4aade5: 41 0f b7 45 10 movzwl 0x10(%r13),%eax : metad->btm_root = rootblkno; : metad->btm_level = 0; : metad->btm_fastroot = rootblkno; : metad->btm_fastlevel = 0; : : MarkBufferDirty(rootbuf); 0.00 : 4aadea: 44 89 e7 mov %r12d,%edi : * a leaf as well as the root. : */ : rootbuf = _bt_getbuf(rel, P_NEW, BT_WRITE); : rootblkno = BufferGetBlockNumber(rootbuf); : rootpage = BufferGetPage(rootbuf); : rootopaque = (BTPageOpaque) PageGetSpecialPointer(rootpage); 0.00 : 4aaded: 49 8d 44 05 00 lea 0x0(%r13,%rax,1),%rax : rootopaque->btpo_prev = rootopaque->btpo_next = P_NONE; 0.00 : 4aadf2: c7 40 04 00 00 00 00 movl $0x0,0x4(%rax) 0.00 : 4aadf9: c7 00 00 00 00 00 movl $0x0,(%rax) : rootopaque->btpo_flags = (BTP_LEAF | BTP_ROOT); 0.00 : 4aadff: 66 c7 40 0c 03 00 movw $0x3,0xc(%rax) : rootopaque->btpo.level = 0; 0.00 : 4aae05: c7 40 08 00 00 00 00 movl $0x0,0x8(%rax) : rootopaque->btpo_cycleid = 0; 0.00 : 4aae0c: 66 c7 40 0e 00 00 movw $0x0,0xe(%rax) : : /* NO ELOG(ERROR) till meta is updated */ : START_CRIT_SECTION(); 0.00 : 4aae12: 8b 05 84 f2 70 00 mov 0x70f284(%rip),%eax # bba09c 0.00 : 4aae18: 83 c0 01 add $0x1,%eax 0.00 : 4aae1b: 89 05 7b f2 70 00 mov %eax,0x70f27b(%rip) # bba09c : : metad->btm_root = rootblkno; 0.00 : 4aae21: 8b 45 88 mov -0x78(%rbp),%eax : metad->btm_level = 0; 0.00 : 4aae24: 41 c7 47 0c 00 00 00 movl $0x0,0xc(%r15) 0.00 : 4aae2b: 00 : metad->btm_fastroot = rootblkno; : metad->btm_fastlevel = 0; 0.00 : 4aae2c: 41 c7 47 14 00 00 00 movl $0x0,0x14(%r15) 0.00 : 4aae33: 00 : rootopaque->btpo_cycleid = 0; : : /* NO ELOG(ERROR) till meta is updated */ : START_CRIT_SECTION(); : : metad->btm_root = rootblkno; 0.00 : 4aae34: 41 89 47 08 mov %eax,0x8(%r15) : metad->btm_level = 0; : metad->btm_fastroot = rootblkno; 0.00 : 4aae38: 41 89 47 10 mov %eax,0x10(%r15) : metad->btm_fastlevel = 0; : : MarkBufferDirty(rootbuf); 0.00 : 4aae3c: 44 89 45 80 mov %r8d,-0x80(%rbp) 0.00 : 4aae40: e8 ab 99 1c 00 callq 6747f0 : MarkBufferDirty(metabuf); 0.00 : 4aae45: 44 8b 45 80 mov -0x80(%rbp),%r8d 0.00 : 4aae49: 44 89 c7 mov %r8d,%edi 0.00 : 4aae4c: e8 9f 99 1c 00 callq 6747f0 : : /* XLOG stuff */ : if (RelationNeedsWAL(rel)) 0.00 : 4aae51: 49 8b 46 30 mov 0x30(%r14),%rax 0.00 : 4aae55: 44 8b 45 80 mov -0x80(%rbp),%r8d 0.00 : 4aae59: 80 78 6e 70 cmpb $0x70,0x6e(%rax) 0.00 : 4aae5d: 0f 84 0a 02 00 00 je 4ab06d <_bt_getroot+0x44d> : : PageSetLSN(rootpage, recptr); : PageSetLSN(metapg, recptr); : } : : END_CRIT_SECTION(); 0.00 : 4aae63: 8b 05 33 f2 70 00 mov 0x70f233(%rip),%eax # bba09c : /* : * swap root write lock for read lock. There is no danger of anyone : * else accessing the new root page while it's unlocked, since no one : * else knows where it is yet. : */ : LockBuffer(rootbuf, BUFFER_LOCK_UNLOCK); 0.00 : 4aae69: 31 f6 xor %esi,%esi 0.00 : 4aae6b: 44 89 e7 mov %r12d,%edi 0.00 : 4aae6e: 44 89 45 80 mov %r8d,-0x80(%rbp) : : PageSetLSN(rootpage, recptr); : PageSetLSN(metapg, recptr); : } : : END_CRIT_SECTION(); 0.00 : 4aae72: 83 e8 01 sub $0x1,%eax 0.00 : 4aae75: 89 05 21 f2 70 00 mov %eax,0x70f221(%rip) # bba09c : /* : * swap root write lock for read lock. There is no danger of anyone : * else accessing the new root page while it's unlocked, since no one : * else knows where it is yet. : */ : LockBuffer(rootbuf, BUFFER_LOCK_UNLOCK); 0.00 : 4aae7b: e8 90 98 1c 00 callq 674710 : LockBuffer(rootbuf, BT_READ); 0.00 : 4aae80: 44 89 e7 mov %r12d,%edi 0.00 : 4aae83: be 01 00 00 00 mov $0x1,%esi 0.00 : 4aae88: e8 83 98 1c 00 callq 674710 : * Lock and pin (refcount) are both dropped. : */ : void : _bt_relbuf(Relation rel, Buffer buf) : { : UnlockReleaseBuffer(buf); 0.00 : 4aae8d: 44 8b 45 80 mov -0x80(%rbp),%r8d 0.00 : 4aae91: 44 89 c7 mov %r8d,%edi 0.00 : 4aae94: e8 97 a0 1c 00 callq 674f30 : /* : * By here, we have a pin and read lock on the root page, and no lock set : * on the metadata page. Return the root page's buffer. : */ : return rootbuf; : } 0.00 : 4aae99: 48 83 c4 58 add $0x58,%rsp 0.00 : 4aae9d: 44 89 e0 mov %r12d,%eax 0.00 : 4aaea0: 5b pop %rbx 0.00 : 4aaea1: 41 5c pop %r12 0.00 : 4aaea3: 41 5d pop %r13 0.00 : 4aaea5: 41 5e pop %r14 0.00 : 4aaea7: 41 5f pop %r15 0.00 : 4aaea9: c9 leaveq /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtpage.c:314 100.00 : 4aaeaa: c3 retq 0.00 : 4aaeab: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : pfree(rel->rd_amcache); : rel->rd_amcache = NULL; : } : : metabuf = _bt_getbuf(rel, BTREE_METAPAGE, BT_READ); : metapg = BufferGetPage(metabuf); 0.00 : 4aaeb0: 48 8b 15 61 22 6d 00 mov 0x6d2261(%rip),%rdx # b7d118 0.00 : 4aaeb7: f7 d0 not %eax 0.00 : 4aaeb9: 48 98 cltq 0.00 : 4aaebb: 48 8b 1c c2 mov (%rdx,%rax,8),%rbx 0.00 : 4aaebf: e9 15 fe ff ff jmpq 4aacd9 <_bt_getroot+0xb9> 0.00 : 4aaec4: 0f 1f 40 00 nopl 0x0(%rax) : rootblkno = metad->btm_fastroot; : Assert(rootblkno != P_NONE); : rootlevel = metad->btm_fastlevel; : : rootbuf = _bt_getbuf(rel, rootblkno, BT_READ); : rootpage = BufferGetPage(rootbuf); 0.00 : 4aaec8: 48 8b 15 49 22 6d 00 mov 0x6d2249(%rip),%rdx # b7d118 0.00 : 4aaecf: f7 d0 not %eax 0.00 : 4aaed1: 48 98 cltq 0.00 : 4aaed3: 48 8b 14 c2 mov (%rdx,%rax,8),%rdx 0.00 : 4aaed7: e9 95 fd ff ff jmpq 4aac71 <_bt_getroot+0x51> 0.00 : 4aaedc: 0f 1f 40 00 nopl 0x0(%rax) : * here than normal. We *must* check that it's not deleted. If it's : * not alone on its level, then we reject too --- this may be overly : * paranoid but better safe than sorry. Note we don't check P_ISROOT, : * because that's not set in a "fast root". : */ : if (!P_IGNORE(rootopaque) && 0.00 : 4aaee0: 8b 1a mov (%rdx),%ebx 0.00 : 4aaee2: 85 db test %ebx,%ebx 0.00 : 4aaee4: 0f 85 9f fd ff ff jne 4aac89 <_bt_getroot+0x69> 0.00 : 4aaeea: 44 8b 5a 04 mov 0x4(%rdx),%r11d 0.00 : 4aaeee: 45 85 db test %r11d,%r11d 0.00 : 4aaef1: 0f 85 92 fd ff ff jne 4aac89 <_bt_getroot+0x69> 0.00 : 4aaef7: eb a0 jmp 4aae99 <_bt_getroot+0x279> 0.00 : 4aaef9: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : * Lock and pin (refcount) are both dropped. : */ : void : _bt_relbuf(Relation rel, Buffer buf) : { : UnlockReleaseBuffer(buf); 0.00 : 4aaf00: 44 89 c7 mov %r8d,%edi 0.00 : 4aaf03: 45 31 e4 xor %r12d,%r12d 0.00 : 4aaf06: e8 25 a0 1c 00 callq 674f30 : /* : * By here, we have a pin and read lock on the root page, and no lock set : * on the metadata page. Return the root page's buffer. : */ : return rootbuf; : } 0.00 : 4aaf0b: eb 8c jmp 4aae99 <_bt_getroot+0x279> 0.00 : 4aaf0d: 0f 1f 00 nopl (%rax) : } : else : { : rootblkno = metad->btm_fastroot; : Assert(rootblkno != P_NONE); : rootlevel = metad->btm_fastlevel; 0.00 : 4aaf10: 41 8b 47 14 mov 0x14(%r15),%eax : : /* : * Cache the metapage data for next time : */ : rel->rd_amcache = MemoryContextAlloc(rel->rd_indexcxt, 0.00 : 4aaf14: 49 8b be b8 00 00 00 mov 0xb8(%r14),%rdi 0.00 : 4aaf1b: be 18 00 00 00 mov $0x18,%esi : /* okay, metadata is correct, release lock on it */ : _bt_relbuf(rel, metabuf); : } : else : { : rootblkno = metad->btm_fastroot; 0.00 : 4aaf20: 45 8b 6f 10 mov 0x10(%r15),%r13d : rootlevel = metad->btm_fastlevel; : : /* : * Cache the metapage data for next time : */ : rel->rd_amcache = MemoryContextAlloc(rel->rd_indexcxt, 0.00 : 4aaf24: 44 89 45 80 mov %r8d,-0x80(%rbp) : } : else : { : rootblkno = metad->btm_fastroot; : Assert(rootblkno != P_NONE); : rootlevel = metad->btm_fastlevel; 0.00 : 4aaf28: 89 45 8c mov %eax,-0x74(%rbp) : : /* : * Cache the metapage data for next time : */ : rel->rd_amcache = MemoryContextAlloc(rel->rd_indexcxt, 0.00 : 4aaf2b: e8 60 df 2e 00 callq 798e90 0.00 : 4aaf30: 49 89 86 18 01 00 00 mov %rax,0x118(%r14) : sizeof(BTMetaPageData)); : memcpy(rel->rd_amcache, metad, sizeof(BTMetaPageData)); 0.00 : 4aaf37: 49 8b 17 mov (%r15),%rdx 0.00 : 4aaf3a: 48 89 10 mov %rdx,(%rax) 0.00 : 4aaf3d: 49 8b 57 08 mov 0x8(%r15),%rdx 0.00 : 4aaf41: 48 89 50 08 mov %rdx,0x8(%rax) 0.00 : 4aaf45: 49 8b 57 10 mov 0x10(%r15),%rdx 0.00 : 4aaf49: 48 89 50 10 mov %rdx,0x10(%rax) 0.00 : 4aaf4d: 44 8b 45 80 mov -0x80(%rbp),%r8d 0.00 : 4aaf51: 45 89 c4 mov %r8d,%r12d 0.00 : 4aaf54: eb 3a jmp 4aaf90 <_bt_getroot+0x370> 0.00 : 4aaf56: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 0.00 : 4aaf5d: 00 00 00 : rootbuf = metabuf; : : for (;;) : { : rootbuf = _bt_relandgetbuf(rel, rootbuf, rootblkno, BT_READ); : rootpage = BufferGetPage(rootbuf); 0.00 : 4aaf60: 41 8d 44 24 ff lea -0x1(%r12),%eax 0.00 : 4aaf65: 48 63 d0 movslq %eax,%rdx 0.00 : 4aaf68: 48 c1 e2 0d shl $0xd,%rdx 0.00 : 4aaf6c: 48 03 15 85 4b 71 00 add 0x714b85(%rip),%rdx # bbfaf8 : rootopaque = (BTPageOpaque) PageGetSpecialPointer(rootpage); 0.00 : 4aaf73: 0f b7 42 10 movzwl 0x10(%rdx),%eax 0.00 : 4aaf77: 48 8d 1c 02 lea (%rdx,%rax,1),%rbx : : if (!P_IGNORE(rootopaque)) 0.00 : 4aaf7b: 0f b7 43 0c movzwl 0xc(%rbx),%eax 0.00 : 4aaf7f: a8 14 test $0x14,%al 0.00 : 4aaf81: 74 3d je 4aafc0 <_bt_getroot+0x3a0> : break; : : /* it's dead, Jim. step right one page */ : if (P_RIGHTMOST(rootopaque)) 0.00 : 4aaf83: 44 8b 6b 04 mov 0x4(%rbx),%r13d 0.00 : 4aaf87: 45 85 ed test %r13d,%r13d 0.00 : 4aaf8a: 0f 84 af 00 00 00 je 4ab03f <_bt_getroot+0x41f> : */ : rootbuf = metabuf; : : for (;;) : { : rootbuf = _bt_relandgetbuf(rel, rootbuf, rootblkno, BT_READ); 0.00 : 4aaf90: 44 89 e6 mov %r12d,%esi 0.00 : 4aaf93: b9 01 00 00 00 mov $0x1,%ecx 0.00 : 4aaf98: 44 89 ea mov %r13d,%edx 0.00 : 4aaf9b: 4c 89 f7 mov %r14,%rdi 0.00 : 4aaf9e: e8 3d e0 ff ff callq 4a8fe0 <_bt_relandgetbuf> : rootpage = BufferGetPage(rootbuf); 0.00 : 4aafa3: 85 c0 test %eax,%eax : */ : rootbuf = metabuf; : : for (;;) : { : rootbuf = _bt_relandgetbuf(rel, rootbuf, rootblkno, BT_READ); 0.00 : 4aafa5: 41 89 c4 mov %eax,%r12d : rootpage = BufferGetPage(rootbuf); 0.00 : 4aafa8: 79 b6 jns 4aaf60 <_bt_getroot+0x340> 0.00 : 4aafaa: 48 8b 15 67 21 6d 00 mov 0x6d2167(%rip),%rdx # b7d118 0.00 : 4aafb1: f7 d0 not %eax 0.00 : 4aafb3: 48 98 cltq 0.00 : 4aafb5: 48 8b 14 c2 mov (%rdx,%rax,8),%rdx 0.00 : 4aafb9: eb b8 jmp 4aaf73 <_bt_getroot+0x353> 0.00 : 4aafbb: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : RelationGetRelationName(rel)); : rootblkno = rootopaque->btpo_next; : } : : /* Note: can't check btpo.level on deleted pages */ : if (rootopaque->btpo.level != rootlevel) 0.00 : 4aafc0: 8b 45 8c mov -0x74(%rbp),%eax 0.00 : 4aafc3: 39 43 08 cmp %eax,0x8(%rbx) 0.00 : 4aafc6: 0f 84 cd fe ff ff je 4aae99 <_bt_getroot+0x279> : elog(ERROR, "root page %u of index \"%s\" has level %u, expected %u", 0.00 : 4aafcc: ba 50 47 7b 00 mov $0x7b4750,%edx 0.00 : 4aafd1: be 32 01 00 00 mov $0x132,%esi 0.00 : 4aafd6: bf 22 43 7b 00 mov $0x7b4322,%edi 0.00 : 4aafdb: e8 40 04 2d 00 callq 77b420 0.00 : 4aafe0: 49 8b 4e 30 mov 0x30(%r14),%rcx 0.00 : 4aafe4: 44 8b 4d 8c mov -0x74(%rbp),%r9d 0.00 : 4aafe8: 44 89 ea mov %r13d,%edx 0.00 : 4aafeb: 44 8b 43 08 mov 0x8(%rbx),%r8d 0.00 : 4aafef: be 58 46 7b 00 mov $0x7b4658,%esi 0.00 : 4aaff4: bf 14 00 00 00 mov $0x14,%edi 0.00 : 4aaff9: 31 c0 xor %eax,%eax 0.00 : 4aaffb: e8 30 02 2d 00 callq 77b230 0.00 : 4ab000: e9 0c fd ff ff jmpq 4aad11 <_bt_getroot+0xf1> 0.00 : 4ab005: 0f 1f 00 nopl (%rax) : * Lock and pin (refcount) are both dropped. : */ : void : _bt_relbuf(Relation rel, Buffer buf) : { : UnlockReleaseBuffer(buf); 0.00 : 4ab008: 44 89 c7 mov %r8d,%edi 0.00 : 4ab00b: e8 20 9f 1c 00 callq 674f30 : * deadlocks, we have to release the metadata page and start all : * over again. (Is that really true? But it's hardly worth trying : * to optimize this case.) : */ : _bt_relbuf(rel, metabuf); : return _bt_getroot(rel, access); 0.00 : 4ab010: 44 89 ee mov %r13d,%esi 0.00 : 4ab013: 4c 89 f7 mov %r14,%rdi 0.00 : 4ab016: e8 05 fc ff ff callq 4aac20 <_bt_getroot> 0.00 : 4ab01b: 41 89 c4 mov %eax,%r12d : /* : * By here, we have a pin and read lock on the root page, and no lock set : * on the metadata page. Return the root page's buffer. : */ : return rootbuf; : } 0.00 : 4ab01e: e9 76 fe ff ff jmpq 4aae99 <_bt_getroot+0x279> 0.00 : 4ab023: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : * the new root page. Since this is the first page in the tree, it's : * a leaf as well as the root. : */ : rootbuf = _bt_getbuf(rel, P_NEW, BT_WRITE); : rootblkno = BufferGetBlockNumber(rootbuf); : rootpage = BufferGetPage(rootbuf); 0.00 : 4ab028: 44 89 e0 mov %r12d,%eax 0.00 : 4ab02b: 48 8b 15 e6 20 6d 00 mov 0x6d20e6(%rip),%rdx # b7d118 0.00 : 4ab032: f7 d0 not %eax 0.00 : 4ab034: 48 98 cltq 0.00 : 4ab036: 4c 8b 2c c2 mov (%rdx,%rax,8),%r13 0.00 : 4ab03a: e9 a6 fd ff ff jmpq 4aade5 <_bt_getroot+0x1c5> : if (!P_IGNORE(rootopaque)) : break; : : /* it's dead, Jim. step right one page */ : if (P_RIGHTMOST(rootopaque)) : elog(ERROR, "no live root page found in index \"%s\"", 0.00 : 4ab03f: ba 50 47 7b 00 mov $0x7b4750,%edx 0.00 : 4ab044: be 2a 01 00 00 mov $0x12a,%esi 0.00 : 4ab049: bf 22 43 7b 00 mov $0x7b4322,%edi 0.00 : 4ab04e: e8 cd 03 2d 00 callq 77b420 0.00 : 4ab053: 49 8b 56 30 mov 0x30(%r14),%rdx 0.00 : 4ab057: be 30 46 7b 00 mov $0x7b4630,%esi 0.00 : 4ab05c: bf 14 00 00 00 mov $0x14,%edi 0.00 : 4ab061: 31 c0 xor %eax,%eax 0.00 : 4ab063: e8 c8 01 2d 00 callq 77b230 0.00 : 4ab068: e8 63 e4 fb ff callq 4694d0 : { : xl_btree_newroot xlrec; : XLogRecPtr recptr; : XLogRecData rdata; : : xlrec.node = rel->rd_node; 0.00 : 4ab06d: 49 8b 06 mov (%r14),%rax : rdata.data = (char *) &xlrec; : rdata.len = SizeOfBtreeNewroot; : rdata.buffer = InvalidBuffer; : rdata.next = NULL; : : recptr = XLogInsert(RM_BTREE_ID, XLOG_BTREE_NEWROOT, &rdata); 0.00 : 4ab070: 48 8d 55 90 lea -0x70(%rbp),%rdx 0.00 : 4ab074: be a0 00 00 00 mov $0xa0,%esi 0.00 : 4ab079: bf 0b 00 00 00 mov $0xb,%edi : XLogRecPtr recptr; : XLogRecData rdata; : : xlrec.node = rel->rd_node; : xlrec.rootblk = rootblkno; : xlrec.level = 0; 0.00 : 4ab07e: c7 45 c0 00 00 00 00 movl $0x0,-0x40(%rbp) : : rdata.data = (char *) &xlrec; : rdata.len = SizeOfBtreeNewroot; 0.00 : 4ab085: c7 45 98 14 00 00 00 movl $0x14,-0x68(%rbp) : rdata.buffer = InvalidBuffer; 0.00 : 4ab08c: c7 45 9c 00 00 00 00 movl $0x0,-0x64(%rbp) : rdata.next = NULL; 0.00 : 4ab093: 48 c7 45 a8 00 00 00 movq $0x0,-0x58(%rbp) 0.00 : 4ab09a: 00 : { : xl_btree_newroot xlrec; : XLogRecPtr recptr; : XLogRecData rdata; : : xlrec.node = rel->rd_node; 0.00 : 4ab09b: 48 89 45 b0 mov %rax,-0x50(%rbp) 0.00 : 4ab09f: 41 8b 46 08 mov 0x8(%r14),%eax 0.00 : 4ab0a3: 89 45 b8 mov %eax,-0x48(%rbp) : xlrec.rootblk = rootblkno; 0.00 : 4ab0a6: 8b 45 88 mov -0x78(%rbp),%eax 0.00 : 4ab0a9: 89 45 bc mov %eax,-0x44(%rbp) : xlrec.level = 0; : : rdata.data = (char *) &xlrec; 0.00 : 4ab0ac: 48 8d 45 b0 lea -0x50(%rbp),%rax 0.00 : 4ab0b0: 48 89 45 90 mov %rax,-0x70(%rbp) : rdata.len = SizeOfBtreeNewroot; : rdata.buffer = InvalidBuffer; : rdata.next = NULL; : : recptr = XLogInsert(RM_BTREE_ID, XLOG_BTREE_NEWROOT, &rdata); 0.00 : 4ab0b4: e8 67 9e 02 00 callq 4d4f20 : : PageSetLSN(rootpage, recptr); 0.00 : 4ab0b9: 48 89 c2 mov %rax,%rdx 0.00 : 4ab0bc: 41 89 45 04 mov %eax,0x4(%r13) 0.00 : 4ab0c0: 48 c1 ea 20 shr $0x20,%rdx 0.00 : 4ab0c4: 41 89 55 00 mov %edx,0x0(%r13) : PageSetLSN(metapg, recptr); 0.00 : 4ab0c8: 89 13 mov %edx,(%rbx) 0.00 : 4ab0ca: 89 43 04 mov %eax,0x4(%rbx) 0.00 : 4ab0cd: 44 8b 45 80 mov -0x80(%rbp),%r8d 0.00 : 4ab0d1: e9 8d fd ff ff jmpq 4aae63 <_bt_getroot+0x243> : (errcode(ERRCODE_INDEX_CORRUPTED), : errmsg("index \"%s\" is not a btree", : RelationGetRelationName(rel)))); : : if (metad->btm_version != BTREE_VERSION) : ereport(ERROR, 0.00 : 4ab0d6: 45 31 c0 xor %r8d,%r8d 0.00 : 4ab0d9: b9 50 47 7b 00 mov $0x7b4750,%ecx 0.00 : 4ab0de: ba ae 00 00 00 mov $0xae,%edx 0.00 : 4ab0e3: be 22 43 7b 00 mov $0x7b4322,%esi 0.00 : 4ab0e8: bf 14 00 00 00 mov $0x14,%edi 0.00 : 4ab0ed: e8 ce f9 2c 00 callq 77aac0 0.00 : 4ab0f2: 84 c0 test %al,%al 0.00 : 4ab0f4: 0f 84 17 fc ff ff je 4aad11 <_bt_getroot+0xf1> 0.00 : 4ab0fa: 41 8b 57 04 mov 0x4(%r15),%edx 0.00 : 4ab0fe: 49 8b 76 30 mov 0x30(%r14),%rsi 0.00 : 4ab102: b9 02 00 00 00 mov $0x2,%ecx 0.00 : 4ab107: bf e8 45 7b 00 mov $0x7b45e8,%edi 0.00 : 4ab10c: 31 c0 xor %eax,%eax 0.00 : 4ab10e: e8 8d 17 2d 00 callq 77c8a0 0.00 : 4ab113: e9 18 fc ff ff jmpq 4aad30 <_bt_getroot+0x110> Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 100.00 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:1040 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000004acb70 <_bt_next>: : * On failure exit (no more tuples), we release pin and set : * so->currPos.buf to InvalidBuffer. : */ : bool : _bt_next(IndexScanDesc scan, ScanDirection dir) : { 0.00 : 4acb70: 55 push %rbp 0.00 : 4acb71: 48 89 e5 mov %rsp,%rbp 0.00 : 4acb74: 4c 89 65 f0 mov %r12,-0x10(%rbp) 0.00 : 4acb78: 4c 89 6d f8 mov %r13,-0x8(%rbp) 0.00 : 4acb7c: 49 89 fc mov %rdi,%r12 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtsearch.c:1040 100.00 : 4acb7f: 48 89 5d e8 mov %rbx,-0x18(%rbp) 0.00 : 4acb83: 48 83 ec 20 sub $0x20,%rsp : : /* : * Advance to next tuple on current page; or if there's no more, try to : * step to the next page with data. : */ : if (ScanDirectionIsForward(dir)) 0.00 : 4acb87: 83 fe 01 cmp $0x1,%esi : * On failure exit (no more tuples), we release pin and set : * so->currPos.buf to InvalidBuffer. : */ : bool : _bt_next(IndexScanDesc scan, ScanDirection dir) : { 0.00 : 4acb8a: 41 89 f5 mov %esi,%r13d : BTScanOpaque so = (BTScanOpaque) scan->opaque; 0.00 : 4acb8d: 48 8b 5f 38 mov 0x38(%rdi),%rbx : : /* : * Advance to next tuple on current page; or if there's no more, try to : * step to the next page with data. : */ : if (ScanDirectionIsForward(dir)) 0.00 : 4acb91: 74 7d je 4acc10 <_bt_next+0xa0> : LockBuffer(so->currPos.buf, BUFFER_LOCK_UNLOCK); : } : } : else : { : if (--so->currPos.itemIndex < so->currPos.firstItem) 0.00 : 4acb93: 8b 43 6c mov 0x6c(%rbx),%eax 0.00 : 4acb96: 83 e8 01 sub $0x1,%eax 0.00 : 4acb99: 3b 43 64 cmp 0x64(%rbx),%eax 0.00 : 4acb9c: 89 43 6c mov %eax,0x6c(%rbx) 0.00 : 4acb9f: 7c 4f jl 4acbf0 <_bt_next+0x80> : LockBuffer(so->currPos.buf, BUFFER_LOCK_UNLOCK); : } : } : : /* OK, itemIndex says what to return */ : currItem = &so->currPos.items[so->currPos.itemIndex]; 0.00 : 4acba1: 48 98 cltq : scan->xs_ctup.t_self = currItem->heapTid; : if (scan->xs_want_itup) 0.00 : 4acba3: 41 80 7c 24 30 00 cmpb $0x0,0x30(%r12) : } : } : : /* OK, itemIndex says what to return */ : currItem = &so->currPos.items[so->currPos.itemIndex]; : scan->xs_ctup.t_self = currItem->heapTid; 0.00 : 4acba9: 48 8d 04 80 lea (%rax,%rax,4),%rax 0.00 : 4acbad: 48 8d 54 43 60 lea 0x60(%rbx,%rax,2),%rdx 0.00 : 4acbb2: 8b 42 10 mov 0x10(%rdx),%eax 0.00 : 4acbb5: 41 89 44 24 54 mov %eax,0x54(%r12) 0.00 : 4acbba: 0f b7 42 14 movzwl 0x14(%rdx),%eax 0.00 : 4acbbe: 66 41 89 44 24 58 mov %ax,0x58(%r12) : if (scan->xs_want_itup) 0.00 : 4acbc4: b8 01 00 00 00 mov $0x1,%eax 0.00 : 4acbc9: 74 12 je 4acbdd <_bt_next+0x6d> : scan->xs_itup = (IndexTuple) (so->currTuples + currItem->tupleOffset); 0.00 : 4acbcb: 0f b7 42 18 movzwl 0x18(%rdx),%eax 0.00 : 4acbcf: 48 03 43 40 add 0x40(%rbx),%rax 0.00 : 4acbd3: 49 89 44 24 40 mov %rax,0x40(%r12) 0.00 : 4acbd8: b8 01 00 00 00 mov $0x1,%eax : : return true; : } 0.00 : 4acbdd: 48 8b 5d e8 mov -0x18(%rbp),%rbx 0.00 : 4acbe1: 4c 8b 65 f0 mov -0x10(%rbp),%r12 0.00 : 4acbe5: 4c 8b 6d f8 mov -0x8(%rbp),%r13 0.00 : 4acbe9: c9 leaveq 0.00 : 4acbea: c3 retq 0.00 : 4acbeb: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : { : if (--so->currPos.itemIndex < so->currPos.firstItem) : { : /* We must acquire lock before applying _bt_steppage */ : Assert(BufferIsValid(so->currPos.buf)); : LockBuffer(so->currPos.buf, BT_READ); 0.00 : 4acbf0: 8b 7b 54 mov 0x54(%rbx),%edi 0.00 : 4acbf3: be 01 00 00 00 mov $0x1,%esi 0.00 : 4acbf8: e8 13 7b 1c 00 callq 674710 : if (!_bt_steppage(scan, dir)) 0.00 : 4acbfd: 44 89 ee mov %r13d,%esi 0.00 : 4acc00: 4c 89 e7 mov %r12,%rdi 0.00 : 4acc03: e8 78 fa ff ff callq 4ac680 <_bt_steppage> 0.00 : 4acc08: 84 c0 test %al,%al 0.00 : 4acc0a: 75 30 jne 4acc3c <_bt_next+0xcc> : : /* OK, itemIndex says what to return */ : currItem = &so->currPos.items[so->currPos.itemIndex]; : scan->xs_ctup.t_self = currItem->heapTid; : if (scan->xs_want_itup) : scan->xs_itup = (IndexTuple) (so->currTuples + currItem->tupleOffset); 0.00 : 4acc0c: 31 c0 xor %eax,%eax 0.00 : 4acc0e: eb cd jmp 4acbdd <_bt_next+0x6d> : * Advance to next tuple on current page; or if there's no more, try to : * step to the next page with data. : */ : if (ScanDirectionIsForward(dir)) : { : if (++so->currPos.itemIndex > so->currPos.lastItem) 0.00 : 4acc10: 8b 43 6c mov 0x6c(%rbx),%eax 0.00 : 4acc13: 83 c0 01 add $0x1,%eax 0.00 : 4acc16: 3b 43 68 cmp 0x68(%rbx),%eax 0.00 : 4acc19: 89 43 6c mov %eax,0x6c(%rbx) 0.00 : 4acc1c: 7e 83 jle 4acba1 <_bt_next+0x31> : { : /* We must acquire lock before applying _bt_steppage */ : Assert(BufferIsValid(so->currPos.buf)); : LockBuffer(so->currPos.buf, BT_READ); 0.00 : 4acc1e: 8b 7b 54 mov 0x54(%rbx),%edi 0.00 : 4acc21: be 01 00 00 00 mov $0x1,%esi 0.00 : 4acc26: e8 e5 7a 1c 00 callq 674710 : if (!_bt_steppage(scan, dir)) 0.00 : 4acc2b: be 01 00 00 00 mov $0x1,%esi 0.00 : 4acc30: 4c 89 e7 mov %r12,%rdi 0.00 : 4acc33: e8 48 fa ff ff callq 4ac680 <_bt_steppage> 0.00 : 4acc38: 84 c0 test %al,%al 0.00 : 4acc3a: 74 d0 je 4acc0c <_bt_next+0x9c> : Assert(BufferIsValid(so->currPos.buf)); : LockBuffer(so->currPos.buf, BT_READ); : if (!_bt_steppage(scan, dir)) : return false; : /* Drop the lock, but not pin, on the new page */ : LockBuffer(so->currPos.buf, BUFFER_LOCK_UNLOCK); 0.00 : 4acc3c: 8b 7b 54 mov 0x54(%rbx),%edi 0.00 : 4acc3f: 31 f6 xor %esi,%esi 0.00 : 4acc41: e8 ca 7a 1c 00 callq 674710 0.00 : 4acc46: 8b 43 6c mov 0x6c(%rbx),%eax 0.00 : 4acc49: e9 53 ff ff ff jmpq 4acba1 <_bt_next+0x31> Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 100.00 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtutils.c:1201 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000004add60 <_bt_fix_scankey_strategy>: : * there shouldn't be any problem, since the index's indoptions are certainly : * not going to change while the scankey survives. : */ : static bool : _bt_fix_scankey_strategy(ScanKey skey, int16 *indoption) : { 0.00 : 4add60: 55 push %rbp : int addflags; : : addflags = indoption[skey->sk_attno - 1] << SK_BT_INDOPTION_SHIFT; /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtutils.c:1201 100.00 : 4add61: 48 0f bf 47 04 movswq 0x4(%rdi),%rax : * : * Note: someday we might have to fill in sk_collation from the index : * column's collation. At the moment this is a non-issue because we'll : * never actually call the comparison operator on a NULL. : */ : if (skey->sk_flags & SK_ISNULL) 0.00 : 4add66: 8b 0f mov (%rdi),%ecx : * there shouldn't be any problem, since the index's indoptions are certainly : * not going to change while the scankey survives. : */ : static bool : _bt_fix_scankey_strategy(ScanKey skey, int16 *indoption) : { 0.00 : 4add68: 48 89 e5 mov %rsp,%rbp : int addflags; : : addflags = indoption[skey->sk_attno - 1] << SK_BT_INDOPTION_SHIFT; 0.00 : 4add6b: 0f bf 54 46 fe movswl -0x2(%rsi,%rax,2),%edx 0.00 : 4add70: c1 e2 18 shl $0x18,%edx : * : * Note: someday we might have to fill in sk_collation from the index : * column's collation. At the moment this is a non-issue because we'll : * never actually call the comparison operator on a NULL. : */ : if (skey->sk_flags & SK_ISNULL) 0.00 : 4add73: f6 c1 01 test $0x1,%cl 0.00 : 4add76: 74 40 je 4addb8 <_bt_fix_scankey_strategy+0x58> : { : /* SK_ISNULL shouldn't be set in a row header scankey */ : Assert(!(skey->sk_flags & SK_ROW_HEADER)); : : /* Set indoption flags in scankey (might be done already) */ : skey->sk_flags |= addflags; 0.00 : 4add78: 09 ca or %ecx,%edx : : /* Set correct strategy for IS NULL or NOT NULL search */ : if (skey->sk_flags & SK_SEARCHNULL) 0.00 : 4add7a: f6 c2 40 test $0x40,%dl : { : /* SK_ISNULL shouldn't be set in a row header scankey */ : Assert(!(skey->sk_flags & SK_ROW_HEADER)); : : /* Set indoption flags in scankey (might be done already) */ : skey->sk_flags |= addflags; 0.00 : 4add7d: 89 17 mov %edx,(%rdi) : : /* Set correct strategy for IS NULL or NOT NULL search */ : if (skey->sk_flags & SK_SEARCHNULL) 0.00 : 4add7f: 0f 85 bb 00 00 00 jne 4ade40 <_bt_fix_scankey_strategy+0xe0> : subkey->sk_strategy = BTCommuteStrategyNumber(subkey->sk_strategy); : subkey->sk_flags |= addflags; : if (subkey->sk_flags & SK_ROW_END) : break; : subkey++; : } 0.00 : 4add85: 31 c0 xor %eax,%eax : { : skey->sk_strategy = BTEqualStrategyNumber; : skey->sk_subtype = InvalidOid; : skey->sk_collation = InvalidOid; : } : else if (skey->sk_flags & SK_SEARCHNOTNULL) 0.00 : 4add87: 84 d2 test %dl,%dl 0.00 : 4add89: 79 28 jns 4addb3 <_bt_fix_scankey_strategy+0x53> : { : if (skey->sk_flags & SK_BT_NULLS_FIRST) 0.00 : 4add8b: 81 e2 00 00 00 02 and $0x2000000,%edx : skey->sk_strategy = BTGreaterStrategyNumber; : else : skey->sk_strategy = BTLessStrategyNumber; : skey->sk_subtype = InvalidOid; 0.00 : 4add91: c7 47 08 00 00 00 00 movl $0x0,0x8(%rdi) : skey->sk_collation = InvalidOid; 0.00 : 4add98: c7 47 0c 00 00 00 00 movl $0x0,0xc(%rdi) : skey->sk_collation = InvalidOid; : } : else if (skey->sk_flags & SK_SEARCHNOTNULL) : { : if (skey->sk_flags & SK_BT_NULLS_FIRST) : skey->sk_strategy = BTGreaterStrategyNumber; 0.00 : 4add9f: 83 fa 01 cmp $0x1,%edx 0.00 : 4adda2: 19 c0 sbb %eax,%eax 0.00 : 4adda4: 83 e0 fc and $0xfffffffc,%eax 0.00 : 4adda7: 83 c0 05 add $0x5,%eax 0.00 : 4addaa: 66 89 47 06 mov %ax,0x6(%rdi) : else : skey->sk_strategy = BTLessStrategyNumber; : skey->sk_subtype = InvalidOid; : skey->sk_collation = InvalidOid; 0.00 : 4addae: b8 01 00 00 00 mov $0x1,%eax : subkey++; : } : } : : return true; : } 0.00 : 4addb3: c9 leaveq 0.00 : 4addb4: c3 retq 0.00 : 4addb5: 0f 1f 00 nopl (%rax) : /* Needn't do the rest */ : return true; : } : : /* Adjust strategy for DESC, if we didn't already */ : if ((addflags & SK_BT_DESC) && !(skey->sk_flags & SK_BT_DESC)) 0.00 : 4addb8: f7 c2 00 00 00 01 test $0x1000000,%edx 0.00 : 4addbe: 74 15 je 4addd5 <_bt_fix_scankey_strategy+0x75> 0.00 : 4addc0: f7 c1 00 00 00 01 test $0x1000000,%ecx 0.00 : 4addc6: 75 0d jne 4addd5 <_bt_fix_scankey_strategy+0x75> : skey->sk_strategy = BTCommuteStrategyNumber(skey->sk_strategy); 0.00 : 4addc8: b8 06 00 00 00 mov $0x6,%eax 0.00 : 4addcd: 66 2b 47 06 sub 0x6(%rdi),%ax 0.00 : 4addd1: 66 89 47 06 mov %ax,0x6(%rdi) : skey->sk_flags |= addflags; 0.00 : 4addd5: 89 c8 mov %ecx,%eax 0.00 : 4addd7: 09 d0 or %edx,%eax : : /* If it's a row header, fix row member flags and strategies similarly */ : if (skey->sk_flags & SK_ROW_HEADER) 0.00 : 4addd9: a8 04 test $0x4,%al : } : : /* Adjust strategy for DESC, if we didn't already */ : if ((addflags & SK_BT_DESC) && !(skey->sk_flags & SK_BT_DESC)) : skey->sk_strategy = BTCommuteStrategyNumber(skey->sk_strategy); : skey->sk_flags |= addflags; 0.00 : 4adddb: 89 07 mov %eax,(%rdi) : : /* If it's a row header, fix row member flags and strategies similarly */ : if (skey->sk_flags & SK_ROW_HEADER) 0.00 : 4adddd: 74 59 je 4ade38 <_bt_fix_scankey_strategy+0xd8> : { : ScanKey subkey = (ScanKey) DatumGetPointer(skey->sk_argument); 0.00 : 4adddf: 48 8b 57 40 mov 0x40(%rdi),%rdx : for (;;) : { : Assert(subkey->sk_flags & SK_ROW_MEMBER); : addflags = indoption[subkey->sk_attno - 1] << SK_BT_INDOPTION_SHIFT; : if ((addflags & SK_BT_DESC) && !(subkey->sk_flags & SK_BT_DESC)) : subkey->sk_strategy = BTCommuteStrategyNumber(subkey->sk_strategy); 0.00 : 4adde3: 41 b8 06 00 00 00 mov $0x6,%r8d 0.00 : 4adde9: eb 15 jmp 4ade00 <_bt_fix_scankey_strategy+0xa0> 0.00 : 4addeb: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : : for (;;) : { : Assert(subkey->sk_flags & SK_ROW_MEMBER); : addflags = indoption[subkey->sk_attno - 1] << SK_BT_INDOPTION_SHIFT; : if ((addflags & SK_BT_DESC) && !(subkey->sk_flags & SK_BT_DESC)) 0.00 : 4addf0: 8b 3a mov (%rdx),%edi : subkey->sk_strategy = BTCommuteStrategyNumber(subkey->sk_strategy); : subkey->sk_flags |= addflags; 0.00 : 4addf2: 89 f8 mov %edi,%eax 0.00 : 4addf4: 09 c8 or %ecx,%eax : if (subkey->sk_flags & SK_ROW_END) 0.00 : 4addf6: a8 10 test $0x10,%al : { : Assert(subkey->sk_flags & SK_ROW_MEMBER); : addflags = indoption[subkey->sk_attno - 1] << SK_BT_INDOPTION_SHIFT; : if ((addflags & SK_BT_DESC) && !(subkey->sk_flags & SK_BT_DESC)) : subkey->sk_strategy = BTCommuteStrategyNumber(subkey->sk_strategy); : subkey->sk_flags |= addflags; 0.00 : 4addf8: 89 02 mov %eax,(%rdx) : if (subkey->sk_flags & SK_ROW_END) 0.00 : 4addfa: 75 3c jne 4ade38 <_bt_fix_scankey_strategy+0xd8> : break; : subkey++; 0.00 : 4addfc: 48 83 c2 48 add $0x48,%rdx : ScanKey subkey = (ScanKey) DatumGetPointer(skey->sk_argument); : : for (;;) : { : Assert(subkey->sk_flags & SK_ROW_MEMBER); : addflags = indoption[subkey->sk_attno - 1] << SK_BT_INDOPTION_SHIFT; 0.00 : 4ade00: 48 0f bf 42 04 movswq 0x4(%rdx),%rax 0.00 : 4ade05: 0f bf 4c 46 fe movswl -0x2(%rsi,%rax,2),%ecx 0.00 : 4ade0a: c1 e1 18 shl $0x18,%ecx : if ((addflags & SK_BT_DESC) && !(subkey->sk_flags & SK_BT_DESC)) 0.00 : 4ade0d: f7 c1 00 00 00 01 test $0x1000000,%ecx 0.00 : 4ade13: 74 db je 4addf0 <_bt_fix_scankey_strategy+0x90> 0.00 : 4ade15: 8b 3a mov (%rdx),%edi 0.00 : 4ade17: f7 c7 00 00 00 01 test $0x1000000,%edi 0.00 : 4ade1d: 75 d3 jne 4addf2 <_bt_fix_scankey_strategy+0x92> : subkey->sk_strategy = BTCommuteStrategyNumber(subkey->sk_strategy); 0.00 : 4ade1f: 44 89 c0 mov %r8d,%eax 0.00 : 4ade22: 66 2b 42 06 sub 0x6(%rdx),%ax 0.00 : 4ade26: 66 89 42 06 mov %ax,0x6(%rdx) : subkey->sk_flags |= addflags; 0.00 : 4ade2a: 89 f8 mov %edi,%eax 0.00 : 4ade2c: 09 c8 or %ecx,%eax : if (subkey->sk_flags & SK_ROW_END) 0.00 : 4ade2e: a8 10 test $0x10,%al : { : Assert(subkey->sk_flags & SK_ROW_MEMBER); : addflags = indoption[subkey->sk_attno - 1] << SK_BT_INDOPTION_SHIFT; : if ((addflags & SK_BT_DESC) && !(subkey->sk_flags & SK_BT_DESC)) : subkey->sk_strategy = BTCommuteStrategyNumber(subkey->sk_strategy); : subkey->sk_flags |= addflags; 0.00 : 4ade30: 89 02 mov %eax,(%rdx) : if (subkey->sk_flags & SK_ROW_END) 0.00 : 4ade32: 74 c8 je 4addfc <_bt_fix_scankey_strategy+0x9c> 0.00 : 4ade34: 0f 1f 40 00 nopl 0x0(%rax) : break; : subkey++; : } 0.00 : 4ade38: b8 01 00 00 00 mov $0x1,%eax : } : : return true; : } 0.00 : 4ade3d: c9 leaveq 0.00 : 4ade3e: c3 retq 0.00 : 4ade3f: 90 nop : skey->sk_flags |= addflags; : : /* Set correct strategy for IS NULL or NOT NULL search */ : if (skey->sk_flags & SK_SEARCHNULL) : { : skey->sk_strategy = BTEqualStrategyNumber; 0.00 : 4ade40: 66 c7 47 06 03 00 movw $0x3,0x6(%rdi) : skey->sk_subtype = InvalidOid; 0.00 : 4ade46: c7 47 08 00 00 00 00 movl $0x0,0x8(%rdi) : skey->sk_collation = InvalidOid; 0.00 : 4ade4d: b8 01 00 00 00 mov $0x1,%eax 0.00 : 4ade52: c7 47 0c 00 00 00 00 movl $0x0,0xc(%rdi) : subkey++; : } : } : : return true; : } 0.00 : 4ade59: c9 leaveq Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 100.00 /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtutils.c:1303 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000004ae1b0 <_bt_mark_scankey_required>: : * from scan to scan within a query, and so we'd just re-mark the same way : * anyway on a rescan. Something to keep an eye on though. : */ : static void : _bt_mark_scankey_required(ScanKey skey) : { 0.00 : 4ae1b0: 55 push %rbp /home/Computational/mark/src/postgres-andres/src/backend/access/nbtree/nbtutils.c:1303 100.00 : 4ae1b1: 48 89 e5 mov %rsp,%rbp 0.00 : 4ae1b4: 53 push %rbx 0.00 : 4ae1b5: 48 89 fb mov %rdi,%rbx 0.00 : 4ae1b8: 48 83 ec 08 sub $0x8,%rsp : int addflags; : : switch (skey->sk_strategy) 0.00 : 4ae1bc: 66 83 7f 06 05 cmpw $0x5,0x6(%rdi) 0.00 : 4ae1c1: 76 35 jbe 4ae1f8 <_bt_mark_scankey_required+0x48> : case BTGreaterEqualStrategyNumber: : case BTGreaterStrategyNumber: : addflags = SK_BT_REQBKWD; : break; : default: : elog(ERROR, "unrecognized StrategyNumber: %d", 0.00 : 4ae1c3: ba 80 4b 7b 00 mov $0x7b4b80,%edx 0.00 : 4ae1c8: be 29 05 00 00 mov $0x529,%esi 0.00 : 4ae1cd: bf 17 49 7b 00 mov $0x7b4917,%edi 0.00 : 4ae1d2: e8 49 d2 2c 00 callq 77b420 0.00 : 4ae1d7: 0f b7 53 06 movzwl 0x6(%rbx),%edx 0.00 : 4ae1db: be 78 49 7b 00 mov $0x7b4978,%esi 0.00 : 4ae1e0: bf 14 00 00 00 mov $0x14,%edi 0.00 : 4ae1e5: 31 c0 xor %eax,%eax 0.00 : 4ae1e7: e8 44 d0 2c 00 callq 77b230 0.00 : 4ae1ec: e8 df b2 fb ff callq 4694d0 0.00 : 4ae1f1: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : static void : _bt_mark_scankey_required(ScanKey skey) : { : int addflags; : : switch (skey->sk_strategy) 0.00 : 4ae1f8: 0f b7 47 06 movzwl 0x6(%rdi),%eax 0.00 : 4ae1fc: ff 24 c5 70 4a 7b 00 jmpq *0x7b4a70(,%rax,8) 0.00 : 4ae203: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 4ae208: be 00 00 02 00 mov $0x20000,%esi : (int) skey->sk_strategy); : addflags = 0; /* keep compiler quiet */ : break; : } : : skey->sk_flags |= addflags; 0.00 : 4ae20d: 89 f0 mov %esi,%eax 0.00 : 4ae20f: 0b 03 or (%rbx),%eax : : if (skey->sk_flags & SK_ROW_HEADER) 0.00 : 4ae211: a8 04 test $0x4,%al : (int) skey->sk_strategy); : addflags = 0; /* keep compiler quiet */ : break; : } : : skey->sk_flags |= addflags; 0.00 : 4ae213: 89 03 mov %eax,(%rbx) : : if (skey->sk_flags & SK_ROW_HEADER) 0.00 : 4ae215: 74 41 je 4ae258 <_bt_mark_scankey_required+0xa8> : { : ScanKey subkey = (ScanKey) DatumGetPointer(skey->sk_argument); 0.00 : 4ae217: 48 8b 53 40 mov 0x40(%rbx),%rdx : AttrNumber attno = skey->sk_attno; 0.00 : 4ae21b: 0f b7 4b 04 movzwl 0x4(%rbx),%ecx : Assert(subkey->sk_attno == attno); : : for (;;) : { : Assert(subkey->sk_flags & SK_ROW_MEMBER); : if (subkey->sk_attno != attno) 0.00 : 4ae21f: 66 3b 4a 04 cmp 0x4(%rdx),%cx 0.00 : 4ae223: 74 25 je 4ae24a <_bt_mark_scankey_required+0x9a> 0.00 : 4ae225: eb 31 jmp 4ae258 <_bt_mark_scankey_required+0xa8> 0.00 : 4ae227: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 4ae22e: 00 00 : break; /* non-adjacent key, so not required */ : if (subkey->sk_strategy != skey->sk_strategy) : break; /* wrong direction, so not required */ : subkey->sk_flags |= addflags; 0.00 : 4ae230: 89 f0 mov %esi,%eax 0.00 : 4ae232: 0b 02 or (%rdx),%eax : if (subkey->sk_flags & SK_ROW_END) 0.00 : 4ae234: a8 10 test $0x10,%al : Assert(subkey->sk_flags & SK_ROW_MEMBER); : if (subkey->sk_attno != attno) : break; /* non-adjacent key, so not required */ : if (subkey->sk_strategy != skey->sk_strategy) : break; /* wrong direction, so not required */ : subkey->sk_flags |= addflags; 0.00 : 4ae236: 89 02 mov %eax,(%rdx) : if (subkey->sk_flags & SK_ROW_END) 0.00 : 4ae238: 75 1e jne 4ae258 <_bt_mark_scankey_required+0xa8> : break; : subkey++; 0.00 : 4ae23a: 48 83 c2 48 add $0x48,%rdx : attno++; 0.00 : 4ae23e: 8d 41 01 lea 0x1(%rcx),%eax : Assert(subkey->sk_attno == attno); : : for (;;) : { : Assert(subkey->sk_flags & SK_ROW_MEMBER); : if (subkey->sk_attno != attno) 0.00 : 4ae241: 0f b7 4a 04 movzwl 0x4(%rdx),%ecx 0.00 : 4ae245: 66 39 c1 cmp %ax,%cx 0.00 : 4ae248: 75 0e jne 4ae258 <_bt_mark_scankey_required+0xa8> : break; /* non-adjacent key, so not required */ : if (subkey->sk_strategy != skey->sk_strategy) 0.00 : 4ae24a: 0f b7 42 06 movzwl 0x6(%rdx),%eax 0.00 : 4ae24e: 66 3b 43 06 cmp 0x6(%rbx),%ax 0.00 : 4ae252: 74 dc je 4ae230 <_bt_mark_scankey_required+0x80> 0.00 : 4ae254: 0f 1f 40 00 nopl 0x0(%rax) : break; : subkey++; : attno++; : } : } : } 0.00 : 4ae258: 48 83 c4 08 add $0x8,%rsp 0.00 : 4ae25c: 5b pop %rbx 0.00 : 4ae25d: c9 leaveq 0.00 : 4ae25e: c3 retq 0.00 : 4ae25f: 90 nop : static void : _bt_mark_scankey_required(ScanKey skey) : { : int addflags; : : switch (skey->sk_strategy) 0.00 : 4ae260: be 00 00 03 00 mov $0x30000,%esi 0.00 : 4ae265: eb a6 jmp 4ae20d <_bt_mark_scankey_required+0x5d> 0.00 : 4ae267: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 4ae26e: 00 00 : case BTGreaterEqualStrategyNumber: : case BTGreaterStrategyNumber: : addflags = SK_BT_REQBKWD; : break; : default: : elog(ERROR, "unrecognized StrategyNumber: %d", 0.00 : 4ae270: be 00 00 01 00 mov $0x10000,%esi 0.00 : 4ae275: eb 96 jmp 4ae20d <_bt_mark_scankey_required+0x5d> Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 100.00 /home/Computational/mark/src/postgres-andres/src/backend/catalog/catalog.c:91 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000004e2de0 : : * but this function returns true only for toast relations of system : * catalogs. : */ : bool : IsCatalogRelation(Relation relation) : { 0.00 : 4e2de0: 55 push %rbp : return IsCatalogClass(RelationGetRelid(relation), relation->rd_rel); /home/Computational/mark/src/postgres-andres/src/backend/catalog/catalog.c:91 100.00 : 4e2de1: 48 8b 77 30 mov 0x30(%rdi),%rsi 0.00 : 4e2de5: 8b 7f 40 mov 0x40(%rdi),%edi : * but this function returns true only for toast relations of system : * catalogs. : */ : bool : IsCatalogRelation(Relation relation) : { 0.00 : 4e2de8: 48 89 e5 mov %rsp,%rbp : return IsCatalogClass(RelationGetRelid(relation), relation->rd_rel); : } 0.00 : 4e2deb: c9 leaveq : * catalogs. : */ : bool : IsCatalogRelation(Relation relation) : { : return IsCatalogClass(RelationGetRelid(relation), relation->rd_rel); 0.00 : 4e2dec: e9 bf ff ff ff jmpq 4e2db0 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 100.00 /home/Computational/mark/src/postgres-andres/src/backend/catalog/namespace.c:2988 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000004ec980 : : * namespace? : */ : bool : isTempToastNamespace(Oid namespaceId) : { : if (OidIsValid(myTempToastNamespace) && myTempToastNamespace == namespaceId) 0.00 : 4ec980: 8b 15 4a cd 68 00 mov 0x68cd4a(%rip),%edx # b796d0 : * isTempToastNamespace - is the given namespace my temporary-toast-table : * namespace? : */ : bool : isTempToastNamespace(Oid namespaceId) : { /home/Computational/mark/src/postgres-andres/src/backend/catalog/namespace.c:2988 100.00 : 4ec986: 55 push %rbp : if (OidIsValid(myTempToastNamespace) && myTempToastNamespace == namespaceId) 0.00 : 4ec987: 31 c0 xor %eax,%eax : * isTempToastNamespace - is the given namespace my temporary-toast-table : * namespace? : */ : bool : isTempToastNamespace(Oid namespaceId) : { 0.00 : 4ec989: 48 89 e5 mov %rsp,%rbp : if (OidIsValid(myTempToastNamespace) && myTempToastNamespace == namespaceId) 0.00 : 4ec98c: 85 d2 test %edx,%edx 0.00 : 4ec98e: 74 05 je 4ec995 0.00 : 4ec990: 39 fa cmp %edi,%edx 0.00 : 4ec992: 0f 94 c0 sete %al : return true; : return false; : } 0.00 : 4ec995: c9 leaveq Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 100.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/execGrouping.c:573 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000005a9510 : : * Also, the caller must select an appropriate memory context for running : * the compare functions. (dynahash.c doesn't change CurrentMemoryContext.) : */ : static int : TupleHashTableMatch(const void *key1, const void *key2, Size keysize) : { 0.00 : 5a9510: 55 push %rbp : * LookupTupleHashEntry's dummy TupleHashEntryData. The other direction : * could be supported too, but is not currently used by dynahash.c. : */ : Assert(tuple1 != NULL); : slot1 = hashtable->tableslot; : ExecStoreMinimalTuple(tuple1, slot1, false); 0.00 : 5a9511: 31 d2 xor %edx,%edx : * Also, the caller must select an appropriate memory context for running : * the compare functions. (dynahash.c doesn't change CurrentMemoryContext.) : */ : static int : TupleHashTableMatch(const void *key1, const void *key2, Size keysize) : { 0.00 : 5a9513: 48 89 e5 mov %rsp,%rbp 0.00 : 5a9516: 41 54 push %r12 0.00 : 5a9518: 53 push %rbx : #ifdef USE_ASSERT_CHECKING : MinimalTuple tuple2 = ((const TupleHashEntryData *) key2)->firstTuple; : #endif : TupleTableSlot *slot1; : TupleTableSlot *slot2; : TupleHashTable hashtable = CurTupleHashTable; 0.00 : 5a9519: 48 8b 1d a0 03 5d 00 mov 0x5d03a0(%rip),%rbx # b798c0 : * LookupTupleHashEntry's dummy TupleHashEntryData. The other direction : * could be supported too, but is not currently used by dynahash.c. : */ : Assert(tuple1 != NULL); : slot1 = hashtable->tableslot; : ExecStoreMinimalTuple(tuple1, slot1, false); 0.00 : 5a9520: 48 8b 3f mov (%rdi),%rdi : * argument being an actual table entry, and the second argument being : * LookupTupleHashEntry's dummy TupleHashEntryData. The other direction : * could be supported too, but is not currently used by dynahash.c. : */ : Assert(tuple1 != NULL); : slot1 = hashtable->tableslot; 0.00 : 5a9523: 4c 8b 63 40 mov 0x40(%rbx),%r12 : ExecStoreMinimalTuple(tuple1, slot1, false); 0.00 : 5a9527: 4c 89 e6 mov %r12,%rsi 0.00 : 5a952a: e8 b1 ae 00 00 callq 5b43e0 : Assert(tuple2 == NULL); : slot2 = hashtable->inputslot; : : /* For crosstype comparisons, the inputslot must be first */ : if (execTuplesMatch(slot2, 0.00 : 5a952f: 48 8b 4b 10 mov 0x10(%rbx),%rcx 0.00 : 5a9533: 8b 53 08 mov 0x8(%rbx),%edx 0.00 : 5a9536: 4c 89 e6 mov %r12,%rsi 0.00 : 5a9539: 48 8b 7b 48 mov 0x48(%rbx),%rdi 0.00 : 5a953d: 4c 8b 4b 30 mov 0x30(%rbx),%r9 0.00 : 5a9541: 4c 8b 43 58 mov 0x58(%rbx),%r8 0.00 : 5a9545: e8 f6 fe ff ff callq 5a9440 0.00 : 5a954a: 84 c0 test %al,%al : hashtable->cur_eq_funcs, : hashtable->tempcxt)) : return 0; : else : return 1; : } 0.00 : 5a954c: 5b pop %rbx : ExecStoreMinimalTuple(tuple1, slot1, false); : Assert(tuple2 == NULL); : slot2 = hashtable->inputslot; : : /* For crosstype comparisons, the inputslot must be first */ : if (execTuplesMatch(slot2, 0.00 : 5a954d: 0f 94 c0 sete %al 0.00 : 5a9550: 0f b6 c0 movzbl %al,%eax : hashtable->cur_eq_funcs, : hashtable->tempcxt)) : return 0; : else : return 1; : } 0.00 : 5a9553: 41 5c pop %r12 /home/Computational/mark/src/postgres-andres/src/backend/executor/execGrouping.c:573 100.00 : 5a9555: c9 leaveq Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 100.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/execTuples.c:508 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000005b3a20 : : Assert(slot != NULL); : Assert(slot->tts_tupleDescriptor != NULL); : Assert(slot->tts_isempty); : : slot->tts_isempty = false; : slot->tts_nvalid = slot->tts_tupleDescriptor->natts; /home/Computational/mark/src/postgres-andres/src/backend/executor/execTuples.c:508 100.00 : 5b3a20: 48 8b 47 10 mov 0x10(%rdi),%rax : * This is a bit unclean but it avoids one round of data copying. : * -------------------------------- : */ : TupleTableSlot * : ExecStoreVirtualTuple(TupleTableSlot *slot) : { 0.00 : 5b3a24: 55 push %rbp : */ : Assert(slot != NULL); : Assert(slot->tts_tupleDescriptor != NULL); : Assert(slot->tts_isempty); : : slot->tts_isempty = false; 0.00 : 5b3a25: c6 47 04 00 movb $0x0,0x4(%rdi) : * This is a bit unclean but it avoids one round of data copying. : * -------------------------------- : */ : TupleTableSlot * : ExecStoreVirtualTuple(TupleTableSlot *slot) : { 0.00 : 5b3a29: 48 89 e5 mov %rsp,%rbp : Assert(slot != NULL); : Assert(slot->tts_tupleDescriptor != NULL); : Assert(slot->tts_isempty); : : slot->tts_isempty = false; : slot->tts_nvalid = slot->tts_tupleDescriptor->natts; 0.00 : 5b3a2c: 8b 00 mov (%rax),%eax 0.00 : 5b3a2e: 89 47 24 mov %eax,0x24(%rdi) : : return slot; : } 0.00 : 5b3a31: 48 89 f8 mov %rdi,%rax 0.00 : 5b3a34: c9 leaveq Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 100.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:440 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000005baf20 : : * ExecBitmapHeapScan(node) : * ---------------------------------------------------------------- : */ : TupleTableSlot * : ExecBitmapHeapScan(BitmapHeapScanState *node) : { 0.00 : 5baf20: 55 push %rbp : return ExecScan(&node->ss, /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeBitmapHeapscan.c:440 100.00 : 5baf21: ba 40 af 5b 00 mov $0x5baf40,%edx 0.00 : 5baf26: be 80 af 5b 00 mov $0x5baf80,%esi : * ExecBitmapHeapScan(node) : * ---------------------------------------------------------------- : */ : TupleTableSlot * : ExecBitmapHeapScan(BitmapHeapScanState *node) : { 0.00 : 5baf2b: 48 89 e5 mov %rsp,%rbp : return ExecScan(&node->ss, : (ExecScanAccessMtd) BitmapHeapNext, : (ExecScanRecheckMtd) BitmapHeapRecheck); : } 0.00 : 5baf2e: c9 leaveq : * ---------------------------------------------------------------- : */ : TupleTableSlot * : ExecBitmapHeapScan(BitmapHeapScanState *node) : { : return ExecScan(&node->ss, 0.00 : 5baf2f: e9 1c 88 ff ff jmpq 5b3750 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 100.00 /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeIndexscan.c:85 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000005bf570 : : * using the index specified in the IndexScanState information. : * ---------------------------------------------------------------- : */ : static TupleTableSlot * : IndexNext(IndexScanState *node) : { 0.00 : 5bf570: 55 push %rbp 0.00 : 5bf571: 48 89 e5 mov %rsp,%rbp 0.00 : 5bf574: 41 57 push %r15 0.00 : 5bf576: 41 56 push %r14 0.00 : 5bf578: 41 55 push %r13 0.00 : 5bf57a: 49 89 fd mov %rdi,%r13 0.00 : 5bf57d: 41 54 push %r12 0.00 : 5bf57f: 53 push %rbx 0.00 : 5bf580: 48 83 ec 08 sub $0x8,%rsp : : /* : * extract necessary information from index scan node : */ : estate = node->ss.ps.state; : direction = estate->es_direction; 0.00 : 5bf584: 48 8b 47 10 mov 0x10(%rdi),%rax 0.00 : 5bf588: 44 8b 78 04 mov 0x4(%rax),%r15d : /* flip direction if this is an overall backward scan */ : if (ScanDirectionIsBackward(((IndexScan *) node->ss.ps.plan)->indexorderdir)) 0.00 : 5bf58c: 48 8b 47 08 mov 0x8(%rdi),%rax 0.00 : 5bf590: 83 b8 90 00 00 00 ff cmpl $0xffffffff,0x90(%rax) 0.00 : 5bf597: 0f 84 b3 00 00 00 je 5bf650 : if (ScanDirectionIsForward(direction)) : direction = BackwardScanDirection; : else if (ScanDirectionIsBackward(direction)) : direction = ForwardScanDirection; : } : scandesc = node->iss_ScanDesc; 0.00 : 5bf59d: 49 8b 9d d8 00 00 00 mov 0xd8(%r13),%rbx : econtext = node->ss.ps.ps_ExprContext; 0.00 : 5bf5a4: 4d 8b 65 60 mov 0x60(%r13),%r12 : slot = node->ss.ss_ScanTupleSlot; 0.00 : 5bf5a8: 4d 8b b5 88 00 00 00 mov 0x88(%r13),%r14 0.00 : 5bf5af: 90 nop : : /* : * ok, now that we have what we need, fetch the next tuple. : */ : while ((tuple = index_getnext(scandesc, direction)) != NULL) 0.00 : 5bf5b0: 44 89 fe mov %r15d,%esi 0.00 : 5bf5b3: 48 89 df mov %rbx,%rdi 0.00 : 5bf5b6: e8 55 61 ee ff callq 4a5710 0.00 : 5bf5bb: 48 85 c0 test %rax,%rax 0.00 : 5bf5be: 74 78 je 5bf638 : /* : * Store the scanned tuple in the scan tuple slot of the scan state. : * Note: we pass 'false' because tuples returned by amgetnext are : * pointers onto disk pages and must not be pfree()'d. : */ : ExecStoreTuple(tuple, /* tuple to store */ 0.00 : 5bf5c0: 8b 53 68 mov 0x68(%rbx),%edx /home/Computational/mark/src/postgres-andres/src/backend/executor/nodeIndexscan.c:85 100.00 : 5bf5c3: 31 c9 xor %ecx,%ecx 0.00 : 5bf5c5: 4c 89 f6 mov %r14,%rsi 0.00 : 5bf5c8: 48 89 c7 mov %rax,%rdi 0.00 : 5bf5cb: e8 b0 4e ff ff callq 5b4480 : : /* : * If the index was lossy, we have to recheck the index quals using : * the fetched tuple. : */ : if (scandesc->xs_recheck) 0.00 : 5bf5d0: 80 7b 6c 00 cmpb $0x0,0x6c(%rbx) 0.00 : 5bf5d4: 74 4a je 5bf620 : { : econtext->ecxt_scantuple = slot; : ResetExprContext(econtext); 0.00 : 5bf5d6: 49 8b 7c 24 28 mov 0x28(%r12),%rdi : * If the index was lossy, we have to recheck the index quals using : * the fetched tuple. : */ : if (scandesc->xs_recheck) : { : econtext->ecxt_scantuple = slot; 0.00 : 5bf5db: 4d 89 74 24 08 mov %r14,0x8(%r12) : ResetExprContext(econtext); 0.00 : 5bf5e0: e8 cb 93 1d 00 callq 7989b0 : if (!ExecQual(node->indexqualorig, econtext, false)) 0.00 : 5bf5e5: 49 8b bd 90 00 00 00 mov 0x90(%r13),%rdi 0.00 : 5bf5ec: 31 d2 xor %edx,%edx 0.00 : 5bf5ee: 4c 89 e6 mov %r12,%rsi 0.00 : 5bf5f1: e8 1a d9 fe ff callq 5acf10 0.00 : 5bf5f6: 84 c0 test %al,%al 0.00 : 5bf5f8: 75 26 jne 5bf620 : { : /* Fails recheck, so drop it and loop back for another */ : InstrCountFiltered2(node, 1); 0.00 : 5bf5fa: 49 8b 45 18 mov 0x18(%r13),%rax 0.00 : 5bf5fe: 48 85 c0 test %rax,%rax 0.00 : 5bf601: 74 ad je 5bf5b0 0.00 : 5bf603: f2 0f 10 05 4d fb 1e movsd 0x1efb4d(%rip),%xmm0 # 7af158 <__func__.15777+0x10> 0.00 : 5bf60a: 00 0.00 : 5bf60b: f2 0f 58 80 d0 00 00 addsd 0xd0(%rax),%xmm0 0.00 : 5bf612: 00 0.00 : 5bf613: f2 0f 11 80 d0 00 00 movsd %xmm0,0xd0(%rax) 0.00 : 5bf61a: 00 0.00 : 5bf61b: eb 93 jmp 5bf5b0 0.00 : 5bf61d: 0f 1f 00 nopl (%rax) : /* : * if we get here it means the index scan failed so we are at the end of : * the scan.. : */ : return ExecClearTuple(slot); : } 0.00 : 5bf620: 48 83 c4 08 add $0x8,%rsp 0.00 : 5bf624: 4c 89 f0 mov %r14,%rax 0.00 : 5bf627: 5b pop %rbx 0.00 : 5bf628: 41 5c pop %r12 0.00 : 5bf62a: 41 5d pop %r13 0.00 : 5bf62c: 41 5e pop %r14 0.00 : 5bf62e: 41 5f pop %r15 0.00 : 5bf630: c9 leaveq 0.00 : 5bf631: c3 retq 0.00 : 5bf632: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 5bf638: 48 83 c4 08 add $0x8,%rsp : : /* : * if we get here it means the index scan failed so we are at the end of : * the scan.. : */ : return ExecClearTuple(slot); 0.00 : 5bf63c: 4c 89 f7 mov %r14,%rdi : } 0.00 : 5bf63f: 5b pop %rbx 0.00 : 5bf640: 41 5c pop %r12 0.00 : 5bf642: 41 5d pop %r13 0.00 : 5bf644: 41 5e pop %r14 0.00 : 5bf646: 41 5f pop %r15 0.00 : 5bf648: c9 leaveq : : /* : * if we get here it means the index scan failed so we are at the end of : * the scan.. : */ : return ExecClearTuple(slot); 0.00 : 5bf649: e9 c2 4a ff ff jmpq 5b4110 0.00 : 5bf64e: 66 90 xchg %ax,%ax : estate = node->ss.ps.state; : direction = estate->es_direction; : /* flip direction if this is an overall backward scan */ : if (ScanDirectionIsBackward(((IndexScan *) node->ss.ps.plan)->indexorderdir)) : { : if (ScanDirectionIsForward(direction)) 0.00 : 5bf650: 41 83 ff 01 cmp $0x1,%r15d 0.00 : 5bf654: 74 12 je 5bf668 : direction = BackwardScanDirection; : else if (ScanDirectionIsBackward(direction)) 0.00 : 5bf656: 41 83 ff ff cmp $0xffffffff,%r15d 0.00 : 5bf65a: b8 01 00 00 00 mov $0x1,%eax 0.00 : 5bf65f: 44 0f 44 f8 cmove %eax,%r15d 0.00 : 5bf663: e9 35 ff ff ff jmpq 5bf59d : estate = node->ss.ps.state; : direction = estate->es_direction; : /* flip direction if this is an overall backward scan */ : if (ScanDirectionIsBackward(((IndexScan *) node->ss.ps.plan)->indexorderdir)) : { : if (ScanDirectionIsForward(direction)) 0.00 : 5bf668: 41 bf ff ff ff ff mov $0xffffffff,%r15d 0.00 : 5bf66e: e9 2a ff ff ff jmpq 5bf59d Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 100.00 /home/Computational/mark/src/postgres-andres/src/backend/nodes/bitmapset.c:202 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000005e2db0 : : * : * Same as pfree except for allowing NULL input : */ : void : bms_free(Bitmapset *a) : { 0.00 : 5e2db0: 55 push %rbp : if (a) /home/Computational/mark/src/postgres-andres/src/backend/nodes/bitmapset.c:202 100.00 : 5e2db1: 48 85 ff test %rdi,%rdi : * : * Same as pfree except for allowing NULL input : */ : void : bms_free(Bitmapset *a) : { 0.00 : 5e2db4: 48 89 e5 mov %rsp,%rbp : if (a) 0.00 : 5e2db7: 74 07 je 5e2dc0 : pfree(a); : } 0.00 : 5e2db9: c9 leaveq : */ : void : bms_free(Bitmapset *a) : { : if (a) : pfree(a); 0.00 : 5e2dba: e9 c1 5d 1b 00 jmpq 798b80 0.00 : 5e2dbf: 90 nop : } 0.00 : 5e2dc0: c9 leaveq Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 100.00 /home/Computational/mark/src/postgres-andres/src/backend/nodes/tidbitmap.c:665 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000005e3350 : : * be examined, but the condition must be rechecked anyway. (For ease of : * testing, recheck is always set true when ntuples < 0.) : */ : TBMIterateResult * : tbm_iterate(TBMIterator *iterator) : { 0.00 : 5e3350: 55 push %rbp 0.00 : 5e3351: 48 89 e5 mov %rsp,%rbp 0.00 : 5e3354: 53 push %rbx : TIDBitmap *tbm = iterator->tbm; 0.00 : 5e3355: 4c 8b 1f mov (%rdi),%r11 : : /* : * If lossy chunk pages remain, make sure we've advanced schunkptr/ : * schunkbit to the next set bit. : */ : while (iterator->schunkptr < tbm->nchunks) 0.00 : 5e3358: 44 8b 57 0c mov 0xc(%rdi),%r10d : */ : TBMIterateResult * : tbm_iterate(TBMIterator *iterator) : { : TIDBitmap *tbm = iterator->tbm; : TBMIterateResult *output = &(iterator->output); 0.00 : 5e335c: 48 8d 5f 14 lea 0x14(%rdi),%rbx : : /* : * If lossy chunk pages remain, make sure we've advanced schunkptr/ : * schunkbit to the next set bit. : */ : while (iterator->schunkptr < tbm->nchunks) 0.00 : 5e3360: 45 3b 53 2c cmp 0x2c(%r11),%r10d 0.00 : 5e3364: 0f 8d 9f 00 00 00 jge 5e3409 : while (schunkbit < PAGES_PER_CHUNK) : { : int wordnum = WORDNUM(schunkbit); : int bitnum = BITNUM(schunkbit); : : if ((chunk->words[wordnum] & ((bitmapword) 1 << bitnum)) != 0) 0.00 : 5e336a: 41 b9 01 00 00 00 mov $0x1,%r9d : * schunkbit to the next set bit. : */ : while (iterator->schunkptr < tbm->nchunks) : { : PagetableEntry *chunk = tbm->schunks[iterator->schunkptr]; : int schunkbit = iterator->schunkbit; 0.00 : 5e3370: 8b 77 10 mov 0x10(%rdi),%esi : * If lossy chunk pages remain, make sure we've advanced schunkptr/ : * schunkbit to the next set bit. : */ : while (iterator->schunkptr < tbm->nchunks) : { : PagetableEntry *chunk = tbm->schunks[iterator->schunkptr]; 0.00 : 5e3373: 49 8b 43 70 mov 0x70(%r11),%rax 0.00 : 5e3377: 49 63 d2 movslq %r10d,%rdx : int schunkbit = iterator->schunkbit; : : while (schunkbit < PAGES_PER_CHUNK) 0.00 : 5e337a: 81 fe ff 00 00 00 cmp $0xff,%esi : * If lossy chunk pages remain, make sure we've advanced schunkptr/ : * schunkbit to the next set bit. : */ : while (iterator->schunkptr < tbm->nchunks) : { : PagetableEntry *chunk = tbm->schunks[iterator->schunkptr]; 0.00 : 5e3380: 4c 8b 04 d0 mov (%rax,%rdx,8),%r8 : int schunkbit = iterator->schunkbit; : : while (schunkbit < PAGES_PER_CHUNK) 0.00 : 5e3384: 7f 68 jg 5e33ee : { : int wordnum = WORDNUM(schunkbit); : int bitnum = BITNUM(schunkbit); : : if ((chunk->words[wordnum] & ((bitmapword) 1 << bitnum)) != 0) 0.00 : 5e3386: 8d 56 1f lea 0x1f(%rsi),%edx 0.00 : 5e3389: 85 f6 test %esi,%esi 0.00 : 5e338b: 89 f0 mov %esi,%eax 0.00 : 5e338d: 0f 49 d6 cmovns %esi,%edx 0.00 : 5e3390: c1 f8 1f sar $0x1f,%eax 0.00 : 5e3393: c1 e8 1b shr $0x1b,%eax 0.00 : 5e3396: c1 fa 05 sar $0x5,%edx 0.00 : 5e3399: 8d 0c 06 lea (%rsi,%rax,1),%ecx 0.00 : 5e339c: 48 63 d2 movslq %edx,%rdx 0.00 : 5e339f: 83 e1 1f and $0x1f,%ecx 0.00 : 5e33a2: 29 c1 sub %eax,%ecx 0.00 : 5e33a4: 44 89 c8 mov %r9d,%eax 0.00 : 5e33a7: d3 e0 shl %cl,%eax /home/Computational/mark/src/postgres-andres/src/backend/nodes/tidbitmap.c:665 100.00 : 5e33a9: 41 85 44 90 08 test %eax,0x8(%r8,%rdx,4) 0.00 : 5e33ae: 74 33 je 5e33e3 0.00 : 5e33b0: eb 6e jmp 5e3420 0.00 : 5e33b2: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 0.00 : 5e33b8: 89 f0 mov %esi,%eax 0.00 : 5e33ba: c1 f8 1f sar $0x1f,%eax 0.00 : 5e33bd: c1 e8 1b shr $0x1b,%eax 0.00 : 5e33c0: 8d 0c 06 lea (%rsi,%rax,1),%ecx 0.00 : 5e33c3: 83 e1 1f and $0x1f,%ecx 0.00 : 5e33c6: 29 c1 sub %eax,%ecx 0.00 : 5e33c8: 44 89 c8 mov %r9d,%eax 0.00 : 5e33cb: d3 e0 shl %cl,%eax 0.00 : 5e33cd: 85 f6 test %esi,%esi 0.00 : 5e33cf: 89 c1 mov %eax,%ecx 0.00 : 5e33d1: 8d 46 1f lea 0x1f(%rsi),%eax 0.00 : 5e33d4: 0f 49 c6 cmovns %esi,%eax 0.00 : 5e33d7: c1 f8 05 sar $0x5,%eax 0.00 : 5e33da: 48 98 cltq 0.00 : 5e33dc: 41 85 4c 80 08 test %ecx,0x8(%r8,%rax,4) 0.00 : 5e33e1: 75 3d jne 5e3420 : break; : schunkbit++; 0.00 : 5e33e3: 83 c6 01 add $0x1,%esi : while (iterator->schunkptr < tbm->nchunks) : { : PagetableEntry *chunk = tbm->schunks[iterator->schunkptr]; : int schunkbit = iterator->schunkbit; : : while (schunkbit < PAGES_PER_CHUNK) 0.00 : 5e33e6: 81 fe 00 01 00 00 cmp $0x100,%esi 0.00 : 5e33ec: 75 ca jne 5e33b8 : { : iterator->schunkbit = schunkbit; : break; : } : /* advance to next chunk */ : iterator->schunkptr++; 0.00 : 5e33ee: 41 8d 42 01 lea 0x1(%r10),%eax : iterator->schunkbit = 0; 0.00 : 5e33f2: c7 47 10 00 00 00 00 movl $0x0,0x10(%rdi) : { : iterator->schunkbit = schunkbit; : break; : } : /* advance to next chunk */ : iterator->schunkptr++; 0.00 : 5e33f9: 89 47 0c mov %eax,0xc(%rdi) : : /* : * If lossy chunk pages remain, make sure we've advanced schunkptr/ : * schunkbit to the next set bit. : */ : while (iterator->schunkptr < tbm->nchunks) 0.00 : 5e33fc: 41 3b 43 2c cmp 0x2c(%r11),%eax 0.00 : 5e3400: 41 89 c2 mov %eax,%r10d 0.00 : 5e3403: 0f 8c 67 ff ff ff jl 5e3370 : iterator->schunkbit++; : return output; : } : } : : if (iterator->spageptr < tbm->npages) 0.00 : 5e3409: 8b 77 08 mov 0x8(%rdi),%esi 0.00 : 5e340c: 41 3b 73 28 cmp 0x28(%r11),%esi 0.00 : 5e3410: 7c 44 jl 5e3456 0.00 : 5e3412: 31 db xor %ebx,%ebx 0.00 : 5e3414: e9 c9 00 00 00 jmpq 5e34e2 0.00 : 5e3419: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : break; : schunkbit++; : } : if (schunkbit < PAGES_PER_CHUNK) : { : iterator->schunkbit = schunkbit; 0.00 : 5e3420: 89 77 10 mov %esi,0x10(%rdi) : : /* : * If both chunk and per-page data remain, must output the numerically : * earlier page. : */ : if (iterator->schunkptr < tbm->nchunks) 0.00 : 5e3423: 8b 47 0c mov 0xc(%rdi),%eax 0.00 : 5e3426: 41 3b 43 2c cmp 0x2c(%r11),%eax 0.00 : 5e342a: 7d dd jge 5e3409 : { : PagetableEntry *chunk = tbm->schunks[iterator->schunkptr]; : BlockNumber chunk_blockno; : : chunk_blockno = chunk->blockno + iterator->schunkbit; 0.00 : 5e342c: 49 8b 53 70 mov 0x70(%r11),%rdx 0.00 : 5e3430: 48 98 cltq 0.00 : 5e3432: 89 f1 mov %esi,%ecx : if (iterator->spageptr >= tbm->npages || 0.00 : 5e3434: 8b 77 08 mov 0x8(%rdi),%esi : if (iterator->schunkptr < tbm->nchunks) : { : PagetableEntry *chunk = tbm->schunks[iterator->schunkptr]; : BlockNumber chunk_blockno; : : chunk_blockno = chunk->blockno + iterator->schunkbit; 0.00 : 5e3437: 48 8b 04 c2 mov (%rdx,%rax,8),%rax 0.00 : 5e343b: 03 08 add (%rax),%ecx : if (iterator->spageptr >= tbm->npages || 0.00 : 5e343d: 41 3b 73 28 cmp 0x28(%r11),%esi 0.00 : 5e3441: 0f 8d 89 00 00 00 jge 5e34d0 0.00 : 5e3447: 49 8b 53 68 mov 0x68(%r11),%rdx 0.00 : 5e344b: 48 63 c6 movslq %esi,%rax 0.00 : 5e344e: 48 8b 04 c2 mov (%rdx,%rax,8),%rax 0.00 : 5e3452: 3b 08 cmp (%rax),%ecx 0.00 : 5e3454: 72 7a jb 5e34d0 : PagetableEntry *page; : int ntuples; : int wordnum; : : /* In ONE_PAGE state, we don't allocate an spages[] array */ : if (tbm->status == TBM_ONE_PAGE) 0.00 : 5e3456: 41 83 7b 10 01 cmpl $0x1,0x10(%r11) : page = &tbm->entry1; 0.00 : 5e345b: 49 8d 53 34 lea 0x34(%r11),%rdx : PagetableEntry *page; : int ntuples; : int wordnum; : : /* In ONE_PAGE state, we don't allocate an spages[] array */ : if (tbm->status == TBM_ONE_PAGE) 0.00 : 5e345f: 74 0b je 5e346c : page = &tbm->entry1; : else : page = tbm->spages[iterator->spageptr]; 0.00 : 5e3461: 49 8b 43 68 mov 0x68(%r11),%rax 0.00 : 5e3465: 48 63 d6 movslq %esi,%rdx 0.00 : 5e3468: 48 8b 14 d0 mov (%rax,%rdx,8),%rdx 0.00 : 5e346c: 45 31 c0 xor %r8d,%r8d 0.00 : 5e346f: 45 31 c9 xor %r9d,%r9d 0.00 : 5e3472: 41 ba 01 00 00 00 mov $0x1,%r10d 0.00 : 5e3478: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 5e347f: 00 : : /* scan bitmap to extract individual offset numbers */ : ntuples = 0; : for (wordnum = 0; wordnum < WORDS_PER_PAGE; wordnum++) : { : bitmapword w = page->words[wordnum]; 0.00 : 5e3480: 42 8b 4c 0a 08 mov 0x8(%rdx,%r9,1),%ecx : : if (w != 0) 0.00 : 5e3485: 85 c9 test %ecx,%ecx 0.00 : 5e3487: 74 1f je 5e34a8 0.00 : 5e3489: 44 89 d6 mov %r10d,%esi 0.00 : 5e348c: eb 05 jmp 5e3493 0.00 : 5e348e: 66 90 xchg %ax,%ax : : while (w != 0) : { : if (w & 1) : output->offsets[ntuples++] = (OffsetNumber) off; : off++; 0.00 : 5e3490: 83 c6 01 add $0x1,%esi : { : int off = wordnum * BITS_PER_BITMAPWORD + 1; : : while (w != 0) : { : if (w & 1) 0.00 : 5e3493: f6 c1 01 test $0x1,%cl 0.00 : 5e3496: 74 0c je 5e34a4 : output->offsets[ntuples++] = (OffsetNumber) off; 0.00 : 5e3498: 49 63 c0 movslq %r8d,%rax 0.00 : 5e349b: 41 83 c0 01 add $0x1,%r8d 0.00 : 5e349f: 66 89 74 47 1e mov %si,0x1e(%rdi,%rax,2) : : if (w != 0) : { : int off = wordnum * BITS_PER_BITMAPWORD + 1; : : while (w != 0) 0.00 : 5e34a4: d1 e9 shr %ecx 0.00 : 5e34a6: 75 e8 jne 5e3490 : { : if (w & 1) : output->offsets[ntuples++] = (OffsetNumber) off; : off++; 0.00 : 5e34a8: 49 83 c1 04 add $0x4,%r9 0.00 : 5e34ac: 41 83 c2 20 add $0x20,%r10d : else : page = tbm->spages[iterator->spageptr]; : : /* scan bitmap to extract individual offset numbers */ : ntuples = 0; : for (wordnum = 0; wordnum < WORDS_PER_PAGE; wordnum++) 0.00 : 5e34b0: 49 83 f9 28 cmp $0x28,%r9 0.00 : 5e34b4: 75 ca jne 5e3480 : off++; : w >>= 1; : } : } : } : output->blockno = page->blockno; 0.00 : 5e34b6: 8b 02 mov (%rdx),%eax : output->ntuples = ntuples; 0.00 : 5e34b8: 44 89 47 18 mov %r8d,0x18(%rdi) : off++; : w >>= 1; : } : } : } : output->blockno = page->blockno; 0.00 : 5e34bc: 89 47 14 mov %eax,0x14(%rdi) : output->ntuples = ntuples; : output->recheck = page->recheck; 0.00 : 5e34bf: 0f b6 42 05 movzbl 0x5(%rdx),%eax : iterator->spageptr++; 0.00 : 5e34c3: 83 47 08 01 addl $0x1,0x8(%rdi) : } : } : } : output->blockno = page->blockno; : output->ntuples = ntuples; : output->recheck = page->recheck; 0.00 : 5e34c7: 88 47 1c mov %al,0x1c(%rdi) : return output; : } : : /* Nothing more in the bitmap */ : return NULL; : } 0.00 : 5e34ca: 48 89 d8 mov %rbx,%rax 0.00 : 5e34cd: 5b pop %rbx 0.00 : 5e34ce: c9 leaveq 0.00 : 5e34cf: c3 retq : { : /* Return a lossy page indicator from the chunk */ : output->blockno = chunk_blockno; : output->ntuples = -1; : output->recheck = true; : iterator->schunkbit++; 0.00 : 5e34d0: 83 47 10 01 addl $0x1,0x10(%rdi) : chunk_blockno = chunk->blockno + iterator->schunkbit; : if (iterator->spageptr >= tbm->npages || : chunk_blockno < tbm->spages[iterator->spageptr]->blockno) : { : /* Return a lossy page indicator from the chunk */ : output->blockno = chunk_blockno; 0.00 : 5e34d4: 89 4f 14 mov %ecx,0x14(%rdi) : output->ntuples = -1; 0.00 : 5e34d7: c7 47 18 ff ff ff ff movl $0xffffffff,0x18(%rdi) : output->recheck = true; 0.00 : 5e34de: c6 47 1c 01 movb $0x1,0x1c(%rdi) : return output; : } : : /* Nothing more in the bitmap */ : return NULL; : } 0.00 : 5e34e2: 48 89 d8 mov %rbx,%rax 0.00 : 5e34e5: 5b pop %rbx 0.00 : 5e34e6: c9 leaveq Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 100.00 /home/Computational/mark/src/postgres-andres/src/backend/port/pg_latch.c:245 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000639150 : : * that EOF and error conditions are reported only via WL_SOCKET_READABLE. : */ : int : WaitLatchOrSocket(volatile Latch *latch, int wakeEvents, pgsocket sock, : long timeout) : { 0.00 : 639150: 55 push %rbp : int hifd; : #endif : : /* Ignore WL_SOCKET_* events if no valid socket is given */ : if (sock == PGINVALID_SOCKET) : wakeEvents &= ~(WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE); 0.00 : 639151: 89 f0 mov %esi,%eax 0.00 : 639153: 83 e0 f9 and $0xfffffff9,%eax : * that EOF and error conditions are reported only via WL_SOCKET_READABLE. : */ : int : WaitLatchOrSocket(volatile Latch *latch, int wakeEvents, pgsocket sock, : long timeout) : { 0.00 : 639156: 48 89 e5 mov %rsp,%rbp 0.00 : 639159: 41 57 push %r15 0.00 : 63915b: 49 89 cf mov %rcx,%r15 0.00 : 63915e: 41 56 push %r14 0.00 : 639160: 41 55 push %r13 0.00 : 639162: 41 54 push %r12 0.00 : 639164: 53 push %rbx 0.00 : 639165: 89 f3 mov %esi,%ebx 0.00 : 639167: 48 81 ec 88 00 00 00 sub $0x88,%rsp 0.00 : 63916e: 89 95 6c ff ff ff mov %edx,-0x94(%rbp) : int hifd; : #endif : : /* Ignore WL_SOCKET_* events if no valid socket is given */ : if (sock == PGINVALID_SOCKET) : wakeEvents &= ~(WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE); 0.00 : 639174: 83 c2 01 add $0x1,%edx 0.00 : 639177: 0f 44 d8 cmove %eax,%ebx : * that EOF and error conditions are reported only via WL_SOCKET_READABLE. : */ : int : WaitLatchOrSocket(volatile Latch *latch, int wakeEvents, pgsocket sock, : long timeout) : { 0.00 : 63917a: 48 89 bd 70 ff ff ff mov %rdi,-0x90(%rbp) : : Assert(wakeEvents != 0); /* must have at least one wake event */ : /* Cannot specify WL_SOCKET_WRITEABLE without WL_SOCKET_READABLE */ : Assert((wakeEvents & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE)) != WL_SOCKET_WRITEABLE); : : if ((wakeEvents & WL_LATCH_SET) && latch->owner_pid != MyProcPid) 0.00 : 639181: 89 d8 mov %ebx,%eax 0.00 : 639183: 83 e0 01 and $0x1,%eax 0.00 : 639186: 89 85 78 ff ff ff mov %eax,-0x88(%rbp) 0.00 : 63918c: 74 0f je 63919d 0.00 : 63918e: 8b 47 08 mov 0x8(%rdi),%eax 0.00 : 639191: 3b 05 4d 6b 58 00 cmp 0x586b4d(%rip),%eax # bbfce4 0.00 : 639197: 0f 85 6b 03 00 00 jne 639508 : * Initialize timeout if requested. We must record the current time so : * that we can determine the remaining timeout if the poll() or select() : * is interrupted. (On some platforms, select() will update the contents : * of "tv" for us, but unfortunately we can't rely on that.) : */ : if (wakeEvents & WL_TIMEOUT) /home/Computational/mark/src/postgres-andres/src/backend/port/pg_latch.c:245 100.00 : 63919d: 89 da mov %ebx,%edx 0.00 : 63919f: 83 e2 08 and $0x8,%edx 0.00 : 6391a2: 89 95 7c ff ff ff mov %edx,-0x84(%rbp) 0.00 : 6391a8: 0f 85 e2 02 00 00 jne 639490 0.00 : 6391ae: 49 c7 c6 ff ff ff ff mov $0xffffffffffffffff,%r14 : } : : /* Must wait ... we use poll(2) if available, otherwise select(2) */ : #ifdef HAVE_POLL : nfds = 0; : if (wakeEvents & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE)) 0.00 : 6391b5: 89 d8 mov %ebx,%eax : pfds[nfds].fd = selfpipe_readfd; : pfds[nfds].events = POLLIN; : pfds[nfds].revents = 0; : nfds++; : : if (wakeEvents & WL_POSTMASTER_DEATH) 0.00 : 6391b7: 89 da mov %ebx,%edx : #ifndef HAVE_POLL : tvp = NULL; : #endif : } : : waiting = true; 0.00 : 6391b9: c7 05 b5 28 54 00 01 movl $0x1,0x5428b5(%rip) # b7ba78 0.00 : 6391c0: 00 00 00 : } : : /* Must wait ... we use poll(2) if available, otherwise select(2) */ : #ifdef HAVE_POLL : nfds = 0; : if (wakeEvents & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE)) 0.00 : 6391c3: 83 e0 06 and $0x6,%eax : pfds[nfds].fd = selfpipe_readfd; : pfds[nfds].events = POLLIN; : pfds[nfds].revents = 0; : nfds++; : : if (wakeEvents & WL_POSTMASTER_DEATH) 0.00 : 6391c6: 83 e2 10 and $0x10,%edx : #ifndef HAVE_POLL : tvp = NULL; : #endif : } : : waiting = true; 0.00 : 6391c9: 45 31 ed xor %r13d,%r13d : } : : /* Must wait ... we use poll(2) if available, otherwise select(2) */ : #ifdef HAVE_POLL : nfds = 0; : if (wakeEvents & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE)) 0.00 : 6391cc: 89 85 68 ff ff ff mov %eax,-0x98(%rbp) : result |= WL_TIMEOUT; : } : else : { : /* at least one event occurred, so check revents values */ : if ((wakeEvents & WL_SOCKET_READABLE) && 0.00 : 6391d2: 89 d8 mov %ebx,%eax : (pfds[0].revents & (POLLIN | POLLHUP | POLLERR | POLLNVAL))) : { : /* data available in socket, or EOF/error condition */ : result |= WL_SOCKET_READABLE; : } : if ((wakeEvents & WL_SOCKET_WRITEABLE) && 0.00 : 6391d4: 83 e3 04 and $0x4,%ebx : result |= WL_TIMEOUT; : } : else : { : /* at least one event occurred, so check revents values */ : if ((wakeEvents & WL_SOCKET_READABLE) && 0.00 : 6391d7: 83 e0 02 and $0x2,%eax 0.00 : 6391da: 4c 8d 65 a0 lea -0x60(%rbp),%r12 : pfds[nfds].fd = selfpipe_readfd; : pfds[nfds].events = POLLIN; : pfds[nfds].revents = 0; : nfds++; : : if (wakeEvents & WL_POSTMASTER_DEATH) 0.00 : 6391de: 89 95 64 ff ff ff mov %edx,-0x9c(%rbp) : result |= WL_TIMEOUT; : } : else : { : /* at least one event occurred, so check revents values */ : if ((wakeEvents & WL_SOCKET_READABLE) && 0.00 : 6391e4: 89 85 60 ff ff ff mov %eax,-0xa0(%rbp) : (pfds[0].revents & (POLLIN | POLLHUP | POLLERR | POLLNVAL))) : { : /* data available in socket, or EOF/error condition */ : result |= WL_SOCKET_READABLE; : } : if ((wakeEvents & WL_SOCKET_WRITEABLE) && 0.00 : 6391ea: 89 9d 5c ff ff ff mov %ebx,-0xa4(%rbp) 0.00 : 6391f0: eb 11 jmp 639203 0.00 : 6391f2: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : { : waiting = false; : elog(ERROR, "read() on self-pipe failed: %m"); : } : } : else if (rc == 0) 0.00 : 6391f8: 0f 84 54 02 00 00 je 639452 : { : waiting = false; : elog(ERROR, "unexpected EOF on self-pipe"); : } : else if (rc < sizeof(buf)) 0.00 : 6391fe: 83 f8 0f cmp $0xf,%eax 0.00 : 639201: 76 5d jbe 639260 : char buf[16]; : int rc; : : for (;;) : { : rc = read(selfpipe_readfd, buf, sizeof(buf)); 0.00 : 639203: 8b 3d bf f3 52 00 mov 0x52f3bf(%rip),%edi # b685c8 0.00 : 639209: ba 10 00 00 00 mov $0x10,%edx 0.00 : 63920e: 4c 89 e6 mov %r12,%rsi 0.00 : 639211: e8 fa 03 e3 ff callq 469610 : if (rc < 0) 0.00 : 639216: 83 f8 00 cmp $0x0,%eax 0.00 : 639219: 7d dd jge 6391f8 : { : if (errno == EAGAIN || errno == EWOULDBLOCK) 0.00 : 63921b: e8 a0 0a e3 ff callq 469cc0 <__errno_location@plt> 0.00 : 639220: 8b 00 mov (%rax),%eax 0.00 : 639222: 83 f8 0b cmp $0xb,%eax 0.00 : 639225: 74 39 je 639260 : break; /* the pipe is empty */ : else if (errno == EINTR) 0.00 : 639227: 83 f8 04 cmp $0x4,%eax 0.00 : 63922a: 74 d7 je 639203 : continue; /* retry */ : else : { : waiting = false; : elog(ERROR, "read() on self-pipe failed: %m"); 0.00 : 63922c: ba 12 de 89 00 mov $0x89de12,%edx 0.00 : 639231: be 87 02 00 00 mov $0x287,%esi 0.00 : 639236: bf f0 dc 89 00 mov $0x89dcf0,%edi : break; /* the pipe is empty */ : else if (errno == EINTR) : continue; /* retry */ : else : { : waiting = false; 0.00 : 63923b: c7 05 33 28 54 00 00 movl $0x0,0x542833(%rip) # b7ba78 0.00 : 639242: 00 00 00 : elog(ERROR, "read() on self-pipe failed: %m"); 0.00 : 639245: e8 d6 21 14 00 callq 77b420 0.00 : 63924a: be 80 dd 89 00 mov $0x89dd80,%esi 0.00 : 63924f: bf 14 00 00 00 mov $0x14,%edi 0.00 : 639254: 31 c0 xor %eax,%eax 0.00 : 639256: e8 d5 1f 14 00 callq 77b230 0.00 : 63925b: e8 70 02 e3 ff callq 4694d0 : * with weak memory ordering, so that we cannot miss seeing is_set if : * the signal byte is already in the pipe when we drain it. : */ : drainSelfPipe(); : : if ((wakeEvents & WL_LATCH_SET) && latch->is_set) 0.00 : 639260: 44 8b 95 78 ff ff ff mov -0x88(%rbp),%r10d 0.00 : 639267: 45 85 d2 test %r10d,%r10d 0.00 : 63926a: 74 11 je 63927d 0.00 : 63926c: 48 8b 95 70 ff ff ff mov -0x90(%rbp),%rdx 0.00 : 639273: 8b 02 mov (%rdx),%eax 0.00 : 639275: 85 c0 test %eax,%eax 0.00 : 639277: 0f 85 b5 02 00 00 jne 639532 : } : : /* Must wait ... we use poll(2) if available, otherwise select(2) */ : #ifdef HAVE_POLL : nfds = 0; : if (wakeEvents & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE)) 0.00 : 63927d: 44 8b 8d 68 ff ff ff mov -0x98(%rbp),%r9d 0.00 : 639284: 31 c0 xor %eax,%eax 0.00 : 639286: bb 01 00 00 00 mov $0x1,%ebx 0.00 : 63928b: 45 85 c9 test %r9d,%r9d 0.00 : 63928e: 74 45 je 6392d5 : { : /* socket, if used, is always in pfds[0] */ : pfds[0].fd = sock; : pfds[0].events = 0; : if (wakeEvents & WL_SOCKET_READABLE) : pfds[0].events |= POLLIN; 0.00 : 639290: 44 8b 85 60 ff ff ff mov -0xa0(%rbp),%r8d : nfds = 0; : if (wakeEvents & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE)) : { : /* socket, if used, is always in pfds[0] */ : pfds[0].fd = sock; : pfds[0].events = 0; 0.00 : 639297: 66 c7 45 84 00 00 movw $0x0,-0x7c(%rbp) : if (wakeEvents & WL_SOCKET_READABLE) : pfds[0].events |= POLLIN; 0.00 : 63929d: b8 01 00 00 00 mov $0x1,%eax : if (wakeEvents & WL_SOCKET_WRITEABLE) 0.00 : 6392a2: 8b bd 5c ff ff ff mov -0xa4(%rbp),%edi : { : /* socket, if used, is always in pfds[0] */ : pfds[0].fd = sock; : pfds[0].events = 0; : if (wakeEvents & WL_SOCKET_READABLE) : pfds[0].events |= POLLIN; 0.00 : 6392a8: 45 85 c0 test %r8d,%r8d 0.00 : 6392ab: 66 0f 44 45 84 cmove -0x7c(%rbp),%ax : if (wakeEvents & WL_SOCKET_WRITEABLE) 0.00 : 6392b0: 85 ff test %edi,%edi : { : /* socket, if used, is always in pfds[0] */ : pfds[0].fd = sock; : pfds[0].events = 0; : if (wakeEvents & WL_SOCKET_READABLE) : pfds[0].events |= POLLIN; 0.00 : 6392b2: 66 89 45 84 mov %ax,-0x7c(%rbp) : if (wakeEvents & WL_SOCKET_WRITEABLE) 0.00 : 6392b6: 0f 85 ca 01 00 00 jne 639486 : #ifdef HAVE_POLL : nfds = 0; : if (wakeEvents & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE)) : { : /* socket, if used, is always in pfds[0] */ : pfds[0].fd = sock; 0.00 : 6392bc: 8b 85 6c ff ff ff mov -0x94(%rbp),%eax : pfds[0].events = 0; : if (wakeEvents & WL_SOCKET_READABLE) : pfds[0].events |= POLLIN; : if (wakeEvents & WL_SOCKET_WRITEABLE) : pfds[0].events |= POLLOUT; : pfds[0].revents = 0; 0.00 : 6392c2: 66 c7 45 86 00 00 movw $0x0,-0x7a(%rbp) 0.00 : 6392c8: bb 02 00 00 00 mov $0x2,%ebx : #ifdef HAVE_POLL : nfds = 0; : if (wakeEvents & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE)) : { : /* socket, if used, is always in pfds[0] */ : pfds[0].fd = sock; 0.00 : 6392cd: 89 45 80 mov %eax,-0x80(%rbp) : pfds[0].events = 0; : if (wakeEvents & WL_SOCKET_READABLE) : pfds[0].events |= POLLIN; : if (wakeEvents & WL_SOCKET_WRITEABLE) : pfds[0].events |= POLLOUT; : pfds[0].revents = 0; 0.00 : 6392d0: b8 01 00 00 00 mov $0x1,%eax : nfds++; : } : : pfds[nfds].fd = selfpipe_readfd; 0.00 : 6392d5: 8b 15 ed f2 52 00 mov 0x52f2ed(%rip),%edx # b685c8 0.00 : 6392db: 48 98 cltq : pfds[nfds].events = POLLIN; 0.00 : 6392dd: 66 c7 44 c5 84 01 00 movw $0x1,-0x7c(%rbp,%rax,8) : pfds[nfds].revents = 0; 0.00 : 6392e4: 66 c7 44 c5 86 00 00 movw $0x0,-0x7a(%rbp,%rax,8) : pfds[0].events |= POLLOUT; : pfds[0].revents = 0; : nfds++; : } : : pfds[nfds].fd = selfpipe_readfd; 0.00 : 6392eb: 89 54 c5 80 mov %edx,-0x80(%rbp,%rax,8) : pfds[nfds].events = POLLIN; : pfds[nfds].revents = 0; : nfds++; : : if (wakeEvents & WL_POSTMASTER_DEATH) 0.00 : 6392ef: 8b b5 64 ff ff ff mov -0x9c(%rbp),%esi 0.00 : 6392f5: 85 f6 test %esi,%esi 0.00 : 6392f7: 74 1e je 639317 : { : /* postmaster fd, if used, is always in pfds[nfds - 1] */ : pfds[nfds].fd = postmaster_alive_fds[POSTMASTER_FD_WATCH]; 0.00 : 6392f9: 8b 15 29 f3 52 00 mov 0x52f329(%rip),%edx # b68628 0.00 : 6392ff: 48 63 c3 movslq %ebx,%rax : pfds[nfds].events = POLLIN; : pfds[nfds].revents = 0; : nfds++; 0.00 : 639302: 83 c3 01 add $0x1,%ebx : : if (wakeEvents & WL_POSTMASTER_DEATH) : { : /* postmaster fd, if used, is always in pfds[nfds - 1] */ : pfds[nfds].fd = postmaster_alive_fds[POSTMASTER_FD_WATCH]; : pfds[nfds].events = POLLIN; 0.00 : 639305: 66 c7 44 c5 84 01 00 movw $0x1,-0x7c(%rbp,%rax,8) : pfds[nfds].revents = 0; 0.00 : 63930c: 66 c7 44 c5 86 00 00 movw $0x0,-0x7a(%rbp,%rax,8) : nfds++; : : if (wakeEvents & WL_POSTMASTER_DEATH) : { : /* postmaster fd, if used, is always in pfds[nfds - 1] */ : pfds[nfds].fd = postmaster_alive_fds[POSTMASTER_FD_WATCH]; 0.00 : 639313: 89 54 c5 80 mov %edx,-0x80(%rbp,%rax,8) : pfds[nfds].revents = 0; : nfds++; : } : : /* Sleep */ : rc = poll(pfds, nfds, (int) cur_timeout); 0.00 : 639317: 48 8d 7d 80 lea -0x80(%rbp),%rdi 0.00 : 63931b: 48 63 f3 movslq %ebx,%rsi 0.00 : 63931e: 44 89 f2 mov %r14d,%edx 0.00 : 639321: e8 2a 07 e3 ff callq 469a50 : : /* Check return code */ : if (rc < 0) 0.00 : 639326: 83 f8 00 cmp $0x0,%eax 0.00 : 639329: 0f 8c 74 01 00 00 jl 6394a3 : ereport(ERROR, : (errcode_for_socket_access(), : errmsg("poll() failed: %m"))); : } : } : else if (rc == 0) 0.00 : 63932f: 0f 85 b5 00 00 00 jne 6393ea : { : /* timeout exceeded */ : if (wakeEvents & WL_TIMEOUT) : result |= WL_TIMEOUT; 0.00 : 639335: 44 0b ad 7c ff ff ff or -0x84(%rbp),%r13d : } : } : #endif /* HAVE_POLL */ : : /* If we're not done, update cur_timeout for next iteration */ : if (result == 0 && cur_timeout >= 0) 0.00 : 63933c: 45 85 ed test %r13d,%r13d 0.00 : 63933f: 90 nop 0.00 : 639340: 74 26 je 639368 : tv.tv_sec = cur_timeout / 1000L; : tv.tv_usec = (cur_timeout % 1000L) * 1000L; : #endif : } : } while (result == 0); : waiting = false; 0.00 : 639342: c7 05 2c 27 54 00 00 movl $0x0,0x54272c(%rip) # b7ba78 0.00 : 639349: 00 00 00 : : return result; : } 0.00 : 63934c: 48 81 c4 88 00 00 00 add $0x88,%rsp 0.00 : 639353: 44 89 e8 mov %r13d,%eax 0.00 : 639356: 5b pop %rbx 0.00 : 639357: 41 5c pop %r12 0.00 : 639359: 41 5d pop %r13 0.00 : 63935b: 41 5e pop %r14 0.00 : 63935d: 41 5f pop %r15 0.00 : 63935f: c9 leaveq 0.00 : 639360: c3 retq 0.00 : 639361: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : } : } : #endif /* HAVE_POLL */ : : /* If we're not done, update cur_timeout for next iteration */ : if (result == 0 && cur_timeout >= 0) 0.00 : 639368: 4d 85 f6 test %r14,%r14 0.00 : 63936b: 0f 88 92 fe ff ff js 639203 : { : INSTR_TIME_SET_CURRENT(cur_time); 0.00 : 639371: 48 8d 7d b0 lea -0x50(%rbp),%rdi 0.00 : 639375: 31 f6 xor %esi,%esi 0.00 : 639377: e8 44 02 e3 ff callq 4695c0 : INSTR_TIME_SUBTRACT(cur_time, start_time); 0.00 : 63937c: 48 8b 45 b8 mov -0x48(%rbp),%rax 0.00 : 639380: 48 2b 45 c8 sub -0x38(%rbp),%rax 0.00 : 639384: 48 8b 55 b0 mov -0x50(%rbp),%rdx 0.00 : 639388: 48 2b 55 c0 sub -0x40(%rbp),%rdx 0.00 : 63938c: 48 85 c0 test %rax,%rax 0.00 : 63938f: 48 89 45 b8 mov %rax,-0x48(%rbp) 0.00 : 639393: 48 89 55 b0 mov %rdx,-0x50(%rbp) 0.00 : 639397: 79 1b jns 6393b4 0.00 : 639399: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : * that EOF and error conditions are reported only via WL_SOCKET_READABLE. : */ : int : WaitLatchOrSocket(volatile Latch *latch, int wakeEvents, pgsocket sock, : long timeout) : { 0.00 : 6393a0: 48 83 ea 01 sub $0x1,%rdx : : /* If we're not done, update cur_timeout for next iteration */ : if (result == 0 && cur_timeout >= 0) : { : INSTR_TIME_SET_CURRENT(cur_time); : INSTR_TIME_SUBTRACT(cur_time, start_time); 0.00 : 6393a4: 48 05 40 42 0f 00 add $0xf4240,%rax 0.00 : 6393aa: 78 f4 js 6393a0 0.00 : 6393ac: 48 89 55 b0 mov %rdx,-0x50(%rbp) 0.00 : 6393b0: 48 89 45 b8 mov %rax,-0x48(%rbp) : cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); 0.00 : 6393b4: f2 48 0f 2a c0 cvtsi2sd %rax,%xmm0 0.00 : 6393b9: f2 48 0f 2a 4d b0 cvtsi2sdq -0x50(%rbp),%xmm1 0.00 : 6393bf: f2 0f 59 0d 11 32 24 mulsd 0x243211(%rip),%xmm1 # 87c5d8 <__func__.18742+0x13> 0.00 : 6393c6: 00 0.00 : 6393c7: 4c 89 fa mov %r15,%rdx 0.00 : 6393ca: 45 31 f6 xor %r14d,%r14d 0.00 : 6393cd: f2 0f 5e 05 03 32 24 divsd 0x243203(%rip),%xmm0 # 87c5d8 <__func__.18742+0x13> 0.00 : 6393d4: 00 0.00 : 6393d5: f2 0f 58 c8 addsd %xmm0,%xmm1 0.00 : 6393d9: f2 48 0f 2c c1 cvttsd2si %xmm1,%rax 0.00 : 6393de: 48 29 c2 sub %rax,%rdx 0.00 : 6393e1: 4c 0f 49 f2 cmovns %rdx,%r14 0.00 : 6393e5: e9 19 fe ff ff jmpq 639203 : result |= WL_TIMEOUT; : } : else : { : /* at least one event occurred, so check revents values */ : if ((wakeEvents & WL_SOCKET_READABLE) && 0.00 : 6393ea: 8b 8d 60 ff ff ff mov -0xa0(%rbp),%ecx 0.00 : 6393f0: 85 c9 test %ecx,%ecx 0.00 : 6393f2: 74 10 je 639404 0.00 : 6393f4: 0f bf 45 86 movswl -0x7a(%rbp),%eax : (pfds[0].revents & (POLLIN | POLLHUP | POLLERR | POLLNVAL))) : { : /* data available in socket, or EOF/error condition */ : result |= WL_SOCKET_READABLE; 0.00 : 6393f8: 44 89 ea mov %r13d,%edx 0.00 : 6393fb: 83 ca 02 or $0x2,%edx 0.00 : 6393fe: a8 39 test $0x39,%al 0.00 : 639400: 44 0f 45 ea cmovne %edx,%r13d : } : if ((wakeEvents & WL_SOCKET_WRITEABLE) && 0.00 : 639404: 8b 95 5c ff ff ff mov -0xa4(%rbp),%edx 0.00 : 63940a: 85 d2 test %edx,%edx 0.00 : 63940c: 74 0e je 63941c : (pfds[0].revents & POLLOUT)) : { : result |= WL_SOCKET_WRITEABLE; 0.00 : 63940e: 44 89 e8 mov %r13d,%eax 0.00 : 639411: 83 c8 04 or $0x4,%eax 0.00 : 639414: f6 45 86 04 testb $0x4,-0x7a(%rbp) 0.00 : 639418: 44 0f 45 e8 cmovne %eax,%r13d : /* : * We expect a POLLHUP when the remote end is closed, but because : * we don't expect the pipe to become readable or to have any : * errors either, treat those cases as postmaster death, too. : */ : if ((wakeEvents & WL_POSTMASTER_DEATH) && 0.00 : 63941c: 8b 85 64 ff ff ff mov -0x9c(%rbp),%eax 0.00 : 639422: 85 c0 test %eax,%eax 0.00 : 639424: 0f 84 12 ff ff ff je 63933c 0.00 : 63942a: 8d 43 ff lea -0x1(%rbx),%eax 0.00 : 63942d: 48 98 cltq 0.00 : 63942f: 0f bf 44 c5 86 movswl -0x7a(%rbp,%rax,8),%eax 0.00 : 639434: a8 39 test $0x39,%al 0.00 : 639436: 0f 84 00 ff ff ff je 63933c : * postmaster pipe, but since the consequences of falsely : * returning WL_POSTMASTER_DEATH could be pretty unpleasant, : * we take the trouble to positively verify EOF with : * PostmasterIsAlive(). : */ : if (!PostmasterIsAlive()) 0.00 : 63943c: e8 4f 5e 04 00 callq 67f290 : result |= WL_POSTMASTER_DEATH; 0.00 : 639441: 44 89 ea mov %r13d,%edx 0.00 : 639444: 83 ca 10 or $0x10,%edx 0.00 : 639447: 84 c0 test %al,%al 0.00 : 639449: 44 0f 44 ea cmove %edx,%r13d 0.00 : 63944d: e9 ea fe ff ff jmpq 63933c : } : } : else if (rc == 0) : { : waiting = false; : elog(ERROR, "unexpected EOF on self-pipe"); 0.00 : 639452: ba 12 de 89 00 mov $0x89de12,%edx 0.00 : 639457: be 8d 02 00 00 mov $0x28d,%esi 0.00 : 63945c: bf f0 dc 89 00 mov $0x89dcf0,%edi : elog(ERROR, "read() on self-pipe failed: %m"); : } : } : else if (rc == 0) : { : waiting = false; 0.00 : 639461: c7 05 0d 26 54 00 00 movl $0x0,0x54260d(%rip) # b7ba78 0.00 : 639468: 00 00 00 : elog(ERROR, "unexpected EOF on self-pipe"); 0.00 : 63946b: e8 b0 1f 14 00 callq 77b420 0.00 : 639470: be 0f dd 89 00 mov $0x89dd0f,%esi 0.00 : 639475: bf 14 00 00 00 mov $0x14,%edi 0.00 : 63947a: 31 c0 xor %eax,%eax 0.00 : 63947c: e8 af 1d 14 00 callq 77b230 0.00 : 639481: e8 4a 00 e3 ff callq 4694d0 : pfds[0].fd = sock; : pfds[0].events = 0; : if (wakeEvents & WL_SOCKET_READABLE) : pfds[0].events |= POLLIN; : if (wakeEvents & WL_SOCKET_WRITEABLE) : pfds[0].events |= POLLOUT; 0.00 : 639486: 66 83 4d 84 04 orw $0x4,-0x7c(%rbp) 0.00 : 63948b: e9 2c fe ff ff jmpq 6392bc : * is interrupted. (On some platforms, select() will update the contents : * of "tv" for us, but unfortunately we can't rely on that.) : */ : if (wakeEvents & WL_TIMEOUT) : { : INSTR_TIME_SET_CURRENT(start_time); 0.00 : 639490: 48 8d 7d c0 lea -0x40(%rbp),%rdi 0.00 : 639494: 31 f6 xor %esi,%esi 0.00 : 639496: 4d 89 fe mov %r15,%r14 0.00 : 639499: e8 22 01 e3 ff callq 4695c0 0.00 : 63949e: e9 12 fd ff ff jmpq 6391b5 : : /* Check return code */ : if (rc < 0) : { : /* EINTR is okay, otherwise complain */ : if (errno != EINTR) 0.00 : 6394a3: e8 18 08 e3 ff callq 469cc0 <__errno_location@plt> 0.00 : 6394a8: 83 38 04 cmpl $0x4,(%rax) 0.00 : 6394ab: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 6394b0: 0f 84 86 fe ff ff je 63933c : { : waiting = false; : ereport(ERROR, 0.00 : 6394b6: 45 31 c0 xor %r8d,%r8d 0.00 : 6394b9: b9 00 de 89 00 mov $0x89de00,%ecx 0.00 : 6394be: ba 50 01 00 00 mov $0x150,%edx 0.00 : 6394c3: be f0 dc 89 00 mov $0x89dcf0,%esi 0.00 : 6394c8: bf 14 00 00 00 mov $0x14,%edi : if (rc < 0) : { : /* EINTR is okay, otherwise complain */ : if (errno != EINTR) : { : waiting = false; 0.00 : 6394cd: c7 05 a1 25 54 00 00 movl $0x0,0x5425a1(%rip) # b7ba78 0.00 : 6394d4: 00 00 00 : ereport(ERROR, 0.00 : 6394d7: e8 e4 15 14 00 callq 77aac0 0.00 : 6394dc: 84 c0 test %al,%al 0.00 : 6394de: 74 1e je 6394fe 0.00 : 6394e0: bf 2b dd 89 00 mov $0x89dd2b,%edi 0.00 : 6394e5: 31 c0 xor %eax,%eax 0.00 : 6394e7: e8 b4 33 14 00 callq 77c8a0 0.00 : 6394ec: 89 c3 mov %eax,%ebx 0.00 : 6394ee: e8 5d 35 14 00 callq 77ca50 0.00 : 6394f3: 89 de mov %ebx,%esi 0.00 : 6394f5: 89 c7 mov %eax,%edi 0.00 : 6394f7: 31 c0 xor %eax,%eax 0.00 : 6394f9: e8 e2 10 14 00 callq 77a5e0 0.00 : 6394fe: e8 cd ff e2 ff callq 4694d0 0.00 : 639503: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : Assert(wakeEvents != 0); /* must have at least one wake event */ : /* Cannot specify WL_SOCKET_WRITEABLE without WL_SOCKET_READABLE */ : Assert((wakeEvents & (WL_SOCKET_READABLE | WL_SOCKET_WRITEABLE)) != WL_SOCKET_WRITEABLE); : : if ((wakeEvents & WL_LATCH_SET) && latch->owner_pid != MyProcPid) : elog(ERROR, "cannot wait on a latch owned by another process"); 0.00 : 639508: ba 00 de 89 00 mov $0x89de00,%edx 0.00 : 63950d: be ed 00 00 00 mov $0xed,%esi 0.00 : 639512: bf f0 dc 89 00 mov $0x89dcf0,%edi 0.00 : 639517: e8 04 1f 14 00 callq 77b420 0.00 : 63951c: be 50 dd 89 00 mov $0x89dd50,%esi 0.00 : 639521: bf 14 00 00 00 mov $0x14,%edi 0.00 : 639526: 31 c0 xor %eax,%eax 0.00 : 639528: e8 03 1d 14 00 callq 77b230 0.00 : 63952d: e8 9e ff e2 ff callq 4694d0 : */ : drainSelfPipe(); : : if ((wakeEvents & WL_LATCH_SET) && latch->is_set) : { : result |= WL_LATCH_SET; 0.00 : 639532: 41 83 cd 01 or $0x1,%r13d : : /* : * Leave loop immediately, avoid blocking again. We don't attempt : * to report any other events that might also be satisfied. : */ : break; 0.00 : 639536: e9 07 fe ff ff jmpq 639342 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 100.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:3270 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000674440 : : * Returns TRUE if we successfully marked the buffer as I/O busy, : * FALSE if someone else already did the work. : */ : static bool : StartBufferIO(volatile BufferDesc *buf, bool forInput) : { 0.00 : 674440: 55 push %rbp 0.00 : 674441: 48 89 e5 mov %rsp,%rbp 0.00 : 674444: 41 56 push %r14 0.00 : 674446: 41 89 f6 mov %esi,%r14d 0.00 : 674449: 41 55 push %r13 : static __inline__ int : tas(volatile slock_t *lock) : { : register slock_t _res = 1; : : __asm__ __volatile__( 0.00 : 67444b: 41 bd 01 00 00 00 mov $0x1,%r13d 0.00 : 674451: 41 54 push %r12 0.00 : 674453: 4c 8d 67 20 lea 0x20(%rdi),%r12 0.00 : 674457: 53 push %rbx 0.00 : 674458: 48 89 fb mov %rdi,%rbx 0.00 : 67445b: eb 20 jmp 67447d 0.00 : 67445d: 0f 1f 00 nopl (%rax) : */ : LWLockAcquire(buf->io_in_progress_lock, LW_EXCLUSIVE); : : LockBufHdr(buf); : : if (!(buf->flags & BM_IO_IN_PROGRESS)) 0.00 : 674460: 0f b7 43 14 movzwl 0x14(%rbx),%eax 0.00 : 674464: a8 08 test $0x8,%al 0.00 : 674466: 74 46 je 6744ae : * The only way BM_IO_IN_PROGRESS could be set when the io_in_progress : * lock isn't held is if the process doing the I/O is recovering from : * an error (see AbortBufferIO). If that's the case, we must wait for : * him to get unwedged. : */ : UnlockBufHdr(buf); 0.00 : 674468: c6 43 20 00 movb $0x0,0x20(%rbx) : LWLockRelease(buf->io_in_progress_lock); 0.00 : 67446c: 48 8b 7b 30 mov 0x30(%rbx),%rdi 0.00 : 674470: e8 2b af 01 00 callq 68f3a0 : WaitIO(buf); 0.00 : 674475: 48 89 df mov %rbx,%rdi 0.00 : 674478: e8 43 ff ff ff callq 6743c0 : { : /* : * Grab the io_in_progress lock so that other processes can wait for : * me to finish the I/O. : */ : LWLockAcquire(buf->io_in_progress_lock, LW_EXCLUSIVE); 0.00 : 67447d: 48 8b 7b 30 mov 0x30(%rbx),%rdi 0.00 : 674481: 31 f6 xor %esi,%esi 0.00 : 674483: e8 68 b6 01 00 callq 68faf0 0.00 : 674488: 44 89 e8 mov %r13d,%eax 0.00 : 67448b: f0 41 86 04 24 lock xchg %al,(%r12) : : LockBufHdr(buf); /home/Computational/mark/src/postgres-andres/src/backend/storage/buffer/bufmgr.c:3270 100.00 : 674490: 84 c0 test %al,%al 0.00 : 674492: 74 cc je 674460 0.00 : 674494: ba c6 0c 00 00 mov $0xcc6,%edx 0.00 : 674499: be 53 9d 8a 00 mov $0x8a9d53,%esi 0.00 : 67449e: 4c 89 e7 mov %r12,%rdi 0.00 : 6744a1: e8 9a bb 01 00 callq 690040 : : if (!(buf->flags & BM_IO_IN_PROGRESS)) 0.00 : 6744a6: 0f b7 43 14 movzwl 0x14(%rbx),%eax 0.00 : 6744aa: a8 08 test $0x8,%al 0.00 : 6744ac: 75 ba jne 674468 : WaitIO(buf); : } : : /* Once we get here, there is definitely no I/O active on this buffer */ : : if (forInput ? (buf->flags & BM_VALID) : !(buf->flags & BM_DIRTY)) 0.00 : 6744ae: 45 84 f6 test %r14b,%r14b 0.00 : 6744b1: 74 3d je 6744f0 0.00 : 6744b3: 0f b7 43 14 movzwl 0x14(%rbx),%eax 0.00 : 6744b7: d1 e8 shr %eax 0.00 : 6744b9: 83 e0 01 and $0x1,%eax 0.00 : 6744bc: 84 c0 test %al,%al 0.00 : 6744be: 75 3d jne 6744fd : UnlockBufHdr(buf); : LWLockRelease(buf->io_in_progress_lock); : return false; : } : : buf->flags |= BM_IO_IN_PROGRESS; 0.00 : 6744c0: 0f b7 43 14 movzwl 0x14(%rbx),%eax 0.00 : 6744c4: 83 c8 08 or $0x8,%eax 0.00 : 6744c7: 66 89 43 14 mov %ax,0x14(%rbx) : : UnlockBufHdr(buf); 0.00 : 6744cb: c6 43 20 00 movb $0x0,0x20(%rbx) : : InProgressBuf = buf; 0.00 : 6744cf: 48 89 1d 92 8b 50 00 mov %rbx,0x508b92(%rip) # b7d068 : IsForInput = forInput; 0.00 : 6744d6: b8 01 00 00 00 mov $0x1,%eax 0.00 : 6744db: 44 88 35 c3 8b 50 00 mov %r14b,0x508bc3(%rip) # b7d0a5 : : return true; : } 0.00 : 6744e2: 5b pop %rbx 0.00 : 6744e3: 41 5c pop %r12 0.00 : 6744e5: 41 5d pop %r13 0.00 : 6744e7: 41 5e pop %r14 0.00 : 6744e9: c9 leaveq 0.00 : 6744ea: c3 retq 0.00 : 6744eb: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : WaitIO(buf); : } : : /* Once we get here, there is definitely no I/O active on this buffer */ : : if (forInput ? (buf->flags & BM_VALID) : !(buf->flags & BM_DIRTY)) 0.00 : 6744f0: 0f b7 43 14 movzwl 0x14(%rbx),%eax 0.00 : 6744f4: f7 d0 not %eax 0.00 : 6744f6: 83 e0 01 and $0x1,%eax 0.00 : 6744f9: 84 c0 test %al,%al 0.00 : 6744fb: 74 c3 je 6744c0 : { : /* someone else already did the I/O */ : UnlockBufHdr(buf); 0.00 : 6744fd: c6 43 20 00 movb $0x0,0x20(%rbx) : LWLockRelease(buf->io_in_progress_lock); 0.00 : 674501: 48 8b 7b 30 mov 0x30(%rbx),%rdi 0.00 : 674505: e8 96 ae 01 00 callq 68f3a0 : : InProgressBuf = buf; : IsForInput = forInput; : : return true; : } 0.00 : 67450a: 5b pop %rbx 0.00 : 67450b: 41 5c pop %r12 0.00 : 67450d: 41 5d pop %r13 : : if (forInput ? (buf->flags & BM_VALID) : !(buf->flags & BM_DIRTY)) : { : /* someone else already did the I/O */ : UnlockBufHdr(buf); : LWLockRelease(buf->io_in_progress_lock); 0.00 : 67450f: 31 c0 xor %eax,%eax : : InProgressBuf = buf; : IsForInput = forInput; : : return true; : } 0.00 : 674511: 41 5e pop %r14 0.00 : 674513: c9 leaveq Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 100.00 /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/lwlock.c:1075 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 000000000068faf0 : : * : * Side effect: cancel/die interrupts are held off until lock release. : */ : bool : LWLockAcquire(LWLock *l, LWLockMode mode) : { 0.00 : 68faf0: 55 push %rbp 0.00 : 68faf1: 48 89 e5 mov %rsp,%rbp 0.00 : 68faf4: 41 57 push %r15 0.00 : 68faf6: 41 89 f7 mov %esi,%r15d 0.00 : 68faf9: 41 56 push %r14 0.00 : 68fafb: 49 89 fe mov %rdi,%r14 0.00 : 68fafe: 41 55 push %r13 0.00 : 68fb00: 41 54 push %r12 0.00 : 68fb02: 53 push %rbx 0.00 : 68fb03: 48 83 ec 18 sub $0x18,%rsp : * to catch unsafe coding practices. : */ : Assert(!(proc == NULL && IsUnderPostmaster)); : : /* Ensure we will have room to remember the lock */ : if (num_held_lwlocks >= MAX_SIMUL_LWLOCKS) 0.00 : 68fb07: 81 3d f7 de 4e 00 c7 cmpl $0xc7,0x4edef7(%rip) # b7da08 0.00 : 68fb0e: 00 00 00 : : /* internal function to implement LWLockAcquire and LWLockAcquireWithVar */ : static inline bool : LWLockAcquireCommon(LWLock *lock, LWLockMode mode, uint64 *valptr, uint64 val) : { : PGPROC *proc = MyProc; 0.00 : 68fb11: 4c 8b 25 30 de 4e 00 mov 0x4ede30(%rip),%r12 # b7d948 : * to catch unsafe coding practices. : */ : Assert(!(proc == NULL && IsUnderPostmaster)); : : /* Ensure we will have room to remember the lock */ : if (num_held_lwlocks >= MAX_SIMUL_LWLOCKS) 0.00 : 68fb18: 0f 8f 0c 01 00 00 jg 68fc2a : /* : * Lock out cancel/die interrupts until we exit the code section protected : * by the LWLock. This ensures that interrupts will not interfere with : * manipulations of data structures in shared memory. : */ : HOLD_INTERRUPTS(); 0.00 : 68fb1e: 8b 05 74 a5 52 00 mov 0x52a574(%rip),%eax # bba098 : : /* The atomic subtraction provides the barrier */ : BOOL_ACCESS_ONCE(lock->releaseOK) = true; : : /* not waiting anymore */ : pg_atomic_fetch_sub_u32(&lock->nwaiters, 1); 0.00 : 68fb24: 48 8d 57 08 lea 0x8(%rdi),%rdx : TRACE_POSTGRESQL_LWLOCK_WAIT_START(T_NAME(lock), T_ID(lock), mode); : : for (;;) : { : /* "false" means cannot accept cancel/die interrupt here. */ : PGSemaphoreLock(&proc->sem, false); 0.00 : 68fb28: 4d 8d 6c 24 10 lea 0x10(%r12),%r13 : : /* The atomic subtraction provides the barrier */ : BOOL_ACCESS_ONCE(lock->releaseOK) = true; : : /* not waiting anymore */ : pg_atomic_fetch_sub_u32(&lock->nwaiters, 1); 0.00 : 68fb2d: 31 db xor %ebx,%ebx /home/Computational/mark/src/postgres-andres/src/backend/storage/lmgr/lwlock.c:1075 100.00 : 68fb2f: c6 45 c7 01 movb $0x1,-0x39(%rbp) 0.00 : 68fb33: 48 89 55 c8 mov %rdx,-0x38(%rbp) : /* : * Lock out cancel/die interrupts until we exit the code section protected : * by the LWLock. This ensures that interrupts will not interfere with : * manipulations of data structures in shared memory. : */ : HOLD_INTERRUPTS(); 0.00 : 68fb37: 83 c0 01 add $0x1,%eax 0.00 : 68fb3a: 89 05 58 a5 52 00 mov %eax,0x52a558(%rip) # bba098 : break; : extraWaits++; : } : : /* The atomic subtraction provides the barrier */ : BOOL_ACCESS_ONCE(lock->releaseOK) = true; 0.00 : 68fb40: 48 8d 47 01 lea 0x1(%rdi),%rax 0.00 : 68fb44: 48 89 45 d0 mov %rax,-0x30(%rbp) 0.00 : 68fb48: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 68fb4f: 00 : bool mustwait; : : /* : * try to grab the lock the first time, we're not in the waitqueue yet. : */ : mustwait = LWLockAttemptLock(lock, mode, NULL); 0.00 : 68fb50: 31 d2 xor %edx,%edx 0.00 : 68fb52: 44 89 fe mov %r15d,%esi 0.00 : 68fb55: 4c 89 f7 mov %r14,%rdi 0.00 : 68fb58: e8 63 f3 ff ff callq 68eec0 : : if (!mustwait) 0.00 : 68fb5d: 84 c0 test %al,%al 0.00 : 68fb5f: 74 79 je 68fbda : * other lock will see our queue entries when releasing since they : * existed before we checked for the lock. : */ : : /* add to the queue */ : LWLockQueueSelf(lock, mode); 0.00 : 68fb61: 44 89 fe mov %r15d,%esi 0.00 : 68fb64: 4c 89 f7 mov %r14,%rdi 0.00 : 68fb67: e8 14 f5 ff ff callq 68f080 : : /* we're now guaranteed to be woken up if necessary */ : mustwait = LWLockAttemptLock(lock, mode, NULL); 0.00 : 68fb6c: 31 d2 xor %edx,%edx 0.00 : 68fb6e: 44 89 fe mov %r15d,%esi 0.00 : 68fb71: 4c 89 f7 mov %r14,%rdi 0.00 : 68fb74: e8 47 f3 ff ff callq 68eec0 : : /* ok, grabbed the lock the second time round, need to undo queueing */ : if (!mustwait) 0.00 : 68fb79: 84 c0 test %al,%al 0.00 : 68fb7b: 75 06 jne 68fb83 0.00 : 68fb7d: eb 30 jmp 68fbaf 0.00 : 68fb7f: 90 nop : { : /* "false" means cannot accept cancel/die interrupt here. */ : PGSemaphoreLock(&proc->sem, false); : if (!proc->lwWaiting) : break; : extraWaits++; 0.00 : 68fb80: 83 c3 01 add $0x1,%ebx : TRACE_POSTGRESQL_LWLOCK_WAIT_START(T_NAME(lock), T_ID(lock), mode); : : for (;;) : { : /* "false" means cannot accept cancel/die interrupt here. */ : PGSemaphoreLock(&proc->sem, false); 0.00 : 68fb83: 31 f6 xor %esi,%esi 0.00 : 68fb85: 4c 89 ef mov %r13,%rdi 0.00 : 68fb88: e8 93 85 fa ff callq 638120 : if (!proc->lwWaiting) 0.00 : 68fb8d: 41 80 7c 24 41 00 cmpb $0x0,0x41(%r12) 0.00 : 68fb93: 75 eb jne 68fb80 : break; : extraWaits++; : } : : /* The atomic subtraction provides the barrier */ : BOOL_ACCESS_ONCE(lock->releaseOK) = true; 0.00 : 68fb95: 48 8b 45 d0 mov -0x30(%rbp),%rax 0.00 : 68fb99: c6 00 01 movb $0x1,(%rax) : #define PG_HAVE_ATOMIC_FETCH_ADD_U32 : static inline uint32 : pg_atomic_fetch_add_u32_impl(volatile pg_atomic_uint32 *ptr, int32 add_) : { : uint32 res; : __asm__ __volatile__( 0.00 : 68fb9c: b8 ff ff ff ff mov $0xffffffff,%eax 0.00 : 68fba1: 48 8b 55 c8 mov -0x38(%rbp),%rdx 0.00 : 68fba5: f0 0f c1 02 lock xadd %eax,(%rdx) 0.00 : 68fba9: c6 45 c7 00 movb $0x0,-0x39(%rbp) 0.00 : 68fbad: eb a1 jmp 68fb50 : LOG_LWDEBUG("LWLockAcquire", lock, "acquired, undoing queue"); : : #ifdef LWLOCK_STATS : lwstats->dequeue_self_count++; : #endif : if (!LWLockDequeueSelf(lock)) 0.00 : 68fbaf: 4c 89 f7 mov %r14,%rdi 0.00 : 68fbb2: e8 19 f6 ff ff callq 68f1d0 0.00 : 68fbb7: 84 c0 test %al,%al 0.00 : 68fbb9: 75 1f jne 68fbda 0.00 : 68fbbb: eb 06 jmp 68fbc3 0.00 : 68fbbd: 0f 1f 00 nopl (%rax) : for (;;) : { : PGSemaphoreLock(&proc->sem, false); : if (!proc->lwWaiting) : break; : extraWaits++; 0.00 : 68fbc0: 83 c3 01 add $0x1,%ebx : * reset at some inconvenient point later, and releaseOk : * wouldn't be managed correctly. : */ : for (;;) : { : PGSemaphoreLock(&proc->sem, false); 0.00 : 68fbc3: 31 f6 xor %esi,%esi 0.00 : 68fbc5: 4c 89 ef mov %r13,%rdi 0.00 : 68fbc8: e8 53 85 fa ff callq 638120 : if (!proc->lwWaiting) 0.00 : 68fbcd: 41 80 7c 24 41 00 cmpb $0x0,0x41(%r12) 0.00 : 68fbd3: 75 eb jne 68fbc0 : /* : * Reset releaseOk - if somebody woke us they'll have set it : * to false. No need for a barrier here - we got the lock and : * will perform wakeup if necessary. : */ : BOOL_ACCESS_ONCE(lock->releaseOK) = true; 0.00 : 68fbd5: 41 c6 46 01 01 movb $0x1,0x1(%r14) : *valptr = val; : : TRACE_POSTGRESQL_LWLOCK_ACQUIRE(T_NAME(lock), T_ID(lock), mode); : : /* Add lock to list of locks held by this backend */ : held_lwlocks[num_held_lwlocks].lock = lock; 0.00 : 68fbda: 8b 15 28 de 4e 00 mov 0x4ede28(%rip),%edx # b7da08 0.00 : 68fbe0: 48 63 c2 movslq %edx,%rax : held_lwlocks[num_held_lwlocks++].mode = mode; 0.00 : 68fbe3: 83 c2 01 add $0x1,%edx : *valptr = val; : : TRACE_POSTGRESQL_LWLOCK_ACQUIRE(T_NAME(lock), T_ID(lock), mode); : : /* Add lock to list of locks held by this backend */ : held_lwlocks[num_held_lwlocks].lock = lock; 0.00 : 68fbe6: 48 c1 e0 04 shl $0x4,%rax : held_lwlocks[num_held_lwlocks++].mode = mode; : : /* : * Fix the process wait semaphore's count for any absorbed wakeups. : */ : while (extraWaits-- > 0) 0.00 : 68fbea: 85 db test %ebx,%ebx : : TRACE_POSTGRESQL_LWLOCK_ACQUIRE(T_NAME(lock), T_ID(lock), mode); : : /* Add lock to list of locks held by this backend */ : held_lwlocks[num_held_lwlocks].lock = lock; : held_lwlocks[num_held_lwlocks++].mode = mode; 0.00 : 68fbec: 89 15 16 de 4e 00 mov %edx,0x4ede16(%rip) # b7da08 : *valptr = val; : : TRACE_POSTGRESQL_LWLOCK_ACQUIRE(T_NAME(lock), T_ID(lock), mode); : : /* Add lock to list of locks held by this backend */ : held_lwlocks[num_held_lwlocks].lock = lock; 0.00 : 68fbf2: 4c 89 b0 40 da b7 00 mov %r14,0xb7da40(%rax) : held_lwlocks[num_held_lwlocks++].mode = mode; 0.00 : 68fbf9: 44 89 b8 48 da b7 00 mov %r15d,0xb7da48(%rax) : : /* : * Fix the process wait semaphore's count for any absorbed wakeups. : */ : while (extraWaits-- > 0) 0.00 : 68fc00: 7e 15 jle 68fc17 0.00 : 68fc02: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : PGSemaphoreUnlock(&proc->sem); 0.00 : 68fc08: 4c 89 ef mov %r13,%rdi 0.00 : 68fc0b: 83 eb 01 sub $0x1,%ebx 0.00 : 68fc0e: e8 7d 84 fa ff callq 638090 : held_lwlocks[num_held_lwlocks++].mode = mode; : : /* : * Fix the process wait semaphore's count for any absorbed wakeups. : */ : while (extraWaits-- > 0) 0.00 : 68fc13: 85 db test %ebx,%ebx 0.00 : 68fc15: 7f f1 jg 68fc08 : */ : bool : LWLockAcquire(LWLock *l, LWLockMode mode) : { : return LWLockAcquireCommon(l, mode, NULL, 0); : } 0.00 : 68fc17: 0f b6 45 c7 movzbl -0x39(%rbp),%eax 0.00 : 68fc1b: 48 83 c4 18 add $0x18,%rsp 0.00 : 68fc1f: 5b pop %rbx 0.00 : 68fc20: 41 5c pop %r12 0.00 : 68fc22: 41 5d pop %r13 0.00 : 68fc24: 41 5e pop %r14 0.00 : 68fc26: 41 5f pop %r15 0.00 : 68fc28: c9 leaveq 0.00 : 68fc29: c3 retq : */ : Assert(!(proc == NULL && IsUnderPostmaster)); : : /* Ensure we will have room to remember the lock */ : if (num_held_lwlocks >= MAX_SIMUL_LWLOCKS) : elog(ERROR, "too many LWLocks taken"); 0.00 : 68fc2a: ba 70 d1 8a 00 mov $0x8ad170,%edx 0.00 : 68fc2f: be b0 03 00 00 mov $0x3b0,%esi 0.00 : 68fc34: bf 85 d0 8a 00 mov $0x8ad085,%edi 0.00 : 68fc39: e8 e2 b7 0e 00 callq 77b420 0.00 : 68fc3e: be 8e d0 8a 00 mov $0x8ad08e,%esi 0.00 : 68fc43: bf 14 00 00 00 mov $0x14,%edi 0.00 : 68fc48: 31 c0 xor %eax,%eax 0.00 : 68fc4a: e8 e1 b5 0e 00 callq 77b230 0.00 : 68fc4f: e8 7c 98 dd ff callq 4694d0 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 100.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/adt/varchar.c:704 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000758230 : : * need to be so careful. : *****************************************************************************/ : : Datum : bpchareq(PG_FUNCTION_ARGS) : { /home/Computational/mark/src/postgres-andres/src/backend/utils/adt/varchar.c:704 100.00 : 758230: 55 push %rbp 0.00 : 758231: 48 89 e5 mov %rsp,%rbp 0.00 : 758234: 48 89 5d d8 mov %rbx,-0x28(%rbp) 0.00 : 758238: 4c 89 65 e0 mov %r12,-0x20(%rbp) 0.00 : 75823c: 4c 89 6d e8 mov %r13,-0x18(%rbp) 0.00 : 758240: 4c 89 75 f0 mov %r14,-0x10(%rbp) 0.00 : 758244: 49 89 fd mov %rdi,%r13 0.00 : 758247: 4c 89 7d f8 mov %r15,-0x8(%rbp) 0.00 : 75824b: 48 83 ec 30 sub $0x30,%rsp : BpChar *arg1 = PG_GETARG_BPCHAR_PP(0); 0.00 : 75824f: 48 8b 7f 20 mov 0x20(%rdi),%rdi : : /* : * Since we only care about equality or not-equality, we can avoid all the : * expense of strcoll() here, and just do bitwise comparison. : */ : if (len1 != len2) 0.00 : 758253: 45 31 f6 xor %r14d,%r14d : *****************************************************************************/ : : Datum : bpchareq(PG_FUNCTION_ARGS) : { : BpChar *arg1 = PG_GETARG_BPCHAR_PP(0); 0.00 : 758256: e8 85 6a 02 00 callq 77ece0 : BpChar *arg2 = PG_GETARG_BPCHAR_PP(1); 0.00 : 75825b: 49 8b 7d 28 mov 0x28(%r13),%rdi : *****************************************************************************/ : : Datum : bpchareq(PG_FUNCTION_ARGS) : { : BpChar *arg1 = PG_GETARG_BPCHAR_PP(0); 0.00 : 75825f: 49 89 c4 mov %rax,%r12 : BpChar *arg2 = PG_GETARG_BPCHAR_PP(1); 0.00 : 758262: e8 79 6a 02 00 callq 77ece0 : int len1, : len2; : bool result; : : len1 = bcTruelen(arg1); 0.00 : 758267: 4c 89 e7 mov %r12,%rdi : : Datum : bpchareq(PG_FUNCTION_ARGS) : { : BpChar *arg1 = PG_GETARG_BPCHAR_PP(0); : BpChar *arg2 = PG_GETARG_BPCHAR_PP(1); 0.00 : 75826a: 48 89 c3 mov %rax,%rbx : int len1, : len2; : bool result; : : len1 = bcTruelen(arg1); 0.00 : 75826d: e8 1e fb ff ff callq 757d90 : len2 = bcTruelen(arg2); 0.00 : 758272: 48 89 df mov %rbx,%rdi : BpChar *arg2 = PG_GETARG_BPCHAR_PP(1); : int len1, : len2; : bool result; : : len1 = bcTruelen(arg1); 0.00 : 758275: 41 89 c7 mov %eax,%r15d : len2 = bcTruelen(arg2); 0.00 : 758278: e8 13 fb ff ff callq 757d90 : : /* : * Since we only care about equality or not-equality, we can avoid all the : * expense of strcoll() here, and just do bitwise comparison. : */ : if (len1 != len2) 0.00 : 75827d: 41 39 c7 cmp %eax,%r15d 0.00 : 758280: 74 3e je 7582c0 : result = false; : else : result = (memcmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), len1) == 0); : : PG_FREE_IF_COPY(arg1, 0); 0.00 : 758282: 4d 3b 65 20 cmp 0x20(%r13),%r12 0.00 : 758286: 74 0d je 758295 0.00 : 758288: 4c 89 e7 mov %r12,%rdi 0.00 : 75828b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 758290: e8 eb 08 04 00 callq 798b80 : PG_FREE_IF_COPY(arg2, 1); 0.00 : 758295: 49 3b 5d 28 cmp 0x28(%r13),%rbx 0.00 : 758299: 74 08 je 7582a3 0.00 : 75829b: 48 89 df mov %rbx,%rdi 0.00 : 75829e: e8 dd 08 04 00 callq 798b80 : : PG_RETURN_BOOL(result); : } 0.00 : 7582a3: 4c 89 f0 mov %r14,%rax 0.00 : 7582a6: 48 8b 5d d8 mov -0x28(%rbp),%rbx 0.00 : 7582aa: 4c 8b 65 e0 mov -0x20(%rbp),%r12 0.00 : 7582ae: 4c 8b 6d e8 mov -0x18(%rbp),%r13 0.00 : 7582b2: 4c 8b 75 f0 mov -0x10(%rbp),%r14 0.00 : 7582b6: 4c 8b 7d f8 mov -0x8(%rbp),%r15 0.00 : 7582ba: c9 leaveq 0.00 : 7582bb: c3 retq 0.00 : 7582bc: 0f 1f 40 00 nopl 0x0(%rax) : * expense of strcoll() here, and just do bitwise comparison. : */ : if (len1 != len2) : result = false; : else : result = (memcmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), len1) == 0); 0.00 : 7582c0: f6 03 01 testb $0x1,(%rbx) 0.00 : 7582c3: 48 8d 43 04 lea 0x4(%rbx),%rax 0.00 : 7582c7: 48 8d 7b 01 lea 0x1(%rbx),%rdi 0.00 : 7582cb: 49 8d 74 24 01 lea 0x1(%r12),%rsi 0.00 : 7582d0: 49 63 cf movslq %r15d,%rcx 0.00 : 7582d3: 48 0f 44 f8 cmove %rax,%rdi 0.00 : 7582d7: 41 f6 04 24 01 testb $0x1,(%r12) 0.00 : 7582dc: 49 8d 44 24 04 lea 0x4(%r12),%rax 0.00 : 7582e1: 48 0f 44 f0 cmove %rax,%rsi 0.00 : 7582e5: 48 39 c9 cmp %rcx,%rcx 0.00 : 7582e8: f3 a6 repz cmpsb %es:(%rdi),%ds:(%rsi) 0.00 : 7582ea: 0f 97 c2 seta %dl 0.00 : 7582ed: 0f 92 c0 setb %al 0.00 : 7582f0: 45 31 f6 xor %r14d,%r14d 0.00 : 7582f3: 38 c2 cmp %al,%dl 0.00 : 7582f5: 41 0f 94 c6 sete %r14b 0.00 : 7582f9: eb 87 jmp 758282 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 100.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/adt/varchar.c:908 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000758300 : : * but if we ever change the semantics of bpchar comparison to trust : * strcoll() completely, we'd need to do something different in non-C locales. : */ : Datum : hashbpchar(PG_FUNCTION_ARGS) : { 0.00 : 758300: 55 push %rbp /home/Computational/mark/src/postgres-andres/src/backend/utils/adt/varchar.c:908 100.00 : 758301: 48 89 e5 mov %rsp,%rbp 0.00 : 758304: 48 89 5d e8 mov %rbx,-0x18(%rbp) 0.00 : 758308: 4c 89 65 f0 mov %r12,-0x10(%rbp) 0.00 : 75830c: 49 89 fc mov %rdi,%r12 0.00 : 75830f: 4c 89 6d f8 mov %r13,-0x8(%rbp) 0.00 : 758313: 48 83 ec 20 sub $0x20,%rsp : BpChar *key = PG_GETARG_BPCHAR_PP(0); 0.00 : 758317: 48 8b 7f 20 mov 0x20(%rdi),%rdi 0.00 : 75831b: e8 c0 69 02 00 callq 77ece0 0.00 : 758320: 49 89 c5 mov %rax,%r13 : char *keydata; : int keylen; : Datum result; : : keydata = VARDATA_ANY(key); 0.00 : 758323: 48 8d 58 01 lea 0x1(%rax),%rbx 0.00 : 758327: 48 8d 40 04 lea 0x4(%rax),%rax 0.00 : 75832b: 41 f6 45 00 01 testb $0x1,0x0(%r13) : keylen = bcTruelen(key); 0.00 : 758330: 4c 89 ef mov %r13,%rdi : BpChar *key = PG_GETARG_BPCHAR_PP(0); : char *keydata; : int keylen; : Datum result; : : keydata = VARDATA_ANY(key); 0.00 : 758333: 48 0f 44 d8 cmove %rax,%rbx : keylen = bcTruelen(key); 0.00 : 758337: e8 54 fa ff ff callq 757d90 : : result = hash_any((unsigned char *) keydata, keylen); 0.00 : 75833c: 48 89 df mov %rbx,%rdi : char *keydata; : int keylen; : Datum result; : : keydata = VARDATA_ANY(key); : keylen = bcTruelen(key); 0.00 : 75833f: 89 c6 mov %eax,%esi : : result = hash_any((unsigned char *) keydata, keylen); 0.00 : 758341: e8 0a 80 d3 ff callq 490350 : : /* Avoid leaking memory for toasted inputs */ : PG_FREE_IF_COPY(key, 0); 0.00 : 758346: 4d 3b 6c 24 20 cmp 0x20(%r12),%r13 : Datum result; : : keydata = VARDATA_ANY(key); : keylen = bcTruelen(key); : : result = hash_any((unsigned char *) keydata, keylen); 0.00 : 75834b: 48 89 c3 mov %rax,%rbx : : /* Avoid leaking memory for toasted inputs */ : PG_FREE_IF_COPY(key, 0); 0.00 : 75834e: 74 08 je 758358 0.00 : 758350: 4c 89 ef mov %r13,%rdi 0.00 : 758353: e8 28 08 04 00 callq 798b80 : : return result; : } 0.00 : 758358: 48 89 d8 mov %rbx,%rax 0.00 : 75835b: 4c 8b 65 f0 mov -0x10(%rbp),%r12 0.00 : 75835f: 48 8b 5d e8 mov -0x18(%rbp),%rbx 0.00 : 758363: 4c 8b 6d f8 mov -0x8(%rbp),%r13 0.00 : 758367: c9 leaveq Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 100.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/fmgr/fmgr.c:1305 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 000000000077e0d0 : : * directly-computed parameter list. Note that neither arguments nor result : * are allowed to be NULL. : */ : Datum : FunctionCall1Coll(FmgrInfo *flinfo, Oid collation, Datum arg1) : { 0.00 : 77e0d0: 55 push %rbp 0.00 : 77e0d1: 48 89 f8 mov %rdi,%rax 0.00 : 77e0d4: 48 89 e5 mov %rsp,%rbp 0.00 : 77e0d7: 48 81 ec b0 03 00 00 sub $0x3b0,%rsp : FunctionCallInfoData fcinfo; : Datum result; : : InitFunctionCallInfoData(fcinfo, flinfo, 1, collation, NULL, NULL); 0.00 : 77e0de: 48 89 bd 50 fc ff ff mov %rdi,-0x3b0(%rbp) 0.00 : 77e0e5: 48 c7 85 58 fc ff ff movq $0x0,-0x3a8(%rbp) 0.00 : 77e0ec: 00 00 00 00 : : fcinfo.arg[0] = arg1; : fcinfo.argnull[0] = false; : : result = FunctionCallInvoke(&fcinfo); 0.00 : 77e0f0: 48 8d bd 50 fc ff ff lea -0x3b0(%rbp),%rdi : FunctionCall1Coll(FmgrInfo *flinfo, Oid collation, Datum arg1) : { : FunctionCallInfoData fcinfo; : Datum result; : : InitFunctionCallInfoData(fcinfo, flinfo, 1, collation, NULL, NULL); 0.00 : 77e0f7: 48 c7 85 60 fc ff ff movq $0x0,-0x3a0(%rbp) 0.00 : 77e0fe: 00 00 00 00 0.00 : 77e102: 89 b5 68 fc ff ff mov %esi,-0x398(%rbp) 0.00 : 77e108: c6 85 6c fc ff ff 00 movb $0x0,-0x394(%rbp) 0.00 : 77e10f: 66 c7 85 6e fc ff ff movw $0x1,-0x392(%rbp) 0.00 : 77e116: 01 00 : : fcinfo.arg[0] = arg1; 0.00 : 77e118: 48 89 95 70 fc ff ff mov %rdx,-0x390(%rbp) : fcinfo.argnull[0] = false; 0.00 : 77e11f: c6 45 90 00 movb $0x0,-0x70(%rbp) : : result = FunctionCallInvoke(&fcinfo); 0.00 : 77e123: ff 10 callq *(%rax) : : /* Check for null result, since caller is clearly not expecting one */ : if (unlikely(fcinfo.isnull)) 0.00 : 77e125: 80 bd 6c fc ff ff 00 cmpb $0x0,-0x394(%rbp) 0.00 : 77e12c: 75 02 jne 77e130 : elog(ERROR, "function %u returned NULL", fcinfo.flinfo->fn_oid); : : return result; : } /home/Computational/mark/src/postgres-andres/src/backend/utils/fmgr/fmgr.c:1305 100.00 : 77e12e: c9 leaveq 0.00 : 77e12f: c3 retq : : result = FunctionCallInvoke(&fcinfo); : : /* Check for null result, since caller is clearly not expecting one */ : if (unlikely(fcinfo.isnull)) : elog(ERROR, "function %u returned NULL", fcinfo.flinfo->fn_oid); 0.00 : 77e130: ba 60 52 8d 00 mov $0x8d5260,%edx 0.00 : 77e135: be 16 05 00 00 mov $0x516,%esi 0.00 : 77e13a: bf b3 47 8d 00 mov $0x8d47b3,%edi 0.00 : 77e13f: e8 dc d2 ff ff callq 77b420 0.00 : 77e144: 48 8b 85 50 fc ff ff mov -0x3b0(%rbp),%rax 0.00 : 77e14b: be 97 4c 8d 00 mov $0x8d4c97,%esi 0.00 : 77e150: bf 14 00 00 00 mov $0x14,%edi 0.00 : 77e155: 8b 50 08 mov 0x8(%rax),%edx 0.00 : 77e158: 31 c0 xor %eax,%eax 0.00 : 77e15a: e8 d1 d0 ff ff callq 77b230 0.00 : 77e15f: e8 6c b3 ce ff callq 4694d0 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 100.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/dynahash.c:811 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 00000000007846a0 : : void * : hash_search(HTAB *hashp, : const void *keyPtr, : HASHACTION action, : bool *foundPtr) : { 0.00 : 7846a0: 55 push %rbp 0.00 : 7846a1: 48 89 e5 mov %rsp,%rbp 0.00 : 7846a4: 48 89 5d e0 mov %rbx,-0x20(%rbp) 0.00 : 7846a8: 4c 89 65 e8 mov %r12,-0x18(%rbp) 0.00 : 7846ac: 48 89 fb mov %rdi,%rbx 0.00 : 7846af: 4c 89 6d f0 mov %r13,-0x10(%rbp) 0.00 : 7846b3: 4c 89 75 f8 mov %r14,-0x8(%rbp) 0.00 : 7846b7: 49 89 f5 mov %rsi,%r13 0.00 : 7846ba: 48 83 ec 20 sub $0x20,%rsp 0.00 : 7846be: 41 89 d6 mov %edx,%r14d 0.00 : 7846c1: 49 89 cc mov %rcx,%r12 : return hash_search_with_hash_value(hashp, 0.00 : 7846c4: 48 8b 77 48 mov 0x48(%rdi),%rsi 0.00 : 7846c8: 4c 89 ef mov %r13,%rdi 0.00 : 7846cb: ff 53 10 callq *0x10(%rbx) /home/Computational/mark/src/postgres-andres/src/backend/utils/hash/dynahash.c:811 100.00 : 7846ce: 4d 89 e0 mov %r12,%r8 0.00 : 7846d1: 44 89 f1 mov %r14d,%ecx 0.00 : 7846d4: 4c 89 ee mov %r13,%rsi 0.00 : 7846d7: 48 89 df mov %rbx,%rdi : keyPtr, : hashp->hash(keyPtr, hashp->keysize), : action, : foundPtr); : } 0.00 : 7846da: 4c 8b 64 24 08 mov 0x8(%rsp),%r12 0.00 : 7846df: 48 8b 1c 24 mov (%rsp),%rbx 0.00 : 7846e3: 4c 8b 6c 24 10 mov 0x10(%rsp),%r13 0.00 : 7846e8: 4c 8b 74 24 18 mov 0x18(%rsp),%r14 : hash_search(HTAB *hashp, : const void *keyPtr, : HASHACTION action, : bool *foundPtr) : { : return hash_search_with_hash_value(hashp, 0.00 : 7846ed: 89 c2 mov %eax,%edx : keyPtr, : hashp->hash(keyPtr, hashp->keysize), : action, : foundPtr); : } 0.00 : 7846ef: c9 leaveq : hash_search(HTAB *hashp, : const void *keyPtr, : HASHACTION action, : bool *foundPtr) : { : return hash_search_with_hash_value(hashp, 0.00 : 7846f0: e9 5b f9 ff ff jmpq 784050 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 100.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/mmgr/mcxt.c:756 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000798b80 : : * pfree : * Release an allocated chunk. : */ : void : pfree(void *pointer) : { 0.00 : 798b80: 55 push %rbp 0.00 : 798b81: 48 89 f8 mov %rdi,%rax : Assert(pointer == (void *) MAXALIGN(pointer)); : : /* : * OK, it's probably safe to look at the chunk header. : */ : context = ((StandardChunkHeader *) 0.00 : 798b84: 48 8b 7f f0 mov -0x10(%rdi),%rdi : ((char *) pointer - STANDARDCHUNKHEADERSIZE))->context; : : AssertArg(MemoryContextIsValid(context)); : : (*context->methods->free_p) (context, pointer); 0.00 : 798b88: 48 89 c6 mov %rax,%rsi : * pfree : * Release an allocated chunk. : */ : void : pfree(void *pointer) : { 0.00 : 798b8b: 48 89 e5 mov %rsp,%rbp : context = ((StandardChunkHeader *) : ((char *) pointer - STANDARDCHUNKHEADERSIZE))->context; : : AssertArg(MemoryContextIsValid(context)); : : (*context->methods->free_p) (context, pointer); 0.00 : 798b8e: 48 8b 57 08 mov 0x8(%rdi),%rdx 0.00 : 798b92: 4c 8b 5a 08 mov 0x8(%rdx),%r11 : VALGRIND_MEMPOOL_FREE(context, pointer); : } /home/Computational/mark/src/postgres-andres/src/backend/utils/mmgr/mcxt.c:756 100.00 : 798b96: c9 leaveq : context = ((StandardChunkHeader *) : ((char *) pointer - STANDARDCHUNKHEADERSIZE))->context; : : AssertArg(MemoryContextIsValid(context)); : : (*context->methods->free_p) (context, pointer); 0.00 : 798b97: 41 ff e3 jmpq *%r11 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 100.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/mmgr/mcxt.c:701 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000798d50 : : return ret; : } : : void * : palloc(Size size) : { 0.00 : 798d50: 55 push %rbp 0.00 : 798d51: 48 89 e5 mov %rsp,%rbp 0.00 : 798d54: 53 push %rbx 0.00 : 798d55: 48 89 fb mov %rdi,%rbx 0.00 : 798d58: 48 83 ec 08 sub $0x8,%rsp : void *ret; : : AssertArg(MemoryContextIsValid(CurrentMemoryContext)); : AssertNotInCriticalSection(CurrentMemoryContext); : : if (!AllocSizeIsValid(size)) 0.00 : 798d5c: 48 81 ff ff ff ff 3f cmp $0x3fffffff,%rdi 0.00 : 798d63: 77 25 ja 798d8a : elog(ERROR, "invalid memory alloc request size %zu", size); : : CurrentMemoryContext->isReset = false; 0.00 : 798d65: 48 8b 05 f4 1a 42 00 mov 0x421af4(%rip),%rax # bba860 : : ret = (*CurrentMemoryContext->methods->alloc) (CurrentMemoryContext, size); 0.00 : 798d6c: 48 89 de mov %rbx,%rsi : AssertNotInCriticalSection(CurrentMemoryContext); : : if (!AllocSizeIsValid(size)) : elog(ERROR, "invalid memory alloc request size %zu", size); : : CurrentMemoryContext->isReset = false; 0.00 : 798d6f: c6 40 30 00 movb $0x0,0x30(%rax) : : ret = (*CurrentMemoryContext->methods->alloc) (CurrentMemoryContext, size); /home/Computational/mark/src/postgres-andres/src/backend/utils/mmgr/mcxt.c:701 100.00 : 798d73: 48 8b 3d e6 1a 42 00 mov 0x421ae6(%rip),%rdi # bba860 0.00 : 798d7a: 48 8b 47 08 mov 0x8(%rdi),%rax 0.00 : 798d7e: 4c 8b 18 mov (%rax),%r11 : VALGRIND_MEMPOOL_ALLOC(CurrentMemoryContext, ret, size); : : return ret; : } 0.00 : 798d81: 48 83 c4 08 add $0x8,%rsp 0.00 : 798d85: 5b pop %rbx 0.00 : 798d86: c9 leaveq : if (!AllocSizeIsValid(size)) : elog(ERROR, "invalid memory alloc request size %zu", size); : : CurrentMemoryContext->isReset = false; : : ret = (*CurrentMemoryContext->methods->alloc) (CurrentMemoryContext, size); 0.00 : 798d87: 41 ff e3 jmpq *%r11 : : AssertArg(MemoryContextIsValid(CurrentMemoryContext)); : AssertNotInCriticalSection(CurrentMemoryContext); : : if (!AllocSizeIsValid(size)) : elog(ERROR, "invalid memory alloc request size %zu", size); 0.00 : 798d8a: ba 18 20 8e 00 mov $0x8e2018,%edx 0.00 : 798d8f: be b9 02 00 00 mov $0x2b9,%esi 0.00 : 798d94: bf 8e 1f 8e 00 mov $0x8e1f8e,%edi 0.00 : 798d99: e8 82 26 fe ff callq 77b420 0.00 : 798d9e: 48 89 da mov %rbx,%rdx 0.00 : 798da1: be b8 1f 8e 00 mov $0x8e1fb8,%esi 0.00 : 798da6: bf 14 00 00 00 mov $0x14,%edi 0.00 : 798dab: 31 c0 xor %eax,%eax 0.00 : 798dad: e8 7e 24 fe ff callq 77b230 0.00 : 798db2: e8 19 07 cd ff callq 4694d0 Sorted summary for file /home/Computational/mark/andres/bin/postgres ---------------------------------------------- 100.00 /home/Computational/mark/src/postgres-andres/src/backend/utils/mmgr/mcxt.c:716 Percent | Source code & Disassembly of /home/Computational/mark/andres/bin/postgres ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000798f70 : : return ret; : } : : void * : palloc0(Size size) : { 0.00 : 798f70: 55 push %rbp : void *ret; : : AssertArg(MemoryContextIsValid(CurrentMemoryContext)); : AssertNotInCriticalSection(CurrentMemoryContext); : : if (!AllocSizeIsValid(size)) /home/Computational/mark/src/postgres-andres/src/backend/utils/mmgr/mcxt.c:716 100.00 : 798f71: 48 81 ff ff ff ff 3f cmp $0x3fffffff,%rdi : return ret; : } : : void * : palloc0(Size size) : { 0.00 : 798f78: 48 89 e5 mov %rsp,%rbp 0.00 : 798f7b: 41 54 push %r12 0.00 : 798f7d: 53 push %rbx 0.00 : 798f7e: 48 89 fb mov %rdi,%rbx : void *ret; : : AssertArg(MemoryContextIsValid(CurrentMemoryContext)); : AssertNotInCriticalSection(CurrentMemoryContext); : : if (!AllocSizeIsValid(size)) 0.00 : 798f81: 77 6d ja 798ff0 : elog(ERROR, "invalid memory alloc request size %zu", size); : : CurrentMemoryContext->isReset = false; 0.00 : 798f83: 48 8b 05 d6 18 42 00 mov 0x4218d6(%rip),%rax # bba860 : : ret = (*CurrentMemoryContext->methods->alloc) (CurrentMemoryContext, size); 0.00 : 798f8a: 48 89 de mov %rbx,%rsi : AssertNotInCriticalSection(CurrentMemoryContext); : : if (!AllocSizeIsValid(size)) : elog(ERROR, "invalid memory alloc request size %zu", size); : : CurrentMemoryContext->isReset = false; 0.00 : 798f8d: c6 40 30 00 movb $0x0,0x30(%rax) : : ret = (*CurrentMemoryContext->methods->alloc) (CurrentMemoryContext, size); 0.00 : 798f91: 48 8b 3d c8 18 42 00 mov 0x4218c8(%rip),%rdi # bba860 0.00 : 798f98: 48 8b 47 08 mov 0x8(%rdi),%rax 0.00 : 798f9c: ff 10 callq *(%rax) : VALGRIND_MEMPOOL_ALLOC(CurrentMemoryContext, ret, size); : : MemSetAligned(ret, 0, size); 0.00 : 798f9e: f6 c3 07 test $0x7,%bl : if (!AllocSizeIsValid(size)) : elog(ERROR, "invalid memory alloc request size %zu", size); : : CurrentMemoryContext->isReset = false; : : ret = (*CurrentMemoryContext->methods->alloc) (CurrentMemoryContext, size); 0.00 : 798fa1: 49 89 c4 mov %rax,%r12 : VALGRIND_MEMPOOL_ALLOC(CurrentMemoryContext, ret, size); : : MemSetAligned(ret, 0, size); 0.00 : 798fa4: 75 09 jne 798faf 0.00 : 798fa6: 48 81 fb 00 04 00 00 cmp $0x400,%rbx 0.00 : 798fad: 76 19 jbe 798fc8 0.00 : 798faf: 48 89 da mov %rbx,%rdx 0.00 : 798fb2: 31 f6 xor %esi,%esi 0.00 : 798fb4: 4c 89 e7 mov %r12,%rdi 0.00 : 798fb7: e8 64 04 cd ff callq 469420 : : return ret; : } 0.00 : 798fbc: 5b pop %rbx 0.00 : 798fbd: 4c 89 e0 mov %r12,%rax 0.00 : 798fc0: 41 5c pop %r12 0.00 : 798fc2: c9 leaveq 0.00 : 798fc3: c3 retq 0.00 : 798fc4: 0f 1f 40 00 nopl 0x0(%rax) : CurrentMemoryContext->isReset = false; : : ret = (*CurrentMemoryContext->methods->alloc) (CurrentMemoryContext, size); : VALGRIND_MEMPOOL_ALLOC(CurrentMemoryContext, ret, size); : : MemSetAligned(ret, 0, size); 0.00 : 798fc8: 49 8d 14 1c lea (%r12,%rbx,1),%rdx 0.00 : 798fcc: 49 39 d4 cmp %rdx,%r12 0.00 : 798fcf: 73 eb jae 798fbc 0.00 : 798fd1: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 0.00 : 798fd8: 48 c7 00 00 00 00 00 movq $0x0,(%rax) 0.00 : 798fdf: 48 83 c0 08 add $0x8,%rax 0.00 : 798fe3: 48 39 c2 cmp %rax,%rdx 0.00 : 798fe6: 77 f0 ja 798fd8 : : return ret; : } 0.00 : 798fe8: 5b pop %rbx 0.00 : 798fe9: 4c 89 e0 mov %r12,%rax 0.00 : 798fec: 41 5c pop %r12 0.00 : 798fee: c9 leaveq 0.00 : 798fef: c3 retq : : AssertArg(MemoryContextIsValid(CurrentMemoryContext)); : AssertNotInCriticalSection(CurrentMemoryContext); : : if (!AllocSizeIsValid(size)) : elog(ERROR, "invalid memory alloc request size %zu", size); 0.00 : 798ff0: ba 10 20 8e 00 mov $0x8e2010,%edx 0.00 : 798ff5: be cd 02 00 00 mov $0x2cd,%esi 0.00 : 798ffa: bf 8e 1f 8e 00 mov $0x8e1f8e,%edi 0.00 : 798fff: e8 1c 24 fe ff callq 77b420 0.00 : 799004: 48 89 da mov %rbx,%rdx 0.00 : 799007: be b8 1f 8e 00 mov $0x8e1fb8,%esi 0.00 : 79900c: bf 14 00 00 00 mov $0x14,%edi 0.00 : 799011: 31 c0 xor %eax,%eax 0.00 : 799013: e8 18 22 fe ff callq 77b230 0.00 : 799018: e8 b3 04 cd ff callq 4694d0 Sorted summary for file /lib64/libc-2.11.3.so ---------------------------------------------- 100.00 ??:0 Percent | Source code & Disassembly of /lib64/libc-2.11.3.so ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000084750 : 0.00 : 84750: 48 83 fa 20 cmp $0x20,%rdx ??:0 100.00 : 84754: 48 89 f8 mov %rdi,%rax 0.00 : 84757: 73 77 jae 847d0 0.00 : 84759: f6 c2 01 test $0x1,%dl 0.00 : 8475c: 74 0b je 84769 0.00 : 8475e: 0f b6 0e movzbl (%rsi),%ecx 0.00 : 84761: 88 0f mov %cl,(%rdi) 0.00 : 84763: 48 ff c6 inc %rsi 0.00 : 84766: 48 ff c7 inc %rdi 0.00 : 84769: f6 c2 02 test $0x2,%dl 0.00 : 8476c: 74 12 je 84780 0.00 : 8476e: 0f b7 0e movzwl (%rsi),%ecx 0.00 : 84771: 66 89 0f mov %cx,(%rdi) 0.00 : 84774: 48 83 c6 02 add $0x2,%rsi 0.00 : 84778: 48 83 c7 02 add $0x2,%rdi 0.00 : 8477c: 0f 1f 40 00 nopl 0x0(%rax) 0.00 : 84780: f6 c2 04 test $0x4,%dl 0.00 : 84783: 74 0c je 84791 0.00 : 84785: 8b 0e mov (%rsi),%ecx 0.00 : 84787: 89 0f mov %ecx,(%rdi) 0.00 : 84789: 48 83 c6 04 add $0x4,%rsi 0.00 : 8478d: 48 83 c7 04 add $0x4,%rdi 0.00 : 84791: f6 c2 08 test $0x8,%dl 0.00 : 84794: 74 0e je 847a4 0.00 : 84796: 48 8b 0e mov (%rsi),%rcx 0.00 : 84799: 48 89 0f mov %rcx,(%rdi) 0.00 : 8479c: 48 83 c6 08 add $0x8,%rsi 0.00 : 847a0: 48 83 c7 08 add $0x8,%rdi 0.00 : 847a4: 81 e2 f0 00 00 00 and $0xf0,%edx 0.00 : 847aa: 74 1f je 847cb 0.00 : 847ac: 0f 1f 40 00 nopl 0x0(%rax) 0.00 : 847b0: 48 8b 0e mov (%rsi),%rcx 0.00 : 847b3: 4c 8b 46 08 mov 0x8(%rsi),%r8 0.00 : 847b7: 48 89 0f mov %rcx,(%rdi) 0.00 : 847ba: 4c 89 47 08 mov %r8,0x8(%rdi) 0.00 : 847be: 83 ea 10 sub $0x10,%edx 0.00 : 847c1: 48 8d 76 10 lea 0x10(%rsi),%rsi 0.00 : 847c5: 48 8d 7f 10 lea 0x10(%rdi),%rdi 0.00 : 847c9: 75 e5 jne 847b0 0.00 : 847cb: f3 c3 repz retq 0.00 : 847cd: 0f 1f 00 nopl (%rax) 0.00 : 847d0: 48 89 44 24 f8 mov %rax,-0x8(%rsp) 0.00 : 847d5: 89 f1 mov %esi,%ecx 0.00 : 847d7: 83 e1 07 and $0x7,%ecx 0.00 : 847da: 74 34 je 84810 0.00 : 847dc: 48 8d 54 11 f8 lea -0x8(%rcx,%rdx,1),%rdx 0.00 : 847e1: 83 e9 08 sub $0x8,%ecx 0.00 : 847e4: 66 66 66 2e 0f 1f 84 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 847eb: 00 00 00 00 00 0.00 : 847f0: 0f b6 06 movzbl (%rsi),%eax 0.00 : 847f3: 88 07 mov %al,(%rdi) 0.00 : 847f5: ff c1 inc %ecx 0.00 : 847f7: 48 8d 76 01 lea 0x1(%rsi),%rsi 0.00 : 847fb: 48 8d 7f 01 lea 0x1(%rdi),%rdi 0.00 : 847ff: 75 ef jne 847f0 0.00 : 84801: 66 66 66 66 66 66 2e data32 data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 84808: 0f 1f 84 00 00 00 00 0.00 : 8480f: 00 0.00 : 84810: 48 81 fa 00 04 00 00 cmp $0x400,%rdx 0.00 : 84817: 77 77 ja 84890 0.00 : 84819: 89 d1 mov %edx,%ecx 0.00 : 8481b: c1 e9 05 shr $0x5,%ecx 0.00 : 8481e: 74 60 je 84880 0.00 : 84820: ff c9 dec %ecx 0.00 : 84822: 48 8b 06 mov (%rsi),%rax 0.00 : 84825: 4c 8b 46 08 mov 0x8(%rsi),%r8 0.00 : 84829: 4c 8b 4e 10 mov 0x10(%rsi),%r9 0.00 : 8482d: 4c 8b 56 18 mov 0x18(%rsi),%r10 0.00 : 84831: 48 89 07 mov %rax,(%rdi) 0.00 : 84834: 4c 89 47 08 mov %r8,0x8(%rdi) 0.00 : 84838: 4c 89 4f 10 mov %r9,0x10(%rdi) 0.00 : 8483c: 4c 89 57 18 mov %r10,0x18(%rdi) 0.00 : 84840: 48 8d 76 20 lea 0x20(%rsi),%rsi 0.00 : 84844: 48 8d 7f 20 lea 0x20(%rdi),%rdi 0.00 : 84848: 74 36 je 84880 0.00 : 8484a: ff c9 dec %ecx 0.00 : 8484c: 48 8b 06 mov (%rsi),%rax 0.00 : 8484f: 4c 8b 46 08 mov 0x8(%rsi),%r8 0.00 : 84853: 4c 8b 4e 10 mov 0x10(%rsi),%r9 0.00 : 84857: 4c 8b 56 18 mov 0x18(%rsi),%r10 0.00 : 8485b: 48 89 07 mov %rax,(%rdi) 0.00 : 8485e: 4c 89 47 08 mov %r8,0x8(%rdi) 0.00 : 84862: 4c 89 4f 10 mov %r9,0x10(%rdi) 0.00 : 84866: 4c 89 57 18 mov %r10,0x18(%rdi) 0.00 : 8486a: 48 8d 76 20 lea 0x20(%rsi),%rsi 0.00 : 8486e: 48 8d 7f 20 lea 0x20(%rdi),%rdi 0.00 : 84872: 75 ac jne 84820 0.00 : 84874: 66 66 66 2e 0f 1f 84 data32 data32 nopw %cs:0x0(%rax,%rax,1) 0.00 : 8487b: 00 00 00 00 00 0.00 : 84880: 83 e2 1f and $0x1f,%edx 0.00 : 84883: 48 8b 44 24 f8 mov -0x8(%rsp),%rax 0.00 : 84888: 0f 85 cb fe ff ff jne 84759 0.00 : 8488e: f3 c3 repz retq 0.00 : 84890: 4c 8b 1d 79 d8 2e 00 mov 0x2ed879(%rip),%r11 # 372110 <__x86_64_data_cache_size_half> 0.00 : 84897: 49 39 d3 cmp %rdx,%r11 0.00 : 8489a: 4c 0f 47 da cmova %rdx,%r11 0.00 : 8489e: 4c 89 d9 mov %r11,%rcx 0.00 : 848a1: 49 83 e3 f8 and $0xfffffffffffffff8,%r11 0.00 : 848a5: 48 c1 e9 03 shr $0x3,%rcx 0.00 : 848a9: 74 05 je 848b0 0.00 : 848ab: f3 48 a5 rep movsq %ds:(%rsi),%es:(%rdi) 0.00 : 848ae: 66 90 xchg %ax,%ax 0.00 : 848b0: 4c 29 da sub %r11,%rdx 0.00 : 848b3: 48 f7 c2 f8 ff ff ff test $0xfffffffffffffff8,%rdx 0.00 : 848ba: 75 14 jne 848d0 0.00 : 848bc: 83 e2 07 and $0x7,%edx 0.00 : 848bf: 48 8b 44 24 f8 mov -0x8(%rsp),%rax 0.00 : 848c4: 0f 85 8f fe ff ff jne 84759 0.00 : 848ca: f3 c3 repz retq 0.00 : 848cc: 0f 1f 40 00 nopl 0x0(%rax) 0.00 : 848d0: 4c 8b 05 59 d8 2e 00 mov 0x2ed859(%rip),%r8 # 372130 <__x86_64_shared_cache_size_half> 0.00 : 848d7: 49 39 d0 cmp %rdx,%r8 0.00 : 848da: 4c 0f 47 c2 cmova %rdx,%r8 0.00 : 848de: 4c 89 c1 mov %r8,%rcx 0.00 : 848e1: 49 83 e0 c0 and $0xffffffffffffffc0,%r8 0.00 : 848e5: 48 c1 e9 06 shr $0x6,%rcx 0.00 : 848e9: 0f 84 ab 01 00 00 je 84a9a 0.00 : 848ef: 4c 89 74 24 f0 mov %r14,-0x10(%rsp) 0.00 : 848f4: 4c 89 6c 24 e8 mov %r13,-0x18(%rsp) 0.00 : 848f9: 4c 89 64 24 e0 mov %r12,-0x20(%rsp) 0.00 : 848fe: 48 89 5c 24 d8 mov %rbx,-0x28(%rsp) 0.00 : 84903: 83 3d 06 2b 2f 00 00 cmpl $0x0,0x2f2b06(%rip) # 377410 <__x86_64_prefetchw> 0.00 : 8490a: 0f 84 c0 00 00 00 je 849d0 0.00 : 84910: 48 ff c9 dec %rcx 0.00 : 84913: 48 8b 06 mov (%rsi),%rax 0.00 : 84916: 48 8b 5e 08 mov 0x8(%rsi),%rbx 0.00 : 8491a: 4c 8b 4e 10 mov 0x10(%rsi),%r9 0.00 : 8491e: 4c 8b 56 18 mov 0x18(%rsi),%r10 0.00 : 84922: 4c 8b 5e 20 mov 0x20(%rsi),%r11 0.00 : 84926: 4c 8b 66 28 mov 0x28(%rsi),%r12 0.00 : 8492a: 4c 8b 6e 30 mov 0x30(%rsi),%r13 0.00 : 8492e: 4c 8b 76 38 mov 0x38(%rsi),%r14 0.00 : 84932: 0f 18 8e 80 03 00 00 prefetcht0 0x380(%rsi) 0.00 : 84939: 0f 18 8e c0 03 00 00 prefetcht0 0x3c0(%rsi) 0.00 : 84940: 48 89 07 mov %rax,(%rdi) 0.00 : 84943: 48 89 5f 08 mov %rbx,0x8(%rdi) 0.00 : 84947: 4c 89 4f 10 mov %r9,0x10(%rdi) 0.00 : 8494b: 4c 89 57 18 mov %r10,0x18(%rdi) 0.00 : 8494f: 4c 89 5f 20 mov %r11,0x20(%rdi) 0.00 : 84953: 4c 89 67 28 mov %r12,0x28(%rdi) 0.00 : 84957: 4c 89 6f 30 mov %r13,0x30(%rdi) 0.00 : 8495b: 4c 89 77 38 mov %r14,0x38(%rdi) 0.00 : 8495f: 48 8d 76 40 lea 0x40(%rsi),%rsi 0.00 : 84963: 48 8d 7f 40 lea 0x40(%rdi),%rdi 0.00 : 84967: 0f 84 19 01 00 00 je 84a86 0.00 : 8496d: 48 ff c9 dec %rcx 0.00 : 84970: 48 8b 06 mov (%rsi),%rax 0.00 : 84973: 48 8b 5e 08 mov 0x8(%rsi),%rbx 0.00 : 84977: 4c 8b 4e 10 mov 0x10(%rsi),%r9 0.00 : 8497b: 4c 8b 56 18 mov 0x18(%rsi),%r10 0.00 : 8497f: 4c 8b 5e 20 mov 0x20(%rsi),%r11 0.00 : 84983: 4c 8b 66 28 mov 0x28(%rsi),%r12 0.00 : 84987: 4c 8b 6e 30 mov 0x30(%rsi),%r13 0.00 : 8498b: 4c 8b 76 38 mov 0x38(%rsi),%r14 0.00 : 8498f: 48 89 07 mov %rax,(%rdi) 0.00 : 84992: 48 89 5f 08 mov %rbx,0x8(%rdi) 0.00 : 84996: 4c 89 4f 10 mov %r9,0x10(%rdi) 0.00 : 8499a: 4c 89 57 18 mov %r10,0x18(%rdi) 0.00 : 8499e: 4c 89 5f 20 mov %r11,0x20(%rdi) 0.00 : 849a2: 4c 89 67 28 mov %r12,0x28(%rdi) 0.00 : 849a6: 4c 89 6f 30 mov %r13,0x30(%rdi) 0.00 : 849aa: 4c 89 77 38 mov %r14,0x38(%rdi) 0.00 : 849ae: 0f 0d 8f 40 03 00 00 prefetchw 0x340(%rdi) 0.00 : 849b5: 0f 0d 8f 80 03 00 00 prefetchw 0x380(%rdi) 0.00 : 849bc: 48 8d 76 40 lea 0x40(%rsi),%rsi 0.00 : 849c0: 48 8d 7f 40 lea 0x40(%rdi),%rdi 0.00 : 849c4: 0f 85 46 ff ff ff jne 84910 0.00 : 849ca: e9 b7 00 00 00 jmpq 84a86 0.00 : 849cf: 90 nop 0.00 : 849d0: 48 ff c9 dec %rcx 0.00 : 849d3: 48 8b 06 mov (%rsi),%rax 0.00 : 849d6: 48 8b 5e 08 mov 0x8(%rsi),%rbx 0.00 : 849da: 4c 8b 4e 10 mov 0x10(%rsi),%r9 0.00 : 849de: 4c 8b 56 18 mov 0x18(%rsi),%r10 0.00 : 849e2: 4c 8b 5e 20 mov 0x20(%rsi),%r11 0.00 : 849e6: 4c 8b 66 28 mov 0x28(%rsi),%r12 0.00 : 849ea: 4c 8b 6e 30 mov 0x30(%rsi),%r13 0.00 : 849ee: 4c 8b 76 38 mov 0x38(%rsi),%r14 0.00 : 849f2: 0f 18 8e 80 03 00 00 prefetcht0 0x380(%rsi) 0.00 : 849f9: 0f 18 8e c0 03 00 00 prefetcht0 0x3c0(%rsi) 0.00 : 84a00: 48 89 07 mov %rax,(%rdi) 0.00 : 84a03: 48 89 5f 08 mov %rbx,0x8(%rdi) 0.00 : 84a07: 4c 89 4f 10 mov %r9,0x10(%rdi) 0.00 : 84a0b: 4c 89 57 18 mov %r10,0x18(%rdi) 0.00 : 84a0f: 4c 89 5f 20 mov %r11,0x20(%rdi) 0.00 : 84a13: 4c 89 67 28 mov %r12,0x28(%rdi) 0.00 : 84a17: 4c 89 6f 30 mov %r13,0x30(%rdi) 0.00 : 84a1b: 4c 89 77 38 mov %r14,0x38(%rdi) 0.00 : 84a1f: 48 8d 76 40 lea 0x40(%rsi),%rsi 0.00 : 84a23: 48 8d 7f 40 lea 0x40(%rdi),%rdi 0.00 : 84a27: 74 5d je 84a86 0.00 : 84a29: 48 ff c9 dec %rcx 0.00 : 84a2c: 48 8b 06 mov (%rsi),%rax 0.00 : 84a2f: 48 8b 5e 08 mov 0x8(%rsi),%rbx 0.00 : 84a33: 4c 8b 4e 10 mov 0x10(%rsi),%r9 0.00 : 84a37: 4c 8b 56 18 mov 0x18(%rsi),%r10 0.00 : 84a3b: 4c 8b 5e 20 mov 0x20(%rsi),%r11 0.00 : 84a3f: 4c 8b 66 28 mov 0x28(%rsi),%r12 0.00 : 84a43: 4c 8b 6e 30 mov 0x30(%rsi),%r13 0.00 : 84a47: 4c 8b 76 38 mov 0x38(%rsi),%r14 0.00 : 84a4b: 0f 18 8f 40 03 00 00 prefetcht0 0x340(%rdi) 0.00 : 84a52: 0f 18 8f 80 03 00 00 prefetcht0 0x380(%rdi) 0.00 : 84a59: 48 89 07 mov %rax,(%rdi) 0.00 : 84a5c: 48 89 5f 08 mov %rbx,0x8(%rdi) 0.00 : 84a60: 4c 89 4f 10 mov %r9,0x10(%rdi) 0.00 : 84a64: 4c 89 57 18 mov %r10,0x18(%rdi) 0.00 : 84a68: 4c 89 5f 20 mov %r11,0x20(%rdi) 0.00 : 84a6c: 4c 89 67 28 mov %r12,0x28(%rdi) 0.00 : 84a70: 4c 89 6f 30 mov %r13,0x30(%rdi) 0.00 : 84a74: 4c 89 77 38 mov %r14,0x38(%rdi) 0.00 : 84a78: 48 8d 76 40 lea 0x40(%rsi),%rsi 0.00 : 84a7c: 48 8d 7f 40 lea 0x40(%rdi),%rdi 0.00 : 84a80: 0f 85 4a ff ff ff jne 849d0 0.00 : 84a86: 48 8b 5c 24 d8 mov -0x28(%rsp),%rbx 0.00 : 84a8b: 4c 8b 64 24 e0 mov -0x20(%rsp),%r12 0.00 : 84a90: 4c 8b 6c 24 e8 mov -0x18(%rsp),%r13 0.00 : 84a95: 4c 8b 74 24 f0 mov -0x10(%rsp),%r14 0.00 : 84a9a: 4c 29 c2 sub %r8,%rdx 0.00 : 84a9d: 48 f7 c2 c0 ff ff ff test $0xffffffffffffffc0,%rdx 0.00 : 84aa4: 75 1a jne 84ac0 0.00 : 84aa6: 83 e2 3f and $0x3f,%edx 0.00 : 84aa9: 48 8b 44 24 f8 mov -0x8(%rsp),%rax 0.00 : 84aae: 0f 85 a5 fc ff ff jne 84759 0.00 : 84ab4: f3 c3 repz retq 0.00 : 84ab6: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 0.00 : 84abd: 00 00 00 0.00 : 84ac0: 48 89 d1 mov %rdx,%rcx 0.00 : 84ac3: 48 c1 e9 07 shr $0x7,%rcx 0.00 : 84ac7: 0f 84 d8 00 00 00 je 84ba5 0.00 : 84acd: 4c 89 74 24 f0 mov %r14,-0x10(%rsp) 0.00 : 84ad2: 4c 89 6c 24 e8 mov %r13,-0x18(%rsp) 0.00 : 84ad7: 4c 89 64 24 e0 mov %r12,-0x20(%rsp) 0.00 : 84adc: 0f 1f 40 00 nopl 0x0(%rax) 0.00 : 84ae0: 0f 18 86 00 03 00 00 prefetchnta 0x300(%rsi) 0.00 : 84ae7: 0f 18 86 40 03 00 00 prefetchnta 0x340(%rsi) 0.00 : 84aee: 48 ff c9 dec %rcx 0.00 : 84af1: 48 8b 06 mov (%rsi),%rax 0.00 : 84af4: 4c 8b 46 08 mov 0x8(%rsi),%r8 0.00 : 84af8: 4c 8b 4e 10 mov 0x10(%rsi),%r9 0.00 : 84afc: 4c 8b 56 18 mov 0x18(%rsi),%r10 0.00 : 84b00: 4c 8b 5e 20 mov 0x20(%rsi),%r11 0.00 : 84b04: 4c 8b 66 28 mov 0x28(%rsi),%r12 0.00 : 84b08: 4c 8b 6e 30 mov 0x30(%rsi),%r13 0.00 : 84b0c: 4c 8b 76 38 mov 0x38(%rsi),%r14 0.00 : 84b10: 48 0f c3 07 movnti %rax,(%rdi) 0.00 : 84b14: 4c 0f c3 47 08 movnti %r8,0x8(%rdi) 0.00 : 84b19: 4c 0f c3 4f 10 movnti %r9,0x10(%rdi) 0.00 : 84b1e: 4c 0f c3 57 18 movnti %r10,0x18(%rdi) 0.00 : 84b23: 4c 0f c3 5f 20 movnti %r11,0x20(%rdi) 0.00 : 84b28: 4c 0f c3 67 28 movnti %r12,0x28(%rdi) 0.00 : 84b2d: 4c 0f c3 6f 30 movnti %r13,0x30(%rdi) 0.00 : 84b32: 4c 0f c3 77 38 movnti %r14,0x38(%rdi) 0.00 : 84b37: 48 8b 46 40 mov 0x40(%rsi),%rax 0.00 : 84b3b: 4c 8b 46 48 mov 0x48(%rsi),%r8 0.00 : 84b3f: 4c 8b 4e 50 mov 0x50(%rsi),%r9 0.00 : 84b43: 4c 8b 56 58 mov 0x58(%rsi),%r10 0.00 : 84b47: 4c 8b 5e 60 mov 0x60(%rsi),%r11 0.00 : 84b4b: 4c 8b 66 68 mov 0x68(%rsi),%r12 0.00 : 84b4f: 4c 8b 6e 70 mov 0x70(%rsi),%r13 0.00 : 84b53: 4c 8b 76 78 mov 0x78(%rsi),%r14 0.00 : 84b57: 48 0f c3 47 40 movnti %rax,0x40(%rdi) 0.00 : 84b5c: 4c 0f c3 47 48 movnti %r8,0x48(%rdi) 0.00 : 84b61: 4c 0f c3 4f 50 movnti %r9,0x50(%rdi) 0.00 : 84b66: 4c 0f c3 57 58 movnti %r10,0x58(%rdi) 0.00 : 84b6b: 4c 0f c3 5f 60 movnti %r11,0x60(%rdi) 0.00 : 84b70: 4c 0f c3 67 68 movnti %r12,0x68(%rdi) 0.00 : 84b75: 4c 0f c3 6f 70 movnti %r13,0x70(%rdi) 0.00 : 84b7a: 4c 0f c3 77 78 movnti %r14,0x78(%rdi) 0.00 : 84b7f: 48 8d b6 80 00 00 00 lea 0x80(%rsi),%rsi 0.00 : 84b86: 48 8d bf 80 00 00 00 lea 0x80(%rdi),%rdi 0.00 : 84b8d: 0f 85 4d ff ff ff jne 84ae0 0.00 : 84b93: 0f ae f8 sfence 0.00 : 84b96: 4c 8b 64 24 e0 mov -0x20(%rsp),%r12 0.00 : 84b9b: 4c 8b 6c 24 e8 mov -0x18(%rsp),%r13 0.00 : 84ba0: 4c 8b 74 24 f0 mov -0x10(%rsp),%r14 0.00 : 84ba5: 83 e2 7f and $0x7f,%edx 0.00 : 84ba8: 48 8b 44 24 f8 mov -0x8(%rsp),%rax 0.00 : 84bad: 0f 85 a6 fb ff ff jne 84759 0.00 : 84bb3: f3 c3 repz retq Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file /lib/modules/3.0.101-0.15-default/kernel/drivers/net/ethernet/intel/ixgbe/ixgbe.ko ---------------------------------------------- 100.00 ??:0 Percent | Source code & Disassembly of /lib/modules/3.0.101-0.15-default/kernel/drivers/net/ethernet/intel/ixgbe/ixgbe.ko ------------------------------------------------ : : : : Disassembly of section .text: : : 0000000000001800 : : /** : * ixgbe_update_stats - Update the board statistics counters. : * @adapter: board private structure : **/ : void ixgbe_update_stats(struct ixgbe_adapter *adapter) : { 0.00 : 1800: 41 57 push %r15 0.00 : 1802: 41 56 push %r14 0.00 : 1804: 41 55 push %r13 0.00 : 1806: 41 54 push %r12 0.00 : 1808: 55 push %rbp 0.00 : 1809: 53 push %rbx 0.00 : 180a: 48 89 fb mov %rdi,%rbx 0.00 : 180d: 48 83 ec 28 sub $0x28,%rsp : return oldbit; : } : : static __always_inline int constant_test_bit(unsigned int nr, const volatile unsigned long *addr) : { : return ((1UL << (nr % BITS_PER_LONG)) & 0.00 : 1811: 48 8b 87 10 02 00 00 mov 0x210(%rdi),%rax : #ifdef HAVE_NETDEV_STATS_IN_NETDEV : struct net_device_stats *net_stats = &adapter->netdev->stats; 0.00 : 1818: 4c 8b bf 00 02 00 00 mov 0x200(%rdi),%r15 : u64 bytes = 0, packets = 0, hw_csum_rx_error = 0; : #ifndef IXGBE_NO_LRO : u32 flushed = 0, coal = 0; : #endif : : if (test_bit(__IXGBE_DOWN, &adapter->state) || 0.00 : 181f: a8 04 test $0x4,%al 0.00 : 1821: 0f 85 b9 09 00 00 jne 21e0 0.00 : 1827: 48 8b 87 10 02 00 00 mov 0x210(%rdi),%rax 0.00 : 182e: a8 02 test $0x2,%al 0.00 : 1830: 0f 85 aa 09 00 00 jne 21e0 : test_bit(__IXGBE_RESETTING, &adapter->state)) : return; : : if (adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED) { 0.00 : 1836: f6 87 1c 02 00 00 02 testb $0x2,0x21c(%rdi) 0.00 : 183d: 0f 85 ac 09 00 00 jne 21ef 0.00 : 1843: 44 8b 9f 28 02 00 00 mov 0x228(%rdi),%r11d : adapter->rsc_total_count = rsc_count; : adapter->rsc_total_flush = rsc_flush; : } : : #ifndef IXGBE_NO_LRO : for (i = 0; i < adapter->num_q_vectors; i++) { 0.00 : 184a: 8b 83 c0 0b 00 00 mov 0xbc0(%rbx),%eax 0.00 : 1850: 31 f6 xor %esi,%esi 0.00 : 1852: 31 c9 xor %ecx,%ecx 0.00 : 1854: 85 c0 test %eax,%eax 0.00 : 1856: 74 3a je 1892 0.00 : 1858: 83 e8 01 sub $0x1,%eax 0.00 : 185b: 31 f6 xor %esi,%esi 0.00 : 185d: 31 c9 xor %ecx,%ecx 0.00 : 185f: 48 8d 3c c5 08 00 00 lea 0x8(,%rax,8),%rdi 0.00 : 1866: 00 0.00 : 1867: 31 d2 xor %edx,%edx 0.00 : 1869: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : struct ixgbe_q_vector *q_vector = adapter->q_vector[i]; 0.00 : 1870: 48 8b 84 13 50 07 00 mov 0x750(%rbx,%rdx,1),%rax 0.00 : 1877: 00 : if (!q_vector) 0.00 : 1878: 48 85 c0 test %rax,%rax 0.00 : 187b: 74 0c je 1889 : continue; : flushed += q_vector->lrolist.stats.flushed; 0.00 : 187d: 03 b0 b8 02 00 00 add 0x2b8(%rax),%esi : coal += q_vector->lrolist.stats.coal; 0.00 : 1883: 03 88 bc 02 00 00 add 0x2bc(%rax),%ecx 0.00 : 1889: 48 83 c2 08 add $0x8,%rdx : adapter->rsc_total_count = rsc_count; : adapter->rsc_total_flush = rsc_flush; : } : : #ifndef IXGBE_NO_LRO : for (i = 0; i < adapter->num_q_vectors; i++) { 0.00 : 188d: 48 39 fa cmp %rdi,%rdx 0.00 : 1890: 75 de jne 1870 : } : adapter->lro_stats.flushed = flushed; : adapter->lro_stats.coal = coal; : : #endif : for (i = 0; i < adapter->num_rx_queues; i++) { 0.00 : 1892: 45 85 db test %r11d,%r11d : if (!q_vector) : continue; : flushed += q_vector->lrolist.stats.flushed; : coal += q_vector->lrolist.stats.coal; : } : adapter->lro_stats.flushed = flushed; 0.00 : 1895: 89 b3 f8 0b 00 00 mov %esi,0xbf8(%rbx) : adapter->lro_stats.coal = coal; 0.00 : 189b: 89 8b fc 0b 00 00 mov %ecx,0xbfc(%rbx) : : #endif : for (i = 0; i < adapter->num_rx_queues; i++) { 0.00 : 18a1: 0f 84 6b 0f 00 00 je 2812 0.00 : 18a7: 41 8d 43 ff lea -0x1(%r11),%eax 0.00 : 18ab: 45 31 d2 xor %r10d,%r10d 0.00 : 18ae: 31 f6 xor %esi,%esi 0.00 : 18b0: 31 c9 xor %ecx,%ecx 0.00 : 18b2: 45 31 c9 xor %r9d,%r9d 0.00 : 18b5: 45 31 c0 xor %r8d,%r8d 0.00 : 18b8: 4c 8d 1c c5 08 00 00 lea 0x8(,%rax,8),%r11 0.00 : 18bf: 00 0.00 : 18c0: 31 ff xor %edi,%edi 0.00 : 18c2: 31 d2 xor %edx,%edx 0.00 : 18c4: 0f 1f 40 00 nopl 0x0(%rax) : struct ixgbe_ring *rx_ring = adapter->rx_ring[i]; 0.00 : 18c8: 48 8b 84 13 d8 04 00 mov 0x4d8(%rbx,%rdx,1),%rax 0.00 : 18cf: 00 : non_eop_descs += rx_ring->rx_stats.non_eop_descs; : alloc_rx_page_failed += rx_ring->rx_stats.alloc_rx_page_failed; : alloc_rx_buff_failed += rx_ring->rx_stats.alloc_rx_buff_failed; : hw_csum_rx_error += rx_ring->rx_stats.csum_err; : bytes += rx_ring->stats.bytes; : packets += rx_ring->stats.packets; 0.00 : 18d0: 48 83 c2 08 add $0x8,%rdx : adapter->lro_stats.coal = coal; : : #endif : for (i = 0; i < adapter->num_rx_queues; i++) { : struct ixgbe_ring *rx_ring = adapter->rx_ring[i]; : non_eop_descs += rx_ring->rx_stats.non_eop_descs; 0.00 : 18d4: 4c 03 50 78 add 0x78(%rax),%r10 : alloc_rx_page_failed += rx_ring->rx_stats.alloc_rx_page_failed; 0.00 : 18d8: 48 03 b0 80 00 00 00 add 0x80(%rax),%rsi : alloc_rx_buff_failed += rx_ring->rx_stats.alloc_rx_buff_failed; 0.00 : 18df: 48 03 88 88 00 00 00 add 0x88(%rax),%rcx : hw_csum_rx_error += rx_ring->rx_stats.csum_err; 0.00 : 18e6: 48 03 b8 90 00 00 00 add 0x90(%rax),%rdi : bytes += rx_ring->stats.bytes; 0.00 : 18ed: 4c 03 48 60 add 0x60(%rax),%r9 : packets += rx_ring->stats.packets; 0.00 : 18f1: 4c 03 40 58 add 0x58(%rax),%r8 : } : adapter->lro_stats.flushed = flushed; : adapter->lro_stats.coal = coal; : : #endif : for (i = 0; i < adapter->num_rx_queues; i++) { 0.00 : 18f5: 4c 39 da cmp %r11,%rdx 0.00 : 18f8: 75 ce jne 18c8 0.00 : 18fa: 89 f2 mov %esi,%edx 0.00 : 18fc: 89 c8 mov %ecx,%eax : packets += rx_ring->stats.packets; : : } : adapter->non_eop_descs = non_eop_descs; : adapter->alloc_rx_page_failed = alloc_rx_page_failed; : adapter->alloc_rx_buff_failed = alloc_rx_buff_failed; 0.00 : 18fe: 89 83 4c 07 00 00 mov %eax,0x74c(%rbx) : hw_csum_rx_error += rx_ring->rx_stats.csum_err; : bytes += rx_ring->stats.bytes; : packets += rx_ring->stats.packets; : : } : adapter->non_eop_descs = non_eop_descs; 0.00 : 1904: 4c 89 93 40 07 00 00 mov %r10,0x740(%rbx) : adapter->alloc_rx_page_failed = alloc_rx_page_failed; 0.00 : 190b: 89 93 48 07 00 00 mov %edx,0x748(%rbx) : adapter->alloc_rx_buff_failed = alloc_rx_buff_failed; : adapter->hw_csum_rx_error = hw_csum_rx_error; 0.00 : 1911: 48 89 bb 20 07 00 00 mov %rdi,0x720(%rbx) : net_stats->rx_bytes = bytes; 0.00 : 1918: 4d 89 8f d8 00 00 00 mov %r9,0xd8(%r15) : net_stats->rx_packets = packets; 0.00 : 191f: 4d 89 87 c8 00 00 00 mov %r8,0xc8(%r15) : : bytes = 0; : packets = 0; : /* gather some stats to the adapter struct that are per queue */ : for (i = 0; i < adapter->num_tx_queues; i++) { 0.00 : 1926: 8b 83 20 02 00 00 mov 0x220(%rbx),%eax 0.00 : 192c: 85 c0 test %eax,%eax 0.00 : 192e: 0f 84 f2 0e 00 00 je 2826 0.00 : 1934: 83 e8 01 sub $0x1,%eax 0.00 : 1937: 45 31 c0 xor %r8d,%r8d 0.00 : 193a: 31 ff xor %edi,%edi 0.00 : 193c: 4c 8d 0c c5 08 00 00 lea 0x8(,%rax,8),%r9 0.00 : 1943: 00 0.00 : 1944: 31 f6 xor %esi,%esi 0.00 : 1946: 31 c9 xor %ecx,%ecx 0.00 : 1948: 31 d2 xor %edx,%edx 0.00 : 194a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) : struct ixgbe_ring *tx_ring = adapter->tx_ring[i]; 0.00 : 1950: 48 8b 84 13 80 02 00 mov 0x280(%rbx,%rdx,1),%rax 0.00 : 1957: 00 : restart_queue += tx_ring->tx_stats.restart_queue; : tx_busy += tx_ring->tx_stats.tx_busy; : bytes += tx_ring->stats.bytes; : packets += tx_ring->stats.packets; 0.00 : 1958: 48 83 c2 08 add $0x8,%rdx : bytes = 0; : packets = 0; : /* gather some stats to the adapter struct that are per queue */ : for (i = 0; i < adapter->num_tx_queues; i++) { : struct ixgbe_ring *tx_ring = adapter->tx_ring[i]; : restart_queue += tx_ring->tx_stats.restart_queue; 0.00 : 195c: 4c 03 40 68 add 0x68(%rax),%r8 : tx_busy += tx_ring->tx_stats.tx_busy; 0.00 : 1960: 48 03 78 70 add 0x70(%rax),%rdi : bytes += tx_ring->stats.bytes; 0.00 : 1964: 48 03 70 60 add 0x60(%rax),%rsi : packets += tx_ring->stats.packets; 0.00 : 1968: 48 03 48 58 add 0x58(%rax),%rcx : net_stats->rx_packets = packets; : : bytes = 0; : packets = 0; : /* gather some stats to the adapter struct that are per queue */ : for (i = 0; i < adapter->num_tx_queues; i++) { 0.00 : 196c: 4c 39 ca cmp %r9,%rdx 0.00 : 196f: 75 df jne 1950 : restart_queue += tx_ring->tx_stats.restart_queue; : tx_busy += tx_ring->tx_stats.tx_busy; : bytes += tx_ring->stats.bytes; : packets += tx_ring->stats.packets; : } : adapter->restart_queue = restart_queue; 0.00 : 1971: 4c 89 83 c0 04 00 00 mov %r8,0x4c0(%rbx) : adapter->tx_busy = tx_busy; 0.00 : 1978: 48 89 bb 08 1b 00 00 mov %rdi,0x1b08(%rbx) : net_stats->tx_bytes = bytes; 0.00 : 197f: 49 89 b7 e0 00 00 00 mov %rsi,0xe0(%r15) : net_stats->tx_packets = packets; 0.00 : 1986: 49 89 8f d0 00 00 00 mov %rcx,0xd0(%r15) : { asm volatile("mov" size " %0,%1": :reg (val), \ : "m" (*(volatile type __force *)addr) barrier); } : : build_mmio_read(readb, "b", unsigned char, "=q", :"memory") : build_mmio_read(readw, "w", unsigned short, "=r", :"memory") : build_mmio_read(readl, "l", unsigned int, "=r", :"memory") 0.00 : 198d: 48 8b 93 80 0e 00 00 mov 0xe80(%rbx),%rdx : : hwstats->crcerrs += IXGBE_READ_REG(hw, IXGBE_CRCERRS); 0.00 : 1994: 48 8b 83 b0 14 00 00 mov 0x14b0(%rbx),%rax 0.00 : 199b: 48 81 c2 00 40 00 00 add $0x4000,%rdx 0.00 : 19a2: 8b 12 mov (%rdx),%edx 0.00 : 19a4: 89 d2 mov %edx,%edx 0.00 : 19a6: 48 89 df mov %rbx,%rdi 0.00 : 19a9: 48 89 d9 mov %rbx,%rcx 0.00 : 19ac: 48 01 c2 add %rax,%rdx 0.00 : 19af: 45 31 f6 xor %r14d,%r14d 0.00 : 19b2: 45 31 c9 xor %r9d,%r9d 0.00 : 19b5: 48 89 93 b0 14 00 00 mov %rdx,0x14b0(%rbx) 0.00 : 19bc: be a0 3f 00 00 mov $0x3fa0,%esi 0.00 : 19c1: 41 b8 34 60 00 00 mov $0x6034,%r8d 0.00 : 19c7: eb 4a jmp 1a13 0.00 : 19c9: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : missed_rx += mpc; : hwstats->mpc[i] += mpc; : total_mpc += hwstats->mpc[i]; : hwstats->pxontxc[i] += IXGBE_READ_REG(hw, IXGBE_PXONTXC(i)); : hwstats->pxofftxc[i] += IXGBE_READ_REG(hw, IXGBE_PXOFFTXC(i)); : switch (hw->mac.type) { 0.00 : 19d0: 72 28 jb 19fa 0.00 : 19d2: 83 f8 03 cmp $0x3,%eax 0.00 : 19d5: 77 23 ja 19fa 0.00 : 19d7: 48 8d 96 a0 01 00 00 lea 0x1a0(%rsi),%rdx : hwstats->pxonrxc[i] += : IXGBE_READ_REG(hw, IXGBE_PXONRXC(i)); : break; : case ixgbe_mac_82599EB: : case ixgbe_mac_X540: : hwstats->pxonrxc[i] += 0.00 : 19de: 48 8b 81 90 15 00 00 mov 0x1590(%rcx),%rax 0.00 : 19e5: 48 03 93 80 0e 00 00 add 0xe80(%rbx),%rdx 0.00 : 19ec: 8b 12 mov (%rdx),%edx 0.00 : 19ee: 89 d2 mov %edx,%edx 0.00 : 19f0: 48 01 c2 add %rax,%rdx 0.00 : 19f3: 48 89 91 90 15 00 00 mov %rdx,0x1590(%rcx) 0.00 : 19fa: 48 83 c6 04 add $0x4,%rsi 0.00 : 19fe: 48 83 c1 08 add $0x8,%rcx 0.00 : 1a02: 49 83 c0 40 add $0x40,%r8 : net_stats->tx_packets = packets; : : hwstats->crcerrs += IXGBE_READ_REG(hw, IXGBE_CRCERRS); : : /* 8 register reads */ : for (i = 0; i < 8; i++) { 0.00 : 1a06: 48 81 fe c0 3f 00 00 cmp $0x3fc0,%rsi 0.00 : 1a0d: 0f 84 35 08 00 00 je 2248 0.00 : 1a13: 48 89 f0 mov %rsi,%rax 0.00 : 1a16: 48 03 83 80 0e 00 00 add 0xe80(%rbx),%rax 0.00 : 1a1d: 8b 00 mov (%rax),%eax : /* for packet buffers not used, the register should read 0 */ : mpc = IXGBE_READ_REG(hw, IXGBE_MPC(i)); : missed_rx += mpc; 0.00 : 1a1f: 41 01 c1 add %eax,%r9d : hwstats->mpc[i] += mpc; 0.00 : 1a22: 89 c0 mov %eax,%eax 0.00 : 1a24: 48 03 81 d8 14 00 00 add 0x14d8(%rcx),%rax : total_mpc += hwstats->mpc[i]; : hwstats->pxontxc[i] += IXGBE_READ_REG(hw, IXGBE_PXONTXC(i)); 0.00 : 1a2b: 48 8b 91 50 15 00 00 mov 0x1550(%rcx),%rdx : /* 8 register reads */ : for (i = 0; i < 8; i++) { : /* for packet buffers not used, the register should read 0 */ : mpc = IXGBE_READ_REG(hw, IXGBE_MPC(i)); : missed_rx += mpc; : hwstats->mpc[i] += mpc; 0.00 : 1a32: 48 89 81 d8 14 00 00 mov %rax,0x14d8(%rcx) : total_mpc += hwstats->mpc[i]; 0.00 : 1a39: 49 01 c6 add %rax,%r14 0.00 : 1a3c: 48 8d 86 60 ff ff ff lea -0xa0(%rsi),%rax 0.00 : 1a43: 48 03 83 80 0e 00 00 add 0xe80(%rbx),%rax 0.00 : 1a4a: 8b 00 mov (%rax),%eax : hwstats->pxontxc[i] += IXGBE_READ_REG(hw, IXGBE_PXONTXC(i)); 0.00 : 1a4c: 89 c0 mov %eax,%eax 0.00 : 1a4e: 48 01 d0 add %rdx,%rax : hwstats->pxofftxc[i] += IXGBE_READ_REG(hw, IXGBE_PXOFFTXC(i)); 0.00 : 1a51: 48 8b 91 d0 15 00 00 mov 0x15d0(%rcx),%rdx : /* for packet buffers not used, the register should read 0 */ : mpc = IXGBE_READ_REG(hw, IXGBE_MPC(i)); : missed_rx += mpc; : hwstats->mpc[i] += mpc; : total_mpc += hwstats->mpc[i]; : hwstats->pxontxc[i] += IXGBE_READ_REG(hw, IXGBE_PXONTXC(i)); 0.00 : 1a58: 48 89 81 50 15 00 00 mov %rax,0x1550(%rcx) 0.00 : 1a5f: 48 8d 46 80 lea -0x80(%rsi),%rax 0.00 : 1a63: 48 03 83 80 0e 00 00 add 0xe80(%rbx),%rax 0.00 : 1a6a: 8b 00 mov (%rax),%eax : hwstats->pxofftxc[i] += IXGBE_READ_REG(hw, IXGBE_PXOFFTXC(i)); 0.00 : 1a6c: 89 c0 mov %eax,%eax 0.00 : 1a6e: 48 01 d0 add %rdx,%rax 0.00 : 1a71: 48 89 81 d0 15 00 00 mov %rax,0x15d0(%rcx) : switch (hw->mac.type) { 0.00 : 1a78: 8b 83 50 10 00 00 mov 0x1050(%rbx),%eax 0.00 : 1a7e: 83 f8 01 cmp $0x1,%eax 0.00 : 1a81: 0f 85 49 ff ff ff jne 19d0 0.00 : 1a87: 48 8d 46 20 lea 0x20(%rsi),%rax : case ixgbe_mac_82598EB: : hwstats->rnbc[i] += IXGBE_READ_REG(hw, IXGBE_RNBC(i)); 0.00 : 1a8b: 48 8b 91 b0 16 00 00 mov 0x16b0(%rcx),%rdx 0.00 : 1a92: 48 03 83 80 0e 00 00 add 0xe80(%rbx),%rax 0.00 : 1a99: 8b 00 mov (%rax),%eax 0.00 : 1a9b: 89 c0 mov %eax,%eax 0.00 : 1a9d: 48 01 d0 add %rdx,%rax : hwstats->qbtc[i] += IXGBE_READ_REG(hw, IXGBE_QBTC(i)); 0.00 : 1aa0: 48 8b 91 08 19 00 00 mov 0x1908(%rcx),%rdx : total_mpc += hwstats->mpc[i]; : hwstats->pxontxc[i] += IXGBE_READ_REG(hw, IXGBE_PXONTXC(i)); : hwstats->pxofftxc[i] += IXGBE_READ_REG(hw, IXGBE_PXOFFTXC(i)); : switch (hw->mac.type) { : case ixgbe_mac_82598EB: : hwstats->rnbc[i] += IXGBE_READ_REG(hw, IXGBE_RNBC(i)); 0.00 : 1aa7: 48 89 81 b0 16 00 00 mov %rax,0x16b0(%rcx) 0.00 : 1aae: 4c 89 c0 mov %r8,%rax 0.00 : 1ab1: 48 03 83 80 0e 00 00 add 0xe80(%rbx),%rax 0.00 : 1ab8: 8b 00 mov (%rax),%eax : hwstats->qbtc[i] += IXGBE_READ_REG(hw, IXGBE_QBTC(i)); 0.00 : 1aba: 89 c0 mov %eax,%eax 0.00 : 1abc: 48 01 d0 add %rdx,%rax : hwstats->qbrc[i] += IXGBE_READ_REG(hw, IXGBE_QBRC(i)); 0.00 : 1abf: 48 8b 91 88 18 00 00 mov 0x1888(%rcx),%rdx : hwstats->pxontxc[i] += IXGBE_READ_REG(hw, IXGBE_PXONTXC(i)); : hwstats->pxofftxc[i] += IXGBE_READ_REG(hw, IXGBE_PXOFFTXC(i)); : switch (hw->mac.type) { : case ixgbe_mac_82598EB: : hwstats->rnbc[i] += IXGBE_READ_REG(hw, IXGBE_RNBC(i)); : hwstats->qbtc[i] += IXGBE_READ_REG(hw, IXGBE_QBTC(i)); 0.00 : 1ac6: 48 89 81 08 19 00 00 mov %rax,0x1908(%rcx) 0.00 : 1acd: 49 8d 80 00 b0 ff ff lea -0x5000(%r8),%rax 0.00 : 1ad4: 48 03 83 80 0e 00 00 add 0xe80(%rbx),%rax 0.00 : 1adb: 8b 00 mov (%rax),%eax : hwstats->qbrc[i] += IXGBE_READ_REG(hw, IXGBE_QBRC(i)); 0.00 : 1add: 89 c0 mov %eax,%eax 0.00 : 1adf: 48 01 d0 add %rdx,%rax : hwstats->pxonrxc[i] += 0.00 : 1ae2: 48 8b 91 90 15 00 00 mov 0x1590(%rcx),%rdx : hwstats->pxofftxc[i] += IXGBE_READ_REG(hw, IXGBE_PXOFFTXC(i)); : switch (hw->mac.type) { : case ixgbe_mac_82598EB: : hwstats->rnbc[i] += IXGBE_READ_REG(hw, IXGBE_RNBC(i)); : hwstats->qbtc[i] += IXGBE_READ_REG(hw, IXGBE_QBTC(i)); : hwstats->qbrc[i] += IXGBE_READ_REG(hw, IXGBE_QBRC(i)); 0.00 : 1ae9: 48 89 81 88 18 00 00 mov %rax,0x1888(%rcx) 0.00 : 1af0: 48 8d 86 60 8f 00 00 lea 0x8f60(%rsi),%rax 0.00 : 1af7: 48 03 83 80 0e 00 00 add 0xe80(%rbx),%rax 0.00 : 1afe: 8b 00 mov (%rax),%eax : hwstats->pxonrxc[i] += 0.00 : 1b00: 89 c0 mov %eax,%eax 0.00 : 1b02: 48 01 d0 add %rdx,%rax 0.00 : 1b05: 48 89 81 90 15 00 00 mov %rax,0x1590(%rcx) : IXGBE_READ_REG(hw, IXGBE_PXONRXC(i)); : break; 0.00 : 1b0c: e9 e9 fe ff ff jmpq 19fa 0.00 : 1b11: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : struct ixgbe_hw *hw = &adapter->hw; : struct ixgbe_hw_stats *hwstats = &adapter->stats; : int i; : u32 data; : : if ((hw->fc.current_mode != ixgbe_fc_full) && 0.00 : 1b18: 8b 83 0c 13 00 00 mov 0x130c(%rbx),%eax 0.00 : 1b1e: 83 f8 03 cmp $0x3,%eax 0.00 : 1b21: 0f 84 1c 0c 00 00 je 2743 0.00 : 1b27: 83 e8 01 sub $0x1,%eax 0.00 : 1b2a: 0f 84 13 0c 00 00 je 2743 : hwstats->gprc -= missed_rx; : : ixgbe_update_xoff_received(adapter); : : /* 82598 hardware only has a 32 bit counter in the high register */ : switch (hw->mac.type) { 0.00 : 1b30: 8b 83 50 10 00 00 mov 0x1050(%rbx),%eax 0.00 : 1b36: 83 f8 02 cmp $0x2,%eax 0.00 : 1b39: 0f 84 7a 09 00 00 je 24b9 0.00 : 1b3f: 83 f8 03 cmp $0x3,%eax 0.00 : 1b42: 0f 84 e9 08 00 00 je 2431 0.00 : 1b48: 83 e8 01 sub $0x1,%eax 0.00 : 1b4b: 0f 85 88 00 00 00 jne 1bd9 0.00 : 1b51: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax : case ixgbe_mac_82598EB: : hwstats->lxonrxc += IXGBE_READ_REG(hw, IXGBE_LXONRXC); 0.00 : 1b58: 48 8b 93 38 15 00 00 mov 0x1538(%rbx),%rdx 0.00 : 1b5f: 48 05 60 cf 00 00 add $0xcf60,%rax 0.00 : 1b65: 8b 00 mov (%rax),%eax 0.00 : 1b67: 89 c0 mov %eax,%eax 0.00 : 1b69: 48 01 d0 add %rdx,%rax : hwstats->gorc += IXGBE_READ_REG(hw, IXGBE_GORCH); 0.00 : 1b6c: 48 8b 93 a0 16 00 00 mov 0x16a0(%rbx),%rdx : ixgbe_update_xoff_received(adapter); : : /* 82598 hardware only has a 32 bit counter in the high register */ : switch (hw->mac.type) { : case ixgbe_mac_82598EB: : hwstats->lxonrxc += IXGBE_READ_REG(hw, IXGBE_LXONRXC); 0.00 : 1b73: 48 89 83 38 15 00 00 mov %rax,0x1538(%rbx) 0.00 : 1b7a: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 1b81: 48 05 8c 40 00 00 add $0x408c,%rax 0.00 : 1b87: 8b 00 mov (%rax),%eax : hwstats->gorc += IXGBE_READ_REG(hw, IXGBE_GORCH); 0.00 : 1b89: 89 c0 mov %eax,%eax 0.00 : 1b8b: 48 01 d0 add %rdx,%rax : hwstats->gotc += IXGBE_READ_REG(hw, IXGBE_GOTCH); 0.00 : 1b8e: 48 8b 93 a8 16 00 00 mov 0x16a8(%rbx),%rdx : : /* 82598 hardware only has a 32 bit counter in the high register */ : switch (hw->mac.type) { : case ixgbe_mac_82598EB: : hwstats->lxonrxc += IXGBE_READ_REG(hw, IXGBE_LXONRXC); : hwstats->gorc += IXGBE_READ_REG(hw, IXGBE_GORCH); 0.00 : 1b95: 48 89 83 a0 16 00 00 mov %rax,0x16a0(%rbx) 0.00 : 1b9c: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 1ba3: 48 05 94 40 00 00 add $0x4094,%rax 0.00 : 1ba9: 8b 00 mov (%rax),%eax : hwstats->gotc += IXGBE_READ_REG(hw, IXGBE_GOTCH); 0.00 : 1bab: 89 c0 mov %eax,%eax 0.00 : 1bad: 48 01 d0 add %rdx,%rax : hwstats->tor += IXGBE_READ_REG(hw, IXGBE_TORH); 0.00 : 1bb0: 48 8b 93 28 17 00 00 mov 0x1728(%rbx),%rdx : /* 82598 hardware only has a 32 bit counter in the high register */ : switch (hw->mac.type) { : case ixgbe_mac_82598EB: : hwstats->lxonrxc += IXGBE_READ_REG(hw, IXGBE_LXONRXC); : hwstats->gorc += IXGBE_READ_REG(hw, IXGBE_GORCH); : hwstats->gotc += IXGBE_READ_REG(hw, IXGBE_GOTCH); 0.00 : 1bb7: 48 89 83 a8 16 00 00 mov %rax,0x16a8(%rbx) 0.00 : 1bbe: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 1bc5: 48 05 c4 40 00 00 add $0x40c4,%rax 0.00 : 1bcb: 8b 00 mov (%rax),%eax : hwstats->tor += IXGBE_READ_REG(hw, IXGBE_TORH); 0.00 : 1bcd: 89 c0 mov %eax,%eax 0.00 : 1bcf: 48 01 d0 add %rdx,%rax 0.00 : 1bd2: 48 89 83 28 17 00 00 mov %rax,0x1728(%rbx) 0.00 : 1bd9: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 1be0: 48 05 78 40 00 00 add $0x4078,%rax 0.00 : 1be6: 8b 00 mov (%rax),%eax : break; : default: : break; : } : bprc = IXGBE_READ_REG(hw, IXGBE_BPRC); : hwstats->bprc += bprc; 0.00 : 1be8: 89 c1 mov %eax,%ecx 0.00 : 1bea: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 1bf1: 48 01 8b 88 16 00 00 add %rcx,0x1688(%rbx) : hwstats->mprc += IXGBE_READ_REG(hw, IXGBE_MPRC); 0.00 : 1bf8: 48 8b 93 90 16 00 00 mov 0x1690(%rbx),%rdx 0.00 : 1bff: 48 05 7c 40 00 00 add $0x407c,%rax 0.00 : 1c05: 8b 00 mov (%rax),%eax 0.00 : 1c07: 89 c0 mov %eax,%eax 0.00 : 1c09: 48 01 d0 add %rdx,%rax : if (hw->mac.type == ixgbe_mac_82598EB) 0.00 : 1c0c: 83 bb 50 10 00 00 01 cmpl $0x1,0x1050(%rbx) : default: : break; : } : bprc = IXGBE_READ_REG(hw, IXGBE_BPRC); : hwstats->bprc += bprc; : hwstats->mprc += IXGBE_READ_REG(hw, IXGBE_MPRC); 0.00 : 1c13: 48 89 83 90 16 00 00 mov %rax,0x1690(%rbx) : if (hw->mac.type == ixgbe_mac_82598EB) 0.00 : 1c1a: 0f 84 84 0b 00 00 je 27a4 0.00 : 1c20: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax : hwstats->mprc -= bprc; : hwstats->roc += IXGBE_READ_REG(hw, IXGBE_ROC); 0.00 : 1c27: 48 8b 93 00 17 00 00 mov 0x1700(%rbx),%rdx 0.00 : 1c2e: 48 05 ac 40 00 00 add $0x40ac,%rax 0.00 : 1c34: 8b 00 mov (%rax),%eax 0.00 : 1c36: 89 c0 mov %eax,%eax 0.00 : 1c38: 48 01 d0 add %rdx,%rax : hwstats->prc64 += IXGBE_READ_REG(hw, IXGBE_PRC64); 0.00 : 1c3b: 48 8b 93 50 16 00 00 mov 0x1650(%rbx),%rdx : bprc = IXGBE_READ_REG(hw, IXGBE_BPRC); : hwstats->bprc += bprc; : hwstats->mprc += IXGBE_READ_REG(hw, IXGBE_MPRC); : if (hw->mac.type == ixgbe_mac_82598EB) : hwstats->mprc -= bprc; : hwstats->roc += IXGBE_READ_REG(hw, IXGBE_ROC); 0.00 : 1c42: 48 89 83 00 17 00 00 mov %rax,0x1700(%rbx) 0.00 : 1c49: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 1c50: 48 05 5c 40 00 00 add $0x405c,%rax 0.00 : 1c56: 8b 00 mov (%rax),%eax : hwstats->prc64 += IXGBE_READ_REG(hw, IXGBE_PRC64); 0.00 : 1c58: 89 c0 mov %eax,%eax 0.00 : 1c5a: 48 01 d0 add %rdx,%rax : hwstats->prc127 += IXGBE_READ_REG(hw, IXGBE_PRC127); 0.00 : 1c5d: 48 8b 93 58 16 00 00 mov 0x1658(%rbx),%rdx : hwstats->bprc += bprc; : hwstats->mprc += IXGBE_READ_REG(hw, IXGBE_MPRC); : if (hw->mac.type == ixgbe_mac_82598EB) : hwstats->mprc -= bprc; : hwstats->roc += IXGBE_READ_REG(hw, IXGBE_ROC); : hwstats->prc64 += IXGBE_READ_REG(hw, IXGBE_PRC64); 0.00 : 1c64: 48 89 83 50 16 00 00 mov %rax,0x1650(%rbx) 0.00 : 1c6b: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 1c72: 48 05 60 40 00 00 add $0x4060,%rax 0.00 : 1c78: 8b 00 mov (%rax),%eax : hwstats->prc127 += IXGBE_READ_REG(hw, IXGBE_PRC127); 0.00 : 1c7a: 89 c0 mov %eax,%eax 0.00 : 1c7c: 48 01 d0 add %rdx,%rax : hwstats->prc255 += IXGBE_READ_REG(hw, IXGBE_PRC255); 0.00 : 1c7f: 48 8b 93 60 16 00 00 mov 0x1660(%rbx),%rdx : hwstats->mprc += IXGBE_READ_REG(hw, IXGBE_MPRC); : if (hw->mac.type == ixgbe_mac_82598EB) : hwstats->mprc -= bprc; : hwstats->roc += IXGBE_READ_REG(hw, IXGBE_ROC); : hwstats->prc64 += IXGBE_READ_REG(hw, IXGBE_PRC64); : hwstats->prc127 += IXGBE_READ_REG(hw, IXGBE_PRC127); 0.00 : 1c86: 48 89 83 58 16 00 00 mov %rax,0x1658(%rbx) 0.00 : 1c8d: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 1c94: 48 05 64 40 00 00 add $0x4064,%rax 0.00 : 1c9a: 8b 00 mov (%rax),%eax : hwstats->prc255 += IXGBE_READ_REG(hw, IXGBE_PRC255); 0.00 : 1c9c: 89 c0 mov %eax,%eax 0.00 : 1c9e: 48 01 d0 add %rdx,%rax : hwstats->prc511 += IXGBE_READ_REG(hw, IXGBE_PRC511); 0.00 : 1ca1: 48 8b 93 68 16 00 00 mov 0x1668(%rbx),%rdx : if (hw->mac.type == ixgbe_mac_82598EB) : hwstats->mprc -= bprc; : hwstats->roc += IXGBE_READ_REG(hw, IXGBE_ROC); : hwstats->prc64 += IXGBE_READ_REG(hw, IXGBE_PRC64); : hwstats->prc127 += IXGBE_READ_REG(hw, IXGBE_PRC127); : hwstats->prc255 += IXGBE_READ_REG(hw, IXGBE_PRC255); 0.00 : 1ca8: 48 89 83 60 16 00 00 mov %rax,0x1660(%rbx) 0.00 : 1caf: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 1cb6: 48 05 68 40 00 00 add $0x4068,%rax 0.00 : 1cbc: 8b 00 mov (%rax),%eax : hwstats->prc511 += IXGBE_READ_REG(hw, IXGBE_PRC511); 0.00 : 1cbe: 89 c0 mov %eax,%eax 0.00 : 1cc0: 48 01 d0 add %rdx,%rax : hwstats->prc1023 += IXGBE_READ_REG(hw, IXGBE_PRC1023); 0.00 : 1cc3: 48 8b 93 70 16 00 00 mov 0x1670(%rbx),%rdx : hwstats->mprc -= bprc; : hwstats->roc += IXGBE_READ_REG(hw, IXGBE_ROC); : hwstats->prc64 += IXGBE_READ_REG(hw, IXGBE_PRC64); : hwstats->prc127 += IXGBE_READ_REG(hw, IXGBE_PRC127); : hwstats->prc255 += IXGBE_READ_REG(hw, IXGBE_PRC255); : hwstats->prc511 += IXGBE_READ_REG(hw, IXGBE_PRC511); 0.00 : 1cca: 48 89 83 68 16 00 00 mov %rax,0x1668(%rbx) 0.00 : 1cd1: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 1cd8: 48 05 6c 40 00 00 add $0x406c,%rax 0.00 : 1cde: 8b 00 mov (%rax),%eax : hwstats->prc1023 += IXGBE_READ_REG(hw, IXGBE_PRC1023); 0.00 : 1ce0: 89 c0 mov %eax,%eax 0.00 : 1ce2: 48 01 d0 add %rdx,%rax : hwstats->prc1522 += IXGBE_READ_REG(hw, IXGBE_PRC1522); 0.00 : 1ce5: 48 8b 93 78 16 00 00 mov 0x1678(%rbx),%rdx : hwstats->roc += IXGBE_READ_REG(hw, IXGBE_ROC); : hwstats->prc64 += IXGBE_READ_REG(hw, IXGBE_PRC64); : hwstats->prc127 += IXGBE_READ_REG(hw, IXGBE_PRC127); : hwstats->prc255 += IXGBE_READ_REG(hw, IXGBE_PRC255); : hwstats->prc511 += IXGBE_READ_REG(hw, IXGBE_PRC511); : hwstats->prc1023 += IXGBE_READ_REG(hw, IXGBE_PRC1023); 0.00 : 1cec: 48 89 83 70 16 00 00 mov %rax,0x1670(%rbx) 0.00 : 1cf3: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 1cfa: 48 05 70 40 00 00 add $0x4070,%rax 0.00 : 1d00: 8b 00 mov (%rax),%eax : hwstats->prc1522 += IXGBE_READ_REG(hw, IXGBE_PRC1522); 0.00 : 1d02: 89 c0 mov %eax,%eax 0.00 : 1d04: 48 01 d0 add %rdx,%rax : hwstats->rlec += IXGBE_READ_REG(hw, IXGBE_RLEC); 0.00 : 1d07: 48 8b 93 28 15 00 00 mov 0x1528(%rbx),%rdx : hwstats->prc64 += IXGBE_READ_REG(hw, IXGBE_PRC64); : hwstats->prc127 += IXGBE_READ_REG(hw, IXGBE_PRC127); : hwstats->prc255 += IXGBE_READ_REG(hw, IXGBE_PRC255); : hwstats->prc511 += IXGBE_READ_REG(hw, IXGBE_PRC511); : hwstats->prc1023 += IXGBE_READ_REG(hw, IXGBE_PRC1023); : hwstats->prc1522 += IXGBE_READ_REG(hw, IXGBE_PRC1522); 0.00 : 1d0e: 48 89 83 78 16 00 00 mov %rax,0x1678(%rbx) 0.00 : 1d15: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 1d1c: 48 05 40 40 00 00 add $0x4040,%rax 0.00 : 1d22: 8b 00 mov (%rax),%eax : hwstats->rlec += IXGBE_READ_REG(hw, IXGBE_RLEC); 0.00 : 1d24: 89 c0 mov %eax,%eax 0.00 : 1d26: 48 01 d0 add %rdx,%rax 0.00 : 1d29: 48 89 83 28 15 00 00 mov %rax,0x1528(%rbx) 0.00 : 1d30: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 1d37: 48 05 60 3f 00 00 add $0x3f60,%rax 0.00 : 1d3d: 8b 30 mov (%rax),%esi : lxon = IXGBE_READ_REG(hw, IXGBE_LXONTXC); : hwstats->lxontxc += lxon; 0.00 : 1d3f: 89 f0 mov %esi,%eax 0.00 : 1d41: 48 01 83 30 15 00 00 add %rax,0x1530(%rbx) 0.00 : 1d48: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 1d4f: 48 05 68 3f 00 00 add $0x3f68,%rax 0.00 : 1d55: 8b 10 mov (%rax),%edx : lxoff = IXGBE_READ_REG(hw, IXGBE_LXOFFTXC); : hwstats->lxofftxc += lxoff; 0.00 : 1d57: 89 d0 mov %edx,%eax 0.00 : 1d59: 48 01 83 40 15 00 00 add %rax,0x1540(%rbx) 0.00 : 1d60: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax : hwstats->gptc += IXGBE_READ_REG(hw, IXGBE_GPTC); 0.00 : 1d67: 48 8b 8b 98 16 00 00 mov 0x1698(%rbx),%rcx 0.00 : 1d6e: 48 05 80 40 00 00 add $0x4080,%rax 0.00 : 1d74: 8b 00 mov (%rax),%eax 0.00 : 1d76: 89 c0 mov %eax,%eax 0.00 : 1d78: 48 01 c8 add %rcx,%rax : hwstats->mptc += IXGBE_READ_REG(hw, IXGBE_MPTC); 0.00 : 1d7b: 48 8b 8b 70 17 00 00 mov 0x1770(%rbx),%rcx : hwstats->rlec += IXGBE_READ_REG(hw, IXGBE_RLEC); : lxon = IXGBE_READ_REG(hw, IXGBE_LXONTXC); : hwstats->lxontxc += lxon; : lxoff = IXGBE_READ_REG(hw, IXGBE_LXOFFTXC); : hwstats->lxofftxc += lxoff; : hwstats->gptc += IXGBE_READ_REG(hw, IXGBE_GPTC); 0.00 : 1d82: 48 89 83 98 16 00 00 mov %rax,0x1698(%rbx) 0.00 : 1d89: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 1d90: 48 05 f0 40 00 00 add $0x40f0,%rax 0.00 : 1d96: 8b 00 mov (%rax),%eax : hwstats->mptc += IXGBE_READ_REG(hw, IXGBE_MPTC); 0.00 : 1d98: 89 c0 mov %eax,%eax : /* : * 82598 errata - tx of flow control packets is included in tx counters : */ : xon_off_tot = lxon + lxoff; 0.00 : 1d9a: 01 f2 add %esi,%edx : lxon = IXGBE_READ_REG(hw, IXGBE_LXONTXC); : hwstats->lxontxc += lxon; : lxoff = IXGBE_READ_REG(hw, IXGBE_LXOFFTXC); : hwstats->lxofftxc += lxoff; : hwstats->gptc += IXGBE_READ_REG(hw, IXGBE_GPTC); : hwstats->mptc += IXGBE_READ_REG(hw, IXGBE_MPTC); 0.00 : 1d9c: 48 01 c8 add %rcx,%rax : /* : * 82598 errata - tx of flow control packets is included in tx counters : */ : xon_off_tot = lxon + lxoff; : hwstats->gptc -= xon_off_tot; 0.00 : 1d9f: 89 d1 mov %edx,%ecx : hwstats->mptc -= xon_off_tot; : hwstats->gotc -= (xon_off_tot * (ETH_ZLEN + ETH_FCS_LEN)); 0.00 : 1da1: c1 e2 06 shl $0x6,%edx : lxon = IXGBE_READ_REG(hw, IXGBE_LXONTXC); : hwstats->lxontxc += lxon; : lxoff = IXGBE_READ_REG(hw, IXGBE_LXOFFTXC); : hwstats->lxofftxc += lxoff; : hwstats->gptc += IXGBE_READ_REG(hw, IXGBE_GPTC); : hwstats->mptc += IXGBE_READ_REG(hw, IXGBE_MPTC); 0.00 : 1da4: 48 89 83 70 17 00 00 mov %rax,0x1770(%rbx) 0.00 : 1dab: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax : * 82598 errata - tx of flow control packets is included in tx counters : */ : xon_off_tot = lxon + lxoff; : hwstats->gptc -= xon_off_tot; : hwstats->mptc -= xon_off_tot; : hwstats->gotc -= (xon_off_tot * (ETH_ZLEN + ETH_FCS_LEN)); 0.00 : 1db2: 89 d2 mov %edx,%edx : hwstats->mptc += IXGBE_READ_REG(hw, IXGBE_MPTC); : /* : * 82598 errata - tx of flow control packets is included in tx counters : */ : xon_off_tot = lxon + lxoff; : hwstats->gptc -= xon_off_tot; 0.00 : 1db4: 48 29 8b 98 16 00 00 sub %rcx,0x1698(%rbx) : hwstats->mptc -= xon_off_tot; : hwstats->gotc -= (xon_off_tot * (ETH_ZLEN + ETH_FCS_LEN)); 0.00 : 1dbb: 48 29 93 a8 16 00 00 sub %rdx,0x16a8(%rbx) : /* : * 82598 errata - tx of flow control packets is included in tx counters : */ : xon_off_tot = lxon + lxoff; : hwstats->gptc -= xon_off_tot; : hwstats->mptc -= xon_off_tot; 0.00 : 1dc2: 48 29 8b 70 17 00 00 sub %rcx,0x1770(%rbx) : hwstats->gotc -= (xon_off_tot * (ETH_ZLEN + ETH_FCS_LEN)); : hwstats->ruc += IXGBE_READ_REG(hw, IXGBE_RUC); 0.00 : 1dc9: 48 8b 93 f0 16 00 00 mov 0x16f0(%rbx),%rdx 0.00 : 1dd0: 48 05 a4 40 00 00 add $0x40a4,%rax 0.00 : 1dd6: 8b 00 mov (%rax),%eax 0.00 : 1dd8: 89 c0 mov %eax,%eax 0.00 : 1dda: 48 01 d0 add %rdx,%rax : hwstats->rfc += IXGBE_READ_REG(hw, IXGBE_RFC); 0.00 : 1ddd: 48 8b 93 f8 16 00 00 mov 0x16f8(%rbx),%rdx : */ : xon_off_tot = lxon + lxoff; : hwstats->gptc -= xon_off_tot; : hwstats->mptc -= xon_off_tot; : hwstats->gotc -= (xon_off_tot * (ETH_ZLEN + ETH_FCS_LEN)); : hwstats->ruc += IXGBE_READ_REG(hw, IXGBE_RUC); 0.00 : 1de4: 48 89 83 f0 16 00 00 mov %rax,0x16f0(%rbx) 0.00 : 1deb: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 1df2: 48 05 a8 40 00 00 add $0x40a8,%rax 0.00 : 1df8: 8b 00 mov (%rax),%eax : hwstats->rfc += IXGBE_READ_REG(hw, IXGBE_RFC); 0.00 : 1dfa: 89 c0 mov %eax,%eax 0.00 : 1dfc: 48 01 d0 add %rdx,%rax : hwstats->rjc += IXGBE_READ_REG(hw, IXGBE_RJC); 0.00 : 1dff: 48 8b 93 08 17 00 00 mov 0x1708(%rbx),%rdx : xon_off_tot = lxon + lxoff; : hwstats->gptc -= xon_off_tot; : hwstats->mptc -= xon_off_tot; : hwstats->gotc -= (xon_off_tot * (ETH_ZLEN + ETH_FCS_LEN)); : hwstats->ruc += IXGBE_READ_REG(hw, IXGBE_RUC); : hwstats->rfc += IXGBE_READ_REG(hw, IXGBE_RFC); 0.00 : 1e06: 48 89 83 f8 16 00 00 mov %rax,0x16f8(%rbx) 0.00 : 1e0d: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 1e14: 48 05 b0 40 00 00 add $0x40b0,%rax 0.00 : 1e1a: 8b 00 mov (%rax),%eax : hwstats->rjc += IXGBE_READ_REG(hw, IXGBE_RJC); 0.00 : 1e1c: 89 c0 mov %eax,%eax 0.00 : 1e1e: 48 01 d0 add %rdx,%rax : hwstats->tpr += IXGBE_READ_REG(hw, IXGBE_TPR); 0.00 : 1e21: 48 8b 93 30 17 00 00 mov 0x1730(%rbx),%rdx : hwstats->gptc -= xon_off_tot; : hwstats->mptc -= xon_off_tot; : hwstats->gotc -= (xon_off_tot * (ETH_ZLEN + ETH_FCS_LEN)); : hwstats->ruc += IXGBE_READ_REG(hw, IXGBE_RUC); : hwstats->rfc += IXGBE_READ_REG(hw, IXGBE_RFC); : hwstats->rjc += IXGBE_READ_REG(hw, IXGBE_RJC); 0.00 : 1e28: 48 89 83 08 17 00 00 mov %rax,0x1708(%rbx) 0.00 : 1e2f: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 1e36: 48 05 d0 40 00 00 add $0x40d0,%rax 0.00 : 1e3c: 8b 00 mov (%rax),%eax : hwstats->tpr += IXGBE_READ_REG(hw, IXGBE_TPR); 0.00 : 1e3e: 89 c0 mov %eax,%eax 0.00 : 1e40: 48 01 d0 add %rdx,%rax : hwstats->ptc64 += IXGBE_READ_REG(hw, IXGBE_PTC64); 0.00 : 1e43: 48 8b 93 40 17 00 00 mov 0x1740(%rbx),%rdx : hwstats->mptc -= xon_off_tot; : hwstats->gotc -= (xon_off_tot * (ETH_ZLEN + ETH_FCS_LEN)); : hwstats->ruc += IXGBE_READ_REG(hw, IXGBE_RUC); : hwstats->rfc += IXGBE_READ_REG(hw, IXGBE_RFC); : hwstats->rjc += IXGBE_READ_REG(hw, IXGBE_RJC); : hwstats->tpr += IXGBE_READ_REG(hw, IXGBE_TPR); 0.00 : 1e4a: 48 89 83 30 17 00 00 mov %rax,0x1730(%rbx) 0.00 : 1e51: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 1e58: 48 05 d8 40 00 00 add $0x40d8,%rax 0.00 : 1e5e: 8b 00 mov (%rax),%eax : hwstats->ptc64 += IXGBE_READ_REG(hw, IXGBE_PTC64); : hwstats->ptc64 -= xon_off_tot; 0.00 : 1e60: 89 c0 mov %eax,%eax 0.00 : 1e62: 48 01 d0 add %rdx,%rax : hwstats->ptc127 += IXGBE_READ_REG(hw, IXGBE_PTC127); 0.00 : 1e65: 48 8b 93 48 17 00 00 mov 0x1748(%rbx),%rdx : hwstats->ruc += IXGBE_READ_REG(hw, IXGBE_RUC); : hwstats->rfc += IXGBE_READ_REG(hw, IXGBE_RFC); : hwstats->rjc += IXGBE_READ_REG(hw, IXGBE_RJC); : hwstats->tpr += IXGBE_READ_REG(hw, IXGBE_TPR); : hwstats->ptc64 += IXGBE_READ_REG(hw, IXGBE_PTC64); : hwstats->ptc64 -= xon_off_tot; 0.00 : 1e6c: 48 29 c8 sub %rcx,%rax 0.00 : 1e6f: 48 89 83 40 17 00 00 mov %rax,0x1740(%rbx) 0.00 : 1e76: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 1e7d: 48 05 dc 40 00 00 add $0x40dc,%rax 0.00 : 1e83: 8b 00 mov (%rax),%eax : hwstats->ptc127 += IXGBE_READ_REG(hw, IXGBE_PTC127); 0.00 : 1e85: 89 c0 mov %eax,%eax 0.00 : 1e87: 48 01 d0 add %rdx,%rax : hwstats->ptc255 += IXGBE_READ_REG(hw, IXGBE_PTC255); 0.00 : 1e8a: 48 8b 93 50 17 00 00 mov 0x1750(%rbx),%rdx : hwstats->rfc += IXGBE_READ_REG(hw, IXGBE_RFC); : hwstats->rjc += IXGBE_READ_REG(hw, IXGBE_RJC); : hwstats->tpr += IXGBE_READ_REG(hw, IXGBE_TPR); : hwstats->ptc64 += IXGBE_READ_REG(hw, IXGBE_PTC64); : hwstats->ptc64 -= xon_off_tot; : hwstats->ptc127 += IXGBE_READ_REG(hw, IXGBE_PTC127); 0.00 : 1e91: 48 89 83 48 17 00 00 mov %rax,0x1748(%rbx) 0.00 : 1e98: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 1e9f: 48 05 e0 40 00 00 add $0x40e0,%rax 0.00 : 1ea5: 8b 00 mov (%rax),%eax : hwstats->ptc255 += IXGBE_READ_REG(hw, IXGBE_PTC255); 0.00 : 1ea7: 89 c0 mov %eax,%eax 0.00 : 1ea9: 48 01 d0 add %rdx,%rax : hwstats->ptc511 += IXGBE_READ_REG(hw, IXGBE_PTC511); 0.00 : 1eac: 48 8b 93 58 17 00 00 mov 0x1758(%rbx),%rdx : hwstats->rjc += IXGBE_READ_REG(hw, IXGBE_RJC); : hwstats->tpr += IXGBE_READ_REG(hw, IXGBE_TPR); : hwstats->ptc64 += IXGBE_READ_REG(hw, IXGBE_PTC64); : hwstats->ptc64 -= xon_off_tot; : hwstats->ptc127 += IXGBE_READ_REG(hw, IXGBE_PTC127); : hwstats->ptc255 += IXGBE_READ_REG(hw, IXGBE_PTC255); 0.00 : 1eb3: 48 89 83 50 17 00 00 mov %rax,0x1750(%rbx) 0.00 : 1eba: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 1ec1: 48 05 e4 40 00 00 add $0x40e4,%rax 0.00 : 1ec7: 8b 00 mov (%rax),%eax : hwstats->ptc511 += IXGBE_READ_REG(hw, IXGBE_PTC511); 0.00 : 1ec9: 89 c0 mov %eax,%eax 0.00 : 1ecb: 48 01 d0 add %rdx,%rax : hwstats->ptc1023 += IXGBE_READ_REG(hw, IXGBE_PTC1023); 0.00 : 1ece: 48 8b 93 60 17 00 00 mov 0x1760(%rbx),%rdx : hwstats->tpr += IXGBE_READ_REG(hw, IXGBE_TPR); : hwstats->ptc64 += IXGBE_READ_REG(hw, IXGBE_PTC64); : hwstats->ptc64 -= xon_off_tot; : hwstats->ptc127 += IXGBE_READ_REG(hw, IXGBE_PTC127); : hwstats->ptc255 += IXGBE_READ_REG(hw, IXGBE_PTC255); : hwstats->ptc511 += IXGBE_READ_REG(hw, IXGBE_PTC511); 0.00 : 1ed5: 48 89 83 58 17 00 00 mov %rax,0x1758(%rbx) 0.00 : 1edc: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 1ee3: 48 05 e8 40 00 00 add $0x40e8,%rax 0.00 : 1ee9: 8b 00 mov (%rax),%eax : hwstats->ptc1023 += IXGBE_READ_REG(hw, IXGBE_PTC1023); 0.00 : 1eeb: 89 c0 mov %eax,%eax 0.00 : 1eed: 48 01 d0 add %rdx,%rax : hwstats->ptc1522 += IXGBE_READ_REG(hw, IXGBE_PTC1522); 0.00 : 1ef0: 48 8b 93 68 17 00 00 mov 0x1768(%rbx),%rdx : hwstats->ptc64 += IXGBE_READ_REG(hw, IXGBE_PTC64); : hwstats->ptc64 -= xon_off_tot; : hwstats->ptc127 += IXGBE_READ_REG(hw, IXGBE_PTC127); : hwstats->ptc255 += IXGBE_READ_REG(hw, IXGBE_PTC255); : hwstats->ptc511 += IXGBE_READ_REG(hw, IXGBE_PTC511); : hwstats->ptc1023 += IXGBE_READ_REG(hw, IXGBE_PTC1023); 0.00 : 1ef7: 48 89 83 60 17 00 00 mov %rax,0x1760(%rbx) 0.00 : 1efe: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 1f05: 48 05 ec 40 00 00 add $0x40ec,%rax 0.00 : 1f0b: 8b 00 mov (%rax),%eax : hwstats->ptc1522 += IXGBE_READ_REG(hw, IXGBE_PTC1522); 0.00 : 1f0d: 89 c0 mov %eax,%eax 0.00 : 1f0f: 48 01 d0 add %rdx,%rax : hwstats->bptc += IXGBE_READ_REG(hw, IXGBE_BPTC); 0.00 : 1f12: 48 8b 93 78 17 00 00 mov 0x1778(%rbx),%rdx : hwstats->ptc64 -= xon_off_tot; : hwstats->ptc127 += IXGBE_READ_REG(hw, IXGBE_PTC127); : hwstats->ptc255 += IXGBE_READ_REG(hw, IXGBE_PTC255); : hwstats->ptc511 += IXGBE_READ_REG(hw, IXGBE_PTC511); : hwstats->ptc1023 += IXGBE_READ_REG(hw, IXGBE_PTC1023); : hwstats->ptc1522 += IXGBE_READ_REG(hw, IXGBE_PTC1522); 0.00 : 1f19: 48 89 83 68 17 00 00 mov %rax,0x1768(%rbx) 0.00 : 1f20: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 1f27: 48 05 f4 40 00 00 add $0x40f4,%rax 0.00 : 1f2d: 8b 00 mov (%rax),%eax : hwstats->bptc += IXGBE_READ_REG(hw, IXGBE_BPTC); 0.00 : 1f2f: 89 c0 mov %eax,%eax 0.00 : 1f31: 48 01 d0 add %rdx,%rax 0.00 : 1f34: 48 89 83 78 17 00 00 mov %rax,0x1778(%rbx) : /* Fill out the OS statistics structure */ : net_stats->multicast = hwstats->mprc; 0.00 : 1f3b: 48 8b 83 90 16 00 00 mov 0x1690(%rbx),%rax 0.00 : 1f42: 49 89 87 08 01 00 00 mov %rax,0x108(%r15) : : /* Rx Errors */ : net_stats->rx_errors = hwstats->crcerrs + 0.00 : 1f49: 48 8b 83 28 15 00 00 mov 0x1528(%rbx),%rax 0.00 : 1f50: 48 03 83 b0 14 00 00 add 0x14b0(%rbx),%rax : hwstats->rlec; : net_stats->rx_dropped = 0; 0.00 : 1f57: 49 c7 87 f8 00 00 00 movq $0x0,0xf8(%r15) 0.00 : 1f5e: 00 00 00 00 : hwstats->bptc += IXGBE_READ_REG(hw, IXGBE_BPTC); : /* Fill out the OS statistics structure */ : net_stats->multicast = hwstats->mprc; : : /* Rx Errors */ : net_stats->rx_errors = hwstats->crcerrs + 0.00 : 1f62: 49 89 87 e8 00 00 00 mov %rax,0xe8(%r15) : hwstats->rlec; : net_stats->rx_dropped = 0; : net_stats->rx_length_errors = hwstats->rlec; 0.00 : 1f69: 48 8b 83 28 15 00 00 mov 0x1528(%rbx),%rax 0.00 : 1f70: 49 89 87 18 01 00 00 mov %rax,0x118(%r15) : net_stats->rx_crc_errors = hwstats->crcerrs; 0.00 : 1f77: 48 8b 83 b0 14 00 00 mov 0x14b0(%rbx),%rax : net_stats->rx_missed_errors = total_mpc; 0.00 : 1f7e: 4d 89 b7 40 01 00 00 mov %r14,0x140(%r15) : /* Rx Errors */ : net_stats->rx_errors = hwstats->crcerrs + : hwstats->rlec; : net_stats->rx_dropped = 0; : net_stats->rx_length_errors = hwstats->rlec; : net_stats->rx_crc_errors = hwstats->crcerrs; 0.00 : 1f85: 49 89 87 28 01 00 00 mov %rax,0x128(%r15) 0.00 : 1f8c: 48 8b 83 10 02 00 00 mov 0x210(%rbx),%rax : /* : * VF Stats Collection - skip while resetting because these : * are not clear on read and otherwise you'll sometimes get : * crazy values. : */ : if (!test_bit(__IXGBE_RESETTING, &adapter->state)) { 0.00 : 1f93: a8 02 test $0x2,%al 0.00 : 1f95: 0f 85 45 02 00 00 jne 21e0 : for (i = 0; i < adapter->num_vfs; i++) { 0.00 : 1f9b: 8b 83 58 7c 00 00 mov 0x7c58(%rbx),%eax 0.00 : 1fa1: 85 c0 test %eax,%eax 0.00 : 1fa3: 0f 84 37 02 00 00 je 21e0 0.00 : 1fa9: 45 31 c9 xor %r9d,%r9d 0.00 : 1fac: bf 1c 10 00 00 mov $0x101c,%edi 0.00 : 1fb1: 41 b8 00 84 00 00 mov $0x8400,%r8d 0.00 : 1fb7: 41 ba 00 83 00 00 mov $0x8300,%r10d : UPDATE_VF_COUNTER_32bit(IXGBE_PVFGPRC(i), \ 0.00 : 1fbd: 48 bd 00 00 00 00 01 movabs $0x100000000,%rbp 0.00 : 1fc4: 00 00 00 0.00 : 1fc7: 49 bb 00 00 00 00 ff movabs $0xffffffff00000000,%r11 0.00 : 1fce: ff ff ff : adapter->vfinfo[i].last_vfstats.gprc, \ : adapter->vfinfo[i].vfstats.gprc); : UPDATE_VF_COUNTER_32bit(IXGBE_PVFGPTC(i), \ : adapter->vfinfo[i].last_vfstats.gptc, \ : adapter->vfinfo[i].vfstats.gptc); : UPDATE_VF_COUNTER_36bit(IXGBE_PVFGORC_LSB(i), \ 0.00 : 1fd1: 49 bd 00 00 00 00 10 movabs $0x1000000000,%r13 0.00 : 1fd8: 00 00 00 0.00 : 1fdb: 49 bc 00 00 00 00 f0 movabs $0xfffffff000000000,%r12 0.00 : 1fe2: ff ff ff 0.00 : 1fe5: 0f 1f 00 nopl (%rax) 0.00 : 1fe8: 89 f8 mov %edi,%eax 0.00 : 1fea: 48 03 83 80 0e 00 00 add 0xe80(%rbx),%rax 0.00 : 1ff1: 8b 00 mov (%rax),%eax : * are not clear on read and otherwise you'll sometimes get : * crazy values. : */ : if (!test_bit(__IXGBE_RESETTING, &adapter->state)) { : for (i = 0; i < adapter->num_vfs; i++) { : UPDATE_VF_COUNTER_32bit(IXGBE_PVFGPRC(i), \ 0.00 : 1ff3: 89 c2 mov %eax,%edx 0.00 : 1ff5: 44 89 c8 mov %r9d,%eax 0.00 : 1ff8: 48 8d 04 40 lea (%rax,%rax,2),%rax 0.00 : 1ffc: 48 8d 04 c0 lea (%rax,%rax,8),%rax 0.00 : 2000: 48 8d 0c c5 00 00 00 lea 0x0(,%rax,8),%rcx 0.00 : 2007: 00 0.00 : 2008: 48 8b 83 60 7c 00 00 mov 0x7c60(%rbx),%rax 0.00 : 200f: 48 01 c8 add %rcx,%rax 0.00 : 2012: 48 3b 50 78 cmp 0x78(%rax),%rdx 0.00 : 2016: 73 0e jae 2026 0.00 : 2018: 48 01 68 50 add %rbp,0x50(%rax) 0.00 : 201c: 48 8b 83 60 7c 00 00 mov 0x7c60(%rbx),%rax 0.00 : 2023: 48 01 c8 add %rcx,%rax 0.00 : 2026: 48 89 50 78 mov %rdx,0x78(%rax) 0.00 : 202a: 48 8b 83 60 7c 00 00 mov 0x7c60(%rbx),%rax 0.00 : 2031: 48 01 c8 add %rcx,%rax 0.00 : 2034: 4c 21 58 50 and %r11,0x50(%rax) 0.00 : 2038: 48 8b 83 60 7c 00 00 mov 0x7c60(%rbx),%rax 0.00 : 203f: 48 01 c8 add %rcx,%rax 0.00 : 2042: 48 09 50 50 or %rdx,0x50(%rax) 0.00 : 2046: 44 89 d0 mov %r10d,%eax 0.00 : 2049: 48 03 83 80 0e 00 00 add 0xe80(%rbx),%rax 0.00 : 2050: 8b 00 mov (%rax),%eax : adapter->vfinfo[i].last_vfstats.gprc, \ : adapter->vfinfo[i].vfstats.gprc); : UPDATE_VF_COUNTER_32bit(IXGBE_PVFGPTC(i), \ 0.00 : 2052: 89 c2 mov %eax,%edx 0.00 : 2054: 48 8b 83 60 7c 00 00 mov 0x7c60(%rbx),%rax 0.00 : 205b: 48 01 c8 add %rcx,%rax 0.00 : 205e: 48 3b 90 88 00 00 00 cmp 0x88(%rax),%rdx 0.00 : 2065: 73 0e jae 2075 0.00 : 2067: 48 01 68 60 add %rbp,0x60(%rax) 0.00 : 206b: 48 8b 83 60 7c 00 00 mov 0x7c60(%rbx),%rax 0.00 : 2072: 48 01 c8 add %rcx,%rax 0.00 : 2075: 48 89 90 88 00 00 00 mov %rdx,0x88(%rax) 0.00 : 207c: 48 8b 83 60 7c 00 00 mov 0x7c60(%rbx),%rax 0.00 : 2083: 48 01 c8 add %rcx,%rax 0.00 : 2086: 4c 21 58 60 and %r11,0x60(%rax) 0.00 : 208a: 48 8b 83 60 7c 00 00 mov 0x7c60(%rbx),%rax 0.00 : 2091: 48 01 c8 add %rcx,%rax 0.00 : 2094: 48 09 50 60 or %rdx,0x60(%rax) 0.00 : 2098: 8d 47 04 lea 0x4(%rdi),%eax 0.00 : 209b: 48 03 83 80 0e 00 00 add 0xe80(%rbx),%rax 0.00 : 20a2: 8b 10 mov (%rax),%edx 0.00 : 20a4: 8d 87 04 c0 00 00 lea 0xc004(%rdi),%eax 0.00 : 20aa: 48 03 83 80 0e 00 00 add 0xe80(%rbx),%rax 0.00 : 20b1: 8b 00 mov (%rax),%eax : adapter->vfinfo[i].last_vfstats.gptc, \ : adapter->vfinfo[i].vfstats.gptc); : UPDATE_VF_COUNTER_36bit(IXGBE_PVFGORC_LSB(i), \ 0.00 : 20b3: 48 89 c6 mov %rax,%rsi 0.00 : 20b6: 48 8b 83 60 7c 00 00 mov 0x7c60(%rbx),%rax 0.00 : 20bd: 89 d2 mov %edx,%edx 0.00 : 20bf: 48 c1 e6 20 shl $0x20,%rsi 0.00 : 20c3: 48 09 d6 or %rdx,%rsi 0.00 : 20c6: 48 01 c8 add %rcx,%rax 0.00 : 20c9: 48 3b b0 80 00 00 00 cmp 0x80(%rax),%rsi 0.00 : 20d0: 73 0e jae 20e0 0.00 : 20d2: 4c 01 68 58 add %r13,0x58(%rax) 0.00 : 20d6: 48 8b 83 60 7c 00 00 mov 0x7c60(%rbx),%rax 0.00 : 20dd: 48 01 c8 add %rcx,%rax 0.00 : 20e0: 48 89 b0 80 00 00 00 mov %rsi,0x80(%rax) 0.00 : 20e7: 48 8b 83 60 7c 00 00 mov 0x7c60(%rbx),%rax 0.00 : 20ee: 48 01 c8 add %rcx,%rax 0.00 : 20f1: 4c 21 60 58 and %r12,0x58(%rax) 0.00 : 20f5: 48 8b 83 60 7c 00 00 mov 0x7c60(%rbx),%rax 0.00 : 20fc: 48 01 c8 add %rcx,%rax 0.00 : 20ff: 48 09 70 58 or %rsi,0x58(%rax) 0.00 : 2103: 44 89 c0 mov %r8d,%eax 0.00 : 2106: 48 03 83 80 0e 00 00 add 0xe80(%rbx),%rax 0.00 : 210d: 8b 10 mov (%rax),%edx 0.00 : 210f: 41 8d 40 04 lea 0x4(%r8),%eax 0.00 : 2113: 48 03 83 80 0e 00 00 add 0xe80(%rbx),%rax 0.00 : 211a: 8b 00 mov (%rax),%eax : IXGBE_PVFGORC_MSB(i), \ : adapter->vfinfo[i].last_vfstats.gorc, \ : adapter->vfinfo[i].vfstats.gorc); : UPDATE_VF_COUNTER_36bit(IXGBE_PVFGOTC_LSB(i), \ 0.00 : 211c: 48 89 c6 mov %rax,%rsi 0.00 : 211f: 48 8b 83 60 7c 00 00 mov 0x7c60(%rbx),%rax 0.00 : 2126: 89 d2 mov %edx,%edx 0.00 : 2128: 48 c1 e6 20 shl $0x20,%rsi 0.00 : 212c: 48 09 d6 or %rdx,%rsi 0.00 : 212f: 48 01 c8 add %rcx,%rax 0.00 : 2132: 48 3b b0 90 00 00 00 cmp 0x90(%rax),%rsi 0.00 : 2139: 73 0e jae 2149 0.00 : 213b: 4c 01 68 68 add %r13,0x68(%rax) 0.00 : 213f: 48 8b 83 60 7c 00 00 mov 0x7c60(%rbx),%rax 0.00 : 2146: 48 01 c8 add %rcx,%rax 0.00 : 2149: 48 89 b0 90 00 00 00 mov %rsi,0x90(%rax) 0.00 : 2150: 48 8b 83 60 7c 00 00 mov 0x7c60(%rbx),%rax 0.00 : 2157: 48 01 c8 add %rcx,%rax 0.00 : 215a: 4c 21 60 68 and %r12,0x68(%rax) 0.00 : 215e: 48 8b 83 60 7c 00 00 mov 0x7c60(%rbx),%rax 0.00 : 2165: 48 01 c8 add %rcx,%rax 0.00 : 2168: 48 09 70 68 or %rsi,0x68(%rax) 0.00 : 216c: 8d 87 00 c0 00 00 lea 0xc000(%rdi),%eax 0.00 : 2172: 48 03 83 80 0e 00 00 add 0xe80(%rbx),%rax 0.00 : 2179: 8b 00 mov (%rax),%eax : IXGBE_PVFGOTC_MSB(i), \ : adapter->vfinfo[i].last_vfstats.gotc, \ : adapter->vfinfo[i].vfstats.gotc); : UPDATE_VF_COUNTER_32bit(IXGBE_PVFMPRC(i), \ 0.00 : 217b: 89 c2 mov %eax,%edx 0.00 : 217d: 48 8b 83 60 7c 00 00 mov 0x7c60(%rbx),%rax 0.00 : 2184: 48 01 c8 add %rcx,%rax 0.00 : 2187: 48 3b 90 98 00 00 00 cmp 0x98(%rax),%rdx 0.00 : 218e: 73 0e jae 219e 0.00 : 2190: 48 01 68 70 add %rbp,0x70(%rax) 0.00 : 2194: 48 8b 83 60 7c 00 00 mov 0x7c60(%rbx),%rax 0.00 : 219b: 48 01 c8 add %rcx,%rax 0.00 : 219e: 48 89 90 98 00 00 00 mov %rdx,0x98(%rax) 0.00 : 21a5: 48 8b 83 60 7c 00 00 mov 0x7c60(%rbx),%rax : * VF Stats Collection - skip while resetting because these : * are not clear on read and otherwise you'll sometimes get : * crazy values. : */ : if (!test_bit(__IXGBE_RESETTING, &adapter->state)) { : for (i = 0; i < adapter->num_vfs; i++) { 0.00 : 21ac: 41 83 c1 01 add $0x1,%r9d 0.00 : 21b0: 83 c7 40 add $0x40,%edi 0.00 : 21b3: 41 83 c0 08 add $0x8,%r8d 0.00 : 21b7: 41 83 c2 04 add $0x4,%r10d : adapter->vfinfo[i].vfstats.gorc); : UPDATE_VF_COUNTER_36bit(IXGBE_PVFGOTC_LSB(i), \ : IXGBE_PVFGOTC_MSB(i), \ : adapter->vfinfo[i].last_vfstats.gotc, \ : adapter->vfinfo[i].vfstats.gotc); : UPDATE_VF_COUNTER_32bit(IXGBE_PVFMPRC(i), \ 0.00 : 21bb: 48 01 c8 add %rcx,%rax 0.00 : 21be: 4c 21 58 70 and %r11,0x70(%rax) 0.00 : 21c2: 48 89 c8 mov %rcx,%rax 0.00 : 21c5: 48 03 83 60 7c 00 00 add 0x7c60(%rbx),%rax 0.00 : 21cc: 48 09 50 70 or %rdx,0x70(%rax) : * VF Stats Collection - skip while resetting because these : * are not clear on read and otherwise you'll sometimes get : * crazy values. : */ : if (!test_bit(__IXGBE_RESETTING, &adapter->state)) { : for (i = 0; i < adapter->num_vfs; i++) { 0.00 : 21d0: 44 39 8b 58 7c 00 00 cmp %r9d,0x7c58(%rbx) 0.00 : 21d7: 0f 87 0b fe ff ff ja 1fe8 0.00 : 21dd: 0f 1f 00 nopl (%rax) : UPDATE_VF_COUNTER_32bit(IXGBE_PVFMPRC(i), \ : adapter->vfinfo[i].last_vfstats.mprc, \ : adapter->vfinfo[i].vfstats.mprc); : } : } : } 0.00 : 21e0: 48 83 c4 28 add $0x28,%rsp 0.00 : 21e4: 5b pop %rbx 0.00 : 21e5: 5d pop %rbp 0.00 : 21e6: 41 5c pop %r12 0.00 : 21e8: 41 5d pop %r13 0.00 : 21ea: 41 5e pop %r14 0.00 : 21ec: 41 5f pop %r15 0.00 : 21ee: c3 retq : return; : : if (adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED) { : u64 rsc_count = 0; : u64 rsc_flush = 0; : for (i = 0; i < adapter->num_rx_queues; i++) { 0.00 : 21ef: 44 8b 9f 28 02 00 00 mov 0x228(%rdi),%r11d 0.00 : 21f6: 31 f6 xor %esi,%esi 0.00 : 21f8: 31 c9 xor %ecx,%ecx 0.00 : 21fa: 45 85 db test %r11d,%r11d 0.00 : 21fd: 74 32 je 2231 0.00 : 21ff: 41 8d 43 ff lea -0x1(%r11),%eax 0.00 : 2203: 31 f6 xor %esi,%esi 0.00 : 2205: 31 c9 xor %ecx,%ecx 0.00 : 2207: 31 d2 xor %edx,%edx 0.00 : 2209: 48 8d 3c c5 08 00 00 lea 0x8(,%rax,8),%rdi 0.00 : 2210: 00 0.00 : 2211: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) : rsc_count += adapter->rx_ring[i]->rx_stats.rsc_count; 0.00 : 2218: 48 8b 84 13 d8 04 00 mov 0x4d8(%rbx,%rdx,1),%rax 0.00 : 221f: 00 : rsc_flush += adapter->rx_ring[i]->rx_stats.rsc_flush; 0.00 : 2220: 48 83 c2 08 add $0x8,%rdx : : if (adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED) { : u64 rsc_count = 0; : u64 rsc_flush = 0; : for (i = 0; i < adapter->num_rx_queues; i++) { : rsc_count += adapter->rx_ring[i]->rx_stats.rsc_count; 0.00 : 2224: 48 03 70 68 add 0x68(%rax),%rsi : rsc_flush += adapter->rx_ring[i]->rx_stats.rsc_flush; 0.00 : 2228: 48 03 48 70 add 0x70(%rax),%rcx : return; : : if (adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED) { : u64 rsc_count = 0; : u64 rsc_flush = 0; : for (i = 0; i < adapter->num_rx_queues; i++) { 0.00 : 222c: 48 39 fa cmp %rdi,%rdx 0.00 : 222f: 75 e7 jne 2218 : rsc_count += adapter->rx_ring[i]->rx_stats.rsc_count; : rsc_flush += adapter->rx_ring[i]->rx_stats.rsc_flush; : } : adapter->rsc_total_count = rsc_count; 0.00 : 2231: 48 89 b3 30 07 00 00 mov %rsi,0x730(%rbx) : adapter->rsc_total_flush = rsc_flush; 0.00 : 2238: 48 89 8b 38 07 00 00 mov %rcx,0x738(%rbx) 0.00 : 223f: e9 06 f6 ff ff jmpq 184a 0.00 : 2244: 0f 1f 40 00 nopl 0x0(%rax) : net_stats->tx_packets = packets; : : hwstats->crcerrs += IXGBE_READ_REG(hw, IXGBE_CRCERRS); : : /* 8 register reads */ : for (i = 0; i < 8; i++) { 0.00 : 2248: 66 be 30 60 mov $0x6030,%si 0.00 : 224c: b9 00 87 00 00 mov $0x8700,%ecx 0.00 : 2251: eb 1a jmp 226d 0.00 : 2253: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 0.00 : 2258: 48 83 c6 40 add $0x40,%rsi 0.00 : 225c: 48 83 c1 08 add $0x8,%rcx : break; : } : } : : /*16 register reads */ : for (i = 0; i < 16; i++) { 0.00 : 2260: 48 81 fe 30 64 00 00 cmp $0x6430,%rsi 0.00 : 2267: 0f 84 c3 00 00 00 je 2330 0.00 : 226d: 48 89 f0 mov %rsi,%rax : hwstats->qptc[i] += IXGBE_READ_REG(hw, IXGBE_QPTC(i)); 0.00 : 2270: 48 8b 94 0b 08 91 ff mov -0x6ef8(%rbx,%rcx,1),%rdx 0.00 : 2277: ff 0.00 : 2278: 48 03 83 80 0e 00 00 add 0xe80(%rbx),%rax 0.00 : 227f: 8b 00 mov (%rax),%eax 0.00 : 2281: 89 c0 mov %eax,%eax 0.00 : 2283: 48 01 d0 add %rdx,%rax : hwstats->qprc[i] += IXGBE_READ_REG(hw, IXGBE_QPRC(i)); 0.00 : 2286: 48 8b 94 0b 88 90 ff mov -0x6f78(%rbx,%rcx,1),%rdx 0.00 : 228d: ff : } : } : : /*16 register reads */ : for (i = 0; i < 16; i++) { : hwstats->qptc[i] += IXGBE_READ_REG(hw, IXGBE_QPTC(i)); 0.00 : 228e: 48 89 84 0b 08 91 ff mov %rax,-0x6ef8(%rbx,%rcx,1) 0.00 : 2295: ff 0.00 : 2296: 48 8d 86 00 b0 ff ff lea -0x5000(%rsi),%rax 0.00 : 229d: 48 03 83 80 0e 00 00 add 0xe80(%rbx),%rax 0.00 : 22a4: 8b 00 mov (%rax),%eax : hwstats->qprc[i] += IXGBE_READ_REG(hw, IXGBE_QPRC(i)); 0.00 : 22a6: 89 c0 mov %eax,%eax 0.00 : 22a8: 48 01 d0 add %rdx,%rax 0.00 : 22ab: 48 89 84 0b 88 90 ff mov %rax,-0x6f78(%rbx,%rcx,1) 0.00 : 22b2: ff : if ((hw->mac.type == ixgbe_mac_82599EB) || 0.00 : 22b3: 8b 83 50 10 00 00 mov 0x1050(%rbx),%eax 0.00 : 22b9: 83 e8 02 sub $0x2,%eax 0.00 : 22bc: 83 f8 01 cmp $0x1,%eax 0.00 : 22bf: 77 97 ja 2258 0.00 : 22c1: 48 89 c8 mov %rcx,%rax : (hw->mac.type == ixgbe_mac_X540)) { : hwstats->qbtc[i] += IXGBE_READ_REG(hw, IXGBE_QBTC_L(i)); 0.00 : 22c4: 48 8b 94 0b 08 92 ff mov -0x6df8(%rbx,%rcx,1),%rdx 0.00 : 22cb: ff 0.00 : 22cc: 48 03 83 80 0e 00 00 add 0xe80(%rbx),%rax 0.00 : 22d3: 8b 00 mov (%rax),%eax 0.00 : 22d5: 89 c0 mov %eax,%eax 0.00 : 22d7: 48 01 d0 add %rdx,%rax 0.00 : 22da: 48 89 84 0b 08 92 ff mov %rax,-0x6df8(%rbx,%rcx,1) 0.00 : 22e1: ff 0.00 : 22e2: 48 8d 41 04 lea 0x4(%rcx),%rax 0.00 : 22e6: 48 03 83 80 0e 00 00 add 0xe80(%rbx),%rax 0.00 : 22ed: 8b 00 mov (%rax),%eax 0.00 : 22ef: 48 8d 86 04 b0 ff ff lea -0x4ffc(%rsi),%rax : IXGBE_READ_REG(hw, IXGBE_QBTC_H(i)); /* to clear */ : hwstats->qbrc[i] += IXGBE_READ_REG(hw, IXGBE_QBRC_L(i)); 0.00 : 22f6: 48 8b 94 0b 88 91 ff mov -0x6e78(%rbx,%rcx,1),%rdx 0.00 : 22fd: ff 0.00 : 22fe: 48 03 83 80 0e 00 00 add 0xe80(%rbx),%rax 0.00 : 2305: 8b 00 mov (%rax),%eax 0.00 : 2307: 89 c0 mov %eax,%eax 0.00 : 2309: 48 01 d0 add %rdx,%rax 0.00 : 230c: 48 89 84 0b 88 91 ff mov %rax,-0x6e78(%rbx,%rcx,1) 0.00 : 2313: ff 0.00 : 2314: 48 8d 86 08 b0 ff ff lea -0x4ff8(%rsi),%rax 0.00 : 231b: 48 03 83 80 0e 00 00 add 0xe80(%rbx),%rax 0.00 : 2322: 8b 00 mov (%rax),%eax ??:0 100.00 : 2324: e9 2f ff ff ff jmpq 2258 0.00 : 2329: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 0.00 : 2330: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax : IXGBE_READ_REG(hw, IXGBE_QBRC_H(i)); /* to clear */ : } : } : : hwstats->gprc += IXGBE_READ_REG(hw, IXGBE_GPRC); 0.00 : 2337: 48 8b 8b 80 16 00 00 mov 0x1680(%rbx),%rcx 0.00 : 233e: 48 05 74 40 00 00 add $0x4074,%rax 0.00 : 2344: 8b 00 mov (%rax),%eax : /* work around hardware counting issue */ : hwstats->gprc -= missed_rx; 0.00 : 2346: 44 89 ca mov %r9d,%edx 0.00 : 2349: 89 c0 mov %eax,%eax 0.00 : 234b: 48 29 d1 sub %rdx,%rcx : { : struct ixgbe_hw *hw = &adapter->hw; : struct ixgbe_hw_stats *hwstats = &adapter->stats; : u32 xoff[8] = {0}; : int i; : bool pfc_en = adapter->dcb_cfg.pfc_mode_enable; 0.00 : 234e: 0f b6 93 7a 0a 00 00 movzbl 0xa7a(%rbx),%edx : } : } : : hwstats->gprc += IXGBE_READ_REG(hw, IXGBE_GPRC); : /* work around hardware counting issue */ : hwstats->gprc -= missed_rx; 0.00 : 2355: 48 01 c1 add %rax,%rcx : u32 xoff[8] = {0}; : int i; : bool pfc_en = adapter->dcb_cfg.pfc_mode_enable; : : #ifdef HAVE_DCBNL_IEEE : if (adapter->ixgbe_ieee_pfc) 0.00 : 2358: 48 8b 83 50 09 00 00 mov 0x950(%rbx),%rax : } : } : : hwstats->gprc += IXGBE_READ_REG(hw, IXGBE_GPRC); : /* work around hardware counting issue */ : hwstats->gprc -= missed_rx; 0.00 : 235f: 48 89 8b 80 16 00 00 mov %rcx,0x1680(%rbx) : u32 xoff[8] = {0}; : int i; : bool pfc_en = adapter->dcb_cfg.pfc_mode_enable; : : #ifdef HAVE_DCBNL_IEEE : if (adapter->ixgbe_ieee_pfc) 0.00 : 2366: 48 85 c0 test %rax,%rax 0.00 : 2369: 74 12 je 237d : pfc_en |= !!(adapter->ixgbe_ieee_pfc->pfc_en); 0.00 : 236b: 80 78 01 00 cmpb $0x0,0x1(%rax) 0.00 : 236f: 0f b6 d2 movzbl %dl,%edx 0.00 : 2372: 0f 95 c0 setne %al 0.00 : 2375: 0f b6 c0 movzbl %al,%eax 0.00 : 2378: 09 d0 or %edx,%eax 0.00 : 237a: 0f 95 c2 setne %dl : : #endif : if (!(adapter->flags & IXGBE_FLAG_DCB_ENABLED) || !pfc_en) { 0.00 : 237d: f6 83 19 02 00 00 04 testb $0x4,0x219(%rbx) 0.00 : 2384: 0f 84 8e f7 ff ff je 1b18 0.00 : 238a: 84 d2 test %dl,%dl 0.00 : 238c: 0f 84 86 f7 ff ff je 1b18 : : static void ixgbe_update_xoff_received(struct ixgbe_adapter *adapter) : { : struct ixgbe_hw *hw = &adapter->hw; : struct ixgbe_hw_stats *hwstats = &adapter->stats; : u32 xoff[8] = {0}; 0.00 : 2392: 48 c7 04 24 00 00 00 movq $0x0,(%rsp) 0.00 : 2399: 00 0.00 : 239a: 48 c7 44 24 08 00 00 movq $0x0,0x8(%rsp) 0.00 : 23a1: 00 00 0.00 : 23a3: 31 c9 xor %ecx,%ecx 0.00 : 23a5: 48 c7 44 24 10 00 00 movq $0x0,0x10(%rsp) 0.00 : 23ac: 00 00 0.00 : 23ae: 48 c7 44 24 18 00 00 movq $0x0,0x18(%rsp) 0.00 : 23b5: 00 00 0.00 : 23b7: ba 20 cf 00 00 mov $0xcf20,%edx 0.00 : 23bc: 48 89 e6 mov %rsp,%rsi 0.00 : 23bf: eb 52 jmp 2413 0.00 : 23c1: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 0.00 : 23c8: 48 8d 82 40 72 ff ff lea -0x8dc0(%rdx),%rax 0.00 : 23cf: 48 03 83 80 0e 00 00 add 0xe80(%rbx),%rax 0.00 : 23d6: 8b 00 mov (%rax),%eax : switch (hw->mac.type) { : case ixgbe_mac_82598EB: : xoff[i] = IXGBE_READ_REG(hw, IXGBE_PXOFFRXC(i)); : break; : default: : xoff[i] = IXGBE_READ_REG(hw, IXGBE_PXOFFRXCNT(i)); 0.00 : 23d8: 89 84 16 e0 30 ff ff mov %eax,-0xcf20(%rsi,%rdx,1) : } : hwstats->pxoffrxc[i] += xoff[i]; 0.00 : 23df: 8b 84 16 e0 30 ff ff mov -0xcf20(%rsi,%rdx,1),%eax : ixgbe_update_xoff_rx_lfc(adapter); : return; : } : : /* update stats for each tc, only valid with PFC enabled */ : for (i = 0; i < MAX_TX_PACKET_BUFFERS; i++) { 0.00 : 23e6: 83 c1 01 add $0x1,%ecx : xoff[i] = IXGBE_READ_REG(hw, IXGBE_PXOFFRXC(i)); : break; : default: : xoff[i] = IXGBE_READ_REG(hw, IXGBE_PXOFFRXCNT(i)); : } : hwstats->pxoffrxc[i] += xoff[i]; 0.00 : 23e9: 48 01 84 53 d0 77 fe add %rax,-0x18830(%rbx,%rdx,2) 0.00 : 23f0: ff : ixgbe_update_xoff_rx_lfc(adapter); : return; : } : : /* update stats for each tc, only valid with PFC enabled */ : for (i = 0; i < MAX_TX_PACKET_BUFFERS; i++) { 0.00 : 23f1: 8b 83 18 02 00 00 mov 0x218(%rbx),%eax 0.00 : 23f7: 25 00 04 00 00 and $0x400,%eax 0.00 : 23fc: 83 f8 01 cmp $0x1,%eax 0.00 : 23ff: 19 c0 sbb %eax,%eax 0.00 : 2401: 48 83 c2 04 add $0x4,%rdx 0.00 : 2405: 83 e0 f9 and $0xfffffff9,%eax 0.00 : 2408: 83 c0 08 add $0x8,%eax 0.00 : 240b: 39 c8 cmp %ecx,%eax 0.00 : 240d: 0f 8e a0 03 00 00 jle 27b3 : switch (hw->mac.type) { 0.00 : 2413: 83 bb 50 10 00 00 01 cmpl $0x1,0x1050(%rbx) 0.00 : 241a: 75 ac jne 23c8 0.00 : 241c: 48 89 d0 mov %rdx,%rax 0.00 : 241f: 48 03 83 80 0e 00 00 add 0xe80(%rbx),%rax 0.00 : 2426: 8b 00 mov (%rax),%eax : case ixgbe_mac_82598EB: : xoff[i] = IXGBE_READ_REG(hw, IXGBE_PXOFFRXC(i)); 0.00 : 2428: 89 84 16 e0 30 ff ff mov %eax,-0xcf20(%rsi,%rdx,1) 0.00 : 242f: eb ae jmp 23df 0.00 : 2431: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax : hwstats->gotc += IXGBE_READ_REG(hw, IXGBE_GOTCH); : hwstats->tor += IXGBE_READ_REG(hw, IXGBE_TORH); : break; : case ixgbe_mac_X540: : /* OS2BMC stats are X540 only*/ : hwstats->o2bgptc += IXGBE_READ_REG(hw, IXGBE_O2BGPTC); 0.00 : 2438: 48 8b 93 e0 1a 00 00 mov 0x1ae0(%rbx),%rdx 0.00 : 243f: 48 05 c4 41 00 00 add $0x41c4,%rax 0.00 : 2445: 8b 00 mov (%rax),%eax 0.00 : 2447: 89 c0 mov %eax,%eax 0.00 : 2449: 48 01 d0 add %rdx,%rax : hwstats->o2bspc += IXGBE_READ_REG(hw, IXGBE_O2BSPC); 0.00 : 244c: 48 8b 93 e8 1a 00 00 mov 0x1ae8(%rbx),%rdx : hwstats->gotc += IXGBE_READ_REG(hw, IXGBE_GOTCH); : hwstats->tor += IXGBE_READ_REG(hw, IXGBE_TORH); : break; : case ixgbe_mac_X540: : /* OS2BMC stats are X540 only*/ : hwstats->o2bgptc += IXGBE_READ_REG(hw, IXGBE_O2BGPTC); 0.00 : 2453: 48 89 83 e0 1a 00 00 mov %rax,0x1ae0(%rbx) 0.00 : 245a: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 2461: 48 05 b0 87 00 00 add $0x87b0,%rax 0.00 : 2467: 8b 00 mov (%rax),%eax : hwstats->o2bspc += IXGBE_READ_REG(hw, IXGBE_O2BSPC); 0.00 : 2469: 89 c0 mov %eax,%eax 0.00 : 246b: 48 01 d0 add %rdx,%rax : hwstats->b2ospc += IXGBE_READ_REG(hw, IXGBE_B2OSPC); 0.00 : 246e: 48 8b 93 d0 1a 00 00 mov 0x1ad0(%rbx),%rdx : hwstats->tor += IXGBE_READ_REG(hw, IXGBE_TORH); : break; : case ixgbe_mac_X540: : /* OS2BMC stats are X540 only*/ : hwstats->o2bgptc += IXGBE_READ_REG(hw, IXGBE_O2BGPTC); : hwstats->o2bspc += IXGBE_READ_REG(hw, IXGBE_O2BSPC); 0.00 : 2475: 48 89 83 e8 1a 00 00 mov %rax,0x1ae8(%rbx) 0.00 : 247c: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 2483: 48 05 c0 41 00 00 add $0x41c0,%rax 0.00 : 2489: 8b 00 mov (%rax),%eax : hwstats->b2ospc += IXGBE_READ_REG(hw, IXGBE_B2OSPC); 0.00 : 248b: 89 c0 mov %eax,%eax 0.00 : 248d: 48 01 d0 add %rdx,%rax : hwstats->b2ogprc += IXGBE_READ_REG(hw, IXGBE_B2OGPRC); 0.00 : 2490: 48 8b 93 d8 1a 00 00 mov 0x1ad8(%rbx),%rdx : break; : case ixgbe_mac_X540: : /* OS2BMC stats are X540 only*/ : hwstats->o2bgptc += IXGBE_READ_REG(hw, IXGBE_O2BGPTC); : hwstats->o2bspc += IXGBE_READ_REG(hw, IXGBE_O2BSPC); : hwstats->b2ospc += IXGBE_READ_REG(hw, IXGBE_B2OSPC); 0.00 : 2497: 48 89 83 d0 1a 00 00 mov %rax,0x1ad0(%rbx) 0.00 : 249e: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 24a5: 48 05 90 2f 00 00 add $0x2f90,%rax 0.00 : 24ab: 8b 00 mov (%rax),%eax : hwstats->b2ogprc += IXGBE_READ_REG(hw, IXGBE_B2OGPRC); 0.00 : 24ad: 89 c0 mov %eax,%eax 0.00 : 24af: 48 01 d0 add %rdx,%rax 0.00 : 24b2: 48 89 83 d8 1a 00 00 mov %rax,0x1ad8(%rbx) 0.00 : 24b9: b9 30 14 00 00 mov $0x1430,%ecx 0.00 : 24be: 66 90 xchg %ax,%ax 0.00 : 24c0: 48 89 c8 mov %rcx,%rax : case ixgbe_mac_82599EB: : for (i = 0; i < 16; i++) : adapter->hw_rx_no_dma_resources += 0.00 : 24c3: 48 8b 93 28 07 00 00 mov 0x728(%rbx),%rdx 0.00 : 24ca: 48 03 83 80 0e 00 00 add 0xe80(%rbx),%rax 0.00 : 24d1: 8b 00 mov (%rax),%eax 0.00 : 24d3: 89 c0 mov %eax,%eax 0.00 : 24d5: 48 83 c1 40 add $0x40,%rcx 0.00 : 24d9: 48 01 d0 add %rdx,%rax : hwstats->o2bgptc += IXGBE_READ_REG(hw, IXGBE_O2BGPTC); : hwstats->o2bspc += IXGBE_READ_REG(hw, IXGBE_O2BSPC); : hwstats->b2ospc += IXGBE_READ_REG(hw, IXGBE_B2OSPC); : hwstats->b2ogprc += IXGBE_READ_REG(hw, IXGBE_B2OGPRC); : case ixgbe_mac_82599EB: : for (i = 0; i < 16; i++) 0.00 : 24dc: 48 81 f9 30 18 00 00 cmp $0x1830,%rcx : adapter->hw_rx_no_dma_resources += 0.00 : 24e3: 48 89 83 28 07 00 00 mov %rax,0x728(%rbx) : hwstats->o2bgptc += IXGBE_READ_REG(hw, IXGBE_O2BGPTC); : hwstats->o2bspc += IXGBE_READ_REG(hw, IXGBE_O2BSPC); : hwstats->b2ospc += IXGBE_READ_REG(hw, IXGBE_B2OSPC); : hwstats->b2ogprc += IXGBE_READ_REG(hw, IXGBE_B2OGPRC); : case ixgbe_mac_82599EB: : for (i = 0; i < 16; i++) 0.00 : 24ea: 75 d4 jne 24c0 0.00 : 24ec: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax : adapter->hw_rx_no_dma_resources += : IXGBE_READ_REG(hw, IXGBE_QPRDC(i)); : hwstats->gorc += IXGBE_READ_REG(hw, IXGBE_GORCL); 0.00 : 24f3: 48 8b 93 a0 16 00 00 mov 0x16a0(%rbx),%rdx 0.00 : 24fa: 48 05 88 40 00 00 add $0x4088,%rax 0.00 : 2500: 8b 00 mov (%rax),%eax 0.00 : 2502: 89 c0 mov %eax,%eax 0.00 : 2504: 48 01 d0 add %rdx,%rax 0.00 : 2507: 48 89 83 a0 16 00 00 mov %rax,0x16a0(%rbx) 0.00 : 250e: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 2515: 48 05 8c 40 00 00 add $0x408c,%rax 0.00 : 251b: 8b 00 mov (%rax),%eax 0.00 : 251d: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax : IXGBE_READ_REG(hw, IXGBE_GORCH); /* to clear */ : hwstats->gotc += IXGBE_READ_REG(hw, IXGBE_GOTCL); 0.00 : 2524: 48 8b 93 a8 16 00 00 mov 0x16a8(%rbx),%rdx 0.00 : 252b: 48 05 90 40 00 00 add $0x4090,%rax 0.00 : 2531: 8b 00 mov (%rax),%eax 0.00 : 2533: 89 c0 mov %eax,%eax 0.00 : 2535: 48 01 d0 add %rdx,%rax 0.00 : 2538: 48 89 83 a8 16 00 00 mov %rax,0x16a8(%rbx) 0.00 : 253f: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 2546: 48 05 94 40 00 00 add $0x4094,%rax 0.00 : 254c: 8b 00 mov (%rax),%eax 0.00 : 254e: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax : IXGBE_READ_REG(hw, IXGBE_GOTCH); /* to clear */ : hwstats->tor += IXGBE_READ_REG(hw, IXGBE_TORL); 0.00 : 2555: 48 8b 93 28 17 00 00 mov 0x1728(%rbx),%rdx 0.00 : 255c: 48 05 c0 40 00 00 add $0x40c0,%rax 0.00 : 2562: 8b 00 mov (%rax),%eax 0.00 : 2564: 89 c0 mov %eax,%eax 0.00 : 2566: 48 01 d0 add %rdx,%rax 0.00 : 2569: 48 89 83 28 17 00 00 mov %rax,0x1728(%rbx) 0.00 : 2570: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 2577: 48 05 c4 40 00 00 add $0x40c4,%rax 0.00 : 257d: 8b 00 mov (%rax),%eax 0.00 : 257f: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax : IXGBE_READ_REG(hw, IXGBE_TORH); /* to clear */ : hwstats->lxonrxc += IXGBE_READ_REG(hw, IXGBE_LXONRXCNT); 0.00 : 2586: 48 8b 93 38 15 00 00 mov 0x1538(%rbx),%rdx 0.00 : 258d: 48 05 a4 41 00 00 add $0x41a4,%rax 0.00 : 2593: 8b 00 mov (%rax),%eax 0.00 : 2595: 89 c0 mov %eax,%eax 0.00 : 2597: 48 01 d0 add %rdx,%rax : #ifdef HAVE_TX_MQ : hwstats->fdirmatch += IXGBE_READ_REG(hw, IXGBE_FDIRMATCH); 0.00 : 259a: 48 8b 93 68 1a 00 00 mov 0x1a68(%rbx),%rdx : IXGBE_READ_REG(hw, IXGBE_GORCH); /* to clear */ : hwstats->gotc += IXGBE_READ_REG(hw, IXGBE_GOTCL); : IXGBE_READ_REG(hw, IXGBE_GOTCH); /* to clear */ : hwstats->tor += IXGBE_READ_REG(hw, IXGBE_TORL); : IXGBE_READ_REG(hw, IXGBE_TORH); /* to clear */ : hwstats->lxonrxc += IXGBE_READ_REG(hw, IXGBE_LXONRXCNT); 0.00 : 25a1: 48 89 83 38 15 00 00 mov %rax,0x1538(%rbx) 0.00 : 25a8: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 25af: 48 05 58 ee 00 00 add $0xee58,%rax 0.00 : 25b5: 8b 00 mov (%rax),%eax : #ifdef HAVE_TX_MQ : hwstats->fdirmatch += IXGBE_READ_REG(hw, IXGBE_FDIRMATCH); 0.00 : 25b7: 89 c0 mov %eax,%eax 0.00 : 25b9: 48 01 d0 add %rdx,%rax : hwstats->fdirmiss += IXGBE_READ_REG(hw, IXGBE_FDIRMISS); 0.00 : 25bc: 48 8b 93 70 1a 00 00 mov 0x1a70(%rbx),%rdx : IXGBE_READ_REG(hw, IXGBE_GOTCH); /* to clear */ : hwstats->tor += IXGBE_READ_REG(hw, IXGBE_TORL); : IXGBE_READ_REG(hw, IXGBE_TORH); /* to clear */ : hwstats->lxonrxc += IXGBE_READ_REG(hw, IXGBE_LXONRXCNT); : #ifdef HAVE_TX_MQ : hwstats->fdirmatch += IXGBE_READ_REG(hw, IXGBE_FDIRMATCH); 0.00 : 25c3: 48 89 83 68 1a 00 00 mov %rax,0x1a68(%rbx) 0.00 : 25ca: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 25d1: 48 05 5c ee 00 00 add $0xee5c,%rax 0.00 : 25d7: 8b 00 mov (%rax),%eax : hwstats->fdirmiss += IXGBE_READ_REG(hw, IXGBE_FDIRMISS); 0.00 : 25d9: 89 c0 mov %eax,%eax 0.00 : 25db: 48 01 d0 add %rdx,%rax : #endif /* HAVE_TX_MQ */ : #ifdef IXGBE_FCOE : hwstats->fccrc += IXGBE_READ_REG(hw, IXGBE_FCCRC); 0.00 : 25de: 48 8b 93 78 1a 00 00 mov 0x1a78(%rbx),%rdx : hwstats->tor += IXGBE_READ_REG(hw, IXGBE_TORL); : IXGBE_READ_REG(hw, IXGBE_TORH); /* to clear */ : hwstats->lxonrxc += IXGBE_READ_REG(hw, IXGBE_LXONRXCNT); : #ifdef HAVE_TX_MQ : hwstats->fdirmatch += IXGBE_READ_REG(hw, IXGBE_FDIRMATCH); : hwstats->fdirmiss += IXGBE_READ_REG(hw, IXGBE_FDIRMISS); 0.00 : 25e5: 48 89 83 70 1a 00 00 mov %rax,0x1a70(%rbx) 0.00 : 25ec: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 25f3: 48 05 18 51 00 00 add $0x5118,%rax 0.00 : 25f9: 8b 00 mov (%rax),%eax : #endif /* HAVE_TX_MQ */ : #ifdef IXGBE_FCOE : hwstats->fccrc += IXGBE_READ_REG(hw, IXGBE_FCCRC); 0.00 : 25fb: 89 c0 mov %eax,%eax 0.00 : 25fd: 48 01 d0 add %rdx,%rax : hwstats->fclast += IXGBE_READ_REG(hw, IXGBE_FCLAST); 0.00 : 2600: 48 8b 93 80 1a 00 00 mov 0x1a80(%rbx),%rdx : #ifdef HAVE_TX_MQ : hwstats->fdirmatch += IXGBE_READ_REG(hw, IXGBE_FDIRMATCH); : hwstats->fdirmiss += IXGBE_READ_REG(hw, IXGBE_FDIRMISS); : #endif /* HAVE_TX_MQ */ : #ifdef IXGBE_FCOE : hwstats->fccrc += IXGBE_READ_REG(hw, IXGBE_FCCRC); 0.00 : 2607: 48 89 83 78 1a 00 00 mov %rax,0x1a78(%rbx) 0.00 : 260e: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 2615: 48 05 24 24 00 00 add $0x2424,%rax 0.00 : 261b: 8b 00 mov (%rax),%eax : hwstats->fclast += IXGBE_READ_REG(hw, IXGBE_FCLAST); 0.00 : 261d: 89 c0 mov %eax,%eax 0.00 : 261f: 48 01 d0 add %rdx,%rax : hwstats->fcoerpdc += IXGBE_READ_REG(hw, IXGBE_FCOERPDC); 0.00 : 2622: 48 8b 93 88 1a 00 00 mov 0x1a88(%rbx),%rdx : hwstats->fdirmatch += IXGBE_READ_REG(hw, IXGBE_FDIRMATCH); : hwstats->fdirmiss += IXGBE_READ_REG(hw, IXGBE_FDIRMISS); : #endif /* HAVE_TX_MQ */ : #ifdef IXGBE_FCOE : hwstats->fccrc += IXGBE_READ_REG(hw, IXGBE_FCCRC); : hwstats->fclast += IXGBE_READ_REG(hw, IXGBE_FCLAST); 0.00 : 2629: 48 89 83 80 1a 00 00 mov %rax,0x1a80(%rbx) 0.00 : 2630: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 2637: 48 05 1c 24 00 00 add $0x241c,%rax 0.00 : 263d: 8b 00 mov (%rax),%eax : hwstats->fcoerpdc += IXGBE_READ_REG(hw, IXGBE_FCOERPDC); 0.00 : 263f: 89 c0 mov %eax,%eax 0.00 : 2641: 48 01 d0 add %rdx,%rax : hwstats->fcoeprc += IXGBE_READ_REG(hw, IXGBE_FCOEPRC); 0.00 : 2644: 48 8b 93 90 1a 00 00 mov 0x1a90(%rbx),%rdx : hwstats->fdirmiss += IXGBE_READ_REG(hw, IXGBE_FDIRMISS); : #endif /* HAVE_TX_MQ */ : #ifdef IXGBE_FCOE : hwstats->fccrc += IXGBE_READ_REG(hw, IXGBE_FCCRC); : hwstats->fclast += IXGBE_READ_REG(hw, IXGBE_FCLAST); : hwstats->fcoerpdc += IXGBE_READ_REG(hw, IXGBE_FCOERPDC); 0.00 : 264b: 48 89 83 88 1a 00 00 mov %rax,0x1a88(%rbx) 0.00 : 2652: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 2659: 48 05 28 24 00 00 add $0x2428,%rax 0.00 : 265f: 8b 00 mov (%rax),%eax : hwstats->fcoeprc += IXGBE_READ_REG(hw, IXGBE_FCOEPRC); 0.00 : 2661: 89 c0 mov %eax,%eax 0.00 : 2663: 48 01 d0 add %rdx,%rax : hwstats->fcoeptc += IXGBE_READ_REG(hw, IXGBE_FCOEPTC); 0.00 : 2666: 48 8b 93 98 1a 00 00 mov 0x1a98(%rbx),%rdx : #endif /* HAVE_TX_MQ */ : #ifdef IXGBE_FCOE : hwstats->fccrc += IXGBE_READ_REG(hw, IXGBE_FCCRC); : hwstats->fclast += IXGBE_READ_REG(hw, IXGBE_FCLAST); : hwstats->fcoerpdc += IXGBE_READ_REG(hw, IXGBE_FCOERPDC); : hwstats->fcoeprc += IXGBE_READ_REG(hw, IXGBE_FCOEPRC); 0.00 : 266d: 48 89 83 90 1a 00 00 mov %rax,0x1a90(%rbx) 0.00 : 2674: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 267b: 48 05 84 87 00 00 add $0x8784,%rax 0.00 : 2681: 8b 00 mov (%rax),%eax : hwstats->fcoeptc += IXGBE_READ_REG(hw, IXGBE_FCOEPTC); 0.00 : 2683: 89 c0 mov %eax,%eax 0.00 : 2685: 48 01 d0 add %rdx,%rax : hwstats->fcoedwrc += IXGBE_READ_REG(hw, IXGBE_FCOEDWRC); 0.00 : 2688: 48 8b 93 a0 1a 00 00 mov 0x1aa0(%rbx),%rdx : #ifdef IXGBE_FCOE : hwstats->fccrc += IXGBE_READ_REG(hw, IXGBE_FCCRC); : hwstats->fclast += IXGBE_READ_REG(hw, IXGBE_FCLAST); : hwstats->fcoerpdc += IXGBE_READ_REG(hw, IXGBE_FCOERPDC); : hwstats->fcoeprc += IXGBE_READ_REG(hw, IXGBE_FCOEPRC); : hwstats->fcoeptc += IXGBE_READ_REG(hw, IXGBE_FCOEPTC); 0.00 : 268f: 48 89 83 98 1a 00 00 mov %rax,0x1a98(%rbx) 0.00 : 2696: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 269d: 48 05 2c 24 00 00 add $0x242c,%rax 0.00 : 26a3: 8b 00 mov (%rax),%eax : hwstats->fcoedwrc += IXGBE_READ_REG(hw, IXGBE_FCOEDWRC); 0.00 : 26a5: 89 c0 mov %eax,%eax 0.00 : 26a7: 48 01 d0 add %rdx,%rax : hwstats->fcoedwtc += IXGBE_READ_REG(hw, IXGBE_FCOEDWTC); 0.00 : 26aa: 48 8b 93 a8 1a 00 00 mov 0x1aa8(%rbx),%rdx : hwstats->fccrc += IXGBE_READ_REG(hw, IXGBE_FCCRC); : hwstats->fclast += IXGBE_READ_REG(hw, IXGBE_FCLAST); : hwstats->fcoerpdc += IXGBE_READ_REG(hw, IXGBE_FCOERPDC); : hwstats->fcoeprc += IXGBE_READ_REG(hw, IXGBE_FCOEPRC); : hwstats->fcoeptc += IXGBE_READ_REG(hw, IXGBE_FCOEPTC); : hwstats->fcoedwrc += IXGBE_READ_REG(hw, IXGBE_FCOEDWRC); 0.00 : 26b1: 48 89 83 a0 1a 00 00 mov %rax,0x1aa0(%rbx) 0.00 : 26b8: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 26bf: 48 05 88 87 00 00 add $0x8788,%rax 0.00 : 26c5: 8b 00 mov (%rax),%eax : hwstats->fcoedwtc += IXGBE_READ_REG(hw, IXGBE_FCOEDWTC); 0.00 : 26c7: 89 c0 mov %eax,%eax 0.00 : 26c9: 48 01 d0 add %rdx,%rax : /* Add up per cpu counters for total ddp alloc fail */ : if (adapter->fcoe.ddp_pool) { 0.00 : 26cc: 48 83 bb e8 1b 00 00 cmpq $0x0,0x1be8(%rbx) 0.00 : 26d3: 00 : hwstats->fclast += IXGBE_READ_REG(hw, IXGBE_FCLAST); : hwstats->fcoerpdc += IXGBE_READ_REG(hw, IXGBE_FCOERPDC); : hwstats->fcoeprc += IXGBE_READ_REG(hw, IXGBE_FCOEPRC); : hwstats->fcoeptc += IXGBE_READ_REG(hw, IXGBE_FCOEPTC); : hwstats->fcoedwrc += IXGBE_READ_REG(hw, IXGBE_FCOEDWRC); : hwstats->fcoedwtc += IXGBE_READ_REG(hw, IXGBE_FCOEDWTC); 0.00 : 26d4: 48 89 83 a8 1a 00 00 mov %rax,0x1aa8(%rbx) : /* Add up per cpu counters for total ddp alloc fail */ : if (adapter->fcoe.ddp_pool) { 0.00 : 26db: 0f 84 f8 f4 ff ff je 1bd9 : static inline unsigned int cpumask_next(int n, const struct cpumask *srcp) : { : /* -1 is a legal arg here. */ : if (n != -1) : cpumask_check(n); : return find_next_bit(cpumask_bits(srcp), nr_cpumask_bits, n+1); 0.00 : 26e1: 4c 8b 2d 00 00 00 00 mov 0x0(%rip),%r13 # 26e8 0.00 : 26e8: b9 ff ff ff ff mov $0xffffffff,%ecx 0.00 : 26ed: 45 31 e4 xor %r12d,%r12d 0.00 : 26f0: 31 ed xor %ebp,%ebp 0.00 : 26f2: eb 1d jmp 2711 0.00 : 26f4: 0f 1f 40 00 nopl 0x0(%rax) : struct ixgbe_fcoe *fcoe = &adapter->fcoe; : struct ixgbe_fcoe_ddp_pool *ddp_pool; : unsigned int cpu; : u64 noddp = 0, noddp_ext_buff = 0; : for_each_possible_cpu(cpu) { : ddp_pool = per_cpu_ptr(fcoe->ddp_pool, cpu); 0.00 : 26f8: 89 ca mov %ecx,%edx 0.00 : 26fa: 48 8b 83 e8 1b 00 00 mov 0x1be8(%rbx),%rax 0.00 : 2701: 48 03 04 d5 00 00 00 add 0x0(,%rdx,8),%rax 0.00 : 2708: 00 : noddp += ddp_pool->noddp; 0.00 : 2709: 4c 03 60 08 add 0x8(%rax),%r12 : noddp_ext_buff += ddp_pool->noddp_ext_buff; 0.00 : 270d: 48 03 68 10 add 0x10(%rax),%rbp 0.00 : 2711: 48 63 35 00 00 00 00 movslq 0x0(%rip),%rsi # 2718 0.00 : 2718: 8d 51 01 lea 0x1(%rcx),%edx 0.00 : 271b: 4c 89 ef mov %r13,%rdi 0.00 : 271e: 48 63 d2 movslq %edx,%rdx 0.00 : 2721: e8 00 00 00 00 callq 2726 : if (adapter->fcoe.ddp_pool) { : struct ixgbe_fcoe *fcoe = &adapter->fcoe; : struct ixgbe_fcoe_ddp_pool *ddp_pool; : unsigned int cpu; : u64 noddp = 0, noddp_ext_buff = 0; : for_each_possible_cpu(cpu) { 0.00 : 2726: 39 05 00 00 00 00 cmp %eax,0x0(%rip) # 272c 0.00 : 272c: 89 c1 mov %eax,%ecx 0.00 : 272e: 77 c8 ja 26f8 : ddp_pool = per_cpu_ptr(fcoe->ddp_pool, cpu); : noddp += ddp_pool->noddp; : noddp_ext_buff += ddp_pool->noddp_ext_buff; : } : hwstats->fcoe_noddp = noddp; 0.00 : 2730: 4c 89 a3 b0 1a 00 00 mov %r12,0x1ab0(%rbx) : hwstats->fcoe_noddp_ext_buff = noddp_ext_buff; 0.00 : 2737: 48 89 ab b8 1a 00 00 mov %rbp,0x1ab8(%rbx) 0.00 : 273e: e9 96 f4 ff ff jmpq 1bd9 : : if ((hw->fc.current_mode != ixgbe_fc_full) && : (hw->fc.current_mode != ixgbe_fc_rx_pause)) : return; : : switch (hw->mac.type) { 0.00 : 2743: 83 bb 50 10 00 00 01 cmpl $0x1,0x1050(%rbx) 0.00 : 274a: 0f 84 ae 00 00 00 je 27fe 0.00 : 2750: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 2757: 48 05 a8 41 00 00 add $0x41a8,%rax 0.00 : 275d: 8b 10 mov (%rax),%edx : data = IXGBE_READ_REG(hw, IXGBE_LXOFFRXC); : break; : default: : data = IXGBE_READ_REG(hw, IXGBE_LXOFFRXCNT); : } : hwstats->lxoffrxc += data; 0.00 : 275f: 89 d0 mov %edx,%eax 0.00 : 2761: 48 01 83 48 15 00 00 add %rax,0x1548(%rbx) : : /* refill credits (no tx hang) if we received xoff */ : if (!data) 0.00 : 2768: 85 d2 test %edx,%edx 0.00 : 276a: 0f 84 c0 f3 ff ff je 1b30 : return; : : for (i = 0; i < adapter->num_tx_queues; i++) 0.00 : 2770: 8b 93 20 02 00 00 mov 0x220(%rbx),%edx 0.00 : 2776: 85 d2 test %edx,%edx 0.00 : 2778: 0f 8e b2 f3 ff ff jle 1b30 0.00 : 277e: 31 c9 xor %ecx,%ecx : */ : static __always_inline void : clear_bit(int nr, volatile unsigned long *addr) : { : if (IS_IMMEDIATE(nr)) { : asm volatile(LOCK_PREFIX "andb %1,%0" 0.00 : 2780: 48 8b 97 80 02 00 00 mov 0x280(%rdi),%rdx 0.00 : 2787: 48 8d 42 30 lea 0x30(%rdx),%rax 0.00 : 278b: f0 80 62 30 fb lock andb $0xfb,0x30(%rdx) 0.00 : 2790: 83 c1 01 add $0x1,%ecx 0.00 : 2793: 48 83 c7 08 add $0x8,%rdi 0.00 : 2797: 3b 8b 20 02 00 00 cmp 0x220(%rbx),%ecx 0.00 : 279d: 7c e1 jl 2780 0.00 : 279f: e9 8c f3 ff ff jmpq 1b30 : } : bprc = IXGBE_READ_REG(hw, IXGBE_BPRC); : hwstats->bprc += bprc; : hwstats->mprc += IXGBE_READ_REG(hw, IXGBE_MPRC); : if (hw->mac.type == ixgbe_mac_82598EB) : hwstats->mprc -= bprc; 0.00 : 27a4: 48 29 c8 sub %rcx,%rax 0.00 : 27a7: 48 89 83 90 16 00 00 mov %rax,0x1690(%rbx) 0.00 : 27ae: e9 6d f4 ff ff jmpq 1c20 : } : hwstats->pxoffrxc[i] += xoff[i]; : } : : /* disarm tx queues that have received xoff frames */ : for (i = 0; i < adapter->num_tx_queues; i++) { 0.00 : 27b3: 8b 83 20 02 00 00 mov 0x220(%rbx),%eax 0.00 : 27b9: 85 c0 test %eax,%eax 0.00 : 27bb: 0f 8e 6f f3 ff ff jle 1b30 0.00 : 27c1: 31 c9 xor %ecx,%ecx 0.00 : 27c3: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) : struct ixgbe_ring *tx_ring = adapter->tx_ring[i]; 0.00 : 27c8: 48 8b 97 80 02 00 00 mov 0x280(%rdi),%rdx : u8 tc = tx_ring->dcb_tc; 0.00 : 27cf: 0f b6 42 56 movzbl 0x56(%rdx),%eax : : if ((tc <= 7) && (xoff[tc])) 0.00 : 27d3: 3c 07 cmp $0x7,%al 0.00 : 27d5: 77 13 ja 27ea 0.00 : 27d7: 0f b6 c0 movzbl %al,%eax 0.00 : 27da: 8b 04 84 mov (%rsp,%rax,4),%eax 0.00 : 27dd: 85 c0 test %eax,%eax 0.00 : 27df: 74 09 je 27ea 0.00 : 27e1: 48 8d 42 30 lea 0x30(%rdx),%rax 0.00 : 27e5: f0 80 62 30 fb lock andb $0xfb,0x30(%rdx) : } : hwstats->pxoffrxc[i] += xoff[i]; : } : : /* disarm tx queues that have received xoff frames */ : for (i = 0; i < adapter->num_tx_queues; i++) { 0.00 : 27ea: 83 c1 01 add $0x1,%ecx 0.00 : 27ed: 48 83 c7 08 add $0x8,%rdi 0.00 : 27f1: 3b 8b 20 02 00 00 cmp 0x220(%rbx),%ecx 0.00 : 27f7: 7c cf jl 27c8 0.00 : 27f9: e9 32 f3 ff ff jmpq 1b30 0.00 : 27fe: 48 8b 83 80 0e 00 00 mov 0xe80(%rbx),%rax 0.00 : 2805: 48 05 68 cf 00 00 add $0xcf68,%rax 0.00 : 280b: 8b 10 mov (%rax),%edx 0.00 : 280d: e9 4d ff ff ff jmpq 275f : } : adapter->lro_stats.flushed = flushed; : adapter->lro_stats.coal = coal; : : #endif : for (i = 0; i < adapter->num_rx_queues; i++) { 0.00 : 2812: 45 31 d2 xor %r10d,%r10d 0.00 : 2815: 45 31 c9 xor %r9d,%r9d 0.00 : 2818: 45 31 c0 xor %r8d,%r8d 0.00 : 281b: 31 ff xor %edi,%edi 0.00 : 281d: 31 d2 xor %edx,%edx 0.00 : 281f: 31 c0 xor %eax,%eax 0.00 : 2821: e9 d8 f0 ff ff jmpq 18fe : net_stats->rx_packets = packets; : : bytes = 0; : packets = 0; : /* gather some stats to the adapter struct that are per queue */ : for (i = 0; i < adapter->num_tx_queues; i++) { 0.00 : 2826: 45 31 c0 xor %r8d,%r8d 0.00 : 2829: 31 ff xor %edi,%edi 0.00 : 282b: 31 f6 xor %esi,%esi 0.00 : 282d: 31 c9 xor %ecx,%ecx 0.00 : 282f: e9 3d f1 ff ff jmpq 1971 : : Disassembly of section .devinit.text: : : 0000000000001800 : : struct ixgbe_option opt = { : .type = enable_option, : .name = "Enabled/Disable FCoE offload", : .err = "defaulting to Enabled", : .def = OPTION_ENABLED : }; 0.00 : 1800: 48 c7 44 24 70 00 00 movq $0x0,0x70(%rsp) 0.00 : 1807: 00 00 0.00 : 1809: c7 44 24 78 01 00 00 movl $0x1,0x78(%rsp) 0.00 : 1810: 00 : #ifdef module_param_array : if (num_FCoE > bd) { 0.00 : 1811: 0f 82 f7 05 00 00 jb 1e0e : if (fcoe) : *aflags |= IXGBE_FLAG_FCOE_CAPABLE; : #ifdef module_param_array : } else { : if (opt.def == OPTION_ENABLED) : *aflags |= IXGBE_FLAG_FCOE_CAPABLE; 0.00 : 1817: 81 8b 18 02 00 00 00 orl $0x20000,0x218(%rbx) 0.00 : 181e: 00 02 00 : } : #endif : DPRINTK(PROBE, INFO, "FCoE Offload feature %sabled\n", 0.00 : 1821: f6 83 a8 14 00 00 02 testb $0x2,0x14a8(%rbx) 0.00 : 1828: 0f 85 a6 05 00 00 jne 1dd4 : struct ixgbe_option opt = { : .type = enable_option, : .name = "LRO - Large Receive Offload", : .err = "defaulting to Enabled", : .def = OPTION_ENABLED : }; 0.00 : 182e: 48 8d 54 24 30 lea 0x30(%rsp),%rdx 0.00 : 1833: 31 c0 xor %eax,%eax 0.00 : 1835: b9 06 00 00 00 mov $0x6,%ecx : if (!(adapter->flags2 & IXGBE_FLAG2_RSC_CAPABLE)) : opt.def = OPTION_DISABLED; : : #endif : #ifdef module_param_array : if (num_LRO > bd) { 0.00 : 183a: 44 3b 25 00 00 00 00 cmp 0x0(%rip),%r12d # 1841 : struct ixgbe_option opt = { : .type = enable_option, : .name = "LRO - Large Receive Offload", : .err = "defaulting to Enabled", : .def = OPTION_ENABLED : }; 0.00 : 1841: 48 89 d7 mov %rdx,%rdi 0.00 : 1844: f3 48 ab rep stos %rax,%es:(%rdi) 0.00 : 1847: 48 c7 44 24 38 00 00 movq $0x0,0x38(%rsp) 0.00 : 184e: 00 00 0.00 : 1850: 48 c7 44 24 40 00 00 movq $0x0,0x40(%rsp) 0.00 : 1857: 00 00 0.00 : 1859: c7 44 24 48 01 00 00 movl $0x1,0x48(%rsp) 0.00 : 1860: 00 : struct net_device *netdev = adapter->netdev; 0.00 : 1861: 48 8b ab 00 02 00 00 mov 0x200(%rbx),%rbp : if (!(adapter->flags2 & IXGBE_FLAG2_RSC_CAPABLE)) : opt.def = OPTION_DISABLED; : : #endif : #ifdef module_param_array : if (num_LRO > bd) { 0.00 : 1868: 0f 82 e0 00 00 00 jb 194e : netdev->features |= NETIF_F_LRO; : else : netdev->features &= ~NETIF_F_LRO; : #ifdef module_param_array : } else if (opt.def == OPTION_ENABLED) { : netdev->features |= NETIF_F_LRO; 0.00 : 186e: 81 8d b0 00 00 00 00 orl $0x8000,0xb0(%rbp) 0.00 : 1875: 80 00 00 : struct ixgbe_option opt = { : .type = enable_option, : .name = "allow_unsupported_sfp", : .err = "defaulting to Disabled", : .def = OPTION_DISABLED : }; 0.00 : 1878: 31 c0 xor %eax,%eax : #ifdef module_param_array : if (num_allow_unsupported_sfp > bd) { 0.00 : 187a: 44 3b 25 00 00 00 00 cmp 0x0(%rip),%r12d # 1881 : struct ixgbe_option opt = { : .type = enable_option, : .name = "allow_unsupported_sfp", : .err = "defaulting to Disabled", : .def = OPTION_DISABLED : }; 0.00 : 1881: b9 06 00 00 00 mov $0x6,%ecx 0.00 : 1886: 48 89 e7 mov %rsp,%rdi 0.00 : 1889: f3 48 ab rep stos %rax,%es:(%rdi) 0.00 : 188c: 48 c7 44 24 08 00 00 movq $0x0,0x8(%rsp) 0.00 : 1893: 00 00 0.00 : 1895: 48 c7 44 24 10 00 00 movq $0x0,0x10(%rsp) 0.00 : 189c: 00 00 : #ifdef module_param_array : if (num_allow_unsupported_sfp > bd) { 0.00 : 189e: 72 7a jb 191a : } else { : adapter->hw.allow_unsupported_sfp = false; : } : #ifdef module_param_array : } else if (opt.def == OPTION_ENABLED) { : adapter->hw.allow_unsupported_sfp = true; 0.00 : 18a0: 83 7c 24 18 01 cmpl $0x1,0x18(%rsp) 0.00 : 18a5: 0f 94 83 a1 14 00 00 sete 0x14a1(%rbx) : } else { : adapter->hw.allow_unsupported_sfp = false; : } : #endif : } : } 0.00 : 18ac: 48 81 c4 a8 00 00 00 add $0xa8,%rsp 0.00 : 18b3: 5b pop %rbx 0.00 : 18b4: 5d pop %rbp 0.00 : 18b5: 41 5c pop %r12 0.00 : 18b7: 41 5d pop %r13 0.00 : 18b9: c3 retq : adapter->atr_sample_rate = IXGBE_ATR_SAMPLE_RATE_OFF; : } else if (num_AtrSampleRate > bd) { : adapter->atr_sample_rate = AtrSampleRate[bd]; : : if (adapter->atr_sample_rate) { : ixgbe_validate_option(&adapter->atr_sample_rate, 0.00 : 18ba: 48 8d bb dc 1b 00 00 lea 0x1bdc(%rbx),%rdi 0.00 : 18c1: 48 c7 c6 00 00 00 00 mov $0x0,%rsi 0.00 : 18c8: e8 23 fa ff ff callq 12f0 : &opt); : DPRINTK(PROBE, INFO, "%s %d\n", atr_string, 0.00 : 18cd: f6 83 a8 14 00 00 02 testb $0x2,0x14a8(%rbx) 0.00 : 18d4: 0f 84 ec fe ff ff je 17c6 0.00 : 18da: 48 8b b3 00 02 00 00 mov 0x200(%rbx),%rsi 0.00 : 18e1: 44 8b 83 dc 1b 00 00 mov 0x1bdc(%rbx),%r8d 0.00 : 18e8: 48 c7 c1 00 00 00 00 mov $0x0,%rcx 0.00 : 18ef: 48 c7 c2 00 00 00 00 mov $0x0,%rdx 0.00 : 18f6: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 0.00 : 18fd: 31 c0 xor %eax,%eax 0.00 : 18ff: e8 00 00 00 00 callq 1904 0.00 : 1904: e9 bd fe ff ff jmpq 17c6 : adapter->atr_sample_rate); : } : } else { : adapter->atr_sample_rate = opt.def; 0.00 : 1909: 8b 05 00 00 00 00 mov 0x0(%rip),%eax # 190f 0.00 : 190f: 89 83 dc 1b 00 00 mov %eax,0x1bdc(%rbx) 0.00 : 1915: e9 ac fe ff ff jmpq 17c6 : }; : #ifdef module_param_array : if (num_allow_unsupported_sfp > bd) { : #endif : unsigned int enable_unsupported_sfp = : allow_unsupported_sfp[bd]; 0.00 : 191a: 42 8b 04 ad 00 00 00 mov 0x0(,%r13,4),%eax 0.00 : 1921: 00 : ixgbe_validate_option(&enable_unsupported_sfp, &opt); 0.00 : 1922: 48 8d bc 24 9c 00 00 lea 0x9c(%rsp),%rdi 0.00 : 1929: 00 0.00 : 192a: 48 89 e6 mov %rsp,%rsi : }; : #ifdef module_param_array : if (num_allow_unsupported_sfp > bd) { : #endif : unsigned int enable_unsupported_sfp = : allow_unsupported_sfp[bd]; 0.00 : 192d: 89 84 24 9c 00 00 00 mov %eax,0x9c(%rsp) : ixgbe_validate_option(&enable_unsupported_sfp, &opt); 0.00 : 1934: e8 b7 f9 ff ff callq 12f0 : if (enable_unsupported_sfp) { : adapter->hw.allow_unsupported_sfp = true; 0.00 : 1939: 8b 84 24 9c 00 00 00 mov 0x9c(%rsp),%eax 0.00 : 1940: 85 c0 test %eax,%eax 0.00 : 1942: 0f 95 83 a1 14 00 00 setne 0x14a1(%rbx) 0.00 : 1949: e9 5e ff ff ff jmpq 18ac : : #endif : #ifdef module_param_array : if (num_LRO > bd) { : #endif : unsigned int lro = LRO[bd]; 0.00 : 194e: 42 8b 04 ad 00 00 00 mov 0x0(,%r13,4),%eax 0.00 : 1955: 00 : ixgbe_validate_option(&lro, &opt); 0.00 : 1956: 48 8d bc 24 9c 00 00 lea 0x9c(%rsp),%rdi 0.00 : 195d: 00 0.00 : 195e: 48 89 d6 mov %rdx,%rsi : : #endif : #ifdef module_param_array : if (num_LRO > bd) { : #endif : unsigned int lro = LRO[bd]; 0.00 : 1961: 89 84 24 9c 00 00 00 mov %eax,0x9c(%rsp) : ixgbe_validate_option(&lro, &opt); 0.00 : 1968: e8 83 f9 ff ff callq 12f0 : if (lro) 0.00 : 196d: 8b 94 24 9c 00 00 00 mov 0x9c(%rsp),%edx 0.00 : 1974: 85 d2 test %edx,%edx 0.00 : 1976: 0f 85 f2 fe ff ff jne 186e : netdev->features |= NETIF_F_LRO; : else : netdev->features &= ~NETIF_F_LRO; 0.00 : 197c: 81 a5 b0 00 00 00 ff andl $0xffff7fff,0xb0(%rbp) 0.00 : 1983: 7f ff ff 0.00 : 1986: e9 ed fe ff ff jmpq 1878 : }; : static const char atr_string[] = : "ATR Tx Packet sample rate set to"; : : if (adapter->hw.mac.type == ixgbe_mac_82598EB) { : adapter->atr_sample_rate = IXGBE_ATR_SAMPLE_RATE_OFF; 0.00 : 198b: c7 83 dc 1b 00 00 00 movl $0x0,0x1bdc(%rbx) 0.00 : 1992: 00 00 00 0.00 : 1995: e9 2c fe ff ff jmpq 17c6 : char pstring[10]; : : if (adapter->hw.mac.type == ixgbe_mac_82598EB) { : adapter->fdir_pballoc = IXGBE_FDIR_PBALLOC_NONE; : } else if (num_FdirPballoc > bd) { : fdir_pballoc_mode = FdirPballoc[bd]; 0.00 : 199a: 42 8b 04 ad 00 00 00 mov 0x0(,%r13,4),%eax 0.00 : 19a1: 00 : ixgbe_validate_option(&fdir_pballoc_mode, &opt); 0.00 : 19a2: 48 8d bc 24 9c 00 00 lea 0x9c(%rsp),%rdi 0.00 : 19a9: 00 0.00 : 19aa: 48 c7 c6 00 00 00 00 mov $0x0,%rsi : char pstring[10]; : : if (adapter->hw.mac.type == ixgbe_mac_82598EB) { : adapter->fdir_pballoc = IXGBE_FDIR_PBALLOC_NONE; : } else if (num_FdirPballoc > bd) { : fdir_pballoc_mode = FdirPballoc[bd]; 0.00 : 19b1: 89 84 24 9c 00 00 00 mov %eax,0x9c(%rsp) : ixgbe_validate_option(&fdir_pballoc_mode, &opt); 0.00 : 19b8: e8 33 f9 ff ff callq 12f0 : switch (fdir_pballoc_mode) { 0.00 : 19bd: 8b 84 24 9c 00 00 00 mov 0x9c(%rsp),%eax 0.00 : 19c4: 83 f8 02 cmp $0x2,%eax 0.00 : 19c7: 0f 84 bf 00 00 00 je 1a8c 0.00 : 19cd: 83 f8 03 cmp $0x3,%eax 0.00 : 19d0: 0f 84 8a 00 00 00 je 1a60 : sprintf(pstring, "128kB"); : break; : case IXGBE_FDIR_PBALLOC_64K: : default: : adapter->fdir_pballoc = IXGBE_FDIR_PBALLOC_64K; : sprintf(pstring, "64kB"); 0.00 : 19d6: 48 8d 8c 24 90 00 00 lea 0x90(%rsp),%rcx 0.00 : 19dd: 00 : adapter->fdir_pballoc = IXGBE_FDIR_PBALLOC_128K; : sprintf(pstring, "128kB"); : break; : case IXGBE_FDIR_PBALLOC_64K: : default: : adapter->fdir_pballoc = IXGBE_FDIR_PBALLOC_64K; 0.00 : 19de: c7 83 d8 1b 00 00 01 movl $0x1,0x1bd8(%rbx) 0.00 : 19e5: 00 00 00 : sprintf(pstring, "64kB"); 0.00 : 19e8: c7 84 24 90 00 00 00 movl $0x426b3436,0x90(%rsp) 0.00 : 19ef: 36 34 6b 42 0.00 : 19f3: c6 84 24 94 00 00 00 movb $0x0,0x94(%rsp) 0.00 : 19fa: 00 : break; : } : DPRINTK(PROBE, INFO, "Flow Director will be allocated " 0.00 : 19fb: f6 83 a8 14 00 00 02 testb $0x2,0x14a8(%rbx) 0.00 : 1a02: 0f 84 8e fd ff ff je 1796 0.00 : 1a08: 48 8b b3 00 02 00 00 mov 0x200(%rbx),%rsi 0.00 : 1a0f: 48 c7 c2 00 00 00 00 mov $0x0,%rdx 0.00 : 1a16: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 0.00 : 1a1d: 31 c0 xor %eax,%eax 0.00 : 1a1f: e8 00 00 00 00 callq 1a24 0.00 : 1a24: e9 6d fd ff ff jmpq 1796 : .max = IXGBE_FDIR_PBALLOC_256K} } : }; : char pstring[10]; : : if (adapter->hw.mac.type == ixgbe_mac_82598EB) { : adapter->fdir_pballoc = IXGBE_FDIR_PBALLOC_NONE; 0.00 : 1a29: c7 83 d8 1b 00 00 00 movl $0x0,0x1bd8(%rbx) 0.00 : 1a30: 00 00 00 0.00 : 1a33: e9 5e fd ff ff jmpq 1796 : adapter->lli_vlan_pri = LLIVLANP[bd]; : if (adapter->lli_vlan_pri) { : ixgbe_validate_option(&adapter->lli_vlan_pri, : &opt); : } else { : DPRINTK(PROBE, INFO, "%s turned off\n", 0.00 : 1a38: 48 8b b3 00 02 00 00 mov 0x200(%rbx),%rsi 0.00 : 1a3f: 48 8b 0d 00 00 00 00 mov 0x0(%rip),%rcx # 1a46 0.00 : 1a46: 48 c7 c2 00 00 00 00 mov $0x0,%rdx 0.00 : 1a4d: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 0.00 : 1a54: 31 c0 xor %eax,%eax 0.00 : 1a56: e8 00 00 00 00 callq 1a5b 0.00 : 1a5b: e9 10 fd ff ff jmpq 1770 : } else if (num_FdirPballoc > bd) { : fdir_pballoc_mode = FdirPballoc[bd]; : ixgbe_validate_option(&fdir_pballoc_mode, &opt); : switch (fdir_pballoc_mode) { : case IXGBE_FDIR_PBALLOC_256K: : adapter->fdir_pballoc = IXGBE_FDIR_PBALLOC_256K; 0.00 : 1a60: c7 83 d8 1b 00 00 03 movl $0x3,0x1bd8(%rbx) 0.00 : 1a67: 00 00 00 : sprintf(pstring, "256kB"); 0.00 : 1a6a: 48 8d 8c 24 90 00 00 lea 0x90(%rsp),%rcx 0.00 : 1a71: 00 0.00 : 1a72: c7 84 24 90 00 00 00 movl $0x6b363532,0x90(%rsp) 0.00 : 1a79: 32 35 36 6b 0.00 : 1a7d: 66 c7 84 24 94 00 00 movw $0x42,0x94(%rsp) 0.00 : 1a84: 00 42 00 : break; 0.00 : 1a87: e9 6f ff ff ff jmpq 19fb : case IXGBE_FDIR_PBALLOC_128K: : adapter->fdir_pballoc = IXGBE_FDIR_PBALLOC_128K; 0.00 : 1a8c: c7 83 d8 1b 00 00 02 movl $0x2,0x1bd8(%rbx) 0.00 : 1a93: 00 00 00 : sprintf(pstring, "128kB"); 0.00 : 1a96: 48 8d 8c 24 90 00 00 lea 0x90(%rsp),%rcx 0.00 : 1a9d: 00 0.00 : 1a9e: c7 84 24 90 00 00 00 movl $0x6b383231,0x90(%rsp) 0.00 : 1aa5: 31 32 38 6b 0.00 : 1aa9: 66 c7 84 24 94 00 00 movw $0x42,0x94(%rsp) 0.00 : 1ab0: 00 42 00 : break; 0.00 : 1ab3: e9 43 ff ff ff jmpq 19fb : #ifdef module_param_array : if (num_LLIVLANP > bd) { : #endif : adapter->lli_vlan_pri = LLIVLANP[bd]; : if (adapter->lli_vlan_pri) { : ixgbe_validate_option(&adapter->lli_vlan_pri, 0.00 : 1ab8: 48 8d bb fc 1a 00 00 lea 0x1afc(%rbx),%rdi 0.00 : 1abf: 48 c7 c6 00 00 00 00 mov $0x0,%rsi 0.00 : 1ac6: e8 25 f8 ff ff callq 12f0 0.00 : 1acb: e9 a0 fc ff ff jmpq 1770 : DPRINTK(PROBE, INFO, "%s turned off\n", : opt.name); : } : #ifdef module_param_array : } else { : adapter->lli_vlan_pri = opt.def; 0.00 : 1ad0: 8b 05 00 00 00 00 mov 0x0(%rip),%eax # 1ad6 0.00 : 1ad6: 89 83 fc 1a 00 00 mov %eax,0x1afc(%rbx) 0.00 : 1adc: e9 8f fc ff ff jmpq 1770 : adapter->lli_etype = LLIEType[bd]; : if (adapter->lli_etype) { : ixgbe_validate_option(&adapter->lli_etype, : &opt); : } else { : DPRINTK(PROBE, INFO, "%s turned off\n", 0.00 : 1ae1: 48 8b b3 00 02 00 00 mov 0x200(%rbx),%rsi 0.00 : 1ae8: 48 8b 0d 00 00 00 00 mov 0x0(%rip),%rcx # 1aef 0.00 : 1aef: 48 c7 c2 00 00 00 00 mov $0x0,%rdx 0.00 : 1af6: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 0.00 : 1afd: 31 c0 xor %eax,%eax 0.00 : 1aff: e8 00 00 00 00 callq 1b04 0.00 : 1b04: e9 37 fc ff ff jmpq 1740 : #ifdef module_param_array : if (num_LLIEType > bd) { : #endif : adapter->lli_etype = LLIEType[bd]; : if (adapter->lli_etype) { : ixgbe_validate_option(&adapter->lli_etype, 0.00 : 1b09: 48 8d bb f8 1a 00 00 lea 0x1af8(%rbx),%rdi 0.00 : 1b10: 48 c7 c6 00 00 00 00 mov $0x0,%rsi 0.00 : 1b17: e8 d4 f7 ff ff callq 12f0 0.00 : 1b1c: e9 1f fc ff ff jmpq 1740 : DPRINTK(PROBE, INFO, "%s turned off\n", : opt.name); : } : #ifdef module_param_array : } else { : adapter->lli_etype = opt.def; 0.00 : 1b21: 8b 05 00 00 00 00 mov 0x0(%rip),%eax # 1b27 0.00 : 1b27: 89 83 f8 1a 00 00 mov %eax,0x1af8(%rbx) 0.00 : 1b2d: e9 0e fc ff ff jmpq 1740 : }; : : #ifdef module_param_array : if (num_LLIPush > bd) { : #endif : unsigned int lli_push = LLIPush[bd]; 0.00 : 1b32: 42 8b 04 ad 00 00 00 mov 0x0(,%r13,4),%eax 0.00 : 1b39: 00 : ixgbe_validate_option(&lli_push, &opt); 0.00 : 1b3a: 48 8d bc 24 9c 00 00 lea 0x9c(%rsp),%rdi 0.00 : 1b41: 00 0.00 : 1b42: 48 c7 c6 00 00 00 00 mov $0x0,%rsi : }; : : #ifdef module_param_array : if (num_LLIPush > bd) { : #endif : unsigned int lli_push = LLIPush[bd]; 0.00 : 1b49: 89 84 24 9c 00 00 00 mov %eax,0x9c(%rsp) : ixgbe_validate_option(&lli_push, &opt); 0.00 : 1b50: e8 9b f7 ff ff callq 12f0 : if (lli_push) 0.00 : 1b55: 8b b4 24 9c 00 00 00 mov 0x9c(%rsp),%esi 0.00 : 1b5c: 85 f6 test %esi,%esi 0.00 : 1b5e: 0f 84 a5 fb ff ff je 1709 : else : *aflags &= ~IXGBE_FLAG_LLI_PUSH; : #ifdef module_param_array : } else { : if (opt.def == OPTION_ENABLED) : *aflags |= IXGBE_FLAG_LLI_PUSH; 0.00 : 1b64: 83 8b 18 02 00 00 10 orl $0x10,0x218(%rbx) 0.00 : 1b6b: e9 a0 fb ff ff jmpq 1710 : #endif : adapter->lli_size = LLISize[bd]; : if (adapter->lli_size) { : ixgbe_validate_option(&adapter->lli_size, &opt); : } else { : DPRINTK(PROBE, INFO, "%s turned off\n", 0.00 : 1b70: 48 8b b3 00 02 00 00 mov 0x200(%rbx),%rsi 0.00 : 1b77: 48 8b 0d 00 00 00 00 mov 0x0(%rip),%rcx # 1b7e 0.00 : 1b7e: 48 c7 c2 00 00 00 00 mov $0x0,%rdx 0.00 : 1b85: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 0.00 : 1b8c: 31 c0 xor %eax,%eax 0.00 : 1b8e: e8 00 00 00 00 callq 1b93 0.00 : 1b93: e9 57 fb ff ff jmpq 16ef : #ifdef module_param_array : if (num_LLISize > bd) { : #endif : adapter->lli_size = LLISize[bd]; : if (adapter->lli_size) { : ixgbe_validate_option(&adapter->lli_size, &opt); 0.00 : 1b98: 48 8d bb f4 1a 00 00 lea 0x1af4(%rbx),%rdi 0.00 : 1b9f: 48 c7 c6 00 00 00 00 mov $0x0,%rsi 0.00 : 1ba6: e8 45 f7 ff ff callq 12f0 0.00 : 1bab: e9 3f fb ff ff jmpq 16ef : DPRINTK(PROBE, INFO, "%s turned off\n", : opt.name); : } : #ifdef module_param_array : } else { : adapter->lli_size = opt.def; 0.00 : 1bb0: 8b 05 00 00 00 00 mov 0x0(%rip),%eax # 1bb6 0.00 : 1bb6: 89 83 f4 1a 00 00 mov %eax,0x1af4(%rbx) 0.00 : 1bbc: e9 2e fb ff ff jmpq 16ef : #endif : adapter->lli_port = LLIPort[bd]; : if (adapter->lli_port) { : ixgbe_validate_option(&adapter->lli_port, &opt); : } else { : DPRINTK(PROBE, INFO, "%s turned off\n", 0.00 : 1bc1: 48 8b b3 00 02 00 00 mov 0x200(%rbx),%rsi 0.00 : 1bc8: 48 8b 0d 00 00 00 00 mov 0x0(%rip),%rcx # 1bcf 0.00 : 1bcf: 48 c7 c2 00 00 00 00 mov $0x0,%rdx 0.00 : 1bd6: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 0.00 : 1bdd: 31 c0 xor %eax,%eax 0.00 : 1bdf: e8 00 00 00 00 callq 1be4 0.00 : 1be4: e9 d6 fa ff ff jmpq 16bf : #ifdef module_param_array : if (num_LLIPort > bd) { : #endif : adapter->lli_port = LLIPort[bd]; : if (adapter->lli_port) { : ixgbe_validate_option(&adapter->lli_port, &opt); 0.00 : 1be9: 48 8d bb f0 1a 00 00 lea 0x1af0(%rbx),%rdi 0.00 : 1bf0: 48 c7 c6 00 00 00 00 mov $0x0,%rsi 0.00 : 1bf7: e8 f4 f6 ff ff callq 12f0 0.00 : 1bfc: e9 be fa ff ff jmpq 16bf : DPRINTK(PROBE, INFO, "%s turned off\n", : opt.name); : } : #ifdef module_param_array : } else { : adapter->lli_port = opt.def; 0.00 : 1c01: 8b 05 00 00 00 00 mov 0x0(%rip),%eax # 1c07 0.00 : 1c07: 89 83 f0 1a 00 00 mov %eax,0x1af0(%rbx) 0.00 : 1c0d: e9 ad fa ff ff jmpq 16bf : if (num_InterruptThrottleRate > bd) { : #endif : u32 itr = InterruptThrottleRate[bd]; : switch (itr) { : case 0: : DPRINTK(PROBE, INFO, "%s turned off\n", 0.00 : 1c12: 48 8b b3 00 02 00 00 mov 0x200(%rbx),%rsi 0.00 : 1c19: 48 8b 0d 00 00 00 00 mov 0x0(%rip),%rcx # 1c20 0.00 : 1c20: 48 c7 c2 00 00 00 00 mov $0x0,%rdx 0.00 : 1c27: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 0.00 : 1c2e: 31 c0 xor %eax,%eax 0.00 : 1c30: e8 00 00 00 00 callq 1c35 0.00 : 1c35: e9 3e fa ff ff jmpq 1678 : : #ifdef module_param_array : if (num_InterruptThrottleRate > bd) { : #endif : u32 itr = InterruptThrottleRate[bd]; : switch (itr) { 0.00 : 1c3a: 83 e8 01 sub $0x1,%eax 0.00 : 1c3d: 74 50 je 1c8f : DPRINTK(PROBE, INFO, "dynamic interrupt " : "throttling enabled\n"); : adapter->rx_itr_setting = 1; : break; : default: : ixgbe_validate_option(&itr, &opt); 0.00 : 1c3f: 48 8d bc 24 9c 00 00 lea 0x9c(%rsp),%rdi 0.00 : 1c46: 00 0.00 : 1c47: 48 c7 c6 00 00 00 00 mov $0x0,%rsi 0.00 : 1c4e: e8 9d f6 ff ff callq 12f0 : /* the first bit is used as control */ : adapter->rx_itr_setting = (1000000/itr) << 2; 0.00 : 1c53: b8 40 42 0f 00 mov $0xf4240,%eax 0.00 : 1c58: 31 d2 xor %edx,%edx 0.00 : 1c5a: f7 b4 24 9c 00 00 00 divl 0x9c(%rsp) 0.00 : 1c61: c1 e0 02 shl $0x2,%eax 0.00 : 1c64: 66 89 83 2c 02 00 00 mov %ax,0x22c(%rbx) 0.00 : 1c6b: e9 11 fa ff ff jmpq 1681 : break; : } : adapter->tx_itr_setting = adapter->rx_itr_setting; : #ifdef module_param_array : } else { : adapter->rx_itr_setting = opt.def; 0.00 : 1c70: 8b 05 00 00 00 00 mov 0x0(%rip),%eax # 1c76 0.00 : 1c76: 66 89 83 2c 02 00 00 mov %ax,0x22c(%rbx) : adapter->tx_itr_setting = opt.def; 0.00 : 1c7d: 8b 05 00 00 00 00 mov 0x0(%rip),%eax # 1c83 0.00 : 1c83: 66 89 83 24 02 00 00 mov %ax,0x224(%rbx) 0.00 : 1c8a: e9 00 fa ff ff jmpq 168f : DPRINTK(PROBE, INFO, "%s turned off\n", : opt.name); : adapter->rx_itr_setting = 0; : break; : case 1: : DPRINTK(PROBE, INFO, "dynamic interrupt " 0.00 : 1c8f: f6 83 a8 14 00 00 02 testb $0x2,0x14a8(%rbx) 0.00 : 1c96: 0f 85 a5 01 00 00 jne 1e41 : "throttling enabled\n"); : adapter->rx_itr_setting = 1; 0.00 : 1c9c: 66 c7 83 2c 02 00 00 movw $0x1,0x22c(%rbx) 0.00 : 1ca3: 01 00 : break; 0.00 : 1ca5: e9 d7 f9 ff ff jmpq 1681 : }; : : #ifdef module_param_array : if (num_L2LBen > bd) { : #endif : unsigned int l2LBen = L2LBen[bd]; 0.00 : 1caa: 42 8b 04 ad 00 00 00 mov 0x0(,%r13,4),%eax 0.00 : 1cb1: 00 : ixgbe_validate_option(&l2LBen, &opt); 0.00 : 1cb2: 48 8d bc 24 9c 00 00 lea 0x9c(%rsp),%rdi 0.00 : 1cb9: 00 0.00 : 1cba: 48 c7 c6 00 00 00 00 mov $0x0,%rsi : }; : : #ifdef module_param_array : if (num_L2LBen > bd) { : #endif : unsigned int l2LBen = L2LBen[bd]; 0.00 : 1cc1: 89 84 24 9c 00 00 00 mov %eax,0x9c(%rsp) : ixgbe_validate_option(&l2LBen, &opt); 0.00 : 1cc8: e8 23 f6 ff ff callq 12f0 : if (l2LBen) 0.00 : 1ccd: 8b bc 24 9c 00 00 00 mov 0x9c(%rsp),%edi 0.00 : 1cd4: 85 ff test %edi,%edi 0.00 : 1cd6: 0f 84 6b f9 ff ff je 1647 : adapter->flags |= : IXGBE_FLAG_SRIOV_L2LOOPBACK_ENABLE; : #ifdef module_param_array : } else { : if (opt.def == OPTION_ENABLED) : adapter->flags |= 0.00 : 1cdc: 81 8b 18 02 00 00 00 orl $0x800000,0x218(%rbx) 0.00 : 1ce3: 00 80 00 0.00 : 1ce6: e9 5c f9 ff ff jmpq 1647 : } else { : if (opt.def == OPTION_DISABLED) { : adapter->num_vfs = 0; : *aflags &= ~IXGBE_FLAG_SRIOV_ENABLED; : } else { : adapter->num_vfs = opt.def; 0.00 : 1ceb: 89 83 58 7c 00 00 mov %eax,0x7c58(%rbx) : *aflags |= IXGBE_FLAG_SRIOV_ENABLED; 0.00 : 1cf1: 81 8b 18 02 00 00 00 orl $0x100000,0x218(%rbx) 0.00 : 1cf8: 00 10 00 0.00 : 1cfb: e9 f3 f8 ff ff jmpq 15f3 : }; : : #ifdef module_param_array : if (num_max_vfs > bd) { : #endif : unsigned int vfs = max_vfs[bd]; 0.00 : 1d00: 42 8b 04 ad 00 00 00 mov 0x0(,%r13,4),%eax 0.00 : 1d07: 00 : if (ixgbe_validate_option(&vfs, &opt)) { 0.00 : 1d08: 48 8d bc 24 9c 00 00 lea 0x9c(%rsp),%rdi 0.00 : 1d0f: 00 0.00 : 1d10: 48 c7 c6 00 00 00 00 mov $0x0,%rsi : }; : : #ifdef module_param_array : if (num_max_vfs > bd) { : #endif : unsigned int vfs = max_vfs[bd]; 0.00 : 1d17: 89 84 24 9c 00 00 00 mov %eax,0x9c(%rsp) : if (ixgbe_validate_option(&vfs, &opt)) { 0.00 : 1d1e: e8 cd f5 ff ff callq 12f0 0.00 : 1d23: 85 c0 test %eax,%eax 0.00 : 1d25: 74 14 je 1d3b : vfs = 0; : DPRINTK(PROBE, INFO, 0.00 : 1d27: f6 83 a8 14 00 00 02 testb $0x2,0x14a8(%rbx) : #ifdef module_param_array : if (num_max_vfs > bd) { : #endif : unsigned int vfs = max_vfs[bd]; : if (ixgbe_validate_option(&vfs, &opt)) { : vfs = 0; 0.00 : 1d2e: c7 84 24 9c 00 00 00 movl $0x0,0x9c(%rsp) 0.00 : 1d35: 00 00 00 00 : DPRINTK(PROBE, INFO, 0.00 : 1d39: 75 17 jne 1d52 : "max_vfs out of range " : "Disabling SR-IOV.\n"); : } : : adapter->num_vfs = vfs; 0.00 : 1d3b: 8b 84 24 9c 00 00 00 mov 0x9c(%rsp),%eax : : if (vfs) 0.00 : 1d42: 85 c0 test %eax,%eax : DPRINTK(PROBE, INFO, : "max_vfs out of range " : "Disabling SR-IOV.\n"); : } : : adapter->num_vfs = vfs; 0.00 : 1d44: 89 83 58 7c 00 00 mov %eax,0x7c58(%rbx) : : if (vfs) 0.00 : 1d4a: 0f 84 99 f8 ff ff je 15e9 0.00 : 1d50: eb 9f jmp 1cf1 : if (num_max_vfs > bd) { : #endif : unsigned int vfs = max_vfs[bd]; : if (ixgbe_validate_option(&vfs, &opt)) { : vfs = 0; : DPRINTK(PROBE, INFO, 0.00 : 1d52: 48 8b b3 00 02 00 00 mov 0x200(%rbx),%rsi 0.00 : 1d59: 48 c7 c2 00 00 00 00 mov $0x0,%rdx 0.00 : 1d60: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 0.00 : 1d67: 31 c0 xor %eax,%eax 0.00 : 1d69: e8 00 00 00 00 callq 1d6e 0.00 : 1d6e: eb cb jmp 1d3b : #endif : : /* Check Interoperability */ : if (*aflags & IXGBE_FLAG_SRIOV_ENABLED) { : if (!(*aflags & IXGBE_FLAG_SRIOV_CAPABLE)) { : DPRINTK(PROBE, INFO, 0.00 : 1d70: 48 8b b3 00 02 00 00 mov 0x200(%rbx),%rsi 0.00 : 1d77: 48 c7 c2 00 00 00 00 mov $0x0,%rdx 0.00 : 1d7e: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 0.00 : 1d85: 31 c0 xor %eax,%eax 0.00 : 1d87: e8 00 00 00 00 callq 1d8c 0.00 : 1d8c: 8b 83 18 02 00 00 mov 0x218(%rbx),%eax 0.00 : 1d92: e9 81 f8 ff ff jmpq 1618 : "IOV is not supported on this " : "hardware. Disabling IOV.\n"); : *aflags &= ~IXGBE_FLAG_SRIOV_ENABLED; : adapter->num_vfs = 0; : } else if (!(*aflags & IXGBE_FLAG_MQ_CAPABLE)) { 0.00 : 1d97: f6 c4 02 test $0x2,%ah 0.00 : 1d9a: 0f 85 8d f8 ff ff jne 162d : DPRINTK(PROBE, INFO, 0.00 : 1da0: f6 83 a8 14 00 00 02 testb $0x2,0x14a8(%rbx) 0.00 : 1da7: 0f 84 6b f8 ff ff je 1618 0.00 : 1dad: 48 8b b3 00 02 00 00 mov 0x200(%rbx),%rsi 0.00 : 1db4: 48 c7 c2 00 00 00 00 mov $0x0,%rdx 0.00 : 1dbb: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 0.00 : 1dc2: 31 c0 xor %eax,%eax 0.00 : 1dc4: e8 00 00 00 00 callq 1dc9 0.00 : 1dc9: 8b 83 18 02 00 00 mov 0x218(%rbx),%eax 0.00 : 1dcf: e9 44 f8 ff ff jmpq 1618 : } else { : if (opt.def == OPTION_ENABLED) : *aflags |= IXGBE_FLAG_FCOE_CAPABLE; : } : #endif : DPRINTK(PROBE, INFO, "FCoE Offload feature %sabled\n", 0.00 : 1dd4: f6 83 1a 02 00 00 02 testb $0x2,0x21a(%rbx) 0.00 : 1ddb: 48 8b b3 00 02 00 00 mov 0x200(%rbx),%rsi 0.00 : 1de2: 48 c7 c0 00 00 00 00 mov $0x0,%rax 0.00 : 1de9: 48 c7 c1 00 00 00 00 mov $0x0,%rcx 0.00 : 1df0: 48 c7 c2 00 00 00 00 mov $0x0,%rdx 0.00 : 1df7: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 0.00 : 1dfe: 48 0f 45 c8 cmovne %rax,%rcx 0.00 : 1e02: 31 c0 xor %eax,%eax 0.00 : 1e04: e8 00 00 00 00 callq 1e09 0.00 : 1e09: e9 20 fa ff ff jmpq 182e : .def = OPTION_ENABLED : }; : #ifdef module_param_array : if (num_FCoE > bd) { : #endif : unsigned int fcoe = FCoE[bd]; 0.00 : 1e0e: 42 8b 04 ad 00 00 00 mov 0x0(,%r13,4),%eax 0.00 : 1e15: 00 : : ixgbe_validate_option(&fcoe, &opt); 0.00 : 1e16: 48 8d bc 24 9c 00 00 lea 0x9c(%rsp),%rdi 0.00 : 1e1d: 00 0.00 : 1e1e: 48 89 d6 mov %rdx,%rsi : .def = OPTION_ENABLED : }; : #ifdef module_param_array : if (num_FCoE > bd) { : #endif : unsigned int fcoe = FCoE[bd]; 0.00 : 1e21: 89 84 24 9c 00 00 00 mov %eax,0x9c(%rsp) : : ixgbe_validate_option(&fcoe, &opt); 0.00 : 1e28: e8 c3 f4 ff ff callq 12f0 : if (fcoe) 0.00 : 1e2d: 8b 8c 24 9c 00 00 00 mov 0x9c(%rsp),%ecx 0.00 : 1e34: 85 c9 test %ecx,%ecx 0.00 : 1e36: 0f 84 e5 f9 ff ff je 1821 0.00 : 1e3c: e9 d6 f9 ff ff jmpq 1817 : DPRINTK(PROBE, INFO, "%s turned off\n", : opt.name); : adapter->rx_itr_setting = 0; : break; : case 1: : DPRINTK(PROBE, INFO, "dynamic interrupt " 0.00 : 1e41: 48 8b b3 00 02 00 00 mov 0x200(%rbx),%rsi 0.00 : 1e48: 48 c7 c2 00 00 00 00 mov $0x0,%rdx 0.00 : 1e4f: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 0.00 : 1e56: 31 c0 xor %eax,%eax 0.00 : 1e58: e8 00 00 00 00 callq 1e5d 0.00 : 1e5d: e9 3a fe ff ff jmpq 1c9c : #ifdef module_param_array : } else { : if (opt.def == OPTION_DISABLED) : *aflags &= ~IXGBE_FLAG_VMDQ_ENABLED; : else : *aflags |= IXGBE_FLAG_VMDQ_ENABLED; 0.00 : 1e62: 81 8b 18 02 00 00 00 orl $0x800,0x218(%rbx) 0.00 : 1e69: 08 00 00 0.00 : 1e6c: e9 17 f7 ff ff jmpq 1588 : } : : #ifdef module_param_array : if (num_VMDQ > bd) { : #endif : unsigned int vmdq = VMDQ[bd]; 0.00 : 1e71: 42 8b 04 ad 00 00 00 mov 0x0(,%r13,4),%eax 0.00 : 1e78: 00 : : ixgbe_validate_option(&vmdq, &opt); 0.00 : 1e79: 48 8d bc 24 9c 00 00 lea 0x9c(%rsp),%rdi 0.00 : 1e80: 00 0.00 : 1e81: 48 c7 c6 00 00 00 00 mov $0x0,%rsi : } : : #ifdef module_param_array : if (num_VMDQ > bd) { : #endif : unsigned int vmdq = VMDQ[bd]; 0.00 : 1e88: 89 84 24 9c 00 00 00 mov %eax,0x9c(%rsp) : : ixgbe_validate_option(&vmdq, &opt); 0.00 : 1e8f: e8 5c f4 ff ff callq 12f0 : : /* zero or one both mean disabled from our driver's : * perspective */ : if (vmdq > 1) 0.00 : 1e94: 83 bc 24 9c 00 00 00 cmpl $0x1,0x9c(%rsp) 0.00 : 1e9b: 01 0.00 : 1e9c: 76 6e jbe 1f0c : *aflags |= IXGBE_FLAG_VMDQ_ENABLED; 0.00 : 1e9e: 81 8b 18 02 00 00 00 orl $0x800,0x218(%rbx) 0.00 : 1ea5: 08 00 00 : else : *aflags &= ~IXGBE_FLAG_VMDQ_ENABLED; : : feature[RING_F_VMDQ].limit = vmdq; 0.00 : 1ea8: 8b 84 24 9c 00 00 00 mov 0x9c(%rsp),%eax 0.00 : 1eaf: 66 89 83 d0 0b 00 00 mov %ax,0xbd0(%rbx) 0.00 : 1eb6: e9 da f6 ff ff jmpq 1595 : feature[RING_F_FDIR].limit = rss; : : feature[RING_F_RSS].limit = rss; : #ifdef module_param_array : } else if (opt.def == 0) { : rss = min_t(int, IXGBE_MAX_RSS_INDICES, 0.00 : 1ebb: 48 8b 3d 00 00 00 00 mov 0x0(%rip),%rdi # 1ec2 0.00 : 1ec2: e8 00 00 00 00 callq 1ec7 0.00 : 1ec7: ba 10 00 00 00 mov $0x10,%edx 0.00 : 1ecc: 83 f8 10 cmp $0x10,%eax 0.00 : 1ecf: 0f 4e d0 cmovle %eax,%edx 0.00 : 1ed2: 89 94 24 9c 00 00 00 mov %edx,0x9c(%rsp) : num_online_cpus()); : feature[RING_F_RSS].limit = rss; 0.00 : 1ed9: 66 89 93 d8 0b 00 00 mov %dx,0xbd8(%rbx) 0.00 : 1ee0: e9 3a f6 ff ff jmpq 151f : } : #endif : /* Check Interoperability */ : if (*aflags & IXGBE_FLAG_VMDQ_ENABLED) { : if (!(*aflags & IXGBE_FLAG_MQ_CAPABLE)) { : DPRINTK(PROBE, INFO, 0.00 : 1ee5: 48 8b b3 00 02 00 00 mov 0x200(%rbx),%rsi 0.00 : 1eec: 48 c7 c2 00 00 00 00 mov $0x0,%rdx 0.00 : 1ef3: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 0.00 : 1efa: 31 c0 xor %eax,%eax 0.00 : 1efc: e8 00 00 00 00 callq 1f01 0.00 : 1f01: 8b 83 18 02 00 00 mov 0x218(%rbx),%eax 0.00 : 1f07: e9 a6 f6 ff ff jmpq 15b2 : /* zero or one both mean disabled from our driver's : * perspective */ : if (vmdq > 1) : *aflags |= IXGBE_FLAG_VMDQ_ENABLED; : else : *aflags &= ~IXGBE_FLAG_VMDQ_ENABLED; 0.00 : 1f0c: 81 a3 18 02 00 00 ff andl $0xfffff7ff,0x218(%rbx) 0.00 : 1f13: f7 ff ff 0.00 : 1f16: eb 90 jmp 1ea8 : unsigned int rss = RSS[bd]; : : #ifdef module_param_array : if (num_RSS > bd) { : #endif : ixgbe_validate_option(&rss, &opt); 0.00 : 1f18: 48 8d bc 24 9c 00 00 lea 0x9c(%rsp),%rdi 0.00 : 1f1f: 00 0.00 : 1f20: 48 c7 c6 00 00 00 00 mov $0x0,%rsi 0.00 : 1f27: e8 c4 f3 ff ff callq 12f0 : /* base it off num_online_cpus() with hardware limit */ : if (!rss) 0.00 : 1f2c: 8b 84 24 9c 00 00 00 mov 0x9c(%rsp),%eax 0.00 : 1f33: 85 c0 test %eax,%eax 0.00 : 1f35: 74 22 je 1f59 : rss = min_t(int, IXGBE_MAX_RSS_INDICES, : num_online_cpus()); : else : feature[RING_F_FDIR].limit = rss; 0.00 : 1f37: 66 89 83 e0 0b 00 00 mov %ax,0xbe0(%rbx) : : feature[RING_F_RSS].limit = rss; 0.00 : 1f3e: 66 89 83 d8 0b 00 00 mov %ax,0xbd8(%rbx) 0.00 : 1f45: e9 d5 f5 ff ff jmpq 151f : if (opt.def == OPTION_DISABLED) : *aflags &= ~IXGBE_FLAG_DCA_CAPABLE; : } : #endif : if (dca == IXGBE_MAX_DCA) : adapter->flags |= IXGBE_FLAG_DCA_ENABLED_DATA; 0.00 : 1f4a: 81 8b 18 02 00 00 00 orl $0x100,0x218(%rbx) 0.00 : 1f51: 01 00 00 0.00 : 1f54: e9 9a f5 ff ff jmpq 14f3 : if (num_RSS > bd) { : #endif : ixgbe_validate_option(&rss, &opt); : /* base it off num_online_cpus() with hardware limit */ : if (!rss) : rss = min_t(int, IXGBE_MAX_RSS_INDICES, 0.00 : 1f59: 48 8b 3d 00 00 00 00 mov 0x0(%rip),%rdi # 1f60 0.00 : 1f60: e8 00 00 00 00 callq 1f65 0.00 : 1f65: ba 10 00 00 00 mov $0x10,%edx 0.00 : 1f6a: 83 f8 10 cmp $0x10,%eax 0.00 : 1f6d: 0f 4e d0 cmovle %eax,%edx 0.00 : 1f70: 89 94 24 9c 00 00 00 mov %edx,0x9c(%rsp) 0.00 : 1f77: 89 d0 mov %edx,%eax 0.00 : 1f79: eb c3 jmp 1f3e : unsigned int dca = opt.def; : : #ifdef module_param_array : if (num_DCA > bd) { : #endif : dca = DCA[bd]; 0.00 : 1f7b: 42 8b 04 ad 00 00 00 mov 0x0(,%r13,4),%eax 0.00 : 1f82: 00 : ixgbe_validate_option(&dca, &opt); 0.00 : 1f83: 48 8d bc 24 9c 00 00 lea 0x9c(%rsp),%rdi 0.00 : 1f8a: 00 0.00 : 1f8b: 48 c7 c6 00 00 00 00 mov $0x0,%rsi : unsigned int dca = opt.def; : : #ifdef module_param_array : if (num_DCA > bd) { : #endif : dca = DCA[bd]; 0.00 : 1f92: 89 84 24 9c 00 00 00 mov %eax,0x9c(%rsp) : ixgbe_validate_option(&dca, &opt); 0.00 : 1f99: e8 52 f3 ff ff callq 12f0 : if (!dca) 0.00 : 1f9e: 44 8b 9c 24 9c 00 00 mov 0x9c(%rsp),%r11d 0.00 : 1fa5: 00 0.00 : 1fa6: 45 85 db test %r11d,%r11d 0.00 : 1fa9: 75 0a jne 1fb5 : *aflags &= ~IXGBE_FLAG_DCA_CAPABLE; 0.00 : 1fab: 81 a3 18 02 00 00 7f andl $0xffffff7f,0x218(%rbx) 0.00 : 1fb2: ff ff ff : : /* Check Interoperability */ : if (!(*aflags & IXGBE_FLAG_DCA_CAPABLE)) { 0.00 : 1fb5: 8b 83 18 02 00 00 mov 0x218(%rbx),%eax 0.00 : 1fbb: 84 c0 test %al,%al 0.00 : 1fbd: 78 12 js 1fd1 : DPRINTK(PROBE, INFO, "DCA is disabled\n"); 0.00 : 1fbf: f6 83 a8 14 00 00 02 testb $0x2,0x14a8(%rbx) 0.00 : 1fc6: 75 50 jne 2018 : *aflags &= ~IXGBE_FLAG_DCA_ENABLED; 0.00 : 1fc8: 83 e0 bf and $0xffffffbf,%eax 0.00 : 1fcb: 89 83 18 02 00 00 mov %eax,0x218(%rbx) : } : : if (dca == IXGBE_MAX_DCA) { 0.00 : 1fd1: 83 bc 24 9c 00 00 00 cmpl $0x2,0x9c(%rsp) 0.00 : 1fd8: 02 0.00 : 1fd9: 0f 85 14 f5 ff ff jne 14f3 : DPRINTK(PROBE, INFO, 0.00 : 1fdf: f6 83 a8 14 00 00 02 testb $0x2,0x14a8(%rbx) 0.00 : 1fe6: 75 54 jne 203c : "DCA enabled for rx data\n"); : adapter->flags |= IXGBE_FLAG_DCA_ENABLED_DATA; 0.00 : 1fe8: 81 8b 18 02 00 00 00 orl $0x100,0x218(%rbx) 0.00 : 1fef: 01 00 00 0.00 : 1ff2: e9 ee f4 ff ff jmpq 14e5 : } : #endif : /* Check Interoperability */ : if (rss > 1) { : if (!(*aflags & IXGBE_FLAG_MQ_CAPABLE)) { : DPRINTK(PROBE, INFO, 0.00 : 1ff7: 48 8b b3 00 02 00 00 mov 0x200(%rbx),%rsi 0.00 : 1ffe: 48 c7 c2 00 00 00 00 mov $0x0,%rdx 0.00 : 2005: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 0.00 : 200c: 31 c0 xor %eax,%eax 0.00 : 200e: e8 00 00 00 00 callq 2013 0.00 : 2013: e9 27 f5 ff ff jmpq 153f : if (!dca) : *aflags &= ~IXGBE_FLAG_DCA_CAPABLE; : : /* Check Interoperability */ : if (!(*aflags & IXGBE_FLAG_DCA_CAPABLE)) { : DPRINTK(PROBE, INFO, "DCA is disabled\n"); 0.00 : 2018: 48 8b b3 00 02 00 00 mov 0x200(%rbx),%rsi 0.00 : 201f: 48 c7 c2 00 00 00 00 mov $0x0,%rdx 0.00 : 2026: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 0.00 : 202d: 31 c0 xor %eax,%eax 0.00 : 202f: e8 00 00 00 00 callq 2034 0.00 : 2034: 8b 83 18 02 00 00 mov 0x218(%rbx),%eax 0.00 : 203a: eb 8c jmp 1fc8 : *aflags &= ~IXGBE_FLAG_DCA_ENABLED; : } : : if (dca == IXGBE_MAX_DCA) { : DPRINTK(PROBE, INFO, 0.00 : 203c: 48 8b b3 00 02 00 00 mov 0x200(%rbx),%rsi 0.00 : 2043: 48 c7 c2 00 00 00 00 mov $0x0,%rdx 0.00 : 204a: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 0.00 : 2051: 31 c0 xor %eax,%eax 0.00 : 2053: e8 00 00 00 00 callq 2058 0.00 : 2058: eb 8e jmp 1fe8 : } : #endif : /* Check Interoperability */ : if ((*aflags & IXGBE_FLAG_MQ_CAPABLE) && : !(*aflags & IXGBE_FLAG_MSIX_CAPABLE)) { : DPRINTK(PROBE, INFO, 0.00 : 205a: f6 83 a8 14 00 00 02 testb $0x2,0x14a8(%rbx) 0.00 : 2061: 75 4f jne 20b2 : "Multiple queues are not supported while MSI-X " : "is disabled. Disabling Multiple Queues.\n"); : *aflags &= ~IXGBE_FLAG_MQ_CAPABLE; 0.00 : 2063: 80 e6 fd and $0xfd,%dh 0.00 : 2066: 89 93 18 02 00 00 mov %edx,0x218(%rbx) 0.00 : 206c: e9 44 f4 ff ff jmpq 14b5 : }; : : #ifdef module_param_array : if (num_MQ > bd) { : #endif : unsigned int mq = MQ[bd]; 0.00 : 2071: 42 8b 04 ad 00 00 00 mov 0x0(,%r13,4),%eax 0.00 : 2078: 00 : ixgbe_validate_option(&mq, &opt); 0.00 : 2079: 48 8d bc 24 9c 00 00 lea 0x9c(%rsp),%rdi 0.00 : 2080: 00 0.00 : 2081: 48 c7 c6 00 00 00 00 mov $0x0,%rsi : }; : : #ifdef module_param_array : if (num_MQ > bd) { : #endif : unsigned int mq = MQ[bd]; 0.00 : 2088: 89 84 24 9c 00 00 00 mov %eax,0x9c(%rsp) : ixgbe_validate_option(&mq, &opt); 0.00 : 208f: e8 5c f2 ff ff callq 12f0 : if (mq) 0.00 : 2094: 8b ac 24 9c 00 00 00 mov 0x9c(%rsp),%ebp 0.00 : 209b: 85 ed test %ebp,%ebp 0.00 : 209d: 0f 84 f0 f3 ff ff je 1493 : else : *aflags &= ~IXGBE_FLAG_MQ_CAPABLE; : #ifdef module_param_array : } else { : if (opt.def == OPTION_ENABLED) : *aflags |= IXGBE_FLAG_MQ_CAPABLE; 0.00 : 20a3: 81 8b 18 02 00 00 00 orl $0x200,0x218(%rbx) 0.00 : 20aa: 02 00 00 0.00 : 20ad: e9 eb f3 ff ff jmpq 149d : } : #endif : /* Check Interoperability */ : if ((*aflags & IXGBE_FLAG_MQ_CAPABLE) && : !(*aflags & IXGBE_FLAG_MSIX_CAPABLE)) { : DPRINTK(PROBE, INFO, 0.00 : 20b2: 48 8b b3 00 02 00 00 mov 0x200(%rbx),%rsi 0.00 : 20b9: 48 c7 c2 00 00 00 00 mov $0x0,%rdx 0.00 : 20c0: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 0.00 : 20c7: 31 c0 xor %eax,%eax 0.00 : 20c9: e8 00 00 00 00 callq 20ce 0.00 : 20ce: 8b 93 18 02 00 00 mov 0x218(%rbx),%edx 0.00 : 20d4: eb 8d jmp 2063 : if (int_mode == OPTION_UNSET) : int_mode = InterruptType[bd]; : ixgbe_validate_option(&int_mode, &opt); : switch (int_mode) { : case IXGBE_INT_MSIX: : if (!(*aflags & IXGBE_FLAG_MSIX_CAPABLE)) 0.00 : 20d6: f6 83 18 02 00 00 04 testb $0x4,0x218(%rbx) 0.00 : 20dd: 0f 85 96 f3 ff ff jne 1479 : printk(KERN_INFO 0.00 : 20e3: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 0.00 : 20ea: 31 c0 xor %eax,%eax 0.00 : 20ec: e8 00 00 00 00 callq 20f1 0.00 : 20f1: e9 83 f3 ff ff jmpq 1479 : "Ignoring MSI-X setting; " : "support unavailable\n"); : break; : case IXGBE_INT_MSI: : if (!(*aflags & IXGBE_FLAG_MSI_CAPABLE)) { 0.00 : 20f6: 8b 83 18 02 00 00 mov 0x218(%rbx),%eax 0.00 : 20fc: a8 01 test $0x1,%al 0.00 : 20fe: 74 22 je 2122 : printk(KERN_INFO : "Ignoring MSI setting; " : "support unavailable\n"); : } else { : *aflags &= ~IXGBE_FLAG_MSIX_CAPABLE; 0.00 : 2100: 83 e0 fb and $0xfffffffb,%eax 0.00 : 2103: 89 83 18 02 00 00 mov %eax,0x218(%rbx) 0.00 : 2109: e9 6b f3 ff ff jmpq 1479 : #ifdef module_param_array : if (num_IntMode > bd || num_InterruptType > bd) { : #endif : int_mode = IntMode[bd]; : if (int_mode == OPTION_UNSET) : int_mode = InterruptType[bd]; 0.00 : 210e: 42 8b 04 ad 00 00 00 mov 0x0(,%r13,4),%eax 0.00 : 2115: 00 0.00 : 2116: 89 84 24 9c 00 00 00 mov %eax,0x9c(%rsp) 0.00 : 211d: e9 23 f3 ff ff jmpq 1445 : "Ignoring MSI-X setting; " : "support unavailable\n"); : break; : case IXGBE_INT_MSI: : if (!(*aflags & IXGBE_FLAG_MSI_CAPABLE)) { : printk(KERN_INFO 0.00 : 2122: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 0.00 : 2129: 31 c0 xor %eax,%eax 0.00 : 212b: e8 00 00 00 00 callq 2130 0.00 : 2130: e9 44 f3 ff ff jmpq 1479 : int bd = adapter->bd_number; : u32 *aflags = &adapter->flags; : struct ixgbe_ring_feature *feature = adapter->ring_feature; : : if (bd >= IXGBE_MAX_NIC) { : printk(KERN_NOTICE 0.00 : 2135: 44 89 e6 mov %r12d,%esi 0.00 : 2138: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 0.00 : 213f: 31 c0 xor %eax,%eax 0.00 : 2141: e8 00 00 00 00 callq 2146 : "Warning: no configuration for board #%d\n", bd); : printk(KERN_NOTICE "Using defaults for all values\n"); 0.00 : 2146: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 0.00 : 214d: 31 c0 xor %eax,%eax 0.00 : 214f: e8 00 00 00 00 callq 2154 0.00 : 2154: e9 bb f2 ff ff jmpq 1414 : break; : } : #ifdef module_param_array : } else { : /* default settings */ : if (opt.def == IXGBE_INT_MSIX && 0.00 : 2159: 8b 15 00 00 00 00 mov 0x0(%rip),%edx # 215f 0.00 : 215f: 83 fa 02 cmp $0x2,%edx 0.00 : 2162: 74 1c je 2180 : *aflags & IXGBE_FLAG_MSIX_CAPABLE) { : *aflags |= IXGBE_FLAG_MSIX_CAPABLE; : *aflags |= IXGBE_FLAG_MSI_CAPABLE; : } else if (opt.def == IXGBE_INT_MSI && 0.00 : 2164: 83 ea 01 sub $0x1,%edx : break; : } : #ifdef module_param_array : } else { : /* default settings */ : if (opt.def == IXGBE_INT_MSIX && 0.00 : 2167: 8b 83 18 02 00 00 mov 0x218(%rbx),%eax : *aflags & IXGBE_FLAG_MSIX_CAPABLE) { : *aflags |= IXGBE_FLAG_MSIX_CAPABLE; : *aflags |= IXGBE_FLAG_MSI_CAPABLE; : } else if (opt.def == IXGBE_INT_MSI && 0.00 : 216d: 74 2c je 219b : *aflags & IXGBE_FLAG_MSI_CAPABLE) { : *aflags &= ~IXGBE_FLAG_MSIX_CAPABLE; : *aflags |= IXGBE_FLAG_MSI_CAPABLE; : } else { : *aflags &= ~IXGBE_FLAG_MSIX_CAPABLE; : *aflags &= ~IXGBE_FLAG_MSI_CAPABLE; 0.00 : 216f: 83 e0 fa and $0xfffffffa,%eax 0.00 : 2172: 4d 63 ec movslq %r12d,%r13 0.00 : 2175: 89 83 18 02 00 00 mov %eax,0x218(%rbx) 0.00 : 217b: e9 f9 f2 ff ff jmpq 1479 : break; : } : #ifdef module_param_array : } else { : /* default settings */ : if (opt.def == IXGBE_INT_MSIX && 0.00 : 2180: 8b 83 18 02 00 00 mov 0x218(%rbx),%eax 0.00 : 2186: a8 04 test $0x4,%al 0.00 : 2188: 74 e5 je 216f : *aflags & IXGBE_FLAG_MSIX_CAPABLE) { : *aflags |= IXGBE_FLAG_MSIX_CAPABLE; : *aflags |= IXGBE_FLAG_MSI_CAPABLE; 0.00 : 218a: 83 c8 05 or $0x5,%eax 0.00 : 218d: 4d 63 ec movslq %r12d,%r13 0.00 : 2190: 89 83 18 02 00 00 mov %eax,0x218(%rbx) : break; : } : #ifdef module_param_array : } else { : /* default settings */ : if (opt.def == IXGBE_INT_MSIX && 0.00 : 2196: e9 de f2 ff ff jmpq 1479 : *aflags & IXGBE_FLAG_MSIX_CAPABLE) { : *aflags |= IXGBE_FLAG_MSIX_CAPABLE; : *aflags |= IXGBE_FLAG_MSI_CAPABLE; : } else if (opt.def == IXGBE_INT_MSI && 0.00 : 219b: a8 01 test $0x1,%al 0.00 : 219d: 74 d0 je 216f : *aflags & IXGBE_FLAG_MSI_CAPABLE) { : *aflags &= ~IXGBE_FLAG_MSIX_CAPABLE; : *aflags |= IXGBE_FLAG_MSI_CAPABLE; 0.00 : 219f: 83 e0 fb and $0xfffffffb,%eax 0.00 : 21a2: 4d 63 ec movslq %r12d,%r13 0.00 : 21a5: 83 c8 01 or $0x1,%eax 0.00 : 21a8: 89 83 18 02 00 00 mov %eax,0x218(%rbx) : /* default settings */ : if (opt.def == IXGBE_INT_MSIX && : *aflags & IXGBE_FLAG_MSIX_CAPABLE) { : *aflags |= IXGBE_FLAG_MSIX_CAPABLE; : *aflags |= IXGBE_FLAG_MSI_CAPABLE; : } else if (opt.def == IXGBE_INT_MSI && 100.00 : 21ae: e9 c6 f2 ff ff jmpq 1479 Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------ Sorted summary for file ---------------------------------------------- Nothing higher than 0.5% Percent | Source code & Disassembly of ------------------------------------------------