brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.2 KiB · 85d8e15 Raw
124 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=aarch64-- | FileCheck %s3 4; With no-wrap:5; (X * Y) == 0 --> (X == 0) || (Y == 0)6; (X * Y) != 0 --> (X != 0) && (Y != 0)7 8define i1 @mul_nsw_eq0_i8(i8 %x, i8 %y) {9; CHECK-LABEL: mul_nsw_eq0_i8:10; CHECK:       // %bb.0:11; CHECK-NEXT:    tst w0, #0xff12; CHECK-NEXT:    cset w8, eq13; CHECK-NEXT:    tst w1, #0xff14; CHECK-NEXT:    csinc w0, w8, wzr, ne15; CHECK-NEXT:    ret16  %m = mul nsw i8 %x, %y17  %r = icmp eq i8 %m, 018  ret i1 %r19}20 21; negative test - not valid if mul can overflow22 23define i1 @mul_eq0_i8(i8 %x, i8 %y) {24; CHECK-LABEL: mul_eq0_i8:25; CHECK:       // %bb.0:26; CHECK-NEXT:    mul w8, w0, w127; CHECK-NEXT:    tst w8, #0xff28; CHECK-NEXT:    cset w0, eq29; CHECK-NEXT:    ret30  %m = mul i8 %x, %y31  %r = icmp eq i8 %m, 032  ret i1 %r33}34 35; negative test - don't try with minsize36 37define i1 @mul_nsw_eq0_i8_size(i8 %x, i8 %y) minsize {38; CHECK-LABEL: mul_nsw_eq0_i8_size:39; CHECK:       // %bb.0:40; CHECK-NEXT:    mul w8, w0, w141; CHECK-NEXT:    tst w8, #0xff42; CHECK-NEXT:    cset w0, eq43; CHECK-NEXT:    ret44  %m = mul nsw i8 %x, %y45  %r = icmp eq i8 %m, 046  ret i1 %r47}48 49define i1 @mul_nsw_ne0_i16(i16 %x, i16 %y) {50; CHECK-LABEL: mul_nsw_ne0_i16:51; CHECK:       // %bb.0:52; CHECK-NEXT:    tst w0, #0xffff53; CHECK-NEXT:    cset w8, ne54; CHECK-NEXT:    tst w1, #0xffff55; CHECK-NEXT:    csel w0, wzr, w8, eq56; CHECK-NEXT:    ret57  %m = mul nsw i16 %x, %y58  %r = icmp ne i16 %m, 059  ret i1 %r60}61 62define i1 @mul_nuw_eq0_i32(i32 %x, i32 %y) {63; CHECK-LABEL: mul_nuw_eq0_i32:64; CHECK:       // %bb.0:65; CHECK-NEXT:    cmp w0, #066; CHECK-NEXT:    ccmp w1, #0, #4, ne67; CHECK-NEXT:    cset w0, eq68; CHECK-NEXT:    ret69  %m = mul nuw i32 %x, %y70  %r = icmp eq i32 %m, 071  ret i1 %r72}73 74define i1 @mul_nsw_nuw_ne0_i64(i64 %x, i64 %y) {75; CHECK-LABEL: mul_nsw_nuw_ne0_i64:76; CHECK:       // %bb.0:77; CHECK-NEXT:    cmp x0, #078; CHECK-NEXT:    ccmp x1, #0, #4, ne79; CHECK-NEXT:    cset w0, ne80; CHECK-NEXT:    ret81  %m = mul nsw nuw i64 %x, %y82  %r = icmp ne i64 %m, 083  ret i1 %r84}85 86define <16 x i1> @mul_nuw_eq0_v16i8(<16 x i8> %x, <16 x i8> %y) {87; CHECK-LABEL: mul_nuw_eq0_v16i8:88; CHECK:       // %bb.0:89; CHECK-NEXT:    cmeq v1.16b, v1.16b, #090; CHECK-NEXT:    cmeq v0.16b, v0.16b, #091; CHECK-NEXT:    orr v0.16b, v0.16b, v1.16b92; CHECK-NEXT:    ret93  %m = mul nuw <16 x i8> %x, %y94  %r = icmp eq <16 x i8> %m, zeroinitializer95  ret <16 x i1> %r96}97 98define <4 x i1> @mul_nsw_ne0_v4i32(<4 x i32> %x, <4 x i32> %y) {99; CHECK-LABEL: mul_nsw_ne0_v4i32:100; CHECK:       // %bb.0:101; CHECK-NEXT:    cmtst v0.4s, v0.4s, v0.4s102; CHECK-NEXT:    cmeq v1.4s, v1.4s, #0103; CHECK-NEXT:    bic v0.16b, v0.16b, v1.16b104; CHECK-NEXT:    xtn v0.4h, v0.4s105; CHECK-NEXT:    ret106  %m = mul nsw <4 x i32> %x, %y107  %r = icmp ne <4 x i32> %m, zeroinitializer108  ret <4 x i1> %r109}110 111; negative test - don't try with minsize112 113define <4 x i1> @mul_nsw_ne0_v4i32_size(<4 x i32> %x, <4 x i32> %y) minsize {114; CHECK-LABEL: mul_nsw_ne0_v4i32_size:115; CHECK:       // %bb.0:116; CHECK-NEXT:    mul v0.4s, v0.4s, v1.4s117; CHECK-NEXT:    cmtst v0.4s, v0.4s, v0.4s118; CHECK-NEXT:    xtn v0.4h, v0.4s119; CHECK-NEXT:    ret120  %m = mul nsw <4 x i32> %x, %y121  %r = icmp ne <4 x i32> %m, zeroinitializer122  ret <4 x i1> %r123}124