// File: dsharlet[P]array/test/ein_reduce.cpp
// Function: nda::test_make_ein_sum_diag_body()
TEST(make_ein_sum_diag) {
  constexpr index_t N = 64;
  matrix<int, N, N> A;
  fill_pattern(A);

  // Make diag(A), the digonal of the matrix A.
  vector<int, N> a_diag = make_ein_sum<int, i>(ein<i, i>(A));

  ASSERT_EQ(a_diag.rank(), 1);
  ASSERT_EQ(a_diag.i().extent(), N);
  for (index_t i : A.i()) {
    ASSERT_EQ(a_diag(i), A(i, i));
  }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x910, %rsp            # imm = 0x910
movq $0x40, -0x160(%rbp)
leaq -0x1a8(%rbp), %rdi
movq %rdi, -0x788(%rbp)
callq 0xc6b50
movq -0x788(%rbp), %rdi
xorl %esi, %esi
callq 0xc6b80
jmp 0xaaf79
leaq -0x218(%rbp), %rdi
leaq -0x1a8(%rbp), %rsi
callq 0xc6bb0
jmp 0xaaf8e
movl $0x0, -0x21c(%rbp)
leaq -0x21d(%rbp), %rdi
movq %rdi, -0x790(%rbp)
callq 0x10e30
movq -0x790(%rbp), %rax
leaq -0x1e8(%rbp), %rcx
movq %rcx, -0x78(%rbp)
leaq -0x218(%rbp), %rcx
movq %rcx, -0x80(%rbp)
leaq -0x21c(%rbp), %rcx
movq %rcx, -0x88(%rbp)
movq %rax, -0x90(%rbp)
movq -0x80(%rbp), %rsi
leaq -0xa0(%rbp), %rdi
callq 0xb4890
jmp 0xaafef
movq -0x88(%rbp), %rdx
movq -0x90(%rbp), %rcx
leaq -0xd0(%rbp), %rdi
leaq -0xa0(%rbp), %rsi
callq 0xc8f40
jmp 0xab012
movq -0x80(%rbp), %rax
movq %rax, -0x798(%rbp)
leaq -0x130(%rbp), %rdi
leaq -0xd0(%rbp), %rsi
callq 0xc6e00
jmp 0xab032
movq -0x798(%rbp), %rdx
leaq -0x118(%rbp), %rdi
leaq -0x130(%rbp), %rsi
callq 0xc8f80
jmp 0xab04e
leaq -0x158(%rbp), %rax
movq %rax, -0x18(%rbp)
leaq -0x118(%rbp), %rax
movq %rax, -0x20(%rbp)
movq $0x1, -0x28(%rbp)
movq -0x20(%rbp), %rdx
movq %rdx, %r8
addq $0x18, %r8
leaq -0x38(%rbp), %rdi
leaq -0x39(%rbp), %rsi
leaq -0x3a(%rbp), %rcx
callq 0xb5130
jmp 0xab08a
movq -0x20(%rbp), %rsi
leaq -0x38(%rbp), %rdi
callq 0xb54e0
jmp 0xab099
movq -0x20(%rbp), %rax
movq (%rax), %rcx
movq %rcx, -0x158(%rbp)
movq 0x8(%rax), %rcx
movq %rcx, -0x150(%rbp)
movq 0x10(%rax), %rax
movq %rax, -0x148(%rbp)
leaq -0x1e8(%rbp), %rdi
leaq -0xd0(%rbp), %rsi
callq 0xc8fc0
jmp 0xab10f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x138(%rbp)
movl %eax, -0x13c(%rbp)
leaq -0xd0(%rbp), %rdi
callq 0xc6d50
movq -0x138(%rbp), %rcx
movl -0x13c(%rbp), %eax
movq %rcx, -0x7a8(%rbp)
movl %eax, -0x79c(%rbp)
jmp 0xab7cf
leaq -0xd0(%rbp), %rdi
callq 0xc6d50
leaq -0x21d(%rbp), %rdi
callq 0x10e50
callq 0xc6bf0
movq %rax, -0x7b0(%rbp)
jmp 0xab135
movq -0x7b0(%rbp), %rax
subq $0x1, %rax
sete %al
movb %al, -0x7b9(%rbp)
leaq -0x3d1(%rbp), %rdi
movq %rdi, -0x7b8(%rbp)
callq 0x33b0
movq -0x7b8(%rbp), %rdx
leaq 0x13e764(%rip), %rsi    # 0x1e98ce
leaq -0x3d0(%rbp), %rdi
callq 0x10a90
jmp 0xab178
movb -0x7b9(%rbp), %al
movzbl %al, %esi
andl $0x1, %esi
leaq -0x3b0(%rbp), %rdi
leaq -0x3d0(%rbp), %rdx
callq 0x10f80
jmp 0xab199
leaq 0x131645(%rip), %rsi    # 0x1dc7e5
leaq -0x3b0(%rbp), %rdi
callq 0x34320
movq %rax, -0x7c8(%rbp)
jmp 0xab1b5
movq -0x7c8(%rbp), %rdi
leaq 0x13e71e(%rip), %rsi    # 0x1e98e1
callq 0x347a0
movq %rax, -0x7d0(%rbp)
jmp 0xab1d1
movq -0x7d0(%rbp), %rdi
leaq 0x1355cd(%rip), %rsi    # 0x1e07ac
callq 0x34320
movq %rax, -0x7d8(%rbp)
jmp 0xab1ed
callq 0xc6bf0
movq %rax, -0x7e0(%rbp)
jmp 0xab1fb
movq -0x7d8(%rbp), %rdi
movq -0x7e0(%rbp), %rax
movq %rax, -0x3e0(%rbp)
leaq -0x3e0(%rbp), %rsi
callq 0x355c0
movq %rax, -0x7e8(%rbp)
jmp 0xab225
movq -0x7e8(%rbp), %rdi
leaq 0x1315b2(%rip), %rsi    # 0x1dc7e5
callq 0x34320
movq %rax, -0x7f0(%rbp)
jmp 0xab241
movq -0x7f0(%rbp), %rdi
leaq 0x138e1e(%rip), %rsi    # 0x1e406d
callq 0x34320
movq %rax, -0x7f8(%rbp)
jmp 0xab25d
movq -0x7f8(%rbp), %rdi
leaq 0x135541(%rip), %rsi    # 0x1e07ac
callq 0x34320
movq %rax, -0x800(%rbp)
jmp 0xab279
movq -0x800(%rbp), %rdi
movl $0x1, -0x3e4(%rbp)
leaq -0x3e4(%rbp), %rsi
callq 0x343a0
movq %rax, -0x808(%rbp)
jmp 0xab29f
movq -0x808(%rbp), %rdi
leaq 0x14b1ce(%rip), %rsi    # 0x1f647b
callq 0x34320
jmp 0xab2b4
leaq -0x3b0(%rbp), %rdi
callq 0x10ff0
jmp 0xab2c2
leaq -0x3d0(%rbp), %rdi
callq 0x3100
leaq -0x3d1(%rbp), %rdi
callq 0x3290
leaq -0x1e8(%rbp), %rdi
callq 0xc6c00
movq %rax, -0x810(%rbp)
jmp 0xab2ef
movq -0x810(%rbp), %rax
movq %rax, -0x68(%rbp)
movq -0x68(%rbp), %rax
addq $0x8, %rax
movq %rax, -0x10(%rbp)
movb $0x1, %al
movb %al, -0x819(%rbp)
leaq -0x599(%rbp), %rdi
movq %rdi, -0x818(%rbp)
callq 0x33b0
movq -0x818(%rbp), %rdx
leaq 0x13e5c0(%rip), %rsi    # 0x1e98ef
leaq -0x598(%rbp), %rdi
callq 0x10a90
jmp 0xab33d
movb -0x819(%rbp), %al
movzbl %al, %esi
andl $0x1, %esi
leaq -0x578(%rbp), %rdi
leaq -0x598(%rbp), %rdx
callq 0x10f80
jmp 0xab35e
leaq 0x131480(%rip), %rsi    # 0x1dc7e5
leaq -0x578(%rbp), %rdi
callq 0x34320
movq %rax, -0x828(%rbp)
jmp 0xab37a
movq -0x828(%rbp), %rdi
leaq 0x13e580(%rip), %rsi    # 0x1e9908
callq 0x35580
movq %rax, -0x830(%rbp)
jmp 0xab396
movq -0x830(%rbp), %rdi
leaq 0x135408(%rip), %rsi    # 0x1e07ac
callq 0x34320
movq %rax, -0x838(%rbp)
jmp 0xab3b2
leaq -0x1e8(%rbp), %rdi
callq 0xc6c00
movq %rax, -0x840(%rbp)
jmp 0xab3c7
movq -0x840(%rbp), %rax
movq %rax, -0x70(%rbp)
movq -0x70(%rbp), %rax
addq $0x8, %rax
movq %rax, -0x8(%rbp)
movq -0x838(%rbp), %rdi
movq $0x40, -0x5a8(%rbp)
leaq -0x5a8(%rbp), %rsi
callq 0x34510
movq %rax, -0x848(%rbp)
jmp 0xab405
movq -0x848(%rbp), %rdi
leaq 0x1313d2(%rip), %rsi    # 0x1dc7e5
callq 0x34320
movq %rax, -0x850(%rbp)
jmp 0xab421
movq -0x850(%rbp), %rdi
leaq 0x13e4d7(%rip), %rsi    # 0x1e9906
callq 0x34320
movq %rax, -0x858(%rbp)
jmp 0xab43d
movq -0x858(%rbp), %rdi
leaq 0x135361(%rip), %rsi    # 0x1e07ac
callq 0x34320
movq %rax, -0x860(%rbp)
jmp 0xab459
movq -0x860(%rbp), %rdi
leaq -0x160(%rbp), %rsi
callq 0x34510
movq %rax, -0x868(%rbp)
jmp 0xab475
movq -0x868(%rbp), %rdi
leaq 0x14aff8(%rip), %rsi    # 0x1f647b
callq 0x34320
jmp 0xab48a
leaq -0x578(%rbp), %rdi
callq 0x10ff0
jmp 0xab498
leaq -0x598(%rbp), %rdi
callq 0x3100
leaq -0x599(%rbp), %rdi
callq 0x3290
leaq -0x1a8(%rbp), %rdi
callq 0xc6c20
movq %rax, -0x870(%rbp)
jmp 0xab4c5
movq -0x870(%rbp), %rax
movq %rax, -0x5b0(%rbp)
movq -0x5b0(%rbp), %rdi
callq 0xc6c40
movq %rax, -0x878(%rbp)
jmp 0xab4e8
movq -0x878(%rbp), %rax
movq %rax, -0x5b8(%rbp)
movq -0x5b0(%rbp), %rdi
callq 0xc6c70
movq %rax, -0x880(%rbp)
jmp 0xab50b
movq -0x880(%rbp), %rax
movq %rax, -0x5c0(%rbp)
leaq -0x5b8(%rbp), %rax
movq %rax, -0x58(%rbp)
leaq -0x5c0(%rbp), %rax
movq %rax, -0x60(%rbp)
movq -0x58(%rbp), %rax
movq (%rax), %rax
movq -0x60(%rbp), %rcx
cmpq (%rcx), %rax
setne %al
movb %al, -0x881(%rbp)
movb -0x881(%rbp), %al
testb $0x1, %al
jne 0xab555
jmp 0xab943
leaq -0x5b8(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x890(%rbp)
movq -0x890(%rbp), %rax
movq %rax, -0x5c8(%rbp)
movq -0x5c8(%rbp), %rsi
leaq -0x1e8(%rbp), %rdi
callq 0xc6cc0
movq %rax, -0x898(%rbp)
jmp 0xab598
movq -0x898(%rbp), %rax
movl (%rax), %eax
movl %eax, -0x8a4(%rbp)
movq -0x5c8(%rbp), %rdx
leaq -0x1a8(%rbp), %rdi
movq %rdx, %rsi
callq 0xc6d00
movq %rax, -0x8a0(%rbp)
jmp 0xab5c6
movl -0x8a4(%rbp), %eax
movq -0x8a0(%rbp), %rcx
movl (%rcx), %ecx
subl %ecx, %eax
sete %al
movb %al, -0x8b1(%rbp)
leaq -0x779(%rbp), %rdi
movq %rdi, -0x8b0(%rbp)
callq 0x33b0
movq -0x8b0(%rbp), %rdx
leaq 0x13e31b(%rip), %rsi    # 0x1e991c
leaq -0x778(%rbp), %rdi
callq 0x10a90
jmp 0xab60f
movb -0x8b1(%rbp), %al
movzbl %al, %esi
andl $0x1, %esi
leaq -0x758(%rbp), %rdi
leaq -0x778(%rbp), %rdx
callq 0x10f80
jmp 0xab630
leaq 0x1311ae(%rip), %rsi    # 0x1dc7e5
leaq -0x758(%rbp), %rdi
callq 0x34320
movq %rax, -0x8c0(%rbp)
jmp 0xab64c
movq -0x8c0(%rbp), %rdi
leaq 0x13e2d7(%rip), %rsi    # 0x1e9931
callq 0x344d0
movq %rax, -0x8c8(%rbp)
jmp 0xab668
movq -0x8c8(%rbp), %rdi
leaq 0x135136(%rip), %rsi    # 0x1e07ac
callq 0x34320
movq %rax, -0x8d0(%rbp)
jmp 0xab684
movq -0x5c8(%rbp), %rsi
leaq -0x1e8(%rbp), %rdi
callq 0xc6cc0
movq %rax, -0x8d8(%rbp)
jmp 0xab6a0
movq -0x8d8(%rbp), %rsi
movq -0x8d0(%rbp), %rdi
callq 0x343a0
movq %rax, -0x8e0(%rbp)
jmp 0xab6bc
movq -0x8e0(%rbp), %rdi
leaq 0x13111b(%rip), %rsi    # 0x1dc7e5
callq 0x34320
movq %rax, -0x8e8(%rbp)
jmp 0xab6d8
movq -0x8e8(%rbp), %rdi
leaq 0x13e243(%rip), %rsi    # 0x1e9929
callq 0x34600
movq %rax, -0x8f0(%rbp)
jmp 0xab6f4
movq -0x8f0(%rbp), %rdi
leaq 0x1350aa(%rip), %rsi    # 0x1e07ac
callq 0x34320
movq %rax, -0x8f8(%rbp)
jmp 0xab710
movq -0x5c8(%rbp), %rdx
leaq -0x1a8(%rbp), %rdi
movq %rdx, %rsi
callq 0xc6d00
movq %rax, -0x900(%rbp)
jmp 0xab72f
movq -0x900(%rbp), %rsi
movq -0x8f8(%rbp), %rdi
callq 0x343a0
movq %rax, -0x908(%rbp)
jmp 0xab74b
movq -0x908(%rbp), %rdi
leaq 0x14ad22(%rip), %rsi    # 0x1f647b
callq 0x34320
jmp 0xab760
leaq -0x758(%rbp), %rdi
callq 0x10ff0
jmp 0xab76e
leaq -0x778(%rbp), %rdi
callq 0x3100
leaq -0x779(%rbp), %rdi
callq 0x3290
leaq -0x5b8(%rbp), %rax
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
jmp 0xab519
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x1b0(%rbp)
movl %eax, -0x1b4(%rbp)
jmp 0xab970
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x7a8(%rbp)
movl %eax, -0x79c(%rbp)
jmp 0xab7cf
movq -0x7a8(%rbp), %rcx
movl -0x79c(%rbp), %eax
movq %rcx, -0x1b0(%rbp)
movl %eax, -0x1b4(%rbp)
leaq -0x21d(%rbp), %rdi
callq 0x10e50
jmp 0xab970
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x1b0(%rbp)
movl %eax, -0x1b4(%rbp)
jmp 0xab964
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x1b0(%rbp)
movl %eax, -0x1b4(%rbp)
jmp 0xab867
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x1b0(%rbp)
movl %eax, -0x1b4(%rbp)
jmp 0xab85b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x1b0(%rbp)
movl %eax, -0x1b4(%rbp)
leaq -0x3b0(%rbp), %rdi
callq 0x10ff0
jmp 0xab859
jmp 0xab85b
leaq -0x3d0(%rbp), %rdi
callq 0x3100
leaq -0x3d1(%rbp), %rdi
callq 0x3290
jmp 0xab964
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x1b0(%rbp)
movl %eax, -0x1b4(%rbp)
jmp 0xab8ce
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x1b0(%rbp)
movl %eax, -0x1b4(%rbp)
jmp 0xab8c2
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x1b0(%rbp)
movl %eax, -0x1b4(%rbp)
leaq -0x578(%rbp), %rdi
callq 0x10ff0
jmp 0xab8c0
jmp 0xab8c2
leaq -0x598(%rbp), %rdi
callq 0x3100
leaq -0x599(%rbp), %rdi
callq 0x3290
jmp 0xab964
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x1b0(%rbp)
movl %eax, -0x1b4(%rbp)
jmp 0xab935
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x1b0(%rbp)
movl %eax, -0x1b4(%rbp)
jmp 0xab929
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x1b0(%rbp)
movl %eax, -0x1b4(%rbp)
leaq -0x758(%rbp), %rdi
callq 0x10ff0
jmp 0xab927
jmp 0xab929
leaq -0x778(%rbp), %rdi
callq 0x3100
leaq -0x779(%rbp), %rdi
callq 0x3290
jmp 0xab964
leaq -0x1e8(%rbp), %rdi
callq 0xc6d50
leaq -0x1a8(%rbp), %rdi
callq 0xc6d90
addq $0x910, %rsp            # imm = 0x910
popq %rbp
retq
leaq -0x1e8(%rbp), %rdi
callq 0xc6d50
leaq -0x1a8(%rbp), %rdi
callq 0xc6d90
movq -0x1b0(%rbp), %rdi
callq 0x33a0
movq %rax, %rdi
callq 0x116d0