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

LDNP (64-bit)

Test 1: uops

Code:

  ldnp x0, x1, [x6]
  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)
200568610211102010006242100020002000110001000
200455410011100010007290100020002000110001000
200455410011100010007290100020002000110001000
200455410011100010007290100020002000110001000
200455410011100010007290100020002000110001000
200455710011100010007290100020002000110001000
200455510011100010007290100020002000110001000
200455410011100010007290100020002000110001000
200455410011100010007290100020002000110001000
200455410011100010007290100020002000110001000

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

Chain cycles: 3

Code:

  ldnp x0, x1, [x6]
  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.0047

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)
5020570150401083010710001301301000318576027107544010630212200086030020034300091000040100
5020470047401033010310000301031000318584787110214010630212200086022420008300031000040100
5020470047401033010310000301031000318584787110214010630212200086022420008300031000040100
5020470047401033010310000301031000318584787110214010630212200086022420008300031000040100
5020470047401033010310000301031000318584787110214010630212200086022420008300031000040100
5020470047401033010310000301031000318584787110214010630212200086022420008300031000040100
5020470047401033010310000301031000318584787110214010630212200086022420008300031000040100
5020470047401033010310000301031000318584787110214010630212200086022420008300031000040100
5020470047401033010310000301031000318584787110214010630212200086030020034300091000040100
5020470047401033010310000301031000318584787110214010630212200086022420008300031000040100

1000 unrolls and 10 iterations

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

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)
5002570156400183001710001300401000318578567114704001630032200086002020000300031000040010
5002470049400133001310000300101000018590037119954001030020200006002020000300031000040010
5002470049400133001310000300101000018590037119954001030020200006002020000300031000040010
5002470049400133001310000300101000018590037119954001030020200006002020000300031000040010
5002470049400133001310000300101000018590847120284001030020200006002020000300031000040010
5002470057400133001310000300101005218656047145574019430174201046012020034300091000040010
5002470049400133001310000300101000018590037119954001030020200006002020000300031000040010
5002470049400133001310000300101000018590037119954001030020200006002020000300031000040010
5002470051400133001310000300101000018592737121054001030020200006032220104300391000040010
5002570079400213001910002300451000018595167122084001030020200006002020000300031000040010

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

Chain cycles: 3

Code:

  ldnp x0, x1, [x6]
  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)
5020670175401163011310003301621000318564907101384010630212200086022420008300031000040100
5020470047401033010310000301031000318585327110434010630212200086022420008300031000040100
5020470049401033010310000301031000318586137110794010630212200086022420008300031000040100
5020470047401033010310000301031000318584787110214010630212200086022420008300031000040100
5020470047401033010310000301031000318584787110214010630212200086022420008300031000040100
5020470047401033010310000301031000318584787110214010630212200086022420008300031000040100
5020470047401033010310000301031000318584787110214010630212200086022420008300031000040100
5020470047401033010310000301031000318584787110214010630212200086022420008300031000040100
5020470047401033010310000301031000318584787110214010630212200086022420008300031000040100
5020470047401033010310000301031000318584787110214010630212200086022420008300031000040100

1000 unrolls and 10 iterations

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

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)
5002570163400183001710001300401001618624867134104006130069200356002020000300031000040010
5002470047400133001310000300101000018589767119874001030020200006002020000300031000040010
5002470047400133001310000300101000018590847120334001030020200006002020000300031000040010
5002470047400133001310000300101000018590577120234001030020200006002020000300031000040010
5002470047400133001310000300101000018591927120734001030020200006002020000300031000040010
5002470102400133001310000300101000018607317126354001030020200006012020034300091000040010
5002470047400133001310000300101000018589497119754001030020200006002020000300031000040010
5002470047400133001310000300101000018589497119754001030020200006002020000300031000040010
5002470109400133001310000300101000018591657120654001030020200006002020000300031000040010
5002470050400133001310000300101000018589497119754001030020200006002020000300031000040010

Test 4: throughput

Count: 8

Code:

  ldnp x0, x1, [x6]
  ldnp x0, x1, [x6]
  ldnp x0, x1, [x6]
  ldnp x0, x1, [x6]
  ldnp x0, x1, [x6]
  ldnp x0, x1, [x6]
  ldnp x0, x1, [x6]
  ldnp x0, x1, [x6]
  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.5012

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)ldst uops in schedulers (5b)dispatch uop (78)map int uop (7c)map ldst uop (7d)map simd uop (7e)map int uop inputs (7f)map ldst uop inputs (80)? int output thing (e9)? ldst retires (ed)? int retires (ef)
16020540268801311018003010080012300244070080112200160024020016002418000080100
16020440107801091018000810080012300254600080112200160024020016002418000080100
16020440098801091018000810080012300254600080112200160024020016002418000080100
16020440098801091018000810080012300254600080112200160024020016002418000080100
16020440098801091018000810080012300254600080112200160024020016002418000080100
16020440098801091018000810080012300254600080112200160024020016002418000080100
16020440098801091018000810080012300254600080112200160024020016002418000080100
16020440098801091018000810080012300254600080112200160024020016002418000080100
16020440098801091018000810080012300254600080112200160024020016002418000080100
16020440098801091018000810080012300254600080112200160024020016002418000080100

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)
1600254061980039118002810800123024123080022201600242016000018000080010
1600244007080011118000010800003024346680010201600002016000018000080010
1600244005780011118000010800003024346680010201600002016000018000080010
1600244005780011118000010800003043140680010201600002016000018000080010
1600244005780011118000010800003024346680010201600002016000018000080010
1600244005780011118000010800003024346680010201600002016000018000080010
1600244005780011118000010800003024346680010201600002016000018000080010
1600244005780011118000010800003024346680010201600002016000018000080010
1600244005780011118000010800003024346680010201600002016000018000080010
1600244005780011118000010800003024346680010201600002016000018000080010