#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 /*<<< orphan*/ r;
typedef int /*<<< orphan*/ l;

/* Variables and functions */
int SHRT_MAX;
int SHRT_MIN;
int wav16_samples_max(const unsigned char *buf, int len, int channels,
                      int bswap) {
  const short int *left;
  const short int *right;
  short int l;
  short int r;
  int lavg;
  int ravg;
  int lmin = SHRT_MAX;
  int lmax = SHRT_MIN;
  int rmin = SHRT_MAX;
  int rmax = SHRT_MIN;
  if (len == 0) {
    return 0;
  }
  left = (short int *)buf;
  right = left + 1;
  while (len > 0) {
    l = *left;
    r = *right;
    if (bswap) {
      {
        unsigned short t = (unsigned short)(l);
        unsigned char *o = (unsigned char *)&(l);
        unsigned char *i = (unsigned char *)&t;
        o[0] = i[1];
        o[1] = i[0];
      };
      {
        unsigned short t = (unsigned short)(r);
        unsigned char *o = (unsigned char *)&(r);
        unsigned char *i = (unsigned char *)&t;
        o[0] = i[1];
        o[1] = i[0];
      };
    }
    if (l > lmax) {
      lmax = l;
    } else if (l < lmin) {
      lmin = l;
    }
    len -= sizeof(l);
    left++;
    if (channels == 2) {
      if (r > rmax) {
        rmax = r;
      } else if (r < rmin) {
        rmin = r;
      }
      len -= sizeof(r);
      left++;
      right = left + 1;
    }
  }
  lavg = lmax - lmin;
  if (channels == 2) {
    ravg = rmax - rmin;
    return lavg > ravg ? lavg : ravg;
  }
  return lavg;
}


