Apple M1 Microarchitecture Research by Dougall Johnson

Firestorm: Overview | Base Instructions | SIMD and FP Instructions
Icestorm:  Overview | Base Instructions | SIMD and FP Instructions

UADALP (vector, 2D)

Test 1: uops

Code:

  uadalp v0.2d, v1.4s
  movi v0.16b, 1
  movi v1.16b, 2

(no loop instructions)

1000 unrolls and 1 iteration

Retires: 1.000

Issues: 1.000

Integer unit issues: 0.000

Load/store unit issues: 0.000

SIMD/FP unit issues: 1.000

retire (01)cycle (02)0318191e3f4e51inst issue (52)~issue fp/simd (54)~dispatch fp/simd (57)huge thing fp/simd (5b)60696d6edispatch stall (70)scheduler rewind (75)scheduler stall (76)~dispatch op (78)~map op fp/simd (7e)~map lookup fp/simd (81)8283pipeline redirect (84)85inst all (8c)inst neon or fp (9a)a8accfd5d6ddinst fetch restart (de)e0? fp/simd (ee)f5f6f7f8fd
10043037230006125482510001000100039831313018303730372415328951000100020003037303711100110000073216222702100030383038303830383038
10043037220006125482510001000100039831313018303730372415328951000100020003037303711100110000073216222630100030383038303830383038
10043037230006125482510001000100039831313018303730372415328951000100020003037303711100110000073216222630100030383038303830383038
10043037220006125482510001000100039831313018303730372415328951000100020003037303711100110000073216222630100030383038303830383038
10043037230006125482510001000100039831313018303730372415328951000100020003037303711100110000073116222630100030383038303830383038
10043037230006125482510001000100039831313018303730372415328951000100020003037303711100110000073216222630100030383038303830383038
10043037220006125482510001000100039831313018303730372415328951000100020003037303711100110000073216222630100030383038303830383038
10043037220006125482510001000100039831313018303730372415328951000100020003037303711100110000073216222630100030383038303830383038
10043037230006125482510001000100039831313018303730372415328951000100020003037303711100110000073216222630100030383038303830383038
10043037230006125482510001000100039831313018303730372415328951000100020003037303711100110000073216222630100030383038303830383038

Test 2: Latency 1->1

Code:

  uadalp v0.2d, v1.4s
  movi v0.16b, 1
  movi v1.16b, 2

(fused SUBS/B.cc loop)

100 unrolls and 100 iterations

Result (median cycles for code): 3.0037

retire (01)cycle (02)0308090b18191e1f3a3f4e51inst issue (52)~issue int (53)~issue fp/simd (54)~dispatch int (56)~dispatch fp/simd (57)huge thing int (59)huge thing fp/simd (5b)60696d6edispatch stall (70)scheduler rewind (75)scheduler stall (76)~dispatch op (78)~map op int (7c)~map op fp/simd (7e)~map lookup int (7f)~map lookup fp/simd (81)8283pipeline redirect (84)85inst all (8c)inst branch (8d)inst branch taken (90)inst b.cc (94)inst integer (97)inst neon or fp (9a)9fa0a1a6a7a8a9acc2c5branch mispredict (cb)cdcfd5d6ddinst fetch restart (de)e0? int output thing (e9)? fp/simd (ee)gpr retires (ef)f5f6f7f8fd
10204300372250000000061295482510100100100001001000050042773130300183003730037282653287451010020010000200200003003730037111020110099100100100001000000000000071011611296340100001003003830038300383003830038
10204300372250000000061295482510100100100001001000050042773130300183003730037282653287451010020010000200200003003730037111020110099100100100001000000000000071011611296340100001003003830038300383003830038
10204300372250000000061295482510100100100001001000050042773130300183003730037282653287451010020010000200200003003730037111020110099100100100001000000000000071011611296340100001003003830038300383003830038
10204300372250000000061295482510100100100001001000050042773130300183003730037282653287451010020010000200200003003730037111020110099100100100001000000000000071011611296340100001003003830038300383003830038
10204300372250000000061295482510100100100001001000050042773130300183003730037282653287451010020010000200200003003730037111020110099100100100001000000000000071011611296340100001003003830038300383003830038
10204300372250000000061295392510100100100001001000050042773130300183003730037282653287451010020010000200200003003730037111020110099100100100001000000000000071011611296340100001003003830038300383003830038
10204300372250000000061295482510100100100001001000050042773130300183003730037282653287451010020010000200200003003730037111020110099100100100001000000100000071011611296340100001003003830038300383003830038
10204300372250000000061295482510100100100001001000050042773130300183003730037282653287451010020010000200200003003730037111020110099100100100001000000000000071011611296340100001003003830038300383003830038
10204300372250000000061295482510100100100001001000050042773130300183003730037282653287451010020010000200200003003730037111020110099100100100001000000000000071011611296340100001003003830038300383003830038
10204300372250000000061295482510100100100001001000050042773130300183003730037282653287451010020010000200200003003730037111020110099100100100001000000106000071011611296340100001003003830038300383003830038

