334 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ndd -verify-machineinstrs | FileCheck %s3; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ndd,nf -verify-machineinstrs | FileCheck --check-prefix=NF %s4; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ndd,nf -x86-enable-apx-for-relocation=true -verify-machineinstrs --show-mc-encoding | FileCheck --check-prefix=NF %s5 6define i8 @neg8r(i8 noundef %a) {7; CHECK-LABEL: neg8r:8; CHECK: # %bb.0: # %entry9; CHECK-NEXT: negb %dil, %al10; CHECK-NEXT: retq11;12; NF-LABEL: neg8r:13; NF: # %bb.0: # %entry14; NF-NEXT: {nf} negb %dil, %al15; NF-NEXT: retq16entry:17 %neg = sub i8 0, %a18 ret i8 %neg19}20 21define i16 @neg16r(i16 noundef %a) {22; CHECK-LABEL: neg16r:23; CHECK: # %bb.0: # %entry24; CHECK-NEXT: negw %di, %ax25; CHECK-NEXT: retq26;27; NF-LABEL: neg16r:28; NF: # %bb.0: # %entry29; NF-NEXT: {nf} negw %di, %ax30; NF-NEXT: retq31entry:32 %neg = sub i16 0, %a33 ret i16 %neg34}35 36define i32 @neg32r(i32 noundef %a) {37; CHECK-LABEL: neg32r:38; CHECK: # %bb.0: # %entry39; CHECK-NEXT: negl %edi, %eax40; CHECK-NEXT: retq41;42; NF-LABEL: neg32r:43; NF: # %bb.0: # %entry44; NF-NEXT: {nf} negl %edi, %eax45; NF-NEXT: retq46entry:47 %neg = sub i32 0, %a48 ret i32 %neg49}50 51define i64 @neg64r(i64 noundef %a) {52; CHECK-LABEL: neg64r:53; CHECK: # %bb.0: # %entry54; CHECK-NEXT: negq %rdi, %rax55; CHECK-NEXT: retq56;57; NF-LABEL: neg64r:58; NF: # %bb.0: # %entry59; NF-NEXT: {nf} negq %rdi, %rax60; NF-NEXT: retq61entry:62 %neg = sub i64 0, %a63 ret i64 %neg64}65 66define i8 @neg8m(ptr %ptr) {67; CHECK-LABEL: neg8m:68; CHECK: # %bb.0: # %entry69; CHECK-NEXT: negb (%rdi), %al70; CHECK-NEXT: retq71;72; NF-LABEL: neg8m:73; NF: # %bb.0: # %entry74; NF-NEXT: {nf} negb (%rdi), %al75; NF-NEXT: retq76entry:77 %a = load i8, ptr %ptr78 %neg = sub i8 0, %a79 ret i8 %neg80}81 82define i16 @neg16m(ptr %ptr) {83; CHECK-LABEL: neg16m:84; CHECK: # %bb.0: # %entry85; CHECK-NEXT: negw (%rdi), %ax86; CHECK-NEXT: retq87;88; NF-LABEL: neg16m:89; NF: # %bb.0: # %entry90; NF-NEXT: {nf} negw (%rdi), %ax91; NF-NEXT: retq92entry:93 %a = load i16, ptr %ptr94 %neg = sub i16 0, %a95 ret i16 %neg96}97 98define i32 @neg32m(ptr %ptr) {99; CHECK-LABEL: neg32m:100; CHECK: # %bb.0: # %entry101; CHECK-NEXT: negl (%rdi), %eax102; CHECK-NEXT: retq103;104; NF-LABEL: neg32m:105; NF: # %bb.0: # %entry106; NF-NEXT: {nf} negl (%rdi), %eax107; NF-NEXT: retq108entry:109 %a = load i32, ptr %ptr110 %neg = sub i32 0, %a111 ret i32 %neg112}113 114define i64 @neg64m(ptr %ptr) {115; CHECK-LABEL: neg64m:116; CHECK: # %bb.0: # %entry117; CHECK-NEXT: negq (%rdi), %rax118; CHECK-NEXT: retq119;120; NF-LABEL: neg64m:121; NF: # %bb.0: # %entry122; NF-NEXT: {nf} negq (%rdi), %rax123; NF-NEXT: retq124entry:125 %a = load i64, ptr %ptr126 %neg = sub i64 0, %a127 ret i64 %neg128}129 130define i8 @uneg8r(i8 noundef %a) {131; CHECK-LABEL: uneg8r:132; CHECK: # %bb.0: # %entry133; CHECK-NEXT: negb %dil, %al134; CHECK-NEXT: retq135;136; NF-LABEL: uneg8r:137; NF: # %bb.0: # %entry138; NF-NEXT: {nf} negb %dil, %al139; NF-NEXT: retq140entry:141 %t = call {i8, i1} @llvm.usub.with.overflow.i8(i8 0, i8 %a)142 %neg = extractvalue {i8, i1} %t, 0143 ret i8 %neg144}145 146define i16 @uneg16r(i16 noundef %a) {147; CHECK-LABEL: uneg16r:148; CHECK: # %bb.0: # %entry149; CHECK-NEXT: negw %di, %ax150; CHECK-NEXT: retq151;152; NF-LABEL: uneg16r:153; NF: # %bb.0: # %entry154; NF-NEXT: {nf} negw %di, %ax155; NF-NEXT: retq156entry:157 %t = call {i16, i1} @llvm.usub.with.overflow.i16(i16 0, i16 %a)158 %neg = extractvalue {i16, i1} %t, 0159 ret i16 %neg160}161 162define i32 @uneg32r(i32 noundef %a) {163; CHECK-LABEL: uneg32r:164; CHECK: # %bb.0: # %entry165; CHECK-NEXT: negl %edi, %eax166; CHECK-NEXT: retq167;168; NF-LABEL: uneg32r:169; NF: # %bb.0: # %entry170; NF-NEXT: {nf} negl %edi, %eax171; NF-NEXT: retq172entry:173 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 0, i32 %a)174 %neg = extractvalue {i32, i1} %t, 0175 ret i32 %neg176}177 178define i64 @uneg64r(i64 noundef %a) {179; CHECK-LABEL: uneg64r:180; CHECK: # %bb.0: # %entry181; CHECK-NEXT: negq %rdi, %rax182; CHECK-NEXT: retq183;184; NF-LABEL: uneg64r:185; NF: # %bb.0: # %entry186; NF-NEXT: {nf} negq %rdi, %rax187; NF-NEXT: retq188entry:189 %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 0, i64 %a)190 %neg = extractvalue {i64, i1} %t, 0191 ret i64 %neg192}193 194define i8 @uneg8m(ptr %ptr) {195; CHECK-LABEL: uneg8m:196; CHECK: # %bb.0: # %entry197; CHECK-NEXT: negb (%rdi), %al198; CHECK-NEXT: retq199;200; NF-LABEL: uneg8m:201; NF: # %bb.0: # %entry202; NF-NEXT: {nf} negb (%rdi), %al203; NF-NEXT: retq204entry:205 %a = load i8, ptr %ptr206 %t = call {i8, i1} @llvm.usub.with.overflow.i8(i8 0, i8 %a)207 %neg = extractvalue {i8, i1} %t, 0208 ret i8 %neg209}210 211define i16 @uneg16m(ptr %ptr) {212; CHECK-LABEL: uneg16m:213; CHECK: # %bb.0: # %entry214; CHECK-NEXT: negw (%rdi), %ax215; CHECK-NEXT: retq216;217; NF-LABEL: uneg16m:218; NF: # %bb.0: # %entry219; NF-NEXT: {nf} negw (%rdi), %ax220; NF-NEXT: retq221entry:222 %a = load i16, ptr %ptr223 %t = call {i16, i1} @llvm.usub.with.overflow.i16(i16 0, i16 %a)224 %neg = extractvalue {i16, i1} %t, 0225 ret i16 %neg226}227 228define i32 @uneg32m(ptr %ptr) {229; CHECK-LABEL: uneg32m:230; CHECK: # %bb.0: # %entry231; CHECK-NEXT: negl (%rdi), %eax232; CHECK-NEXT: retq233;234; NF-LABEL: uneg32m:235; NF: # %bb.0: # %entry236; NF-NEXT: {nf} negl (%rdi), %eax237; NF-NEXT: retq238entry:239 %a = load i32, ptr %ptr240 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 0, i32 %a)241 %neg = extractvalue {i32, i1} %t, 0242 ret i32 %neg243}244 245define i64 @uneg64m(ptr %ptr) {246; CHECK-LABEL: uneg64m:247; CHECK: # %bb.0: # %entry248; CHECK-NEXT: negq (%rdi), %rax249; CHECK-NEXT: retq250;251; NF-LABEL: uneg64m:252; NF: # %bb.0: # %entry253; NF-NEXT: {nf} negq (%rdi), %rax254; NF-NEXT: retq255entry:256 %a = load i64, ptr %ptr257 %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 0, i64 %a)258 %neg = extractvalue {i64, i1} %t, 0259 ret i64 %neg260}261 262declare {i8, i1} @llvm.usub.with.overflow.i8(i8, i8)263declare {i16, i1} @llvm.usub.with.overflow.i16(i16, i16)264declare {i32, i1} @llvm.usub.with.overflow.i32(i32, i32)265declare {i64, i1} @llvm.usub.with.overflow.i64(i64, i64)266 267define void @neg8m_legacy(ptr %ptr) {268; CHECK-LABEL: neg8m_legacy:269; CHECK: # %bb.0: # %entry270; CHECK-NEXT: negb (%rdi)271; CHECK-NEXT: retq272;273; NF-LABEL: neg8m_legacy:274; NF: # %bb.0: # %entry275; NF-NEXT: negb (%rdi)276; NF-NEXT: retq277entry:278 %a = load i8, ptr %ptr279 %neg = sub i8 0, %a280 store i8 %neg, ptr %ptr281 ret void282}283 284define void @neg16m_legacy(ptr %ptr) {285; CHECK-LABEL: neg16m_legacy:286; CHECK: # %bb.0: # %entry287; CHECK-NEXT: negw (%rdi)288; CHECK-NEXT: retq289;290; NF-LABEL: neg16m_legacy:291; NF: # %bb.0: # %entry292; NF-NEXT: negw (%rdi)293; NF-NEXT: retq294entry:295 %a = load i16, ptr %ptr296 %neg = sub i16 0, %a297 store i16 %neg, ptr %ptr298 ret void299}300 301define void @neg32m_legacy(ptr %ptr) {302; CHECK-LABEL: neg32m_legacy:303; CHECK: # %bb.0: # %entry304; CHECK-NEXT: negl (%rdi)305; CHECK-NEXT: retq306;307; NF-LABEL: neg32m_legacy:308; NF: # %bb.0: # %entry309; NF-NEXT: negl (%rdi)310; NF-NEXT: retq311entry:312 %a = load i32, ptr %ptr313 %neg = sub i32 0, %a314 store i32 %neg, ptr %ptr315 ret void316}317 318define void @neg64m_legacy(ptr %ptr) {319; CHECK-LABEL: neg64m_legacy:320; CHECK: # %bb.0: # %entry321; CHECK-NEXT: negq (%rdi)322; CHECK-NEXT: retq323;324; NF-LABEL: neg64m_legacy:325; NF: # %bb.0: # %entry326; NF-NEXT: negq (%rdi)327; NF-NEXT: retq328entry:329 %a = load i64, ptr %ptr330 %neg = sub i64 0, %a331 store i64 %neg, ptr %ptr332 ret void333}334