1; RUN: llc --mtriple=loongarch32 < %s | FileCheck %s --check-prefix=LA32 2; RUN: llc --mtriple=loongarch64 < %s | FileCheck %s --check-prefix=LA64 3 4;; Exercise the 'add' LLVM IR: https://llvm.org/docs/LangRef.html#add-instruction 5 6define i1 @add_i1(i1 %x, i1 %y) { 7; LA32-LABEL: add_i1: 8; LA32: # %bb.0: 9; LA32-NEXT: add.w $a0, $a0, $a1 10; LA32-NEXT: jirl $zero, $ra, 0 11; 12; LA64-LABEL: add_i1: 13; LA64: # %bb.0: 14; LA64-NEXT: add.d $a0, $a0, $a1 15; LA64-NEXT: jirl $zero, $ra, 0 16 %add = add i1 %x, %y 17 ret i1 %add 18} 19 20define i8 @add_i8(i8 %x, i8 %y) { 21; LA32-LABEL: add_i8: 22; LA32: # %bb.0: 23; LA32-NEXT: add.w $a0, $a0, $a1 24; LA32-NEXT: jirl $zero, $ra, 0 25; 26; LA64-LABEL: add_i8: 27; LA64: # %bb.0: 28; LA64-NEXT: add.d $a0, $a0, $a1 29; LA64-NEXT: jirl $zero, $ra, 0 30 %add = add i8 %x, %y 31 ret i8 %add 32} 33 34define i16 @add_i16(i16 %x, i16 %y) { 35; LA32-LABEL: add_i16: 36; LA32: # %bb.0: 37; LA32-NEXT: add.w $a0, $a0, $a1 38; LA32-NEXT: jirl $zero, $ra, 0 39; 40; LA64-LABEL: add_i16: 41; LA64: # %bb.0: 42; LA64-NEXT: add.d $a0, $a0, $a1 43; LA64-NEXT: jirl $zero, $ra, 0 44 %add = add i16 %x, %y 45 ret i16 %add 46} 47 48define i32 @add_i32(i32 %x, i32 %y) { 49; LA32-LABEL: add_i32: 50; LA32: # %bb.0: 51; LA32-NEXT: add.w $a0, $a0, $a1 52; LA32-NEXT: jirl $zero, $ra, 0 53; 54; LA64-LABEL: add_i32: 55; LA64: # %bb.0: 56; LA64-NEXT: add.d $a0, $a0, $a1 57; LA64-NEXT: jirl $zero, $ra, 0 58 %add = add i32 %x, %y 59 ret i32 %add 60} 61 62;; Match the pattern: 63;; def : PatGprGpr_32<add, ADD_W>; 64define signext i32 @add_i32_sext(i32 %x, i32 %y) { 65; LA32-LABEL: add_i32_sext: 66; LA32: # %bb.0: 67; LA32-NEXT: add.w $a0, $a0, $a1 68; LA32-NEXT: jirl $zero, $ra, 0 69; 70; LA64-LABEL: add_i32_sext: 71; LA64: # %bb.0: 72; LA64-NEXT: add.w $a0, $a0, $a1 73; LA64-NEXT: jirl $zero, $ra, 0 74 %add = add i32 %x, %y 75 ret i32 %add 76} 77 78define i64 @add_i64(i64 %x, i64 %y) { 79; LA32-LABEL: add_i64: 80; LA32: # %bb.0: 81; LA32-NEXT: add.w $a1, $a1, $a3 82; LA32-NEXT: add.w $a2, $a0, $a2 83; LA32-NEXT: sltu $a0, $a2, $a0 84; LA32-NEXT: add.w $a1, $a1, $a0 85; LA32-NEXT: move $a0, $a2 86; LA32-NEXT: jirl $zero, $ra, 0 87; 88; LA64-LABEL: add_i64: 89; LA64: # %bb.0: 90; LA64-NEXT: add.d $a0, $a0, $a1 91; LA64-NEXT: jirl $zero, $ra, 0 92 %add = add i64 %x, %y 93 ret i64 %add 94} 95 96define i1 @add_i1_3(i1 %x) { 97; LA32-LABEL: add_i1_3: 98; LA32: # %bb.0: 99; LA32-NEXT: addi.w $a0, $a0, 1 100; LA32-NEXT: jirl $zero, $ra, 0 101; 102; LA64-LABEL: add_i1_3: 103; LA64: # %bb.0: 104; LA64-NEXT: addi.d $a0, $a0, 1 105; LA64-NEXT: jirl $zero, $ra, 0 106 %add = add i1 %x, 3 107 ret i1 %add 108} 109 110define i8 @add_i8_3(i8 %x) { 111; LA32-LABEL: add_i8_3: 112; LA32: # %bb.0: 113; LA32-NEXT: addi.w $a0, $a0, 3 114; LA32-NEXT: jirl $zero, $ra, 0 115; 116; LA64-LABEL: add_i8_3: 117; LA64: # %bb.0: 118; LA64-NEXT: addi.d $a0, $a0, 3 119; LA64-NEXT: jirl $zero, $ra, 0 120 %add = add i8 %x, 3 121 ret i8 %add 122} 123 124define i16 @add_i16_3(i16 %x) { 125; LA32-LABEL: add_i16_3: 126; LA32: # %bb.0: 127; LA32-NEXT: addi.w $a0, $a0, 3 128; LA32-NEXT: jirl $zero, $ra, 0 129; 130; LA64-LABEL: add_i16_3: 131; LA64: # %bb.0: 132; LA64-NEXT: addi.d $a0, $a0, 3 133; LA64-NEXT: jirl $zero, $ra, 0 134 %add = add i16 %x, 3 135 ret i16 %add 136} 137 138define i32 @add_i32_3(i32 %x) { 139; LA32-LABEL: add_i32_3: 140; LA32: # %bb.0: 141; LA32-NEXT: addi.w $a0, $a0, 3 142; LA32-NEXT: jirl $zero, $ra, 0 143; 144; LA64-LABEL: add_i32_3: 145; LA64: # %bb.0: 146; LA64-NEXT: addi.d $a0, $a0, 3 147; LA64-NEXT: jirl $zero, $ra, 0 148 %add = add i32 %x, 3 149 ret i32 %add 150} 151 152;; Match the pattern: 153;; def : PatGprImm_32<add, ADDI_W, simm12>; 154define signext i32 @add_i32_3_sext(i32 %x) { 155; LA32-LABEL: add_i32_3_sext: 156; LA32: # %bb.0: 157; LA32-NEXT: addi.w $a0, $a0, 3 158; LA32-NEXT: jirl $zero, $ra, 0 159; 160; LA64-LABEL: add_i32_3_sext: 161; LA64: # %bb.0: 162; LA64-NEXT: addi.w $a0, $a0, 3 163; LA64-NEXT: jirl $zero, $ra, 0 164 %add = add i32 %x, 3 165 ret i32 %add 166} 167 168define i64 @add_i64_3(i64 %x) { 169; LA32-LABEL: add_i64_3: 170; LA32: # %bb.0: 171; LA32-NEXT: addi.w $a2, $a0, 3 172; LA32-NEXT: sltu $a0, $a2, $a0 173; LA32-NEXT: add.w $a1, $a1, $a0 174; LA32-NEXT: move $a0, $a2 175; LA32-NEXT: jirl $zero, $ra, 0 176; 177; LA64-LABEL: add_i64_3: 178; LA64: # %bb.0: 179; LA64-NEXT: addi.d $a0, $a0, 3 180; LA64-NEXT: jirl $zero, $ra, 0 181 %add = add i64 %x, 3 182 ret i64 %add 183} 184