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) = sub(or(x,y),ashr(xor(x,y),1)) 7961dd1aeSSimon Pilgrim; 8961dd1aeSSimon Pilgrim; ext avg(x,y) = trunc(ashr(add(sext(x),sext(y),1),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: addi a0, a0, 1 20961dd1aeSSimon Pilgrim; RV32I-NEXT: srai a0, a0, 1 21961dd1aeSSimon Pilgrim; RV32I-NEXT: ret 22961dd1aeSSimon Pilgrim; 23961dd1aeSSimon Pilgrim; RV64I-LABEL: test_fixed_i8: 24961dd1aeSSimon Pilgrim; RV64I: # %bb.0: 25961dd1aeSSimon Pilgrim; RV64I-NEXT: slli a1, a1, 56 26961dd1aeSSimon Pilgrim; RV64I-NEXT: slli a0, a0, 56 27*9122c523SPengcheng Wang; RV64I-NEXT: srai a1, a1, 56 28961dd1aeSSimon Pilgrim; RV64I-NEXT: srai a0, a0, 56 29961dd1aeSSimon Pilgrim; RV64I-NEXT: add a0, a0, a1 30961dd1aeSSimon Pilgrim; RV64I-NEXT: addi a0, a0, 1 31961dd1aeSSimon Pilgrim; RV64I-NEXT: srai a0, a0, 1 32961dd1aeSSimon Pilgrim; RV64I-NEXT: ret 33961dd1aeSSimon Pilgrim %or = or i8 %a0, %a1 34961dd1aeSSimon Pilgrim %xor = xor i8 %a0, %a1 35961dd1aeSSimon Pilgrim %shift = ashr i8 %xor, 1 36961dd1aeSSimon Pilgrim %res = sub i8 %or, %shift 37961dd1aeSSimon Pilgrim ret i8 %res 38961dd1aeSSimon Pilgrim} 39961dd1aeSSimon Pilgrim 40961dd1aeSSimon Pilgrimdefine i8 @test_ext_i8(i8 %a0, i8 %a1) nounwind { 41961dd1aeSSimon Pilgrim; RV32I-LABEL: test_ext_i8: 42961dd1aeSSimon Pilgrim; RV32I: # %bb.0: 43961dd1aeSSimon Pilgrim; RV32I-NEXT: slli a1, a1, 24 44961dd1aeSSimon Pilgrim; RV32I-NEXT: slli a0, a0, 24 45*9122c523SPengcheng Wang; RV32I-NEXT: srai a1, a1, 24 46961dd1aeSSimon Pilgrim; RV32I-NEXT: srai a0, a0, 24 47961dd1aeSSimon Pilgrim; RV32I-NEXT: add a0, a0, a1 48961dd1aeSSimon Pilgrim; RV32I-NEXT: addi a0, a0, 1 49961dd1aeSSimon Pilgrim; RV32I-NEXT: srai a0, a0, 1 50961dd1aeSSimon Pilgrim; RV32I-NEXT: ret 51961dd1aeSSimon Pilgrim; 52961dd1aeSSimon Pilgrim; RV64I-LABEL: test_ext_i8: 53961dd1aeSSimon Pilgrim; RV64I: # %bb.0: 54961dd1aeSSimon Pilgrim; RV64I-NEXT: slli a1, a1, 56 55961dd1aeSSimon Pilgrim; RV64I-NEXT: slli a0, a0, 56 56*9122c523SPengcheng Wang; RV64I-NEXT: srai a1, a1, 56 57961dd1aeSSimon Pilgrim; RV64I-NEXT: srai a0, a0, 56 58961dd1aeSSimon Pilgrim; RV64I-NEXT: add a0, a0, a1 59961dd1aeSSimon Pilgrim; RV64I-NEXT: addi a0, a0, 1 60961dd1aeSSimon Pilgrim; RV64I-NEXT: srai a0, a0, 1 61961dd1aeSSimon Pilgrim; RV64I-NEXT: ret 62961dd1aeSSimon Pilgrim %x0 = sext i8 %a0 to i16 63961dd1aeSSimon Pilgrim %x1 = sext i8 %a1 to i16 64961dd1aeSSimon Pilgrim %sum = add i16 %x0, %x1 65961dd1aeSSimon Pilgrim %sum1 = add i16 %sum, 1 66961dd1aeSSimon Pilgrim %shift = ashr i16 %sum1, 1 67961dd1aeSSimon Pilgrim %res = trunc i16 %shift to i8 68961dd1aeSSimon Pilgrim ret i8 %res 69961dd1aeSSimon Pilgrim} 70961dd1aeSSimon Pilgrim 71961dd1aeSSimon Pilgrimdefine i16 @test_fixed_i16(i16 %a0, i16 %a1) nounwind { 72961dd1aeSSimon Pilgrim; RV32I-LABEL: test_fixed_i16: 73961dd1aeSSimon Pilgrim; RV32I: # %bb.0: 74961dd1aeSSimon Pilgrim; RV32I-NEXT: slli a1, a1, 16 75961dd1aeSSimon Pilgrim; RV32I-NEXT: slli a0, a0, 16 76*9122c523SPengcheng Wang; RV32I-NEXT: srai a1, a1, 16 77961dd1aeSSimon Pilgrim; RV32I-NEXT: srai a0, a0, 16 78961dd1aeSSimon Pilgrim; RV32I-NEXT: add a0, a0, a1 79961dd1aeSSimon Pilgrim; RV32I-NEXT: addi a0, a0, 1 80961dd1aeSSimon Pilgrim; RV32I-NEXT: srai a0, a0, 1 81961dd1aeSSimon Pilgrim; RV32I-NEXT: ret 82961dd1aeSSimon Pilgrim; 83961dd1aeSSimon Pilgrim; RV64I-LABEL: test_fixed_i16: 84961dd1aeSSimon Pilgrim; RV64I: # %bb.0: 85961dd1aeSSimon Pilgrim; RV64I-NEXT: slli a1, a1, 48 86961dd1aeSSimon Pilgrim; RV64I-NEXT: slli a0, a0, 48 87*9122c523SPengcheng Wang; RV64I-NEXT: srai a1, a1, 48 88961dd1aeSSimon Pilgrim; RV64I-NEXT: srai a0, a0, 48 89961dd1aeSSimon Pilgrim; RV64I-NEXT: add a0, a0, a1 90961dd1aeSSimon Pilgrim; RV64I-NEXT: addi a0, a0, 1 91961dd1aeSSimon Pilgrim; RV64I-NEXT: srai a0, a0, 1 92961dd1aeSSimon Pilgrim; RV64I-NEXT: ret 93961dd1aeSSimon Pilgrim %or = or i16 %a0, %a1 94961dd1aeSSimon Pilgrim %xor = xor i16 %a0, %a1 95961dd1aeSSimon Pilgrim %shift = ashr i16 %xor, 1 96961dd1aeSSimon Pilgrim %res = sub i16 %or, %shift 97961dd1aeSSimon Pilgrim ret i16 %res 98961dd1aeSSimon Pilgrim} 99961dd1aeSSimon Pilgrim 100961dd1aeSSimon Pilgrimdefine i16 @test_ext_i16(i16 %a0, i16 %a1) nounwind { 101961dd1aeSSimon Pilgrim; RV32I-LABEL: test_ext_i16: 102961dd1aeSSimon Pilgrim; RV32I: # %bb.0: 103961dd1aeSSimon Pilgrim; RV32I-NEXT: slli a1, a1, 16 104961dd1aeSSimon Pilgrim; RV32I-NEXT: slli a0, a0, 16 105*9122c523SPengcheng Wang; RV32I-NEXT: srai a1, a1, 16 106961dd1aeSSimon Pilgrim; RV32I-NEXT: srai a0, a0, 16 107961dd1aeSSimon Pilgrim; RV32I-NEXT: add a0, a0, a1 108961dd1aeSSimon Pilgrim; RV32I-NEXT: addi a0, a0, 1 109961dd1aeSSimon Pilgrim; RV32I-NEXT: srai a0, a0, 1 110961dd1aeSSimon Pilgrim; RV32I-NEXT: ret 111961dd1aeSSimon Pilgrim; 112961dd1aeSSimon Pilgrim; RV64I-LABEL: test_ext_i16: 113961dd1aeSSimon Pilgrim; RV64I: # %bb.0: 114961dd1aeSSimon Pilgrim; RV64I-NEXT: slli a1, a1, 48 115961dd1aeSSimon Pilgrim; RV64I-NEXT: slli a0, a0, 48 116*9122c523SPengcheng Wang; RV64I-NEXT: srai a1, a1, 48 117961dd1aeSSimon Pilgrim; RV64I-NEXT: srai a0, a0, 48 118961dd1aeSSimon Pilgrim; RV64I-NEXT: add a0, a0, a1 119961dd1aeSSimon Pilgrim; RV64I-NEXT: addi a0, a0, 1 120961dd1aeSSimon Pilgrim; RV64I-NEXT: srai a0, a0, 1 121961dd1aeSSimon Pilgrim; RV64I-NEXT: ret 122961dd1aeSSimon Pilgrim %x0 = sext i16 %a0 to i32 123961dd1aeSSimon Pilgrim %x1 = sext i16 %a1 to i32 124961dd1aeSSimon Pilgrim %sum = add i32 %x0, %x1 125961dd1aeSSimon Pilgrim %sum1 = add i32 %sum, 1 126961dd1aeSSimon Pilgrim %shift = ashr i32 %sum1, 1 127961dd1aeSSimon Pilgrim %res = trunc i32 %shift to i16 128961dd1aeSSimon Pilgrim ret i16 %res 129961dd1aeSSimon Pilgrim} 130961dd1aeSSimon Pilgrim 131961dd1aeSSimon Pilgrimdefine i32 @test_fixed_i32(i32 %a0, i32 %a1) nounwind { 132961dd1aeSSimon Pilgrim; RV32I-LABEL: test_fixed_i32: 133961dd1aeSSimon Pilgrim; RV32I: # %bb.0: 134961dd1aeSSimon Pilgrim; RV32I-NEXT: or a2, a0, a1 135961dd1aeSSimon Pilgrim; RV32I-NEXT: xor a0, a0, a1 136961dd1aeSSimon Pilgrim; RV32I-NEXT: srai a0, a0, 1 137961dd1aeSSimon Pilgrim; RV32I-NEXT: sub a0, a2, a0 138961dd1aeSSimon Pilgrim; RV32I-NEXT: ret 139961dd1aeSSimon Pilgrim; 140961dd1aeSSimon Pilgrim; RV64I-LABEL: test_fixed_i32: 141961dd1aeSSimon Pilgrim; RV64I: # %bb.0: 142961dd1aeSSimon Pilgrim; RV64I-NEXT: sext.w a1, a1 143961dd1aeSSimon Pilgrim; RV64I-NEXT: sext.w a0, a0 144961dd1aeSSimon Pilgrim; RV64I-NEXT: add a0, a0, a1 145961dd1aeSSimon Pilgrim; RV64I-NEXT: addi a0, a0, 1 146961dd1aeSSimon Pilgrim; RV64I-NEXT: srai a0, a0, 1 147961dd1aeSSimon Pilgrim; RV64I-NEXT: ret 148961dd1aeSSimon Pilgrim %or = or i32 %a0, %a1 149961dd1aeSSimon Pilgrim %xor = xor i32 %a1, %a0 150961dd1aeSSimon Pilgrim %shift = ashr i32 %xor, 1 151961dd1aeSSimon Pilgrim %res = sub i32 %or, %shift 152961dd1aeSSimon Pilgrim ret i32 %res 153961dd1aeSSimon Pilgrim} 154961dd1aeSSimon Pilgrim 155961dd1aeSSimon Pilgrimdefine i32 @test_ext_i32(i32 %a0, i32 %a1) nounwind { 156961dd1aeSSimon Pilgrim; RV32I-LABEL: test_ext_i32: 157961dd1aeSSimon Pilgrim; RV32I: # %bb.0: 158961dd1aeSSimon Pilgrim; RV32I-NEXT: or a2, a0, a1 159961dd1aeSSimon Pilgrim; RV32I-NEXT: xor a0, a0, a1 160961dd1aeSSimon Pilgrim; RV32I-NEXT: srai a0, a0, 1 161961dd1aeSSimon Pilgrim; RV32I-NEXT: sub a0, a2, a0 162961dd1aeSSimon Pilgrim; RV32I-NEXT: ret 163961dd1aeSSimon Pilgrim; 164961dd1aeSSimon Pilgrim; RV64I-LABEL: test_ext_i32: 165961dd1aeSSimon Pilgrim; RV64I: # %bb.0: 166961dd1aeSSimon Pilgrim; RV64I-NEXT: sext.w a1, a1 167961dd1aeSSimon Pilgrim; RV64I-NEXT: sext.w a0, a0 168961dd1aeSSimon Pilgrim; RV64I-NEXT: add a0, a0, a1 169961dd1aeSSimon Pilgrim; RV64I-NEXT: addi a0, a0, 1 170961dd1aeSSimon Pilgrim; RV64I-NEXT: srai a0, a0, 1 171961dd1aeSSimon Pilgrim; RV64I-NEXT: ret 172961dd1aeSSimon Pilgrim %x0 = sext i32 %a0 to i64 173961dd1aeSSimon Pilgrim %x1 = sext i32 %a1 to i64 174961dd1aeSSimon Pilgrim %sum = add i64 %x0, %x1 175961dd1aeSSimon Pilgrim %sum1 = add i64 %sum, 1 176961dd1aeSSimon Pilgrim %shift = ashr i64 %sum1, 1 177961dd1aeSSimon Pilgrim %res = trunc i64 %shift to i32 178961dd1aeSSimon Pilgrim ret i32 %res 179961dd1aeSSimon Pilgrim} 180961dd1aeSSimon Pilgrim 181961dd1aeSSimon Pilgrimdefine i64 @test_fixed_i64(i64 %a0, i64 %a1) nounwind { 182961dd1aeSSimon Pilgrim; RV32I-LABEL: test_fixed_i64: 183961dd1aeSSimon Pilgrim; RV32I: # %bb.0: 184961dd1aeSSimon Pilgrim; RV32I-NEXT: or a4, a1, a3 185961dd1aeSSimon Pilgrim; RV32I-NEXT: xor a1, a1, a3 186961dd1aeSSimon Pilgrim; RV32I-NEXT: xor a3, a0, a2 187961dd1aeSSimon Pilgrim; RV32I-NEXT: or a0, a0, a2 188*9122c523SPengcheng Wang; RV32I-NEXT: srai a2, a1, 1 189*9122c523SPengcheng Wang; RV32I-NEXT: slli a1, a1, 31 190*9122c523SPengcheng Wang; RV32I-NEXT: srli a3, a3, 1 191*9122c523SPengcheng Wang; RV32I-NEXT: sub a4, a4, a2 192*9122c523SPengcheng Wang; RV32I-NEXT: or a3, a3, a1 193961dd1aeSSimon Pilgrim; RV32I-NEXT: sltu a1, a0, a3 194961dd1aeSSimon Pilgrim; RV32I-NEXT: sub a1, a4, a1 195961dd1aeSSimon Pilgrim; RV32I-NEXT: sub a0, a0, a3 196961dd1aeSSimon Pilgrim; RV32I-NEXT: ret 197961dd1aeSSimon Pilgrim; 198961dd1aeSSimon Pilgrim; RV64I-LABEL: test_fixed_i64: 199961dd1aeSSimon Pilgrim; RV64I: # %bb.0: 200961dd1aeSSimon Pilgrim; RV64I-NEXT: or a2, a0, a1 201961dd1aeSSimon Pilgrim; RV64I-NEXT: xor a0, a0, a1 202961dd1aeSSimon Pilgrim; RV64I-NEXT: srai a0, a0, 1 203961dd1aeSSimon Pilgrim; RV64I-NEXT: sub a0, a2, a0 204961dd1aeSSimon Pilgrim; RV64I-NEXT: ret 205961dd1aeSSimon Pilgrim %or = or i64 %a0, %a1 206961dd1aeSSimon Pilgrim %xor = xor i64 %a1, %a0 207961dd1aeSSimon Pilgrim %shift = ashr i64 %xor, 1 208961dd1aeSSimon Pilgrim %res = sub i64 %or, %shift 209961dd1aeSSimon Pilgrim ret i64 %res 210961dd1aeSSimon Pilgrim} 211961dd1aeSSimon Pilgrim 212961dd1aeSSimon Pilgrimdefine i64 @test_ext_i64(i64 %a0, i64 %a1) nounwind { 213961dd1aeSSimon Pilgrim; RV32I-LABEL: test_ext_i64: 214961dd1aeSSimon Pilgrim; RV32I: # %bb.0: 215961dd1aeSSimon Pilgrim; RV32I-NEXT: or a4, a1, a3 216961dd1aeSSimon Pilgrim; RV32I-NEXT: xor a1, a1, a3 217961dd1aeSSimon Pilgrim; RV32I-NEXT: xor a3, a0, a2 218961dd1aeSSimon Pilgrim; RV32I-NEXT: or a0, a0, a2 219*9122c523SPengcheng Wang; RV32I-NEXT: srai a2, a1, 1 220*9122c523SPengcheng Wang; RV32I-NEXT: slli a1, a1, 31 221*9122c523SPengcheng Wang; RV32I-NEXT: srli a3, a3, 1 222*9122c523SPengcheng Wang; RV32I-NEXT: sub a4, a4, a2 223*9122c523SPengcheng Wang; RV32I-NEXT: or a3, a3, a1 224961dd1aeSSimon Pilgrim; RV32I-NEXT: sltu a1, a0, a3 225961dd1aeSSimon Pilgrim; RV32I-NEXT: sub a1, a4, a1 226961dd1aeSSimon Pilgrim; RV32I-NEXT: sub a0, a0, a3 227961dd1aeSSimon Pilgrim; RV32I-NEXT: ret 228961dd1aeSSimon Pilgrim; 229961dd1aeSSimon Pilgrim; RV64I-LABEL: test_ext_i64: 230961dd1aeSSimon Pilgrim; RV64I: # %bb.0: 231961dd1aeSSimon Pilgrim; RV64I-NEXT: or a2, a0, a1 232961dd1aeSSimon Pilgrim; RV64I-NEXT: xor a0, a0, a1 233961dd1aeSSimon Pilgrim; RV64I-NEXT: srai a0, a0, 1 234961dd1aeSSimon Pilgrim; RV64I-NEXT: sub a0, a2, a0 235961dd1aeSSimon Pilgrim; RV64I-NEXT: ret 236961dd1aeSSimon Pilgrim %x0 = sext i64 %a0 to i128 237961dd1aeSSimon Pilgrim %x1 = sext i64 %a1 to i128 238961dd1aeSSimon Pilgrim %sum = add i128 %x0, %x1 239961dd1aeSSimon Pilgrim %sum1 = add i128 %sum, 1 240961dd1aeSSimon Pilgrim %shift = ashr i128 %sum1, 1 241961dd1aeSSimon Pilgrim %res = trunc i128 %shift to i64 242961dd1aeSSimon Pilgrim ret i64 %res 243961dd1aeSSimon Pilgrim} 244