// File: dsharlet[P]array/test/ein_reduce.cpp
// Function: nda::test_make_ein_sum_matrix_vector_integer_body()
TEST(make_ein_sum_matrix_vector_integer) {
  constexpr index_t M = 50;
  constexpr index_t N = 64;
  matrix<char, M, N> B;
  vector<char, N> x;
  fill_pattern(B);
  fill_pattern(x);

  // Compute the matrix-vector product B*x.
  vector<int, M> Bx = make_ein_sum<int, i>(cast<short>(ein<i, j>(B)) * cast<short>(ein<j>(x)));

  ASSERT_EQ(Bx.rank(), 1);
  ASSERT_EQ(Bx.i().extent(), B.rows());
  for (index_t i : Bx.i()) {
    int Bx_i = 0;
    for (index_t j : x.i()) {
      Bx_i += static_cast<short>(B(i, j)) * static_cast<short>(x(j));
    }
    ASSERT_EQ(Bx(i), Bx_i);
  }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xa90, %rsp            # imm = 0xA90
movq $0x32, -0x1a8(%rbp)
movq $0x40, -0x1b0(%rbp)
leaq -0x1f8(%rbp), %rdi
callq 0xc8220
leaq -0x228(%rbp), %rdi
callq 0xc8250
jmp 0xb1c1b
leaq -0x1f8(%rbp), %rdi
xorl %esi, %esi
callq 0xc8280
jmp 0xb1c2b
leaq -0x228(%rbp), %rdi
xorl %esi, %esi
callq 0xc82c0
jmp 0xb1c3b
leaq -0x310(%rbp), %rdi
leaq -0x1f8(%rbp), %rsi
callq 0xc8340
jmp 0xb1c50
leaq -0x2e0(%rbp), %rdi
leaq -0x310(%rbp), %rsi
callq 0xc8300
jmp 0xb1c65
leaq -0x340(%rbp), %rdi
leaq -0x228(%rbp), %rsi
callq 0xc8410
jmp 0xb1c7a
leaq -0x328(%rbp), %rdi
leaq -0x340(%rbp), %rsi
callq 0xc83d0
jmp 0xb1c8f
leaq -0x2b0(%rbp), %rdi
leaq -0x2e0(%rbp), %rsi
leaq -0x328(%rbp), %rdx
callq 0xc8380
jmp 0xb1cab
movl $0x0, -0x344(%rbp)
leaq -0x345(%rbp), %rdi
movq %rdi, -0x8e0(%rbp)
callq 0x10e30
movq -0x8e0(%rbp), %rax
leaq -0x268(%rbp), %rcx
movq %rcx, -0x58(%rbp)
leaq -0x2b0(%rbp), %rcx
movq %rcx, -0x60(%rbp)
leaq -0x344(%rbp), %rcx
movq %rcx, -0x68(%rbp)
movq %rax, -0x70(%rbp)
movq -0x60(%rbp), %rsi
leaq -0x80(%rbp), %rdi
callq 0xbe180
jmp 0xb1d03
movq -0x68(%rbp), %rdx
movq -0x70(%rbp), %rcx
leaq -0xb0(%rbp), %rdi
leaq -0x80(%rbp), %rsi
callq 0xdb790
jmp 0xb1d1d
movq -0x60(%rbp), %rax
movq %rax, -0x8e8(%rbp)
leaq -0x128(%rbp), %rdi
leaq -0xb0(%rbp), %rsi
callq 0xdb7d0
jmp 0xb1d3d
movq -0x8e8(%rbp), %rdx
leaq -0x110(%rbp), %rdi
leaq -0x128(%rbp), %rsi
callq 0xdec40
jmp 0xb1d59
leaq -0x150(%rbp), %rax
movq %rax, -0x8(%rbp)
leaq -0x110(%rbp), %rax
movq %rax, -0x10(%rbp)
movq $0x2, -0x18(%rbp)
movq -0x10(%rbp), %rdx
movq %rdx, %r8
addq $0x18, %r8
leaq -0x38(%rbp), %rdi
leaq -0x39(%rbp), %rsi
leaq -0x3a(%rbp), %rcx
callq 0xbe430
jmp 0xb1d95
movq -0x10(%rbp), %rsi
leaq -0x38(%rbp), %rdi
callq 0xbed30
jmp 0xb1da4
movq -0x10(%rbp), %rax
movq (%rax), %rcx
movq %rcx, -0x150(%rbp)
movq 0x8(%rax), %rcx
movq %rcx, -0x148(%rbp)
movq 0x10(%rax), %rax
movq %rax, -0x140(%rbp)
leaq -0x268(%rbp), %rdi
leaq -0xb0(%rbp), %rsi
callq 0xdb850
jmp 0xb1e1a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x130(%rbp)
movl %eax, -0x134(%rbp)
leaq -0xb0(%rbp), %rdi
callq 0xc81a0
movq -0x130(%rbp), %rcx
movl -0x134(%rbp), %eax
movq %rcx, -0x8f8(%rbp)
movl %eax, -0x8ec(%rbp)
jmp 0xb24a8
leaq -0xb0(%rbp), %rdi
callq 0xc81a0
leaq -0x345(%rbp), %rdi
callq 0x10e50
callq 0xc8040
movq %rax, -0x900(%rbp)
jmp 0xb1e40
movq -0x900(%rbp), %rax
subq $0x1, %rax
sete %al
movb %al, -0x909(%rbp)
leaq -0x4f9(%rbp), %rdi
movq %rdi, -0x908(%rbp)
callq 0x33b0
movq -0x908(%rbp), %rdx
leaq 0x137e43(%rip), %rsi    # 0x1e9cb8
leaq -0x4f8(%rbp), %rdi
callq 0x10a90
jmp 0xb1e83
movb -0x909(%rbp), %al
movzbl %al, %esi
andl $0x1, %esi
leaq -0x4d8(%rbp), %rdi
leaq -0x4f8(%rbp), %rdx
callq 0x10f80
jmp 0xb1ea4
leaq 0x12a93a(%rip), %rsi    # 0x1dc7e5
leaq -0x4d8(%rbp), %rdi
callq 0x34320
movq %rax, -0x918(%rbp)
jmp 0xb1ec0
movq -0x918(%rbp), %rdi
leaq 0x137df9(%rip), %rsi    # 0x1e9cc7
callq 0x344d0
movq %rax, -0x920(%rbp)
jmp 0xb1edc
movq -0x920(%rbp), %rdi
leaq 0x12e8c2(%rip), %rsi    # 0x1e07ac
callq 0x34320
movq %rax, -0x928(%rbp)
jmp 0xb1ef8
callq 0xc8040
movq %rax, -0x930(%rbp)
jmp 0xb1f06
movq -0x928(%rbp), %rdi
movq -0x930(%rbp), %rax
movq %rax, -0x508(%rbp)
leaq -0x508(%rbp), %rsi
callq 0x355c0
movq %rax, -0x938(%rbp)
jmp 0xb1f30
movq -0x938(%rbp), %rdi
leaq 0x12a8a7(%rip), %rsi    # 0x1dc7e5
callq 0x34320
movq %rax, -0x940(%rbp)
jmp 0xb1f4c
movq -0x940(%rbp), %rdi
leaq 0x132113(%rip), %rsi    # 0x1e406d
callq 0x34320
movq %rax, -0x948(%rbp)
jmp 0xb1f68
movq -0x948(%rbp), %rdi
leaq 0x12e836(%rip), %rsi    # 0x1e07ac
callq 0x34320
movq %rax, -0x950(%rbp)
jmp 0xb1f84
movq -0x950(%rbp), %rdi
movl $0x1, -0x50c(%rbp)
leaq -0x50c(%rbp), %rsi
callq 0x343a0
movq %rax, -0x958(%rbp)
jmp 0xb1faa
movq -0x958(%rbp), %rdi
leaq 0x1444c3(%rip), %rsi    # 0x1f647b
callq 0x34320
jmp 0xb1fbf
leaq -0x4d8(%rbp), %rdi
callq 0x10ff0
jmp 0xb1fcd
leaq -0x4f8(%rbp), %rdi
callq 0x3100
leaq -0x4f9(%rbp), %rdi
callq 0x3290
leaq -0x268(%rbp), %rdi
callq 0xc8050
movq %rax, -0x960(%rbp)
jmp 0xb1ffa
movq -0x960(%rbp), %rax
movq %rax, -0x158(%rbp)
movq -0x158(%rbp), %rax
addq $0x8, %rax
movq %rax, -0x50(%rbp)
leaq -0x1f8(%rbp), %rdi
callq 0xc8450
movq %rax, -0x968(%rbp)
jmp 0xb202c
movq -0x968(%rbp), %rax
subq $0x32, %rax
sete %al
movb %al, -0x971(%rbp)
leaq -0x6c1(%rbp), %rdi
movq %rdi, -0x970(%rbp)
callq 0x33b0
movq -0x970(%rbp), %rdx
leaq 0x137c70(%rip), %rsi    # 0x1e9cd1
leaq -0x6c0(%rbp), %rdi
callq 0x10a90
jmp 0xb206f
movb -0x971(%rbp), %al
movzbl %al, %esi
andl $0x1, %esi
leaq -0x6a0(%rbp), %rdi
leaq -0x6c0(%rbp), %rdx
callq 0x10f80
jmp 0xb2090
leaq 0x12a74e(%rip), %rsi    # 0x1dc7e5
leaq -0x6a0(%rbp), %rdi
callq 0x34320
movq %rax, -0x980(%rbp)
jmp 0xb20ac
movq -0x980(%rbp), %rdi
leaq 0x137c33(%rip), %rsi    # 0x1e9ced
callq 0x969a0
movq %rax, -0x988(%rbp)
jmp 0xb20c8
movq -0x988(%rbp), %rdi
leaq 0x12e6d6(%rip), %rsi    # 0x1e07ac
callq 0x34320
movq %rax, -0x990(%rbp)
jmp 0xb20e4
leaq -0x268(%rbp), %rdi
callq 0xc8050
movq %rax, -0x998(%rbp)
jmp 0xb20f9
movq -0x998(%rbp), %rax
movq %rax, -0x160(%rbp)
movq -0x160(%rbp), %rax
addq $0x8, %rax
movq %rax, -0x48(%rbp)
movq -0x990(%rbp), %rdi
movq $0x32, -0x6d0(%rbp)
leaq -0x6d0(%rbp), %rsi
callq 0x34510
movq %rax, -0x9a0(%rbp)
jmp 0xb213d
movq -0x9a0(%rbp), %rdi
leaq 0x12a69a(%rip), %rsi    # 0x1dc7e5
callq 0x34320
movq %rax, -0x9a8(%rbp)
jmp 0xb2159
movq -0x9a8(%rbp), %rdi
leaq 0x137b7d(%rip), %rsi    # 0x1e9ce4
callq 0x36600
movq %rax, -0x9b0(%rbp)
jmp 0xb2175
movq -0x9b0(%rbp), %rdi
leaq 0x12e629(%rip), %rsi    # 0x1e07ac
callq 0x34320
movq %rax, -0x9b8(%rbp)
jmp 0xb2191
leaq -0x1f8(%rbp), %rdi
callq 0xc8450
movq %rax, -0x9c0(%rbp)
jmp 0xb21a6
movq -0x9b8(%rbp), %rdi
movq -0x9c0(%rbp), %rax
movq %rax, -0x6d8(%rbp)
leaq -0x6d8(%rbp), %rsi
callq 0x34510
movq %rax, -0x9c8(%rbp)
jmp 0xb21d0
movq -0x9c8(%rbp), %rdi
leaq 0x14429d(%rip), %rsi    # 0x1f647b
callq 0x34320
jmp 0xb21e5
leaq -0x6a0(%rbp), %rdi
callq 0x10ff0
jmp 0xb21f3
leaq -0x6c0(%rbp), %rdi
callq 0x3100
leaq -0x6c1(%rbp), %rdi
callq 0x3290
leaq -0x268(%rbp), %rdi
callq 0xc8050
movq %rax, -0x9d0(%rbp)
jmp 0xb2220
movq -0x9d0(%rbp), %rax
movq %rax, -0x6e0(%rbp)
movq -0x6e0(%rbp), %rdi
callq 0xc8090
movq %rax, -0x9d8(%rbp)
jmp 0xb2243
movq -0x9d8(%rbp), %rax
movq %rax, -0x6e8(%rbp)
movq -0x6e0(%rbp), %rdi
callq 0xc80c0
movq %rax, -0x9e0(%rbp)
jmp 0xb2266
movq -0x9e0(%rbp), %rax
movq %rax, -0x6f0(%rbp)
leaq -0x6e8(%rbp), %rax
movq %rax, -0x188(%rbp)
leaq -0x6f0(%rbp), %rax
movq %rax, -0x190(%rbp)
movq -0x188(%rbp), %rax
movq (%rax), %rax
movq -0x190(%rbp), %rcx
cmpq (%rcx), %rax
setne %al
movb %al, -0x9e1(%rbp)
movb -0x9e1(%rbp), %al
testb $0x1, %al
jne 0xb22bc
jmp 0xb27fd
leaq -0x6e8(%rbp), %rax
movq %rax, -0x178(%rbp)
movq -0x178(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x9f0(%rbp)
movq -0x9f0(%rbp), %rax
movq %rax, -0x6f8(%rbp)
movl $0x0, -0x6fc(%rbp)
leaq -0x228(%rbp), %rdi
callq 0xc8470
movq %rax, -0x9f8(%rbp)
jmp 0xb2308
movq -0x9f8(%rbp), %rax
movq %rax, -0x708(%rbp)
movq -0x708(%rbp), %rdi
callq 0xc6c40
movq %rax, -0xa00(%rbp)
jmp 0xb232b
movq -0xa00(%rbp), %rax
movq %rax, -0x710(%rbp)
movq -0x708(%rbp), %rdi
callq 0xc6c70
movq %rax, -0xa08(%rbp)
jmp 0xb234e
movq -0xa08(%rbp), %rax
movq %rax, -0x718(%rbp)
leaq -0x710(%rbp), %rax
movq %rax, -0x198(%rbp)
leaq -0x718(%rbp), %rax
movq %rax, -0x1a0(%rbp)
movq -0x198(%rbp), %rax
movq (%rax), %rax
movq -0x1a0(%rbp), %rcx
cmpq (%rcx), %rax
setne %al
movb %al, -0xa09(%rbp)
movb -0xa09(%rbp), %al
testb $0x1, %al
jne 0xb23a4
jmp 0xb25b8
leaq -0x710(%rbp), %rax
movq %rax, -0x180(%rbp)
movq -0x180(%rbp), %rax
movq (%rax), %rax
movq %rax, -0xa18(%rbp)
movq -0xa18(%rbp), %rax
movq %rax, -0x720(%rbp)
movq -0x6f8(%rbp), %rsi
movq -0x720(%rbp), %rdx
leaq -0x1f8(%rbp), %rdi
callq 0xc8490
movq %rax, -0xa20(%rbp)
jmp 0xb23f4
movq -0xa20(%rbp), %rax
movsbl (%rax), %eax
movl %eax, -0xa2c(%rbp)
movq -0x720(%rbp), %rsi
leaq -0x228(%rbp), %rdi
callq 0xc84e0
movq %rax, -0xa28(%rbp)
jmp 0xb2420
movl -0xa2c(%rbp), %eax
movq -0xa28(%rbp), %rcx
movsbl (%rcx), %ecx
movswl %cx, %ecx
imull %ecx, %eax
addl -0x6fc(%rbp), %eax
movl %eax, -0x6fc(%rbp)
leaq -0x710(%rbp), %rax
movq %rax, -0x168(%rbp)
movq -0x168(%rbp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
jmp 0xb235c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x230(%rbp)
movl %eax, -0x234(%rbp)
jmp 0xb2842
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x230(%rbp)
movl %eax, -0x234(%rbp)
jmp 0xb2836
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x8f8(%rbp)
movl %eax, -0x8ec(%rbp)
jmp 0xb24a8
movq -0x8f8(%rbp), %rcx
movl -0x8ec(%rbp), %eax
movq %rcx, -0x230(%rbp)
movl %eax, -0x234(%rbp)
leaq -0x345(%rbp), %rdi
callq 0x10e50
jmp 0xb2836
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x230(%rbp)
movl %eax, -0x234(%rbp)
jmp 0xb282a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x230(%rbp)
movl %eax, -0x234(%rbp)
jmp 0xb2540
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x230(%rbp)
movl %eax, -0x234(%rbp)
jmp 0xb2534
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x230(%rbp)
movl %eax, -0x234(%rbp)
leaq -0x4d8(%rbp), %rdi
callq 0x10ff0
jmp 0xb2532
jmp 0xb2534
leaq -0x4f8(%rbp), %rdi
callq 0x3100
leaq -0x4f9(%rbp), %rdi
callq 0x3290
jmp 0xb282a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x230(%rbp)
movl %eax, -0x234(%rbp)
jmp 0xb25a7
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x230(%rbp)
movl %eax, -0x234(%rbp)
jmp 0xb259b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x230(%rbp)
movl %eax, -0x234(%rbp)
leaq -0x6a0(%rbp), %rdi
callq 0x10ff0
jmp 0xb2599
jmp 0xb259b
leaq -0x6c0(%rbp), %rdi
callq 0x3100
leaq -0x6c1(%rbp), %rdi
callq 0x3290
jmp 0xb282a
movq -0x6f8(%rbp), %rsi
leaq -0x268(%rbp), %rdi
callq 0xc8160
movq %rax, -0xa38(%rbp)
jmp 0xb25d4
movq -0xa38(%rbp), %rax
movl (%rax), %eax
movl -0x6fc(%rbp), %ecx
subl %ecx, %eax
sete %al
movb %al, -0xa41(%rbp)
leaq -0x8d1(%rbp), %rdi
movq %rdi, -0xa40(%rbp)
callq 0x33b0
movq -0xa40(%rbp), %rdx
leaq 0x1376ee(%rip), %rsi    # 0x1e9cfd
leaq -0x8d0(%rbp), %rdi
callq 0x10a90
jmp 0xb261d
movb -0xa41(%rbp), %al
movzbl %al, %esi
andl $0x1, %esi
leaq -0x8b0(%rbp), %rdi
leaq -0x8d0(%rbp), %rdx
callq 0x10f80
jmp 0xb263e
leaq 0x12a1a0(%rip), %rsi    # 0x1dc7e5
leaq -0x8b0(%rbp), %rdi
callq 0x34320
movq %rax, -0xa50(%rbp)
jmp 0xb265a
movq -0xa50(%rbp), %rdi
leaq 0x1376a3(%rip), %rsi    # 0x1e9d0b
callq 0x661c0
movq %rax, -0xa58(%rbp)
jmp 0xb2676
movq -0xa58(%rbp), %rdi
leaq 0x12e128(%rip), %rsi    # 0x1e07ac
callq 0x34320
movq %rax, -0xa60(%rbp)
jmp 0xb2692
movq -0x6f8(%rbp), %rsi
leaq -0x268(%rbp), %rdi
callq 0xc8160
movq %rax, -0xa68(%rbp)
jmp 0xb26ae
movq -0xa68(%rbp), %rsi
movq -0xa60(%rbp), %rdi
callq 0x343a0
movq %rax, -0xa70(%rbp)
jmp 0xb26ca
movq -0xa70(%rbp), %rdi
leaq 0x12a10d(%rip), %rsi    # 0x1dc7e5
callq 0x34320
movq %rax, -0xa78(%rbp)
jmp 0xb26e6
movq -0xa78(%rbp), %rdi
leaq 0x137612(%rip), %rsi    # 0x1e9d06
callq 0x34360
movq %rax, -0xa80(%rbp)
jmp 0xb2702
movq -0xa80(%rbp), %rdi
leaq 0x12e09c(%rip), %rsi    # 0x1e07ac
callq 0x34320
movq %rax, -0xa88(%rbp)
jmp 0xb271e
movq -0xa88(%rbp), %rdi
leaq -0x6fc(%rbp), %rsi
callq 0x343a0
movq %rax, -0xa90(%rbp)
jmp 0xb273a
movq -0xa90(%rbp), %rdi
leaq 0x143d33(%rip), %rsi    # 0x1f647b
callq 0x34320
jmp 0xb274f
leaq -0x8b0(%rbp), %rdi
callq 0x10ff0
jmp 0xb275d
leaq -0x8d0(%rbp), %rdi
callq 0x3100
leaq -0x8d1(%rbp), %rdi
callq 0x3290
leaq -0x6e8(%rbp), %rax
movq %rax, -0x170(%rbp)
movq -0x170(%rbp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
jmp 0xb2274
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x230(%rbp)
movl %eax, -0x234(%rbp)
jmp 0xb27ef
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x230(%rbp)
movl %eax, -0x234(%rbp)
jmp 0xb27e3
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x230(%rbp)
movl %eax, -0x234(%rbp)
leaq -0x8b0(%rbp), %rdi
callq 0x10ff0
jmp 0xb27e1
jmp 0xb27e3
leaq -0x8d0(%rbp), %rdi
callq 0x3100
leaq -0x8d1(%rbp), %rdi
callq 0x3290
jmp 0xb282a
leaq -0x268(%rbp), %rdi
callq 0xc81a0
leaq -0x228(%rbp), %rdi
callq 0xc8520
leaq -0x1f8(%rbp), %rdi
callq 0xc8560
addq $0xa90, %rsp            # imm = 0xA90
popq %rbp
retq
leaq -0x268(%rbp), %rdi
callq 0xc81a0
leaq -0x228(%rbp), %rdi
callq 0xc8520
leaq -0x1f8(%rbp), %rdi
callq 0xc8560
movq -0x230(%rbp), %rdi
callq 0x33a0
movq %rax, %rdi
callq 0x116d0
nopw %cs:(%rax,%rax)