The mmx memory copy code is not nearly as efficient as memcpy(), which would make draw_edges_mmx much slower than draw_edges_8_c. Intel(R) Core(TM) i5-5300U CPU @ 2.30GHz: before after draw_edges_8_1724_4_mmx: 8700.5 8751.8 ( 0.99x) draw_edges_8_1724_8_mmx: 10441.7 10558.0 ( 0.99x) draw_edges_8_1724_16_mmx: 10660.7 10799.5 ( 0.99x) draw_edges_128_407_4_mmx: 4202.2 4099.3 ( 1.03x) draw_edges_128_407_8_mmx: 4579.0 4511.3 ( 1.02x) draw_edges_128_407_16_mmx: 5479.7 4729.5 ( 1.16x) draw_edges_1080_31_4_mmx: 1546.7 658.0 ( 2.35x) draw_edges_1080_31_8_mmx: 2745.5 1442.5 ( 1.90x) draw_edges_1080_31_16_mmx: 12511.5 4901.0 ( 2.55x) draw_edges_1920_4_4_mmx: 2659.0 705.0 ( 3.77x) draw_edges_1920_4_4_negstride_mmx: 2643.0 729.0 ( 3.63x) draw_edges_1920_4_8_mmx: 7845.0 2819.0 ( 2.78x) draw_edges_1920_4_8_negstride_mmx: 7777.0 2747.3 ( 2.83x) draw_edges_1920_4_16_mmx: 24583.7 6358.3 ( 3.87x) draw_edges_1920_4_16_negstride_mmx: 24589.0 6367.0 ( 3.86x)