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

SUQADD (vector, 16B)

Test 1: uops

Code:

  suqadd v0.16b, v1.16b
  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.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)
1004303310011100010007590510001000200011000
1004303310011100010007590510001000200011000
1004303310011100010007590510001000200011000
1004303310011100010007590510001000200011000
1004303310011100010007590510001000200011000
1004303310011100010007590510001000200011000
1004303310011100010007590510001000200011000
1004303310011100010007590510001000200011000
1004303310011100010007590510001000200011000
1004303310011100010007590510001000200011000

Test 2: Latency 1->1

Code:

  suqadd v0.16b, v1.16b
  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)
1020430033101011011000010010000300768905101002001000620020008110000100
1020430033101011011000010010000300768905101002001000420020008110000100
1020430033101011011000010010000300768905101002001000420020008110000100
1020430033101011011000010010000300768905101002001000420020008110000100
1020430033101011011000010010000300768905101002001000420020008110000100
1020430033101011011000010010000300768905101002001000420020008110000100
1020430033101011011000010010000300768905101002001000420020008110000100
1020530066101091031000610210031300768905101002001000420020008110000100
1020430033101011011000010010000300768905101002001000420020008110000100
1020430033101011011000010010000300768905101002001000420020008110000100

1000 unrolls and 10 iterations

Result (median cycles for code): 3.0531

retire uop (01)cycle (02)schedule uop (52)schedule int uop (53)schedule simd uop (54)schedule ldst uop (55)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)
1095840923112676961009447767410395667754571041620104782021028111000010
100243064910119231009602210396727738191031922103542020632111000010
100243074910135231011202210462767754271042024104822221034121000010
100243074710135231011202210462637748851038320104302221030121000010
100243077910133211011202010462797763301048424105592021100111000010
100243074710133211011202010462697754011041822104682020878111000010
1482149687139702370101341466215310371677748961038320104372020628111000010
100243064610117211009602010396647757691044720105192020874111000010
100243049210095231007202210297747743651035222103942020726111000010
100253051310093231007002210295677719771021620102412420802131000010

Test 3: Latency 1->2

Code:

  suqadd v0.16b, v0.16b
  movi v0.16b, 1

(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)
1020430033101011011000010010000300768905101002001000420020008110000100
1020430033101011011000010010000300768905101002001000420020008110000100
1020430033101011011000010010000300768905101002001000420020008110000100
1020430033101011011000010010000300768905101002001000420020008110000100
1020430033101011011000010010000300768905101002001000420020008110000100
1020430033101011011000010010000300768905101002001000420020008110000100
1020430033101011011000010010000300768905101002001000420020008110000100
1020430033101011011000010010000300768905101002001000420020008110000100
1020530066101071011000610010031300768905101002001000420020008110000100
1020430033101011011000010010000300768905101002001000420220092110000100

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 ldst uop inputs (80)map simd uop inputs (81)? int output thing (e9)? ldst retires (ed)? simd retires (ee)? int retires (ef)
1002430033100212110000201000007007689051002020010000200200001101000010
1002430033100212110000201000007007689051002020010000200200001101000010
1002430033100212110000201000007007689051002020010000200200001101000010
1002430033100212110000201000007007689051002020010000200200001101000010
1002430033100212110000201000007007689051002020010000200200001101000010
1002430033100212110000201000007007689051002020010000200200001101000010
1002430033100212110000201000007007689051002020010000200200001101000010
10024300331002121100002010000070076890510020200100003743212009617311810001227
1002430033100212110000201000007007689051002020010000200200001101000010
1002430033100212110000201000006807692471005120010048200200001101000010

Test 4: throughput

Count: 8

Code:

  movi v0.16b, 0
  suqadd v0.16b, v8.16b
  movi v1.16b, 0
  suqadd v1.16b, v8.16b
  movi v2.16b, 0
  suqadd v2.16b, v8.16b
  movi v3.16b, 0
  suqadd v3.16b, v8.16b
  movi v4.16b, 0
  suqadd v4.16b, v8.16b
  movi v5.16b, 0
  suqadd v5.16b, v8.16b
  movi v6.16b, 0
  suqadd v6.16b, v8.16b
  movi v7.16b, 0
  suqadd v7.16b, v8.16b
  movi v8.16b, 9

