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),lshr(xor(x,y),1)) 7961dd1aeSSimon Pilgrim; 8961dd1aeSSimon Pilgrim; ext avg(x,y) = trunc(lshr(add(zext(x),zext(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: andi a1, a1, 255 15961dd1aeSSimon Pilgrim; RV32I-NEXT: andi a0, a0, 255 16961dd1aeSSimon Pilgrim; RV32I-NEXT: add a0, a0, a1 17961dd1aeSSimon Pilgrim; RV32I-NEXT: addi a0, a0, 1 18961dd1aeSSimon Pilgrim; RV32I-NEXT: srli a0, a0, 1 19961dd1aeSSimon Pilgrim; RV32I-NEXT: ret 20961dd1aeSSimon Pilgrim; 21961dd1aeSSimon Pilgrim; RV64I-LABEL: test_fixed_i8: 22961dd1aeSSimon Pilgrim; RV64I: # %bb.0: 23961dd1aeSSimon Pilgrim; RV64I-NEXT: andi a1, a1, 255 24961dd1aeSSimon Pilgrim; RV64I-NEXT: andi a0, a0, 255 25961dd1aeSSimon Pilgrim; RV64I-NEXT: add a0, a0, a1 26961dd1aeSSimon Pilgrim; RV64I-NEXT: addi a0, a0, 1 27961dd1aeSSimon Pilgrim; RV64I-NEXT: srli a0, a0, 1 28961dd1aeSSimon Pilgrim; RV64I-NEXT: ret 29961dd1aeSSimon Pilgrim %or = or i8 %a0, %a1 30961dd1aeSSimon Pilgrim %xor = xor i8 %a0, %a1 31961dd1aeSSimon Pilgrim %shift = lshr i8 %xor, 1 32961dd1aeSSimon Pilgrim %res = sub i8 %or, %shift 33961dd1aeSSimon Pilgrim ret i8 %res 34961dd1aeSSimon Pilgrim} 35961dd1aeSSimon Pilgrim 36961dd1aeSSimon Pilgrimdefine i8 @test_ext_i8(i8 %a0, i8 %a1) nounwind { 37961dd1aeSSimon Pilgrim; RV32I-LABEL: test_ext_i8: 38961dd1aeSSimon Pilgrim; RV32I: # %bb.0: 39961dd1aeSSimon Pilgrim; RV32I-NEXT: andi a1, a1, 255 40961dd1aeSSimon Pilgrim; RV32I-NEXT: andi a0, a0, 255 41961dd1aeSSimon Pilgrim; RV32I-NEXT: add a0, a0, a1 42961dd1aeSSimon Pilgrim; RV32I-NEXT: addi a0, a0, 1 43961dd1aeSSimon Pilgrim; RV32I-NEXT: srli a0, a0, 1 44961dd1aeSSimon Pilgrim; RV32I-NEXT: ret 45961dd1aeSSimon Pilgrim; 46961dd1aeSSimon Pilgrim; RV64I-LABEL: test_ext_i8: 47961dd1aeSSimon Pilgrim; RV64I: # %bb.0: 48961dd1aeSSimon Pilgrim; RV64I-NEXT: andi a1, a1, 255 49961dd1aeSSimon Pilgrim; RV64I-NEXT: andi a0, a0, 255 50961dd1aeSSimon Pilgrim; RV64I-NEXT: add a0, a0, a1 51961dd1aeSSimon Pilgrim; RV64I-NEXT: addi a0, a0, 1 52961dd1aeSSimon Pilgrim; RV64I-NEXT: srli a0, a0, 1 53961dd1aeSSimon Pilgrim; RV64I-NEXT: ret 54961dd1aeSSimon Pilgrim %x0 = zext i8 %a0 to i16 55961dd1aeSSimon Pilgrim %x1 = zext i8 %a1 to i16 56961dd1aeSSimon Pilgrim %sum = add i16 %x0, %x1 57961dd1aeSSimon Pilgrim %sum1 = add i16 %sum, 1 58961dd1aeSSimon Pilgrim %shift = lshr i16 %sum1, 1 59961dd1aeSSimon Pilgrim %res = trunc i16 %shift to i8 60961dd1aeSSimon Pilgrim ret i8 %res 61961dd1aeSSimon Pilgrim} 62961dd1aeSSimon Pilgrim 63961dd1aeSSimon Pilgrimdefine i16 @test_fixed_i16(i16 %a0, i16 %a1) nounwind { 64961dd1aeSSimon Pilgrim; RV32I-LABEL: test_fixed_i16: 65961dd1aeSSimon Pilgrim; RV32I: # %bb.0: 66961dd1aeSSimon Pilgrim; RV32I-NEXT: lui a2, 16 67961dd1aeSSimon Pilgrim; RV32I-NEXT: addi a2, a2, -1 68961dd1aeSSimon Pilgrim; RV32I-NEXT: and a1, a1, a2 69961dd1aeSSimon Pilgrim; RV32I-NEXT: and a0, a0, a2 70961dd1aeSSimon Pilgrim; RV32I-NEXT: add a0, a0, a1 71961dd1aeSSimon Pilgrim; RV32I-NEXT: addi a0, a0, 1 72961dd1aeSSimon Pilgrim; RV32I-NEXT: srli a0, a0, 1 73961dd1aeSSimon Pilgrim; RV32I-NEXT: ret 74961dd1aeSSimon Pilgrim; 75961dd1aeSSimon Pilgrim; RV64I-LABEL: test_fixed_i16: 76961dd1aeSSimon Pilgrim; RV64I: # %bb.0: 77961dd1aeSSimon Pilgrim; RV64I-NEXT: lui a2, 16 78961dd1aeSSimon Pilgrim; RV64I-NEXT: addiw a2, a2, -1 79961dd1aeSSimon Pilgrim; RV64I-NEXT: and a1, a1, a2 80961dd1aeSSimon Pilgrim; RV64I-NEXT: and a0, a0, a2 81961dd1aeSSimon Pilgrim; RV64I-NEXT: add a0, a0, a1 82961dd1aeSSimon Pilgrim; RV64I-NEXT: addi a0, a0, 1 83961dd1aeSSimon Pilgrim; RV64I-NEXT: srli a0, a0, 1 84961dd1aeSSimon Pilgrim; RV64I-NEXT: ret 85961dd1aeSSimon Pilgrim %or = or i16 %a0, %a1 86961dd1aeSSimon Pilgrim %xor = xor i16 %a0, %a1 87961dd1aeSSimon Pilgrim %shift = lshr i16 %xor, 1 88961dd1aeSSimon Pilgrim %res = sub i16 %or, %shift 89961dd1aeSSimon Pilgrim ret i16 %res 90961dd1aeSSimon Pilgrim} 91961dd1aeSSimon Pilgrim 92961dd1aeSSimon Pilgrimdefine i16 @test_ext_i16(i16 %a0, i16 %a1) nounwind { 93961dd1aeSSimon Pilgrim; RV32I-LABEL: test_ext_i16: 94961dd1aeSSimon Pilgrim; RV32I: # %bb.0: 95961dd1aeSSimon Pilgrim; RV32I-NEXT: lui a2, 16 96961dd1aeSSimon Pilgrim; RV32I-NEXT: addi a2, a2, -1 97961dd1aeSSimon Pilgrim; RV32I-NEXT: and a1, a1, a2 98961dd1aeSSimon Pilgrim; RV32I-NEXT: and a0, a0, a2 99961dd1aeSSimon Pilgrim; RV32I-NEXT: add a0, a0, a1 100961dd1aeSSimon Pilgrim; RV32I-NEXT: addi a0, a0, 1 101961dd1aeSSimon Pilgrim; RV32I-NEXT: srli 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: lui a2, 16 107961dd1aeSSimon Pilgrim; RV64I-NEXT: addiw a2, a2, -1 108961dd1aeSSimon Pilgrim; RV64I-NEXT: and a1, a1, a2 109961dd1aeSSimon Pilgrim; RV64I-NEXT: and a0, a0, a2 110961dd1aeSSimon Pilgrim; RV64I-NEXT: add a0, a0, a1 111961dd1aeSSimon Pilgrim; RV64I-NEXT: addi a0, a0, 1 112961dd1aeSSimon Pilgrim; RV64I-NEXT: srli a0, a0, 1 113961dd1aeSSimon Pilgrim; RV64I-NEXT: ret 114961dd1aeSSimon Pilgrim %x0 = zext i16 %a0 to i32 115961dd1aeSSimon Pilgrim %x1 = zext i16 %a1 to i32 116961dd1aeSSimon Pilgrim %sum = add i32 %x0, %x1 117961dd1aeSSimon Pilgrim %sum1 = add i32 %sum, 1 118961dd1aeSSimon Pilgrim %shift = lshr i32 %sum1, 1 119961dd1aeSSimon Pilgrim %res = trunc i32 %shift to i16 120961dd1aeSSimon Pilgrim ret i16 %res 121961dd1aeSSimon Pilgrim} 122961dd1aeSSimon Pilgrim 123961dd1aeSSimon Pilgrimdefine i32 @test_fixed_i32(i32 %a0, i32 %a1) nounwind { 124961dd1aeSSimon Pilgrim; RV32I-LABEL: test_fixed_i32: 125961dd1aeSSimon Pilgrim; RV32I: # %bb.0: 126961dd1aeSSimon Pilgrim; RV32I-NEXT: or a2, a0, a1 127961dd1aeSSimon Pilgrim; RV32I-NEXT: xor a0, a0, a1 128961dd1aeSSimon Pilgrim; RV32I-NEXT: srli a0, a0, 1 129961dd1aeSSimon Pilgrim; RV32I-NEXT: sub a0, a2, a0 130961dd1aeSSimon Pilgrim; RV32I-NEXT: ret 131961dd1aeSSimon Pilgrim; 132961dd1aeSSimon Pilgrim; RV64I-LABEL: test_fixed_i32: 133961dd1aeSSimon Pilgrim; RV64I: # %bb.0: 134961dd1aeSSimon Pilgrim; RV64I-NEXT: slli a1, a1, 32 135961dd1aeSSimon Pilgrim; RV64I-NEXT: slli a0, a0, 32 136*9122c523SPengcheng Wang; RV64I-NEXT: srli a1, a1, 32 137961dd1aeSSimon Pilgrim; RV64I-NEXT: srli a0, a0, 32 138961dd1aeSSimon Pilgrim; RV64I-NEXT: add a0, a0, a1 139961dd1aeSSimon Pilgrim; RV64I-NEXT: addi a0, a0, 1 140961dd1aeSSimon Pilgrim; RV64I-NEXT: srli a0, a0, 1 141961dd1aeSSimon Pilgrim; RV64I-NEXT: ret 142961dd1aeSSimon Pilgrim %or = or i32 %a0, %a1 143961dd1aeSSimon Pilgrim %xor = xor i32 %a1, %a0 144961dd1aeSSimon Pilgrim %shift = lshr i32 %xor, 1 145961dd1aeSSimon Pilgrim %res = sub i32 %or, %shift 146961dd1aeSSimon Pilgrim ret i32 %res 147961dd1aeSSimon Pilgrim} 148961dd1aeSSimon Pilgrim 149961dd1aeSSimon Pilgrimdefine i32 @test_ext_i32(i32 %a0, i32 %a1) nounwind { 150961dd1aeSSimon Pilgrim; RV32I-LABEL: test_ext_i32: 151961dd1aeSSimon Pilgrim; RV32I: # %bb.0: 152961dd1aeSSimon Pilgrim; RV32I-NEXT: or a2, a0, a1 153961dd1aeSSimon Pilgrim; RV32I-NEXT: xor a0, a0, a1 154961dd1aeSSimon Pilgrim; RV32I-NEXT: srli a0, a0, 1 155961dd1aeSSimon Pilgrim; RV32I-NEXT: sub a0, a2, a0 156961dd1aeSSimon Pilgrim; RV32I-NEXT: ret 157961dd1aeSSimon Pilgrim; 158961dd1aeSSimon Pilgrim; RV64I-LABEL: test_ext_i32: 159961dd1aeSSimon Pilgrim; RV64I: # %bb.0: 160961dd1aeSSimon Pilgrim; RV64I-NEXT: slli a1, a1, 32 161961dd1aeSSimon Pilgrim; RV64I-NEXT: slli a0, a0, 32 162*9122c523SPengcheng Wang; RV64I-NEXT: srli a1, a1, 32 163961dd1aeSSimon Pilgrim; RV64I-NEXT: srli a0, a0, 32 164961dd1aeSSimon Pilgrim; RV64I-NEXT: add a0, a0, a1 165961dd1aeSSimon Pilgrim; RV64I-NEXT: addi a0, a0, 1 166961dd1aeSSimon Pilgrim; RV64I-NEXT: srli a0, a0, 1 167961dd1aeSSimon Pilgrim; RV64I-NEXT: ret 168961dd1aeSSimon Pilgrim %x0 = zext i32 %a0 to i64 169961dd1aeSSimon Pilgrim %x1 = zext i32 %a1 to i64 170961dd1aeSSimon Pilgrim %sum = add i64 %x0, %x1 171961dd1aeSSimon Pilgrim %sum1 = add i64 %sum, 1 172961dd1aeSSimon Pilgrim %shift = lshr i64 %sum1, 1 173961dd1aeSSimon Pilgrim %res = trunc i64 %shift to i32 174961dd1aeSSimon Pilgrim ret i32 %res 175961dd1aeSSimon Pilgrim} 176961dd1aeSSimon Pilgrim 177961dd1aeSSimon Pilgrimdefine i64 @test_fixed_i64(i64 %a0, i64 %a1) nounwind { 178961dd1aeSSimon Pilgrim; RV32I-LABEL: test_fixed_i64: 179961dd1aeSSimon Pilgrim; RV32I: # %bb.0: 180961dd1aeSSimon Pilgrim; RV32I-NEXT: or a4, a1, a3 181961dd1aeSSimon Pilgrim; RV32I-NEXT: xor a1, a1, a3 182961dd1aeSSimon Pilgrim; RV32I-NEXT: xor a3, a0, a2 183961dd1aeSSimon Pilgrim; RV32I-NEXT: or a0, a0, a2 184*9122c523SPengcheng Wang; RV32I-NEXT: srli a2, a1, 1 185*9122c523SPengcheng Wang; RV32I-NEXT: slli a1, a1, 31 186*9122c523SPengcheng Wang; RV32I-NEXT: srli a3, a3, 1 187*9122c523SPengcheng Wang; RV32I-NEXT: sub a4, a4, a2 188*9122c523SPengcheng Wang; RV32I-NEXT: or a3, a3, a1 189961dd1aeSSimon Pilgrim; RV32I-NEXT: sltu a1, a0, a3 190961dd1aeSSimon Pilgrim; RV32I-NEXT: sub a1, a4, a1 191961dd1aeSSimon Pilgrim; RV32I-NEXT: sub a0, a0, a3 192961dd1aeSSimon Pilgrim; RV32I-NEXT: ret 193961dd1aeSSimon Pilgrim; 194961dd1aeSSimon Pilgrim; RV64I-LABEL: test_fixed_i64: 195961dd1aeSSimon Pilgrim; RV64I: # %bb.0: 196961dd1aeSSimon Pilgrim; RV64I-NEXT: or a2, a0, a1 197961dd1aeSSimon Pilgrim; RV64I-NEXT: xor a0, a0, a1 198961dd1aeSSimon Pilgrim; RV64I-NEXT: srli a0, a0, 1 199961dd1aeSSimon Pilgrim; RV64I-NEXT: sub a0, a2, a0 200961dd1aeSSimon Pilgrim; RV64I-NEXT: ret 201961dd1aeSSimon Pilgrim %or = or i64 %a0, %a1 202961dd1aeSSimon Pilgrim %xor = xor i64 %a1, %a0 203961dd1aeSSimon Pilgrim %shift = lshr i64 %xor, 1 204961dd1aeSSimon Pilgrim %res = sub i64 %or, %shift 205961dd1aeSSimon Pilgrim ret i64 %res 206961dd1aeSSimon Pilgrim} 207961dd1aeSSimon Pilgrim 208961dd1aeSSimon Pilgrimdefine i64 @test_ext_i64(i64 %a0, i64 %a1) nounwind { 209961dd1aeSSimon Pilgrim; RV32I-LABEL: test_ext_i64: 210961dd1aeSSimon Pilgrim; RV32I: # %bb.0: 211961dd1aeSSimon Pilgrim; RV32I-NEXT: or a4, a1, a3 212961dd1aeSSimon Pilgrim; RV32I-NEXT: xor a1, a1, a3 213961dd1aeSSimon Pilgrim; RV32I-NEXT: xor a3, a0, a2 214961dd1aeSSimon Pilgrim; RV32I-NEXT: or a0, a0, a2 215*9122c523SPengcheng Wang; RV32I-NEXT: srli a2, a1, 1 216*9122c523SPengcheng Wang; RV32I-NEXT: slli a1, a1, 31 217*9122c523SPengcheng Wang; RV32I-NEXT: srli a3, a3, 1 218*9122c523SPengcheng Wang; RV32I-NEXT: sub a4, a4, a2 219*9122c523SPengcheng Wang; RV32I-NEXT: or a3, a3, a1 220961dd1aeSSimon Pilgrim; RV32I-NEXT: sltu a1, a0, a3 221961dd1aeSSimon Pilgrim; RV32I-NEXT: sub a1, a4, a1 222961dd1aeSSimon Pilgrim; RV32I-NEXT: sub a0, a0, a3 223961dd1aeSSimon Pilgrim; RV32I-NEXT: ret 224961dd1aeSSimon Pilgrim; 225961dd1aeSSimon Pilgrim; RV64I-LABEL: test_ext_i64: 226961dd1aeSSimon Pilgrim; RV64I: # %bb.0: 227961dd1aeSSimon Pilgrim; RV64I-NEXT: or a2, a0, a1 228961dd1aeSSimon Pilgrim; RV64I-NEXT: xor a0, a0, a1 229961dd1aeSSimon Pilgrim; RV64I-NEXT: srli a0, a0, 1 230961dd1aeSSimon Pilgrim; RV64I-NEXT: sub a0, a2, a0 231961dd1aeSSimon Pilgrim; RV64I-NEXT: ret 232961dd1aeSSimon Pilgrim %x0 = zext i64 %a0 to i128 233961dd1aeSSimon Pilgrim %x1 = zext i64 %a1 to i128 234961dd1aeSSimon Pilgrim %sum = add i128 %x0, %x1 235961dd1aeSSimon Pilgrim %sum1 = add i128 %sum, 1 236961dd1aeSSimon Pilgrim %shift = lshr i128 %sum1, 1 237961dd1aeSSimon Pilgrim %res = trunc i128 %shift to i64 238961dd1aeSSimon Pilgrim ret i64 %res 239961dd1aeSSimon Pilgrim} 240