mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-04-28 13:28:01 +03:00
llvm: fix deprecation warnings
This commit is contained in:
parent
be31502ea2
commit
e7dcecbd56
5 changed files with 56 additions and 53 deletions
|
@ -71,7 +71,7 @@ cpu_translator::cpu_translator(llvm::Module* _module, bool is_be)
|
||||||
result = m_ir->CreateInsertElement(v, m_ir->CreateExtractElement(data0, m_ir->CreateExtractElement(mask, i)), i);
|
result = m_ir->CreateInsertElement(v, m_ir->CreateExtractElement(data0, m_ir->CreateExtractElement(mask, i)), i);
|
||||||
v->addIncoming(result, loop);
|
v->addIncoming(result, loop);
|
||||||
m_ir->CreateCondBr(m_ir->CreateICmpULT(i, m_ir->getInt32(16)), loop, next);
|
m_ir->CreateCondBr(m_ir->CreateICmpULT(i, m_ir->getInt32(16)), loop, next);
|
||||||
m_ir->SetInsertPoint(next->getFirstNonPHI());
|
m_ir->SetInsertPoint(next->getFirstNonPHIIt());
|
||||||
result = m_ir->CreateSelect(m_ir->CreateICmpSLT(index, zeros), zeros, result);
|
result = m_ir->CreateSelect(m_ir->CreateICmpSLT(index, zeros), zeros, result);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
|
@ -434,7 +434,7 @@ struct llvm_value_t<T*> : llvm_value_t<T>
|
||||||
|
|
||||||
static llvm::Type* get_type(llvm::LLVMContext& context)
|
static llvm::Type* get_type(llvm::LLVMContext& context)
|
||||||
{
|
{
|
||||||
return llvm_value_t<T>::get_type(context)->getPointerTo();
|
return llvm::PointerType::get(context, 0);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1149,7 +1149,7 @@ struct llvm_fshl
|
||||||
static llvm::Function* get_fshl(llvm::IRBuilder<>* ir)
|
static llvm::Function* get_fshl(llvm::IRBuilder<>* ir)
|
||||||
{
|
{
|
||||||
const auto _module = ir->GetInsertBlock()->getParent()->getParent();
|
const auto _module = ir->GetInsertBlock()->getParent()->getParent();
|
||||||
return llvm::Intrinsic::getDeclaration(_module, llvm::Intrinsic::fshl, {llvm_value_t<T>::get_type(ir->getContext())});
|
return llvm::Intrinsic::getOrInsertDeclaration(_module, llvm::Intrinsic::fshl, {llvm_value_t<T>::get_type(ir->getContext())});
|
||||||
}
|
}
|
||||||
|
|
||||||
static llvm::Value* fold(llvm::IRBuilder<>* ir, llvm::Value* v1, llvm::Value* v2, llvm::Value* v3)
|
static llvm::Value* fold(llvm::IRBuilder<>* ir, llvm::Value* v1, llvm::Value* v2, llvm::Value* v3)
|
||||||
|
@ -1221,7 +1221,7 @@ struct llvm_fshr
|
||||||
static llvm::Function* get_fshr(llvm::IRBuilder<>* ir)
|
static llvm::Function* get_fshr(llvm::IRBuilder<>* ir)
|
||||||
{
|
{
|
||||||
const auto _module = ir->GetInsertBlock()->getParent()->getParent();
|
const auto _module = ir->GetInsertBlock()->getParent()->getParent();
|
||||||
return llvm::Intrinsic::getDeclaration(_module, llvm::Intrinsic::fshr, {llvm_value_t<T>::get_type(ir->getContext())});
|
return llvm::Intrinsic::getOrInsertDeclaration(_module, llvm::Intrinsic::fshr, {llvm_value_t<T>::get_type(ir->getContext())});
|
||||||
}
|
}
|
||||||
|
|
||||||
static llvm::Value* fold(llvm::IRBuilder<>* ir, llvm::Value* v1, llvm::Value* v2, llvm::Value* v3)
|
static llvm::Value* fold(llvm::IRBuilder<>* ir, llvm::Value* v1, llvm::Value* v2, llvm::Value* v3)
|
||||||
|
@ -2220,7 +2220,7 @@ struct llvm_add_sat
|
||||||
static llvm::Function* get_add_sat(llvm::IRBuilder<>* ir)
|
static llvm::Function* get_add_sat(llvm::IRBuilder<>* ir)
|
||||||
{
|
{
|
||||||
const auto _module = ir->GetInsertBlock()->getParent()->getParent();
|
const auto _module = ir->GetInsertBlock()->getParent()->getParent();
|
||||||
return llvm::Intrinsic::getDeclaration(_module, intr, {llvm_value_t<T>::get_type(ir->getContext())});
|
return llvm::Intrinsic::getOrInsertDeclaration(_module, intr, {llvm_value_t<T>::get_type(ir->getContext())});
|
||||||
}
|
}
|
||||||
|
|
||||||
llvm::Value* eval(llvm::IRBuilder<>* ir) const
|
llvm::Value* eval(llvm::IRBuilder<>* ir) const
|
||||||
|
@ -2303,7 +2303,7 @@ struct llvm_sub_sat
|
||||||
static llvm::Function* get_sub_sat(llvm::IRBuilder<>* ir)
|
static llvm::Function* get_sub_sat(llvm::IRBuilder<>* ir)
|
||||||
{
|
{
|
||||||
const auto _module = ir->GetInsertBlock()->getParent()->getParent();
|
const auto _module = ir->GetInsertBlock()->getParent()->getParent();
|
||||||
return llvm::Intrinsic::getDeclaration(_module, intr, {llvm_value_t<T>::get_type(ir->getContext())});
|
return llvm::Intrinsic::getOrInsertDeclaration(_module, intr, {llvm_value_t<T>::get_type(ir->getContext())});
|
||||||
}
|
}
|
||||||
|
|
||||||
llvm::Value* eval(llvm::IRBuilder<>* ir) const
|
llvm::Value* eval(llvm::IRBuilder<>* ir) const
|
||||||
|
@ -3592,7 +3592,7 @@ public:
|
||||||
llvm::Function* get_intrinsic(llvm::Intrinsic::ID id)
|
llvm::Function* get_intrinsic(llvm::Intrinsic::ID id)
|
||||||
{
|
{
|
||||||
const auto _module = m_ir->GetInsertBlock()->getParent()->getParent();
|
const auto _module = m_ir->GetInsertBlock()->getParent()->getParent();
|
||||||
return llvm::Intrinsic::getDeclaration(_module, id, {get_type<Types>()...});
|
return llvm::Intrinsic::getOrInsertDeclaration(_module, id, {get_type<Types>()...});
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T1, typename T2>
|
template <typename T1, typename T2>
|
||||||
|
|
|
@ -5725,14 +5725,15 @@ static void ppu_initialize2(jit_compiler& jit, const ppu_module<lv2_obj>& module
|
||||||
|
|
||||||
// Define some types
|
// Define some types
|
||||||
const auto _func = FunctionType::get(translator.get_type<void>(), {
|
const auto _func = FunctionType::get(translator.get_type<void>(), {
|
||||||
translator.get_type<u8*>(), // Exec base
|
translator.get_type<u8*>(), // Exec base
|
||||||
translator.GetContextType()->getPointerTo(), // PPU context
|
PointerType::get(jit.get_context(), 0), // PPU context
|
||||||
translator.get_type<u64>(), // Segment address (for PRX)
|
translator.get_type<u64>(), // Segment address (for PRX)
|
||||||
translator.get_type<u8*>(), // Memory base
|
translator.get_type<u8*>(), // Memory base
|
||||||
translator.get_type<u64>(), // r0
|
translator.get_type<u64>(), // r0
|
||||||
translator.get_type<u64>(), // r1
|
translator.get_type<u64>(), // r1
|
||||||
translator.get_type<u64>(), // r2
|
translator.get_type<u64>(), // r2
|
||||||
}, false);
|
},
|
||||||
|
false);
|
||||||
|
|
||||||
// Difference between function name and current location
|
// Difference between function name and current location
|
||||||
const u32 reloc = module_part.is_relocatable ? ::at32(module_part.segs, 0).addr : 0;
|
const u32 reloc = module_part.is_relocatable ? ::at32(module_part.segs, 0).addr : 0;
|
||||||
|
|
|
@ -339,14 +339,15 @@ Function* PPUTranslator::GetSymbolResolver(const ppu_module<lv2_obj>& info)
|
||||||
m_seg0 = m_function->getArg(1);
|
m_seg0 = m_function->getArg(1);
|
||||||
|
|
||||||
const auto ftype = FunctionType::get(get_type<void>(), {
|
const auto ftype = FunctionType::get(get_type<void>(), {
|
||||||
get_type<u8*>(), // Exec base
|
get_type<u8*>(), // Exec base
|
||||||
GetContextType()->getPointerTo(), // PPU context
|
m_ir->getPtrTy(), // PPU context
|
||||||
get_type<u64>(), // Segment address (for PRX)
|
get_type<u64>(), // Segment address (for PRX)
|
||||||
get_type<u8*>(), // Memory base
|
get_type<u8*>(), // Memory base
|
||||||
get_type<u64>(), // r0
|
get_type<u64>(), // r0
|
||||||
get_type<u64>(), // r1
|
get_type<u64>(), // r1
|
||||||
get_type<u64>(), // r2
|
get_type<u64>(), // r2
|
||||||
}, false);
|
},
|
||||||
|
false);
|
||||||
|
|
||||||
// Store function addresses in PPU jumptable using internal resolving instead of patching it externally.
|
// Store function addresses in PPU jumptable using internal resolving instead of patching it externally.
|
||||||
// Because, LLVM processed it extremely slow. (regression)
|
// Because, LLVM processed it extremely slow. (regression)
|
||||||
|
@ -380,7 +381,7 @@ Function* PPUTranslator::GetSymbolResolver(const ppu_module<lv2_obj>& info)
|
||||||
const auto addr_array = new GlobalVariable(*m_module, addr_array_type, false, GlobalValue::PrivateLinkage, ConstantDataArray::get(m_context, vec_addrs));
|
const auto addr_array = new GlobalVariable(*m_module, addr_array_type, false, GlobalValue::PrivateLinkage, ConstantDataArray::get(m_context, vec_addrs));
|
||||||
|
|
||||||
// Create an array of function pointers
|
// Create an array of function pointers
|
||||||
const auto func_table_type = ArrayType::get(ftype->getPointerTo(), functions.size());
|
const auto func_table_type = ArrayType::get(m_ir->getPtrTy(), functions.size());
|
||||||
const auto init_func_table = ConstantArray::get(func_table_type, functions);
|
const auto init_func_table = ConstantArray::get(func_table_type, functions);
|
||||||
const auto func_table = new GlobalVariable(*m_module, func_table_type, false, GlobalVariable::PrivateLinkage, init_func_table);
|
const auto func_table = new GlobalVariable(*m_module, func_table_type, false, GlobalVariable::PrivateLinkage, init_func_table);
|
||||||
|
|
||||||
|
@ -407,7 +408,7 @@ Function* PPUTranslator::GetSymbolResolver(const ppu_module<lv2_obj>& info)
|
||||||
const auto func_pc = ZExt(m_ir->CreateLoad(ptr_inst->getResultElementType(), ptr_inst), get_type<u64>());
|
const auto func_pc = ZExt(m_ir->CreateLoad(ptr_inst->getResultElementType(), ptr_inst), get_type<u64>());
|
||||||
|
|
||||||
ptr_inst = dyn_cast<GetElementPtrInst>(m_ir->CreateGEP(func_table->getValueType(), func_table, {m_ir->getInt64(0), index_value}));
|
ptr_inst = dyn_cast<GetElementPtrInst>(m_ir->CreateGEP(func_table->getValueType(), func_table, {m_ir->getInt64(0), index_value}));
|
||||||
assert(ptr_inst->getResultElementType() == ftype->getPointerTo());
|
assert(ptr_inst->getResultElementType() == m_ir->getPtrTy());
|
||||||
|
|
||||||
const auto faddr = m_ir->CreateLoad(ptr_inst->getResultElementType(), ptr_inst);
|
const auto faddr = m_ir->CreateLoad(ptr_inst->getResultElementType(), ptr_inst);
|
||||||
const auto faddr_int = m_ir->CreatePtrToInt(faddr, get_type<uptr>());
|
const auto faddr_int = m_ir->CreatePtrToInt(faddr, get_type<uptr>());
|
||||||
|
@ -605,7 +606,7 @@ void PPUTranslator::CallFunction(u64 target, Value* indirect)
|
||||||
const auto pos = m_ir->CreateShl(indirect, 1);
|
const auto pos = m_ir->CreateShl(indirect, 1);
|
||||||
const auto ptr = dyn_cast<GetElementPtrInst>(m_ir->CreateGEP(get_type<u8>(), m_exec, pos));
|
const auto ptr = dyn_cast<GetElementPtrInst>(m_ir->CreateGEP(get_type<u8>(), m_exec, pos));
|
||||||
const auto val = m_ir->CreateLoad(get_type<u64>(), ptr);
|
const auto val = m_ir->CreateLoad(get_type<u64>(), ptr);
|
||||||
callee = FunctionCallee(type, m_ir->CreateIntToPtr(m_ir->CreateAnd(val, 0xffff'ffff'ffff), type->getPointerTo()));
|
callee = FunctionCallee(type, m_ir->CreateIntToPtr(m_ir->CreateAnd(val, 0xffff'ffff'ffff), m_ir->getPtrTy()));
|
||||||
|
|
||||||
// Load new segment address
|
// Load new segment address
|
||||||
seg0 = m_ir->CreateShl(m_ir->CreateLShr(val, 48), 13);
|
seg0 = m_ir->CreateShl(m_ir->CreateLShr(val, 48), 13);
|
||||||
|
@ -2782,8 +2783,8 @@ void PPUTranslator::MFOCRF(ppu_opcode_t op)
|
||||||
else if (std::none_of(m_cr + 0, m_cr + 32, [](auto* p) { return p; }))
|
else if (std::none_of(m_cr + 0, m_cr + 32, [](auto* p) { return p; }))
|
||||||
{
|
{
|
||||||
// MFCR (optimized)
|
// MFCR (optimized)
|
||||||
Value* ln0 = m_ir->CreateIntToPtr(m_ir->CreatePtrToInt(m_ir->CreateStructGEP(m_thread_type, m_thread, 99), GetType<uptr>()), GetType<u8[16]>()->getPointerTo());
|
Value* ln0 = m_ir->CreateIntToPtr(m_ir->CreatePtrToInt(m_ir->CreateStructGEP(m_thread_type, m_thread, 99), GetType<uptr>()), m_ir->getPtrTy());
|
||||||
Value* ln1 = m_ir->CreateIntToPtr(m_ir->CreatePtrToInt(m_ir->CreateStructGEP(m_thread_type, m_thread, 115), GetType<uptr>()), GetType<u8[16]>()->getPointerTo());
|
Value* ln1 = m_ir->CreateIntToPtr(m_ir->CreatePtrToInt(m_ir->CreateStructGEP(m_thread_type, m_thread, 115), GetType<uptr>()), m_ir->getPtrTy());
|
||||||
|
|
||||||
ln0 = m_ir->CreateLoad(GetType<u8[16]>(), ln0);
|
ln0 = m_ir->CreateLoad(GetType<u8[16]>(), ln0);
|
||||||
ln1 = m_ir->CreateLoad(GetType<u8[16]>(), ln1);
|
ln1 = m_ir->CreateLoad(GetType<u8[16]>(), ln1);
|
||||||
|
@ -5371,22 +5372,23 @@ MDNode* PPUTranslator::CheckBranchProbability(u32 bo)
|
||||||
|
|
||||||
void PPUTranslator::build_interpreter()
|
void PPUTranslator::build_interpreter()
|
||||||
{
|
{
|
||||||
#define BUILD_VEC_INST(i) { \
|
#define BUILD_VEC_INST(i) \
|
||||||
m_function = llvm::cast<llvm::Function>(m_module->getOrInsertFunction("op_" #i, get_type<void>(), m_thread_type->getPointerTo()).getCallee()); \
|
{ \
|
||||||
std::fill(std::begin(m_globals), std::end(m_globals), nullptr); \
|
m_function = llvm::cast<llvm::Function>(m_module->getOrInsertFunction("op_" #i, get_type<void>(), m_ir->getPtrTy()).getCallee()); \
|
||||||
std::fill(std::begin(m_locals), std::end(m_locals), nullptr); \
|
std::fill(std::begin(m_globals), std::end(m_globals), nullptr); \
|
||||||
IRBuilder<> irb(BasicBlock::Create(m_context, "__entry", m_function)); \
|
std::fill(std::begin(m_locals), std::end(m_locals), nullptr); \
|
||||||
m_ir = &irb; \
|
IRBuilder<> irb(BasicBlock::Create(m_context, "__entry", m_function)); \
|
||||||
m_thread = m_function->getArg(0); \
|
m_ir = &irb; \
|
||||||
ppu_opcode_t op{}; \
|
m_thread = m_function->getArg(0); \
|
||||||
op.vd = 0; \
|
ppu_opcode_t op{}; \
|
||||||
op.va = 1; \
|
op.vd = 0; \
|
||||||
op.vb = 2; \
|
op.va = 1; \
|
||||||
op.vc = 3; \
|
op.vb = 2; \
|
||||||
this->i(op); \
|
op.vc = 3; \
|
||||||
FlushRegisters(); \
|
this->i(op); \
|
||||||
m_ir->CreateRetVoid(); \
|
FlushRegisters(); \
|
||||||
run_transforms(*m_function); \
|
m_ir->CreateRetVoid(); \
|
||||||
|
run_transforms(*m_function); \
|
||||||
}
|
}
|
||||||
|
|
||||||
BUILD_VEC_INST(VADDCUW);
|
BUILD_VEC_INST(VADDCUW);
|
||||||
|
|
|
@ -2538,13 +2538,13 @@ public:
|
||||||
{
|
{
|
||||||
if (b2 != bqbi)
|
if (b2 != bqbi)
|
||||||
{
|
{
|
||||||
auto ins = b2->block->getFirstNonPHI();
|
auto ins = b2->block->getFirstNonPHIIt();
|
||||||
|
|
||||||
if (b2->bb->preds.size() == 1)
|
if (b2->bb->preds.size() == 1)
|
||||||
{
|
{
|
||||||
if (!dt.dominates(bs->getOperand(0), ins))
|
if (!dt.dominates(bs->getOperand(0), ins))
|
||||||
continue;
|
continue;
|
||||||
if (!pdt.dominates(ins, bs))
|
if (!pdt.dominates(&*ins, bs))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
m_ir->SetInsertPoint(ins);
|
m_ir->SetInsertPoint(ins);
|
||||||
|
@ -2607,10 +2607,10 @@ public:
|
||||||
spu_log.trace("Postponed r%u store from block 0x%x (multiple)", i, block_q[bi].first);
|
spu_log.trace("Postponed r%u store from block 0x%x (multiple)", i, block_q[bi].first);
|
||||||
}
|
}
|
||||||
|
|
||||||
ins = edge->getTerminator();
|
ins = edge->getTerminator()->getIterator();
|
||||||
if (!dt.dominates(bs->getOperand(0), ins))
|
if (!dt.dominates(bs->getOperand(0), ins))
|
||||||
continue;
|
continue;
|
||||||
if (!pdt.dominates(ins, bs))
|
if (!pdt.dominates(&*ins, bs))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
m_ir->SetInsertPoint(ins);
|
m_ir->SetInsertPoint(ins);
|
||||||
|
@ -2861,7 +2861,7 @@ public:
|
||||||
|
|
||||||
// Create interpreter table
|
// Create interpreter table
|
||||||
const auto if_type = get_ftype<void, u8*, u8*, u32, u32, u8*, u32, u8*>();
|
const auto if_type = get_ftype<void, u8*, u8*, u32, u32, u8*, u32, u8*>();
|
||||||
m_function_table = new GlobalVariable(*m_module, ArrayType::get(if_type->getPointerTo(), 1ull << m_interp_magn), true, GlobalValue::InternalLinkage, nullptr);
|
m_function_table = new GlobalVariable(*m_module, ArrayType::get(m_ir->getPtrTy(), 1ull << m_interp_magn), true, GlobalValue::InternalLinkage, nullptr);
|
||||||
|
|
||||||
init_luts();
|
init_luts();
|
||||||
|
|
||||||
|
@ -2905,7 +2905,7 @@ public:
|
||||||
m_ir->CreateStore(m_ir->CreateCall(get_intrinsic<u64>(Intrinsic::read_register), {rsp_name}), native_sp);
|
m_ir->CreateStore(m_ir->CreateCall(get_intrinsic<u64>(Intrinsic::read_register), {rsp_name}), native_sp);
|
||||||
|
|
||||||
// Decode (shift) and load function pointer
|
// Decode (shift) and load function pointer
|
||||||
const auto first = m_ir->CreateLoad(if_type->getPointerTo(), m_ir->CreateGEP(if_type->getPointerTo(), m_interp_table, m_ir->CreateLShr(m_interp_op, 32u - m_interp_magn)));
|
const auto first = m_ir->CreateLoad(m_ir->getPtrTy(), m_ir->CreateGEP(m_ir->getPtrTy(), m_interp_table, m_ir->CreateLShr(m_interp_op, 32u - m_interp_magn)));
|
||||||
const auto call0 = m_ir->CreateCall(if_type, first, {m_lsptr, m_thread, m_interp_pc, m_interp_op, m_interp_table, m_interp_7f0, m_interp_regs});
|
const auto call0 = m_ir->CreateCall(if_type, first, {m_lsptr, m_thread, m_interp_pc, m_interp_op, m_interp_table, m_interp_7f0, m_interp_regs});
|
||||||
call0->setCallingConv(CallingConv::GHC);
|
call0->setCallingConv(CallingConv::GHC);
|
||||||
m_ir->CreateRetVoid();
|
m_ir->CreateRetVoid();
|
||||||
|
@ -3049,7 +3049,7 @@ public:
|
||||||
const auto next_pc = itype & spu_itype::branch ? m_interp_pc : m_interp_pc_next;
|
const auto next_pc = itype & spu_itype::branch ? m_interp_pc : m_interp_pc_next;
|
||||||
const auto be32_op = m_ir->CreateLoad(get_type<u32>(), m_ir->CreateGEP(get_type<u8>(), m_lsptr, m_ir->CreateZExt(next_pc, get_type<u64>())));
|
const auto be32_op = m_ir->CreateLoad(get_type<u32>(), m_ir->CreateGEP(get_type<u8>(), m_lsptr, m_ir->CreateZExt(next_pc, get_type<u64>())));
|
||||||
const auto next_op = m_ir->CreateCall(get_intrinsic<u32>(Intrinsic::bswap), {be32_op});
|
const auto next_op = m_ir->CreateCall(get_intrinsic<u32>(Intrinsic::bswap), {be32_op});
|
||||||
const auto next_if = m_ir->CreateLoad(if_type->getPointerTo(), m_ir->CreateGEP(if_type->getPointerTo(), m_interp_table, m_ir->CreateLShr(next_op, 32u - m_interp_magn)));
|
const auto next_if = m_ir->CreateLoad(m_ir->getPtrTy(), m_ir->CreateGEP(m_ir->getPtrTy(), m_interp_table, m_ir->CreateLShr(next_op, 32u - m_interp_magn)));
|
||||||
llvm::cast<LoadInst>(next_if)->setVolatile(true);
|
llvm::cast<LoadInst>(next_if)->setVolatile(true);
|
||||||
|
|
||||||
if (!(itype & spu_itype::branch))
|
if (!(itype & spu_itype::branch))
|
||||||
|
@ -3174,7 +3174,7 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_function_table->setInitializer(ConstantArray::get(ArrayType::get(if_type->getPointerTo(), 1ull << m_interp_magn), iptrs));
|
m_function_table->setInitializer(ConstantArray::get(ArrayType::get(m_ir->getPtrTy(), 1ull << m_interp_magn), iptrs));
|
||||||
m_function_table = nullptr;
|
m_function_table = nullptr;
|
||||||
|
|
||||||
for (auto& f : *_module)
|
for (auto& f : *_module)
|
||||||
|
@ -7784,7 +7784,7 @@ public:
|
||||||
m_ir->CreateStore(splat<u64[2]>(-1).eval(m_ir), m_ir->CreateGEP(get_type<u8>(), m_thread, stack0.value));
|
m_ir->CreateStore(splat<u64[2]>(-1).eval(m_ir), m_ir->CreateGEP(get_type<u8>(), m_thread, stack0.value));
|
||||||
const auto targ = m_ir->CreateAdd(m_ir->CreateLShr(_ret, 32), get_segment_base());
|
const auto targ = m_ir->CreateAdd(m_ir->CreateLShr(_ret, 32), get_segment_base());
|
||||||
const auto type = m_finfo->chunk->getFunctionType();
|
const auto type = m_finfo->chunk->getFunctionType();
|
||||||
const auto fval = m_ir->CreateIntToPtr(targ, type->getPointerTo());
|
const auto fval = m_ir->CreateIntToPtr(targ, m_ir->getPtrTy());
|
||||||
tail_chunk({type, fval}, m_ir->CreateTrunc(m_ir->CreateLShr(link, 32), get_type<u32>()));
|
tail_chunk({type, fval}, m_ir->CreateTrunc(m_ir->CreateLShr(link, 32), get_type<u32>()));
|
||||||
m_ir->SetInsertPoint(fail);
|
m_ir->SetInsertPoint(fail);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue