// File: /workspace/github_cpp_makefile_star2_O1/luooofan[P]hblzbd_compiler/src/Pass/generate_arm_from_ssa.cpp
// Function: GenerateArmFromSSA::ResolveValue2Reg(ArmBasicBlock*, Value*)
Reg* GenerateArmFromSSA::ResolveValue2Reg(ArmBasicBlock* armbb, Value* val) {
  if (auto src_val = dynamic_cast<ConstantInt*>(val)) {
    return ResolveImm2Reg(armbb, src_val->GetImm());
  } else if (auto src_val = dynamic_cast<GlobalVariable*>(val)) {
    // 如果是全局量 在函数prologue中会把其地址或基址记录在var map中 直接返回地址即可
    return var_map[val];
  }
  // else if (auto src_val = dynamic_cast<UndefVariable*>(val)) {
  // val->Print(std::cout);// MyAssert(0);
  // 测例中会出现UB 但是测例用给定的输入数据不会有UB e.g. int c; while(c...){...} return c;
  // 暂时和普通变量同处理
  //}
  else if (auto src_val = dynamic_cast<Argument*>(val)) {
    // 如果能在var map中找到 说明这是一次对参数的使用 返回即可 返回的寄存器中存的可能是参数变量值 也可能是数组参数的基址
    if (var_map.find(val) != var_map.end()) {
      return var_map[val];
    }
    // 找不到 此时执行流肯定在addprologue中 根据是第几个参数 产生mov或者ldr语句 把参数都放到寄存器里 并记录到var map中
    else {
      Reg* vreg = NewVirtualReg();
      auto arg_no = src_val->GetArgNo();
      if (arg_no < 4) {
        new Move(vreg, new Operand2(machine_regs[arg_no]), armbb);
      } else {  // NOTE: 寄存器分配后修改的时候应该是+=最终的stack_size+push的大小
        GenImmLdrStrInst(armbb, LdrStr::OpKind::LDR, vreg, machine_regs[ArmReg::sp], /*4 lr +*/ (arg_no - 4) * 4, true);
      }
      var_map[val] = vreg;
      return vreg;
    }
  } else if (dynamic_cast<FunctionValue*>(val) || dynamic_cast<BasicBlockValue*>(val)) {
    MyAssert(0);
  } else {
    // 先在var map中找 找到直接返回 没找到(意味着定值)就记录映射并返回
    if (var_map.find(val) != var_map.end()) {
      return var_map[val];
    } else {
      Reg* vreg = NewVirtualReg();
      var_map[val] = vreg;
      return vreg;
    }
  }
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x18, %rsp
movq %rdx, %r14
movq %rsi, %r15
movq %rdi, %rbx
movq %rdx, 0x8(%rsp)
testq %rdx, %rdx
je 0x4d5cd
leaq 0x41ef6(%rip), %rsi     # 0x8f4b0
leaq 0x41f17(%rip), %rdx     # 0x8f4d8
movq %r14, %rdi
xorl %ecx, %ecx
callq 0x8320
jmp 0x4d5cf
xorl %eax, %eax
testq %rax, %rax
je 0x4d5f2
movl 0x48(%rax), %edx
movq %rbx, %rdi
movq %r15, %rsi
xorl %ecx, %ecx
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x4cb1e
testq %r14, %r14
je 0x4d647
leaq 0x41eb2(%rip), %rsi     # 0x8f4b0
leaq 0x41ebb(%rip), %rdx     # 0x8f4c0
movq %r14, %rdi
xorl %ecx, %ecx
callq 0x8320
testq %rax, %rax
je 0x4d625
addq $0x58, %rbx
leaq 0x8(%rsp), %rsi
movq %rbx, %rdi
jmp 0x4d894
testq %r14, %r14
je 0x4d647
leaq 0x41e7f(%rip), %rsi     # 0x8f4b0
leaq 0x41ee8(%rip), %rdx     # 0x8f520
movq %r14, %rdi
xorl %ecx, %ecx
callq 0x8320
movq %rax, %r13
jmp 0x4d64a
xorl %r13d, %r13d
testq %r13, %r13
je 0x4d6b9
movq 0x58(%rbx), %rsi
movq 0x60(%rbx), %rdi
xorl %r9d, %r9d
movq %r14, %rax
xorl %edx, %edx
divq %rdi
movq (%rsi,%rdx,8), %rax
testq %rax, %rax
je 0x4d772
movq (%rax), %r8
movq %rax, %r9
cmpq %r14, 0x8(%r8)
je 0x4d772
movq %rdx, %rcx
movq %r8, %r10
movq (%r8), %r8
testq %r8, %r8
je 0x4d76f
movq 0x8(%r8), %rsi
movq %rsi, %rax
xorl %edx, %edx
divq %rdi
movl $0x0, %r9d
cmpq %rcx, %rdx
jne 0x4d772
movq %r10, %r9
cmpq %r14, %rsi
jne 0x4d682
jmp 0x4d772
testq %r14, %r14
je 0x4d705
leaq 0x41deb(%rip), %rsi     # 0x8f4b0
leaq 0x41e3c(%rip), %rdx     # 0x8f508
movq %r14, %rdi
xorl %ecx, %ecx
callq 0x8320
testq %rax, %rax
jne 0x4d8fe
testq %r14, %r14
je 0x4d705
leaq 0x41dc5(%rip), %rsi     # 0x8f4b0
leaq 0x41dfe(%rip), %rdx     # 0x8f4f0
movq %r14, %rdi
xorl %ecx, %ecx
callq 0x8320
testq %rax, %rax
jne 0x4d8fe
movq 0x58(%rbx), %rsi
movq 0x60(%rbx), %rdi
xorl %r9d, %r9d
movq %r14, %rax
xorl %edx, %edx
divq %rdi
movq (%rsi,%rdx,8), %rax
testq %rax, %rax
je 0x4d87d
movq (%rax), %r8
movq %rax, %r9
cmpq %r14, 0x8(%r8)
je 0x4d87d
movq %rdx, %rcx
movq %r8, %r10
movq (%r8), %r8
testq %r8, %r8
je 0x4d87a
movq 0x8(%r8), %rsi
movq %rsi, %rax
xorl %edx, %edx
divq %rdi
movl $0x0, %r9d
cmpq %rcx, %rdx
jne 0x4d87d
movq %r10, %r9
cmpq %r14, %rsi
jne 0x4d738
jmp 0x4d87d
xorl %r9d, %r9d
leaq 0x58(%rbx), %rdi
testq %r9, %r9
je 0x4d78b
cmpq $0x0, (%r9)
je 0x4d78b
leaq 0x8(%rsp), %rsi
jmp 0x4d894
movq %rdi, 0x10(%rsp)
movl $0x40, %edi
callq 0x8290
movq %rax, %r14
movl 0x50(%rbx), %eax
leal 0x1(%rax), %ecx
movl %ecx, 0x50(%rbx)
leaq 0x30(%r14), %rcx
movq %rcx, (%r14)
movq $0x1, 0x8(%r14)
xorps %xmm0, %xmm0
movups %xmm0, 0x10(%r14)
movl $0x3f800000, 0x20(%r14) # imm = 0x3F800000
movups %xmm0, 0x28(%r14)
movl %eax, 0x38(%r14)
movl 0x48(%r13), %r12d
cmpq $0x3, %r12
ja 0x4d847
movl $0x28, %edi
callq 0x8290
movq %rax, %r13
movl $0x18, %edi
callq 0x8290
movq %rax, %rbp
movq 0x38(%rbx), %rax
movq (%rax,%r12,8), %rax
movb $0x0, (%rbp)
movl $0x0, 0x4(%rbp)
movq %rax, 0x8(%rbp)
movq $0x0, 0x10(%rbp)
movq %r13, %rdi
movq %r15, %rsi
movl $0x1, %edx
callq 0xa6a8
leaq 0x40c98(%rip), %rax     # 0x8e4c0
leaq 0x10(%rax), %rcx
movq %rcx, (%r13)
movw $0x0, 0x14(%r13)
movq %r14, 0x18(%r13)
movq %rbp, 0x20(%r13)
movq %r13, %rdi
callq *0x28(%rax)
jmp 0x4d86e
movq 0x38(%rbx), %rax
movq 0x68(%rax), %r8
leal -0x10(,%r12,4), %r9d
movl $0x1, (%rsp)
movq %rbx, %rdi
movq %r15, %rsi
xorl %edx, %edx
movq %r14, %rcx
callq 0x4ce24
leaq 0x8(%rsp), %rsi
movq 0x10(%rsp), %rdi
jmp 0x4d8e4
xorl %r9d, %r9d
leaq 0x58(%rbx), %r15
testq %r9, %r9
je 0x4d89e
cmpq $0x0, (%r9)
je 0x4d89e
leaq 0x8(%rsp), %rsi
movq %r15, %rdi
callq 0x51988
movq (%rax), %r14
jmp 0x4d8ec
movl $0x40, %edi
callq 0x8290
movq %rax, %r14
movl 0x50(%rbx), %eax
leal 0x1(%rax), %ecx
movl %ecx, 0x50(%rbx)
leaq 0x30(%r14), %rcx
movq %rcx, (%r14)
movq $0x1, 0x8(%r14)
xorps %xmm0, %xmm0
movups %xmm0, 0x10(%r14)
movl $0x3f800000, 0x20(%r14) # imm = 0x3F800000
movups %xmm0, 0x28(%r14)
movl %eax, 0x38(%r14)
leaq 0x8(%rsp), %rsi
movq %r15, %rdi
callq 0x51988
movq %r14, (%rax)
movq %r14, %rax
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq 0x426eb(%rip), %rdi     # 0x8fff0
leaq 0x2185c(%rip), %rsi     # 0x6f168
callq 0x8280
leaq 0x24f78(%rip), %rsi     # 0x72890
movq %rax, %rdi
callq 0x8280
leaq 0x22a99(%rip), %rsi     # 0x703c0
movq %rax, %rdi
callq 0x8280
movq %rax, %rdi
movl $0x138, %esi            # imm = 0x138
callq 0x8520
movq %rax, %rdi
callq 0x8180
movl $0xff, %edi
callq 0x8380
movq %rax, %rbx
movl $0x28, %esi
movq %r13, %rdi
callq 0x82a0
movq %rbx, %rdi
callq 0x8540