short int ls_2(short int seila) {
  short int c = 0;
  c = (seila << 2) & 0x0200;
  c |= (seila << 2) & 0x0100;
  c |= (seila << 2) & 0x0080;
  c |= (seila >> 3) & 0x0040;
  c |= (seila >> 3) & 0x0020;
  c |= (seila << 2) & 0x0010;
  c |= (seila << 2) & 0x0008;
  c |= (seila << 2) & 0x0004;
  c |= (seila >> 3) & 0x0002;
  c |= (seila >> 3) & 0x0001;
  return c;
}


x86 assembly (clang, -O0):
<ls_2>:
push   %rbp
mov    %rsp,%rbp
mov    %di,%ax
mov    %ax,-0x2(%rbp)
movw   $0x0,-0x4(%rbp)
movswl -0x2(%rbp),%eax
shl    $0x2,%eax
and    $0x200,%eax
mov    %ax,-0x4(%rbp)
movswl -0x2(%rbp),%ecx
shl    $0x2,%ecx
and    $0x100,%ecx
movswl -0x4(%rbp),%eax
or     %ecx,%eax
mov    %ax,-0x4(%rbp)
movswl -0x2(%rbp),%ecx
shl    $0x2,%ecx
and    $0x80,%ecx
movswl -0x4(%rbp),%eax
or     %ecx,%eax
mov    %ax,-0x4(%rbp)
movswl -0x2(%rbp),%ecx
sar    $0x3,%ecx
and    $0x40,%ecx
movswl -0x4(%rbp),%eax
or     %ecx,%eax
mov    %ax,-0x4(%rbp)
movswl -0x2(%rbp),%ecx
sar    $0x3,%ecx
and    $0x20,%ecx
movswl -0x4(%rbp),%eax
or     %ecx,%eax
mov    %ax,-0x4(%rbp)
movswl -0x2(%rbp),%ecx
shl    $0x2,%ecx
and    $0x10,%ecx
movswl -0x4(%rbp),%eax
or     %ecx,%eax
mov    %ax,-0x4(%rbp)
movswl -0x2(%rbp),%ecx
shl    $0x2,%ecx
and    $0x8,%ecx
movswl -0x4(%rbp),%eax
or     %ecx,%eax
mov    %ax,-0x4(%rbp)
movswl -0x2(%rbp),%ecx
shl    $0x2,%ecx
and    $0x4,%ecx
movswl -0x4(%rbp),%eax
or     %ecx,%eax
mov    %ax,-0x4(%rbp)
movswl -0x2(%rbp),%ecx
sar    $0x3,%ecx
and    $0x2,%ecx
movswl -0x4(%rbp),%eax
or     %ecx,%eax
mov    %ax,-0x4(%rbp)
movswl -0x2(%rbp),%ecx
sar    $0x3,%ecx
and    $0x1,%ecx
movswl -0x4(%rbp),%eax
or     %ecx,%eax
mov    %ax,-0x4(%rbp)
movswl -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<ls_2>:
lea    0x0(,%rdi,4),%ecx
mov    %ecx,%eax
and    $0x380,%eax
sar    $0x3,%edi
mov    %edi,%edx
and    $0x40,%edx
or     %eax,%edx
mov    %edi,%eax
and    $0x20,%eax
or     %edx,%eax
mov    %ecx,%edx
and    $0x10,%edx
or     %eax,%edx
mov    %ecx,%eax
and    $0x8,%eax
or     %edx,%eax
and    $0x4,%ecx
or     %eax,%ecx
mov    %edi,%eax
and    $0x2,%eax
or     %ecx,%eax
and    $0x1,%edi
or     %edi,%eax
ret

