//
// Generated with:
//   gcc -g  threads-v0.c -lpthread
//   objdump --source threads-v0
//

threads-v0:     file format elf64-x86-64

Disassembly of section .init:

00000000004007e0 <_init>:
_init():
  4007e0:	48 83 ec 08          	sub    $0x8,%rsp
  4007e4:	48 8b 05 0d 18 20 00 	mov    0x20180d(%rip),%rax        # 601ff8 <_DYNAMIC+0x1e0>
  4007eb:	48 85 c0             	test   %rax,%rax
  4007ee:	74 05                	je     4007f5 <_init+0x15>
  4007f0:	e8 fb 00 00 00       	callq  4008f0 <pthread_mutex_lock@plt+0x10>
  4007f5:	48 83 c4 08          	add    $0x8,%rsp
  4007f9:	c3                   	retq   

Disassembly of section .plt:

0000000000400800 <pthread_create@plt-0x10>:
  400800:	ff 35 02 18 20 00    	pushq  0x201802(%rip)        # 602008 <_GLOBAL_OFFSET_TABLE_+0x8>
  400806:	ff 25 04 18 20 00    	jmpq   *0x201804(%rip)        # 602010 <_GLOBAL_OFFSET_TABLE_+0x10>
  40080c:	0f 1f 40 00          	nopl   0x0(%rax)

0000000000400810 <pthread_create@plt>:
  400810:	ff 25 02 18 20 00    	jmpq   *0x201802(%rip)        # 602018 <_GLOBAL_OFFSET_TABLE_+0x18>
  400816:	68 00 00 00 00       	pushq  $0x0
  40081b:	e9 e0 ff ff ff       	jmpq   400800 <_init+0x20>

0000000000400820 <__stack_chk_fail@plt>:
  400820:	ff 25 fa 17 20 00    	jmpq   *0x2017fa(%rip)        # 602020 <_GLOBAL_OFFSET_TABLE_+0x20>
  400826:	68 01 00 00 00       	pushq  $0x1
  40082b:	e9 d0 ff ff ff       	jmpq   400800 <_init+0x20>

0000000000400830 <printf@plt>:
  400830:	ff 25 f2 17 20 00    	jmpq   *0x2017f2(%rip)        # 602028 <_GLOBAL_OFFSET_TABLE_+0x28>
  400836:	68 02 00 00 00       	pushq  $0x2
  40083b:	e9 c0 ff ff ff       	jmpq   400800 <_init+0x20>

0000000000400840 <gettimeofday@plt>:
  400840:	ff 25 ea 17 20 00    	jmpq   *0x2017ea(%rip)        # 602030 <_GLOBAL_OFFSET_TABLE_+0x30>
  400846:	68 03 00 00 00       	pushq  $0x3
  40084b:	e9 b0 ff ff ff       	jmpq   400800 <_init+0x20>

0000000000400850 <__assert_fail@plt>:
  400850:	ff 25 e2 17 20 00    	jmpq   *0x2017e2(%rip)        # 602038 <_GLOBAL_OFFSET_TABLE_+0x38>
  400856:	68 04 00 00 00       	pushq  $0x4
  40085b:	e9 a0 ff ff ff       	jmpq   400800 <_init+0x20>

0000000000400860 <__libc_start_main@plt>:
  400860:	ff 25 da 17 20 00    	jmpq   *0x2017da(%rip)        # 602040 <_GLOBAL_OFFSET_TABLE_+0x40>
  400866:	68 05 00 00 00       	pushq  $0x5
  40086b:	e9 90 ff ff ff       	jmpq   400800 <_init+0x20>

0000000000400870 <pthread_mutex_unlock@plt>:
  400870:	ff 25 d2 17 20 00    	jmpq   *0x2017d2(%rip)        # 602048 <_GLOBAL_OFFSET_TABLE_+0x48>
  400876:	68 06 00 00 00       	pushq  $0x6
  40087b:	e9 80 ff ff ff       	jmpq   400800 <_init+0x20>

0000000000400880 <pthread_exit@plt>:
  400880:	ff 25 ca 17 20 00    	jmpq   *0x2017ca(%rip)        # 602050 <_GLOBAL_OFFSET_TABLE_+0x50>
  400886:	68 07 00 00 00       	pushq  $0x7
  40088b:	e9 70 ff ff ff       	jmpq   400800 <_init+0x20>

0000000000400890 <pthread_join@plt>:
  400890:	ff 25 c2 17 20 00    	jmpq   *0x2017c2(%rip)        # 602058 <_GLOBAL_OFFSET_TABLE_+0x58>
  400896:	68 08 00 00 00       	pushq  $0x8
  40089b:	e9 60 ff ff ff       	jmpq   400800 <_init+0x20>

00000000004008a0 <atoi@plt>:
  4008a0:	ff 25 ba 17 20 00    	jmpq   *0x2017ba(%rip)        # 602060 <_GLOBAL_OFFSET_TABLE_+0x60>
  4008a6:	68 09 00 00 00       	pushq  $0x9
  4008ab:	e9 50 ff ff ff       	jmpq   400800 <_init+0x20>

