#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int /*<<< orphan*/ getmaxyx(int /*<<< orphan*/, int, int);
int /*<<< orphan*/ mvaddstr(int, int, char *);
int /*<<< orphan*/ stdscr;
void draw_box(int ypos, int xpos, int height, int width) {
  if (height < 2 || width < 2)
    return;
  int i;
  int yendpos = ypos + height - 1;
  int xendpos = xpos + width - 1;
  int maxy, maxx;
  getmaxyx(stdscr, maxy, maxx);
  if (ypos >= 0 && ypos < maxy && xpos >= 0 && xpos < maxx) {
    mvaddstr(ypos, xpos, "\u250C");
  }
  for (i = ypos + 1; i < yendpos; ++i) {
    if (i >= 0 && i < maxy && xpos >= 0 && xpos < maxx) {
      mvaddstr(i, xpos, "\u2502");
    }
  }
  if (yendpos >= 0 && yendpos < maxy && xpos >= 0 && xpos < maxx) {
    mvaddstr(yendpos, xpos, "\u2514");
  }
  ++xpos;
  for (; xpos < xendpos; ++xpos) {
    if (ypos >= 0 && ypos < maxy && xpos >= 0 && xpos < maxx) {
      mvaddstr(ypos, xpos, "\u2500");
    }
    if (yendpos >= 0 && yendpos < maxy && xpos >= 0 && xpos < maxx) {
      mvaddstr(yendpos, xpos, "\u2500");
    }
  }
  if (ypos >= 0 && ypos < maxy && xpos >= 0 && xpos < maxx) {
    mvaddstr(ypos, xpos, "\u2510");
  }
  for (i = ypos + 1; i < yendpos; ++i) {
    if (i >= 0 && i < maxy && xpos >= 0 && xpos < maxx) {
      mvaddstr(i, xpos, "\u2502");
    }
  }
  if (yendpos >= 0 && yendpos < maxy && xpos >= 0 && xpos < maxx) {
    mvaddstr(yendpos, xpos, "\u2518");
  }
}


