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),lshr(xor(x,y),1)) 7961dd1aeSSimon Pilgrim; 8961dd1aeSSimon Pilgrim; ext avg(x,y) = trunc(lshr(add(zext(x),zext(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: andi a1, a1, 255 15961dd1aeSSimon Pilgrim; RV32I-NEXT: andi a0, a0, 255 16961dd1aeSSimon Pilgrim; RV32I-NEXT: add a0, a0, a1 17961dd1aeSSimon Pilgrim; RV32I-NEXT: srli a0, a0, 1 18961dd1aeSSimon Pilgrim; RV32I-NEXT: ret 19961dd1aeSSimon Pilgrim; 20961dd1aeSSimon Pilgrim; RV64I-LABEL: test_fixed_i8: 21961dd1aeSSimon Pilgrim; RV64I: # %bb.0: 22961dd1aeSSimon Pilgrim; RV64I-NEXT: andi a1, a1, 255 23961dd1aeSSimon Pilgrim; RV64I-NEXT: andi a0, a0, 255 24961dd1aeSSimon Pilgrim; RV64I-NEXT: add a0, a0, a1 25961dd1aeSSimon Pilgrim; RV64I-NEXT: srli a0, a0, 1 26961dd1aeSSimon Pilgrim; RV64I-NEXT: ret 27961dd1aeSSimon Pilgrim %and = and i8 %a0, %a1 28961dd1aeSSimon Pilgrim %xor = xor i8 %a0, %a1 29961dd1aeSSimon Pilgrim %shift = lshr i8 %xor, 1 30961dd1aeSSimon Pilgrim %res = add i8 %and, %shift 31961dd1aeSSimon Pilgrim ret i8 %res 32961dd1aeSSimon Pilgrim} 33961dd1aeSSimon Pilgrim 34961dd1aeSSimon Pilgrimdefine i8 @test_ext_i8(i8 %a0, i8 %a1) nounwind { 35961dd1aeSSimon Pilgrim; RV32I-LABEL: test_ext_i8: 36961dd1aeSSimon Pilgrim; RV32I: # %bb.0: 37961dd1aeSSimon Pilgrim; RV32I-NEXT: andi a1, a1, 255 38961dd1aeSSimon Pilgrim; RV32I-NEXT: andi a0, a0, 255 39961dd1aeSSimon Pilgrim; RV32I-NEXT: add a0, a0, a1 40961dd1aeSSimon Pilgrim; RV32I-NEXT: srli a0, a0, 1 41961dd1aeSSimon Pilgrim; RV32I-NEXT: ret 42961dd1aeSSimon Pilgrim; 43961dd1aeSSimon Pilgrim; RV64I-LABEL: test_ext_i8: 44961dd1aeSSimon Pilgrim; RV64I: # %bb.0: 45961dd1aeSSimon Pilgrim; RV64I-NEXT: andi a1, a1, 255 46961dd1aeSSimon Pilgrim; RV64I-NEXT: andi a0, a0, 255 47961dd1aeSSimon Pilgrim; RV64I-NEXT: add a0, a0, a1 48961dd1aeSSimon Pilgrim; RV64I-NEXT: srli a0, a0, 1 49961dd1aeSSimon Pilgrim; RV64I-NEXT: ret 50961dd1aeSSimon Pilgrim %x0 = zext i8 %a0 to i16 51961dd1aeSSimon Pilgrim %x1 = zext i8 %a1 to i16 52961dd1aeSSimon Pilgrim %sum = add i16 %x0, %x1 53961dd1aeSSimon Pilgrim %shift = lshr i16 %sum, 1 54961dd1aeSSimon Pilgrim %res = trunc i16 %shift to i8 55961dd1aeSSimon Pilgrim ret i8 %res 56961dd1aeSSimon Pilgrim} 57961dd1aeSSimon Pilgrim 58961dd1aeSSimon Pilgrimdefine i16 @test_fixed_i16(i16 %a0, i16 %a1) nounwind { 59961dd1aeSSimon Pilgrim; RV32I-LABEL: test_fixed_i16: 60961dd1aeSSimon Pilgrim; RV32I: # %bb.0: 61961dd1aeSSimon Pilgrim; RV32I-NEXT: lui a2, 16 62961dd1aeSSimon Pilgrim; RV32I-NEXT: addi a2, a2, -1 63961dd1aeSSimon Pilgrim; RV32I-NEXT: and a1, a1, a2 64961dd1aeSSimon Pilgrim; RV32I-NEXT: and a0, a0, a2 65961dd1aeSSimon Pilgrim; RV32I-NEXT: add a0, a0, a1 66961dd1aeSSimon Pilgrim; RV32I-NEXT: srli a0, a0, 1 67961dd1aeSSimon Pilgrim; RV32I-NEXT: ret 68961dd1aeSSimon Pilgrim; 69961dd1aeSSimon Pilgrim; RV64I-LABEL: test_fixed_i16: 70961dd1aeSSimon Pilgrim; RV64I: # %bb.0: 71961dd1aeSSimon Pilgrim; RV64I-NEXT: lui a2, 16 72961dd1aeSSimon Pilgrim; RV64I-NEXT: addiw a2, a2, -1 73961dd1aeSSimon Pilgrim; RV64I-NEXT: and a1, a1, a2 74961dd1aeSSimon Pilgrim; RV64I-NEXT: and a0, a0, a2 75961dd1aeSSimon Pilgrim; RV64I-NEXT: add a0, a0, a1 76961dd1aeSSimon Pilgrim; RV64I-NEXT: srli a0, a0, 1 77961dd1aeSSimon Pilgrim; RV64I-NEXT: ret 78961dd1aeSSimon Pilgrim %and = and i16 %a0, %a1 79961dd1aeSSimon Pilgrim %xor = xor i16 %a0, %a1 80961dd1aeSSimon Pilgrim %shift = lshr i16 %xor, 1 81961dd1aeSSimon Pilgrim %res = add i16 %and, %shift 82961dd1aeSSimon Pilgrim ret i16 %res 83961dd1aeSSimon Pilgrim} 84961dd1aeSSimon Pilgrim 85961dd1aeSSimon Pilgrimdefine i16 @test_ext_i16(i16 %a0, i16 %a1) nounwind { 86961dd1aeSSimon Pilgrim; RV32I-LABEL: test_ext_i16: 87961dd1aeSSimon Pilgrim; RV32I: # %bb.0: 88961dd1aeSSimon Pilgrim; RV32I-NEXT: lui a2, 16 89961dd1aeSSimon Pilgrim; RV32I-NEXT: addi a2, a2, -1 90961dd1aeSSimon Pilgrim; RV32I-NEXT: and a1, a1, a2 91961dd1aeSSimon Pilgrim; RV32I-NEXT: and a0, a0, a2 92961dd1aeSSimon Pilgrim; RV32I-NEXT: add a0, a0, a1 93961dd1aeSSimon Pilgrim; RV32I-NEXT: srli a0, a0, 1 94961dd1aeSSimon Pilgrim; RV32I-NEXT: ret 95961dd1aeSSimon Pilgrim; 96961dd1aeSSimon Pilgrim; RV64I-LABEL: test_ext_i16: 97961dd1aeSSimon Pilgrim; RV64I: # %bb.0: 98961dd1aeSSimon Pilgrim; RV64I-NEXT: lui a2, 16 99961dd1aeSSimon Pilgrim; RV64I-NEXT: addiw a2, a2, -1 100961dd1aeSSimon Pilgrim; RV64I-NEXT: and a1, a1, a2 101961dd1aeSSimon Pilgrim; RV64I-NEXT: and a0, a0, a2 102961dd1aeSSimon Pilgrim; RV64I-NEXT: add a0, a0, a1 103961dd1aeSSimon Pilgrim; RV64I-NEXT: srli a0, a0, 1 104961dd1aeSSimon Pilgrim; RV64I-NEXT: ret 105961dd1aeSSimon Pilgrim %x0 = zext i16 %a0 to i32 106961dd1aeSSimon Pilgrim %x1 = zext i16 %a1 to i32 107961dd1aeSSimon Pilgrim %sum = add i32 %x0, %x1 108961dd1aeSSimon Pilgrim %shift = lshr i32 %sum, 1 109961dd1aeSSimon Pilgrim %res = trunc i32 %shift to i16 110961dd1aeSSimon Pilgrim ret i16 %res 111961dd1aeSSimon Pilgrim} 112961dd1aeSSimon Pilgrim 113961dd1aeSSimon Pilgrimdefine i32 @test_fixed_i32(i32 %a0, i32 %a1) nounwind { 114961dd1aeSSimon Pilgrim; RV32I-LABEL: test_fixed_i32: 115961dd1aeSSimon Pilgrim; RV32I: # %bb.0: 116961dd1aeSSimon Pilgrim; RV32I-NEXT: and a2, a0, a1 117961dd1aeSSimon Pilgrim; RV32I-NEXT: xor a0, a0, a1 118961dd1aeSSimon Pilgrim; RV32I-NEXT: srli a0, a0, 1 119961dd1aeSSimon Pilgrim; RV32I-NEXT: add a0, a2, a0 120961dd1aeSSimon Pilgrim; RV32I-NEXT: ret 121961dd1aeSSimon Pilgrim; 122961dd1aeSSimon Pilgrim; RV64I-LABEL: test_fixed_i32: 123961dd1aeSSimon Pilgrim; RV64I: # %bb.0: 124961dd1aeSSimon Pilgrim; RV64I-NEXT: slli a1, a1, 32 125961dd1aeSSimon Pilgrim; RV64I-NEXT: slli a0, a0, 32 126*9122c523SPengcheng Wang; RV64I-NEXT: srli a1, a1, 32 127961dd1aeSSimon Pilgrim; RV64I-NEXT: srli a0, a0, 32 128961dd1aeSSimon Pilgrim; RV64I-NEXT: add a0, a0, a1 129961dd1aeSSimon Pilgrim; RV64I-NEXT: srli a0, a0, 1 130961dd1aeSSimon Pilgrim; RV64I-NEXT: ret 131961dd1aeSSimon Pilgrim %and = and i32 %a0, %a1 132961dd1aeSSimon Pilgrim %xor = xor i32 %a1, %a0 133961dd1aeSSimon Pilgrim %shift = lshr i32 %xor, 1 134961dd1aeSSimon Pilgrim %res = add i32 %and, %shift 135961dd1aeSSimon Pilgrim ret i32 %res 136961dd1aeSSimon Pilgrim} 137961dd1aeSSimon Pilgrim 138961dd1aeSSimon Pilgrimdefine i32 @test_ext_i32(i32 %a0, i32 %a1) nounwind { 139961dd1aeSSimon Pilgrim; RV32I-LABEL: test_ext_i32: 140961dd1aeSSimon Pilgrim; RV32I: # %bb.0: 141961dd1aeSSimon Pilgrim; RV32I-NEXT: and a2, a0, a1 142961dd1aeSSimon Pilgrim; RV32I-NEXT: xor a0, a0, a1 143961dd1aeSSimon Pilgrim; RV32I-NEXT: srli a0, a0, 1 144961dd1aeSSimon Pilgrim; RV32I-NEXT: add a0, a2, a0 145961dd1aeSSimon Pilgrim; RV32I-NEXT: ret 146961dd1aeSSimon Pilgrim; 147961dd1aeSSimon Pilgrim; RV64I-LABEL: test_ext_i32: 148961dd1aeSSimon Pilgrim; RV64I: # %bb.0: 149961dd1aeSSimon Pilgrim; RV64I-NEXT: slli a1, a1, 32 150961dd1aeSSimon Pilgrim; RV64I-NEXT: slli a0, a0, 32 151*9122c523SPengcheng Wang; RV64I-NEXT: srli a1, a1, 32 152961dd1aeSSimon Pilgrim; RV64I-NEXT: srli a0, a0, 32 153961dd1aeSSimon Pilgrim; RV64I-NEXT: add a0, a0, a1 154961dd1aeSSimon Pilgrim; RV64I-NEXT: srli a0, a0, 1 155961dd1aeSSimon Pilgrim; RV64I-NEXT: ret 156961dd1aeSSimon Pilgrim %x0 = zext i32 %a0 to i64 157961dd1aeSSimon Pilgrim %x1 = zext i32 %a1 to i64 158961dd1aeSSimon Pilgrim %sum = add i64 %x0, %x1 159961dd1aeSSimon Pilgrim %shift = lshr i64 %sum, 1 160961dd1aeSSimon Pilgrim %res = trunc i64 %shift to i32 161961dd1aeSSimon Pilgrim ret i32 %res 162961dd1aeSSimon Pilgrim} 163961dd1aeSSimon Pilgrim 164961dd1aeSSimon Pilgrimdefine i64 @test_fixed_i64(i64 %a0, i64 %a1) nounwind { 165961dd1aeSSimon Pilgrim; RV32I-LABEL: test_fixed_i64: 166961dd1aeSSimon Pilgrim; RV32I: # %bb.0: 167*9122c523SPengcheng Wang; RV32I-NEXT: add a1, a3, a1 1687231776aSJulius Alexandre; RV32I-NEXT: add a0, a2, a0 169*9122c523SPengcheng Wang; RV32I-NEXT: sltu a2, a0, a2 170*9122c523SPengcheng Wang; RV32I-NEXT: add a1, a1, a2 171*9122c523SPengcheng Wang; RV32I-NEXT: beq a1, a3, .LBB6_2 1727231776aSJulius Alexandre; RV32I-NEXT: # %bb.1: 173*9122c523SPengcheng Wang; RV32I-NEXT: sltu a2, a1, a3 1747231776aSJulius Alexandre; RV32I-NEXT: .LBB6_2: 1757231776aSJulius Alexandre; RV32I-NEXT: slli a2, a2, 31 176*9122c523SPengcheng Wang; RV32I-NEXT: srli a3, a1, 1 177*9122c523SPengcheng Wang; RV32I-NEXT: slli a4, a1, 31 1787231776aSJulius Alexandre; RV32I-NEXT: srli a0, a0, 1 179*9122c523SPengcheng Wang; RV32I-NEXT: or a1, a3, a2 180*9122c523SPengcheng Wang; RV32I-NEXT: or a0, a0, a4 181961dd1aeSSimon Pilgrim; RV32I-NEXT: ret 182961dd1aeSSimon Pilgrim; 183961dd1aeSSimon Pilgrim; RV64I-LABEL: test_fixed_i64: 184961dd1aeSSimon Pilgrim; RV64I: # %bb.0: 185961dd1aeSSimon Pilgrim; RV64I-NEXT: and a2, a0, a1 186961dd1aeSSimon Pilgrim; RV64I-NEXT: xor a0, a0, a1 187961dd1aeSSimon Pilgrim; RV64I-NEXT: srli a0, a0, 1 188961dd1aeSSimon Pilgrim; RV64I-NEXT: add a0, a2, a0 189961dd1aeSSimon Pilgrim; RV64I-NEXT: ret 190961dd1aeSSimon Pilgrim %and = and i64 %a0, %a1 191961dd1aeSSimon Pilgrim %xor = xor i64 %a1, %a0 192961dd1aeSSimon Pilgrim %shift = lshr i64 %xor, 1 193961dd1aeSSimon Pilgrim %res = add i64 %and, %shift 194961dd1aeSSimon Pilgrim ret i64 %res 195961dd1aeSSimon Pilgrim} 196961dd1aeSSimon Pilgrim 197961dd1aeSSimon Pilgrimdefine i64 @test_ext_i64(i64 %a0, i64 %a1) nounwind { 198961dd1aeSSimon Pilgrim; RV32I-LABEL: test_ext_i64: 199961dd1aeSSimon Pilgrim; RV32I: # %bb.0: 200*9122c523SPengcheng Wang; RV32I-NEXT: add a1, a3, a1 2017231776aSJulius Alexandre; RV32I-NEXT: add a0, a2, a0 202*9122c523SPengcheng Wang; RV32I-NEXT: sltu a2, a0, a2 203*9122c523SPengcheng Wang; RV32I-NEXT: add a1, a1, a2 204*9122c523SPengcheng Wang; RV32I-NEXT: beq a1, a3, .LBB7_2 2057231776aSJulius Alexandre; RV32I-NEXT: # %bb.1: 206*9122c523SPengcheng Wang; RV32I-NEXT: sltu a2, a1, a3 2077231776aSJulius Alexandre; RV32I-NEXT: .LBB7_2: 2087231776aSJulius Alexandre; RV32I-NEXT: slli a2, a2, 31 209*9122c523SPengcheng Wang; RV32I-NEXT: srli a3, a1, 1 210*9122c523SPengcheng Wang; RV32I-NEXT: slli a4, a1, 31 2117231776aSJulius Alexandre; RV32I-NEXT: srli a0, a0, 1 212*9122c523SPengcheng Wang; RV32I-NEXT: or a1, a3, a2 213*9122c523SPengcheng Wang; RV32I-NEXT: or a0, a0, a4 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: srli a0, a0, 1 221961dd1aeSSimon Pilgrim; RV64I-NEXT: add a0, a2, a0 222961dd1aeSSimon Pilgrim; RV64I-NEXT: ret 223961dd1aeSSimon Pilgrim %x0 = zext i64 %a0 to i128 224961dd1aeSSimon Pilgrim %x1 = zext i64 %a1 to i128 225961dd1aeSSimon Pilgrim %sum = add i128 %x0, %x1 226961dd1aeSSimon Pilgrim %shift = lshr i128 %sum, 1 227961dd1aeSSimon Pilgrim %res = trunc i128 %shift to i64 228961dd1aeSSimon Pilgrim ret i64 %res 229961dd1aeSSimon Pilgrim} 230