// File: dsharlet[P]array/test/array.cpp
// Function: nda::test_array_negative_strides_body()
TEST(array_negative_strides) {
  // Test with a negative stride in y.
  array_of_rank<int, 2> a({{0, 10, 3}, {0, 3, -1}});
  fill_pattern(a);

  // Test with a negative stride in x.
  array_of_rank<int, 2> b({{0, 20, -1}, {0, 10}});
  ASSERT_EQ(b.y().stride(), 20);
  fill_pattern(b);

  // Check that making a copy with positive strides preserves
  // the contents of the array.
  dense_array<int, 2> a_compact = make_compact_copy(a);
  ASSERT_LT(0, a_compact.y().stride());
  check_pattern(a_compact);

  dense_array<int, 2> b_compact = make_compact_copy(b);
  ASSERT_EQ(b_compact.x().stride(), 1);
  check_pattern(b_compact);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x990, %rsp            # imm = 0x990
xorl %eax, %eax
movl %eax, -0x7f4(%rbp)
movl %eax, %esi
movq %rsi, -0x828(%rbp)
leaq -0xf8(%rbp), %rdi
movq %rdi, -0x818(%rbp)
movl $0xa, %edx
movl $0x3, %ecx
movq %rcx, -0x820(%rbp)
callq 0x10c60
movq -0x828(%rbp), %rsi
movq -0x820(%rbp), %rdx
leaq -0x110(%rbp), %rdi
movq %rdi, -0x810(%rbp)
movq $-0x1, %rcx
callq 0x10c60
movq -0x818(%rbp), %rsi
movq -0x810(%rbp), %rdx
leaq -0xe0(%rbp), %rdi
movq %rdi, -0x808(%rbp)
callq 0x11310
movq -0x808(%rbp), %rsi
leaq -0xb0(%rbp), %rdi
movq %rdi, -0x800(%rbp)
callq 0x11190
movq -0x800(%rbp), %rdi
movl -0x7f4(%rbp), %esi
callq 0x36570
jmp 0x29c87
xorl %eax, %eax
movl %eax, %esi
leaq -0x1b8(%rbp), %rdi
movl $0x14, %edx
movq $-0x1, %rcx
callq 0x10c60
jmp 0x29ca5
xorl %eax, %eax
movl %eax, %esi
leaq -0x1d0(%rbp), %rdi
movl $0xa, %edx
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
callq 0x10c60
jmp 0x29cc6
leaq -0x1a0(%rbp), %rdi
leaq -0x1b8(%rbp), %rsi
leaq -0x1d0(%rbp), %rdx
callq 0x11310
jmp 0x29ce2
leaq -0x170(%rbp), %rdi
leaq -0x1a0(%rbp), %rsi
callq 0x11190
jmp 0x29cf7
leaq -0x170(%rbp), %rdi
callq 0x11480
movq %rax, -0x830(%rbp)
jmp 0x29d0c
movq -0x830(%rbp), %rax
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rax
addq $0x10, %rax
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x838(%rbp)
movq -0x838(%rbp), %rax
subq $0x14, %rax
sete %al
movb %al, -0x841(%rbp)
leaq -0x381(%rbp), %rdi
movq %rdi, -0x840(%rbp)
callq 0x33b0
movq -0x840(%rbp), %rdx
leaq 0x1b4a10(%rip), %rsi    # 0x1de776
leaq -0x380(%rbp), %rdi
callq 0x10a90
jmp 0x29d74
movb -0x841(%rbp), %al
movzbl %al, %esi
andl $0x1, %esi
leaq -0x360(%rbp), %rdi
leaq -0x380(%rbp), %rdx
callq 0x10f80
jmp 0x29d95
leaq 0x1b2a49(%rip), %rsi    # 0x1dc7e5
leaq -0x360(%rbp), %rdi
callq 0x34320
movq %rax, -0x850(%rbp)
jmp 0x29db1
movq -0x850(%rbp), %rdi
leaq 0x1b49cc(%rip), %rsi    # 0x1de78b
callq 0x36fb0
movq %rax, -0x858(%rbp)
jmp 0x29dcd
movq -0x858(%rbp), %rdi
leaq 0x1b69d1(%rip), %rsi    # 0x1e07ac
callq 0x34320
movq %rax, -0x860(%rbp)
jmp 0x29de9
leaq -0x170(%rbp), %rdi
callq 0x11480
movq %rax, -0x868(%rbp)
jmp 0x29dfe
movq -0x868(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rax
addq $0x10, %rax
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x870(%rbp)
movq -0x860(%rbp), %rdi
movq -0x870(%rbp), %rax
movq %rax, -0x390(%rbp)
leaq -0x390(%rbp), %rsi
callq 0x34510
movq %rax, -0x878(%rbp)
jmp 0x29e4d
movq -0x878(%rbp), %rdi
leaq 0x1b298a(%rip), %rsi    # 0x1dc7e5
callq 0x34320
movq %rax, -0x880(%rbp)
jmp 0x29e69
movq -0x880(%rbp), %rdi
leaq 0x1b4911(%rip), %rsi    # 0x1de788
callq 0x34840
movq %rax, -0x888(%rbp)
jmp 0x29e85
movq -0x888(%rbp), %rdi
leaq 0x1b6919(%rip), %rsi    # 0x1e07ac
callq 0x34320
movq %rax, -0x890(%rbp)
jmp 0x29ea1
movq -0x890(%rbp), %rdi
movl $0x14, -0x394(%rbp)
leaq -0x394(%rbp), %rsi
callq 0x343a0
movq %rax, -0x898(%rbp)
jmp 0x29ec7
movq -0x898(%rbp), %rdi
leaq 0x1cc5a6(%rip), %rsi    # 0x1f647b
callq 0x34320
jmp 0x29edc
leaq -0x360(%rbp), %rdi
callq 0x10ff0
jmp 0x29eea
leaq -0x380(%rbp), %rdi
callq 0x3100
leaq -0x381(%rbp), %rdi
callq 0x3290
leaq -0x170(%rbp), %rdi
xorl %esi, %esi
callq 0x36570
jmp 0x29f12
leaq -0x3e9(%rbp), %rdi
movq %rdi, -0x8a0(%rbp)
callq 0x10e30
movq -0x8a0(%rbp), %rdx
leaq -0x3e8(%rbp), %rdi
leaq -0xb0(%rbp), %rsi
callq 0x36ff0
jmp 0x29f41
leaq -0x3e9(%rbp), %rdi
callq 0x10e50
leaq -0x3e8(%rbp), %rdi
callq 0x37040
movq %rax, -0x8a8(%rbp)
jmp 0x29f62
movq -0x8a8(%rbp), %rax
movq %rax, -0x58(%rbp)
movq -0x58(%rbp), %rax
addq $0x10, %rax
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x8b0(%rbp)
movq -0x8b0(%rbp), %rax
testq %rax, %rax
setg %al
movb %al, -0x8b9(%rbp)
leaq -0x5a1(%rbp), %rdi
movq %rdi, -0x8b8(%rbp)
callq 0x33b0
movq -0x8b8(%rbp), %rdx
leaq 0x1b47df(%rip), %rsi    # 0x1de79a
leaq -0x5a0(%rbp), %rdi
callq 0x10a90
jmp 0x29fc9
movb -0x8b9(%rbp), %al
movzbl %al, %esi
andl $0x1, %esi
leaq -0x580(%rbp), %rdi
leaq -0x5a0(%rbp), %rdx
callq 0x10f80
jmp 0x29fea
leaq 0x1b27f4(%rip), %rsi    # 0x1dc7e5
leaq -0x580(%rbp), %rdi
callq 0x34320
movq %rax, -0x8c8(%rbp)
jmp 0x2a006
movq -0x8c8(%rbp), %rdi
leaq 0x1b4420(%rip), %rsi    # 0x1de434
callq 0x34320
movq %rax, -0x8d0(%rbp)
jmp 0x2a022
movq -0x8d0(%rbp), %rdi
leaq 0x1b677c(%rip), %rsi    # 0x1e07ac
callq 0x34320
movq %rax, -0x8d8(%rbp)
jmp 0x2a03e
movq -0x8d8(%rbp), %rdi
movl $0x0, -0x5a8(%rbp)
leaq -0x5a8(%rbp), %rsi
callq 0x343a0
movq %rax, -0x8e0(%rbp)
jmp 0x2a064
movq -0x8e0(%rbp), %rdi
leaq 0x1b2773(%rip), %rsi    # 0x1dc7e5
callq 0x34320
movq %rax, -0x8e8(%rbp)
jmp 0x2a080
movq -0x8e8(%rbp), %rdi
leaq 0x1b4710(%rip), %rsi    # 0x1de79e
callq 0x35a60
movq %rax, -0x8f0(%rbp)
jmp 0x2a09c
movq -0x8f0(%rbp), %rdi
leaq 0x1b6702(%rip), %rsi    # 0x1e07ac
callq 0x34320
movq %rax, -0x8f8(%rbp)
jmp 0x2a0b8
leaq -0x3e8(%rbp), %rdi
callq 0x37040
movq %rax, -0x900(%rbp)
jmp 0x2a0cd
movq -0x900(%rbp), %rax
movq %rax, -0x60(%rbp)
movq -0x60(%rbp), %rax
addq $0x10, %rax
movq %rax, -0x18(%rbp)
movq -0x18(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x908(%rbp)
movq -0x8f8(%rbp), %rdi
movq -0x908(%rbp), %rax
movq %rax, -0x5b0(%rbp)
leaq -0x5b0(%rbp), %rsi
callq 0x34510
movq %rax, -0x910(%rbp)
jmp 0x2a11c
movq -0x910(%rbp), %rdi
leaq 0x1cc351(%rip), %rsi    # 0x1f647b
callq 0x34320
jmp 0x2a131
leaq -0x580(%rbp), %rdi
callq 0x10ff0
jmp 0x2a13f
leaq -0x5a0(%rbp), %rdi
callq 0x3100
leaq -0x5a1(%rbp), %rdi
callq 0x3290
leaq -0x5c0(%rbp), %rdi
movq %rdi, -0x918(%rbp)
callq 0x365d0
movq -0x918(%rbp), %rsi
leaq -0x3e8(%rbp), %rdi
callq 0x37060
jmp 0x2a17f
leaq -0x611(%rbp), %rdi
movq %rdi, -0x920(%rbp)
callq 0x10e30
movq -0x920(%rbp), %rdx
leaq -0x610(%rbp), %rdi
leaq -0x170(%rbp), %rsi
callq 0x36ff0
jmp 0x2a1ae
leaq -0x611(%rbp), %rdi
callq 0x10e50
leaq -0x610(%rbp), %rdi
callq 0x37090
movq %rax, -0x928(%rbp)
jmp 0x2a1cf
movq -0x928(%rbp), %rax
movq %rax, -0x38(%rbp)
movq -0x38(%rbp), %rax
addq $0x10, %rax
movq %rax, -0x10(%rbp)
movb $0x1, %al
movb %al, -0x931(%rbp)
leaq -0x7c9(%rbp), %rdi
movq %rdi, -0x930(%rbp)
callq 0x33b0
movq -0x930(%rbp), %rdx
leaq 0x1b45a6(%rip), %rsi    # 0x1de7b5
leaq -0x7c8(%rbp), %rdi
callq 0x10a90
jmp 0x2a21d
movb -0x931(%rbp), %al
movzbl %al, %esi
andl $0x1, %esi
leaq -0x7a8(%rbp), %rdi
leaq -0x7c8(%rbp), %rdx
callq 0x10f80
jmp 0x2a23e
leaq 0x1b25a0(%rip), %rsi    # 0x1dc7e5
leaq -0x7a8(%rbp), %rdi
callq 0x34320
movq %rax, -0x940(%rbp)
jmp 0x2a25a
movq -0x940(%rbp), %rdi
leaq 0x1b4569(%rip), %rsi    # 0x1de7d1
callq 0x35a60
movq %rax, -0x948(%rbp)
jmp 0x2a276
movq -0x948(%rbp), %rdi
leaq 0x1b6528(%rip), %rsi    # 0x1e07ac
callq 0x34320
movq %rax, -0x950(%rbp)
jmp 0x2a292
leaq -0x610(%rbp), %rdi
callq 0x37090
movq %rax, -0x958(%rbp)
jmp 0x2a2a7
movq -0x958(%rbp), %rax
movq %rax, -0x40(%rbp)
movq -0x40(%rbp), %rax
addq $0x10, %rax
movq %rax, -0x8(%rbp)
movq -0x950(%rbp), %rdi
movq $0x1, -0x7d8(%rbp)
leaq -0x7d8(%rbp), %rsi
callq 0x34510
movq %rax, -0x960(%rbp)
jmp 0x2a2e5
movq -0x960(%rbp), %rdi
leaq 0x1b24f2(%rip), %rsi    # 0x1dc7e5
callq 0x34320
movq %rax, -0x968(%rbp)
jmp 0x2a301
movq -0x968(%rbp), %rdi
leaq 0x1b9d5e(%rip), %rsi    # 0x1e406d
callq 0x34320
movq %rax, -0x970(%rbp)
jmp 0x2a31d
movq -0x970(%rbp), %rdi
leaq 0x1b6481(%rip), %rsi    # 0x1e07ac
callq 0x34320
movq %rax, -0x978(%rbp)
jmp 0x2a339
movq -0x978(%rbp), %rdi
movl $0x1, -0x7dc(%rbp)
leaq -0x7dc(%rbp), %rsi
callq 0x343a0
movq %rax, -0x980(%rbp)
jmp 0x2a35f
movq -0x980(%rbp), %rdi
leaq 0x1cc10e(%rip), %rsi    # 0x1f647b
callq 0x34320
jmp 0x2a374
leaq -0x7a8(%rbp), %rdi
callq 0x10ff0
jmp 0x2a382
leaq -0x7c8(%rbp), %rdi
callq 0x3100
leaq -0x7c9(%rbp), %rdi
callq 0x3290
leaq -0x7f0(%rbp), %rdi
movq %rdi, -0x988(%rbp)
callq 0x365d0
movq -0x988(%rbp), %rsi
leaq -0x610(%rbp), %rdi
callq 0x37060
jmp 0x2a3c2
leaq -0x610(%rbp), %rdi
callq 0x34950
leaq -0x3e8(%rbp), %rdi
callq 0x34950
leaq -0x170(%rbp), %rdi
callq 0x114a0
leaq -0xb0(%rbp), %rdi
callq 0x114a0
addq $0x990, %rsp            # imm = 0x990
popq %rbp
retq
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x118(%rbp)
movl %eax, -0x11c(%rbp)
jmp 0x2a5ee
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x118(%rbp)
movl %eax, -0x11c(%rbp)
jmp 0x2a5e2
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x118(%rbp)
movl %eax, -0x11c(%rbp)
jmp 0x2a47f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x118(%rbp)
movl %eax, -0x11c(%rbp)
jmp 0x2a473
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x118(%rbp)
movl %eax, -0x11c(%rbp)
leaq -0x360(%rbp), %rdi
callq 0x10ff0
jmp 0x2a471
jmp 0x2a473
leaq -0x380(%rbp), %rdi
callq 0x3100
leaq -0x381(%rbp), %rdi
callq 0x3290
jmp 0x2a5e2
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x118(%rbp)
movl %eax, -0x11c(%rbp)
leaq -0x3e9(%rbp), %rdi
callq 0x10e50
jmp 0x2a5e2
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x118(%rbp)
movl %eax, -0x11c(%rbp)
jmp 0x2a5d6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x118(%rbp)
movl %eax, -0x11c(%rbp)
jmp 0x2a520
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x118(%rbp)
movl %eax, -0x11c(%rbp)
jmp 0x2a514
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x118(%rbp)
movl %eax, -0x11c(%rbp)
leaq -0x580(%rbp), %rdi
callq 0x10ff0
jmp 0x2a512
jmp 0x2a514
leaq -0x5a0(%rbp), %rdi
callq 0x3100
leaq -0x5a1(%rbp), %rdi
callq 0x3290
jmp 0x2a5d6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x118(%rbp)
movl %eax, -0x11c(%rbp)
leaq -0x611(%rbp), %rdi
callq 0x10e50
jmp 0x2a5d6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x118(%rbp)
movl %eax, -0x11c(%rbp)
jmp 0x2a5ca
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x118(%rbp)
movl %eax, -0x11c(%rbp)
jmp 0x2a5be
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x118(%rbp)
movl %eax, -0x11c(%rbp)
jmp 0x2a5b2
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x118(%rbp)
movl %eax, -0x11c(%rbp)
leaq -0x7a8(%rbp), %rdi
callq 0x10ff0
jmp 0x2a5b0
jmp 0x2a5b2
leaq -0x7c8(%rbp), %rdi
callq 0x3100
leaq -0x7c9(%rbp), %rdi
callq 0x3290
leaq -0x610(%rbp), %rdi
callq 0x34950
leaq -0x3e8(%rbp), %rdi
callq 0x34950
leaq -0x170(%rbp), %rdi
callq 0x114a0
leaq -0xb0(%rbp), %rdi
callq 0x114a0
movq -0x118(%rbp), %rdi
callq 0x33a0
movq %rax, %rdi
callq 0x116d0
nop