00000000004008b0 <exit@plt>:
  4008b0:	ff 25 b2 17 20 00    	jmpq   *0x2017b2(%rip)        # 602068 <_GLOBAL_OFFSET_TABLE_+0x68>
  4008b6:	68 0a 00 00 00       	pushq  $0xa
  4008bb:	e9 40 ff ff ff       	jmpq   400800 <_init+0x20>

00000000004008c0 <fwrite@plt>:
  4008c0:	ff 25 aa 17 20 00    	jmpq   *0x2017aa(%rip)        # 602070 <_GLOBAL_OFFSET_TABLE_+0x70>
  4008c6:	68 0b 00 00 00       	pushq  $0xb
  4008cb:	e9 30 ff ff ff       	jmpq   400800 <_init+0x20>

00000000004008d0 <pthread_mutex_init@plt>:
  4008d0:	ff 25 a2 17 20 00    	jmpq   *0x2017a2(%rip)        # 602078 <_GLOBAL_OFFSET_TABLE_+0x78>
  4008d6:	68 0c 00 00 00       	pushq  $0xc
  4008db:	e9 20 ff ff ff       	jmpq   400800 <_init+0x20>

00000000004008e0 <pthread_mutex_lock@plt>:
  4008e0:	ff 25 9a 17 20 00    	jmpq   *0x20179a(%rip)        # 602080 <_GLOBAL_OFFSET_TABLE_+0x80>
  4008e6:	68 0d 00 00 00       	pushq  $0xd
  4008eb:	e9 10 ff ff ff       	jmpq   400800 <_init+0x20>

Disassembly of section .plt.got:

00000000004008f0 <.plt.got>:
  4008f0:	ff 25 02 17 20 00    	jmpq   *0x201702(%rip)        # 601ff8 <_DYNAMIC+0x1e0>
  4008f6:	66 90                	xchg   %ax,%ax

Disassembly of section .text:

0000000000400900 <_start>:
_start():
  400900:	31 ed                	xor    %ebp,%ebp
  400902:	49 89 d1             	mov    %rdx,%r9
  400905:	5e                   	pop    %rsi
  400906:	48 89 e2             	mov    %rsp,%rdx
  400909:	48 83 e4 f0          	and    $0xfffffffffffffff0,%rsp
  40090d:	50                   	push   %rax
  40090e:	54                   	push   %rsp
  40090f:	49 c7 c0 e0 0d 40 00 	mov    $0x400de0,%r8
  400916:	48 c7 c1 70 0d 40 00 	mov    $0x400d70,%rcx
  40091d:	48 c7 c7 60 0c 40 00 	mov    $0x400c60,%rdi
  400924:	e8 37 ff ff ff       	callq  400860 <__libc_start_main@plt>
  400929:	f4                   	hlt    
  40092a:	66 0f 1f 44 00 00    	nopw   0x0(%rax,%rax,1)

0000000000400930 <deregister_tm_clones>:
deregister_tm_clones():
  400930:	b8 9f 20 60 00       	mov    $0x60209f,%eax
  400935:	55                   	push   %rbp
  400936:	48 2d 98 20 60 00    	sub    $0x602098,%rax
  40093c:	48 83 f8 0e          	cmp    $0xe,%rax
  400940:	48 89 e5             	mov    %rsp,%rbp
  400943:	76 1b                	jbe    400960 <deregister_tm_clones+0x30>
  400945:	b8 00 00 00 00       	mov    $0x0,%eax
  40094a:	48 85 c0             	test   %rax,%rax
  40094d:	74 11                	je     400960 <deregister_tm_clones+0x30>
  40094f:	5d                   	pop    %rbp
  400950:	bf 98 20 60 00       	mov    $0x602098,%edi
  400955:	ff e0                	jmpq   *%rax
  400957:	66 0f 1f 84 00 00 00 	nopw   0x0(%rax,%rax,1)
  40095e:	00 00 
  400960:	5d                   	pop    %rbp
  400961:	c3                   	retq   
  400962:	0f 1f 40 00          	nopl   0x0(%rax)
  400966:	66 2e 0f 1f 84 00 00 	nopw   %cs:0x0(%rax,%rax,1)
  40096d:	00 00 00 

0000000000400970 <register_tm_clones>:
register_tm_clones():
  400970:	be 98 20 60 00       	mov    $0x602098,%esi
  400975:	55                   	push   %rbp
  400976:	48 81 ee 98 20 60 00 	sub    $0x602098,%rsi
  40097d:	48 c1 fe 03          	sar    $0x3,%rsi
  400981:	48 89 e5             	mov    %rsp,%rbp
  400984:	48 89 f0             	mov    %rsi,%rax
  400987:	48 c1 e8 3f          	shr    $0x3f,%rax
  40098b:	48 01 c6             	add    %rax,%rsi
  40098e:	48 d1 fe             	sar    %rsi
  400991:	74 15                	je     4009a8 <register_tm_clones+0x38>
  400993:	b8 00 00 00 00       	mov    $0x0,%eax
  400998:	48 85 c0             	test   %rax,%rax
  40099b:	74 0b                	je     4009a8 <register_tm_clones+0x38>
  40099d:	5d                   	pop    %rbp
  40099e:	bf 98 20 60 00       	mov    $0x602098,%edi
  4009a3:	ff e0                	jmpq   *%rax
  4009a5:	0f 1f 00             	nopl   (%rax)
  4009a8:	5d                   	pop    %rbp
  4009a9:	c3                   	retq   
  4009aa:	66 0f 1f 44 00 00    	nopw   0x0(%rax,%rax,1)

