Я не уверен, какое улучшение вы ожидаете.Хотя, вероятно, и быстрее, ваше определение bf!
слишком монолитно, чтобы быть наподобие, и я ничего не хочу поддерживать.
Исходя из следующих предположений:
- означает совместимость с Swapforthсделать все в стеках без локальных (если вы имеете в виду что-то еще, уточните, пожалуйста)
- Предоставленные значение и маска предоставляются в том же формате, выровненном по правому краю (предполагая, что маска уже сдвинута, создает множество необоснованных комбинаций)
- Для моего окружения я остался с
@
и !
, вам нужно заменить их на wb@
и wb!
Я пришел к следующему коду:
\ duplicate existing bitfield information on stack
: bf_dup ( n1 n2 n3 -- n1 n2 n3 n1 n2 n3)
2dup 2>r ( n1 n2 n3 R: n2 n3)
rot dup >r -rot ( n1 n2 n3 R: n2 n3 n1)
r> 2r> ;
: bf@ ( address mask shift -- val) 2>r @ r> rshift r> and ;
: (mask-old-value) ( addr mask shift -- val) lshift invert swap @ and ;
: (trim-shift-new) ( val addr mask shift -- addr new-value )
2>r swap 2r> ( addr val mask shift)
-rot and ( addr shift val_masked)
swap lshift ;
: bf! ( val address mask shift -- ) bf_dup (mask-old-value) >r
(trim-shift-new)
r> or swap ! ;
Тестирование и применение этих слов намного проще при следующем определении:
\ store address mask shift (zero-based) in this sequence
: bitfield create rot , swap , , does> dup @ swap cell+ dup @ swap cell+ @ ;
hex 2018 7 3 ( address mask shift) bitfield mybitfield