ART: Vectorization opcode implementation fixes
This patch fixes the implementation of the x86 vectorization opcodes.
Change-Id: I0028d54a9fa6edce791b7e3a053002d076798748
Signed-off-by: Razvan A Lupusoru <razvan.a.lupusoru@intel.com>
Signed-off-by: Udayan Banerji <udayan.banerji@intel.com>
Signed-off-by: Philbert Lin <philbert.lin@intel.com>
diff --git a/compiler/dex/quick/x86/codegen_x86.h b/compiler/dex/quick/x86/codegen_x86.h
index 7ad917d..a85e02f 100644
--- a/compiler/dex/quick/x86/codegen_x86.h
+++ b/compiler/dex/quick/x86/codegen_x86.h
@@ -125,7 +125,7 @@
void CompilerInitializeRegAlloc() OVERRIDE;
int VectorRegisterSize() OVERRIDE;
- int NumReservableVectorRegisters(bool fp_used) OVERRIDE;
+ int NumReservableVectorRegisters(bool long_or_fp) OVERRIDE;
// Required for target - miscellaneous.
void AssembleLIR() OVERRIDE;
@@ -479,7 +479,8 @@
void GenFusedLongCmpImmBranch(BasicBlock* bb, RegLocation rl_src1,
int64_t val, ConditionCode ccode);
void GenConstWide(RegLocation rl_dest, int64_t value);
- void GenMultiplyVectorSignedByte(BasicBlock *bb, MIR *mir);
+ void GenMultiplyVectorSignedByte(RegStorage rs_dest_src1, RegStorage rs_src2);
+ void GenMultiplyVectorLong(RegStorage rs_dest_src1, RegStorage rs_src2);
void GenShiftByteVector(BasicBlock *bb, MIR *mir);
void AndMaskVectorRegister(RegStorage rs_src1, uint32_t m1, uint32_t m2, uint32_t m3,
uint32_t m4);
@@ -521,20 +522,18 @@
bool GenInlinedIndexOf(CallInfo* info, bool zero_based);
/**
- * @brief Reserve a fixed number of vector registers from the register pool
- * @details The mir->dalvikInsn.vA specifies an N such that vector registers
- * [0..N-1] are removed from the temporary pool. The caller must call
- * ReturnVectorRegisters before calling ReserveVectorRegisters again.
- * Also sets the num_reserved_vector_regs_ to the specified value
- * @param mir whose vA specifies the number of registers to reserve
+ * @brief Used to reserve a range of vector registers.
+ * @see kMirOpReserveVectorRegisters
+ * @param mir The extended MIR for reservation.
*/
void ReserveVectorRegisters(MIR* mir);
/**
- * @brief Return all the reserved vector registers to the temp pool
- * @details Returns [0..num_reserved_vector_regs_]
+ * @brief Used to return a range of vector registers.
+ * @see kMirOpReturnVectorRegisters
+ * @param mir The extended MIR for returning vector regs.
*/
- void ReturnVectorRegisters();
+ void ReturnVectorRegisters(MIR* mir);
/*
* @brief Load 128 bit constant into vector register.
@@ -684,6 +683,20 @@
*/
void GenSetVector(BasicBlock *bb, MIR *mir);
+ /**
+ * @brief Used to generate code for kMirOpPackedArrayGet.
+ * @param bb The basic block of MIR.
+ * @param mir The mir whose opcode is kMirOpPackedArrayGet.
+ */
+ void GenPackedArrayGet(BasicBlock *bb, MIR *mir);
+
+ /**
+ * @brief Used to generate code for kMirOpPackedArrayPut.
+ * @param bb The basic block of MIR.
+ * @param mir The mir whose opcode is kMirOpPackedArrayPut.
+ */
+ void GenPackedArrayPut(BasicBlock *bb, MIR *mir);
+
/*
* @brief Generate code for a vector opcode.
* @param bb The basic block in which the MIR is from.
@@ -937,20 +950,20 @@
LIR* stack_increment_;
// The list of const vector literals.
- LIR *const_vectors_;
+ LIR* const_vectors_;
/*
* @brief Search for a matching vector literal
- * @param mir A kMirOpConst128b MIR instruction to match.
+ * @param constants An array of size 4 which contains all of 32-bit constants.
* @returns pointer to matching LIR constant, or nullptr if not found.
*/
- LIR *ScanVectorLiteral(MIR *mir);
+ LIR* ScanVectorLiteral(int32_t* constants);
/*
* @brief Add a constant vector literal
- * @param mir A kMirOpConst128b MIR instruction to match.
+ * @param constants An array of size 4 which contains all of 32-bit constants.
*/
- LIR *AddVectorLiteral(MIR *mir);
+ LIR* AddVectorLiteral(int32_t* constants);
InToRegStorageMapping in_to_reg_storage_mapping_;
@@ -970,9 +983,6 @@
static const X86EncodingMap EncodingMap[kX86Last];
private:
- // The number of vector registers [0..N] reserved by a call to ReserveVectorRegisters
- int num_reserved_vector_regs_;
-
void SwapBits(RegStorage result_reg, int shift, int32_t value);
void SwapBits64(RegStorage result_reg, int shift, int64_t value);
};