404 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=armv7a-none-none-eabi -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK7A3; RUN: llc -mtriple=thumbv6m-none-none-eabi -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK6M4; RUN: llc -mtriple=thumbv7m-none-none-eabi -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK7M5; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK81M6 7define i32 @xori64i32(i64 %a) {8; CHECK7A-LABEL: xori64i32:9; CHECK7A: @ %bb.0:10; CHECK7A-NEXT: mvn r0, #-214748364811; CHECK7A-NEXT: eor r0, r0, r1, asr #3112; CHECK7A-NEXT: bx lr13;14; CHECK6M-LABEL: xori64i32:15; CHECK6M: @ %bb.0:16; CHECK6M-NEXT: asrs r1, r1, #3117; CHECK6M-NEXT: ldr r0, .LCPI0_018; CHECK6M-NEXT: eors r0, r119; CHECK6M-NEXT: bx lr20; CHECK6M-NEXT: .p2align 221; CHECK6M-NEXT: @ %bb.1:22; CHECK6M-NEXT: .LCPI0_0:23; CHECK6M-NEXT: .long 2147483647 @ 0x7fffffff24;25; CHECK7M-LABEL: xori64i32:26; CHECK7M: @ %bb.0:27; CHECK7M-NEXT: mvn r0, #-214748364828; CHECK7M-NEXT: eor.w r0, r0, r1, asr #3129; CHECK7M-NEXT: bx lr30;31; CHECK81M-LABEL: xori64i32:32; CHECK81M: @ %bb.0:33; CHECK81M-NEXT: mvn r0, #-214748364834; CHECK81M-NEXT: eor.w r0, r0, r1, asr #3135; CHECK81M-NEXT: bx lr36 %shr4 = ashr i64 %a, 6337 %conv5 = trunc i64 %shr4 to i3238 %xor = xor i32 %conv5, 214748364739 ret i32 %xor40}41 42define i64 @selecti64i64(i64 %a) {43; CHECK7A-LABEL: selecti64i64:44; CHECK7A: @ %bb.0:45; CHECK7A-NEXT: mvn r0, #-214748364846; CHECK7A-NEXT: eor r0, r0, r1, asr #3147; CHECK7A-NEXT: asr r1, r1, #3148; CHECK7A-NEXT: bx lr49;50; CHECK6M-LABEL: selecti64i64:51; CHECK6M: @ %bb.0:52; CHECK6M-NEXT: asrs r1, r1, #3153; CHECK6M-NEXT: ldr r0, .LCPI1_054; CHECK6M-NEXT: eors r0, r155; CHECK6M-NEXT: bx lr56; CHECK6M-NEXT: .p2align 257; CHECK6M-NEXT: @ %bb.1:58; CHECK6M-NEXT: .LCPI1_0:59; CHECK6M-NEXT: .long 2147483647 @ 0x7fffffff60;61; CHECK7M-LABEL: selecti64i64:62; CHECK7M: @ %bb.0:63; CHECK7M-NEXT: mvn r0, #-214748364864; CHECK7M-NEXT: eor.w r0, r0, r1, asr #3165; CHECK7M-NEXT: asrs r1, r1, #3166; CHECK7M-NEXT: bx lr67;68; CHECK81M-LABEL: selecti64i64:69; CHECK81M: @ %bb.0:70; CHECK81M-NEXT: mvn r0, #-214748364871; CHECK81M-NEXT: eor.w r0, r0, r1, asr #3172; CHECK81M-NEXT: asrs r1, r1, #3173; CHECK81M-NEXT: bx lr74 %c = icmp sgt i64 %a, -175 %s = select i1 %c, i64 2147483647, i64 -214748364876 ret i64 %s77}78 79define i32 @selecti64i32(i64 %a) {80; CHECK7A-LABEL: selecti64i32:81; CHECK7A: @ %bb.0:82; CHECK7A-NEXT: mvn r0, #-214748364883; CHECK7A-NEXT: eor r0, r0, r1, asr #3184; CHECK7A-NEXT: bx lr85;86; CHECK6M-LABEL: selecti64i32:87; CHECK6M: @ %bb.0:88; CHECK6M-NEXT: ldr r0, .LCPI2_089; CHECK6M-NEXT: cmp r1, #090; CHECK6M-NEXT: bge .LBB2_291; CHECK6M-NEXT: @ %bb.1:92; CHECK6M-NEXT: adds r0, r0, #193; CHECK6M-NEXT: .LBB2_2:94; CHECK6M-NEXT: bx lr95; CHECK6M-NEXT: .p2align 296; CHECK6M-NEXT: @ %bb.3:97; CHECK6M-NEXT: .LCPI2_0:98; CHECK6M-NEXT: .long 2147483647 @ 0x7fffffff99;100; CHECK7M-LABEL: selecti64i32:101; CHECK7M: @ %bb.0:102; CHECK7M-NEXT: mvn r0, #-2147483648103; CHECK7M-NEXT: eor.w r0, r0, r1, asr #31104; CHECK7M-NEXT: bx lr105;106; CHECK81M-LABEL: selecti64i32:107; CHECK81M: @ %bb.0:108; CHECK81M-NEXT: mvn r0, #-2147483648109; CHECK81M-NEXT: eor.w r0, r0, r1, asr #31110; CHECK81M-NEXT: bx lr111 %c = icmp sgt i64 %a, -1112 %s = select i1 %c, i32 2147483647, i32 -2147483648113 ret i32 %s114}115 116define i64 @selecti32i64(i32 %a) {117; CHECK7A-LABEL: selecti32i64:118; CHECK7A: @ %bb.0:119; CHECK7A-NEXT: mvn r1, #-2147483648120; CHECK7A-NEXT: eor r2, r1, r0, asr #31121; CHECK7A-NEXT: asr r1, r0, #31122; CHECK7A-NEXT: mov r0, r2123; CHECK7A-NEXT: bx lr124;125; CHECK6M-LABEL: selecti32i64:126; CHECK6M: @ %bb.0:127; CHECK6M-NEXT: asrs r1, r0, #31128; CHECK6M-NEXT: ldr r0, .LCPI3_0129; CHECK6M-NEXT: eors r0, r1130; CHECK6M-NEXT: bx lr131; CHECK6M-NEXT: .p2align 2132; CHECK6M-NEXT: @ %bb.1:133; CHECK6M-NEXT: .LCPI3_0:134; CHECK6M-NEXT: .long 2147483647 @ 0x7fffffff135;136; CHECK7M-LABEL: selecti32i64:137; CHECK7M: @ %bb.0:138; CHECK7M-NEXT: mvn r1, #-2147483648139; CHECK7M-NEXT: eor.w r2, r1, r0, asr #31140; CHECK7M-NEXT: asrs r1, r0, #31141; CHECK7M-NEXT: mov r0, r2142; CHECK7M-NEXT: bx lr143;144; CHECK81M-LABEL: selecti32i64:145; CHECK81M: @ %bb.0:146; CHECK81M-NEXT: mvn r1, #-2147483648147; CHECK81M-NEXT: eor.w r2, r1, r0, asr #31148; CHECK81M-NEXT: asrs r1, r0, #31149; CHECK81M-NEXT: mov r0, r2150; CHECK81M-NEXT: bx lr151 %c = icmp sgt i32 %a, -1152 %s = select i1 %c, i64 2147483647, i64 -2147483648153 ret i64 %s154}155 156 157 158define i8 @xori32i8(i32 %a) {159; CHECK7A-LABEL: xori32i8:160; CHECK7A: @ %bb.0:161; CHECK7A-NEXT: mov r1, #84162; CHECK7A-NEXT: eor r0, r1, r0, asr #31163; CHECK7A-NEXT: bx lr164;165; CHECK6M-LABEL: xori32i8:166; CHECK6M: @ %bb.0:167; CHECK6M-NEXT: asrs r1, r0, #31168; CHECK6M-NEXT: movs r0, #84169; CHECK6M-NEXT: eors r0, r1170; CHECK6M-NEXT: bx lr171;172; CHECK7M-LABEL: xori32i8:173; CHECK7M: @ %bb.0:174; CHECK7M-NEXT: movs r1, #84175; CHECK7M-NEXT: eor.w r0, r1, r0, asr #31176; CHECK7M-NEXT: bx lr177;178; CHECK81M-LABEL: xori32i8:179; CHECK81M: @ %bb.0:180; CHECK81M-NEXT: movs r1, #84181; CHECK81M-NEXT: eor.w r0, r1, r0, asr #31182; CHECK81M-NEXT: bx lr183 %shr4 = ashr i32 %a, 31184 %conv5 = trunc i32 %shr4 to i8185 %xor = xor i8 %conv5, 84186 ret i8 %xor187}188 189define i32 @selecti32i32(i32 %a) {190; CHECK7A-LABEL: selecti32i32:191; CHECK7A: @ %bb.0:192; CHECK7A-NEXT: mov r1, #84193; CHECK7A-NEXT: eor r0, r1, r0, asr #31194; CHECK7A-NEXT: bx lr195;196; CHECK6M-LABEL: selecti32i32:197; CHECK6M: @ %bb.0:198; CHECK6M-NEXT: asrs r1, r0, #31199; CHECK6M-NEXT: movs r0, #84200; CHECK6M-NEXT: eors r0, r1201; CHECK6M-NEXT: bx lr202;203; CHECK7M-LABEL: selecti32i32:204; CHECK7M: @ %bb.0:205; CHECK7M-NEXT: movs r1, #84206; CHECK7M-NEXT: eor.w r0, r1, r0, asr #31207; CHECK7M-NEXT: bx lr208;209; CHECK81M-LABEL: selecti32i32:210; CHECK81M: @ %bb.0:211; CHECK81M-NEXT: movs r1, #84212; CHECK81M-NEXT: eor.w r0, r1, r0, asr #31213; CHECK81M-NEXT: bx lr214 %c = icmp sgt i32 %a, -1215 %s = select i1 %c, i32 84, i32 -85216 ret i32 %s217}218 219define i8 @selecti32i8(i32 %a) {220; CHECK7A-LABEL: selecti32i8:221; CHECK7A: @ %bb.0:222; CHECK7A-NEXT: mov r1, #84223; CHECK7A-NEXT: eor r0, r1, r0, asr #31224; CHECK7A-NEXT: bx lr225;226; CHECK6M-LABEL: selecti32i8:227; CHECK6M: @ %bb.0:228; CHECK6M-NEXT: asrs r1, r0, #31229; CHECK6M-NEXT: movs r0, #84230; CHECK6M-NEXT: eors r0, r1231; CHECK6M-NEXT: bx lr232;233; CHECK7M-LABEL: selecti32i8:234; CHECK7M: @ %bb.0:235; CHECK7M-NEXT: movs r1, #84236; CHECK7M-NEXT: eor.w r0, r1, r0, asr #31237; CHECK7M-NEXT: bx lr238;239; CHECK81M-LABEL: selecti32i8:240; CHECK81M: @ %bb.0:241; CHECK81M-NEXT: movs r1, #84242; CHECK81M-NEXT: eor.w r0, r1, r0, asr #31243; CHECK81M-NEXT: bx lr244 %c = icmp sgt i32 %a, -1245 %s = select i1 %c, i8 84, i8 -85246 ret i8 %s247}248 249define i32 @selecti8i32(i8 %a) {250; CHECK7A-LABEL: selecti8i32:251; CHECK7A: @ %bb.0:252; CHECK7A-NEXT: sxtb r0, r0253; CHECK7A-NEXT: mov r1, #84254; CHECK7A-NEXT: eor r0, r1, r0, asr #7255; CHECK7A-NEXT: bx lr256;257; CHECK6M-LABEL: selecti8i32:258; CHECK6M: @ %bb.0:259; CHECK6M-NEXT: sxtb r0, r0260; CHECK6M-NEXT: asrs r1, r0, #7261; CHECK6M-NEXT: movs r0, #84262; CHECK6M-NEXT: eors r0, r1263; CHECK6M-NEXT: bx lr264;265; CHECK7M-LABEL: selecti8i32:266; CHECK7M: @ %bb.0:267; CHECK7M-NEXT: sxtb r0, r0268; CHECK7M-NEXT: movs r1, #84269; CHECK7M-NEXT: eor.w r0, r1, r0, asr #7270; CHECK7M-NEXT: bx lr271;272; CHECK81M-LABEL: selecti8i32:273; CHECK81M: @ %bb.0:274; CHECK81M-NEXT: sxtb r0, r0275; CHECK81M-NEXT: movs r1, #84276; CHECK81M-NEXT: eor.w r0, r1, r0, asr #7277; CHECK81M-NEXT: bx lr278 %c = icmp sgt i8 %a, -1279 %s = select i1 %c, i32 84, i32 -85280 ret i32 %s281}282 283define i32 @icmpasreq(i32 %input, i32 %a, i32 %b) {284; CHECK7A-LABEL: icmpasreq:285; CHECK7A: @ %bb.0:286; CHECK7A-NEXT: cmp r0, #0287; CHECK7A-NEXT: movpl r1, r2288; CHECK7A-NEXT: mov r0, r1289; CHECK7A-NEXT: bx lr290;291; CHECK6M-LABEL: icmpasreq:292; CHECK6M: @ %bb.0:293; CHECK6M-NEXT: cmp r0, #0294; CHECK6M-NEXT: bmi .LBB8_2295; CHECK6M-NEXT: @ %bb.1:296; CHECK6M-NEXT: mov r1, r2297; CHECK6M-NEXT: .LBB8_2:298; CHECK6M-NEXT: mov r0, r1299; CHECK6M-NEXT: bx lr300;301; CHECK7M-LABEL: icmpasreq:302; CHECK7M: @ %bb.0:303; CHECK7M-NEXT: cmp r0, #0304; CHECK7M-NEXT: it pl305; CHECK7M-NEXT: movpl r1, r2306; CHECK7M-NEXT: mov r0, r1307; CHECK7M-NEXT: bx lr308;309; CHECK81M-LABEL: icmpasreq:310; CHECK81M: @ %bb.0:311; CHECK81M-NEXT: cmp r0, #0312; CHECK81M-NEXT: csel r0, r1, r2, mi313; CHECK81M-NEXT: bx lr314 %sh = ashr i32 %input, 31315 %c = icmp eq i32 %sh, -1316 %s = select i1 %c, i32 %a, i32 %b317 ret i32 %s318}319 320define i32 @icmpasrne(i32 %input, i32 %a, i32 %b) {321; CHECK7A-LABEL: icmpasrne:322; CHECK7A: @ %bb.0:323; CHECK7A-NEXT: cmn r0, #1324; CHECK7A-NEXT: movle r1, r2325; CHECK7A-NEXT: mov r0, r1326; CHECK7A-NEXT: bx lr327;328; CHECK6M-LABEL: icmpasrne:329; CHECK6M: @ %bb.0:330; CHECK6M-NEXT: cmp r0, #0331; CHECK6M-NEXT: bge .LBB9_2332; CHECK6M-NEXT: @ %bb.1:333; CHECK6M-NEXT: mov r1, r2334; CHECK6M-NEXT: .LBB9_2:335; CHECK6M-NEXT: mov r0, r1336; CHECK6M-NEXT: bx lr337;338; CHECK7M-LABEL: icmpasrne:339; CHECK7M: @ %bb.0:340; CHECK7M-NEXT: cmp.w r0, #-1341; CHECK7M-NEXT: it le342; CHECK7M-NEXT: movle r1, r2343; CHECK7M-NEXT: mov r0, r1344; CHECK7M-NEXT: bx lr345;346; CHECK81M-LABEL: icmpasrne:347; CHECK81M: @ %bb.0:348; CHECK81M-NEXT: cmp.w r0, #-1349; CHECK81M-NEXT: csel r0, r1, r2, gt350; CHECK81M-NEXT: bx lr351 %sh = ashr i32 %input, 31352 %c = icmp ne i32 %sh, -1353 %s = select i1 %c, i32 %a, i32 %b354 ret i32 %s355}356 357define i32 @oneusecmp(i32 %a, i32 %b, i32 %d) {358; CHECK7A-LABEL: oneusecmp:359; CHECK7A: @ %bb.0:360; CHECK7A-NEXT: cmp r0, #0361; CHECK7A-NEXT: movmi r1, r2362; CHECK7A-NEXT: mov r2, #127363; CHECK7A-NEXT: eor r0, r2, r0, asr #31364; CHECK7A-NEXT: add r0, r0, r1365; CHECK7A-NEXT: bx lr366;367; CHECK6M-LABEL: oneusecmp:368; CHECK6M: @ %bb.0:369; CHECK6M-NEXT: cmp r0, #0370; CHECK6M-NEXT: bmi .LBB10_2371; CHECK6M-NEXT: @ %bb.1:372; CHECK6M-NEXT: mov r2, r1373; CHECK6M-NEXT: .LBB10_2:374; CHECK6M-NEXT: asrs r0, r0, #31375; CHECK6M-NEXT: movs r1, #127376; CHECK6M-NEXT: eors r1, r0377; CHECK6M-NEXT: adds r0, r1, r2378; CHECK6M-NEXT: bx lr379;380; CHECK7M-LABEL: oneusecmp:381; CHECK7M: @ %bb.0:382; CHECK7M-NEXT: cmp r0, #0383; CHECK7M-NEXT: it mi384; CHECK7M-NEXT: movmi r1, r2385; CHECK7M-NEXT: movs r2, #127386; CHECK7M-NEXT: eor.w r0, r2, r0, asr #31387; CHECK7M-NEXT: add r0, r1388; CHECK7M-NEXT: bx lr389;390; CHECK81M-LABEL: oneusecmp:391; CHECK81M: @ %bb.0:392; CHECK81M-NEXT: cmp r0, #0393; CHECK81M-NEXT: csel r1, r2, r1, mi394; CHECK81M-NEXT: movs r2, #127395; CHECK81M-NEXT: eor.w r0, r2, r0, asr #31396; CHECK81M-NEXT: add r0, r1397; CHECK81M-NEXT: bx lr398 %c = icmp sle i32 %a, -1399 %s = select i1 %c, i32 -128, i32 127400 %s2 = select i1 %c, i32 %d, i32 %b401 %x = add i32 %s, %s2402 ret i32 %x403}404