250 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -verify-machineinstrs -o - %s -mtriple=aarch64-linux-gnu | FileCheck %s3; RUN: llc -verify-machineinstrs -o - %s -mtriple=aarch64-linux-gnu -mattr=+cssc | FileCheck %s -check-prefix=CHECK-CSSC4 5define i4 @parity_4(i4 %x) {6; CHECK-LABEL: parity_4:7; CHECK: // %bb.0:8; CHECK-NEXT: and w8, w0, #0xf9; CHECK-NEXT: eor w8, w8, w8, lsr #210; CHECK-NEXT: eor w8, w8, w8, lsr #111; CHECK-NEXT: and w0, w8, #0x112; CHECK-NEXT: ret13;14; CHECK-CSSC-LABEL: parity_4:15; CHECK-CSSC: // %bb.0:16; CHECK-CSSC-NEXT: and w8, w0, #0xf17; CHECK-CSSC-NEXT: cnt w8, w818; CHECK-CSSC-NEXT: and w0, w8, #0x119; CHECK-CSSC-NEXT: ret20 %1 = tail call i4 @llvm.ctpop.i4(i4 %x)21 %2 = and i4 %1, 122 ret i4 %223}24 25define i8 @parity_8(i8 %x) {26; CHECK-LABEL: parity_8:27; CHECK: // %bb.0:28; CHECK-NEXT: and w8, w0, #0xff29; CHECK-NEXT: eor w8, w8, w8, lsr #430; CHECK-NEXT: eor w8, w8, w8, lsr #231; CHECK-NEXT: eor w8, w8, w8, lsr #132; CHECK-NEXT: and w0, w8, #0x133; CHECK-NEXT: ret34;35; CHECK-CSSC-LABEL: parity_8:36; CHECK-CSSC: // %bb.0:37; CHECK-CSSC-NEXT: and w8, w0, #0xff38; CHECK-CSSC-NEXT: cnt w8, w839; CHECK-CSSC-NEXT: and w0, w8, #0x140; CHECK-CSSC-NEXT: ret41 %1 = tail call i8 @llvm.ctpop.i8(i8 %x)42 %2 = and i8 %1, 143 ret i8 %244}45 46define i16 @parity_16(i16 %x) {47; CHECK-LABEL: parity_16:48; CHECK: // %bb.0:49; CHECK-NEXT: and w8, w0, #0xffff50; CHECK-NEXT: eor w8, w8, w8, lsr #851; CHECK-NEXT: eor w8, w8, w8, lsr #452; CHECK-NEXT: eor w8, w8, w8, lsr #253; CHECK-NEXT: eor w8, w8, w8, lsr #154; CHECK-NEXT: and w0, w8, #0x155; CHECK-NEXT: ret56;57; CHECK-CSSC-LABEL: parity_16:58; CHECK-CSSC: // %bb.0:59; CHECK-CSSC-NEXT: and w8, w0, #0xffff60; CHECK-CSSC-NEXT: cnt w8, w861; CHECK-CSSC-NEXT: and w0, w8, #0x162; CHECK-CSSC-NEXT: ret63 %1 = tail call i16 @llvm.ctpop.i16(i16 %x)64 %2 = and i16 %1, 165 ret i16 %266}67 68define i17 @parity_17(i17 %x) {69; CHECK-LABEL: parity_17:70; CHECK: // %bb.0:71; CHECK-NEXT: and w8, w0, #0x1ffff72; CHECK-NEXT: eor w9, w8, w8, lsr #1673; CHECK-NEXT: eor w8, w9, w8, lsr #874; CHECK-NEXT: eor w8, w8, w8, lsr #475; CHECK-NEXT: eor w8, w8, w8, lsr #276; CHECK-NEXT: eor w8, w8, w8, lsr #177; CHECK-NEXT: and w0, w8, #0x178; CHECK-NEXT: ret79;80; CHECK-CSSC-LABEL: parity_17:81; CHECK-CSSC: // %bb.0:82; CHECK-CSSC-NEXT: and w8, w0, #0x1ffff83; CHECK-CSSC-NEXT: cnt w8, w884; CHECK-CSSC-NEXT: and w0, w8, #0x185; CHECK-CSSC-NEXT: ret86 %1 = tail call i17 @llvm.ctpop.i17(i17 %x)87 %2 = and i17 %1, 188 ret i17 %289}90 91define i32 @parity_32(i32 %x) {92; CHECK-LABEL: parity_32:93; CHECK: // %bb.0:94; CHECK-NEXT: eor w8, w0, w0, lsr #1695; CHECK-NEXT: eor w8, w8, w8, lsr #896; CHECK-NEXT: eor w8, w8, w8, lsr #497; CHECK-NEXT: eor w8, w8, w8, lsr #298; CHECK-NEXT: eor w8, w8, w8, lsr #199; CHECK-NEXT: and w0, w8, #0x1100; CHECK-NEXT: ret101;102; CHECK-CSSC-LABEL: parity_32:103; CHECK-CSSC: // %bb.0:104; CHECK-CSSC-NEXT: cnt w8, w0105; CHECK-CSSC-NEXT: and w0, w8, #0x1106; CHECK-CSSC-NEXT: ret107 %1 = tail call i32 @llvm.ctpop.i32(i32 %x)108 %2 = and i32 %1, 1109 ret i32 %2110}111 112define i64 @parity_64(i64 %x) {113; CHECK-LABEL: parity_64:114; CHECK: // %bb.0:115; CHECK-NEXT: fmov d0, x0116; CHECK-NEXT: cnt v0.8b, v0.8b117; CHECK-NEXT: addv b0, v0.8b118; CHECK-NEXT: fmov x8, d0119; CHECK-NEXT: and x0, x8, #0x1120; CHECK-NEXT: ret121;122; CHECK-CSSC-LABEL: parity_64:123; CHECK-CSSC: // %bb.0:124; CHECK-CSSC-NEXT: cnt x8, x0125; CHECK-CSSC-NEXT: and x0, x8, #0x1126; CHECK-CSSC-NEXT: ret127 %1 = tail call i64 @llvm.ctpop.i64(i64 %x)128 %2 = and i64 %1, 1129 ret i64 %2130}131 132define i128 @parity_128(i128 %x) {133; CHECK-LABEL: parity_128:134; CHECK: // %bb.0:135; CHECK-NEXT: fmov d0, x0136; CHECK-NEXT: mov v0.d[1], x1137; CHECK-NEXT: mov x1, xzr138; CHECK-NEXT: cnt v0.16b, v0.16b139; CHECK-NEXT: addv b0, v0.16b140; CHECK-NEXT: fmov x8, d0141; CHECK-NEXT: and x0, x8, #0x1142; CHECK-NEXT: ret143;144; CHECK-CSSC-LABEL: parity_128:145; CHECK-CSSC: // %bb.0:146; CHECK-CSSC-NEXT: eor x8, x0, x1147; CHECK-CSSC-NEXT: mov x1, xzr148; CHECK-CSSC-NEXT: cnt x8, x8149; CHECK-CSSC-NEXT: and x0, x8, #0x1150; CHECK-CSSC-NEXT: ret151 %1 = tail call i128 @llvm.ctpop.i128(i128 %x)152 %2 = and i128 %1, 1153 ret i128 %2154}155 156define i32 @parity_64_trunc(i64 %x) {157; CHECK-LABEL: parity_64_trunc:158; CHECK: // %bb.0:159; CHECK-NEXT: fmov d0, x0160; CHECK-NEXT: cnt v0.8b, v0.8b161; CHECK-NEXT: addv b0, v0.8b162; CHECK-NEXT: fmov w8, s0163; CHECK-NEXT: and w0, w8, #0x1164; CHECK-NEXT: ret165;166; CHECK-CSSC-LABEL: parity_64_trunc:167; CHECK-CSSC: // %bb.0:168; CHECK-CSSC-NEXT: cnt x8, x0169; CHECK-CSSC-NEXT: and w0, w8, #0x1170; CHECK-CSSC-NEXT: ret171 %1 = tail call i64 @llvm.ctpop.i64(i64 %x)172 %2 = trunc i64 %1 to i32173 %3 = and i32 %2, 1174 ret i32 %3175}176 177define i8 @parity_32_trunc(i32 %x) {178; CHECK-LABEL: parity_32_trunc:179; CHECK: // %bb.0:180; CHECK-NEXT: eor w8, w0, w0, lsr #16181; CHECK-NEXT: eor w8, w8, w8, lsr #8182; CHECK-NEXT: eor w8, w8, w8, lsr #4183; CHECK-NEXT: eor w8, w8, w8, lsr #2184; CHECK-NEXT: eor w8, w8, w8, lsr #1185; CHECK-NEXT: and w0, w8, #0x1186; CHECK-NEXT: ret187;188; CHECK-CSSC-LABEL: parity_32_trunc:189; CHECK-CSSC: // %bb.0:190; CHECK-CSSC-NEXT: cnt w8, w0191; CHECK-CSSC-NEXT: and w0, w8, #0x1192; CHECK-CSSC-NEXT: ret193 %1 = tail call i32 @llvm.ctpop.i32(i32 %x)194 %2 = trunc i32 %1 to i8195 %3 = and i8 %2, 1196 ret i8 %3197}198 199define i32 @parity_8_zext(i8 %x) {200; CHECK-LABEL: parity_8_zext:201; CHECK: // %bb.0:202; CHECK-NEXT: and w8, w0, #0xff203; CHECK-NEXT: eor w8, w8, w8, lsr #4204; CHECK-NEXT: eor w8, w8, w8, lsr #2205; CHECK-NEXT: eor w8, w8, w8, lsr #1206; CHECK-NEXT: and w0, w8, #0x1207; CHECK-NEXT: ret208;209; CHECK-CSSC-LABEL: parity_8_zext:210; CHECK-CSSC: // %bb.0:211; CHECK-CSSC-NEXT: and w8, w0, #0xff212; CHECK-CSSC-NEXT: cnt w8, w8213; CHECK-CSSC-NEXT: and w0, w8, #0x1214; CHECK-CSSC-NEXT: ret215 %a = zext i8 %x to i32216 %b = tail call i32 @llvm.ctpop.i32(i32 %a)217 %c = and i32 %b, 1218 ret i32 %c219}220 221define i32 @parity_8_mask(i32 %x) {222; CHECK-LABEL: parity_8_mask:223; CHECK: // %bb.0:224; CHECK-NEXT: and w8, w0, #0xff225; CHECK-NEXT: eor w8, w8, w8, lsr #4226; CHECK-NEXT: eor w8, w8, w8, lsr #2227; CHECK-NEXT: eor w8, w8, w8, lsr #1228; CHECK-NEXT: and w0, w8, #0x1229; CHECK-NEXT: ret230;231; CHECK-CSSC-LABEL: parity_8_mask:232; CHECK-CSSC: // %bb.0:233; CHECK-CSSC-NEXT: and w8, w0, #0xff234; CHECK-CSSC-NEXT: cnt w8, w8235; CHECK-CSSC-NEXT: and w0, w8, #0x1236; CHECK-CSSC-NEXT: ret237 %a = and i32 %x, 255238 %b = tail call i32 @llvm.ctpop.i32(i32 %a)239 %c = and i32 %b, 1240 ret i32 %c241}242 243declare i4 @llvm.ctpop.i4(i4 %x)244declare i8 @llvm.ctpop.i8(i8 %x)245declare i16 @llvm.ctpop.i16(i16 %x)246declare i17 @llvm.ctpop.i17(i17 %x)247declare i32 @llvm.ctpop.i32(i32 %x)248declare i64 @llvm.ctpop.i64(i64 %x)249declare i128 @llvm.ctpop.i128(i128 %x)250