Apple Microarchitecture Research by Dougall Johnson

M1/A14 P-core (Firestorm): Overview | Base Instructions | SIMD and FP Instructions
M1/A14 E-core (Icestorm):  Overview | Base Instructions | SIMD and FP Instructions

LDP (signed offset, 64-bit)

Test 1: uops

Code:

  ldp x0, x1, [x6, #8]
  mov x0, 1
  mov x1, 2
  mov x8, 0

(no loop instructions)

1000 unrolls and 1 iteration

Retires: 2.000

Issues: 1.000

Integer unit issues: 0.001

Load/store unit issues: 1.000

SIMD/FP unit issues: 0.000

retire uop (01)cycle (02)schedule uop (52)schedule int uop (53)schedule ldst uop (55)dispatch ldst uop (58)simd uops in schedulers (5a)dispatch uop (78)map ldst uop (7d)map ldst uop inputs (80)? int output thing (e9)? ldst retires (ed)? int retires (ef)
200584610311103010005188100020002000110001000
200454310011100010005188100020002000110001000
200454310011100010005188100020002000110001000
200454310011100010005188100020002000110001000
200454310011100010005188100020002000110001000
200454310011100010005188100020002000110001000
200454310011100010005188100020002000110001000
200454310011100010005188100020002000110001000
200454310011100010005188100020002000110001000
200454310011100010005188100020002000110001000

Test 2: Latency 1->3 (with chain penalty)

Chain cycles: 3

Code:

  ldp x0, x1, [x6, #8]
  eor x8, x8, x0
  eor x8, x8, x0
  add x6, x6, x8
  mov x0, 1
  mov x1, 2
  mov x8, 0

(fused SUBS/B.cc loop)

100 unrolls and 100 iterations

Result (median cycles for code, minus 3 chain cycles): 4.0042

retire uop (01)cycle (02)schedule uop (52)schedule int uop (53)schedule ldst uop (55)dispatch int uop (56)dispatch ldst uop (58)int uops in schedulers (59)simd uops in schedulers (5a)dispatch uop (78)map int uop (7c)map ldst uop (7d)map int uop inputs (7f)map ldst uop inputs (80)? int output thing (e9)? ldst retires (ed)? int retires (ef)
5020570156401083010710001301301000318558357099754010630212200086022420008300031000040100
5020470049401033010310000301031000318583977109954010630212200086022420008300021000040100
5020470054401033010310000301031000318583707109814010630212200086022420008300021000040100
5020470042401023010210000301031000318583437109714010630212200086022420008300021000040100
5020470042401023010210000301031000318583437109714010630212200086022420008300021000040100
5020470042401023010210000301031000318583437109714010630212200086022420008300021000040100
5020470042401023010210000301031000318583437109714010630212200086022420008300021000040100
5020470042401023010210000301031000318583437109714010630212200086022420008300021000040100
5020470042401023010210000301031000318583437109714010630212200086022420008300021000040100
5020470042401023010210000301031000318583437109714010630212200086029820035300081000040100

1000 unrolls and 10 iterations

Result (median cycles for code, minus 3 chain cycles): 4.0041

retire uop (01)cycle (02)schedule uop (52)schedule int uop (53)schedule ldst uop (55)dispatch int uop (56)dispatch ldst uop (58)int uops in schedulers (59)simd uops in schedulers (5a)dispatch uop (78)map int uop (7c)map ldst uop (7d)map int uop inputs (7f)map ldst uop inputs (80)? int output thing (e9)? ldst retires (ed)? int retires (ef)
5002570156400183001710001300401000318587797119464001630032200086002020000300021000040010
5002470047400133001310000300101000018587607119054001030020200006002020000300021000040010
5002470040400123001210000300101000018587607119054001030020200006002020000300021000040010
5002470040400123001210000300101000018587607119054001030020200006002020000300021000040010
5002470040400123001210000300101001518594137121324006030070200346002020000300021000040010
5002470040400123001210000300101000018587607119054001030020200006002020000300021000040010
5002470040400123001210000300101000018587607119054001030020200006002020000300021000040010
5002470040400123001210000300101000018587607119054001030020200006002020000300021000040010
5002470040400123001210000300101000018587607119054001030020200006002020000300021000040010
5002470040400123001210000300101000018587877119174001030020200006002020000300021000040010

Test 3: Latency 2->3 (with chain penalty)

Chain cycles: 3

Code:

  ldp x0, x1, [x6, #8]
  eor x8, x8, x1
  eor x8, x8, x1
  add x6, x6, x8
  mov x0, 1
  mov x1, 2
  mov x8, 0

(fused SUBS/B.cc loop)

100 unrolls and 100 iterations

Result (median cycles for code, minus 3 chain cycles): 4.0049

retire uop (01)cycle (02)schedule uop (52)schedule int uop (53)schedule ldst uop (55)dispatch int uop (56)dispatch ldst uop (58)int uops in schedulers (59)simd uops in schedulers (5a)dispatch uop (78)map int uop (7c)map ldst uop (7d)map int uop inputs (7f)map ldst uop inputs (80)? int output thing (e9)? ldst retires (ed)? int retires (ef)
5020570150401083010710001301301000318577647108184010630212200086022420008300031000040100
5020470049401033010310000301031000318585327110414010630212200086022420008300031000040100
5020470049401033010310000301031000318585327110414010630212200086022420008300031000040100
5020470049401033010310000301031000318585327110414010630212200086022420008300031000040100
5020470049401033010310000301031000318585327110414010630212200086022420008300031000040100
5020470049401033010310000301031000318585327110414010630212200086022420008300031000040100
5020470049401033010310000301031001518588707111684015230250200346022420008300031000040100
5020470049401033010310000301031000318585327110414010630212200086022420008300031000040100
5020470049401033010310000301031000318585327110414010630212200086022420008300031000040100
5020470049401033010310000301031000318585327110414010630212200086022420008300031000040100

1000 unrolls and 10 iterations

Result (median cycles for code, minus 3 chain cycles): 4.0040

retire uop (01)cycle (02)schedule uop (52)schedule int uop (53)schedule ldst uop (55)dispatch int uop (56)dispatch ldst uop (58)int uops in schedulers (59)simd uops in schedulers (5a)dispatch uop (78)map int uop (7c)map ldst uop (7d)map int uop inputs (7f)map ldst uop inputs (80)? int output thing (e9)? ldst retires (ed)? int retires (ef)
5002570166400183001710001300401000318588337119664001630032200086002020000300021000040010
5002470042400123001210000300101000018588147119254001030020200006002020000300021000040010
5002470045400123001210000300101000018588147119254001030020200006002020000300021000040010
5002470042400123001210000300101000018588417119364001030020200006002020000300021000040010
5002470042400123001210000300101000018588687119474001030020200006002020000300021000040010
5002470042400123001210000300101000018588147119254001030020200006002020000300021000040010
5002470042400123001210000300101000018588147119254001030020200006002020000300021000040010
5002470042400123001210000300101000018588147119254001030020200006002020000300021000040010
5002470042400123001210000300101000018588417119364001030020200006002020000300021000040010
5002470049400123001210000300101000018588957119584001030020200006002020000300021000040010

Test 4: throughput

Count: 8

Code:

  ldp x0, x1, [x6, #8]
  ldp x0, x1, [x6, #8]
  ldp x0, x1, [x6, #8]
  ldp x0, x1, [x6, #8]
  ldp x0, x1, [x6, #8]
  ldp x0, x1, [x6, #8]
  ldp x0, x1, [x6, #8]
  ldp x0, x1, [x6, #8]
  mov x7, x6
  mov x8, x6
  mov x9, x6
  mov x10, x6
  mov x11, x6
  mov x12, x6
  mov x13, x6

(fused SUBS/B.cc loop)

100 unrolls and 100 iterations

Result (median cycles for code divided by count): 0.5013

retire uop (01)cycle (02)schedule uop (52)schedule int uop (53)schedule ldst uop (55)dispatch int uop (56)dispatch ldst uop (58)int uops in schedulers (59)simd uops in schedulers (5a)dispatch uop (78)map int uop (7c)map ldst uop (7d)map int uop inputs (7f)map ldst uop inputs (80)? int output thing (e9)? ldst retires (ed)? int retires (ef)
160205402618013410180033100800123002428948011220016002420016002418000080100
160204401078010910180008100800123002960898011220016002420016002418000080100
160204401058010910180008100800123002707828011220016002420016002418000080100
160204401058010910180008100800123002547268011220016002420016002418000080100
160204401058010910180008100800123002547268011220016002420016002418000080100
160204401058010910180008100800123002547268011220016002420016002418000080100
160204401058010910180008100800123002547268011220016002420016002418000080100
160204401058010910180008100800123002547268011220016002420016002418000080100
160204401058010910180008100800123002547268011220016002420016002418000080100
160204401058010910180008100800123002547268011220016002420016002418000080100

1000 unrolls and 10 iterations

Result (median cycles for code divided by count): 0.5007

retire uop (01)cycle (02)schedule uop (52)schedule int uop (53)schedule ldst uop (55)dispatch int uop (56)dispatch ldst uop (58)int uops in schedulers (59)simd uops in schedulers (5a)dispatch uop (78)map int uop (7c)map ldst uop (7d)map int uop inputs (7f)map ldst uop inputs (80)? int output thing (e9)? ldst retires (ed)? int retires (ef)
1600254052180043118003210800563031880580066201601122016000018000080010
1600244007880011118000010800003024346680010201600002016000018000080010
1600244005780011118000010800003024346680010201600002016000018000080010
1600244005980011118000010800003024346680010201600002016000018000080010
1600244005780011118000010800003024346680010201600002016000018000080010
1600244005780011118000010800003024346680010201600002016000018000080010
1600244005780011118000010800003024346680010201600002016000018000080010
1600244005780011118000010800003024346680010201600002016000018000080010
1600254011580041118003010800003047271280010201600002016000018000080010
1600244006280011118000010800003031456080010201600002016000018000080010