1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 2; RUN: llc -mtriple=aarch64 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD,CHECK-SD-NOFP16 3; RUN: llc -mtriple=aarch64 -mattr=+fullfp16 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD,CHECK-SD-FP16 4; RUN: llc -mtriple=aarch64 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-GI-NOFP16 5; RUN: llc -mtriple=aarch64 -mattr=+fullfp16 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-GI-FP16 6 7define double @fabs_f64(double %a) { 8; CHECK-LABEL: fabs_f64: 9; CHECK: // %bb.0: // %entry 10; CHECK-NEXT: fneg d0, d0 11; CHECK-NEXT: ret 12entry: 13 %c = fneg double %a 14 ret double %c 15} 16 17define float @fabs_f32(float %a) { 18; CHECK-LABEL: fabs_f32: 19; CHECK: // %bb.0: // %entry 20; CHECK-NEXT: fneg s0, s0 21; CHECK-NEXT: ret 22entry: 23 %c = fneg float %a 24 ret float %c 25} 26 27define half @fabs_f16(half %a) { 28; CHECK-SD-NOFP16-LABEL: fabs_f16: 29; CHECK-SD-NOFP16: // %bb.0: // %entry 30; CHECK-SD-NOFP16-NEXT: // kill: def $h0 killed $h0 def $s0 31; CHECK-SD-NOFP16-NEXT: fmov w8, s0 32; CHECK-SD-NOFP16-NEXT: eor w8, w8, #0x8000 33; CHECK-SD-NOFP16-NEXT: fmov s0, w8 34; CHECK-SD-NOFP16-NEXT: // kill: def $h0 killed $h0 killed $s0 35; CHECK-SD-NOFP16-NEXT: ret 36; 37; CHECK-SD-FP16-LABEL: fabs_f16: 38; CHECK-SD-FP16: // %bb.0: // %entry 39; CHECK-SD-FP16-NEXT: fneg h0, h0 40; CHECK-SD-FP16-NEXT: ret 41; 42; CHECK-GI-NOFP16-LABEL: fabs_f16: 43; CHECK-GI-NOFP16: // %bb.0: // %entry 44; CHECK-GI-NOFP16-NEXT: // kill: def $h0 killed $h0 def $s0 45; CHECK-GI-NOFP16-NEXT: fmov w8, s0 46; CHECK-GI-NOFP16-NEXT: eor w8, w8, #0xffff8000 47; CHECK-GI-NOFP16-NEXT: fmov s0, w8 48; CHECK-GI-NOFP16-NEXT: // kill: def $h0 killed $h0 killed $s0 49; CHECK-GI-NOFP16-NEXT: ret 50; 51; CHECK-GI-FP16-LABEL: fabs_f16: 52; CHECK-GI-FP16: // %bb.0: // %entry 53; CHECK-GI-FP16-NEXT: fneg h0, h0 54; CHECK-GI-FP16-NEXT: ret 55entry: 56 %c = fneg half %a 57 ret half %c 58} 59 60define <2 x double> @fabs_v2f64(<2 x double> %a) { 61; CHECK-LABEL: fabs_v2f64: 62; CHECK: // %bb.0: // %entry 63; CHECK-NEXT: fneg v0.2d, v0.2d 64; CHECK-NEXT: ret 65entry: 66 %c = fneg <2 x double> %a 67 ret <2 x double> %c 68} 69 70define <3 x double> @fabs_v3f64(<3 x double> %a) { 71; CHECK-SD-LABEL: fabs_v3f64: 72; CHECK-SD: // %bb.0: // %entry 73; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 74; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1 75; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q2 76; CHECK-SD-NEXT: mov v0.d[1], v1.d[0] 77; CHECK-SD-NEXT: fneg v2.2d, v2.2d 78; CHECK-SD-NEXT: // kill: def $d2 killed $d2 killed $q2 79; CHECK-SD-NEXT: fneg v0.2d, v0.2d 80; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8 81; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 82; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 83; CHECK-SD-NEXT: ret 84; 85; CHECK-GI-LABEL: fabs_v3f64: 86; CHECK-GI: // %bb.0: // %entry 87; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 88; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1 89; CHECK-GI-NEXT: fneg d2, d2 90; CHECK-GI-NEXT: mov v0.d[1], v1.d[0] 91; CHECK-GI-NEXT: fneg v0.2d, v0.2d 92; CHECK-GI-NEXT: mov d1, v0.d[1] 93; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 94; CHECK-GI-NEXT: ret 95entry: 96 %c = fneg <3 x double> %a 97 ret <3 x double> %c 98} 99 100define <4 x double> @fabs_v4f64(<4 x double> %a) { 101; CHECK-LABEL: fabs_v4f64: 102; CHECK: // %bb.0: // %entry 103; CHECK-NEXT: fneg v0.2d, v0.2d 104; CHECK-NEXT: fneg v1.2d, v1.2d 105; CHECK-NEXT: ret 106entry: 107 %c = fneg <4 x double> %a 108 ret <4 x double> %c 109} 110 111define <2 x float> @fabs_v2f32(<2 x float> %a) { 112; CHECK-LABEL: fabs_v2f32: 113; CHECK: // %bb.0: // %entry 114; CHECK-NEXT: fneg v0.2s, v0.2s 115; CHECK-NEXT: ret 116entry: 117 %c = fneg <2 x float> %a 118 ret <2 x float> %c 119} 120 121define <3 x float> @fabs_v3f32(<3 x float> %a) { 122; CHECK-LABEL: fabs_v3f32: 123; CHECK: // %bb.0: // %entry 124; CHECK-NEXT: fneg v0.4s, v0.4s 125; CHECK-NEXT: ret 126entry: 127 %c = fneg <3 x float> %a 128 ret <3 x float> %c 129} 130 131define <4 x float> @fabs_v4f32(<4 x float> %a) { 132; CHECK-LABEL: fabs_v4f32: 133; CHECK: // %bb.0: // %entry 134; CHECK-NEXT: fneg v0.4s, v0.4s 135; CHECK-NEXT: ret 136entry: 137 %c = fneg <4 x float> %a 138 ret <4 x float> %c 139} 140 141define <8 x float> @fabs_v8f32(<8 x float> %a) { 142; CHECK-LABEL: fabs_v8f32: 143; CHECK: // %bb.0: // %entry 144; CHECK-NEXT: fneg v0.4s, v0.4s 145; CHECK-NEXT: fneg v1.4s, v1.4s 146; CHECK-NEXT: ret 147entry: 148 %c = fneg <8 x float> %a 149 ret <8 x float> %c 150} 151 152define <7 x half> @fabs_v7f16(<7 x half> %a) { 153; CHECK-SD-NOFP16-LABEL: fabs_v7f16: 154; CHECK-SD-NOFP16: // %bb.0: // %entry 155; CHECK-SD-NOFP16-NEXT: movi v1.8h, #128, lsl #8 156; CHECK-SD-NOFP16-NEXT: eor v0.16b, v0.16b, v1.16b 157; CHECK-SD-NOFP16-NEXT: ret 158; 159; CHECK-SD-FP16-LABEL: fabs_v7f16: 160; CHECK-SD-FP16: // %bb.0: // %entry 161; CHECK-SD-FP16-NEXT: fneg v0.8h, v0.8h 162; CHECK-SD-FP16-NEXT: ret 163; 164; CHECK-GI-NOFP16-LABEL: fabs_v7f16: 165; CHECK-GI-NOFP16: // %bb.0: // %entry 166; CHECK-GI-NOFP16-NEXT: movi v1.8h, #128, lsl #8 167; CHECK-GI-NOFP16-NEXT: eor v0.16b, v0.16b, v1.16b 168; CHECK-GI-NOFP16-NEXT: ret 169; 170; CHECK-GI-FP16-LABEL: fabs_v7f16: 171; CHECK-GI-FP16: // %bb.0: // %entry 172; CHECK-GI-FP16-NEXT: fneg v0.8h, v0.8h 173; CHECK-GI-FP16-NEXT: ret 174entry: 175 %c = fneg <7 x half> %a 176 ret <7 x half> %c 177} 178 179define <4 x half> @fabs_v4f16(<4 x half> %a) { 180; CHECK-SD-NOFP16-LABEL: fabs_v4f16: 181; CHECK-SD-NOFP16: // %bb.0: // %entry 182; CHECK-SD-NOFP16-NEXT: movi v1.4h, #128, lsl #8 183; CHECK-SD-NOFP16-NEXT: eor v0.8b, v0.8b, v1.8b 184; CHECK-SD-NOFP16-NEXT: ret 185; 186; CHECK-SD-FP16-LABEL: fabs_v4f16: 187; CHECK-SD-FP16: // %bb.0: // %entry 188; CHECK-SD-FP16-NEXT: fneg v0.4h, v0.4h 189; CHECK-SD-FP16-NEXT: ret 190; 191; CHECK-GI-NOFP16-LABEL: fabs_v4f16: 192; CHECK-GI-NOFP16: // %bb.0: // %entry 193; CHECK-GI-NOFP16-NEXT: movi v1.4h, #128, lsl #8 194; CHECK-GI-NOFP16-NEXT: eor v0.8b, v0.8b, v1.8b 195; CHECK-GI-NOFP16-NEXT: ret 196; 197; CHECK-GI-FP16-LABEL: fabs_v4f16: 198; CHECK-GI-FP16: // %bb.0: // %entry 199; CHECK-GI-FP16-NEXT: fneg v0.4h, v0.4h 200; CHECK-GI-FP16-NEXT: ret 201entry: 202 %c = fneg <4 x half> %a 203 ret <4 x half> %c 204} 205 206define <8 x half> @fabs_v8f16(<8 x half> %a) { 207; CHECK-SD-NOFP16-LABEL: fabs_v8f16: 208; CHECK-SD-NOFP16: // %bb.0: // %entry 209; CHECK-SD-NOFP16-NEXT: movi v1.8h, #128, lsl #8 210; CHECK-SD-NOFP16-NEXT: eor v0.16b, v0.16b, v1.16b 211; CHECK-SD-NOFP16-NEXT: ret 212; 213; CHECK-SD-FP16-LABEL: fabs_v8f16: 214; CHECK-SD-FP16: // %bb.0: // %entry 215; CHECK-SD-FP16-NEXT: fneg v0.8h, v0.8h 216; CHECK-SD-FP16-NEXT: ret 217; 218; CHECK-GI-NOFP16-LABEL: fabs_v8f16: 219; CHECK-GI-NOFP16: // %bb.0: // %entry 220; CHECK-GI-NOFP16-NEXT: movi v1.8h, #128, lsl #8 221; CHECK-GI-NOFP16-NEXT: eor v0.16b, v0.16b, v1.16b 222; CHECK-GI-NOFP16-NEXT: ret 223; 224; CHECK-GI-FP16-LABEL: fabs_v8f16: 225; CHECK-GI-FP16: // %bb.0: // %entry 226; CHECK-GI-FP16-NEXT: fneg v0.8h, v0.8h 227; CHECK-GI-FP16-NEXT: ret 228entry: 229 %c = fneg <8 x half> %a 230 ret <8 x half> %c 231} 232 233define <16 x half> @fabs_v16f16(<16 x half> %a) { 234; CHECK-SD-NOFP16-LABEL: fabs_v16f16: 235; CHECK-SD-NOFP16: // %bb.0: // %entry 236; CHECK-SD-NOFP16-NEXT: movi v2.8h, #128, lsl #8 237; CHECK-SD-NOFP16-NEXT: eor v0.16b, v0.16b, v2.16b 238; CHECK-SD-NOFP16-NEXT: eor v1.16b, v1.16b, v2.16b 239; CHECK-SD-NOFP16-NEXT: ret 240; 241; CHECK-SD-FP16-LABEL: fabs_v16f16: 242; CHECK-SD-FP16: // %bb.0: // %entry 243; CHECK-SD-FP16-NEXT: fneg v0.8h, v0.8h 244; CHECK-SD-FP16-NEXT: fneg v1.8h, v1.8h 245; CHECK-SD-FP16-NEXT: ret 246; 247; CHECK-GI-NOFP16-LABEL: fabs_v16f16: 248; CHECK-GI-NOFP16: // %bb.0: // %entry 249; CHECK-GI-NOFP16-NEXT: movi v2.8h, #128, lsl #8 250; CHECK-GI-NOFP16-NEXT: eor v0.16b, v0.16b, v2.16b 251; CHECK-GI-NOFP16-NEXT: eor v1.16b, v1.16b, v2.16b 252; CHECK-GI-NOFP16-NEXT: ret 253; 254; CHECK-GI-FP16-LABEL: fabs_v16f16: 255; CHECK-GI-FP16: // %bb.0: // %entry 256; CHECK-GI-FP16-NEXT: fneg v0.8h, v0.8h 257; CHECK-GI-FP16-NEXT: fneg v1.8h, v1.8h 258; CHECK-GI-FP16-NEXT: ret 259entry: 260 %c = fneg <16 x half> %a 261 ret <16 x half> %c 262} 263