Sorted summary for file /box/solution-bin ---------------------------------------------- 68.76 /tmp/cpu-mode-161014-1777968439102677985-8/solution/solution.cpp:26 28.96 /tmp/cpu-mode-161014-1777968439102677985-8/solution/solution.cpp:24 2.07 /tmp/cpu-mode-161014-1777968439102677985-8/solution/solution.cpp:27 Samples | Source code & Disassembly of /box/solution-bin for cpu_core/cycles/P (480 samples, percent: local period) ------------------------------------------------------------------------------------------------------------------------- : : : : 3 Disassembly of section .text: : : 5 00000000000011b0
: : : 7 for (; i < n; ++i) cnt += (data[i] == target); : 8 return cnt; : 9 } : : 11 int main() { 0 : 11b0: push rbp 0 : 11b1: mov rbp,rsp 0 : 11b4: push r15 0 : 11b6: push r14 0 : 11b8: push r13 0 : 11ba: push r12 0 : 11bc: push rbx 0 : 11bd: and rsp,0xffffffffffffffe0 0 : 11c1: sub rsp,0xe0 0 : 11c8: lea rsi,[rsp+0x38] : 22 constexpr uint8_t TARGET = 127; : : 24 struct stat st; : 25 if (fstat(STDIN_FILENO, &st) == 0 && S_ISREG(st.st_mode) && st.st_size > 0) { 0 : 11cd: xor edi,edi 0 : 11cf: call 1090 0 : 11d4: test eax,eax 0 : 11d6: je 141b : 30 return 0; : 31 } : 32 } : : 34 constexpr size_t BUFSZ = 1 << 20; : 35 uint8_t* buf = static_cast(std::malloc(BUFSZ)); 0 : 11dc: mov edi,0x100000 0 : 11e1: call 1070 0 : 11e6: mov ebx,0x1 : 39 if (!buf) return 1; 0 : 11eb: test rax,rax 0 : 11ee: je 1633 0 : 11f4: mov r14,rax 0 : 11f7: xor ebx,ebx : : 45 uint64_t ans = 0; : 46 while (true) { : 47 ssize_t got = read(STDIN_FILENO, buf, BUFSZ); 0 : 11f9: mov edx,0x100000 0 : 11fe: xor edi,edi 0 : 1200: mov rsi,rax 0 : 1203: call 1080 : 52 if (got == 0) break; 0 : 1208: test rax,rax 0 : 120b: je 14e5 : 55 if (got < 0) { 0 : 1211: mov r12,r14 0 : 1214: add r12,0xc 0 : 1218: xor r15d,r15d 0 : 121b: movabs r13,0x7fffffffffffffe0 0 : 1225: vpbroadcastb xmm8,BYTE PTR [rip+0xe2a] # 2058 <_IO_stdin_used+0x58> 0 : 122e: vpbroadcastq ymm9,QWORD PTR [rip+0xe19] # 2050 <_IO_stdin_used+0x50> 0 : 1237: vpbroadcastb ymm2,BYTE PTR [rip+0xe18] # 2058 <_IO_stdin_used+0x58> 0 : 1240: vpxor xmm3,xmm3,xmm3 0 : 1244: vmovdqa YMMWORD PTR [rsp],ymm9 0 : 1249: jmp 1289 0 : 124b: nop DWORD PTR [rax+rax*1+0x0] : 67 if (errno == EINTR) continue; : 68 std::free(buf); : 69 return 1; : 70 } : 71 ans += count_target_avx2(buf, static_cast(got), TARGET); 0 : 1250: add r15,rdx : 73 ssize_t got = read(STDIN_FILENO, buf, BUFSZ); 0 : 1253: mov edx,0x100000 0 : 1258: xor edi,edi 0 : 125a: mov rsi,r14 0 : 125d: vzeroupper 0 : 1260: call 1080 : 79 if (got == 0) break; 0 : 1265: test rax,rax 0 : 1268: vpbroadcastb xmm8,BYTE PTR [rip+0xde7] # 2058 <_IO_stdin_used+0x58> 0 : 1271: vmovdqa ymm9,YMMWORD PTR [rsp] 0 : 1276: vpbroadcastb ymm2,BYTE PTR [rip+0xdd9] # 2058 <_IO_stdin_used+0x58> 0 : 127f: vpxor xmm3,xmm3,xmm3 0 : 1283: je 14e8 : 86 if (got < 0) { 0 : 1289: test rax,rax 0 : 128c: js 1300 : 89 while (i < limit32) { 0 : 128e: mov rsi,rax 0 : 1291: and rsi,r13 0 : 1294: je 1320 0 : 129a: xor edx,edx 0 : 129c: xor ecx,ecx 0 : 129e: jmp 12c4 : 96 __m256i sad = _mm256_sad_epu8(accb, zero); 0 : 12a0: vpsadbw ymm0,ymm0,ymm3 : 98 cnt += lanes[0] + lanes[1] + lanes[2] + lanes[3]; 0 : 12a4: vextracti128 xmm1,ymm0,0x1 0 : 12aa: vpaddq xmm0,xmm0,xmm1 0 : 12ae: vpshufd xmm1,xmm0,0xee 0 : 12b3: vpaddq xmm0,xmm0,xmm1 0 : 12b7: vmovq rdi,xmm0 0 : 12bc: add rdx,rdi : 105 while (i < limit32) { 0 : 12bf: cmp rcx,rsi 0 : 12c2: jae 1324 : 108 size_t block_end = i + 32 * 240; 0 : 12c4: lea rdi,[rcx+0x1e00] : 110 if (block_end > limit32) block_end = limit32; 0 : 12cb: cmp rdi,rsi 0 : 12ce: cmovae rdi,rsi 0 : 12d2: vpxor xmm0,xmm0,xmm0 : 114 for (; i < block_end; i += 32) { 0 : 12d6: cmp rsi,rcx 0 : 12d9: jbe 12a0 0 : 12db: nop DWORD PTR [rax+rax*1+0x0] : 118 __m256i m = _mm256_cmpeq_epi8(v, t); 0 : 12e0: vpcmpeqb ymm1,ymm2,YMMWORD PTR [r14+rcx*1] : 120 accb = _mm256_sub_epi8(accb, m); 0 : 12e6: vpsubb ymm0,ymm0,ymm1 : 122 for (; i < block_end; i += 32) { 0 : 12ea: add rcx,0x20 0 : 12ee: cmp rcx,rdi 0 : 12f1: jb 12e0 0 : 12f3: jmp 12a0 0 : 12f5: data16 cs nop WORD PTR [rax+rax*1+0x0] : 128 if (errno == EINTR) continue; 0 : 1300: vzeroupper 0 : 1303: call 1030 <__errno_location@plt> 0 : 1308: cmp DWORD PTR [rax],0x4 0 : 130b: je 1253 0 : 1311: jmp 1509 0 : 1316: cs nop WORD PTR [rax+rax*1+0x0] 0 : 1320: xor ecx,ecx 0 : 1322: xor edx,edx : 137 for (; i < n; ++i) cnt += (data[i] == target); 0 : 1324: mov rsi,rax 0 : 1327: sub rsi,rcx 0 : 132a: jbe 1250 0 : 1330: cmp rsi,0x10 0 : 1334: jb 1400 0 : 133a: mov rdi,rsi 0 : 133d: and rdi,0xfffffffffffffff0 0 : 1341: vmovq xmm0,rdx 0 : 1346: lea rdx,[r12+rcx*1] 0 : 134a: add rcx,rdi 0 : 134d: vpxor xmm1,xmm1,xmm1 0 : 1351: xor r8d,r8d 0 : 1354: vpxor xmm2,xmm2,xmm2 0 : 1358: vpxor xmm3,xmm3,xmm3 0 : 135c: nop DWORD PTR [rax+0x0] 0 : 1360: vmovd xmm4,DWORD PTR [rdx+r8*1-0xc] 0 : 1367: vmovd xmm5,DWORD PTR [rdx+r8*1-0x8] 0 : 136e: vmovd xmm6,DWORD PTR [rdx+r8*1-0x4] 0 : 1375: vmovd xmm7,DWORD PTR [rdx+r8*1] 0 : 137b: vpcmpeqb xmm4,xmm8,xmm4 0 : 137f: vpmovzxbq ymm4,xmm4 0 : 1384: vpand ymm4,ymm9,ymm4 0 : 1388: vpaddq ymm0,ymm0,ymm4 0 : 138c: vpcmpeqb xmm4,xmm8,xmm5 0 : 1390: vpmovzxbq ymm4,xmm4 0 : 1395: vpand ymm4,ymm9,ymm4 0 : 1399: vpaddq ymm1,ymm1,ymm4 0 : 139d: vpcmpeqb xmm4,xmm8,xmm6 0 : 13a1: vpmovzxbq ymm4,xmm4 0 : 13a6: vpand ymm4,ymm9,ymm4 0 : 13aa: vpaddq ymm2,ymm2,ymm4 0 : 13ae: vpcmpeqb xmm4,xmm8,xmm7 0 : 13b2: vpmovzxbq ymm4,xmm4 0 : 13b7: vpand ymm4,ymm9,ymm4 0 : 13bb: vpaddq ymm3,ymm3,ymm4 0 : 13bf: add r8,0x10 0 : 13c3: cmp rdi,r8 0 : 13c6: jne 1360 0 : 13c8: vpaddq ymm0,ymm1,ymm0 0 : 13cc: vpaddq ymm0,ymm2,ymm0 0 : 13d0: vpaddq ymm0,ymm3,ymm0 0 : 13d4: vextracti128 xmm1,ymm0,0x1 0 : 13da: vpaddq xmm0,xmm0,xmm1 0 : 13de: vpshufd xmm1,xmm0,0xee 0 : 13e3: vpaddq xmm0,xmm0,xmm1 0 : 13e7: vmovq rdx,xmm0 0 : 13ec: cmp rsi,rdi 0 : 13ef: je 1250 0 : 13f5: data16 cs nop WORD PTR [rax+rax*1+0x0] 0 : 1400: xor esi,esi 0 : 1402: cmp BYTE PTR [r14+rcx*1],0x7f 0 : 1407: sete sil 0 : 140b: add rdx,rsi 0 : 140e: inc rcx 0 : 1411: cmp rax,rcx 0 : 1414: jne 1400 0 : 1416: jmp 1250 0 : 141b: mov eax,0xf000 : 196 if (fstat(STDIN_FILENO, &st) == 0 && S_ISREG(st.st_mode) && st.st_size > 0) { 0 : 1420: and eax,DWORD PTR [rsp+0x50] 0 : 1424: cmp eax,0x8000 0 : 1429: jne 11dc 0 : 142f: mov r14,QWORD PTR [rsp+0x68] 0 : 1434: test r14,r14 0 : 1437: jle 11dc : 203 void* p = mmap(nullptr, n, PROT_READ, MAP_PRIVATE, STDIN_FILENO, 0); 0 : 143d: xor edi,edi 0 : 143f: mov rsi,r14 0 : 1442: mov edx,0x1 0 : 1447: mov ecx,0x2 0 : 144c: xor r8d,r8d 0 : 144f: xor r9d,r9d 0 : 1452: call 10a0 : 211 if (p != MAP_FAILED) { 0 : 1457: cmp rax,0xffffffffffffffff 0 : 145b: je 11dc 0 : 1461: mov r15,rax : 215 while (i < limit32) { 0 : 1464: mov rcx,r14 0 : 1467: and rcx,0xffffffffffffffe0 0 : 146b: je 151b 0 : 1471: xor esi,esi 0 : 1473: vpbroadcastb ymm0,BYTE PTR [rip+0xbdc] # 2058 <_IO_stdin_used+0x58> 0 : 147c: vpxor xmm1,xmm1,xmm1 0 : 1480: xor eax,eax 0 : 1482: jmp 14b4 0 : 1484: data16 data16 cs nop WORD PTR [rax+rax*1+0x0] : 225 __m256i sad = _mm256_sad_epu8(accb, zero); 0 : 1490: vpsadbw ymm2,ymm2,ymm1 : 227 cnt += lanes[0] + lanes[1] + lanes[2] + lanes[3]; 0 : 1494: vextracti128 xmm3,ymm2,0x1 0 : 149a: vpaddq xmm2,xmm2,xmm3 0 : 149e: vpshufd xmm3,xmm2,0xee 0 : 14a3: vpaddq xmm2,xmm2,xmm3 0 : 14a7: vmovq rdx,xmm2 1 : 14ac: add rsi,rdx : 234 while (i < limit32) { 0 : 14af: cmp rax,rcx 0 : 14b2: jae 151f : 237 size_t block_end = i + 32 * 240; 0 : 14b4: lea rdx,[rax+0x1e00] : 239 if (block_end > limit32) block_end = limit32; 0 : 14bb: cmp rdx,rcx 0 : 14be: cmovae rdx,rcx 0 : 14c2: vpxor xmm2,xmm2,xmm2 : 243 for (; i < block_end; i += 32) { 0 : 14c6: cmp rcx,rax 0 : 14c9: jbe 1490 0 : 14cb: nop DWORD PTR [rax+rax*1+0x0] : 247 __m256i m = _mm256_cmpeq_epi8(v, t); 330 : 14d0: vpcmpeqb ymm3,ymm0,YMMWORD PTR [r15+rax*1] // /tmp/cpu-mode-161014-1777968439102677985-8/solution/solution.cpp:26 : 249 accb = _mm256_sub_epi8(accb, m); 10 : 14d6: vpsubb ymm2,ymm2,ymm3 // /tmp/cpu-mode-161014-1777968439102677985-8/solution/solution.cpp:27 : 251 for (; i < block_end; i += 32) { 59 : 14da: add rax,0x20 // /tmp/cpu-mode-161014-1777968439102677985-8/solution/solution.cpp:24 0 : 14de: cmp rax,rdx 80 : 14e1: jb 14d0 0 : 14e3: jmp 1490 0 : 14e5: xor r15d,r15d : 257 } : : 259 std::printf("%llu\n", static_cast(ans)); 0 : 14e8: lea rdi,[rip+0xb6a] # 2059 <_IO_stdin_used+0x59> 0 : 14ef: mov rsi,r15 0 : 14f2: xor eax,eax 0 : 14f4: vzeroupper 0 : 14f7: call 1040 : 265 std::free(buf); 0 : 14fc: mov rdi,r14 0 : 14ff: call 1060 0 : 1504: jmp 1633 : 269 std::free(buf); 0 : 1509: mov rdi,r14 0 : 150c: call 1060 0 : 1511: mov ebx,0x1 0 : 1516: jmp 1633 0 : 151b: xor eax,eax 0 : 151d: xor esi,esi : 276 for (; i < n; ++i) cnt += (data[i] == target); 0 : 151f: mov rcx,r14 0 : 1522: sub rcx,rax 0 : 1525: jbe 1615 0 : 152b: cmp rcx,0x10 0 : 152f: jb 1600 0 : 1535: mov rdx,rcx 0 : 1538: and rdx,0xfffffffffffffff0 0 : 153c: vmovq xmm0,rsi 0 : 1541: lea rsi,[rax+r15*1] 0 : 1545: add rsi,0xc 0 : 1549: add rax,rdx 0 : 154c: vpxor xmm1,xmm1,xmm1 0 : 1550: xor edi,edi 0 : 1552: vpbroadcastb xmm2,BYTE PTR [rip+0xafd] # 2058 <_IO_stdin_used+0x58> 0 : 155b: vpbroadcastq ymm3,QWORD PTR [rip+0xaec] # 2050 <_IO_stdin_used+0x50> 0 : 1564: vpxor xmm4,xmm4,xmm4 0 : 1568: vpxor xmm5,xmm5,xmm5 0 : 156c: nop DWORD PTR [rax+0x0] 0 : 1570: vmovd xmm6,DWORD PTR [rsi+rdi*1-0xc] 0 : 1576: vmovd xmm7,DWORD PTR [rsi+rdi*1-0x8] 0 : 157c: vmovd xmm8,DWORD PTR [rsi+rdi*1-0x4] 0 : 1582: vmovd xmm9,DWORD PTR [rsi+rdi*1] 0 : 1587: vpcmpeqb xmm6,xmm6,xmm2 0 : 158b: vpmovzxbq ymm6,xmm6 0 : 1590: vpand ymm6,ymm6,ymm3 0 : 1594: vpaddq ymm0,ymm0,ymm6 0 : 1598: vpcmpeqb xmm6,xmm7,xmm2 0 : 159c: vpmovzxbq ymm6,xmm6 0 : 15a1: vpand ymm6,ymm6,ymm3 0 : 15a5: vpaddq ymm1,ymm1,ymm6 0 : 15a9: vpcmpeqb xmm6,xmm8,xmm2 0 : 15ad: vpmovzxbq ymm6,xmm6 0 : 15b2: vpand ymm6,ymm6,ymm3 0 : 15b6: vpaddq ymm4,ymm4,ymm6 0 : 15ba: vpcmpeqb xmm6,xmm9,xmm2 0 : 15be: vpmovzxbq ymm6,xmm6 0 : 15c3: vpand ymm6,ymm6,ymm3 0 : 15c7: vpaddq ymm5,ymm5,ymm6 0 : 15cb: add rdi,0x10 0 : 15cf: cmp rdx,rdi 0 : 15d2: jne 1570 0 : 15d4: vpaddq ymm0,ymm1,ymm0 0 : 15d8: vpaddq ymm0,ymm4,ymm0 0 : 15dc: vpaddq ymm0,ymm5,ymm0 0 : 15e0: vextracti128 xmm1,ymm0,0x1 0 : 15e6: vpaddq xmm0,xmm0,xmm1 0 : 15ea: vpshufd xmm1,xmm0,0xee 0 : 15ef: vpaddq xmm0,xmm0,xmm1 0 : 15f3: vmovq rsi,xmm0 0 : 15f8: cmp rcx,rdx 0 : 15fb: je 1615 0 : 15fd: nop DWORD PTR [rax] 0 : 1600: xor ecx,ecx 0 : 1602: cmp BYTE PTR [r15+rax*1],0x7f 0 : 1607: sete cl 0 : 160a: add rsi,rcx 0 : 160d: inc rax 0 : 1610: cmp r14,rax 0 : 1613: jne 1600 : 336 std::printf("%llu\n", static_cast(ans)); 0 : 1615: lea rdi,[rip+0xa3d] # 2059 <_IO_stdin_used+0x59> 0 : 161c: xor ebx,ebx 0 : 161e: xor eax,eax 0 : 1620: vzeroupper 0 : 1623: call 1040 : 342 munmap(p, n); 0 : 1628: mov rdi,r15 0 : 162b: mov rsi,r14 0 : 162e: call 1050 : 346 return 0; : 347 } 0 : 1633: mov eax,ebx 0 : 1635: lea rsp,[rbp-0x28] 0 : 1639: pop rbx 0 : 163a: pop r12 0 : 163c: pop r13 0 : 163e: pop r14 0 : 1640: pop r15 0 : 1642: pop rbp 0 : 1643: ret