| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | 
 | ; RUN: llc -mtriple=aarch64-unknown-linux-gnu < %s | FileCheck %s | 
 |  | 
 | ; These test cases are inspired by C++2a std::midpoint(). | 
 | ; See https://bugs.llvm.org/show_bug.cgi?id=40965 | 
 |  | 
 | ; ---------------------------------------------------------------------------- ; | 
 | ; 32-bit width | 
 | ; ---------------------------------------------------------------------------- ; | 
 |  | 
 | ; Values come from regs | 
 |  | 
 | define i32 @scalar_i32_signed_reg_reg(i32 %a1, i32 %a2) nounwind { | 
 | ; CHECK-LABEL: scalar_i32_signed_reg_reg: | 
 | ; CHECK:       // %bb.0: | 
 | ; CHECK-NEXT:    sub w9, w1, w0 | 
 | ; CHECK-NEXT:    subs w10, w0, w1 | 
 | ; CHECK-NEXT:    mov w8, #-1 // =0xffffffff | 
 | ; CHECK-NEXT:    csel w9, w10, w9, gt | 
 | ; CHECK-NEXT:    cneg w8, w8, le | 
 | ; CHECK-NEXT:    lsr w9, w9, #1 | 
 | ; CHECK-NEXT:    madd w0, w9, w8, w0 | 
 | ; CHECK-NEXT:    ret | 
 |   %t3 = icmp sgt i32 %a1, %a2 ; signed | 
 |   %t4 = select i1 %t3, i32 -1, i32 1 | 
 |   %t5 = select i1 %t3, i32 %a2, i32 %a1 | 
 |   %t6 = select i1 %t3, i32 %a1, i32 %a2 | 
 |   %t7 = sub i32 %t6, %t5 | 
 |   %t8 = lshr i32 %t7, 1 | 
 |   %t9 = mul nsw i32 %t8, %t4 ; signed | 
 |   %a10 = add nsw i32 %t9, %a1 ; signed | 
 |   ret i32 %a10 | 
 | } | 
 |  | 
 | define i32 @scalar_i32_unsigned_reg_reg(i32 %a1, i32 %a2) nounwind { | 
 | ; CHECK-LABEL: scalar_i32_unsigned_reg_reg: | 
 | ; CHECK:       // %bb.0: | 
 | ; CHECK-NEXT:    sub w9, w1, w0 | 
 | ; CHECK-NEXT:    subs w10, w0, w1 | 
 | ; CHECK-NEXT:    mov w8, #-1 // =0xffffffff | 
 | ; CHECK-NEXT:    csel w9, w10, w9, hi | 
 | ; CHECK-NEXT:    cneg w8, w8, ls | 
 | ; CHECK-NEXT:    lsr w9, w9, #1 | 
 | ; CHECK-NEXT:    madd w0, w9, w8, w0 | 
 | ; CHECK-NEXT:    ret | 
 |   %t3 = icmp ugt i32 %a1, %a2 | 
 |   %t4 = select i1 %t3, i32 -1, i32 1 | 
 |   %t5 = select i1 %t3, i32 %a2, i32 %a1 | 
 |   %t6 = select i1 %t3, i32 %a1, i32 %a2 | 
 |   %t7 = sub i32 %t6, %t5 | 
 |   %t8 = lshr i32 %t7, 1 | 
 |   %t9 = mul i32 %t8, %t4 | 
 |   %a10 = add i32 %t9, %a1 | 
 |   ret i32 %a10 | 
 | } | 
 |  | 
 | ; Values are loaded. Only check signed case. | 
 |  | 
 | define i32 @scalar_i32_signed_mem_reg(ptr %a1_addr, i32 %a2) nounwind { | 
 | ; CHECK-LABEL: scalar_i32_signed_mem_reg: | 
 | ; CHECK:       // %bb.0: | 
 | ; CHECK-NEXT:    ldr w9, [x0] | 
 | ; CHECK-NEXT:    mov w8, #-1 // =0xffffffff | 
 | ; CHECK-NEXT:    cmp w9, w1 | 
 | ; CHECK-NEXT:    sub w10, w1, w9 | 
 | ; CHECK-NEXT:    cneg w8, w8, le | 
 | ; CHECK-NEXT:    subs w11, w9, w1 | 
 | ; CHECK-NEXT:    csel w10, w11, w10, gt | 
 | ; CHECK-NEXT:    lsr w10, w10, #1 | 
 | ; CHECK-NEXT:    madd w0, w10, w8, w9 | 
 | ; CHECK-NEXT:    ret | 
 |   %a1 = load i32, ptr %a1_addr | 
 |   %t3 = icmp sgt i32 %a1, %a2 ; signed | 
 |   %t4 = select i1 %t3, i32 -1, i32 1 | 
 |   %t5 = select i1 %t3, i32 %a2, i32 %a1 | 
 |   %t6 = select i1 %t3, i32 %a1, i32 %a2 | 
 |   %t7 = sub i32 %t6, %t5 | 
 |   %t8 = lshr i32 %t7, 1 | 
 |   %t9 = mul nsw i32 %t8, %t4 ; signed | 
 |   %a10 = add nsw i32 %t9, %a1 ; signed | 
 |   ret i32 %a10 | 
 | } | 
 |  | 
 | define i32 @scalar_i32_signed_reg_mem(i32 %a1, ptr %a2_addr) nounwind { | 
 | ; CHECK-LABEL: scalar_i32_signed_reg_mem: | 
 | ; CHECK:       // %bb.0: | 
 | ; CHECK-NEXT:    ldr w9, [x1] | 
 | ; CHECK-NEXT:    mov w8, #-1 // =0xffffffff | 
 | ; CHECK-NEXT:    cmp w0, w9 | 
 | ; CHECK-NEXT:    sub w10, w9, w0 | 
 | ; CHECK-NEXT:    cneg w8, w8, le | 
 | ; CHECK-NEXT:    subs w9, w0, w9 | 
 | ; CHECK-NEXT:    csel w9, w9, w10, gt | 
 | ; CHECK-NEXT:    lsr w9, w9, #1 | 
 | ; CHECK-NEXT:    madd w0, w9, w8, w0 | 
 | ; CHECK-NEXT:    ret | 
 |   %a2 = load i32, ptr %a2_addr | 
 |   %t3 = icmp sgt i32 %a1, %a2 ; signed | 
 |   %t4 = select i1 %t3, i32 -1, i32 1 | 
 |   %t5 = select i1 %t3, i32 %a2, i32 %a1 | 
 |   %t6 = select i1 %t3, i32 %a1, i32 %a2 | 
 |   %t7 = sub i32 %t6, %t5 | 
 |   %t8 = lshr i32 %t7, 1 | 
 |   %t9 = mul nsw i32 %t8, %t4 ; signed | 
 |   %a10 = add nsw i32 %t9, %a1 ; signed | 
 |   ret i32 %a10 | 
 | } | 
 |  | 
 | define i32 @scalar_i32_signed_mem_mem(ptr %a1_addr, ptr %a2_addr) nounwind { | 
 | ; CHECK-LABEL: scalar_i32_signed_mem_mem: | 
 | ; CHECK:       // %bb.0: | 
 | ; CHECK-NEXT:    ldr w9, [x0] | 
 | ; CHECK-NEXT:    ldr w10, [x1] | 
 | ; CHECK-NEXT:    mov w8, #-1 // =0xffffffff | 
 | ; CHECK-NEXT:    cmp w9, w10 | 
 | ; CHECK-NEXT:    sub w11, w10, w9 | 
 | ; CHECK-NEXT:    cneg w8, w8, le | 
 | ; CHECK-NEXT:    subs w10, w9, w10 | 
 | ; CHECK-NEXT:    csel w10, w10, w11, gt | 
 | ; CHECK-NEXT:    lsr w10, w10, #1 | 
 | ; CHECK-NEXT:    madd w0, w10, w8, w9 | 
 | ; CHECK-NEXT:    ret | 
 |   %a1 = load i32, ptr %a1_addr | 
 |   %a2 = load i32, ptr %a2_addr | 
 |   %t3 = icmp sgt i32 %a1, %a2 ; signed | 
 |   %t4 = select i1 %t3, i32 -1, i32 1 | 
 |   %t5 = select i1 %t3, i32 %a2, i32 %a1 | 
 |   %t6 = select i1 %t3, i32 %a1, i32 %a2 | 
 |   %t7 = sub i32 %t6, %t5 | 
 |   %t8 = lshr i32 %t7, 1 | 
 |   %t9 = mul nsw i32 %t8, %t4 ; signed | 
 |   %a10 = add nsw i32 %t9, %a1 ; signed | 
 |   ret i32 %a10 | 
 | } | 
 |  | 
 | ; ---------------------------------------------------------------------------- ; | 
 | ; 64-bit width | 
 | ; ---------------------------------------------------------------------------- ; | 
 |  | 
 | ; Values come from regs | 
 |  | 
 | define i64 @scalar_i64_signed_reg_reg(i64 %a1, i64 %a2) nounwind { | 
 | ; CHECK-LABEL: scalar_i64_signed_reg_reg: | 
 | ; CHECK:       // %bb.0: | 
 | ; CHECK-NEXT:    sub x9, x1, x0 | 
 | ; CHECK-NEXT:    subs x10, x0, x1 | 
 | ; CHECK-NEXT:    mov x8, #-1 // =0xffffffffffffffff | 
 | ; CHECK-NEXT:    csel x9, x10, x9, gt | 
 | ; CHECK-NEXT:    cneg x8, x8, le | 
 | ; CHECK-NEXT:    lsr x9, x9, #1 | 
 | ; CHECK-NEXT:    madd x0, x9, x8, x0 | 
 | ; CHECK-NEXT:    ret | 
 |   %t3 = icmp sgt i64 %a1, %a2 ; signed | 
 |   %t4 = select i1 %t3, i64 -1, i64 1 | 
 |   %t5 = select i1 %t3, i64 %a2, i64 %a1 | 
 |   %t6 = select i1 %t3, i64 %a1, i64 %a2 | 
 |   %t7 = sub i64 %t6, %t5 | 
 |   %t8 = lshr i64 %t7, 1 | 
 |   %t9 = mul nsw i64 %t8, %t4 ; signed | 
 |   %a10 = add nsw i64 %t9, %a1 ; signed | 
 |   ret i64 %a10 | 
 | } | 
 |  | 
 | define i64 @scalar_i64_unsigned_reg_reg(i64 %a1, i64 %a2) nounwind { | 
 | ; CHECK-LABEL: scalar_i64_unsigned_reg_reg: | 
 | ; CHECK:       // %bb.0: | 
 | ; CHECK-NEXT:    sub x9, x1, x0 | 
 | ; CHECK-NEXT:    subs x10, x0, x1 | 
 | ; CHECK-NEXT:    mov x8, #-1 // =0xffffffffffffffff | 
 | ; CHECK-NEXT:    csel x9, x10, x9, hi | 
 | ; CHECK-NEXT:    cneg x8, x8, ls | 
 | ; CHECK-NEXT:    lsr x9, x9, #1 | 
 | ; CHECK-NEXT:    madd x0, x9, x8, x0 | 
 | ; CHECK-NEXT:    ret | 
 |   %t3 = icmp ugt i64 %a1, %a2 | 
 |   %t4 = select i1 %t3, i64 -1, i64 1 | 
 |   %t5 = select i1 %t3, i64 %a2, i64 %a1 | 
 |   %t6 = select i1 %t3, i64 %a1, i64 %a2 | 
 |   %t7 = sub i64 %t6, %t5 | 
 |   %t8 = lshr i64 %t7, 1 | 
 |   %t9 = mul i64 %t8, %t4 | 
 |   %a10 = add i64 %t9, %a1 | 
 |   ret i64 %a10 | 
 | } | 
 |  | 
 | ; Values are loaded. Only check signed case. | 
 |  | 
 | define i64 @scalar_i64_signed_mem_reg(ptr %a1_addr, i64 %a2) nounwind { | 
 | ; CHECK-LABEL: scalar_i64_signed_mem_reg: | 
 | ; CHECK:       // %bb.0: | 
 | ; CHECK-NEXT:    ldr x9, [x0] | 
 | ; CHECK-NEXT:    mov x8, #-1 // =0xffffffffffffffff | 
 | ; CHECK-NEXT:    cmp x9, x1 | 
 | ; CHECK-NEXT:    sub x10, x1, x9 | 
 | ; CHECK-NEXT:    cneg x8, x8, le | 
 | ; CHECK-NEXT:    subs x11, x9, x1 | 
 | ; CHECK-NEXT:    csel x10, x11, x10, gt | 
 | ; CHECK-NEXT:    lsr x10, x10, #1 | 
 | ; CHECK-NEXT:    madd x0, x10, x8, x9 | 
 | ; CHECK-NEXT:    ret | 
 |   %a1 = load i64, ptr %a1_addr | 
 |   %t3 = icmp sgt i64 %a1, %a2 ; signed | 
 |   %t4 = select i1 %t3, i64 -1, i64 1 | 
 |   %t5 = select i1 %t3, i64 %a2, i64 %a1 | 
 |   %t6 = select i1 %t3, i64 %a1, i64 %a2 | 
 |   %t7 = sub i64 %t6, %t5 | 
 |   %t8 = lshr i64 %t7, 1 | 
 |   %t9 = mul nsw i64 %t8, %t4 ; signed | 
 |   %a10 = add nsw i64 %t9, %a1 ; signed | 
 |   ret i64 %a10 | 
 | } | 
 |  | 
 | define i64 @scalar_i64_signed_reg_mem(i64 %a1, ptr %a2_addr) nounwind { | 
 | ; CHECK-LABEL: scalar_i64_signed_reg_mem: | 
 | ; CHECK:       // %bb.0: | 
 | ; CHECK-NEXT:    ldr x9, [x1] | 
 | ; CHECK-NEXT:    mov x8, #-1 // =0xffffffffffffffff | 
 | ; CHECK-NEXT:    cmp x0, x9 | 
 | ; CHECK-NEXT:    sub x10, x9, x0 | 
 | ; CHECK-NEXT:    cneg x8, x8, le | 
 | ; CHECK-NEXT:    subs x9, x0, x9 | 
 | ; CHECK-NEXT:    csel x9, x9, x10, gt | 
 | ; CHECK-NEXT:    lsr x9, x9, #1 | 
 | ; CHECK-NEXT:    madd x0, x9, x8, x0 | 
 | ; CHECK-NEXT:    ret | 
 |   %a2 = load i64, ptr %a2_addr | 
 |   %t3 = icmp sgt i64 %a1, %a2 ; signed | 
 |   %t4 = select i1 %t3, i64 -1, i64 1 | 
 |   %t5 = select i1 %t3, i64 %a2, i64 %a1 | 
 |   %t6 = select i1 %t3, i64 %a1, i64 %a2 | 
 |   %t7 = sub i64 %t6, %t5 | 
 |   %t8 = lshr i64 %t7, 1 | 
 |   %t9 = mul nsw i64 %t8, %t4 ; signed | 
 |   %a10 = add nsw i64 %t9, %a1 ; signed | 
 |   ret i64 %a10 | 
 | } | 
 |  | 
 | define i64 @scalar_i64_signed_mem_mem(ptr %a1_addr, ptr %a2_addr) nounwind { | 
 | ; CHECK-LABEL: scalar_i64_signed_mem_mem: | 
 | ; CHECK:       // %bb.0: | 
 | ; CHECK-NEXT:    ldr x9, [x0] | 
 | ; CHECK-NEXT:    ldr x10, [x1] | 
 | ; CHECK-NEXT:    mov x8, #-1 // =0xffffffffffffffff | 
 | ; CHECK-NEXT:    cmp x9, x10 | 
 | ; CHECK-NEXT:    sub x11, x10, x9 | 
 | ; CHECK-NEXT:    cneg x8, x8, le | 
 | ; CHECK-NEXT:    subs x10, x9, x10 | 
 | ; CHECK-NEXT:    csel x10, x10, x11, gt | 
 | ; CHECK-NEXT:    lsr x10, x10, #1 | 
 | ; CHECK-NEXT:    madd x0, x10, x8, x9 | 
 | ; CHECK-NEXT:    ret | 
 |   %a1 = load i64, ptr %a1_addr | 
 |   %a2 = load i64, ptr %a2_addr | 
 |   %t3 = icmp sgt i64 %a1, %a2 ; signed | 
 |   %t4 = select i1 %t3, i64 -1, i64 1 | 
 |   %t5 = select i1 %t3, i64 %a2, i64 %a1 | 
 |   %t6 = select i1 %t3, i64 %a1, i64 %a2 | 
 |   %t7 = sub i64 %t6, %t5 | 
 |   %t8 = lshr i64 %t7, 1 | 
 |   %t9 = mul nsw i64 %t8, %t4 ; signed | 
 |   %a10 = add nsw i64 %t9, %a1 ; signed | 
 |   ret i64 %a10 | 
 | } | 
 |  | 
 | ; ---------------------------------------------------------------------------- ; | 
 | ; 16-bit width | 
 | ; ---------------------------------------------------------------------------- ; | 
 |  | 
 | ; Values come from regs | 
 |  | 
 | define i16 @scalar_i16_signed_reg_reg(i16 %a1, i16 %a2) nounwind { | 
 | ; CHECK-LABEL: scalar_i16_signed_reg_reg: | 
 | ; CHECK:       // %bb.0: | 
 | ; CHECK-NEXT:    sxth w9, w1 | 
 | ; CHECK-NEXT:    sxth w10, w0 | 
 | ; CHECK-NEXT:    mov w8, #-1 // =0xffffffff | 
 | ; CHECK-NEXT:    subs w9, w10, w9 | 
 | ; CHECK-NEXT:    cneg w9, w9, mi | 
 | ; CHECK-NEXT:    cneg w8, w8, le | 
 | ; CHECK-NEXT:    lsr w9, w9, #1 | 
 | ; CHECK-NEXT:    madd w0, w9, w8, w0 | 
 | ; CHECK-NEXT:    ret | 
 |   %t3 = icmp sgt i16 %a1, %a2 ; signed | 
 |   %t4 = select i1 %t3, i16 -1, i16 1 | 
 |   %t5 = select i1 %t3, i16 %a2, i16 %a1 | 
 |   %t6 = select i1 %t3, i16 %a1, i16 %a2 | 
 |   %t7 = sub i16 %t6, %t5 | 
 |   %t8 = lshr i16 %t7, 1 | 
 |   %t9 = mul nsw i16 %t8, %t4 ; signed | 
 |   %a10 = add nsw i16 %t9, %a1 ; signed | 
 |   ret i16 %a10 | 
 | } | 
 |  | 
 | define i16 @scalar_i16_unsigned_reg_reg(i16 %a1, i16 %a2) nounwind { | 
 | ; CHECK-LABEL: scalar_i16_unsigned_reg_reg: | 
 | ; CHECK:       // %bb.0: | 
 | ; CHECK-NEXT:    and w9, w1, #0xffff | 
 | ; CHECK-NEXT:    and w10, w0, #0xffff | 
 | ; CHECK-NEXT:    mov w8, #-1 // =0xffffffff | 
 | ; CHECK-NEXT:    subs w9, w10, w9 | 
 | ; CHECK-NEXT:    cneg w9, w9, mi | 
 | ; CHECK-NEXT:    cneg w8, w8, ls | 
 | ; CHECK-NEXT:    lsr w9, w9, #1 | 
 | ; CHECK-NEXT:    madd w0, w9, w8, w0 | 
 | ; CHECK-NEXT:    ret | 
 |   %t3 = icmp ugt i16 %a1, %a2 | 
 |   %t4 = select i1 %t3, i16 -1, i16 1 | 
 |   %t5 = select i1 %t3, i16 %a2, i16 %a1 | 
 |   %t6 = select i1 %t3, i16 %a1, i16 %a2 | 
 |   %t7 = sub i16 %t6, %t5 | 
 |   %t8 = lshr i16 %t7, 1 | 
 |   %t9 = mul i16 %t8, %t4 | 
 |   %a10 = add i16 %t9, %a1 | 
 |   ret i16 %a10 | 
 | } | 
 |  | 
 | ; Values are loaded. Only check signed case. | 
 |  | 
 | define i16 @scalar_i16_signed_mem_reg(ptr %a1_addr, i16 %a2) nounwind { | 
 | ; CHECK-LABEL: scalar_i16_signed_mem_reg: | 
 | ; CHECK:       // %bb.0: | 
 | ; CHECK-NEXT:    sxth w9, w1 | 
 | ; CHECK-NEXT:    ldrsh w10, [x0] | 
 | ; CHECK-NEXT:    mov w8, #-1 // =0xffffffff | 
 | ; CHECK-NEXT:    subs w9, w10, w9 | 
 | ; CHECK-NEXT:    cneg w9, w9, mi | 
 | ; CHECK-NEXT:    cneg w8, w8, le | 
 | ; CHECK-NEXT:    lsr w9, w9, #1 | 
 | ; CHECK-NEXT:    madd w0, w9, w8, w10 | 
 | ; CHECK-NEXT:    ret | 
 |   %a1 = load i16, ptr %a1_addr | 
 |   %t3 = icmp sgt i16 %a1, %a2 ; signed | 
 |   %t4 = select i1 %t3, i16 -1, i16 1 | 
 |   %t5 = select i1 %t3, i16 %a2, i16 %a1 | 
 |   %t6 = select i1 %t3, i16 %a1, i16 %a2 | 
 |   %t7 = sub i16 %t6, %t5 | 
 |   %t8 = lshr i16 %t7, 1 | 
 |   %t9 = mul nsw i16 %t8, %t4 ; signed | 
 |   %a10 = add nsw i16 %t9, %a1 ; signed | 
 |   ret i16 %a10 | 
 | } | 
 |  | 
 | define i16 @scalar_i16_signed_reg_mem(i16 %a1, ptr %a2_addr) nounwind { | 
 | ; CHECK-LABEL: scalar_i16_signed_reg_mem: | 
 | ; CHECK:       // %bb.0: | 
 | ; CHECK-NEXT:    sxth w9, w0 | 
 | ; CHECK-NEXT:    ldrsh w10, [x1] | 
 | ; CHECK-NEXT:    mov w8, #-1 // =0xffffffff | 
 | ; CHECK-NEXT:    subs w9, w9, w10 | 
 | ; CHECK-NEXT:    cneg w9, w9, mi | 
 | ; CHECK-NEXT:    cneg w8, w8, le | 
 | ; CHECK-NEXT:    lsr w9, w9, #1 | 
 | ; CHECK-NEXT:    madd w0, w9, w8, w0 | 
 | ; CHECK-NEXT:    ret | 
 |   %a2 = load i16, ptr %a2_addr | 
 |   %t3 = icmp sgt i16 %a1, %a2 ; signed | 
 |   %t4 = select i1 %t3, i16 -1, i16 1 | 
 |   %t5 = select i1 %t3, i16 %a2, i16 %a1 | 
 |   %t6 = select i1 %t3, i16 %a1, i16 %a2 | 
 |   %t7 = sub i16 %t6, %t5 | 
 |   %t8 = lshr i16 %t7, 1 | 
 |   %t9 = mul nsw i16 %t8, %t4 ; signed | 
 |   %a10 = add nsw i16 %t9, %a1 ; signed | 
 |   ret i16 %a10 | 
 | } | 
 |  | 
 | define i16 @scalar_i16_signed_mem_mem(ptr %a1_addr, ptr %a2_addr) nounwind { | 
 | ; CHECK-LABEL: scalar_i16_signed_mem_mem: | 
 | ; CHECK:       // %bb.0: | 
 | ; CHECK-NEXT:    ldrsh w9, [x0] | 
 | ; CHECK-NEXT:    ldrsh w10, [x1] | 
 | ; CHECK-NEXT:    mov w8, #-1 // =0xffffffff | 
 | ; CHECK-NEXT:    subs w10, w9, w10 | 
 | ; CHECK-NEXT:    cneg w10, w10, mi | 
 | ; CHECK-NEXT:    cneg w8, w8, le | 
 | ; CHECK-NEXT:    lsr w10, w10, #1 | 
 | ; CHECK-NEXT:    madd w0, w10, w8, w9 | 
 | ; CHECK-NEXT:    ret | 
 |   %a1 = load i16, ptr %a1_addr | 
 |   %a2 = load i16, ptr %a2_addr | 
 |   %t3 = icmp sgt i16 %a1, %a2 ; signed | 
 |   %t4 = select i1 %t3, i16 -1, i16 1 | 
 |   %t5 = select i1 %t3, i16 %a2, i16 %a1 | 
 |   %t6 = select i1 %t3, i16 %a1, i16 %a2 | 
 |   %t7 = sub i16 %t6, %t5 | 
 |   %t8 = lshr i16 %t7, 1 | 
 |   %t9 = mul nsw i16 %t8, %t4 ; signed | 
 |   %a10 = add nsw i16 %t9, %a1 ; signed | 
 |   ret i16 %a10 | 
 | } | 
 |  | 
 | ; ---------------------------------------------------------------------------- ; | 
 | ; 8-bit width | 
 | ; ---------------------------------------------------------------------------- ; | 
 |  | 
 | ; Values come from regs | 
 |  | 
 | define i8 @scalar_i8_signed_reg_reg(i8 %a1, i8 %a2) nounwind { | 
 | ; CHECK-LABEL: scalar_i8_signed_reg_reg: | 
 | ; CHECK:       // %bb.0: | 
 | ; CHECK-NEXT:    sxtb w9, w1 | 
 | ; CHECK-NEXT:    sxtb w10, w0 | 
 | ; CHECK-NEXT:    mov w8, #-1 // =0xffffffff | 
 | ; CHECK-NEXT:    subs w9, w10, w9 | 
 | ; CHECK-NEXT:    cneg w9, w9, mi | 
 | ; CHECK-NEXT:    cneg w8, w8, le | 
 | ; CHECK-NEXT:    lsr w9, w9, #1 | 
 | ; CHECK-NEXT:    madd w0, w9, w8, w0 | 
 | ; CHECK-NEXT:    ret | 
 |   %t3 = icmp sgt i8 %a1, %a2 ; signed | 
 |   %t4 = select i1 %t3, i8 -1, i8 1 | 
 |   %t5 = select i1 %t3, i8 %a2, i8 %a1 | 
 |   %t6 = select i1 %t3, i8 %a1, i8 %a2 | 
 |   %t7 = sub i8 %t6, %t5 | 
 |   %t8 = lshr i8 %t7, 1 | 
 |   %t9 = mul nsw i8 %t8, %t4 ; signed | 
 |   %a10 = add nsw i8 %t9, %a1 ; signed | 
 |   ret i8 %a10 | 
 | } | 
 |  | 
 | define i8 @scalar_i8_unsigned_reg_reg(i8 %a1, i8 %a2) nounwind { | 
 | ; CHECK-LABEL: scalar_i8_unsigned_reg_reg: | 
 | ; CHECK:       // %bb.0: | 
 | ; CHECK-NEXT:    and w9, w1, #0xff | 
 | ; CHECK-NEXT:    and w10, w0, #0xff | 
 | ; CHECK-NEXT:    mov w8, #-1 // =0xffffffff | 
 | ; CHECK-NEXT:    subs w9, w10, w9 | 
 | ; CHECK-NEXT:    cneg w9, w9, mi | 
 | ; CHECK-NEXT:    cneg w8, w8, ls | 
 | ; CHECK-NEXT:    lsr w9, w9, #1 | 
 | ; CHECK-NEXT:    madd w0, w9, w8, w0 | 
 | ; CHECK-NEXT:    ret | 
 |   %t3 = icmp ugt i8 %a1, %a2 | 
 |   %t4 = select i1 %t3, i8 -1, i8 1 | 
 |   %t5 = select i1 %t3, i8 %a2, i8 %a1 | 
 |   %t6 = select i1 %t3, i8 %a1, i8 %a2 | 
 |   %t7 = sub i8 %t6, %t5 | 
 |   %t8 = lshr i8 %t7, 1 | 
 |   %t9 = mul i8 %t8, %t4 | 
 |   %a10 = add i8 %t9, %a1 | 
 |   ret i8 %a10 | 
 | } | 
 |  | 
 | ; Values are loaded. Only check signed case. | 
 |  | 
 | define i8 @scalar_i8_signed_mem_reg(ptr %a1_addr, i8 %a2) nounwind { | 
 | ; CHECK-LABEL: scalar_i8_signed_mem_reg: | 
 | ; CHECK:       // %bb.0: | 
 | ; CHECK-NEXT:    sxtb w9, w1 | 
 | ; CHECK-NEXT:    ldrsb w10, [x0] | 
 | ; CHECK-NEXT:    mov w8, #-1 // =0xffffffff | 
 | ; CHECK-NEXT:    subs w9, w10, w9 | 
 | ; CHECK-NEXT:    cneg w9, w9, mi | 
 | ; CHECK-NEXT:    cneg w8, w8, le | 
 | ; CHECK-NEXT:    lsr w9, w9, #1 | 
 | ; CHECK-NEXT:    madd w0, w9, w8, w10 | 
 | ; CHECK-NEXT:    ret | 
 |   %a1 = load i8, ptr %a1_addr | 
 |   %t3 = icmp sgt i8 %a1, %a2 ; signed | 
 |   %t4 = select i1 %t3, i8 -1, i8 1 | 
 |   %t5 = select i1 %t3, i8 %a2, i8 %a1 | 
 |   %t6 = select i1 %t3, i8 %a1, i8 %a2 | 
 |   %t7 = sub i8 %t6, %t5 | 
 |   %t8 = lshr i8 %t7, 1 | 
 |   %t9 = mul nsw i8 %t8, %t4 ; signed | 
 |   %a10 = add nsw i8 %t9, %a1 ; signed | 
 |   ret i8 %a10 | 
 | } | 
 |  | 
 | define i8 @scalar_i8_signed_reg_mem(i8 %a1, ptr %a2_addr) nounwind { | 
 | ; CHECK-LABEL: scalar_i8_signed_reg_mem: | 
 | ; CHECK:       // %bb.0: | 
 | ; CHECK-NEXT:    sxtb w9, w0 | 
 | ; CHECK-NEXT:    ldrsb w10, [x1] | 
 | ; CHECK-NEXT:    mov w8, #-1 // =0xffffffff | 
 | ; CHECK-NEXT:    subs w9, w9, w10 | 
 | ; CHECK-NEXT:    cneg w9, w9, mi | 
 | ; CHECK-NEXT:    cneg w8, w8, le | 
 | ; CHECK-NEXT:    lsr w9, w9, #1 | 
 | ; CHECK-NEXT:    madd w0, w9, w8, w0 | 
 | ; CHECK-NEXT:    ret | 
 |   %a2 = load i8, ptr %a2_addr | 
 |   %t3 = icmp sgt i8 %a1, %a2 ; signed | 
 |   %t4 = select i1 %t3, i8 -1, i8 1 | 
 |   %t5 = select i1 %t3, i8 %a2, i8 %a1 | 
 |   %t6 = select i1 %t3, i8 %a1, i8 %a2 | 
 |   %t7 = sub i8 %t6, %t5 | 
 |   %t8 = lshr i8 %t7, 1 | 
 |   %t9 = mul nsw i8 %t8, %t4 ; signed | 
 |   %a10 = add nsw i8 %t9, %a1 ; signed | 
 |   ret i8 %a10 | 
 | } | 
 |  | 
 | define i8 @scalar_i8_signed_mem_mem(ptr %a1_addr, ptr %a2_addr) nounwind { | 
 | ; CHECK-LABEL: scalar_i8_signed_mem_mem: | 
 | ; CHECK:       // %bb.0: | 
 | ; CHECK-NEXT:    ldrsb w9, [x0] | 
 | ; CHECK-NEXT:    ldrsb w10, [x1] | 
 | ; CHECK-NEXT:    mov w8, #-1 // =0xffffffff | 
 | ; CHECK-NEXT:    subs w10, w9, w10 | 
 | ; CHECK-NEXT:    cneg w10, w10, mi | 
 | ; CHECK-NEXT:    cneg w8, w8, le | 
 | ; CHECK-NEXT:    lsr w10, w10, #1 | 
 | ; CHECK-NEXT:    madd w0, w10, w8, w9 | 
 | ; CHECK-NEXT:    ret | 
 |   %a1 = load i8, ptr %a1_addr | 
 |   %a2 = load i8, ptr %a2_addr | 
 |   %t3 = icmp sgt i8 %a1, %a2 ; signed | 
 |   %t4 = select i1 %t3, i8 -1, i8 1 | 
 |   %t5 = select i1 %t3, i8 %a2, i8 %a1 | 
 |   %t6 = select i1 %t3, i8 %a1, i8 %a2 | 
 |   %t7 = sub i8 %t6, %t5 | 
 |   %t8 = lshr i8 %t7, 1 | 
 |   %t9 = mul nsw i8 %t8, %t4 ; signed | 
 |   %a10 = add nsw i8 %t9, %a1 ; signed | 
 |   ret i8 %a10 | 
 | } |