1; Test that we can use NI for byte operations that are expressed as i32 2; or i64 operations. 3; 4; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s 5 6; Zero extension to 32 bits, negative constant. 7define void @f1(i8 *%ptr) { 8; CHECK-LABEL: f1: 9; CHECK: ni 0(%r2), 254 10; CHECK: br %r14 11 %val = load i8, i8 *%ptr 12 %ext = zext i8 %val to i32 13 %and = and i32 %ext, -2 14 %trunc = trunc i32 %and to i8 15 store i8 %trunc, i8 *%ptr 16 ret void 17} 18 19; Zero extension to 64 bits, negative constant. 20define void @f2(i8 *%ptr) { 21; CHECK-LABEL: f2: 22; CHECK: ni 0(%r2), 254 23; CHECK: br %r14 24 %val = load i8, i8 *%ptr 25 %ext = zext i8 %val to i64 26 %and = and i64 %ext, -2 27 %trunc = trunc i64 %and to i8 28 store i8 %trunc, i8 *%ptr 29 ret void 30} 31 32; Zero extension to 32 bits, positive constant. 33define void @f3(i8 *%ptr) { 34; CHECK-LABEL: f3: 35; CHECK: ni 0(%r2), 254 36; CHECK: br %r14 37 %val = load i8, i8 *%ptr 38 %ext = zext i8 %val to i32 39 %and = and i32 %ext, 254 40 %trunc = trunc i32 %and to i8 41 store i8 %trunc, i8 *%ptr 42 ret void 43} 44 45; Zero extension to 64 bits, positive constant. 46define void @f4(i8 *%ptr) { 47; CHECK-LABEL: f4: 48; CHECK: ni 0(%r2), 254 49; CHECK: br %r14 50 %val = load i8, i8 *%ptr 51 %ext = zext i8 %val to i64 52 %and = and i64 %ext, 254 53 %trunc = trunc i64 %and to i8 54 store i8 %trunc, i8 *%ptr 55 ret void 56} 57 58; Sign extension to 32 bits, negative constant. 59define void @f5(i8 *%ptr) { 60; CHECK-LABEL: f5: 61; CHECK: ni 0(%r2), 254 62; CHECK: br %r14 63 %val = load i8, i8 *%ptr 64 %ext = sext i8 %val to i32 65 %and = and i32 %ext, -2 66 %trunc = trunc i32 %and to i8 67 store i8 %trunc, i8 *%ptr 68 ret void 69} 70 71; Sign extension to 64 bits, negative constant. 72define void @f6(i8 *%ptr) { 73; CHECK-LABEL: f6: 74; CHECK: ni 0(%r2), 254 75; CHECK: br %r14 76 %val = load i8, i8 *%ptr 77 %ext = sext i8 %val to i64 78 %and = and i64 %ext, -2 79 %trunc = trunc i64 %and to i8 80 store i8 %trunc, i8 *%ptr 81 ret void 82} 83 84; Sign extension to 32 bits, positive constant. 85define void @f7(i8 *%ptr) { 86; CHECK-LABEL: f7: 87; CHECK: ni 0(%r2), 254 88; CHECK: br %r14 89 %val = load i8, i8 *%ptr 90 %ext = sext i8 %val to i32 91 %and = and i32 %ext, 254 92 %trunc = trunc i32 %and to i8 93 store i8 %trunc, i8 *%ptr 94 ret void 95} 96 97; Sign extension to 64 bits, positive constant. 98define void @f8(i8 *%ptr) { 99; CHECK-LABEL: f8: 100; CHECK: ni 0(%r2), 254 101; CHECK: br %r14 102 %val = load i8, i8 *%ptr 103 %ext = sext i8 %val to i64 104 %and = and i64 %ext, 254 105 %trunc = trunc i64 %and to i8 106 store i8 %trunc, i8 *%ptr 107 ret void 108} 109