00000000004009b0 <__do_global_dtors_aux>:
__do_global_dtors_aux():
  4009b0:	80 3d f1 16 20 00 00 	cmpb   $0x0,0x2016f1(%rip)        # 6020a8 <completed.7585>
  4009b7:	75 11                	jne    4009ca <__do_global_dtors_aux+0x1a>
  4009b9:	55                   	push   %rbp
  4009ba:	48 89 e5             	mov    %rsp,%rbp
  4009bd:	e8 6e ff ff ff       	callq  400930 <deregister_tm_clones>
  4009c2:	5d                   	pop    %rbp
  4009c3:	c6 05 de 16 20 00 01 	movb   $0x1,0x2016de(%rip)        # 6020a8 <completed.7585>
  4009ca:	f3 c3                	repz retq 
  4009cc:	0f 1f 40 00          	nopl   0x0(%rax)

00000000004009d0 <frame_dummy>:
frame_dummy():
  4009d0:	bf 10 1e 60 00       	mov    $0x601e10,%edi
  4009d5:	48 83 3f 00          	cmpq   $0x0,(%rdi)
  4009d9:	75 05                	jne    4009e0 <frame_dummy+0x10>
  4009db:	eb 93                	jmp    400970 <register_tm_clones>
  4009dd:	0f 1f 00             	nopl   (%rax)
  4009e0:	b8 00 00 00 00       	mov    $0x0,%eax
  4009e5:	48 85 c0             	test   %rax,%rax
  4009e8:	74 f1                	je     4009db <frame_dummy+0xb>
  4009ea:	55                   	push   %rbp
  4009eb:	48 89 e5             	mov    %rsp,%rbp
  4009ee:	ff d0                	callq  *%rax
  4009f0:	5d                   	pop    %rbp
  4009f1:	e9 7a ff ff ff       	jmpq   400970 <register_tm_clones>

00000000004009f6 <GetTime>:
GetTime():
/home/claypool/os-nz/samples/lecture-1/common.h:9
#include <sys/time.h>
#include <sys/stat.h>
#include <assert.h>
#include <pthread.h>

double GetTime() {
  4009f6:	55                   	push   %rbp
  4009f7:	48 89 e5             	mov    %rsp,%rbp
  4009fa:	48 83 ec 30          	sub    $0x30,%rsp
  4009fe:	64 48 8b 04 25 28 00 	mov    %fs:0x28,%rax
  400a05:	00 00 
  400a07:	48 89 45 f8          	mov    %rax,-0x8(%rbp)
  400a0b:	31 c0                	xor    %eax,%eax
/home/claypool/os-nz/samples/lecture-1/common.h:11
    struct timeval t;
    int rc = gettimeofday(&t, NULL);
  400a0d:	48 8d 45 e0          	lea    -0x20(%rbp),%rax
  400a11:	be 00 00 00 00       	mov    $0x0,%esi
  400a16:	48 89 c7             	mov    %rax,%rdi
  400a19:	e8 22 fe ff ff       	callq  400840 <gettimeofday@plt>
  400a1e:	89 45 dc             	mov    %eax,-0x24(%rbp)
/home/claypool/os-nz/samples/lecture-1/common.h:12
    assert(rc == 0);
  400a21:	83 7d dc 00          	cmpl   $0x0,-0x24(%rbp)
  400a25:	74 19                	je     400a40 <GetTime+0x4a>
/home/claypool/os-nz/samples/lecture-1/common.h:12 (discriminator 1)
  400a27:	b9 58 0e 40 00       	mov    $0x400e58,%ecx
  400a2c:	ba 0c 00 00 00       	mov    $0xc,%edx
  400a31:	be 00 0e 40 00       	mov    $0x400e00,%esi
  400a36:	bf 09 0e 40 00       	mov    $0x400e09,%edi
  400a3b:	e8 10 fe ff ff       	callq  400850 <__assert_fail@plt>
/home/claypool/os-nz/samples/lecture-1/common.h:13
    return (double)t.tv_sec + (double)t.tv_usec/1e6;
  400a40:	48 8b 45 e0          	mov    -0x20(%rbp),%rax
  400a44:	66 0f ef c9          	pxor   %xmm1,%xmm1
  400a48:	f2 48 0f 2a c8       	cvtsi2sd %rax,%xmm1
  400a4d:	48 8b 45 e8          	mov    -0x18(%rbp),%rax
  400a51:	66 0f ef c0          	pxor   %xmm0,%xmm0
  400a55:	f2 48 0f 2a c0       	cvtsi2sd %rax,%xmm0
  400a5a:	f2 0f 10 15 76 04 00 	movsd  0x476(%rip),%xmm2        # 400ed8 <__PRETTY_FUNCTION__.3507+0x18>
  400a61:	00 
  400a62:	f2 0f 5e c2          	divsd  %xmm2,%xmm0
  400a66:	f2 0f 58 c1          	addsd  %xmm1,%xmm0
/home/claypool/os-nz/samples/lecture-1/common.h:14
}
  400a6a:	48 8b 45 f8          	mov    -0x8(%rbp),%rax
  400a6e:	64 48 33 04 25 28 00 	xor    %fs:0x28,%rax
  400a75:	00 00 
  400a77:	74 05                	je     400a7e <GetTime+0x88>
  400a79:	e8 a2 fd ff ff       	callq  400820 <__stack_chk_fail@plt>
  400a7e:	c9                   	leaveq 
  400a7f:	c3                   	retq   

