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

SQDMLSL (by element, D)

Test 1: uops

Code:

  sqdmlsl d0, s1, v2.s[1]
  movi v0.16b, 1
  movi v1.16b, 2
  movi v2.16b, 3

(no loop instructions)

1000 unrolls and 1 iteration

Retires: 1.000

Issues: 1.000

Integer unit issues: 0.001

Load/store unit issues: 0.000

SIMD/FP unit issues: 1.000

retire uop (01)cycle (02)schedule uop (52)schedule int uop (53)schedule simd uop (54)dispatch simd uop (57)ldst uops in schedulers (5b)dispatch uop (78)map simd uop (7e)map simd uop inputs (81)? int output thing (e9)? simd retires (ee)
1004303310011100010007590510001000300011000
1004303310011100010007590510001000300011000
1004303310011100010007590510001000300011000
1004303310011100010007590510001000300011000
1004303310011100010007623210311041300011000
1004303310011100010007590510001000300011000
1004303310011100010007590510001000300011000
1004303310011100010007590510001000300011000
1004303310011100010007590510001000300011000
1004303310011100010007590510001000300011000

Test 2: Latency 1->1

Code:

  sqdmlsl d0, s1, v2.s[1]
  movi v0.16b, 1
  movi v1.16b, 2
  movi v2.16b, 3

(fused SUBS/B.cc loop)

100 unrolls and 100 iterations

Result (median cycles for code): 3.0033

retire uop (01)cycle (02)schedule uop (52)schedule int uop (53)schedule simd uop (54)dispatch int uop (56)dispatch simd uop (57)int uops in schedulers (59)ldst uops in schedulers (5b)dispatch uop (78)map int uop (7c)map simd uop (7e)map int uop inputs (7f)map simd uop inputs (81)? int output thing (e9)? simd retires (ee)? int retires (ef)
1020430033101011011000010010000300768905101002001000420030012110000100
1020530066101071011000610010031300768905101002001000420030012110000100
1020430033101011011000010010000300768905101002001000420030012110000100
1020430033101011011000010010000300768905101002001000420030012110000100
1020430033101011011000010010000300768905101002001000420030012110000100
1020430033101011011000010010000300768905101002001000420030012110000100
1020430033101011011000010010000300768905101002001000420030012110000100
1020430033101011011000010010000300768905101002001000420030012110000100
1020430033101011011000010010000300768905101002001000420030012110000100
1020430033101011011000010010000300768905101002001000420030012110000100

1000 unrolls and 10 iterations

Result (median cycles for code): 3.0033

retire uop (01)cycle (02)schedule uop (52)schedule int uop (53)schedule simd uop (54)dispatch int uop (56)dispatch simd uop (57)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 simd uop inputs (81)? int output thing (e9)? simd retires (ee)? int retires (ef)
10024300331002121100002010000070076890510020200100002030000111000010
10024300331002121100002010000070076890510020200100002030000111000010
10024300331002121100002010000070076890510020200100002030000111000010
10024300331002121100002010000070076924710051200100442030000111000010
10024300331002121100002010000070076890510020200100002030000111000010
10024300331002121100002010000070076890510020200100002030000111000010
10024300331002121100002010000070076890510020200100002030000111000010
10024300331002121100002010000070076890510020200100002030000111000010
10024300331002121100002010000070076890510020200100002030000111000010
10024300331002121100002010000070076890510020200100002030000111000010

Test 3: Latency 1->2

Code:

  sqdmlsl d0, s0, v1.s[1]
  movi v0.16b, 1
  movi v1.16b, 2

(fused SUBS/B.cc loop)

100 unrolls and 100 iterations

Result (median cycles for code): 3.0033

retire uop (01)cycle (02)schedule uop (52)schedule int uop (53)schedule simd uop (54)dispatch int uop (56)dispatch simd uop (57)int uops in schedulers (59)ldst uops in schedulers (5b)dispatch uop (78)map int uop (7c)map simd uop (7e)map int uop inputs (7f)map simd uop inputs (81)? int output thing (e9)? simd retires (ee)? int retires (ef)
1020430033101011011000010010000300768905101002001000620030012110000100
1020430033101011011000010010000300768905101002001000420030012110000100
1020430033101011011000010010000300768905101002001000620030012110000100
1020430033101011011000010010000300768905101002001000420030012110000100
1020430033101011011000010010000300768905101002001000420030012110000100
1020430033101011011000010010000300768905101002001000420030012110000100
1020430033101011011000010010000300768905101002001000420030012110000100
1020430033101011011000010010000300768905101002001000420030012110000100
1020430033101011011000010010000300768905101002001000420030012110000100
1020430033101011011000010010000313771635102692041020220030012110000100

1000 unrolls and 10 iterations