LLVM IR (-O0):
define signext i16 @ls_2(i16 signext %0) {
%2 = alloca i16
%3 = alloca i16
store i16 %0, i16* %2
store i16 0, i16* %3
%4 = load i16, i16* %2
%5 = sext i16 %4 to i32
%6 = shl i32 %5, 2
%7 = and i32 %6, 512
%8 = trunc i32 %7 to i16
store i16 %8, i16* %3
%9 = load i16, i16* %2
%10 = sext i16 %9 to i32
%11 = shl i32 %10, 2
%12 = and i32 %11, 256
%13 = load i16, i16* %3
%14 = sext i16 %13 to i32
%15 = or i32 %14, %12
%16 = trunc i32 %15 to i16
store i16 %16, i16* %3
%17 = load i16, i16* %2
%18 = sext i16 %17 to i32
%19 = shl i32 %18, 2
%20 = and i32 %19, 128
%21 = load i16, i16* %3
%22 = sext i16 %21 to i32
%23 = or i32 %22, %20
%24 = trunc i32 %23 to i16
store i16 %24, i16* %3
%25 = load i16, i16* %2
%26 = sext i16 %25 to i32
%27 = ashr i32 %26, 3
%28 = and i32 %27, 64
%29 = load i16, i16* %3
%30 = sext i16 %29 to i32
%31 = or i32 %30, %28
%32 = trunc i32 %31 to i16
store i16 %32, i16* %3
%33 = load i16, i16* %2
%34 = sext i16 %33 to i32
%35 = ashr i32 %34, 3
%36 = and i32 %35, 32
%37 = load i16, i16* %3
%38 = sext i16 %37 to i32
%39 = or i32 %38, %36
%40 = trunc i32 %39 to i16
store i16 %40, i16* %3
%41 = load i16, i16* %2
%42 = sext i16 %41 to i32
%43 = shl i32 %42, 2
%44 = and i32 %43, 16
%45 = load i16, i16* %3
%46 = sext i16 %45 to i32
%47 = or i32 %46, %44
%48 = trunc i32 %47 to i16
store i16 %48, i16* %3
%49 = load i16, i16* %2
%50 = sext i16 %49 to i32
%51 = shl i32 %50, 2
%52 = and i32 %51, 8
%53 = load i16, i16* %3
%54 = sext i16 %53 to i32
%55 = or i32 %54, %52
%56 = trunc i32 %55 to i16
store i16 %56, i16* %3
%57 = load i16, i16* %2
%58 = sext i16 %57 to i32
%59 = shl i32 %58, 2
%60 = and i32 %59, 4
%61 = load i16, i16* %3
%62 = sext i16 %61 to i32
%63 = or i32 %62, %60
%64 = trunc i32 %63 to i16
store i16 %64, i16* %3
%65 = load i16, i16* %2
%66 = sext i16 %65 to i32
%67 = ashr i32 %66, 3
%68 = and i32 %67, 2
%69 = load i16, i16* %3
%70 = sext i16 %69 to i32
%71 = or i32 %70, %68
%72 = trunc i32 %71 to i16
store i16 %72, i16* %3
%73 = load i16, i16* %2
%74 = sext i16 %73 to i32
%75 = ashr i32 %74, 3
%76 = and i32 %75, 1
%77 = load i16, i16* %3
%78 = sext i16 %77 to i32
%79 = or i32 %78, %76
%80 = trunc i32 %79 to i16
store i16 %80, i16* %3
%81 = load i16, i16* %3
ret i16 %81
}

LLVM IR (-O2):
define signext i16 @ls_2(i16 signext %0) {
%2 = sext i16 %0 to i32
%3 = shl nsw i32 %2, 2
%4 = and i32 %3, 896
%5 = ashr i32 %2, 3
%6 = and i32 %5, 64
%7 = or i32 %4, %6
%8 = and i32 %5, 32
%9 = or i32 %7, %8
%10 = and i32 %3, 16
%11 = or i32 %9, %10
%12 = and i32 %3, 8
%13 = or i32 %11, %12
%14 = and i32 %3, 4
%15 = or i32 %13, %14
%16 = and i32 %5, 2
%17 = and i32 %5, 1
%18 = or i32 %15, %16
%19 = or i32 %18, %17
%20 = trunc i32 %19 to i16
ret i16 %20
}