• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc --mtriple=aarch64 -mattr=+fullfp16 < %s | FileCheck %s
3; RUN: llc --mtriple=aarch64 < %s | FileCheck %s --check-prefix=CHECKNOFP16
4
5define half @faddp_2xhalf(<2 x half> %a) {
6; CHECK-LABEL: faddp_2xhalf:
7; CHECK:       // %bb.0: // %entry
8; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
9; CHECK-NEXT:    faddp h0, v0.2h
10; CHECK-NEXT:    ret
11;
12; CHECKNOFP16-LABEL: faddp_2xhalf:
13; CHECKNOFP16:       // %bb.0: // %entry
14; CHECKNOFP16-NEXT:    // kill: def $d0 killed $d0 def $q0
15; CHECKNOFP16-NEXT:    dup v1.4h, v0.h[1]
16; CHECKNOFP16-NEXT:    fcvtl v1.4s, v1.4h
17; CHECKNOFP16-NEXT:    fcvtl v0.4s, v0.4h
18; CHECKNOFP16-NEXT:    fadd v0.4s, v0.4s, v1.4s
19; CHECKNOFP16-NEXT:    fcvtn v0.4h, v0.4s
20; CHECKNOFP16-NEXT:    // kill: def $h0 killed $h0 killed $q0
21; CHECKNOFP16-NEXT:    ret
22entry:
23  %shift = shufflevector <2 x half> %a, <2 x half> undef, <2 x i32> <i32 1, i32 undef>
24  %0 = fadd <2 x half> %a, %shift
25  %1 = extractelement <2 x half> %0, i32 0
26  ret half %1
27}
28
29define half @faddp_2xhalf_commute(<2 x half> %a) {
30; CHECK-LABEL: faddp_2xhalf_commute:
31; CHECK:       // %bb.0: // %entry
32; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
33; CHECK-NEXT:    faddp h0, v0.2h
34; CHECK-NEXT:    ret
35;
36; CHECKNOFP16-LABEL: faddp_2xhalf_commute:
37; CHECKNOFP16:       // %bb.0: // %entry
38; CHECKNOFP16-NEXT:    // kill: def $d0 killed $d0 def $q0
39; CHECKNOFP16-NEXT:    dup v1.4h, v0.h[1]
40; CHECKNOFP16-NEXT:    fcvtl v1.4s, v1.4h
41; CHECKNOFP16-NEXT:    fcvtl v0.4s, v0.4h
42; CHECKNOFP16-NEXT:    fadd v0.4s, v1.4s, v0.4s
43; CHECKNOFP16-NEXT:    fcvtn v0.4h, v0.4s
44; CHECKNOFP16-NEXT:    // kill: def $h0 killed $h0 killed $q0
45; CHECKNOFP16-NEXT:    ret
46entry:
47  %shift = shufflevector <2 x half> %a, <2 x half> undef, <2 x i32> <i32 1, i32 undef>
48  %0 = fadd <2 x half> %shift, %a
49  %1 = extractelement <2 x half> %0, i32 0
50  ret half %1
51}
52
53define half @faddp_4xhalf(<4 x half> %a) {
54; CHECK-LABEL: faddp_4xhalf:
55; CHECK:       // %bb.0: // %entry
56; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
57; CHECK-NEXT:    faddp h0, v0.2h
58; CHECK-NEXT:    ret
59;
60; CHECKNOFP16-LABEL: faddp_4xhalf:
61; CHECKNOFP16:       // %bb.0: // %entry
62; CHECKNOFP16-NEXT:    // kill: def $d0 killed $d0 def $q0
63; CHECKNOFP16-NEXT:    dup v1.4h, v0.h[1]
64; CHECKNOFP16-NEXT:    fcvtl v1.4s, v1.4h
65; CHECKNOFP16-NEXT:    fcvtl v0.4s, v0.4h
66; CHECKNOFP16-NEXT:    fadd v0.4s, v0.4s, v1.4s
67; CHECKNOFP16-NEXT:    fcvtn v0.4h, v0.4s
68; CHECKNOFP16-NEXT:    // kill: def $h0 killed $h0 killed $q0
69; CHECKNOFP16-NEXT:    ret
70entry:
71  %shift = shufflevector <4 x half> %a, <4 x half> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>
72  %0 = fadd <4 x half> %a, %shift
73  %1 = extractelement <4 x half> %0, i32 0
74  ret half %1
75}
76
77define half @faddp_4xhalf_commute(<4 x half> %a) {
78; CHECK-LABEL: faddp_4xhalf_commute:
79; CHECK:       // %bb.0: // %entry
80; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
81; CHECK-NEXT:    faddp h0, v0.2h
82; CHECK-NEXT:    ret
83;
84; CHECKNOFP16-LABEL: faddp_4xhalf_commute:
85; CHECKNOFP16:       // %bb.0: // %entry
86; CHECKNOFP16-NEXT:    // kill: def $d0 killed $d0 def $q0
87; CHECKNOFP16-NEXT:    dup v1.4h, v0.h[1]
88; CHECKNOFP16-NEXT:    fcvtl v1.4s, v1.4h
89; CHECKNOFP16-NEXT:    fcvtl v0.4s, v0.4h
90; CHECKNOFP16-NEXT:    fadd v0.4s, v1.4s, v0.4s
91; CHECKNOFP16-NEXT:    fcvtn v0.4h, v0.4s
92; CHECKNOFP16-NEXT:    // kill: def $h0 killed $h0 killed $q0
93; CHECKNOFP16-NEXT:    ret
94entry:
95  %shift = shufflevector <4 x half> %a, <4 x half> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>
96  %0 = fadd <4 x half> %shift, %a
97  %1 = extractelement <4 x half> %0, i32 0
98  ret half %1
99}
100
101define half @faddp_8xhalf(<8 x half> %a) {
102; CHECK-LABEL: faddp_8xhalf:
103; CHECK:       // %bb.0: // %entry
104; CHECK-NEXT:    faddp h0, v0.2h
105; CHECK-NEXT:    ret
106;
107; CHECKNOFP16-LABEL: faddp_8xhalf:
108; CHECKNOFP16:       // %bb.0: // %entry
109; CHECKNOFP16-NEXT:    dup v1.8h, v0.h[1]
110; CHECKNOFP16-NEXT:    fcvt s0, h0
111; CHECKNOFP16-NEXT:    fcvt s1, h1
112; CHECKNOFP16-NEXT:    fadd s0, s0, s1
113; CHECKNOFP16-NEXT:    fcvt h0, s0
114; CHECKNOFP16-NEXT:    ret
115entry:
116  %shift = shufflevector <8 x half> %a, <8 x half> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
117  %0 = fadd <8 x half> %a, %shift
118  %1 = extractelement <8 x half> %0, i32 0
119  ret half %1
120}
121
122define half @faddp_8xhalf_commute(<8 x half> %a) {
123; CHECK-LABEL: faddp_8xhalf_commute:
124; CHECK:       // %bb.0: // %entry
125; CHECK-NEXT:    faddp h0, v0.2h
126; CHECK-NEXT:    ret
127;
128; CHECKNOFP16-LABEL: faddp_8xhalf_commute:
129; CHECKNOFP16:       // %bb.0: // %entry
130; CHECKNOFP16-NEXT:    dup v1.8h, v0.h[1]
131; CHECKNOFP16-NEXT:    fcvt s0, h0
132; CHECKNOFP16-NEXT:    fcvt s1, h1
133; CHECKNOFP16-NEXT:    fadd s0, s1, s0
134; CHECKNOFP16-NEXT:    fcvt h0, s0
135; CHECKNOFP16-NEXT:    ret
136entry:
137  %shift = shufflevector <8 x half> %a, <8 x half> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
138  %0 = fadd <8 x half> %shift, %a
139  %1 = extractelement <8 x half> %0, i32 0
140  ret half %1
141}
142