1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc --mtriple=loongarch32 -mattr=+d < %s | FileCheck %s --check-prefix=LA32 3; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s --check-prefix=LA64 4 5;; Exercise the bare integers 'select' LLVM IR: https://llvm.org/docs/LangRef.html#select-instruction 6 7define i1 @bare_select_i1(i1 %a, i1 %b, i1 %c) { 8; LA32-LABEL: bare_select_i1: 9; LA32: # %bb.0: 10; LA32-NEXT: andi $a0, $a0, 1 11; LA32-NEXT: masknez $a2, $a2, $a0 12; LA32-NEXT: maskeqz $a0, $a1, $a0 13; LA32-NEXT: or $a0, $a0, $a2 14; LA32-NEXT: ret 15; 16; LA64-LABEL: bare_select_i1: 17; LA64: # %bb.0: 18; LA64-NEXT: andi $a0, $a0, 1 19; LA64-NEXT: masknez $a2, $a2, $a0 20; LA64-NEXT: maskeqz $a0, $a1, $a0 21; LA64-NEXT: or $a0, $a0, $a2 22; LA64-NEXT: ret 23 %res = select i1 %a, i1 %b, i1 %c 24 ret i1 %res 25} 26 27define i8 @bare_select_i8(i1 %a, i8 %b, i8 %c) { 28; LA32-LABEL: bare_select_i8: 29; LA32: # %bb.0: 30; LA32-NEXT: andi $a0, $a0, 1 31; LA32-NEXT: masknez $a2, $a2, $a0 32; LA32-NEXT: maskeqz $a0, $a1, $a0 33; LA32-NEXT: or $a0, $a0, $a2 34; LA32-NEXT: ret 35; 36; LA64-LABEL: bare_select_i8: 37; LA64: # %bb.0: 38; LA64-NEXT: andi $a0, $a0, 1 39; LA64-NEXT: masknez $a2, $a2, $a0 40; LA64-NEXT: maskeqz $a0, $a1, $a0 41; LA64-NEXT: or $a0, $a0, $a2 42; LA64-NEXT: ret 43 %res = select i1 %a, i8 %b, i8 %c 44 ret i8 %res 45} 46 47define i16 @bare_select_i16(i1 %a, i16 %b, i16 %c) { 48; LA32-LABEL: bare_select_i16: 49; LA32: # %bb.0: 50; LA32-NEXT: andi $a0, $a0, 1 51; LA32-NEXT: masknez $a2, $a2, $a0 52; LA32-NEXT: maskeqz $a0, $a1, $a0 53; LA32-NEXT: or $a0, $a0, $a2 54; LA32-NEXT: ret 55; 56; LA64-LABEL: bare_select_i16: 57; LA64: # %bb.0: 58; LA64-NEXT: andi $a0, $a0, 1 59; LA64-NEXT: masknez $a2, $a2, $a0 60; LA64-NEXT: maskeqz $a0, $a1, $a0 61; LA64-NEXT: or $a0, $a0, $a2 62; LA64-NEXT: ret 63 %res = select i1 %a, i16 %b, i16 %c 64 ret i16 %res 65} 66 67define i32 @bare_select_i32(i1 %a, i32 %b, i32 %c) { 68; LA32-LABEL: bare_select_i32: 69; LA32: # %bb.0: 70; LA32-NEXT: andi $a0, $a0, 1 71; LA32-NEXT: masknez $a2, $a2, $a0 72; LA32-NEXT: maskeqz $a0, $a1, $a0 73; LA32-NEXT: or $a0, $a0, $a2 74; LA32-NEXT: ret 75; 76; LA64-LABEL: bare_select_i32: 77; LA64: # %bb.0: 78; LA64-NEXT: andi $a0, $a0, 1 79; LA64-NEXT: masknez $a2, $a2, $a0 80; LA64-NEXT: maskeqz $a0, $a1, $a0 81; LA64-NEXT: or $a0, $a0, $a2 82; LA64-NEXT: ret 83 %res = select i1 %a, i32 %b, i32 %c 84 ret i32 %res 85} 86 87define i64 @bare_select_i64(i1 %a, i64 %b, i64 %c) { 88; LA32-LABEL: bare_select_i64: 89; LA32: # %bb.0: 90; LA32-NEXT: andi $a5, $a0, 1 91; LA32-NEXT: masknez $a0, $a3, $a5 92; LA32-NEXT: maskeqz $a1, $a1, $a5 93; LA32-NEXT: or $a0, $a1, $a0 94; LA32-NEXT: masknez $a1, $a4, $a5 95; LA32-NEXT: maskeqz $a2, $a2, $a5 96; LA32-NEXT: or $a1, $a2, $a1 97; LA32-NEXT: ret 98; 99; LA64-LABEL: bare_select_i64: 100; LA64: # %bb.0: 101; LA64-NEXT: andi $a0, $a0, 1 102; LA64-NEXT: masknez $a2, $a2, $a0 103; LA64-NEXT: maskeqz $a0, $a1, $a0 104; LA64-NEXT: or $a0, $a0, $a2 105; LA64-NEXT: ret 106 %res = select i1 %a, i64 %b, i64 %c 107 ret i64 %res 108} 109 110define i16 @bare_select_zero_i16(i1 %a, i16 %b) { 111; LA32-LABEL: bare_select_zero_i16: 112; LA32: # %bb.0: 113; LA32-NEXT: andi $a0, $a0, 1 114; LA32-NEXT: masknez $a0, $a1, $a0 115; LA32-NEXT: ret 116; 117; LA64-LABEL: bare_select_zero_i16: 118; LA64: # %bb.0: 119; LA64-NEXT: andi $a0, $a0, 1 120; LA64-NEXT: masknez $a0, $a1, $a0 121; LA64-NEXT: ret 122 %res = select i1 %a, i16 0, i16 %b 123 ret i16 %res 124} 125 126define i32 @bare_select_zero_i32(i1 %a, i32 %b) { 127; LA32-LABEL: bare_select_zero_i32: 128; LA32: # %bb.0: 129; LA32-NEXT: andi $a0, $a0, 1 130; LA32-NEXT: maskeqz $a0, $a1, $a0 131; LA32-NEXT: ret 132; 133; LA64-LABEL: bare_select_zero_i32: 134; LA64: # %bb.0: 135; LA64-NEXT: andi $a0, $a0, 1 136; LA64-NEXT: maskeqz $a0, $a1, $a0 137; LA64-NEXT: ret 138 %res = select i1 %a, i32 %b, i32 0 139 ret i32 %res 140} 141