1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86-64 -verify-machineinstrs | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86-64 -mattr=slow-incdec -verify-machineinstrs | FileCheck %s --check-prefix SLOW_INC 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; rdar://7103704 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdefine void @sub1(i32* nocapture %p, i32 %v) nounwind ssp { 7*9880d681SAndroid Build Coastguard Workerentry: 8*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sub1: 9*9880d681SAndroid Build Coastguard Worker; CHECK: subl 10*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw sub i32* %p, i32 %v monotonic 11*9880d681SAndroid Build Coastguard Worker ret void 12*9880d681SAndroid Build Coastguard Worker} 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerdefine void @inc4(i64* nocapture %p) nounwind ssp { 15*9880d681SAndroid Build Coastguard Workerentry: 16*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: inc4: 17*9880d681SAndroid Build Coastguard Worker; CHECK: incq 18*9880d681SAndroid Build Coastguard Worker; SLOW_INC-LABEL: inc4: 19*9880d681SAndroid Build Coastguard Worker; SLOW_INC-NOT: incq 20*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw add i64* %p, i64 1 monotonic 21*9880d681SAndroid Build Coastguard Worker ret void 22*9880d681SAndroid Build Coastguard Worker} 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workerdefine void @add8(i64* nocapture %p) nounwind ssp { 25*9880d681SAndroid Build Coastguard Workerentry: 26*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: add8: 27*9880d681SAndroid Build Coastguard Worker; CHECK: addq $2 28*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw add i64* %p, i64 2 monotonic 29*9880d681SAndroid Build Coastguard Worker ret void 30*9880d681SAndroid Build Coastguard Worker} 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Workerdefine void @add4(i64* nocapture %p, i32 %v) nounwind ssp { 33*9880d681SAndroid Build Coastguard Workerentry: 34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: add4: 35*9880d681SAndroid Build Coastguard Worker; CHECK: addq 36*9880d681SAndroid Build Coastguard Worker %0 = sext i32 %v to i64 ; <i64> [#uses=1] 37*9880d681SAndroid Build Coastguard Worker %1 = atomicrmw add i64* %p, i64 %0 monotonic 38*9880d681SAndroid Build Coastguard Worker ret void 39*9880d681SAndroid Build Coastguard Worker} 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Workerdefine void @inc3(i8* nocapture %p) nounwind ssp { 42*9880d681SAndroid Build Coastguard Workerentry: 43*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: inc3: 44*9880d681SAndroid Build Coastguard Worker; CHECK: incb 45*9880d681SAndroid Build Coastguard Worker; SLOW_INC-LABEL: inc3: 46*9880d681SAndroid Build Coastguard Worker; SLOW_INC-NOT: incb 47*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw add i8* %p, i8 1 monotonic 48*9880d681SAndroid Build Coastguard Worker ret void 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Workerdefine void @add7(i8* nocapture %p) nounwind ssp { 52*9880d681SAndroid Build Coastguard Workerentry: 53*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: add7: 54*9880d681SAndroid Build Coastguard Worker; CHECK: addb $2 55*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw add i8* %p, i8 2 monotonic 56*9880d681SAndroid Build Coastguard Worker ret void 57*9880d681SAndroid Build Coastguard Worker} 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerdefine void @add3(i8* nocapture %p, i32 %v) nounwind ssp { 60*9880d681SAndroid Build Coastguard Workerentry: 61*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: add3: 62*9880d681SAndroid Build Coastguard Worker; CHECK: addb 63*9880d681SAndroid Build Coastguard Worker %0 = trunc i32 %v to i8 ; <i8> [#uses=1] 64*9880d681SAndroid Build Coastguard Worker %1 = atomicrmw add i8* %p, i8 %0 monotonic 65*9880d681SAndroid Build Coastguard Worker ret void 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Workerdefine void @inc2(i16* nocapture %p) nounwind ssp { 69*9880d681SAndroid Build Coastguard Workerentry: 70*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: inc2: 71*9880d681SAndroid Build Coastguard Worker; CHECK: incw 72*9880d681SAndroid Build Coastguard Worker; SLOW_INC-LABEL: inc2: 73*9880d681SAndroid Build Coastguard Worker; SLOW_INC-NOT: incw 74*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw add i16* %p, i16 1 monotonic 75*9880d681SAndroid Build Coastguard Worker ret void 76*9880d681SAndroid Build Coastguard Worker} 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Workerdefine void @add6(i16* nocapture %p) nounwind ssp { 79*9880d681SAndroid Build Coastguard Workerentry: 80*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: add6: 81*9880d681SAndroid Build Coastguard Worker; CHECK: addw $2 82*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw add i16* %p, i16 2 monotonic 83*9880d681SAndroid Build Coastguard Worker ret void 84*9880d681SAndroid Build Coastguard Worker} 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Workerdefine void @add2(i16* nocapture %p, i32 %v) nounwind ssp { 87*9880d681SAndroid Build Coastguard Workerentry: 88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: add2: 89*9880d681SAndroid Build Coastguard Worker; CHECK: addw 90*9880d681SAndroid Build Coastguard Worker %0 = trunc i32 %v to i16 ; <i16> [#uses=1] 91*9880d681SAndroid Build Coastguard Worker %1 = atomicrmw add i16* %p, i16 %0 monotonic 92*9880d681SAndroid Build Coastguard Worker ret void 93*9880d681SAndroid Build Coastguard Worker} 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Workerdefine void @inc1(i32* nocapture %p) nounwind ssp { 96*9880d681SAndroid Build Coastguard Workerentry: 97*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: inc1: 98*9880d681SAndroid Build Coastguard Worker; CHECK: incl 99*9880d681SAndroid Build Coastguard Worker; SLOW_INC-LABEL: inc1: 100*9880d681SAndroid Build Coastguard Worker; SLOW_INC-NOT: incl 101*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw add i32* %p, i32 1 monotonic 102*9880d681SAndroid Build Coastguard Worker ret void 103*9880d681SAndroid Build Coastguard Worker} 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Workerdefine void @add5(i32* nocapture %p) nounwind ssp { 106*9880d681SAndroid Build Coastguard Workerentry: 107*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: add5: 108*9880d681SAndroid Build Coastguard Worker; CHECK: addl $2 109*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw add i32* %p, i32 2 monotonic 110*9880d681SAndroid Build Coastguard Worker ret void 111*9880d681SAndroid Build Coastguard Worker} 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Workerdefine void @add1(i32* nocapture %p, i32 %v) nounwind ssp { 114*9880d681SAndroid Build Coastguard Workerentry: 115*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: add1: 116*9880d681SAndroid Build Coastguard Worker; CHECK: addl 117*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw add i32* %p, i32 %v monotonic 118*9880d681SAndroid Build Coastguard Worker ret void 119*9880d681SAndroid Build Coastguard Worker} 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Workerdefine void @dec4(i64* nocapture %p) nounwind ssp { 122*9880d681SAndroid Build Coastguard Workerentry: 123*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: dec4: 124*9880d681SAndroid Build Coastguard Worker; CHECK: decq 125*9880d681SAndroid Build Coastguard Worker; SLOW_INC-LABEL: dec4: 126*9880d681SAndroid Build Coastguard Worker; SLOW_INC-NOT: decq 127*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw sub i64* %p, i64 1 monotonic 128*9880d681SAndroid Build Coastguard Worker ret void 129*9880d681SAndroid Build Coastguard Worker} 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Workerdefine void @sub8(i64* nocapture %p) nounwind ssp { 132*9880d681SAndroid Build Coastguard Workerentry: 133*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sub8: 134*9880d681SAndroid Build Coastguard Worker; CHECK: subq $2 135*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw sub i64* %p, i64 2 monotonic 136*9880d681SAndroid Build Coastguard Worker ret void 137*9880d681SAndroid Build Coastguard Worker} 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Workerdefine void @sub4(i64* nocapture %p, i32 %v) nounwind ssp { 140*9880d681SAndroid Build Coastguard Workerentry: 141*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sub4: 142*9880d681SAndroid Build Coastguard Worker; CHECK: subq 143*9880d681SAndroid Build Coastguard Worker %0 = sext i32 %v to i64 ; <i64> [#uses=1] 144*9880d681SAndroid Build Coastguard Worker %1 = atomicrmw sub i64* %p, i64 %0 monotonic 145*9880d681SAndroid Build Coastguard Worker ret void 146*9880d681SAndroid Build Coastguard Worker} 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Workerdefine void @dec3(i8* nocapture %p) nounwind ssp { 149*9880d681SAndroid Build Coastguard Workerentry: 150*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: dec3: 151*9880d681SAndroid Build Coastguard Worker; CHECK: decb 152*9880d681SAndroid Build Coastguard Worker; SLOW_INC-LABEL: dec3: 153*9880d681SAndroid Build Coastguard Worker; SLOW_INC-NOT: decb 154*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw sub i8* %p, i8 1 monotonic 155*9880d681SAndroid Build Coastguard Worker ret void 156*9880d681SAndroid Build Coastguard Worker} 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Workerdefine void @sub7(i8* nocapture %p) nounwind ssp { 159*9880d681SAndroid Build Coastguard Workerentry: 160*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sub7: 161*9880d681SAndroid Build Coastguard Worker; CHECK: subb $2 162*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw sub i8* %p, i8 2 monotonic 163*9880d681SAndroid Build Coastguard Worker ret void 164*9880d681SAndroid Build Coastguard Worker} 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Workerdefine void @sub3(i8* nocapture %p, i32 %v) nounwind ssp { 167*9880d681SAndroid Build Coastguard Workerentry: 168*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sub3: 169*9880d681SAndroid Build Coastguard Worker; CHECK: subb 170*9880d681SAndroid Build Coastguard Worker %0 = trunc i32 %v to i8 ; <i8> [#uses=1] 171*9880d681SAndroid Build Coastguard Worker %1 = atomicrmw sub i8* %p, i8 %0 monotonic 172*9880d681SAndroid Build Coastguard Worker ret void 173*9880d681SAndroid Build Coastguard Worker} 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Workerdefine void @dec2(i16* nocapture %p) nounwind ssp { 176*9880d681SAndroid Build Coastguard Workerentry: 177*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: dec2: 178*9880d681SAndroid Build Coastguard Worker; CHECK: decw 179*9880d681SAndroid Build Coastguard Worker; SLOW_INC-LABEL: dec2: 180*9880d681SAndroid Build Coastguard Worker; SLOW_INC-NOT: decw 181*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw sub i16* %p, i16 1 monotonic 182*9880d681SAndroid Build Coastguard Worker ret void 183*9880d681SAndroid Build Coastguard Worker} 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Workerdefine void @sub6(i16* nocapture %p) nounwind ssp { 186*9880d681SAndroid Build Coastguard Workerentry: 187*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sub6: 188*9880d681SAndroid Build Coastguard Worker; CHECK: subw $2 189*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw sub i16* %p, i16 2 monotonic 190*9880d681SAndroid Build Coastguard Worker ret void 191*9880d681SAndroid Build Coastguard Worker} 192*9880d681SAndroid Build Coastguard Worker 193*9880d681SAndroid Build Coastguard Workerdefine void @sub2(i16* nocapture %p, i32 %v) nounwind ssp { 194*9880d681SAndroid Build Coastguard Workerentry: 195*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sub2: 196*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: negl 197*9880d681SAndroid Build Coastguard Worker; CHECK: subw 198*9880d681SAndroid Build Coastguard Worker %0 = trunc i32 %v to i16 ; <i16> [#uses=1] 199*9880d681SAndroid Build Coastguard Worker %1 = atomicrmw sub i16* %p, i16 %0 monotonic 200*9880d681SAndroid Build Coastguard Worker ret void 201*9880d681SAndroid Build Coastguard Worker} 202*9880d681SAndroid Build Coastguard Worker 203*9880d681SAndroid Build Coastguard Workerdefine void @dec1(i32* nocapture %p) nounwind ssp { 204*9880d681SAndroid Build Coastguard Workerentry: 205*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: dec1: 206*9880d681SAndroid Build Coastguard Worker; CHECK: decl 207*9880d681SAndroid Build Coastguard Worker; SLOW_INC-LABEL: dec1: 208*9880d681SAndroid Build Coastguard Worker; SLOW_INC-NOT: decl 209*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw sub i32* %p, i32 1 monotonic 210*9880d681SAndroid Build Coastguard Worker ret void 211*9880d681SAndroid Build Coastguard Worker} 212*9880d681SAndroid Build Coastguard Worker 213*9880d681SAndroid Build Coastguard Workerdefine void @sub5(i32* nocapture %p) nounwind ssp { 214*9880d681SAndroid Build Coastguard Workerentry: 215*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sub5: 216*9880d681SAndroid Build Coastguard Worker; CHECK: subl $2 217*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw sub i32* %p, i32 2 monotonic 218*9880d681SAndroid Build Coastguard Worker ret void 219*9880d681SAndroid Build Coastguard Worker} 220