168 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 'ashr' LLVM IR: https://llvm.org/docs/LangRef.html#ashr-instruction6 7define i1 @ashr_i1(i1 %x, i1 %y) {8; LA32-LABEL: ashr_i1:9; LA32: # %bb.0:10; LA32-NEXT: ret11;12; LA64-LABEL: ashr_i1:13; LA64: # %bb.0:14; LA64-NEXT: ret15 %ashr = ashr i1 %x, %y16 ret i1 %ashr17}18 19define i8 @ashr_i8(i8 %x, i8 %y) {20; LA32-LABEL: ashr_i8:21; LA32: # %bb.0:22; LA32-NEXT: slli.w $a0, $a0, 2423; LA32-NEXT: srai.w $a0, $a0, 2424; LA32-NEXT: sra.w $a0, $a0, $a125; LA32-NEXT: ret26;27; LA64-LABEL: ashr_i8:28; LA64: # %bb.0:29; LA64-NEXT: ext.w.b $a0, $a030; LA64-NEXT: sra.d $a0, $a0, $a131; LA64-NEXT: ret32 %ashr = ashr i8 %x, %y33 ret i8 %ashr34}35 36define i16 @ashr_i16(i16 %x, i16 %y) {37; LA32-LABEL: ashr_i16:38; LA32: # %bb.0:39; LA32-NEXT: slli.w $a0, $a0, 1640; LA32-NEXT: srai.w $a0, $a0, 1641; LA32-NEXT: sra.w $a0, $a0, $a142; LA32-NEXT: ret43;44; LA64-LABEL: ashr_i16:45; LA64: # %bb.0:46; LA64-NEXT: ext.w.h $a0, $a047; LA64-NEXT: sra.d $a0, $a0, $a148; LA64-NEXT: ret49 %ashr = ashr i16 %x, %y50 ret i16 %ashr51}52 53define i32 @ashr_i32(i32 %x, i32 %y) {54; LA32-LABEL: ashr_i32:55; LA32: # %bb.0:56; LA32-NEXT: sra.w $a0, $a0, $a157; LA32-NEXT: ret58;59; LA64-LABEL: ashr_i32:60; LA64: # %bb.0:61; LA64-NEXT: sra.w $a0, $a0, $a162; LA64-NEXT: ret63 %ashr = ashr i32 %x, %y64 ret i32 %ashr65}66 67define i64 @ashr_i64(i64 %x, i64 %y) {68; LA32-LABEL: ashr_i64:69; LA32: # %bb.0:70; LA32-NEXT: addi.w $a3, $a2, -3271; LA32-NEXT: bltz $a3, .LBB4_272; LA32-NEXT: # %bb.1:73; LA32-NEXT: sra.w $a0, $a1, $a374; LA32-NEXT: srai.w $a1, $a1, 3175; LA32-NEXT: ret76; LA32-NEXT: .LBB4_2:77; LA32-NEXT: srl.w $a0, $a0, $a278; LA32-NEXT: xori $a3, $a2, 3179; LA32-NEXT: slli.w $a4, $a1, 180; LA32-NEXT: sll.w $a3, $a4, $a381; LA32-NEXT: or $a0, $a0, $a382; LA32-NEXT: sra.w $a1, $a1, $a283; LA32-NEXT: ret84;85; LA64-LABEL: ashr_i64:86; LA64: # %bb.0:87; LA64-NEXT: sra.d $a0, $a0, $a188; LA64-NEXT: ret89 %ashr = ashr i64 %x, %y90 ret i64 %ashr91}92 93define i1 @ashr_i1_3(i1 %x) {94; LA32-LABEL: ashr_i1_3:95; LA32: # %bb.0:96; LA32-NEXT: ret97;98; LA64-LABEL: ashr_i1_3:99; LA64: # %bb.0:100; LA64-NEXT: ret101 %ashr = ashr i1 %x, 3102 ret i1 %ashr103}104 105define i8 @ashr_i8_3(i8 %x) {106; LA32-LABEL: ashr_i8_3:107; LA32: # %bb.0:108; LA32-NEXT: slli.w $a0, $a0, 24109; LA32-NEXT: srai.w $a0, $a0, 27110; LA32-NEXT: ret111;112; LA64-LABEL: ashr_i8_3:113; LA64: # %bb.0:114; LA64-NEXT: ext.w.b $a0, $a0115; LA64-NEXT: srai.d $a0, $a0, 3116; LA64-NEXT: ret117 %ashr = ashr i8 %x, 3118 ret i8 %ashr119}120 121define i16 @ashr_i16_3(i16 %x) {122; LA32-LABEL: ashr_i16_3:123; LA32: # %bb.0:124; LA32-NEXT: slli.w $a0, $a0, 16125; LA32-NEXT: srai.w $a0, $a0, 19126; LA32-NEXT: ret127;128; LA64-LABEL: ashr_i16_3:129; LA64: # %bb.0:130; LA64-NEXT: ext.w.h $a0, $a0131; LA64-NEXT: srai.d $a0, $a0, 3132; LA64-NEXT: ret133 %ashr = ashr i16 %x, 3134 ret i16 %ashr135}136 137define i32 @ashr_i32_3(i32 %x) {138; LA32-LABEL: ashr_i32_3:139; LA32: # %bb.0:140; LA32-NEXT: srai.w $a0, $a0, 3141; LA32-NEXT: ret142;143; LA64-LABEL: ashr_i32_3:144; LA64: # %bb.0:145; LA64-NEXT: addi.w $a0, $a0, 0146; LA64-NEXT: srai.d $a0, $a0, 3147; LA64-NEXT: ret148 %ashr = ashr i32 %x, 3149 ret i32 %ashr150}151 152define i64 @ashr_i64_3(i64 %x) {153; LA32-LABEL: ashr_i64_3:154; LA32: # %bb.0:155; LA32-NEXT: slli.w $a2, $a1, 29156; LA32-NEXT: srli.w $a0, $a0, 3157; LA32-NEXT: or $a0, $a0, $a2158; LA32-NEXT: srai.w $a1, $a1, 3159; LA32-NEXT: ret160;161; LA64-LABEL: ashr_i64_3:162; LA64: # %bb.0:163; LA64-NEXT: srai.d $a0, $a0, 3164; LA64-NEXT: ret165 %ashr = ashr i64 %x, 3166 ret i64 %ashr167}168