// File: /workspace/github_c_makefile_star2_O0/cogbee[P]vmir-latest/src/vmir_value.c
// Function: value_print
static int
value_print(char **dstp, ir_unit_t *iu, const ir_value_t *iv,
            const ir_type_t *it)
{
  int value = iv->iv_id;
  int len = 0;
  char tmpbuf[64];

  if(it == NULL) {
    if(iv->iv_type < VECTOR_LEN(&iu->iu_types))
      it = &VECTOR_ITEM(&iu->iu_types, iv->iv_type);
  }

  switch(iv->iv_class) {
  case IR_VC_UNDEF:
    len += addstr(dstp, "<undefined>");
    break;

  case IR_VC_CE:
    len += addstr(dstp, "<constexpr>");
    break;

  case IR_VC_AGGREGATE:
    len += type_print(dstp, iu, it);
    len += addstr(dstp, " = {");
    ir_valuetype_t *values = iv->iv_data;
    for(int i = 0; i < iv->iv_num_values; i++) {
      if(i != 0)
        len += addstr(dstp, ", ");
      len += value_print_vt(dstp, iu, values[i]);
    }
    len += addstr(dstp, "}");
    break;

  case IR_VC_DEAD:
    snprintf(tmpbuf, sizeof(tmpbuf), "<dead>%%%d", value);
    len += addstr(dstp, tmpbuf);
    break;

  case IR_VC_ALIAS:
    len += addstr(dstp, "alias -> ");
    len += value_print_id(dstp, iu, iv->iv_reg);
    break;

  case IR_VC_FUNCTION:
    len += addstr(dstp, "function ");
    if(iv->iv_func->if_name != NULL) {
      len += addstr(dstp, iv->iv_func->if_name);
      len += addstr(dstp, "() ");
    }
    len += type_print_id(dstp, iu, iv->iv_func->if_type);
    break;

  case IR_VC_GLOBALVAR:
    len += addstr(dstp, "global ");
    if(iv->iv_gvar->ig_name != NULL) {
      len += addstr(dstp, iv->iv_gvar->ig_name);
      len += addstr(dstp, " ");
    }
    len += type_print(dstp, iu, it);
    snprintf(tmpbuf, sizeof(tmpbuf), " @ 0x%x", iv->iv_gvar->ig_addr);
    len += addstr(dstp, tmpbuf);
    break;

  case IR_VC_TEMPORARY:
    len += addstr(dstp, "(");
    len += type_print(dstp, iu, it);
    snprintf(tmpbuf, sizeof(tmpbuf), ")%%%d", value);
    len += addstr(dstp, tmpbuf);
    break;

  case IR_VC_CONSTANT:
    len += addstr(dstp, "(");
    len += type_print(dstp, iu, it);
    snprintf(tmpbuf, sizeof(tmpbuf), ")%%%d", value);
    len += addstr(dstp, tmpbuf);
    if(it == NULL) {
      len += addstr(dstp, "badtype");
      break;
    }

    switch(it->it_code) {
    case IR_TYPE_INT1:
      snprintf(tmpbuf, sizeof(tmpbuf), "#0x%x", !!iv->iv_u32);
      break;
    case IR_TYPE_INT8:
    case IR_TYPE_INT16:
    case IR_TYPE_INT32:
    case IR_TYPE_POINTER:
      snprintf(tmpbuf, sizeof(tmpbuf), "#0x%x", iv->iv_u32);
      break;
    case IR_TYPE_INT64:
      snprintf(tmpbuf, sizeof(tmpbuf), "#0x%"PRIx64, iv->iv_u64);
      break;
    case IR_TYPE_FLOAT:
      snprintf(tmpbuf, sizeof(tmpbuf), "#%f", iv->iv_float);
      break;
    case IR_TYPE_DOUBLE:
      snprintf(tmpbuf, sizeof(tmpbuf), "#%f", iv->iv_double);
      break;
    default:
      snprintf(tmpbuf, sizeof(tmpbuf), "#?(code-%d)", it->it_code);
      break;
    }
    len += addstr(dstp, tmpbuf);
    break;

  case IR_VC_ZERO_INITIALIZER:
    len += addstr(dstp, "zeroinitializer");
    break;

  case IR_VC_REGFRAME:
    len += addstr(dstp, "(");
    len += type_print(dstp, iu, it);
    snprintf(tmpbuf, sizeof(tmpbuf), ")%%%d{0x%x}", value, iv->iv_reg);
    len += addstr(dstp, tmpbuf);
    break;
  case IR_VC_MACHINEREG:
    len += addstr(dstp, "(");
    len += type_print(dstp, iu, it);
    snprintf(tmpbuf, sizeof(tmpbuf), ")%%%d{r%d}", value, iv->iv_reg);
    len += addstr(dstp, tmpbuf);
    break;
  case IR_VC_DATA:
    {
      len += addstr(dstp, "data [");
      int size = type_sizeof(iu, iv->iv_type);
      for(int i = 0; i < size; i++) {
        if(i)
          len += addstr(dstp, ".");
        snprintf(tmpbuf, sizeof(tmpbuf), "%02x", ((uint8_t *)iv->iv_data)[i]);
        len += addstr(dstp, tmpbuf);
      }
      len += addstr(dstp, "]");
    }
    break;
  }

  if(iv->iv_name != NULL) {
    len += addstr(dstp, "\"");
    len += addstr(dstp, iv->iv_name);
    len += addstr(dstp, "\"");
  }
  return len;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xa0, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq -0x18(%rbp), %rax
movl 0x20(%rax), %eax
movl %eax, -0x24(%rbp)
movl $0x0, -0x28(%rbp)
cmpq $0x0, -0x20(%rbp)
jne 0x1f588
movq -0x18(%rbp), %rax
movslq 0x24(%rax), %rax
movq -0x10(%rbp), %rcx
cmpq 0x170(%rcx), %rax
jae 0x1f586
movq -0x10(%rbp), %rax
movq 0x168(%rax), %rax
movq -0x18(%rbp), %rcx
movslq 0x24(%rcx), %rcx
imulq $0x28, %rcx, %rcx
addq %rcx, %rax
movq %rax, -0x20(%rbp)
jmp 0x1f588
movq -0x18(%rbp), %rax
movl (%rax), %eax
movq %rax, -0x90(%rbp)
subq $0xc, %rax
ja 0x1fbc8
movq -0x90(%rbp), %rax
leaq 0x1d903(%rip), %rcx     # 0x3ceb0
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x8(%rbp), %rdi
leaq 0x1f834(%rip), %rsi     # 0x3edf5
callq 0x18e90
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
jmp 0x1fbc8
movq -0x8(%rbp), %rdi
leaq 0x1f825(%rip), %rsi     # 0x3ee01
callq 0x18e90
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
jmp 0x1fbc8
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x18930
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
movq -0x8(%rbp), %rdi
leaq 0x1f7ff(%rip), %rsi     # 0x3ee0d
callq 0x18e90
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
movq -0x18(%rbp), %rax
movq 0x18(%rax), %rax
movq %rax, -0x78(%rbp)
movl $0x0, -0x7c(%rbp)
movl -0x7c(%rbp), %eax
movq -0x18(%rbp), %rcx
cmpl 0x30(%rcx), %eax
jge 0x1f67e
cmpl $0x0, -0x7c(%rbp)
je 0x1f654
movq -0x8(%rbp), %rdi
leaq 0x1ec5e(%rip), %rsi     # 0x3e2a7
callq 0x18e90
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x78(%rbp), %rax
movslq -0x7c(%rbp), %rcx
movq (%rax,%rcx,8), %rdx
callq 0x1fc30
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
movl -0x7c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x7c(%rbp)
jmp 0x1f62c
movq -0x8(%rbp), %rdi
leaq 0x1f806(%rip), %rsi     # 0x3ee8f
callq 0x18e90
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
jmp 0x1fbc8
leaq -0x70(%rbp), %rdi
movl -0x24(%rbp), %ecx
movl $0x40, %esi
leaq 0x1f766(%rip), %rdx     # 0x3ee12
movb $0x0, %al
callq 0x3180
movq -0x8(%rbp), %rdi
leaq -0x70(%rbp), %rsi
callq 0x18e90
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
jmp 0x1fbc8
movq -0x8(%rbp), %rdi
leaq 0x1f747(%rip), %rsi     # 0x3ee1d
callq 0x18e90
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rax
movl 0x30(%rax), %edx
callq 0x1f490
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
jmp 0x1fbc8
movq -0x8(%rbp), %rdi
leaq 0x1f71c(%rip), %rsi     # 0x3ee27
callq 0x18e90
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
movq -0x18(%rbp), %rax
movq 0x30(%rax), %rax
cmpq $0x0, 0x20(%rax)
je 0x1f756
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x30(%rax), %rax
movq 0x20(%rax), %rsi
callq 0x18e90
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
movq -0x8(%rbp), %rdi
leaq 0x1f6e6(%rip), %rsi     # 0x3ee31
callq 0x18e90
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rax
movq 0x30(%rax), %rax
movl 0x10(%rax), %edx
callq 0x18ef0
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
jmp 0x1fbc8
movq -0x8(%rbp), %rdi
leaq 0x1f6b1(%rip), %rsi     # 0x3ee35
callq 0x18e90
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
movq -0x18(%rbp), %rax
movq 0x30(%rax), %rax
cmpq $0x0, 0x20(%rax)
je 0x1f7cf
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x30(%rax), %rax
movq 0x20(%rax), %rsi
callq 0x18e90
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
movq -0x8(%rbp), %rdi
leaq 0x1f66f(%rip), %rsi     # 0x3ee33
callq 0x18e90
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x18930
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
leaq -0x70(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x30(%rax), %rax
movl 0x28(%rax), %ecx
movl $0x40, %esi
leaq 0x1f63c(%rip), %rdx     # 0x3ee3d
movb $0x0, %al
callq 0x3180
movq -0x8(%rbp), %rdi
leaq -0x70(%rbp), %rsi
callq 0x18e90
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
jmp 0x1fbc8
movq -0x8(%rbp), %rdi
leaq 0x1fadd(%rip), %rsi     # 0x3f308
callq 0x18e90
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x18930
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
leaq -0x70(%rbp), %rdi
movl -0x24(%rbp), %ecx
movl $0x40, %esi
leaq 0x1f5e5(%rip), %rdx     # 0x3ee45
movb $0x0, %al
callq 0x3180
movq -0x8(%rbp), %rdi
leaq -0x70(%rbp), %rsi
callq 0x18e90
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
jmp 0x1fbc8
movq -0x8(%rbp), %rdi
leaq 0x1fa7e(%rip), %rsi     # 0x3f308
callq 0x18e90
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x18930
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
leaq -0x70(%rbp), %rdi
movl -0x24(%rbp), %ecx
movl $0x40, %esi
leaq 0x1f586(%rip), %rdx     # 0x3ee45
movb $0x0, %al
callq 0x3180
movq -0x8(%rbp), %rdi
leaq -0x70(%rbp), %rsi
callq 0x18e90
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
cmpq $0x0, -0x20(%rbp)
jne 0x1f8fb
movq -0x8(%rbp), %rdi
leaq 0x1f560(%rip), %rsi     # 0x3ee4b
callq 0x18e90
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
jmp 0x1fbc8
movq -0x20(%rbp), %rax
movl (%rax), %eax
addl $-0x2, %eax
movl %eax, %ecx
movq %rcx, -0x98(%rbp)
subl $0x9, %eax
ja 0x1f9e9
movq -0x98(%rbp), %rax
leaq 0x1d5c0(%rip), %rcx     # 0x3cee4
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
leaq -0x70(%rbp), %rdi
movq -0x18(%rbp), %rax
cmpl $0x0, 0x30(%rax)
setne %al
xorb $-0x1, %al
xorb $-0x1, %al
andb $0x1, %al
movzbl %al, %ecx
movl $0x40, %esi
leaq 0x1f81b(%rip), %rdx     # 0x3f16c
movb $0x0, %al
callq 0x3180
jmp 0x1fa06
leaq -0x70(%rbp), %rdi
movq -0x18(%rbp), %rax
movl 0x30(%rax), %ecx
movl $0x40, %esi
leaq 0x1f7f8(%rip), %rdx     # 0x3f16c
movb $0x0, %al
callq 0x3180
jmp 0x1fa06
leaq -0x70(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x30(%rax), %rcx
movl $0x40, %esi
leaq 0x1f4bb(%rip), %rdx     # 0x3ee53
movb $0x0, %al
callq 0x3180
jmp 0x1fa06
leaq -0x70(%rbp), %rdi
movq -0x18(%rbp), %rax
movss 0x30(%rax), %xmm0
cvtss2sd %xmm0, %xmm0
movl $0x40, %esi
leaq 0x1f49c(%rip), %rdx     # 0x3ee5a
movb $0x1, %al
callq 0x3180
jmp 0x1fa06
leaq -0x70(%rbp), %rdi
movq -0x18(%rbp), %rax
movsd 0x30(%rax), %xmm0
movl $0x40, %esi
leaq 0x1f47a(%rip), %rdx     # 0x3ee5a
movb $0x1, %al
callq 0x3180
jmp 0x1fa06
leaq -0x70(%rbp), %rdi
movq -0x20(%rbp), %rax
movl (%rax), %ecx
movl $0x40, %esi
leaq 0x1f45f(%rip), %rdx     # 0x3ee5e
movb $0x0, %al
callq 0x3180
movq -0x8(%rbp), %rdi
leaq -0x70(%rbp), %rsi
callq 0x18e90
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
jmp 0x1fbc8
movq -0x8(%rbp), %rdi
leaq 0x1f441(%rip), %rsi     # 0x3ee6a
callq 0x18e90
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
jmp 0x1fbc8
movq -0x8(%rbp), %rdi
leaq 0x1f8c4(%rip), %rsi     # 0x3f308
callq 0x18e90
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x18930
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
leaq -0x70(%rbp), %rdi
movl -0x24(%rbp), %ecx
movq -0x18(%rbp), %rax
movl 0x30(%rax), %r8d
movl $0x40, %esi
leaq 0x1f3f9(%rip), %rdx     # 0x3ee7a
movb $0x0, %al
callq 0x3180
movq -0x8(%rbp), %rdi
leaq -0x70(%rbp), %rsi
callq 0x18e90
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
jmp 0x1fbc8
movq -0x8(%rbp), %rdi
leaq 0x1f85d(%rip), %rsi     # 0x3f308
callq 0x18e90
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x18930
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
leaq -0x70(%rbp), %rdi
movl -0x24(%rbp), %ecx
movq -0x18(%rbp), %rax
movl 0x30(%rax), %r8d
movl $0x40, %esi
leaq 0x1f39e(%rip), %rdx     # 0x3ee86
movb $0x0, %al
callq 0x3180
movq -0x8(%rbp), %rdi
leaq -0x70(%rbp), %rsi
callq 0x18e90
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
jmp 0x1fbc8
movq -0x8(%rbp), %rdi
leaq 0x1f37f(%rip), %rsi     # 0x3ee91
callq 0x18e90
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rax
movl 0x24(%rax), %esi
callq 0x1ecd0
movl %eax, -0x80(%rbp)
movl $0x0, -0x84(%rbp)
movl -0x84(%rbp), %eax
cmpl -0x80(%rbp), %eax
jge 0x1fbb2
cmpl $0x0, -0x84(%rbp)
je 0x1fb64
movq -0x8(%rbp), %rdi
leaq 0x1f715(%rip), %rsi     # 0x3f26e
callq 0x18e90
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
leaq -0x70(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x18(%rax), %rax
movslq -0x84(%rbp), %rcx
movzbl (%rax,%rcx), %ecx
movl $0x40, %esi
leaq 0x1f311(%rip), %rdx     # 0x3ee98
movb $0x0, %al
callq 0x3180
movq -0x8(%rbp), %rdi
leaq -0x70(%rbp), %rsi
callq 0x18e90
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
movl -0x84(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x84(%rbp)
jmp 0x1fb3a
movq -0x8(%rbp), %rdi
leaq 0x1e6dc(%rip), %rsi     # 0x3e299
callq 0x18e90
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
movq -0x18(%rbp), %rax
cmpq $0x0, 0x10(%rax)
je 0x1fc16
movq -0x8(%rbp), %rdi
leaq 0x1f49d(%rip), %rsi     # 0x3f07b
callq 0x18e90
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rsi
callq 0x18e90
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
movq -0x8(%rbp), %rdi
leaq 0x1f470(%rip), %rsi     # 0x3f07b
callq 0x18e90
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
movl -0x28(%rbp), %eax
addq $0xa0, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)