1266 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mtriple=sparc-unknown-linux < %s | FileCheck -check-prefix=SPARC32 %s3; RUN: llc -mtriple=sparc-unknown-solaris < %s | FileCheck -check-prefix=SPARC32 %s4; RUN: llc -mtriple=sparc64-unknown-solaris < %s | FileCheck -check-prefix=SPARC64 %s5; RUN: llc -mtriple=sparc64-unknown-linux < %s | FileCheck -check-prefix=SPARC64 %s6; RUN: llc -mtriple=sparc-unknown-linux-gnu < %s | FileCheck -check-prefix=GNU32 %s7; RUN: llc -mtriple=sparc64-unknown-linux-gnu < %s | FileCheck -check-prefix=GNU64 %s8 9define { half, half } @test_sincos_f16(half %a) #0 {10; SPARC32-LABEL: test_sincos_f16:11; SPARC32: ! %bb.0:12; SPARC32-NEXT: save %sp, -104, %sp13; SPARC32-NEXT: call __extendhfsf214; SPARC32-NEXT: mov %i0, %o015; SPARC32-NEXT: st %f0, [%fp+-12]16; SPARC32-NEXT: ld [%fp+-12], %i017; SPARC32-NEXT: call sinf18; SPARC32-NEXT: mov %i0, %o019; SPARC32-NEXT: st %f0, [%fp+-8]20; SPARC32-NEXT: call cosf21; SPARC32-NEXT: mov %i0, %o022; SPARC32-NEXT: st %f0, [%fp+-4]23; SPARC32-NEXT: call __truncsfhf224; SPARC32-NEXT: ld [%fp+-8], %o025; SPARC32-NEXT: mov %o0, %i026; SPARC32-NEXT: call __truncsfhf227; SPARC32-NEXT: ld [%fp+-4], %o028; SPARC32-NEXT: ret29; SPARC32-NEXT: restore %g0, %o0, %o130;31; SPARC64-LABEL: test_sincos_f16:32; SPARC64: ! %bb.0:33; SPARC64-NEXT: save %sp, -192, %sp34; SPARC64-NEXT: call __extendhfsf235; SPARC64-NEXT: srl %i0, 0, %o036; SPARC64-NEXT: st %f0, [%fp+2043] ! 4-byte Folded Spill37; SPARC64-NEXT: fmovs %f0, %f138; SPARC64-NEXT: call sinf39; SPARC64-NEXT: nop40; SPARC64-NEXT: fmovs %f0, %f141; SPARC64-NEXT: call __truncsfhf242; SPARC64-NEXT: nop43; SPARC64-NEXT: mov %o0, %i044; SPARC64-NEXT: call cosf45; SPARC64-NEXT: ld [%fp+2043], %f146; SPARC64-NEXT: fmovs %f0, %f147; SPARC64-NEXT: call __truncsfhf248; SPARC64-NEXT: nop49; SPARC64-NEXT: ret50; SPARC64-NEXT: restore %g0, %o0, %o151;52; GNU32-LABEL: test_sincos_f16:53; GNU32: ! %bb.0:54; GNU32-NEXT: save %sp, -112, %sp55; GNU32-NEXT: call __extendhfsf256; GNU32-NEXT: mov %i0, %o057; GNU32-NEXT: st %f0, [%fp+-12]58; GNU32-NEXT: ld [%fp+-12], %o059; GNU32-NEXT: add %fp, -4, %o160; GNU32-NEXT: call sincosf61; GNU32-NEXT: add %fp, -8, %o262; GNU32-NEXT: ld [%fp+-4], %f063; GNU32-NEXT: st %f0, [%fp+-20]64; GNU32-NEXT: ld [%fp+-8], %f065; GNU32-NEXT: st %f0, [%fp+-16]66; GNU32-NEXT: call __truncsfhf267; GNU32-NEXT: ld [%fp+-20], %o068; GNU32-NEXT: mov %o0, %i069; GNU32-NEXT: call __truncsfhf270; GNU32-NEXT: ld [%fp+-16], %o071; GNU32-NEXT: ret72; GNU32-NEXT: restore %g0, %o0, %o173;74; GNU64-LABEL: test_sincos_f16:75; GNU64: ! %bb.0:76; GNU64-NEXT: save %sp, -192, %sp77; GNU64-NEXT: call __extendhfsf278; GNU64-NEXT: srl %i0, 0, %o079; GNU64-NEXT: add %fp, 2043, %o180; GNU64-NEXT: add %fp, 2039, %o281; GNU64-NEXT: fmovs %f0, %f182; GNU64-NEXT: call sincosf83; GNU64-NEXT: nop84; GNU64-NEXT: call __truncsfhf285; GNU64-NEXT: ld [%fp+2043], %f186; GNU64-NEXT: mov %o0, %i087; GNU64-NEXT: call __truncsfhf288; GNU64-NEXT: ld [%fp+2039], %f189; GNU64-NEXT: ret90; GNU64-NEXT: restore %g0, %o0, %o191 %result = call { half, half } @llvm.sincos.f16(half %a)92 ret { half, half } %result93}94 95define half @test_sincos_f16_only_use_sin(half %a) #0 {96; SPARC32-LABEL: test_sincos_f16_only_use_sin:97; SPARC32: ! %bb.0:98; SPARC32-NEXT: save %sp, -104, %sp99; SPARC32-NEXT: call __extendhfsf2100; SPARC32-NEXT: mov %i0, %o0101; SPARC32-NEXT: st %f0, [%fp+-8]102; SPARC32-NEXT: call sinf103; SPARC32-NEXT: ld [%fp+-8], %o0104; SPARC32-NEXT: st %f0, [%fp+-4]105; SPARC32-NEXT: call __truncsfhf2106; SPARC32-NEXT: ld [%fp+-4], %o0107; SPARC32-NEXT: ret108; SPARC32-NEXT: restore %g0, %o0, %o0109;110; SPARC64-LABEL: test_sincos_f16_only_use_sin:111; SPARC64: ! %bb.0:112; SPARC64-NEXT: save %sp, -176, %sp113; SPARC64-NEXT: call __extendhfsf2114; SPARC64-NEXT: srl %i0, 0, %o0115; SPARC64-NEXT: fmovs %f0, %f1116; SPARC64-NEXT: call sinf117; SPARC64-NEXT: nop118; SPARC64-NEXT: fmovs %f0, %f1119; SPARC64-NEXT: call __truncsfhf2120; SPARC64-NEXT: nop121; SPARC64-NEXT: ret122; SPARC64-NEXT: restore %g0, %o0, %o0123;124; GNU32-LABEL: test_sincos_f16_only_use_sin:125; GNU32: ! %bb.0:126; GNU32-NEXT: save %sp, -112, %sp127; GNU32-NEXT: call __extendhfsf2128; GNU32-NEXT: mov %i0, %o0129; GNU32-NEXT: st %f0, [%fp+-12]130; GNU32-NEXT: ld [%fp+-12], %o0131; GNU32-NEXT: add %fp, -4, %o1132; GNU32-NEXT: call sincosf133; GNU32-NEXT: add %fp, -8, %o2134; GNU32-NEXT: ld [%fp+-4], %f0135; GNU32-NEXT: st %f0, [%fp+-16]136; GNU32-NEXT: call __truncsfhf2137; GNU32-NEXT: ld [%fp+-16], %o0138; GNU32-NEXT: ret139; GNU32-NEXT: restore %g0, %o0, %o0140;141; GNU64-LABEL: test_sincos_f16_only_use_sin:142; GNU64: ! %bb.0:143; GNU64-NEXT: save %sp, -192, %sp144; GNU64-NEXT: call __extendhfsf2145; GNU64-NEXT: srl %i0, 0, %o0146; GNU64-NEXT: add %fp, 2043, %o1147; GNU64-NEXT: add %fp, 2039, %o2148; GNU64-NEXT: fmovs %f0, %f1149; GNU64-NEXT: call sincosf150; GNU64-NEXT: nop151; GNU64-NEXT: call __truncsfhf2152; GNU64-NEXT: ld [%fp+2043], %f1153; GNU64-NEXT: ret154; GNU64-NEXT: restore %g0, %o0, %o0155 %result = call { half, half } @llvm.sincos.f16(half %a)156 %result.0 = extractvalue { half, half } %result, 0157 ret half %result.0158}159 160define half @test_sincos_f16_only_use_cos(half %a) #0 {161; SPARC32-LABEL: test_sincos_f16_only_use_cos:162; SPARC32: ! %bb.0:163; SPARC32-NEXT: save %sp, -104, %sp164; SPARC32-NEXT: call __extendhfsf2165; SPARC32-NEXT: mov %i0, %o0166; SPARC32-NEXT: st %f0, [%fp+-8]167; SPARC32-NEXT: call cosf168; SPARC32-NEXT: ld [%fp+-8], %o0169; SPARC32-NEXT: st %f0, [%fp+-4]170; SPARC32-NEXT: call __truncsfhf2171; SPARC32-NEXT: ld [%fp+-4], %o0172; SPARC32-NEXT: ret173; SPARC32-NEXT: restore %g0, %o0, %o0174;175; SPARC64-LABEL: test_sincos_f16_only_use_cos:176; SPARC64: ! %bb.0:177; SPARC64-NEXT: save %sp, -176, %sp178; SPARC64-NEXT: call __extendhfsf2179; SPARC64-NEXT: srl %i0, 0, %o0180; SPARC64-NEXT: fmovs %f0, %f1181; SPARC64-NEXT: call cosf182; SPARC64-NEXT: nop183; SPARC64-NEXT: fmovs %f0, %f1184; SPARC64-NEXT: call __truncsfhf2185; SPARC64-NEXT: nop186; SPARC64-NEXT: ret187; SPARC64-NEXT: restore %g0, %o0, %o0188;189; GNU32-LABEL: test_sincos_f16_only_use_cos:190; GNU32: ! %bb.0:191; GNU32-NEXT: save %sp, -112, %sp192; GNU32-NEXT: call __extendhfsf2193; GNU32-NEXT: mov %i0, %o0194; GNU32-NEXT: st %f0, [%fp+-12]195; GNU32-NEXT: ld [%fp+-12], %o0196; GNU32-NEXT: add %fp, -4, %o1197; GNU32-NEXT: call sincosf198; GNU32-NEXT: add %fp, -8, %o2199; GNU32-NEXT: ld [%fp+-8], %f0200; GNU32-NEXT: st %f0, [%fp+-16]201; GNU32-NEXT: call __truncsfhf2202; GNU32-NEXT: ld [%fp+-16], %o0203; GNU32-NEXT: ret204; GNU32-NEXT: restore %g0, %o0, %o0205;206; GNU64-LABEL: test_sincos_f16_only_use_cos:207; GNU64: ! %bb.0:208; GNU64-NEXT: save %sp, -192, %sp209; GNU64-NEXT: call __extendhfsf2210; GNU64-NEXT: srl %i0, 0, %o0211; GNU64-NEXT: add %fp, 2043, %o1212; GNU64-NEXT: add %fp, 2039, %o2213; GNU64-NEXT: fmovs %f0, %f1214; GNU64-NEXT: call sincosf215; GNU64-NEXT: nop216; GNU64-NEXT: call __truncsfhf2217; GNU64-NEXT: ld [%fp+2039], %f1218; GNU64-NEXT: ret219; GNU64-NEXT: restore %g0, %o0, %o0220 %result = call { half, half } @llvm.sincos.f16(half %a)221 %result.1 = extractvalue { half, half } %result, 1222 ret half %result.1223}224 225define { <2 x half>, <2 x half> } @test_sincos_v2f16(<2 x half> %a) #0 {226; SPARC32-LABEL: test_sincos_v2f16:227; SPARC32: ! %bb.0:228; SPARC32-NEXT: save %sp, -128, %sp229; SPARC32-NEXT: call __extendhfsf2230; SPARC32-NEXT: mov %i1, %o0231; SPARC32-NEXT: st %f0, [%fp+-28]232; SPARC32-NEXT: call __extendhfsf2233; SPARC32-NEXT: mov %i0, %o0234; SPARC32-NEXT: st %f0, [%fp+-32]235; SPARC32-NEXT: ld [%fp+-28], %i0236; SPARC32-NEXT: call cosf237; SPARC32-NEXT: mov %i0, %o0238; SPARC32-NEXT: st %f0, [%fp+-20]239; SPARC32-NEXT: ld [%fp+-32], %i1240; SPARC32-NEXT: call cosf241; SPARC32-NEXT: mov %i1, %o0242; SPARC32-NEXT: st %f0, [%fp+-12]243; SPARC32-NEXT: call sinf244; SPARC32-NEXT: mov %i0, %o0245; SPARC32-NEXT: st %f0, [%fp+-24]246; SPARC32-NEXT: call sinf247; SPARC32-NEXT: mov %i1, %o0248; SPARC32-NEXT: st %f0, [%fp+-16]249; SPARC32-NEXT: call __truncsfhf2250; SPARC32-NEXT: ld [%fp+-20], %o0251; SPARC32-NEXT: sethi 63, %i0252; SPARC32-NEXT: or %i0, 1023, %i0253; SPARC32-NEXT: and %o0, %i0, %i4254; SPARC32-NEXT: call __truncsfhf2255; SPARC32-NEXT: ld [%fp+-12], %o0256; SPARC32-NEXT: and %o0, %i0, %i2257; SPARC32-NEXT: call __truncsfhf2258; SPARC32-NEXT: ld [%fp+-24], %o0259; SPARC32-NEXT: and %o0, %i0, %i1260; SPARC32-NEXT: call __truncsfhf2261; SPARC32-NEXT: ld [%fp+-16], %o0262; SPARC32-NEXT: and %o0, %i0, %g2263; SPARC32-NEXT: mov %g2, %i0264; SPARC32-NEXT: ! kill: def $i2 killed $i2 killed $i2_i3265; SPARC32-NEXT: ret266; SPARC32-NEXT: restore %g0, %i4, %o3267;268; SPARC64-LABEL: test_sincos_v2f16:269; SPARC64: ! %bb.0:270; SPARC64-NEXT: save %sp, -192, %sp271; SPARC64-NEXT: call __extendhfsf2272; SPARC64-NEXT: srl %i0, 0, %o0273; SPARC64-NEXT: st %f0, [%fp+2043] ! 4-byte Folded Spill274; SPARC64-NEXT: fmovs %f0, %f1275; SPARC64-NEXT: call sinf276; SPARC64-NEXT: nop277; SPARC64-NEXT: fmovs %f0, %f1278; SPARC64-NEXT: call __truncsfhf2279; SPARC64-NEXT: nop280; SPARC64-NEXT: mov %o0, %i0281; SPARC64-NEXT: call __extendhfsf2282; SPARC64-NEXT: srl %i1, 0, %o0283; SPARC64-NEXT: st %f0, [%fp+2039] ! 4-byte Folded Spill284; SPARC64-NEXT: fmovs %f0, %f1285; SPARC64-NEXT: call sinf286; SPARC64-NEXT: nop287; SPARC64-NEXT: fmovs %f0, %f1288; SPARC64-NEXT: call __truncsfhf2289; SPARC64-NEXT: nop290; SPARC64-NEXT: mov %o0, %i1291; SPARC64-NEXT: call cosf292; SPARC64-NEXT: ld [%fp+2043], %f1293; SPARC64-NEXT: fmovs %f0, %f1294; SPARC64-NEXT: call __truncsfhf2295; SPARC64-NEXT: nop296; SPARC64-NEXT: mov %o0, %i2297; SPARC64-NEXT: call cosf298; SPARC64-NEXT: ld [%fp+2039], %f1299; SPARC64-NEXT: fmovs %f0, %f1300; SPARC64-NEXT: call __truncsfhf2301; SPARC64-NEXT: nop302; SPARC64-NEXT: ret303; SPARC64-NEXT: restore %g0, %o0, %o3304;305; GNU32-LABEL: test_sincos_v2f16:306; GNU32: ! %bb.0:307; GNU32-NEXT: save %sp, -144, %sp308; GNU32-NEXT: call __extendhfsf2309; GNU32-NEXT: mov %i1, %o0310; GNU32-NEXT: st %f0, [%fp+-32]311; GNU32-NEXT: ld [%fp+-32], %o0312; GNU32-NEXT: add %fp, -12, %o1313; GNU32-NEXT: call sincosf314; GNU32-NEXT: add %fp, -16, %o2315; GNU32-NEXT: call __extendhfsf2316; GNU32-NEXT: mov %i0, %o0317; GNU32-NEXT: st %f0, [%fp+-28]318; GNU32-NEXT: ld [%fp+-28], %o0319; GNU32-NEXT: add %fp, -20, %o1320; GNU32-NEXT: call sincosf321; GNU32-NEXT: add %fp, -24, %o2322; GNU32-NEXT: ld [%fp+-16], %f0323; GNU32-NEXT: st %f0, [%fp+-44]324; GNU32-NEXT: ld [%fp+-24], %f0325; GNU32-NEXT: st %f0, [%fp+-36]326; GNU32-NEXT: ld [%fp+-12], %f0327; GNU32-NEXT: st %f0, [%fp+-48]328; GNU32-NEXT: ld [%fp+-20], %f0329; GNU32-NEXT: st %f0, [%fp+-40]330; GNU32-NEXT: call __truncsfhf2331; GNU32-NEXT: ld [%fp+-44], %o0332; GNU32-NEXT: sethi 63, %i0333; GNU32-NEXT: or %i0, 1023, %i0334; GNU32-NEXT: and %o0, %i0, %i4335; GNU32-NEXT: call __truncsfhf2336; GNU32-NEXT: ld [%fp+-36], %o0337; GNU32-NEXT: and %o0, %i0, %i2338; GNU32-NEXT: call __truncsfhf2339; GNU32-NEXT: ld [%fp+-48], %o0340; GNU32-NEXT: and %o0, %i0, %i1341; GNU32-NEXT: call __truncsfhf2342; GNU32-NEXT: ld [%fp+-40], %o0343; GNU32-NEXT: and %o0, %i0, %g2344; GNU32-NEXT: mov %g2, %i0345; GNU32-NEXT: ! kill: def $i2 killed $i2 killed $i2_i3346; GNU32-NEXT: ret347; GNU32-NEXT: restore %g0, %i4, %o3348;349; GNU64-LABEL: test_sincos_v2f16:350; GNU64: ! %bb.0:351; GNU64-NEXT: save %sp, -192, %sp352; GNU64-NEXT: call __extendhfsf2353; GNU64-NEXT: srl %i0, 0, %o0354; GNU64-NEXT: add %fp, 2035, %o1355; GNU64-NEXT: add %fp, 2031, %o2356; GNU64-NEXT: fmovs %f0, %f1357; GNU64-NEXT: call sincosf358; GNU64-NEXT: nop359; GNU64-NEXT: call __extendhfsf2360; GNU64-NEXT: srl %i1, 0, %o0361; GNU64-NEXT: add %fp, 2043, %o1362; GNU64-NEXT: add %fp, 2039, %o2363; GNU64-NEXT: fmovs %f0, %f1364; GNU64-NEXT: call sincosf365; GNU64-NEXT: nop366; GNU64-NEXT: call __truncsfhf2367; GNU64-NEXT: ld [%fp+2035], %f1368; GNU64-NEXT: mov %o0, %i0369; GNU64-NEXT: call __truncsfhf2370; GNU64-NEXT: ld [%fp+2043], %f1371; GNU64-NEXT: mov %o0, %i1372; GNU64-NEXT: call __truncsfhf2373; GNU64-NEXT: ld [%fp+2031], %f1374; GNU64-NEXT: mov %o0, %i2375; GNU64-NEXT: call __truncsfhf2376; GNU64-NEXT: ld [%fp+2039], %f1377; GNU64-NEXT: ret378; GNU64-NEXT: restore %g0, %o0, %o3379 %result = call { <2 x half>, <2 x half> } @llvm.sincos.v2f16(<2 x half> %a)380 ret { <2 x half>, <2 x half> } %result381}382 383define { float, float } @test_sincos_f32(float %a) #0 {384; SPARC32-LABEL: test_sincos_f32:385; SPARC32: ! %bb.0:386; SPARC32-NEXT: save %sp, -104, %sp387; SPARC32-NEXT: st %i0, [%fp+-4]388; SPARC32-NEXT: ld [%fp+-4], %f0389; SPARC32-NEXT: st %f0, [%fp+-8]390; SPARC32-NEXT: ld [%fp+-8], %i0391; SPARC32-NEXT: call sinf392; SPARC32-NEXT: mov %i0, %o0393; SPARC32-NEXT: st %f0, [%fp+-12] ! 4-byte Folded Spill394; SPARC32-NEXT: call cosf395; SPARC32-NEXT: mov %i0, %o0396; SPARC32-NEXT: fmovs %f0, %f1397; SPARC32-NEXT: ld [%fp+-12], %f0 ! 4-byte Folded Reload398; SPARC32-NEXT: ret399; SPARC32-NEXT: restore400;401; SPARC64-LABEL: test_sincos_f32:402; SPARC64: ! %bb.0:403; SPARC64-NEXT: save %sp, -192, %sp404; SPARC64-NEXT: call sinf405; SPARC64-NEXT: st %f1, [%fp+2039]406; SPARC64-NEXT: st %f0, [%fp+2043] ! 4-byte Folded Spill407; SPARC64-NEXT: call cosf408; SPARC64-NEXT: ld [%fp+2039], %f1409; SPARC64-NEXT: fmovs %f0, %f1410; SPARC64-NEXT: ld [%fp+2043], %f0 ! 4-byte Folded Reload411; SPARC64-NEXT: ret412; SPARC64-NEXT: restore413;414; GNU32-LABEL: test_sincos_f32:415; GNU32: ! %bb.0:416; GNU32-NEXT: save %sp, -104, %sp417; GNU32-NEXT: mov %i0, %o0418; GNU32-NEXT: add %fp, -4, %o1419; GNU32-NEXT: call sincosf420; GNU32-NEXT: add %fp, -8, %o2421; GNU32-NEXT: ld [%fp+-4], %f0422; GNU32-NEXT: ld [%fp+-8], %f1423; GNU32-NEXT: ret424; GNU32-NEXT: restore425;426; GNU64-LABEL: test_sincos_f32:427; GNU64: ! %bb.0:428; GNU64-NEXT: save %sp, -192, %sp429; GNU64-NEXT: add %fp, 2043, %o1430; GNU64-NEXT: call sincosf431; GNU64-NEXT: add %fp, 2039, %o2432; GNU64-NEXT: ld [%fp+2043], %f0433; GNU64-NEXT: ld [%fp+2039], %f1434; GNU64-NEXT: ret435; GNU64-NEXT: restore436 %result = call { float, float } @llvm.sincos.f32(float %a)437 ret { float, float } %result438}439 440define { <2 x float>, <2 x float> } @test_sincos_v2f32(<2 x float> %a) #0 {441; SPARC32-LABEL: test_sincos_v2f32:442; SPARC32: ! %bb.0:443; SPARC32-NEXT: save %sp, -120, %sp444; SPARC32-NEXT: st %i1, [%fp+-4]445; SPARC32-NEXT: st %i0, [%fp+-8]446; SPARC32-NEXT: ld [%fp+-8], %f0447; SPARC32-NEXT: ld [%fp+-4], %f1448; SPARC32-NEXT: st %f0, [%fp+-16]449; SPARC32-NEXT: st %f1, [%fp+-12]450; SPARC32-NEXT: ld [%fp+-16], %i0451; SPARC32-NEXT: call sinf452; SPARC32-NEXT: mov %i0, %o0453; SPARC32-NEXT: st %f0, [%fp+-20] ! 4-byte Folded Spill454; SPARC32-NEXT: ld [%fp+-12], %i1455; SPARC32-NEXT: call sinf456; SPARC32-NEXT: mov %i1, %o0457; SPARC32-NEXT: st %f0, [%fp+-24] ! 4-byte Folded Spill458; SPARC32-NEXT: call cosf459; SPARC32-NEXT: mov %i0, %o0460; SPARC32-NEXT: st %f0, [%fp+-28] ! 4-byte Folded Spill461; SPARC32-NEXT: call cosf462; SPARC32-NEXT: mov %i1, %o0463; SPARC32-NEXT: fmovs %f0, %f3464; SPARC32-NEXT: ld [%fp+-20], %f0 ! 4-byte Folded Reload465; SPARC32-NEXT: ld [%fp+-24], %f1 ! 4-byte Folded Reload466; SPARC32-NEXT: ld [%fp+-28], %f2 ! 4-byte Folded Reload467; SPARC32-NEXT: ret468; SPARC32-NEXT: restore469;470; SPARC64-LABEL: test_sincos_v2f32:471; SPARC64: ! %bb.0:472; SPARC64-NEXT: save %sp, -192, %sp473; SPARC64-NEXT: st %f3, [%fp+2043] ! 4-byte Folded Spill474; SPARC64-NEXT: call sinf475; SPARC64-NEXT: st %f1, [%fp+2031]476; SPARC64-NEXT: st %f0, [%fp+2039] ! 4-byte Folded Spill477; SPARC64-NEXT: call sinf478; SPARC64-NEXT: ld [%fp+2043], %f1479; SPARC64-NEXT: st %f0, [%fp+2035] ! 4-byte Folded Spill480; SPARC64-NEXT: call cosf481; SPARC64-NEXT: ld [%fp+2031], %f1482; SPARC64-NEXT: st %f0, [%fp+2031] ! 4-byte Folded Spill483; SPARC64-NEXT: call cosf484; SPARC64-NEXT: ld [%fp+2043], %f1485; SPARC64-NEXT: fmovs %f0, %f3486; SPARC64-NEXT: ld [%fp+2039], %f0 ! 4-byte Folded Reload487; SPARC64-NEXT: ld [%fp+2035], %f1 ! 4-byte Folded Reload488; SPARC64-NEXT: ld [%fp+2031], %f2 ! 4-byte Folded Reload489; SPARC64-NEXT: ret490; SPARC64-NEXT: restore491;492; GNU32-LABEL: test_sincos_v2f32:493; GNU32: ! %bb.0:494; GNU32-NEXT: save %sp, -112, %sp495; GNU32-NEXT: mov %i0, %o0496; GNU32-NEXT: add %fp, -12, %o1497; GNU32-NEXT: call sincosf498; GNU32-NEXT: add %fp, -16, %o2499; GNU32-NEXT: add %fp, -4, %o1500; GNU32-NEXT: add %fp, -8, %o2501; GNU32-NEXT: call sincosf502; GNU32-NEXT: mov %i1, %o0503; GNU32-NEXT: ld [%fp+-12], %f0504; GNU32-NEXT: ld [%fp+-4], %f1505; GNU32-NEXT: ld [%fp+-16], %f2506; GNU32-NEXT: ld [%fp+-8], %f3507; GNU32-NEXT: ret508; GNU32-NEXT: restore509;510; GNU64-LABEL: test_sincos_v2f32:511; GNU64: ! %bb.0:512; GNU64-NEXT: save %sp, -208, %sp513; GNU64-NEXT: st %f3, [%fp+2027] ! 4-byte Folded Spill514; GNU64-NEXT: add %fp, 2035, %o1515; GNU64-NEXT: call sincosf516; GNU64-NEXT: add %fp, 2031, %o2517; GNU64-NEXT: add %fp, 2043, %o1518; GNU64-NEXT: add %fp, 2039, %o2519; GNU64-NEXT: call sincosf520; GNU64-NEXT: ld [%fp+2027], %f1521; GNU64-NEXT: ld [%fp+2035], %f0522; GNU64-NEXT: ld [%fp+2043], %f1523; GNU64-NEXT: ld [%fp+2031], %f2524; GNU64-NEXT: ld [%fp+2039], %f3525; GNU64-NEXT: ret526; GNU64-NEXT: restore527; CHECKR2-LABEL: test_sincos_v2f32:528; CHECKR2: # %bb.0:529; CHECKR2-NEXT: daddiu $sp, $sp, -32530; CHECKR2-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill531; CHECKR2-NEXT: sd $16, 16($sp) # 8-byte Folded Spill532; CHECKR2-NEXT: move $16, $4533; CHECKR2-NEXT: dsrl $1, $4, 32534; CHECKR2-NEXT: sll $1, $1, 0535; CHECKR2-NEXT: mtc1 $1, $f12536; CHECKR2-NEXT: daddiu $5, $sp, 12537; CHECKR2-NEXT: jal sincosf538; CHECKR2-NEXT: daddiu $6, $sp, 8539; CHECKR2-NEXT: sll $1, $16, 0540; CHECKR2-NEXT: mtc1 $1, $f12541; CHECKR2-NEXT: daddiu $5, $sp, 4542; CHECKR2-NEXT: jal sincosf543; CHECKR2-NEXT: daddiu $6, $sp, 0544; CHECKR2-NEXT: lwc1 $f0, 12($sp)545; CHECKR2-NEXT: mfc1 $1, $f0546; CHECKR2-NEXT: dsll $1, $1, 32547; CHECKR2-NEXT: lwc1 $f0, 4($sp)548; CHECKR2-NEXT: mfc1 $2, $f0549; CHECKR2-NEXT: dext $2, $2, 0, 32550; CHECKR2-NEXT: lwc1 $f0, 8($sp)551; CHECKR2-NEXT: or $2, $2, $1552; CHECKR2-NEXT: mfc1 $1, $f0553; CHECKR2-NEXT: dsll $1, $1, 32554; CHECKR2-NEXT: lwc1 $f0, 0($sp)555; CHECKR2-NEXT: mfc1 $3, $f0556; CHECKR2-NEXT: dext $3, $3, 0, 32557; CHECKR2-NEXT: or $3, $3, $1558; CHECKR2-NEXT: ld $16, 16($sp) # 8-byte Folded Reload559; CHECKR2-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload560; CHECKR2-NEXT: jr $ra561; CHECKR2-NEXT: daddiu $sp, $sp, 32562 %result = call { <2 x float>, <2 x float> } @llvm.sincos.v2f32(<2 x float> %a)563 ret { <2 x float>, <2 x float> } %result564}565 566define { <3 x float>, <3 x float> } @test_sincos_v3f32(<3 x float> %a) #0 {567; SPARC32-LABEL: test_sincos_v3f32:568; SPARC32: ! %bb.0:569; SPARC32-NEXT: save %sp, -136, %sp570; SPARC32-NEXT: st %i2, [%fp+-4]571; SPARC32-NEXT: st %i1, [%fp+-8]572; SPARC32-NEXT: st %i0, [%fp+-12]573; SPARC32-NEXT: ld [%fp+-12], %f0574; SPARC32-NEXT: ld [%fp+-8], %f1575; SPARC32-NEXT: ld [%fp+-4], %f2576; SPARC32-NEXT: ld [%fp+64], %i3577; SPARC32-NEXT: st %f0, [%fp+-24]578; SPARC32-NEXT: st %f1, [%fp+-20]579; SPARC32-NEXT: st %f2, [%fp+-16]580; SPARC32-NEXT: ld [%fp+-24], %i0581; SPARC32-NEXT: call sinf582; SPARC32-NEXT: mov %i0, %o0583; SPARC32-NEXT: st %f0, [%fp+-28] ! 4-byte Folded Spill584; SPARC32-NEXT: ld [%fp+-20], %i1585; SPARC32-NEXT: call sinf586; SPARC32-NEXT: mov %i1, %o0587; SPARC32-NEXT: st %f0, [%fp+-32] ! 4-byte Folded Spill588; SPARC32-NEXT: ld [%fp+-16], %i2589; SPARC32-NEXT: call sinf590; SPARC32-NEXT: mov %i2, %o0591; SPARC32-NEXT: st %f0, [%fp+-36] ! 4-byte Folded Spill592; SPARC32-NEXT: call cosf593; SPARC32-NEXT: mov %i0, %o0594; SPARC32-NEXT: st %f0, [%fp+-40] ! 4-byte Folded Spill595; SPARC32-NEXT: call cosf596; SPARC32-NEXT: mov %i1, %o0597; SPARC32-NEXT: st %f0, [%fp+-44] ! 4-byte Folded Spill598; SPARC32-NEXT: call cosf599; SPARC32-NEXT: mov %i2, %o0600; SPARC32-NEXT: st %f0, [%i3+24]601; SPARC32-NEXT: ld [%fp+-44], %f0 ! 4-byte Folded Reload602; SPARC32-NEXT: st %f0, [%i3+20]603; SPARC32-NEXT: ld [%fp+-40], %f0 ! 4-byte Folded Reload604; SPARC32-NEXT: st %f0, [%i3+16]605; SPARC32-NEXT: ld [%fp+-36], %f0 ! 4-byte Folded Reload606; SPARC32-NEXT: st %f0, [%i3+8]607; SPARC32-NEXT: ld [%fp+-32], %f0 ! 4-byte Folded Reload608; SPARC32-NEXT: st %f0, [%i3+4]609; SPARC32-NEXT: ld [%fp+-28], %f0 ! 4-byte Folded Reload610; SPARC32-NEXT: st %f0, [%i3]611; SPARC32-NEXT: ret612; SPARC32-NEXT: restore613;614; SPARC64-LABEL: test_sincos_v3f32:615; SPARC64: ! %bb.0:616; SPARC64-NEXT: save %sp, -208, %sp617; SPARC64-NEXT: st %f5, [%fp+2043] ! 4-byte Folded Spill618; SPARC64-NEXT: st %f3, [%fp+2039] ! 4-byte Folded Spill619; SPARC64-NEXT: call sinf620; SPARC64-NEXT: st %f1, [%fp+2023]621; SPARC64-NEXT: st %f0, [%fp+2035] ! 4-byte Folded Spill622; SPARC64-NEXT: call sinf623; SPARC64-NEXT: ld [%fp+2039], %f1624; SPARC64-NEXT: st %f0, [%fp+2031] ! 4-byte Folded Spill625; SPARC64-NEXT: call sinf626; SPARC64-NEXT: ld [%fp+2043], %f1627; SPARC64-NEXT: st %f0, [%fp+2027] ! 4-byte Folded Spill628; SPARC64-NEXT: call cosf629; SPARC64-NEXT: ld [%fp+2023], %f1630; SPARC64-NEXT: st %f0, [%fp+2023] ! 4-byte Folded Spill631; SPARC64-NEXT: call cosf632; SPARC64-NEXT: ld [%fp+2039], %f1633; SPARC64-NEXT: st %f0, [%fp+2039] ! 4-byte Folded Spill634; SPARC64-NEXT: call cosf635; SPARC64-NEXT: ld [%fp+2043], %f1636; SPARC64-NEXT: fmovs %f0, %f5637; SPARC64-NEXT: ld [%fp+2035], %f0 ! 4-byte Folded Reload638; SPARC64-NEXT: ld [%fp+2031], %f1 ! 4-byte Folded Reload639; SPARC64-NEXT: ld [%fp+2027], %f2 ! 4-byte Folded Reload640; SPARC64-NEXT: ld [%fp+2023], %f3 ! 4-byte Folded Reload641; SPARC64-NEXT: ld [%fp+2039], %f4 ! 4-byte Folded Reload642; SPARC64-NEXT: ret643; SPARC64-NEXT: restore644;645; GNU32-LABEL: test_sincos_v3f32:646; GNU32: ! %bb.0:647; GNU32-NEXT: save %sp, -96, %sp648; GNU32-NEXT: ld [%fp+64], %i3649; GNU32-NEXT: mov %i2, %o0650; GNU32-NEXT: add %i3, 8, %o1651; GNU32-NEXT: call sincosf652; GNU32-NEXT: add %i3, 24, %o2653; GNU32-NEXT: add %i3, 4, %o1654; GNU32-NEXT: add %i3, 20, %o2655; GNU32-NEXT: call sincosf656; GNU32-NEXT: mov %i1, %o0657; GNU32-NEXT: add %i3, 16, %o2658; GNU32-NEXT: mov %i0, %o0659; GNU32-NEXT: call sincosf660; GNU32-NEXT: mov %i3, %o1661; GNU32-NEXT: ret662; GNU32-NEXT: restore663;664; GNU64-LABEL: test_sincos_v3f32:665; GNU64: ! %bb.0:666; GNU64-NEXT: save %sp, -208, %sp667; GNU64-NEXT: st %f5, [%fp+2019] ! 4-byte Folded Spill668; GNU64-NEXT: st %f3, [%fp+2015] ! 4-byte Folded Spill669; GNU64-NEXT: add %fp, 2027, %o1670; GNU64-NEXT: call sincosf671; GNU64-NEXT: add %fp, 2023, %o2672; GNU64-NEXT: add %fp, 2035, %o1673; GNU64-NEXT: add %fp, 2031, %o2674; GNU64-NEXT: call sincosf675; GNU64-NEXT: ld [%fp+2015], %f1676; GNU64-NEXT: add %fp, 2043, %o1677; GNU64-NEXT: add %fp, 2039, %o2678; GNU64-NEXT: call sincosf679; GNU64-NEXT: ld [%fp+2019], %f1680; GNU64-NEXT: ld [%fp+2027], %f0681; GNU64-NEXT: ld [%fp+2035], %f1682; GNU64-NEXT: ld [%fp+2043], %f2683; GNU64-NEXT: ld [%fp+2023], %f3684; GNU64-NEXT: ld [%fp+2031], %f4685; GNU64-NEXT: ld [%fp+2039], %f5686; GNU64-NEXT: ret687; GNU64-NEXT: restore688; CHECKR2-LABEL: test_sincos_v3f32:689; CHECKR2: # %bb.0:690; CHECKR2-NEXT: daddiu $sp, $sp, -48691; CHECKR2-NEXT: sdc1 $f25, 40($sp) # 8-byte Folded Spill692; CHECKR2-NEXT: sdc1 $f24, 32($sp) # 8-byte Folded Spill693; CHECKR2-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill694; CHECKR2-NEXT: sd $16, 16($sp) # 8-byte Folded Spill695; CHECKR2-NEXT: mov.s $f24, $f15696; CHECKR2-NEXT: mov.s $f25, $f14697; CHECKR2-NEXT: mov.s $f12, $f13698; CHECKR2-NEXT: move $16, $4699; CHECKR2-NEXT: daddiu $5, $sp, 4700; CHECKR2-NEXT: jal sincosf701; CHECKR2-NEXT: daddiu $6, $sp, 0702; CHECKR2-NEXT: daddiu $5, $sp, 12703; CHECKR2-NEXT: daddiu $6, $sp, 8704; CHECKR2-NEXT: jal sincosf705; CHECKR2-NEXT: mov.s $f12, $f25706; CHECKR2-NEXT: daddiu $5, $16, 8707; CHECKR2-NEXT: daddiu $6, $16, 24708; CHECKR2-NEXT: jal sincosf709; CHECKR2-NEXT: mov.s $f12, $f24710; CHECKR2-NEXT: lwc1 $f0, 0($sp)711; CHECKR2-NEXT: mfc1 $1, $f0712; CHECKR2-NEXT: dsll $1, $1, 32713; CHECKR2-NEXT: lwc1 $f0, 8($sp)714; CHECKR2-NEXT: mfc1 $2, $f0715; CHECKR2-NEXT: dext $2, $2, 0, 32716; CHECKR2-NEXT: or $1, $2, $1717; CHECKR2-NEXT: lwc1 $f0, 4($sp)718; CHECKR2-NEXT: mfc1 $2, $f0719; CHECKR2-NEXT: sd $1, 16($16)720; CHECKR2-NEXT: dsll $1, $2, 32721; CHECKR2-NEXT: lwc1 $f0, 12($sp)722; CHECKR2-NEXT: mfc1 $2, $f0723; CHECKR2-NEXT: dext $2, $2, 0, 32724; CHECKR2-NEXT: or $1, $2, $1725; CHECKR2-NEXT: sd $1, 0($16)726; CHECKR2-NEXT: ld $16, 16($sp) # 8-byte Folded Reload727; CHECKR2-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload728; CHECKR2-NEXT: ldc1 $f24, 32($sp) # 8-byte Folded Reload729; CHECKR2-NEXT: ldc1 $f25, 40($sp) # 8-byte Folded Reload730; CHECKR2-NEXT: jr $ra731; CHECKR2-NEXT: daddiu $sp, $sp, 48732 %result = call { <3 x float>, <3 x float> } @llvm.sincos.v3f32(<3 x float> %a)733 ret { <3 x float>, <3 x float> } %result734}735 736define { double, double } @test_sincos_f64(double %a) #0 {737; SPARC32-LABEL: test_sincos_f64:738; SPARC32: ! %bb.0:739; SPARC32-NEXT: save %sp, -120, %sp740; SPARC32-NEXT: ! kill: def $i1 killed $i1 killed $i0_i1 def $i0_i1741; SPARC32-NEXT: ! kill: def $i0 killed $i0 killed $i0_i1 def $i0_i1742; SPARC32-NEXT: std %i0, [%fp+-8]743; SPARC32-NEXT: ldd [%fp+-8], %f0744; SPARC32-NEXT: std %f0, [%fp+-16]745; SPARC32-NEXT: ldd [%fp+-16], %i0746; SPARC32-NEXT: mov %i0, %o0747; SPARC32-NEXT: call sin748; SPARC32-NEXT: mov %i1, %o1749; SPARC32-NEXT: std %f0, [%fp+-24] ! 8-byte Folded Spill750; SPARC32-NEXT: mov %i0, %o0751; SPARC32-NEXT: call cos752; SPARC32-NEXT: mov %i1, %o1753; SPARC32-NEXT: fmovs %f0, %f2754; SPARC32-NEXT: fmovs %f1, %f3755; SPARC32-NEXT: ldd [%fp+-24], %f0 ! 8-byte Folded Reload756; SPARC32-NEXT: ret757; SPARC32-NEXT: restore758;759; SPARC64-LABEL: test_sincos_f64:760; SPARC64: ! %bb.0:761; SPARC64-NEXT: save %sp, -192, %sp762; SPARC64-NEXT: call sin763; SPARC64-NEXT: std %f0, [%fp+2031]764; SPARC64-NEXT: std %f0, [%fp+2039] ! 8-byte Folded Spill765; SPARC64-NEXT: call cos766; SPARC64-NEXT: ldd [%fp+2031], %f0767; SPARC64-NEXT: fmovd %f0, %f2768; SPARC64-NEXT: ldd [%fp+2039], %f0 ! 8-byte Folded Reload769; SPARC64-NEXT: ret770; SPARC64-NEXT: restore771;772; GNU32-LABEL: test_sincos_f64:773; GNU32: ! %bb.0:774; GNU32-NEXT: save %sp, -128, %sp775; GNU32-NEXT: ! kill: def $i1 killed $i1 killed $i0_i1 def $i0_i1776; GNU32-NEXT: ! kill: def $i0 killed $i0 killed $i0_i1 def $i0_i1777; GNU32-NEXT: std %i0, [%fp+-8]778; GNU32-NEXT: ldd [%fp+-8], %f0779; GNU32-NEXT: std %f0, [%fp+-32]780; GNU32-NEXT: ldd [%fp+-32], %o0781; GNU32-NEXT: add %fp, -16, %o2782; GNU32-NEXT: call sincos783; GNU32-NEXT: add %fp, -24, %o3784; GNU32-NEXT: ldd [%fp+-16], %f0785; GNU32-NEXT: ldd [%fp+-24], %f2786; GNU32-NEXT: ret787; GNU32-NEXT: restore788;789; GNU64-LABEL: test_sincos_f64:790; GNU64: ! %bb.0:791; GNU64-NEXT: save %sp, -192, %sp792; GNU64-NEXT: add %fp, 2039, %o1793; GNU64-NEXT: call sincos794; GNU64-NEXT: add %fp, 2031, %o2795; GNU64-NEXT: ldd [%fp+2039], %f0796; GNU64-NEXT: ldd [%fp+2031], %f2797; GNU64-NEXT: ret798; GNU64-NEXT: restore799 %result = call { double, double } @llvm.sincos.f64(double %a)800 ret { double, double } %result801}802 803define { <2 x double>, <2 x double> } @test_sincos_v2f64(<2 x double> %a) #0 {804; SPARC32-LABEL: test_sincos_v2f64:805; SPARC32: ! %bb.0:806; SPARC32-NEXT: save %sp, -152, %sp807; SPARC32-NEXT: ! kill: def $i3 killed $i3 killed $i2_i3 def $i2_i3808; SPARC32-NEXT: ! kill: def $i1 killed $i1 killed $i0_i1 def $i0_i1809; SPARC32-NEXT: ! kill: def $i2 killed $i2 killed $i2_i3 def $i2_i3810; SPARC32-NEXT: std %i2, [%fp+-16]811; SPARC32-NEXT: ! kill: def $i0 killed $i0 killed $i0_i1 def $i0_i1812; SPARC32-NEXT: std %i0, [%fp+-8]813; SPARC32-NEXT: ldd [%fp+-8], %f0814; SPARC32-NEXT: ldd [%fp+-16], %f2815; SPARC32-NEXT: ld [%fp+64], %i4816; SPARC32-NEXT: std %f0, [%fp+-32]817; SPARC32-NEXT: std %f2, [%fp+-24]818; SPARC32-NEXT: ldd [%fp+-32], %i0819; SPARC32-NEXT: mov %i0, %o0820; SPARC32-NEXT: call sin821; SPARC32-NEXT: mov %i1, %o1822; SPARC32-NEXT: std %f0, [%fp+-40] ! 8-byte Folded Spill823; SPARC32-NEXT: ldd [%fp+-24], %i2824; SPARC32-NEXT: mov %i2, %o0825; SPARC32-NEXT: call sin826; SPARC32-NEXT: mov %i3, %o1827; SPARC32-NEXT: std %f0, [%fp+-48] ! 8-byte Folded Spill828; SPARC32-NEXT: mov %i0, %o0829; SPARC32-NEXT: call cos830; SPARC32-NEXT: mov %i1, %o1831; SPARC32-NEXT: std %f0, [%fp+-56] ! 8-byte Folded Spill832; SPARC32-NEXT: mov %i2, %o0833; SPARC32-NEXT: call cos834; SPARC32-NEXT: mov %i3, %o1835; SPARC32-NEXT: std %f0, [%i4+24]836; SPARC32-NEXT: ldd [%fp+-56], %f0 ! 8-byte Folded Reload837; SPARC32-NEXT: std %f0, [%i4+16]838; SPARC32-NEXT: ldd [%fp+-48], %f0 ! 8-byte Folded Reload839; SPARC32-NEXT: std %f0, [%i4+8]840; SPARC32-NEXT: ldd [%fp+-40], %f0 ! 8-byte Folded Reload841; SPARC32-NEXT: std %f0, [%i4]842; SPARC32-NEXT: ret843; SPARC32-NEXT: restore844;845; SPARC64-LABEL: test_sincos_v2f64:846; SPARC64: ! %bb.0:847; SPARC64-NEXT: save %sp, -208, %sp848; SPARC64-NEXT: std %f2, [%fp+2039] ! 8-byte Folded Spill849; SPARC64-NEXT: call sin850; SPARC64-NEXT: std %f0, [%fp+2015]851; SPARC64-NEXT: std %f0, [%fp+2031] ! 8-byte Folded Spill852; SPARC64-NEXT: call sin853; SPARC64-NEXT: ldd [%fp+2039], %f0854; SPARC64-NEXT: std %f0, [%fp+2023] ! 8-byte Folded Spill855; SPARC64-NEXT: call cos856; SPARC64-NEXT: ldd [%fp+2015], %f0857; SPARC64-NEXT: std %f0, [%fp+2015] ! 8-byte Folded Spill858; SPARC64-NEXT: call cos859; SPARC64-NEXT: ldd [%fp+2039], %f0860; SPARC64-NEXT: fmovd %f0, %f6861; SPARC64-NEXT: ldd [%fp+2031], %f0 ! 8-byte Folded Reload862; SPARC64-NEXT: ldd [%fp+2023], %f2 ! 8-byte Folded Reload863; SPARC64-NEXT: ldd [%fp+2015], %f4 ! 8-byte Folded Reload864; SPARC64-NEXT: ret865; SPARC64-NEXT: restore866;867; GNU32-LABEL: test_sincos_v2f64:868; GNU32: ! %bb.0:869; GNU32-NEXT: save %sp, -136, %sp870; GNU32-NEXT: ! kill: def $i1 killed $i1 killed $i0_i1 def $i0_i1871; GNU32-NEXT: ! kill: def $i3 killed $i3 killed $i2_i3 def $i2_i3872; GNU32-NEXT: ! kill: def $i0 killed $i0 killed $i0_i1 def $i0_i1873; GNU32-NEXT: std %i0, [%fp+-8]874; GNU32-NEXT: ! kill: def $i2 killed $i2 killed $i2_i3 def $i2_i3875; GNU32-NEXT: std %i2, [%fp+-16]876; GNU32-NEXT: ld [%fp+64], %i0877; GNU32-NEXT: ldd [%fp+-16], %f0878; GNU32-NEXT: ldd [%fp+-8], %f2879; GNU32-NEXT: std %f2, [%fp+-40] ! 8-byte Folded Spill880; GNU32-NEXT: std %f0, [%fp+-32]881; GNU32-NEXT: ldd [%fp+-32], %o0882; GNU32-NEXT: add %i0, 8, %o2883; GNU32-NEXT: call sincos884; GNU32-NEXT: add %i0, 24, %o3885; GNU32-NEXT: ldd [%fp+-40], %f0 ! 8-byte Folded Reload886; GNU32-NEXT: std %f0, [%fp+-24]887; GNU32-NEXT: ldd [%fp+-24], %o0888; GNU32-NEXT: add %i0, 16, %o3889; GNU32-NEXT: call sincos890; GNU32-NEXT: mov %i0, %o2891; GNU32-NEXT: ret892; GNU32-NEXT: restore893;894; GNU64-LABEL: test_sincos_v2f64:895; GNU64: ! %bb.0:896; GNU64-NEXT: save %sp, -224, %sp897; GNU64-NEXT: std %f2, [%fp+2007] ! 8-byte Folded Spill898; GNU64-NEXT: add %fp, 2023, %o1899; GNU64-NEXT: call sincos900; GNU64-NEXT: add %fp, 2015, %o2901; GNU64-NEXT: add %fp, 2039, %o1902; GNU64-NEXT: add %fp, 2031, %o2903; GNU64-NEXT: call sincos904; GNU64-NEXT: ldd [%fp+2007], %f0905; GNU64-NEXT: ldd [%fp+2023], %f0906; GNU64-NEXT: ldd [%fp+2039], %f2907; GNU64-NEXT: ldd [%fp+2015], %f4908; GNU64-NEXT: ldd [%fp+2031], %f6909; GNU64-NEXT: ret910; GNU64-NEXT: restore911; CHECKR2-LABEL: test_sincos_v2f64:912; CHECKR2: # %bb.0:913; CHECKR2-NEXT: addiu $sp, $sp, -32914; CHECKR2-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill915; CHECKR2-NEXT: sw $18, 24($sp) # 4-byte Folded Spill916; CHECKR2-NEXT: sw $17, 20($sp) # 4-byte Folded Spill917; CHECKR2-NEXT: sw $16, 16($sp) # 4-byte Folded Spill918; CHECKR2-NEXT: move $16, $7919; CHECKR2-NEXT: move $17, $6920; CHECKR2-NEXT: move $18, $4921; CHECKR2-NEXT: lw $1, 48($sp)922; CHECKR2-NEXT: lw $2, 52($sp)923; CHECKR2-NEXT: mtc1 $2, $f12924; CHECKR2-NEXT: mthc1 $1, $f12925; CHECKR2-NEXT: addiu $6, $4, 8926; CHECKR2-NEXT: jal sincos927; CHECKR2-NEXT: addiu $7, $4, 24928; CHECKR2-NEXT: mtc1 $16, $f12929; CHECKR2-NEXT: mthc1 $17, $f12930; CHECKR2-NEXT: addiu $7, $18, 16931; CHECKR2-NEXT: jal sincos932; CHECKR2-NEXT: move $6, $18933; CHECKR2-NEXT: lw $16, 16($sp) # 4-byte Folded Reload934; CHECKR2-NEXT: lw $17, 20($sp) # 4-byte Folded Reload935; CHECKR2-NEXT: lw $18, 24($sp) # 4-byte Folded Reload936; CHECKR2-NEXT: lw $ra, 28($sp) # 4-byte Folded Reload937; CHECKR2-NEXT: jr $ra938; CHECKR2-NEXT: addiu $sp, $sp, 32939 %result = call { <2 x double>, <2 x double> } @llvm.sincos.v2f64(<2 x double> %a)940 ret { <2 x double>, <2 x double> } %result941}942 943define void @test_sincos_f128(ptr sret({ fp128, fp128 }) %ret, ptr %in) #0 {944; SPARC32-LABEL: test_sincos_f128:945; SPARC32: ! %bb.0:946; SPARC32-NEXT: save %sp, -184, %sp947; SPARC32-NEXT: ld [%fp+64], %i1948; SPARC32-NEXT: ldd [%i0], %f0949; SPARC32-NEXT: std %f0, [%fp+-88]950; SPARC32-NEXT: std %f2, [%fp+-80] ! 16-byte Folded Spill951; SPARC32-NEXT: ldd [%i0+8], %f4952; SPARC32-NEXT: std %f4, [%fp+-72] ! 8-byte Folded Spill953; SPARC32-NEXT: add %fp, -48, %i0954; SPARC32-NEXT: st %i0, [%sp+64]955; SPARC32-NEXT: std %f4, [%fp+-56]956; SPARC32-NEXT: add %fp, -64, %o0957; SPARC32-NEXT: call sinl958; SPARC32-NEXT: std %f0, [%fp+-64]959; SPARC32-NEXT: unimp 16960; SPARC32-NEXT: add %fp, -16, %i0961; SPARC32-NEXT: st %i0, [%sp+64]962; SPARC32-NEXT: ldd [%fp+-72], %f0 ! 8-byte Folded Reload963; SPARC32-NEXT: std %f0, [%fp+-24]964; SPARC32-NEXT: add %fp, -32, %o0965; SPARC32-NEXT: ldd [%fp+-88], %f0966; SPARC32-NEXT: ldd [%fp+-80], %f2 ! 16-byte Folded Reload967; SPARC32-NEXT: call cosl968; SPARC32-NEXT: std %f0, [%fp+-32]969; SPARC32-NEXT: unimp 16970; SPARC32-NEXT: ldd [%fp+-8], %f0971; SPARC32-NEXT: ldd [%fp+-16], %f4972; SPARC32-NEXT: ldd [%fp+-40], %f2973; SPARC32-NEXT: ldd [%fp+-48], %f8974; SPARC32-NEXT: std %f0, [%i1+24]975; SPARC32-NEXT: std %f4, [%i1+16]976; SPARC32-NEXT: std %f2, [%i1+8]977; SPARC32-NEXT: std %f8, [%i1]978; SPARC32-NEXT: jmp %i7+12979; SPARC32-NEXT: restore %g0, %i1, %o0980;981; SPARC64-LABEL: test_sincos_f128:982; SPARC64: ! %bb.0:983; SPARC64-NEXT: save %sp, -208, %sp984; SPARC64-NEXT: ldd [%i1], %f0985; SPARC64-NEXT: ldd [%i1+8], %f2986; SPARC64-NEXT: std %f0, [%fp+2015]987; SPARC64-NEXT: call sinl988; SPARC64-NEXT: std %f2, [%fp+2023]989; SPARC64-NEXT: std %f0, [%fp+2031]990; SPARC64-NEXT: std %f2, [%fp+2039] ! 16-byte Folded Spill991; SPARC64-NEXT: ldd [%fp+2015], %f0992; SPARC64-NEXT: call cosl993; SPARC64-NEXT: ldd [%fp+2023], %f2994; SPARC64-NEXT: std %f2, [%i0+24]995; SPARC64-NEXT: std %f0, [%i0+16]996; SPARC64-NEXT: ldd [%fp+2031], %f0997; SPARC64-NEXT: ldd [%fp+2039], %f2 ! 16-byte Folded Reload998; SPARC64-NEXT: std %f2, [%i0+8]999; SPARC64-NEXT: std %f0, [%i0]1000; SPARC64-NEXT: ret1001; SPARC64-NEXT: restore1002;1003; GNU32-LABEL: test_sincos_f128:1004; GNU32: ! %bb.0:1005; GNU32-NEXT: save %sp, -144, %sp1006; GNU32-NEXT: ld [%fp+64], %i11007; GNU32-NEXT: ldd [%i0], %f01008; GNU32-NEXT: ldd [%i0+8], %f41009; GNU32-NEXT: std %f4, [%fp+-40]1010; GNU32-NEXT: add %fp, -48, %o01011; GNU32-NEXT: add %fp, -16, %o11012; GNU32-NEXT: add %fp, -32, %o21013; GNU32-NEXT: call sincosl1014; GNU32-NEXT: std %f0, [%fp+-48]1015; GNU32-NEXT: ldd [%fp+-24], %f01016; GNU32-NEXT: ldd [%fp+-32], %f41017; GNU32-NEXT: ldd [%fp+-8], %f21018; GNU32-NEXT: ldd [%fp+-16], %f81019; GNU32-NEXT: std %f0, [%i1+24]1020; GNU32-NEXT: std %f4, [%i1+16]1021; GNU32-NEXT: std %f2, [%i1+8]1022; GNU32-NEXT: std %f8, [%i1]1023; GNU32-NEXT: jmp %i7+121024; GNU32-NEXT: restore %g0, %i1, %o01025;1026; GNU64-LABEL: test_sincos_f128:1027; GNU64: ! %bb.0:1028; GNU64-NEXT: save %sp, -208, %sp1029; GNU64-NEXT: ldd [%i1], %f01030; GNU64-NEXT: ldd [%i1+8], %f21031; GNU64-NEXT: add %fp, 2031, %i11032; GNU64-NEXT: add %fp, 2015, %i21033; GNU64-NEXT: mov %i1, %o21034; GNU64-NEXT: call sincosl1035; GNU64-NEXT: mov %i2, %o31036; GNU64-NEXT: or %i1, 8, %i11037; GNU64-NEXT: or %i2, 8, %i21038; GNU64-NEXT: ldd [%i2], %f01039; GNU64-NEXT: ldd [%fp+2015], %f41040; GNU64-NEXT: ldd [%i1], %f21041; GNU64-NEXT: ldd [%fp+2031], %f81042; GNU64-NEXT: std %f0, [%i0+24]1043; GNU64-NEXT: std %f4, [%i0+16]1044; GNU64-NEXT: std %f2, [%i0+8]1045; GNU64-NEXT: std %f8, [%i0]1046; GNU64-NEXT: ret1047; GNU64-NEXT: restore1048 %a = load fp128, ptr %in1049 %result = call { fp128, fp128 } @llvm.sincos.f128(fp128 %a)1050 store { fp128, fp128 } %result, ptr %ret1051 ret void1052}1053 1054define void @test_sincos_v2f128(ptr sret({ <2 x fp128>, <2 x fp128> }) %ret, ptr %in) #0 {1055; SPARC32-LABEL: test_sincos_v2f128:1056; SPARC32: ! %bb.0:1057; SPARC32-NEXT: save %sp, -272, %sp1058; SPARC32-NEXT: mov %i0, %i11059; SPARC32-NEXT: ld [%fp+64], %i01060; SPARC32-NEXT: ldd [%i1], %f01061; SPARC32-NEXT: std %f0, [%fp+-144]1062; SPARC32-NEXT: std %f2, [%fp+-136] ! 16-byte Folded Spill1063; SPARC32-NEXT: ldd [%i1+8], %f01064; SPARC32-NEXT: std %f0, [%fp+-152] ! 8-byte Folded Spill1065; SPARC32-NEXT: ldd [%i1+16], %f01066; SPARC32-NEXT: std %f0, [%fp+-176]1067; SPARC32-NEXT: std %f2, [%fp+-168] ! 16-byte Folded Spill1068; SPARC32-NEXT: ldd [%i1+24], %f41069; SPARC32-NEXT: std %f4, [%fp+-160] ! 8-byte Folded Spill1070; SPARC32-NEXT: add %fp, -112, %i11071; SPARC32-NEXT: st %i1, [%sp+64]1072; SPARC32-NEXT: std %f4, [%fp+-120]1073; SPARC32-NEXT: add %fp, -128, %o01074; SPARC32-NEXT: call sinl1075; SPARC32-NEXT: std %f0, [%fp+-128]1076; SPARC32-NEXT: unimp 161077; SPARC32-NEXT: add %fp, -16, %i11078; SPARC32-NEXT: st %i1, [%sp+64]1079; SPARC32-NEXT: ldd [%fp+-152], %f0 ! 8-byte Folded Reload1080; SPARC32-NEXT: std %f0, [%fp+-24]1081; SPARC32-NEXT: add %fp, -32, %o01082; SPARC32-NEXT: ldd [%fp+-144], %f01083; SPARC32-NEXT: ldd [%fp+-136], %f2 ! 16-byte Folded Reload1084; SPARC32-NEXT: call cosl1085; SPARC32-NEXT: std %f0, [%fp+-32]1086; SPARC32-NEXT: unimp 161087; SPARC32-NEXT: add %fp, -48, %i11088; SPARC32-NEXT: st %i1, [%sp+64]1089; SPARC32-NEXT: ldd [%fp+-152], %f0 ! 8-byte Folded Reload1090; SPARC32-NEXT: std %f0, [%fp+-56]1091; SPARC32-NEXT: add %fp, -64, %o01092; SPARC32-NEXT: ldd [%fp+-144], %f01093; SPARC32-NEXT: ldd [%fp+-136], %f2 ! 16-byte Folded Reload1094; SPARC32-NEXT: call sinl1095; SPARC32-NEXT: std %f0, [%fp+-64]1096; SPARC32-NEXT: unimp 161097; SPARC32-NEXT: add %fp, -80, %i11098; SPARC32-NEXT: st %i1, [%sp+64]1099; SPARC32-NEXT: ldd [%fp+-160], %f0 ! 8-byte Folded Reload1100; SPARC32-NEXT: std %f0, [%fp+-88]1101; SPARC32-NEXT: add %fp, -96, %o01102; SPARC32-NEXT: ldd [%fp+-176], %f01103; SPARC32-NEXT: ldd [%fp+-168], %f2 ! 16-byte Folded Reload1104; SPARC32-NEXT: call cosl1105; SPARC32-NEXT: std %f0, [%fp+-96]1106; SPARC32-NEXT: unimp 161107; SPARC32-NEXT: ldd [%fp+-48], %f01108; SPARC32-NEXT: ldd [%fp+-40], %f81109; SPARC32-NEXT: ldd [%fp+-112], %f41110; SPARC32-NEXT: ldd [%fp+-104], %f101111; SPARC32-NEXT: ldd [%fp+-72], %f121112; SPARC32-NEXT: ldd [%fp+-80], %f161113; SPARC32-NEXT: ldd [%fp+-8], %f141114; SPARC32-NEXT: ldd [%fp+-16], %f201115; SPARC32-NEXT: std %f12, [%i0+56]1116; SPARC32-NEXT: std %f16, [%i0+48]1117; SPARC32-NEXT: std %f14, [%i0+40]1118; SPARC32-NEXT: std %f20, [%i0+32]1119; SPARC32-NEXT: std %f10, [%i0+24]1120; SPARC32-NEXT: std %f4, [%i0+16]1121; SPARC32-NEXT: std %f8, [%i0+8]1122; SPARC32-NEXT: std %f0, [%i0]1123; SPARC32-NEXT: jmp %i7+121124; SPARC32-NEXT: restore1125;1126; SPARC64-LABEL: test_sincos_v2f128:1127; SPARC64: ! %bb.0:1128; SPARC64-NEXT: save %sp, -240, %sp1129; SPARC64-NEXT: ldd [%i1+16], %f01130; SPARC64-NEXT: ldd [%i1+24], %f21131; SPARC64-NEXT: std %f0, [%fp+2031]1132; SPARC64-NEXT: std %f2, [%fp+2039] ! 16-byte Folded Spill1133; SPARC64-NEXT: ldd [%i1], %f01134; SPARC64-NEXT: ldd [%i1+8], %f21135; SPARC64-NEXT: std %f0, [%fp+1983]1136; SPARC64-NEXT: call sinl1137; SPARC64-NEXT: std %f2, [%fp+1991]1138; SPARC64-NEXT: std %f0, [%fp+2015]1139; SPARC64-NEXT: std %f2, [%fp+2023] ! 16-byte Folded Spill1140; SPARC64-NEXT: ldd [%fp+2031], %f01141; SPARC64-NEXT: call sinl1142; SPARC64-NEXT: ldd [%fp+2039], %f21143; SPARC64-NEXT: std %f0, [%fp+1999]1144; SPARC64-NEXT: std %f2, [%fp+2007] ! 16-byte Folded Spill1145; SPARC64-NEXT: ldd [%fp+1983], %f01146; SPARC64-NEXT: call cosl1147; SPARC64-NEXT: ldd [%fp+1991], %f21148; SPARC64-NEXT: std %f0, [%fp+1983]1149; SPARC64-NEXT: std %f2, [%fp+1991] ! 16-byte Folded Spill1150; SPARC64-NEXT: ldd [%fp+2031], %f01151; SPARC64-NEXT: call cosl1152; SPARC64-NEXT: ldd [%fp+2039], %f21153; SPARC64-NEXT: std %f2, [%i0+56]1154; SPARC64-NEXT: std %f0, [%i0+48]1155; SPARC64-NEXT: ldd [%fp+1983], %f01156; SPARC64-NEXT: ldd [%fp+1991], %f2 ! 16-byte Folded Reload1157; SPARC64-NEXT: std %f2, [%i0+40]1158; SPARC64-NEXT: std %f0, [%i0+32]1159; SPARC64-NEXT: ldd [%fp+1999], %f01160; SPARC64-NEXT: ldd [%fp+2007], %f2 ! 16-byte Folded Reload1161; SPARC64-NEXT: std %f2, [%i0+24]1162; SPARC64-NEXT: std %f0, [%i0+16]1163; SPARC64-NEXT: ldd [%fp+2015], %f01164; SPARC64-NEXT: ldd [%fp+2023], %f2 ! 16-byte Folded Reload1165; SPARC64-NEXT: std %f2, [%i0+8]1166; SPARC64-NEXT: std %f0, [%i0]1167; SPARC64-NEXT: ret1168; SPARC64-NEXT: restore1169;1170; GNU32-LABEL: test_sincos_v2f128:1171; GNU32: ! %bb.0:1172; GNU32-NEXT: save %sp, -216, %sp1173; GNU32-NEXT: mov %i0, %i11174; GNU32-NEXT: ld [%fp+64], %i01175; GNU32-NEXT: ldd [%i1+16], %f01176; GNU32-NEXT: std %f0, [%fp+-112]1177; GNU32-NEXT: std %f2, [%fp+-104] ! 16-byte Folded Spill1178; GNU32-NEXT: ldd [%i1+24], %f01179; GNU32-NEXT: std %f0, [%fp+-120] ! 8-byte Folded Spill1180; GNU32-NEXT: ldd [%i1], %f01181; GNU32-NEXT: ldd [%i1+8], %f41182; GNU32-NEXT: std %f4, [%fp+-88]1183; GNU32-NEXT: add %fp, -96, %o01184; GNU32-NEXT: add %fp, -64, %o11185; GNU32-NEXT: add %fp, -80, %o21186; GNU32-NEXT: call sincosl1187; GNU32-NEXT: std %f0, [%fp+-96]1188; GNU32-NEXT: ldd [%fp+-120], %f0 ! 8-byte Folded Reload1189; GNU32-NEXT: std %f0, [%fp+-40]1190; GNU32-NEXT: add %fp, -48, %o01191; GNU32-NEXT: add %fp, -16, %o11192; GNU32-NEXT: add %fp, -32, %o21193; GNU32-NEXT: ldd [%fp+-112], %f01194; GNU32-NEXT: ldd [%fp+-104], %f2 ! 16-byte Folded Reload1195; GNU32-NEXT: call sincosl1196; GNU32-NEXT: std %f0, [%fp+-48]1197; GNU32-NEXT: ldd [%fp+-64], %f01198; GNU32-NEXT: ldd [%fp+-56], %f81199; GNU32-NEXT: ldd [%fp+-16], %f41200; GNU32-NEXT: ldd [%fp+-8], %f101201; GNU32-NEXT: ldd [%fp+-24], %f121202; GNU32-NEXT: ldd [%fp+-32], %f161203; GNU32-NEXT: ldd [%fp+-72], %f141204; GNU32-NEXT: ldd [%fp+-80], %f201205; GNU32-NEXT: std %f12, [%i0+56]1206; GNU32-NEXT: std %f16, [%i0+48]1207; GNU32-NEXT: std %f14, [%i0+40]1208; GNU32-NEXT: std %f20, [%i0+32]1209; GNU32-NEXT: std %f10, [%i0+24]1210; GNU32-NEXT: std %f4, [%i0+16]1211; GNU32-NEXT: std %f8, [%i0+8]1212; GNU32-NEXT: std %f0, [%i0]1213; GNU32-NEXT: jmp %i7+121214; GNU32-NEXT: restore1215;1216; GNU64-LABEL: test_sincos_v2f128:1217; GNU64: ! %bb.0:1218; GNU64-NEXT: save %sp, -256, %sp1219; GNU64-NEXT: ldd [%i1+16], %f01220; GNU64-NEXT: ldd [%i1+24], %f21221; GNU64-NEXT: std %f0, [%fp+1967]1222; GNU64-NEXT: std %f2, [%fp+1975] ! 16-byte Folded Spill1223; GNU64-NEXT: ldd [%i1], %f01224; GNU64-NEXT: ldd [%i1+8], %f21225; GNU64-NEXT: add %fp, 1999, %i11226; GNU64-NEXT: add %fp, 1983, %i21227; GNU64-NEXT: mov %i1, %o21228; GNU64-NEXT: call sincosl1229; GNU64-NEXT: mov %i2, %o31230; GNU64-NEXT: add %fp, 2031, %i31231; GNU64-NEXT: add %fp, 2015, %i41232; GNU64-NEXT: ldd [%fp+1967], %f01233; GNU64-NEXT: ldd [%fp+1975], %f2 ! 16-byte Folded Reload1234; GNU64-NEXT: mov %i3, %o21235; GNU64-NEXT: call sincosl1236; GNU64-NEXT: mov %i4, %o31237; GNU64-NEXT: ldd [%fp+1999], %f01238; GNU64-NEXT: or %i1, 8, %i11239; GNU64-NEXT: ldd [%i1], %f41240; GNU64-NEXT: ldd [%fp+2031], %f81241; GNU64-NEXT: or %i3, 8, %i11242; GNU64-NEXT: ldd [%i1], %f61243; GNU64-NEXT: or %i2, 8, %i11244; GNU64-NEXT: or %i4, 8, %i21245; GNU64-NEXT: ldd [%i2], %f121246; GNU64-NEXT: ldd [%fp+2015], %f161247; GNU64-NEXT: ldd [%i1], %f141248; GNU64-NEXT: ldd [%fp+1983], %f201249; GNU64-NEXT: std %f12, [%i0+56]1250; GNU64-NEXT: std %f16, [%i0+48]1251; GNU64-NEXT: std %f14, [%i0+40]1252; GNU64-NEXT: std %f20, [%i0+32]1253; GNU64-NEXT: std %f6, [%i0+24]1254; GNU64-NEXT: std %f8, [%i0+16]1255; GNU64-NEXT: std %f4, [%i0+8]1256; GNU64-NEXT: std %f0, [%i0]1257; GNU64-NEXT: ret1258; GNU64-NEXT: restore1259 %a = load <2 x fp128>, ptr %in1260 %result = call { <2 x fp128>, <2 x fp128> } @llvm.sincos.v2f128(<2 x fp128> %a)1261 store { <2 x fp128>, <2 x fp128> } %result, ptr %ret1262 ret void1263}1264 1265attributes #0 = { nounwind }1266