1293 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=aarch64 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD,CHECK-NOFP16-SD3; RUN: llc -mtriple=aarch64 -mattr=+fullfp16 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD,CHECK-FP16-SD4; RUN: llc -mtriple=aarch64 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-NOFP16-GI5; RUN: llc -mtriple=aarch64 -mattr=+fullfp16 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-FP16-GI6 7define double @min_f64(double %a, double %b) {8; CHECK-LABEL: min_f64:9; CHECK: // %bb.0: // %entry10; CHECK-NEXT: fmin d0, d0, d111; CHECK-NEXT: ret12entry:13 %c = call double @llvm.minimum.f64(double %a, double %b)14 ret double %c15}16 17define double @max_f64(double %a, double %b) {18; CHECK-LABEL: max_f64:19; CHECK: // %bb.0: // %entry20; CHECK-NEXT: fmax d0, d0, d121; CHECK-NEXT: ret22entry:23 %c = call double @llvm.maximum.f64(double %a, double %b)24 ret double %c25}26 27define float @min_f32(float %a, float %b) {28; CHECK-LABEL: min_f32:29; CHECK: // %bb.0: // %entry30; CHECK-NEXT: fmin s0, s0, s131; CHECK-NEXT: ret32entry:33 %c = call float @llvm.minimum.f32(float %a, float %b)34 ret float %c35}36 37define float @max_f32(float %a, float %b) {38; CHECK-LABEL: max_f32:39; CHECK: // %bb.0: // %entry40; CHECK-NEXT: fmax s0, s0, s141; CHECK-NEXT: ret42entry:43 %c = call float @llvm.maximum.f32(float %a, float %b)44 ret float %c45}46 47define half @min_f16(half %a, half %b) {48; CHECK-NOFP16-SD-LABEL: min_f16:49; CHECK-NOFP16-SD: // %bb.0: // %entry50; CHECK-NOFP16-SD-NEXT: fcvt s1, h151; CHECK-NOFP16-SD-NEXT: fcvt s0, h052; CHECK-NOFP16-SD-NEXT: fmin s0, s0, s153; CHECK-NOFP16-SD-NEXT: fcvt h0, s054; CHECK-NOFP16-SD-NEXT: ret55;56; CHECK-FP16-SD-LABEL: min_f16:57; CHECK-FP16-SD: // %bb.0: // %entry58; CHECK-FP16-SD-NEXT: fmin h0, h0, h159; CHECK-FP16-SD-NEXT: ret60;61; CHECK-NOFP16-GI-LABEL: min_f16:62; CHECK-NOFP16-GI: // %bb.0: // %entry63; CHECK-NOFP16-GI-NEXT: fcvt s0, h064; CHECK-NOFP16-GI-NEXT: fcvt s1, h165; CHECK-NOFP16-GI-NEXT: fmin s0, s0, s166; CHECK-NOFP16-GI-NEXT: fcvt h0, s067; CHECK-NOFP16-GI-NEXT: ret68;69; CHECK-FP16-GI-LABEL: min_f16:70; CHECK-FP16-GI: // %bb.0: // %entry71; CHECK-FP16-GI-NEXT: fmin h0, h0, h172; CHECK-FP16-GI-NEXT: ret73entry:74 %c = call half @llvm.minimum.f16(half %a, half %b)75 ret half %c76}77 78define half @max_f16(half %a, half %b) {79; CHECK-NOFP16-SD-LABEL: max_f16:80; CHECK-NOFP16-SD: // %bb.0: // %entry81; CHECK-NOFP16-SD-NEXT: fcvt s1, h182; CHECK-NOFP16-SD-NEXT: fcvt s0, h083; CHECK-NOFP16-SD-NEXT: fmax s0, s0, s184; CHECK-NOFP16-SD-NEXT: fcvt h0, s085; CHECK-NOFP16-SD-NEXT: ret86;87; CHECK-FP16-SD-LABEL: max_f16:88; CHECK-FP16-SD: // %bb.0: // %entry89; CHECK-FP16-SD-NEXT: fmax h0, h0, h190; CHECK-FP16-SD-NEXT: ret91;92; CHECK-NOFP16-GI-LABEL: max_f16:93; CHECK-NOFP16-GI: // %bb.0: // %entry94; CHECK-NOFP16-GI-NEXT: fcvt s0, h095; CHECK-NOFP16-GI-NEXT: fcvt s1, h196; CHECK-NOFP16-GI-NEXT: fmax s0, s0, s197; CHECK-NOFP16-GI-NEXT: fcvt h0, s098; CHECK-NOFP16-GI-NEXT: ret99;100; CHECK-FP16-GI-LABEL: max_f16:101; CHECK-FP16-GI: // %bb.0: // %entry102; CHECK-FP16-GI-NEXT: fmax h0, h0, h1103; CHECK-FP16-GI-NEXT: ret104entry:105 %c = call half @llvm.maximum.f16(half %a, half %b)106 ret half %c107}108 109define <2 x double> @min_v2f64(<2 x double> %a, <2 x double> %b) {110; CHECK-LABEL: min_v2f64:111; CHECK: // %bb.0: // %entry112; CHECK-NEXT: fmin v0.2d, v0.2d, v1.2d113; CHECK-NEXT: ret114entry:115 %c = call <2 x double> @llvm.minimum.v2f64(<2 x double> %a, <2 x double> %b)116 ret <2 x double> %c117}118 119define <2 x double> @max_v2f64(<2 x double> %a, <2 x double> %b) {120; CHECK-LABEL: max_v2f64:121; CHECK: // %bb.0: // %entry122; CHECK-NEXT: fmax v0.2d, v0.2d, v1.2d123; CHECK-NEXT: ret124entry:125 %c = call <2 x double> @llvm.maximum.v2f64(<2 x double> %a, <2 x double> %b)126 ret <2 x double> %c127}128 129define <3 x double> @min_v3f64(<3 x double> %a, <3 x double> %b) {130; CHECK-SD-LABEL: min_v3f64:131; CHECK-SD: // %bb.0: // %entry132; CHECK-SD-NEXT: // kill: def $d3 killed $d3 def $q3133; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0134; CHECK-SD-NEXT: // kill: def $d4 killed $d4 def $q4135; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1136; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q2137; CHECK-SD-NEXT: // kill: def $d5 killed $d5 def $q5138; CHECK-SD-NEXT: mov v3.d[1], v4.d[0]139; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]140; CHECK-SD-NEXT: fmin v2.2d, v2.2d, v5.2d141; CHECK-SD-NEXT: // kill: def $d2 killed $d2 killed $q2142; CHECK-SD-NEXT: fmin v0.2d, v0.2d, v3.2d143; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8144; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0145; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1146; CHECK-SD-NEXT: ret147;148; CHECK-GI-LABEL: min_v3f64:149; CHECK-GI: // %bb.0: // %entry150; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0151; CHECK-GI-NEXT: // kill: def $d3 killed $d3 def $q3152; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1153; CHECK-GI-NEXT: // kill: def $d4 killed $d4 def $q4154; CHECK-GI-NEXT: fmin d2, d2, d5155; CHECK-GI-NEXT: mov v0.d[1], v1.d[0]156; CHECK-GI-NEXT: mov v3.d[1], v4.d[0]157; CHECK-GI-NEXT: fmin v0.2d, v0.2d, v3.2d158; CHECK-GI-NEXT: mov d1, v0.d[1]159; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0160; CHECK-GI-NEXT: ret161entry:162 %c = call <3 x double> @llvm.minimum.v3f64(<3 x double> %a, <3 x double> %b)163 ret <3 x double> %c164}165 166define <3 x double> @max_v3f64(<3 x double> %a, <3 x double> %b) {167; CHECK-SD-LABEL: max_v3f64:168; CHECK-SD: // %bb.0: // %entry169; CHECK-SD-NEXT: // kill: def $d3 killed $d3 def $q3170; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0171; CHECK-SD-NEXT: // kill: def $d4 killed $d4 def $q4172; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1173; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q2174; CHECK-SD-NEXT: // kill: def $d5 killed $d5 def $q5175; CHECK-SD-NEXT: mov v3.d[1], v4.d[0]176; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]177; CHECK-SD-NEXT: fmax v2.2d, v2.2d, v5.2d178; CHECK-SD-NEXT: // kill: def $d2 killed $d2 killed $q2179; CHECK-SD-NEXT: fmax v0.2d, v0.2d, v3.2d180; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8181; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0182; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1183; CHECK-SD-NEXT: ret184;185; CHECK-GI-LABEL: max_v3f64:186; CHECK-GI: // %bb.0: // %entry187; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0188; CHECK-GI-NEXT: // kill: def $d3 killed $d3 def $q3189; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1190; CHECK-GI-NEXT: // kill: def $d4 killed $d4 def $q4191; CHECK-GI-NEXT: fmax d2, d2, d5192; CHECK-GI-NEXT: mov v0.d[1], v1.d[0]193; CHECK-GI-NEXT: mov v3.d[1], v4.d[0]194; CHECK-GI-NEXT: fmax v0.2d, v0.2d, v3.2d195; CHECK-GI-NEXT: mov d1, v0.d[1]196; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0197; CHECK-GI-NEXT: ret198entry:199 %c = call <3 x double> @llvm.maximum.v3f64(<3 x double> %a, <3 x double> %b)200 ret <3 x double> %c201}202 203define <4 x double> @min_v4f64(<4 x double> %a, <4 x double> %b) {204; CHECK-SD-LABEL: min_v4f64:205; CHECK-SD: // %bb.0: // %entry206; CHECK-SD-NEXT: fmin v1.2d, v1.2d, v3.2d207; CHECK-SD-NEXT: fmin v0.2d, v0.2d, v2.2d208; CHECK-SD-NEXT: ret209;210; CHECK-GI-LABEL: min_v4f64:211; CHECK-GI: // %bb.0: // %entry212; CHECK-GI-NEXT: fmin v0.2d, v0.2d, v2.2d213; CHECK-GI-NEXT: fmin v1.2d, v1.2d, v3.2d214; CHECK-GI-NEXT: ret215entry:216 %c = call <4 x double> @llvm.minimum.v4f64(<4 x double> %a, <4 x double> %b)217 ret <4 x double> %c218}219 220define <4 x double> @max_v4f64(<4 x double> %a, <4 x double> %b) {221; CHECK-SD-LABEL: max_v4f64:222; CHECK-SD: // %bb.0: // %entry223; CHECK-SD-NEXT: fmax v1.2d, v1.2d, v3.2d224; CHECK-SD-NEXT: fmax v0.2d, v0.2d, v2.2d225; CHECK-SD-NEXT: ret226;227; CHECK-GI-LABEL: max_v4f64:228; CHECK-GI: // %bb.0: // %entry229; CHECK-GI-NEXT: fmax v0.2d, v0.2d, v2.2d230; CHECK-GI-NEXT: fmax v1.2d, v1.2d, v3.2d231; CHECK-GI-NEXT: ret232entry:233 %c = call <4 x double> @llvm.maximum.v4f64(<4 x double> %a, <4 x double> %b)234 ret <4 x double> %c235}236 237define <2 x float> @min_v2f32(<2 x float> %a, <2 x float> %b) {238; CHECK-LABEL: min_v2f32:239; CHECK: // %bb.0: // %entry240; CHECK-NEXT: fmin v0.2s, v0.2s, v1.2s241; CHECK-NEXT: ret242entry:243 %c = call <2 x float> @llvm.minimum.v2f32(<2 x float> %a, <2 x float> %b)244 ret <2 x float> %c245}246 247define <2 x float> @max_v2f32(<2 x float> %a, <2 x float> %b) {248; CHECK-LABEL: max_v2f32:249; CHECK: // %bb.0: // %entry250; CHECK-NEXT: fmax v0.2s, v0.2s, v1.2s251; CHECK-NEXT: ret252entry:253 %c = call <2 x float> @llvm.maximum.v2f32(<2 x float> %a, <2 x float> %b)254 ret <2 x float> %c255}256 257define <3 x float> @min_v3f32(<3 x float> %a, <3 x float> %b) {258; CHECK-LABEL: min_v3f32:259; CHECK: // %bb.0: // %entry260; CHECK-NEXT: fmin v0.4s, v0.4s, v1.4s261; CHECK-NEXT: ret262entry:263 %c = call <3 x float> @llvm.minimum.v3f32(<3 x float> %a, <3 x float> %b)264 ret <3 x float> %c265}266 267define <3 x float> @max_v3f32(<3 x float> %a, <3 x float> %b) {268; CHECK-LABEL: max_v3f32:269; CHECK: // %bb.0: // %entry270; CHECK-NEXT: fmax v0.4s, v0.4s, v1.4s271; CHECK-NEXT: ret272entry:273 %c = call <3 x float> @llvm.maximum.v3f32(<3 x float> %a, <3 x float> %b)274 ret <3 x float> %c275}276 277define <4 x float> @min_v4f32(<4 x float> %a, <4 x float> %b) {278; CHECK-LABEL: min_v4f32:279; CHECK: // %bb.0: // %entry280; CHECK-NEXT: fmin v0.4s, v0.4s, v1.4s281; CHECK-NEXT: ret282entry:283 %c = call <4 x float> @llvm.minimum.v4f32(<4 x float> %a, <4 x float> %b)284 ret <4 x float> %c285}286 287define <4 x float> @max_v4f32(<4 x float> %a, <4 x float> %b) {288; CHECK-LABEL: max_v4f32:289; CHECK: // %bb.0: // %entry290; CHECK-NEXT: fmax v0.4s, v0.4s, v1.4s291; CHECK-NEXT: ret292entry:293 %c = call <4 x float> @llvm.maximum.v4f32(<4 x float> %a, <4 x float> %b)294 ret <4 x float> %c295}296 297define <7 x float> @min_v7f32(<7 x float> %a, <7 x float> %b) {298; CHECK-SD-LABEL: min_v7f32:299; CHECK-SD: // %bb.0: // %entry300; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0301; CHECK-SD-NEXT: // kill: def $s1 killed $s1 def $q1302; CHECK-SD-NEXT: // kill: def $s7 killed $s7 def $q7303; CHECK-SD-NEXT: mov x8, sp304; CHECK-SD-NEXT: // kill: def $s4 killed $s4 def $q4305; CHECK-SD-NEXT: // kill: def $s5 killed $s5 def $q5306; CHECK-SD-NEXT: // kill: def $s2 killed $s2 def $q2307; CHECK-SD-NEXT: // kill: def $s6 killed $s6 def $q6308; CHECK-SD-NEXT: // kill: def $s3 killed $s3 def $q3309; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]310; CHECK-SD-NEXT: ld1 { v7.s }[1], [x8]311; CHECK-SD-NEXT: ldr s1, [sp, #24]312; CHECK-SD-NEXT: add x8, sp, #8313; CHECK-SD-NEXT: mov v4.s[1], v5.s[0]314; CHECK-SD-NEXT: ld1 { v7.s }[2], [x8]315; CHECK-SD-NEXT: add x8, sp, #32316; CHECK-SD-NEXT: mov v0.s[2], v2.s[0]317; CHECK-SD-NEXT: ld1 { v1.s }[1], [x8]318; CHECK-SD-NEXT: add x8, sp, #16319; CHECK-SD-NEXT: mov v4.s[2], v6.s[0]320; CHECK-SD-NEXT: ld1 { v7.s }[3], [x8]321; CHECK-SD-NEXT: add x8, sp, #40322; CHECK-SD-NEXT: ld1 { v1.s }[2], [x8]323; CHECK-SD-NEXT: mov v0.s[3], v3.s[0]324; CHECK-SD-NEXT: fmin v4.4s, v4.4s, v1.4s325; CHECK-SD-NEXT: fmin v0.4s, v0.4s, v7.4s326; CHECK-SD-NEXT: mov s5, v4.s[1]327; CHECK-SD-NEXT: mov s6, v4.s[2]328; CHECK-SD-NEXT: // kill: def $s4 killed $s4 killed $q4329; CHECK-SD-NEXT: mov s1, v0.s[1]330; CHECK-SD-NEXT: mov s2, v0.s[2]331; CHECK-SD-NEXT: mov s3, v0.s[3]332; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0333; CHECK-SD-NEXT: ret334;335; CHECK-GI-LABEL: min_v7f32:336; CHECK-GI: // %bb.0: // %entry337; CHECK-GI-NEXT: ldr s16, [sp]338; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0339; CHECK-GI-NEXT: // kill: def $s7 killed $s7 def $q7340; CHECK-GI-NEXT: // kill: def $s1 killed $s1 def $q1341; CHECK-GI-NEXT: ldr s17, [sp, #32]342; CHECK-GI-NEXT: // kill: def $s4 killed $s4 def $q4343; CHECK-GI-NEXT: // kill: def $s2 killed $s2 def $q2344; CHECK-GI-NEXT: // kill: def $s5 killed $s5 def $q5345; CHECK-GI-NEXT: // kill: def $s3 killed $s3 def $q3346; CHECK-GI-NEXT: // kill: def $s6 killed $s6 def $q6347; CHECK-GI-NEXT: mov v0.s[1], v1.s[0]348; CHECK-GI-NEXT: ldr s1, [sp, #8]349; CHECK-GI-NEXT: mov v4.s[1], v5.s[0]350; CHECK-GI-NEXT: mov v7.s[1], v16.s[0]351; CHECK-GI-NEXT: ldr s16, [sp, #24]352; CHECK-GI-NEXT: mov v16.s[1], v17.s[0]353; CHECK-GI-NEXT: mov v0.s[2], v2.s[0]354; CHECK-GI-NEXT: ldr s2, [sp, #40]355; CHECK-GI-NEXT: mov v4.s[2], v6.s[0]356; CHECK-GI-NEXT: mov v7.s[2], v1.s[0]357; CHECK-GI-NEXT: ldr s1, [sp, #16]358; CHECK-GI-NEXT: mov v16.s[2], v2.s[0]359; CHECK-GI-NEXT: mov v0.s[3], v3.s[0]360; CHECK-GI-NEXT: mov v7.s[3], v1.s[0]361; CHECK-GI-NEXT: fmin v4.4s, v4.4s, v16.4s362; CHECK-GI-NEXT: fmin v0.4s, v0.4s, v7.4s363; CHECK-GI-NEXT: mov s5, v4.s[1]364; CHECK-GI-NEXT: mov s6, v4.s[2]365; CHECK-GI-NEXT: // kill: def $s4 killed $s4 killed $q4366; CHECK-GI-NEXT: mov s1, v0.s[1]367; CHECK-GI-NEXT: mov s2, v0.s[2]368; CHECK-GI-NEXT: mov s3, v0.s[3]369; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q0370; CHECK-GI-NEXT: ret371entry:372 %c = call <7 x float> @llvm.minimum.v7f32(<7 x float> %a, <7 x float> %b)373 ret <7 x float> %c374}375 376define <7 x float> @max_v7f32(<7 x float> %a, <7 x float> %b) {377; CHECK-SD-LABEL: max_v7f32:378; CHECK-SD: // %bb.0: // %entry379; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0380; CHECK-SD-NEXT: // kill: def $s1 killed $s1 def $q1381; CHECK-SD-NEXT: // kill: def $s7 killed $s7 def $q7382; CHECK-SD-NEXT: mov x8, sp383; CHECK-SD-NEXT: // kill: def $s4 killed $s4 def $q4384; CHECK-SD-NEXT: // kill: def $s5 killed $s5 def $q5385; CHECK-SD-NEXT: // kill: def $s2 killed $s2 def $q2386; CHECK-SD-NEXT: // kill: def $s6 killed $s6 def $q6387; CHECK-SD-NEXT: // kill: def $s3 killed $s3 def $q3388; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]389; CHECK-SD-NEXT: ld1 { v7.s }[1], [x8]390; CHECK-SD-NEXT: ldr s1, [sp, #24]391; CHECK-SD-NEXT: add x8, sp, #8392; CHECK-SD-NEXT: mov v4.s[1], v5.s[0]393; CHECK-SD-NEXT: ld1 { v7.s }[2], [x8]394; CHECK-SD-NEXT: add x8, sp, #32395; CHECK-SD-NEXT: mov v0.s[2], v2.s[0]396; CHECK-SD-NEXT: ld1 { v1.s }[1], [x8]397; CHECK-SD-NEXT: add x8, sp, #16398; CHECK-SD-NEXT: mov v4.s[2], v6.s[0]399; CHECK-SD-NEXT: ld1 { v7.s }[3], [x8]400; CHECK-SD-NEXT: add x8, sp, #40401; CHECK-SD-NEXT: ld1 { v1.s }[2], [x8]402; CHECK-SD-NEXT: mov v0.s[3], v3.s[0]403; CHECK-SD-NEXT: fmax v4.4s, v4.4s, v1.4s404; CHECK-SD-NEXT: fmax v0.4s, v0.4s, v7.4s405; CHECK-SD-NEXT: mov s5, v4.s[1]406; CHECK-SD-NEXT: mov s6, v4.s[2]407; CHECK-SD-NEXT: // kill: def $s4 killed $s4 killed $q4408; CHECK-SD-NEXT: mov s1, v0.s[1]409; CHECK-SD-NEXT: mov s2, v0.s[2]410; CHECK-SD-NEXT: mov s3, v0.s[3]411; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0412; CHECK-SD-NEXT: ret413;414; CHECK-GI-LABEL: max_v7f32:415; CHECK-GI: // %bb.0: // %entry416; CHECK-GI-NEXT: ldr s16, [sp]417; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0418; CHECK-GI-NEXT: // kill: def $s7 killed $s7 def $q7419; CHECK-GI-NEXT: // kill: def $s1 killed $s1 def $q1420; CHECK-GI-NEXT: ldr s17, [sp, #32]421; CHECK-GI-NEXT: // kill: def $s4 killed $s4 def $q4422; CHECK-GI-NEXT: // kill: def $s2 killed $s2 def $q2423; CHECK-GI-NEXT: // kill: def $s5 killed $s5 def $q5424; CHECK-GI-NEXT: // kill: def $s3 killed $s3 def $q3425; CHECK-GI-NEXT: // kill: def $s6 killed $s6 def $q6426; CHECK-GI-NEXT: mov v0.s[1], v1.s[0]427; CHECK-GI-NEXT: ldr s1, [sp, #8]428; CHECK-GI-NEXT: mov v4.s[1], v5.s[0]429; CHECK-GI-NEXT: mov v7.s[1], v16.s[0]430; CHECK-GI-NEXT: ldr s16, [sp, #24]431; CHECK-GI-NEXT: mov v16.s[1], v17.s[0]432; CHECK-GI-NEXT: mov v0.s[2], v2.s[0]433; CHECK-GI-NEXT: ldr s2, [sp, #40]434; CHECK-GI-NEXT: mov v4.s[2], v6.s[0]435; CHECK-GI-NEXT: mov v7.s[2], v1.s[0]436; CHECK-GI-NEXT: ldr s1, [sp, #16]437; CHECK-GI-NEXT: mov v16.s[2], v2.s[0]438; CHECK-GI-NEXT: mov v0.s[3], v3.s[0]439; CHECK-GI-NEXT: mov v7.s[3], v1.s[0]440; CHECK-GI-NEXT: fmax v4.4s, v4.4s, v16.4s441; CHECK-GI-NEXT: fmax v0.4s, v0.4s, v7.4s442; CHECK-GI-NEXT: mov s5, v4.s[1]443; CHECK-GI-NEXT: mov s6, v4.s[2]444; CHECK-GI-NEXT: // kill: def $s4 killed $s4 killed $q4445; CHECK-GI-NEXT: mov s1, v0.s[1]446; CHECK-GI-NEXT: mov s2, v0.s[2]447; CHECK-GI-NEXT: mov s3, v0.s[3]448; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q0449; CHECK-GI-NEXT: ret450entry:451 %c = call <7 x float> @llvm.maximum.v7f32(<7 x float> %a, <7 x float> %b)452 ret <7 x float> %c453}454 455define <8 x float> @min_v8f32(<8 x float> %a, <8 x float> %b) {456; CHECK-SD-LABEL: min_v8f32:457; CHECK-SD: // %bb.0: // %entry458; CHECK-SD-NEXT: fmin v1.4s, v1.4s, v3.4s459; CHECK-SD-NEXT: fmin v0.4s, v0.4s, v2.4s460; CHECK-SD-NEXT: ret461;462; CHECK-GI-LABEL: min_v8f32:463; CHECK-GI: // %bb.0: // %entry464; CHECK-GI-NEXT: fmin v0.4s, v0.4s, v2.4s465; CHECK-GI-NEXT: fmin v1.4s, v1.4s, v3.4s466; CHECK-GI-NEXT: ret467entry:468 %c = call <8 x float> @llvm.minimum.v8f32(<8 x float> %a, <8 x float> %b)469 ret <8 x float> %c470}471 472define <8 x float> @max_v8f32(<8 x float> %a, <8 x float> %b) {473; CHECK-SD-LABEL: max_v8f32:474; CHECK-SD: // %bb.0: // %entry475; CHECK-SD-NEXT: fmax v1.4s, v1.4s, v3.4s476; CHECK-SD-NEXT: fmax v0.4s, v0.4s, v2.4s477; CHECK-SD-NEXT: ret478;479; CHECK-GI-LABEL: max_v8f32:480; CHECK-GI: // %bb.0: // %entry481; CHECK-GI-NEXT: fmax v0.4s, v0.4s, v2.4s482; CHECK-GI-NEXT: fmax v1.4s, v1.4s, v3.4s483; CHECK-GI-NEXT: ret484entry:485 %c = call <8 x float> @llvm.maximum.v8f32(<8 x float> %a, <8 x float> %b)486 ret <8 x float> %c487}488 489define <4 x half> @min_v4f16(<4 x half> %a, <4 x half> %b) {490; CHECK-NOFP16-SD-LABEL: min_v4f16:491; CHECK-NOFP16-SD: // %bb.0: // %entry492; CHECK-NOFP16-SD-NEXT: // kill: def $d1 killed $d1 def $q1493; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0494; CHECK-NOFP16-SD-NEXT: mov h2, v1.h[1]495; CHECK-NOFP16-SD-NEXT: mov h3, v0.h[1]496; CHECK-NOFP16-SD-NEXT: mov h4, v1.h[2]497; CHECK-NOFP16-SD-NEXT: mov h5, v0.h[2]498; CHECK-NOFP16-SD-NEXT: fcvt s6, h1499; CHECK-NOFP16-SD-NEXT: fcvt s7, h0500; CHECK-NOFP16-SD-NEXT: mov h1, v1.h[3]501; CHECK-NOFP16-SD-NEXT: fcvt s2, h2502; CHECK-NOFP16-SD-NEXT: fcvt s3, h3503; CHECK-NOFP16-SD-NEXT: fcvt s1, h1504; CHECK-NOFP16-SD-NEXT: fmin s2, s3, s2505; CHECK-NOFP16-SD-NEXT: fcvt s3, h4506; CHECK-NOFP16-SD-NEXT: fcvt s4, h5507; CHECK-NOFP16-SD-NEXT: fmin s5, s7, s6508; CHECK-NOFP16-SD-NEXT: mov h6, v0.h[3]509; CHECK-NOFP16-SD-NEXT: fmin s3, s4, s3510; CHECK-NOFP16-SD-NEXT: fcvt h2, s2511; CHECK-NOFP16-SD-NEXT: fcvt h0, s5512; CHECK-NOFP16-SD-NEXT: fcvt s4, h6513; CHECK-NOFP16-SD-NEXT: mov v0.h[1], v2.h[0]514; CHECK-NOFP16-SD-NEXT: fcvt h2, s3515; CHECK-NOFP16-SD-NEXT: fmin s1, s4, s1516; CHECK-NOFP16-SD-NEXT: mov v0.h[2], v2.h[0]517; CHECK-NOFP16-SD-NEXT: fcvt h1, s1518; CHECK-NOFP16-SD-NEXT: mov v0.h[3], v1.h[0]519; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 killed $q0520; CHECK-NOFP16-SD-NEXT: ret521;522; CHECK-FP16-SD-LABEL: min_v4f16:523; CHECK-FP16-SD: // %bb.0: // %entry524; CHECK-FP16-SD-NEXT: fmin v0.4h, v0.4h, v1.4h525; CHECK-FP16-SD-NEXT: ret526;527; CHECK-NOFP16-GI-LABEL: min_v4f16:528; CHECK-NOFP16-GI: // %bb.0: // %entry529; CHECK-NOFP16-GI-NEXT: fcvtl v0.4s, v0.4h530; CHECK-NOFP16-GI-NEXT: fcvtl v1.4s, v1.4h531; CHECK-NOFP16-GI-NEXT: fmin v0.4s, v0.4s, v1.4s532; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v0.4s533; CHECK-NOFP16-GI-NEXT: ret534;535; CHECK-FP16-GI-LABEL: min_v4f16:536; CHECK-FP16-GI: // %bb.0: // %entry537; CHECK-FP16-GI-NEXT: fmin v0.4h, v0.4h, v1.4h538; CHECK-FP16-GI-NEXT: ret539entry:540 %c = call <4 x half> @llvm.minimum.v4f16(<4 x half> %a, <4 x half> %b)541 ret <4 x half> %c542}543 544define <4 x half> @max_v4f16(<4 x half> %a, <4 x half> %b) {545; CHECK-NOFP16-SD-LABEL: max_v4f16:546; CHECK-NOFP16-SD: // %bb.0: // %entry547; CHECK-NOFP16-SD-NEXT: // kill: def $d1 killed $d1 def $q1548; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0549; CHECK-NOFP16-SD-NEXT: mov h2, v1.h[1]550; CHECK-NOFP16-SD-NEXT: mov h3, v0.h[1]551; CHECK-NOFP16-SD-NEXT: mov h4, v1.h[2]552; CHECK-NOFP16-SD-NEXT: mov h5, v0.h[2]553; CHECK-NOFP16-SD-NEXT: fcvt s6, h1554; CHECK-NOFP16-SD-NEXT: fcvt s7, h0555; CHECK-NOFP16-SD-NEXT: mov h1, v1.h[3]556; CHECK-NOFP16-SD-NEXT: fcvt s2, h2557; CHECK-NOFP16-SD-NEXT: fcvt s3, h3558; CHECK-NOFP16-SD-NEXT: fcvt s1, h1559; CHECK-NOFP16-SD-NEXT: fmax s2, s3, s2560; CHECK-NOFP16-SD-NEXT: fcvt s3, h4561; CHECK-NOFP16-SD-NEXT: fcvt s4, h5562; CHECK-NOFP16-SD-NEXT: fmax s5, s7, s6563; CHECK-NOFP16-SD-NEXT: mov h6, v0.h[3]564; CHECK-NOFP16-SD-NEXT: fmax s3, s4, s3565; CHECK-NOFP16-SD-NEXT: fcvt h2, s2566; CHECK-NOFP16-SD-NEXT: fcvt h0, s5567; CHECK-NOFP16-SD-NEXT: fcvt s4, h6568; CHECK-NOFP16-SD-NEXT: mov v0.h[1], v2.h[0]569; CHECK-NOFP16-SD-NEXT: fcvt h2, s3570; CHECK-NOFP16-SD-NEXT: fmax s1, s4, s1571; CHECK-NOFP16-SD-NEXT: mov v0.h[2], v2.h[0]572; CHECK-NOFP16-SD-NEXT: fcvt h1, s1573; CHECK-NOFP16-SD-NEXT: mov v0.h[3], v1.h[0]574; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 killed $q0575; CHECK-NOFP16-SD-NEXT: ret576;577; CHECK-FP16-SD-LABEL: max_v4f16:578; CHECK-FP16-SD: // %bb.0: // %entry579; CHECK-FP16-SD-NEXT: fmax v0.4h, v0.4h, v1.4h580; CHECK-FP16-SD-NEXT: ret581;582; CHECK-NOFP16-GI-LABEL: max_v4f16:583; CHECK-NOFP16-GI: // %bb.0: // %entry584; CHECK-NOFP16-GI-NEXT: fcvtl v0.4s, v0.4h585; CHECK-NOFP16-GI-NEXT: fcvtl v1.4s, v1.4h586; CHECK-NOFP16-GI-NEXT: fmax v0.4s, v0.4s, v1.4s587; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v0.4s588; CHECK-NOFP16-GI-NEXT: ret589;590; CHECK-FP16-GI-LABEL: max_v4f16:591; CHECK-FP16-GI: // %bb.0: // %entry592; CHECK-FP16-GI-NEXT: fmax v0.4h, v0.4h, v1.4h593; CHECK-FP16-GI-NEXT: ret594entry:595 %c = call <4 x half> @llvm.maximum.v4f16(<4 x half> %a, <4 x half> %b)596 ret <4 x half> %c597}598 599define <7 x half> @min_v7f16(<7 x half> %a, <7 x half> %b) {600; CHECK-NOFP16-SD-LABEL: min_v7f16:601; CHECK-NOFP16-SD: // %bb.0: // %entry602; CHECK-NOFP16-SD-NEXT: mov h2, v1.h[1]603; CHECK-NOFP16-SD-NEXT: mov h3, v0.h[1]604; CHECK-NOFP16-SD-NEXT: fcvt s4, h1605; CHECK-NOFP16-SD-NEXT: fcvt s5, h0606; CHECK-NOFP16-SD-NEXT: mov h6, v1.h[2]607; CHECK-NOFP16-SD-NEXT: mov h7, v0.h[2]608; CHECK-NOFP16-SD-NEXT: mov h16, v1.h[3]609; CHECK-NOFP16-SD-NEXT: fcvt s2, h2610; CHECK-NOFP16-SD-NEXT: fcvt s3, h3611; CHECK-NOFP16-SD-NEXT: fmin s4, s5, s4612; CHECK-NOFP16-SD-NEXT: mov h5, v0.h[3]613; CHECK-NOFP16-SD-NEXT: fcvt s6, h6614; CHECK-NOFP16-SD-NEXT: fcvt s7, h7615; CHECK-NOFP16-SD-NEXT: fcvt s16, h16616; CHECK-NOFP16-SD-NEXT: fmin s3, s3, s2617; CHECK-NOFP16-SD-NEXT: fcvt s5, h5618; CHECK-NOFP16-SD-NEXT: fcvt h2, s4619; CHECK-NOFP16-SD-NEXT: fmin s4, s7, s6620; CHECK-NOFP16-SD-NEXT: mov h6, v1.h[4]621; CHECK-NOFP16-SD-NEXT: mov h7, v0.h[4]622; CHECK-NOFP16-SD-NEXT: fcvt h3, s3623; CHECK-NOFP16-SD-NEXT: fmin s5, s5, s16624; CHECK-NOFP16-SD-NEXT: mov h16, v0.h[5]625; CHECK-NOFP16-SD-NEXT: fcvt h4, s4626; CHECK-NOFP16-SD-NEXT: mov v2.h[1], v3.h[0]627; CHECK-NOFP16-SD-NEXT: fcvt s3, h6628; CHECK-NOFP16-SD-NEXT: fcvt s6, h7629; CHECK-NOFP16-SD-NEXT: mov h7, v1.h[5]630; CHECK-NOFP16-SD-NEXT: fcvt h5, s5631; CHECK-NOFP16-SD-NEXT: fcvt s16, h16632; CHECK-NOFP16-SD-NEXT: mov v2.h[2], v4.h[0]633; CHECK-NOFP16-SD-NEXT: mov h4, v1.h[6]634; CHECK-NOFP16-SD-NEXT: fmin s3, s6, s3635; CHECK-NOFP16-SD-NEXT: mov h6, v0.h[6]636; CHECK-NOFP16-SD-NEXT: fcvt s7, h7637; CHECK-NOFP16-SD-NEXT: mov h1, v1.h[7]638; CHECK-NOFP16-SD-NEXT: mov h0, v0.h[7]639; CHECK-NOFP16-SD-NEXT: mov v2.h[3], v5.h[0]640; CHECK-NOFP16-SD-NEXT: fcvt s4, h4641; CHECK-NOFP16-SD-NEXT: fcvt h3, s3642; CHECK-NOFP16-SD-NEXT: fcvt s5, h6643; CHECK-NOFP16-SD-NEXT: fmin s6, s16, s7644; CHECK-NOFP16-SD-NEXT: fcvt s1, h1645; CHECK-NOFP16-SD-NEXT: fcvt s0, h0646; CHECK-NOFP16-SD-NEXT: mov v2.h[4], v3.h[0]647; CHECK-NOFP16-SD-NEXT: fmin s4, s5, s4648; CHECK-NOFP16-SD-NEXT: fcvt h3, s6649; CHECK-NOFP16-SD-NEXT: fmin s0, s0, s1650; CHECK-NOFP16-SD-NEXT: mov v2.h[5], v3.h[0]651; CHECK-NOFP16-SD-NEXT: fcvt h3, s4652; CHECK-NOFP16-SD-NEXT: fcvt h0, s0653; CHECK-NOFP16-SD-NEXT: mov v2.h[6], v3.h[0]654; CHECK-NOFP16-SD-NEXT: mov v2.h[7], v0.h[0]655; CHECK-NOFP16-SD-NEXT: mov v0.16b, v2.16b656; CHECK-NOFP16-SD-NEXT: ret657;658; CHECK-FP16-SD-LABEL: min_v7f16:659; CHECK-FP16-SD: // %bb.0: // %entry660; CHECK-FP16-SD-NEXT: fmin v0.8h, v0.8h, v1.8h661; CHECK-FP16-SD-NEXT: ret662;663; CHECK-NOFP16-GI-LABEL: min_v7f16:664; CHECK-NOFP16-GI: // %bb.0: // %entry665; CHECK-NOFP16-GI-NEXT: fcvtl v2.4s, v0.4h666; CHECK-NOFP16-GI-NEXT: fcvtl v3.4s, v1.4h667; CHECK-NOFP16-GI-NEXT: mov v4.h[0], v0.h[4]668; CHECK-NOFP16-GI-NEXT: fmin v2.4s, v2.4s, v3.4s669; CHECK-NOFP16-GI-NEXT: mov v3.h[0], v1.h[4]670; CHECK-NOFP16-GI-NEXT: mov v4.h[1], v0.h[5]671; CHECK-NOFP16-GI-NEXT: mov v3.h[1], v1.h[5]672; CHECK-NOFP16-GI-NEXT: fcvtn v2.4h, v2.4s673; CHECK-NOFP16-GI-NEXT: mov v4.h[2], v0.h[6]674; CHECK-NOFP16-GI-NEXT: mov v3.h[2], v1.h[6]675; CHECK-NOFP16-GI-NEXT: mov v0.h[0], v2.h[0]676; CHECK-NOFP16-GI-NEXT: fcvtl v1.4s, v4.4h677; CHECK-NOFP16-GI-NEXT: fcvtl v3.4s, v3.4h678; CHECK-NOFP16-GI-NEXT: mov v0.h[1], v2.h[1]679; CHECK-NOFP16-GI-NEXT: fmin v1.4s, v1.4s, v3.4s680; CHECK-NOFP16-GI-NEXT: mov v0.h[2], v2.h[2]681; CHECK-NOFP16-GI-NEXT: fcvtn v1.4h, v1.4s682; CHECK-NOFP16-GI-NEXT: mov v0.h[3], v2.h[3]683; CHECK-NOFP16-GI-NEXT: mov v0.h[4], v1.h[0]684; CHECK-NOFP16-GI-NEXT: mov v0.h[5], v1.h[1]685; CHECK-NOFP16-GI-NEXT: mov v0.h[6], v1.h[2]686; CHECK-NOFP16-GI-NEXT: ret687;688; CHECK-FP16-GI-LABEL: min_v7f16:689; CHECK-FP16-GI: // %bb.0: // %entry690; CHECK-FP16-GI-NEXT: fmin v0.8h, v0.8h, v1.8h691; CHECK-FP16-GI-NEXT: ret692entry:693 %c = call <7 x half> @llvm.minimum.v7f16(<7 x half> %a, <7 x half> %b)694 ret <7 x half> %c695}696 697define <7 x half> @max_v7f16(<7 x half> %a, <7 x half> %b) {698; CHECK-NOFP16-SD-LABEL: max_v7f16:699; CHECK-NOFP16-SD: // %bb.0: // %entry700; CHECK-NOFP16-SD-NEXT: mov h2, v1.h[1]701; CHECK-NOFP16-SD-NEXT: mov h3, v0.h[1]702; CHECK-NOFP16-SD-NEXT: fcvt s4, h1703; CHECK-NOFP16-SD-NEXT: fcvt s5, h0704; CHECK-NOFP16-SD-NEXT: mov h6, v1.h[2]705; CHECK-NOFP16-SD-NEXT: mov h7, v0.h[2]706; CHECK-NOFP16-SD-NEXT: mov h16, v1.h[3]707; CHECK-NOFP16-SD-NEXT: fcvt s2, h2708; CHECK-NOFP16-SD-NEXT: fcvt s3, h3709; CHECK-NOFP16-SD-NEXT: fmax s4, s5, s4710; CHECK-NOFP16-SD-NEXT: mov h5, v0.h[3]711; CHECK-NOFP16-SD-NEXT: fcvt s6, h6712; CHECK-NOFP16-SD-NEXT: fcvt s7, h7713; CHECK-NOFP16-SD-NEXT: fcvt s16, h16714; CHECK-NOFP16-SD-NEXT: fmax s3, s3, s2715; CHECK-NOFP16-SD-NEXT: fcvt s5, h5716; CHECK-NOFP16-SD-NEXT: fcvt h2, s4717; CHECK-NOFP16-SD-NEXT: fmax s4, s7, s6718; CHECK-NOFP16-SD-NEXT: mov h6, v1.h[4]719; CHECK-NOFP16-SD-NEXT: mov h7, v0.h[4]720; CHECK-NOFP16-SD-NEXT: fcvt h3, s3721; CHECK-NOFP16-SD-NEXT: fmax s5, s5, s16722; CHECK-NOFP16-SD-NEXT: mov h16, v0.h[5]723; CHECK-NOFP16-SD-NEXT: fcvt h4, s4724; CHECK-NOFP16-SD-NEXT: mov v2.h[1], v3.h[0]725; CHECK-NOFP16-SD-NEXT: fcvt s3, h6726; CHECK-NOFP16-SD-NEXT: fcvt s6, h7727; CHECK-NOFP16-SD-NEXT: mov h7, v1.h[5]728; CHECK-NOFP16-SD-NEXT: fcvt h5, s5729; CHECK-NOFP16-SD-NEXT: fcvt s16, h16730; CHECK-NOFP16-SD-NEXT: mov v2.h[2], v4.h[0]731; CHECK-NOFP16-SD-NEXT: mov h4, v1.h[6]732; CHECK-NOFP16-SD-NEXT: fmax s3, s6, s3733; CHECK-NOFP16-SD-NEXT: mov h6, v0.h[6]734; CHECK-NOFP16-SD-NEXT: fcvt s7, h7735; CHECK-NOFP16-SD-NEXT: mov h1, v1.h[7]736; CHECK-NOFP16-SD-NEXT: mov h0, v0.h[7]737; CHECK-NOFP16-SD-NEXT: mov v2.h[3], v5.h[0]738; CHECK-NOFP16-SD-NEXT: fcvt s4, h4739; CHECK-NOFP16-SD-NEXT: fcvt h3, s3740; CHECK-NOFP16-SD-NEXT: fcvt s5, h6741; CHECK-NOFP16-SD-NEXT: fmax s6, s16, s7742; CHECK-NOFP16-SD-NEXT: fcvt s1, h1743; CHECK-NOFP16-SD-NEXT: fcvt s0, h0744; CHECK-NOFP16-SD-NEXT: mov v2.h[4], v3.h[0]745; CHECK-NOFP16-SD-NEXT: fmax s4, s5, s4746; CHECK-NOFP16-SD-NEXT: fcvt h3, s6747; CHECK-NOFP16-SD-NEXT: fmax s0, s0, s1748; CHECK-NOFP16-SD-NEXT: mov v2.h[5], v3.h[0]749; CHECK-NOFP16-SD-NEXT: fcvt h3, s4750; CHECK-NOFP16-SD-NEXT: fcvt h0, s0751; CHECK-NOFP16-SD-NEXT: mov v2.h[6], v3.h[0]752; CHECK-NOFP16-SD-NEXT: mov v2.h[7], v0.h[0]753; CHECK-NOFP16-SD-NEXT: mov v0.16b, v2.16b754; CHECK-NOFP16-SD-NEXT: ret755;756; CHECK-FP16-SD-LABEL: max_v7f16:757; CHECK-FP16-SD: // %bb.0: // %entry758; CHECK-FP16-SD-NEXT: fmax v0.8h, v0.8h, v1.8h759; CHECK-FP16-SD-NEXT: ret760;761; CHECK-NOFP16-GI-LABEL: max_v7f16:762; CHECK-NOFP16-GI: // %bb.0: // %entry763; CHECK-NOFP16-GI-NEXT: fcvtl v2.4s, v0.4h764; CHECK-NOFP16-GI-NEXT: fcvtl v3.4s, v1.4h765; CHECK-NOFP16-GI-NEXT: mov v4.h[0], v0.h[4]766; CHECK-NOFP16-GI-NEXT: fmax v2.4s, v2.4s, v3.4s767; CHECK-NOFP16-GI-NEXT: mov v3.h[0], v1.h[4]768; CHECK-NOFP16-GI-NEXT: mov v4.h[1], v0.h[5]769; CHECK-NOFP16-GI-NEXT: mov v3.h[1], v1.h[5]770; CHECK-NOFP16-GI-NEXT: fcvtn v2.4h, v2.4s771; CHECK-NOFP16-GI-NEXT: mov v4.h[2], v0.h[6]772; CHECK-NOFP16-GI-NEXT: mov v3.h[2], v1.h[6]773; CHECK-NOFP16-GI-NEXT: mov v0.h[0], v2.h[0]774; CHECK-NOFP16-GI-NEXT: fcvtl v1.4s, v4.4h775; CHECK-NOFP16-GI-NEXT: fcvtl v3.4s, v3.4h776; CHECK-NOFP16-GI-NEXT: mov v0.h[1], v2.h[1]777; CHECK-NOFP16-GI-NEXT: fmax v1.4s, v1.4s, v3.4s778; CHECK-NOFP16-GI-NEXT: mov v0.h[2], v2.h[2]779; CHECK-NOFP16-GI-NEXT: fcvtn v1.4h, v1.4s780; CHECK-NOFP16-GI-NEXT: mov v0.h[3], v2.h[3]781; CHECK-NOFP16-GI-NEXT: mov v0.h[4], v1.h[0]782; CHECK-NOFP16-GI-NEXT: mov v0.h[5], v1.h[1]783; CHECK-NOFP16-GI-NEXT: mov v0.h[6], v1.h[2]784; CHECK-NOFP16-GI-NEXT: ret785;786; CHECK-FP16-GI-LABEL: max_v7f16:787; CHECK-FP16-GI: // %bb.0: // %entry788; CHECK-FP16-GI-NEXT: fmax v0.8h, v0.8h, v1.8h789; CHECK-FP16-GI-NEXT: ret790entry:791 %c = call <7 x half> @llvm.maximum.v7f16(<7 x half> %a, <7 x half> %b)792 ret <7 x half> %c793}794 795define <8 x half> @min_v8f16(<8 x half> %a, <8 x half> %b) {796; CHECK-NOFP16-SD-LABEL: min_v8f16:797; CHECK-NOFP16-SD: // %bb.0: // %entry798; CHECK-NOFP16-SD-NEXT: mov h2, v1.h[1]799; CHECK-NOFP16-SD-NEXT: mov h3, v0.h[1]800; CHECK-NOFP16-SD-NEXT: fcvt s4, h1801; CHECK-NOFP16-SD-NEXT: fcvt s5, h0802; CHECK-NOFP16-SD-NEXT: mov h6, v1.h[2]803; CHECK-NOFP16-SD-NEXT: mov h7, v0.h[2]804; CHECK-NOFP16-SD-NEXT: mov h16, v1.h[3]805; CHECK-NOFP16-SD-NEXT: fcvt s2, h2806; CHECK-NOFP16-SD-NEXT: fcvt s3, h3807; CHECK-NOFP16-SD-NEXT: fmin s4, s5, s4808; CHECK-NOFP16-SD-NEXT: mov h5, v0.h[3]809; CHECK-NOFP16-SD-NEXT: fcvt s6, h6810; CHECK-NOFP16-SD-NEXT: fcvt s7, h7811; CHECK-NOFP16-SD-NEXT: fcvt s16, h16812; CHECK-NOFP16-SD-NEXT: fmin s3, s3, s2813; CHECK-NOFP16-SD-NEXT: fcvt s5, h5814; CHECK-NOFP16-SD-NEXT: fcvt h2, s4815; CHECK-NOFP16-SD-NEXT: fmin s4, s7, s6816; CHECK-NOFP16-SD-NEXT: mov h6, v1.h[4]817; CHECK-NOFP16-SD-NEXT: mov h7, v0.h[4]818; CHECK-NOFP16-SD-NEXT: fcvt h3, s3819; CHECK-NOFP16-SD-NEXT: fmin s5, s5, s16820; CHECK-NOFP16-SD-NEXT: mov h16, v0.h[5]821; CHECK-NOFP16-SD-NEXT: fcvt h4, s4822; CHECK-NOFP16-SD-NEXT: mov v2.h[1], v3.h[0]823; CHECK-NOFP16-SD-NEXT: fcvt s3, h6824; CHECK-NOFP16-SD-NEXT: fcvt s6, h7825; CHECK-NOFP16-SD-NEXT: mov h7, v1.h[5]826; CHECK-NOFP16-SD-NEXT: fcvt h5, s5827; CHECK-NOFP16-SD-NEXT: fcvt s16, h16828; CHECK-NOFP16-SD-NEXT: mov v2.h[2], v4.h[0]829; CHECK-NOFP16-SD-NEXT: mov h4, v1.h[6]830; CHECK-NOFP16-SD-NEXT: fmin s3, s6, s3831; CHECK-NOFP16-SD-NEXT: mov h6, v0.h[6]832; CHECK-NOFP16-SD-NEXT: fcvt s7, h7833; CHECK-NOFP16-SD-NEXT: mov h1, v1.h[7]834; CHECK-NOFP16-SD-NEXT: mov h0, v0.h[7]835; CHECK-NOFP16-SD-NEXT: mov v2.h[3], v5.h[0]836; CHECK-NOFP16-SD-NEXT: fcvt s4, h4837; CHECK-NOFP16-SD-NEXT: fcvt h3, s3838; CHECK-NOFP16-SD-NEXT: fcvt s5, h6839; CHECK-NOFP16-SD-NEXT: fmin s6, s16, s7840; CHECK-NOFP16-SD-NEXT: fcvt s1, h1841; CHECK-NOFP16-SD-NEXT: fcvt s0, h0842; CHECK-NOFP16-SD-NEXT: mov v2.h[4], v3.h[0]843; CHECK-NOFP16-SD-NEXT: fmin s4, s5, s4844; CHECK-NOFP16-SD-NEXT: fcvt h3, s6845; CHECK-NOFP16-SD-NEXT: fmin s0, s0, s1846; CHECK-NOFP16-SD-NEXT: mov v2.h[5], v3.h[0]847; CHECK-NOFP16-SD-NEXT: fcvt h3, s4848; CHECK-NOFP16-SD-NEXT: fcvt h0, s0849; CHECK-NOFP16-SD-NEXT: mov v2.h[6], v3.h[0]850; CHECK-NOFP16-SD-NEXT: mov v2.h[7], v0.h[0]851; CHECK-NOFP16-SD-NEXT: mov v0.16b, v2.16b852; CHECK-NOFP16-SD-NEXT: ret853;854; CHECK-FP16-SD-LABEL: min_v8f16:855; CHECK-FP16-SD: // %bb.0: // %entry856; CHECK-FP16-SD-NEXT: fmin v0.8h, v0.8h, v1.8h857; CHECK-FP16-SD-NEXT: ret858;859; CHECK-NOFP16-GI-LABEL: min_v8f16:860; CHECK-NOFP16-GI: // %bb.0: // %entry861; CHECK-NOFP16-GI-NEXT: fcvtl v2.4s, v0.4h862; CHECK-NOFP16-GI-NEXT: fcvtl v3.4s, v1.4h863; CHECK-NOFP16-GI-NEXT: fcvtl2 v0.4s, v0.8h864; CHECK-NOFP16-GI-NEXT: fcvtl2 v1.4s, v1.8h865; CHECK-NOFP16-GI-NEXT: fmin v2.4s, v2.4s, v3.4s866; CHECK-NOFP16-GI-NEXT: fmin v1.4s, v0.4s, v1.4s867; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v2.4s868; CHECK-NOFP16-GI-NEXT: fcvtn2 v0.8h, v1.4s869; CHECK-NOFP16-GI-NEXT: ret870;871; CHECK-FP16-GI-LABEL: min_v8f16:872; CHECK-FP16-GI: // %bb.0: // %entry873; CHECK-FP16-GI-NEXT: fmin v0.8h, v0.8h, v1.8h874; CHECK-FP16-GI-NEXT: ret875entry:876 %c = call <8 x half> @llvm.minimum.v8f16(<8 x half> %a, <8 x half> %b)877 ret <8 x half> %c878}879 880define <8 x half> @max_v8f16(<8 x half> %a, <8 x half> %b) {881; CHECK-NOFP16-SD-LABEL: max_v8f16:882; CHECK-NOFP16-SD: // %bb.0: // %entry883; CHECK-NOFP16-SD-NEXT: mov h2, v1.h[1]884; CHECK-NOFP16-SD-NEXT: mov h3, v0.h[1]885; CHECK-NOFP16-SD-NEXT: fcvt s4, h1886; CHECK-NOFP16-SD-NEXT: fcvt s5, h0887; CHECK-NOFP16-SD-NEXT: mov h6, v1.h[2]888; CHECK-NOFP16-SD-NEXT: mov h7, v0.h[2]889; CHECK-NOFP16-SD-NEXT: mov h16, v1.h[3]890; CHECK-NOFP16-SD-NEXT: fcvt s2, h2891; CHECK-NOFP16-SD-NEXT: fcvt s3, h3892; CHECK-NOFP16-SD-NEXT: fmax s4, s5, s4893; CHECK-NOFP16-SD-NEXT: mov h5, v0.h[3]894; CHECK-NOFP16-SD-NEXT: fcvt s6, h6895; CHECK-NOFP16-SD-NEXT: fcvt s7, h7896; CHECK-NOFP16-SD-NEXT: fcvt s16, h16897; CHECK-NOFP16-SD-NEXT: fmax s3, s3, s2898; CHECK-NOFP16-SD-NEXT: fcvt s5, h5899; CHECK-NOFP16-SD-NEXT: fcvt h2, s4900; CHECK-NOFP16-SD-NEXT: fmax s4, s7, s6901; CHECK-NOFP16-SD-NEXT: mov h6, v1.h[4]902; CHECK-NOFP16-SD-NEXT: mov h7, v0.h[4]903; CHECK-NOFP16-SD-NEXT: fcvt h3, s3904; CHECK-NOFP16-SD-NEXT: fmax s5, s5, s16905; CHECK-NOFP16-SD-NEXT: mov h16, v0.h[5]906; CHECK-NOFP16-SD-NEXT: fcvt h4, s4907; CHECK-NOFP16-SD-NEXT: mov v2.h[1], v3.h[0]908; CHECK-NOFP16-SD-NEXT: fcvt s3, h6909; CHECK-NOFP16-SD-NEXT: fcvt s6, h7910; CHECK-NOFP16-SD-NEXT: mov h7, v1.h[5]911; CHECK-NOFP16-SD-NEXT: fcvt h5, s5912; CHECK-NOFP16-SD-NEXT: fcvt s16, h16913; CHECK-NOFP16-SD-NEXT: mov v2.h[2], v4.h[0]914; CHECK-NOFP16-SD-NEXT: mov h4, v1.h[6]915; CHECK-NOFP16-SD-NEXT: fmax s3, s6, s3916; CHECK-NOFP16-SD-NEXT: mov h6, v0.h[6]917; CHECK-NOFP16-SD-NEXT: fcvt s7, h7918; CHECK-NOFP16-SD-NEXT: mov h1, v1.h[7]919; CHECK-NOFP16-SD-NEXT: mov h0, v0.h[7]920; CHECK-NOFP16-SD-NEXT: mov v2.h[3], v5.h[0]921; CHECK-NOFP16-SD-NEXT: fcvt s4, h4922; CHECK-NOFP16-SD-NEXT: fcvt h3, s3923; CHECK-NOFP16-SD-NEXT: fcvt s5, h6924; CHECK-NOFP16-SD-NEXT: fmax s6, s16, s7925; CHECK-NOFP16-SD-NEXT: fcvt s1, h1926; CHECK-NOFP16-SD-NEXT: fcvt s0, h0927; CHECK-NOFP16-SD-NEXT: mov v2.h[4], v3.h[0]928; CHECK-NOFP16-SD-NEXT: fmax s4, s5, s4929; CHECK-NOFP16-SD-NEXT: fcvt h3, s6930; CHECK-NOFP16-SD-NEXT: fmax s0, s0, s1931; CHECK-NOFP16-SD-NEXT: mov v2.h[5], v3.h[0]932; CHECK-NOFP16-SD-NEXT: fcvt h3, s4933; CHECK-NOFP16-SD-NEXT: fcvt h0, s0934; CHECK-NOFP16-SD-NEXT: mov v2.h[6], v3.h[0]935; CHECK-NOFP16-SD-NEXT: mov v2.h[7], v0.h[0]936; CHECK-NOFP16-SD-NEXT: mov v0.16b, v2.16b937; CHECK-NOFP16-SD-NEXT: ret938;939; CHECK-FP16-SD-LABEL: max_v8f16:940; CHECK-FP16-SD: // %bb.0: // %entry941; CHECK-FP16-SD-NEXT: fmax v0.8h, v0.8h, v1.8h942; CHECK-FP16-SD-NEXT: ret943;944; CHECK-NOFP16-GI-LABEL: max_v8f16:945; CHECK-NOFP16-GI: // %bb.0: // %entry946; CHECK-NOFP16-GI-NEXT: fcvtl v2.4s, v0.4h947; CHECK-NOFP16-GI-NEXT: fcvtl v3.4s, v1.4h948; CHECK-NOFP16-GI-NEXT: fcvtl2 v0.4s, v0.8h949; CHECK-NOFP16-GI-NEXT: fcvtl2 v1.4s, v1.8h950; CHECK-NOFP16-GI-NEXT: fmax v2.4s, v2.4s, v3.4s951; CHECK-NOFP16-GI-NEXT: fmax v1.4s, v0.4s, v1.4s952; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v2.4s953; CHECK-NOFP16-GI-NEXT: fcvtn2 v0.8h, v1.4s954; CHECK-NOFP16-GI-NEXT: ret955;956; CHECK-FP16-GI-LABEL: max_v8f16:957; CHECK-FP16-GI: // %bb.0: // %entry958; CHECK-FP16-GI-NEXT: fmax v0.8h, v0.8h, v1.8h959; CHECK-FP16-GI-NEXT: ret960entry:961 %c = call <8 x half> @llvm.maximum.v8f16(<8 x half> %a, <8 x half> %b)962 ret <8 x half> %c963}964 965define <16 x half> @min_v16f16(<16 x half> %a, <16 x half> %b) {966; CHECK-NOFP16-SD-LABEL: min_v16f16:967; CHECK-NOFP16-SD: // %bb.0: // %entry968; CHECK-NOFP16-SD-NEXT: mov h6, v2.h[1]969; CHECK-NOFP16-SD-NEXT: mov h7, v0.h[1]970; CHECK-NOFP16-SD-NEXT: fcvt s4, h2971; CHECK-NOFP16-SD-NEXT: fcvt s5, h0972; CHECK-NOFP16-SD-NEXT: mov h16, v3.h[1]973; CHECK-NOFP16-SD-NEXT: mov h17, v1.h[1]974; CHECK-NOFP16-SD-NEXT: mov h18, v2.h[2]975; CHECK-NOFP16-SD-NEXT: mov h19, v0.h[2]976; CHECK-NOFP16-SD-NEXT: fcvt s20, h3977; CHECK-NOFP16-SD-NEXT: fcvt s21, h1978; CHECK-NOFP16-SD-NEXT: mov h22, v3.h[2]979; CHECK-NOFP16-SD-NEXT: mov h23, v1.h[2]980; CHECK-NOFP16-SD-NEXT: fcvt s6, h6981; CHECK-NOFP16-SD-NEXT: fcvt s7, h7982; CHECK-NOFP16-SD-NEXT: mov h24, v0.h[6]983; CHECK-NOFP16-SD-NEXT: fmin s4, s5, s4984; CHECK-NOFP16-SD-NEXT: fcvt s5, h16985; CHECK-NOFP16-SD-NEXT: fcvt s16, h17986; CHECK-NOFP16-SD-NEXT: fcvt s17, h18987; CHECK-NOFP16-SD-NEXT: fcvt s18, h19988; CHECK-NOFP16-SD-NEXT: mov h19, v0.h[3]989; CHECK-NOFP16-SD-NEXT: fmin s20, s21, s20990; CHECK-NOFP16-SD-NEXT: fcvt s21, h22991; CHECK-NOFP16-SD-NEXT: mov h22, v3.h[3]992; CHECK-NOFP16-SD-NEXT: fmin s6, s7, s6993; CHECK-NOFP16-SD-NEXT: mov h7, v2.h[3]994; CHECK-NOFP16-SD-NEXT: mov h25, v1.h[6]995; CHECK-NOFP16-SD-NEXT: fcvt h4, s4996; CHECK-NOFP16-SD-NEXT: fmin s5, s16, s5997; CHECK-NOFP16-SD-NEXT: fcvt s16, h23998; CHECK-NOFP16-SD-NEXT: mov h23, v1.h[3]999; CHECK-NOFP16-SD-NEXT: fmin s17, s18, s171000; CHECK-NOFP16-SD-NEXT: fcvt s18, h191001; CHECK-NOFP16-SD-NEXT: fcvt h6, s61002; CHECK-NOFP16-SD-NEXT: fcvt s7, h71003; CHECK-NOFP16-SD-NEXT: fcvt h19, s51004; CHECK-NOFP16-SD-NEXT: fcvt h5, s201005; CHECK-NOFP16-SD-NEXT: fmin s16, s16, s211006; CHECK-NOFP16-SD-NEXT: fcvt s20, h231007; CHECK-NOFP16-SD-NEXT: fcvt h17, s171008; CHECK-NOFP16-SD-NEXT: mov h21, v2.h[4]1009; CHECK-NOFP16-SD-NEXT: mov h23, v1.h[4]1010; CHECK-NOFP16-SD-NEXT: mov v4.h[1], v6.h[0]1011; CHECK-NOFP16-SD-NEXT: fcvt s6, h221012; CHECK-NOFP16-SD-NEXT: mov h22, v0.h[4]1013; CHECK-NOFP16-SD-NEXT: fmin s7, s18, s71014; CHECK-NOFP16-SD-NEXT: mov h18, v3.h[4]1015; CHECK-NOFP16-SD-NEXT: mov v5.h[1], v19.h[0]1016; CHECK-NOFP16-SD-NEXT: fcvt h16, s161017; CHECK-NOFP16-SD-NEXT: fmin s6, s20, s61018; CHECK-NOFP16-SD-NEXT: mov v4.h[2], v17.h[0]1019; CHECK-NOFP16-SD-NEXT: fcvt s17, h211020; CHECK-NOFP16-SD-NEXT: fcvt s19, h221021; CHECK-NOFP16-SD-NEXT: fcvt h7, s71022; CHECK-NOFP16-SD-NEXT: fcvt s18, h181023; CHECK-NOFP16-SD-NEXT: fcvt s20, h231024; CHECK-NOFP16-SD-NEXT: mov h21, v2.h[5]1025; CHECK-NOFP16-SD-NEXT: mov h22, v0.h[5]1026; CHECK-NOFP16-SD-NEXT: mov v5.h[2], v16.h[0]1027; CHECK-NOFP16-SD-NEXT: mov h16, v3.h[5]1028; CHECK-NOFP16-SD-NEXT: mov h23, v1.h[5]1029; CHECK-NOFP16-SD-NEXT: fcvt h6, s61030; CHECK-NOFP16-SD-NEXT: mov h0, v0.h[7]1031; CHECK-NOFP16-SD-NEXT: mov h1, v1.h[7]1032; CHECK-NOFP16-SD-NEXT: fmin s17, s19, s171033; CHECK-NOFP16-SD-NEXT: mov h19, v2.h[6]1034; CHECK-NOFP16-SD-NEXT: mov v4.h[3], v7.h[0]1035; CHECK-NOFP16-SD-NEXT: fmin s18, s20, s181036; CHECK-NOFP16-SD-NEXT: mov h20, v3.h[6]1037; CHECK-NOFP16-SD-NEXT: fcvt s7, h211038; CHECK-NOFP16-SD-NEXT: fcvt s21, h221039; CHECK-NOFP16-SD-NEXT: fcvt s22, h241040; CHECK-NOFP16-SD-NEXT: mov h2, v2.h[7]1041; CHECK-NOFP16-SD-NEXT: mov v5.h[3], v6.h[0]1042; CHECK-NOFP16-SD-NEXT: fcvt s6, h161043; CHECK-NOFP16-SD-NEXT: fcvt s16, h231044; CHECK-NOFP16-SD-NEXT: fcvt h17, s171045; CHECK-NOFP16-SD-NEXT: fcvt s19, h191046; CHECK-NOFP16-SD-NEXT: fcvt s23, h251047; CHECK-NOFP16-SD-NEXT: fcvt h18, s181048; CHECK-NOFP16-SD-NEXT: fcvt s20, h201049; CHECK-NOFP16-SD-NEXT: mov h3, v3.h[7]1050; CHECK-NOFP16-SD-NEXT: fmin s7, s21, s71051; CHECK-NOFP16-SD-NEXT: fcvt s2, h21052; CHECK-NOFP16-SD-NEXT: fcvt s0, h01053; CHECK-NOFP16-SD-NEXT: fmin s6, s16, s61054; CHECK-NOFP16-SD-NEXT: fcvt s1, h11055; CHECK-NOFP16-SD-NEXT: mov v4.h[4], v17.h[0]1056; CHECK-NOFP16-SD-NEXT: fmin s16, s22, s191057; CHECK-NOFP16-SD-NEXT: mov v5.h[4], v18.h[0]1058; CHECK-NOFP16-SD-NEXT: fmin s17, s23, s201059; CHECK-NOFP16-SD-NEXT: fcvt s3, h31060; CHECK-NOFP16-SD-NEXT: fcvt h7, s71061; CHECK-NOFP16-SD-NEXT: fmin s0, s0, s21062; CHECK-NOFP16-SD-NEXT: fcvt h6, s61063; CHECK-NOFP16-SD-NEXT: fcvt h2, s161064; CHECK-NOFP16-SD-NEXT: fmin s1, s1, s31065; CHECK-NOFP16-SD-NEXT: mov v4.h[5], v7.h[0]1066; CHECK-NOFP16-SD-NEXT: fcvt h0, s01067; CHECK-NOFP16-SD-NEXT: mov v5.h[5], v6.h[0]1068; CHECK-NOFP16-SD-NEXT: fcvt h6, s171069; CHECK-NOFP16-SD-NEXT: fcvt h1, s11070; CHECK-NOFP16-SD-NEXT: mov v4.h[6], v2.h[0]1071; CHECK-NOFP16-SD-NEXT: mov v5.h[6], v6.h[0]1072; CHECK-NOFP16-SD-NEXT: mov v4.h[7], v0.h[0]1073; CHECK-NOFP16-SD-NEXT: mov v5.h[7], v1.h[0]1074; CHECK-NOFP16-SD-NEXT: mov v0.16b, v4.16b1075; CHECK-NOFP16-SD-NEXT: mov v1.16b, v5.16b1076; CHECK-NOFP16-SD-NEXT: ret1077;1078; CHECK-FP16-SD-LABEL: min_v16f16:1079; CHECK-FP16-SD: // %bb.0: // %entry1080; CHECK-FP16-SD-NEXT: fmin v1.8h, v1.8h, v3.8h1081; CHECK-FP16-SD-NEXT: fmin v0.8h, v0.8h, v2.8h1082; CHECK-FP16-SD-NEXT: ret1083;1084; CHECK-NOFP16-GI-LABEL: min_v16f16:1085; CHECK-NOFP16-GI: // %bb.0: // %entry1086; CHECK-NOFP16-GI-NEXT: fcvtl v4.4s, v0.4h1087; CHECK-NOFP16-GI-NEXT: fcvtl v5.4s, v1.4h1088; CHECK-NOFP16-GI-NEXT: fcvtl v6.4s, v2.4h1089; CHECK-NOFP16-GI-NEXT: fcvtl v7.4s, v3.4h1090; CHECK-NOFP16-GI-NEXT: fcvtl2 v0.4s, v0.8h1091; CHECK-NOFP16-GI-NEXT: fcvtl2 v1.4s, v1.8h1092; CHECK-NOFP16-GI-NEXT: fcvtl2 v2.4s, v2.8h1093; CHECK-NOFP16-GI-NEXT: fcvtl2 v3.4s, v3.8h1094; CHECK-NOFP16-GI-NEXT: fmin v4.4s, v4.4s, v6.4s1095; CHECK-NOFP16-GI-NEXT: fmin v5.4s, v5.4s, v7.4s1096; CHECK-NOFP16-GI-NEXT: fmin v2.4s, v0.4s, v2.4s1097; CHECK-NOFP16-GI-NEXT: fmin v3.4s, v1.4s, v3.4s1098; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v4.4s1099; CHECK-NOFP16-GI-NEXT: fcvtn v1.4h, v5.4s1100; CHECK-NOFP16-GI-NEXT: fcvtn2 v0.8h, v2.4s1101; CHECK-NOFP16-GI-NEXT: fcvtn2 v1.8h, v3.4s1102; CHECK-NOFP16-GI-NEXT: ret1103;1104; CHECK-FP16-GI-LABEL: min_v16f16:1105; CHECK-FP16-GI: // %bb.0: // %entry1106; CHECK-FP16-GI-NEXT: fmin v0.8h, v0.8h, v2.8h1107; CHECK-FP16-GI-NEXT: fmin v1.8h, v1.8h, v3.8h1108; CHECK-FP16-GI-NEXT: ret1109entry:1110 %c = call <16 x half> @llvm.minimum.v16f16(<16 x half> %a, <16 x half> %b)1111 ret <16 x half> %c1112}1113 1114define <16 x half> @max_v16f16(<16 x half> %a, <16 x half> %b) {1115; CHECK-NOFP16-SD-LABEL: max_v16f16:1116; CHECK-NOFP16-SD: // %bb.0: // %entry1117; CHECK-NOFP16-SD-NEXT: mov h6, v2.h[1]1118; CHECK-NOFP16-SD-NEXT: mov h7, v0.h[1]1119; CHECK-NOFP16-SD-NEXT: fcvt s4, h21120; CHECK-NOFP16-SD-NEXT: fcvt s5, h01121; CHECK-NOFP16-SD-NEXT: mov h16, v3.h[1]1122; CHECK-NOFP16-SD-NEXT: mov h17, v1.h[1]1123; CHECK-NOFP16-SD-NEXT: mov h18, v2.h[2]1124; CHECK-NOFP16-SD-NEXT: mov h19, v0.h[2]1125; CHECK-NOFP16-SD-NEXT: fcvt s20, h31126; CHECK-NOFP16-SD-NEXT: fcvt s21, h11127; CHECK-NOFP16-SD-NEXT: mov h22, v3.h[2]1128; CHECK-NOFP16-SD-NEXT: mov h23, v1.h[2]1129; CHECK-NOFP16-SD-NEXT: fcvt s6, h61130; CHECK-NOFP16-SD-NEXT: fcvt s7, h71131; CHECK-NOFP16-SD-NEXT: mov h24, v0.h[6]1132; CHECK-NOFP16-SD-NEXT: fmax s4, s5, s41133; CHECK-NOFP16-SD-NEXT: fcvt s5, h161134; CHECK-NOFP16-SD-NEXT: fcvt s16, h171135; CHECK-NOFP16-SD-NEXT: fcvt s17, h181136; CHECK-NOFP16-SD-NEXT: fcvt s18, h191137; CHECK-NOFP16-SD-NEXT: mov h19, v0.h[3]1138; CHECK-NOFP16-SD-NEXT: fmax s20, s21, s201139; CHECK-NOFP16-SD-NEXT: fcvt s21, h221140; CHECK-NOFP16-SD-NEXT: mov h22, v3.h[3]1141; CHECK-NOFP16-SD-NEXT: fmax s6, s7, s61142; CHECK-NOFP16-SD-NEXT: mov h7, v2.h[3]1143; CHECK-NOFP16-SD-NEXT: mov h25, v1.h[6]1144; CHECK-NOFP16-SD-NEXT: fcvt h4, s41145; CHECK-NOFP16-SD-NEXT: fmax s5, s16, s51146; CHECK-NOFP16-SD-NEXT: fcvt s16, h231147; CHECK-NOFP16-SD-NEXT: mov h23, v1.h[3]1148; CHECK-NOFP16-SD-NEXT: fmax s17, s18, s171149; CHECK-NOFP16-SD-NEXT: fcvt s18, h191150; CHECK-NOFP16-SD-NEXT: fcvt h6, s61151; CHECK-NOFP16-SD-NEXT: fcvt s7, h71152; CHECK-NOFP16-SD-NEXT: fcvt h19, s51153; CHECK-NOFP16-SD-NEXT: fcvt h5, s201154; CHECK-NOFP16-SD-NEXT: fmax s16, s16, s211155; CHECK-NOFP16-SD-NEXT: fcvt s20, h231156; CHECK-NOFP16-SD-NEXT: fcvt h17, s171157; CHECK-NOFP16-SD-NEXT: mov h21, v2.h[4]1158; CHECK-NOFP16-SD-NEXT: mov h23, v1.h[4]1159; CHECK-NOFP16-SD-NEXT: mov v4.h[1], v6.h[0]1160; CHECK-NOFP16-SD-NEXT: fcvt s6, h221161; CHECK-NOFP16-SD-NEXT: mov h22, v0.h[4]1162; CHECK-NOFP16-SD-NEXT: fmax s7, s18, s71163; CHECK-NOFP16-SD-NEXT: mov h18, v3.h[4]1164; CHECK-NOFP16-SD-NEXT: mov v5.h[1], v19.h[0]1165; CHECK-NOFP16-SD-NEXT: fcvt h16, s161166; CHECK-NOFP16-SD-NEXT: fmax s6, s20, s61167; CHECK-NOFP16-SD-NEXT: mov v4.h[2], v17.h[0]1168; CHECK-NOFP16-SD-NEXT: fcvt s17, h211169; CHECK-NOFP16-SD-NEXT: fcvt s19, h221170; CHECK-NOFP16-SD-NEXT: fcvt h7, s71171; CHECK-NOFP16-SD-NEXT: fcvt s18, h181172; CHECK-NOFP16-SD-NEXT: fcvt s20, h231173; CHECK-NOFP16-SD-NEXT: mov h21, v2.h[5]1174; CHECK-NOFP16-SD-NEXT: mov h22, v0.h[5]1175; CHECK-NOFP16-SD-NEXT: mov v5.h[2], v16.h[0]1176; CHECK-NOFP16-SD-NEXT: mov h16, v3.h[5]1177; CHECK-NOFP16-SD-NEXT: mov h23, v1.h[5]1178; CHECK-NOFP16-SD-NEXT: fcvt h6, s61179; CHECK-NOFP16-SD-NEXT: mov h0, v0.h[7]1180; CHECK-NOFP16-SD-NEXT: mov h1, v1.h[7]1181; CHECK-NOFP16-SD-NEXT: fmax s17, s19, s171182; CHECK-NOFP16-SD-NEXT: mov h19, v2.h[6]1183; CHECK-NOFP16-SD-NEXT: mov v4.h[3], v7.h[0]1184; CHECK-NOFP16-SD-NEXT: fmax s18, s20, s181185; CHECK-NOFP16-SD-NEXT: mov h20, v3.h[6]1186; CHECK-NOFP16-SD-NEXT: fcvt s7, h211187; CHECK-NOFP16-SD-NEXT: fcvt s21, h221188; CHECK-NOFP16-SD-NEXT: fcvt s22, h241189; CHECK-NOFP16-SD-NEXT: mov h2, v2.h[7]1190; CHECK-NOFP16-SD-NEXT: mov v5.h[3], v6.h[0]1191; CHECK-NOFP16-SD-NEXT: fcvt s6, h161192; CHECK-NOFP16-SD-NEXT: fcvt s16, h231193; CHECK-NOFP16-SD-NEXT: fcvt h17, s171194; CHECK-NOFP16-SD-NEXT: fcvt s19, h191195; CHECK-NOFP16-SD-NEXT: fcvt s23, h251196; CHECK-NOFP16-SD-NEXT: fcvt h18, s181197; CHECK-NOFP16-SD-NEXT: fcvt s20, h201198; CHECK-NOFP16-SD-NEXT: mov h3, v3.h[7]1199; CHECK-NOFP16-SD-NEXT: fmax s7, s21, s71200; CHECK-NOFP16-SD-NEXT: fcvt s2, h21201; CHECK-NOFP16-SD-NEXT: fcvt s0, h01202; CHECK-NOFP16-SD-NEXT: fmax s6, s16, s61203; CHECK-NOFP16-SD-NEXT: fcvt s1, h11204; CHECK-NOFP16-SD-NEXT: mov v4.h[4], v17.h[0]1205; CHECK-NOFP16-SD-NEXT: fmax s16, s22, s191206; CHECK-NOFP16-SD-NEXT: mov v5.h[4], v18.h[0]1207; CHECK-NOFP16-SD-NEXT: fmax s17, s23, s201208; CHECK-NOFP16-SD-NEXT: fcvt s3, h31209; CHECK-NOFP16-SD-NEXT: fcvt h7, s71210; CHECK-NOFP16-SD-NEXT: fmax s0, s0, s21211; CHECK-NOFP16-SD-NEXT: fcvt h6, s61212; CHECK-NOFP16-SD-NEXT: fcvt h2, s161213; CHECK-NOFP16-SD-NEXT: fmax s1, s1, s31214; CHECK-NOFP16-SD-NEXT: mov v4.h[5], v7.h[0]1215; CHECK-NOFP16-SD-NEXT: fcvt h0, s01216; CHECK-NOFP16-SD-NEXT: mov v5.h[5], v6.h[0]1217; CHECK-NOFP16-SD-NEXT: fcvt h6, s171218; CHECK-NOFP16-SD-NEXT: fcvt h1, s11219; CHECK-NOFP16-SD-NEXT: mov v4.h[6], v2.h[0]1220; CHECK-NOFP16-SD-NEXT: mov v5.h[6], v6.h[0]1221; CHECK-NOFP16-SD-NEXT: mov v4.h[7], v0.h[0]1222; CHECK-NOFP16-SD-NEXT: mov v5.h[7], v1.h[0]1223; CHECK-NOFP16-SD-NEXT: mov v0.16b, v4.16b1224; CHECK-NOFP16-SD-NEXT: mov v1.16b, v5.16b1225; CHECK-NOFP16-SD-NEXT: ret1226;1227; CHECK-FP16-SD-LABEL: max_v16f16:1228; CHECK-FP16-SD: // %bb.0: // %entry1229; CHECK-FP16-SD-NEXT: fmax v1.8h, v1.8h, v3.8h1230; CHECK-FP16-SD-NEXT: fmax v0.8h, v0.8h, v2.8h1231; CHECK-FP16-SD-NEXT: ret1232;1233; CHECK-NOFP16-GI-LABEL: max_v16f16:1234; CHECK-NOFP16-GI: // %bb.0: // %entry1235; CHECK-NOFP16-GI-NEXT: fcvtl v4.4s, v0.4h1236; CHECK-NOFP16-GI-NEXT: fcvtl v5.4s, v1.4h1237; CHECK-NOFP16-GI-NEXT: fcvtl v6.4s, v2.4h1238; CHECK-NOFP16-GI-NEXT: fcvtl v7.4s, v3.4h1239; CHECK-NOFP16-GI-NEXT: fcvtl2 v0.4s, v0.8h1240; CHECK-NOFP16-GI-NEXT: fcvtl2 v1.4s, v1.8h1241; CHECK-NOFP16-GI-NEXT: fcvtl2 v2.4s, v2.8h1242; CHECK-NOFP16-GI-NEXT: fcvtl2 v3.4s, v3.8h1243; CHECK-NOFP16-GI-NEXT: fmax v4.4s, v4.4s, v6.4s1244; CHECK-NOFP16-GI-NEXT: fmax v5.4s, v5.4s, v7.4s1245; CHECK-NOFP16-GI-NEXT: fmax v2.4s, v0.4s, v2.4s1246; CHECK-NOFP16-GI-NEXT: fmax v3.4s, v1.4s, v3.4s1247; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v4.4s1248; CHECK-NOFP16-GI-NEXT: fcvtn v1.4h, v5.4s1249; CHECK-NOFP16-GI-NEXT: fcvtn2 v0.8h, v2.4s1250; CHECK-NOFP16-GI-NEXT: fcvtn2 v1.8h, v3.4s1251; CHECK-NOFP16-GI-NEXT: ret1252;1253; CHECK-FP16-GI-LABEL: max_v16f16:1254; CHECK-FP16-GI: // %bb.0: // %entry1255; CHECK-FP16-GI-NEXT: fmax v0.8h, v0.8h, v2.8h1256; CHECK-FP16-GI-NEXT: fmax v1.8h, v1.8h, v3.8h1257; CHECK-FP16-GI-NEXT: ret1258entry:1259 %c = call <16 x half> @llvm.maximum.v16f16(<16 x half> %a, <16 x half> %b)1260 ret <16 x half> %c1261}1262 1263declare <16 x half> @llvm.maximum.v16f16(<16 x half>, <16 x half>)1264declare <16 x half> @llvm.minimum.v16f16(<16 x half>, <16 x half>)1265declare <2 x double> @llvm.maximum.v2f64(<2 x double>, <2 x double>)1266declare <2 x double> @llvm.minimum.v2f64(<2 x double>, <2 x double>)1267declare <2 x float> @llvm.maximum.v2f32(<2 x float>, <2 x float>)1268declare <2 x float> @llvm.minimum.v2f32(<2 x float>, <2 x float>)1269declare <3 x double> @llvm.maximum.v3f64(<3 x double>, <3 x double>)1270declare <3 x double> @llvm.minimum.v3f64(<3 x double>, <3 x double>)1271declare <3 x float> @llvm.maximum.v3f32(<3 x float>, <3 x float>)1272declare <3 x float> @llvm.minimum.v3f32(<3 x float>, <3 x float>)1273declare <4 x double> @llvm.maximum.v4f64(<4 x double>, <4 x double>)1274declare <4 x double> @llvm.minimum.v4f64(<4 x double>, <4 x double>)1275declare <4 x float> @llvm.maximum.v4f32(<4 x float>, <4 x float>)1276declare <4 x float> @llvm.minimum.v4f32(<4 x float>, <4 x float>)1277declare <4 x half> @llvm.maximum.v4f16(<4 x half>, <4 x half>)1278declare <4 x half> @llvm.minimum.v4f16(<4 x half>, <4 x half>)1279declare <7 x float> @llvm.maximum.v7f32(<7 x float>, <7 x float>)1280declare <7 x float> @llvm.minimum.v7f32(<7 x float>, <7 x float>)1281declare <7 x half> @llvm.maximum.v7f16(<7 x half>, <7 x half>)1282declare <7 x half> @llvm.minimum.v7f16(<7 x half>, <7 x half>)1283declare <8 x float> @llvm.maximum.v8f32(<8 x float>, <8 x float>)1284declare <8 x float> @llvm.minimum.v8f32(<8 x float>, <8 x float>)1285declare <8 x half> @llvm.maximum.v8f16(<8 x half>, <8 x half>)1286declare <8 x half> @llvm.minimum.v8f16(<8 x half>, <8 x half>)1287declare double @llvm.maximum.f64(double, double)1288declare double @llvm.minimum.f64(double, double)1289declare float @llvm.maximum.f32(float, float)1290declare float @llvm.minimum.f32(float, float)1291declare half @llvm.maximum.f16(half, half)1292declare half @llvm.minimum.f16(half, half)1293