unsigned char gf_alog(unsigned char x) {
  unsigned char atb = 1, z;
  while (x--) {
    z = atb;
    atb <<= 1;
    if (z & 0x80)
      atb ^= 0x1b;
    atb ^= z;
  }
  return atb;
}


x86 assembly (clang, -O0):
<gf_alog>:
push   %rbp
mov    %rsp,%rbp
mov    %dil,%al
mov    %al,-0x1(%rbp)
movb   $0x1,-0x2(%rbp)
mov    -0x1(%rbp),%al
mov    %al,%cl
add    $0xff,%cl
mov    %cl,-0x1(%rbp)
cmp    $0x0,%al
je     115f <gf_alog+0x5f>
mov    -0x2(%rbp),%al
mov    %al,-0x3(%rbp)
movzbl -0x2(%rbp),%eax
shl    $0x1,%eax
mov    %al,-0x2(%rbp)
movzbl -0x3(%rbp),%eax
and    $0x80,%eax
cmp    $0x0,%eax
je     114d <gf_alog+0x4d>
movzbl -0x2(%rbp),%eax
xor    $0x1b,%eax
mov    %al,-0x2(%rbp)
movzbl -0x3(%rbp),%ecx
movzbl -0x2(%rbp),%eax
xor    %ecx,%eax
mov    %al,-0x2(%rbp)
jmp    110e <gf_alog+0xe>
movzbl -0x2(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<gf_alog>:
test   %edi,%edi
je     1114 <gf_alog+0x14>
lea    -0x1(%rdi),%eax
mov    %edi,%ecx
and    $0x3,%cl
cmp    $0x3,%al
jae    1117 <gf_alog+0x17>
mov    $0x1,%dl
jmp    1170 <gf_alog+0x70>
mov    $0x1,%al
ret
and    $0xfc,%dil
mov    $0x1,%dl
nopl   (%rax)
lea    (%rdx,%rdx,1),%eax
movzbl %al,%esi
xor    $0x1b,%al
test   %dl,%dl
movzbl %al,%eax
cmovns %esi,%eax
xor    %dl,%al
lea    (%rax,%rax,1),%edx
movzbl %dl,%esi
xor    $0x1b,%dl
test   %al,%al
movzbl %dl,%edx
cmovns %esi,%edx
xor    %al,%dl
lea    (%rdx,%rdx,1),%eax
movzbl %al,%esi
xor    $0x1b,%al
test   %dl,%dl
movzbl %al,%eax
cmovns %esi,%eax
xor    %dl,%al
lea    (%rax,%rax,1),%edx
movzbl %dl,%esi
xor    $0x1b,%dl
test   %al,%al
movzbl %dl,%edx
cmovns %esi,%edx
xor    %al,%dl
add    $0xfc,%dil
jne    1120 <gf_alog+0x20>
mov    %edx,%eax
test   %cl,%cl
je     1199 <gf_alog+0x99>
cs nopw 0x0(%rax,%rax,1)
lea    (%rdx,%rdx,1),%eax
movzbl %al,%esi
xor    $0x1b,%al
test   %dl,%dl
movzbl %al,%eax
cmovns %esi,%eax
xor    %dl,%al
mov    %eax,%edx
add    $0xff,%cl
jne    1180 <gf_alog+0x80>
ret

LLVM IR (-O0):
define zeroext i8 @gf_alog(i8 zeroext %0) {
%2 = alloca i8
%3 = alloca i8
%4 = alloca i8
store i8 %0, i8* %2
store i8 1, i8* %3
br label %5
5: ; preds = %24, %1
%6 = load i8, i8* %2
%7 = add i8 %6, -1
store i8 %7, i8* %2
%8 = icmp ne i8 %6, 0
br i1 %8, label %9, label %31
9: ; preds = %5
%10 = load i8, i8* %3
store i8 %10, i8* %4
%11 = load i8, i8* %3
%12 = zext i8 %11 to i32
%13 = shl i32 %12, 1
%14 = trunc i32 %13 to i8
store i8 %14, i8* %3
%15 = load i8, i8* %4
%16 = zext i8 %15 to i32
%17 = and i32 %16, 128
%18 = icmp ne i32 %17, 0
br i1 %18, label %19, label %24
19: ; preds = %9
%20 = load i8, i8* %3
%21 = zext i8 %20 to i32
%22 = xor i32 %21, 27
%23 = trunc i32 %22 to i8
store i8 %23, i8* %3
br label %24
24: ; preds = %19, %9
%25 = load i8, i8* %4
%26 = zext i8 %25 to i32
%27 = load i8, i8* %3
%28 = zext i8 %27 to i32
%29 = xor i32 %28, %26
%30 = trunc i32 %29 to i8
store i8 %30, i8* %3
br label %5
31: ; preds = %5
%32 = load i8, i8* %3
ret i8 %32
}

LLVM IR (-O2):
define zeroext i8 @gf_alog(i8 zeroext %0) {
%2 = icmp eq i8 %0, 0
br i1 %2, label %48, label %3
3: ; preds = %1
%4 = add i8 %0, -1
%5 = and i8 %0, 3
%6 = icmp ult i8 %4, 3
br i1 %6, label %34, label %7
7: ; preds = %3
%8 = and i8 %0, -4
br label %9
9: ; preds = %9, %7
%10 = phi i8 [ 1, %7 ], [ %31, %9 ]
%11 = phi i8 [ 0, %7 ], [ %32, %9 ]
%12 = shl i8 %10, 1
%13 = icmp sgt i8 %10, -1
%14 = xor i8 %12, 27
%15 = select i1 %13, i8 %12, i8 %14
%16 = xor i8 %15, %10
%17 = shl i8 %16, 1
%18 = icmp sgt i8 %16, -1
%19 = xor i8 %17, 27
%20 = select i1 %18, i8 %17, i8 %19
%21 = xor i8 %20, %16
%22 = shl i8 %21, 1
%23 = icmp sgt i8 %21, -1
%24 = xor i8 %22, 27
%25 = select i1 %23, i8 %22, i8 %24
%26 = xor i8 %25, %21
%27 = shl i8 %26, 1
%28 = icmp sgt i8 %26, -1
%29 = xor i8 %27, 27
%30 = select i1 %28, i8 %27, i8 %29
%31 = xor i8 %30, %26
%32 = add i8 %11, 4
%33 = icmp eq i8 %32, %8
br i1 %33, label %34, label %9
34: ; preds = %9, %3
%35 = phi i8 [ undef, %3 ], [ %31, %9 ]
%36 = phi i8 [ 1, %3 ], [ %31, %9 ]
%37 = icmp eq i8 %5, 0
br i1 %37, label %48, label %38
38: ; preds = %34, %38
%39 = phi i8 [ %45, %38 ], [ %36, %34 ]
%40 = phi i8 [ %46, %38 ], [ 0, %34 ]
%41 = shl i8 %39, 1
%42 = icmp sgt i8 %39, -1
%43 = xor i8 %41, 27
%44 = select i1 %42, i8 %41, i8 %43
%45 = xor i8 %44, %39
%46 = add i8 %40, 1
%47 = icmp eq i8 %46, %5
br i1 %47, label %48, label %38
48: ; preds = %34, %38, %1
%49 = phi i8 [ 1, %1 ], [ %35, %34 ], [ %45, %38 ]
ret i8 %49
}