brintos

brintos / llvm-project-archived public Read only

0
0
Text · 22.9 KiB · 69db379 Raw
923 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc --mtriple=loongarch32 -mattr=+d < %s | FileCheck %s --check-prefix=LA323; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s --check-prefix=LA644 5;; Exercise the 'add' LLVM IR: https://llvm.org/docs/LangRef.html#add-instruction6 7define i1 @add_i1(i1 %x, i1 %y) {8; LA32-LABEL: add_i1:9; LA32:       # %bb.0:10; LA32-NEXT:    xor $a0, $a0, $a111; LA32-NEXT:    ret12;13; LA64-LABEL: add_i1:14; LA64:       # %bb.0:15; LA64-NEXT:    xor $a0, $a0, $a116; LA64-NEXT:    ret17  %add = add i1 %x, %y18  ret i1 %add19}20 21define i8 @add_i8(i8 %x, i8 %y) {22; LA32-LABEL: add_i8:23; LA32:       # %bb.0:24; LA32-NEXT:    add.w $a0, $a0, $a125; LA32-NEXT:    ret26;27; LA64-LABEL: add_i8:28; LA64:       # %bb.0:29; LA64-NEXT:    add.d $a0, $a0, $a130; LA64-NEXT:    ret31  %add = add i8 %x, %y32  ret i8 %add33}34 35define i16 @add_i16(i16 %x, i16 %y) {36; LA32-LABEL: add_i16:37; LA32:       # %bb.0:38; LA32-NEXT:    add.w $a0, $a0, $a139; LA32-NEXT:    ret40;41; LA64-LABEL: add_i16:42; LA64:       # %bb.0:43; LA64-NEXT:    add.d $a0, $a0, $a144; LA64-NEXT:    ret45  %add = add i16 %x, %y46  ret i16 %add47}48 49define i32 @add_i32(i32 %x, i32 %y) {50; LA32-LABEL: add_i32:51; LA32:       # %bb.0:52; LA32-NEXT:    add.w $a0, $a0, $a153; LA32-NEXT:    ret54;55; LA64-LABEL: add_i32:56; LA64:       # %bb.0:57; LA64-NEXT:    add.w $a0, $a0, $a158; LA64-NEXT:    ret59  %add = add i32 %x, %y60  ret i32 %add61}62 63;; Match the pattern:64;; def : PatGprGpr_32<add, ADD_W>;65define signext i32 @add_i32_sext(i32 %x, i32 %y) {66; LA32-LABEL: add_i32_sext:67; LA32:       # %bb.0:68; LA32-NEXT:    add.w $a0, $a0, $a169; LA32-NEXT:    ret70;71; LA64-LABEL: add_i32_sext:72; LA64:       # %bb.0:73; LA64-NEXT:    add.w $a0, $a0, $a174; LA64-NEXT:    ret75  %add = add i32 %x, %y76  ret i32 %add77}78 79define i64 @add_i64(i64 %x, i64 %y) {80; LA32-LABEL: add_i64:81; LA32:       # %bb.0:82; LA32-NEXT:    add.w $a1, $a1, $a383; LA32-NEXT:    add.w $a2, $a0, $a284; LA32-NEXT:    sltu $a0, $a2, $a085; LA32-NEXT:    add.w $a1, $a1, $a086; LA32-NEXT:    move $a0, $a287; LA32-NEXT:    ret88;89; LA64-LABEL: add_i64:90; LA64:       # %bb.0:91; LA64-NEXT:    add.d $a0, $a0, $a192; LA64-NEXT:    ret93  %add = add i64 %x, %y94  ret i64 %add95}96 97define i1 @add_i1_3(i1 %x) {98; LA32-LABEL: add_i1_3:99; LA32:       # %bb.0:100; LA32-NEXT:    xori $a0, $a0, 1101; LA32-NEXT:    ret102;103; LA64-LABEL: add_i1_3:104; LA64:       # %bb.0:105; LA64-NEXT:    xori $a0, $a0, 1106; LA64-NEXT:    ret107  %add = add i1 %x, 3108  ret i1 %add109}110 111define i8 @add_i8_3(i8 %x) {112; LA32-LABEL: add_i8_3:113; LA32:       # %bb.0:114; LA32-NEXT:    addi.w $a0, $a0, 3115; LA32-NEXT:    ret116;117; LA64-LABEL: add_i8_3:118; LA64:       # %bb.0:119; LA64-NEXT:    addi.d $a0, $a0, 3120; LA64-NEXT:    ret121  %add = add i8 %x, 3122  ret i8 %add123}124 125define i16 @add_i16_3(i16 %x) {126; LA32-LABEL: add_i16_3:127; LA32:       # %bb.0:128; LA32-NEXT:    addi.w $a0, $a0, 3129; LA32-NEXT:    ret130;131; LA64-LABEL: add_i16_3:132; LA64:       # %bb.0:133; LA64-NEXT:    addi.d $a0, $a0, 3134; LA64-NEXT:    ret135  %add = add i16 %x, 3136  ret i16 %add137}138 139define i32 @add_i32_3(i32 %x) {140; LA32-LABEL: add_i32_3:141; LA32:       # %bb.0:142; LA32-NEXT:    addi.w $a0, $a0, 3143; LA32-NEXT:    ret144;145; LA64-LABEL: add_i32_3:146; LA64:       # %bb.0:147; LA64-NEXT:    addi.w $a0, $a0, 3148; LA64-NEXT:    ret149  %add = add i32 %x, 3150  ret i32 %add151}152 153;; Match the pattern:154;; def : PatGprImm_32<add, ADDI_W, simm12>;155define signext i32 @add_i32_3_sext(i32 %x) {156; LA32-LABEL: add_i32_3_sext:157; LA32:       # %bb.0:158; LA32-NEXT:    addi.w $a0, $a0, 3159; LA32-NEXT:    ret160;161; LA64-LABEL: add_i32_3_sext:162; LA64:       # %bb.0:163; LA64-NEXT:    addi.w $a0, $a0, 3164; LA64-NEXT:    ret165  %add = add i32 %x, 3166  ret i32 %add167}168 169define i64 @add_i64_3(i64 %x) {170; LA32-LABEL: add_i64_3:171; LA32:       # %bb.0:172; LA32-NEXT:    addi.w $a2, $a0, 3173; LA32-NEXT:    sltu $a0, $a2, $a0174; LA32-NEXT:    add.w $a1, $a1, $a0175; LA32-NEXT:    move $a0, $a2176; LA32-NEXT:    ret177;178; LA64-LABEL: add_i64_3:179; LA64:       # %bb.0:180; LA64-NEXT:    addi.d $a0, $a0, 3181; LA64-NEXT:    ret182  %add = add i64 %x, 3183  ret i64 %add184}185 186;; Check that `addu16i.d` is emitted for these cases.187 188define i32 @add_i32_0x12340000(i32 %x) {189; LA32-LABEL: add_i32_0x12340000:190; LA32:       # %bb.0:191; LA32-NEXT:    lu12i.w $a1, 74560192; LA32-NEXT:    add.w $a0, $a0, $a1193; LA32-NEXT:    ret194;195; LA64-LABEL: add_i32_0x12340000:196; LA64:       # %bb.0:197; LA64-NEXT:    addu16i.d $a0, $a0, 4660198; LA64-NEXT:    addi.w $a0, $a0, 0199; LA64-NEXT:    ret200  %add = add i32 %x, 305397760201  ret i32 %add202}203 204define signext i32 @add_i32_0x12340000_sext(i32 %x) {205; LA32-LABEL: add_i32_0x12340000_sext:206; LA32:       # %bb.0:207; LA32-NEXT:    lu12i.w $a1, 74560208; LA32-NEXT:    add.w $a0, $a0, $a1209; LA32-NEXT:    ret210;211; LA64-LABEL: add_i32_0x12340000_sext:212; LA64:       # %bb.0:213; LA64-NEXT:    addu16i.d $a0, $a0, 4660214; LA64-NEXT:    addi.w $a0, $a0, 0215; LA64-NEXT:    ret216  %add = add i32 %x, 305397760217  ret i32 %add218}219 220define i64 @add_i64_0x12340000(i64 %x) {221; LA32-LABEL: add_i64_0x12340000:222; LA32:       # %bb.0:223; LA32-NEXT:    lu12i.w $a2, 74560224; LA32-NEXT:    add.w $a2, $a0, $a2225; LA32-NEXT:    sltu $a0, $a2, $a0226; LA32-NEXT:    add.w $a1, $a1, $a0227; LA32-NEXT:    move $a0, $a2228; LA32-NEXT:    ret229;230; LA64-LABEL: add_i64_0x12340000:231; LA64:       # %bb.0:232; LA64-NEXT:    addu16i.d $a0, $a0, 4660233; LA64-NEXT:    ret234  %add = add i64 %x, 305397760235  ret i64 %add236}237 238define i32 @add_i32_0x7fff0000(i32 %x) {239; LA32-LABEL: add_i32_0x7fff0000:240; LA32:       # %bb.0:241; LA32-NEXT:    lu12i.w $a1, 524272242; LA32-NEXT:    add.w $a0, $a0, $a1243; LA32-NEXT:    ret244;245; LA64-LABEL: add_i32_0x7fff0000:246; LA64:       # %bb.0:247; LA64-NEXT:    addu16i.d $a0, $a0, 32767248; LA64-NEXT:    addi.w $a0, $a0, 0249; LA64-NEXT:    ret250  %add = add i32 %x, 2147418112251  ret i32 %add252}253 254define signext i32 @add_i32_0x7fff0000_sext(i32 %x) {255; LA32-LABEL: add_i32_0x7fff0000_sext:256; LA32:       # %bb.0:257; LA32-NEXT:    lu12i.w $a1, 524272258; LA32-NEXT:    add.w $a0, $a0, $a1259; LA32-NEXT:    ret260;261; LA64-LABEL: add_i32_0x7fff0000_sext:262; LA64:       # %bb.0:263; LA64-NEXT:    addu16i.d $a0, $a0, 32767264; LA64-NEXT:    addi.w $a0, $a0, 0265; LA64-NEXT:    ret266  %add = add i32 %x, 2147418112267  ret i32 %add268}269 270define i64 @add_i64_0x7fff0000(i64 %x) {271; LA32-LABEL: add_i64_0x7fff0000:272; LA32:       # %bb.0:273; LA32-NEXT:    lu12i.w $a2, 524272274; LA32-NEXT:    add.w $a2, $a0, $a2275; LA32-NEXT:    sltu $a0, $a2, $a0276; LA32-NEXT:    add.w $a1, $a1, $a0277; LA32-NEXT:    move $a0, $a2278; LA32-NEXT:    ret279;280; LA64-LABEL: add_i64_0x7fff0000:281; LA64:       # %bb.0:282; LA64-NEXT:    addu16i.d $a0, $a0, 32767283; LA64-NEXT:    ret284  %add = add i64 %x, 2147418112285  ret i64 %add286}287 288define i32 @add_i32_minus_0x80000000(i32 %x) {289; LA32-LABEL: add_i32_minus_0x80000000:290; LA32:       # %bb.0:291; LA32-NEXT:    lu12i.w $a1, -524288292; LA32-NEXT:    add.w $a0, $a0, $a1293; LA32-NEXT:    ret294;295; LA64-LABEL: add_i32_minus_0x80000000:296; LA64:       # %bb.0:297; LA64-NEXT:    addu16i.d $a0, $a0, -32768298; LA64-NEXT:    addi.w $a0, $a0, 0299; LA64-NEXT:    ret300  %add = add i32 %x, -2147483648301  ret i32 %add302}303 304define signext i32 @add_i32_minus_0x80000000_sext(i32 %x) {305; LA32-LABEL: add_i32_minus_0x80000000_sext:306; LA32:       # %bb.0:307; LA32-NEXT:    lu12i.w $a1, -524288308; LA32-NEXT:    add.w $a0, $a0, $a1309; LA32-NEXT:    ret310;311; LA64-LABEL: add_i32_minus_0x80000000_sext:312; LA64:       # %bb.0:313; LA64-NEXT:    addu16i.d $a0, $a0, -32768314; LA64-NEXT:    addi.w $a0, $a0, 0315; LA64-NEXT:    ret316  %add = add i32 %x, -2147483648317  ret i32 %add318}319 320define i64 @add_i64_minus_0x80000000(i64 %x) {321; LA32-LABEL: add_i64_minus_0x80000000:322; LA32:       # %bb.0:323; LA32-NEXT:    lu12i.w $a2, -524288324; LA32-NEXT:    add.w $a2, $a0, $a2325; LA32-NEXT:    sltu $a0, $a2, $a0326; LA32-NEXT:    add.w $a0, $a1, $a0327; LA32-NEXT:    addi.w $a1, $a0, -1328; LA32-NEXT:    move $a0, $a2329; LA32-NEXT:    ret330;331; LA64-LABEL: add_i64_minus_0x80000000:332; LA64:       # %bb.0:333; LA64-NEXT:    addu16i.d $a0, $a0, -32768334; LA64-NEXT:    ret335  %add = add i64 %x, -2147483648336  ret i64 %add337}338 339define i32 @add_i32_minus_0x10000(i32 %x) {340; LA32-LABEL: add_i32_minus_0x10000:341; LA32:       # %bb.0:342; LA32-NEXT:    lu12i.w $a1, -16343; LA32-NEXT:    add.w $a0, $a0, $a1344; LA32-NEXT:    ret345;346; LA64-LABEL: add_i32_minus_0x10000:347; LA64:       # %bb.0:348; LA64-NEXT:    addu16i.d $a0, $a0, -1349; LA64-NEXT:    addi.w $a0, $a0, 0350; LA64-NEXT:    ret351  %add = add i32 %x, -65536352  ret i32 %add353}354 355define signext i32 @add_i32_minus_0x10000_sext(i32 %x) {356; LA32-LABEL: add_i32_minus_0x10000_sext:357; LA32:       # %bb.0:358; LA32-NEXT:    lu12i.w $a1, -16359; LA32-NEXT:    add.w $a0, $a0, $a1360; LA32-NEXT:    ret361;362; LA64-LABEL: add_i32_minus_0x10000_sext:363; LA64:       # %bb.0:364; LA64-NEXT:    addu16i.d $a0, $a0, -1365; LA64-NEXT:    addi.w $a0, $a0, 0366; LA64-NEXT:    ret367  %add = add i32 %x, -65536368  ret i32 %add369}370 371define i64 @add_i64_minus_0x10000(i64 %x) {372; LA32-LABEL: add_i64_minus_0x10000:373; LA32:       # %bb.0:374; LA32-NEXT:    lu12i.w $a2, -16375; LA32-NEXT:    add.w $a2, $a0, $a2376; LA32-NEXT:    sltu $a0, $a2, $a0377; LA32-NEXT:    add.w $a0, $a1, $a0378; LA32-NEXT:    addi.w $a1, $a0, -1379; LA32-NEXT:    move $a0, $a2380; LA32-NEXT:    ret381;382; LA64-LABEL: add_i64_minus_0x10000:383; LA64:       # %bb.0:384; LA64-NEXT:    addu16i.d $a0, $a0, -1385; LA64-NEXT:    ret386  %add = add i64 %x, -65536387  ret i64 %add388}389 390;; Check that `addu16i.d + addi` is emitted for these cases.391 392define i32 @add_i32_0x7fff07ff(i32 %x) {393; LA32-LABEL: add_i32_0x7fff07ff:394; LA32:       # %bb.0:395; LA32-NEXT:    lu12i.w $a1, 524272396; LA32-NEXT:    ori $a1, $a1, 2047397; LA32-NEXT:    add.w $a0, $a0, $a1398; LA32-NEXT:    ret399;400; LA64-LABEL: add_i32_0x7fff07ff:401; LA64:       # %bb.0:402; LA64-NEXT:    addu16i.d $a0, $a0, 32767403; LA64-NEXT:    addi.w $a0, $a0, 2047404; LA64-NEXT:    ret405  %add = add i32 %x, 2147420159406  ret i32 %add407}408 409define signext i32 @add_i32_0x7fff07ff_sext(i32 %x) {410; LA32-LABEL: add_i32_0x7fff07ff_sext:411; LA32:       # %bb.0:412; LA32-NEXT:    lu12i.w $a1, 524272413; LA32-NEXT:    ori $a1, $a1, 2047414; LA32-NEXT:    add.w $a0, $a0, $a1415; LA32-NEXT:    ret416;417; LA64-LABEL: add_i32_0x7fff07ff_sext:418; LA64:       # %bb.0:419; LA64-NEXT:    addu16i.d $a0, $a0, 32767420; LA64-NEXT:    addi.w $a0, $a0, 2047421; LA64-NEXT:    ret422  %add = add i32 %x, 2147420159423  ret i32 %add424}425 426define i64 @add_i64_0x7fff07ff(i64 %x) {427; LA32-LABEL: add_i64_0x7fff07ff:428; LA32:       # %bb.0:429; LA32-NEXT:    lu12i.w $a2, 524272430; LA32-NEXT:    ori $a2, $a2, 2047431; LA32-NEXT:    add.w $a2, $a0, $a2432; LA32-NEXT:    sltu $a0, $a2, $a0433; LA32-NEXT:    add.w $a1, $a1, $a0434; LA32-NEXT:    move $a0, $a2435; LA32-NEXT:    ret436;437; LA64-LABEL: add_i64_0x7fff07ff:438; LA64:       # %bb.0:439; LA64-NEXT:    addu16i.d $a0, $a0, 32767440; LA64-NEXT:    addi.d $a0, $a0, 2047441; LA64-NEXT:    ret442  %add = add i64 %x, 2147420159443  ret i64 %add444}445 446define i32 @add_i32_0x7ffef800(i32 %x) {447; LA32-LABEL: add_i32_0x7ffef800:448; LA32:       # %bb.0:449; LA32-NEXT:    lu12i.w $a1, 524271450; LA32-NEXT:    ori $a1, $a1, 2048451; LA32-NEXT:    add.w $a0, $a0, $a1452; LA32-NEXT:    ret453;454; LA64-LABEL: add_i32_0x7ffef800:455; LA64:       # %bb.0:456; LA64-NEXT:    addu16i.d $a0, $a0, 32767457; LA64-NEXT:    addi.w $a0, $a0, -2048458; LA64-NEXT:    ret459  %add = add i32 %x, 2147416064460  ret i32 %add461}462 463define signext i32 @add_i32_0x7ffef800_sext(i32 %x) {464; LA32-LABEL: add_i32_0x7ffef800_sext:465; LA32:       # %bb.0:466; LA32-NEXT:    lu12i.w $a1, 524271467; LA32-NEXT:    ori $a1, $a1, 2048468; LA32-NEXT:    add.w $a0, $a0, $a1469; LA32-NEXT:    ret470;471; LA64-LABEL: add_i32_0x7ffef800_sext:472; LA64:       # %bb.0:473; LA64-NEXT:    addu16i.d $a0, $a0, 32767474; LA64-NEXT:    addi.w $a0, $a0, -2048475; LA64-NEXT:    ret476  %add = add i32 %x, 2147416064477  ret i32 %add478}479 480define i64 @add_i64_0x7ffef800(i64 %x) {481; LA32-LABEL: add_i64_0x7ffef800:482; LA32:       # %bb.0:483; LA32-NEXT:    lu12i.w $a2, 524271484; LA32-NEXT:    ori $a2, $a2, 2048485; LA32-NEXT:    add.w $a2, $a0, $a2486; LA32-NEXT:    sltu $a0, $a2, $a0487; LA32-NEXT:    add.w $a1, $a1, $a0488; LA32-NEXT:    move $a0, $a2489; LA32-NEXT:    ret490;491; LA64-LABEL: add_i64_0x7ffef800:492; LA64:       # %bb.0:493; LA64-NEXT:    addu16i.d $a0, $a0, 32767494; LA64-NEXT:    addi.d $a0, $a0, -2048495; LA64-NEXT:    ret496  %add = add i64 %x, 2147416064497  ret i64 %add498}499 500define i64 @add_i64_minus_0x80000800(i64 %x) {501; LA32-LABEL: add_i64_minus_0x80000800:502; LA32:       # %bb.0:503; LA32-NEXT:    lu12i.w $a2, 524287504; LA32-NEXT:    ori $a2, $a2, 2048505; LA32-NEXT:    add.w $a2, $a0, $a2506; LA32-NEXT:    sltu $a0, $a2, $a0507; LA32-NEXT:    add.w $a0, $a1, $a0508; LA32-NEXT:    addi.w $a1, $a0, -1509; LA32-NEXT:    move $a0, $a2510; LA32-NEXT:    ret511;512; LA64-LABEL: add_i64_minus_0x80000800:513; LA64:       # %bb.0:514; LA64-NEXT:    addu16i.d $a0, $a0, -32768515; LA64-NEXT:    addi.d $a0, $a0, -2048516; LA64-NEXT:    ret517  %add = add i64 %x, -2147485696518  ret i64 %add519}520 521define i32 @add_i32_minus_0x23450679(i32 %x) {522; LA32-LABEL: add_i32_minus_0x23450679:523; LA32:       # %bb.0:524; LA32-NEXT:    lu12i.w $a1, -144465525; LA32-NEXT:    ori $a1, $a1, 2439526; LA32-NEXT:    add.w $a0, $a0, $a1527; LA32-NEXT:    ret528;529; LA64-LABEL: add_i32_minus_0x23450679:530; LA64:       # %bb.0:531; LA64-NEXT:    addu16i.d $a0, $a0, -9029532; LA64-NEXT:    addi.w $a0, $a0, -1657533; LA64-NEXT:    ret534  %add = add i32 %x, -591726201535  ret i32 %add536}537 538define signext i32 @add_i32_minus_0x23450679_sext(i32 %x) {539; LA32-LABEL: add_i32_minus_0x23450679_sext:540; LA32:       # %bb.0:541; LA32-NEXT:    lu12i.w $a1, -144465542; LA32-NEXT:    ori $a1, $a1, 2439543; LA32-NEXT:    add.w $a0, $a0, $a1544; LA32-NEXT:    ret545;546; LA64-LABEL: add_i32_minus_0x23450679_sext:547; LA64:       # %bb.0:548; LA64-NEXT:    addu16i.d $a0, $a0, -9029549; LA64-NEXT:    addi.w $a0, $a0, -1657550; LA64-NEXT:    ret551  %add = add i32 %x, -591726201552  ret i32 %add553}554 555define i64 @add_i64_minus_0x23450679(i64 %x) {556; LA32-LABEL: add_i64_minus_0x23450679:557; LA32:       # %bb.0:558; LA32-NEXT:    lu12i.w $a2, -144465559; LA32-NEXT:    ori $a2, $a2, 2439560; LA32-NEXT:    add.w $a2, $a0, $a2561; LA32-NEXT:    sltu $a0, $a2, $a0562; LA32-NEXT:    add.w $a0, $a1, $a0563; LA32-NEXT:    addi.w $a1, $a0, -1564; LA32-NEXT:    move $a0, $a2565; LA32-NEXT:    ret566;567; LA64-LABEL: add_i64_minus_0x23450679:568; LA64:       # %bb.0:569; LA64-NEXT:    addu16i.d $a0, $a0, -9029570; LA64-NEXT:    addi.d $a0, $a0, -1657571; LA64-NEXT:    ret572  %add = add i64 %x, -591726201573  ret i64 %add574}575 576define i32 @add_i32_minus_0x2345fedd(i32 %x) {577; LA32-LABEL: add_i32_minus_0x2345fedd:578; LA32:       # %bb.0:579; LA32-NEXT:    lu12i.w $a1, -144480580; LA32-NEXT:    ori $a1, $a1, 291581; LA32-NEXT:    add.w $a0, $a0, $a1582; LA32-NEXT:    ret583;584; LA64-LABEL: add_i32_minus_0x2345fedd:585; LA64:       # %bb.0:586; LA64-NEXT:    addu16i.d $a0, $a0, -9030587; LA64-NEXT:    addi.w $a0, $a0, 291588; LA64-NEXT:    ret589  %add = add i32 %x, -591789789590  ret i32 %add591}592 593define signext i32 @add_i32_minus_0x2345fedd_sext(i32 %x) {594; LA32-LABEL: add_i32_minus_0x2345fedd_sext:595; LA32:       # %bb.0:596; LA32-NEXT:    lu12i.w $a1, -144480597; LA32-NEXT:    ori $a1, $a1, 291598; LA32-NEXT:    add.w $a0, $a0, $a1599; LA32-NEXT:    ret600;601; LA64-LABEL: add_i32_minus_0x2345fedd_sext:602; LA64:       # %bb.0:603; LA64-NEXT:    addu16i.d $a0, $a0, -9030604; LA64-NEXT:    addi.w $a0, $a0, 291605; LA64-NEXT:    ret606  %add = add i32 %x, -591789789607  ret i32 %add608}609 610define i64 @add_i64_minus_0x2345fedd(i64 %x) {611; LA32-LABEL: add_i64_minus_0x2345fedd:612; LA32:       # %bb.0:613; LA32-NEXT:    lu12i.w $a2, -144480614; LA32-NEXT:    ori $a2, $a2, 291615; LA32-NEXT:    add.w $a2, $a0, $a2616; LA32-NEXT:    sltu $a0, $a2, $a0617; LA32-NEXT:    add.w $a0, $a1, $a0618; LA32-NEXT:    addi.w $a1, $a0, -1619; LA32-NEXT:    move $a0, $a2620; LA32-NEXT:    ret621;622; LA64-LABEL: add_i64_minus_0x2345fedd:623; LA64:       # %bb.0:624; LA64-NEXT:    addu16i.d $a0, $a0, -9030625; LA64-NEXT:    addi.d $a0, $a0, 291626; LA64-NEXT:    ret627  %add = add i64 %x, -591789789628  ret i64 %add629}630 631;; Check that `addu16i.d` isn't used for the following cases.632 633define i64 @add_i64_0x80000000(i64 %x) {634; LA32-LABEL: add_i64_0x80000000:635; LA32:       # %bb.0:636; LA32-NEXT:    lu12i.w $a2, -524288637; LA32-NEXT:    add.w $a2, $a0, $a2638; LA32-NEXT:    sltu $a0, $a2, $a0639; LA32-NEXT:    add.w $a1, $a1, $a0640; LA32-NEXT:    move $a0, $a2641; LA32-NEXT:    ret642;643; LA64-LABEL: add_i64_0x80000000:644; LA64:       # %bb.0:645; LA64-NEXT:    lu12i.w $a1, -524288646; LA64-NEXT:    lu32i.d $a1, 0647; LA64-NEXT:    add.d $a0, $a0, $a1648; LA64-NEXT:    ret649  %add = add i64 %x, 2147483648650  ret i64 %add651}652 653define i64 @add_i64_0xffff0000(i64 %x) {654; LA32-LABEL: add_i64_0xffff0000:655; LA32:       # %bb.0:656; LA32-NEXT:    lu12i.w $a2, -16657; LA32-NEXT:    add.w $a2, $a0, $a2658; LA32-NEXT:    sltu $a0, $a2, $a0659; LA32-NEXT:    add.w $a1, $a1, $a0660; LA32-NEXT:    move $a0, $a2661; LA32-NEXT:    ret662;663; LA64-LABEL: add_i64_0xffff0000:664; LA64:       # %bb.0:665; LA64-NEXT:    lu12i.w $a1, -16666; LA64-NEXT:    lu32i.d $a1, 0667; LA64-NEXT:    add.d $a0, $a0, $a1668; LA64-NEXT:    ret669  %add = add i64 %x, 4294901760670  ret i64 %add671}672 673;; -0x80000800 is equivalent to +0x7ffff800 in i32, so addu16i.d isn't matched674;; in this case.675define i32 @add_i32_minus_0x80000800(i32 %x) {676; LA32-LABEL: add_i32_minus_0x80000800:677; LA32:       # %bb.0:678; LA32-NEXT:    lu12i.w $a1, 524287679; LA32-NEXT:    ori $a1, $a1, 2048680; LA32-NEXT:    add.w $a0, $a0, $a1681; LA32-NEXT:    ret682;683; LA64-LABEL: add_i32_minus_0x80000800:684; LA64:       # %bb.0:685; LA64-NEXT:    lu12i.w $a1, 524287686; LA64-NEXT:    ori $a1, $a1, 2048687; LA64-NEXT:    add.w $a0, $a0, $a1688; LA64-NEXT:    ret689  %add = add i32 %x, -2147485696690  ret i32 %add691}692 693define signext i32 @add_i32_minus_0x80000800_sext(i32 %x) {694; LA32-LABEL: add_i32_minus_0x80000800_sext:695; LA32:       # %bb.0:696; LA32-NEXT:    lu12i.w $a1, 524287697; LA32-NEXT:    ori $a1, $a1, 2048698; LA32-NEXT:    add.w $a0, $a0, $a1699; LA32-NEXT:    ret700;701; LA64-LABEL: add_i32_minus_0x80000800_sext:702; LA64:       # %bb.0:703; LA64-NEXT:    lu12i.w $a1, 524287704; LA64-NEXT:    ori $a1, $a1, 2048705; LA64-NEXT:    add.w $a0, $a0, $a1706; LA64-NEXT:    ret707  %add = add i32 %x, -2147485696708  ret i32 %add709}710 711define signext i32 @add_i32_4080(i32 %x) {712; LA32-LABEL: add_i32_4080:713; LA32:       # %bb.0:714; LA32-NEXT:    addi.w $a0, $a0, 2047715; LA32-NEXT:    addi.w $a0, $a0, 2033716; LA32-NEXT:    ret717;718; LA64-LABEL: add_i32_4080:719; LA64:       # %bb.0:720; LA64-NEXT:    addi.d $a0, $a0, 2047721; LA64-NEXT:    addi.w $a0, $a0, 2033722; LA64-NEXT:    ret723  %add = add i32 %x, 4080724  ret i32 %add725}726 727define signext i32 @add_i32_minus_4080(i32 %x) {728; LA32-LABEL: add_i32_minus_4080:729; LA32:       # %bb.0:730; LA32-NEXT:    addi.w $a0, $a0, -2048731; LA32-NEXT:    addi.w $a0, $a0, -2032732; LA32-NEXT:    ret733;734; LA64-LABEL: add_i32_minus_4080:735; LA64:       # %bb.0:736; LA64-NEXT:    addi.d $a0, $a0, -2048737; LA64-NEXT:    addi.w $a0, $a0, -2032738; LA64-NEXT:    ret739  %add = add i32 %x, -4080740  ret i32 %add741}742 743define signext i32 @add_i32_2048(i32 %x) {744; LA32-LABEL: add_i32_2048:745; LA32:       # %bb.0:746; LA32-NEXT:    addi.w $a0, $a0, 2047747; LA32-NEXT:    addi.w $a0, $a0, 1748; LA32-NEXT:    ret749;750; LA64-LABEL: add_i32_2048:751; LA64:       # %bb.0:752; LA64-NEXT:    addi.d $a0, $a0, 2047753; LA64-NEXT:    addi.w $a0, $a0, 1754; LA64-NEXT:    ret755  %add = add i32 %x, 2048756  ret i32 %add757}758 759define signext i32 @add_i32_4094(i32 %x) {760; LA32-LABEL: add_i32_4094:761; LA32:       # %bb.0:762; LA32-NEXT:    addi.w $a0, $a0, 2047763; LA32-NEXT:    addi.w $a0, $a0, 2047764; LA32-NEXT:    ret765;766; LA64-LABEL: add_i32_4094:767; LA64:       # %bb.0:768; LA64-NEXT:    addi.d $a0, $a0, 2047769; LA64-NEXT:    addi.w $a0, $a0, 2047770; LA64-NEXT:    ret771  %add = add i32 %x, 4094772  ret i32 %add773}774 775define signext i32 @add_i32_minus_2049(i32 %x) {776; LA32-LABEL: add_i32_minus_2049:777; LA32:       # %bb.0:778; LA32-NEXT:    addi.w $a0, $a0, -2048779; LA32-NEXT:    addi.w $a0, $a0, -1780; LA32-NEXT:    ret781;782; LA64-LABEL: add_i32_minus_2049:783; LA64:       # %bb.0:784; LA64-NEXT:    addi.d $a0, $a0, -2048785; LA64-NEXT:    addi.w $a0, $a0, -1786; LA64-NEXT:    ret787  %add = add i32 %x, -2049788  ret i32 %add789}790 791define signext i32 @add_i32_minus_4096(i32 %x) {792; LA32-LABEL: add_i32_minus_4096:793; LA32:       # %bb.0:794; LA32-NEXT:    addi.w $a0, $a0, -2048795; LA32-NEXT:    addi.w $a0, $a0, -2048796; LA32-NEXT:    ret797;798; LA64-LABEL: add_i32_minus_4096:799; LA64:       # %bb.0:800; LA64-NEXT:    addi.d $a0, $a0, -2048801; LA64-NEXT:    addi.w $a0, $a0, -2048802; LA64-NEXT:    ret803  %add = add i32 %x, -4096804  ret i32 %add805}806 807define i64 @add_i64_4080(i64 %x) {808; LA32-LABEL: add_i64_4080:809; LA32:       # %bb.0:810; LA32-NEXT:    addi.w $a2, $a0, 2047811; LA32-NEXT:    addi.w $a2, $a2, 2033812; LA32-NEXT:    sltu $a0, $a2, $a0813; LA32-NEXT:    add.w $a1, $a1, $a0814; LA32-NEXT:    move $a0, $a2815; LA32-NEXT:    ret816;817; LA64-LABEL: add_i64_4080:818; LA64:       # %bb.0:819; LA64-NEXT:    addi.d $a0, $a0, 2047820; LA64-NEXT:    addi.d $a0, $a0, 2033821; LA64-NEXT:    ret822  %add = add i64 %x, 4080823  ret i64 %add824}825 826define i64 @add_i64_minus_4080(i64 %x) {827; LA32-LABEL: add_i64_minus_4080:828; LA32:       # %bb.0:829; LA32-NEXT:    addi.w $a2, $a0, -2048830; LA32-NEXT:    addi.w $a2, $a2, -2032831; LA32-NEXT:    sltu $a0, $a2, $a0832; LA32-NEXT:    add.w $a0, $a1, $a0833; LA32-NEXT:    addi.w $a1, $a0, -1834; LA32-NEXT:    move $a0, $a2835; LA32-NEXT:    ret836;837; LA64-LABEL: add_i64_minus_4080:838; LA64:       # %bb.0:839; LA64-NEXT:    addi.d $a0, $a0, -2048840; LA64-NEXT:    addi.d $a0, $a0, -2032841; LA64-NEXT:    ret842  %add = add i64 %x, -4080843  ret i64 %add844}845 846define i64 @add_i64_2048(i64 %x) {847; LA32-LABEL: add_i64_2048:848; LA32:       # %bb.0:849; LA32-NEXT:    addi.w $a2, $a0, 2047850; LA32-NEXT:    addi.w $a2, $a2, 1851; LA32-NEXT:    sltu $a0, $a2, $a0852; LA32-NEXT:    add.w $a1, $a1, $a0853; LA32-NEXT:    move $a0, $a2854; LA32-NEXT:    ret855;856; LA64-LABEL: add_i64_2048:857; LA64:       # %bb.0:858; LA64-NEXT:    addi.d $a0, $a0, 2047859; LA64-NEXT:    addi.d $a0, $a0, 1860; LA64-NEXT:    ret861  %add = add i64 %x, 2048862  ret i64 %add863}864 865define i64 @add_i64_4094(i64 %x) {866; LA32-LABEL: add_i64_4094:867; LA32:       # %bb.0:868; LA32-NEXT:    addi.w $a2, $a0, 2047869; LA32-NEXT:    addi.w $a2, $a2, 2047870; LA32-NEXT:    sltu $a0, $a2, $a0871; LA32-NEXT:    add.w $a1, $a1, $a0872; LA32-NEXT:    move $a0, $a2873; LA32-NEXT:    ret874;875; LA64-LABEL: add_i64_4094:876; LA64:       # %bb.0:877; LA64-NEXT:    addi.d $a0, $a0, 2047878; LA64-NEXT:    addi.d $a0, $a0, 2047879; LA64-NEXT:    ret880  %add = add i64 %x, 4094881  ret i64 %add882}883 884define i64 @add_i64_minus_2049(i64 %x) {885; LA32-LABEL: add_i64_minus_2049:886; LA32:       # %bb.0:887; LA32-NEXT:    addi.w $a2, $a0, -2048888; LA32-NEXT:    addi.w $a2, $a2, -1889; LA32-NEXT:    sltu $a0, $a2, $a0890; LA32-NEXT:    add.w $a0, $a1, $a0891; LA32-NEXT:    addi.w $a1, $a0, -1892; LA32-NEXT:    move $a0, $a2893; LA32-NEXT:    ret894;895; LA64-LABEL: add_i64_minus_2049:896; LA64:       # %bb.0:897; LA64-NEXT:    addi.d $a0, $a0, -2048898; LA64-NEXT:    addi.d $a0, $a0, -1899; LA64-NEXT:    ret900  %add = add i64 %x, -2049901  ret i64 %add902}903 904define i64 @add_i64_minus_4096(i64 %x) {905; LA32-LABEL: add_i64_minus_4096:906; LA32:       # %bb.0:907; LA32-NEXT:    addi.w $a2, $a0, -2048908; LA32-NEXT:    addi.w $a2, $a2, -2048909; LA32-NEXT:    sltu $a0, $a2, $a0910; LA32-NEXT:    add.w $a0, $a1, $a0911; LA32-NEXT:    addi.w $a1, $a0, -1912; LA32-NEXT:    move $a0, $a2913; LA32-NEXT:    ret914;915; LA64-LABEL: add_i64_minus_4096:916; LA64:       # %bb.0:917; LA64-NEXT:    addi.d $a0, $a0, -2048918; LA64-NEXT:    addi.d $a0, $a0, -2048919; LA64-NEXT:    ret920  %add = add i64 %x, -4096921  ret i64 %add922}923