Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Optimization: Small changes on many functions V2 (wip) #214

Closed
wants to merge 11 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion era-compiler-tester
34 changes: 23 additions & 11 deletions src/execution.rs
Original file line number Diff line number Diff line change
Expand Up @@ -129,9 +129,8 @@ impl Execution {
}

pub fn clear_registers(&mut self) {
for register in self.registers.iter_mut() {
*register = TaggedValue::new_raw_integer(U256::zero());
}
let empty_integer = TaggedValue::new_raw_integer(U256::zero());
self.registers = [empty_integer; 15];
}

pub fn clear_flags(&mut self) {
Expand Down Expand Up @@ -300,11 +299,12 @@ impl Execution {
let pc = self.current_frame()?.pc;
let raw_opcode = current_context.code_page.get(pc as usize / 4);

let [a, b, c, d] = raw_opcode.0;
let raw_op = match pc % 4 {
3 => (raw_opcode & u64::MAX.into()).as_u64(),
2 => ((raw_opcode >> 64) & u64::MAX.into()).as_u64(),
1 => ((raw_opcode >> 128) & u64::MAX.into()).as_u64(),
_ => ((raw_opcode >> 192) & u64::MAX.into()).as_u64(), // 0
3 => a,
2 => b,
1 => c,
_ => d,
};

Opcode::try_from_raw_opcode(raw_op)
Expand Down Expand Up @@ -389,12 +389,13 @@ impl Stack {
}

pub fn fill_with_zeros(&mut self, value: usize) {
for _ in 0..value {
self.stack.push(TaggedValue {
self.stack.resize(
self.stack.len() + value,
TaggedValue {
value: U256::zero(),
is_pointer: false,
});
}
},
);
}

pub fn get_with_offset(&self, offset: u16, sp: u32) -> Result<TaggedValue, StackError> {
Expand Down Expand Up @@ -474,6 +475,17 @@ impl Heap {
}
}

pub fn store_multiple(&mut self, start_address: u32, values: Vec<U256>) {
let mut start = start_address as usize;
let end = (start + values.len() * 32).min(self.heap.len());
let max_to_store = (end - start) / 32;

for value in &values[..max_to_store] {
value.to_big_endian(&mut self.heap[start..(start + 32)]);
start += 32;
}
}

pub fn read(&self, address: u32) -> U256 {
let mut result = U256::zero();

Expand Down
12 changes: 4 additions & 8 deletions src/op_handlers/opcode_decommit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,18 +23,18 @@ pub fn opcode_decommit(
let mut buffer = [0u8; 32];
code_hash.to_big_endian(&mut buffer);

// gas is payed in advance
// Gas is paid in advance
if vm.decrease_gas(extra_cost).is_err()
|| (!ContractCodeSha256Format::is_valid(&buffer) && !BlobSha256Format::is_valid(&buffer))
{
// we don't actually return an err here
// We don't actually return an err here
vm.set_register(1, TaggedValue::zero());
return Ok(());
}

let (code, was_decommited) = state.decommit(code_hash);
if was_decommited {
// refund it
// Refund it
vm.increase_gas(extra_cost)?;
};

Expand All @@ -52,11 +52,7 @@ pub fn opcode_decommit(

let heap = vm.heaps.get_mut(id).ok_or(HeapError::StoreOutOfBounds)?;

let mut address = 0;
for value in code.iter() {
heap.store(address, *value);
address += 32;
}
heap.store_multiple(0, code);

let pointer = FatPointer {
offset: 0,
Expand Down
12 changes: 5 additions & 7 deletions src/op_handlers/ptr_add.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,18 @@ use crate::{
eravm_error::{EraVmError, OperandError},
execution::Execution,
ptr_operator::{ptr_operands_read, ptr_operands_store},
value::FatPointer,
Opcode,
};

pub fn ptr_add(vm: &mut Execution, opcode: &Opcode) -> Result<(), EraVmError> {
let (pointer, diff, src0) = ptr_operands_read(vm, opcode)?;
let (mut pointer, diff, src0) = ptr_operands_read(vm, opcode)?;

let (new_offset, overflow) = pointer.offset.overflowing_add(diff);
if overflow {
return Err(OperandError::Overflow(opcode.variant).into());
}
let new_pointer = FatPointer {
offset: new_offset,
..pointer
};
ptr_operands_store(vm, opcode, new_pointer, src0)

pointer.offset = new_offset;

ptr_operands_store(vm, opcode, pointer, src0)
}
12 changes: 10 additions & 2 deletions src/op_handlers/ptr_pack.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,18 @@ pub fn ptr_pack(vm: &mut Execution, opcode: &Opcode) -> Result<(), EraVmError> {
return Err(OperandError::InvalidSrcPointer(opcode.variant).into());
}

if src1.value & U256::from(u128::MAX) != U256::zero() {
// Check if lower 128 bytes are zero
if (src1.value.0[0] | src1.value.0[1]) != 0 {
return Err(OperandError::Src1LowNotZero(opcode.variant).into());
}

let res = TaggedValue::new_pointer(((src0.value << 128) >> 128) | src1.value);
let mut value = U256::zero();

value.0[3] = src1.value.0[3];
value.0[2] = src1.value.0[2];
value.0[1] = src0.value.0[1];
value.0[0] = src0.value.0[0];

let res = TaggedValue::new_pointer(value);
address_operands_store(vm, opcode, res)
}
12 changes: 5 additions & 7 deletions src/op_handlers/ptr_shrink.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,18 @@ use crate::{
eravm_error::{EraVmError, OperandError},
execution::Execution,
ptr_operator::{ptr_operands_read, ptr_operands_store},
value::FatPointer,
Opcode,
};

pub fn ptr_shrink(vm: &mut Execution, opcode: &Opcode) -> Result<(), EraVmError> {
let (pointer, diff, src0) = ptr_operands_read(vm, opcode)?;
let (mut pointer, diff, src0) = ptr_operands_read(vm, opcode)?;

let (new_len, overflow) = pointer.len.overflowing_sub(diff);
if overflow {
return Err(OperandError::Overflow(opcode.variant).into());
}
let new_pointer = FatPointer {
len: new_len,
..pointer
};
ptr_operands_store(vm, opcode, new_pointer, src0)

pointer.len = new_len;

ptr_operands_store(vm, opcode, pointer, src0)
}
11 changes: 4 additions & 7 deletions src/op_handlers/ptr_sub.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,17 @@ use crate::{
eravm_error::{EraVmError, OperandError},
execution::Execution,
ptr_operator::{ptr_operands_read, ptr_operands_store},
value::FatPointer,
Opcode,
};

pub fn ptr_sub(vm: &mut Execution, opcode: &Opcode) -> Result<(), EraVmError> {
let (pointer, diff, src0) = ptr_operands_read(vm, opcode)?;
let (mut pointer, diff, src0) = ptr_operands_read(vm, opcode)?;

let (new_offset, overflow) = pointer.offset.overflowing_sub(diff);
if overflow {
return Err(OperandError::Overflow(opcode.variant).into());
}
let new_pointer = FatPointer {
offset: new_offset,
..pointer
};
ptr_operands_store(vm, opcode, new_pointer, src0)
pointer.offset = new_offset;

ptr_operands_store(vm, opcode, pointer, src0)
}
2 changes: 2 additions & 0 deletions src/opcode.rs
Original file line number Diff line number Diff line change
Expand Up @@ -141,10 +141,12 @@ impl Opcode {
}
}

#[inline(always)]
fn first_four_bits(value: u8) -> u8 {
value & 0x0f
}

#[inline(always)]
fn second_four_bits(value: u8) -> u8 {
(value & 0xf0) >> 4
}
22 changes: 6 additions & 16 deletions src/vm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -342,21 +342,11 @@ fn set_pc(vm: &mut Execution, opcode: &Opcode) -> Result<(), EraVmError> {
}

fn retrieve_result(vm: &mut Execution) -> Result<Vec<u8>, EraVmError> {
let fat_pointer_src0 = FatPointer::decode(vm.get_register(1).value);
let range = fat_pointer_src0.start..fat_pointer_src0.start + fat_pointer_src0.len;
let mut result: Vec<u8> = vec![0; range.len()];
let end: u32 = (range.end).min(
(vm.heaps
.get(fat_pointer_src0.page)
.ok_or(HeapError::ReadOutOfBounds)?
.len()) as u32,
);
for (i, j) in (range.start..end).enumerate() {
let current_heap = vm
.heaps
.get(fat_pointer_src0.page)
.ok_or(HeapError::ReadOutOfBounds)?;
result[i] = current_heap.read_byte(j);
}
let ptr = FatPointer::decode(vm.get_register(1).value);
let result = vm
.heaps
.get(ptr.page)
.ok_or(HeapError::ReadOutOfBounds)?
.read_unaligned_from_pointer(&ptr)?;
Ok(result)
}
2 changes: 1 addition & 1 deletion zksync-era
Submodule zksync-era updated 37 files
+0 −1 core/lib/multivm/src/versions/era_vm/hook.rs
+0 −28 core/lib/multivm/src/versions/era_vm/logs.rs
+0 −4 core/lib/multivm/src/versions/era_vm/mod.rs
+0 −66 core/lib/multivm/src/versions/era_vm/refunds.rs
+32 −6 core/lib/multivm/src/versions/era_vm/snapshot.rs
+0 −52 core/lib/multivm/src/versions/era_vm/tests/bootloader.rs
+0 −41 core/lib/multivm/src/versions/era_vm/tests/bytecode_publishing.rs
+0 −252 core/lib/multivm/src/versions/era_vm/tests/code_oracle.rs
+0 −80 core/lib/multivm/src/versions/era_vm/tests/default_aa.rs
+0 −35 core/lib/multivm/src/versions/era_vm/tests/gas_limit.rs
+0 −103 core/lib/multivm/src/versions/era_vm/tests/get_used_contracts.rs
+0 −45 core/lib/multivm/src/versions/era_vm/tests/is_write_initial.rs
+0 −199 core/lib/multivm/src/versions/era_vm/tests/l1_tx_execution.rs
+0 −424 core/lib/multivm/src/versions/era_vm/tests/l2_blocks.rs
+0 −21 core/lib/multivm/src/versions/era_vm/tests/mod.rs
+0 −179 core/lib/multivm/src/versions/era_vm/tests/nonce_holder.rs
+0 −209 core/lib/multivm/src/versions/era_vm/tests/refunds.rs
+0 −172 core/lib/multivm/src/versions/era_vm/tests/require_eip712.rs
+0 −177 core/lib/multivm/src/versions/era_vm/tests/rollbacks.rs
+0 −75 core/lib/multivm/src/versions/era_vm/tests/sekp256r1.rs
+0 −78 core/lib/multivm/src/versions/era_vm/tests/simple_execution.rs
+0 −130 core/lib/multivm/src/versions/era_vm/tests/storage.rs
+0 −6 core/lib/multivm/src/versions/era_vm/tests/tester/mod.rs
+0 −262 core/lib/multivm/src/versions/era_vm/tests/tester/transaction_test_info.rs
+0 −312 core/lib/multivm/src/versions/era_vm/tests/tester/vm_tester.rs
+0 −51 core/lib/multivm/src/versions/era_vm/tests/tracing_execution_error.rs
+0 −218 core/lib/multivm/src/versions/era_vm/tests/transfer.rs
+0 −343 core/lib/multivm/src/versions/era_vm/tests/upgrade.rs
+0 −173 core/lib/multivm/src/versions/era_vm/tests/utils.rs
+249 −341 core/lib/multivm/src/versions/era_vm/vm.rs
+55 −0 core/tests/vm-benchmark/bench_results.py
+5 −5 core/tests/vm-benchmark/benches/criterion.rs
+22 −0 core/tests/vm-benchmark/deployment_benchmarks_sources/factorial_it.sol
+20 −0 core/tests/vm-benchmark/deployment_benchmarks_sources/factorial_rec.sol
+26 −0 core/tests/vm-benchmark/deployment_benchmarks_sources/fibonacci_it.sol
+19 −0 core/tests/vm-benchmark/deployment_benchmarks_sources/fibonacci_rec.sol
+8 −0 core/tests/vm-benchmark/deployment_benchmarks_sources/send.sol
Loading