brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.5 KiB · 3b344fe Raw
276 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 4;------------------------------------------------------------------------------;5; Odd divisors6;------------------------------------------------------------------------------;7 8define i32 @test_srem_odd(i32 %X) nounwind {9; CHECK-LABEL: test_srem_odd:10; CHECK:       // %bb.0:11; CHECK-NEXT:    mov w8, #52429 // =0xcccd12; CHECK-NEXT:    mov w9, #39321 // =0x999913; CHECK-NEXT:    movk w8, #52428, lsl #1614; CHECK-NEXT:    movk w9, #6553, lsl #1615; CHECK-NEXT:    madd w8, w0, w8, w916; CHECK-NEXT:    mov w9, #858993459 // =0x3333333317; CHECK-NEXT:    cmp w8, w918; CHECK-NEXT:    cset w0, lo19; CHECK-NEXT:    ret20  %srem = srem i32 %X, 521  %cmp = icmp eq i32 %srem, 022  %ret = zext i1 %cmp to i3223  ret i32 %ret24}25 26define i32 @test_srem_odd_25(i32 %X) nounwind {27; CHECK-LABEL: test_srem_odd_25:28; CHECK:       // %bb.0:29; CHECK-NEXT:    mov w8, #23593 // =0x5c2930; CHECK-NEXT:    mov w9, #47185 // =0xb85131; CHECK-NEXT:    movk w8, #49807, lsl #1632; CHECK-NEXT:    movk w9, #1310, lsl #1633; CHECK-NEXT:    madd w8, w0, w8, w934; CHECK-NEXT:    mov w9, #28835 // =0x70a335; CHECK-NEXT:    movk w9, #2621, lsl #1636; CHECK-NEXT:    cmp w8, w937; CHECK-NEXT:    cset w0, lo38; CHECK-NEXT:    ret39  %srem = srem i32 %X, 2540  %cmp = icmp eq i32 %srem, 041  %ret = zext i1 %cmp to i3242  ret i32 %ret43}44 45; This is like test_srem_odd, except the divisor has bit 30 set.46define i32 @test_srem_odd_bit30(i32 %X) nounwind {47; CHECK-LABEL: test_srem_odd_bit30:48; CHECK:       // %bb.0:49; CHECK-NEXT:    mov w8, #43691 // =0xaaab50; CHECK-NEXT:    mov w9, #1 // =0x151; CHECK-NEXT:    movk w8, #27306, lsl #1652; CHECK-NEXT:    madd w8, w0, w8, w953; CHECK-NEXT:    cmp w8, #354; CHECK-NEXT:    cset w0, lo55; CHECK-NEXT:    ret56  %srem = srem i32 %X, 107374182757  %cmp = icmp eq i32 %srem, 058  %ret = zext i1 %cmp to i3259  ret i32 %ret60}61 62; This is like test_srem_odd, except the divisor has bit 31 set.63define i32 @test_srem_odd_bit31(i32 %X) nounwind {64; CHECK-LABEL: test_srem_odd_bit31:65; CHECK:       // %bb.0:66; CHECK-NEXT:    mov w8, #21845 // =0x555567; CHECK-NEXT:    mov w9, #1 // =0x168; CHECK-NEXT:    movk w8, #54613, lsl #1669; CHECK-NEXT:    madd w8, w0, w8, w970; CHECK-NEXT:    cmp w8, #371; CHECK-NEXT:    cset w0, lo72; CHECK-NEXT:    ret73  %srem = srem i32 %X, 214748365174  %cmp = icmp eq i32 %srem, 075  %ret = zext i1 %cmp to i3276  ret i32 %ret77}78 79;------------------------------------------------------------------------------;80; Even divisors81;------------------------------------------------------------------------------;82 83define i16 @test_srem_even(i16 %X) nounwind {84; CHECK-LABEL: test_srem_even:85; CHECK:       // %bb.0:86; CHECK-NEXT:    mov w8, #28087 // =0x6db787; CHECK-NEXT:    mov w9, #4680 // =0x124888; CHECK-NEXT:    madd w8, w0, w8, w989; CHECK-NEXT:    lsl w10, w8, #1590; CHECK-NEXT:    bfxil w10, w8, #1, #1591; CHECK-NEXT:    cmp w9, w10, uxth92; CHECK-NEXT:    cset w0, lo93; CHECK-NEXT:    ret94  %srem = srem i16 %X, 1495  %cmp = icmp ne i16 %srem, 096  %ret = zext i1 %cmp to i1697  ret i16 %ret98}99 100define i32 @test_srem_even_100(i32 %X) nounwind {101; CHECK-LABEL: test_srem_even_100:102; CHECK:       // %bb.0:103; CHECK-NEXT:    mov w8, #23593 // =0x5c29104; CHECK-NEXT:    mov w9, #47184 // =0xb850105; CHECK-NEXT:    movk w8, #49807, lsl #16106; CHECK-NEXT:    movk w9, #1310, lsl #16107; CHECK-NEXT:    madd w8, w0, w8, w9108; CHECK-NEXT:    mov w9, #23593 // =0x5c29109; CHECK-NEXT:    movk w9, #655, lsl #16110; CHECK-NEXT:    ror w8, w8, #2111; CHECK-NEXT:    cmp w8, w9112; CHECK-NEXT:    cset w0, lo113; CHECK-NEXT:    ret114  %srem = srem i32 %X, 100115  %cmp = icmp eq i32 %srem, 0116  %ret = zext i1 %cmp to i32117  ret i32 %ret118}119 120; This is like test_srem_even, except the divisor has bit 30 set.121define i32 @test_srem_even_bit30(i32 %X) nounwind {122; CHECK-LABEL: test_srem_even_bit30:123; CHECK:       // %bb.0:124; CHECK-NEXT:    mov w8, #20165 // =0x4ec5125; CHECK-NEXT:    mov w9, #8 // =0x8126; CHECK-NEXT:    movk w8, #64748, lsl #16127; CHECK-NEXT:    madd w8, w0, w8, w9128; CHECK-NEXT:    ror w8, w8, #3129; CHECK-NEXT:    cmp w8, #3130; CHECK-NEXT:    cset w0, lo131; CHECK-NEXT:    ret132  %srem = srem i32 %X, 1073741928133  %cmp = icmp eq i32 %srem, 0134  %ret = zext i1 %cmp to i32135  ret i32 %ret136}137 138; This is like test_srem_odd, except the divisor has bit 31 set.139define i32 @test_srem_even_bit31(i32 %X) nounwind {140; CHECK-LABEL: test_srem_even_bit31:141; CHECK:       // %bb.0:142; CHECK-NEXT:    mov w8, #1285 // =0x505143; CHECK-NEXT:    mov w9, #2 // =0x2144; CHECK-NEXT:    movk w8, #50437, lsl #16145; CHECK-NEXT:    madd w8, w0, w8, w9146; CHECK-NEXT:    ror w8, w8, #1147; CHECK-NEXT:    cmp w8, #3148; CHECK-NEXT:    cset w0, lo149; CHECK-NEXT:    ret150  %srem = srem i32 %X, 2147483750151  %cmp = icmp eq i32 %srem, 0152  %ret = zext i1 %cmp to i32153  ret i32 %ret154}155 156;------------------------------------------------------------------------------;157; Special case158;------------------------------------------------------------------------------;159 160; 'NE' predicate is fine too.161define i32 @test_srem_odd_setne(i32 %X) nounwind {162; CHECK-LABEL: test_srem_odd_setne:163; CHECK:       // %bb.0:164; CHECK-NEXT:    mov w8, #52429 // =0xcccd165; CHECK-NEXT:    mov w9, #39321 // =0x9999166; CHECK-NEXT:    movk w8, #52428, lsl #16167; CHECK-NEXT:    movk w9, #6553, lsl #16168; CHECK-NEXT:    madd w8, w0, w8, w9169; CHECK-NEXT:    mov w9, #858993459 // =0x33333333170; CHECK-NEXT:    cmp w8, w9171; CHECK-NEXT:    cset w0, hs172; CHECK-NEXT:    ret173  %srem = srem i32 %X, 5174  %cmp = icmp ne i32 %srem, 0175  %ret = zext i1 %cmp to i32176  ret i32 %ret177}178 179; The fold is only valid for positive divisors, negative-ones should be negated.180define i32 @test_srem_negative_odd(i32 %X) nounwind {181; CHECK-LABEL: test_srem_negative_odd:182; CHECK:       // %bb.0:183; CHECK-NEXT:    mov w8, #52429 // =0xcccd184; CHECK-NEXT:    mov w9, #39321 // =0x9999185; CHECK-NEXT:    movk w8, #52428, lsl #16186; CHECK-NEXT:    movk w9, #6553, lsl #16187; CHECK-NEXT:    madd w8, w0, w8, w9188; CHECK-NEXT:    mov w9, #858993459 // =0x33333333189; CHECK-NEXT:    cmp w8, w9190; CHECK-NEXT:    cset w0, hs191; CHECK-NEXT:    ret192  %srem = srem i32 %X, -5193  %cmp = icmp ne i32 %srem, 0194  %ret = zext i1 %cmp to i32195  ret i32 %ret196}197define i32 @test_srem_negative_even(i32 %X) nounwind {198; CHECK-LABEL: test_srem_negative_even:199; CHECK:       // %bb.0:200; CHECK-NEXT:    mov w8, #28087 // =0x6db7201; CHECK-NEXT:    mov w9, #9362 // =0x2492202; CHECK-NEXT:    movk w8, #46811, lsl #16203; CHECK-NEXT:    movk w9, #4681, lsl #16204; CHECK-NEXT:    madd w8, w0, w8, w9205; CHECK-NEXT:    ror w8, w8, #1206; CHECK-NEXT:    cmp w8, w9207; CHECK-NEXT:    cset w0, hi208; CHECK-NEXT:    ret209  %srem = srem i32 %X, -14210  %cmp = icmp ne i32 %srem, 0211  %ret = zext i1 %cmp to i32212  ret i32 %ret213}214 215;------------------------------------------------------------------------------;216; Negative tests217;------------------------------------------------------------------------------;218 219; We can lower remainder of division by one much better elsewhere.220define i32 @test_srem_one(i32 %X) nounwind {221; CHECK-LABEL: test_srem_one:222; CHECK:       // %bb.0:223; CHECK-NEXT:    mov w0, #1 // =0x1224; CHECK-NEXT:    ret225  %srem = srem i32 %X, 1226  %cmp = icmp eq i32 %srem, 0227  %ret = zext i1 %cmp to i32228  ret i32 %ret229}230 231; We can lower remainder of division by powers of two much better elsewhere.232define i32 @test_srem_pow2(i32 %X) nounwind {233; CHECK-LABEL: test_srem_pow2:234; CHECK:       // %bb.0:235; CHECK-NEXT:    negs w8, w0236; CHECK-NEXT:    and w9, w0, #0xf237; CHECK-NEXT:    and w8, w8, #0xf238; CHECK-NEXT:    csneg w8, w9, w8, mi239; CHECK-NEXT:    cmp w8, #0240; CHECK-NEXT:    cset w0, eq241; CHECK-NEXT:    ret242  %srem = srem i32 %X, 16243  %cmp = icmp eq i32 %srem, 0244  %ret = zext i1 %cmp to i32245  ret i32 %ret246}247 248; The fold is only valid for positive divisors, and we can't negate INT_MIN.249define i32 @test_srem_int_min(i32 %X) nounwind {250; CHECK-LABEL: test_srem_int_min:251; CHECK:       // %bb.0:252; CHECK-NEXT:    negs w8, w0253; CHECK-NEXT:    and w9, w0, #0x7fffffff254; CHECK-NEXT:    and w8, w8, #0x7fffffff255; CHECK-NEXT:    csneg w8, w9, w8, mi256; CHECK-NEXT:    cmp w8, #0257; CHECK-NEXT:    cset w0, eq258; CHECK-NEXT:    ret259  %srem = srem i32 %X, 2147483648260  %cmp = icmp eq i32 %srem, 0261  %ret = zext i1 %cmp to i32262  ret i32 %ret263}264 265; We can lower remainder of division by all-ones much better elsewhere.266define i32 @test_srem_allones(i32 %X) nounwind {267; CHECK-LABEL: test_srem_allones:268; CHECK:       // %bb.0:269; CHECK-NEXT:    mov w0, #1 // =0x1270; CHECK-NEXT:    ret271  %srem = srem i32 %X, 4294967295272  %cmp = icmp eq i32 %srem, 0273  %ret = zext i1 %cmp to i32274  ret i32 %ret275}276