1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 2; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ndd -verify-machineinstrs | FileCheck %s 3; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ndd,nf -verify-machineinstrs | FileCheck --check-prefix=NF %s 4 5define i8 @neg8r(i8 noundef %a) { 6; CHECK-LABEL: neg8r: 7; CHECK: # %bb.0: # %entry 8; CHECK-NEXT: negb %dil, %al 9; CHECK-NEXT: retq 10; 11; NF-LABEL: neg8r: 12; NF: # %bb.0: # %entry 13; NF-NEXT: {nf} negb %dil, %al 14; NF-NEXT: retq 15entry: 16 %neg = sub i8 0, %a 17 ret i8 %neg 18} 19 20define i16 @neg16r(i16 noundef %a) { 21; CHECK-LABEL: neg16r: 22; CHECK: # %bb.0: # %entry 23; CHECK-NEXT: negw %di, %ax 24; CHECK-NEXT: retq 25; 26; NF-LABEL: neg16r: 27; NF: # %bb.0: # %entry 28; NF-NEXT: {nf} negw %di, %ax 29; NF-NEXT: retq 30entry: 31 %neg = sub i16 0, %a 32 ret i16 %neg 33} 34 35define i32 @neg32r(i32 noundef %a) { 36; CHECK-LABEL: neg32r: 37; CHECK: # %bb.0: # %entry 38; CHECK-NEXT: negl %edi, %eax 39; CHECK-NEXT: retq 40; 41; NF-LABEL: neg32r: 42; NF: # %bb.0: # %entry 43; NF-NEXT: {nf} negl %edi, %eax 44; NF-NEXT: retq 45entry: 46 %neg = sub i32 0, %a 47 ret i32 %neg 48} 49 50define i64 @neg64r(i64 noundef %a) { 51; CHECK-LABEL: neg64r: 52; CHECK: # %bb.0: # %entry 53; CHECK-NEXT: negq %rdi, %rax 54; CHECK-NEXT: retq 55; 56; NF-LABEL: neg64r: 57; NF: # %bb.0: # %entry 58; NF-NEXT: {nf} negq %rdi, %rax 59; NF-NEXT: retq 60entry: 61 %neg = sub i64 0, %a 62 ret i64 %neg 63} 64 65define i8 @neg8m(ptr %ptr) { 66; CHECK-LABEL: neg8m: 67; CHECK: # %bb.0: # %entry 68; CHECK-NEXT: negb (%rdi), %al 69; CHECK-NEXT: retq 70; 71; NF-LABEL: neg8m: 72; NF: # %bb.0: # %entry 73; NF-NEXT: {nf} negb (%rdi), %al 74; NF-NEXT: retq 75entry: 76 %a = load i8, ptr %ptr 77 %neg = sub i8 0, %a 78 ret i8 %neg 79} 80 81define i16 @neg16m(ptr %ptr) { 82; CHECK-LABEL: neg16m: 83; CHECK: # %bb.0: # %entry 84; CHECK-NEXT: negw (%rdi), %ax 85; CHECK-NEXT: retq 86; 87; NF-LABEL: neg16m: 88; NF: # %bb.0: # %entry 89; NF-NEXT: {nf} negw (%rdi), %ax 90; NF-NEXT: retq 91entry: 92 %a = load i16, ptr %ptr 93 %neg = sub i16 0, %a 94 ret i16 %neg 95} 96 97define i32 @neg32m(ptr %ptr) { 98; CHECK-LABEL: neg32m: 99; CHECK: # %bb.0: # %entry 100; CHECK-NEXT: negl (%rdi), %eax 101; CHECK-NEXT: retq 102; 103; NF-LABEL: neg32m: 104; NF: # %bb.0: # %entry 105; NF-NEXT: {nf} negl (%rdi), %eax 106; NF-NEXT: retq 107entry: 108 %a = load i32, ptr %ptr 109 %neg = sub i32 0, %a 110 ret i32 %neg 111} 112 113define i64 @neg64m(ptr %ptr) { 114; CHECK-LABEL: neg64m: 115; CHECK: # %bb.0: # %entry 116; CHECK-NEXT: negq (%rdi), %rax 117; CHECK-NEXT: retq 118; 119; NF-LABEL: neg64m: 120; NF: # %bb.0: # %entry 121; NF-NEXT: {nf} negq (%rdi), %rax 122; NF-NEXT: retq 123entry: 124 %a = load i64, ptr %ptr 125 %neg = sub i64 0, %a 126 ret i64 %neg 127} 128 129define i8 @uneg8r(i8 noundef %a) { 130; CHECK-LABEL: uneg8r: 131; CHECK: # %bb.0: # %entry 132; CHECK-NEXT: negb %dil, %al 133; CHECK-NEXT: retq 134; 135; NF-LABEL: uneg8r: 136; NF: # %bb.0: # %entry 137; NF-NEXT: {nf} negb %dil, %al 138; NF-NEXT: retq 139entry: 140 %t = call {i8, i1} @llvm.usub.with.overflow.i8(i8 0, i8 %a) 141 %neg = extractvalue {i8, i1} %t, 0 142 ret i8 %neg 143} 144 145define i16 @uneg16r(i16 noundef %a) { 146; CHECK-LABEL: uneg16r: 147; CHECK: # %bb.0: # %entry 148; CHECK-NEXT: negw %di, %ax 149; CHECK-NEXT: retq 150; 151; NF-LABEL: uneg16r: 152; NF: # %bb.0: # %entry 153; NF-NEXT: {nf} negw %di, %ax 154; NF-NEXT: retq 155entry: 156 %t = call {i16, i1} @llvm.usub.with.overflow.i16(i16 0, i16 %a) 157 %neg = extractvalue {i16, i1} %t, 0 158 ret i16 %neg 159} 160 161define i32 @uneg32r(i32 noundef %a) { 162; CHECK-LABEL: uneg32r: 163; CHECK: # %bb.0: # %entry 164; CHECK-NEXT: negl %edi, %eax 165; CHECK-NEXT: retq 166; 167; NF-LABEL: uneg32r: 168; NF: # %bb.0: # %entry 169; NF-NEXT: {nf} negl %edi, %eax 170; NF-NEXT: retq 171entry: 172 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 0, i32 %a) 173 %neg = extractvalue {i32, i1} %t, 0 174 ret i32 %neg 175} 176 177define i64 @uneg64r(i64 noundef %a) { 178; CHECK-LABEL: uneg64r: 179; CHECK: # %bb.0: # %entry 180; CHECK-NEXT: negq %rdi, %rax 181; CHECK-NEXT: retq 182; 183; NF-LABEL: uneg64r: 184; NF: # %bb.0: # %entry 185; NF-NEXT: {nf} negq %rdi, %rax 186; NF-NEXT: retq 187entry: 188 %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 0, i64 %a) 189 %neg = extractvalue {i64, i1} %t, 0 190 ret i64 %neg 191} 192 193define i8 @uneg8m(ptr %ptr) { 194; CHECK-LABEL: uneg8m: 195; CHECK: # %bb.0: # %entry 196; CHECK-NEXT: negb (%rdi), %al 197; CHECK-NEXT: retq 198; 199; NF-LABEL: uneg8m: 200; NF: # %bb.0: # %entry 201; NF-NEXT: {nf} negb (%rdi), %al 202; NF-NEXT: retq 203entry: 204 %a = load i8, ptr %ptr 205 %t = call {i8, i1} @llvm.usub.with.overflow.i8(i8 0, i8 %a) 206 %neg = extractvalue {i8, i1} %t, 0 207 ret i8 %neg 208} 209 210define i16 @uneg16m(ptr %ptr) { 211; CHECK-LABEL: uneg16m: 212; CHECK: # %bb.0: # %entry 213; CHECK-NEXT: negw (%rdi), %ax 214; CHECK-NEXT: retq 215; 216; NF-LABEL: uneg16m: 217; NF: # %bb.0: # %entry 218; NF-NEXT: {nf} negw (%rdi), %ax 219; NF-NEXT: retq 220entry: 221 %a = load i16, ptr %ptr 222 %t = call {i16, i1} @llvm.usub.with.overflow.i16(i16 0, i16 %a) 223 %neg = extractvalue {i16, i1} %t, 0 224 ret i16 %neg 225} 226 227define i32 @uneg32m(ptr %ptr) { 228; CHECK-LABEL: uneg32m: 229; CHECK: # %bb.0: # %entry 230; CHECK-NEXT: negl (%rdi), %eax 231; CHECK-NEXT: retq 232; 233; NF-LABEL: uneg32m: 234; NF: # %bb.0: # %entry 235; NF-NEXT: {nf} negl (%rdi), %eax 236; NF-NEXT: retq 237entry: 238 %a = load i32, ptr %ptr 239 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 0, i32 %a) 240 %neg = extractvalue {i32, i1} %t, 0 241 ret i32 %neg 242} 243 244define i64 @uneg64m(ptr %ptr) { 245; CHECK-LABEL: uneg64m: 246; CHECK: # %bb.0: # %entry 247; CHECK-NEXT: negq (%rdi), %rax 248; CHECK-NEXT: retq 249; 250; NF-LABEL: uneg64m: 251; NF: # %bb.0: # %entry 252; NF-NEXT: {nf} negq (%rdi), %rax 253; NF-NEXT: retq 254entry: 255 %a = load i64, ptr %ptr 256 %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 0, i64 %a) 257 %neg = extractvalue {i64, i1} %t, 0 258 ret i64 %neg 259} 260 261declare {i8, i1} @llvm.usub.with.overflow.i8(i8, i8) 262declare {i16, i1} @llvm.usub.with.overflow.i16(i16, i16) 263declare {i32, i1} @llvm.usub.with.overflow.i32(i32, i32) 264declare {i64, i1} @llvm.usub.with.overflow.i64(i64, i64) 265 266define void @neg8m_legacy(ptr %ptr) { 267; CHECK-LABEL: neg8m_legacy: 268; CHECK: # %bb.0: # %entry 269; CHECK-NEXT: negb (%rdi) 270; CHECK-NEXT: retq 271; 272; NF-LABEL: neg8m_legacy: 273; NF: # %bb.0: # %entry 274; NF-NEXT: negb (%rdi) 275; NF-NEXT: retq 276entry: 277 %a = load i8, ptr %ptr 278 %neg = sub i8 0, %a 279 store i8 %neg, ptr %ptr 280 ret void 281} 282 283define void @neg16m_legacy(ptr %ptr) { 284; CHECK-LABEL: neg16m_legacy: 285; CHECK: # %bb.0: # %entry 286; CHECK-NEXT: negw (%rdi) 287; CHECK-NEXT: retq 288; 289; NF-LABEL: neg16m_legacy: 290; NF: # %bb.0: # %entry 291; NF-NEXT: negw (%rdi) 292; NF-NEXT: retq 293entry: 294 %a = load i16, ptr %ptr 295 %neg = sub i16 0, %a 296 store i16 %neg, ptr %ptr 297 ret void 298} 299 300define void @neg32m_legacy(ptr %ptr) { 301; CHECK-LABEL: neg32m_legacy: 302; CHECK: # %bb.0: # %entry 303; CHECK-NEXT: negl (%rdi) 304; CHECK-NEXT: retq 305; 306; NF-LABEL: neg32m_legacy: 307; NF: # %bb.0: # %entry 308; NF-NEXT: negl (%rdi) 309; NF-NEXT: retq 310entry: 311 %a = load i32, ptr %ptr 312 %neg = sub i32 0, %a 313 store i32 %neg, ptr %ptr 314 ret void 315} 316 317define void @neg64m_legacy(ptr %ptr) { 318; CHECK-LABEL: neg64m_legacy: 319; CHECK: # %bb.0: # %entry 320; CHECK-NEXT: negq (%rdi) 321; CHECK-NEXT: retq 322; 323; NF-LABEL: neg64m_legacy: 324; NF: # %bb.0: # %entry 325; NF-NEXT: negq (%rdi) 326; NF-NEXT: retq 327entry: 328 %a = load i64, ptr %ptr 329 %neg = sub i64 0, %a 330 store i64 %neg, ptr %ptr 331 ret void 332} 333