1000 unrolls and 10 iterations

Result (median cycles for code): 3.0037

retire (01)cycle (02)031e3f4e51inst issue (52)~issue int (53)~issue fp/simd (54)~dispatch int (56)~dispatch fp/simd (57)huge thing int (59)huge thing fp/simd (5b)60696d6edispatch stall (70)72scheduler rewind (75)scheduler stall (76)~dispatch op (78)~map op int (7c)~map op fp/simd (7e)~map lookup int (7f)~map lookup fp/simd (81)8283pipeline redirect (84)85inst all (8c)inst branch (8d)inst branch taken (90)inst b.cc (94)inst integer (97)inst neon or fp (9a)9fa8acc5cfd5d6ddinst fetch restart (de)e0? fp/simd (ee)gpr retires (ef)f5f6f7f8fd
1002430037225010529548251001010100001010000504277313030018300373003728287032876710010201000020200003003730037111002110910101000010000640216222963010000103003830038300383003830038
1002430037224053629548251001010100001010000504277313130018300373003728287032876710010201000020200003003730037111002110910101000010000640216222963010000103003830038300383003830038
1002430037225072629548251001010100001010000504277313130018300373003728287032876710010201000020200003003730037111002110910101000010000640216222963010000103003830038300383003830038
1002430037225072629548251001010100001010000504277313130018300373003728287032876710010201000020200003003730037111002110910101000010000640316222963010000103003830038300383003830038
100243003722506129548251001010100001010000504277313130018300373003728287032876710010201000020200003003730037111002110910101000010000640216222963010000103003830038300383003830038
100243003722506129548251001010100001010000504277313030018300373003728287032876710010201000020200003003730037111002110910101000010000640217222963010000103003830038300383003830038
100243003722506129548251001010100001010000504277313030018300373003728287032876710010201000020200003003730037111002110910101000010000640216222963010000103003830038300383003830038
100243003722406129548251001010100001010000504277313030018300373003728287032876710010201000020200003003730037111002110910101000010000640216222963010000103003830038300383003830038
100243003722506129548251001010100001010000504277313030018300373003728287032876710010201000020200003003730037111002110910101000010000640216222963010000103003830038300383003830038
100243003722506129548251001010100001010000504277313030018300373003728287032876710010201000020200003003730037111002110910101000010000640216222963010000103003830038300383003830038

Test 3: Latency 1->2

Code:

  uadalp v0.2d, v0.4s
  movi v0.16b, 1

(fused SUBS/B.cc loop)

100 unrolls and 100 iterations

Result (median cycles for code): 3.0037