Result (median cycles for code): 3.0033

retire uop (01)cycle (02)schedule uop (52)schedule int uop (53)schedule simd uop (54)dispatch int uop (56)dispatch simd uop (57)int uops in schedulers (59)ldst uops in schedulers (5b)dispatch uop (78)map int uop (7c)map simd uop (7e)map int uop inputs (7f)map ldst uop inputs (80)map simd uop inputs (81)? int output thing (e9)? ldst retires (ed)? simd retires (ee)? int retires (ef)
1002430033100212110000201000070768905100202010000200300001101000010
1002430033100212110000201000070768905100202010000200301231101000010
1002430033100212110000201000070768905100202010000200300001101000010
1002430033100212110000201000070768905100202010000200300001101000010
1002430033100212110000201000070768905100202010000200300001101000010
1002430033100212110000201000070768905100202010000200300001101000010
1002430033100212110000201000070768905100202010000200300001101000010
1002430033100212110000201000070768905100202010000200300001101000010
1002430033100212110000201000070768905100202010000200300001101000010
1002430033100212110000201000070768905100202010000200301321101000010

Test 4: Latency 1->3

Code:

  sqdmlsl d0, s1, v0.s[1]
  movi v0.16b, 1
  movi v1.16b, 2

(fused SUBS/B.cc loop)

100 unrolls and 100 iterations

Result (median cycles for code): 3.0033

retire uop (01)cycle (02)schedule uop (52)schedule int uop (53)schedule simd uop (54)dispatch int uop (56)dispatch simd uop (57)int uops in schedulers (59)ldst uops in schedulers (5b)dispatch uop (78)map int uop (7c)map simd uop (7e)map int uop inputs (7f)map simd uop inputs (81)? int output thing (e9)? simd retires (ee)? int retires (ef)
1020430033101011011000010010000300768905101002001000620030018110000100
1020430033101011011000010010000300768905101002001000420030012110000100
1020430033101011011000010010000300768905101002001000420030012110000100
1020430033101011011000010010000300768905101002001000420030012110000100
1020430033101011011000010010000300768905101002001000420030012110000100
1020430033101011011000010010000300768905101002001000420030012110000100
1020430033101011011000010010000300768905101002001000420030012110000100
1020430033101011011000010010000300768905101002001000420030012110000100
1020430033101011011000010010000300768905101002001000420030012110000100
1020430033101011011000010010000300768905101002001000420030012110000100

1000 unrolls and 10 iterations

Result (median cycles for code): 3.0033

retire uop (01)cycle (02)schedule uop (52)schedule int uop (53)schedule simd uop (54)dispatch int uop (56)dispatch simd uop (57)int uops in schedulers (59)ldst uops in schedulers (5b)dispatch uop (78)map int uop (7c)map simd uop (7e)map int uop inputs (7f)map simd uop inputs (81)? int output thing (e9)? simd retires (ee)? int retires (ef)
10024300331002121100002010000707689051002020100002030000111000010
10024300331002121100002010000707689051002020100002030000111000010
10024300331002121100002010000707689051002020100002030000111000010
10024300331002121100002010000707689051002020100002030000111000010
10024300331002121100002010000707689051002020100002030000111000010
10024300331002121100002010000707689051002020100002030000111000010
10024300331002121100002010000707689051002020100002030000111000010
10024300331002121100002010000707689051002020100002030000111000010
10024300331002121100002010000707689051002020100002030000111000010
10024300331002121100002010000707689051002020100002030000111000010

Test 5: throughput

Count: 8

Code:

  movi v0.16b, 0
  sqdmlsl d0, s8, v9.s[1]
  movi v1.16b, 0
  sqdmlsl d1, s8, v9.s[1]
  movi v2.16b, 0
  sqdmlsl d2, s8, v9.s[1]
  movi v3.16b, 0
  sqdmlsl d3, s8, v9.s[1]
  movi v4.16b, 0
  sqdmlsl d4, s8, v9.s[1]
  movi v5.16b, 0
  sqdmlsl d5, s8, v9.s[1]
  movi v6.16b, 0
  sqdmlsl d6, s8, v9.s[1]
  movi v7.16b, 0
  sqdmlsl d7, s8, v9.s[1]
  movi v8.16b, 9
  movi v9.16b, 10

(fused SUBS/B.cc loop)

100 unrolls and 100 iterations

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