x86 assembly (clang, -O0):
<wav16_samples_max>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    0x2ec0(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x40(%rbp)
mov    0x2ebc(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x44(%rbp)
mov    0x2ea8(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x48(%rbp)
mov    0x2ea4(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4c(%rbp)
cmpl   $0x0,-0x14(%rbp)
jne    1157 <wav16_samples_max+0x57>
movl   $0x0,-0x4(%rbp)
jmp    12f0 <wav16_samples_max+0x1f0>
mov    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x30(%rbp)
cmpl   $0x0,-0x14(%rbp)
jle    12a6 <wav16_samples_max+0x1a6>
mov    -0x28(%rbp),%rax
mov    (%rax),%ax
mov    %ax,-0x32(%rbp)
mov    -0x30(%rbp),%rax
mov    (%rax),%ax
mov    %ax,-0x34(%rbp)
cmpl   $0x0,-0x1c(%rbp)
je     11f9 <wav16_samples_max+0xf9>
mov    -0x32(%rbp),%ax
mov    %ax,-0x4e(%rbp)
lea    -0x32(%rbp),%rax
mov    %rax,-0x58(%rbp)
lea    -0x4e(%rbp),%rax
mov    %rax,-0x60(%rbp)
mov    -0x60(%rbp),%rax
mov    0x1(%rax),%cl
mov    -0x58(%rbp),%rax
mov    %cl,(%rax)
mov    -0x60(%rbp),%rax
mov    (%rax),%cl
mov    -0x58(%rbp),%rax
mov    %cl,0x1(%rax)
mov    -0x34(%rbp),%ax
mov    %ax,-0x62(%rbp)
lea    -0x34(%rbp),%rax
mov    %rax,-0x70(%rbp)
lea    -0x62(%rbp),%rax
mov    %rax,-0x78(%rbp)
mov    -0x78(%rbp),%rax
mov    0x1(%rax),%cl
mov    -0x70(%rbp),%rax
mov    %cl,(%rax)
mov    -0x78(%rbp),%rax
mov    (%rax),%cl
mov    -0x70(%rbp),%rax
mov    %cl,0x1(%rax)
movswl -0x32(%rbp),%eax
cmp    -0x44(%rbp),%eax
jle    1212 <wav16_samples_max+0x112>
movswl -0x32(%rbp),%eax
mov    %eax,-0x44(%rbp)
jmp    122b <wav16_samples_max+0x12b>
movswl -0x32(%rbp),%eax
cmp    -0x40(%rbp),%eax
jge    1226 <wav16_samples_max+0x126>
movswl -0x32(%rbp),%eax
mov    %eax,-0x40(%rbp)
jmp    122b <wav16_samples_max+0x12b>
movslq -0x14(%rbp),%rax
sub    $0x2,%rax
mov    %eax,-0x14(%rbp)
mov    -0x28(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x28(%rbp)
cmpl   $0x2,-0x18(%rbp)
jne    12a1 <wav16_samples_max+0x1a1>
movswl -0x34(%rbp),%eax
cmp    -0x4c(%rbp),%eax
jle    1265 <wav16_samples_max+0x165>
movswl -0x34(%rbp),%eax
mov    %eax,-0x4c(%rbp)
jmp    127e <wav16_samples_max+0x17e>
movswl -0x34(%rbp),%eax
cmp    -0x48(%rbp),%eax
jge    1279 <wav16_samples_max+0x179>
movswl -0x34(%rbp),%eax
mov    %eax,-0x48(%rbp)
jmp    127e <wav16_samples_max+0x17e>
movslq -0x14(%rbp),%rax
sub    $0x2,%rax
mov    %eax,-0x14(%rbp)
mov    -0x28(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x30(%rbp)
jmp    116b <wav16_samples_max+0x6b>
mov    -0x44(%rbp),%eax
sub    -0x40(%rbp),%eax
mov    %eax,-0x38(%rbp)
cmpl   $0x2,-0x18(%rbp)
jne    12ea <wav16_samples_max+0x1ea>
mov    -0x4c(%rbp),%eax
sub    -0x48(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x3c(%rbp),%eax
jle    12d9 <wav16_samples_max+0x1d9>
mov    -0x38(%rbp),%eax
mov    %eax,-0x7c(%rbp)
jmp    12df <wav16_samples_max+0x1df>
mov    -0x3c(%rbp),%eax
mov    %eax,-0x7c(%rbp)
mov    -0x7c(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    12f0 <wav16_samples_max+0x1f0>
mov    -0x38(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<wav16_samples_max>:
test   %esi,%esi
je     11df <wav16_samples_max+0xdf>
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
mov    0x2ec1(%rip),%rax
mov    (%rax),%r9d
mov    0x2ebf(%rip),%rax
mov    (%rax),%r8d
jle    11e2 <wav16_samples_max+0xe2>
lea    0x2(%rdi),%r11
mov    %r8d,%eax
mov    %r9d,%r10d
jmp    1177 <wav16_samples_max+0x77>
cs nopw 0x0(%rax,%rax,1)
shl    $0x8,%r15d
movzbl %r14b,%ebp
or     %r15d,%ebp
movswl %bp,%ebp
cmp    %ebp,%r9d
mov    %r9d,%ebx
cmovg  %ebp,%ebx
cmp    %ebp,%r8d
cmovge %ebx,%r9d
cmovl  %ebp,%r8d
add    $0xfffffffc,%esi
lea    0x4(%rdi),%rbx
add    $0x6,%rdi
mov    %rdi,%r11
mov    %rbx,%rdi
test   %esi,%esi
jle    11e8 <wav16_samples_max+0xe8>
movzwl (%rdi),%r12d
mov    %r12d,%ebp
shr    $0x8,%ebp
movzwl (%r11),%r15d
mov    %r15d,%ebx
shr    $0x8,%ebx
test   %ecx,%ecx
je     11a0 <wav16_samples_max+0xa0>
mov    %ebx,%r14d
mov    %r12d,%ebx
jmp    11ab <wav16_samples_max+0xab>
nopw   0x0(%rax,%rax,1)
mov    %r15d,%r14d
mov    %ebx,%r15d
mov    %ebp,%ebx
mov    %r12d,%ebp
shl    $0x8,%ebx
movzbl %bpl,%ebp
or     %ebx,%ebp
movswl %bp,%ebx
cmp    %ebx,%r10d
mov    %r10d,%ebp
cmovg  %ebx,%ebp
cmp    %ebx,%eax
cmovge %ebp,%r10d
cmovl  %ebx,%eax
cmp    $0x2,%edx
je     1140 <wav16_samples_max+0x40>
add    $0xfffffffe,%esi
add    $0x2,%rdi
test   %esi,%esi
jg     1177 <wav16_samples_max+0x77>
jmp    11e8 <wav16_samples_max+0xe8>
xor    %eax,%eax
ret
mov    %r9d,%r10d
mov    %r8d,%eax
sub    %r10d,%eax
cmp    $0x2,%edx
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
jne    1202 <wav16_samples_max+0x102>
sub    %r9d,%r8d
cmp    %r8d,%eax
cmovle %r8d,%eax
ret

LLVM IR (-O0):
@SHRT_MAX = global i32 0
@SHRT_MIN = global i32 0
define i32 @wav16_samples_max(i8* %0, i32 %1, i32 %2, i32 %3) {
%5 = alloca i32
%6 = alloca i8*
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i16*
%11 = alloca i16*
%12 = alloca i16
%13 = alloca i16
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca i32
%19 = alloca i32
%20 = alloca i16
%21 = alloca i8*
%22 = alloca i8*
%23 = alloca i16
%24 = alloca i8*
%25 = alloca i8*
store i8* %0, i8** %6
store i32 %1, i32* %7
store i32 %2, i32* %8
store i32 %3, i32* %9
%26 = load i32, i32* @SHRT_MAX
store i32 %26, i32* %16
%27 = load i32, i32* @SHRT_MIN
store i32 %27, i32* %17
%28 = load i32, i32* @SHRT_MAX
store i32 %28, i32* %18
%29 = load i32, i32* @SHRT_MIN
store i32 %29, i32* %19
%30 = load i32, i32* %7
%31 = icmp eq i32 %30, 0
br i1 %31, label %32, label %33
32: ; preds = %4
store i32 0, i32* %5
br label %149
33: ; preds = %4
%34 = load i8*, i8** %6
%35 = bitcast i8* %34 to i16*
store i16* %35, i16** %10
%36 = load i16*, i16** %10
%37 = getelementptr inbounds i16, i16* %36, i64 1
store i16* %37, i16** %11
br label %38
38: ; preds = %127, %33
%39 = load i32, i32* %7
%40 = icmp sgt i32 %39, 0
br i1 %40, label %41, label %128
41: ; preds = %38
%42 = load i16*, i16** %10
%43 = load i16, i16* %42
store i16 %43, i16* %12
%44 = load i16*, i16** %11
%45 = load i16, i16* %44
store i16 %45, i16* %13
%46 = load i32, i32* %9
%47 = icmp ne i32 %46, 0
br i1 %47, label %48, label %75
48: ; preds = %41
%49 = load i16, i16* %12
store i16 %49, i16* %20
%50 = bitcast i16* %12 to i8*
store i8* %50, i8** %21
%51 = bitcast i16* %20 to i8*
store i8* %51, i8** %22
%52 = load i8*, i8** %22
%53 = getelementptr inbounds i8, i8* %52, i64 1
%54 = load i8, i8* %53
%55 = load i8*, i8** %21
%56 = getelementptr inbounds i8, i8* %55, i64 0
store i8 %54, i8* %56
%57 = load i8*, i8** %22
%58 = getelementptr inbounds i8, i8* %57, i64 0
%59 = load i8, i8* %58
%60 = load i8*, i8** %21
%61 = getelementptr inbounds i8, i8* %60, i64 1
store i8 %59, i8* %61
%62 = load i16, i16* %13
store i16 %62, i16* %23
%63 = bitcast i16* %13 to i8*
store i8* %63, i8** %24
%64 = bitcast i16* %23 to i8*
store i8* %64, i8** %25
%65 = load i8*, i8** %25
%66 = getelementptr inbounds i8, i8* %65, i64 1
%67 = load i8, i8* %66
%68 = load i8*, i8** %24
%69 = getelementptr inbounds i8, i8* %68, i64 0
store i8 %67, i8* %69
%70 = load i8*, i8** %25
%71 = getelementptr inbounds i8, i8* %70, i64 0
%72 = load i8, i8* %71
%73 = load i8*, i8** %24
%74 = getelementptr inbounds i8, i8* %73, i64 1
store i8 %72, i8* %74
br label %75
75: ; preds = %48, %41
%76 = load i16, i16* %12
%77 = sext i16 %76 to i32
%78 = load i32, i32* %17
%79 = icmp sgt i32 %77, %78
br i1 %79, label %80, label %83
80: ; preds = %75
%81 = load i16, i16* %12
%82 = sext i16 %81 to i32
store i32 %82, i32* %17
br label %92
83: ; preds = %75
%84 = load i16, i16* %12
%85 = sext i16 %84 to i32
%86 = load i32, i32* %16
%87 = icmp slt i32 %85, %86
br i1 %87, label %88, label %91
88: ; preds = %83
%89 = load i16, i16* %12
%90 = sext i16 %89 to i32
store i32 %90, i32* %16
br label %91
91: ; preds = %88, %83
br label %92
92: ; preds = %91, %80
%93 = load i32, i32* %7
%94 = sext i32 %93 to i64
%95 = sub i64 %94, 2
%96 = trunc i64 %95 to i32
store i32 %96, i32* %7
%97 = load i16*, i16** %10
%98 = getelementptr inbounds i16, i16* %97, i32 1
store i16* %98, i16** %10
%99 = load i32, i32* %8
%100 = icmp eq i32 %99, 2
br i1 %100, label %101, label %127
101: ; preds = %92
%102 = load i16, i16* %13
%103 = sext i16 %102 to i32
%104 = load i32, i32* %19
%105 = icmp sgt i32 %103, %104
br i1 %105, label %106, label %109
106: ; preds = %101
%107 = load i16, i16* %13
%108 = sext i16 %107 to i32
store i32 %108, i32* %19
br label %118
109: ; preds = %101
%110 = load i16, i16* %13
%111 = sext i16 %110 to i32
%112 = load i32, i32* %18
%113 = icmp slt i32 %111, %112
br i1 %113, label %114, label %117
114: ; preds = %109
%115 = load i16, i16* %13
%116 = sext i16 %115 to i32
store i32 %116, i32* %18
br label %117
117: ; preds = %114, %109
br label %118
118: ; preds = %117, %106
%119 = load i32, i32* %7
%120 = sext i32 %119 to i64
%121 = sub i64 %120, 2
%122 = trunc i64 %121 to i32
store i32 %122, i32* %7
%123 = load i16*, i16** %10
%124 = getelementptr inbounds i16, i16* %123, i32 1
store i16* %124, i16** %10
%125 = load i16*, i16** %10
%126 = getelementptr inbounds i16, i16* %125, i64 1
store i16* %126, i16** %11
br label %127
127: ; preds = %118, %92
br label %38
128: ; preds = %38
%129 = load i32, i32* %17
%130 = load i32, i32* %16
%131 = sub nsw i32 %129, %130
store i32 %131, i32* %14
%132 = load i32, i32* %8
%133 = icmp eq i32 %132, 2
br i1 %133, label %134, label %147
134: ; preds = %128
%135 = load i32, i32* %19
%136 = load i32, i32* %18
%137 = sub nsw i32 %135, %136
store i32 %137, i32* %15
%138 = load i32, i32* %14
%139 = load i32, i32* %15
%140 = icmp sgt i32 %138, %139
br i1 %140, label %141, label %143
141: ; preds = %134
%142 = load i32, i32* %14
br label %145
143: ; preds = %134
%144 = load i32, i32* %15
br label %145
145: ; preds = %143, %141
%146 = phi i32 [ %142, %141 ], [ %144, %143 ]
store i32 %146, i32* %5
br label %149
147: ; preds = %128
%148 = load i32, i32* %14
store i32 %148, i32* %5
br label %149
149: ; preds = %147, %145, %32
%150 = load i32, i32* %5
ret i32 %150
}

LLVM IR (-O2):
@SHRT_MAX = global i32 0
@SHRT_MIN = global i32 0
define i32 @wav16_samples_max(i8* nocapture %0, i32 %1, i32 %2, i32 %3) {
%5 = load i32, i32* @SHRT_MAX
%6 = load i32, i32* @SHRT_MIN
%7 = icmp eq i32 %1, 0
br i1 %7, label %76, label %8
8: ; preds = %4
%9 = icmp sgt i32 %1, 0
br i1 %9, label %10, label %65
10: ; preds = %8
%11 = getelementptr inbounds i8, i8* %0, i64 2
%12 = bitcast i8* %11 to i16*
%13 = bitcast i8* %0 to i16*
%14 = icmp eq i32 %3, 0
%15 = icmp eq i32 %2, 2
br label %16
16: ; preds = %10, %58
%17 = phi i32 [ %1, %10 ], [ %63, %58 ]
%18 = phi i16* [ %13, %10 ], [ %62, %58 ]
%19 = phi i16* [ %12, %10 ], [ %61, %58 ]
%20 = phi i32 [ %6, %10 ], [ %60, %58 ]
%21 = phi i32 [ %5, %10 ], [ %59, %58 ]
%22 = phi i32 [ %6, %10 ], [ %42, %58 ]
%23 = phi i32 [ %5, %10 ], [ %41, %58 ]
%24 = load i16, i16* %18
%25 = lshr i16 %24, 8
%26 = load i16, i16* %19
%27 = lshr i16 %26, 8
br i1 %14, label %29, label %28
28: ; preds = %16
br label %29
29: ; preds = %28, %16
%30 = phi i16 [ %27, %28 ], [ %26, %16 ]
%31 = phi i16 [ %26, %28 ], [ %27, %16 ]
%32 = phi i16 [ %24, %28 ], [ %25, %16 ]
%33 = phi i16 [ %25, %28 ], [ %24, %16 ]
%34 = shl i16 %32, 8
%35 = and i16 %33, 255
%36 = or i16 %35, %34
%37 = sext i16 %36 to i32
%38 = icmp slt i32 %22, %37
%39 = icmp sgt i32 %23, %37
%40 = select i1 %39, i32 %37, i32 %23
%41 = select i1 %38, i32 %23, i32 %40
%42 = select i1 %38, i32 %37, i32 %22
%43 = add nsw i32 %17, -2
%44 = getelementptr inbounds i16, i16* %18, i64 1
br i1 %15, label %45, label %58
45: ; preds = %29
%46 = shl i16 %31, 8
%47 = and i16 %30, 255
%48 = or i16 %46, %47
%49 = sext i16 %48 to i32
%50 = icmp slt i32 %20, %49
%51 = icmp sgt i32 %21, %49
%52 = select i1 %51, i32 %49, i32 %21
%53 = select i1 %50, i32 %21, i32 %52
%54 = select i1 %50, i32 %49, i32 %20
%55 = add nsw i32 %17, -4
%56 = getelementptr inbounds i16, i16* %18, i64 2
%57 = getelementptr inbounds i16, i16* %18, i64 3
br label %58
58: ; preds = %45, %29
%59 = phi i32 [ %53, %45 ], [ %21, %29 ]
%60 = phi i32 [ %54, %45 ], [ %20, %29 ]
%61 = phi i16* [ %57, %45 ], [ %19, %29 ]
%62 = phi i16* [ %56, %45 ], [ %44, %29 ]
%63 = phi i32 [ %55, %45 ], [ %43, %29 ]
%64 = icmp sgt i32 %63, 0
br i1 %64, label %16, label %65
65: ; preds = %58, %8
%66 = phi i32 [ %5, %8 ], [ %41, %58 ]
%67 = phi i32 [ %6, %8 ], [ %42, %58 ]
%68 = phi i32 [ %5, %8 ], [ %59, %58 ]
%69 = phi i32 [ %6, %8 ], [ %60, %58 ]
%70 = sub nsw i32 %67, %66
%71 = icmp eq i32 %2, 2
br i1 %71, label %72, label %76
72: ; preds = %65
%73 = sub nsw i32 %69, %68
%74 = icmp sgt i32 %70, %73
%75 = select i1 %74, i32 %70, i32 %73
br label %76
76: ; preds = %65, %4, %72
%77 = phi i32 [ %75, %72 ], [ 0, %4 ], [ %70, %65 ]
ret i32 %77
}