retire (01)cycle (02)03090b181e3a3f4e51inst issue (52)~issue int (53)~issue fp/simd (54)~dispatch int (56)~dispatch fp/simd (57)huge thing int (59)huge thing fp/simd (5b)60696d6edispatch stall (70)scheduler rewind (75)scheduler stall (76)~dispatch op (78)~map op int (7c)~map op fp/simd (7e)~map lookup int (7f)~map lookup fp/simd (81)8283pipeline redirect (84)85inst all (8c)inst branch (8d)inst branch taken (90)inst b.cc (94)inst integer (97)inst neon or fp (9a)9fa0a1a8a9acc5branch mispredict (cb)cdcfd5d6ddinst fetch restart (de)e0? int output thing (e9)? fp/simd (ee)gpr retires (ef)f5f6f7f8fd
102043003722500090315295472510100100100001001000050042771601300183003730037282716287401010020010008200200163003730037111020110099100100100001000000011171701600296450100001003003830038300383003830038
102043003722500000832295472510100100100001001000050042771601300183003730037282717287401010020010008200200163003730037111020110099100100100001000000011171801600296460100001003003830038300383003830038
10204300372250002760965295472510100100100001001000050042771601300183003730037282716287411010020010008200200163003730037111020110099100100100001000000011171701600296450100001003003830038300383003830038
10204300372250000061295472510100100100001001000050042771601300183003730037282716287411010020010008200200163003730037111020110099100100100001000000011171801600296460100001003003830038300383003830038
10204300372250000061295472510100100100001001000050042771601300183003730037282717287401010020010008200200163003730037111020110099100100100001000000011171801600296460100001003003830038300383003830038
102043003722500000874295472510100100100001001000050042771600300183003730037282717287401010020010008200200163003730037111020110099100100100001000000011171701620296450100001003003830038300383003830038
10204300372250000014929547251010010010000100100005004277160130018300373003728271728740101002001000820020016300373003711102011009910010010000100001022311171701600296450100001003003830038300383003830038
102043003722500000987295472510100100100001001000056042771601300183003730037282716287411010020010008200200163003730037111020110099100100100001000000011171801600296450100001003003830038300383003830038
10204300372240005641907295472510100100100001001000050042771601300183003730037282717287411010020010008200200163003730037111020110099100100100001000000311171701602296460100001003003830038300383003830038
102043003722500000985295472510100100100001001000050042771601300183003730037282716287411010020010008200200163003730037111020110099100100100001000000311171701600297140100001003003830038300383003830038

1000 unrolls and 10 iterations

Result (median cycles for code): 3.0037

retire (01)cycle (02)031e3f4e51inst issue (52)~issue int (53)~issue fp/simd (54)~dispatch int (56)~dispatch fp/simd (57)huge thing int (59)huge thing fp/simd (5b)696d6edispatch stall (70)scheduler rewind (75)scheduler stall (76)~dispatch op (78)~map op int (7c)~map op fp/simd (7e)~map lookup int (7f)~map lookup fp/simd (81)8283pipeline redirect (84)85inst all (8c)inst branch (8d)inst branch taken (90)inst b.cc (94)inst integer (97)inst neon or fp (9a)9fa0a1a8acc2branch mispredict (cb)cfd5d6ddinst fetch restart (de)e0? fp/simd (ee)gpr retires (ef)f5f6f7f8fd
10024300372250105295472510010101000010100005042771603001830037300372828632876710010201000020200003003730037111002110910101000010000000640216222962910000103003830038300383003830038
10024300372252761295472510010101000010100005042771603001830037300372828632876710010201000020200003003730037111002110910101000010000000640216232962910000103003830038300383003830038
10024300372250612954725100101010000101000050427716030018300373003728286328767100102010000202000030037300371110021109101010000100054000640216222962910000103003830038300383003830038
10024300372250103295472510010101000010100005042771603001830037300372828632876710010201000020200003003730037111002110910101000010200000640216232962910000103003830038300383003830038
1002430037225061295472510010101000010100005042771603001830037300372828632876710010201000020200003003730037111002110910101000010000000640216232962910000103003830038300383003830038
1002430037225061295472510010101000010100005042771603001830037300372828632876710010201000020200003003730037111002110910101000010000000640217222962910000103003830038300383003830038
1002430037225061295472510010101000010100005042771603001830037300372828632876710010201000020200003003730037111002110910101000010000000640216232962910000103003830038300383003830038
1002430037225082295472510010101000010100005042771603001830037300372828632876710010201000020200003003730037111002110910101000010000000640216222962910000103003830038300383003830038
1002430037225084295472510010101000010100005042771603001830037300372828632876710010201000020200003003730037111002110910101000010000000640216222962910000103003830038300383003830038
10024300372250147295472510010101000010100005042771603001830224300372828632876710010201000020200003003730037111002110910101000010000000640216222962910000103003830038300383003830038