retire uop (01)cycle (02)schedule uop (52)schedule int uop (53)schedule simd uop (54)dispatch int uop (56)dispatch simd uop (57)int uops in schedulers (59)ldst uops in schedulers (5b)dispatch uop (78)map int uop (7c)map simd uop (7e)map int uop inputs (7f)map simd uop inputs (81)? int output thing (e9)? simd retires (ee)? int retires (ef)
1602044048380109101800081008001230032005680113200800132002400391160000100
1602044011080110101800091008001330032005280112200800122002400361160000100
1602044008680109101800081008001230032005280112200800122002400361160000100
1602044008680109101800081008001230032005280112200800122002400361160000100
1602044008680109101800081008001230032005280112200800122002400361160000100
1602044008680109101800081008001230032005280112200800122002400361160000100
1602044008680109101800081008001230032005280112200800122002400361160000100
1602044008680109101800081008001230032005280112200800122002400361160000100
1602044008680109101800081008001230032005280112200800122002400361160000100
1602044008680109101800081008001230032005280112200800122002400361160000100

1000 unrolls and 10 iterations

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

retire uop (01)cycle (02)schedule uop (52)schedule int uop (53)schedule simd uop (54)dispatch int uop (56)dispatch simd uop (57)int uops in schedulers (59)ldst uops in schedulers (5b)dispatch uop (78)map int uop (7c)map simd uop (7e)map int uop inputs (7f)map simd uop inputs (81)? int output thing (e9)? simd retires (ee)? int retires (ef)
1600244448380172118016110801653032042080115208010520240531116000010
1600244181280145118013410801343032042080115208010520240321116000010
1600244079680152118014110801413032042880117208010720240000116000010
1600244033880011118000010800003032000080010208000020240000116000010
1600244035580011118000010800003032013680044208003420240000116000010
1600244044780011118000010800003032028080080208007020240000116000010
1600244043880011118000010800003032000080010208000020240000116000010
1600244143280116118010510801053032000080010208000020240000116000010
1600244042480011118000010800003032000080010208000020240000116000010
1600244040380011118000010800003032000080010208000020240000116000010

Test 6: throughput

Count: 12

Code:

  sqdmlsl d0, s12, v13.s[1]
  sqdmlsl d1, s12, v13.s[1]
  sqdmlsl d2, s12, v13.s[1]
  sqdmlsl d3, s12, v13.s[1]
  sqdmlsl d4, s12, v13.s[1]
  sqdmlsl d5, s12, v13.s[1]
  sqdmlsl d6, s12, v13.s[1]
  sqdmlsl d7, s12, v13.s[1]
  sqdmlsl d8, s12, v13.s[1]
  sqdmlsl d9, s12, v13.s[1]
  sqdmlsl d10, s12, v13.s[1]
  sqdmlsl d11, s12, v13.s[1]
  movi v12.16b, 13
  movi v13.16b, 14

(fused SUBS/B.cc loop)

100 unrolls and 100 iterations

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

retire uop (01)cycle (02)schedule uop (52)schedule int uop (53)schedule simd uop (54)dispatch int uop (56)dispatch simd uop (57)int uops in schedulers (59)ldst uops in schedulers (5b)dispatch uop (78)map int uop (7c)map simd uop (7e)map int uop inputs (7f)map simd uop inputs (81)? int output thing (e9)? simd retires (ee)? int retires (ef)
120204600881201051011200041001200083004800441201102001200142003600391120000100
120204600351201071011200061001200103004800361201082001200122003600391120000100
120204600351201051011200041001200083004800361201082001200122003600361120000100
120204600351201051011200041001200083004800361201082001200122003600361120000100
120204600351201051011200041001200083004800361201082001200122003600361120000100
120204600351201051011200041001200083004800361201082001200122003600361120000100
120204600351201051011200041001200083004800361201082001200122003600361120000100
120204600351201051011200041001200083004800361201082001200122003600361120000100
120204600351201051011200041001200083004800361201082001200122003600361120000100
120204600351201051011200041001200083004800361201082001200122003600361120000100

1000 unrolls and 10 iterations

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

retire uop (01)cycle (02)schedule uop (52)schedule int uop (53)schedule simd uop (54)dispatch int uop (56)dispatch simd uop (57)int uops in schedulers (59)ldst uops in schedulers (5b)dispatch uop (78)map int uop (7c)map simd uop (7e)map int uop inputs (7f)map simd uop inputs (81)? int output thing (e9)? simd retires (ee)? int retires (ef)
120025602241200541112004310120055304800521200222012001520360000112000010
120024600351200111112000010120000304800001200102012000020360000112000010
120024600351200111112000010120000304800001200102012000020360000112000010
120024600351200111112000010120000304800001200102012000020360000112000010
120024601091200591112004810120048304800001200102012000020360000112000010
120024600351200111112000010120000304800001200102012000020360000112000010
120024600351200111112000010120000304800001200102012000020360000112000010
120024601111200591112004810120048304800001200102012000020360180112000010
120024600351200111112000010120000304800001200102012000020360153112000010
120024600351200111112000010120000304800001200102012000020360000112000010