adds UserProvidedFunctions for NaNBoxing, updates generated files, adapts to new fp API
This commit is contained in:
@ -136,7 +136,28 @@ protected:
|
||||
return (from & mask) | ((from & sign_mask) ? ~mask : 0);
|
||||
}
|
||||
<%functions.each{ it.eachLine { %>
|
||||
${it}<%}%>
|
||||
${it}<%}
|
||||
}
|
||||
if(fcsr != null) {%>
|
||||
Value* NaNBox16(BasicBlock* bb, Value* NaNBox16_val){
|
||||
if(static_cast<uint32_t>(traits::FLEN) == 16)
|
||||
return this->gen_ext(NaNBox16_val, traits::FLEN, false);
|
||||
auto box = this->builder.CreateNot((this->gen_ext(0, 32, false)));
|
||||
return this->gen_ext((this->builder.CreateOr(this->builder.CreateShl(this->gen_ext(box, traits::FLEN), 16), this->gen_ext(NaNBox16_val, traits::FLEN))), traits::FLEN, false);
|
||||
}
|
||||
Value* NaNBox32(BasicBlock* bb, Value* NaNBox32_val){
|
||||
if(static_cast<uint32_t>(traits::FLEN) == 32)
|
||||
return this->gen_ext(NaNBox32_val, traits::FLEN, false);
|
||||
auto box = this->builder.CreateNot((this->gen_ext(0, 64, false)));
|
||||
return this->gen_ext((this->builder.CreateOr(this->builder.CreateShl(this->gen_ext(box, traits::FLEN), 32), this->gen_ext(NaNBox32_val, traits::FLEN))), traits::FLEN, false);
|
||||
}
|
||||
Value* NaNBox64(BasicBlock* bb, Value* NaNBox64_val){
|
||||
if(static_cast<uint32_t>(traits::FLEN) == 64)
|
||||
return this->gen_ext(NaNBox64_val, traits::FLEN, false);
|
||||
auto box = this->builder.CreateNot((this->gen_ext(0, 128, false)));
|
||||
return this->gen_ext((this->builder.CreateOr(this->builder.CreateShl(this->gen_ext(box, traits::FLEN), 64), this->gen_ext(NaNBox64_val, traits::FLEN))), traits::FLEN, false);
|
||||
}
|
||||
|
||||
<%}%>
|
||||
private:
|
||||
/****************************************************************************
|
||||
@ -251,8 +272,6 @@ vm_impl<ARCH>::gen_single_inst_behavior(virt_addr_t &pc, BasicBlock *this_block)
|
||||
// const typename traits::addr_t upper_bits = ~traits::PGMASK;
|
||||
phys_addr_t paddr(pc);
|
||||
auto *const data = (uint8_t *)&instr;
|
||||
if(this->core.has_mmu())
|
||||
paddr = this->core.virt2phys(pc);
|
||||
auto res = this->core.read(paddr, 4, data);
|
||||
if (res != iss::Ok)
|
||||
return std::make_tuple(ILLEGAL_FETCH, nullptr);
|
||||
|
Reference in New Issue
Block a user