void make_move(char *board, char x1, char y1, char x2, char y2) {
  x1 = x1 - 'a';
  y1 = 7 - (y1 - '1');
  x2 = x2 - 'a';
  y2 = 7 - (y2 - '1');
  char piece = board[y1 * 8 + x1];
  board[y1 * 8 + x1] = ' ';
  board[y2 * 8 + x2] = piece;
}


x86 assembly (clang, -O0):
<make_move>:
push   %rbp
mov    %rsp,%rbp
mov    %r8b,%al
mov    %rdi,-0x8(%rbp)
mov    %sil,-0x9(%rbp)
mov    %dl,-0xa(%rbp)
mov    %cl,-0xb(%rbp)
mov    %al,-0xc(%rbp)
movsbl -0x9(%rbp),%eax
sub    $0x61,%eax
mov    %al,-0x9(%rbp)
movsbl -0xa(%rbp),%ecx
sub    $0x31,%ecx
mov    $0x7,%eax
sub    %ecx,%eax
mov    %al,-0xa(%rbp)
movsbl -0xb(%rbp),%eax
sub    $0x61,%eax
mov    %al,-0xb(%rbp)
movsbl -0xc(%rbp),%ecx
sub    $0x31,%ecx
mov    $0x7,%eax
sub    %ecx,%eax
mov    %al,-0xc(%rbp)
mov    -0x8(%rbp),%rax
movsbl -0xa(%rbp),%ecx
shl    $0x3,%ecx
movsbl -0x9(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0xd(%rbp)
mov    -0x8(%rbp),%rax
movsbl -0xa(%rbp),%ecx
shl    $0x3,%ecx
movsbl -0x9(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
movb   $0x20,(%rax,%rcx,1)
mov    -0xd(%rbp),%dl
mov    -0x8(%rbp),%rax
movsbl -0xc(%rbp),%ecx
shl    $0x3,%ecx
movsbl -0xb(%rbp),%esi
add    %esi,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
pop    %rbp
ret

x86 assembly (clang, -O2):
<make_move>:
add    $0x9f,%sil
mov    $0x38,%r9b
mov    $0x38,%al
sub    %dl,%al
add    $0x9f,%cl
sub    %r8b,%r9b
movsbl %al,%eax
movsbl %sil,%edx
lea    (%rdx,%rax,8),%eax
cltq
mov    (%rdi,%rax,1),%dl
movb   $0x20,(%rdi,%rax,1)
movsbl %r9b,%eax
movsbl %cl,%ecx
lea    (%rcx,%rax,8),%eax
cltq
mov    %dl,(%rdi,%rax,1)
ret

LLVM IR (-O0):
define void @make_move(i8* %0, i8 signext %1, i8 signext %2, i8 signext %3, i8 signext %4) {
%6 = alloca i8*
%7 = alloca i8
%8 = alloca i8
%9 = alloca i8
%10 = alloca i8
%11 = alloca i8
store i8* %0, i8** %6
store i8 %1, i8* %7
store i8 %2, i8* %8
store i8 %3, i8* %9
store i8 %4, i8* %10
%12 = load i8, i8* %7
%13 = sext i8 %12 to i32
%14 = sub nsw i32 %13, 97
%15 = trunc i32 %14 to i8
store i8 %15, i8* %7
%16 = load i8, i8* %8
%17 = sext i8 %16 to i32
%18 = sub nsw i32 %17, 49
%19 = sub nsw i32 7, %18
%20 = trunc i32 %19 to i8
store i8 %20, i8* %8
%21 = load i8, i8* %9
%22 = sext i8 %21 to i32
%23 = sub nsw i32 %22, 97
%24 = trunc i32 %23 to i8
store i8 %24, i8* %9
%25 = load i8, i8* %10
%26 = sext i8 %25 to i32
%27 = sub nsw i32 %26, 49
%28 = sub nsw i32 7, %27
%29 = trunc i32 %28 to i8
store i8 %29, i8* %10
%30 = load i8*, i8** %6
%31 = load i8, i8* %8
%32 = sext i8 %31 to i32
%33 = mul nsw i32 %32, 8
%34 = load i8, i8* %7
%35 = sext i8 %34 to i32
%36 = add nsw i32 %33, %35
%37 = sext i32 %36 to i64
%38 = getelementptr inbounds i8, i8* %30, i64 %37
%39 = load i8, i8* %38
store i8 %39, i8* %11
%40 = load i8*, i8** %6
%41 = load i8, i8* %8
%42 = sext i8 %41 to i32
%43 = mul nsw i32 %42, 8
%44 = load i8, i8* %7
%45 = sext i8 %44 to i32
%46 = add nsw i32 %43, %45
%47 = sext i32 %46 to i64
%48 = getelementptr inbounds i8, i8* %40, i64 %47
store i8 32, i8* %48
%49 = load i8, i8* %11
%50 = load i8*, i8** %6
%51 = load i8, i8* %10
%52 = sext i8 %51 to i32
%53 = mul nsw i32 %52, 8
%54 = load i8, i8* %9
%55 = sext i8 %54 to i32
%56 = add nsw i32 %53, %55
%57 = sext i32 %56 to i64
%58 = getelementptr inbounds i8, i8* %50, i64 %57
store i8 %49, i8* %58
ret void
}

LLVM IR (-O2):
define void @make_move(i8* nocapture %0, i8 signext %1, i8 signext %2, i8 signext %3, i8 signext %4) {
%6 = add i8 %1, -97
%7 = sub i8 56, %2
%8 = add i8 %3, -97
%9 = sub i8 56, %4
%10 = sext i8 %7 to i32
%11 = shl nsw i32 %10, 3
%12 = sext i8 %6 to i32
%13 = add nsw i32 %11, %12
%14 = sext i32 %13 to i64
%15 = getelementptr inbounds i8, i8* %0, i64 %14
%16 = load i8, i8* %15
store i8 32, i8* %15
%17 = sext i8 %9 to i32
%18 = shl nsw i32 %17, 3
%19 = sext i8 %8 to i32
%20 = add nsw i32 %18, %19
%21 = sext i32 %20 to i64
%22 = getelementptr inbounds i8, i8* %0, i64 %21
store i8 %16, i8* %22
ret void
}