Also:
Your implementation of B<cond> (16) is missing sign extension of the immediate offset.
ASR (imm) 16bit: RD = (RN >> SIMM) | (RN << (32 - SIMM)); This is bollocks, you are essentially mapping the low bits of RN to the high bits of RD.
Should rather be RD = (signed int) RN >> SIMM;
However, strictly speaking, '>>' is implementation defined for signed types. GCC uses the arithmetical variant, so you should be fine.
Same goes for ASR 16bit (no imm).
All FPU opcodes:
BV else {BV = 0} is missing, it is NOT STICKY (BVS is...)!
BZ = !RD; might be problematic, !float is illegal in the C main standard, though might be ok in a later standard.
use BZ = !(RD == 0f) for increased verbosity.
Also, even though we are pretty much talking about pseudo code, you would have to cast the registers involved to float.
All secondary IALU instructions:
BZ = !(RD&0x7FFFFFFF), have a look at the reference manual.
FIX,FLOAT,FABS: no RM register involved, documentation error.
MOVFS: "move _from_ special register", should be RD=read_memory32(core, offset + RN);