void hsv2rgb(unsigned short h, unsigned char _s, unsigned char _v,
             unsigned char *r, unsigned char *g, unsigned char *b) {
  if (_s == 0) {
    *r = _v;
    *g = _v;
    *b = _v;
  } else {
    register unsigned short s = _s, v = _v;
    register unsigned short var_h = ((h * 6) & 0x1FF) >> 1;
    unsigned char var_i = (h * 6) >> 9;
    unsigned char var_1 = (v * (255 - s)) >> 8;
    unsigned char var_2 = (v * (255 - ((s * var_h) >> 8))) >> 8;
    unsigned char var_3 = (v * (255 - ((s * (255 - var_h)) >> 8))) >> 8;
    switch (var_i) {
    case 0:
    case 6: {
      *r = _v;
      *g = var_3;
      *b = var_1;
      break;
    }
    case 1: {
      *r = var_2;
      *g = _v;
      *b = var_1;
      break;
    }
    case 2: {
      *r = var_1;
      *g = _v;
      *b = var_3;
      break;
    }
    case 3: {
      *r = var_1;
      *g = var_2;
      *b = _v;
      break;
    }
    case 4: {
      *r = var_3;
      *g = var_1;
      *b = _v;
      break;
    }
    case 5: {
      *r = _v;
      *g = var_1;
      *b = var_2;
      break;
    }
    }
  }
}