Test 4: throughput

Count: 8

Code:

  movi v0.16b, 0
  uadalp v0.2d, v8.4s
  movi v1.16b, 0
  uadalp v1.2d, v8.4s
  movi v2.16b, 0
  uadalp v2.2d, v8.4s
  movi v3.16b, 0
  uadalp v3.2d, v8.4s
  movi v4.16b, 0
  uadalp v4.2d, v8.4s
  movi v5.16b, 0
  uadalp v5.2d, v8.4s
  movi v6.16b, 0
  uadalp v6.2d, v8.4s
  movi v7.16b, 0
  uadalp v7.2d, v8.4s
  movi v8.16b, 9

(fused SUBS/B.cc loop)

100 unrolls and 100 iterations

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

retire (01)cycle (02)03070a3a3f51inst issue (52)~issue int (53)~issue fp/simd (54)~dispatch int (56)~dispatch fp/simd (57)huge thing int (59)huge thing fp/simd (5b)60696d6escheduler rewind (75)scheduler stall (76)~dispatch op (78)~map op int (7c)~map op fp/simd (7e)~map lookup int (7f)~map lookup fp/simd (81)8283pipeline redirect (84)85inst all (8c)inst branch (8d)inst branch taken (90)inst b.cc (94)inst integer (97)inst neon or fp (9a)9fa8c2c5branch mispredict (cb)cdcfd5d6ddinst fetch restart (de)e0? fp/simd (ee)gpr retires (ef)f5f6f7f8fd
1602042006515042357258011610080016100800285006401961200452006520065612801282008002820016005620065200651116020110099100100160000100001111013611161311200621600001002006620066200662006620066
160204200651503345725801161008001610080028500640196120045200652006561280128200800282001600562006520065111602011009910010016000010000111101351516118200621600001002006620066200662006620066
1602042006515155457258011610080016100800285006401961200452006520065612801282008002820016005620065200651116020110099100100160000100001111013414161414200621600001002006620066200662006620066
160204200651503335725801161008001610080028500640196120045200652006561280128200800282001600562006520065111602011009910010016000010000111101351416138200621600001002006620066200662006620066
1602042006515033499258011610080016100800285006401961200452006520065612801282008002820016005620065200651116020110099100100160000100001111013614161314200621600001002006620169201602006620066
160204200651502337825801161008001610080028500640196120045200652006561280128200800282001600562006520065111602011009910010016000010000111101351016138200621600001002006620066200662006620066
1602042006515043412025801161008001610080028500640196020045200652006561280128200800282001600562006520065111602011009910010016000010000111101341316138200621600001002006620066200662006620066
16020420065151134185258011610080016100800285006401960200452006520065612801282008002820016005620065200651116020110099100100160000100001111012713161217200621600001002006620066200662006620066
1602042006515155312225801161008001610080028500640196120045200652006561280128200800282001600562006520065111602011009910010016000010000111101361316148200621600001002006620066200662006620066
1602042006515033457258011610080016100800285006401960200452006520065612801282008002820016005620065200651116020110099100100160000100001111013611161513200621600001002006620066200662006620066

1000 unrolls and 10 iterations

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

