int prog_q168fxormin(int input, int miniS) {
  short mini1 = (miniS >> 16) & 0x007FFF;
  short mini2 = miniS & 0x007FFF;
  short sign = (miniS >> 31) & 0x01;
  short isign = (input >> 15) & 0x0001;
  input = (input < 0) ? -input : input;
  if (input < mini1) {
    mini2 = mini1;
    mini1 = input;
  } else if (input < mini2) {
    mini2 = input;
    mini1 = mini1;
  }
  sign = sign ^ isign;
  return (((int)sign) << 31) | (((int)mini1) << 16) | ((int)mini2);
}


x86 assembly (clang, -O0):
<prog_q168fxormin>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x10,%eax
and    $0x7fff,%eax
mov    %ax,-0xa(%rbp)
mov    -0x8(%rbp),%eax
and    $0x7fff,%eax
mov    %ax,-0xc(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1f,%eax
and    $0x1,%eax
mov    %ax,-0xe(%rbp)
mov    -0x4(%rbp),%eax
sar    $0xf,%eax
and    $0x1,%eax
mov    %ax,-0x10(%rbp)
cmpl   $0x0,-0x4(%rbp)
jge    1156 <prog_q168fxormin+0x56>
xor    %eax,%eax
sub    -0x4(%rbp),%eax
mov    %eax,-0x14(%rbp)
jmp    115c <prog_q168fxormin+0x5c>
mov    -0x4(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
movswl -0xa(%rbp),%ecx
cmp    %ecx,%eax
jge    1185 <prog_q168fxormin+0x85>
mov    -0xa(%rbp),%ax
mov    %ax,-0xc(%rbp)
mov    -0x4(%rbp),%eax
mov    %ax,-0xa(%rbp)
jmp    11a8 <prog_q168fxormin+0xa8>
mov    -0x4(%rbp),%eax
movswl -0xc(%rbp),%ecx
cmp    %ecx,%eax
jge    11a3 <prog_q168fxormin+0xa3>
mov    -0x4(%rbp),%eax
mov    %ax,-0xc(%rbp)
mov    -0xa(%rbp),%ax
mov    %ax,-0xa(%rbp)
jmp    11a8 <prog_q168fxormin+0xa8>
movswl -0xe(%rbp),%eax
movswl -0x10(%rbp),%ecx
xor    %ecx,%eax
mov    %ax,-0xe(%rbp)
movswl -0xe(%rbp),%eax
shl    $0x1f,%eax
movswl -0xa(%rbp),%ecx
shl    $0x10,%ecx
or     %ecx,%eax
movswl -0xc(%rbp),%ecx
or     %ecx,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<prog_q168fxormin>:
mov    %esi,%eax
shr    $0x10,%eax
mov    %edi,%ecx
neg    %ecx
cmovs  %edi,%ecx
and    $0x7fff,%eax
mov    %esi,%edx
and    $0x7fff,%edx
cmp    %edx,%ecx
cmovb  %ecx,%edx
cmp    %eax,%ecx
cmovae %eax,%ecx
cmovb  %eax,%edx
shl    $0x10,%edi
xor    %esi,%edi
and    $0x80000000,%edi
shl    $0x10,%ecx
movzwl %dx,%eax
or     %edi,%eax
or     %ecx,%eax
ret

LLVM IR (-O0):
define i32 @prog_q168fxormin(i32 %0, i32 %1) {
%3 = alloca i32
%4 = alloca i32
%5 = alloca i16
%6 = alloca i16
%7 = alloca i16
%8 = alloca i16
store i32 %0, i32* %3
store i32 %1, i32* %4
%9 = load i32, i32* %4
%10 = ashr i32 %9, 16
%11 = and i32 %10, 32767
%12 = trunc i32 %11 to i16
store i16 %12, i16* %5
%13 = load i32, i32* %4
%14 = and i32 %13, 32767
%15 = trunc i32 %14 to i16
store i16 %15, i16* %6
%16 = load i32, i32* %4
%17 = ashr i32 %16, 31
%18 = and i32 %17, 1
%19 = trunc i32 %18 to i16
store i16 %19, i16* %7
%20 = load i32, i32* %3
%21 = ashr i32 %20, 15
%22 = and i32 %21, 1
%23 = trunc i32 %22 to i16
store i16 %23, i16* %8
%24 = load i32, i32* %3
%25 = icmp slt i32 %24, 0
br i1 %25, label %26, label %29
26: ; preds = %2
%27 = load i32, i32* %3
%28 = sub nsw i32 0, %27
br label %31
29: ; preds = %2
%30 = load i32, i32* %3
br label %31
31: ; preds = %29, %26
%32 = phi i32 [ %28, %26 ], [ %30, %29 ]
store i32 %32, i32* %3
%33 = load i32, i32* %3
%34 = load i16, i16* %5
%35 = sext i16 %34 to i32
%36 = icmp slt i32 %33, %35
br i1 %36, label %37, label %41
37: ; preds = %31
%38 = load i16, i16* %5
store i16 %38, i16* %6
%39 = load i32, i32* %3
%40 = trunc i32 %39 to i16
store i16 %40, i16* %5
br label %51
41: ; preds = %31
%42 = load i32, i32* %3
%43 = load i16, i16* %6
%44 = sext i16 %43 to i32
%45 = icmp slt i32 %42, %44
br i1 %45, label %46, label %50
46: ; preds = %41
%47 = load i32, i32* %3
%48 = trunc i32 %47 to i16
store i16 %48, i16* %6
%49 = load i16, i16* %5
store i16 %49, i16* %5
br label %50
50: ; preds = %46, %41
br label %51
51: ; preds = %50, %37
%52 = load i16, i16* %7
%53 = sext i16 %52 to i32
%54 = load i16, i16* %8
%55 = sext i16 %54 to i32
%56 = xor i32 %53, %55
%57 = trunc i32 %56 to i16
store i16 %57, i16* %7
%58 = load i16, i16* %7
%59 = sext i16 %58 to i32
%60 = shl i32 %59, 31
%61 = load i16, i16* %5
%62 = sext i16 %61 to i32
%63 = shl i32 %62, 16
%64 = or i32 %60, %63
%65 = load i16, i16* %6
%66 = sext i16 %65 to i32
%67 = or i32 %64, %66
ret i32 %67
}

LLVM IR (-O2):
define i32 @prog_q168fxormin(i32 %0, i32 %1) {
%3 = lshr i32 %1, 16
%4 = trunc i32 %3 to i16
%5 = and i16 %4, 32767
%6 = trunc i32 %1 to i16
%7 = and i16 %6, 32767
%8 = tail call i32 @llvm.abs.i32(i32 %0, i1 true)
%9 = zext i16 %5 to i32
%10 = icmp ult i32 %8, %9
%11 = trunc i32 %8 to i16
%12 = zext i16 %7 to i32
%13 = icmp ult i32 %8, %12
%14 = select i1 %13, i16 %11, i16 %7
%15 = select i1 %10, i16 %11, i16 %5
%16 = select i1 %10, i16 %5, i16 %14
%17 = shl i32 %0, 16
%18 = xor i32 %17, %1
%19 = and i32 %18, -2147483648
%20 = zext i16 %15 to i32
%21 = shl nuw i32 %20, 16
%22 = zext i16 %16 to i32
%23 = or i32 %19, %22
%24 = or i32 %23, %21
ret i32 %24
}