// Tile size: 4x3 // Accumulators: 0-11 // Col regs: zmm12 // Row regs: zmm13-15 // Load col of A vmovaps zmm12, [rax] // Fill 3 cols of B vbroadcastss zmm13, dword ptr [rcx + 0] vbroadcastss zmm14, dword ptr [rcx + 4] vbroadcastss zmm15, dword ptr [rcx + 8] // N.B. Stepping cols in inner loop vfmadd231ps zmm0, zmm12, zmm13 vfmadd231ps zmm4, zmm12, zmm14 vfmadd231ps zmm8, zmm12, zmm15 vmovaps zmm12, [rax+64] vfmadd231ps zmm1, zmm12, zmm13 vfmadd231ps zmm5, zmm12, zmm14 vfmadd231ps zmm9, zmm12, zmm15 vmovaps zmm12, [rax+128] vfmadd231ps zmm2, zmm12, zmm13 vfmadd231ps zmm6, zmm12, zmm14 vfmadd231ps zmm10, zmm12, zmm15 vmovaps zmm12, [rax+192] vfmadd231ps zmm3, zmm12, zmm13 vfmadd231ps zmm7, zmm12, zmm14 vfmadd231ps zmm11, zmm12, zmm15 // Load col of A, switching col! vmovaps zmm13, [rax + 256] // Fill 3 cols of B vbroadcastss zmm14, dword ptr [rcx + 12] vbroadcastss zmm15, dword ptr [rcx + 16] vbroadcastss zmm12, dword ptr [rcx + 20] // N.B. Stepping cols in inner loop vfmadd231ps zmm0, zmm13, zmm14 vfmadd231ps zmm4, zmm13, zmm15 vfmadd231ps zmm8, zmm13, zmm12 vmovaps zmm13, [rax + 320] vfmadd231ps zmm1, zmm13, zmm14 vfmadd231ps zmm5, zmm13, zmm15 vfmadd231ps zmm9, zmm13, zmm12 vmovaps zmm13, [rax + 384] vfmadd231ps zmm2, zmm13, zmm14 vfmadd231ps zmm6, zmm13, zmm15 vfmadd231ps zmm10, zmm13, zmm12 vmovaps zmm13, [rax + 448] vfmadd231ps zmm3, zmm13, zmm14 vfmadd231ps zmm7, zmm13, zmm15 vfmadd231ps zmm11, zmm13, zmm12 add rcx, 24 add rax, 512