return;
}
+ if (e->tag == Iex_Const) {
+ vassert(e->Iex.Const.con->tag == Ico_V256);
+ switch (e->Iex.Const.con->Ico.V256) {
+ case 0x00000000: {
+ HReg vHi = generate_zeroes_V128(env);
+ HReg vLo = newVRegV(env);
+ addInstr(env, mk_vMOVsd_RR(vHi, vLo));
+ *rHi = vHi;
+ *rLo = vLo;
+ return;
+ }
+ default:
+ break; /* give up. Until such time as is necessary. */
+ }
+ }
+
if (e->tag == Iex_Unop) {
switch (e->Iex.Unop.op) {
break;
case Ico_F64i: vex_printf( "F64i{0x%llx}", con->Ico.F64i); break;
case Ico_V128: vex_printf( "V128{0x%04x}", (UInt)(con->Ico.V128)); break;
+ case Ico_V256: vex_printf( "V256{0x%08x}", con->Ico.V256); break;
default: vpanic("ppIRConst");
}
}
c->Ico.V128 = con;
return c;
}
+IRConst* IRConst_V256 ( UInt con )
+{
+ IRConst* c = LibVEX_Alloc(sizeof(IRConst));
+ c->tag = Ico_V256;
+ c->Ico.V256 = con;
+ return c;
+}
/* Constructors -- IRCallee */
case Ico_F64: return Ity_F64;
case Ico_F64i: return Ity_F64;
case Ico_V128: return Ity_V128;
+ case Ico_V256: return Ity_V256;
default: vpanic("typeOfIRConst");
}
}
Ico_F64, /* 64-bit IEEE754 floating */
Ico_F64i, /* 64-bit unsigned int to be interpreted literally
as a IEEE754 double value. */
- Ico_V128 /* 128-bit restricted vector constant, with 1 bit
+ Ico_V128, /* 128-bit restricted vector constant, with 1 bit
(repeated 8 times) for each of the 16 x 1-byte lanes */
+ Ico_V256 /* 256-bit restricted vector constant, with 1 bit
+ (repeated 8 times) for each of the 32 x 1-byte lanes */
}
IRConstTag;
Double F64;
ULong F64i;
UShort V128; /* 16-bit value; see Ico_V128 comment above */
+ UInt V256; /* 32-bit value; see Ico_V256 comment above */
} Ico;
}
IRConst;
extern IRConst* IRConst_F64 ( Double );
extern IRConst* IRConst_F64i ( ULong );
extern IRConst* IRConst_V128 ( UShort );
+extern IRConst* IRConst_V256 ( UInt );
/* Deep-copy an IRConst */
extern IRConst* deepCopyIRConst ( IRConst* );