#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 uint16_t;

/* Variables and functions */
uint16_t jis2sjis(uint16_t jis) {
  jis += 0x217e;
  jis ^= 0x4000;
  bool c = jis & 0x100;
  jis = (jis & 0xff) | (((jis >> 1) | 0x8000) & 0xff00);
  if (!c) {
    uint16_t jisl = jis & 0xff;
    jisl -= 0xde;
    if (jisl >> 8)
      jisl--;
    jisl -= 0x80;
    jis = (jis & 0xff00) | (jisl & 0xff);
  }
  return jis;
}


x86 assembly (clang, -O0):
<jis2sjis>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x217e,%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
xor    $0x4000,%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
and    $0x100,%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
and    $0xff,%eax
mov    -0x4(%rbp),%ecx
sar    $0x1,%ecx
or     $0x8000,%ecx
and    $0xff00,%ecx
or     %ecx,%eax
mov    %eax,-0x4(%rbp)
cmpl   $0x0,-0x8(%rbp)
jne    11a0 <jis2sjis+0xa0>
mov    -0x4(%rbp),%eax
and    $0xff,%eax
mov    %eax,-0xc(%rbp)
mov    -0xc(%rbp),%eax
sub    $0xde,%eax
mov    %eax,-0xc(%rbp)
mov    -0xc(%rbp),%eax
sar    $0x8,%eax
cmp    $0x0,%eax
je     117f <jis2sjis+0x7f>
mov    -0xc(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0xc(%rbp)
mov    -0xc(%rbp),%eax
sub    $0x80,%eax
mov    %eax,-0xc(%rbp)
mov    -0x4(%rbp),%eax
and    $0xff00,%eax
mov    -0xc(%rbp),%ecx
and    $0xff,%ecx
or     %ecx,%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<jis2sjis>:
lea    0x217e(%rdi),%edx
movzbl %dl,%ecx
mov    %edx,%eax
shr    %eax
and    $0x7f00,%eax
xor    $0xa000,%eax
test   $0x100,%edx
jne    113e <jis2sjis+0x3e>
add    $0xffffff22,%ecx
add    $0x9f,%edi
cmp    $0x100,%ecx
cmovb  %ecx,%edi
sub    $0xffffff80,%edi
movzbl %dil,%ecx
or     %ecx,%eax
ret
or     %ecx,%eax
ret

LLVM IR (-O0):
define i32 @jis2sjis(i32 %0) {
%2 = alloca i32
%3 = alloca i32
%4 = alloca i32
store i32 %0, i32* %2
%5 = load i32, i32* %2
%6 = add nsw i32 %5, 8574
store i32 %6, i32* %2
%7 = load i32, i32* %2
%8 = xor i32 %7, 16384
store i32 %8, i32* %2
%9 = load i32, i32* %2
%10 = and i32 %9, 256
store i32 %10, i32* %3
%11 = load i32, i32* %2
%12 = and i32 %11, 255
%13 = load i32, i32* %2
%14 = ashr i32 %13, 1
%15 = or i32 %14, 32768
%16 = and i32 %15, 65280
%17 = or i32 %12, %16
store i32 %17, i32* %2
%18 = load i32, i32* %3
%19 = icmp ne i32 %18, 0
br i1 %19, label %39, label %20
20: ; preds = %1
%21 = load i32, i32* %2
%22 = and i32 %21, 255
store i32 %22, i32* %4
%23 = load i32, i32* %4
%24 = sub nsw i32 %23, 222
store i32 %24, i32* %4
%25 = load i32, i32* %4
%26 = ashr i32 %25, 8
%27 = icmp ne i32 %26, 0
br i1 %27, label %28, label %31
28: ; preds = %20
%29 = load i32, i32* %4
%30 = add nsw i32 %29, -1
store i32 %30, i32* %4
br label %31
31: ; preds = %28, %20
%32 = load i32, i32* %4
%33 = sub nsw i32 %32, 128
store i32 %33, i32* %4
%34 = load i32, i32* %2
%35 = and i32 %34, 65280
%36 = load i32, i32* %4
%37 = and i32 %36, 255
%38 = or i32 %35, %37
store i32 %38, i32* %2
br label %39
39: ; preds = %31, %1
%40 = load i32, i32* %2
ret i32 %40
}

LLVM IR (-O2):
define i32 @jis2sjis(i32 %0) {
%2 = add nsw i32 %0, 8574
%3 = and i32 %2, 256
%4 = and i32 %2, 255
%5 = lshr i32 %2, 1
%6 = and i32 %5, 32512
%7 = xor i32 %6, 40960
%8 = or i32 %7, %4
%9 = icmp eq i32 %3, 0
br i1 %9, label %10, label %18
10: ; preds = %1
%11 = add nsw i32 %4, -222
%12 = icmp ult i32 %11, 256
%13 = add i32 %0, 159
%14 = select i1 %12, i32 %11, i32 %13
%15 = add i32 %14, 128
%16 = and i32 %15, 255
%17 = or i32 %16, %7
br label %18
18: ; preds = %10, %1
%19 = phi i32 [ %8, %1 ], [ %17, %10 ]
ret i32 %19
}