brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.8 KiB · f8b600c Raw
369 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc < %s -mtriple=sparc | FileCheck %s3; RUN: llc < %s -mtriple=sparcel | FileCheck %s --check-prefix=CHECK-LE4; RUN: llc < %s -mtriple=sparcv9 -mattr=+vis | FileCheck %s --check-prefix=CHECK-VIS5; RUN: llc < %s -mtriple=sparcv9 -mattr=+vis,+vis3 | FileCheck %s --check-prefix=CHECK-VIS36 7;; Bitcast should not do a runtime conversion, but rather emit a8;; constant into integer registers directly.9 10define <2 x i32> @bitcast() nounwind {11; CHECK-LABEL: bitcast:12; CHECK:       ! %bb.0:13; CHECK-NEXT:    sethi 1049856, %o014; CHECK-NEXT:    retl15; CHECK-NEXT:    mov %g0, %o116;17; CHECK-LE-LABEL: bitcast:18; CHECK-LE:       ! %bb.0:19; CHECK-LE-NEXT:    sethi 1049856, %o120; CHECK-LE-NEXT:    retl21; CHECK-LE-NEXT:    mov %g0, %o022;23; CHECK-VIS-LABEL: bitcast:24; CHECK-VIS:       ! %bb.0:25; CHECK-VIS-NEXT:    sethi 1049856, %o026; CHECK-VIS-NEXT:    retl27; CHECK-VIS-NEXT:    mov %g0, %o128;29; CHECK-VIS3-LABEL: bitcast:30; CHECK-VIS3:       ! %bb.0:31; CHECK-VIS3-NEXT:    sethi 1049856, %o032; CHECK-VIS3-NEXT:    retl33; CHECK-VIS3-NEXT:    mov %g0, %o134  %1 = bitcast double 5.0 to <2 x i32>35  ret <2 x i32> %136}37 38;; Same thing for a call using a double (which gets passed in integer39;; registers)40 41declare void @a(double)42define void @test_call() nounwind {43; CHECK-LABEL: test_call:44; CHECK:       ! %bb.0:45; CHECK-NEXT:    save %sp, -96, %sp46; CHECK-NEXT:    sethi 1049856, %o047; CHECK-NEXT:    call a48; CHECK-NEXT:    mov %g0, %o149; CHECK-NEXT:    ret50; CHECK-NEXT:    restore51;52; CHECK-LE-LABEL: test_call:53; CHECK-LE:       ! %bb.0:54; CHECK-LE-NEXT:    save %sp, -96, %sp55; CHECK-LE-NEXT:    sethi 1049856, %o156; CHECK-LE-NEXT:    call a57; CHECK-LE-NEXT:    mov %g0, %o058; CHECK-LE-NEXT:    ret59; CHECK-LE-NEXT:    restore60;61; CHECK-VIS-LABEL: test_call:62; CHECK-VIS:       ! %bb.0:63; CHECK-VIS-NEXT:    save %sp, -176, %sp64; CHECK-VIS-NEXT:    sethi %h44(.LCPI1_0), %i065; CHECK-VIS-NEXT:    add %i0, %m44(.LCPI1_0), %i066; CHECK-VIS-NEXT:    sllx %i0, 12, %i067; CHECK-VIS-NEXT:    call a68; CHECK-VIS-NEXT:    ldd [%i0+%l44(.LCPI1_0)], %f069; CHECK-VIS-NEXT:    ret70; CHECK-VIS-NEXT:    restore71;72; CHECK-VIS3-LABEL: test_call:73; CHECK-VIS3:       ! %bb.0:74; CHECK-VIS3-NEXT:    save %sp, -176, %sp75; CHECK-VIS3-NEXT:    sethi %h44(.LCPI1_0), %i076; CHECK-VIS3-NEXT:    add %i0, %m44(.LCPI1_0), %i077; CHECK-VIS3-NEXT:    sllx %i0, 12, %i078; CHECK-VIS3-NEXT:    call a79; CHECK-VIS3-NEXT:    ldd [%i0+%l44(.LCPI1_0)], %f080; CHECK-VIS3-NEXT:    ret81; CHECK-VIS3-NEXT:    restore82  call void @a(double 5.0)83  ret void84}85 86;; And for a libcall emitted from the pow intrinsic.  (libcall87;; emission happens after SelectionDAG type legalization, so is a bit88;; different than a normal function call. This was crashing before,89;; due to an earlier broken workaround for this issue.)90 91declare double @llvm.pow.f64(double, double)92define double @test_intrins_call() nounwind {93; CHECK-LABEL: test_intrins_call:94; CHECK:       ! %bb.0:95; CHECK-NEXT:    save %sp, -96, %sp96; CHECK-NEXT:    sethi 1048576, %o097; CHECK-NEXT:    mov %g0, %o198; CHECK-NEXT:    mov %o0, %o299; CHECK-NEXT:    call pow100; CHECK-NEXT:    mov %g0, %o3101; CHECK-NEXT:    ret102; CHECK-NEXT:    restore103;104; CHECK-LE-LABEL: test_intrins_call:105; CHECK-LE:       ! %bb.0:106; CHECK-LE-NEXT:    save %sp, -96, %sp107; CHECK-LE-NEXT:    sethi 1048576, %o1108; CHECK-LE-NEXT:    mov %g0, %o0109; CHECK-LE-NEXT:    mov %g0, %o2110; CHECK-LE-NEXT:    call pow111; CHECK-LE-NEXT:    mov %o1, %o3112; CHECK-LE-NEXT:    ret113; CHECK-LE-NEXT:    restore114;115; CHECK-VIS-LABEL: test_intrins_call:116; CHECK-VIS:       ! %bb.0:117; CHECK-VIS-NEXT:    save %sp, -176, %sp118; CHECK-VIS-NEXT:    sethi %h44(.LCPI2_0), %i0119; CHECK-VIS-NEXT:    add %i0, %m44(.LCPI2_0), %i0120; CHECK-VIS-NEXT:    sllx %i0, 12, %i0121; CHECK-VIS-NEXT:    ldd [%i0+%l44(.LCPI2_0)], %f0122; CHECK-VIS-NEXT:    fmovd %f0, %f2123; CHECK-VIS-NEXT:    call pow124; CHECK-VIS-NEXT:    nop125; CHECK-VIS-NEXT:    ret126; CHECK-VIS-NEXT:    restore127;128; CHECK-VIS3-LABEL: test_intrins_call:129; CHECK-VIS3:       ! %bb.0:130; CHECK-VIS3-NEXT:    save %sp, -176, %sp131; CHECK-VIS3-NEXT:    sethi %h44(.LCPI2_0), %i0132; CHECK-VIS3-NEXT:    add %i0, %m44(.LCPI2_0), %i0133; CHECK-VIS3-NEXT:    sllx %i0, 12, %i0134; CHECK-VIS3-NEXT:    ldd [%i0+%l44(.LCPI2_0)], %f0135; CHECK-VIS3-NEXT:    fmovd %f0, %f2136; CHECK-VIS3-NEXT:    call pow137; CHECK-VIS3-NEXT:    nop138; CHECK-VIS3-NEXT:    ret139; CHECK-VIS3-NEXT:    restore140  %1 = call double @llvm.pow.f64(double 2.0, double 2.0)141  ret double %1142}143 144;; When we have VIS, f32/f64 zero constant should be materialized from fzero/fzeros.145 146define double @pos_zero_double() nounwind {147; CHECK-LABEL: pos_zero_double:148; CHECK:       ! %bb.0:149; CHECK-NEXT:    sethi %hi(.LCPI3_0), %o0150; CHECK-NEXT:    retl151; CHECK-NEXT:    ldd [%o0+%lo(.LCPI3_0)], %f0152;153; CHECK-LE-LABEL: pos_zero_double:154; CHECK-LE:       ! %bb.0:155; CHECK-LE-NEXT:    sethi %hi(.LCPI3_0), %o0156; CHECK-LE-NEXT:    retl157; CHECK-LE-NEXT:    ldd [%o0+%lo(.LCPI3_0)], %f0158;159; CHECK-VIS-LABEL: pos_zero_double:160; CHECK-VIS:       ! %bb.0:161; CHECK-VIS-NEXT:    retl162; CHECK-VIS-NEXT:    fzero %f0163;164; CHECK-VIS3-LABEL: pos_zero_double:165; CHECK-VIS3:       ! %bb.0:166; CHECK-VIS3-NEXT:    retl167; CHECK-VIS3-NEXT:    fzero %f0168  ret double +0.0169}170 171define double @neg_zero_double() nounwind {172; CHECK-LABEL: neg_zero_double:173; CHECK:       ! %bb.0:174; CHECK-NEXT:    sethi %hi(.LCPI4_0), %o0175; CHECK-NEXT:    retl176; CHECK-NEXT:    ldd [%o0+%lo(.LCPI4_0)], %f0177;178; CHECK-LE-LABEL: neg_zero_double:179; CHECK-LE:       ! %bb.0:180; CHECK-LE-NEXT:    sethi %hi(.LCPI4_0), %o0181; CHECK-LE-NEXT:    retl182; CHECK-LE-NEXT:    ldd [%o0+%lo(.LCPI4_0)], %f0183;184; CHECK-VIS-LABEL: neg_zero_double:185; CHECK-VIS:       ! %bb.0:186; CHECK-VIS-NEXT:    fzero %f0187; CHECK-VIS-NEXT:    retl188; CHECK-VIS-NEXT:    fnegd %f0, %f0189;190; CHECK-VIS3-LABEL: neg_zero_double:191; CHECK-VIS3:       ! %bb.0:192; CHECK-VIS3-NEXT:    fzero %f0193; CHECK-VIS3-NEXT:    retl194; CHECK-VIS3-NEXT:    fnegd %f0, %f0195  ret double -0.0196}197 198define float @pos_zero_float() nounwind {199; CHECK-LABEL: pos_zero_float:200; CHECK:       ! %bb.0:201; CHECK-NEXT:    sethi %hi(.LCPI5_0), %o0202; CHECK-NEXT:    retl203; CHECK-NEXT:    ld [%o0+%lo(.LCPI5_0)], %f0204;205; CHECK-LE-LABEL: pos_zero_float:206; CHECK-LE:       ! %bb.0:207; CHECK-LE-NEXT:    sethi %hi(.LCPI5_0), %o0208; CHECK-LE-NEXT:    retl209; CHECK-LE-NEXT:    ld [%o0+%lo(.LCPI5_0)], %f0210;211; CHECK-VIS-LABEL: pos_zero_float:212; CHECK-VIS:       ! %bb.0:213; CHECK-VIS-NEXT:    retl214; CHECK-VIS-NEXT:    fzeros %f0215;216; CHECK-VIS3-LABEL: pos_zero_float:217; CHECK-VIS3:       ! %bb.0:218; CHECK-VIS3-NEXT:    retl219; CHECK-VIS3-NEXT:    fzeros %f0220  ret float +0.0221}222 223define float @neg_zero_float() nounwind {224; CHECK-LABEL: neg_zero_float:225; CHECK:       ! %bb.0:226; CHECK-NEXT:    sethi %hi(.LCPI6_0), %o0227; CHECK-NEXT:    retl228; CHECK-NEXT:    ld [%o0+%lo(.LCPI6_0)], %f0229;230; CHECK-LE-LABEL: neg_zero_float:231; CHECK-LE:       ! %bb.0:232; CHECK-LE-NEXT:    sethi %hi(.LCPI6_0), %o0233; CHECK-LE-NEXT:    retl234; CHECK-LE-NEXT:    ld [%o0+%lo(.LCPI6_0)], %f0235;236; CHECK-VIS-LABEL: neg_zero_float:237; CHECK-VIS:       ! %bb.0:238; CHECK-VIS-NEXT:    fzeros %f0239; CHECK-VIS-NEXT:    retl240; CHECK-VIS-NEXT:    fnegs %f0, %f0241;242; CHECK-VIS3-LABEL: neg_zero_float:243; CHECK-VIS3:       ! %bb.0:244; CHECK-VIS3-NEXT:    fzeros %f0245; CHECK-VIS3-NEXT:    retl246; CHECK-VIS3-NEXT:    fnegs %f0, %f0247  ret float -0.0248}249 250;; When we have VIS3, f32/f64 +/-0.5 constant should be materialized from sethi.251 252define double @pos_half_double() nounwind {253; CHECK-LABEL: pos_half_double:254; CHECK:       ! %bb.0:255; CHECK-NEXT:    sethi %hi(.LCPI7_0), %o0256; CHECK-NEXT:    retl257; CHECK-NEXT:    ldd [%o0+%lo(.LCPI7_0)], %f0258;259; CHECK-LE-LABEL: pos_half_double:260; CHECK-LE:       ! %bb.0:261; CHECK-LE-NEXT:    sethi %hi(.LCPI7_0), %o0262; CHECK-LE-NEXT:    retl263; CHECK-LE-NEXT:    ldd [%o0+%lo(.LCPI7_0)], %f0264;265; CHECK-VIS-LABEL: pos_half_double:266; CHECK-VIS:       ! %bb.0:267; CHECK-VIS-NEXT:    sethi %h44(.LCPI7_0), %o0268; CHECK-VIS-NEXT:    add %o0, %m44(.LCPI7_0), %o0269; CHECK-VIS-NEXT:    sllx %o0, 12, %o0270; CHECK-VIS-NEXT:    retl271; CHECK-VIS-NEXT:    ldd [%o0+%l44(.LCPI7_0)], %f0272;273; CHECK-VIS3-LABEL: pos_half_double:274; CHECK-VIS3:       ! %bb.0:275; CHECK-VIS3-NEXT:    sethi 1046528, %o0276; CHECK-VIS3-NEXT:    sllx %o0, 32, %o0277; CHECK-VIS3-NEXT:    retl278; CHECK-VIS3-NEXT:    movxtod %o0, %f0279  ret double +0.5280}281 282define double @neg_half_double() nounwind {283; CHECK-LABEL: neg_half_double:284; CHECK:       ! %bb.0:285; CHECK-NEXT:    sethi %hi(.LCPI8_0), %o0286; CHECK-NEXT:    retl287; CHECK-NEXT:    ldd [%o0+%lo(.LCPI8_0)], %f0288;289; CHECK-LE-LABEL: neg_half_double:290; CHECK-LE:       ! %bb.0:291; CHECK-LE-NEXT:    sethi %hi(.LCPI8_0), %o0292; CHECK-LE-NEXT:    retl293; CHECK-LE-NEXT:    ldd [%o0+%lo(.LCPI8_0)], %f0294;295; CHECK-VIS-LABEL: neg_half_double:296; CHECK-VIS:       ! %bb.0:297; CHECK-VIS-NEXT:    sethi %h44(.LCPI8_0), %o0298; CHECK-VIS-NEXT:    add %o0, %m44(.LCPI8_0), %o0299; CHECK-VIS-NEXT:    sllx %o0, 12, %o0300; CHECK-VIS-NEXT:    retl301; CHECK-VIS-NEXT:    ldd [%o0+%l44(.LCPI8_0)], %f0302;303; CHECK-VIS3-LABEL: neg_half_double:304; CHECK-VIS3:       ! %bb.0:305; CHECK-VIS3-NEXT:    sethi 3143680, %o0306; CHECK-VIS3-NEXT:    sllx %o0, 32, %o0307; CHECK-VIS3-NEXT:    retl308; CHECK-VIS3-NEXT:    movxtod %o0, %f0309  ret double -0.5310}311 312define float @pos_half_float() nounwind {313; CHECK-LABEL: pos_half_float:314; CHECK:       ! %bb.0:315; CHECK-NEXT:    sethi %hi(.LCPI9_0), %o0316; CHECK-NEXT:    retl317; CHECK-NEXT:    ld [%o0+%lo(.LCPI9_0)], %f0318;319; CHECK-LE-LABEL: pos_half_float:320; CHECK-LE:       ! %bb.0:321; CHECK-LE-NEXT:    sethi %hi(.LCPI9_0), %o0322; CHECK-LE-NEXT:    retl323; CHECK-LE-NEXT:    ld [%o0+%lo(.LCPI9_0)], %f0324;325; CHECK-VIS-LABEL: pos_half_float:326; CHECK-VIS:       ! %bb.0:327; CHECK-VIS-NEXT:    sethi %h44(.LCPI9_0), %o0328; CHECK-VIS-NEXT:    add %o0, %m44(.LCPI9_0), %o0329; CHECK-VIS-NEXT:    sllx %o0, 12, %o0330; CHECK-VIS-NEXT:    retl331; CHECK-VIS-NEXT:    ld [%o0+%l44(.LCPI9_0)], %f0332;333; CHECK-VIS3-LABEL: pos_half_float:334; CHECK-VIS3:       ! %bb.0:335; CHECK-VIS3-NEXT:    sethi 1032192, %o0336; CHECK-VIS3-NEXT:    retl337; CHECK-VIS3-NEXT:    movwtos %o0, %f0338  ret float +0.5339}340 341define float @neg_half_float() nounwind {342; CHECK-LABEL: neg_half_float:343; CHECK:       ! %bb.0:344; CHECK-NEXT:    sethi %hi(.LCPI10_0), %o0345; CHECK-NEXT:    retl346; CHECK-NEXT:    ld [%o0+%lo(.LCPI10_0)], %f0347;348; CHECK-LE-LABEL: neg_half_float:349; CHECK-LE:       ! %bb.0:350; CHECK-LE-NEXT:    sethi %hi(.LCPI10_0), %o0351; CHECK-LE-NEXT:    retl352; CHECK-LE-NEXT:    ld [%o0+%lo(.LCPI10_0)], %f0353;354; CHECK-VIS-LABEL: neg_half_float:355; CHECK-VIS:       ! %bb.0:356; CHECK-VIS-NEXT:    sethi %h44(.LCPI10_0), %o0357; CHECK-VIS-NEXT:    add %o0, %m44(.LCPI10_0), %o0358; CHECK-VIS-NEXT:    sllx %o0, 12, %o0359; CHECK-VIS-NEXT:    retl360; CHECK-VIS-NEXT:    ld [%o0+%l44(.LCPI10_0)], %f0361;362; CHECK-VIS3-LABEL: neg_half_float:363; CHECK-VIS3:       ! %bb.0:364; CHECK-VIS3-NEXT:    sethi 3129344, %o0365; CHECK-VIS3-NEXT:    retl366; CHECK-VIS3-NEXT:    movwtos %o0, %f0367  ret float -0.5368}369