[SLOF] [PATCH v2 1/2] fbuffer: Improve invert-region helper
Nikunj A Dadhania
nikunj at linux.vnet.ibm.com
Mon Aug 3 20:52:15 AEST 2015
Thomas Huth <thuth at redhat.com> writes:
> The introduction of invert-region already speeded up the cursor
> drawing very much. But there is still space for improvement:
> So far invert-region is accessing the memory only byte by byte,
> but with some additional logic that checks the alignment of the
> address and the length of the area, we can also make this function
> to access the memory with half-word, word or long-word accesses.
> With this additional logic, invert-region-x is also no longer
> necessary and thus can be removed.
>
> Signed-off-by: Thomas Huth <thuth at redhat.com>
> ---
> board-js2x/slof/helper.fs | 13 ++++++++-----
> board-qemu/slof/helper.fs | 14 ++++++++++----
> slof/fs/fbuffer.fs | 2 +-
> 3 files changed, 19 insertions(+), 10 deletions(-)
>
> diff --git a/board-js2x/slof/helper.fs b/board-js2x/slof/helper.fs
> index 6030330..1e2b030 100644
> --- a/board-js2x/slof/helper.fs
> +++ b/board-js2x/slof/helper.fs
> @@ -28,9 +28,12 @@
> ;
>
> : invert-region ( addr len -- )
> - 0 ?DO dup dup rb@ -1 xor swap rb! 1+ LOOP drop
> -;
> -
> -: invert-region-x ( addr len -- )
> - /x / 0 ?DO dup dup rx@ -1 xor swap rx! xa1+ LOOP drop
> + 2dup or 7 and CASE
> + 0 OF 3 rshift 0 ?DO dup dup rx@ -1 xor swap rx! xa1+ LOOP ENDOF
> + 4 OF 2 rshift 0 ?DO dup dup rl@ -1 xor swap rl! la1+ LOOP ENDOF
> + 3 and
> + 2 OF 1 rshift 0 ?DO dup dup rw@ -1 xor swap rw! wa1+ LOOP ENDOF
> + dup OF 0 ?DO dup dup rb@ -1 xor swap rb! 1+ LOOP ENDOF
> + ENDCASE
> + drop
> ;
> diff --git a/board-qemu/slof/helper.fs b/board-qemu/slof/helper.fs
> index c807bc6..40d4abc 100644
> --- a/board-qemu/slof/helper.fs
> +++ b/board-qemu/slof/helper.fs
> @@ -33,10 +33,16 @@
> swap -
> ;
>
> -: invert-region ( addr len -- )
> - over swap 0 swap 1 hv-logical-memop drop
> +: invert-region-cs ( addr len cellsize -- )
> + >r over swap r@ rshift r> swap 1 hv-logical-memop drop
> ;
>
> -: invert-region-x ( addr len -- )
> - over swap /x / 3 swap 1 hv-logical-memop drop
> +: invert-region ( addr len -- )
> + 2dup or 7 and CASE
For example if we get ( 1000 107 ) in the stack, we would still do
byte-by-byte, do we need to address this case as well ?
First finish aligned 0x100 length, and then byte-by-byte for 7bytes left?
> + 0 OF 3 invert-region-cs ENDOF
> + 4 OF 2 invert-region-cs ENDOF
> + 3 and
> + 2 OF 1 invert-region-cs ENDOF
> + dup OF 0 invert-region-cs ENDOF
> + ENDCASE
> ;
> diff --git a/slof/fs/fbuffer.fs b/slof/fs/fbuffer.fs
> index fcdd2fa..0128c07 100644
> --- a/slof/fs/fbuffer.fs
> +++ b/slof/fs/fbuffer.fs
> @@ -170,7 +170,7 @@ CREATE bitmap-buffer 400 4 * allot
> ;
>
> : fb8-invert-screen ( -- )
> - frame-buffer-adr screen-height screen-width * screen-depth * invert-region-x
> + frame-buffer-adr screen-height screen-width * screen-depth * invert-region
> ;
>
> : fb8-blink-screen ( -- ) fb8-invert-screen fb8-invert-screen ;
> --
> 1.8.3.1
Nikunj
More information about the SLOF
mailing list