438 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=ppc32-unknown-unknown | FileCheck %s --check-prefixes=ALL,PPC323; RUN: llc < %s -mcpu=ppc -mtriple=powerpc64-unknown-unknown | FileCheck %s --check-prefixes=ALL,PPC64,PPC64BE4; RUN: llc < %s -mtriple=powerpc64le-unknown-unknown | FileCheck %s --check-prefixes=ALL,PPC64,PPC64LE5 6; These two forms are equivalent:7; sub %y, (xor %x, -1)8; add (add %x, 1), %y9; Some targets may prefer one to the other.10 11define i8 @scalar_i8(i8 %x, i8 %y) nounwind {12; ALL-LABEL: scalar_i8:13; ALL: # %bb.0:14; ALL-NEXT: add 3, 4, 315; ALL-NEXT: addi 3, 3, 116; ALL-NEXT: blr17 %t0 = xor i8 %x, -118 %t1 = sub i8 %y, %t019 ret i8 %t120}21 22define i16 @scalar_i16(i16 %x, i16 %y) nounwind {23; ALL-LABEL: scalar_i16:24; ALL: # %bb.0:25; ALL-NEXT: add 3, 4, 326; ALL-NEXT: addi 3, 3, 127; ALL-NEXT: blr28 %t0 = xor i16 %x, -129 %t1 = sub i16 %y, %t030 ret i16 %t131}32 33define i32 @scalar_i32(i32 %x, i32 %y) nounwind {34; ALL-LABEL: scalar_i32:35; ALL: # %bb.0:36; ALL-NEXT: add 3, 4, 337; ALL-NEXT: addi 3, 3, 138; ALL-NEXT: blr39 %t0 = xor i32 %x, -140 %t1 = sub i32 %y, %t041 ret i32 %t142}43 44define i64 @scalar_i64(i64 %x, i64 %y) nounwind {45; PPC32-LABEL: scalar_i64:46; PPC32: # %bb.0:47; PPC32-NEXT: addc 4, 6, 448; PPC32-NEXT: adde 3, 5, 349; PPC32-NEXT: addic 4, 4, 150; PPC32-NEXT: addze 3, 351; PPC32-NEXT: blr52;53; PPC64-LABEL: scalar_i64:54; PPC64: # %bb.0:55; PPC64-NEXT: add 3, 4, 356; PPC64-NEXT: addi 3, 3, 157; PPC64-NEXT: blr58 %t0 = xor i64 %x, -159 %t1 = sub i64 %y, %t060 ret i64 %t161}62 63define <16 x i8> @vector_i128_i8(<16 x i8> %x, <16 x i8> %y) nounwind {64; PPC32-LABEL: vector_i128_i8:65; PPC32: # %bb.0:66; PPC32-NEXT: stwu 1, -64(1)67; PPC32-NEXT: stw 21, 20(1) # 4-byte Folded Spill68; PPC32-NEXT: stw 22, 24(1) # 4-byte Folded Spill69; PPC32-NEXT: lbz 4, 115(1)70; PPC32-NEXT: lbz 22, 119(1)71; PPC32-NEXT: lbz 21, 123(1)72; PPC32-NEXT: add 4, 4, 573; PPC32-NEXT: add 5, 22, 674; PPC32-NEXT: lbz 22, 131(1)75; PPC32-NEXT: add 6, 21, 776; PPC32-NEXT: lbz 21, 135(1)77; PPC32-NEXT: addi 6, 6, 178; PPC32-NEXT: stw 20, 16(1) # 4-byte Folded Spill79; PPC32-NEXT: add 9, 22, 980; PPC32-NEXT: lbz 20, 127(1)81; PPC32-NEXT: add 10, 21, 1082; PPC32-NEXT: stw 25, 36(1) # 4-byte Folded Spill83; PPC32-NEXT: addi 5, 5, 184; PPC32-NEXT: lbz 25, 83(1)85; PPC32-NEXT: add 7, 20, 886; PPC32-NEXT: lbz 21, 147(1)87; PPC32-NEXT: addi 7, 7, 188; PPC32-NEXT: stw 24, 32(1) # 4-byte Folded Spill89; PPC32-NEXT: addi 4, 4, 190; PPC32-NEXT: lbz 24, 79(1)91; PPC32-NEXT: add 25, 21, 2592; PPC32-NEXT: lbz 22, 143(1)93; PPC32-NEXT: stw 23, 28(1) # 4-byte Folded Spill94; PPC32-NEXT: lbz 23, 75(1)95; PPC32-NEXT: add 24, 22, 2496; PPC32-NEXT: lbz 8, 139(1)97; PPC32-NEXT: stw 28, 48(1) # 4-byte Folded Spill98; PPC32-NEXT: lbz 28, 95(1)99; PPC32-NEXT: add 8, 8, 23100; PPC32-NEXT: lbz 21, 159(1)101; PPC32-NEXT: addi 8, 8, 1102; PPC32-NEXT: stw 27, 44(1) # 4-byte Folded Spill103; PPC32-NEXT: lbz 27, 91(1)104; PPC32-NEXT: add 28, 21, 28105; PPC32-NEXT: lbz 22, 155(1)106; PPC32-NEXT: stw 26, 40(1) # 4-byte Folded Spill107; PPC32-NEXT: lbz 26, 87(1)108; PPC32-NEXT: add 27, 22, 27109; PPC32-NEXT: lbz 23, 151(1)110; PPC32-NEXT: lbz 11, 111(1)111; PPC32-NEXT: lbz 21, 175(1)112; PPC32-NEXT: add 26, 23, 26113; PPC32-NEXT: lbz 12, 107(1)114; PPC32-NEXT: lbz 0, 171(1)115; PPC32-NEXT: add 11, 21, 11116; PPC32-NEXT: stw 30, 56(1) # 4-byte Folded Spill117; PPC32-NEXT: addi 11, 11, 1118; PPC32-NEXT: lbz 30, 103(1)119; PPC32-NEXT: add 12, 0, 12120; PPC32-NEXT: lbz 22, 167(1)121; PPC32-NEXT: stw 29, 52(1) # 4-byte Folded Spill122; PPC32-NEXT: lbz 29, 99(1)123; PPC32-NEXT: add 30, 22, 30124; PPC32-NEXT: lbz 23, 163(1)125; PPC32-NEXT: stb 11, 15(3)126; PPC32-NEXT: addi 11, 12, 1127; PPC32-NEXT: add 29, 23, 29128; PPC32-NEXT: stb 11, 14(3)129; PPC32-NEXT: addi 11, 30, 1130; PPC32-NEXT: stb 11, 13(3)131; PPC32-NEXT: addi 11, 29, 1132; PPC32-NEXT: stb 11, 12(3)133; PPC32-NEXT: addi 11, 28, 1134; PPC32-NEXT: stb 11, 11(3)135; PPC32-NEXT: addi 11, 27, 1136; PPC32-NEXT: stb 11, 10(3)137; PPC32-NEXT: addi 11, 26, 1138; PPC32-NEXT: stb 11, 9(3)139; PPC32-NEXT: addi 11, 25, 1140; PPC32-NEXT: stb 8, 6(3)141; PPC32-NEXT: addi 8, 10, 1142; PPC32-NEXT: stb 11, 8(3)143; PPC32-NEXT: addi 11, 24, 1144; PPC32-NEXT: stb 8, 5(3)145; PPC32-NEXT: addi 8, 9, 1146; PPC32-NEXT: stb 11, 7(3)147; PPC32-NEXT: stb 8, 4(3)148; PPC32-NEXT: stb 7, 3(3)149; PPC32-NEXT: stb 6, 2(3)150; PPC32-NEXT: stb 5, 1(3)151; PPC32-NEXT: stb 4, 0(3)152; PPC32-NEXT: lwz 30, 56(1) # 4-byte Folded Reload153; PPC32-NEXT: lwz 29, 52(1) # 4-byte Folded Reload154; PPC32-NEXT: lwz 28, 48(1) # 4-byte Folded Reload155; PPC32-NEXT: lwz 27, 44(1) # 4-byte Folded Reload156; PPC32-NEXT: lwz 26, 40(1) # 4-byte Folded Reload157; PPC32-NEXT: lwz 25, 36(1) # 4-byte Folded Reload158; PPC32-NEXT: lwz 24, 32(1) # 4-byte Folded Reload159; PPC32-NEXT: lwz 23, 28(1) # 4-byte Folded Reload160; PPC32-NEXT: lwz 22, 24(1) # 4-byte Folded Reload161; PPC32-NEXT: lwz 21, 20(1) # 4-byte Folded Reload162; PPC32-NEXT: lwz 20, 16(1) # 4-byte Folded Reload163; PPC32-NEXT: addi 1, 1, 64164; PPC32-NEXT: blr165;166; PPC64BE-LABEL: vector_i128_i8:167; PPC64BE: # %bb.0:168; PPC64BE-NEXT: std 21, -88(1) # 8-byte Folded Spill169; PPC64BE-NEXT: lbz 21, 207(1)170; PPC64BE-NEXT: std 22, -80(1) # 8-byte Folded Spill171; PPC64BE-NEXT: std 23, -72(1) # 8-byte Folded Spill172; PPC64BE-NEXT: std 25, -56(1) # 8-byte Folded Spill173; PPC64BE-NEXT: std 24, -64(1) # 8-byte Folded Spill174; PPC64BE-NEXT: std 28, -32(1) # 8-byte Folded Spill175; PPC64BE-NEXT: std 27, -40(1) # 8-byte Folded Spill176; PPC64BE-NEXT: std 26, -48(1) # 8-byte Folded Spill177; PPC64BE-NEXT: std 30, -16(1) # 8-byte Folded Spill178; PPC64BE-NEXT: std 29, -24(1) # 8-byte Folded Spill179; PPC64BE-NEXT: lbz 22, 199(1)180; PPC64BE-NEXT: lbz 23, 191(1)181; PPC64BE-NEXT: add 6, 21, 6182; PPC64BE-NEXT: lbz 21, 231(1)183; PPC64BE-NEXT: add 5, 22, 5184; PPC64BE-NEXT: lbz 22, 223(1)185; PPC64BE-NEXT: add 4, 23, 4186; PPC64BE-NEXT: lbz 23, 215(1)187; PPC64BE-NEXT: add 9, 21, 9188; PPC64BE-NEXT: lbz 25, 127(1)189; PPC64BE-NEXT: add 8, 22, 8190; PPC64BE-NEXT: lbz 21, 255(1)191; PPC64BE-NEXT: add 7, 23, 7192; PPC64BE-NEXT: lbz 24, 119(1)193; PPC64BE-NEXT: addi 9, 9, 1194; PPC64BE-NEXT: lbz 22, 247(1)195; PPC64BE-NEXT: add 25, 21, 25196; PPC64BE-NEXT: lbz 23, 239(1)197; PPC64BE-NEXT: addi 8, 8, 1198; PPC64BE-NEXT: lbz 28, 151(1)199; PPC64BE-NEXT: add 24, 22, 24200; PPC64BE-NEXT: lbz 21, 279(1)201; PPC64BE-NEXT: add 10, 23, 10202; PPC64BE-NEXT: lbz 27, 143(1)203; PPC64BE-NEXT: addi 10, 10, 1204; PPC64BE-NEXT: lbz 22, 271(1)205; PPC64BE-NEXT: add 28, 21, 28206; PPC64BE-NEXT: lbz 26, 135(1)207; PPC64BE-NEXT: addi 7, 7, 1208; PPC64BE-NEXT: lbz 23, 263(1)209; PPC64BE-NEXT: add 27, 22, 27210; PPC64BE-NEXT: lbz 11, 183(1)211; PPC64BE-NEXT: addi 6, 6, 1212; PPC64BE-NEXT: lbz 21, 311(1)213; PPC64BE-NEXT: add 26, 23, 26214; PPC64BE-NEXT: lbz 12, 175(1)215; PPC64BE-NEXT: addi 5, 5, 1216; PPC64BE-NEXT: lbz 0, 303(1)217; PPC64BE-NEXT: add 11, 21, 11218; PPC64BE-NEXT: lbz 30, 167(1)219; PPC64BE-NEXT: addi 11, 11, 1220; PPC64BE-NEXT: lbz 22, 295(1)221; PPC64BE-NEXT: add 12, 0, 12222; PPC64BE-NEXT: lbz 29, 159(1)223; PPC64BE-NEXT: addi 4, 4, 1224; PPC64BE-NEXT: lbz 23, 287(1)225; PPC64BE-NEXT: add 30, 22, 30226; PPC64BE-NEXT: stb 11, 15(3)227; PPC64BE-NEXT: addi 11, 12, 1228; PPC64BE-NEXT: add 29, 23, 29229; PPC64BE-NEXT: stb 11, 14(3)230; PPC64BE-NEXT: addi 11, 30, 1231; PPC64BE-NEXT: stb 11, 13(3)232; PPC64BE-NEXT: addi 11, 29, 1233; PPC64BE-NEXT: stb 11, 12(3)234; PPC64BE-NEXT: addi 11, 28, 1235; PPC64BE-NEXT: stb 11, 11(3)236; PPC64BE-NEXT: addi 11, 27, 1237; PPC64BE-NEXT: stb 11, 10(3)238; PPC64BE-NEXT: addi 11, 26, 1239; PPC64BE-NEXT: stb 11, 9(3)240; PPC64BE-NEXT: addi 11, 25, 1241; PPC64BE-NEXT: stb 11, 8(3)242; PPC64BE-NEXT: addi 11, 24, 1243; PPC64BE-NEXT: stb 11, 7(3)244; PPC64BE-NEXT: stb 10, 6(3)245; PPC64BE-NEXT: stb 9, 5(3)246; PPC64BE-NEXT: stb 8, 4(3)247; PPC64BE-NEXT: stb 7, 3(3)248; PPC64BE-NEXT: stb 6, 2(3)249; PPC64BE-NEXT: stb 5, 1(3)250; PPC64BE-NEXT: stb 4, 0(3)251; PPC64BE-NEXT: ld 30, -16(1) # 8-byte Folded Reload252; PPC64BE-NEXT: ld 29, -24(1) # 8-byte Folded Reload253; PPC64BE-NEXT: ld 28, -32(1) # 8-byte Folded Reload254; PPC64BE-NEXT: ld 27, -40(1) # 8-byte Folded Reload255; PPC64BE-NEXT: ld 26, -48(1) # 8-byte Folded Reload256; PPC64BE-NEXT: ld 25, -56(1) # 8-byte Folded Reload257; PPC64BE-NEXT: ld 24, -64(1) # 8-byte Folded Reload258; PPC64BE-NEXT: ld 23, -72(1) # 8-byte Folded Reload259; PPC64BE-NEXT: ld 22, -80(1) # 8-byte Folded Reload260; PPC64BE-NEXT: ld 21, -88(1) # 8-byte Folded Reload261; PPC64BE-NEXT: blr262;263; PPC64LE-LABEL: vector_i128_i8:264; PPC64LE: # %bb.0:265; PPC64LE-NEXT: xxlnor 34, 34, 34266; PPC64LE-NEXT: vsububm 2, 3, 2267; PPC64LE-NEXT: blr268 %t0 = xor <16 x i8> %x, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>269 %t1 = sub <16 x i8> %y, %t0270 ret <16 x i8> %t1271}272 273define <8 x i16> @vector_i128_i16(<8 x i16> %x, <8 x i16> %y) nounwind {274; PPC32-LABEL: vector_i128_i16:275; PPC32: # %bb.0:276; PPC32-NEXT: stwu 1, -32(1)277; PPC32-NEXT: stw 26, 8(1) # 4-byte Folded Spill278; PPC32-NEXT: stw 27, 12(1) # 4-byte Folded Spill279; PPC32-NEXT: stw 28, 16(1) # 4-byte Folded Spill280; PPC32-NEXT: stw 29, 20(1) # 4-byte Folded Spill281; PPC32-NEXT: stw 30, 24(1) # 4-byte Folded Spill282; PPC32-NEXT: lhz 11, 70(1)283; PPC32-NEXT: lhz 12, 66(1)284; PPC32-NEXT: lhz 0, 62(1)285; PPC32-NEXT: add 10, 11, 10286; PPC32-NEXT: lhz 30, 58(1)287; PPC32-NEXT: add 9, 12, 9288; PPC32-NEXT: lhz 29, 50(1)289; PPC32-NEXT: add 8, 0, 8290; PPC32-NEXT: lhz 28, 42(1)291; PPC32-NEXT: add 7, 30, 7292; PPC32-NEXT: lhz 27, 46(1)293; PPC32-NEXT: add 5, 29, 5294; PPC32-NEXT: lhz 26, 54(1)295; PPC32-NEXT: add 3, 28, 3296; PPC32-NEXT: add 4, 27, 4297; PPC32-NEXT: addi 3, 3, 1298; PPC32-NEXT: add 6, 26, 6299; PPC32-NEXT: addi 4, 4, 1300; PPC32-NEXT: addi 5, 5, 1301; PPC32-NEXT: addi 6, 6, 1302; PPC32-NEXT: addi 7, 7, 1303; PPC32-NEXT: addi 8, 8, 1304; PPC32-NEXT: addi 9, 9, 1305; PPC32-NEXT: addi 10, 10, 1306; PPC32-NEXT: lwz 30, 24(1) # 4-byte Folded Reload307; PPC32-NEXT: lwz 29, 20(1) # 4-byte Folded Reload308; PPC32-NEXT: lwz 28, 16(1) # 4-byte Folded Reload309; PPC32-NEXT: lwz 27, 12(1) # 4-byte Folded Reload310; PPC32-NEXT: lwz 26, 8(1) # 4-byte Folded Reload311; PPC32-NEXT: addi 1, 1, 32312; PPC32-NEXT: blr313;314; PPC64BE-LABEL: vector_i128_i16:315; PPC64BE: # %bb.0:316; PPC64BE-NEXT: std 25, -56(1) # 8-byte Folded Spill317; PPC64BE-NEXT: std 26, -48(1) # 8-byte Folded Spill318; PPC64BE-NEXT: std 27, -40(1) # 8-byte Folded Spill319; PPC64BE-NEXT: std 28, -32(1) # 8-byte Folded Spill320; PPC64BE-NEXT: std 29, -24(1) # 8-byte Folded Spill321; PPC64BE-NEXT: std 30, -16(1) # 8-byte Folded Spill322; PPC64BE-NEXT: lhz 11, 118(1)323; PPC64BE-NEXT: lhz 12, 182(1)324; PPC64BE-NEXT: lhz 0, 174(1)325; PPC64BE-NEXT: lhz 30, 166(1)326; PPC64BE-NEXT: add 11, 12, 11327; PPC64BE-NEXT: lhz 29, 158(1)328; PPC64BE-NEXT: add 10, 0, 10329; PPC64BE-NEXT: lhz 28, 142(1)330; PPC64BE-NEXT: add 9, 30, 9331; PPC64BE-NEXT: lhz 27, 126(1)332; PPC64BE-NEXT: add 8, 29, 8333; PPC64BE-NEXT: lhz 26, 134(1)334; PPC64BE-NEXT: add 6, 28, 6335; PPC64BE-NEXT: lhz 25, 150(1)336; PPC64BE-NEXT: add 4, 27, 4337; PPC64BE-NEXT: add 5, 26, 5338; PPC64BE-NEXT: addi 11, 11, 1339; PPC64BE-NEXT: add 7, 25, 7340; PPC64BE-NEXT: addi 10, 10, 1341; PPC64BE-NEXT: addi 9, 9, 1342; PPC64BE-NEXT: addi 8, 8, 1343; PPC64BE-NEXT: addi 7, 7, 1344; PPC64BE-NEXT: addi 6, 6, 1345; PPC64BE-NEXT: addi 5, 5, 1346; PPC64BE-NEXT: addi 4, 4, 1347; PPC64BE-NEXT: sth 11, 14(3)348; PPC64BE-NEXT: sth 10, 12(3)349; PPC64BE-NEXT: sth 9, 10(3)350; PPC64BE-NEXT: sth 8, 8(3)351; PPC64BE-NEXT: sth 7, 6(3)352; PPC64BE-NEXT: sth 6, 4(3)353; PPC64BE-NEXT: sth 5, 2(3)354; PPC64BE-NEXT: sth 4, 0(3)355; PPC64BE-NEXT: ld 30, -16(1) # 8-byte Folded Reload356; PPC64BE-NEXT: ld 29, -24(1) # 8-byte Folded Reload357; PPC64BE-NEXT: ld 28, -32(1) # 8-byte Folded Reload358; PPC64BE-NEXT: ld 27, -40(1) # 8-byte Folded Reload359; PPC64BE-NEXT: ld 26, -48(1) # 8-byte Folded Reload360; PPC64BE-NEXT: ld 25, -56(1) # 8-byte Folded Reload361; PPC64BE-NEXT: blr362;363; PPC64LE-LABEL: vector_i128_i16:364; PPC64LE: # %bb.0:365; PPC64LE-NEXT: xxlnor 34, 34, 34366; PPC64LE-NEXT: vsubuhm 2, 3, 2367; PPC64LE-NEXT: blr368 %t0 = xor <8 x i16> %x, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>369 %t1 = sub <8 x i16> %y, %t0370 ret <8 x i16> %t1371}372 373define <4 x i32> @vector_i128_i32(<4 x i32> %x, <4 x i32> %y) nounwind {374; PPC32-LABEL: vector_i128_i32:375; PPC32: # %bb.0:376; PPC32-NEXT: add 3, 7, 3377; PPC32-NEXT: add 4, 8, 4378; PPC32-NEXT: add 5, 9, 5379; PPC32-NEXT: add 6, 10, 6380; PPC32-NEXT: addi 3, 3, 1381; PPC32-NEXT: addi 4, 4, 1382; PPC32-NEXT: addi 5, 5, 1383; PPC32-NEXT: addi 6, 6, 1384; PPC32-NEXT: blr385;386; PPC64BE-LABEL: vector_i128_i32:387; PPC64BE: # %bb.0:388; PPC64BE-NEXT: add 6, 10, 6389; PPC64BE-NEXT: add 5, 9, 5390; PPC64BE-NEXT: add 4, 8, 4391; PPC64BE-NEXT: add 3, 7, 3392; PPC64BE-NEXT: addi 6, 6, 1393; PPC64BE-NEXT: addi 5, 5, 1394; PPC64BE-NEXT: addi 4, 4, 1395; PPC64BE-NEXT: addi 3, 3, 1396; PPC64BE-NEXT: blr397;398; PPC64LE-LABEL: vector_i128_i32:399; PPC64LE: # %bb.0:400; PPC64LE-NEXT: xxlnor 34, 34, 34401; PPC64LE-NEXT: vsubuwm 2, 3, 2402; PPC64LE-NEXT: blr403 %t0 = xor <4 x i32> %x, <i32 -1, i32 -1, i32 -1, i32 -1>404 %t1 = sub <4 x i32> %y, %t0405 ret <4 x i32> %t1406}407 408define <2 x i64> @vector_i128_i64(<2 x i64> %x, <2 x i64> %y) nounwind {409; PPC32-LABEL: vector_i128_i64:410; PPC32: # %bb.0:411; PPC32-NEXT: not 4, 4412; PPC32-NEXT: not 3, 3413; PPC32-NEXT: subc 4, 8, 4414; PPC32-NEXT: not 6, 6415; PPC32-NEXT: subfe 3, 3, 7416; PPC32-NEXT: not 5, 5417; PPC32-NEXT: subc 6, 10, 6418; PPC32-NEXT: subfe 5, 5, 9419; PPC32-NEXT: blr420;421; PPC64BE-LABEL: vector_i128_i64:422; PPC64BE: # %bb.0:423; PPC64BE-NEXT: add 3, 5, 3424; PPC64BE-NEXT: add 4, 6, 4425; PPC64BE-NEXT: addi 3, 3, 1426; PPC64BE-NEXT: addi 4, 4, 1427; PPC64BE-NEXT: blr428;429; PPC64LE-LABEL: vector_i128_i64:430; PPC64LE: # %bb.0:431; PPC64LE-NEXT: xxlnor 34, 34, 34432; PPC64LE-NEXT: vsubudm 2, 3, 2433; PPC64LE-NEXT: blr434 %t0 = xor <2 x i64> %x, <i64 -1, i64 -1>435 %t1 = sub <2 x i64> %y, %t0436 ret <2 x i64> %t1437}438