// File: dsharlet[P]array/test/ein_reduce.cpp
// Function: nda::test_ein_reduce_transpose_body()
TEST(ein_reduce_transpose) {
  constexpr index_t M = 12;
  constexpr index_t N = 20;
  matrix<int, M, N> A;
  fill_pattern(A);

  // Transpose A using ein_reduce.
  matrix<int, N, M> AT;
  ein_reduce(ein<i, j>(AT) = ein<j, i>(A));

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

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x4f0, %rsp            # imm = 0x4F0
movq $0xc, -0x90(%rbp)
movq $0x14, -0x98(%rbp)
leaq -0xe0(%rbp), %rdi
movq %rdi, -0x428(%rbp)
callq 0xc6f60
movq -0x428(%rbp), %rdi
xorl %esi, %esi
callq 0xc6f90
jmp 0xacb24
leaq -0x138(%rbp), %rdi
callq 0xc6fc0
jmp 0xacb32
leaq -0x1c8(%rbp), %rdi
leaq -0xe0(%rbp), %rsi
callq 0xc6ff0
jmp 0xacb47
leaq -0x1f8(%rbp), %rdi
leaq -0x138(%rbp), %rsi
callq 0xc7030
jmp 0xacb5c
leaq -0x198(%rbp), %rdi
leaq -0x1f8(%rbp), %rsi
leaq -0x1c8(%rbp), %rdx
callq 0xc7070
jmp 0xacb78
leaq -0x228(%rbp), %rax
movq %rax, -0x8(%rbp)
leaq -0x198(%rbp), %rax
movq %rax, -0x10(%rbp)
movq $0x2, -0x18(%rbp)
movq -0x10(%rbp), %rdx
movq %rdx, %r8
addq $0x30, %r8
leaq -0x40(%rbp), %rdi
leaq -0x41(%rbp), %rsi
leaq -0x42(%rbp), %rcx
callq 0xb6660
jmp 0xacbb4
movq -0x10(%rbp), %rsi
leaq -0x40(%rbp), %rdi
callq 0xb6eb0
jmp 0xacbc3
movq -0x10(%rbp), %rsi
leaq -0x228(%rbp), %rdi
movl $0x30, %edx
callq 0x31c0
leaq -0x138(%rbp), %rdi
callq 0xc70b0
movq %rax, -0x430(%rbp)
jmp 0xacbed
movq -0x430(%rbp), %rax
movq %rax, -0x230(%rbp)
movq -0x230(%rbp), %rdi
callq 0xc70d0
movq %rax, -0x438(%rbp)
jmp 0xacc10
movq -0x438(%rbp), %rax
movq %rax, -0x238(%rbp)
movq -0x230(%rbp), %rdi
callq 0xc7100
movq %rax, -0x440(%rbp)
jmp 0xacc33
movq -0x440(%rbp), %rax
movq %rax, -0x240(%rbp)
leaq -0x238(%rbp), %rax
movq %rax, -0x70(%rbp)
leaq -0x240(%rbp), %rax
movq %rax, -0x78(%rbp)
movq -0x70(%rbp), %rax
movq (%rax), %rax
movq -0x78(%rbp), %rcx
cmpq (%rcx), %rax
setne %al
movb %al, -0x441(%rbp)
movb -0x441(%rbp), %al
testb $0x1, %al
jne 0xacc7d
jmp 0xad066
leaq -0x238(%rbp), %rax
movq %rax, -0x60(%rbp)
movq -0x60(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x450(%rbp)
movq -0x450(%rbp), %rax
movq %rax, -0x248(%rbp)
leaq -0x138(%rbp), %rdi
callq 0xc7150
movq %rax, -0x458(%rbp)
jmp 0xaccb9
movq -0x458(%rbp), %rax
movq %rax, -0x250(%rbp)
movq -0x250(%rbp), %rdi
callq 0xc7170
movq %rax, -0x460(%rbp)
jmp 0xaccdc
movq -0x460(%rbp), %rax
movq %rax, -0x258(%rbp)
movq -0x250(%rbp), %rdi
callq 0xc71a0
movq %rax, -0x468(%rbp)
jmp 0xaccff
movq -0x468(%rbp), %rax
movq %rax, -0x260(%rbp)
leaq -0x258(%rbp), %rax
movq %rax, -0x80(%rbp)
leaq -0x260(%rbp), %rax
movq %rax, -0x88(%rbp)
movq -0x80(%rbp), %rax
movq (%rax), %rax
movq -0x88(%rbp), %rcx
cmpq (%rcx), %rax
setne %al
movb %al, -0x469(%rbp)
movb -0x469(%rbp), %al
testb $0x1, %al
jne 0xacd4f
jmp 0xad046
leaq -0x258(%rbp), %rax
movq %rax, -0x68(%rbp)
movq -0x68(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x478(%rbp)
movq -0x478(%rbp), %rax
movq %rax, -0x268(%rbp)
movq -0x248(%rbp), %rsi
movq -0x268(%rbp), %rdx
leaq -0x138(%rbp), %rdi
callq 0xc71f0
movq %rax, -0x480(%rbp)
jmp 0xacd99
movq -0x480(%rbp), %rax
movl (%rax), %eax
movl %eax, -0x48c(%rbp)
movq -0x268(%rbp), %rsi
movq -0x248(%rbp), %rdx
leaq -0xe0(%rbp), %rdi
callq 0xc7240
movq %rax, -0x488(%rbp)
jmp 0xacdcb
movl -0x48c(%rbp), %eax
movq -0x488(%rbp), %rcx
movl (%rcx), %ecx
subl %ecx, %eax
sete %al
movb %al, -0x499(%rbp)
leaq -0x419(%rbp), %rdi
movq %rdi, -0x498(%rbp)
callq 0x33b0
movq -0x498(%rbp), %rdx
leaq 0x13cb9d(%rip), %rsi    # 0x1e99a3
leaq -0x418(%rbp), %rdi
callq 0x10a90
jmp 0xace14
movb -0x499(%rbp), %al
movzbl %al, %esi
andl $0x1, %esi
leaq -0x3f8(%rbp), %rdi
leaq -0x418(%rbp), %rdx
callq 0x10f80
jmp 0xace35
leaq 0x12f9a9(%rip), %rsi    # 0x1dc7e5
leaq -0x3f8(%rbp), %rdi
callq 0x34320
movq %rax, -0x4a8(%rbp)
jmp 0xace51
movq -0x4a8(%rbp), %rdi
leaq 0x13cb58(%rip), %rsi    # 0x1e99b7
callq 0x36600
movq %rax, -0x4b0(%rbp)
jmp 0xace6d
movq -0x4b0(%rbp), %rdi
leaq 0x133931(%rip), %rsi    # 0x1e07ac
callq 0x34320
movq %rax, -0x4b8(%rbp)
jmp 0xace89
movq -0x248(%rbp), %rsi
movq -0x268(%rbp), %rdx
leaq -0x138(%rbp), %rdi
callq 0xc71f0
movq %rax, -0x4c0(%rbp)
jmp 0xaceac
movq -0x4c0(%rbp), %rsi
movq -0x4b8(%rbp), %rdi
callq 0x343a0
movq %rax, -0x4c8(%rbp)
jmp 0xacec8
movq -0x4c8(%rbp), %rdi
leaq 0x12f90f(%rip), %rsi    # 0x1dc7e5
callq 0x34320
movq %rax, -0x4d0(%rbp)
jmp 0xacee4
movq -0x4d0(%rbp), %rdi
leaq 0x13cabd(%rip), %rsi    # 0x1e99af
callq 0x34600
movq %rax, -0x4d8(%rbp)
jmp 0xacf00
movq -0x4d8(%rbp), %rdi
leaq 0x13389e(%rip), %rsi    # 0x1e07ac
callq 0x34320
movq %rax, -0x4e0(%rbp)
jmp 0xacf1c
movq -0x268(%rbp), %rsi
movq -0x248(%rbp), %rdx
leaq -0xe0(%rbp), %rdi
callq 0xc7240
movq %rax, -0x4e8(%rbp)
jmp 0xacf3f
movq -0x4e8(%rbp), %rsi
movq -0x4e0(%rbp), %rdi
callq 0x343a0
movq %rax, -0x4f0(%rbp)
jmp 0xacf5b
movq -0x4f0(%rbp), %rdi
leaq 0x149512(%rip), %rsi    # 0x1f647b
callq 0x34320
jmp 0xacf70
leaq -0x3f8(%rbp), %rdi
callq 0x10ff0
jmp 0xacf7e
leaq -0x418(%rbp), %rdi
callq 0x3100
leaq -0x419(%rbp), %rdi
callq 0x3290
leaq -0x258(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
jmp 0xacd0d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xe8(%rbp)
movl %eax, -0xec(%rbp)
jmp 0xad093
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xe8(%rbp)
movl %eax, -0xec(%rbp)
jmp 0xad087
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xe8(%rbp)
movl %eax, -0xec(%rbp)
jmp 0xad038
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xe8(%rbp)
movl %eax, -0xec(%rbp)
jmp 0xad02c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xe8(%rbp)
movl %eax, -0xec(%rbp)
leaq -0x3f8(%rbp), %rdi
callq 0x10ff0
jmp 0xad02a
jmp 0xad02c
leaq -0x418(%rbp), %rdi
callq 0x3100
leaq -0x419(%rbp), %rdi
callq 0x3290
jmp 0xad087
jmp 0xad048
leaq -0x238(%rbp), %rax
movq %rax, -0x58(%rbp)
movq -0x58(%rbp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
jmp 0xacc41
leaq -0x138(%rbp), %rdi
callq 0xc7290
leaq -0xe0(%rbp), %rdi
callq 0xc72d0
addq $0x4f0, %rsp            # imm = 0x4F0
popq %rbp
retq
leaq -0x138(%rbp), %rdi
callq 0xc7290
leaq -0xe0(%rbp), %rdi
callq 0xc72d0
movq -0xe8(%rbp), %rdi
callq 0x33a0
movq %rax, %rdi
callq 0x116d0
nopw %cs:(%rax,%rax)