int GetRightPos(int width, int height, int x, int y) {
  if (x >= 0 && x < width && y >= 0 && y < height)
    return y * width + x;
  else if (x >= 0 && x < width && y < 0)
    return (height + y) * width + x;
  else if (x >= 0 && x < width && y >= height)
    return (y - height) * width + x;
  else if (x < 0 && y < 0)
    return (height + y) * width + x + width;
  else if (x < 0 && y >= 0 && y < height)
    return y * width + x + width;
  else if (x < 0 && y >= height)
    return (y - height) * width + x + width;
  else if (x >= width && y < 0)
    return (height + y) * width + x - width;
  else if (x >= width && y >= 0 && y < height)
    return y * width + x - width;
  else
    return (y - height) * width + x - width;
}


x86 assembly (clang, -O0):
<GetRightPos>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
cmpl   $0x0,-0x10(%rbp)
jl     114e <GetRightPos+0x4e>
mov    -0x10(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    114e <GetRightPos+0x4e>
cmpl   $0x0,-0x14(%rbp)
jl     114e <GetRightPos+0x4e>
mov    -0x14(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    114e <GetRightPos+0x4e>
mov    -0x14(%rbp),%eax
imul   -0x8(%rbp),%eax
add    -0x10(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    12c1 <GetRightPos+0x1c1>
cmpl   $0x0,-0x10(%rbp)
jl     1183 <GetRightPos+0x83>
mov    -0x10(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    1183 <GetRightPos+0x83>
cmpl   $0x0,-0x14(%rbp)
jge    1183 <GetRightPos+0x83>
mov    -0xc(%rbp),%eax
add    -0x14(%rbp),%eax
imul   -0x8(%rbp),%eax
add    -0x10(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    12c1 <GetRightPos+0x1c1>
cmpl   $0x0,-0x10(%rbp)
jl     11ba <GetRightPos+0xba>
mov    -0x10(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    11ba <GetRightPos+0xba>
mov    -0x14(%rbp),%eax
cmp    -0xc(%rbp),%eax
jl     11ba <GetRightPos+0xba>
mov    -0x14(%rbp),%eax
sub    -0xc(%rbp),%eax
imul   -0x8(%rbp),%eax
add    -0x10(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    12c1 <GetRightPos+0x1c1>
cmpl   $0x0,-0x10(%rbp)
jge    11e6 <GetRightPos+0xe6>
cmpl   $0x0,-0x14(%rbp)
jge    11e6 <GetRightPos+0xe6>
mov    -0xc(%rbp),%eax
add    -0x14(%rbp),%eax
imul   -0x8(%rbp),%eax
add    -0x10(%rbp),%eax
add    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    12c1 <GetRightPos+0x1c1>
cmpl   $0x0,-0x10(%rbp)
jge    121b <GetRightPos+0x11b>
cmpl   $0x0,-0x14(%rbp)
jl     121b <GetRightPos+0x11b>
mov    -0x14(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    121b <GetRightPos+0x11b>
mov    -0x14(%rbp),%eax
imul   -0x8(%rbp),%eax
add    -0x10(%rbp),%eax
add    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    12c1 <GetRightPos+0x1c1>
cmpl   $0x0,-0x10(%rbp)
jge    1249 <GetRightPos+0x149>
mov    -0x14(%rbp),%eax
cmp    -0xc(%rbp),%eax
jl     1249 <GetRightPos+0x149>
mov    -0x14(%rbp),%eax
sub    -0xc(%rbp),%eax
imul   -0x8(%rbp),%eax
add    -0x10(%rbp),%eax
add    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    12c1 <GetRightPos+0x1c1>
mov    -0x10(%rbp),%eax
cmp    -0x8(%rbp),%eax
jl     1277 <GetRightPos+0x177>
cmpl   $0x0,-0x14(%rbp)
jge    1277 <GetRightPos+0x177>
mov    -0xc(%rbp),%eax
add    -0x14(%rbp),%eax
imul   -0x8(%rbp),%eax
add    -0x10(%rbp),%eax
sub    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    12c1 <GetRightPos+0x1c1>
mov    -0x10(%rbp),%eax
cmp    -0x8(%rbp),%eax
jl     12ae <GetRightPos+0x1ae>
cmpl   $0x0,-0x14(%rbp)
jl     12ae <GetRightPos+0x1ae>
mov    -0x14(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    12ae <GetRightPos+0x1ae>
mov    -0x14(%rbp),%eax
imul   -0x8(%rbp),%eax
add    -0x10(%rbp),%eax
sub    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    12c1 <GetRightPos+0x1c1>
mov    -0x14(%rbp),%eax
sub    -0xc(%rbp),%eax
imul   -0x8(%rbp),%eax
add    -0x10(%rbp),%eax
sub    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<GetRightPos>:
test   %edx,%edx
js     1132 <GetRightPos+0x32>
cmp    %esi,%ecx
jge    1110 <GetRightPos+0x10>
cmp    %edi,%edx
jge    1110 <GetRightPos+0x10>
test   %ecx,%ecx
jns    111a <GetRightPos+0x1a>
cmp    %edi,%edx
jge    1122 <GetRightPos+0x22>
test   %ecx,%ecx
jns    1122 <GetRightPos+0x22>
add    %esi,%ecx
imul   %edi,%ecx
add    %edx,%ecx
mov    %ecx,%eax
ret
mov    %ecx,%eax
sub    %esi,%eax
jl     1132 <GetRightPos+0x32>
cmp    %edi,%edx
jge    1132 <GetRightPos+0x32>
imul   %edi,%eax
add    %edx,%eax
ret
test   %edx,%ecx
js     1156 <GetRightPos+0x56>
cmp    %esi,%ecx
jge    1142 <GetRightPos+0x42>
test   %edx,%edx
jns    1142 <GetRightPos+0x42>
test   %ecx,%ecx
jns    1158 <GetRightPos+0x58>
mov    %ecx,%eax
sub    %esi,%eax
jl     1162 <GetRightPos+0x62>
test   %edx,%edx
jns    1162 <GetRightPos+0x62>
imul   %edi,%eax
add    %edi,%edx
add    %eax,%edx
mov    %edx,%eax
ret
add    %esi,%ecx
imul   %edi,%ecx
add    %edi,%edx
add    %ecx,%edx
mov    %edx,%eax
ret
mov    %edx,%eax
sub    %edi,%eax
jl     1174 <GetRightPos+0x74>
test   %ecx,%ecx
jns    1174 <GetRightPos+0x74>
add    %esi,%ecx
imul   %edi,%ecx
add    %ecx,%eax
ret
mov    %ecx,%r8d
sub    %esi,%r8d
jge    1189 <GetRightPos+0x89>
sub    %edi,%edx
jl     1189 <GetRightPos+0x89>
test   %ecx,%ecx
js     1189 <GetRightPos+0x89>
imul   %edi,%ecx
jmp    115d <GetRightPos+0x5d>
imul   %edi,%r8d
add    %r8d,%eax
ret

LLVM IR (-O0):
define i32 @GetRightPos(i32 %0, i32 %1, i32 %2, i32 %3) {
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
store i32 %0, i32* %6
store i32 %1, i32* %7
store i32 %2, i32* %8
store i32 %3, i32* %9
%10 = load i32, i32* %8
%11 = icmp sge i32 %10, 0
br i1 %11, label %12, label %29
12: ; preds = %4
%13 = load i32, i32* %8
%14 = load i32, i32* %6
%15 = icmp slt i32 %13, %14
br i1 %15, label %16, label %29
16: ; preds = %12
%17 = load i32, i32* %9
%18 = icmp sge i32 %17, 0
br i1 %18, label %19, label %29
19: ; preds = %16
%20 = load i32, i32* %9
%21 = load i32, i32* %7
%22 = icmp slt i32 %20, %21
br i1 %22, label %23, label %29
23: ; preds = %19
%24 = load i32, i32* %9
%25 = load i32, i32* %6
%26 = mul nsw i32 %24, %25
%27 = load i32, i32* %8
%28 = add nsw i32 %26, %27
store i32 %28, i32* %5
br label %163
29: ; preds = %19, %16, %12, %4
%30 = load i32, i32* %8
%31 = icmp sge i32 %30, 0
br i1 %31, label %32, label %47
32: ; preds = %29
%33 = load i32, i32* %8
%34 = load i32, i32* %6
%35 = icmp slt i32 %33, %34
br i1 %35, label %36, label %47
36: ; preds = %32
%37 = load i32, i32* %9
%38 = icmp slt i32 %37, 0
br i1 %38, label %39, label %47
39: ; preds = %36
%40 = load i32, i32* %7
%41 = load i32, i32* %9
%42 = add nsw i32 %40, %41
%43 = load i32, i32* %6
%44 = mul nsw i32 %42, %43
%45 = load i32, i32* %8
%46 = add nsw i32 %44, %45
store i32 %46, i32* %5
br label %163
47: ; preds = %36, %32, %29
%48 = load i32, i32* %8
%49 = icmp sge i32 %48, 0
br i1 %49, label %50, label %66
50: ; preds = %47
%51 = load i32, i32* %8
%52 = load i32, i32* %6
%53 = icmp slt i32 %51, %52
br i1 %53, label %54, label %66
54: ; preds = %50
%55 = load i32, i32* %9
%56 = load i32, i32* %7
%57 = icmp sge i32 %55, %56
br i1 %57, label %58, label %66
58: ; preds = %54
%59 = load i32, i32* %9
%60 = load i32, i32* %7
%61 = sub nsw i32 %59, %60
%62 = load i32, i32* %6
%63 = mul nsw i32 %61, %62
%64 = load i32, i32* %8
%65 = add nsw i32 %63, %64
store i32 %65, i32* %5
br label %163
66: ; preds = %54, %50, %47
%67 = load i32, i32* %8
%68 = icmp slt i32 %67, 0
br i1 %68, label %69, label %82
69: ; preds = %66
%70 = load i32, i32* %9
%71 = icmp slt i32 %70, 0
br i1 %71, label %72, label %82
72: ; preds = %69
%73 = load i32, i32* %7
%74 = load i32, i32* %9
%75 = add nsw i32 %73, %74
%76 = load i32, i32* %6
%77 = mul nsw i32 %75, %76
%78 = load i32, i32* %8
%79 = add nsw i32 %77, %78
%80 = load i32, i32* %6
%81 = add nsw i32 %79, %80
store i32 %81, i32* %5
br label %163
82: ; preds = %69, %66
%83 = load i32, i32* %8
%84 = icmp slt i32 %83, 0
br i1 %84, label %85, label %100
85: ; preds = %82
%86 = load i32, i32* %9
%87 = icmp sge i32 %86, 0
br i1 %87, label %88, label %100
88: ; preds = %85
%89 = load i32, i32* %9
%90 = load i32, i32* %7
%91 = icmp slt i32 %89, %90
br i1 %91, label %92, label %100
92: ; preds = %88
%93 = load i32, i32* %9
%94 = load i32, i32* %6
%95 = mul nsw i32 %93, %94
%96 = load i32, i32* %8
%97 = add nsw i32 %95, %96
%98 = load i32, i32* %6
%99 = add nsw i32 %97, %98
store i32 %99, i32* %5
br label %163
100: ; preds = %88, %85, %82
%101 = load i32, i32* %8
%102 = icmp slt i32 %101, 0
br i1 %102, label %103, label %117
103: ; preds = %100
%104 = load i32, i32* %9
%105 = load i32, i32* %7
%106 = icmp sge i32 %104, %105
br i1 %106, label %107, label %117
107: ; preds = %103
%108 = load i32, i32* %9
%109 = load i32, i32* %7
%110 = sub nsw i32 %108, %109
%111 = load i32, i32* %6
%112 = mul nsw i32 %110, %111
%113 = load i32, i32* %8
%114 = add nsw i32 %112, %113
%115 = load i32, i32* %6
%116 = add nsw i32 %114, %115
store i32 %116, i32* %5
br label %163
117: ; preds = %103, %100
%118 = load i32, i32* %8
%119 = load i32, i32* %6
%120 = icmp sge i32 %118, %119
br i1 %120, label %121, label %134
121: ; preds = %117
%122 = load i32, i32* %9
%123 = icmp slt i32 %122, 0
br i1 %123, label %124, label %134
124: ; preds = %121
%125 = load i32, i32* %7
%126 = load i32, i32* %9
%127 = add nsw i32 %125, %126
%128 = load i32, i32* %6
%129 = mul nsw i32 %127, %128
%130 = load i32, i32* %8
%131 = add nsw i32 %129, %130
%132 = load i32, i32* %6
%133 = sub nsw i32 %131, %132
store i32 %133, i32* %5
br label %163
134: ; preds = %121, %117
%135 = load i32, i32* %8
%136 = load i32, i32* %6
%137 = icmp sge i32 %135, %136
br i1 %137, label %138, label %153
138: ; preds = %134
%139 = load i32, i32* %9
%140 = icmp sge i32 %139, 0
br i1 %140, label %141, label %153
141: ; preds = %138
%142 = load i32, i32* %9
%143 = load i32, i32* %7
%144 = icmp slt i32 %142, %143
br i1 %144, label %145, label %153
145: ; preds = %141
%146 = load i32, i32* %9
%147 = load i32, i32* %6
%148 = mul nsw i32 %146, %147
%149 = load i32, i32* %8
%150 = add nsw i32 %148, %149
%151 = load i32, i32* %6
%152 = sub nsw i32 %150, %151
store i32 %152, i32* %5
br label %163
153: ; preds = %141, %138, %134
%154 = load i32, i32* %9
%155 = load i32, i32* %7
%156 = sub nsw i32 %154, %155
%157 = load i32, i32* %6
%158 = mul nsw i32 %156, %157
%159 = load i32, i32* %8
%160 = add nsw i32 %158, %159
%161 = load i32, i32* %6
%162 = sub nsw i32 %160, %161
store i32 %162, i32* %5
br label %163
163: ; preds = %153, %145, %124, %107, %92, %72, %58, %39, %23
%164 = load i32, i32* %5
ret i32 %164
}

LLVM IR (-O2):
define i32 @GetRightPos(i32 %0, i32 %1, i32 %2, i32 %3) {
%5 = icmp sgt i32 %2, -1
br i1 %5, label %6, label %29
6: ; preds = %4
%7 = icmp slt i32 %2, %0
%8 = icmp sgt i32 %3, -1
%9 = and i1 %7, %8
%10 = icmp slt i32 %3, %1
%11 = and i1 %10, %9
br i1 %11, label %12, label %15
12: ; preds = %6
%13 = mul nsw i32 %3, %0
%14 = add nsw i32 %13, %2
br label %76
15: ; preds = %6
%16 = icmp slt i32 %3, 0
%17 = and i1 %7, %16
br i1 %17, label %18, label %22
18: ; preds = %15
%19 = add nsw i32 %3, %1
%20 = mul nsw i32 %19, %0
%21 = add nsw i32 %20, %2
br label %76
22: ; preds = %15
%23 = xor i1 %7, true
%24 = or i1 %10, %23
br i1 %24, label %29, label %25
25: ; preds = %22
%26 = sub nsw i32 %3, %1
%27 = mul nsw i32 %26, %0
%28 = add nsw i32 %27, %2
br label %76
29: ; preds = %4, %22
%30 = icmp slt i32 %2, 0
%31 = icmp slt i32 %3, 0
%32 = and i32 %3, %2
%33 = icmp slt i32 %32, 0
br i1 %33, label %34, label %39
34: ; preds = %29
%35 = add nsw i32 %3, %1
%36 = mul nsw i32 %35, %0
%37 = add i32 %2, %0
%38 = add i32 %37, %36
br label %76
39: ; preds = %29
%40 = icmp sgt i32 %3, -1
%41 = and i1 %30, %40
%42 = icmp slt i32 %3, %1
%43 = and i1 %42, %41
br i1 %43, label %44, label %48
44: ; preds = %39
%45 = mul nsw i32 %3, %0
%46 = add i32 %2, %0
%47 = add i32 %46, %45
br label %76
48: ; preds = %39
%49 = xor i1 %30, true
%50 = or i1 %42, %49
br i1 %50, label %56, label %51
51: ; preds = %48
%52 = sub nsw i32 %3, %1
%53 = mul nsw i32 %52, %0
%54 = add i32 %2, %0
%55 = add i32 %54, %53
br label %76
56: ; preds = %48
%57 = icmp sge i32 %2, %0
%58 = and i1 %57, %31
br i1 %58, label %59, label %64
59: ; preds = %56
%60 = add nsw i32 %3, %1
%61 = mul nsw i32 %60, %0
%62 = sub i32 %2, %0
%63 = add i32 %62, %61
br label %76
64: ; preds = %56
%65 = and i1 %57, %40
%66 = and i1 %42, %65
br i1 %66, label %67, label %71
67: ; preds = %64
%68 = mul nsw i32 %3, %0
%69 = sub i32 %2, %0
%70 = add i32 %69, %68
br label %76
71: ; preds = %64
%72 = sub nsw i32 %3, %1
%73 = mul nsw i32 %72, %0
%74 = sub i32 %2, %0
%75 = add i32 %74, %73
br label %76
76: ; preds = %71, %67, %59, %51, %44, %34, %25, %18, %12
%77 = phi i32 [ %14, %12 ], [ %21, %18 ], [ %28, %25 ], [ %38, %34 ], [ %47, %44 ], [ %55, %51 ], [ %63, %59 ], [ %70, %67 ], [ %75, %71 ]
ret i32 %77
}