brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.7 KiB · 461a7ef Raw
306 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=aarch64-unknown-unknown | FileCheck %s --check-prefixes=SDAG3; RUN: llc < %s -mtriple=aarch64-unknown-unknown -global-isel | FileCheck %s --check-prefixes=GISEL4 5; These tests are taken from the combine-udiv.ll in X86.6define <8 x i16> @combine_vec_udiv_uniform(<8 x i16> %x) {7; SDAG-LABEL: combine_vec_udiv_uniform:8; SDAG:       // %bb.0:9; SDAG-NEXT:    mov w8, #25645 // =0x642d10; SDAG-NEXT:    dup v1.8h, w811; SDAG-NEXT:    umull2 v2.4s, v0.8h, v1.8h12; SDAG-NEXT:    umull v1.4s, v0.4h, v1.4h13; SDAG-NEXT:    uzp2 v1.8h, v1.8h, v2.8h14; SDAG-NEXT:    sub v0.8h, v0.8h, v1.8h15; SDAG-NEXT:    usra v1.8h, v0.8h, #116; SDAG-NEXT:    ushr v0.8h, v1.8h, #417; SDAG-NEXT:    ret18;19; GISEL-LABEL: combine_vec_udiv_uniform:20; GISEL:       // %bb.0:21; GISEL-NEXT:    adrp x8, .LCPI0_022; GISEL-NEXT:    ldr q1, [x8, :lo12:.LCPI0_0]23; GISEL-NEXT:    umull2 v2.4s, v0.8h, v1.8h24; GISEL-NEXT:    umull v1.4s, v0.4h, v1.4h25; GISEL-NEXT:    uzp2 v1.8h, v1.8h, v2.8h26; GISEL-NEXT:    sub v0.8h, v0.8h, v1.8h27; GISEL-NEXT:    usra v1.8h, v0.8h, #128; GISEL-NEXT:    ushr v0.8h, v1.8h, #429; GISEL-NEXT:    ret30  %1 = udiv <8 x i16> %x, <i16 23, i16 23, i16 23, i16 23, i16 23, i16 23, i16 23, i16 23>31  ret <8 x i16> %132}33 34define <8 x i16> @combine_vec_udiv_nonuniform(<8 x i16> %x) {35; SDAG-LABEL: combine_vec_udiv_nonuniform:36; SDAG:       // %bb.0:37; SDAG-NEXT:    adrp x8, .LCPI1_038; SDAG-NEXT:    ldr q1, [x8, :lo12:.LCPI1_0]39; SDAG-NEXT:    adrp x8, .LCPI1_140; SDAG-NEXT:    ldr q2, [x8, :lo12:.LCPI1_1]41; SDAG-NEXT:    adrp x8, .LCPI1_242; SDAG-NEXT:    ushl v1.8h, v0.8h, v1.8h43; SDAG-NEXT:    umull2 v3.4s, v1.8h, v2.8h44; SDAG-NEXT:    umull v1.4s, v1.4h, v2.4h45; SDAG-NEXT:    ldr q2, [x8, :lo12:.LCPI1_2]46; SDAG-NEXT:    adrp x8, .LCPI1_347; SDAG-NEXT:    uzp2 v1.8h, v1.8h, v3.8h48; SDAG-NEXT:    sub v0.8h, v0.8h, v1.8h49; SDAG-NEXT:    umull2 v3.4s, v0.8h, v2.8h50; SDAG-NEXT:    umull v0.4s, v0.4h, v2.4h51; SDAG-NEXT:    uzp2 v0.8h, v0.8h, v3.8h52; SDAG-NEXT:    add v0.8h, v0.8h, v1.8h53; SDAG-NEXT:    ldr q1, [x8, :lo12:.LCPI1_3]54; SDAG-NEXT:    ushl v0.8h, v0.8h, v1.8h55; SDAG-NEXT:    ret56;57; GISEL-LABEL: combine_vec_udiv_nonuniform:58; GISEL:       // %bb.0:59; GISEL-NEXT:    adrp x8, .LCPI1_360; GISEL-NEXT:    ldr q1, [x8, :lo12:.LCPI1_3]61; GISEL-NEXT:    adrp x8, .LCPI1_262; GISEL-NEXT:    ldr q2, [x8, :lo12:.LCPI1_2]63; GISEL-NEXT:    adrp x8, .LCPI1_164; GISEL-NEXT:    neg v1.8h, v1.8h65; GISEL-NEXT:    ushl v1.8h, v0.8h, v1.8h66; GISEL-NEXT:    umull2 v3.4s, v1.8h, v2.8h67; GISEL-NEXT:    umull v1.4s, v1.4h, v2.4h68; GISEL-NEXT:    ldr q2, [x8, :lo12:.LCPI1_1]69; GISEL-NEXT:    adrp x8, .LCPI1_070; GISEL-NEXT:    uzp2 v1.8h, v1.8h, v3.8h71; GISEL-NEXT:    sub v0.8h, v0.8h, v1.8h72; GISEL-NEXT:    umull2 v3.4s, v0.8h, v2.8h73; GISEL-NEXT:    umull v0.4s, v0.4h, v2.4h74; GISEL-NEXT:    ldr q2, [x8, :lo12:.LCPI1_0]75; GISEL-NEXT:    uzp2 v0.8h, v0.8h, v3.8h76; GISEL-NEXT:    add v0.8h, v0.8h, v1.8h77; GISEL-NEXT:    neg v1.8h, v2.8h78; GISEL-NEXT:    ushl v0.8h, v0.8h, v1.8h79; GISEL-NEXT:    ret80  %1 = udiv <8 x i16> %x, <i16 23, i16 34, i16 -23, i16 56, i16 128, i16 -1, i16 -256, i16 -32768>81  ret <8 x i16> %182}83 84define <8 x i16> @combine_vec_udiv_nonuniform2(<8 x i16> %x) {85; SDAG-LABEL: combine_vec_udiv_nonuniform2:86; SDAG:       // %bb.0:87; SDAG-NEXT:    adrp x8, .LCPI2_088; SDAG-NEXT:    ldr q1, [x8, :lo12:.LCPI2_0]89; SDAG-NEXT:    adrp x8, .LCPI2_190; SDAG-NEXT:    ushl v0.8h, v0.8h, v1.8h91; SDAG-NEXT:    ldr q1, [x8, :lo12:.LCPI2_1]92; SDAG-NEXT:    adrp x8, .LCPI2_293; SDAG-NEXT:    umull2 v2.4s, v0.8h, v1.8h94; SDAG-NEXT:    umull v0.4s, v0.4h, v1.4h95; SDAG-NEXT:    ldr q1, [x8, :lo12:.LCPI2_2]96; SDAG-NEXT:    uzp2 v0.8h, v0.8h, v2.8h97; SDAG-NEXT:    ushl v0.8h, v0.8h, v1.8h98; SDAG-NEXT:    ret99;100; GISEL-LABEL: combine_vec_udiv_nonuniform2:101; GISEL:       // %bb.0:102; GISEL-NEXT:    adrp x8, .LCPI2_2103; GISEL-NEXT:    ldr q1, [x8, :lo12:.LCPI2_2]104; GISEL-NEXT:    adrp x8, .LCPI2_1105; GISEL-NEXT:    neg v1.8h, v1.8h106; GISEL-NEXT:    ushl v0.8h, v0.8h, v1.8h107; GISEL-NEXT:    ldr q1, [x8, :lo12:.LCPI2_1]108; GISEL-NEXT:    adrp x8, .LCPI2_0109; GISEL-NEXT:    umull2 v2.4s, v0.8h, v1.8h110; GISEL-NEXT:    umull v0.4s, v0.4h, v1.4h111; GISEL-NEXT:    ldr q1, [x8, :lo12:.LCPI2_0]112; GISEL-NEXT:    neg v1.8h, v1.8h113; GISEL-NEXT:    uzp2 v0.8h, v0.8h, v2.8h114; GISEL-NEXT:    ushl v0.8h, v0.8h, v1.8h115; GISEL-NEXT:    ret116  %1 = udiv <8 x i16> %x, <i16 -34, i16 35, i16 36, i16 -37, i16 38, i16 -39, i16 40, i16 -41>117  ret <8 x i16> %1118}119 120define <8 x i16> @combine_vec_udiv_nonuniform3(<8 x i16> %x) {121; SDAG-LABEL: combine_vec_udiv_nonuniform3:122; SDAG:       // %bb.0:123; SDAG-NEXT:    adrp x8, .LCPI3_0124; SDAG-NEXT:    ldr q1, [x8, :lo12:.LCPI3_0]125; SDAG-NEXT:    adrp x8, .LCPI3_1126; SDAG-NEXT:    umull2 v2.4s, v0.8h, v1.8h127; SDAG-NEXT:    umull v1.4s, v0.4h, v1.4h128; SDAG-NEXT:    uzp2 v1.8h, v1.8h, v2.8h129; SDAG-NEXT:    sub v0.8h, v0.8h, v1.8h130; SDAG-NEXT:    usra v1.8h, v0.8h, #1131; SDAG-NEXT:    ldr q0, [x8, :lo12:.LCPI3_1]132; SDAG-NEXT:    ushl v0.8h, v1.8h, v0.8h133; SDAG-NEXT:    ret134;135; GISEL-LABEL: combine_vec_udiv_nonuniform3:136; GISEL:       // %bb.0:137; GISEL-NEXT:    adrp x8, .LCPI3_1138; GISEL-NEXT:    ldr q1, [x8, :lo12:.LCPI3_1]139; GISEL-NEXT:    adrp x8, .LCPI3_0140; GISEL-NEXT:    umull2 v2.4s, v0.8h, v1.8h141; GISEL-NEXT:    umull v1.4s, v0.4h, v1.4h142; GISEL-NEXT:    uzp2 v1.8h, v1.8h, v2.8h143; GISEL-NEXT:    ldr q2, [x8, :lo12:.LCPI3_0]144; GISEL-NEXT:    sub v0.8h, v0.8h, v1.8h145; GISEL-NEXT:    usra v1.8h, v0.8h, #1146; GISEL-NEXT:    neg v0.8h, v2.8h147; GISEL-NEXT:    ushl v0.8h, v1.8h, v0.8h148; GISEL-NEXT:    ret149  %1 = udiv <8 x i16> %x, <i16 7, i16 23, i16 25, i16 27, i16 31, i16 47, i16 63, i16 127>150  ret <8 x i16> %1151}152 153define <16 x i8> @combine_vec_udiv_nonuniform4(<16 x i8> %x) {154; SDAG-LABEL: combine_vec_udiv_nonuniform4:155; SDAG:       // %bb.0:156; SDAG-NEXT:    movi v1.16b, #171157; SDAG-NEXT:    adrp x8, .LCPI4_0158; SDAG-NEXT:    umull2 v2.8h, v0.16b, v1.16b159; SDAG-NEXT:    umull v1.8h, v0.8b, v1.8b160; SDAG-NEXT:    uzp2 v1.16b, v1.16b, v2.16b161; SDAG-NEXT:    ldr q2, [x8, :lo12:.LCPI4_0]162; SDAG-NEXT:    ushr v1.16b, v1.16b, #7163; SDAG-NEXT:    bif v0.16b, v1.16b, v2.16b164; SDAG-NEXT:    ret165;166; GISEL-LABEL: combine_vec_udiv_nonuniform4:167; GISEL:       // %bb.0:168; GISEL-NEXT:    adrp x8, .LCPI4_2169; GISEL-NEXT:    adrp x9, .LCPI4_0170; GISEL-NEXT:    ldr q1, [x8, :lo12:.LCPI4_2]171; GISEL-NEXT:    adrp x8, .LCPI4_1172; GISEL-NEXT:    ldr q4, [x9, :lo12:.LCPI4_0]173; GISEL-NEXT:    ldr q3, [x8, :lo12:.LCPI4_1]174; GISEL-NEXT:    umull2 v2.8h, v0.16b, v1.16b175; GISEL-NEXT:    umull v1.8h, v0.8b, v1.8b176; GISEL-NEXT:    uzp2 v1.16b, v1.16b, v2.16b177; GISEL-NEXT:    neg v2.16b, v3.16b178; GISEL-NEXT:    shl v3.16b, v4.16b, #7179; GISEL-NEXT:    ushl v1.16b, v1.16b, v2.16b180; GISEL-NEXT:    cmlt v2.16b, v3.16b, #0181; GISEL-NEXT:    bif v0.16b, v1.16b, v2.16b182; GISEL-NEXT:    ret183  %div = udiv <16 x i8> %x, <i8 -64, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>184  ret <16 x i8> %div185}186 187define <8 x i16> @pr38477(<8 x i16> %a0) {188; SDAG-LABEL: pr38477:189; SDAG:       // %bb.0:190; SDAG-NEXT:    adrp x8, .LCPI5_0191; SDAG-NEXT:    ldr q1, [x8, :lo12:.LCPI5_0]192; SDAG-NEXT:    adrp x8, .LCPI5_1193; SDAG-NEXT:    ldr q3, [x8, :lo12:.LCPI5_1]194; SDAG-NEXT:    adrp x8, .LCPI5_2195; SDAG-NEXT:    umull2 v2.4s, v0.8h, v1.8h196; SDAG-NEXT:    umull v1.4s, v0.4h, v1.4h197; SDAG-NEXT:    uzp2 v1.8h, v1.8h, v2.8h198; SDAG-NEXT:    sub v2.8h, v0.8h, v1.8h199; SDAG-NEXT:    umull2 v4.4s, v2.8h, v3.8h200; SDAG-NEXT:    umull v2.4s, v2.4h, v3.4h201; SDAG-NEXT:    uzp2 v2.8h, v2.8h, v4.8h202; SDAG-NEXT:    add v1.8h, v2.8h, v1.8h203; SDAG-NEXT:    ldr q2, [x8, :lo12:.LCPI5_2]204; SDAG-NEXT:    adrp x8, .LCPI5_3205; SDAG-NEXT:    ushl v1.8h, v1.8h, v2.8h206; SDAG-NEXT:    ldr q2, [x8, :lo12:.LCPI5_3]207; SDAG-NEXT:    bif v0.16b, v1.16b, v2.16b208; SDAG-NEXT:    ret209;210; GISEL-LABEL: pr38477:211; GISEL:       // %bb.0:212; GISEL-NEXT:    adrp x8, .LCPI5_3213; GISEL-NEXT:    ldr q1, [x8, :lo12:.LCPI5_3]214; GISEL-NEXT:    adrp x8, .LCPI5_2215; GISEL-NEXT:    ldr q3, [x8, :lo12:.LCPI5_2]216; GISEL-NEXT:    adrp x8, .LCPI5_0217; GISEL-NEXT:    umull2 v2.4s, v0.8h, v1.8h218; GISEL-NEXT:    umull v1.4s, v0.4h, v1.4h219; GISEL-NEXT:    uzp2 v1.8h, v1.8h, v2.8h220; GISEL-NEXT:    sub v2.8h, v0.8h, v1.8h221; GISEL-NEXT:    umull2 v4.4s, v2.8h, v3.8h222; GISEL-NEXT:    umull v2.4s, v2.4h, v3.4h223; GISEL-NEXT:    ldr d3, [x8, :lo12:.LCPI5_0]224; GISEL-NEXT:    adrp x8, .LCPI5_1225; GISEL-NEXT:    ushll v3.8h, v3.8b, #0226; GISEL-NEXT:    uzp2 v2.8h, v2.8h, v4.8h227; GISEL-NEXT:    ldr q4, [x8, :lo12:.LCPI5_1]228; GISEL-NEXT:    shl v3.8h, v3.8h, #15229; GISEL-NEXT:    add v1.8h, v2.8h, v1.8h230; GISEL-NEXT:    neg v2.8h, v4.8h231; GISEL-NEXT:    ushl v1.8h, v1.8h, v2.8h232; GISEL-NEXT:    cmlt v2.8h, v3.8h, #0233; GISEL-NEXT:    bif v0.16b, v1.16b, v2.16b234; GISEL-NEXT:    ret235  %1 = udiv <8 x i16> %a0, <i16 1, i16 119, i16 73, i16 -111, i16 -3, i16 118, i16 32, i16 31>236  ret <8 x i16> %1237}238 239define i32 @udiv_div_by_180(i32 %x)240; SDAG-LABEL: udiv_div_by_180:241; SDAG:       // %bb.0:242; SDAG-NEXT:    mov w8, #5826 // =0x16c2243; SDAG-NEXT:    and w9, w0, #0xff244; SDAG-NEXT:    movk w8, #364, lsl #16245; SDAG-NEXT:    umull x8, w9, w8246; SDAG-NEXT:    lsr x0, x8, #32247; SDAG-NEXT:    // kill: def $w0 killed $w0 killed $x0248; SDAG-NEXT:    ret249;250; GISEL-LABEL: udiv_div_by_180:251; GISEL:       // %bb.0:252; GISEL-NEXT:    mov w8, #5826 // =0x16c2253; GISEL-NEXT:    and w9, w0, #0xff254; GISEL-NEXT:    movk w8, #364, lsl #16255; GISEL-NEXT:    umull x8, w9, w8256; GISEL-NEXT:    lsr x0, x8, #32257; GISEL-NEXT:    // kill: def $w0 killed $w0 killed $x0258; GISEL-NEXT:    ret259{260  %truncate = and i32 %x, 255261  %udiv = udiv i32 %truncate, 180262  ret i32 %udiv263}264 265define i32 @udiv_div_by_180_exact(i32 %x)266; SDAG-LABEL: udiv_div_by_180_exact:267; SDAG:       // %bb.0:268; SDAG-NEXT:    lsr w8, w0, #2269; SDAG-NEXT:    mov w9, #20389 // =0x4fa5270; SDAG-NEXT:    movk w9, #42234, lsl #16271; SDAG-NEXT:    mul w0, w8, w9272; SDAG-NEXT:    ret273;274; GISEL-LABEL: udiv_div_by_180_exact:275; GISEL:       // %bb.0:276; GISEL-NEXT:    lsr w8, w0, #2277; GISEL-NEXT:    mov w9, #20389 // =0x4fa5278; GISEL-NEXT:    movk w9, #42234, lsl #16279; GISEL-NEXT:    mul w0, w8, w9280; GISEL-NEXT:    ret281{282  %udiv = udiv exact i32 %x, 180283  ret i32 %udiv284}285 286define <4 x i32> @udiv_div_by_104_exact(<4 x i32> %x)287; SDAG-LABEL: udiv_div_by_104_exact:288; SDAG:       // %bb.0:289; SDAG-NEXT:    adrp x8, .LCPI8_0290; SDAG-NEXT:    ushr v0.4s, v0.4s, #3291; SDAG-NEXT:    ldr q1, [x8, :lo12:.LCPI8_0]292; SDAG-NEXT:    mul v0.4s, v0.4s, v1.4s293; SDAG-NEXT:    ret294;295; GISEL-LABEL: udiv_div_by_104_exact:296; GISEL:       // %bb.0:297; GISEL-NEXT:    adrp x8, .LCPI8_0298; GISEL-NEXT:    ushr v0.4s, v0.4s, #3299; GISEL-NEXT:    ldr q1, [x8, :lo12:.LCPI8_0]300; GISEL-NEXT:    mul v0.4s, v0.4s, v1.4s301; GISEL-NEXT:    ret302{303  %udiv = udiv exact <4 x i32> %x, <i32 104, i32 72, i32 104, i32 72>304  ret <4 x i32> %udiv305}306