void u2048(register complex *a) { u1024(a); u512(a + 1024); u512(a + 1536); upassbig(a,d2048,256); }
NEXT CASE(MULMOD) { ON_OP(); updateIOGas(); m_SPP[0] = m_SP[2] ? u256((u512(m_SP[0]) * u512(m_SP[1])) % m_SP[2]) : 0; }
void u2048(register complex *a) { u512(a); u256(a + 512); u256(a + 768); u512(a + 1024); u512(a + 1536); upass(a,d2048,d1024,256); }
void VM::logGasMem() { unsigned n = (unsigned) m_OP - (unsigned) Instruction::LOG0; constexpr int64_t logDataGas = VMSchedule::logDataGas; m_runGas = toInt63( VMSchedule::logGas + VMSchedule::logTopicGas * n + logDataGas * u512(m_SP[1])); updateMem(memNeed(m_SP[0], m_SP[1])); }
NEXT CASE(SHA3) { ON_OP(); constexpr int64_t sha3Gas = VMSchedule::sha3Gas; constexpr int64_t sha3WordGas = VMSchedule::sha3WordGas; m_runGas = toInt63(sha3Gas + (u512(m_SP[1]) + 31) / 32 * sha3WordGas); updateMem(memNeed(m_SP[0], m_SP[1])); updateIOGas(); uint64_t inOff = (uint64_t)m_SP[0]; uint64_t inSize = (uint64_t)m_SP[1]; m_SPP[0] = (u256)sha3(bytesConstRef(m_mem.data() + inOff, inSize)); }
NEXT CASE(CALLDATALOAD) { ON_OP(); updateIOGas(); size_t const dataSize = m_message->input_size; uint8_t const* const data = m_message->input_data; if (u512(m_SP[0]) + 31 < dataSize) m_SP[0] = (u256)*(h256 const*)(data + (size_t)m_SP[0]); else if (m_SP[0] >= dataSize) m_SP[0] = u256(0); else { h256 r; for (uint64_t i = (uint64_t)m_SP[0], e = (uint64_t)m_SP[0] + (uint64_t)32, j = 0; i < e; ++i, ++j) r[j] = i < dataSize ? data[i] : 0; m_SP[0] = (u256)r; }; }