File size: 2,672 Bytes
b86c469 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | ; MACROGROK — INFER4 (4-input fixed-point binary decision)
; AGC-inspired pseudo-ISA. Not authentic yaYUL. 15 data bits + parity.
; See README.md for Q formats and memory map.
; ===== FIXED / ROM =====
WEIGHTS_Q1_14: DC 2458, -1638, 819, 3277 ; Q1.14
BIAS_Q3_12: DC -256 ; Q3.12
ALPHA_Q1_14: DC 12288 ; 0.75 Q1.14
ONE_Q1_14: DC 16384
OUT_MIN_Q1_14: DC -16384
OUT_MAX_Q1_14: DC 16383
SCORE_MIN_Q3_12: DC -8192
SCORE_MAX_Q3_12: DC 8191
; ===== ERASABLE / RAM =====
INPUT: DS 4
STATE: DS 1
OUTPUT: DS 1
ACC_HI: DS 1
ACC_LO: DS 1
PROD_HI: DS 1
PROD_LO: DS 1
TMP0: DS 1
TMP1: DS 1
FLAGS: DS 1
FLAG_VALID EQU 0001
FLAG_SAT EQU 0002
FLAG_POSITIVE EQU 0004
; ===== PRIMITIVE MACROS =====
; LOAD/STORE/ADD/SUB/MUL16/ADD32/ASR32/CMP/BR* assumed.
MACRO CLR_ACC
CLR ACC_HI
CLR ACC_LO
ENDM
MACRO MAC_Q1_14 a, b
LOAD R0, a
LOAD R1, b
MUL16 R0, R1 ; PROD_HI:PROD_LO
LOAD R2, PROD_HI
LOAD R3, PROD_LO
ASR32 R2:R3, 4
ADD32 ACC_HI:ACC_LO, R2:R3
ENDM
MACRO ACC_TO_Q3_12 dest
ASR32 ACC_HI:ACC_LO, 12
STORE dest, ACC_LO
ENDM
MACRO SAT_Q3_12 value, lo, hi
LOAD R0, value
LOAD R1, lo
CMP R0, R1
BRLT %%LOW
LOAD R1, hi
CMP R0, R1
BRGT %%HIGH
BR %%DONE
%%LOW:
LOAD R0, lo
STORE value, R0
LOAD R1, FLAGS
OR R1, FLAG_SAT
STORE FLAGS, R1
BR %%DONE
%%HIGH:
LOAD R0, hi
STORE value, R0
LOAD R1, FLAGS
OR R1, FLAG_SAT
STORE FLAGS, R1
%%DONE:
ENDM
MACRO DOT4_Q1_14
CLR_ACC
MAC_Q1_14 INPUT+0, WEIGHTS_Q1_14+0
MAC_Q1_14 INPUT+1, WEIGHTS_Q1_14+1
MAC_Q1_14 INPUT+2, WEIGHTS_Q1_14+2
MAC_Q1_14 INPUT+3, WEIGHTS_Q1_14+3
ENDM
MACRO THRESHOLD_Q3_12
LOAD R0, TMP0
CLR R1
CMP R0, R1
BRLT %%NEG
LOAD R0, ONE_Q1_14
STORE TMP1, R0
LOAD R0, FLAGS
OR R0, FLAG_POSITIVE
STORE FLAGS, R0
BR %%DONE
%%NEG:
LOAD R0, OUT_MIN_Q1_14
STORE TMP1, R0
%%DONE:
ENDM
MACRO UPDATE_STATE_3_4
LOAD R0, STATE
ADD R1, R0
ADD R1, R0
ADD R1, R0 ; R1=3*STATE
LOAD R2, TMP1
ADD R1, R2 ; 3*STATE+TARGET
ASR R1, 2 ; /4
STORE STATE, R1
ENDM
; ===== MAIN =====
INFER4:
CLR FLAGS
DOT4_Q1_14
ACC_TO_Q3_12 TMP0
LOAD R0, TMP0
LOAD R1, BIAS_Q3_12
ADD R0, R1
STORE TMP0, R0
SAT_Q3_12 TMP0, SCORE_MIN_Q3_12, SCORE_MAX_Q3_12
THRESHOLD_Q3_12
UPDATE_STATE_3_4
LOAD R0, STATE
STORE OUTPUT, R0
LOAD R0, FLAGS
OR R0, FLAG_VALID
STORE FLAGS, R0
RET
|