mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	[ewasm] Polyfill: balance & address.
This commit is contained in:
		
							parent
							
								
									0b023b893e
								
							
						
					
					
						commit
						87e3fbee6c
					
				| @ -59,20 +59,21 @@ function u256_to_address(x1, x2, x3, x4) -> r1, r2, r3 { | |||||||
| 	r3 := x4 | 	r3 := x4 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function bswap16(x) -> y { | function bswap16(x:i32) -> y:i32 { | ||||||
| 	let hi := i64.and(i64.shl(x, 8), 0xff00) | 	let hi:i32 := i32.and(i32.shl(x, 8:i32), 0xff00:i32) | ||||||
| 	let lo := i64.and(i64.shr_u(x, 8), 0xff) | 	let lo:i32 := i32.and(i32.shr_u(x, 8:i32), 0xff:i32) | ||||||
| 	y := i64.or(hi, lo) | 	y := i32.or(hi, lo) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function bswap32(x) -> y { | function bswap32(x:i32) -> y:i32 { | ||||||
| 	let hi := i64.shl(bswap16(x), 16) | 	let hi:i32 := i32.shl(bswap16(x), 16:i32) | ||||||
| 	let lo := bswap16(i64.shr_u(x, 16)) | 	let lo:i32 := bswap16(i32.shr_u(x, 16:i32)) | ||||||
| 	y := i64.or(hi, lo) | 	y := i32.or(hi, lo) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| function bswap64(x) -> y { | function bswap64(x) -> y { | ||||||
| 	let hi := i64.shl(bswap32(x), 32) | 	let hi := i64.shl(i64.extend_i32_u(bswap32(i32.wrap_i64(x))), 32) | ||||||
| 	let lo := bswap32(i64.shr_u(x, 32)) | 	let lo := i64.extend_i32_u(bswap32(i32.wrap_i64(i64.shr_u(x, 32)))) | ||||||
| 	y := i64.or(hi, lo) | 	y := i64.or(hi, lo) | ||||||
| } | } | ||||||
|  | |||||||
| @ -19,14 +19,15 @@ | |||||||
| // NOTE: This file is used to generate `ewasmPolyfills/Interface.h`. | // NOTE: This file is used to generate `ewasmPolyfills/Interface.h`. | ||||||
| 
 | 
 | ||||||
| function address() -> z1, z2, z3, z4 { | function address() -> z1, z2, z3, z4 { | ||||||
| 	eth.getAddress(0:i32) | 	eth.getAddress(12:i32) | ||||||
| 	z1, z2, z3, z4 := mload_internal(0:i32) | 	z1, z2, z3, z4 := mload_address(0:i32) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function balance(x1, x2, x3, x4) -> z1, z2, z3, z4 { | function balance(x1, x2, x3, x4) -> z1, z2, z3, z4 { | ||||||
| 	mstore_address(0:i32, x1, x2, x3, x4) | 	mstore_address(0:i32, x1, x2, x3, x4) | ||||||
| 	eth.getExternalBalance(12:i32, 48:i32) | 	eth.getExternalBalance(12:i32, 32:i32) | ||||||
| 	z1, z2, z3, z4 := mload_internal(32:i32) | 	z3 := i64.load(40:i32) | ||||||
|  | 	z4 := i64.load(32:i32) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function selfbalance() -> z1, z2, z3, z4 { | function selfbalance() -> z1, z2, z3, z4 { | ||||||
| @ -40,13 +41,13 @@ function chainid() -> z1, z2, z3, z4 { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function origin() -> z1, z2, z3, z4 { | function origin() -> z1, z2, z3, z4 { | ||||||
| 	eth.getTxOrigin(0:i32) | 	eth.getTxOrigin(12:i32) | ||||||
| 	z1, z2, z3, z4 := mload_internal(0:i32) | 	z1, z2, z3, z4 := mload_address(0:i32) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function caller() -> z1, z2, z3, z4 { | function caller() -> z1, z2, z3, z4 { | ||||||
| 	eth.getCaller(0:i32) | 	eth.getCaller(12:i32) | ||||||
| 	z1, z2, z3, z4 := mload_internal(0:i32) | 	z1, z2, z3, z4 := mload_address(0:i32) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function callvalue() -> z1, z2, z3, z4 { | function callvalue() -> z1, z2, z3, z4 { | ||||||
| @ -155,8 +156,8 @@ function blockhash(x1, x2, x3, x4) -> z1, z2, z3, z4 { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function coinbase() -> z1, z2, z3, z4 { | function coinbase() -> z1, z2, z3, z4 { | ||||||
| 	eth.getBlockCoinbase(0:i32) | 	eth.getBlockCoinbase(12:i32) | ||||||
| 	z1, z2, z3, z4 := mload_internal(0:i32) | 	z1, z2, z3, z4 := mload_address(0:i32) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function timestamp() -> z1, z2, z3, z4 { | function timestamp() -> z1, z2, z3, z4 { | ||||||
| @ -180,34 +181,10 @@ function mload(x1, x2, x3, x4) -> z1, z2, z3, z4 { | |||||||
| 	z1, z2, z3, z4 := mload_internal(to_internal_i32ptr(x1, x2, x3, x4)) | 	z1, z2, z3, z4 := mload_internal(to_internal_i32ptr(x1, x2, x3, x4)) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function mload_internal(pos:i32) -> z1, z2, z3, z4 { |  | ||||||
| 	z1 := bswap64(i64.load(pos)) |  | ||||||
| 	z2 := bswap64(i64.load(i32.add(pos, 8:i32))) |  | ||||||
| 	z3 := bswap64(i64.load(i32.add(pos, 16:i32))) |  | ||||||
| 	z4 := bswap64(i64.load(i32.add(pos, 24:i32))) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function mstore(x1, x2, x3, x4, y1, y2, y3, y4) { | function mstore(x1, x2, x3, x4, y1, y2, y3, y4) { | ||||||
| 	mstore_internal(to_internal_i32ptr(x1, x2, x3, x4), y1, y2, y3, y4) | 	mstore_internal(to_internal_i32ptr(x1, x2, x3, x4), y1, y2, y3, y4) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function mstore_internal(pos:i32, y1, y2, y3, y4) { |  | ||||||
| 	i64.store(pos, bswap64(y1)) |  | ||||||
| 	i64.store(i32.add(pos, 8:i32), bswap64(y2)) |  | ||||||
| 	i64.store(i32.add(pos, 16:i32), bswap64(y3)) |  | ||||||
| 	i64.store(i32.add(pos, 24:i32), bswap64(y4)) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function mstore_address(pos:i32, a1, a2, a3, a4) { |  | ||||||
| 	a1, a2, a3 := u256_to_address(a1, a2, a3, a4) |  | ||||||
| 	mstore_internal(pos, 0, a1, a2, a3) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function mstore8(x1, x2, x3, x4, y1, y2, y3, y4) { |  | ||||||
| 	let v := u256_to_byte(y1, y2, y3, y4) |  | ||||||
| 	i64.store8(to_internal_i32ptr(x1, x2, x3, x4), v) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Needed? | // Needed? | ||||||
| function msize() -> z1, z2, z3, z4 { | function msize() -> z1, z2, z3, z4 { | ||||||
| 	// TODO implement | 	// TODO implement | ||||||
|  | |||||||
| @ -61,9 +61,49 @@ function memoryguard(x:i64) -> y1, y2, y3, y4 { | |||||||
| 	y4 := x | 	y4 := x | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // Fill `length` bytes starting from `ptr` with `value`. | ||||||
| function memset(ptr:i32, value:i32, length:i32) { | function memset(ptr:i32, value:i32, length:i32) { | ||||||
| 	for { let i:i32 := 0:i32 } i32.lt_u(i, length) { i := i32.add(i, 1:i32) } | 	for { let i:i32 := 0:i32 } i32.lt_u(i, length) { i := i32.add(i, 1:i32) } | ||||||
| 	{ | 	{ | ||||||
| 		i32.store8(i32.add(ptr, i), value) | 		i32.store8(i32.add(ptr, i), value) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | // Writes 256-bits from `pos`, but only set the bottom 160-bits. | ||||||
|  | function mstore_address(pos:i32, a1, a2, a3, a4) { | ||||||
|  | 	a1, a2, a3 := u256_to_address(a1, a2, a3, a4) | ||||||
|  | 	i64.store(pos, 0:i64) | ||||||
|  | 	i32.store(i32.add(pos, 8:i32), 0:i32) | ||||||
|  | 	i32.store(i32.add(pos, 12:i32), bswap32(i32.wrap_i64(a1))) | ||||||
|  | 	i64.store(i32.add(pos, 16:i32), bswap64(a2)) | ||||||
|  | 	i64.store(i32.add(pos, 24:i32), bswap64(a3)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Reads 256-bits from `pos`, but only returns the bottom 160-bits. | ||||||
|  | function mload_address(pos:i32) -> z1, z2, z3, z4 { | ||||||
|  | 	z2 := i64.extend_i32_u(bswap32(i32.load(i32.add(pos, 12:i32)))) | ||||||
|  | 	z3 := bswap64(i64.load(i32.add(pos, 16:i32))) | ||||||
|  | 	z4 := bswap64(i64.load(i32.add(pos, 24:i32))) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Writes 256-bits from `pos`. | ||||||
|  | function mstore_internal(pos:i32, y1, y2, y3, y4) { | ||||||
|  | 	i64.store(pos, bswap64(y1)) | ||||||
|  | 	i64.store(i32.add(pos, 8:i32), bswap64(y2)) | ||||||
|  | 	i64.store(i32.add(pos, 16:i32), bswap64(y3)) | ||||||
|  | 	i64.store(i32.add(pos, 24:i32), bswap64(y4)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Reads 256-bits from `pos`. | ||||||
|  | function mload_internal(pos:i32) -> z1, z2, z3, z4 { | ||||||
|  | 	z1 := bswap64(i64.load(pos)) | ||||||
|  | 	z2 := bswap64(i64.load(i32.add(pos, 8:i32))) | ||||||
|  | 	z3 := bswap64(i64.load(i32.add(pos, 16:i32))) | ||||||
|  | 	z4 := bswap64(i64.load(i32.add(pos, 24:i32))) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Stores one byte at position `x` of value `y`. | ||||||
|  | function mstore8(x1, x2, x3, x4, y1, y2, y3, y4) { | ||||||
|  | 	let v := u256_to_byte(y1, y2, y3, y4) | ||||||
|  | 	i64.store8(to_internal_i32ptr(x1, x2, x3, x4), v) | ||||||
|  | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user