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