short dmp1bit(int e, int f, short delta) {
  int fr = 0;
  if (e != 0)
    fr = f + delta / 2;
  else
    fr = f - delta / 2;
  if (fr <= 32767 && fr >= -32768) {
    return (short)fr;
  } else {
    if (fr < -32768)
      return -32768;
    else
      return 32767;
  }
}


x86 assembly (clang, -O0):
<dmp1bit>:
push   %rbp
mov    %rsp,%rbp
mov    %dx,%ax
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %ax,-0xe(%rbp)
movl   $0x0,-0x14(%rbp)
cmpl   $0x0,-0x8(%rbp)
je     1143 <dmp1bit+0x43>
mov    -0xc(%rbp),%eax
mov    %eax,-0x18(%rbp)
movswl -0xe(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x18(%rbp),%eax
add    %ecx,%eax
mov    %eax,-0x14(%rbp)
jmp    115f <dmp1bit+0x5f>
mov    -0xc(%rbp),%eax
mov    %eax,-0x1c(%rbp)
movswl -0xe(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x1c(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x14(%rbp)
cmpl   $0x7fff,-0x14(%rbp)
jg     1185 <dmp1bit+0x85>
cmpl   $0xffff8000,-0x14(%rbp)
jl     1185 <dmp1bit+0x85>
mov    -0x14(%rbp),%eax
mov    %ax,-0x2(%rbp)
jmp    11a3 <dmp1bit+0xa3>
cmpl   $0xffff8000,-0x14(%rbp)
jge    119d <dmp1bit+0x9d>
movw   $0x8000,-0x2(%rbp)
jmp    11a3 <dmp1bit+0xa3>
movw   $0x7fff,-0x2(%rbp)
movswl -0x2(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<dmp1bit>:
movzwl %dx,%eax
shr    $0xf,%eax
add    %edx,%eax
cwtl
sar    %eax
mov    %eax,%ecx
neg    %ecx
test   %edi,%edi
cmovne %eax,%ecx
add    %esi,%ecx
cmp    $0xffff8001,%ecx
mov    $0xffff8000,%edx
cmovge %ecx,%edx
cmp    $0x7fff,%edx
mov    $0x7fff,%eax
cmovl  %edx,%eax
ret

LLVM IR (-O0):
define signext i16 @dmp1bit(i32 %0, i32 %1, i16 signext %2) {
%4 = alloca i16
%5 = alloca i32
%6 = alloca i32
%7 = alloca i16
%8 = alloca i32
store i32 %0, i32* %5
store i32 %1, i32* %6
store i16 %2, i16* %7
store i32 0, i32* %8
%9 = load i32, i32* %5
%10 = icmp ne i32 %9, 0
br i1 %10, label %11, label %17
11: ; preds = %3
%12 = load i32, i32* %6
%13 = load i16, i16* %7
%14 = sext i16 %13 to i32
%15 = sdiv i32 %14, 2
%16 = add nsw i32 %12, %15
store i32 %16, i32* %8
br label %23
17: ; preds = %3
%18 = load i32, i32* %6
%19 = load i16, i16* %7
%20 = sext i16 %19 to i32
%21 = sdiv i32 %20, 2
%22 = sub nsw i32 %18, %21
store i32 %22, i32* %8
br label %23
23: ; preds = %17, %11
%24 = load i32, i32* %8
%25 = icmp sle i32 %24, 32767
br i1 %25, label %26, label %32
26: ; preds = %23
%27 = load i32, i32* %8
%28 = icmp sge i32 %27, -32768
br i1 %28, label %29, label %32
29: ; preds = %26
%30 = load i32, i32* %8
%31 = trunc i32 %30 to i16
store i16 %31, i16* %4
br label %37
32: ; preds = %26, %23
%33 = load i32, i32* %8
%34 = icmp slt i32 %33, -32768
br i1 %34, label %35, label %36
35: ; preds = %32
store i16 -32768, i16* %4
br label %37
36: ; preds = %32
store i16 32767, i16* %4
br label %37
37: ; preds = %36, %35, %29
%38 = load i16, i16* %4
ret i16 %38
}

LLVM IR (-O2):
define signext i16 @dmp1bit(i32 %0, i32 %1, i16 signext %2) {
%4 = icmp eq i32 %0, 0
%5 = sdiv i16 %2, 2
%6 = sext i16 %5 to i32
%7 = sub nsw i32 0, %6
%8 = select i1 %4, i32 %7, i32 %6
%9 = add i32 %8, %1
%10 = icmp sgt i32 %9, -32768
%11 = select i1 %10, i32 %9, i32 -32768
%12 = icmp slt i32 %11, 32767
%13 = select i1 %12, i32 %11, i32 32767
%14 = trunc i32 %13 to i16
ret i16 %14
}