0000000000400a80 <Spin>:
Spin():
/home/claypool/os-nz/samples/lecture-1/common.h:16

void Spin(int howlong) {
  400a80:	55                   	push   %rbp
  400a81:	48 89 e5             	mov    %rsp,%rbp
  400a84:	48 83 ec 20          	sub    $0x20,%rsp
  400a88:	89 7d ec             	mov    %edi,-0x14(%rbp)
/home/claypool/os-nz/samples/lecture-1/common.h:17
    double t = GetTime();
  400a8b:	b8 00 00 00 00       	mov    $0x0,%eax
  400a90:	e8 61 ff ff ff       	callq  4009f6 <GetTime>
  400a95:	66 48 0f 7e c0       	movq   %xmm0,%rax
  400a9a:	48 89 45 f8          	mov    %rax,-0x8(%rbp)
/home/claypool/os-nz/samples/lecture-1/common.h:18
    while ((GetTime() - t) < (double)howlong)
  400a9e:	90                   	nop
/home/claypool/os-nz/samples/lecture-1/common.h:18 (discriminator 1)
  400a9f:	b8 00 00 00 00       	mov    $0x0,%eax
  400aa4:	e8 4d ff ff ff       	callq  4009f6 <GetTime>
  400aa9:	66 0f 28 c8          	movapd %xmm0,%xmm1
  400aad:	f2 0f 5c 4d f8       	subsd  -0x8(%rbp),%xmm1
  400ab2:	66 0f ef c0          	pxor   %xmm0,%xmm0
  400ab6:	f2 0f 2a 45 ec       	cvtsi2sdl -0x14(%rbp),%xmm0
  400abb:	66 0f 2e c1          	ucomisd %xmm1,%xmm0
  400abf:	77 de                	ja     400a9f <Spin+0x1f>
/home/claypool/os-nz/samples/lecture-1/common.h:20
	; // do nothing in loop
}
  400ac1:	90                   	nop
  400ac2:	c9                   	leaveq 
  400ac3:	c3                   	retq   

0000000000400ac4 <Pthread_create>:
Pthread_create():
/home/claypool/os-nz/samples/lecture-1/common.h:23

void Pthread_create(pthread_t *t, const pthread_attr_t *attr, 
	       void *(*start_routine)(void *), void *arg) {
  400ac4:	55                   	push   %rbp
  400ac5:	48 89 e5             	mov    %rsp,%rbp
  400ac8:	48 83 ec 30          	sub    $0x30,%rsp
  400acc:	48 89 7d e8          	mov    %rdi,-0x18(%rbp)
  400ad0:	48 89 75 e0          	mov    %rsi,-0x20(%rbp)
  400ad4:	48 89 55 d8          	mov    %rdx,-0x28(%rbp)
  400ad8:	48 89 4d d0          	mov    %rcx,-0x30(%rbp)
/home/claypool/os-nz/samples/lecture-1/common.h:24
    int rc = pthread_create(t, attr, start_routine, arg);
  400adc:	48 8b 4d d0          	mov    -0x30(%rbp),%rcx
  400ae0:	48 8b 55 d8          	mov    -0x28(%rbp),%rdx
  400ae4:	48 8b 75 e0          	mov    -0x20(%rbp),%rsi
  400ae8:	48 8b 45 e8          	mov    -0x18(%rbp),%rax
  400aec:	48 89 c7             	mov    %rax,%rdi
  400aef:	e8 1c fd ff ff       	callq  400810 <pthread_create@plt>
  400af4:	89 45 fc             	mov    %eax,-0x4(%rbp)
/home/claypool/os-nz/samples/lecture-1/common.h:25
    assert(rc == 0);
  400af7:	83 7d fc 00          	cmpl   $0x0,-0x4(%rbp)
  400afb:	74 19                	je     400b16 <Pthread_create+0x52>
/home/claypool/os-nz/samples/lecture-1/common.h:25 (discriminator 1)
  400afd:	b9 60 0e 40 00       	mov    $0x400e60,%ecx
  400b02:	ba 19 00 00 00       	mov    $0x19,%edx
  400b07:	be 00 0e 40 00       	mov    $0x400e00,%esi
  400b0c:	bf 09 0e 40 00       	mov    $0x400e09,%edi
  400b11:	e8 3a fd ff ff       	callq  400850 <__assert_fail@plt>
/home/claypool/os-nz/samples/lecture-1/common.h:26
}
  400b16:	90                   	nop
  400b17:	c9                   	leaveq 
  400b18:	c3                   	retq   