retire (01)cycle (02)03071e3a3f51inst issue (52)~issue int (53)~issue fp/simd (54)~dispatch int (56)~dispatch fp/simd (57)huge thing int (59)huge thing fp/simd (5b)5f60696d6escheduler rewind (75)scheduler stall (76)~dispatch op (78)~map op int (7c)~map op fp/simd (7e)~map lookup int (7f)~map lookup fp/simd (81)8283pipeline redirect (84)85inst all (8c)inst branch (8d)inst branch taken (90)inst b.cc (94)inst integer (97)inst neon or fp (9a)9fa8acc2c5cfd0d2icache miss (d3)d5d6d9dadbddinst fetch restart (de)e0eaec? fp/simd (ee)gpr retires (ef)f5f6f7f8fd
160024200871500905129800101080000108000050640000112004120051200603228001020800002016000020060200601116002110910101600001000001002862211254225220057401160000102006120052200612006120061
16002420051150060952780010108000010800005064000011200412006020060322800102080000201600002006020060111600211091010160000100000100316229344229320057402160000102006120061200612006120061
160024200601500005127800101080000108000050640000112004120051200603228001020800002016000020060200601116002110910101600001013001003162233441231020057402160000102006120061200612006120061
160024200601500120452980010108000010800005064000000200412006020051322800102080000201602122013320060211600211091010160000100600100316213254229820057202160000102006120061200612005220052
160024200601500007429800101080000108000050640000002004120060200513228001020800002016000020051200601116002110910101600001000001002861252542231320057402160000102005220061200612005220061
16002420051150000722780010108000010800005064000000200412005120060322800102080000201600002006020060111600211091010160000100000100316229254225720048202160000102006120061200612005220052
16002420060150000892780010108000010800005064000000200412006020060322800102080000201600002005120060111600211091010160000100000100286214344224620057202160000102006120052200612006120061
1600242006015001201162980010108000010800005064000010200412005120051322800102080000201600002006020060111600211091010160000100000100313226344115620057402160000102005220052200612005220061
160024201381500300512780010108000010800005064000000200412006020060322800102080000201600002006020051111600211091010160000100000100316226254124520057202160000102005220061200522006120052
1600242005115000059227800101080000108000050640000002003220060200513228001020800002016000020060200511116002110910101600001000001003561292542131420048401160000102006120061200522005220061

Test 5: throughput

Count: 16

Code:

  uadalp v0.2d, v16.4s
  uadalp v1.2d, v16.4s
  uadalp v2.2d, v16.4s
  uadalp v3.2d, v16.4s
  uadalp v4.2d, v16.4s
  uadalp v5.2d, v16.4s
  uadalp v6.2d, v16.4s
  uadalp v7.2d, v16.4s
  uadalp v8.2d, v16.4s
  uadalp v9.2d, v16.4s
  uadalp v10.2d, v16.4s
  uadalp v11.2d, v16.4s
  uadalp v12.2d, v16.4s
  uadalp v13.2d, v16.4s
  uadalp v14.2d, v16.4s
  uadalp v15.2d, v16.4s
  movi v16.16b, 17

(fused SUBS/B.cc loop)

100 unrolls and 100 iterations

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

