int prog_q168fcsel(int value, int dMin) {
  short beta_fix = 38;
  short min = (dMin >> 16) & 0x007FFF;
  short min2 = (dMin & 0x007FFF);
  short res;
  int aValue = (value < 0) ? -value : value;
  if (aValue == min) {
    short cste_1 = (min2 - beta_fix);
    res = (cste_1 < 0) ? 0 : cste_1;
  } else {
    short cste_2 = (min - beta_fix);
    res = (cste_2 < 0) ? 0 : cste_2;
  }
  short sign = (dMin >> 31) & 0x01;
  short isign = (value >> 15) & 0x0001;
  sign = sign ^ isign;
  if (sign == 0) {
    return -res;
  } else {
    return res;
  }
}


x86 assembly (clang, -O0):
<prog_q168fcsel>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
movw   $0x26,-0xe(%rbp)
mov    -0xc(%rbp),%eax
sar    $0x10,%eax
and    $0x7fff,%eax
mov    %ax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
and    $0x7fff,%eax
mov    %ax,-0x12(%rbp)
cmpl   $0x0,-0x8(%rbp)
jge    1142 <prog_q168fcsel+0x42>
xor    %eax,%eax
sub    -0x8(%rbp),%eax
mov    %eax,-0x24(%rbp)
jmp    1148 <prog_q168fcsel+0x48>
mov    -0x8(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
movswl -0x10(%rbp),%ecx
cmp    %ecx,%eax
jne    1195 <prog_q168fcsel+0x95>
movswl -0x12(%rbp),%eax
movswl -0xe(%rbp),%ecx
sub    %ecx,%eax
mov    %ax,-0x1a(%rbp)
movswl -0x1a(%rbp),%eax
cmp    $0x0,%eax
jge    1182 <prog_q168fcsel+0x82>
xor    %eax,%eax
mov    %eax,-0x28(%rbp)
jmp    1189 <prog_q168fcsel+0x89>
movswl -0x1a(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%eax
mov    %ax,-0x14(%rbp)
jmp    11c8 <prog_q168fcsel+0xc8>
movswl -0x10(%rbp),%eax
movswl -0xe(%rbp),%ecx
sub    %ecx,%eax
mov    %ax,-0x1c(%rbp)
movswl -0x1c(%rbp),%eax
cmp    $0x0,%eax
jge    11ba <prog_q168fcsel+0xba>
xor    %eax,%eax
mov    %eax,-0x2c(%rbp)
jmp    11c1 <prog_q168fcsel+0xc1>
movswl -0x1c(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    %ax,-0x14(%rbp)
mov    -0xc(%rbp),%eax
sar    $0x1f,%eax
and    $0x1,%eax
mov    %ax,-0x1e(%rbp)
mov    -0x8(%rbp),%eax
sar    $0xf,%eax
and    $0x1,%eax
mov    %ax,-0x20(%rbp)
movswl -0x1e(%rbp),%eax
movswl -0x20(%rbp),%ecx
xor    %ecx,%eax
mov    %ax,-0x1e(%rbp)
movswl -0x1e(%rbp),%eax
cmp    $0x0,%eax
jne    120d <prog_q168fcsel+0x10d>
movswl -0x14(%rbp),%ecx
xor    %eax,%eax
sub    %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    1214 <prog_q168fcsel+0x114>
movswl -0x14(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<prog_q168fcsel>:
mov    %esi,%eax
shr    $0x10,%eax
and    $0x7fff,%eax
mov    %edi,%ecx
neg    %ecx
cmovs  %edi,%ecx
mov    %eax,%r8d
shl    $0x10,%r8d
mov    %esi,%edx
shl    $0x10,%edx
and    $0x7fff0000,%edx
cmp    %eax,%ecx
cmovne %r8d,%edx
add    $0xffda0000,%edx
xor    %eax,%eax
sar    $0x10,%edx
cmovs  %eax,%edx
shr    $0x1f,%esi
shr    $0xf,%edi
and    $0x1,%edi
mov    %edx,%eax
neg    %eax
cmp    %edi,%esi
cmovne %edx,%eax
ret

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

LLVM IR (-O2):
define i32 @prog_q168fcsel(i32 %0, i32 %1) {
%3 = lshr i32 %1, 16
%4 = and i32 %3, 32767
%5 = tail call i32 @llvm.abs.i32(i32 %0, i1 true)
%6 = icmp eq i32 %5, %4
%7 = shl nuw nsw i32 %4, 16
%8 = shl i32 %1, 16
%9 = and i32 %8, 2147418112
%10 = select i1 %6, i32 %9, i32 %7
%11 = add nsw i32 %10, -2490368
%12 = ashr exact i32 %11, 16
%13 = icmp sgt i32 %12, 0
%14 = select i1 %13, i32 %12, i32 0
%15 = lshr i32 %1, 31
%16 = lshr i32 %0, 15
%17 = and i32 %16, 1
%18 = icmp eq i32 %15, %17
%19 = sub nsw i32 0, %14
%20 = select i1 %18, i32 %19, i32 %14
ret i32 %20
}