352 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=sparc | FileCheck %s -check-prefix=SPARC3; RUN: llc < %s -mtriple=sparc -mattr=popc | FileCheck %s -check-prefix=SPARC-POPC4; RUN: llc < %s -mtriple=sparc -mattr=vis3 | FileCheck %s -check-prefix=SPARC-VIS35; RUN: llc < %s -mtriple=sparcv9 | FileCheck %s -check-prefix=SPARC646; RUN: llc < %s -mtriple=sparcv9 -mattr=popc | FileCheck %s -check-prefix=SPARC64-POPC7; RUN: llc < %s -mtriple=sparcv9 -mattr=vis3 | FileCheck %s -check-prefix=SPARC64-VIS38 9define i32 @i32_nopoison(i32 %x) nounwind {10; SPARC-LABEL: i32_nopoison:11; SPARC: ! %bb.0:12; SPARC-NEXT: save %sp, -96, %sp13; SPARC-NEXT: cmp %i0, 014; SPARC-NEXT: be .LBB0_215; SPARC-NEXT: nop16; SPARC-NEXT: ! %bb.1: ! %cond.false17; SPARC-NEXT: call __clzsi218; SPARC-NEXT: mov %i0, %o019; SPARC-NEXT: ret20; SPARC-NEXT: restore %g0, %o0, %o021; SPARC-NEXT: .LBB0_2:22; SPARC-NEXT: ret23; SPARC-NEXT: restore %g0, 32, %o024;25; SPARC-POPC-LABEL: i32_nopoison:26; SPARC-POPC: ! %bb.0:27; SPARC-POPC-NEXT: save %sp, -96, %sp28; SPARC-POPC-NEXT: cmp %i0, 029; SPARC-POPC-NEXT: be .LBB0_230; SPARC-POPC-NEXT: nop31; SPARC-POPC-NEXT: ! %bb.1: ! %cond.false32; SPARC-POPC-NEXT: call __clzsi233; SPARC-POPC-NEXT: mov %i0, %o034; SPARC-POPC-NEXT: ret35; SPARC-POPC-NEXT: restore %g0, %o0, %o036; SPARC-POPC-NEXT: .LBB0_2:37; SPARC-POPC-NEXT: ret38; SPARC-POPC-NEXT: restore %g0, 32, %o039;40; SPARC-VIS3-LABEL: i32_nopoison:41; SPARC-VIS3: ! %bb.0:42; SPARC-VIS3-NEXT: srl %o0, 0, %o043; SPARC-VIS3-NEXT: lzcnt %o0, %o044; SPARC-VIS3-NEXT: retl45; SPARC-VIS3-NEXT: add %o0, -32, %o046;47; SPARC64-LABEL: i32_nopoison:48; SPARC64: ! %bb.0:49; SPARC64-NEXT: save %sp, -176, %sp50; SPARC64-NEXT: cmp %i0, 051; SPARC64-NEXT: be %icc, .LBB0_252; SPARC64-NEXT: nop53; SPARC64-NEXT: ! %bb.1: ! %cond.false54; SPARC64-NEXT: call __clzdi255; SPARC64-NEXT: sllx %i0, 32, %o056; SPARC64-NEXT: ret57; SPARC64-NEXT: restore %g0, %o0, %o058; SPARC64-NEXT: .LBB0_2:59; SPARC64-NEXT: ret60; SPARC64-NEXT: restore %g0, 32, %o061;62; SPARC64-POPC-LABEL: i32_nopoison:63; SPARC64-POPC: ! %bb.0:64; SPARC64-POPC-NEXT: cmp %o0, 065; SPARC64-POPC-NEXT: be %icc, .LBB0_266; SPARC64-POPC-NEXT: nop67; SPARC64-POPC-NEXT: ! %bb.1: ! %cond.false68; SPARC64-POPC-NEXT: srl %o0, 1, %o169; SPARC64-POPC-NEXT: or %o0, %o1, %o070; SPARC64-POPC-NEXT: srl %o0, 2, %o171; SPARC64-POPC-NEXT: or %o0, %o1, %o072; SPARC64-POPC-NEXT: srl %o0, 4, %o173; SPARC64-POPC-NEXT: or %o0, %o1, %o074; SPARC64-POPC-NEXT: srl %o0, 8, %o175; SPARC64-POPC-NEXT: or %o0, %o1, %o076; SPARC64-POPC-NEXT: srl %o0, 16, %o177; SPARC64-POPC-NEXT: or %o0, %o1, %o078; SPARC64-POPC-NEXT: xor %o0, -1, %o079; SPARC64-POPC-NEXT: srl %o0, 0, %o080; SPARC64-POPC-NEXT: retl81; SPARC64-POPC-NEXT: popc %o0, %o082; SPARC64-POPC-NEXT: .LBB0_2:83; SPARC64-POPC-NEXT: retl84; SPARC64-POPC-NEXT: mov 32, %o085;86; SPARC64-VIS3-LABEL: i32_nopoison:87; SPARC64-VIS3: ! %bb.0:88; SPARC64-VIS3-NEXT: srl %o0, 0, %o089; SPARC64-VIS3-NEXT: lzcnt %o0, %o090; SPARC64-VIS3-NEXT: retl91; SPARC64-VIS3-NEXT: add %o0, -32, %o092 %ret = call i32 @llvm.ctlz.i32(i32 %x, i1 false)93 ret i32 %ret94}95 96define i32 @i32_poison(i32 %x) nounwind {97; SPARC-LABEL: i32_poison:98; SPARC: ! %bb.0:99; SPARC-NEXT: save %sp, -96, %sp100; SPARC-NEXT: call __clzsi2101; SPARC-NEXT: mov %i0, %o0102; SPARC-NEXT: ret103; SPARC-NEXT: restore %g0, %o0, %o0104;105; SPARC-POPC-LABEL: i32_poison:106; SPARC-POPC: ! %bb.0:107; SPARC-POPC-NEXT: save %sp, -96, %sp108; SPARC-POPC-NEXT: call __clzsi2109; SPARC-POPC-NEXT: mov %i0, %o0110; SPARC-POPC-NEXT: ret111; SPARC-POPC-NEXT: restore %g0, %o0, %o0112;113; SPARC-VIS3-LABEL: i32_poison:114; SPARC-VIS3: ! %bb.0:115; SPARC-VIS3-NEXT: srl %o0, 0, %o0116; SPARC-VIS3-NEXT: lzcnt %o0, %o0117; SPARC-VIS3-NEXT: retl118; SPARC-VIS3-NEXT: add %o0, -32, %o0119;120; SPARC64-LABEL: i32_poison:121; SPARC64: ! %bb.0:122; SPARC64-NEXT: save %sp, -176, %sp123; SPARC64-NEXT: call __clzdi2124; SPARC64-NEXT: sllx %i0, 32, %o0125; SPARC64-NEXT: ret126; SPARC64-NEXT: restore %g0, %o0, %o0127;128; SPARC64-POPC-LABEL: i32_poison:129; SPARC64-POPC: ! %bb.0:130; SPARC64-POPC-NEXT: srl %o0, 1, %o1131; SPARC64-POPC-NEXT: or %o0, %o1, %o0132; SPARC64-POPC-NEXT: srl %o0, 2, %o1133; SPARC64-POPC-NEXT: or %o0, %o1, %o0134; SPARC64-POPC-NEXT: srl %o0, 4, %o1135; SPARC64-POPC-NEXT: or %o0, %o1, %o0136; SPARC64-POPC-NEXT: srl %o0, 8, %o1137; SPARC64-POPC-NEXT: or %o0, %o1, %o0138; SPARC64-POPC-NEXT: srl %o0, 16, %o1139; SPARC64-POPC-NEXT: or %o0, %o1, %o0140; SPARC64-POPC-NEXT: xor %o0, -1, %o0141; SPARC64-POPC-NEXT: srl %o0, 0, %o0142; SPARC64-POPC-NEXT: retl143; SPARC64-POPC-NEXT: popc %o0, %o0144;145; SPARC64-VIS3-LABEL: i32_poison:146; SPARC64-VIS3: ! %bb.0:147; SPARC64-VIS3-NEXT: srl %o0, 0, %o0148; SPARC64-VIS3-NEXT: lzcnt %o0, %o0149; SPARC64-VIS3-NEXT: retl150; SPARC64-VIS3-NEXT: add %o0, -32, %o0151 %ret = call i32 @llvm.ctlz.i32(i32 %x, i1 true)152 ret i32 %ret153}154 155define i64 @i64_nopoison(i64 %x) nounwind {156; SPARC-LABEL: i64_nopoison:157; SPARC: ! %bb.0:158; SPARC-NEXT: save %sp, -96, %sp159; SPARC-NEXT: orcc %i1, %i0, %g0160; SPARC-NEXT: be .LBB2_4161; SPARC-NEXT: nop162; SPARC-NEXT: ! %bb.1: ! %cond.false163; SPARC-NEXT: call __clzsi2164; SPARC-NEXT: mov %i1, %o0165; SPARC-NEXT: mov %o0, %i2166; SPARC-NEXT: call __clzsi2167; SPARC-NEXT: mov %i0, %o0168; SPARC-NEXT: cmp %i0, 0169; SPARC-NEXT: bne .LBB2_3170; SPARC-NEXT: mov %o0, %i1171; SPARC-NEXT: ! %bb.2: ! %cond.false172; SPARC-NEXT: add %i2, 32, %i1173; SPARC-NEXT: .LBB2_3: ! %cond.false174; SPARC-NEXT: ret175; SPARC-NEXT: restore %g0, %g0, %o0176; SPARC-NEXT: .LBB2_4:177; SPARC-NEXT: mov %g0, %i0178; SPARC-NEXT: ret179; SPARC-NEXT: restore %g0, 64, %o1180;181; SPARC-POPC-LABEL: i64_nopoison:182; SPARC-POPC: ! %bb.0:183; SPARC-POPC-NEXT: save %sp, -96, %sp184; SPARC-POPC-NEXT: orcc %i1, %i0, %g0185; SPARC-POPC-NEXT: be .LBB2_4186; SPARC-POPC-NEXT: nop187; SPARC-POPC-NEXT: ! %bb.1: ! %cond.false188; SPARC-POPC-NEXT: call __clzsi2189; SPARC-POPC-NEXT: mov %i1, %o0190; SPARC-POPC-NEXT: mov %o0, %i2191; SPARC-POPC-NEXT: call __clzsi2192; SPARC-POPC-NEXT: mov %i0, %o0193; SPARC-POPC-NEXT: cmp %i0, 0194; SPARC-POPC-NEXT: bne .LBB2_3195; SPARC-POPC-NEXT: mov %o0, %i1196; SPARC-POPC-NEXT: ! %bb.2: ! %cond.false197; SPARC-POPC-NEXT: add %i2, 32, %i1198; SPARC-POPC-NEXT: .LBB2_3: ! %cond.false199; SPARC-POPC-NEXT: ret200; SPARC-POPC-NEXT: restore %g0, %g0, %o0201; SPARC-POPC-NEXT: .LBB2_4:202; SPARC-POPC-NEXT: mov %g0, %i0203; SPARC-POPC-NEXT: ret204; SPARC-POPC-NEXT: restore %g0, 64, %o1205;206; SPARC-VIS3-LABEL: i64_nopoison:207; SPARC-VIS3: ! %bb.0:208; SPARC-VIS3-NEXT: srl %o0, 0, %o2209; SPARC-VIS3-NEXT: lzcnt %o2, %o2210; SPARC-VIS3-NEXT: add %o2, -32, %o2211; SPARC-VIS3-NEXT: srl %o1, 0, %o1212; SPARC-VIS3-NEXT: lzcnt %o1, %o1213; SPARC-VIS3-NEXT: add %o1, -32, %o1214; SPARC-VIS3-NEXT: add %o1, 32, %o1215; SPARC-VIS3-NEXT: cmp %o0, 0216; SPARC-VIS3-NEXT: movne %icc, %o2, %o1217; SPARC-VIS3-NEXT: retl218; SPARC-VIS3-NEXT: mov %g0, %o0219;220; SPARC64-LABEL: i64_nopoison:221; SPARC64: ! %bb.0:222; SPARC64-NEXT: save %sp, -176, %sp223; SPARC64-NEXT: brz %i0, .LBB2_2224; SPARC64-NEXT: nop225; SPARC64-NEXT: ! %bb.1: ! %cond.false226; SPARC64-NEXT: call __clzdi2227; SPARC64-NEXT: mov %i0, %o0228; SPARC64-NEXT: ret229; SPARC64-NEXT: restore %g0, %o0, %o0230; SPARC64-NEXT: .LBB2_2:231; SPARC64-NEXT: ret232; SPARC64-NEXT: restore %g0, 64, %o0233;234; SPARC64-POPC-LABEL: i64_nopoison:235; SPARC64-POPC: ! %bb.0:236; SPARC64-POPC-NEXT: brz %o0, .LBB2_2237; SPARC64-POPC-NEXT: nop238; SPARC64-POPC-NEXT: ! %bb.1: ! %cond.false239; SPARC64-POPC-NEXT: srlx %o0, 1, %o1240; SPARC64-POPC-NEXT: or %o0, %o1, %o0241; SPARC64-POPC-NEXT: srlx %o0, 2, %o1242; SPARC64-POPC-NEXT: or %o0, %o1, %o0243; SPARC64-POPC-NEXT: srlx %o0, 4, %o1244; SPARC64-POPC-NEXT: or %o0, %o1, %o0245; SPARC64-POPC-NEXT: srlx %o0, 8, %o1246; SPARC64-POPC-NEXT: or %o0, %o1, %o0247; SPARC64-POPC-NEXT: srlx %o0, 16, %o1248; SPARC64-POPC-NEXT: or %o0, %o1, %o0249; SPARC64-POPC-NEXT: srlx %o0, 32, %o1250; SPARC64-POPC-NEXT: or %o0, %o1, %o0251; SPARC64-POPC-NEXT: xor %o0, -1, %o0252; SPARC64-POPC-NEXT: retl253; SPARC64-POPC-NEXT: popc %o0, %o0254; SPARC64-POPC-NEXT: .LBB2_2:255; SPARC64-POPC-NEXT: retl256; SPARC64-POPC-NEXT: mov 64, %o0257;258; SPARC64-VIS3-LABEL: i64_nopoison:259; SPARC64-VIS3: ! %bb.0:260; SPARC64-VIS3-NEXT: retl261; SPARC64-VIS3-NEXT: lzcnt %o0, %o0262 %ret = call i64 @llvm.ctlz.i64(i64 %x, i1 false)263 ret i64 %ret264}265 266define i64 @i64_poison(i64 %x) nounwind {267; SPARC-LABEL: i64_poison:268; SPARC: ! %bb.0:269; SPARC-NEXT: save %sp, -96, %sp270; SPARC-NEXT: mov %i1, %o0271; SPARC-NEXT: call __clzsi2272; SPARC-NEXT: mov %i0, %i1273; SPARC-NEXT: mov %o0, %i0274; SPARC-NEXT: call __clzsi2275; SPARC-NEXT: mov %i1, %o0276; SPARC-NEXT: cmp %i1, 0277; SPARC-NEXT: bne .LBB3_2278; SPARC-NEXT: nop279; SPARC-NEXT: ! %bb.1:280; SPARC-NEXT: add %i0, 32, %o0281; SPARC-NEXT: .LBB3_2:282; SPARC-NEXT: mov %g0, %i0283; SPARC-NEXT: ret284; SPARC-NEXT: restore %g0, %o0, %o1285;286; SPARC-POPC-LABEL: i64_poison:287; SPARC-POPC: ! %bb.0:288; SPARC-POPC-NEXT: save %sp, -96, %sp289; SPARC-POPC-NEXT: mov %i1, %o0290; SPARC-POPC-NEXT: call __clzsi2291; SPARC-POPC-NEXT: mov %i0, %i1292; SPARC-POPC-NEXT: mov %o0, %i0293; SPARC-POPC-NEXT: call __clzsi2294; SPARC-POPC-NEXT: mov %i1, %o0295; SPARC-POPC-NEXT: cmp %i1, 0296; SPARC-POPC-NEXT: bne .LBB3_2297; SPARC-POPC-NEXT: nop298; SPARC-POPC-NEXT: ! %bb.1:299; SPARC-POPC-NEXT: add %i0, 32, %o0300; SPARC-POPC-NEXT: .LBB3_2:301; SPARC-POPC-NEXT: mov %g0, %i0302; SPARC-POPC-NEXT: ret303; SPARC-POPC-NEXT: restore %g0, %o0, %o1304;305; SPARC-VIS3-LABEL: i64_poison:306; SPARC-VIS3: ! %bb.0:307; SPARC-VIS3-NEXT: srl %o0, 0, %o2308; SPARC-VIS3-NEXT: lzcnt %o2, %o2309; SPARC-VIS3-NEXT: add %o2, -32, %o2310; SPARC-VIS3-NEXT: srl %o1, 0, %o1311; SPARC-VIS3-NEXT: lzcnt %o1, %o1312; SPARC-VIS3-NEXT: add %o1, -32, %o1313; SPARC-VIS3-NEXT: add %o1, 32, %o1314; SPARC-VIS3-NEXT: cmp %o0, 0315; SPARC-VIS3-NEXT: movne %icc, %o2, %o1316; SPARC-VIS3-NEXT: retl317; SPARC-VIS3-NEXT: mov %g0, %o0318;319; SPARC64-LABEL: i64_poison:320; SPARC64: ! %bb.0:321; SPARC64-NEXT: save %sp, -176, %sp322; SPARC64-NEXT: call __clzdi2323; SPARC64-NEXT: mov %i0, %o0324; SPARC64-NEXT: ret325; SPARC64-NEXT: restore %g0, %o0, %o0326;327; SPARC64-POPC-LABEL: i64_poison:328; SPARC64-POPC: ! %bb.0:329; SPARC64-POPC-NEXT: srlx %o0, 1, %o1330; SPARC64-POPC-NEXT: or %o0, %o1, %o0331; SPARC64-POPC-NEXT: srlx %o0, 2, %o1332; SPARC64-POPC-NEXT: or %o0, %o1, %o0333; SPARC64-POPC-NEXT: srlx %o0, 4, %o1334; SPARC64-POPC-NEXT: or %o0, %o1, %o0335; SPARC64-POPC-NEXT: srlx %o0, 8, %o1336; SPARC64-POPC-NEXT: or %o0, %o1, %o0337; SPARC64-POPC-NEXT: srlx %o0, 16, %o1338; SPARC64-POPC-NEXT: or %o0, %o1, %o0339; SPARC64-POPC-NEXT: srlx %o0, 32, %o1340; SPARC64-POPC-NEXT: or %o0, %o1, %o0341; SPARC64-POPC-NEXT: xor %o0, -1, %o0342; SPARC64-POPC-NEXT: retl343; SPARC64-POPC-NEXT: popc %o0, %o0344;345; SPARC64-VIS3-LABEL: i64_poison:346; SPARC64-VIS3: ! %bb.0:347; SPARC64-VIS3-NEXT: retl348; SPARC64-VIS3-NEXT: lzcnt %o0, %o0349 %ret = call i64 @llvm.ctlz.i64(i64 %x, i1 true)350 ret i64 %ret351}352