1961dd1aeSSimon Pilgrim; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2961dd1aeSSimon Pilgrim; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s | FileCheck -check-prefix=RV32I %s 3961dd1aeSSimon Pilgrim; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s | FileCheck -check-prefix=RV64I %s 4961dd1aeSSimon Pilgrim 5961dd1aeSSimon Pilgrim; 6961dd1aeSSimon Pilgrim; fixed avg(x,y) = add(and(x,y),ashr(xor(x,y),1)) 7961dd1aeSSimon Pilgrim; 8961dd1aeSSimon Pilgrim; ext avg(x,y) = trunc(ashr(add(sext(x),sext(y)),1)) 9961dd1aeSSimon Pilgrim; 10961dd1aeSSimon Pilgrim 11961dd1aeSSimon Pilgrimdefine i8 @test_fixed_i8(i8 %a0, i8 %a1) nounwind { 12961dd1aeSSimon Pilgrim; RV32I-LABEL: test_fixed_i8: 13961dd1aeSSimon Pilgrim; RV32I: # %bb.0: 14961dd1aeSSimon Pilgrim; RV32I-NEXT: slli a1, a1, 24 15961dd1aeSSimon Pilgrim; RV32I-NEXT: slli a0, a0, 24 16*9122c523SPengcheng Wang; RV32I-NEXT: srai a1, a1, 24 17961dd1aeSSimon Pilgrim; RV32I-NEXT: srai a0, a0, 24 18961dd1aeSSimon Pilgrim; RV32I-NEXT: add a0, a0, a1 19961dd1aeSSimon Pilgrim; RV32I-NEXT: srai a0, a0, 1 20961dd1aeSSimon Pilgrim; RV32I-NEXT: ret 21961dd1aeSSimon Pilgrim; 22961dd1aeSSimon Pilgrim; RV64I-LABEL: test_fixed_i8: 23961dd1aeSSimon Pilgrim; RV64I: # %bb.0: 24961dd1aeSSimon Pilgrim; RV64I-NEXT: slli a1, a1, 56 25961dd1aeSSimon Pilgrim; RV64I-NEXT: slli a0, a0, 56 26*9122c523SPengcheng Wang; RV64I-NEXT: srai a1, a1, 56 27961dd1aeSSimon Pilgrim; RV64I-NEXT: srai a0, a0, 56 28961dd1aeSSimon Pilgrim; RV64I-NEXT: add a0, a0, a1 29961dd1aeSSimon Pilgrim; RV64I-NEXT: srai a0, a0, 1 30961dd1aeSSimon Pilgrim; RV64I-NEXT: ret 31961dd1aeSSimon Pilgrim %and = and i8 %a0, %a1 32961dd1aeSSimon Pilgrim %xor = xor i8 %a0, %a1 33961dd1aeSSimon Pilgrim %shift = ashr i8 %xor, 1 34961dd1aeSSimon Pilgrim %res = add i8 %and, %shift 35961dd1aeSSimon Pilgrim ret i8 %res 36961dd1aeSSimon Pilgrim} 37961dd1aeSSimon Pilgrim 38961dd1aeSSimon Pilgrimdefine i8 @test_ext_i8(i8 %a0, i8 %a1) nounwind { 39961dd1aeSSimon Pilgrim; RV32I-LABEL: test_ext_i8: 40961dd1aeSSimon Pilgrim; RV32I: # %bb.0: 41961dd1aeSSimon Pilgrim; RV32I-NEXT: slli a1, a1, 24 42961dd1aeSSimon Pilgrim; RV32I-NEXT: slli a0, a0, 24 43*9122c523SPengcheng Wang; RV32I-NEXT: srai a1, a1, 24 44961dd1aeSSimon Pilgrim; RV32I-NEXT: srai a0, a0, 24 45961dd1aeSSimon Pilgrim; RV32I-NEXT: add a0, a0, a1 46961dd1aeSSimon Pilgrim; RV32I-NEXT: srai a0, a0, 1 47961dd1aeSSimon Pilgrim; RV32I-NEXT: ret 48961dd1aeSSimon Pilgrim; 49961dd1aeSSimon Pilgrim; RV64I-LABEL: test_ext_i8: 50961dd1aeSSimon Pilgrim; RV64I: # %bb.0: 51961dd1aeSSimon Pilgrim; RV64I-NEXT: slli a1, a1, 56 52961dd1aeSSimon Pilgrim; RV64I-NEXT: slli a0, a0, 56 53*9122c523SPengcheng Wang; RV64I-NEXT: srai a1, a1, 56 54961dd1aeSSimon Pilgrim; RV64I-NEXT: srai a0, a0, 56 55961dd1aeSSimon Pilgrim; RV64I-NEXT: add a0, a0, a1 56961dd1aeSSimon Pilgrim; RV64I-NEXT: srai a0, a0, 1 57961dd1aeSSimon Pilgrim; RV64I-NEXT: ret 58961dd1aeSSimon Pilgrim %x0 = sext i8 %a0 to i16 59961dd1aeSSimon Pilgrim %x1 = sext i8 %a1 to i16 60961dd1aeSSimon Pilgrim %sum = add i16 %x0, %x1 61961dd1aeSSimon Pilgrim %shift = ashr i16 %sum, 1 62961dd1aeSSimon Pilgrim %res = trunc i16 %shift to i8 63961dd1aeSSimon Pilgrim ret i8 %res 64961dd1aeSSimon Pilgrim} 65961dd1aeSSimon Pilgrim 66961dd1aeSSimon Pilgrimdefine i16 @test_fixed_i16(i16 %a0, i16 %a1) nounwind { 67961dd1aeSSimon Pilgrim; RV32I-LABEL: test_fixed_i16: 68961dd1aeSSimon Pilgrim; RV32I: # %bb.0: 69961dd1aeSSimon Pilgrim; RV32I-NEXT: slli a1, a1, 16 70961dd1aeSSimon Pilgrim; RV32I-NEXT: slli a0, a0, 16 71*9122c523SPengcheng Wang; RV32I-NEXT: srai a1, a1, 16 72961dd1aeSSimon Pilgrim; RV32I-NEXT: srai a0, a0, 16 73961dd1aeSSimon Pilgrim; RV32I-NEXT: add a0, a0, a1 74961dd1aeSSimon Pilgrim; RV32I-NEXT: srai a0, a0, 1 75961dd1aeSSimon Pilgrim; RV32I-NEXT: ret 76961dd1aeSSimon Pilgrim; 77961dd1aeSSimon Pilgrim; RV64I-LABEL: test_fixed_i16: 78961dd1aeSSimon Pilgrim; RV64I: # %bb.0: 79961dd1aeSSimon Pilgrim; RV64I-NEXT: slli a1, a1, 48 80961dd1aeSSimon Pilgrim; RV64I-NEXT: slli a0, a0, 48 81*9122c523SPengcheng Wang; RV64I-NEXT: srai a1, a1, 48 82961dd1aeSSimon Pilgrim; RV64I-NEXT: srai a0, a0, 48 83961dd1aeSSimon Pilgrim; RV64I-NEXT: add a0, a0, a1 84961dd1aeSSimon Pilgrim; RV64I-NEXT: srai a0, a0, 1 85961dd1aeSSimon Pilgrim; RV64I-NEXT: ret 86961dd1aeSSimon Pilgrim %and = and i16 %a0, %a1 87961dd1aeSSimon Pilgrim %xor = xor i16 %a0, %a1 88961dd1aeSSimon Pilgrim %shift = ashr i16 %xor, 1 89961dd1aeSSimon Pilgrim %res = add i16 %and, %shift 90961dd1aeSSimon Pilgrim ret i16 %res 91961dd1aeSSimon Pilgrim} 92961dd1aeSSimon Pilgrim 93961dd1aeSSimon Pilgrimdefine i16 @test_ext_i16(i16 %a0, i16 %a1) nounwind { 94961dd1aeSSimon Pilgrim; RV32I-LABEL: test_ext_i16: 95961dd1aeSSimon Pilgrim; RV32I: # %bb.0: 96961dd1aeSSimon Pilgrim; RV32I-NEXT: slli a1, a1, 16 97961dd1aeSSimon Pilgrim; RV32I-NEXT: slli a0, a0, 16 98*9122c523SPengcheng Wang; RV32I-NEXT: srai a1, a1, 16 99961dd1aeSSimon Pilgrim; RV32I-NEXT: srai a0, a0, 16 100961dd1aeSSimon Pilgrim; RV32I-NEXT: add a0, a0, a1 101961dd1aeSSimon Pilgrim; RV32I-NEXT: srai a0, a0, 1 102961dd1aeSSimon Pilgrim; RV32I-NEXT: ret 103961dd1aeSSimon Pilgrim; 104961dd1aeSSimon Pilgrim; RV64I-LABEL: test_ext_i16: 105961dd1aeSSimon Pilgrim; RV64I: # %bb.0: 106961dd1aeSSimon Pilgrim; RV64I-NEXT: slli a1, a1, 48 107961dd1aeSSimon Pilgrim; RV64I-NEXT: slli a0, a0, 48 108*9122c523SPengcheng Wang; RV64I-NEXT: srai a1, a1, 48 109961dd1aeSSimon Pilgrim; RV64I-NEXT: srai a0, a0, 48 110961dd1aeSSimon Pilgrim; RV64I-NEXT: add a0, a0, a1 111961dd1aeSSimon Pilgrim; RV64I-NEXT: srai a0, a0, 1 112961dd1aeSSimon Pilgrim; RV64I-NEXT: ret 113961dd1aeSSimon Pilgrim %x0 = sext i16 %a0 to i32 114961dd1aeSSimon Pilgrim %x1 = sext i16 %a1 to i32 115961dd1aeSSimon Pilgrim %sum = add i32 %x0, %x1 116961dd1aeSSimon Pilgrim %shift = ashr i32 %sum, 1 117961dd1aeSSimon Pilgrim %res = trunc i32 %shift to i16 118961dd1aeSSimon Pilgrim ret i16 %res 119961dd1aeSSimon Pilgrim} 120961dd1aeSSimon Pilgrim 121961dd1aeSSimon Pilgrimdefine i32 @test_fixed_i32(i32 %a0, i32 %a1) nounwind { 122961dd1aeSSimon Pilgrim; RV32I-LABEL: test_fixed_i32: 123961dd1aeSSimon Pilgrim; RV32I: # %bb.0: 124961dd1aeSSimon Pilgrim; RV32I-NEXT: and a2, a0, a1 125961dd1aeSSimon Pilgrim; RV32I-NEXT: xor a0, a0, a1 126961dd1aeSSimon Pilgrim; RV32I-NEXT: srai a0, a0, 1 127961dd1aeSSimon Pilgrim; RV32I-NEXT: add a0, a2, a0 128961dd1aeSSimon Pilgrim; RV32I-NEXT: ret 129961dd1aeSSimon Pilgrim; 130961dd1aeSSimon Pilgrim; RV64I-LABEL: test_fixed_i32: 131961dd1aeSSimon Pilgrim; RV64I: # %bb.0: 132961dd1aeSSimon Pilgrim; RV64I-NEXT: sext.w a1, a1 133961dd1aeSSimon Pilgrim; RV64I-NEXT: sext.w a0, a0 134961dd1aeSSimon Pilgrim; RV64I-NEXT: add a0, a0, a1 135961dd1aeSSimon Pilgrim; RV64I-NEXT: srai a0, a0, 1 136961dd1aeSSimon Pilgrim; RV64I-NEXT: ret 137961dd1aeSSimon Pilgrim %and = and i32 %a0, %a1 138961dd1aeSSimon Pilgrim %xor = xor i32 %a1, %a0 139961dd1aeSSimon Pilgrim %shift = ashr i32 %xor, 1 140961dd1aeSSimon Pilgrim %res = add i32 %and, %shift 141961dd1aeSSimon Pilgrim ret i32 %res 142961dd1aeSSimon Pilgrim} 143961dd1aeSSimon Pilgrim 144961dd1aeSSimon Pilgrimdefine i32 @test_ext_i32(i32 %a0, i32 %a1) nounwind { 145961dd1aeSSimon Pilgrim; RV32I-LABEL: test_ext_i32: 146961dd1aeSSimon Pilgrim; RV32I: # %bb.0: 147961dd1aeSSimon Pilgrim; RV32I-NEXT: and a2, a0, a1 148961dd1aeSSimon Pilgrim; RV32I-NEXT: xor a0, a0, a1 149961dd1aeSSimon Pilgrim; RV32I-NEXT: srai a0, a0, 1 150961dd1aeSSimon Pilgrim; RV32I-NEXT: add a0, a2, a0 151961dd1aeSSimon Pilgrim; RV32I-NEXT: ret 152961dd1aeSSimon Pilgrim; 153961dd1aeSSimon Pilgrim; RV64I-LABEL: test_ext_i32: 154961dd1aeSSimon Pilgrim; RV64I: # %bb.0: 155961dd1aeSSimon Pilgrim; RV64I-NEXT: sext.w a1, a1 156961dd1aeSSimon Pilgrim; RV64I-NEXT: sext.w a0, a0 157961dd1aeSSimon Pilgrim; RV64I-NEXT: add a0, a0, a1 158961dd1aeSSimon Pilgrim; RV64I-NEXT: srai a0, a0, 1 159961dd1aeSSimon Pilgrim; RV64I-NEXT: ret 160961dd1aeSSimon Pilgrim %x0 = sext i32 %a0 to i64 161961dd1aeSSimon Pilgrim %x1 = sext i32 %a1 to i64 162961dd1aeSSimon Pilgrim %sum = add i64 %x0, %x1 163961dd1aeSSimon Pilgrim %shift = ashr i64 %sum, 1 164961dd1aeSSimon Pilgrim %res = trunc i64 %shift to i32 165961dd1aeSSimon Pilgrim ret i32 %res 166961dd1aeSSimon Pilgrim} 167961dd1aeSSimon Pilgrim 168961dd1aeSSimon Pilgrimdefine i64 @test_fixed_i64(i64 %a0, i64 %a1) nounwind { 169961dd1aeSSimon Pilgrim; RV32I-LABEL: test_fixed_i64: 170961dd1aeSSimon Pilgrim; RV32I: # %bb.0: 171961dd1aeSSimon Pilgrim; RV32I-NEXT: and a4, a1, a3 172961dd1aeSSimon Pilgrim; RV32I-NEXT: xor a1, a1, a3 173961dd1aeSSimon Pilgrim; RV32I-NEXT: srai a3, a1, 1 174961dd1aeSSimon Pilgrim; RV32I-NEXT: add a3, a4, a3 175961dd1aeSSimon Pilgrim; RV32I-NEXT: xor a4, a0, a2 176*9122c523SPengcheng Wang; RV32I-NEXT: slli a1, a1, 31 177961dd1aeSSimon Pilgrim; RV32I-NEXT: srli a4, a4, 1 178961dd1aeSSimon Pilgrim; RV32I-NEXT: or a1, a4, a1 179961dd1aeSSimon Pilgrim; RV32I-NEXT: and a2, a0, a2 180961dd1aeSSimon Pilgrim; RV32I-NEXT: add a0, a2, a1 181961dd1aeSSimon Pilgrim; RV32I-NEXT: sltu a1, a0, a2 182961dd1aeSSimon Pilgrim; RV32I-NEXT: add a1, a3, a1 183961dd1aeSSimon Pilgrim; RV32I-NEXT: ret 184961dd1aeSSimon Pilgrim; 185961dd1aeSSimon Pilgrim; RV64I-LABEL: test_fixed_i64: 186961dd1aeSSimon Pilgrim; RV64I: # %bb.0: 187961dd1aeSSimon Pilgrim; RV64I-NEXT: and a2, a0, a1 188961dd1aeSSimon Pilgrim; RV64I-NEXT: xor a0, a0, a1 189961dd1aeSSimon Pilgrim; RV64I-NEXT: srai a0, a0, 1 190961dd1aeSSimon Pilgrim; RV64I-NEXT: add a0, a2, a0 191961dd1aeSSimon Pilgrim; RV64I-NEXT: ret 192961dd1aeSSimon Pilgrim %and = and i64 %a0, %a1 193961dd1aeSSimon Pilgrim %xor = xor i64 %a1, %a0 194961dd1aeSSimon Pilgrim %shift = ashr i64 %xor, 1 195961dd1aeSSimon Pilgrim %res = add i64 %and, %shift 196961dd1aeSSimon Pilgrim ret i64 %res 197961dd1aeSSimon Pilgrim} 198961dd1aeSSimon Pilgrim 199961dd1aeSSimon Pilgrimdefine i64 @test_ext_i64(i64 %a0, i64 %a1) nounwind { 200961dd1aeSSimon Pilgrim; RV32I-LABEL: test_ext_i64: 201961dd1aeSSimon Pilgrim; RV32I: # %bb.0: 202961dd1aeSSimon Pilgrim; RV32I-NEXT: and a4, a1, a3 203961dd1aeSSimon Pilgrim; RV32I-NEXT: xor a1, a1, a3 204961dd1aeSSimon Pilgrim; RV32I-NEXT: srai a3, a1, 1 205961dd1aeSSimon Pilgrim; RV32I-NEXT: add a3, a4, a3 206961dd1aeSSimon Pilgrim; RV32I-NEXT: xor a4, a0, a2 207*9122c523SPengcheng Wang; RV32I-NEXT: slli a1, a1, 31 208961dd1aeSSimon Pilgrim; RV32I-NEXT: srli a4, a4, 1 209961dd1aeSSimon Pilgrim; RV32I-NEXT: or a1, a4, a1 210961dd1aeSSimon Pilgrim; RV32I-NEXT: and a2, a0, a2 211961dd1aeSSimon Pilgrim; RV32I-NEXT: add a0, a2, a1 212961dd1aeSSimon Pilgrim; RV32I-NEXT: sltu a1, a0, a2 213961dd1aeSSimon Pilgrim; RV32I-NEXT: add a1, a3, a1 214961dd1aeSSimon Pilgrim; RV32I-NEXT: ret 215961dd1aeSSimon Pilgrim; 216961dd1aeSSimon Pilgrim; RV64I-LABEL: test_ext_i64: 217961dd1aeSSimon Pilgrim; RV64I: # %bb.0: 218961dd1aeSSimon Pilgrim; RV64I-NEXT: and a2, a0, a1 219961dd1aeSSimon Pilgrim; RV64I-NEXT: xor a0, a0, a1 220961dd1aeSSimon Pilgrim; RV64I-NEXT: srai a0, a0, 1 221961dd1aeSSimon Pilgrim; RV64I-NEXT: add a0, a2, a0 222961dd1aeSSimon Pilgrim; RV64I-NEXT: ret 223961dd1aeSSimon Pilgrim %x0 = sext i64 %a0 to i128 224961dd1aeSSimon Pilgrim %x1 = sext i64 %a1 to i128 225961dd1aeSSimon Pilgrim %sum = add i128 %x0, %x1 226961dd1aeSSimon Pilgrim %shift = ashr i128 %sum, 1 227961dd1aeSSimon Pilgrim %res = trunc i128 %shift to i64 228961dd1aeSSimon Pilgrim ret i64 %res 229961dd1aeSSimon Pilgrim} 230