0000000000400b19 <Pthread_join>:
Pthread_join():
/home/claypool/os-nz/samples/lecture-1/common.h:28

void Pthread_join(pthread_t thread, void **value_ptr) {
  400b19:	55                   	push   %rbp
  400b1a:	48 89 e5             	mov    %rsp,%rbp
  400b1d:	48 83 ec 20          	sub    $0x20,%rsp
  400b21:	48 89 7d e8          	mov    %rdi,-0x18(%rbp)
  400b25:	48 89 75 e0          	mov    %rsi,-0x20(%rbp)
/home/claypool/os-nz/samples/lecture-1/common.h:29
    int rc = pthread_join(thread, value_ptr);
  400b29:	48 8b 55 e0          	mov    -0x20(%rbp),%rdx
  400b2d:	48 8b 45 e8          	mov    -0x18(%rbp),%rax
  400b31:	48 89 d6             	mov    %rdx,%rsi
  400b34:	48 89 c7             	mov    %rax,%rdi
  400b37:	e8 54 fd ff ff       	callq  400890 <pthread_join@plt>
  400b3c:	89 45 fc             	mov    %eax,-0x4(%rbp)
/home/claypool/os-nz/samples/lecture-1/common.h:30
    assert(rc == 0);
  400b3f:	83 7d fc 00          	cmpl   $0x0,-0x4(%rbp)
  400b43:	74 19                	je     400b5e <Pthread_join+0x45>
/home/claypool/os-nz/samples/lecture-1/common.h:30 (discriminator 1)
  400b45:	b9 70 0e 40 00       	mov    $0x400e70,%ecx
  400b4a:	ba 1e 00 00 00       	mov    $0x1e,%edx
  400b4f:	be 00 0e 40 00       	mov    $0x400e00,%esi
  400b54:	bf 09 0e 40 00       	mov    $0x400e09,%edi
  400b59:	e8 f2 fc ff ff       	callq  400850 <__assert_fail@plt>
/home/claypool/os-nz/samples/lecture-1/common.h:31
}
  400b5e:	90                   	nop
  400b5f:	c9                   	leaveq 
  400b60:	c3                   	retq   

0000000000400b61 <Pthread_mutex_lock>:
Pthread_mutex_lock():
/home/claypool/os-nz/samples/lecture-1/common.h:33

void Pthread_mutex_lock(pthread_mutex_t *mutex) {
  400b61:	55                   	push   %rbp
  400b62:	48 89 e5             	mov    %rsp,%rbp
  400b65:	48 83 ec 20          	sub    $0x20,%rsp
  400b69:	48 89 7d e8          	mov    %rdi,-0x18(%rbp)
/home/claypool/os-nz/samples/lecture-1/common.h:34
    int rc = pthread_mutex_lock(mutex);
  400b6d:	48 8b 45 e8          	mov    -0x18(%rbp),%rax
  400b71:	48 89 c7             	mov    %rax,%rdi
  400b74:	e8 67 fd ff ff       	callq  4008e0 <pthread_mutex_lock@plt>
  400b79:	89 45 fc             	mov    %eax,-0x4(%rbp)
/home/claypool/os-nz/samples/lecture-1/common.h:35
    assert(rc == 0);
  400b7c:	83 7d fc 00          	cmpl   $0x0,-0x4(%rbp)
  400b80:	74 19                	je     400b9b <Pthread_mutex_lock+0x3a>
/home/claypool/os-nz/samples/lecture-1/common.h:35 (discriminator 1)
  400b82:	b9 80 0e 40 00       	mov    $0x400e80,%ecx
  400b87:	ba 23 00 00 00       	mov    $0x23,%edx
  400b8c:	be 00 0e 40 00       	mov    $0x400e00,%esi
  400b91:	bf 09 0e 40 00       	mov    $0x400e09,%edi
  400b96:	e8 b5 fc ff ff       	callq  400850 <__assert_fail@plt>
/home/claypool/os-nz/samples/lecture-1/common.h:36
}
  400b9b:	90                   	nop
  400b9c:	c9                   	leaveq 
  400b9d:	c3                   	retq   

0000000000400b9e <Pthread_mutex_unlock>:
Pthread_mutex_unlock():
/home/claypool/os-nz/samples/lecture-1/common.h:38

