Advertisement
Guest User

Optimizations in std::vector, std::unique_ptr, and raws

a guest
Jun 1st, 2017
242
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. time_vector():
  2.         push    r15
  3.         push    r14
  4.         push    r13
  5.         push    r12
  6.         push    rbp
  7.         push    rbx
  8.         sub     rsp, 8
  9.         call    std::chrono::_V2::steady_clock::now()
  10.         mov     edi, 80000000
  11.         mov     r12, rax
  12.         call    operator new(unsigned long)
  13.         mov     edx, 80000000
  14.         mov     rdi, rax
  15.         xor     esi, esi
  16.         mov     rbx, rax
  17.         call    memset
  18.         mov     edi, 80000000
  19.         call    operator new(unsigned long)
  20.         mov     rdi, rax
  21.         mov     edx, 80000000
  22.         xor     esi, esi
  23.         mov     rbp, rax
  24.         call    memset
  25.         mov     edi, 80000000
  26.         call    operator new(unsigned long)
  27.         mov     r14, rbx
  28.         xor     esi, esi
  29.         mov     rdi, rax
  30.         shr     r14, 3
  31.         mov     edx, 80000000
  32.         mov     r13d, 10000000
  33.         and     r14d, 1
  34.         call    memset
  35.         sub     r13, r14
  36.         lea     rsi, [0+r14*8]
  37.         mov     rcx, rax
  38.         mov     r9, r13
  39.         mov     r11, r13
  40.         mov     r10d, 50
  41.         lea     r8, [rbx+rsi]
  42.         lea     rdi, [rbp+0+rsi]
  43.         shr     r9
  44.         add     rsi, rax
  45.         and     r11, -2
  46. .L5:
  47.         xor     edx, edx
  48.         test    r14, r14
  49.         je      .L2
  50.         movsd   xmm0, QWORD PTR [rbx]
  51.         mov     edx, 1
  52.         addsd   xmm0, QWORD PTR [rbp+0]
  53.         movsd   QWORD PTR [rcx], xmm0
  54. .L2:
  55.         xor     eax, eax
  56.         xor     r15d, r15d
  57. .L3:
  58.         add     r15, 1
  59.         movupd  xmm0, XMMWORD PTR [rdi+rax]
  60.         addpd   xmm0, XMMWORD PTR [r8+rax]
  61.         movups  XMMWORD PTR [rsi+rax], xmm0
  62.         add     rax, 16
  63.         cmp     r15, r9
  64.         jb      .L3
  65.         cmp     r11, r13
  66.         lea     rax, [rdx+r11]
  67.         je      .L4
  68.         movsd   xmm0, QWORD PTR [rbp+0+rax*8]
  69.         addsd   xmm0, QWORD PTR [rbx+rax*8]
  70.         movsd   QWORD PTR [rcx+rax*8], xmm0
  71. .L4:
  72.         sub     r10, 1
  73.         jne     .L5
  74.         mov     rdi, rcx
  75.         call    operator delete(void*)
  76.         mov     rdi, rbp
  77.         call    operator delete(void*)
  78.         mov     rdi, rbx
  79.         call    operator delete(void*)
  80.         call    std::chrono::_V2::steady_clock::now()
  81.         add     rsp, 8
  82.         sub     rax, r12
  83.         pop     rbx
  84.         pop     rbp
  85.         pop     r12
  86.         pop     r13
  87.         pop     r14
  88.         pop     r15
  89.         ret
  90.         mov     r12, rax
  91. .L7:
  92.         mov     rdi, rbx
  93.         call    operator delete(void*)
  94.         mov     rdi, r12
  95.         call    _Unwind_Resume
  96.         mov     rdi, rbp
  97.         mov     r12, rax
  98.         call    operator delete(void*)
  99.         jmp     .L7
  100. time_pointer():
  101.         push    r15
  102.         push    r14
  103.         push    r13
  104.         push    r12
  105.         mov     r13d, 10000000
  106.         push    rbp
  107.         push    rbx
  108.         sub     rsp, 24
  109.         call    std::chrono::_V2::steady_clock::now()
  110.         mov     edi, 80000000
  111.         mov     rbp, rax
  112.         call    operator new[](unsigned long)
  113.         mov     rbx, rax
  114.         mov     edi, 80000000
  115.         mov     r14, rbx
  116.         shr     r14, 3
  117.         call    operator new[](unsigned long)
  118.         and     r14d, 1
  119.         mov     edi, 80000000
  120.         mov     r12, rax
  121.         sub     r13, r14
  122.         call    operator new[](unsigned long)
  123.         lea     rsi, [0+r14*8]
  124.         mov     r9, r13
  125.         mov     r11, r13
  126.         shr     r9
  127.         and     r11, -2
  128.         mov     r10d, 50
  129.         lea     r8, [rbx+rsi]
  130.         lea     rdi, [r12+rsi]
  131.         add     rsi, rax
  132. .L22:
  133.         xor     ecx, ecx
  134.         test    r14, r14
  135.         je      .L19
  136.         movsd   xmm0, QWORD PTR [rbx]
  137.         mov     ecx, 1
  138.         addsd   xmm0, QWORD PTR [r12]
  139.         movsd   QWORD PTR [rax], xmm0
  140. .L19:
  141.         xor     edx, edx
  142.         xor     r15d, r15d
  143. .L20:
  144.         add     r15, 1
  145.         movupd  xmm0, XMMWORD PTR [rdi+rdx]
  146.         addpd   xmm0, XMMWORD PTR [r8+rdx]
  147.         movups  XMMWORD PTR [rsi+rdx], xmm0
  148.         add     rdx, 16
  149.         cmp     r15, r9
  150.         jb      .L20
  151.         cmp     r13, r11
  152.         lea     rdx, [rcx+r11]
  153.         je      .L21
  154.         movsd   xmm0, QWORD PTR [rbx+rdx*8]
  155.         addsd   xmm0, QWORD PTR [r12+rdx*8]
  156.         movsd   QWORD PTR [rax+rdx*8], xmm0
  157. .L21:
  158.         sub     r10, 1
  159.         jne     .L22
  160.         mov     rdi, rbx
  161.         mov     QWORD PTR [rsp+8], rax
  162.         call    operator delete[](void*)
  163.         mov     rdi, r12
  164.         call    operator delete[](void*)
  165.         mov     rax, QWORD PTR [rsp+8]
  166.         mov     rdi, rax
  167.         call    operator delete[](void*)
  168.         call    std::chrono::_V2::steady_clock::now()
  169.         add     rsp, 24
  170.         sub     rax, rbp
  171.         pop     rbx
  172.         pop     rbp
  173.         pop     r12
  174.         pop     r13
  175.         pop     r14
  176.         pop     r15
  177.         ret
  178. time_unique_ptr():
  179.         push    r15
  180.         push    r14
  181.         push    r13
  182.         push    r12
  183.         push    rbp
  184.         push    rbx
  185.         sub     rsp, 8
  186.         call    std::chrono::_V2::steady_clock::now()
  187.         mov     edi, 80000000
  188.         mov     r12, rax
  189.         call    operator new[](unsigned long)
  190.         mov     edx, 80000000
  191.         mov     rdi, rax
  192.         xor     esi, esi
  193.         mov     rbx, rax
  194.         call    memset
  195.         mov     edi, 80000000
  196.         call    operator new[](unsigned long)
  197.         mov     rdi, rax
  198.         mov     edx, 80000000
  199.         xor     esi, esi
  200.         mov     rbp, rax
  201.         call    memset
  202.         mov     edi, 80000000
  203.         call    operator new[](unsigned long)
  204.         mov     r14, rbx
  205.         xor     esi, esi
  206.         mov     rdi, rax
  207.         shr     r14, 3
  208.         mov     edx, 80000000
  209.         mov     r13d, 10000000
  210.         and     r14d, 1
  211.         call    memset
  212.         sub     r13, r14
  213.         lea     rsi, [0+r14*8]
  214.         mov     rcx, rax
  215.         mov     r9, r13
  216.         mov     r11, r13
  217.         mov     r10d, 50
  218.         lea     r8, [rbx+rsi]
  219.         lea     rdi, [rbp+0+rsi]
  220.         shr     r9
  221.         add     rsi, rax
  222.         and     r11, -2
  223. .L32:
  224.         xor     edx, edx
  225.         test    r14, r14
  226.         je      .L29
  227.         movsd   xmm0, QWORD PTR [rbx]
  228.         mov     edx, 1
  229.         addsd   xmm0, QWORD PTR [rbp+0]
  230.         movsd   QWORD PTR [rcx], xmm0
  231. .L29:
  232.         xor     eax, eax
  233.         xor     r15d, r15d
  234. .L30:
  235.         add     r15, 1
  236.         movupd  xmm0, XMMWORD PTR [rdi+rax]
  237.         addpd   xmm0, XMMWORD PTR [r8+rax]
  238.         movups  XMMWORD PTR [rsi+rax], xmm0
  239.         add     rax, 16
  240.         cmp     r9, r15
  241.         ja      .L30
  242.         cmp     r11, r13
  243.         lea     rax, [rdx+r11]
  244.         je      .L31
  245.         movsd   xmm0, QWORD PTR [rbp+0+rax*8]
  246.         addsd   xmm0, QWORD PTR [rbx+rax*8]
  247.         movsd   QWORD PTR [rcx+rax*8], xmm0
  248. .L31:
  249.         sub     r10, 1
  250.         jne     .L32
  251.         mov     rdi, rcx
  252.         call    operator delete[](void*)
  253.         mov     rdi, rbp
  254.         call    operator delete[](void*)
  255.         mov     rdi, rbx
  256.         call    operator delete[](void*)
  257.         call    std::chrono::_V2::steady_clock::now()
  258.         add     rsp, 8
  259.         sub     rax, r12
  260.         pop     rbx
  261.         pop     rbp
  262.         pop     r12
  263.         pop     r13
  264.         pop     r14
  265.         pop     r15
  266.         ret
  267.         mov     r12, rax
  268. .L34:
  269.         mov     rdi, rbx
  270.         call    operator delete[](void*)
  271.         mov     rdi, r12
  272.         call    _Unwind_Resume
  273.         mov     rdi, rbp
  274.         mov     r12, rax
  275.         call    operator delete[](void*)
  276.         jmp     .L34
  277. .LC0:
  278.         .string "Vector took         "
  279. .LC1:
  280.         .string "ns"
  281. .LC2:
  282.         .string "Pointer took        "
  283. .LC3:
  284.         .string "Unique Pointer took "
  285. main:
  286.         push    rbx
  287.         mov     edx, 20
  288.         mov     esi, OFFSET FLAT:.LC0
  289.         mov     edi, OFFSET FLAT:std::cout
  290.         call    std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
  291.         mov     rax, QWORD PTR std::cout[rip]
  292.         mov     rax, QWORD PTR [rax-24]
  293.         mov     QWORD PTR std::cout[rax+16], 12
  294.         call    time_vector()
  295.         mov     edi, OFFSET FLAT:std::cout
  296.         mov     rsi, rax
  297.         call    std::basic_ostream<char, std::char_traits<char> >& std::basic_ostream<char, std::char_traits<char> >::_M_insert<long>(long)
  298.         mov     edx, 2
  299.         mov     rbx, rax
  300.         mov     esi, OFFSET FLAT:.LC1
  301.         mov     rdi, rax
  302.         call    std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
  303.         mov     rdi, rbx
  304.         call    std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)
  305.         mov     edx, 20
  306.         mov     esi, OFFSET FLAT:.LC2
  307.         mov     edi, OFFSET FLAT:std::cout
  308.         call    std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
  309.         mov     rax, QWORD PTR std::cout[rip]
  310.         mov     rax, QWORD PTR [rax-24]
  311.         mov     QWORD PTR std::cout[rax+16], 12
  312.         call    time_pointer()
  313.         mov     edi, OFFSET FLAT:std::cout
  314.         mov     rsi, rax
  315.         call    std::basic_ostream<char, std::char_traits<char> >& std::basic_ostream<char, std::char_traits<char> >::_M_insert<long>(long)
  316.         mov     edx, 2
  317.         mov     rbx, rax
  318.         mov     esi, OFFSET FLAT:.LC1
  319.         mov     rdi, rax
  320.         call    std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
  321.         mov     rdi, rbx
  322.         call    std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)
  323.         mov     edx, 20
  324.         mov     esi, OFFSET FLAT:.LC3
  325.         mov     edi, OFFSET FLAT:std::cout
  326.         call    std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
  327.         mov     rax, QWORD PTR std::cout[rip]
  328.         mov     rax, QWORD PTR [rax-24]
  329.         mov     QWORD PTR std::cout[rax+16], 12
  330.         call    time_unique_ptr()
  331.         mov     edi, OFFSET FLAT:std::cout
  332.         mov     rsi, rax
  333.         call    std::basic_ostream<char, std::char_traits<char> >& std::basic_ostream<char, std::char_traits<char> >::_M_insert<long>(long)
  334.         mov     edx, 2
  335.         mov     rbx, rax
  336.         mov     esi, OFFSET FLAT:.LC1
  337.         mov     rdi, rax
  338.         call    std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
  339.         mov     rdi, rbx
  340.         call    std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)
  341.         xor     eax, eax
  342.         pop     rbx
  343.         ret
  344. _GLOBAL__sub_I__Z11time_vectorv:
  345.         sub     rsp, 8
  346.         mov     edi, OFFSET FLAT:std::__ioinit
  347.         call    std::ios_base::Init::Init()
  348.         mov     edx, OFFSET FLAT:__dso_handle
  349.         mov     esi, OFFSET FLAT:std::__ioinit
  350.         mov     edi, OFFSET FLAT:std::ios_base::Init::~Init()
  351.         add     rsp, 8
  352.         jmp     __cxa_atexit
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement