232未満の素数すべてを列挙するアルゴリズムについてのメモ。 ついでに、C++11、Go、Rustの比較もやってみる。
環境
Ubuntu 14.04.4 LTS 64bit版、g++ 4.8.4、Go 1.6.2、Rust 1.8.0
$ uname -a Linux vm-ubuntu64 3.19.0-25-generic #26~14.04.1-Ubuntu SMP Fri Jul 24 21:16:20 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 14.04.4 LTS Release: 14.04 Codename: trusty $ g++ --version g++ (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4 $ go version go version go1.6.2 linux/amd64 $ rustc --version rustc 1.8.0 (db2939409 2016-04-11)
区間ふるいによる素数列挙
単に232未満の最大の素数を求めるだけであれば、232から逆順に試し割りなどの素数判定アルゴリズムを適用すればよい。 一方、232未満のすべての素数を求める場合、素数列挙アルゴリズムを用いる必要がある。
素数列挙アルゴリズムの代表的なものにエラトステネスのふるいがあるが、単純な方法では最初に求めたい区間のテーブルを確保する必要があるため、232のような大きな区間については適用が難しい。 このような場合は、区間ふるい(Segmented Sieve)を用いることにより効率的に素数を列挙することができる。
区間ふるいは次のようなアルゴリズムである。
- 求めたい区間
[M, N]
の最大値N
に対し、sqrt(N)
以下の素数Ps
をエラトステネスのふるいで列挙する [M, N]
の区間についてテーブルを確保し、Ps
の倍数となる数をふるいにかける[M, N]
の区間が大きい場合は、適度な大きさに分割してそれぞれふるいにかければよい
232の区間を216ごとに分割する例について、C++11でコードで書くと次のようになる。
// sieve.cpp #include <iostream> #include <cstdint> #include <bitset> #include <vector> using namespace std; int main() { bitset<1<<16> is_composite; vector<uint32_t> primes; uint32_t i, j, k; for (i=2; i<1<<8; i++) { if (is_composite[i]) { continue; } for (j=i*2; j<1<<16; j+=i) { is_composite[j] = 1; } } for (i=2; i<1<<16; i++) { if (!is_composite[i]) { cout << i << endl; primes.push_back(i); } } for (k=1; k<1<<16; k++) { is_composite.reset(); uint32_t offset = k * (1<<16); for (auto p : primes) { i = offset + (p - offset % p) % p; while (i - offset < 1<<16) { is_composite[i - offset] = 1; i += p; } } for (i=0; i<1<<16; i++) { if (!is_composite[i]) { cout << offset + i << endl; } } } return 0; }
比較の目的も兼ねて、GoおよびRustで同様のコードを書くと次のようになる。
// sieve.go package main import "fmt" func main() { var is_composite [1<<16]bool primes := []uint32{} for i := 2; i < 1<<8; i++ { if is_composite[i] { continue; } for j := i*2; j < 1<<16; j += i { is_composite[j] = true; } } for i := uint32(2); i < 1<<16; i++ { if !is_composite[i] { fmt.Println(i) primes = append(primes, i) } } for k := 1; k < 1<<16; k++ { for i := range is_composite { is_composite[i] = false } offset := uint32(k * (1<<16)) for _, p := range primes { j := offset + (p - offset % p) % p for j - offset < 1<<16 { is_composite[j - offset] = true j += p } } for i := uint32(0); i < 1<<16; i++ { if !is_composite[i] { fmt.Println(offset + i) } } } }
// sieve.rs fn main() { let mut is_composite = [false; 1<<16]; let mut primes = vec![]; for i in 2..1<<8 { if is_composite[i] { continue; } let mut j = i*2; while j < 1<<16 { is_composite[j] = true; j += i; } } for i in 2..1<<16 { if !is_composite[i] { println!("{}", i); primes.push(i); } } for k in 1..1<<16 { is_composite = [false; 1<<16]; let offset = k * (1<<16); for &p in primes.iter() { let mut i = offset + (p - offset % p) % p; while i - offset < 1<<16 { is_composite[i - offset] = true; i += p; } } for i in 0..1<<16 { if !is_composite[i] { println!("{}", offset + i); } } } }
コンパイルにかかる時間を調べてみる。
$ time g++ -O2 -std=c++11 sieve.cpp -o sieve_cpp real 0m0.341s user 0m0.316s sys 0m0.020s $ time go build -o sieve_go sieve.go real 0m0.434s user 0m0.552s sys 0m0.088s $ time rustc -O sieve.rs -o sieve_rs real 0m0.405s user 0m0.372s sys 0m0.032s
コンパイル時間には大きな差がないことがわかる。
次に、実行にかかる時間を調べてみる。
$ time ./sieve_cpp >sieve_cpp.log real 6m10.568s user 1m29.476s sys 4m18.960s $ time ./sieve_go >sieve_go.log real 7m4.716s user 2m19.144s sys 4m33.612s $ time ./sieve_rs >sieve_rs.log real 6m21.845s user 1m44.284s sys 4m14.080s
ここではディスクI/O含むカーネル処理の時間(sys)は重要でないため、userに注目する。 C++とRustには大きな差がないが、Goは1分ほど長く時間がかかっていることがわかる。
生成される実行ファイルのサイズを調べてみる。
$ ls -l sieve_* -rwxr-xr-x 1 user user 13812 May 6 07:48 sieve_cpp* -rw-r--r-- 1 user user 2178719347 May 6 07:30 sieve_cpp.log -rwxr-xr-x 1 user user 2292936 May 6 07:48 sieve_go* -rw-r--r-- 1 user user 2178719347 May 6 07:38 sieve_go.log -rwxr-xr-x 1 user user 586264 May 6 07:49 sieve_rs* -rw-r--r-- 1 user user 2178719347 May 6 07:47 sieve_rs.log
ランタイムライブラリを含まないC++が最も小さく、Rust、Goと続くことがわかる。 また、同一の出力結果が得られていることも確認できる。
出力結果の内容を確認してみる。
$ tail sieve_cpp.log 4294967029 4294967087 4294967111 4294967143 4294967161 4294967189 4294967197 4294967231 4294967279 4294967291 $ factor 4294967291 4294967291: 4294967291 $ python -c "print 1<<32" 4294967296
上の結果から、232未満の最大の素数が4294967291であることが確認できる。
参考:生成されるアセンブリコード
ここでは、main関数に相当する部分のみを抜き出す。
$ objdump -d sieve_cpp | c++filt | awk '/<main/,/^$/' 00000000004009e0 <main>: 4009e0: 41 57 push r15 4009e2: b9 00 04 00 00 mov ecx,0x400 4009e7: 31 c0 xor eax,eax 4009e9: 41 b8 03 00 00 00 mov r8d,0x3 4009ef: be 02 00 00 00 mov esi,0x2 4009f4: 41 56 push r14 4009f6: 41 55 push r13 4009f8: 41 54 push r12 4009fa: 55 push rbp 4009fb: 53 push rbx 4009fc: 48 81 ec 38 20 00 00 sub rsp,0x2038 400a03: 48 8d 6c 24 30 lea rbp,[rsp+0x30] 400a08: 48 c7 44 24 10 00 00 mov QWORD PTR [rsp+0x10],0x0 400a0f: 00 00 400a11: 48 c7 44 24 18 00 00 mov QWORD PTR [rsp+0x18],0x0 400a18: 00 00 400a1a: 48 c7 44 24 20 00 00 mov QWORD PTR [rsp+0x20],0x0 400a21: 00 00 400a23: c7 44 24 0c 02 00 00 mov DWORD PTR [rsp+0xc],0x2 400a2a: 00 400a2b: 48 89 ef mov rdi,rbp 400a2e: f3 48 ab rep stos QWORD PTR es:[rdi],rax 400a31: bf 01 00 00 00 mov edi,0x1 400a36: 48 89 fa mov rdx,rdi 400a39: 89 f1 mov ecx,esi 400a3b: 48 d3 e2 shl rdx,cl 400a3e: 48 85 c2 test rdx,rax 400a41: 75 1e jne 400a61 <main+0x81> 400a43: 8d 0c 36 lea ecx,[rsi+rsi*1] 400a46: 89 c8 mov eax,ecx 400a48: 48 89 fa mov rdx,rdi 400a4b: 48 d3 e2 shl rdx,cl 400a4e: 48 c1 e8 06 shr rax,0x6 400a52: 01 f1 add ecx,esi 400a54: 48 09 54 c4 30 or QWORD PTR [rsp+rax*8+0x30],rdx 400a59: 81 f9 ff ff 00 00 cmp ecx,0xffff 400a5f: 76 e5 jbe 400a46 <main+0x66> 400a61: 83 c6 01 add esi,0x1 400a64: 81 fe 00 01 00 00 cmp esi,0x100 400a6a: 89 74 24 0c mov DWORD PTR [rsp+0xc],esi 400a6e: 74 12 je 400a82 <main+0xa2> 400a70: 4c 89 c0 mov rax,r8 400a73: 49 83 c0 01 add r8,0x1 400a77: 48 c1 e8 06 shr rax,0x6 400a7b: 48 8b 44 c4 30 mov rax,QWORD PTR [rsp+rax*8+0x30] 400a80: eb b4 jmp 400a36 <main+0x56> 400a82: c7 44 24 0c 02 00 00 mov DWORD PTR [rsp+0xc],0x2 400a89: 00 400a8a: b9 02 00 00 00 mov ecx,0x2 400a8f: bb 01 00 00 00 mov ebx,0x1 400a94: eb 17 jmp 400aad <main+0xcd> 400a96: 8b 4c 24 0c mov ecx,DWORD PTR [rsp+0xc] 400a9a: 83 c1 01 add ecx,0x1 400a9d: 81 f9 ff ff 00 00 cmp ecx,0xffff 400aa3: 89 4c 24 0c mov DWORD PTR [rsp+0xc],ecx 400aa7: 0f 87 9b 00 00 00 ja 400b48 <main+0x168> 400aad: 89 ce mov esi,ecx 400aaf: 48 89 da mov rdx,rbx 400ab2: 48 89 f0 mov rax,rsi 400ab5: 48 d3 e2 shl rdx,cl 400ab8: 48 c1 e8 06 shr rax,0x6 400abc: 48 85 54 c4 30 test QWORD PTR [rsp+rax*8+0x30],rdx 400ac1: 75 d3 jne 400a96 <main+0xb6> 400ac3: bf a0 20 60 00 mov edi,0x6020a0 400ac8: e8 c3 fe ff ff call 400990 <std::basic_ostream<char, std::char_traits<char> >& std::basic_ostream<char, std::char_traits<char> >::_M_insert<unsigned long>(unsigned long)@plt> 400acd: 49 89 c5 mov r13,rax 400ad0: 48 8b 00 mov rax,QWORD PTR [rax] 400ad3: 48 8b 40 e8 mov rax,QWORD PTR [rax-0x18] 400ad7: 4d 8b a4 05 f0 00 00 mov r12,QWORD PTR [r13+rax*1+0xf0] 400ade: 00 400adf: 4d 85 e4 test r12,r12 400ae2: 0f 84 13 02 00 00 je 400cfb <main+0x31b> 400ae8: 41 80 7c 24 38 00 cmp BYTE PTR [r12+0x38],0x0 400aee: 0f 84 72 01 00 00 je 400c66 <main+0x286> 400af4: 41 0f b6 44 24 43 movzx eax,BYTE PTR [r12+0x43] 400afa: 0f be f0 movsx esi,al 400afd: 4c 89 ef mov rdi,r13 400b00: e8 cb fe ff ff call 4009d0 <std::basic_ostream<char, std::char_traits<char> >::put(char)@plt> 400b05: 48 89 c7 mov rdi,rax 400b08: e8 73 fe ff ff call 400980 <std::basic_ostream<char, std::char_traits<char> >::flush()@plt> 400b0d: 48 8b 44 24 18 mov rax,QWORD PTR [rsp+0x18] 400b12: 48 3b 44 24 20 cmp rax,QWORD PTR [rsp+0x20] 400b17: 0f 84 65 01 00 00 je 400c82 <main+0x2a2> 400b1d: 48 85 c0 test rax,rax 400b20: 8b 4c 24 0c mov ecx,DWORD PTR [rsp+0xc] 400b24: 74 06 je 400b2c <main+0x14c> 400b26: 89 08 mov DWORD PTR [rax],ecx 400b28: 8b 4c 24 0c mov ecx,DWORD PTR [rsp+0xc] 400b2c: 83 c1 01 add ecx,0x1 400b2f: 48 83 c0 04 add rax,0x4 400b33: 81 f9 ff ff 00 00 cmp ecx,0xffff 400b39: 48 89 44 24 18 mov QWORD PTR [rsp+0x18],rax 400b3e: 89 4c 24 0c mov DWORD PTR [rsp+0xc],ecx 400b42: 0f 86 65 ff ff ff jbe 400aad <main+0xcd> 400b48: bb 00 00 01 00 mov ebx,0x10000 400b4d: 45 31 e4 xor r12d,r12d 400b50: 4c 8b 4c 24 10 mov r9,QWORD PTR [rsp+0x10] 400b55: 4c 8b 54 24 18 mov r10,QWORD PTR [rsp+0x18] 400b5a: b9 00 04 00 00 mov ecx,0x400 400b5f: 48 89 ef mov rdi,rbp 400b62: 4c 89 e0 mov rax,r12 400b65: f3 48 ab rep stos QWORD PTR es:[rdi],rax 400b68: 4d 39 d1 cmp r9,r10 400b6b: 0f 84 76 01 00 00 je 400ce7 <main+0x307> 400b71: 41 b8 01 00 00 00 mov r8d,0x1 400b77: 66 0f 1f 84 00 00 00 nop WORD PTR [rax+rax*1+0x0] 400b7e: 00 00 400b80: 41 8b 39 mov edi,DWORD PTR [r9] 400b83: 31 d2 xor edx,edx 400b85: 89 d8 mov eax,ebx 400b87: f7 f7 div edi 400b89: 89 f8 mov eax,edi 400b8b: 29 d0 sub eax,edx 400b8d: 31 d2 xor edx,edx 400b8f: f7 f7 div edi 400b91: 89 d1 mov ecx,edx 400b93: 8d 14 1a lea edx,[rdx+rbx*1] 400b96: 81 f9 ff ff 00 00 cmp ecx,0xffff 400b9c: 89 54 24 0c mov DWORD PTR [rsp+0xc],edx 400ba0: 77 29 ja 400bcb <main+0x1eb> 400ba2: 66 0f 1f 44 00 00 nop WORD PTR [rax+rax*1+0x0] 400ba8: 01 fa add edx,edi 400baa: 4c 89 c0 mov rax,r8 400bad: 89 ce mov esi,ecx 400baf: 48 d3 e0 shl rax,cl 400bb2: 89 d1 mov ecx,edx 400bb4: 48 c1 ee 06 shr rsi,0x6 400bb8: 29 d9 sub ecx,ebx 400bba: 48 09 44 f4 30 or QWORD PTR [rsp+rsi*8+0x30],rax 400bbf: 89 54 24 0c mov DWORD PTR [rsp+0xc],edx 400bc3: 81 f9 ff ff 00 00 cmp ecx,0xffff 400bc9: 76 dd jbe 400ba8 <main+0x1c8> 400bcb: 49 83 c1 04 add r9,0x4 400bcf: 4d 39 ca cmp r10,r9 400bd2: 75 ac jne 400b80 <main+0x1a0> 400bd4: 48 8b 44 24 30 mov rax,QWORD PTR [rsp+0x30] 400bd9: c7 44 24 0c 00 00 00 mov DWORD PTR [rsp+0xc],0x0 400be0: 00 400be1: 31 c9 xor ecx,ecx 400be3: 41 bd 01 00 00 00 mov r13d,0x1 400be9: eb 27 jmp 400c12 <main+0x232> 400beb: 0f 1f 44 00 00 nop DWORD PTR [rax+rax*1+0x0] 400bf0: 8b 44 24 0c mov eax,DWORD PTR [rsp+0xc] 400bf4: 8d 48 01 lea ecx,[rax+0x1] 400bf7: 81 f9 ff ff 00 00 cmp ecx,0xffff 400bfd: 89 4c 24 0c mov DWORD PTR [rsp+0xc],ecx 400c01: 0f 87 b1 00 00 00 ja 400cb8 <main+0x2d8> 400c07: 89 c8 mov eax,ecx 400c09: 48 c1 e8 06 shr rax,0x6 400c0d: 48 8b 44 c4 30 mov rax,QWORD PTR [rsp+rax*8+0x30] 400c12: 4c 89 ea mov rdx,r13 400c15: 48 d3 e2 shl rdx,cl 400c18: 48 85 d0 test rax,rdx 400c1b: 75 d3 jne 400bf0 <main+0x210> 400c1d: 8d 34 19 lea esi,[rcx+rbx*1] 400c20: bf a0 20 60 00 mov edi,0x6020a0 400c25: e8 66 fd ff ff call 400990 <std::basic_ostream<char, std::char_traits<char> >& std::basic_ostream<char, std::char_traits<char> >::_M_insert<unsigned long>(unsigned long)@plt> 400c2a: 49 89 c7 mov r15,rax 400c2d: 48 8b 00 mov rax,QWORD PTR [rax] 400c30: 48 8b 40 e8 mov rax,QWORD PTR [rax-0x18] 400c34: 4d 8b b4 07 f0 00 00 mov r14,QWORD PTR [r15+rax*1+0xf0] 400c3b: 00 400c3c: 4d 85 f6 test r14,r14 400c3f: 0f 84 b1 00 00 00 je 400cf6 <main+0x316> 400c45: 41 80 7e 38 00 cmp BYTE PTR [r14+0x38],0x0 400c4a: 74 54 je 400ca0 <main+0x2c0> 400c4c: 41 0f b6 46 43 movzx eax,BYTE PTR [r14+0x43] 400c51: 0f be f0 movsx esi,al 400c54: 4c 89 ff mov rdi,r15 400c57: e8 74 fd ff ff call 4009d0 <std::basic_ostream<char, std::char_traits<char> >::put(char)@plt> 400c5c: 48 89 c7 mov rdi,rax 400c5f: e8 1c fd ff ff call 400980 <std::basic_ostream<char, std::char_traits<char> >::flush()@plt> 400c64: eb 8a jmp 400bf0 <main+0x210> 400c66: 4c 89 e7 mov rdi,r12 400c69: e8 b2 fc ff ff call 400920 <std::ctype<char>::_M_widen_init() const@plt> 400c6e: 49 8b 04 24 mov rax,QWORD PTR [r12] 400c72: be 0a 00 00 00 mov esi,0xa 400c77: 4c 89 e7 mov rdi,r12 400c7a: ff 50 30 call QWORD PTR [rax+0x30] 400c7d: e9 78 fe ff ff jmp 400afa <main+0x11a> 400c82: 48 8d 74 24 0c lea rsi,[rsp+0xc] 400c87: 48 8d 7c 24 10 lea rdi,[rsp+0x10] 400c8c: e8 9f 01 00 00 call 400e30 <void std::vector<unsigned int, std::allocator<unsigned int> >::_M_emplace_back_aux<unsigned int const&>(unsigned int const&)> 400c91: e9 00 fe ff ff jmp 400a96 <main+0xb6> 400c96: 66 2e 0f 1f 84 00 00 nop WORD PTR cs:[rax+rax*1+0x0] 400c9d: 00 00 00 400ca0: 4c 89 f7 mov rdi,r14 400ca3: e8 78 fc ff ff call 400920 <std::ctype<char>::_M_widen_init() const@plt> 400ca8: 49 8b 06 mov rax,QWORD PTR [r14] 400cab: be 0a 00 00 00 mov esi,0xa 400cb0: 4c 89 f7 mov rdi,r14 400cb3: ff 50 30 call QWORD PTR [rax+0x30] 400cb6: eb 99 jmp 400c51 <main+0x271> 400cb8: 81 c3 00 00 01 00 add ebx,0x10000 400cbe: 0f 85 8c fe ff ff jne 400b50 <main+0x170> 400cc4: 48 8b 7c 24 10 mov rdi,QWORD PTR [rsp+0x10] 400cc9: 48 85 ff test rdi,rdi 400ccc: 74 05 je 400cd3 <main+0x2f3> 400cce: e8 3d fc ff ff call 400910 <operator delete(void*)@plt> 400cd3: 48 81 c4 38 20 00 00 add rsp,0x2038 400cda: 31 c0 xor eax,eax 400cdc: 5b pop rbx 400cdd: 5d pop rbp 400cde: 41 5c pop r12 400ce0: 41 5d pop r13 400ce2: 41 5e pop r14 400ce4: 41 5f pop r15 400ce6: c3 ret 400ce7: c7 44 24 0c 00 00 00 mov DWORD PTR [rsp+0xc],0x0 400cee: 00 400cef: 31 c0 xor eax,eax 400cf1: e9 eb fe ff ff jmp 400be1 <main+0x201> 400cf6: e8 f5 fb ff ff call 4008f0 <std::__throw_bad_cast()@plt> 400cfb: e8 f0 fb ff ff call 4008f0 <std::__throw_bad_cast()@plt> 400d00: 48 8b 7c 24 10 mov rdi,QWORD PTR [rsp+0x10] 400d05: 48 89 c3 mov rbx,rax 400d08: 48 85 ff test rdi,rdi 400d0b: 74 05 je 400d12 <main+0x332> 400d0d: e8 fe fb ff ff call 400910 <operator delete(void*)@plt> 400d12: 48 89 df mov rdi,rbx 400d15: e8 a6 fc ff ff call 4009c0 <_Unwind_Resume@plt> 400d1a: 66 0f 1f 44 00 00 nop WORD PTR [rax+rax*1+0x0]
$ objdump -d sieve_go | c++filt | awk '/<main/,/^$/' 0000000000401000 <main.main>: 401000: 64 48 8b 0c 25 f8 ff mov rcx,QWORD PTR fs:0xfffffffffffffff8 401007: ff ff 401009: 48 8b 71 10 mov rsi,QWORD PTR [rcx+0x10] 40100d: 48 81 fe de fa ff ff cmp rsi,0xfffffffffffffade 401014: 0f 84 de 04 00 00 je 4014f8 <main.main+0x4f8> 40101a: 48 8d 84 24 d0 02 00 lea rax,[rsp+0x2d0] 401021: 00 401022: 48 29 f0 sub rax,rsi 401025: 48 3d 08 03 01 00 cmp rax,0x10308 40102b: 0f 86 c7 04 00 00 jbe 4014f8 <main.main+0x4f8> 401031: 48 81 ec b8 00 01 00 sub rsp,0x100b8 401038: 0f 57 c0 xorps xmm0,xmm0 40103b: 0f 11 84 24 58 00 01 movups XMMWORD PTR [rsp+0x10058],xmm0 401042: 00 401043: 0f 11 84 24 68 00 01 movups XMMWORD PTR [rsp+0x10068],xmm0 40104a: 00 40104b: 0f 11 84 24 78 00 01 movups XMMWORD PTR [rsp+0x10078],xmm0 401052: 00 401053: 48 8d 7c 24 58 lea rdi,[rsp+0x58] 401058: 31 c0 xor eax,eax 40105a: 48 c7 c1 00 20 00 00 mov rcx,0x2000 401061: f3 48 ab rep stos QWORD PTR es:[rdi],rax 401064: 31 db xor ebx,ebx 401066: 48 8d 5c 24 40 lea rbx,[rsp+0x40] 40106b: 48 83 fb 00 cmp rbx,0x0 40106f: 0f 84 7c 04 00 00 je 4014f1 <main.main+0x4f1> 401075: 48 c7 84 24 90 00 01 mov QWORD PTR [rsp+0x10090],0x0 40107c: 00 00 00 00 00 401081: 48 c7 84 24 98 00 01 mov QWORD PTR [rsp+0x10098],0x0 401088: 00 00 00 00 00 40108d: 48 89 9c 24 88 00 01 mov QWORD PTR [rsp+0x10088],rbx 401094: 00 401095: 48 c7 c1 02 00 00 00 mov rcx,0x2 40109c: 48 81 f9 00 01 00 00 cmp rcx,0x100 4010a3: 7d 2e jge 4010d3 <main.main+0xd3> 4010a5: 48 8d 5c 24 58 lea rbx,[rsp+0x58] 4010aa: 48 81 f9 00 00 01 00 cmp rcx,0x10000 4010b1: 0f 83 33 04 00 00 jae 4014ea <main.main+0x4ea> 4010b7: 48 8d 1c 0b lea rbx,[rbx+rcx*1] 4010bb: 0f b6 1b movzx ebx,BYTE PTR [rbx] 4010be: 80 fb 00 cmp bl,0x0 4010c1: 0f 84 f1 03 00 00 je 4014b8 <main.main+0x4b8> 4010c7: 48 ff c1 inc rcx 4010ca: 48 81 f9 00 01 00 00 cmp rcx,0x100 4010d1: 7c d2 jl 4010a5 <main.main+0xa5> 4010d3: ba 02 00 00 00 mov edx,0x2 4010d8: 81 fa 00 00 01 00 cmp edx,0x10000 4010de: 0f 83 3b 01 00 00 jae 40121f <main.main+0x21f> 4010e4: 48 8d 5c 24 58 lea rbx,[rsp+0x58] 4010e9: 8b ea mov ebp,edx 4010eb: 48 81 fd 00 00 01 00 cmp rbp,0x10000 4010f2: 0f 83 b9 03 00 00 jae 4014b1 <main.main+0x4b1> 4010f8: 48 8d 1c 2b lea rbx,[rbx+rbp*1] 4010fc: 0f b6 1b movzx ebx,BYTE PTR [rbx] 4010ff: 80 fb 00 cmp bl,0x0 401102: 0f 85 09 01 00 00 jne 401211 <main.main+0x211> 401108: 89 54 24 48 mov DWORD PTR [rsp+0x48],edx 40110c: 89 54 24 4c mov DWORD PTR [rsp+0x4c],edx 401110: 31 db xor ebx,ebx 401112: 48 89 9c 24 78 00 01 mov QWORD PTR [rsp+0x10078],rbx 401119: 00 40111a: 48 89 9c 24 80 00 01 mov QWORD PTR [rsp+0x10080],rbx 401121: 00 401122: 48 8d 9c 24 78 00 01 lea rbx,[rsp+0x10078] 401129: 00 40112a: 48 83 fb 00 cmp rbx,0x0 40112e: 0f 84 76 03 00 00 je 4014aa <main.main+0x4aa> 401134: 48 c7 84 24 a8 00 01 mov QWORD PTR [rsp+0x100a8],0x1 40113b: 00 01 00 00 00 401140: 48 c7 84 24 b0 00 01 mov QWORD PTR [rsp+0x100b0],0x1 401147: 00 01 00 00 00 40114c: 48 89 9c 24 a0 00 01 mov QWORD PTR [rsp+0x100a0],rbx 401153: 00 401154: 48 8d 1d e5 7e 0b 00 lea rbx,[rip+0xb7ee5] # 4b9040 <type.*+0xe040> 40115b: 48 89 1c 24 mov QWORD PTR [rsp],rbx 40115f: 48 8d 5c 24 4c lea rbx,[rsp+0x4c] 401164: 48 89 5c 24 08 mov QWORD PTR [rsp+0x8],rbx 401169: 48 c7 44 24 10 00 00 mov QWORD PTR [rsp+0x10],0x0 401170: 00 00 401172: e8 89 ac 00 00 call 40be00 <runtime.convT2E> 401177: 48 8b 4c 24 18 mov rcx,QWORD PTR [rsp+0x18] 40117c: 48 8b 44 24 20 mov rax,QWORD PTR [rsp+0x20] 401181: 48 8b 9c 24 a0 00 01 mov rbx,QWORD PTR [rsp+0x100a0] 401188: 00 401189: 48 89 8c 24 68 00 01 mov QWORD PTR [rsp+0x10068],rcx 401190: 00 401191: 48 89 0b mov QWORD PTR [rbx],rcx 401194: 48 89 84 24 70 00 01 mov QWORD PTR [rsp+0x10070],rax 40119b: 00 40119c: 80 3d 3d e9 19 00 00 cmp BYTE PTR [rip+0x19e93d],0x0 # 59fae0 <runtime.writeBarrier> 4011a3: 0f 85 ea 02 00 00 jne 401493 <main.main+0x493> 4011a9: 48 89 43 08 mov QWORD PTR [rbx+0x8],rax 4011ad: 48 8b 9c 24 a0 00 01 mov rbx,QWORD PTR [rsp+0x100a0] 4011b4: 00 4011b5: 48 89 1c 24 mov QWORD PTR [rsp],rbx 4011b9: 48 8b 9c 24 a8 00 01 mov rbx,QWORD PTR [rsp+0x100a8] 4011c0: 00 4011c1: 48 89 5c 24 08 mov QWORD PTR [rsp+0x8],rbx 4011c6: 48 8b 9c 24 b0 00 01 mov rbx,QWORD PTR [rsp+0x100b0] 4011cd: 00 4011ce: 48 89 5c 24 10 mov QWORD PTR [rsp+0x10],rbx 4011d3: e8 b8 98 05 00 call 45aa90 <fmt.Println> 4011d8: 8b 54 24 48 mov edx,DWORD PTR [rsp+0x48] 4011dc: 48 8b 8c 24 88 00 01 mov rcx,QWORD PTR [rsp+0x10088] 4011e3: 00 4011e4: 48 8b 9c 24 90 00 01 mov rbx,QWORD PTR [rsp+0x10090] 4011eb: 00 4011ec: 48 8b b4 24 98 00 01 mov rsi,QWORD PTR [rsp+0x10098] 4011f3: 00 4011f4: 48 89 d8 mov rax,rbx 4011f7: 48 ff c3 inc rbx 4011fa: 48 39 f3 cmp rbx,rsi 4011fd: 0f 87 36 02 00 00 ja 401439 <main.main+0x439> 401203: 48 89 9c 24 90 00 01 mov QWORD PTR [rsp+0x10090],rbx 40120a: 00 40120b: 48 8d 1c 81 lea rbx,[rcx+rax*4] 40120f: 89 13 mov DWORD PTR [rbx],edx 401211: ff c2 inc edx 401213: 81 fa 00 00 01 00 cmp edx,0x10000 401219: 0f 82 c5 fe ff ff jb 4010e4 <main.main+0xe4> 40121f: 48 c7 c0 01 00 00 00 mov rax,0x1 401226: 48 89 44 24 50 mov QWORD PTR [rsp+0x50],rax 40122b: 48 3d 00 00 01 00 cmp rax,0x10000 401231: 0f 8d d1 01 00 00 jge 401408 <main.main+0x408> 401237: 48 8d 5c 24 58 lea rbx,[rsp+0x58] 40123c: 48 c7 c0 00 00 01 00 mov rax,0x10000 401243: 48 89 1c 24 mov QWORD PTR [rsp],rbx 401247: 48 89 44 24 08 mov QWORD PTR [rsp+0x8],rax 40124c: e8 3f 4e 05 00 call 456090 <runtime.memclr> 401251: 48 8b 74 24 50 mov rsi,QWORD PTR [rsp+0x50] 401256: 48 c1 e6 10 shl rsi,0x10 40125a: 89 f6 mov esi,esi 40125c: 48 8b bc 24 88 00 01 mov rdi,QWORD PTR [rsp+0x10088] 401263: 00 401264: 4c 8b 8c 24 90 00 01 mov r9,QWORD PTR [rsp+0x10090] 40126b: 00 40126c: 48 8b 9c 24 98 00 01 mov rbx,QWORD PTR [rsp+0x10098] 401273: 00 401274: 45 31 c0 xor r8d,r8d 401277: 4d 39 c8 cmp r8,r9 40127a: 7d 59 jge 4012d5 <main.main+0x2d5> 40127c: 8b 0f mov ecx,DWORD PTR [rdi] 40127e: 89 f0 mov eax,esi 401280: 31 d2 xor edx,edx 401282: f7 f1 div ecx 401284: 89 c8 mov eax,ecx 401286: 29 d0 sub eax,edx 401288: 31 d2 xor edx,edx 40128a: f7 f1 div ecx 40128c: 89 d0 mov eax,edx 40128e: 01 f0 add eax,esi 401290: 89 c3 mov ebx,eax 401292: 29 f3 sub ebx,esi 401294: 81 fb 00 00 01 00 cmp ebx,0x10000 40129a: 73 2d jae 4012c9 <main.main+0x2c9> 40129c: 89 c2 mov edx,eax 40129e: 29 f2 sub edx,esi 4012a0: 48 8d 5c 24 58 lea rbx,[rsp+0x58] 4012a5: 8b ea mov ebp,edx 4012a7: 48 81 fd 00 00 01 00 cmp rbp,0x10000 4012ae: 0f 83 7e 01 00 00 jae 401432 <main.main+0x432> 4012b4: 48 8d 1c 2b lea rbx,[rbx+rbp*1] 4012b8: c6 03 01 mov BYTE PTR [rbx],0x1 4012bb: 01 c8 add eax,ecx 4012bd: 89 c3 mov ebx,eax 4012bf: 29 f3 sub ebx,esi 4012c1: 81 fb 00 00 01 00 cmp ebx,0x10000 4012c7: 72 d3 jb 40129c <main.main+0x29c> 4012c9: 48 83 c7 04 add rdi,0x4 4012cd: 49 ff c0 inc r8 4012d0: 4d 39 c8 cmp r8,r9 4012d3: 7c a7 jl 40127c <main.main+0x27c> 4012d5: 31 c0 xor eax,eax 4012d7: 3d 00 00 01 00 cmp eax,0x10000 4012dc: 0f 83 0d 01 00 00 jae 4013ef <main.main+0x3ef> 4012e2: 48 8d 5c 24 58 lea rbx,[rsp+0x58] 4012e7: 8b e8 mov ebp,eax 4012e9: 48 81 fd 00 00 01 00 cmp rbp,0x10000 4012f0: 0f 83 35 01 00 00 jae 40142b <main.main+0x42b> 4012f6: 48 8d 1c 2b lea rbx,[rbx+rbp*1] 4012fa: 0f b6 1b movzx ebx,BYTE PTR [rbx] 4012fd: 80 fb 00 cmp bl,0x0 401300: 0f 85 dc 00 00 00 jne 4013e2 <main.main+0x3e2> 401306: 89 f3 mov ebx,esi 401308: 89 74 24 40 mov DWORD PTR [rsp+0x40],esi 40130c: 89 44 24 44 mov DWORD PTR [rsp+0x44],eax 401310: 01 c3 add ebx,eax 401312: 89 5c 24 4c mov DWORD PTR [rsp+0x4c],ebx 401316: 31 db xor ebx,ebx 401318: 48 89 9c 24 58 00 01 mov QWORD PTR [rsp+0x10058],rbx 40131f: 00 401320: 48 89 9c 24 60 00 01 mov QWORD PTR [rsp+0x10060],rbx 401327: 00 401328: 48 8d 9c 24 58 00 01 lea rbx,[rsp+0x10058] 40132f: 00 401330: 48 83 fb 00 cmp rbx,0x0 401334: 0f 84 ea 00 00 00 je 401424 <main.main+0x424> 40133a: 48 c7 84 24 a8 00 01 mov QWORD PTR [rsp+0x100a8],0x1 401341: 00 01 00 00 00 401346: 48 c7 84 24 b0 00 01 mov QWORD PTR [rsp+0x100b0],0x1 40134d: 00 01 00 00 00 401352: 48 89 9c 24 a0 00 01 mov QWORD PTR [rsp+0x100a0],rbx 401359: 00 40135a: 48 8d 1d df 7c 0b 00 lea rbx,[rip+0xb7cdf] # 4b9040 <type.*+0xe040> 401361: 48 89 1c 24 mov QWORD PTR [rsp],rbx 401365: 48 8d 5c 24 4c lea rbx,[rsp+0x4c] 40136a: 48 89 5c 24 08 mov QWORD PTR [rsp+0x8],rbx 40136f: 48 c7 44 24 10 00 00 mov QWORD PTR [rsp+0x10],0x0 401376: 00 00 401378: e8 83 aa 00 00 call 40be00 <runtime.convT2E> 40137d: 48 8b 4c 24 18 mov rcx,QWORD PTR [rsp+0x18] 401382: 48 8b 44 24 20 mov rax,QWORD PTR [rsp+0x20] 401387: 48 8b 9c 24 a0 00 01 mov rbx,QWORD PTR [rsp+0x100a0] 40138e: 00 40138f: 48 89 8c 24 68 00 01 mov QWORD PTR [rsp+0x10068],rcx 401396: 00 401397: 48 89 0b mov QWORD PTR [rbx],rcx 40139a: 48 89 84 24 70 00 01 mov QWORD PTR [rsp+0x10070],rax 4013a1: 00 4013a2: 80 3d 37 e7 19 00 00 cmp BYTE PTR [rip+0x19e737],0x0 # 59fae0 <runtime.writeBarrier> 4013a9: 75 65 jne 401410 <main.main+0x410> 4013ab: 48 89 43 08 mov QWORD PTR [rbx+0x8],rax 4013af: 48 8b 9c 24 a0 00 01 mov rbx,QWORD PTR [rsp+0x100a0] 4013b6: 00 4013b7: 48 89 1c 24 mov QWORD PTR [rsp],rbx 4013bb: 48 8b 9c 24 a8 00 01 mov rbx,QWORD PTR [rsp+0x100a8] 4013c2: 00 4013c3: 48 89 5c 24 08 mov QWORD PTR [rsp+0x8],rbx 4013c8: 48 8b 9c 24 b0 00 01 mov rbx,QWORD PTR [rsp+0x100b0] 4013cf: 00 4013d0: 48 89 5c 24 10 mov QWORD PTR [rsp+0x10],rbx 4013d5: e8 b6 96 05 00 call 45aa90 <fmt.Println> 4013da: 8b 44 24 44 mov eax,DWORD PTR [rsp+0x44] 4013de: 8b 74 24 40 mov esi,DWORD PTR [rsp+0x40] 4013e2: ff c0 inc eax 4013e4: 3d 00 00 01 00 cmp eax,0x10000 4013e9: 0f 82 f3 fe ff ff jb 4012e2 <main.main+0x2e2> 4013ef: 48 8b 44 24 50 mov rax,QWORD PTR [rsp+0x50] 4013f4: 48 ff c0 inc rax 4013f7: 48 89 44 24 50 mov QWORD PTR [rsp+0x50],rax 4013fc: 48 3d 00 00 01 00 cmp rax,0x10000 401402: 0f 8c 2f fe ff ff jl 401237 <main.main+0x237> 401408: 48 81 c4 b8 00 01 00 add rsp,0x100b8 40140f: c3 ret 401410: 4c 8d 43 08 lea r8,[rbx+0x8] 401414: 4c 89 04 24 mov QWORD PTR [rsp],r8 401418: 48 89 44 24 08 mov QWORD PTR [rsp+0x8],rax 40141d: e8 de de 00 00 call 40f300 <runtime.writebarrierptr> 401422: eb 8b jmp 4013af <main.main+0x3af> 401424: 89 03 mov DWORD PTR [rbx],eax 401426: e9 0f ff ff ff jmp 40133a <main.main+0x33a> 40142b: e8 a0 53 02 00 call 4267d0 <runtime.panicindex> 401430: 0f 0b ud2 401432: e8 99 53 02 00 call 4267d0 <runtime.panicindex> 401437: 0f 0b ud2 401439: 48 8d 2d 00 31 0b 00 lea rbp,[rip+0xb3100] # 4b4540 <type.*+0x9540> 401440: 48 89 2c 24 mov QWORD PTR [rsp],rbp 401444: 48 89 4c 24 08 mov QWORD PTR [rsp+0x8],rcx 401449: 48 89 44 24 10 mov QWORD PTR [rsp+0x10],rax 40144e: 48 89 74 24 18 mov QWORD PTR [rsp+0x18],rsi 401453: 48 89 5c 24 20 mov QWORD PTR [rsp+0x20],rbx 401458: e8 e3 9b 03 00 call 43b040 <runtime.growslice> 40145d: 8b 54 24 48 mov edx,DWORD PTR [rsp+0x48] 401461: 48 8b 4c 24 28 mov rcx,QWORD PTR [rsp+0x28] 401466: 48 8b 5c 24 30 mov rbx,QWORD PTR [rsp+0x30] 40146b: 48 8b 6c 24 38 mov rbp,QWORD PTR [rsp+0x38] 401470: 48 89 d8 mov rax,rbx 401473: 48 ff c3 inc rbx 401476: 48 89 9c 24 90 00 01 mov QWORD PTR [rsp+0x10090],rbx 40147d: 00 40147e: 48 89 ac 24 98 00 01 mov QWORD PTR [rsp+0x10098],rbp 401485: 00 401486: 48 89 8c 24 88 00 01 mov QWORD PTR [rsp+0x10088],rcx 40148d: 00 40148e: e9 78 fd ff ff jmp 40120b <main.main+0x20b> 401493: 4c 8d 43 08 lea r8,[rbx+0x8] 401497: 4c 89 04 24 mov QWORD PTR [rsp],r8 40149b: 48 89 44 24 08 mov QWORD PTR [rsp+0x8],rax 4014a0: e8 5b de 00 00 call 40f300 <runtime.writebarrierptr> 4014a5: e9 03 fd ff ff jmp 4011ad <main.main+0x1ad> 4014aa: 89 03 mov DWORD PTR [rbx],eax 4014ac: e9 83 fc ff ff jmp 401134 <main.main+0x134> 4014b1: e8 1a 53 02 00 call 4267d0 <runtime.panicindex> 4014b6: 0f 0b ud2 4014b8: 48 89 c8 mov rax,rcx 4014bb: 48 d1 e0 shl rax,1 4014be: 48 3d 00 00 01 00 cmp rax,0x10000 4014c4: 0f 8d fd fb ff ff jge 4010c7 <main.main+0xc7> 4014ca: 48 8d 5c 24 58 lea rbx,[rsp+0x58] 4014cf: 48 3d 00 00 01 00 cmp rax,0x10000 4014d5: 73 0c jae 4014e3 <main.main+0x4e3> 4014d7: 48 8d 1c 03 lea rbx,[rbx+rax*1] 4014db: c6 03 01 mov BYTE PTR [rbx],0x1 4014de: 48 01 c8 add rax,rcx 4014e1: eb db jmp 4014be <main.main+0x4be> 4014e3: e8 e8 52 02 00 call 4267d0 <runtime.panicindex> 4014e8: 0f 0b ud2 4014ea: e8 e1 52 02 00 call 4267d0 <runtime.panicindex> 4014ef: 0f 0b ud2 4014f1: 89 03 mov DWORD PTR [rbx],eax 4014f3: e9 7d fb ff ff jmp 401075 <main.main+0x75> 4014f8: e8 03 21 05 00 call 453600 <runtime.morestack_noctxt> 4014fd: e9 fe fa ff ff jmp 401000 <main.main> 401502: cc int3 401503: cc int3 401504: cc int3 401505: cc int3 401506: cc int3 401507: cc int3 401508: cc int3 401509: cc int3 40150a: cc int3 40150b: cc int3 40150c: cc int3 40150d: cc int3 40150e: cc int3 40150f: cc int3
$ objdump -d sieve_rs | c++filt | awk '/<main/,/^$/' 0000000000004cb0 <main::h3a7d143d57a98e1aeaa>: 4cb0: 55 push rbp 4cb1: 41 57 push r15 4cb3: 41 56 push r14 4cb5: 41 55 push r13 4cb7: 41 54 push r12 4cb9: 53 push rbx 4cba: 48 81 ec c8 00 01 00 sub rsp,0x100c8 4cc1: 48 b8 1d 1d 1d 1d 1d movabs rax,0x1d1d1d1d1d1d1d1d 4cc8: 1d 1d 1d 4ccb: 48 89 44 24 20 mov QWORD PTR [rsp+0x20],rax 4cd0: 48 8d bc 24 c8 00 00 lea rdi,[rsp+0xc8] 4cd7: 00 4cd8: 31 f6 xor esi,esi 4cda: ba 00 00 01 00 mov edx,0x10000 4cdf: e8 8c fa ff ff call 4770 <memset@plt> 4ce4: 48 c7 84 24 b0 00 00 mov QWORD PTR [rsp+0xb0],0x1 4ceb: 00 01 00 00 00 4cf0: 0f 57 c0 xorps xmm0,xmm0 4cf3: 0f 11 84 24 b8 00 00 movups XMMWORD PTR [rsp+0xb8],xmm0 4cfa: 00 4cfb: b8 02 00 00 00 mov eax,0x2 4d00: 48 89 c1 mov rcx,rax 4d03: 48 83 c9 01 or rcx,0x1 4d07: 80 bc 04 c8 00 00 00 cmp BYTE PTR [rsp+rax*1+0xc8],0x0 4d0e: 00 4d0f: 75 23 jne 4d34 <main::h3a7d143d57a98e1aeaa+0x84> 4d11: 48 8d 14 00 lea rdx,[rax+rax*1] 4d15: 66 66 2e 0f 1f 84 00 data32 nop WORD PTR cs:[rax+rax*1+0x0] 4d1c: 00 00 00 00 4d20: c6 84 14 c8 00 00 00 mov BYTE PTR [rsp+rdx*1+0xc8],0x1 4d27: 01 4d28: 48 01 c2 add rdx,rax 4d2b: 48 81 fa 00 00 01 00 cmp rdx,0x10000 4d32: 72 ec jb 4d20 <main::h3a7d143d57a98e1aeaa+0x70> 4d34: 48 83 c0 02 add rax,0x2 4d38: 80 bc 0c c8 00 00 00 cmp BYTE PTR [rsp+rcx*1+0xc8],0x0 4d3f: 00 4d40: 75 22 jne 4d64 <main::h3a7d143d57a98e1aeaa+0xb4> 4d42: 48 8d 14 09 lea rdx,[rcx+rcx*1] 4d46: 66 2e 0f 1f 84 00 00 nop WORD PTR cs:[rax+rax*1+0x0] 4d4d: 00 00 00 4d50: c6 84 14 c8 00 00 00 mov BYTE PTR [rsp+rdx*1+0xc8],0x1 4d57: 01 4d58: 48 01 ca add rdx,rcx 4d5b: 48 81 fa 00 00 01 00 cmp rdx,0x10000 4d62: 72 ec jb 4d50 <main::h3a7d143d57a98e1aeaa+0xa0> 4d64: 48 3d 00 01 00 00 cmp rax,0x100 4d6a: 75 94 jne 4d00 <main::h3a7d143d57a98e1aeaa+0x50> 4d6c: bd 02 00 00 00 mov ebp,0x2 4d71: 45 31 e4 xor r12d,r12d 4d74: 41 bf 01 00 00 00 mov r15d,0x1 4d7a: 4c 8d 6c 24 68 lea r13,[rsp+0x68] 4d7f: 48 8d 5c 24 78 lea rbx,[rsp+0x78] 4d84: 66 66 66 2e 0f 1f 84 data32 data32 nop WORD PTR cs:[rax+rax*1+0x0] 4d8b: 00 00 00 00 00 4d90: 48 89 ac 24 a8 00 00 mov QWORD PTR [rsp+0xa8],rbp 4d97: 00 4d98: 80 bc 2c c8 00 00 00 cmp BYTE PTR [rsp+rbp*1+0xc8],0x0 4d9f: 00 4da0: 0f 85 a1 00 00 00 jne 4e47 <main::h3a7d143d57a98e1aeaa+0x197> 4da6: 48 8d 05 03 72 03 00 lea rax,[rip+0x37203] # 3bfb0 <fmt::num::usize.fmt..Display::fmt::h841af16830bb5f60kgW> 4dad: 48 89 44 24 70 mov QWORD PTR [rsp+0x70],rax 4db2: 48 8d 84 24 a8 00 00 lea rax,[rsp+0xa8] 4db9: 00 4dba: 48 89 44 24 68 mov QWORD PTR [rsp+0x68],rax 4dbf: 48 8d 05 d2 84 24 00 lea rax,[rip+0x2484d2] # 24d298 <ref4653> 4dc6: 48 89 44 24 78 mov QWORD PTR [rsp+0x78],rax 4dcb: 48 c7 84 24 80 00 00 mov QWORD PTR [rsp+0x80],0x2 4dd2: 00 02 00 00 00 4dd7: 48 8d 84 24 88 00 00 lea rax,[rsp+0x88] 4dde: 00 4ddf: 0f 57 c0 xorps xmm0,xmm0 4de2: 0f 11 00 movups XMMWORD PTR [rax],xmm0 4de5: 4c 89 ac 24 98 00 00 mov QWORD PTR [rsp+0x98],r13 4dec: 00 4ded: 48 c7 84 24 a0 00 00 mov QWORD PTR [rsp+0xa0],0x1 4df4: 00 01 00 00 00 4df9: 48 89 df mov rdi,rbx 4dfc: e8 5f 2f 00 00 call 7d60 <io::stdio::_print::h27ae99cc97e67314Erh> 4e01: 4c 8b b4 24 a8 00 00 mov r14,QWORD PTR [rsp+0xa8] 4e08: 00 4e09: 4c 3b a4 24 b8 00 00 cmp r12,QWORD PTR [rsp+0xb8] 4e10: 00 4e11: 75 1d jne 4e30 <main::h3a7d143d57a98e1aeaa+0x180> 4e13: 48 8d bc 24 b0 00 00 lea rdi,[rsp+0xb0] 4e1a: 00 4e1b: e8 20 02 00 00 call 5040 <raw_vec::RawVec$LT$T$GT$::double::h4876174689768493710> 4e20: 4c 8b bc 24 b0 00 00 mov r15,QWORD PTR [rsp+0xb0] 4e27: 00 4e28: 4c 8b a4 24 c0 00 00 mov r12,QWORD PTR [rsp+0xc0] 4e2f: 00 4e30: 4f 89 34 e7 mov QWORD PTR [r15+r12*8],r14 4e34: 4c 8b a4 24 c0 00 00 mov r12,QWORD PTR [rsp+0xc0] 4e3b: 00 4e3c: 49 ff c4 inc r12 4e3f: 4c 89 a4 24 c0 00 00 mov QWORD PTR [rsp+0xc0],r12 4e46: 00 4e47: 48 ff c5 inc rbp 4e4a: 48 81 fd 00 00 01 00 cmp rbp,0x10000 4e51: 0f 82 39 ff ff ff jb 4d90 <main::h3a7d143d57a98e1aeaa+0xe0> 4e57: 48 8b 8c 24 b0 00 00 mov rcx,QWORD PTR [rsp+0xb0] 4e5e: 00 4e5f: 48 89 4c 24 08 mov QWORD PTR [rsp+0x8],rcx 4e64: 4c 89 64 24 10 mov QWORD PTR [rsp+0x10],r12 4e69: 4e 8d 34 e1 lea r14,[rcx+r12*8] 4e6d: bb 01 00 00 00 mov ebx,0x1 4e72: 41 bd 00 00 01 00 mov r13d,0x10000 4e78: 4c 8d 64 24 38 lea r12,[rsp+0x38] 4e7d: 0f 1f 00 nop DWORD PTR [rax] 4e80: 48 8d 43 01 lea rax,[rbx+0x1] 4e84: 48 89 44 24 18 mov QWORD PTR [rsp+0x18],rax 4e89: 31 f6 xor esi,esi 4e8b: ba 00 00 01 00 mov edx,0x10000 4e90: 48 8d bc 24 c8 00 00 lea rdi,[rsp+0xc8] 4e97: 00 4e98: e8 d3 f8 ff ff call 4770 <memset@plt> 4e9d: 48 83 7c 24 10 00 cmp QWORD PTR [rsp+0x10],0x0 4ea3: 4c 89 ed mov rbp,r13 4ea6: 41 bf 00 00 00 00 mov r15d,0x0 4eac: 0f 84 7e 00 00 00 je 4f30 <main::h3a7d143d57a98e1aeaa+0x280> 4eb2: 48 c1 e3 10 shl rbx,0x10 4eb6: 48 8b 4c 24 08 mov rcx,QWORD PTR [rsp+0x8] 4ebb: 0f 1f 44 00 00 nop DWORD PTR [rax+rax*1+0x0] 4ec0: 48 8b 31 mov rsi,QWORD PTR [rcx] 4ec3: 48 85 f6 test rsi,rsi 4ec6: 74 43 je 4f0b <main::h3a7d143d57a98e1aeaa+0x25b> 4ec8: 48 83 c1 08 add rcx,0x8 4ecc: 31 d2 xor edx,edx 4ece: 48 89 d8 mov rax,rbx 4ed1: 48 f7 f6 div rsi 4ed4: 48 89 f0 mov rax,rsi 4ed7: 48 29 d0 sub rax,rdx 4eda: 31 d2 xor edx,edx 4edc: 48 f7 f6 div rsi 4edf: 48 81 fa ff ff 00 00 cmp rdx,0xffff 4ee6: 77 1c ja 4f04 <main::h3a7d143d57a98e1aeaa+0x254> 4ee8: 0f 1f 84 00 00 00 00 nop DWORD PTR [rax+rax*1+0x0] 4eef: 00 4ef0: c6 84 14 c8 00 00 00 mov BYTE PTR [rsp+rdx*1+0xc8],0x1 4ef7: 01 4ef8: 48 01 f2 add rdx,rsi 4efb: 48 81 fa 00 00 01 00 cmp rdx,0x10000 4f02: 72 ec jb 4ef0 <main::h3a7d143d57a98e1aeaa+0x240> 4f04: 4c 39 f1 cmp rcx,r14 4f07: 75 b7 jne 4ec0 <main::h3a7d143d57a98e1aeaa+0x210> 4f09: eb 15 jmp 4f20 <main::h3a7d143d57a98e1aeaa+0x270> 4f0b: 48 8d 3d 5e 83 24 00 lea rdi,[rip+0x24835e] # 24d270 <panic_loc4648> 4f12: e8 89 65 03 00 call 3b4a0 <panicking::panic::h4265c0105caa1121SaM> 4f17: eb af jmp 4ec8 <main::h3a7d143d57a98e1aeaa+0x218> 4f19: 0f 1f 80 00 00 00 00 nop DWORD PTR [rax+0x0] 4f20: 4c 89 ed mov rbp,r13 4f23: 45 31 ff xor r15d,r15d 4f26: 66 2e 0f 1f 84 00 00 nop WORD PTR cs:[rax+rax*1+0x0] 4f2d: 00 00 00 4f30: 42 80 bc 3c c8 00 00 cmp BYTE PTR [rsp+r15*1+0xc8],0x0 4f37: 00 00 4f39: 75 56 jne 4f91 <main::h3a7d143d57a98e1aeaa+0x2e1> 4f3b: 48 89 6c 24 20 mov QWORD PTR [rsp+0x20],rbp 4f40: 48 8d 05 69 70 03 00 lea rax,[rip+0x37069] # 3bfb0 <fmt::num::usize.fmt..Display::fmt::h841af16830bb5f60kgW> 4f47: 48 89 44 24 30 mov QWORD PTR [rsp+0x30],rax 4f4c: 48 8d 44 24 20 lea rax,[rsp+0x20] 4f51: 48 89 44 24 28 mov QWORD PTR [rsp+0x28],rax 4f56: 48 8d 05 3b 83 24 00 lea rax,[rip+0x24833b] # 24d298 <ref4653> 4f5d: 48 89 44 24 38 mov QWORD PTR [rsp+0x38],rax 4f62: 48 c7 44 24 40 02 00 mov QWORD PTR [rsp+0x40],0x2 4f69: 00 00 4f6b: 48 8d 44 24 48 lea rax,[rsp+0x48] 4f70: 0f 57 c0 xorps xmm0,xmm0 4f73: 0f 11 00 movups XMMWORD PTR [rax],xmm0 4f76: 48 8d 44 24 28 lea rax,[rsp+0x28] 4f7b: 48 89 44 24 58 mov QWORD PTR [rsp+0x58],rax 4f80: 48 c7 44 24 60 01 00 mov QWORD PTR [rsp+0x60],0x1 4f87: 00 00 4f89: 4c 89 e7 mov rdi,r12 4f8c: e8 cf 2d 00 00 call 7d60 <io::stdio::_print::h27ae99cc97e67314Erh> 4f91: 49 ff c7 inc r15 4f94: 48 ff c5 inc rbp 4f97: 49 81 ff 00 00 01 00 cmp r15,0x10000 4f9e: 72 90 jb 4f30 <main::h3a7d143d57a98e1aeaa+0x280> 4fa0: 49 81 c5 00 00 01 00 add r13,0x10000 4fa7: 48 8b 44 24 18 mov rax,QWORD PTR [rsp+0x18] 4fac: 48 3d ff ff 00 00 cmp rax,0xffff 4fb2: 48 89 c3 mov rbx,rax 4fb5: 0f 86 c5 fe ff ff jbe 4e80 <main::h3a7d143d57a98e1aeaa+0x1d0> 4fbb: 48 8b b4 24 b8 00 00 mov rsi,QWORD PTR [rsp+0xb8] 4fc2: 00 4fc3: 48 85 f6 test rsi,rsi 4fc6: 74 22 je 4fea <main::h3a7d143d57a98e1aeaa+0x33a> 4fc8: 48 b8 1d 1d 1d 1d 1d movabs rax,0x1d1d1d1d1d1d1d1d 4fcf: 1d 1d 1d 4fd2: 48 39 c6 cmp rsi,rax 4fd5: 74 13 je 4fea <main::h3a7d143d57a98e1aeaa+0x33a> 4fd7: 48 c1 e6 03 shl rsi,0x3 4fdb: ba 08 00 00 00 mov edx,0x8 4fe0: 48 8b 7c 24 08 mov rdi,QWORD PTR [rsp+0x8] 4fe5: e8 26 12 01 00 call 16210 <__rust_deallocate> 4fea: 48 81 c4 c8 00 01 00 add rsp,0x100c8 4ff1: 5b pop rbx 4ff2: 41 5c pop r12 4ff4: 41 5d pop r13 4ff6: 41 5e pop r14 4ff8: 41 5f pop r15 4ffa: 5d pop rbp 4ffb: c3 ret 4ffc: 48 89 c3 mov rbx,rax 4fff: 48 8b b4 24 b8 00 00 mov rsi,QWORD PTR [rsp+0xb8] 5006: 00 5007: 48 85 f6 test rsi,rsi 500a: 74 25 je 5031 <main::h3a7d143d57a98e1aeaa+0x381> 500c: 48 b8 1d 1d 1d 1d 1d movabs rax,0x1d1d1d1d1d1d1d1d 5013: 1d 1d 1d 5016: 48 39 c6 cmp rsi,rax 5019: 74 16 je 5031 <main::h3a7d143d57a98e1aeaa+0x381> 501b: 48 c1 e6 03 shl rsi,0x3 501f: 48 8b bc 24 b0 00 00 mov rdi,QWORD PTR [rsp+0xb0] 5026: 00 5027: ba 08 00 00 00 mov edx,0x8 502c: e8 df 11 01 00 call 16210 <__rust_deallocate> 5031: 48 89 df mov rdi,rbx 5034: e8 e7 fa ff ff call 4b20 <_Unwind_Resume@plt> 5039: eb c1 jmp 4ffc <main::h3a7d143d57a98e1aeaa+0x34c> 503b: eb bf jmp 4ffc <main::h3a7d143d57a98e1aeaa+0x34c> 503d: 0f 1f 00 nop DWORD PTR [rax]