const float dy0 = GGML_CPU_FP16_TO_FP32(y[2*ib].d);
const float dy1 = GGML_CPU_FP16_TO_FP32(y[2*ib+1].d);
const float32x4_t nvsc = {
- ggml_ue4m3_to_fp32(x[ib].d[0]),
- ggml_ue4m3_to_fp32(x[ib].d[1]),
- ggml_ue4m3_to_fp32(x[ib].d[2]),
- ggml_ue4m3_to_fp32(x[ib].d[3])
+ GGML_CPU_UE4M3_TO_FP32(x[ib].d[0]),
+ GGML_CPU_UE4M3_TO_FP32(x[ib].d[1]),
+ GGML_CPU_UE4M3_TO_FP32(x[ib].d[2]),
+ GGML_CPU_UE4M3_TO_FP32(x[ib].d[3])
};
const float32x4_t scales = vmulq_f32(nvsc, (float32x4_t){dy0, dy0, dy1, dy1});
#define GGML_CPU_E8M0_TO_FP32_HALF(x) GGML_E8M0_TO_FP32_HALF(x)
#endif
-// Use lookup table for UE4M3 on x86 (faster than bit manipulation)
-#if defined(__AVX__) || defined(__AVX2__) || defined(__AVX512F__)
+// Use lookup table for UE4M3 on x86 and ARM (faster than bit manipulation)
+#if defined(__AVX__) || defined(__AVX2__) || defined(__AVX512F__) || defined(__ARM_NEON)
#define GGML_CPU_UE4M3_TO_FP32(x) ggml_table_f32_ue4m3[(uint8_t)(x)]
#else
#define GGML_CPU_UE4M3_TO_FP32(x) ggml_ue4m3_to_fp32(x)