retire (01)cycle (02)030b1e1f373f4e51inst issue (52)~issue int (53)~issue fp/simd (54)~dispatch int (56)~dispatch fp/simd (57)huge thing int (59)huge thing fp/simd (5b)60696d6edispatch stall (70)72scheduler rewind (75)scheduler stall (76)~dispatch op (78)~map op int (7c)~map op fp/simd (7e)~map lookup int (7f)~map lookup fp/simd (81)8283pipeline redirect (84)85inst all (8c)inst branch (8d)inst branch taken (90)inst b.cc (94)inst integer (97)inst neon or fp (9a)9fa8acc5branch mispredict (cb)cdcfd5d6ddinst fetch restart (de)e0? fp/simd (ee)gpr retires (ef)f5f6f7f8fd
16020440073300089100300251601081001600081001600205002399131140020400394004819993061999916012020016003220032006440039400481116020110099100100160000100001111011821622400461600001004004040040400404004040040
16020440039300061800300251601081001600081001600205001280132140020400484003919977061999016012020016003220032006440039400481116020110099100100160000100001111011821622400361600001004004040049400404004040040
160204400393000711017300251601081001600081001600205001280132140029400394003919977761999016012020016003220032006440039400391116020110099100100160000100001111011831633400361600001004004040040400404004040040
1602044003930007200174100251601081001600081001600205002399131140020400484003919977061999016012020016003220032006440039400391116020110099100100160000100001111011821622400361600001004004040049400404004040040
160204400483000675017390251601081001600081001600205001280132140020400394003919977061999916012020016003220032006440039400391116020110099100100160000100001111011821622400361600001004004940040400494004040040
16020440039300072000300251601171001600081001600205001280132140020400394003919977061999916012020016003220032006440039400481116020110099100100160000100001111011821622400361600001004004040040400404004040040
16020440039300048000390251601171001600171001600205001280132140029400484003919977061999016012020016003220032006440039400481116020110099100100160000100001111013421621400361600001004004040040400404004040040
16020440039300014700300251601171001600081001600205001280132140020400484003919977061999016012020016003220032006440039400391116020110099100100160000100001111011821622400451600001004004940040400494004040040
16020440048300060300300501601081001600171001600205001280132140020400484003919977061999016012020016003220032006440039400391116020110099100100160000100001111011821622400361600001004004040040400404004040049
16020440039300062700300251601081001600081001600205001280132140020400394004819977061999016012020016003220032006440039400391116020110099100100160000100001111011821622400361600001004004040040400534004040040

1000 unrolls and 10 iterations

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

retire (01)cycle (02)0308090a0b18191e1f373f4e51inst issue (52)~issue int (53)~issue fp/simd (54)~dispatch int (56)~dispatch fp/simd (57)huge thing int (59)huge thing fp/simd (5b)5f6061696d6edispatch stall (70)scheduler rewind (75)scheduler stall (76)~dispatch op (78)~map op int (7c)~map op fp/simd (7e)~map lookup int (7f)~map lookup fp/simd (81)8283pipeline redirect (84)85inst all (8c)inst branch (8d)inst branch taken (90)inst b.cc (94)inst integer (97)inst neon or fp (9a)9fa0a1a6a7a8a9acc2c5cfd0d2icache miss (d3)d5d6d9dadbddinst fetch restart (de)e0eaeb? fp/simd (ee)gpr retires (ef)f5f6f7f8fd
1600244005929900001000174702516002710160000101600005023990271104003040040400481999632002016001020160000203200004003940049111600211091010160000102000104613201013932191312116740176206160000104057340634406614066140648
160024406703051101101093088010419431459816117910161120101612475020172331104055840664407122010553203251613072016117420322284406404051961160021109101016000010200002501320101733125782124740564208160000104059740703406484057840715
160024406703050001111011948809912091241931611111216118510161507502524536110405514082940766201575920394161826221605832032324240783407551311600211091010160000102001146280001018631141552114740676208160000104077740425405504034040575
16002440304303101110652888072176241411610051016087210161168501847292110402414027040578201524420180160367201605822032192040542404611011600211091010160000100221124625001015631141302115540221208160000104004940040400404004940040
1600244004830000000053700470251600111016000010160000502399027110400304004940039199963200291600102016000020320000400494003911160021109101016000010000000000100223113162114440036207160000104004040049400404004040040
16002440049300000000303003400251600101016000010160000502399027110400214004840049199963200291600102016000020320000400394004011160021109101016000010000000000100223114162114340036209160000104005040040400504004040050
16002440049300000000642004602516001010160000101600005012800001104002140049400481999632001916001020160000203200004004940039111600211091010160000100000000001002462241642276400454012160000104004040041400494004040050
16002440049300000000714085460251600101016000010160000502399027010400214004040127199963200191600102016000020320000400394004011160021109101016000010000000000100226216164213440036407160000104005040040400504004040050
16002440049299000000471017460251600271016000010160000501320000110400304004940039199963200291600102016000020320000400524003911160021109101016000010000000000100223113164227640037406160000104005040040400504004040050
1600244004929900000033601762025160011101600171016000050128000001540021400404003919996320019160010201600002032000040049400391116002110910101600001000000000010024112261642244400454018160000104004040040400404004040040