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

  // Make diag(A), the diagonal of the matrix A.
  vector<int, N> a_diag;
  // This isn't a reduction!
  ein_reduce(ein<i>(a_diag) = ein<i, i>(A));

  for (index_t i : A.i()) {
    ASSERT_EQ(a_diag(i), A(i, i));
  }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x410, %rsp            # imm = 0x410
movq $0x40, -0x58(%rbp)
leaq -0xa0(%rbp), %rdi
movq %rdi, -0x368(%rbp)
callq 0xc6b50
movq -0x368(%rbp), %rdi
xorl %esi, %esi
callq 0xc6b80
jmp 0xab9c6
leaq -0xe0(%rbp), %rdi
callq 0xc6dd0
jmp 0xab9d4
leaq -0x158(%rbp), %rdi
leaq -0xa0(%rbp), %rsi
callq 0xc6bb0
jmp 0xab9e9
leaq -0x170(%rbp), %rdi
leaq -0xe0(%rbp), %rsi
callq 0xc6e00
jmp 0xab9fe
leaq -0x128(%rbp), %rdi
leaq -0x170(%rbp), %rsi
leaq -0x158(%rbp), %rdx
callq 0xc6e40
jmp 0xaba1a
leaq -0x188(%rbp), %rax
movq %rax, -0x8(%rbp)
leaq -0x128(%rbp), %rax
movq %rax, -0x10(%rbp)
movq $0x1, -0x18(%rbp)
movq -0x10(%rbp), %rdx
movq %rdx, %r8
addq $0x18, %r8
leaq -0x28(%rbp), %rdi
leaq -0x29(%rbp), %rsi
leaq -0x2a(%rbp), %rcx
callq 0xb5130
jmp 0xaba56
movq -0x10(%rbp), %rsi
leaq -0x28(%rbp), %rdi
callq 0xb56d0
jmp 0xaba65
movq -0x10(%rbp), %rax
movq (%rax), %rcx
movq %rcx, -0x188(%rbp)
movq 0x8(%rax), %rcx
movq %rcx, -0x180(%rbp)
movq 0x10(%rax), %rax
movq %rax, -0x178(%rbp)
leaq -0xa0(%rbp), %rdi
callq 0xc6c20
movq %rax, -0x370(%rbp)
jmp 0xaba9e
movq -0x370(%rbp), %rax
movq %rax, -0x190(%rbp)
movq -0x190(%rbp), %rdi
callq 0xc6c40
movq %rax, -0x378(%rbp)
jmp 0xabac1
movq -0x378(%rbp), %rax
movq %rax, -0x198(%rbp)
movq -0x190(%rbp), %rdi
callq 0xc6c70
movq %rax, -0x380(%rbp)
jmp 0xabae4
movq -0x380(%rbp), %rax
movq %rax, -0x1a0(%rbp)
leaq -0x198(%rbp), %rax
movq %rax, -0x48(%rbp)
leaq -0x1a0(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x48(%rbp), %rax
movq (%rax), %rax
movq -0x50(%rbp), %rcx
cmpq (%rcx), %rax
setne %al
movb %al, -0x381(%rbp)
movb -0x381(%rbp), %al
testb $0x1, %al
jne 0xabb2e
jmp 0xabe0f
leaq -0x198(%rbp), %rax
movq %rax, -0x40(%rbp)
movq -0x40(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x390(%rbp)
movq -0x390(%rbp), %rax
movq %rax, -0x1a8(%rbp)
movq -0x1a8(%rbp), %rsi
leaq -0xe0(%rbp), %rdi
callq 0xc6cc0
movq %rax, -0x398(%rbp)
jmp 0xabb71
movq -0x398(%rbp), %rax
movl (%rax), %eax
movl %eax, -0x3a4(%rbp)
movq -0x1a8(%rbp), %rdx
leaq -0xa0(%rbp), %rdi
movq %rdx, %rsi
callq 0xc6d00
movq %rax, -0x3a0(%rbp)
jmp 0xabb9f
movl -0x3a4(%rbp), %eax
movq -0x3a0(%rbp), %rcx
movl (%rcx), %ecx
subl %ecx, %eax
sete %al
movb %al, -0x3b1(%rbp)
leaq -0x359(%rbp), %rdi
movq %rdi, -0x3b0(%rbp)
callq 0x33b0
movq -0x3b0(%rbp), %rdx
leaq 0x13dd42(%rip), %rsi    # 0x1e991c
leaq -0x358(%rbp), %rdi
callq 0x10a90
jmp 0xabbe8
movb -0x3b1(%rbp), %al
movzbl %al, %esi
andl $0x1, %esi
leaq -0x338(%rbp), %rdi
leaq -0x358(%rbp), %rdx
callq 0x10f80
jmp 0xabc09
leaq 0x130bd5(%rip), %rsi    # 0x1dc7e5
leaq -0x338(%rbp), %rdi
callq 0x34320
movq %rax, -0x3c0(%rbp)
jmp 0xabc25
movq -0x3c0(%rbp), %rdi
leaq 0x13dcfe(%rip), %rsi    # 0x1e9931
callq 0x344d0
movq %rax, -0x3c8(%rbp)
jmp 0xabc41
movq -0x3c8(%rbp), %rdi
leaq 0x134b5d(%rip), %rsi    # 0x1e07ac
callq 0x34320
movq %rax, -0x3d0(%rbp)
jmp 0xabc5d
movq -0x1a8(%rbp), %rsi
leaq -0xe0(%rbp), %rdi
callq 0xc6cc0
movq %rax, -0x3d8(%rbp)
jmp 0xabc79
movq -0x3d8(%rbp), %rsi
movq -0x3d0(%rbp), %rdi
callq 0x343a0
movq %rax, -0x3e0(%rbp)
jmp 0xabc95
movq -0x3e0(%rbp), %rdi
leaq 0x130b42(%rip), %rsi    # 0x1dc7e5
callq 0x34320
movq %rax, -0x3e8(%rbp)
jmp 0xabcb1
movq -0x3e8(%rbp), %rdi
leaq 0x13dc6a(%rip), %rsi    # 0x1e9929
callq 0x34600
movq %rax, -0x3f0(%rbp)
jmp 0xabccd
movq -0x3f0(%rbp), %rdi
leaq 0x134ad1(%rip), %rsi    # 0x1e07ac
callq 0x34320
movq %rax, -0x3f8(%rbp)
jmp 0xabce9
movq -0x1a8(%rbp), %rdx
leaq -0xa0(%rbp), %rdi
movq %rdx, %rsi
callq 0xc6d00
movq %rax, -0x400(%rbp)
jmp 0xabd08
movq -0x400(%rbp), %rsi
movq -0x3f8(%rbp), %rdi
callq 0x343a0
movq %rax, -0x408(%rbp)
jmp 0xabd24
movq -0x408(%rbp), %rdi
leaq 0x14a749(%rip), %rsi    # 0x1f647b
callq 0x34320
jmp 0xabd39
leaq -0x338(%rbp), %rdi
callq 0x10ff0
jmp 0xabd47
leaq -0x358(%rbp), %rdi
callq 0x3100
leaq -0x359(%rbp), %rdi
callq 0x3290
leaq -0x198(%rbp), %rax
movq %rax, -0x38(%rbp)
movq -0x38(%rbp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
jmp 0xabaf2
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xa8(%rbp)
movl %eax, -0xac(%rbp)
jmp 0xabe3c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xa8(%rbp)
movl %eax, -0xac(%rbp)
jmp 0xabe30
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xa8(%rbp)
movl %eax, -0xac(%rbp)
jmp 0xabe01
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xa8(%rbp)
movl %eax, -0xac(%rbp)
jmp 0xabdf5
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xa8(%rbp)
movl %eax, -0xac(%rbp)
leaq -0x338(%rbp), %rdi
callq 0x10ff0
jmp 0xabdf3
jmp 0xabdf5
leaq -0x358(%rbp), %rdi
callq 0x3100
leaq -0x359(%rbp), %rdi
callq 0x3290
jmp 0xabe30
leaq -0xe0(%rbp), %rdi
callq 0xc6d50
leaq -0xa0(%rbp), %rdi
callq 0xc6d90
addq $0x410, %rsp            # imm = 0x410
popq %rbp
retq
leaq -0xe0(%rbp), %rdi
callq 0xc6d50
leaq -0xa0(%rbp), %rdi
callq 0xc6d90
movq -0xa8(%rbp), %rdi
callq 0x33a0
movq %rax, %rdi
callq 0x116d0
nopl (%rax)