// File: lemire[P]runningmaxmin/unit.cpp
// Function: test(std::vector<double, std::allocator<double>>, unsigned int)
void test(std::vector<floattype> data, uint width = 3) {

    slowmaxmin A(data, width);
    lemiremaxmin C(data, width);
    lemiremaxminwrap Cw(data, width);
    simplelemiremaxmin G(data, width);
    GilKimmel D(data, width);
    vanHerkGilWermanmaxmin B(data, width);
    lemirebitmapmaxmin E(data, width);
    monowedgewrap M(data,width);
    if (!compare(A, M)) {
        std::cout << "array " << std::endl;
        display(data);
        std::cout << "solution " << std::endl;
        display(A);
        std::cout << "monowedgewrap " << std::endl;
        display(M);
    }
    if (!compare(A, Cw)) {
        std::cout << "array " << std::endl;
        display(data);
        std::cout << "solution " << std::endl;
        display(A);
        std::cout << "lemirew " << std::endl;
        display(Cw);
    }

    if (!compare(A, D)) {
        std::cout << "array " << std::endl;
        display(data);
        std::cout << "solution " << std::endl;
        display(A);
        std::cout << "lemiremaxmin " << std::endl;
        display(D);
    }
    if (!compare(A, C)) {
        std::cout << "array " << std::endl;
        display(data);
        std::cout << "solution " << std::endl;
        display(A);
        std::cout << "lemiremaxmin " << std::endl;
        display(C);
    }
    if (!compare(A, B)) {
        std::cout << "array " << std::endl;
        display(data);
        std::cout << "solution " << std::endl;
        display(A);
        std::cout << "vanHerk " << std::endl;
        display(B);
    }
    assert(compare(A, Cw));

    assert(compare(A, C));
    assert(compare(A, B));
    assert(compare(A, D));
    assert(compare(A, G));
    assert(compare(A, E));
}

