unsigned short ujis2sjis(unsigned char ku, unsigned char ten) {
  unsigned char s1, s2;
  s1 = (ku - 1) / 2 + 129;
  if (ku >= 63)
    s1 += 193 - 129;
  if (!(ku & 1))
    s2 = ten + 158;
  else if (ten <= 63)
    s2 = ten + 63;
  else
    s2 = ten + 64;
  return s1 * 256 + s2;
}


x86 assembly (clang, -O0):
<ujis2sjis>:
push   %rbp
mov    %rsp,%rbp
mov    %sil,%al
mov    %dil,%cl
mov    %cl,-0x1(%rbp)
mov    %al,-0x2(%rbp)
movzbl -0x1(%rbp),%eax
sub    $0x1,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
add    $0x81,%eax
mov    %al,-0x3(%rbp)
movzbl -0x1(%rbp),%eax
cmp    $0x3f,%eax
jl     113e <ujis2sjis+0x3e>
movzbl -0x3(%rbp),%eax
add    $0x40,%eax
mov    %al,-0x3(%rbp)
movzbl -0x1(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
jne    115f <ujis2sjis+0x5f>
movzbl -0x2(%rbp),%eax
add    $0x9e,%eax
mov    %al,-0x4(%rbp)
jmp    118a <ujis2sjis+0x8a>
movzbl -0x2(%rbp),%eax
cmp    $0x3f,%eax
jg     117b <ujis2sjis+0x7b>
movzbl -0x2(%rbp),%eax
add    $0x3f,%eax
mov    %al,-0x4(%rbp)
jmp    1185 <ujis2sjis+0x85>
movzbl -0x2(%rbp),%eax
add    $0x40,%eax
mov    %al,-0x4(%rbp)
jmp    118a <ujis2sjis+0x8a>
movzbl -0x3(%rbp),%eax
shl    $0x8,%eax
movzbl -0x4(%rbp),%ecx
add    %ecx,%eax
movzwl %ax,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<ujis2sjis>:
cmp    $0x40,%sil
mov    $0x40,%al
sbb    $0x0,%al
test   $0x1,%dil
movzbl %al,%eax
mov    $0x9e,%ecx
cmovne %eax,%ecx
add    %sil,%cl
xor    %eax,%eax
cmp    $0x3f,%dil
setae  %al
add    $0xffffffff,%edi
movzwl %di,%edx
mov    %edx,%esi
shr    $0xf,%esi
add    %edx,%esi
movzwl %si,%edx
shr    %edx
shl    $0x6,%eax
add    %edx,%eax
shl    $0x8,%eax
movzbl %cl,%ecx
add    %ecx,%eax
add    $0xffff8100,%eax
ret

LLVM IR (-O0):
define zeroext i16 @ujis2sjis(i8 zeroext %0, i8 zeroext %1) {
%3 = alloca i8
%4 = alloca i8
%5 = alloca i8
%6 = alloca i8
store i8 %0, i8* %3
store i8 %1, i8* %4
%7 = load i8, i8* %3
%8 = zext i8 %7 to i32
%9 = sub nsw i32 %8, 1
%10 = sdiv i32 %9, 2
%11 = add nsw i32 %10, 129
%12 = trunc i32 %11 to i8
store i8 %12, i8* %5
%13 = load i8, i8* %3
%14 = zext i8 %13 to i32
%15 = icmp sge i32 %14, 63
br i1 %15, label %16, label %21
16: ; preds = %2
%17 = load i8, i8* %5
%18 = zext i8 %17 to i32
%19 = add nsw i32 %18, 64
%20 = trunc i32 %19 to i8
store i8 %20, i8* %5
br label %21
21: ; preds = %16, %2
%22 = load i8, i8* %3
%23 = zext i8 %22 to i32
%24 = and i32 %23, 1
%25 = icmp ne i32 %24, 0
br i1 %25, label %31, label %26
26: ; preds = %21
%27 = load i8, i8* %4
%28 = zext i8 %27 to i32
%29 = add nsw i32 %28, 158
%30 = trunc i32 %29 to i8
store i8 %30, i8* %6
br label %46
31: ; preds = %21
%32 = load i8, i8* %4
%33 = zext i8 %32 to i32
%34 = icmp sle i32 %33, 63
br i1 %34, label %35, label %40
35: ; preds = %31
%36 = load i8, i8* %4
%37 = zext i8 %36 to i32
%38 = add nsw i32 %37, 63
%39 = trunc i32 %38 to i8
store i8 %39, i8* %6
br label %45
40: ; preds = %31
%41 = load i8, i8* %4
%42 = zext i8 %41 to i32
%43 = add nsw i32 %42, 64
%44 = trunc i32 %43 to i8
store i8 %44, i8* %6
br label %45
45: ; preds = %40, %35
br label %46
46: ; preds = %45, %26
%47 = load i8, i8* %5
%48 = zext i8 %47 to i32
%49 = mul nsw i32 %48, 256
%50 = load i8, i8* %6
%51 = zext i8 %50 to i32
%52 = add nsw i32 %49, %51
%53 = trunc i32 %52 to i16
ret i16 %53
}

LLVM IR (-O2):
define zeroext i16 @ujis2sjis(i8 zeroext %0, i8 zeroext %1) {
%3 = and i8 %0, 1
%4 = icmp eq i8 %3, 0
%5 = icmp ult i8 %1, 64
%6 = select i1 %5, i8 63, i8 64
%7 = select i1 %4, i8 -98, i8 %6
%8 = add i8 %7, %1
%9 = icmp ugt i8 %0, 62
%10 = zext i8 %0 to i16
%11 = add nsw i16 %10, -1
%12 = sdiv i16 %11, 2
%13 = select i1 %9, i16 193, i16 129
%14 = add nuw nsw i16 %12, %13
%15 = shl i16 %14, 8
%16 = zext i8 %8 to i16
%17 = or i16 %15, %16
ret i16 %17
}