uint32_t response_length)
{
Gen8NativeInstruction *gen8_insn = &insn->gen8_insn;
- const GenMessageTarget sfid = GEN_SFID_DATAPORT1_DATA_CACHE;
+ const GenMessageTarget sfid = GEN_SFID_DATAPORT1_DATA;
setMessageDescriptor(insn, sfid, msg_length, response_length);
gen8_insn->bits3.gen7_untyped_rw.msg_type = msg_type;
gen8_insn->bits3.gen7_untyped_rw.bti = bti;
unsigned char msg_type, uint32_t msg_length, bool header_present)
{
Gen8NativeInstruction *gen8_insn = &insn->gen8_insn;
- const GenMessageTarget sfid = GEN_SFID_DATAPORT1_DATA_CACHE;
+ const GenMessageTarget sfid = GEN_SFID_DATAPORT1_DATA;
setMessageDescriptor(insn, sfid, msg_length, 0, header_present);
gen8_insn->bits3.gen7_typed_rw.bti = bti;
gen8_insn->bits3.gen7_typed_rw.msg_type = msg_type;
gen8_insn->bits3.gen7_typed_rw.slot = 1;
}
+ void Gen8Encoder::F16TO32(GenRegister dest, GenRegister src0) {
+ MOV(GenRegister::retype(dest, GEN_TYPE_F), GenRegister::retype(src0, GEN_TYPE_HF));
+ }
+
+ void Gen8Encoder::F32TO16(GenRegister dest, GenRegister src0) {
+ MOV(GenRegister::retype(dest, GEN_TYPE_HF), GenRegister::retype(src0, GEN_TYPE_F));
+ }
+
void Gen8Encoder::ATOMIC(GenRegister dst, uint32_t function, GenRegister src, uint32_t bti, uint32_t srcNum) {
GenNativeInstruction *insn = this->next(GEN_OPCODE_SEND);
Gen8NativeInstruction *gen8_insn = &insn->gen8_insn;
this->setSrc0(insn, GenRegister::ud8grf(src.nr, 0));
this->setSrc1(insn, GenRegister::immud(0));
- const GenMessageTarget sfid = GEN_SFID_DATAPORT1_DATA_CACHE;
+ const GenMessageTarget sfid = GEN_SFID_DATAPORT1_DATA;
setMessageDescriptor(insn, sfid, msg_length, response_length);
gen8_insn->bits3.gen7_atomic_op.msg_type = GEN75_P1_UNTYPED_ATOMIC_OP;
gen8_insn->bits3.gen7_atomic_op.bti = bti;
pop();
}
- void Gen8Encoder::MOV_DF(GenRegister dest, GenRegister src0, GenRegister r) {
+ void Gen8Encoder::MOV_DF(GenRegister dest, GenRegister src0, GenRegister tmp) {
GBE_ASSERT((src0.type == GEN_TYPE_F && dest.isdf()) || (src0.isdf() && dest.type == GEN_TYPE_F));
+ GenRegister r = GenRegister::retype(tmp, GEN_TYPE_F);
int w = curr.execWidth;
GenRegister r0;
r0 = GenRegister::h2(r);
alu2(this, GEN_OPCODE_JMPI, GenRegister::ip(), GenRegister::ip(), src);
}
- void Gen8Encoder::patchJMPI(uint32_t insnID, int32_t jumpDistance) {
+ void Gen8Encoder::patchJMPI(uint32_t insnID, int32_t jip, int32_t uip) {
GenNativeInstruction &insn = *(GenNativeInstruction *)&this->store[insnID];
GBE_ASSERT(insnID < this->store.size());
GBE_ASSERT(insn.header.opcode == GEN_OPCODE_JMPI ||
insn.header.opcode == GEN_OPCODE_ENDIF ||
insn.header.opcode == GEN_OPCODE_IF ||
insn.header.opcode == GEN_OPCODE_BRC ||
+ insn.header.opcode == GEN_OPCODE_WHILE ||
insn.header.opcode == GEN_OPCODE_ELSE);
- if (insn.header.opcode == GEN_OPCODE_IF) {
- this->setSrc1(&insn, GenRegister::immd(jumpDistance));
+ if( insn.header.opcode == GEN_OPCODE_WHILE ) {
+ // if this WHILE instruction jump back to an ELSE instruction,
+ // need add distance to go to the next instruction.
+ GenNativeInstruction & insn_else = *(GenNativeInstruction *)&this->store[insnID+jip];
+ if(insn_else.header.opcode == GEN_OPCODE_ELSE) {
+ jip += 2;
+ }
+ }
+
+ if(insn.header.opcode == GEN_OPCODE_ELSE)
+ uip = jip;
+
+ if (insn.header.opcode == GEN_OPCODE_IF ||
+ insn.header.opcode == GEN_OPCODE_ELSE) {
+ Gen8NativeInstruction *gen8_insn = &insn.gen8_insn;
+ this->setSrc0(&insn, GenRegister::immud(0));
+ gen8_insn->bits2.gen8_branch.uip = uip*8;
+ gen8_insn->bits3.gen8_branch.jip = jip*8;
return;
}
else if (insn.header.opcode == GEN_OPCODE_JMPI) {
//jumpDistance'unit is Qword, and the HSW's offset of jmpi is in byte, so multi 8
- jumpDistance = (jumpDistance - 2) * 8;
+ jip = (jip - 2);
}
- this->setSrc1(&insn, GenRegister::immd(jumpDistance));
+ this->setSrc1(&insn, GenRegister::immd(jip*8));
}
void Gen8Encoder::setDst(GenNativeInstruction *insn, GenRegister dest) {