void Pthread_mutex_unlock(pthread_mutex_t *mutex) {
  400b9e:	55                   	push   %rbp
  400b9f:	48 89 e5             	mov    %rsp,%rbp
  400ba2:	48 83 ec 20          	sub    $0x20,%rsp
  400ba6:	48 89 7d e8          	mov    %rdi,-0x18(%rbp)
/home/claypool/os-nz/samples/lecture-1/common.h:39
    int rc = pthread_mutex_unlock(mutex);
  400baa:	48 8b 45 e8          	mov    -0x18(%rbp),%rax
  400bae:	48 89 c7             	mov    %rax,%rdi
  400bb1:	e8 ba fc ff ff       	callq  400870 <pthread_mutex_unlock@plt>
  400bb6:	89 45 fc             	mov    %eax,-0x4(%rbp)
/home/claypool/os-nz/samples/lecture-1/common.h:40
    assert(rc == 0);
  400bb9:	83 7d fc 00          	cmpl   $0x0,-0x4(%rbp)
  400bbd:	74 19                	je     400bd8 <Pthread_mutex_unlock+0x3a>
/home/claypool/os-nz/samples/lecture-1/common.h:40 (discriminator 1)
  400bbf:	b9 a0 0e 40 00       	mov    $0x400ea0,%ecx
  400bc4:	ba 28 00 00 00       	mov    $0x28,%edx
  400bc9:	be 00 0e 40 00       	mov    $0x400e00,%esi
  400bce:	bf 09 0e 40 00       	mov    $0x400e09,%edi
  400bd3:	e8 78 fc ff ff       	callq  400850 <__assert_fail@plt>
/home/claypool/os-nz/samples/lecture-1/common.h:41
}
  400bd8:	90                   	nop
  400bd9:	c9                   	leaveq 
  400bda:	c3                   	retq   

0000000000400bdb <Pthread_mutex_init>:
Pthread_mutex_init():
/home/claypool/os-nz/samples/lecture-1/common.h:43

void Pthread_mutex_init(pthread_mutex_t *mutex, pthread_mutexattr_t *attr) {
  400bdb:	55                   	push   %rbp
  400bdc:	48 89 e5             	mov    %rsp,%rbp
  400bdf:	48 83 ec 20          	sub    $0x20,%rsp
  400be3:	48 89 7d e8          	mov    %rdi,-0x18(%rbp)
  400be7:	48 89 75 e0          	mov    %rsi,-0x20(%rbp)
/home/claypool/os-nz/samples/lecture-1/common.h:44
    int rc = pthread_mutex_init(mutex, attr);
  400beb:	48 8b 55 e0          	mov    -0x20(%rbp),%rdx
  400bef:	48 8b 45 e8          	mov    -0x18(%rbp),%rax
  400bf3:	48 89 d6             	mov    %rdx,%rsi
  400bf6:	48 89 c7             	mov    %rax,%rdi
  400bf9:	e8 d2 fc ff ff       	callq  4008d0 <pthread_mutex_init@plt>
  400bfe:	89 45 fc             	mov    %eax,-0x4(%rbp)
/home/claypool/os-nz/samples/lecture-1/common.h:45
    assert(rc == 0);
  400c01:	83 7d fc 00          	cmpl   $0x0,-0x4(%rbp)
  400c05:	74 19                	je     400c20 <Pthread_mutex_init+0x45>
/home/claypool/os-nz/samples/lecture-1/common.h:45 (discriminator 1)
  400c07:	b9 c0 0e 40 00       	mov    $0x400ec0,%ecx
  400c0c:	ba 2d 00 00 00       	mov    $0x2d,%edx
  400c11:	be 00 0e 40 00       	mov    $0x400e00,%esi
  400c16:	bf 09 0e 40 00       	mov    $0x400e09,%edi
  400c1b:	e8 30 fc ff ff       	callq  400850 <__assert_fail@plt>
/home/claypool/os-nz/samples/lecture-1/common.h:46
}
  400c20:	90                   	nop
  400c21:	c9                   	leaveq 
  400c22:	c3                   	retq   

0000000000400c23 <worker>:
worker():
/home/claypool/os-nz/samples/lecture-1/threads-v0.c:10
// Global variables.
volatile int g_counter = 0; // Volatile prevents compiler from optimizing away.
int g_loops;

