337 lines · plain
1; RUN: llc -mtriple=aarch64-- -o - < %s | FileCheck %s --check-prefix=CHECK-SD2; RUN: llc -mtriple=aarch64-- -mattr=+cssc -o - < %s | FileCheck %s --check-prefix=CHECK-CSSC3 4target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"5target triple = "aarch64-unknown-linux-gnu"6 7; auto icmpi64(long x0) { return x0 != 0; }8define i1 @icmpi64(i64 noundef %0) {9; CHECK-SD-LABEL: icmpi64:10; CHECK-SD: // %bb.0: // %entry11; CHECK-SD-NEXT: cmp x0, #012; CHECK-SD-NEXT: cset w0, ne13; CHECK-SD-NEXT: ret14;15; CHECK-CSSC-LABEL: icmpi64:16; CHECK-CSSC: // %bb.0: // %entry17; CHECK-CSSC-NEXT: umin x0, x0, #118; CHECK-CSSC-NEXT: // kill: def $w0 killed $w0 killed $x019; CHECK-CSSC-NEXT: ret20;21entry:22 %2 = icmp ne i64 %0, 023 ret i1 %224}25 26; auto icmpi32(int x0) { return x0 != 0; }27define i1 @icmpi32(i32 noundef %0) {28; CHECK-SD-LABEL: icmpi32:29; CHECK-SD: // %bb.0: // %entry30; CHECK-SD-NEXT: cmp w0, #031; CHECK-SD-NEXT: cset w0, ne32; CHECK-SD-NEXT: ret33;34; CHECK-CSSC-LABEL: icmpi32:35; CHECK-CSSC: // %bb.0: // %entry36; CHECK-CSSC-NEXT: umin w0, w0, #137; CHECK-CSSC-NEXT: ret38;39entry:40 %2 = icmp ne i32 %0, 041 ret i1 %242}43 44; auto icmpi16(short x0) { return x0 != 0; }45define i1 @icmpi16(i16 noundef %0) {46; CHECK-SD-LABEL: icmpi16:47; CHECK-SD: // %bb.0: // %entry48; CHECK-SD-NEXT: tst w0, #0xffff49; CHECK-SD-NEXT: cset w0, ne50; CHECK-SD-NEXT: ret51;52; CHECK-CSSC-LABEL: icmpi16:53; CHECK-CSSC: // %bb.0: // %entry54; CHECK-CSSC-NEXT: and w8, w0, #0xffff55; CHECK-CSSC-NEXT: umin w0, w8, #156; CHECK-CSSC-NEXT: ret57;58entry:59 %2 = icmp ne i16 %0, 060 ret i1 %261}62 63; auto icmpi8(char x0) { return x0 != 0; }64define i1 @icmpi8(i8 noundef %0) {65; CHECK-SD-LABEL: icmpi8:66; CHECK-SD: // %bb.0: // %entry67; CHECK-SD-NEXT: tst w0, #0xff68; CHECK-SD-NEXT: cset w0, ne69; CHECK-SD-NEXT: ret70;71; CHECK-CSSC-LABEL: icmpi8:72; CHECK-CSSC: // %bb.0: // %entry73; CHECK-CSSC-NEXT: and w8, w0, #0xff74; CHECK-CSSC-NEXT: umin w0, w8, #175; CHECK-CSSC-NEXT: ret76;77entry:78 %2 = icmp ne i8 %0, 079 ret i1 %280}81 82; unsigned long icmpi64i8(char x0) { return x0 != 0; }83define i64 @icmpi64i8(i8 noundef %0) {84; CHECK-SD-LABEL: icmpi64i8:85; CHECK-SD: // %bb.0: // %entry86; CHECK-SD-NEXT: tst w0, #0xff87; CHECK-SD-NEXT: cset w0, ne88; CHECK-SD-NEXT: ret89;90; CHECK-CSSC-LABEL: icmpi64i8:91; CHECK-CSSC: // %bb.0: // %entry92; CHECK-CSSC-NEXT: and w8, w0, #0xff93; CHECK-CSSC-NEXT: umin w0, w8, #194; CHECK-CSSC-NEXT: ret95;96entry:97 %1 = icmp ne i8 %0, 098 %2 = zext i1 %1 to i6499 ret i64 %2100}101 102; unsigned long setcc_i8_i64(char x0) { return x0 != 0; }103define i8 @setcc_i8_i64(i64 %x) {104; CHECK-SD-LABEL: setcc_i8_i64:105; CHECK-SD: // %bb.0: // %entry106; CHECK-SD-NEXT: cmp x0, #0107; CHECK-SD-NEXT: cset w0, ne108; CHECK-SD-NEXT: ret109;110; CHECK-CSSC-LABEL: setcc_i8_i64:111; CHECK-CSSC: // %bb.0: // %entry112; CHECK-CSSC-NEXT: umin x0, x0, #1113; CHECK-CSSC-NEXT: // kill: def $w0 killed $w0 killed $x0114; CHECK-CSSC-NEXT: ret115;116entry:117 %cmp = icmp ne i64 %x, 0118 %conv = zext i1 %cmp to i8119 ret i8 %conv120}121 122; short setcc_i16_i32(int x0) { return x0 != 0; }123define i16 @setcc_i16_i32(i32 %x) {124; CHECK-SD-LABEL: setcc_i16_i32:125; CHECK-SD: // %bb.0: // %entry126; CHECK-SD-NEXT: cmp w0, #0127; CHECK-SD-NEXT: cset w0, ne128; CHECK-SD-NEXT: ret129;130; CHECK-CSSC-LABEL: setcc_i16_i32:131; CHECK-CSSC: // %bb.0: // %entry132; CHECK-CSSC-NEXT: umin w0, w0, #1133; CHECK-CSSC-NEXT: ret134;135entry:136 %cmp = icmp ne i32 %x, 0137 %conv = zext i1 %cmp to i16138 ret i16 %conv139}140 141; int setcc_i32_i64(unsigned long x0) { return x0 != 0; }142define i32 @setcc_i32_i64(i64 %x) {143; CHECK-SD-LABEL: setcc_i32_i64:144; CHECK-SD: // %bb.0: // %entry145; CHECK-SD-NEXT: cmp x0, #0146; CHECK-SD-NEXT: cset w0, ne147; CHECK-SD-NEXT: ret148;149; CHECK-CSSC-LABEL: setcc_i32_i64:150; CHECK-CSSC: // %bb.0: // %entry151; CHECK-CSSC-NEXT: umin x0, x0, #1152; CHECK-CSSC-NEXT: // kill: def $w0 killed $w0 killed $x0153; CHECK-CSSC-NEXT: ret154;155entry:156 %cmp = icmp ne i64 %x, 0157 %conv = zext i1 %cmp to i32158 ret i32 %conv159}160 161; unsigned long setcc_i64_i64(unsigned long x0) { return x0 != 0; }162define i64 @setcc_i64_i64(i64 %x) {163; CHECK-SD-LABEL: setcc_i64_i64:164; CHECK-SD: // %bb.0: // %entry165; CHECK-SD-NEXT: cmp x0, #0166; CHECK-SD-NEXT: cset w0, ne167; CHECK-SD-NEXT: ret168;169; CHECK-CSSC-LABEL: setcc_i64_i64:170; CHECK-CSSC: // %bb.0: // %entry171; CHECK-CSSC-NEXT: umin x0, x0, #1172; CHECK-CSSC-NEXT: ret173;174entry:175 %cmp = icmp ne i64 %x, 0176 %conv = zext i1 %cmp to i64177 ret i64 %conv178}179 180define <2 x i1> @setcc_v2i1_v2i64(<2 x i64> %x) {181; CHECK-SD-LABEL: setcc_v2i1_v2i64:182; CHECK-SD: // %bb.0: // %entry183; CHECK-SD-NEXT: cmtst v0.2d, v0.2d, v0.2d184; CHECK-SD-NEXT: xtn v0.2s, v0.2d185; CHECK-SD-NEXT: ret186;187; CHECK-CSSC-LABEL: setcc_v2i1_v2i64:188; CHECK-CSSC: // %bb.0: // %entry189; CHECK-CSSC-NEXT: cmtst v0.2d, v0.2d, v0.2d190; CHECK-CSSC-NEXT: xtn v0.2s, v0.2d191; CHECK-CSSC-NEXT: ret192;193entry:194 %cmp = icmp ne <2 x i64> %x, zeroinitializer195 ret <2 x i1> %cmp196}197 198define <4 x i1> @setcc_v4i1_v4i32(<4 x i32> %x) {199; CHECK-SD-LABEL: setcc_v4i1_v4i32:200; CHECK-SD: // %bb.0: // %entry201; CHECK-SD-NEXT: cmtst v0.4s, v0.4s, v0.4s202; CHECK-SD-NEXT: xtn v0.4h, v0.4s203; CHECK-SD-NEXT: ret204;205; CHECK-CSSC-LABEL: setcc_v4i1_v4i32:206; CHECK-CSSC: // %bb.0: // %entry207; CHECK-CSSC-NEXT: cmtst v0.4s, v0.4s, v0.4s208; CHECK-CSSC-NEXT: xtn v0.4h, v0.4s209; CHECK-CSSC-NEXT: ret210;211entry:212 %cmp = icmp ne <4 x i32> %x, zeroinitializer213 ret <4 x i1> %cmp214}215 216define <8 x i1> @setcc_v8i1_v8i16(<8 x i16> %x) {217; CHECK-SD-LABEL: setcc_v8i1_v8i16:218; CHECK-SD: // %bb.0: // %entry219; CHECK-SD-NEXT: cmtst v0.8h, v0.8h, v0.8h220; CHECK-SD-NEXT: xtn v0.8b, v0.8h221; CHECK-SD-NEXT: ret222;223; CHECK-CSSC-LABEL: setcc_v8i1_v8i16:224; CHECK-CSSC: // %bb.0: // %entry225; CHECK-CSSC-NEXT: cmtst v0.8h, v0.8h, v0.8h226; CHECK-CSSC-NEXT: xtn v0.8b, v0.8h227; CHECK-CSSC-NEXT: ret228;229entry:230 %cmp = icmp ne <8 x i16> %x, zeroinitializer231 ret <8 x i1> %cmp232}233 234define <16 x i1> @setcc_v16i1_v16i8(<16 x i8> %x) {235; CHECK-SD-LABEL: setcc_v16i1_v16i8:236; CHECK-SD: // %bb.0: // %entry237; CHECK-SD-NEXT: cmtst v0.16b, v0.16b, v0.16b238; CHECK-SD-NEXT: ret239;240; CHECK-CSSC-LABEL: setcc_v16i1_v16i8:241; CHECK-CSSC: // %bb.0: // %entry242; CHECK-CSSC-NEXT: cmtst v0.16b, v0.16b, v0.16b243; CHECK-CSSC-NEXT: ret244;245entry:246 %cmp = icmp ne <16 x i8> %x, zeroinitializer247 ret <16 x i1> %cmp248}249 250define <2 x i8> @setcc_v2i8_v2i64(<2 x i64> %x) {251; CHECK-SD-LABEL: setcc_v2i8_v2i64:252; CHECK-SD: // %bb.0: // %entry253; CHECK-SD-NEXT: cmtst v0.2d, v0.2d, v0.2d254; CHECK-SD-NEXT: movi v1.2s, #1255; CHECK-SD-NEXT: xtn v0.2s, v0.2d256; CHECK-SD-NEXT: and v0.8b, v0.8b, v1.8b257; CHECK-SD-NEXT: ret258;259; CHECK-CSSC-LABEL: setcc_v2i8_v2i64:260; CHECK-CSSC: // %bb.0: // %entry261; CHECK-CSSC-NEXT: cmtst v0.2d, v0.2d, v0.2d262; CHECK-CSSC-NEXT: movi v1.2s, #1263; CHECK-CSSC-NEXT: xtn v0.2s, v0.2d264; CHECK-CSSC-NEXT: and v0.8b, v0.8b, v1.8b265; CHECK-CSSC-NEXT: ret266;267entry:268 %cmp = icmp ne <2 x i64> %x, zeroinitializer269 %conv = zext <2 x i1> %cmp to <2 x i8>270 ret <2 x i8> %conv271}272 273define <4 x i16> @setcc_v4i16_v4i32(<4 x i32> %x) {274; CHECK-SD-LABEL: setcc_v4i16_v4i32:275; CHECK-SD: // %bb.0: // %entry276; CHECK-SD-NEXT: cmtst v0.4s, v0.4s, v0.4s277; CHECK-SD-NEXT: movi v1.4h, #1278; CHECK-SD-NEXT: xtn v0.4h, v0.4s279; CHECK-SD-NEXT: and v0.8b, v0.8b, v1.8b280; CHECK-SD-NEXT: ret281;282; CHECK-CSSC-LABEL: setcc_v4i16_v4i32:283; CHECK-CSSC: // %bb.0: // %entry284; CHECK-CSSC-NEXT: cmtst v0.4s, v0.4s, v0.4s285; CHECK-CSSC-NEXT: movi v1.4h, #1286; CHECK-CSSC-NEXT: xtn v0.4h, v0.4s287; CHECK-CSSC-NEXT: and v0.8b, v0.8b, v1.8b288; CHECK-CSSC-NEXT: ret289;290entry:291 %cmp = icmp ne <4 x i32> %x, zeroinitializer292 %conv = zext <4 x i1> %cmp to <4 x i16>293 ret <4 x i16> %conv294}295 296define <4 x i32> @setcc_v4i32_v4i32(<4 x i32> %x) {297; CHECK-SD-LABEL: setcc_v4i32_v4i32:298; CHECK-SD: // %bb.0: // %entry299; CHECK-SD-NEXT: movi v1.4s, #1300; CHECK-SD-NEXT: cmeq v0.4s, v0.4s, #0301; CHECK-SD-NEXT: bic v0.16b, v1.16b, v0.16b302; CHECK-SD-NEXT: ret303;304; CHECK-CSSC-LABEL: setcc_v4i32_v4i32:305; CHECK-CSSC: // %bb.0: // %entry306; CHECK-CSSC-NEXT: movi v1.4s, #1307; CHECK-CSSC-NEXT: cmeq v0.4s, v0.4s, #0308; CHECK-CSSC-NEXT: bic v0.16b, v1.16b, v0.16b309; CHECK-CSSC-NEXT: ret310;311entry:312 %cmp = icmp ne <4 x i32> %x, zeroinitializer313 %conv = zext <4 x i1> %cmp to <4 x i32>314 ret <4 x i32> %conv315}316 317; auto icmpi128(int128 x0) { return x0 != 0; }318define i1 @icmpi128(i128 noundef %0) {319; CHECK-SD-LABEL: icmpi128:320; CHECK-SD: // %bb.0: // %entry321; CHECK-SD-NEXT: orr x8, x0, x1322; CHECK-SD-NEXT: cmp x8, #0323; CHECK-SD-NEXT: cset w0, ne324; CHECK-SD-NEXT: ret325;326; CHECK-CSSC-LABEL: icmpi128:327; CHECK-CSSC: // %bb.0: // %entry328; CHECK-CSSC-NEXT: orr x8, x0, x1329; CHECK-CSSC-NEXT: umin x0, x8, #1330; CHECK-CSSC-NEXT: // kill: def $w0 killed $w0 killed $x0331; CHECK-CSSC-NEXT: ret332;333entry:334 %2 = icmp ne i128 %0, 0335 ret i1 %2336}337