IEEE binary16

Optional width. Off unless -DVECMAT_ENABLE_FP16=ON. It does not change vm_float_t, vm_gemm, or abi.h. Include vecmat/fp16.h directly. vecmat.h does not include it. With the switch off the header is not installed, and vm_gemm_fp16f32 is not a symbol.

vm_fp16_t is IEEE binary16 bits in a uint16_t, not _Float16. vm_fp16_from_f32 rounds ties to even. Inf stays inf. Every NaN becomes 0x7e00. The scalar path keeps subnormals.

vm_gemm_fp16f32 is row-major, no transpose:

void vm_gemm_fp16f32(
    float *c, int ldc,
    const vm_fp16_t *a, int lda,
    const vm_fp16_t *b, int ldb,
    int m, int n, int k,
    float alpha, float beta);

c is f32. a and b are fp16. Leading dimensions are in elements of their own type. This is not vm_gemm: that call takes a layout and transpose flags, and VM_LAYOUT_COL_MAJOR is 0. Accumulators are f32. A long k is not offered as fp16 dot.

vm_fp16_init() installs the scalar slot and calls the generated vm_fp16_modules_register(). A module overrides with vm_fp16_set_gemm(). vm_fp16_note() returns fp16=scalar until then. That note is not vm_cpu_note(). VECMAT_FORCE_ISA does not select this slot.