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

FCVTMU (scalar, S to W)

Test 1: uops

Code:

  fcvtmu w0, s0
  mov x0, 1
  mov x1, 2

(no loop instructions)

1000 unrolls and 1 iteration

Retires: 2.000

Issues: 3.000

Integer unit issues: 1.001

Load/store unit issues: 0.000

SIMD/FP unit issues: 2.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)? int retires (ef)
20041037300110012000200011000200020002000100110001000
20041037300110012000200011000200020002000100110001000
20041037300110012000200011000200020002000100110001000
20041037300110012000200011000200020002000100110001000
20041037300110012000200011000200020002000100110001000
20041037300110012000200011000200020002000100110001000
20041037300110012000200011000200020002000100110001000
20041037300110012000200011000200020002000100110001000
20041037300110012000200011000200020002000100110001000
20041037300110012000200011000200020002000100110001000

Test 2: Latency 1->2 roundtrip

Code:

  fcvtmu w0, s0
  fmov d0, x0
  mov x0, 1
  mov x1, 2

(fused SUBS/B.cc loop)

100 unrolls and 100 iterations

Result (median cycles for code): 10.0033

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)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)
3020410012040110101032000410003100200301003530715487372581480301972021003720075200100192003810003100001000010100
3020410003240101101012000010000100200001001830015469662578483301462001002020040200100572011510007100001000010100
3020410003240101101012000010000100200001000030015467962578206301002001000120003200100012000310001100001000010100
3020410031140128101072001310008100200901005330015493992582639302432001005520112200100012000310001100001000010100
3020410012040110101032000410003100200301007130015506082584500302912001007520149200100362007410005100001000010100
3020410012540110101032000510002100200301000030015467962578206301002001000120003200100202004010003100001000010100
3020410003240101101012000010000100200001000030015467962578206301002001000120003200100012000310001100001000010100
3020410014740110101032000410003100200301015731315571162595379305312041016320330202101072022010014100001000010100
3020410003240101101012000010000100200001000030015467962578206301002001000120003200100012000310001100001000010100
3020410003240101101012000010000100200001000030015467962578206301002001000120003200100012000310001100001000010100

1000 unrolls and 10 iterations

Result (median cycles for code): 10.0033

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)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)
300241004204004710019200181001010201201000030154638425782843001020100022000420100012000310001100001000010010
300241000324001110011200001000010200001000030154634625782063001020100002000020100002000010001100001000010010
300241000324001110011200001000010200001000030154634625782063001020100002000020100002000010001100001000010010
300241000324001110011200001000010200001000030154634625782063001020100002000020100202003910002100001000010010
300241000394001110011200001000010200001000030154634625782063001020100002000020100002000010001100001000010010
300251000644001710012200041000110200301000030154634625782063001020100002000020100002000010001100001000010010
300241000324001110011200001000010200001000030154634625782063001020100002000020100002000010001100001000010010
300241000324001110011200001000010200001000030154634625782063001020100002000020100002000010001100001000010010
300241000324001110011200001000010200001000030154634625782063001020100002000020100002000010001100001000010010
300241000324001110011200001000010200001000030154634625782063001020100002000020100002000010001100001000010010

Test 3: throughput

Count: 8

Code:

  fcvtmu w0, s8
  fcvtmu w1, s8
  fcvtmu w2, s8
  fcvtmu w3, s8
  fcvtmu w4, s8
  fcvtmu w5, s8
  fcvtmu w6, s8
  fcvtmu w7, s8
  mov x8, 9

(fused SUBS/B.cc loop)

100 unrolls and 100 iterations

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

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)
1602048004124010380101160002100160008300880041160108200160012200160012800018000080100
1602048003724010380101160002100160008300880041160108200160012200160012800018000080100
1602048003724010380101160002100160008300880041160108200160012200160012800018000080100
1602058008524015480115160039100160056300880041160108200160012200160012800018000080100
1602048003724010380101160002100160008300880041160108200160012200160012800018000080100
1602048003724010380101160002100160008300880041160108200160012200160012800018000080100
1602048003724010380101160002100160008300880041160108200160012200160012800018000080100
1602048003724010380101160002100160008300880041160108200160012200160012800018000080100
1602048003724010380101160002100160008300880041160108200160012200160012800018000080100
1602048003724010380101160002100160008300880041160108200160012200160012800018000080100

1000 unrolls and 10 iterations

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

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)
160024800472400148001116000310160010308800001600102016000020160000800018000080010
160024801592401578005516010210160108308802971600642016005420160108800458000080010
160024800372400118001116000010160000308800001600102016000020160054800238000080010
160024800372400118001116000010160000308800001600102016000020160000800018000080010
160024800372400118001116000010160000308800001600102016000020160000800018000080010
160024800372400118001116000010160000308800001600102016000020160000800018000080010
160024800372400118001116000010160000308800001600102016000020160000800018000080010
160024800372400118001116000010160000308800001600102016000020160000800018000080010
160024800372400118001116000010160000308800001600102016000020160000800018000080010
160024800372400118001116000010160000308800001600102016000020160000800018000080010