{
regNumber tmpReg = indir->GetSingleTempReg();
- NYI_IF(varTypeIsFloating(indir), "vldr/vstr encoding is not available.");
if (emitIns_valid_imm_for_add(offset, INS_FLAGS_DONT_CARE))
{
if (lsl > 0)
if (lsl > 0)
{
// Then load/store dataReg from/to [memBase + index*scale]
- if (varTypeIsFloating(indir))
- {
- // We require a tmpReg to hold memBase + index*scale
- regNumber tmpReg = indir->GetSingleTempReg();
-
- // add tmpReg, memBase, index << lsl
- emitIns_R_R_R_I(INS_add, EA_PTRSIZE, tmpReg, memBase->gtRegNum, index->gtRegNum, lsl,
- INS_FLAGS_DONT_CARE, INS_OPTS_LSL);
-
- // vldr/vstr
- assert(ins == INS_vldr || ins == INS_vstr);
- emitIns_R_R(ins, attr, dataReg, tmpReg);
- }
- else
- {
- emitIns_R_R_R_I(ins, attr, dataReg, memBase->gtRegNum, index->gtRegNum, lsl,
- INS_FLAGS_DONT_CARE, INS_OPTS_LSL);
- }
+ emitIns_R_R_R_I(ins, attr, dataReg, memBase->gtRegNum, index->gtRegNum, lsl, INS_FLAGS_DONT_CARE,
+ INS_OPTS_LSL);
}
else // no scale
{
// Then load/store dataReg from/to [memBase + index]
- if (varTypeIsFloating(indir))
- {
- NYI_ARM("vldr/vstr not test yet!"); // Not tested yet! Please remove it and verify
- // implemenation.
-
- // We require a tmpReg to hold memBase + index*scale
- regNumber tmpReg = indir->GetSingleTempReg();
-
- // add tmpReg, memBase, index
- emitIns_R_R_R(INS_add, EA_PTRSIZE, tmpReg, memBase->gtRegNum, index->gtRegNum,
- INS_FLAGS_DONT_CARE);
-
- // vldr/vstr
- assert(ins == INS_vldr || ins == INS_vstr);
- emitIns_R_R(ins, attr, dataReg, tmpReg);
- }
- else
- {
- emitIns_R_R_R(ins, attr, dataReg, memBase->gtRegNum, index->gtRegNum);
- }
+ emitIns_R_R_R(ins, attr, dataReg, memBase->gtRegNum, index->gtRegNum);
}
}
}
else // no Index
{
- NYI_IF(varTypeIsFloating(indir), "vldr/vstr encoding is not available.");
if (emitIns_valid_imm_for_ldst_offset(offset, attr))
{
// Then load/store dataReg from/to [memBase + offset]
// This offset can't be contained in the ldr/str instruction, so we need an internal register
info->internalIntCount = 1;
}
- else if (varTypeIsFloating(indirTree))
- {
- // TODO-ARM: We can narrow the condition where an internal register is really required.
- // For example, we don't need an internal regsiter where offset can be contained.
-
- // For float ldr/str(vldr/vstr), we need an internal register to compute address.
- info->internalIntCount = 1;
- }
}
//------------------------------------------------------------------------