(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)
1602044048580110101800091008001330032005280112200800122001600261160000100
1602044011080110101800091008001330032005280112200800122001600241160000100
1602044008680109101800081008001230032005280112200800122001600241160000100
1602054013280145101800441008004830032005280112200800122001600241160000100
1602044008680109101800081008001230032005280112200800122001600241160000100
1602044008680109101800081008001230032005280112200800122001600241160000100
1602044008680109101800081008001230032005280112200800122001600241160000100
1602044008680109101800081008001230032005280112200800122001600241160000100
1602044008680109101800081008001230032005280112200800122001600241160000100
1602044009980110101800091008001330032005680113200800132001600241160000100

1000 unrolls and 10 iterations

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

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)
1600244377880020118000910800133032000080010208000020160000116000010
1600244132480011118000010800003032000080010208000020160000116000010
1600244042080011118000010800003032000080010208000020160000116000010
1600244039080011118000010800003032000080010208000020160000116000010
1600244039580011118000010800003032000080010208000020160000116000010
1600244042180011118000010800003032000080010208000020160000116000010
1600244038880011118000010800003032000080010208000020160000116000010
1600244041680011118000010800003032000080010208000020160000116000010
1600244041680011118000010800003032000080010208000020160000116000010
1600244039880011118000010800003032000080010208000020160000116000010

Test 5: throughput

Count: 16

Code:

  suqadd v0.16b, v16.16b
  suqadd v1.16b, v16.16b
  suqadd v2.16b, v16.16b
  suqadd v3.16b, v16.16b
  suqadd v4.16b, v16.16b
  suqadd v5.16b, v16.16b
  suqadd v6.16b, v16.16b
  suqadd v7.16b, v16.16b
  suqadd v8.16b, v16.16b
  suqadd v9.16b, v16.16b
  suqadd v10.16b, v16.16b
  suqadd v11.16b, v16.16b
  suqadd v12.16b, v16.16b
  suqadd v13.16b, v16.16b
  suqadd v14.16b, v16.16b
  suqadd v15.16b, v16.16b
  movi v16.16b, 17

(fused SUBS/B.cc loop)

100 unrolls and 100 iterations

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

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)
160204800501601071011600061001600103006400361601082001600122003200241160000100
160204800351601071011600061001600103006400441601102001600142003200241160000100
160204800351601051011600041001600083006400361601082001600122003200241160000100
160204800351601051011600041001600083006400441601102001600142003200241160000100
160204800351601051011600041001600083006400361601082001600122003200241160000100
160204800351601051011600041001600083006400361601082001600122003200241160000100
160204800351601051011600041001600083006400361601082001600122003200241160000100
160204800351601051011600041001600083006400361601082001600122003200241160000100
160204800351601051011600041001600083006400361601082001600122003200241160000100
160204800351601051011600041001600083006400361601082001600122003200241160000100

1000 unrolls and 10 iterations

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

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 ldst uop inputs (80)map simd uop inputs (81)? int output thing (e9)? ldst retires (ed)? simd retires (ee)? int retires (ef)
160024801561600272116000620160010070064000016002020016000020032000011016000010
160024800401600212116000020160000070064000016002020016000020032000011016000010
160024800351600212116000020160000070064000016002020016000020032000011016000010
160024800351600212116000020160000070064000016002020016000020032013411016000010
160024800351600212116000020160000070064000016002020016000020032000011016000010
160024800351600212116000020160000070064000016002020016000020032000011016000010
160025800701600632116004220160054070064000016002020016000020032000011016000010
160024800351600212116000020160000070064000016002020016000020032000011016000010
160024800351600212116000020160000070064000016002020016000020032000011016000010
160024800351600212116000020160000070064000016002020016000020032000011016000010