// Assembly:
subq $0x298, %rsp            # imm = 0x298
movl %esi, %eax
movq %rdi, %rsi
movq %rsi, 0xb0(%rsp)
movq %rsi, 0x290(%rsp)
movl %eax, 0x28c(%rsp)
movl 0x28c(%rsp), %edx
leaq 0x250(%rsp), %rdi
callq 0x34f0
movq 0xb0(%rsp), %rsi
movl 0x28c(%rsp), %edx
leaq 0x218(%rsp), %rdi
callq 0x3810
jmp 0x2495
movq 0xb0(%rsp), %rsi
movl 0x28c(%rsp), %edx
leaq 0x1d0(%rsp), %rdi
callq 0x42b0
jmp 0x24b3
movq 0xb0(%rsp), %rsi
movl 0x28c(%rsp), %edx
leaq 0x198(%rsp), %rdi
callq 0x45c0
jmp 0x24d1
movq 0xb0(%rsp), %rsi
movl 0x28c(%rsp), %edx
leaq 0x160(%rsp), %rdi
callq 0x4ea0
jmp 0x24ef
movq 0xb0(%rsp), %rsi
movl 0x28c(%rsp), %edx
leaq 0x128(%rsp), %rdi
callq 0x5760
jmp 0x250d
movq 0xb0(%rsp), %rsi
movl 0x28c(%rsp), %edx
leaq 0xf0(%rsp), %rdi
callq 0x62e0
jmp 0x252b
movq 0xb0(%rsp), %rsi
movl 0x28c(%rsp), %edx
leaq 0xb8(%rsp), %rdi
callq 0x6e30
jmp 0x2549
leaq 0x250(%rsp), %rdi
leaq 0xb8(%rsp), %rsi
callq 0x2390
movb %al, 0xaf(%rsp)
jmp 0x2567
movb 0xaf(%rsp), %al
testb $0x1, %al
jne 0x2718
jmp 0x2578
movq 0x11a59(%rip), %rdi     # 0x13fd8
leaq 0xca7e(%rip), %rsi      # 0xf004
callq 0x20d0
movq %rax, 0xa0(%rsp)
jmp 0x2595
movq 0xa0(%rsp), %rdi
movq 0x11a24(%rip), %rsi     # 0x13fc8
callq 0x20f0
jmp 0x25ab
movq 0xb0(%rsp), %rdi
callq 0x3450
jmp 0x25ba
movq 0x11a17(%rip), %rdi     # 0x13fd8
leaq 0xca43(%rip), %rsi      # 0xf00b
callq 0x20d0
movq %rax, 0x98(%rsp)
jmp 0x25d7
movq 0x98(%rsp), %rdi
movq 0x119e2(%rip), %rsi     # 0x13fc8
callq 0x20f0
jmp 0x25ed
leaq 0x250(%rsp), %rdi
callq 0x2410
jmp 0x25fc
movq 0x119d5(%rip), %rdi     # 0x13fd8
leaq 0xca0b(%rip), %rsi      # 0xf015
callq 0x20d0
movq %rax, 0x90(%rsp)
jmp 0x2619
movq 0x90(%rsp), %rdi
movq 0x119a0(%rip), %rsi     # 0x13fc8
callq 0x20f0
jmp 0x262f
leaq 0xb8(%rsp), %rdi
callq 0x2410
jmp 0x263e
jmp 0x2718
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x210(%rsp)
movl %eax, 0x20c(%rsp)
jmp 0x2d02
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x210(%rsp)
movl %eax, 0x20c(%rsp)
jmp 0x2cf5
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x210(%rsp)
movl %eax, 0x20c(%rsp)
jmp 0x2ce8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x210(%rsp)
movl %eax, 0x20c(%rsp)
jmp 0x2cdb
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x210(%rsp)
movl %eax, 0x20c(%rsp)
jmp 0x2cce
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x210(%rsp)
movl %eax, 0x20c(%rsp)
jmp 0x2cc1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x210(%rsp)
movl %eax, 0x20c(%rsp)
jmp 0x2cb4
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x210(%rsp)
movl %eax, 0x20c(%rsp)
leaq 0xb8(%rsp), %rdi
callq 0x7240
jmp 0x2cb4
leaq 0x250(%rsp), %rdi
leaq 0x1d0(%rsp), %rsi
callq 0x2390
movb %al, 0x8f(%rsp)
jmp 0x2736
movb 0x8f(%rsp), %al
testb $0x1, %al
jne 0x2803
jmp 0x2747
movq 0x1188a(%rip), %rdi     # 0x13fd8
leaq 0xc8af(%rip), %rsi      # 0xf004
callq 0x20d0
movq %rax, 0x80(%rsp)
jmp 0x2764
movq 0x80(%rsp), %rdi
movq 0x11855(%rip), %rsi     # 0x13fc8
callq 0x20f0
jmp 0x277a
movq 0xb0(%rsp), %rdi
callq 0x3450
jmp 0x2789
movq 0x11848(%rip), %rdi     # 0x13fd8
leaq 0xc874(%rip), %rsi      # 0xf00b
callq 0x20d0
movq %rax, 0x78(%rsp)
jmp 0x27a3
movq 0x78(%rsp), %rdi
movq 0x11819(%rip), %rsi     # 0x13fc8
callq 0x20f0
jmp 0x27b6
leaq 0x250(%rsp), %rdi
callq 0x2410
jmp 0x27c5
movq 0x1180c(%rip), %rdi     # 0x13fd8
leaq 0xc851(%rip), %rsi      # 0xf024
callq 0x20d0
movq %rax, 0x70(%rsp)
jmp 0x27df
movq 0x70(%rsp), %rdi
movq 0x117dd(%rip), %rsi     # 0x13fc8
callq 0x20f0
jmp 0x27f2
leaq 0x1d0(%rsp), %rdi
callq 0x2410
jmp 0x2801
jmp 0x2803
leaq 0x250(%rsp), %rdi
leaq 0x160(%rsp), %rsi
callq 0x2390
movb %al, 0x6f(%rsp)
jmp 0x281e
movb 0x6f(%rsp), %al
testb $0x1, %al
jne 0x28e2
jmp 0x282c
movq 0x117a5(%rip), %rdi     # 0x13fd8
leaq 0xc7ca(%rip), %rsi      # 0xf004
callq 0x20d0
movq %rax, 0x60(%rsp)
jmp 0x2846
movq 0x60(%rsp), %rdi
movq 0x11776(%rip), %rsi     # 0x13fc8
callq 0x20f0
jmp 0x2859
movq 0xb0(%rsp), %rdi
callq 0x3450
jmp 0x2868
movq 0x11769(%rip), %rdi     # 0x13fd8
leaq 0xc795(%rip), %rsi      # 0xf00b
callq 0x20d0
movq %rax, 0x58(%rsp)
jmp 0x2882
movq 0x58(%rsp), %rdi
movq 0x1173a(%rip), %rsi     # 0x13fc8
callq 0x20f0
jmp 0x2895
leaq 0x250(%rsp), %rdi
callq 0x2410
jmp 0x28a4
movq 0x1172d(%rip), %rdi     # 0x13fd8
leaq 0xc77b(%rip), %rsi      # 0xf02d
callq 0x20d0
movq %rax, 0x50(%rsp)
jmp 0x28be
movq 0x50(%rsp), %rdi
movq 0x116fe(%rip), %rsi     # 0x13fc8
callq 0x20f0
jmp 0x28d1
leaq 0x160(%rsp), %rdi
callq 0x2410
jmp 0x28e0
jmp 0x28e2
leaq 0x250(%rsp), %rdi
leaq 0x218(%rsp), %rsi
callq 0x2390
movb %al, 0x4f(%rsp)
jmp 0x28fd
movb 0x4f(%rsp), %al
testb $0x1, %al
jne 0x29c1
jmp 0x290b
movq 0x116c6(%rip), %rdi     # 0x13fd8
leaq 0xc6eb(%rip), %rsi      # 0xf004
callq 0x20d0
movq %rax, 0x40(%rsp)
jmp 0x2925
movq 0x40(%rsp), %rdi
movq 0x11697(%rip), %rsi     # 0x13fc8
callq 0x20f0
jmp 0x2938
movq 0xb0(%rsp), %rdi
callq 0x3450
jmp 0x2947
movq 0x1168a(%rip), %rdi     # 0x13fd8
leaq 0xc6b6(%rip), %rsi      # 0xf00b
callq 0x20d0
movq %rax, 0x38(%rsp)
jmp 0x2961
movq 0x38(%rsp), %rdi
movq 0x1165b(%rip), %rsi     # 0x13fc8
callq 0x20f0
jmp 0x2974
leaq 0x250(%rsp), %rdi
callq 0x2410
jmp 0x2983
movq 0x1164e(%rip), %rdi     # 0x13fd8
leaq 0xc69c(%rip), %rsi      # 0xf02d
callq 0x20d0
movq %rax, 0x30(%rsp)
jmp 0x299d
movq 0x30(%rsp), %rdi
movq 0x1161f(%rip), %rsi     # 0x13fc8
callq 0x20f0
jmp 0x29b0
leaq 0x218(%rsp), %rdi
callq 0x2410
jmp 0x29bf
jmp 0x29c1
leaq 0x250(%rsp), %rdi
leaq 0x128(%rsp), %rsi
callq 0x2390
movb %al, 0x2f(%rsp)
jmp 0x29dc
movb 0x2f(%rsp), %al
testb $0x1, %al
jne 0x2aa0
jmp 0x29ea
movq 0x115e7(%rip), %rdi     # 0x13fd8
leaq 0xc60c(%rip), %rsi      # 0xf004
callq 0x20d0
movq %rax, 0x20(%rsp)
jmp 0x2a04
movq 0x20(%rsp), %rdi
movq 0x115b8(%rip), %rsi     # 0x13fc8
callq 0x20f0
jmp 0x2a17
movq 0xb0(%rsp), %rdi
callq 0x3450
jmp 0x2a26
movq 0x115ab(%rip), %rdi     # 0x13fd8
leaq 0xc5d7(%rip), %rsi      # 0xf00b
callq 0x20d0
movq %rax, 0x18(%rsp)
jmp 0x2a40
movq 0x18(%rsp), %rdi
movq 0x1157c(%rip), %rsi     # 0x13fc8
callq 0x20f0
jmp 0x2a53
leaq 0x250(%rsp), %rdi
callq 0x2410
jmp 0x2a62
movq 0x1156f(%rip), %rdi     # 0x13fd8
leaq 0xc5cb(%rip), %rsi      # 0xf03b
callq 0x20d0
movq %rax, 0x10(%rsp)
jmp 0x2a7c
movq 0x10(%rsp), %rdi
movq 0x11540(%rip), %rsi     # 0x13fc8
callq 0x20f0
jmp 0x2a8f
leaq 0x128(%rsp), %rdi
callq 0x2410
jmp 0x2a9e
jmp 0x2aa0
leaq 0x250(%rsp), %rdi
leaq 0x1d0(%rsp), %rsi
callq 0x2390
movb %al, 0xf(%rsp)
jmp 0x2abb
movb 0xf(%rsp), %al
testb $0x1, %al
jne 0x2ac5
jmp 0x2ac7
jmp 0x2ae6
leaq 0xc576(%rip), %rdi      # 0xf044
leaq 0xc57e(%rip), %rsi      # 0xf053
movl $0x4e, %edx
leaq 0xc57b(%rip), %rcx      # 0xf05c
callq 0x2090
leaq 0x250(%rsp), %rdi
leaq 0x218(%rsp), %rsi
callq 0x2390
movb %al, 0xe(%rsp)
jmp 0x2b01
movb 0xe(%rsp), %al
testb $0x1, %al
jne 0x2b0b
jmp 0x2b0d
jmp 0x2b2c
leaq 0xc570(%rip), %rdi      # 0xf084
leaq 0xc538(%rip), %rsi      # 0xf053
movl $0x50, %edx
leaq 0xc535(%rip), %rcx      # 0xf05c
callq 0x2090
leaq 0x250(%rsp), %rdi
leaq 0x128(%rsp), %rsi
callq 0x2390
movb %al, 0xd(%rsp)
jmp 0x2b47
movb 0xd(%rsp), %al
testb $0x1, %al
jne 0x2b51
jmp 0x2b53
jmp 0x2b72
leaq 0xc538(%rip), %rdi      # 0xf092
leaq 0xc4f2(%rip), %rsi      # 0xf053
movl $0x51, %edx
leaq 0xc4ef(%rip), %rcx      # 0xf05c
callq 0x2090
leaq 0x250(%rsp), %rdi
leaq 0x160(%rsp), %rsi
callq 0x2390
movb %al, 0xc(%rsp)
jmp 0x2b8d
movb 0xc(%rsp), %al
testb $0x1, %al
jne 0x2b97
jmp 0x2b99
jmp 0x2bb8
leaq 0xc500(%rip), %rdi      # 0xf0a0
leaq 0xc4ac(%rip), %rsi      # 0xf053
movl $0x52, %edx
leaq 0xc4a9(%rip), %rcx      # 0xf05c
callq 0x2090
leaq 0x250(%rsp), %rdi
leaq 0x198(%rsp), %rsi
callq 0x2390
movb %al, 0xb(%rsp)
jmp 0x2bd3
movb 0xb(%rsp), %al
testb $0x1, %al
jne 0x2bdd
jmp 0x2bdf
jmp 0x2bfe
leaq 0xc4c8(%rip), %rdi      # 0xf0ae
leaq 0xc466(%rip), %rsi      # 0xf053
movl $0x53, %edx
leaq 0xc463(%rip), %rcx      # 0xf05c
callq 0x2090
leaq 0x250(%rsp), %rdi
leaq 0xf0(%rsp), %rsi
callq 0x2390
movb %al, 0xa(%rsp)
jmp 0x2c19
movb 0xa(%rsp), %al
testb $0x1, %al
jne 0x2c23
jmp 0x2c25
jmp 0x2c44
leaq 0xc490(%rip), %rdi      # 0xf0bc
leaq 0xc420(%rip), %rsi      # 0xf053
movl $0x54, %edx
leaq 0xc41d(%rip), %rcx      # 0xf05c
callq 0x2090
leaq 0xb8(%rsp), %rdi
callq 0x7240
leaq 0xf0(%rsp), %rdi
callq 0x7290
leaq 0x128(%rsp), %rdi
callq 0x72e0
leaq 0x160(%rsp), %rdi
callq 0x7330
leaq 0x198(%rsp), %rdi
callq 0x7380
leaq 0x1d0(%rsp), %rdi
callq 0x73d0
leaq 0x218(%rsp), %rdi
callq 0x7420
leaq 0x250(%rsp), %rdi
callq 0x7470
addq $0x298, %rsp            # imm = 0x298
retq
leaq 0xf0(%rsp), %rdi
callq 0x7290
leaq 0x128(%rsp), %rdi
callq 0x72e0
leaq 0x160(%rsp), %rdi
callq 0x7330
leaq 0x198(%rsp), %rdi
callq 0x7380
leaq 0x1d0(%rsp), %rdi
callq 0x73d0
leaq 0x218(%rsp), %rdi
callq 0x7420
leaq 0x250(%rsp), %rdi
callq 0x7470
movq 0x210(%rsp), %rdi
callq 0x2160
nopl (%rax)