153 lines · plain
1; Combined logical operations involving complement on z152;3; RUN: llc -mcpu=z15 < %s -mtriple=s390x-linux-gnu | FileCheck %s4 5; And-with-complement 32-bit.6define i32 @f1(i32 %dummy, i32 %a, i32 %b) {7; CHECK-LABEL: f1:8; CHECK: ncrk %r2, %r3, %r49; CHECK: br %r1410 %neg = xor i32 %b, -111 %ret = and i32 %neg, %a12 ret i32 %ret13}14 15; And-with-complement 64-bit.16define i64 @f2(i64 %dummy, i64 %a, i64 %b) {17; CHECK-LABEL: f2:18; CHECK: ncgrk %r2, %r3, %r419; CHECK: br %r1420 %neg = xor i64 %b, -121 %ret = and i64 %neg, %a22 ret i64 %ret23}24 25; Or-with-complement 32-bit.26define i32 @f3(i32 %dummy, i32 %a, i32 %b) {27; CHECK-LABEL: f3:28; CHECK: ocrk %r2, %r3, %r429; CHECK: br %r1430 %neg = xor i32 %b, -131 %ret = or i32 %neg, %a32 ret i32 %ret33}34 35; Or-with-complement 64-bit.36define i64 @f4(i64 %dummy, i64 %a, i64 %b) {37; CHECK-LABEL: f4:38; CHECK: ocgrk %r2, %r3, %r439; CHECK: br %r1440 %neg = xor i64 %b, -141 %ret = or i64 %neg, %a42 ret i64 %ret43}44 45; NAND 32-bit.46define i32 @f5(i32 %dummy, i32 %a, i32 %b) {47; CHECK-LABEL: f5:48; CHECK: nnrk %r2, %r3, %r449; CHECK: br %r1450 %tmp = and i32 %a, %b51 %ret = xor i32 %tmp, -152 ret i32 %ret53}54 55; NAND 64-bit.56define i64 @f6(i64 %dummy, i64 %a, i64 %b) {57; CHECK-LABEL: f6:58; CHECK: nngrk %r2, %r3, %r459; CHECK: br %r1460 %tmp = and i64 %a, %b61 %ret = xor i64 %tmp, -162 ret i64 %ret63}64 65; NOR 32-bit.66define i32 @f7(i32 %dummy, i32 %a, i32 %b) {67; CHECK-LABEL: f7:68; CHECK: nork %r2, %r3, %r469; CHECK: br %r1470 %tmp = or i32 %a, %b71 %ret = xor i32 %tmp, -172 ret i32 %ret73}74 75; NOR 64-bit.76define i64 @f8(i64 %dummy, i64 %a, i64 %b) {77; CHECK-LABEL: f8:78; CHECK: nogrk %r2, %r3, %r479; CHECK: br %r1480 %tmp = or i64 %a, %b81 %ret = xor i64 %tmp, -182 ret i64 %ret83}84 85; NXOR 32-bit.86define i32 @f9(i32 %dummy, i32 %a, i32 %b) {87; CHECK-LABEL: f9:88; CHECK: nxrk %r2, %r3, %r489; CHECK: br %r1490 %tmp = xor i32 %a, %b91 %ret = xor i32 %tmp, -192 ret i32 %ret93}94 95; NXOR 64-bit.96define i64 @f10(i64 %dummy, i64 %a, i64 %b) {97; CHECK-LABEL: f10:98; CHECK: nxgrk %r2, %r3, %r499; CHECK: br %r14100 %tmp = xor i64 %a, %b101 %ret = xor i64 %tmp, -1102 ret i64 %ret103}104 105; Or-with-complement 32-bit of a constant.106define i32 @f11(i32 %a) {107; CHECK-LABEL: f11:108; CHECK: lhi [[REG:%r[0-5]]], -256109; CHECK: ocrk %r2, [[REG]], %r2110; CHECK: br %r14111 %neg = xor i32 %a, -1112 %ret = or i32 %neg, -256113 ret i32 %ret114}115 116; Or-with-complement 64-bit of a constant.117define i64 @f12(i64 %a) {118; CHECK-LABEL: f12:119; CHECK: lghi [[REG:%r[0-5]]], -256120; CHECK: ocgrk %r2, [[REG]], %r2121; CHECK: br %r14122 %neg = xor i64 %a, -1123 %ret = or i64 %neg, -256124 ret i64 %ret125}126 127; NXOR 32-bit (alternate match).128define i32 @f13(i32 %a) {129; CHECK-LABEL: f13:130; CHECK: lhi [[REG:%r[0-5]]], -256131; CHECK: nxrk %r2, %r2, [[REG]]132; CHECK: br %r14133 ; Use an opaque const so the pattern doesn't get optimized away early.134 %const = bitcast i32 -256 to i32135 %neg = xor i32 %a, -1136 %ret = xor i32 %neg, %const137 ret i32 %ret138}139 140; NXOR 64-bit (alternate match).141define i64 @f14(i64 %a) {142; CHECK-LABEL: f14:143; CHECK: lghi [[REG:%r[0-5]]], -256144; CHECK: nxgrk %r2, %r2, [[REG]]145; CHECK: br %r14146 ; Use an opaque const so the pattern doesn't get optimized away early.147 %const = bitcast i64 -256 to i64148 %neg = xor i64 %a, -1149 %ret = xor i64 %neg, %const150 ret i64 %ret151}152 153