580 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc --mtriple=loongarch32 -mattr=-32s,+d < %s | FileCheck %s --check-prefix=LA32R3; RUN: llc --mtriple=loongarch32 -mattr=+32s,+d < %s | FileCheck %s --check-prefix=LA32S4; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s --check-prefix=LA645 6;; Test sext/zext/trunc7 8define i8 @sext_i1_to_i8(i1 %a) {9; LA32R-LABEL: sext_i1_to_i8:10; LA32R: # %bb.0:11; LA32R-NEXT: andi $a0, $a0, 112; LA32R-NEXT: sub.w $a0, $zero, $a013; LA32R-NEXT: ret14;15; LA32S-LABEL: sext_i1_to_i8:16; LA32S: # %bb.0:17; LA32S-NEXT: andi $a0, $a0, 118; LA32S-NEXT: sub.w $a0, $zero, $a019; LA32S-NEXT: ret20;21; LA64-LABEL: sext_i1_to_i8:22; LA64: # %bb.0:23; LA64-NEXT: andi $a0, $a0, 124; LA64-NEXT: sub.d $a0, $zero, $a025; LA64-NEXT: ret26 %1 = sext i1 %a to i827 ret i8 %128}29 30define i16 @sext_i1_to_i16(i1 %a) {31; LA32R-LABEL: sext_i1_to_i16:32; LA32R: # %bb.0:33; LA32R-NEXT: andi $a0, $a0, 134; LA32R-NEXT: sub.w $a0, $zero, $a035; LA32R-NEXT: ret36;37; LA32S-LABEL: sext_i1_to_i16:38; LA32S: # %bb.0:39; LA32S-NEXT: andi $a0, $a0, 140; LA32S-NEXT: sub.w $a0, $zero, $a041; LA32S-NEXT: ret42;43; LA64-LABEL: sext_i1_to_i16:44; LA64: # %bb.0:45; LA64-NEXT: andi $a0, $a0, 146; LA64-NEXT: sub.d $a0, $zero, $a047; LA64-NEXT: ret48 %1 = sext i1 %a to i1649 ret i16 %150}51 52define i32 @sext_i1_to_i32(i1 %a) {53; LA32R-LABEL: sext_i1_to_i32:54; LA32R: # %bb.0:55; LA32R-NEXT: andi $a0, $a0, 156; LA32R-NEXT: sub.w $a0, $zero, $a057; LA32R-NEXT: ret58;59; LA32S-LABEL: sext_i1_to_i32:60; LA32S: # %bb.0:61; LA32S-NEXT: andi $a0, $a0, 162; LA32S-NEXT: sub.w $a0, $zero, $a063; LA32S-NEXT: ret64;65; LA64-LABEL: sext_i1_to_i32:66; LA64: # %bb.0:67; LA64-NEXT: andi $a0, $a0, 168; LA64-NEXT: sub.d $a0, $zero, $a069; LA64-NEXT: ret70 %1 = sext i1 %a to i3271 ret i32 %172}73 74define i64 @sext_i1_to_i64(i1 %a) {75; LA32R-LABEL: sext_i1_to_i64:76; LA32R: # %bb.0:77; LA32R-NEXT: andi $a0, $a0, 178; LA32R-NEXT: sub.w $a0, $zero, $a079; LA32R-NEXT: move $a1, $a080; LA32R-NEXT: ret81;82; LA32S-LABEL: sext_i1_to_i64:83; LA32S: # %bb.0:84; LA32S-NEXT: andi $a0, $a0, 185; LA32S-NEXT: sub.w $a0, $zero, $a086; LA32S-NEXT: move $a1, $a087; LA32S-NEXT: ret88;89; LA64-LABEL: sext_i1_to_i64:90; LA64: # %bb.0:91; LA64-NEXT: andi $a0, $a0, 192; LA64-NEXT: sub.d $a0, $zero, $a093; LA64-NEXT: ret94 %1 = sext i1 %a to i6495 ret i64 %196}97 98define i16 @sext_i8_to_i16(i8 %a) {99; LA32R-LABEL: sext_i8_to_i16:100; LA32R: # %bb.0:101; LA32R-NEXT: slli.w $a0, $a0, 24102; LA32R-NEXT: srai.w $a0, $a0, 24103; LA32R-NEXT: ret104;105; LA32S-LABEL: sext_i8_to_i16:106; LA32S: # %bb.0:107; LA32S-NEXT: ext.w.b $a0, $a0108; LA32S-NEXT: ret109;110; LA64-LABEL: sext_i8_to_i16:111; LA64: # %bb.0:112; LA64-NEXT: ext.w.b $a0, $a0113; LA64-NEXT: ret114 %1 = sext i8 %a to i16115 ret i16 %1116}117 118define i32 @sext_i8_to_i32(i8 %a) {119; LA32R-LABEL: sext_i8_to_i32:120; LA32R: # %bb.0:121; LA32R-NEXT: slli.w $a0, $a0, 24122; LA32R-NEXT: srai.w $a0, $a0, 24123; LA32R-NEXT: ret124;125; LA32S-LABEL: sext_i8_to_i32:126; LA32S: # %bb.0:127; LA32S-NEXT: ext.w.b $a0, $a0128; LA32S-NEXT: ret129;130; LA64-LABEL: sext_i8_to_i32:131; LA64: # %bb.0:132; LA64-NEXT: ext.w.b $a0, $a0133; LA64-NEXT: ret134 %1 = sext i8 %a to i32135 ret i32 %1136}137 138define i64 @sext_i8_to_i64(i8 %a) {139; LA32R-LABEL: sext_i8_to_i64:140; LA32R: # %bb.0:141; LA32R-NEXT: slli.w $a1, $a0, 24142; LA32R-NEXT: srai.w $a0, $a1, 24143; LA32R-NEXT: srai.w $a1, $a1, 31144; LA32R-NEXT: ret145;146; LA32S-LABEL: sext_i8_to_i64:147; LA32S: # %bb.0:148; LA32S-NEXT: ext.w.b $a0, $a0149; LA32S-NEXT: srai.w $a1, $a0, 31150; LA32S-NEXT: ret151;152; LA64-LABEL: sext_i8_to_i64:153; LA64: # %bb.0:154; LA64-NEXT: ext.w.b $a0, $a0155; LA64-NEXT: ret156 %1 = sext i8 %a to i64157 ret i64 %1158}159 160define i32 @sext_i16_to_i32(i16 %a) {161; LA32R-LABEL: sext_i16_to_i32:162; LA32R: # %bb.0:163; LA32R-NEXT: slli.w $a0, $a0, 16164; LA32R-NEXT: srai.w $a0, $a0, 16165; LA32R-NEXT: ret166;167; LA32S-LABEL: sext_i16_to_i32:168; LA32S: # %bb.0:169; LA32S-NEXT: ext.w.h $a0, $a0170; LA32S-NEXT: ret171;172; LA64-LABEL: sext_i16_to_i32:173; LA64: # %bb.0:174; LA64-NEXT: ext.w.h $a0, $a0175; LA64-NEXT: ret176 %1 = sext i16 %a to i32177 ret i32 %1178}179 180define i64 @sext_i16_to_i64(i16 %a) {181; LA32R-LABEL: sext_i16_to_i64:182; LA32R: # %bb.0:183; LA32R-NEXT: slli.w $a1, $a0, 16184; LA32R-NEXT: srai.w $a0, $a1, 16185; LA32R-NEXT: srai.w $a1, $a1, 31186; LA32R-NEXT: ret187;188; LA32S-LABEL: sext_i16_to_i64:189; LA32S: # %bb.0:190; LA32S-NEXT: ext.w.h $a0, $a0191; LA32S-NEXT: srai.w $a1, $a0, 31192; LA32S-NEXT: ret193;194; LA64-LABEL: sext_i16_to_i64:195; LA64: # %bb.0:196; LA64-NEXT: ext.w.h $a0, $a0197; LA64-NEXT: ret198 %1 = sext i16 %a to i64199 ret i64 %1200}201 202define i64 @sext_i32_to_i64(i32 %a) {203; LA32R-LABEL: sext_i32_to_i64:204; LA32R: # %bb.0:205; LA32R-NEXT: srai.w $a1, $a0, 31206; LA32R-NEXT: ret207;208; LA32S-LABEL: sext_i32_to_i64:209; LA32S: # %bb.0:210; LA32S-NEXT: srai.w $a1, $a0, 31211; LA32S-NEXT: ret212;213; LA64-LABEL: sext_i32_to_i64:214; LA64: # %bb.0:215; LA64-NEXT: addi.w $a0, $a0, 0216; LA64-NEXT: ret217 %1 = sext i32 %a to i64218 ret i64 %1219}220 221define i8 @zext_i1_to_i8(i1 %a) {222; LA32R-LABEL: zext_i1_to_i8:223; LA32R: # %bb.0:224; LA32R-NEXT: andi $a0, $a0, 1225; LA32R-NEXT: ret226;227; LA32S-LABEL: zext_i1_to_i8:228; LA32S: # %bb.0:229; LA32S-NEXT: andi $a0, $a0, 1230; LA32S-NEXT: ret231;232; LA64-LABEL: zext_i1_to_i8:233; LA64: # %bb.0:234; LA64-NEXT: andi $a0, $a0, 1235; LA64-NEXT: ret236 %1 = zext i1 %a to i8237 ret i8 %1238}239 240define i16 @zext_i1_to_i16(i1 %a) {241; LA32R-LABEL: zext_i1_to_i16:242; LA32R: # %bb.0:243; LA32R-NEXT: andi $a0, $a0, 1244; LA32R-NEXT: ret245;246; LA32S-LABEL: zext_i1_to_i16:247; LA32S: # %bb.0:248; LA32S-NEXT: andi $a0, $a0, 1249; LA32S-NEXT: ret250;251; LA64-LABEL: zext_i1_to_i16:252; LA64: # %bb.0:253; LA64-NEXT: andi $a0, $a0, 1254; LA64-NEXT: ret255 %1 = zext i1 %a to i16256 ret i16 %1257}258 259define i32 @zext_i1_to_i32(i1 %a) {260; LA32R-LABEL: zext_i1_to_i32:261; LA32R: # %bb.0:262; LA32R-NEXT: andi $a0, $a0, 1263; LA32R-NEXT: ret264;265; LA32S-LABEL: zext_i1_to_i32:266; LA32S: # %bb.0:267; LA32S-NEXT: andi $a0, $a0, 1268; LA32S-NEXT: ret269;270; LA64-LABEL: zext_i1_to_i32:271; LA64: # %bb.0:272; LA64-NEXT: andi $a0, $a0, 1273; LA64-NEXT: ret274 %1 = zext i1 %a to i32275 ret i32 %1276}277 278define i64 @zext_i1_to_i64(i1 %a) {279; LA32R-LABEL: zext_i1_to_i64:280; LA32R: # %bb.0:281; LA32R-NEXT: andi $a0, $a0, 1282; LA32R-NEXT: move $a1, $zero283; LA32R-NEXT: ret284;285; LA32S-LABEL: zext_i1_to_i64:286; LA32S: # %bb.0:287; LA32S-NEXT: andi $a0, $a0, 1288; LA32S-NEXT: move $a1, $zero289; LA32S-NEXT: ret290;291; LA64-LABEL: zext_i1_to_i64:292; LA64: # %bb.0:293; LA64-NEXT: andi $a0, $a0, 1294; LA64-NEXT: ret295 %1 = zext i1 %a to i64296 ret i64 %1297}298 299define i16 @zext_i8_to_i16(i8 %a) {300; LA32R-LABEL: zext_i8_to_i16:301; LA32R: # %bb.0:302; LA32R-NEXT: andi $a0, $a0, 255303; LA32R-NEXT: ret304;305; LA32S-LABEL: zext_i8_to_i16:306; LA32S: # %bb.0:307; LA32S-NEXT: andi $a0, $a0, 255308; LA32S-NEXT: ret309;310; LA64-LABEL: zext_i8_to_i16:311; LA64: # %bb.0:312; LA64-NEXT: andi $a0, $a0, 255313; LA64-NEXT: ret314 %1 = zext i8 %a to i16315 ret i16 %1316}317 318define i32 @zext_i8_to_i32(i8 %a) {319; LA32R-LABEL: zext_i8_to_i32:320; LA32R: # %bb.0:321; LA32R-NEXT: andi $a0, $a0, 255322; LA32R-NEXT: ret323;324; LA32S-LABEL: zext_i8_to_i32:325; LA32S: # %bb.0:326; LA32S-NEXT: andi $a0, $a0, 255327; LA32S-NEXT: ret328;329; LA64-LABEL: zext_i8_to_i32:330; LA64: # %bb.0:331; LA64-NEXT: andi $a0, $a0, 255332; LA64-NEXT: ret333 %1 = zext i8 %a to i32334 ret i32 %1335}336 337define i64 @zext_i8_to_i64(i8 %a) {338; LA32R-LABEL: zext_i8_to_i64:339; LA32R: # %bb.0:340; LA32R-NEXT: andi $a0, $a0, 255341; LA32R-NEXT: move $a1, $zero342; LA32R-NEXT: ret343;344; LA32S-LABEL: zext_i8_to_i64:345; LA32S: # %bb.0:346; LA32S-NEXT: andi $a0, $a0, 255347; LA32S-NEXT: move $a1, $zero348; LA32S-NEXT: ret349;350; LA64-LABEL: zext_i8_to_i64:351; LA64: # %bb.0:352; LA64-NEXT: andi $a0, $a0, 255353; LA64-NEXT: ret354 %1 = zext i8 %a to i64355 ret i64 %1356}357 358define i32 @zext_i16_to_i32(i16 %a) {359; LA32R-LABEL: zext_i16_to_i32:360; LA32R: # %bb.0:361; LA32R-NEXT: lu12i.w $a1, 15362; LA32R-NEXT: ori $a1, $a1, 4095363; LA32R-NEXT: and $a0, $a0, $a1364; LA32R-NEXT: ret365;366; LA32S-LABEL: zext_i16_to_i32:367; LA32S: # %bb.0:368; LA32S-NEXT: bstrpick.w $a0, $a0, 15, 0369; LA32S-NEXT: ret370;371; LA64-LABEL: zext_i16_to_i32:372; LA64: # %bb.0:373; LA64-NEXT: bstrpick.d $a0, $a0, 15, 0374; LA64-NEXT: ret375 %1 = zext i16 %a to i32376 ret i32 %1377}378 379define i64 @zext_i16_to_i64(i16 %a) {380; LA32R-LABEL: zext_i16_to_i64:381; LA32R: # %bb.0:382; LA32R-NEXT: lu12i.w $a1, 15383; LA32R-NEXT: ori $a1, $a1, 4095384; LA32R-NEXT: and $a0, $a0, $a1385; LA32R-NEXT: move $a1, $zero386; LA32R-NEXT: ret387;388; LA32S-LABEL: zext_i16_to_i64:389; LA32S: # %bb.0:390; LA32S-NEXT: bstrpick.w $a0, $a0, 15, 0391; LA32S-NEXT: move $a1, $zero392; LA32S-NEXT: ret393;394; LA64-LABEL: zext_i16_to_i64:395; LA64: # %bb.0:396; LA64-NEXT: bstrpick.d $a0, $a0, 15, 0397; LA64-NEXT: ret398 %1 = zext i16 %a to i64399 ret i64 %1400}401 402define i64 @zext_i32_to_i64(i32 %a) {403; LA32R-LABEL: zext_i32_to_i64:404; LA32R: # %bb.0:405; LA32R-NEXT: move $a1, $zero406; LA32R-NEXT: ret407;408; LA32S-LABEL: zext_i32_to_i64:409; LA32S: # %bb.0:410; LA32S-NEXT: move $a1, $zero411; LA32S-NEXT: ret412;413; LA64-LABEL: zext_i32_to_i64:414; LA64: # %bb.0:415; LA64-NEXT: bstrpick.d $a0, $a0, 31, 0416; LA64-NEXT: ret417 %1 = zext i32 %a to i64418 ret i64 %1419}420 421define i1 @trunc_i8_to_i1(i8 %a) {422; LA32R-LABEL: trunc_i8_to_i1:423; LA32R: # %bb.0:424; LA32R-NEXT: ret425;426; LA32S-LABEL: trunc_i8_to_i1:427; LA32S: # %bb.0:428; LA32S-NEXT: ret429;430; LA64-LABEL: trunc_i8_to_i1:431; LA64: # %bb.0:432; LA64-NEXT: ret433 %1 = trunc i8 %a to i1434 ret i1 %1435}436 437define i1 @trunc_i16_to_i1(i16 %a) {438; LA32R-LABEL: trunc_i16_to_i1:439; LA32R: # %bb.0:440; LA32R-NEXT: ret441;442; LA32S-LABEL: trunc_i16_to_i1:443; LA32S: # %bb.0:444; LA32S-NEXT: ret445;446; LA64-LABEL: trunc_i16_to_i1:447; LA64: # %bb.0:448; LA64-NEXT: ret449 %1 = trunc i16 %a to i1450 ret i1 %1451}452 453define i1 @trunc_i32_to_i1(i32 %a) {454; LA32R-LABEL: trunc_i32_to_i1:455; LA32R: # %bb.0:456; LA32R-NEXT: ret457;458; LA32S-LABEL: trunc_i32_to_i1:459; LA32S: # %bb.0:460; LA32S-NEXT: ret461;462; LA64-LABEL: trunc_i32_to_i1:463; LA64: # %bb.0:464; LA64-NEXT: ret465 %1 = trunc i32 %a to i1466 ret i1 %1467}468 469define i1 @trunc_i64_to_i1(i64 %a) {470; LA32R-LABEL: trunc_i64_to_i1:471; LA32R: # %bb.0:472; LA32R-NEXT: ret473;474; LA32S-LABEL: trunc_i64_to_i1:475; LA32S: # %bb.0:476; LA32S-NEXT: ret477;478; LA64-LABEL: trunc_i64_to_i1:479; LA64: # %bb.0:480; LA64-NEXT: ret481 %1 = trunc i64 %a to i1482 ret i1 %1483}484 485define i8 @trunc_i16_to_i8(i16 %a) {486; LA32R-LABEL: trunc_i16_to_i8:487; LA32R: # %bb.0:488; LA32R-NEXT: ret489;490; LA32S-LABEL: trunc_i16_to_i8:491; LA32S: # %bb.0:492; LA32S-NEXT: ret493;494; LA64-LABEL: trunc_i16_to_i8:495; LA64: # %bb.0:496; LA64-NEXT: ret497 %1 = trunc i16 %a to i8498 ret i8 %1499}500 501define i8 @trunc_i32_to_i8(i32 %a) {502; LA32R-LABEL: trunc_i32_to_i8:503; LA32R: # %bb.0:504; LA32R-NEXT: ret505;506; LA32S-LABEL: trunc_i32_to_i8:507; LA32S: # %bb.0:508; LA32S-NEXT: ret509;510; LA64-LABEL: trunc_i32_to_i8:511; LA64: # %bb.0:512; LA64-NEXT: ret513 %1 = trunc i32 %a to i8514 ret i8 %1515}516 517define i8 @trunc_i64_to_i8(i64 %a) {518; LA32R-LABEL: trunc_i64_to_i8:519; LA32R: # %bb.0:520; LA32R-NEXT: ret521;522; LA32S-LABEL: trunc_i64_to_i8:523; LA32S: # %bb.0:524; LA32S-NEXT: ret525;526; LA64-LABEL: trunc_i64_to_i8:527; LA64: # %bb.0:528; LA64-NEXT: ret529 %1 = trunc i64 %a to i8530 ret i8 %1531}532 533define i16 @trunc_i32_to_i16(i32 %a) {534; LA32R-LABEL: trunc_i32_to_i16:535; LA32R: # %bb.0:536; LA32R-NEXT: ret537;538; LA32S-LABEL: trunc_i32_to_i16:539; LA32S: # %bb.0:540; LA32S-NEXT: ret541;542; LA64-LABEL: trunc_i32_to_i16:543; LA64: # %bb.0:544; LA64-NEXT: ret545 %1 = trunc i32 %a to i16546 ret i16 %1547}548 549define i16 @trunc_i64_to_i16(i64 %a) {550; LA32R-LABEL: trunc_i64_to_i16:551; LA32R: # %bb.0:552; LA32R-NEXT: ret553;554; LA32S-LABEL: trunc_i64_to_i16:555; LA32S: # %bb.0:556; LA32S-NEXT: ret557;558; LA64-LABEL: trunc_i64_to_i16:559; LA64: # %bb.0:560; LA64-NEXT: ret561 %1 = trunc i64 %a to i16562 ret i16 %1563}564 565define i32 @trunc_i64_to_i32(i64 %a) {566; LA32R-LABEL: trunc_i64_to_i32:567; LA32R: # %bb.0:568; LA32R-NEXT: ret569;570; LA32S-LABEL: trunc_i64_to_i32:571; LA32S: # %bb.0:572; LA32S-NEXT: ret573;574; LA64-LABEL: trunc_i64_to_i32:575; LA64: # %bb.0:576; LA64-NEXT: ret577 %1 = trunc i64 %a to i32578 ret i32 %1579}580