#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */
typedef int int64_t;

/* Variables and functions */
double fabs(double const);
scalar_t__ stdlib_base_is_nan(double);
void stdlib_strided_dcumaxabs(const int64_t N, const double *X,
                              const int64_t strideX, double *Y,
                              const int64_t strideY) {
  double max;
  int64_t ix;
  int64_t iy;
  int64_t i;
  double v;
  if (N <= 0) {
    return;
  }
  if (strideX < 0) {
    ix = (1 - N) * strideX;
  } else {
    ix = 0;
  }
  if (strideY < 0) {
    iy = (1 - N) * strideY;
  } else {
    iy = 0;
  }
  max = fabs(X[ix]);
  Y[iy] = max;
  iy += strideY;
  i = 1;
  if (!stdlib_base_is_nan(max)) {
    for (; i < N; i++) {
      ix += strideX;
      v = fabs(X[ix]);
      if (stdlib_base_is_nan(v)) {
        max = v;
        break;
      }
      if (v > max) {
        max = v;
      }
      Y[iy] = max;
      iy += strideY;
    }
  }
  if (stdlib_base_is_nan(max)) {
    for (; i < N; i++) {
      Y[iy] = max;
      iy += strideY;
    }
  }
  return;
}


x86 assembly (clang, -O0):
<stdlib_strided_dcumaxabs>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8d,-0x24(%rbp)
cmpl   $0x0,-0x4(%rbp)
jg     1139 <stdlib_strided_dcumaxabs+0x29>
jmp    12d0 <stdlib_strided_dcumaxabs+0x1c0>
cmpl   $0x0,-0x14(%rbp)
jge    1157 <stdlib_strided_dcumaxabs+0x47>
mov    $0x1,%eax
sub    -0x4(%rbp),%eax
imul   -0x14(%rbp),%eax
mov    %eax,-0x34(%rbp)
jmp    115e <stdlib_strided_dcumaxabs+0x4e>
movl   $0x0,-0x34(%rbp)
cmpl   $0x0,-0x24(%rbp)
jge    117c <stdlib_strided_dcumaxabs+0x6c>
mov    $0x1,%eax
sub    -0x4(%rbp),%eax
imul   -0x24(%rbp),%eax
mov    %eax,-0x38(%rbp)
jmp    1183 <stdlib_strided_dcumaxabs+0x73>
movl   $0x0,-0x38(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movaps 0xe69(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x30(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x38(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    -0x38(%rbp),%eax
mov    %eax,-0x38(%rbp)
movl   $0x1,-0x3c(%rbp)
movsd  -0x30(%rbp),%xmm0
call   1030 <stdlib_base_is_nan@plt>
cmp    $0x0,%rax
jne    1278 <stdlib_strided_dcumaxabs+0x168>
jmp    11db <stdlib_strided_dcumaxabs+0xcb>
mov    -0x3c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1273 <stdlib_strided_dcumaxabs+0x163>
mov    -0x14(%rbp),%eax
add    -0x34(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movaps 0xdfc(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x48(%rbp),%xmm0
call   1030 <stdlib_base_is_nan@plt>
cmp    $0x0,%rax
je     1230 <stdlib_strided_dcumaxabs+0x120>
movsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    1273 <stdlib_strided_dcumaxabs+0x163>
movsd  -0x48(%rbp),%xmm0
ucomisd -0x30(%rbp),%xmm0
jbe    124a <stdlib_strided_dcumaxabs+0x13a>
movsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x30(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x38(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    -0x38(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    11db <stdlib_strided_dcumaxabs+0xcb>
jmp    1278 <stdlib_strided_dcumaxabs+0x168>
movsd  -0x30(%rbp),%xmm0
call   1030 <stdlib_base_is_nan@plt>
cmp    $0x0,%rax
je     12cb <stdlib_strided_dcumaxabs+0x1bb>
jmp    1291 <stdlib_strided_dcumaxabs+0x181>
mov    -0x3c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    12c6 <stdlib_strided_dcumaxabs+0x1b6>
movsd  -0x30(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x38(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    -0x38(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    1291 <stdlib_strided_dcumaxabs+0x181>
jmp    12cb <stdlib_strided_dcumaxabs+0x1bb>
jmp    12d0 <stdlib_strided_dcumaxabs+0x1c0>
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<stdlib_strided_dcumaxabs>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x58,%rsp
mov    %r8d,0xc(%rsp)
test   %edi,%edi
jle    12dd <stdlib_strided_dcumaxabs+0x1cd>
mov    %rcx,%r12
mov    %edi,%ebp
mov    $0x1,%ebx
mov    $0x1,%eax
sub    %edi,%eax
mov    %eax,%ecx
imul   %edx,%ecx
mov    %edx,0x28(%rsp)
sar    $0x1f,%edx
and    %ecx,%edx
mov    0xc(%rsp),%ecx
imul   %ecx,%eax
mov    %ecx,%r13d
sar    $0x1f,%r13d
movslq %edx,%r14
mov    %rsi,0x40(%rsp)
movsd  (%rsi,%r14,8),%xmm0
andpd  0xe92(%rip),%xmm0
and    %eax,%r13d
movslq %r13d,%r15
movlpd %xmm0,(%r12,%r15,8)
add    %ecx,%r15d
movapd %xmm0,0x10(%rsp)
call   1030 <stdlib_base_is_nan@plt>
test   %rax,%rax
jne    1232 <stdlib_strided_dcumaxabs+0x122>
cmp    $0x1,%ebp
je     1232 <stdlib_strided_dcumaxabs+0x122>
movslq %r15d,%rax
mov    0xc(%rsp),%ecx
movslq %ecx,%rsi
movslq 0x28(%rsp),%rdi
imul   %ebp,%ecx
add    %ecx,%r13d
mov    %r13d,0x34(%rsp)
add    %rdi,%r14
mov    0x40(%rsp),%rcx
lea    (%rcx,%r14,8),%r13
shl    $0x3,%rdi
mov    %rdi,0x28(%rsp)
mov    %r12,0x38(%rsp)
lea    (%r12,%rax,8),%r14
shl    $0x3,%rsi
mov    %rsi,%r12
mov    $0x1,%ebx
xchg   %ax,%ax
movsd  0x0(%r13),%xmm0
andps  0xe13(%rip),%xmm0
movaps %xmm0,0x40(%rsp)
call   1030 <stdlib_base_is_nan@plt>
test   %rax,%rax
jne    123a <stdlib_strided_dcumaxabs+0x12a>
movapd 0x40(%rsp),%xmm0
maxsd  0x10(%rsp),%xmm0
movsd  %xmm0,(%r14)
add    $0x1,%ebx
add    0x28(%rsp),%r13
add    0xc(%rsp),%r15d
add    %r12,%r14
movapd %xmm0,0x10(%rsp)
cmp    %ebx,%ebp
jne    11e0 <stdlib_strided_dcumaxabs+0xd0>
mov    0x34(%rsp),%eax
mov    %eax,%r15d
mov    %ebp,%ebx
jmp    123f <stdlib_strided_dcumaxabs+0x12f>
movapd 0x10(%rsp),%xmm0
jmp    1244 <stdlib_strided_dcumaxabs+0x134>
movaps 0x40(%rsp),%xmm0
mov    0x38(%rsp),%r12
movapd %xmm0,0x10(%rsp)
movaps 0x10(%rsp),%xmm0
call   1030 <stdlib_base_is_nan@plt>
movaps 0x10(%rsp),%xmm0
test   %rax,%rax
je     12dd <stdlib_strided_dcumaxabs+0x1cd>
cmp    %ebp,%ebx
jge    12dd <stdlib_strided_dcumaxabs+0x1cd>
movslq %r15d,%rcx
movslq 0xc(%rsp),%rax
mov    %ebp,%esi
sub    %ebx,%esi
mov    %ebx,%edx
not    %edx
add    %ebp,%edx
and    $0x3,%esi
je     1292 <stdlib_strided_dcumaxabs+0x182>
neg    %esi
xor    %edi,%edi
nopl   (%rax)
movsd  %xmm0,(%r12,%rcx,8)
add    %rax,%rcx
add    $0xffffffff,%edi
cmp    %edi,%esi
jne    1280 <stdlib_strided_dcumaxabs+0x170>
sub    %edi,%ebx
cmp    $0x3,%edx
jb     12dd <stdlib_strided_dcumaxabs+0x1cd>
lea    (%r12,%rcx,8),%rdx
mov    %rax,%rsi
shl    $0x5,%rsi
lea    0x0(,%rax,8),%rdi
lea    (%rdi,%rdi,2),%rdi
add    %rax,%rcx
shl    $0x4,%rax
lea    (%r12,%rcx,8),%rcx
sub    %ebx,%ebp
nopl   0x0(%rax,%rax,1)
movsd  %xmm0,(%rdx)
movsd  %xmm0,(%rcx)
movsd  %xmm0,(%rdx,%rax,1)
movsd  %xmm0,(%rdx,%rdi,1)
add    %rsi,%rdx
add    %rsi,%rcx
add    $0xfffffffc,%ebp
jne    12c0 <stdlib_strided_dcumaxabs+0x1b0>
add    $0x58,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @stdlib_strided_dcumaxabs(i32 %0, double* %1, i32 %2, double* %3, i32 %4) {
%6 = alloca i32
%7 = alloca double*
%8 = alloca i32
%9 = alloca double*
%10 = alloca i32
%11 = alloca double
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca double
store i32 %0, i32* %6
store double* %1, double** %7
store i32 %2, i32* %8
store double* %3, double** %9
store i32 %4, i32* %10
%16 = load i32, i32* %6
%17 = icmp sle i32 %16, 0
br i1 %17, label %18, label %19
18: ; preds = %5
br label %117
19: ; preds = %5
%20 = load i32, i32* %8
%21 = icmp slt i32 %20, 0
br i1 %21, label %22, label %27
22: ; preds = %19
%23 = load i32, i32* %6
%24 = sub nsw i32 1, %23
%25 = load i32, i32* %8
%26 = mul nsw i32 %24, %25
store i32 %26, i32* %12
br label %28
27: ; preds = %19
store i32 0, i32* %12
br label %28
28: ; preds = %27, %22
%29 = load i32, i32* %10
%30 = icmp slt i32 %29, 0
br i1 %30, label %31, label %36
31: ; preds = %28
%32 = load i32, i32* %6
%33 = sub nsw i32 1, %32
%34 = load i32, i32* %10
%35 = mul nsw i32 %33, %34
store i32 %35, i32* %13
br label %37
36: ; preds = %28
store i32 0, i32* %13
br label %37
37: ; preds = %36, %31
%38 = load double*, double** %7
%39 = load i32, i32* %12
%40 = sext i32 %39 to i64
%41 = getelementptr inbounds double, double* %38, i64 %40
%42 = load double, double* %41
%43 = call double @llvm.fabs.f64(double %42)
store double %43, double* %11
%44 = load double, double* %11
%45 = load double*, double** %9
%46 = load i32, i32* %13
%47 = sext i32 %46 to i64
%48 = getelementptr inbounds double, double* %45, i64 %47
store double %44, double* %48
%49 = load i32, i32* %10
%50 = load i32, i32* %13
%51 = add nsw i32 %50, %49
store i32 %51, i32* %13
store i32 1, i32* %14
%52 = load double, double* %11
%53 = call i64 @stdlib_base_is_nan(double %52)
%54 = icmp ne i64 %53, 0
br i1 %54, label %94, label %55
55: ; preds = %37
br label %56
56: ; preds = %90, %55
%57 = load i32, i32* %14
%58 = load i32, i32* %6
%59 = icmp slt i32 %57, %58
br i1 %59, label %60, label %93
60: ; preds = %56
%61 = load i32, i32* %8
%62 = load i32, i32* %12
%63 = add nsw i32 %62, %61
store i32 %63, i32* %12
%64 = load double*, double** %7
%65 = load i32, i32* %12
%66 = sext i32 %65 to i64
%67 = getelementptr inbounds double, double* %64, i64 %66
%68 = load double, double* %67
%69 = call double @llvm.fabs.f64(double %68)
store double %69, double* %15
%70 = load double, double* %15
%71 = call i64 @stdlib_base_is_nan(double %70)
%72 = icmp ne i64 %71, 0
br i1 %72, label %73, label %75
73: ; preds = %60
%74 = load double, double* %15
store double %74, double* %11
br label %93
75: ; preds = %60
%76 = load double, double* %15
%77 = load double, double* %11
%78 = fcmp ogt double %76, %77
br i1 %78, label %79, label %81
79: ; preds = %75
%80 = load double, double* %15
store double %80, double* %11
br label %81
81: ; preds = %79, %75
%82 = load double, double* %11
%83 = load double*, double** %9
%84 = load i32, i32* %13
%85 = sext i32 %84 to i64
%86 = getelementptr inbounds double, double* %83, i64 %85
store double %82, double* %86
%87 = load i32, i32* %10
%88 = load i32, i32* %13
%89 = add nsw i32 %88, %87
store i32 %89, i32* %13
br label %90
90: ; preds = %81
%91 = load i32, i32* %14
%92 = add nsw i32 %91, 1
store i32 %92, i32* %14
br label %56
93: ; preds = %73, %56
br label %94
94: ; preds = %93, %37
%95 = load double, double* %11
%96 = call i64 @stdlib_base_is_nan(double %95)
%97 = icmp ne i64 %96, 0
br i1 %97, label %98, label %116
98: ; preds = %94
br label %99
99: ; preds = %112, %98
%100 = load i32, i32* %14
%101 = load i32, i32* %6
%102 = icmp slt i32 %100, %101
br i1 %102, label %103, label %115
103: ; preds = %99
%104 = load double, double* %11
%105 = load double*, double** %9
%106 = load i32, i32* %13
%107 = sext i32 %106 to i64
%108 = getelementptr inbounds double, double* %105, i64 %107
store double %104, double* %108
%109 = load i32, i32* %10
%110 = load i32, i32* %13
%111 = add nsw i32 %110, %109
store i32 %111, i32* %13
br label %112
112: ; preds = %103
%113 = load i32, i32* %14
%114 = add nsw i32 %113, 1
store i32 %114, i32* %14
br label %99
115: ; preds = %99
br label %116
116: ; preds = %115, %94
br label %117
117: ; preds = %116, %18
ret void
}

LLVM IR (-O2):
define void @stdlib_strided_dcumaxabs(i32 %0, double* nocapture %1, i32 %2, double* nocapture writeonly %3, i32 %4) {
%6 = icmp slt i32 %0, 1
br i1 %6, label %94, label %7
7: ; preds = %5
%8 = icmp slt i32 %2, 0
%9 = sub nsw i32 1, %0
%10 = mul nsw i32 %9, %2
%11 = select i1 %8, i32 %10, i32 0
%12 = icmp slt i32 %4, 0
%13 = mul nsw i32 %9, %4
%14 = select i1 %12, i32 %13, i32 0
%15 = sext i32 %11 to i64
%16 = getelementptr inbounds double, double* %1, i64 %15
%17 = load double, double* %16
%18 = tail call double @llvm.fabs.f64(double %17)
%19 = sext i32 %14 to i64
%20 = getelementptr inbounds double, double* %3, i64 %19
store double %18, double* %20
%21 = add i32 %14, %4
%22 = tail call i64 @stdlib_base_is_nan(double %18)
%23 = icmp eq i64 %22, 0
%24 = icmp ne i32 %0, 1
%25 = and i1 %23, %24
br i1 %25, label %26, label %52
26: ; preds = %7
%27 = sext i32 %21 to i64
%28 = sext i32 %4 to i64
%29 = sext i32 %2 to i64
%30 = mul i32 %4, %0
%31 = add i32 %14, %30
br label %32
32: ; preds = %26, %43
%33 = phi i64 [ %15, %26 ], [ %37, %43 ]
%34 = phi i64 [ %27, %26 ], [ %47, %43 ]
%35 = phi double [ %18, %26 ], [ %45, %43 ]
%36 = phi i32 [ 1, %26 ], [ %48, %43 ]
%37 = add i64 %33, %29
%38 = getelementptr inbounds double, double* %1, i64 %37
%39 = load double, double* %38
%40 = tail call double @llvm.fabs.f64(double %39)
%41 = tail call i64 @stdlib_base_is_nan(double %40)
%42 = icmp eq i64 %41, 0
br i1 %42, label %43, label %50
43: ; preds = %32
%44 = fcmp ogt double %40, %35
%45 = select i1 %44, double %40, double %35
%46 = getelementptr inbounds double, double* %3, i64 %34
store double %45, double* %46
%47 = add i64 %34, %28
%48 = add nuw nsw i32 %36, 1
%49 = icmp eq i32 %48, %0
br i1 %49, label %52, label %32
50: ; preds = %32
%51 = trunc i64 %34 to i32
br label %52
52: ; preds = %43, %50, %7
%53 = phi i32 [ %21, %7 ], [ %51, %50 ], [ %31, %43 ]
%54 = phi i32 [ 1, %7 ], [ %36, %50 ], [ %0, %43 ]
%55 = phi double [ %18, %7 ], [ %40, %50 ], [ %45, %43 ]
%56 = tail call i64 @stdlib_base_is_nan(double %55)
%57 = icmp ne i64 %56, 0
%58 = icmp slt i32 %54, %0
%59 = select i1 %57, i1 %58, i1 false
br i1 %59, label %60, label %94
60: ; preds = %52
%61 = sext i32 %53 to i64
%62 = sext i32 %4 to i64
%63 = sub i32 %0, %54
%64 = xor i32 %54, -1
%65 = add i32 %64, %0
%66 = and i32 %63, 3
%67 = icmp eq i32 %66, 0
br i1 %67, label %77, label %68
68: ; preds = %60, %68
%69 = phi i64 [ %73, %68 ], [ %61, %60 ]
%70 = phi i32 [ %74, %68 ], [ %54, %60 ]
%71 = phi i32 [ %75, %68 ], [ 0, %60 ]
%72 = getelementptr inbounds double, double* %3, i64 %69
store double %55, double* %72
%73 = add i64 %69, %62
%74 = add nuw nsw i32 %70, 1
%75 = add i32 %71, 1
%76 = icmp eq i32 %75, %66
br i1 %76, label %77, label %68
77: ; preds = %68, %60
%78 = phi i64 [ %61, %60 ], [ %73, %68 ]
%79 = phi i32 [ %54, %60 ], [ %74, %68 ]
%80 = icmp ult i32 %65, 3
br i1 %80, label %94, label %81
81: ; preds = %77, %81
%82 = phi i64 [ %91, %81 ], [ %78, %77 ]
%83 = phi i32 [ %92, %81 ], [ %79, %77 ]
%84 = getelementptr inbounds double, double* %3, i64 %82
store double %55, double* %84
%85 = add i64 %82, %62
%86 = getelementptr inbounds double, double* %3, i64 %85
store double %55, double* %86
%87 = add i64 %85, %62
%88 = getelementptr inbounds double, double* %3, i64 %87
store double %55, double* %88
%89 = add i64 %87, %62
%90 = getelementptr inbounds double, double* %3, i64 %89
store double %55, double* %90
%91 = add i64 %89, %62
%92 = add nuw nsw i32 %83, 4
%93 = icmp eq i32 %92, %0
br i1 %93, label %94, label %81
94: ; preds = %77, %81, %52, %5
ret void
}