// Do some work.
void *worker(void *arg) {
  400c23:	55                   	push   %rbp
  400c24:	48 89 e5             	mov    %rsp,%rbp
  400c27:	48 83 ec 20          	sub    $0x20,%rsp
  400c2b:	48 89 7d e8          	mov    %rdi,-0x18(%rbp)
/home/claypool/os-nz/samples/lecture-1/threads-v0.c:12
  int i;
  for (i = 0; i < g_loops; i++)
  400c2f:	c7 45 fc 00 00 00 00 	movl   $0x0,-0x4(%rbp)
  400c36:	eb 13                	jmp    400c4b <worker+0x28>
/home/claypool/os-nz/samples/lecture-1/threads-v0.c:13 (discriminator 3)
    g_counter++;
  400c38:	8b 05 6e 14 20 00    	mov    0x20146e(%rip),%eax        # 6020ac <g_counter>
  400c3e:	83 c0 01             	add    $0x1,%eax
  400c41:	89 05 65 14 20 00    	mov    %eax,0x201465(%rip)        # 6020ac <g_counter>
/home/claypool/os-nz/samples/lecture-1/threads-v0.c:12 (discriminator 3)
int g_loops;

// Do some work.
void *worker(void *arg) {
  int i;
  for (i = 0; i < g_loops; i++)
  400c47:	83 45 fc 01          	addl   $0x1,-0x4(%rbp)
/home/claypool/os-nz/samples/lecture-1/threads-v0.c:12 (discriminator 1)
  400c4b:	8b 05 5f 14 20 00    	mov    0x20145f(%rip),%eax        # 6020b0 <g_loops>
  400c51:	39 45 fc             	cmp    %eax,-0x4(%rbp)
  400c54:	7c e2                	jl     400c38 <worker+0x15>
/home/claypool/os-nz/samples/lecture-1/threads-v0.c:14
    g_counter++;
  pthread_exit(NULL);
  400c56:	bf 00 00 00 00       	mov    $0x0,%edi
  400c5b:	e8 20 fc ff ff       	callq  400880 <pthread_exit@plt>

0000000000400c60 <main>:
main():
/home/claypool/os-nz/samples/lecture-1/threads-v0.c:18
}

// Main.
int main(int argc, char *argv[]) {
  400c60:	55                   	push   %rbp
  400c61:	48 89 e5             	mov    %rsp,%rbp
  400c64:	48 83 ec 30          	sub    $0x30,%rsp
  400c68:	89 7d dc             	mov    %edi,-0x24(%rbp)
  400c6b:	48 89 75 d0          	mov    %rsi,-0x30(%rbp)
  400c6f:	64 48 8b 04 25 28 00 	mov    %fs:0x28,%rax
  400c76:	00 00 
  400c78:	48 89 45 f8          	mov    %rax,-0x8(%rbp)
  400c7c:	31 c0                	xor    %eax,%eax
/home/claypool/os-nz/samples/lecture-1/threads-v0.c:21

  // Command line arg.
  if (argc != 2) { 
  400c7e:	83 7d dc 02          	cmpl   $0x2,-0x24(%rbp)
  400c82:	74 28                	je     400cac <main+0x4c>
/home/claypool/os-nz/samples/lecture-1/threads-v0.c:22
    fprintf(stderr, "usage: threads <loops>\n"); 
  400c84:	48 8b 05 15 14 20 00 	mov    0x201415(%rip),%rax        # 6020a0 <stderr@@GLIBC_2.2.5>
  400c8b:	48 89 c1             	mov    %rax,%rcx
  400c8e:	ba 17 00 00 00       	mov    $0x17,%edx
  400c93:	be 01 00 00 00       	mov    $0x1,%esi
  400c98:	bf 11 0e 40 00       	mov    $0x400e11,%edi
  400c9d:	e8 1e fc ff ff       	callq  4008c0 <fwrite@plt>
/home/claypool/os-nz/samples/lecture-1/threads-v0.c:23
    exit(1); 
  400ca2:	bf 01 00 00 00       	mov    $0x1,%edi
  400ca7:	e8 04 fc ff ff       	callq  4008b0 <exit@plt>
/home/claypool/os-nz/samples/lecture-1/threads-v0.c:25
  } 
  g_loops = atoi(argv[1]); // Assign to g_loops.
  400cac:	48 8b 45 d0          	mov    -0x30(%rbp),%rax
  400cb0:	48 83 c0 08          	add    $0x8,%rax
  400cb4:	48 8b 00             	mov    (%rax),%rax
  400cb7:	48 89 c7             	mov    %rax,%rdi
  400cba:	e8 e1 fb ff ff       	callq  4008a0 <atoi@plt>
  400cbf:	89 05 eb 13 20 00    	mov    %eax,0x2013eb(%rip)        # 6020b0 <g_loops>
/home/claypool/os-nz/samples/lecture-1/threads-v0.c:28
  
  pthread_t p1, p2;
  printf(" Initial value: %d\n", g_counter);
  400cc5:	8b 05 e1 13 20 00    	mov    0x2013e1(%rip),%eax        # 6020ac <g_counter>
  400ccb:	89 c6                	mov    %eax,%esi
  400ccd:	bf 29 0e 40 00       	mov    $0x400e29,%edi
  400cd2:	b8 00 00 00 00       	mov    $0x0,%eax
  400cd7:	e8 54 fb ff ff       	callq  400830 <printf@plt>
/home/claypool/os-nz/samples/lecture-1/threads-v0.c:29
  Pthread_create(&p1, NULL, worker, NULL); 
  400cdc:	48 8d 45 e8          	lea    -0x18(%rbp),%rax
  400ce0:	b9 00 00 00 00       	mov    $0x0,%ecx
  400ce5:	ba 23 0c 40 00       	mov    $0x400c23,%edx
  400cea:	be 00 00 00 00       	mov    $0x0,%esi
  400cef:	48 89 c7             	mov    %rax,%rdi
  400cf2:	e8 cd fd ff ff       	callq  400ac4 <Pthread_create>
/home/claypool/os-nz/samples/lecture-1/threads-v0.c:30
  Pthread_create(&p2, NULL, worker, NULL);
  400cf7:	48 8d 45 f0          	lea    -0x10(%rbp),%rax
  400cfb:	b9 00 00 00 00       	mov    $0x0,%ecx
  400d00:	ba 23 0c 40 00       	mov    $0x400c23,%edx
  400d05:	be 00 00 00 00       	mov    $0x0,%esi
  400d0a:	48 89 c7             	mov    %rax,%rdi
  400d0d:	e8 b2 fd ff ff       	callq  400ac4 <Pthread_create>
/home/claypool/os-nz/samples/lecture-1/threads-v0.c:31
  Pthread_join(p1, NULL); 
  400d12:	48 8b 45 e8          	mov    -0x18(%rbp),%rax
  400d16:	be 00 00 00 00       	mov    $0x0,%esi
  400d1b:	48 89 c7             	mov    %rax,%rdi
  400d1e:	e8 f6 fd ff ff       	callq  400b19 <Pthread_join>
/home/claypool/os-nz/samples/lecture-1/threads-v0.c:32
  Pthread_join(p2, NULL);
  400d23:	48 8b 45 f0          	mov    -0x10(%rbp),%rax
  400d27:	be 00 00 00 00       	mov    $0x0,%esi
  400d2c:	48 89 c7             	mov    %rax,%rdi
  400d2f:	e8 e5 fd ff ff       	callq  400b19 <Pthread_join>
/home/claypool/os-nz/samples/lecture-1/threads-v0.c:33
  printf("   Final value: %d\n", g_counter);
  400d34:	8b 05 72 13 20 00    	mov    0x201372(%rip),%eax        # 6020ac <g_counter>
  400d3a:	89 c6                	mov    %eax,%esi
  400d3c:	bf 3d 0e 40 00       	mov    $0x400e3d,%edi
  400d41:	b8 00 00 00 00       	mov    $0x0,%eax
  400d46:	e8 e5 fa ff ff       	callq  400830 <printf@plt>
/home/claypool/os-nz/samples/lecture-1/threads-v0.c:35
  
  return 0;
  400d4b:	b8 00 00 00 00       	mov    $0x0,%eax
/home/claypool/os-nz/samples/lecture-1/threads-v0.c:36
}
  400d50:	48 8b 55 f8          	mov    -0x8(%rbp),%rdx
  400d54:	64 48 33 14 25 28 00 	xor    %fs:0x28,%rdx
  400d5b:	00 00 
  400d5d:	74 05                	je     400d64 <main+0x104>
  400d5f:	e8 bc fa ff ff       	callq  400820 <__stack_chk_fail@plt>
  400d64:	c9                   	leaveq 
  400d65:	c3                   	retq   
  400d66:	66 2e 0f 1f 84 00 00 	nopw   %cs:0x0(%rax,%rax,1)
  400d6d:	00 00 00 

0000000000400d70 <__libc_csu_init>:
__libc_csu_init():
  400d70:	41 57                	push   %r15
  400d72:	41 56                	push   %r14
  400d74:	41 89 ff             	mov    %edi,%r15d
  400d77:	41 55                	push   %r13
  400d79:	41 54                	push   %r12
  400d7b:	4c 8d 25 7e 10 20 00 	lea    0x20107e(%rip),%r12        # 601e00 <__frame_dummy_init_array_entry>
  400d82:	55                   	push   %rbp
  400d83:	48 8d 2d 7e 10 20 00 	lea    0x20107e(%rip),%rbp        # 601e08 <__init_array_end>
  400d8a:	53                   	push   %rbx
  400d8b:	49 89 f6             	mov    %rsi,%r14
  400d8e:	49 89 d5             	mov    %rdx,%r13
  400d91:	4c 29 e5             	sub    %r12,%rbp
  400d94:	48 83 ec 08          	sub    $0x8,%rsp
  400d98:	48 c1 fd 03          	sar    $0x3,%rbp
  400d9c:	e8 3f fa ff ff       	callq  4007e0 <_init>
  400da1:	48 85 ed             	test   %rbp,%rbp
  400da4:	74 20                	je     400dc6 <__libc_csu_init+0x56>
  400da6:	31 db                	xor    %ebx,%ebx
  400da8:	0f 1f 84 00 00 00 00 	nopl   0x0(%rax,%rax,1)
  400daf:	00 
  400db0:	4c 89 ea             	mov    %r13,%rdx
  400db3:	4c 89 f6             	mov    %r14,%rsi
  400db6:	44 89 ff             	mov    %r15d,%edi
  400db9:	41 ff 14 dc          	callq  *(%r12,%rbx,8)
  400dbd:	48 83 c3 01          	add    $0x1,%rbx
  400dc1:	48 39 eb             	cmp    %rbp,%rbx
  400dc4:	75 ea                	jne    400db0 <__libc_csu_init+0x40>
  400dc6:	48 83 c4 08          	add    $0x8,%rsp
  400dca:	5b                   	pop    %rbx
  400dcb:	5d                   	pop    %rbp
  400dcc:	41 5c                	pop    %r12
  400dce:	41 5d                	pop    %r13
  400dd0:	41 5e                	pop    %r14
  400dd2:	41 5f                	pop    %r15
  400dd4:	c3                   	retq   
  400dd5:	90                   	nop
  400dd6:	66 2e 0f 1f 84 00 00 	nopw   %cs:0x0(%rax,%rax,1)
  400ddd:	00 00 00 

0000000000400de0 <__libc_csu_fini>:
__libc_csu_fini():
  400de0:	f3 c3                	repz retq 

Disassembly of section .fini:

0000000000400de4 <_fini>:
_fini():
  400de4:	48 83 ec 08          	sub    $0x8,%rsp
  400de8:	48 83 c4 08          	add    $0x8,%rsp
  400dec:	c3                   	retq   
