// File: dsharlet[P]array/test/ein_reduce.cpp
// Function: nda::test_make_ein_sum_dot_body()
TEST(make_ein_sum_dot) {
  constexpr index_t N = 64;
  vector<int, N> x;
  vector<int, N> y;
  fill_pattern(x);
  fill_pattern(y, 2);

  // Compute the dot product x.y using an ein_sum.
  int dot = make_ein_sum<int>(ein<i>(x) * ein<i>(y));

  int dot_ref = 0;
  for (index_t i : x.i()) {
    dot_ref += x(i) * y(i);
  }
  ASSERT_EQ(dot, dot_ref);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x4d0, %rsp            # imm = 0x4D0
movq $0x40, -0x120(%rbp)
leaq -0x150(%rbp), %rdi
callq 0xc6dd0
leaq -0x180(%rbp), %rdi
callq 0xc6dd0
jmp 0xac480
leaq -0x150(%rbp), %rdi
xorl %esi, %esi
callq 0xc6ee0
jmp 0xac490
leaq -0x180(%rbp), %rdi
movl $0x2, %esi
callq 0xc6ee0
jmp 0xac4a3
leaq -0x200(%rbp), %rdi
leaq -0x150(%rbp), %rsi
callq 0xc6e00
jmp 0xac4b8
leaq -0x218(%rbp), %rdi
leaq -0x180(%rbp), %rsi
callq 0xc6e00
jmp 0xac4cd
leaq -0x1e8(%rbp), %rdi
leaq -0x200(%rbp), %rsi
leaq -0x218(%rbp), %rdx
callq 0xc6f10
jmp 0xac4e9
movl $0x0, -0x21c(%rbp)
leaq -0x21d(%rbp), %rdi
movq %rdi, -0x408(%rbp)
callq 0x10e30
movq -0x408(%rbp), %rax
leaq -0x1b8(%rbp), %rcx
movq %rcx, -0x40(%rbp)
leaq -0x1e8(%rbp), %rcx
movq %rcx, -0x48(%rbp)
leaq -0x21c(%rbp), %rcx
movq %rcx, -0x50(%rbp)
movq %rax, -0x58(%rbp)
movq -0x48(%rbp), %rdi
callq 0xb5f40
jmp 0xac53d
movq -0x50(%rbp), %rdx
movq -0x58(%rbp), %rcx
leaq -0x88(%rbp), %rdi
leaq -0x59(%rbp), %rsi
callq 0xcbfb0
jmp 0xac557
movq -0x48(%rbp), %rax
movq %rax, -0x418(%rbp)
leaq -0x88(%rbp), %rdi
callq 0xcbff0
movq %rax, -0x410(%rbp)
jmp 0xac577
movq -0x418(%rbp), %rdx
movq -0x410(%rbp), %rax
movq %rax, -0xd8(%rbp)
leaq -0xc8(%rbp), %rdi
leaq -0xd8(%rbp), %rsi
callq 0xcc740
jmp 0xac5a1
leaq -0xc8(%rbp), %rax
movq %rax, -0x18(%rbp)
movq $0x1, -0x20(%rbp)
movq -0x18(%rbp), %rdx
movq %rdx, %r8
addq $0x10, %r8
leaq -0x30(%rbp), %rdi
leaq -0x31(%rbp), %rsi
leaq -0x32(%rbp), %rcx
callq 0xb5f90
jmp 0xac5d2
movq -0x18(%rbp), %rsi
leaq -0x30(%rbp), %rdi
callq 0xb6420
jmp 0xac5e1
movq -0x18(%rbp), %rax
movq (%rax), %rcx
movq %rcx, -0x10(%rbp)
movq 0x8(%rax), %rax
movq %rax, -0x8(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x420(%rbp)
movq -0x420(%rbp), %rax
movq %rax, -0xf8(%rbp)
leaq -0x1b8(%rbp), %rdi
leaq -0x88(%rbp), %rsi
callq 0x99b30
jmp 0xac65f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xe0(%rbp)
movl %eax, -0xe4(%rbp)
leaq -0x88(%rbp), %rdi
callq 0x11610
movq -0xe0(%rbp), %rcx
movl -0xe4(%rbp), %eax
movq %rcx, -0x430(%rbp)
movl %eax, -0x424(%rbp)
jmp 0xac864
leaq -0x88(%rbp), %rdi
callq 0x11610
leaq -0x1b8(%rbp), %rdi
callq 0xc6e80
movq %rax, -0x438(%rbp)
jmp 0xac680
movq -0x438(%rbp), %rax
movl (%rax), %eax
movl %eax, -0x444(%rbp)
leaq -0x1b8(%rbp), %rdi
callq 0x11610
leaq -0x21d(%rbp), %rdi
callq 0x10e50
movl -0x444(%rbp), %eax
movl %eax, -0x190(%rbp)
movl $0x0, -0x224(%rbp)
leaq -0x150(%rbp), %rdi
callq 0xc6c00
movq %rax, -0x440(%rbp)
jmp 0xac6d2
movq -0x440(%rbp), %rax
movq %rax, -0x230(%rbp)
movq -0x230(%rbp), %rdi
callq 0xc6c40
movq %rax, -0x450(%rbp)
jmp 0xac6f5
movq -0x450(%rbp), %rax
movq %rax, -0x238(%rbp)
movq -0x230(%rbp), %rdi
callq 0xc6c70
movq %rax, -0x458(%rbp)
jmp 0xac718
movq -0x458(%rbp), %rax
movq %rax, -0x240(%rbp)
leaq -0x238(%rbp), %rax
movq %rax, -0x110(%rbp)
leaq -0x240(%rbp), %rax
movq %rax, -0x118(%rbp)
movq -0x110(%rbp), %rax
movq (%rax), %rax
movq -0x118(%rbp), %rcx
cmpq (%rcx), %rax
setne %al
movb %al, -0x459(%rbp)
movb -0x459(%rbp), %al
testb $0x1, %al
jne 0xac76e
jmp 0xac8af
leaq -0x238(%rbp), %rax
movq %rax, -0x108(%rbp)
movq -0x108(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x468(%rbp)
movq -0x468(%rbp), %rax
movq %rax, -0x248(%rbp)
movq -0x248(%rbp), %rsi
leaq -0x150(%rbp), %rdi
callq 0xc6cc0
movq %rax, -0x470(%rbp)
jmp 0xac7b7
movq -0x470(%rbp), %rax
movl (%rax), %eax
movl %eax, -0x47c(%rbp)
movq -0x248(%rbp), %rsi
leaq -0x180(%rbp), %rdi
callq 0xc6cc0
movq %rax, -0x478(%rbp)
jmp 0xac7e2
movq -0x478(%rbp), %rcx
movl -0x47c(%rbp), %eax
imull (%rcx), %eax
addl -0x224(%rbp), %eax
movl %eax, -0x224(%rbp)
leaq -0x238(%rbp), %rax
movq %rax, -0x100(%rbp)
movq -0x100(%rbp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
jmp 0xac726
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x188(%rbp)
movl %eax, -0x18c(%rbp)
jmp 0xacac0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x188(%rbp)
movl %eax, -0x18c(%rbp)
jmp 0xacab4
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x430(%rbp)
movl %eax, -0x424(%rbp)
jmp 0xac864
movq -0x430(%rbp), %rcx
movl -0x424(%rbp), %eax
movq %rcx, -0x188(%rbp)
movl %eax, -0x18c(%rbp)
jmp 0xac89e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x188(%rbp)
movl %eax, -0x18c(%rbp)
leaq -0x1b8(%rbp), %rdi
callq 0x11610
leaq -0x21d(%rbp), %rdi
callq 0x10e50
jmp 0xacab4
movl -0x190(%rbp), %eax
movl -0x224(%rbp), %ecx
subl %ecx, %eax
sete %al
movb %al, -0x489(%rbp)
leaq -0x3f9(%rbp), %rdi
movq %rdi, -0x488(%rbp)
callq 0x33b0
movq -0x488(%rbp), %rdx
leaq 0x13d098(%rip), %rsi    # 0x1e997f
leaq -0x3f8(%rbp), %rdi
callq 0x10a90
jmp 0xac8f5
movb -0x489(%rbp), %al
movzbl %al, %esi
andl $0x1, %esi
leaq -0x3d8(%rbp), %rdi
leaq -0x3f8(%rbp), %rdx
callq 0x10f80
jmp 0xac916
leaq 0x12fec8(%rip), %rsi    # 0x1dc7e5
leaq -0x3d8(%rbp), %rdi
callq 0x34320
movq %rax, -0x498(%rbp)
jmp 0xac932
movq -0x498(%rbp), %rdi
leaq 0x13d03b(%rip), %rsi    # 0x1e997b
callq 0x356d0
movq %rax, -0x4a0(%rbp)
jmp 0xac94e
movq -0x4a0(%rbp), %rdi
leaq 0x133e50(%rip), %rsi    # 0x1e07ac
callq 0x34320
movq %rax, -0x4a8(%rbp)
jmp 0xac96a
movq -0x4a8(%rbp), %rdi
leaq -0x190(%rbp), %rsi
callq 0x343a0
movq %rax, -0x4b0(%rbp)
jmp 0xac986
movq -0x4b0(%rbp), %rdi
leaq 0x12fe51(%rip), %rsi    # 0x1dc7e5
callq 0x34320
movq %rax, -0x4b8(%rbp)
jmp 0xac9a2
movq -0x4b8(%rbp), %rdi
leaq 0x13cfd6(%rip), %rsi    # 0x1e9986
callq 0x34600
movq %rax, -0x4c0(%rbp)
jmp 0xac9be
movq -0x4c0(%rbp), %rdi
leaq 0x133de0(%rip), %rsi    # 0x1e07ac
callq 0x34320
movq %rax, -0x4c8(%rbp)
jmp 0xac9da
movq -0x4c8(%rbp), %rdi
leaq -0x224(%rbp), %rsi
callq 0x343a0
movq %rax, -0x4d0(%rbp)
jmp 0xac9f6
movq -0x4d0(%rbp), %rdi
leaq 0x149a77(%rip), %rsi    # 0x1f647b
callq 0x34320
jmp 0xaca0b
leaq -0x3d8(%rbp), %rdi
callq 0x10ff0
jmp 0xaca19
leaq -0x3f8(%rbp), %rdi
callq 0x3100
leaq -0x3f9(%rbp), %rdi
callq 0x3290
leaq -0x180(%rbp), %rdi
callq 0xc6d50
leaq -0x150(%rbp), %rdi
callq 0xc6d50
addq $0x4d0, %rsp            # imm = 0x4D0
popq %rbp
retq
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x188(%rbp)
movl %eax, -0x18c(%rbp)
jmp 0xacaa8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x188(%rbp)
movl %eax, -0x18c(%rbp)
jmp 0xaca9c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x188(%rbp)
movl %eax, -0x18c(%rbp)
leaq -0x3d8(%rbp), %rdi
callq 0x10ff0
jmp 0xaca9a
jmp 0xaca9c
leaq -0x3f8(%rbp), %rdi
callq 0x3100
leaq -0x3f9(%rbp), %rdi
callq 0x3290
leaq -0x180(%rbp), %rdi
callq 0xc6d50
leaq -0x150(%rbp), %rdi
callq 0xc6d50
movq -0x188(%rbp), %rdi
callq 0x33a0
movq %rax, %rdi
callq 0x116d0