x86 assembly (clang, -O0):
<hsv2rgb>:
push   %rbp
mov    %rsp,%rbp
mov    %dl,%al
mov    %sil,%dl
mov    %di,%si
mov    %si,-0x2(%rbp)
mov    %dl,-0x3(%rbp)
mov    %al,-0x4(%rbp)
mov    %rcx,-0x10(%rbp)
mov    %r8,-0x18(%rbp)
mov    %r9,-0x20(%rbp)
movzbl -0x3(%rbp),%eax
cmp    $0x0,%eax
jne    114f <hsv2rgb+0x4f>
mov    -0x4(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
mov    -0x4(%rbp),%cl
mov    -0x18(%rbp),%rax
mov    %cl,(%rax)
mov    -0x4(%rbp),%cl
mov    -0x20(%rbp),%rax
mov    %cl,(%rax)
jmp    12c3 <hsv2rgb+0x1c3>
movzbl -0x3(%rbp),%eax
mov    %ax,-0x22(%rbp)
movzbl -0x4(%rbp),%eax
mov    %ax,-0x24(%rbp)
movzwl -0x2(%rbp),%ecx
add    %ecx,%ecx
mov    %ecx,%eax
lea    (%rax,%rax,2),%eax
and    $0x1fe,%eax
shr    %eax
mov    %ax,-0x26(%rbp)
movzwl -0x2(%rbp),%ecx
add    %ecx,%ecx
mov    %ecx,%eax
lea    (%rax,%rax,2),%eax
shr    $0x9,%eax
mov    %al,-0x27(%rbp)
movzwl -0x24(%rbp),%eax
movzwl -0x22(%rbp),%esi
mov    $0xff,%ecx
mov    %ecx,%edx
sub    %esi,%edx
imul   %edx,%eax
mov    %ah,%al
mov    %al,-0x28(%rbp)
movzwl -0x24(%rbp),%eax
movzwl -0x22(%rbp),%esi
movzwl -0x26(%rbp),%edx
imul   %edx,%esi
shr    $0x8,%esi
mov    %ecx,%edx
sub    %esi,%edx
imul   %edx,%eax
mov    %ah,%al
mov    %al,-0x29(%rbp)
movzwl -0x24(%rbp),%eax
movzwl -0x22(%rbp),%edx
movzwl -0x26(%rbp),%edi
mov    %ecx,%esi
sub    %edi,%esi
imul   %esi,%edx
shr    $0x8,%edx
sub    %edx,%ecx
imul   %ecx,%eax
mov    %ah,%al
mov    %al,-0x2a(%rbp)
movzbl -0x27(%rbp),%eax
mov    %rax,-0x38(%rbp)
sub    $0x6,%rax
ja     12be <hsv2rgb+0x1be>
mov    -0x38(%rbp),%rax
lea    0xe06(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x4(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
mov    -0x2a(%rbp),%cl
mov    -0x18(%rbp),%rax
mov    %cl,(%rax)
mov    -0x28(%rbp),%cl
mov    -0x20(%rbp),%rax
mov    %cl,(%rax)
jmp    12be <hsv2rgb+0x1be>
mov    -0x29(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
mov    -0x4(%rbp),%cl
mov    -0x18(%rbp),%rax
mov    %cl,(%rax)
mov    -0x28(%rbp),%cl
mov    -0x20(%rbp),%rax
mov    %cl,(%rax)
jmp    12be <hsv2rgb+0x1be>
mov    -0x28(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
mov    -0x4(%rbp),%cl
mov    -0x18(%rbp),%rax
mov    %cl,(%rax)
mov    -0x2a(%rbp),%cl
mov    -0x20(%rbp),%rax
mov    %cl,(%rax)
jmp    12be <hsv2rgb+0x1be>
mov    -0x28(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
mov    -0x29(%rbp),%cl
mov    -0x18(%rbp),%rax
mov    %cl,(%rax)
mov    -0x4(%rbp),%cl
mov    -0x20(%rbp),%rax
mov    %cl,(%rax)
jmp    12be <hsv2rgb+0x1be>
mov    -0x2a(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
mov    -0x28(%rbp),%cl
mov    -0x18(%rbp),%rax
mov    %cl,(%rax)
mov    -0x4(%rbp),%cl
mov    -0x20(%rbp),%rax
mov    %cl,(%rax)
jmp    12be <hsv2rgb+0x1be>
mov    -0x4(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
mov    -0x28(%rbp),%cl
mov    -0x18(%rbp),%rax
mov    %cl,(%rax)
mov    -0x29(%rbp),%cl
mov    -0x20(%rbp),%rax
mov    %cl,(%rax)
jmp    12c3 <hsv2rgb+0x1c3>
pop    %rbp
ret

x86 assembly (clang, -O2):
<hsv2rgb>:
push   %rbx
test   %esi,%esi
je     1182 <hsv2rgb+0x82>
movzwl %di,%eax
add    %eax,%eax
lea    (%rax,%rax,2),%eax
mov    %eax,%r10d
shr    $0x9,%r10d
cmp    $0x6,%r10b
ja     1193 <hsv2rgb+0x93>
shr    %eax
movzbl %al,%eax
movzbl %dl,%r11d
movzbl %sil,%edi
mov    %eax,%esi
imul   %edi,%esi
xor    $0xff,%eax
imul   %edi,%eax
xor    $0xff,%edi
imul   %r11d,%edi
shr    $0x8,%edi
shr    $0x8,%esi
xor    $0xff,%esi
imul   %r11d,%esi
shr    $0x8,%esi
shr    $0x8,%eax
xor    $0xff,%eax
imul   %r11d,%eax
shr    $0x8,%eax
movzbl %r10b,%r10d
lea    0xe95(%rip),%r11
movslq (%r11,%r10,4),%rbx
add    %r11,%rbx
mov    %edx,%r10d
mov    %eax,%r11d
jmp    *%rbx
mov    %esi,%r10d
mov    %edx,%r11d
jmp    118a <hsv2rgb+0x8a>
mov    %edx,%r10d
mov    %edx,%r11d
mov    %edx,%edi
mov    %r10b,(%rcx)
mov    %r11b,(%r8)
mov    %dil,(%r9)
pop    %rbx
ret
mov    %edi,%r10d
mov    %edx,%r11d
mov    %eax,%edi
jmp    118a <hsv2rgb+0x8a>
mov    %eax,%r10d
mov    %edi,%r11d
jmp    1188 <hsv2rgb+0x88>
mov    %edx,%r10d
mov    %edi,%r11d
mov    %esi,%edi
jmp    118a <hsv2rgb+0x8a>
mov    %edi,%r10d
mov    %esi,%r11d
jmp    1188 <hsv2rgb+0x88>

LLVM IR (-O0):
define void @hsv2rgb(i16 zeroext %0, i8 zeroext %1, i8 zeroext %2, i8* %3, i8* %4, i8* %5) {
%7 = alloca i16
%8 = alloca i8
%9 = alloca i8
%10 = alloca i8*
%11 = alloca i8*
%12 = alloca i8*
%13 = alloca i16
%14 = alloca i16
%15 = alloca i16
%16 = alloca i8
%17 = alloca i8
%18 = alloca i8
%19 = alloca i8
store i16 %0, i16* %7
store i8 %1, i8* %8
store i8 %2, i8* %9
store i8* %3, i8** %10
store i8* %4, i8** %11
store i8* %5, i8** %12
%20 = load i8, i8* %8
%21 = zext i8 %20 to i32
%22 = icmp eq i32 %21, 0
br i1 %22, label %23, label %30
23: ; preds = %6
%24 = load i8, i8* %9
%25 = load i8*, i8** %10
store i8 %24, i8* %25
%26 = load i8, i8* %9
%27 = load i8*, i8** %11
store i8 %26, i8* %27
%28 = load i8, i8* %9
%29 = load i8*, i8** %12
store i8 %28, i8* %29
br label %124
30: ; preds = %6
%31 = load i8, i8* %8
%32 = zext i8 %31 to i16
store i16 %32, i16* %13
%33 = load i8, i8* %9
%34 = zext i8 %33 to i16
store i16 %34, i16* %14
%35 = load i16, i16* %7
%36 = zext i16 %35 to i32
%37 = mul nsw i32 %36, 6
%38 = and i32 %37, 511
%39 = ashr i32 %38, 1
%40 = trunc i32 %39 to i16
store i16 %40, i16* %15
%41 = load i16, i16* %7
%42 = zext i16 %41 to i32
%43 = mul nsw i32 %42, 6
%44 = ashr i32 %43, 9
%45 = trunc i32 %44 to i8
store i8 %45, i8* %16
%46 = load i16, i16* %14
%47 = zext i16 %46 to i32
%48 = load i16, i16* %13
%49 = zext i16 %48 to i32
%50 = sub nsw i32 255, %49
%51 = mul nsw i32 %47, %50
%52 = ashr i32 %51, 8
%53 = trunc i32 %52 to i8
store i8 %53, i8* %17
%54 = load i16, i16* %14
%55 = zext i16 %54 to i32
%56 = load i16, i16* %13
%57 = zext i16 %56 to i32
%58 = load i16, i16* %15
%59 = zext i16 %58 to i32
%60 = mul nsw i32 %57, %59
%61 = ashr i32 %60, 8
%62 = sub nsw i32 255, %61
%63 = mul nsw i32 %55, %62
%64 = ashr i32 %63, 8
%65 = trunc i32 %64 to i8
store i8 %65, i8* %18
%66 = load i16, i16* %14
%67 = zext i16 %66 to i32
%68 = load i16, i16* %13
%69 = zext i16 %68 to i32
%70 = load i16, i16* %15
%71 = zext i16 %70 to i32
%72 = sub nsw i32 255, %71
%73 = mul nsw i32 %69, %72
%74 = ashr i32 %73, 8
%75 = sub nsw i32 255, %74
%76 = mul nsw i32 %67, %75
%77 = ashr i32 %76, 8
%78 = trunc i32 %77 to i8
store i8 %78, i8* %19
%79 = load i8, i8* %16
%80 = zext i8 %79 to i32
switch i32 %80, label %123 [
i32 0, label %81
i32 6, label %81
i32 1, label %88
i32 2, label %95
i32 3, label %102
i32 4, label %109
i32 5, label %116
]
81: ; preds = %30, %30
%82 = load i8, i8* %9
%83 = load i8*, i8** %10
store i8 %82, i8* %83
%84 = load i8, i8* %19
%85 = load i8*, i8** %11
store i8 %84, i8* %85
%86 = load i8, i8* %17
%87 = load i8*, i8** %12
store i8 %86, i8* %87
br label %123
88: ; preds = %30
%89 = load i8, i8* %18
%90 = load i8*, i8** %10
store i8 %89, i8* %90
%91 = load i8, i8* %9
%92 = load i8*, i8** %11
store i8 %91, i8* %92
%93 = load i8, i8* %17
%94 = load i8*, i8** %12
store i8 %93, i8* %94
br label %123
95: ; preds = %30
%96 = load i8, i8* %17
%97 = load i8*, i8** %10
store i8 %96, i8* %97
%98 = load i8, i8* %9
%99 = load i8*, i8** %11
store i8 %98, i8* %99
%100 = load i8, i8* %19
%101 = load i8*, i8** %12
store i8 %100, i8* %101
br label %123
102: ; preds = %30
%103 = load i8, i8* %17
%104 = load i8*, i8** %10
store i8 %103, i8* %104
%105 = load i8, i8* %18
%106 = load i8*, i8** %11
store i8 %105, i8* %106
%107 = load i8, i8* %9
%108 = load i8*, i8** %12
store i8 %107, i8* %108
br label %123
109: ; preds = %30
%110 = load i8, i8* %19
%111 = load i8*, i8** %10
store i8 %110, i8* %111
%112 = load i8, i8* %17
%113 = load i8*, i8** %11
store i8 %112, i8* %113
%114 = load i8, i8* %9
%115 = load i8*, i8** %12
store i8 %114, i8* %115
br label %123
116: ; preds = %30
%117 = load i8, i8* %9
%118 = load i8*, i8** %10
store i8 %117, i8* %118
%119 = load i8, i8* %17
%120 = load i8*, i8** %11
store i8 %119, i8* %120
%121 = load i8, i8* %18
%122 = load i8*, i8** %12
store i8 %121, i8* %122
br label %123
123: ; preds = %30, %116, %109, %102, %95, %88, %81
br label %124
124: ; preds = %123, %23
ret void
}

LLVM IR (-O2):
define void @hsv2rgb(i16 zeroext %0, i8 zeroext %1, i8 zeroext %2, i8* nocapture writeonly %3, i8* nocapture writeonly %4, i8* nocapture writeonly %5) {
%7 = icmp eq i8 %1, 0
br i1 %7, label %39, label %8
8: ; preds = %6
%9 = zext i16 %0 to i32
%10 = mul nuw nsw i32 %9, 6
%11 = lshr exact i32 %10, 1
%12 = and i32 %11, 255
%13 = lshr i32 %10, 9
%14 = zext i8 %2 to i32
%15 = zext i8 %1 to i32
%16 = xor i32 %15, 255
%17 = mul nuw nsw i32 %16, %14
%18 = lshr i32 %17, 8
%19 = trunc i32 %18 to i8
%20 = mul nuw nsw i32 %12, %15
%21 = lshr i32 %20, 8
%22 = xor i32 %21, 255
%23 = mul nuw nsw i32 %22, %14
%24 = lshr i32 %23, 8
%25 = trunc i32 %24 to i8
%26 = xor i32 %12, 255
%27 = mul nuw nsw i32 %26, %15
%28 = lshr i32 %27, 8
%29 = xor i32 %28, 255
%30 = mul nuw nsw i32 %29, %14
%31 = lshr i32 %30, 8
%32 = trunc i32 %31 to i8
%33 = trunc i32 %13 to i8
switch i8 %33, label %43 [
i8 0, label %39
i8 6, label %39
i8 1, label %34
i8 2, label %35
i8 3, label %36
i8 4, label %37
i8 5, label %38
]
34: ; preds = %8
br label %39
35: ; preds = %8
br label %39
36: ; preds = %8
br label %39
37: ; preds = %8
br label %39
38: ; preds = %8
br label %39
39: ; preds = %8, %8, %6, %38, %37, %36, %35, %34
%40 = phi i8 [ %25, %34 ], [ %19, %35 ], [ %19, %36 ], [ %32, %37 ], [ %2, %38 ], [ %2, %6 ], [ %2, %8 ], [ %2, %8 ]
%41 = phi i8 [ %2, %34 ], [ %2, %35 ], [ %25, %36 ], [ %19, %37 ], [ %19, %38 ], [ %2, %6 ], [ %32, %8 ], [ %32, %8 ]
%42 = phi i8 [ %19, %34 ], [ %32, %35 ], [ %2, %36 ], [ %2, %37 ], [ %25, %38 ], [ %2, %6 ], [ %19, %8 ], [ %19, %8 ]
store i8 %40, i8* %3
store i8 %41, i8* %4
store i8 %42, i8* %5
br label %43
43: ; preds = %39, %8
ret void
}