// Iterate over the tuples in the sorter in batches/vectors of the given size void Sorter::VectorizedIterate( CodeGen &codegen, llvm::Value *sorter_ptr, uint32_t vector_size, uint64_t offset, Sorter::VectorizedIterateCallback &callback) const { llvm::Value *start_pos = codegen.Load(SorterProxy::tuples_start, sorter_ptr); llvm::Value *num_tuples = NumTuples(codegen, sorter_ptr); num_tuples = codegen->CreateTrunc(num_tuples, codegen.Int32Type()); if (offset != 0) { start_pos = codegen->CreateConstInBoundsGEP1_32(codegen.CharPtrType(), start_pos, offset); num_tuples = codegen->CreateSub(num_tuples, codegen.Const32(offset)); } lang::VectorizedLoop loop(codegen, num_tuples, vector_size, {}); { // Current loop range auto curr_range = loop.GetCurrentRange(); // Provide an accessor into the sorted space SorterAccess sorter_access(*this, start_pos); // Issue the callback callback.ProcessEntries(codegen, curr_range.start, curr_range.end, sorter_access); // That's it loop.LoopEnd(codegen, {}); } }
// Iterate over the tuples in the sorter in batches/vectors of the given size void Sorter::VectorizedIterate( CodeGen &codegen, llvm::Value *sorter_ptr, uint32_t vector_size, Sorter::VectorizedIterateCallback &callback) const { llvm::Value *start_pos = GetStartPosition(codegen, sorter_ptr); llvm::Value *num_tuples = GetNumberOfStoredTuples(codegen, sorter_ptr); // Determine the number of bytes to skip per vector llvm::Value *vec_sz = codegen.Const32(vector_size); llvm::Value *tuple_size = GetTupleSize(codegen); llvm::Value *skip = codegen->CreateMul(vec_sz, tuple_size); lang::VectorizedLoop loop{ codegen, num_tuples, vector_size, {{"pos", start_pos}}}; { llvm::Value *curr_pos = loop.GetLoopVar(0); auto curr_range = loop.GetCurrentRange(); // Provide an accessor into the sorted space SorterAccess sorter_access{*this, start_pos}; // Issue the callback callback.ProcessEntries(codegen, curr_range.start, curr_range.end, sorter_access); // Bump the pointer by the size of a tuple llvm::Value *next_pos = codegen->CreateInBoundsGEP(curr_pos, skip); loop.LoopEnd(codegen, {next_pos}); } }
// Iterate over the tuples in the sorter in batches/vectors of the given size void Sorter::VectorizedIterate( CodeGen &codegen, llvm::Value *sorter_ptr, uint32_t vector_size, Sorter::VectorizedIterateCallback &callback) const { llvm::Value *start_pos = GetStartPosition(codegen, sorter_ptr); llvm::Value *num_tuples = GetNumberOfStoredTuples(codegen, sorter_ptr); lang::VectorizedLoop loop{codegen, num_tuples, vector_size, {}}; { // Current loop range auto curr_range = loop.GetCurrentRange(); // Provide an accessor into the sorted space SorterAccess sorter_access{*this, start_pos}; // Issue the callback callback.ProcessEntries(codegen, curr_range.start, curr_range.end, sorter_access); // That's it loop.LoopEnd(codegen, {}); } }