brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.9 KiB · 9151527 Raw
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