x86 assembly (clang, -O0):
<draw_box>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %ecx,-0x10(%rbp)
cmpl   $0x2,-0xc(%rbp)
jl     1148 <draw_box+0x28>
cmpl   $0x2,-0x10(%rbp)
jge    114d <draw_box+0x2d>
jmp    13e1 <draw_box+0x2c1>
mov    -0x4(%rbp),%eax
add    -0xc(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x8(%rbp),%eax
add    -0x10(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    0x2e7c(%rip),%rax
mov    (%rax),%edi
mov    -0x20(%rbp),%esi
mov    -0x24(%rbp),%edx
call   1030 <getmaxyx@plt>
cmpl   $0x0,-0x4(%rbp)
jl     11b7 <draw_box+0x97>
mov    -0x4(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    11b7 <draw_box+0x97>
cmpl   $0x0,-0x8(%rbp)
jl     11b7 <draw_box+0x97>
mov    -0x8(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    11b7 <draw_box+0x97>
mov    -0x4(%rbp),%edi
mov    -0x8(%rbp),%esi
lea    0xe4e(%rip),%rdx
call   1040 <mvaddstr@plt>
mov    -0x4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    121d <draw_box+0xfd>
cmpl   $0x0,-0x14(%rbp)
jl     120a <draw_box+0xea>
mov    -0x14(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    120a <draw_box+0xea>
cmpl   $0x0,-0x8(%rbp)
jl     120a <draw_box+0xea>
mov    -0x8(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    120a <draw_box+0xea>
mov    -0x14(%rbp),%edi
mov    -0x8(%rbp),%esi
lea    0xdff(%rip),%rdx
call   1040 <mvaddstr@plt>
jmp    120f <draw_box+0xef>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    11c0 <draw_box+0xa0>
cmpl   $0x0,-0x18(%rbp)
jl     125b <draw_box+0x13b>
mov    -0x18(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    125b <draw_box+0x13b>
cmpl   $0x0,-0x8(%rbp)
jl     125b <draw_box+0x13b>
mov    -0x8(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    125b <draw_box+0x13b>
mov    -0x18(%rbp),%edi
mov    -0x8(%rbp),%esi
lea    0xdb2(%rip),%rdx
call   1040 <mvaddstr@plt>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
mov    -0x8(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    12ff <draw_box+0x1df>
cmpl   $0x0,-0x4(%rbp)
jl     12ae <draw_box+0x18e>
mov    -0x4(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    12ae <draw_box+0x18e>
cmpl   $0x0,-0x8(%rbp)
jl     12ae <draw_box+0x18e>
mov    -0x8(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    12ae <draw_box+0x18e>
mov    -0x4(%rbp),%edi
mov    -0x8(%rbp),%esi
lea    0xd63(%rip),%rdx
call   1040 <mvaddstr@plt>
cmpl   $0x0,-0x18(%rbp)
jl     12ec <draw_box+0x1cc>
mov    -0x18(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    12ec <draw_box+0x1cc>
cmpl   $0x0,-0x8(%rbp)
jl     12ec <draw_box+0x1cc>
mov    -0x8(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    12ec <draw_box+0x1cc>
mov    -0x18(%rbp),%edi
mov    -0x8(%rbp),%esi
lea    0xd25(%rip),%rdx
call   1040 <mvaddstr@plt>
jmp    12f1 <draw_box+0x1d1>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    1264 <draw_box+0x144>
cmpl   $0x0,-0x4(%rbp)
jl     133d <draw_box+0x21d>
mov    -0x4(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    133d <draw_box+0x21d>
cmpl   $0x0,-0x8(%rbp)
jl     133d <draw_box+0x21d>
mov    -0x8(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    133d <draw_box+0x21d>
mov    -0x4(%rbp),%edi
mov    -0x8(%rbp),%esi
lea    0xcd8(%rip),%rdx
call   1040 <mvaddstr@plt>
mov    -0x4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    13a3 <draw_box+0x283>
cmpl   $0x0,-0x14(%rbp)
jl     1390 <draw_box+0x270>
mov    -0x14(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    1390 <draw_box+0x270>
cmpl   $0x0,-0x8(%rbp)
jl     1390 <draw_box+0x270>
mov    -0x8(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    1390 <draw_box+0x270>
mov    -0x14(%rbp),%edi
mov    -0x8(%rbp),%esi
lea    0xc79(%rip),%rdx
call   1040 <mvaddstr@plt>
jmp    1395 <draw_box+0x275>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1346 <draw_box+0x226>
cmpl   $0x0,-0x18(%rbp)
jl     13e1 <draw_box+0x2c1>
mov    -0x18(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    13e1 <draw_box+0x2c1>
cmpl   $0x0,-0x8(%rbp)
jl     13e1 <draw_box+0x2c1>
mov    -0x8(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    13e1 <draw_box+0x2c1>
mov    -0x18(%rbp),%edi
mov    -0x8(%rbp),%esi
lea    0xc38(%rip),%rdx
call   1040 <mvaddstr@plt>
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<draw_box>:
cmp    $0x2,%edx
jl     1128 <draw_box+0x18>
cmp    $0x2,%ecx
jl     1128 <draw_box+0x18>
mov    0x2ec7(%rip),%rax
mov    (%rax),%edi
jmp    1030 <getmaxyx@plt>
ret

LLVM IR (-O0):
@stdscr = global i32 0
@.str = [4 x i8] c"\E2\94\8C\00"
@.str.1 = [4 x i8] c"\E2\94\82\00"
@.str.2 = [4 x i8] c"\E2\94\94\00"
@.str.3 = [4 x i8] c"\E2\94\80\00"
@.str.4 = [4 x i8] c"\E2\94\90\00"
@.str.5 = [4 x i8] c"\E2\94\98\00"
define void @draw_box(i32 %0, i32 %1, i32 %2, i32 %3) {
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
store i32 %0, i32* %5
store i32 %1, i32* %6
store i32 %2, i32* %7
store i32 %3, i32* %8
%14 = load i32, i32* %7
%15 = icmp slt i32 %14, 2
br i1 %15, label %19, label %16
16: ; preds = %4
%17 = load i32, i32* %8
%18 = icmp slt i32 %17, 2
br i1 %18, label %19, label %20
19: ; preds = %16, %4
br label %209
20: ; preds = %16
%21 = load i32, i32* %5
%22 = load i32, i32* %7
%23 = add nsw i32 %21, %22
%24 = sub nsw i32 %23, 1
store i32 %24, i32* %10
%25 = load i32, i32* %6
%26 = load i32, i32* %8
%27 = add nsw i32 %25, %26
%28 = sub nsw i32 %27, 1
store i32 %28, i32* %11
%29 = load i32, i32* @stdscr
%30 = load i32, i32* %12
%31 = load i32, i32* %13
%32 = call i32 @getmaxyx(i32 %29, i32 %30, i32 %31)
%33 = load i32, i32* %5
%34 = icmp sge i32 %33, 0
br i1 %34, label %35, label %50
35: ; preds = %20
%36 = load i32, i32* %5
%37 = load i32, i32* %12
%38 = icmp slt i32 %36, %37
br i1 %38, label %39, label %50
39: ; preds = %35
%40 = load i32, i32* %6
%41 = icmp sge i32 %40, 0
br i1 %41, label %42, label %50
42: ; preds = %39
%43 = load i32, i32* %6
%44 = load i32, i32* %13
%45 = icmp slt i32 %43, %44
br i1 %45, label %46, label %50
46: ; preds = %42
%47 = load i32, i32* %5
%48 = load i32, i32* %6
%49 = call i32 @mvaddstr(i32 %47, i32 %48, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0))
br label %50
50: ; preds = %46, %42, %39, %35, %20
%51 = load i32, i32* %5
%52 = add nsw i32 %51, 1
store i32 %52, i32* %9
br label %53
53: ; preds = %76, %50
%54 = load i32, i32* %9
%55 = load i32, i32* %10
%56 = icmp slt i32 %54, %55
br i1 %56, label %57, label %79
57: ; preds = %53
%58 = load i32, i32* %9
%59 = icmp sge i32 %58, 0
br i1 %59, label %60, label %75
60: ; preds = %57
%61 = load i32, i32* %9
%62 = load i32, i32* %12
%63 = icmp slt i32 %61, %62
br i1 %63, label %64, label %75
64: ; preds = %60
%65 = load i32, i32* %6
%66 = icmp sge i32 %65, 0
br i1 %66, label %67, label %75
67: ; preds = %64
%68 = load i32, i32* %6
%69 = load i32, i32* %13
%70 = icmp slt i32 %68, %69
br i1 %70, label %71, label %75
71: ; preds = %67
%72 = load i32, i32* %9
%73 = load i32, i32* %6
%74 = call i32 @mvaddstr(i32 %72, i32 %73, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i64 0, i64 0))
br label %75
75: ; preds = %71, %67, %64, %60, %57
br label %76
76: ; preds = %75
%77 = load i32, i32* %9
%78 = add nsw i32 %77, 1
store i32 %78, i32* %9
br label %53
79: ; preds = %53
%80 = load i32, i32* %10
%81 = icmp sge i32 %80, 0
br i1 %81, label %82, label %97
82: ; preds = %79
%83 = load i32, i32* %10
%84 = load i32, i32* %12
%85 = icmp slt i32 %83, %84
br i1 %85, label %86, label %97
86: ; preds = %82
%87 = load i32, i32* %6
%88 = icmp sge i32 %87, 0
br i1 %88, label %89, label %97
89: ; preds = %86
%90 = load i32, i32* %6
%91 = load i32, i32* %13
%92 = icmp slt i32 %90, %91
br i1 %92, label %93, label %97
93: ; preds = %89
%94 = load i32, i32* %10
%95 = load i32, i32* %6
%96 = call i32 @mvaddstr(i32 %94, i32 %95, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.2, i64 0, i64 0))
br label %97
97: ; preds = %93, %89, %86, %82, %79
%98 = load i32, i32* %6
%99 = add nsw i32 %98, 1
store i32 %99, i32* %6
br label %100
100: ; preds = %141, %97
%101 = load i32, i32* %6
%102 = load i32, i32* %11
%103 = icmp slt i32 %101, %102
br i1 %103, label %104, label %144
104: ; preds = %100
%105 = load i32, i32* %5
%106 = icmp sge i32 %105, 0
br i1 %106, label %107, label %122
107: ; preds = %104
%108 = load i32, i32* %5
%109 = load i32, i32* %12
%110 = icmp slt i32 %108, %109
br i1 %110, label %111, label %122
111: ; preds = %107
%112 = load i32, i32* %6
%113 = icmp sge i32 %112, 0
br i1 %113, label %114, label %122
114: ; preds = %111
%115 = load i32, i32* %6
%116 = load i32, i32* %13
%117 = icmp slt i32 %115, %116
br i1 %117, label %118, label %122
118: ; preds = %114
%119 = load i32, i32* %5
%120 = load i32, i32* %6
%121 = call i32 @mvaddstr(i32 %119, i32 %120, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.3, i64 0, i64 0))
br label %122
122: ; preds = %118, %114, %111, %107, %104
%123 = load i32, i32* %10
%124 = icmp sge i32 %123, 0
br i1 %124, label %125, label %140
125: ; preds = %122
%126 = load i32, i32* %10
%127 = load i32, i32* %12
%128 = icmp slt i32 %126, %127
br i1 %128, label %129, label %140
129: ; preds = %125
%130 = load i32, i32* %6
%131 = icmp sge i32 %130, 0
br i1 %131, label %132, label %140
132: ; preds = %129
%133 = load i32, i32* %6
%134 = load i32, i32* %13
%135 = icmp slt i32 %133, %134
br i1 %135, label %136, label %140
136: ; preds = %132
%137 = load i32, i32* %10
%138 = load i32, i32* %6
%139 = call i32 @mvaddstr(i32 %137, i32 %138, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.3, i64 0, i64 0))
br label %140
140: ; preds = %136, %132, %129, %125, %122
br label %141
141: ; preds = %140
%142 = load i32, i32* %6
%143 = add nsw i32 %142, 1
store i32 %143, i32* %6
br label %100
144: ; preds = %100
%145 = load i32, i32* %5
%146 = icmp sge i32 %145, 0
br i1 %146, label %147, label %162
147: ; preds = %144
%148 = load i32, i32* %5
%149 = load i32, i32* %12
%150 = icmp slt i32 %148, %149
br i1 %150, label %151, label %162
151: ; preds = %147
%152 = load i32, i32* %6
%153 = icmp sge i32 %152, 0
br i1 %153, label %154, label %162
154: ; preds = %151
%155 = load i32, i32* %6
%156 = load i32, i32* %13
%157 = icmp slt i32 %155, %156
br i1 %157, label %158, label %162
158: ; preds = %154
%159 = load i32, i32* %5
%160 = load i32, i32* %6
%161 = call i32 @mvaddstr(i32 %159, i32 %160, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.4, i64 0, i64 0))
br label %162
162: ; preds = %158, %154, %151, %147, %144
%163 = load i32, i32* %5
%164 = add nsw i32 %163, 1
store i32 %164, i32* %9
br label %165
165: ; preds = %188, %162
%166 = load i32, i32* %9
%167 = load i32, i32* %10
%168 = icmp slt i32 %166, %167
br i1 %168, label %169, label %191
169: ; preds = %165
%170 = load i32, i32* %9
%171 = icmp sge i32 %170, 0
br i1 %171, label %172, label %187
172: ; preds = %169
%173 = load i32, i32* %9
%174 = load i32, i32* %12
%175 = icmp slt i32 %173, %174
br i1 %175, label %176, label %187
176: ; preds = %172
%177 = load i32, i32* %6
%178 = icmp sge i32 %177, 0
br i1 %178, label %179, label %187
179: ; preds = %176
%180 = load i32, i32* %6
%181 = load i32, i32* %13
%182 = icmp slt i32 %180, %181
br i1 %182, label %183, label %187
183: ; preds = %179
%184 = load i32, i32* %9
%185 = load i32, i32* %6
%186 = call i32 @mvaddstr(i32 %184, i32 %185, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i64 0, i64 0))
br label %187
187: ; preds = %183, %179, %176, %172, %169
br label %188
188: ; preds = %187
%189 = load i32, i32* %9
%190 = add nsw i32 %189, 1
store i32 %190, i32* %9
br label %165
191: ; preds = %165
%192 = load i32, i32* %10
%193 = icmp sge i32 %192, 0
br i1 %193, label %194, label %209
194: ; preds = %191
%195 = load i32, i32* %10
%196 = load i32, i32* %12
%197 = icmp slt i32 %195, %196
br i1 %197, label %198, label %209
198: ; preds = %194
%199 = load i32, i32* %6
%200 = icmp sge i32 %199, 0
br i1 %200, label %201, label %209
201: ; preds = %198
%202 = load i32, i32* %6
%203 = load i32, i32* %13
%204 = icmp slt i32 %202, %203
br i1 %204, label %205, label %209
205: ; preds = %201
%206 = load i32, i32* %10
%207 = load i32, i32* %6
%208 = call i32 @mvaddstr(i32 %206, i32 %207, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.5, i64 0, i64 0))
br label %209
209: ; preds = %19, %205, %201, %198, %194, %191
ret void
}

LLVM IR (-O2):
@stdscr = global i32 0
define void @draw_box(i32 %0, i32 %1, i32 %2, i32 %3) {
%5 = icmp slt i32 %2, 2
%6 = icmp slt i32 %3, 2
%7 = or i1 %5, %6
br i1 %7, label %11, label %8
8: ; preds = %4
%9 = load i32, i32* @stdscr
%10 = tail call i32 @getmaxyx(i32 %9, i32 undef, i32 undef)
br label %11
11: ; preds = %8, %4
ret void
}