138 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=aarch64-unknown-linux-gnu < %s | FileCheck %s3 4define i16 @fold_srem_1_i16(i16 %x) {5; CHECK-LABEL: fold_srem_1_i16:6; CHECK: // %bb.0:7; CHECK-NEXT: mov w0, wzr8; CHECK-NEXT: ret9 %1 = srem i16 %x, 110 ret i16 %111}12 13define i32 @fold_srem_1_i32(i32 %x) {14; CHECK-LABEL: fold_srem_1_i32:15; CHECK: // %bb.0:16; CHECK-NEXT: mov w0, wzr17; CHECK-NEXT: ret18 %1 = srem i32 %x, 119 ret i32 %120}21 22define i64 @fold_srem_1_i64(i64 %x) {23; CHECK-LABEL: fold_srem_1_i64:24; CHECK: // %bb.0:25; CHECK-NEXT: mov x0, xzr26; CHECK-NEXT: ret27 %1 = srem i64 %x, 128 ret i64 %129}30 31define i16 @fold_srem_2_i16(i16 %x) {32; CHECK-LABEL: fold_srem_2_i16:33; CHECK: // %bb.0:34; CHECK-NEXT: and w8, w0, #0x800035; CHECK-NEXT: add w8, w0, w8, lsr #1536; CHECK-NEXT: and w8, w8, #0xfffffffe37; CHECK-NEXT: sub w0, w0, w838; CHECK-NEXT: ret39 %1 = srem i16 %x, 240 ret i16 %141}42 43define i32 @fold_srem_2_i64(i32 %x) {44; CHECK-LABEL: fold_srem_2_i64:45; CHECK: // %bb.0:46; CHECK-NEXT: and w8, w0, #0x147; CHECK-NEXT: cmp w0, #048; CHECK-NEXT: cneg w0, w8, mi49; CHECK-NEXT: ret50 %1 = srem i32 %x, 251 ret i32 %152}53 54define i64 @fold_srem_2_i32(i64 %x) {55; CHECK-LABEL: fold_srem_2_i32:56; CHECK: // %bb.0:57; CHECK-NEXT: and x8, x0, #0x158; CHECK-NEXT: cmp x0, #059; CHECK-NEXT: cneg x0, x8, mi60; CHECK-NEXT: ret61 %1 = srem i64 %x, 262 ret i64 %163}64 65define i16 @fold_srem_pow2_i16(i16 %x) {66; CHECK-LABEL: fold_srem_pow2_i16:67; CHECK: // %bb.0:68; CHECK-NEXT: sxth w8, w069; CHECK-NEXT: ubfx w8, w8, #25, #670; CHECK-NEXT: add w8, w0, w871; CHECK-NEXT: and w8, w8, #0xffffffc072; CHECK-NEXT: sub w0, w0, w873; CHECK-NEXT: ret74 %1 = srem i16 %x, 6475 ret i16 %176}77 78define i32 @fold_srem_pow2_i32(i32 %x) {79; CHECK-LABEL: fold_srem_pow2_i32:80; CHECK: // %bb.0:81; CHECK-NEXT: negs w8, w082; CHECK-NEXT: and w9, w0, #0x3f83; CHECK-NEXT: and w8, w8, #0x3f84; CHECK-NEXT: csneg w0, w9, w8, mi85; CHECK-NEXT: ret86 %1 = srem i32 %x, 6487 ret i32 %188}89 90define i64 @fold_srem_pow2_i64(i64 %x) {91; CHECK-LABEL: fold_srem_pow2_i64:92; CHECK: // %bb.0:93; CHECK-NEXT: negs x8, x094; CHECK-NEXT: and x9, x0, #0x3f95; CHECK-NEXT: and x8, x8, #0x3f96; CHECK-NEXT: csneg x0, x9, x8, mi97; CHECK-NEXT: ret98 %1 = srem i64 %x, 6499 ret i64 %1100}101 102define i16 @fold_srem_smax_i16(i16 %x) {103; CHECK-LABEL: fold_srem_smax_i16:104; CHECK: // %bb.0:105; CHECK-NEXT: sxth w8, w0106; CHECK-NEXT: ubfx w8, w8, #16, #15107; CHECK-NEXT: add w8, w0, w8108; CHECK-NEXT: and w8, w8, #0xffff8000109; CHECK-NEXT: add w0, w0, w8110; CHECK-NEXT: ret111 %1 = srem i16 %x, 32768112 ret i16 %1113}114 115define i32 @fold_srem_smax_i32(i32 %x) {116; CHECK-LABEL: fold_srem_smax_i32:117; CHECK: // %bb.0:118; CHECK-NEXT: negs w8, w0119; CHECK-NEXT: and w9, w0, #0x7fffffff120; CHECK-NEXT: and w8, w8, #0x7fffffff121; CHECK-NEXT: csneg w0, w9, w8, mi122; CHECK-NEXT: ret123 %1 = srem i32 %x, 2147483648124 ret i32 %1125}126 127define i64 @fold_srem_smax_i64(i64 %x) {128; CHECK-LABEL: fold_srem_smax_i64:129; CHECK: // %bb.0:130; CHECK-NEXT: negs x8, x0131; CHECK-NEXT: and x9, x0, #0x7fffffffffffffff132; CHECK-NEXT: and x8, x8, #0x7fffffffffffffff133; CHECK-NEXT: csneg x0, x9, x8, mi134; CHECK-NEXT: ret135 %1 = srem i64 %x, -9223372036854775808136 ret i64 %1137}138