Beispiel #1
0
bool DatabaseAdapter_DataBlock::Reader::load( const Index& elemno, DataBlock& blk)
{
	m_dbkey.resize( m_domainKeySize);
	m_dbkey.addElem( elemno);
	std::string blkstr;
	if (!m_database->readValue( m_dbkey.ptr(), m_dbkey.size(), blkstr, DatabaseOptions())) return false;
	blk.init( elemno, blkstr.c_str(), blkstr.size(), blkstr.size());
	return true;
}
Beispiel #2
0
bool DatabaseAdapter_DataBlock::Cursor::getBlock( const DatabaseCursorInterface::Slice& key, DataBlock& blk)
{
	if (!key.defined()) return false;
	char const* ki = key.ptr()+m_domainKeySize;
	char const* ke = ki + key.size()-m_domainKeySize;
	Index elemno = unpackIndex( ki, ke);
	DatabaseCursorInterface::Slice blkslice = m_cursor->value();
	blk.init( elemno, blkslice.ptr(), blkslice.size());
	return true;
}
Beispiel #3
0
template<class T> uint64_t test_const(T val) {
  using testfunc = double (*)();
  static const Abi test_abi = {
    .gpUnreserved = RegSet{},
    .gpReserved = x64::abi().gp(),
    .simdUnreserved = RegSet{xmm0},
    .simdReserved = x64::abi().simd() - RegSet{xmm0},
    .calleeSaved = x64::abi().calleeSaved,
    .sf = x64::abi().sf
  };
  static uint8_t code[1000];
  // None of these tests should use any data.
  static uint8_t data_buffer[0];

  CodeBlock main;
  main.init(code, sizeof(code), "test");
  DataBlock data;
  data.init(data_buffer, sizeof(data), "data");

  Vunit unit;
  Vasm vasm{unit};
  Vtext text { main, data };

  auto& v = vasm.main();
  unit.entry = v;

  v << copy{v.cns(val), Vreg{xmm0}};
  v << ret{RegSet{xmm0}};

  optimizeX64(vasm.unit(), test_abi, true /* regalloc */);
  CGMeta fixups;
  LeaseHolder writer{Translator::WriteLease()};
  EXPECT_TRUE(writer.canWrite());
  emitX64(unit, text, fixups, nullptr);
  // The above code might use fixups.literals but shouldn't use anything else.
  fixups.literals.clear();
  EXPECT_TRUE(fixups.empty());

  union { double d; uint64_t c; } u;
  u.d = ((testfunc)code)();
  return u.c;
}