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 5define i8 @nor_i8(i8 %a, i8 %b) nounwind { 6; LA32-LABEL: nor_i8: 7; LA32: # %bb.0: 8; LA32-NEXT: nor $a0, $a0, $a1 9; LA32-NEXT: ret 10; 11; LA64-LABEL: nor_i8: 12; LA64: # %bb.0: 13; LA64-NEXT: nor $a0, $a0, $a1 14; LA64-NEXT: ret 15 %or = or i8 %a, %b 16 %neg = xor i8 %or, -1 17 ret i8 %neg 18} 19 20define i16 @nor_i16(i16 %a, i16 %b) nounwind { 21; LA32-LABEL: nor_i16: 22; LA32: # %bb.0: 23; LA32-NEXT: nor $a0, $a0, $a1 24; LA32-NEXT: ret 25; 26; LA64-LABEL: nor_i16: 27; LA64: # %bb.0: 28; LA64-NEXT: nor $a0, $a0, $a1 29; LA64-NEXT: ret 30 %or = or i16 %a, %b 31 %neg = xor i16 %or, -1 32 ret i16 %neg 33} 34 35define i32 @nor_i32(i32 %a, i32 %b) nounwind { 36; LA32-LABEL: nor_i32: 37; LA32: # %bb.0: 38; LA32-NEXT: nor $a0, $a0, $a1 39; LA32-NEXT: ret 40; 41; LA64-LABEL: nor_i32: 42; LA64: # %bb.0: 43; LA64-NEXT: nor $a0, $a0, $a1 44; LA64-NEXT: ret 45 %or = or i32 %a, %b 46 %neg = xor i32 %or, -1 47 ret i32 %neg 48} 49 50define i64 @nor_i64(i64 %a, i64 %b) nounwind { 51; LA32-LABEL: nor_i64: 52; LA32: # %bb.0: 53; LA32-NEXT: nor $a0, $a0, $a2 54; LA32-NEXT: nor $a1, $a1, $a3 55; LA32-NEXT: ret 56; 57; LA64-LABEL: nor_i64: 58; LA64: # %bb.0: 59; LA64-NEXT: nor $a0, $a0, $a1 60; LA64-NEXT: ret 61 %or = or i64 %a, %b 62 %neg = xor i64 %or, -1 63 ret i64 %neg 64} 65 66define i8 @nor_zero_i8(i8 %a) nounwind { 67; LA32-LABEL: nor_zero_i8: 68; LA32: # %bb.0: 69; LA32-NEXT: nor $a0, $a0, $zero 70; LA32-NEXT: ret 71; 72; LA64-LABEL: nor_zero_i8: 73; LA64: # %bb.0: 74; LA64-NEXT: nor $a0, $a0, $zero 75; LA64-NEXT: ret 76 %neg = xor i8 %a, -1 77 ret i8 %neg 78} 79 80define i16 @nor_zero_i16(i16 %a) nounwind { 81; LA32-LABEL: nor_zero_i16: 82; LA32: # %bb.0: 83; LA32-NEXT: nor $a0, $a0, $zero 84; LA32-NEXT: ret 85; 86; LA64-LABEL: nor_zero_i16: 87; LA64: # %bb.0: 88; LA64-NEXT: nor $a0, $a0, $zero 89; LA64-NEXT: ret 90 %neg = xor i16 %a, -1 91 ret i16 %neg 92} 93 94define i32 @nor_zero_i32(i32 %a) nounwind { 95; LA32-LABEL: nor_zero_i32: 96; LA32: # %bb.0: 97; LA32-NEXT: nor $a0, $a0, $zero 98; LA32-NEXT: ret 99; 100; LA64-LABEL: nor_zero_i32: 101; LA64: # %bb.0: 102; LA64-NEXT: nor $a0, $a0, $zero 103; LA64-NEXT: ret 104 %neg = xor i32 %a, -1 105 ret i32 %neg 106} 107 108define i64 @nor_zero_i64(i64 %a) nounwind { 109; LA32-LABEL: nor_zero_i64: 110; LA32: # %bb.0: 111; LA32-NEXT: nor $a0, $a0, $zero 112; LA32-NEXT: nor $a1, $a1, $zero 113; LA32-NEXT: ret 114; 115; LA64-LABEL: nor_zero_i64: 116; LA64: # %bb.0: 117; LA64-NEXT: nor $a0, $a0, $zero 118; LA64-NEXT: ret 119 %neg = xor i64 %a, -1 120 ret i64 %neg 121} 122 123define i8 @orn_i8(i8 %a, i8 %b) nounwind { 124; LA32-LABEL: orn_i8: 125; LA32: # %bb.0: 126; LA32-NEXT: orn $a0, $a0, $a1 127; LA32-NEXT: ret 128; 129; LA64-LABEL: orn_i8: 130; LA64: # %bb.0: 131; LA64-NEXT: orn $a0, $a0, $a1 132; LA64-NEXT: ret 133 %neg = xor i8 %b, -1 134 %or = or i8 %neg, %a 135 ret i8 %or 136} 137 138define i16 @orn_i16(i16 %a, i16 %b) nounwind { 139; LA32-LABEL: orn_i16: 140; LA32: # %bb.0: 141; LA32-NEXT: orn $a0, $a0, $a1 142; LA32-NEXT: ret 143; 144; LA64-LABEL: orn_i16: 145; LA64: # %bb.0: 146; LA64-NEXT: orn $a0, $a0, $a1 147; LA64-NEXT: ret 148 %neg = xor i16 %b, -1 149 %or = or i16 %neg, %a 150 ret i16 %or 151} 152 153define i32 @orn_i32(i32 %a, i32 %b) nounwind { 154; LA32-LABEL: orn_i32: 155; LA32: # %bb.0: 156; LA32-NEXT: orn $a0, $a0, $a1 157; LA32-NEXT: ret 158; 159; LA64-LABEL: orn_i32: 160; LA64: # %bb.0: 161; LA64-NEXT: orn $a0, $a0, $a1 162; LA64-NEXT: ret 163 %neg = xor i32 %b, -1 164 %or = or i32 %neg, %a 165 ret i32 %or 166} 167 168define i64 @orn_i64(i64 %a, i64 %b) nounwind { 169; LA32-LABEL: orn_i64: 170; LA32: # %bb.0: 171; LA32-NEXT: orn $a0, $a0, $a2 172; LA32-NEXT: orn $a1, $a1, $a3 173; LA32-NEXT: ret 174; 175; LA64-LABEL: orn_i64: 176; LA64: # %bb.0: 177; LA64-NEXT: orn $a0, $a0, $a1 178; LA64-NEXT: ret 179 %neg = xor i64 %b, -1 180 %or = or i64 %neg, %a 181 ret i64 %or 182} 183 184define i8 @andn_i8(i8 %a, i8 %b) nounwind { 185; LA32-LABEL: andn_i8: 186; LA32: # %bb.0: 187; LA32-NEXT: andn $a0, $a0, $a1 188; LA32-NEXT: ret 189; 190; LA64-LABEL: andn_i8: 191; LA64: # %bb.0: 192; LA64-NEXT: andn $a0, $a0, $a1 193; LA64-NEXT: ret 194 %neg = xor i8 %b, -1 195 %and = and i8 %neg, %a 196 ret i8 %and 197} 198 199define i16 @andn_i16(i16 %a, i16 %b) nounwind { 200; LA32-LABEL: andn_i16: 201; LA32: # %bb.0: 202; LA32-NEXT: andn $a0, $a0, $a1 203; LA32-NEXT: ret 204; 205; LA64-LABEL: andn_i16: 206; LA64: # %bb.0: 207; LA64-NEXT: andn $a0, $a0, $a1 208; LA64-NEXT: ret 209 %neg = xor i16 %b, -1 210 %and = and i16 %neg, %a 211 ret i16 %and 212} 213 214define i32 @andn_i32(i32 %a, i32 %b) nounwind { 215; LA32-LABEL: andn_i32: 216; LA32: # %bb.0: 217; LA32-NEXT: andn $a0, $a0, $a1 218; LA32-NEXT: ret 219; 220; LA64-LABEL: andn_i32: 221; LA64: # %bb.0: 222; LA64-NEXT: andn $a0, $a0, $a1 223; LA64-NEXT: ret 224 %neg = xor i32 %b, -1 225 %and = and i32 %neg, %a 226 ret i32 %and 227} 228 229define i64 @andn_i64(i64 %a, i64 %b) nounwind { 230; LA32-LABEL: andn_i64: 231; LA32: # %bb.0: 232; LA32-NEXT: andn $a0, $a0, $a2 233; LA32-NEXT: andn $a1, $a1, $a3 234; LA32-NEXT: ret 235; 236; LA64-LABEL: andn_i64: 237; LA64: # %bb.0: 238; LA64-NEXT: andn $a0, $a0, $a1 239; LA64-NEXT: ret 240 %neg = xor i64 %b, -1 241 %and = and i64 %neg, %a 242 ret i64 %and 243} 244