173 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 @cttz4(i4 %x) {6; CHECK-LABEL: cttz4:7; CHECK: // %bb.0:8; CHECK-NEXT: orr w8, w0, #0x109; CHECK-NEXT: rbit w8, w810; CHECK-NEXT: clz w0, w811; CHECK-NEXT: ret12;13; CHECK-CSSC-LABEL: cttz4:14; CHECK-CSSC: // %bb.0:15; CHECK-CSSC-NEXT: orr w8, w0, #0x1016; CHECK-CSSC-NEXT: ctz w0, w817; CHECK-CSSC-NEXT: ret18 %ctz = tail call i4 @llvm.cttz.i4(i4 %x)19 ret i4 %ctz20}21 22define i8 @cttz8(i8 %x) {23; CHECK-LABEL: cttz8:24; CHECK: // %bb.0:25; CHECK-NEXT: orr w8, w0, #0x10026; CHECK-NEXT: rbit w8, w827; CHECK-NEXT: clz w0, w828; CHECK-NEXT: ret29;30; CHECK-CSSC-LABEL: cttz8:31; CHECK-CSSC: // %bb.0:32; CHECK-CSSC-NEXT: orr w8, w0, #0x10033; CHECK-CSSC-NEXT: ctz w0, w834; CHECK-CSSC-NEXT: ret35 %ctz = tail call i8 @llvm.cttz.i8(i8 %x)36 ret i8 %ctz37}38 39define i16 @cttz16(i16 %x) {40; CHECK-LABEL: cttz16:41; CHECK: // %bb.0:42; CHECK-NEXT: orr w8, w0, #0x1000043; CHECK-NEXT: rbit w8, w844; CHECK-NEXT: clz w0, w845; CHECK-NEXT: ret46;47; CHECK-CSSC-LABEL: cttz16:48; CHECK-CSSC: // %bb.0:49; CHECK-CSSC-NEXT: orr w8, w0, #0x1000050; CHECK-CSSC-NEXT: ctz w0, w851; CHECK-CSSC-NEXT: ret52 %ctz = tail call i16 @llvm.cttz.i16(i16 %x)53 ret i16 %ctz54}55 56define i17 @cttz17(i17 %x) {57; CHECK-LABEL: cttz17:58; CHECK: // %bb.0:59; CHECK-NEXT: orr w8, w0, #0x2000060; CHECK-NEXT: rbit w8, w861; CHECK-NEXT: clz w0, w862; CHECK-NEXT: ret63;64; CHECK-CSSC-LABEL: cttz17:65; CHECK-CSSC: // %bb.0:66; CHECK-CSSC-NEXT: orr w8, w0, #0x2000067; CHECK-CSSC-NEXT: ctz w0, w868; CHECK-CSSC-NEXT: ret69 %ctz = tail call i17 @llvm.cttz.i17(i17 %x)70 ret i17 %ctz71}72 73define i32 @cttz32(i32 %x) nounwind readnone {74; CHECK-LABEL: cttz32:75; CHECK: // %bb.0:76; CHECK-NEXT: rbit w8, w077; CHECK-NEXT: clz w0, w878; CHECK-NEXT: ret79;80; CHECK-CSSC-LABEL: cttz32:81; CHECK-CSSC: // %bb.0:82; CHECK-CSSC-NEXT: ctz w0, w083; CHECK-CSSC-NEXT: ret84 %ctz = tail call i32 @llvm.cttz.i32(i32 %x)85 ret i32 %ctz86}87 88define i64 @cttz64(i64 %x) nounwind readnone {89; CHECK-LABEL: cttz64:90; CHECK: // %bb.0:91; CHECK-NEXT: rbit x8, x092; CHECK-NEXT: clz x0, x893; CHECK-NEXT: ret94;95; CHECK-CSSC-LABEL: cttz64:96; CHECK-CSSC: // %bb.0:97; CHECK-CSSC-NEXT: ctz x0, x098; CHECK-CSSC-NEXT: ret99 %ctz = tail call i64 @llvm.cttz.i64(i64 %x)100 ret i64 %ctz101}102 103define i128 @cttz128(i128 %x) nounwind readnone {104; CHECK-LABEL: cttz128:105; CHECK: // %bb.0:106; CHECK-NEXT: rbit x8, x1107; CHECK-NEXT: rbit x9, x0108; CHECK-NEXT: cmp x0, #0109; CHECK-NEXT: mov x1, xzr110; CHECK-NEXT: clz x8, x8111; CHECK-NEXT: clz x9, x9112; CHECK-NEXT: add x8, x8, #64113; CHECK-NEXT: csel x0, x9, x8, ne114; CHECK-NEXT: ret115;116; CHECK-CSSC-LABEL: cttz128:117; CHECK-CSSC: // %bb.0:118; CHECK-CSSC-NEXT: ctz x8, x1119; CHECK-CSSC-NEXT: ctz x9, x0120; CHECK-CSSC-NEXT: cmp x0, #0121; CHECK-CSSC-NEXT: add x8, x8, #64122; CHECK-CSSC-NEXT: mov x1, xzr123; CHECK-CSSC-NEXT: csel x0, x9, x8, ne124; CHECK-CSSC-NEXT: ret125 %ctz = tail call i128 @llvm.cttz.i128(i128 %x)126 ret i128 %ctz127}128 129define i32 @cttz32combine(i32 %x) nounwind readnone {130; CHECK-LABEL: cttz32combine:131; CHECK: // %bb.0:132; CHECK-NEXT: rbit w8, w0133; CHECK-NEXT: clz w0, w8134; CHECK-NEXT: ret135;136; CHECK-CSSC-LABEL: cttz32combine:137; CHECK-CSSC: // %bb.0:138; CHECK-CSSC-NEXT: ctz w0, w0139; CHECK-CSSC-NEXT: ret140 %rev = tail call i32 @llvm.bitreverse.i32(i32 %x)141 %ctz = tail call i32 @llvm.ctlz.i32(i32 %rev)142 ret i32 %ctz143}144 145define i64 @cttz64combine(i64 %x) nounwind readnone {146; CHECK-LABEL: cttz64combine:147; CHECK: // %bb.0:148; CHECK-NEXT: rbit x8, x0149; CHECK-NEXT: clz x0, x8150; CHECK-NEXT: ret151;152; CHECK-CSSC-LABEL: cttz64combine:153; CHECK-CSSC: // %bb.0:154; CHECK-CSSC-NEXT: ctz x0, x0155; CHECK-CSSC-NEXT: ret156 %rev = tail call i64 @llvm.bitreverse.i64(i64 %x)157 %ctz = tail call i64 @llvm.ctlz.i64(i64 %rev)158 ret i64 %ctz159}160 161declare i4 @llvm.cttz.i4(i4 %x) nounwind readnone162declare i8 @llvm.cttz.i8(i8 %x) nounwind readnone163declare i16 @llvm.cttz.i16(i16 %x) nounwind readnone164declare i17 @llvm.cttz.i17(i17 %x) nounwind readnone165declare i32 @llvm.cttz.i32(i32) nounwind readnone166declare i64 @llvm.cttz.i64(i64) nounwind readnone167declare i128 @llvm.cttz.i128(i128) nounwind readnone168 169declare i32 @llvm.ctlz.i32(i32 %x) nounwind readnone170declare i32 @llvm.bitreverse.i32(i32 %x) nounwind readnone171declare i64 @llvm.ctlz.i64(i64 %x) nounwind readnone172declare i64 @llvm.bitreverse.i64(i64 %x) nounwind readnone173