From 51fb2e19c3bc82aa7a8ff9321a7350d297b20dda Mon Sep 17 00:00:00 2001 From: Stefan Reinauer Date: Fri, 20 Nov 2009 16:37:41 +0000 Subject: [PATCH] =?UTF-8?q?improve=20x@=20and=20x!=20functions,=20at=20lea?= =?UTF-8?q?st=20x@=C2=A0reads=20back=20what=20x!=20wrote,=20now.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: svn://coreboot.org/openbios/trunk/openbios-devel@620 f158a5a8-5612-0410-a976-696ce0be7e32 --- forth/lib/64bit.fs | 12 ++++++++---- kernel/cross.h | 12 ++++++------ 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/forth/lib/64bit.fs b/forth/lib/64bit.fs index bcb0058..b8ea547 100644 --- a/forth/lib/64bit.fs +++ b/forth/lib/64bit.fs @@ -20,6 +20,10 @@ cell /x = constant 64bit? then ; +: 64>32 ( 64bitsigned -- 32bitsigned ) + h# ffffffff and +; + : lxjoin ( quad.lo quad.hi -- o ) d# 32 lshift or ; @@ -37,12 +41,12 @@ cell /x = constant 64bit? ; : unaligned-x@ ( addr - o ) - dup la+ unaligned-l@ swap unaligned-l@ lxjoin + dup la1+ unaligned-l@ 64>32 swap unaligned-l@ 64>32 lxjoin ; -: unaligned-x! ( oaddr o -- ) - 2dup d# 32 rshift unaligned-l! - swap la+ swap h# ffffffff and unaligned-l! +: unaligned-x! ( o oaddr -- ) + >r dup d# 32 rshift r@ unaligned-l! + h# ffffffff and r> la1+ unaligned-l! ; : x@ ( oaddr -- o ) diff --git a/kernel/cross.h b/kernel/cross.h index 52c542d..d4cfff1 100644 --- a/kernel/cross.h +++ b/kernel/cross.h @@ -77,11 +77,11 @@ (unaligned_read_word(addr)|(unaligned_read_word((u8 *)addr+2)<<16)) #define unaligned_write_word(addr, value) \ - write_byte(addr, value & 0xff); write_byte((u8 *)addr+1, value>>8) + write_byte(addr, (value & 0xff)); write_byte((u8 *)(addr+1), (value>>8)) #define unaligned_write_long(addr, value) \ - unaligned_write_word(addr, value & 0xffff); \ - unaligned_write_word(addr + 2, value >> 16) + unaligned_write_word(addr, (value & 0xffff)); \ + unaligned_write_word((addr + 2), (value >> 16)) #endif @@ -93,11 +93,11 @@ ((unaligned_read_word(addr)<<16)|unaligned_read_word((u8 *)addr+2)) #define unaligned_write_word(addr, value) \ - write_byte(addr, value >> 8); write_byte((u8 *)addr+1, value & 0xff) + write_byte(addr, (value >> 8)); write_byte((u8 *)(addr+1), (value & 0xff)) #define unaligned_write_long(addr, value) \ - unaligned_write_word(addr, value >> 16); \ - unaligned_write_word(addr + 2, value & 0xffff) + unaligned_write_word(addr, (value >> 16)); \ + unaligned_write_word((addr + 2), (value & 0xffff)) #endif /* bit width handling */