#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 uint8_t;
typedef int uint16_t;

/* Variables and functions */
uint16_t sjis2jis(uint8_t sjis_1st, uint8_t sjis_2nd) {
  uint16_t jis;
  if (sjis_1st >= 0xe0)
    sjis_1st -= 0x40;
  sjis_1st -= 0x81;
  jis = sjis_1st << 9;
  if (sjis_2nd >= 0x80)
    sjis_2nd--;
  if (sjis_2nd >= 0x9e) {
    jis |= 0x100 | (sjis_2nd - 0x9e);
  } else {
    jis |= (sjis_2nd - 0x40);
  }
  jis += 0x2121;
  return jis;
}


x86 assembly (clang, -O0):
<sjis2jis>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
cmpl   $0xe0,-0x4(%rbp)
jl     1120 <sjis2jis+0x20>
mov    -0x4(%rbp),%eax
sub    $0x40,%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
sub    $0x81,%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
shl    $0x9,%eax
mov    %eax,-0xc(%rbp)
cmpl   $0x80,-0x8(%rbp)
jl     114a <sjis2jis+0x4a>
mov    -0x8(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x8(%rbp)
cmpl   $0x9e,-0x8(%rbp)
jl     116f <sjis2jis+0x6f>
mov    -0x8(%rbp),%eax
sub    $0x9e,%eax
or     $0x100,%eax
or     -0xc(%rbp),%eax
mov    %eax,-0xc(%rbp)
jmp    117b <sjis2jis+0x7b>
mov    -0x8(%rbp),%eax
sub    $0x40,%eax
or     -0xc(%rbp),%eax
mov    %eax,-0xc(%rbp)
mov    -0xc(%rbp),%eax
add    $0x2121,%eax
mov    %eax,-0xc(%rbp)
mov    -0xc(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<sjis2jis>:
xor    %eax,%eax
cmp    $0x7f,%esi
setg   %al
mov    %esi,%ecx
sub    %eax,%ecx
lea    -0x9e(%rcx),%edx
or     $0x100,%edx
neg    %eax
cmp    $0x9e,%ecx
lea    -0x40(%rsi,%rax,1),%ecx
cmovge %edx,%ecx
mov    %edi,%edx
shl    $0x9,%edx
lea    -0x8000(%rdx),%eax
cmp    $0xe0,%edi
cmovl  %edx,%eax
add    $0xfffefe00,%eax
or     %ecx,%eax
add    $0x2121,%eax
ret

LLVM IR (-O0):
define i32 @sjis2jis(i32 %0, i32 %1) {
%3 = alloca i32
%4 = alloca i32
%5 = alloca i32
store i32 %0, i32* %3
store i32 %1, i32* %4
%6 = load i32, i32* %3
%7 = icmp sge i32 %6, 224
br i1 %7, label %8, label %11
8: ; preds = %2
%9 = load i32, i32* %3
%10 = sub nsw i32 %9, 64
store i32 %10, i32* %3
br label %11
11: ; preds = %8, %2
%12 = load i32, i32* %3
%13 = sub nsw i32 %12, 129
store i32 %13, i32* %3
%14 = load i32, i32* %3
%15 = shl i32 %14, 9
store i32 %15, i32* %5
%16 = load i32, i32* %4
%17 = icmp sge i32 %16, 128
br i1 %17, label %18, label %21
18: ; preds = %11
%19 = load i32, i32* %4
%20 = add nsw i32 %19, -1
store i32 %20, i32* %4
br label %21
21: ; preds = %18, %11
%22 = load i32, i32* %4
%23 = icmp sge i32 %22, 158
br i1 %23, label %24, label %30
24: ; preds = %21
%25 = load i32, i32* %4
%26 = sub nsw i32 %25, 158
%27 = or i32 256, %26
%28 = load i32, i32* %5
%29 = or i32 %28, %27
store i32 %29, i32* %5
br label %35
30: ; preds = %21
%31 = load i32, i32* %4
%32 = sub nsw i32 %31, 64
%33 = load i32, i32* %5
%34 = or i32 %33, %32
store i32 %34, i32* %5
br label %35
35: ; preds = %30, %24
%36 = load i32, i32* %5
%37 = add nsw i32 %36, 8481
store i32 %37, i32* %5
%38 = load i32, i32* %5
ret i32 %38
}

LLVM IR (-O2):
define i32 @sjis2jis(i32 %0, i32 %1) {
%3 = icmp sgt i32 %0, 223
%4 = icmp sgt i32 %1, 127
%5 = sext i1 %4 to i32
%6 = add nsw i32 %5, %1
%7 = icmp sgt i32 %6, 157
%8 = add nsw i32 %6, -158
%9 = or i32 %8, 256
%10 = add nsw i32 %6, -64
%11 = select i1 %7, i32 %9, i32 %10
%12 = shl i32 %0, 9
%13 = add i32 %12, -32768
%14 = select i1 %3, i32 %13, i32 %12
%15 = add i32 %14, -66048
%16 = or i32 %11, %15
%17 = add nsw i32 %16, 8481
ret i32 %17
}