2729 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=hexagon -hexagon-hvx-widen=32 < %s -verify-machineinstrs | FileCheck %s3 4target datalayout = "e-m:e-p:32:32:32-a:0-n16:32-i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048"5target triple = "hexagon"6 7; s8 -> f168; No widening9define void @s8f16_0(ptr %a0, ptr %a1) #0 {10; CHECK-LABEL: s8f16_0:11; CHECK: .cfi_startproc12; CHECK-NEXT: // %bb.0:13; CHECK-NEXT: {14; CHECK-NEXT: v0 = vmem(r0+#0)15; CHECK-NEXT: }16; CHECK-NEXT: {17; CHECK-NEXT: r7 = #118; CHECK-NEXT: r6 = #6419; CHECK-NEXT: v1:0.h = vunpack(v0.b)20; CHECK-NEXT: }21; CHECK-NEXT: {22; CHECK-NEXT: v2.h = vsplat(r7)23; CHECK-NEXT: r3:2 = combine(#31,#5)24; CHECK-NEXT: v3.h = vabs(v0.h)25; CHECK-NEXT: v4.h = vabs(v1.h)26; CHECK-NEXT: }27; CHECK-NEXT: {28; CHECK-NEXT: v8.h = vsplat(r6)29; CHECK-NEXT: v7.h = vsplat(r3)30; CHECK-NEXT: v9 = vxor(v9,v9)31; CHECK-NEXT: }32; CHECK-NEXT: {33; CHECK-NEXT: r5 = ##3276834; CHECK-NEXT: v5.uh = vcl0(v3.uh)35; CHECK-NEXT: q0 = vcmp.gt(v9.h,v0.h)36; CHECK-NEXT: }37; CHECK-NEXT: {38; CHECK-NEXT: v10.h = vsplat(r5)39; CHECK-NEXT: r4 = #1040; CHECK-NEXT: v6.uh = vcl0(v4.uh)41; CHECK-NEXT: v5.h = vadd(v5.h,v2.h)42; CHECK-NEXT: }43; CHECK-NEXT: {44; CHECK-NEXT: v27 = vmux(q0,v10,v9)45; CHECK-NEXT: v6.h = vadd(v6.h,v2.h)46; CHECK-NEXT: }47; CHECK-NEXT: {48; CHECK-NEXT: v3.h = vasl(v3.h,v5.h)49; CHECK-NEXT: }50; CHECK-NEXT: {51; CHECK-NEXT: v4.h = vasl(v4.h,v6.h)52; CHECK-NEXT: v13 = vand(v3,v8)53; CHECK-NEXT: v11.h = vadd(v3.h,v7.h)54; CHECK-NEXT: }55; CHECK-NEXT: {56; CHECK-NEXT: v14.h = vadd(v4.h,v7.h)57; CHECK-NEXT: q2 = vcmp.eq(v13.h,v9.h)58; CHECK-NEXT: v8 = vand(v4,v8)59; CHECK-NEXT: q1 = vcmp.gt(v3.uh,v11.uh)60; CHECK-NEXT: }61; CHECK-NEXT: {62; CHECK-NEXT: v11.uh = vlsr(v11.uh,r2)63; CHECK-NEXT: v13 = vmux(q2,v9,v2)64; CHECK-NEXT: q2 = vcmp.eq(v8.h,v9.h)65; CHECK-NEXT: q3 = vcmp.gt(v4.uh,v14.uh)66; CHECK-NEXT: }67; CHECK-NEXT: {68; CHECK-NEXT: v20.uh = vlsr(v14.uh,r2)69; CHECK-NEXT: v22 = vmux(q2,v9,v2)70; CHECK-NEXT: v21 = vmux(q1,v2,v9)71; CHECK-NEXT: v2 = vmux(q3,v2,v9)72; CHECK-NEXT: }73; CHECK-NEXT: {74; CHECK-NEXT: v19.uh = vlsr(v4.uh,r2)75; CHECK-NEXT: v13.h = vadd(v11.h,v13.h)76; CHECK-NEXT: v24.h = vadd(v20.h,v22.h)77; CHECK-NEXT: v2.h = vadd(v2.h,v7.h)78; CHECK-NEXT: }79; CHECK-NEXT: {80; CHECK-NEXT: v12.uh = vlsr(v3.uh,r2)81; CHECK-NEXT: v23.h = vadd(v21.h,v7.h)82; CHECK-NEXT: v2.h = vsub(v2.h,v6.h)83; CHECK-NEXT: q3 = vcmp.gt(v9.h,v1.h)84; CHECK-NEXT: }85; CHECK-NEXT: {86; CHECK-NEXT: v11.uh = vlsr(v11.uh,r7)87; CHECK-NEXT: v3.h = vsub(v23.h,v5.h)88; CHECK-NEXT: q2 = vcmp.eq(v12.h,v11.h)89; CHECK-NEXT: q1 = vcmp.eq(v19.h,v20.h)90; CHECK-NEXT: }91; CHECK-NEXT: {92; CHECK-NEXT: v25.uh = vlsr(v13.uh,r7)93; CHECK-NEXT: v28 = vmux(q3,v10,v9)94; CHECK-NEXT: q3 = vcmp.eq(v0.h,v9.h)95; CHECK-NEXT: }96; CHECK-NEXT: {97; CHECK-NEXT: v26.uh = vlsr(v24.uh,r7)98; CHECK-NEXT: v5 = vmux(q2,v25,v11)99; CHECK-NEXT: q2 = vcmp.eq(v1.h,v9.h)100; CHECK-NEXT: }101; CHECK-NEXT: {102; CHECK-NEXT: v4.uh = vlsr(v20.uh,r7)103; CHECK-NEXT: v5 = vor(v27,v5)104; CHECK-NEXT: }105; CHECK-NEXT: {106; CHECK-NEXT: v3.h = vasl(v3.h,r4)107; CHECK-NEXT: v4 = vmux(q1,v26,v4)108; CHECK-NEXT: }109; CHECK-NEXT: {110; CHECK-NEXT: v2.h = vasl(v2.h,r4)111; CHECK-NEXT: v4 = vor(v28,v4)112; CHECK-NEXT: v29 = vor(v5,v3)113; CHECK-NEXT: }114; CHECK-NEXT: {115; CHECK-NEXT: v2 = vor(v4,v2)116; CHECK-NEXT: v31 = vmux(q3,v9,v29)117; CHECK-NEXT: vmem(r1+#0) = v31.new118; CHECK-NEXT: }119; CHECK-NEXT: {120; CHECK-NEXT: v30 = vmux(q2,v9,v2)121; CHECK-NEXT: jumpr r31122; CHECK-NEXT: vmem(r1+#1) = v30.new123; CHECK-NEXT: }124 %v0 = load <128 x i8>, ptr %a0, align 128125 %v1 = sitofp <128 x i8> %v0 to <128 x half>126 store <128 x half> %v1, ptr %a1, align 128127 ret void128}129 130; Widen input131define void @s8f16_1(ptr %a0, ptr %a1) #0 {132; CHECK-LABEL: s8f16_1:133; CHECK: .cfi_startproc134; CHECK-NEXT: // %bb.0:135; CHECK-NEXT: {136; CHECK-NEXT: v0 = vmem(r0+#0)137; CHECK-NEXT: }138; CHECK-NEXT: {139; CHECK-NEXT: r6 = #1140; CHECK-NEXT: r3:2 = combine(#64,#31)141; CHECK-NEXT: v1:0.h = vunpack(v0.b)142; CHECK-NEXT: }143; CHECK-NEXT: {144; CHECK-NEXT: v3.h = vsplat(r6)145; CHECK-NEXT: v4.h = vsplat(r2)146; CHECK-NEXT: v2.h = vabs(v0.h)147; CHECK-NEXT: v1 = vxor(v1,v1)148; CHECK-NEXT: }149; CHECK-NEXT: {150; CHECK-NEXT: v6.h = vsplat(r3)151; CHECK-NEXT: r5:4 = combine(##32768,#5)152; CHECK-NEXT: r2 = #10153; CHECK-NEXT: }154; CHECK-NEXT: {155; CHECK-NEXT: v8.h = vsplat(r5)156; CHECK-NEXT: v5.uh = vcl0(v2.uh)157; CHECK-NEXT: q3 = vcmp.eq(v0.h,v1.h)158; CHECK-NEXT: }159; CHECK-NEXT: {160; CHECK-NEXT: v5.h = vadd(v5.h,v3.h)161; CHECK-NEXT: }162; CHECK-NEXT: {163; CHECK-NEXT: v2.h = vasl(v2.h,v5.h)164; CHECK-NEXT: }165; CHECK-NEXT: {166; CHECK-NEXT: v7.h = vadd(v2.h,v4.h)167; CHECK-NEXT: v6 = vand(v2,v6)168; CHECK-NEXT: }169; CHECK-NEXT: {170; CHECK-NEXT: v2.uh = vlsr(v2.uh,r4)171; CHECK-NEXT: q0 = vcmp.eq(v6.h,v1.h)172; CHECK-NEXT: q1 = vcmp.gt(v2.uh,v7.uh)173; CHECK-NEXT: }174; CHECK-NEXT: {175; CHECK-NEXT: v25.uh = vlsr(v7.uh,r4)176; CHECK-NEXT: v26 = vmux(q0,v1,v3)177; CHECK-NEXT: v3 = vmux(q1,v3,v1)178; CHECK-NEXT: q1 = vcmp.gt(v1.h,v0.h)179; CHECK-NEXT: }180; CHECK-NEXT: {181; CHECK-NEXT: v7.h = vadd(v25.h,v26.h)182; CHECK-NEXT: v3.h = vadd(v3.h,v4.h)183; CHECK-NEXT: q2 = vcmp.eq(v2.h,v25.h)184; CHECK-NEXT: v30 = vmux(q1,v8,v1)185; CHECK-NEXT: }186; CHECK-NEXT: {187; CHECK-NEXT: v27.uh = vlsr(v25.uh,r6)188; CHECK-NEXT: v28.h = vsub(v3.h,v5.h)189; CHECK-NEXT: }190; CHECK-NEXT: {191; CHECK-NEXT: v29.uh = vlsr(v7.uh,r6)192; CHECK-NEXT: }193; CHECK-NEXT: {194; CHECK-NEXT: v2.h = vasl(v28.h,r2)195; CHECK-NEXT: v3 = vmux(q2,v29,v27)196; CHECK-NEXT: }197; CHECK-NEXT: {198; CHECK-NEXT: v3 = vor(v30,v3)199; CHECK-NEXT: }200; CHECK-NEXT: {201; CHECK-NEXT: v31 = vor(v3,v2)202; CHECK-NEXT: }203; CHECK-NEXT: {204; CHECK-NEXT: v0 = vmux(q3,v1,v31)205; CHECK-NEXT: jumpr r31206; CHECK-NEXT: vmem(r1+#0) = v0.new207; CHECK-NEXT: }208 %v0 = load <64 x i8>, ptr %a0, align 128209 %v1 = sitofp <64 x i8> %v0 to <64 x half>210 store <64 x half> %v1, ptr %a1, align 128211 ret void212}213 214 215; s8 -> f32216; No widening217define void @s8f32_0(ptr %a0, ptr %a1) #0 {218; CHECK-LABEL: s8f32_0:219; CHECK: .cfi_startproc220; CHECK-NEXT: // %bb.0:221; CHECK-NEXT: {222; CHECK-NEXT: r7 = #64223; CHECK-NEXT: r0 = #1224; CHECK-NEXT: v0 = vmem(r0+#0)225; CHECK-NEXT: }226; CHECK-NEXT: {227; CHECK-NEXT: v2 = vsplat(r0)228; CHECK-NEXT: r3:2 = combine(##255,#8)229; CHECK-NEXT: v1 = valign(v0,v0,r7)230; CHECK-NEXT: }231; CHECK-NEXT: {232; CHECK-NEXT: v3 = vsplat(r3)233; CHECK-NEXT: r7 = #512234; CHECK-NEXT: v9:8.h = vunpack(v0.b)235; CHECK-NEXT: }236; CHECK-NEXT: {237; CHECK-NEXT: v4 = vsplat(r7)238; CHECK-NEXT: r6 = ##-2147483648239; CHECK-NEXT: r5 = #159240; CHECK-NEXT: }241; CHECK-NEXT: {242; CHECK-NEXT: r4 = #23243; CHECK-NEXT: v7:6.h = vunpack(v1.b)244; CHECK-NEXT: }245; CHECK-NEXT: {246; CHECK-NEXT: v8 = vsplat(r6)247; CHECK-NEXT: v1:0.w = vunpack(v8.h)248; CHECK-NEXT: }249; CHECK-NEXT: {250; CHECK-NEXT: v7:6.w = vunpack(v6.h)251; CHECK-NEXT: v5.w = vabs(v0.w)252; CHECK-NEXT: v10.w = vabs(v1.w)253; CHECK-NEXT: }254; CHECK-NEXT: {255; CHECK-NEXT: v26.w = vabs(v6.w)256; CHECK-NEXT: v13.w = vabs(v7.w)257; CHECK-NEXT: }258; CHECK-NEXT: {259; CHECK-NEXT: v9.uw = vcl0(v5.uw)260; CHECK-NEXT: }261; CHECK-NEXT: {262; CHECK-NEXT: v12.uw = vcl0(v26.uw)263; CHECK-NEXT: v9.w = vadd(v9.w,v2.w)264; CHECK-NEXT: }265; CHECK-NEXT: {266; CHECK-NEXT: v14.uw = vcl0(v13.uw)267; CHECK-NEXT: v15.w = vadd(v12.w,v2.w)268; CHECK-NEXT: }269; CHECK-NEXT: {270; CHECK-NEXT: v11.uw = vcl0(v10.uw)271; CHECK-NEXT: v12.w = vadd(v14.w,v2.w)272; CHECK-NEXT: }273; CHECK-NEXT: {274; CHECK-NEXT: v27.w = vasl(v26.w,v15.w)275; CHECK-NEXT: v11.w = vadd(v11.w,v2.w)276; CHECK-NEXT: }277; CHECK-NEXT: {278; CHECK-NEXT: v13.w = vasl(v13.w,v12.w)279; CHECK-NEXT: v20 = vand(v27,v4)280; CHECK-NEXT: v19.w = vadd(v27.w,v3.w)281; CHECK-NEXT: }282; CHECK-NEXT: {283; CHECK-NEXT: v16.w = vasl(v5.w,v9.w)284; CHECK-NEXT: v5 = vxor(v5,v5)285; CHECK-NEXT: v23.w = vadd(v13.w,v3.w)286; CHECK-NEXT: v28 = vand(v13,v4)287; CHECK-NEXT: }288; CHECK-NEXT: {289; CHECK-NEXT: v17.w = vasl(v10.w,v11.w)290; CHECK-NEXT: q3 = vcmp.eq(v20.w,v5.w)291; CHECK-NEXT: q2 = vcmp.gt(v27.uw,v19.uw)292; CHECK-NEXT: q0 = vcmp.gt(v5.w,v6.w)293; CHECK-NEXT: }294; CHECK-NEXT: {295; CHECK-NEXT: v21.uw = vlsr(v27.uw,r2)296; CHECK-NEXT: v30 = vmux(q3,v5,v2)297; CHECK-NEXT: q3 = vcmp.eq(v28.w,v5.w)298; CHECK-NEXT: v22 = vand(v17,v4)299; CHECK-NEXT: }300; CHECK-NEXT: {301; CHECK-NEXT: v14.uw = vlsr(v19.uw,r2)302; CHECK-NEXT: v27 = vmux(q3,v5,v2)303; CHECK-NEXT: q1 = vcmp.eq(v22.w,v5.w)304; CHECK-NEXT: v24 = vmux(q2,v2,v5)305; CHECK-NEXT: }306; CHECK-NEXT: {307; CHECK-NEXT: v31.uw = vlsr(v23.uw,r2)308; CHECK-NEXT: v22.w = vadd(v14.w,v30.w)309; CHECK-NEXT: v30.w = vadd(v17.w,v3.w)310; CHECK-NEXT: q2 = vcmp.eq(v21.w,v14.w)311; CHECK-NEXT: }312; CHECK-NEXT: {313; CHECK-NEXT: v29.uw = vlsr(v13.uw,r2)314; CHECK-NEXT: v28.w = vadd(v31.w,v27.w)315; CHECK-NEXT: v3.w = vadd(v16.w,v3.w)316; CHECK-NEXT: v4 = vand(v16,v4)317; CHECK-NEXT: }318; CHECK-NEXT: {319; CHECK-NEXT: v14.uw = vlsr(v14.uw,r0)320; CHECK-NEXT: q3 = vcmp.eq(v29.w,v31.w)321; CHECK-NEXT: v18 = vmux(q0,v8,v5)322; CHECK-NEXT: q0 = vcmp.gt(v5.w,v7.w)323; CHECK-NEXT: }324; CHECK-NEXT: {325; CHECK-NEXT: v19.uw = vlsr(v31.uw,r0)326; CHECK-NEXT: v26 = vmux(q1,v5,v2)327; CHECK-NEXT: v31 = vmux(q0,v8,v5)328; CHECK-NEXT: q0 = vcmp.gt(v16.uw,v3.uw)329; CHECK-NEXT: }330; CHECK-NEXT: {331; CHECK-NEXT: v10 = vsplat(r5)332; CHECK-NEXT: v29.uw = vlsr(v22.uw,r0)333; CHECK-NEXT: v15.w = vsub(v24.w,v15.w)334; CHECK-NEXT: }335; CHECK-NEXT: {336; CHECK-NEXT: v20.uw = vlsr(v28.uw,r0)337; CHECK-NEXT: v14 = vmux(q2,v29,v14)338; CHECK-NEXT: q2 = vcmp.gt(v13.uw,v23.uw)339; CHECK-NEXT: v15.w = vadd(v15.w,v10.w)340; CHECK-NEXT: }341; CHECK-NEXT: {342; CHECK-NEXT: v25.uw = vlsr(v30.uw,r2)343; CHECK-NEXT: v19 = vmux(q3,v20,v19)344; CHECK-NEXT: q3 = vcmp.eq(v4.w,v5.w)345; CHECK-NEXT: v27 = vmux(q2,v2,v5)346; CHECK-NEXT: }347; CHECK-NEXT: {348; CHECK-NEXT: v3.uw = vlsr(v3.uw,r2)349; CHECK-NEXT: q2 = vcmp.gt(v17.uw,v30.uw)350; CHECK-NEXT: v28.w = vadd(v25.w,v26.w)351; CHECK-NEXT: v29 = vmux(q3,v5,v2)352; CHECK-NEXT: }353; CHECK-NEXT: {354; CHECK-NEXT: v17.uw = vlsr(v17.uw,r2)355; CHECK-NEXT: v19 = vor(v31,v19)356; CHECK-NEXT: v31 = vmux(q2,v2,v5)357; CHECK-NEXT: v2 = vmux(q0,v2,v5)358; CHECK-NEXT: }359; CHECK-NEXT: {360; CHECK-NEXT: v24.uw = vlsr(v16.uw,r2)361; CHECK-NEXT: v30.w = vadd(v3.w,v29.w)362; CHECK-NEXT: v2.w = vsub(v2.w,v9.w)363; CHECK-NEXT: v11.w = vsub(v31.w,v11.w)364; CHECK-NEXT: }365; CHECK-NEXT: {366; CHECK-NEXT: v16.uw = vlsr(v28.uw,r0)367; CHECK-NEXT: q3 = vcmp.eq(v17.w,v25.w)368; CHECK-NEXT: v4.w = vsub(v27.w,v12.w)369; CHECK-NEXT: v2.w = vadd(v2.w,v10.w)370; CHECK-NEXT: }371; CHECK-NEXT: {372; CHECK-NEXT: v13.uw = vlsr(v25.uw,r0)373; CHECK-NEXT: q0 = vcmp.eq(v24.w,v3.w)374; CHECK-NEXT: v21.w = vadd(v11.w,v10.w)375; CHECK-NEXT: q2 = vcmp.gt(v5.w,v1.w)376; CHECK-NEXT: }377; CHECK-NEXT: {378; CHECK-NEXT: v22.uw = vlsr(v30.uw,r0)379; CHECK-NEXT: v23 = vmux(q3,v16,v13)380; CHECK-NEXT: q3 = vcmp.gt(v5.w,v0.w)381; CHECK-NEXT: v24 = vmux(q2,v8,v5)382; CHECK-NEXT: }383; CHECK-NEXT: {384; CHECK-NEXT: v3.uw = vlsr(v3.uw,r0)385; CHECK-NEXT: v4.w = vadd(v4.w,v10.w)386; CHECK-NEXT: v8 = vmux(q3,v8,v5)387; CHECK-NEXT: v10 = vor(v24,v23)388; CHECK-NEXT: }389; CHECK-NEXT: {390; CHECK-NEXT: v9.w = vasl(v21.w,r4)391; CHECK-NEXT: v3 = vmux(q0,v22,v3)392; CHECK-NEXT: v14 = vor(v18,v14)393; CHECK-NEXT: q2 = vcmp.eq(v1.w,v5.w)394; CHECK-NEXT: }395; CHECK-NEXT: {396; CHECK-NEXT: v2.w = vasl(v2.w,r4)397; CHECK-NEXT: v3 = vor(v8,v3)398; CHECK-NEXT: v25 = vor(v10,v9)399; CHECK-NEXT: q3 = vcmp.eq(v0.w,v5.w)400; CHECK-NEXT: }401; CHECK-NEXT: {402; CHECK-NEXT: v15.w = vasl(v15.w,r4)403; CHECK-NEXT: v2 = vor(v3,v2)404; CHECK-NEXT: v27 = vmux(q2,v5,v25)405; CHECK-NEXT: vmem(r1+#1) = v27.new406; CHECK-NEXT: }407; CHECK-NEXT: {408; CHECK-NEXT: v26.w = vasl(v4.w,r4)409; CHECK-NEXT: v29 = vmux(q3,v5,v2)410; CHECK-NEXT: q2 = vcmp.eq(v7.w,v5.w)411; CHECK-NEXT: vmem(r1+#0) = v29.new412; CHECK-NEXT: }413; CHECK-NEXT: {414; CHECK-NEXT: v28 = vor(v19,v26)415; CHECK-NEXT: v30 = vor(v14,v15)416; CHECK-NEXT: q3 = vcmp.eq(v6.w,v5.w)417; CHECK-NEXT: }418; CHECK-NEXT: {419; CHECK-NEXT: v0 = vmux(q2,v5,v28)420; CHECK-NEXT: v31 = vmux(q3,v5,v30)421; CHECK-NEXT: vmem(r1+#3) = v0.new422; CHECK-NEXT: }423; CHECK-NEXT: {424; CHECK-NEXT: jumpr r31425; CHECK-NEXT: vmem(r1+#2) = v31426; CHECK-NEXT: }427 %v0 = load <128 x i8>, ptr %a0, align 128428 %v1 = sitofp <128 x i8> %v0 to <128 x float>429 store <128 x float> %v1, ptr %a1, align 128430 ret void431}432 433; Widen input #1434define void @s8f32_1(ptr %a0, ptr %a1) #0 {435; CHECK-LABEL: s8f32_1:436; CHECK: .cfi_startproc437; CHECK-NEXT: // %bb.0:438; CHECK-NEXT: {439; CHECK-NEXT: r0 = #1440; CHECK-NEXT: v3:2.h = vunpack(v0.b)441; CHECK-NEXT: v0.cur = vmem(r0+#0)442; CHECK-NEXT: }443; CHECK-NEXT: {444; CHECK-NEXT: v1 = vsplat(r0)445; CHECK-NEXT: r3:2 = combine(##255,#8)446; CHECK-NEXT: r6 = #512447; CHECK-NEXT: }448; CHECK-NEXT: {449; CHECK-NEXT: v7 = vsplat(r3)450; CHECK-NEXT: v3:2.w = vunpack(v2.h)451; CHECK-NEXT: v22 = vxor(v22,v22)452; CHECK-NEXT: }453; CHECK-NEXT: {454; CHECK-NEXT: v10 = vsplat(r6)455; CHECK-NEXT: r7 = ##-2147483648456; CHECK-NEXT: r5 = #159457; CHECK-NEXT: }458; CHECK-NEXT: {459; CHECK-NEXT: v9 = vsplat(r7)460; CHECK-NEXT: v4.w = vabs(v2.w)461; CHECK-NEXT: v5.w = vabs(v3.w)462; CHECK-NEXT: q0 = vcmp.gt(v22.w,v2.w)463; CHECK-NEXT: }464; CHECK-NEXT: {465; CHECK-NEXT: v12 = vsplat(r5)466; CHECK-NEXT: r4 = #23467; CHECK-NEXT: v11 = vmux(q0,v9,v22)468; CHECK-NEXT: q0 = vcmp.gt(v22.w,v3.w)469; CHECK-NEXT: }470; CHECK-NEXT: {471; CHECK-NEXT: v6.uw = vcl0(v4.uw)472; CHECK-NEXT: v30 = vmux(q0,v9,v22)473; CHECK-NEXT: }474; CHECK-NEXT: {475; CHECK-NEXT: v8.uw = vcl0(v5.uw)476; CHECK-NEXT: v6.w = vadd(v6.w,v1.w)477; CHECK-NEXT: }478; CHECK-NEXT: {479; CHECK-NEXT: v8.w = vadd(v8.w,v1.w)480; CHECK-NEXT: }481; CHECK-NEXT: {482; CHECK-NEXT: v4.w = vasl(v4.w,v6.w)483; CHECK-NEXT: }484; CHECK-NEXT: {485; CHECK-NEXT: v5.w = vasl(v5.w,v8.w)486; CHECK-NEXT: v13 = vand(v4,v10)487; CHECK-NEXT: v14.w = vadd(v4.w,v7.w)488; CHECK-NEXT: }489; CHECK-NEXT: {490; CHECK-NEXT: v10 = vand(v5,v10)491; CHECK-NEXT: v7.w = vadd(v5.w,v7.w)492; CHECK-NEXT: q2 = vcmp.gt(v4.uw,v14.uw)493; CHECK-NEXT: q1 = vcmp.eq(v13.w,v22.w)494; CHECK-NEXT: }495; CHECK-NEXT: {496; CHECK-NEXT: v14.uw = vlsr(v14.uw,r2)497; CHECK-NEXT: q3 = vcmp.eq(v10.w,v22.w)498; CHECK-NEXT: v25 = vmux(q2,v1,v22)499; CHECK-NEXT: q2 = vcmp.gt(v5.uw,v7.uw)500; CHECK-NEXT: }501; CHECK-NEXT: {502; CHECK-NEXT: v7.uw = vlsr(v7.uw,r2)503; CHECK-NEXT: v26 = vmux(q1,v22,v1)504; CHECK-NEXT: v27 = vmux(q3,v22,v1)505; CHECK-NEXT: v1 = vmux(q2,v1,v22)506; CHECK-NEXT: }507; CHECK-NEXT: {508; CHECK-NEXT: v24.uw = vlsr(v5.uw,r2)509; CHECK-NEXT: v5.w = vadd(v14.w,v26.w)510; CHECK-NEXT: v29.w = vadd(v7.w,v27.w)511; CHECK-NEXT: v6.w = vsub(v25.w,v6.w)512; CHECK-NEXT: }513; CHECK-NEXT: {514; CHECK-NEXT: v23.uw = vlsr(v4.uw,r2)515; CHECK-NEXT: v1.w = vsub(v1.w,v8.w)516; CHECK-NEXT: v6.w = vadd(v6.w,v12.w)517; CHECK-NEXT: q3 = vcmp.eq(v24.w,v7.w)518; CHECK-NEXT: }519; CHECK-NEXT: {520; CHECK-NEXT: v28.uw = vlsr(v14.uw,r0)521; CHECK-NEXT: v1.w = vadd(v1.w,v12.w)522; CHECK-NEXT: q1 = vcmp.eq(v23.w,v14.w)523; CHECK-NEXT: q2 = vcmp.eq(v3.w,v22.w)524; CHECK-NEXT: }525; CHECK-NEXT: {526; CHECK-NEXT: v5.uw = vlsr(v5.uw,r0)527; CHECK-NEXT: }528; CHECK-NEXT: {529; CHECK-NEXT: v7.uw = vlsr(v7.uw,r0)530; CHECK-NEXT: v5 = vmux(q1,v5,v28)531; CHECK-NEXT: }532; CHECK-NEXT: {533; CHECK-NEXT: v4.uw = vlsr(v29.uw,r0)534; CHECK-NEXT: v5 = vor(v11,v5)535; CHECK-NEXT: }536; CHECK-NEXT: {537; CHECK-NEXT: v6.w = vasl(v6.w,r4)538; CHECK-NEXT: v4 = vmux(q3,v4,v7)539; CHECK-NEXT: q3 = vcmp.eq(v2.w,v22.w)540; CHECK-NEXT: }541; CHECK-NEXT: {542; CHECK-NEXT: v1.w = vasl(v1.w,r4)543; CHECK-NEXT: v4 = vor(v30,v4)544; CHECK-NEXT: v31 = vor(v5,v6)545; CHECK-NEXT: }546; CHECK-NEXT: {547; CHECK-NEXT: v1 = vor(v4,v1)548; CHECK-NEXT: v0 = vmux(q3,v22,v31)549; CHECK-NEXT: vmem(r1+#0) = v0.new550; CHECK-NEXT: }551; CHECK-NEXT: {552; CHECK-NEXT: v1 = vmux(q2,v22,v1)553; CHECK-NEXT: jumpr r31554; CHECK-NEXT: vmem(r1+#1) = v1.new555; CHECK-NEXT: }556 %v0 = load <64 x i8>, ptr %a0, align 128557 %v1 = sitofp <64 x i8> %v0 to <64 x float>558 store <64 x float> %v1, ptr %a1, align 128559 ret void560}561 562; Widen input #2563define void @s8f32_2(ptr %a0, ptr %a1) #0 {564; CHECK-LABEL: s8f32_2:565; CHECK: .cfi_startproc566; CHECK-NEXT: // %bb.0:567; CHECK-NEXT: {568; CHECK-NEXT: v0 = vmem(r0+#0)569; CHECK-NEXT: }570; CHECK-NEXT: {571; CHECK-NEXT: r0 = #1572; CHECK-NEXT: r3 = #512573; CHECK-NEXT: v1:0.h = vunpack(v0.b)574; CHECK-NEXT: }575; CHECK-NEXT: {576; CHECK-NEXT: v2 = vsplat(r0)577; CHECK-NEXT: v4 = vsplat(r3)578; CHECK-NEXT: r2 = #255579; CHECK-NEXT: v3 = vxor(v3,v3)580; CHECK-NEXT: }581; CHECK-NEXT: {582; CHECK-NEXT: r7:6 = combine(##-2147483648,#8)583; CHECK-NEXT: r4 = #159584; CHECK-NEXT: v1:0.w = vunpack(v0.h)585; CHECK-NEXT: }586; CHECK-NEXT: {587; CHECK-NEXT: v1 = vsplat(r2)588; CHECK-NEXT: v8 = vsplat(r4)589; CHECK-NEXT: v5.w = vabs(v0.w)590; CHECK-NEXT: q2 = vcmp.gt(v3.w,v0.w)591; CHECK-NEXT: }592; CHECK-NEXT: {593; CHECK-NEXT: v7 = vsplat(r7)594; CHECK-NEXT: r2 = #23595; CHECK-NEXT: }596; CHECK-NEXT: {597; CHECK-NEXT: v6.uw = vcl0(v5.uw)598; CHECK-NEXT: v30 = vmux(q2,v7,v3)599; CHECK-NEXT: }600; CHECK-NEXT: {601; CHECK-NEXT: v6.w = vadd(v6.w,v2.w)602; CHECK-NEXT: }603; CHECK-NEXT: {604; CHECK-NEXT: v5.w = vasl(v5.w,v6.w)605; CHECK-NEXT: }606; CHECK-NEXT: {607; CHECK-NEXT: v1.w = vadd(v5.w,v1.w)608; CHECK-NEXT: v4 = vand(v5,v4)609; CHECK-NEXT: }610; CHECK-NEXT: {611; CHECK-NEXT: v5.uw = vlsr(v5.uw,r6)612; CHECK-NEXT: q0 = vcmp.eq(v4.w,v3.w)613; CHECK-NEXT: q1 = vcmp.gt(v5.uw,v1.uw)614; CHECK-NEXT: }615; CHECK-NEXT: {616; CHECK-NEXT: v1.uw = vlsr(v1.uw,r6)617; CHECK-NEXT: v4 = vmux(q0,v3,v2)618; CHECK-NEXT: v2 = vmux(q1,v2,v3)619; CHECK-NEXT: }620; CHECK-NEXT: {621; CHECK-NEXT: v4.w = vadd(v1.w,v4.w)622; CHECK-NEXT: v2.w = vsub(v2.w,v6.w)623; CHECK-NEXT: q3 = vcmp.eq(v5.w,v1.w)624; CHECK-NEXT: }625; CHECK-NEXT: {626; CHECK-NEXT: v28.uw = vlsr(v1.uw,r0)627; CHECK-NEXT: v2.w = vadd(v2.w,v8.w)628; CHECK-NEXT: }629; CHECK-NEXT: {630; CHECK-NEXT: v29.uw = vlsr(v4.uw,r0)631; CHECK-NEXT: }632; CHECK-NEXT: {633; CHECK-NEXT: v2.w = vasl(v2.w,r2)634; CHECK-NEXT: v1 = vmux(q3,v29,v28)635; CHECK-NEXT: q3 = vcmp.eq(v0.w,v3.w)636; CHECK-NEXT: }637; CHECK-NEXT: {638; CHECK-NEXT: v1 = vor(v30,v1)639; CHECK-NEXT: }640; CHECK-NEXT: {641; CHECK-NEXT: v31 = vor(v1,v2)642; CHECK-NEXT: }643; CHECK-NEXT: {644; CHECK-NEXT: v0 = vmux(q3,v3,v31)645; CHECK-NEXT: jumpr r31646; CHECK-NEXT: vmem(r1+#0) = v0.new647; CHECK-NEXT: }648 %v0 = load <32 x i8>, ptr %a0, align 128649 %v1 = sitofp <32 x i8> %v0 to <32 x float>650 store <32 x float> %v1, ptr %a1, align 128651 ret void652}653 654 655; s16 -> f16656; No widening657define void @s16f16_0(ptr %a0, ptr %a1) #0 {658; CHECK-LABEL: s16f16_0:659; CHECK: .cfi_startproc660; CHECK-NEXT: // %bb.0:661; CHECK-NEXT: {662; CHECK-NEXT: r6 = #1663; CHECK-NEXT: r3:2 = combine(#64,#31)664; CHECK-NEXT: v1.h = vabs(v0.h)665; CHECK-NEXT: v0.cur = vmem(r0+#0)666; CHECK-NEXT: }667; CHECK-NEXT: {668; CHECK-NEXT: v3.h = vsplat(r6)669; CHECK-NEXT: v5.h = vsplat(r2)670; CHECK-NEXT: v2 = vxor(v2,v2)671; CHECK-NEXT: }672; CHECK-NEXT: {673; CHECK-NEXT: v6.h = vsplat(r3)674; CHECK-NEXT: r5:4 = combine(##32768,#5)675; CHECK-NEXT: v4.uh = vcl0(v1.uh)676; CHECK-NEXT: }677; CHECK-NEXT: {678; CHECK-NEXT: v8.h = vsplat(r5)679; CHECK-NEXT: r2 = #10680; CHECK-NEXT: v4.h = vadd(v4.h,v3.h)681; CHECK-NEXT: q3 = vcmp.eq(v0.h,v2.h)682; CHECK-NEXT: }683; CHECK-NEXT: {684; CHECK-NEXT: v1.h = vasl(v1.h,v4.h)685; CHECK-NEXT: }686; CHECK-NEXT: {687; CHECK-NEXT: v7.h = vadd(v1.h,v5.h)688; CHECK-NEXT: v6 = vand(v1,v6)689; CHECK-NEXT: }690; CHECK-NEXT: {691; CHECK-NEXT: v1.uh = vlsr(v1.uh,r4)692; CHECK-NEXT: q0 = vcmp.eq(v6.h,v2.h)693; CHECK-NEXT: q1 = vcmp.gt(v1.uh,v7.uh)694; CHECK-NEXT: }695; CHECK-NEXT: {696; CHECK-NEXT: v25.uh = vlsr(v7.uh,r4)697; CHECK-NEXT: v26 = vmux(q0,v2,v3)698; CHECK-NEXT: v3 = vmux(q1,v3,v2)699; CHECK-NEXT: q1 = vcmp.gt(v2.h,v0.h)700; CHECK-NEXT: }701; CHECK-NEXT: {702; CHECK-NEXT: v7.h = vadd(v25.h,v26.h)703; CHECK-NEXT: v3.h = vadd(v3.h,v5.h)704; CHECK-NEXT: q2 = vcmp.eq(v1.h,v25.h)705; CHECK-NEXT: v30 = vmux(q1,v8,v2)706; CHECK-NEXT: }707; CHECK-NEXT: {708; CHECK-NEXT: v27.uh = vlsr(v25.uh,r6)709; CHECK-NEXT: v28.h = vsub(v3.h,v4.h)710; CHECK-NEXT: }711; CHECK-NEXT: {712; CHECK-NEXT: v29.uh = vlsr(v7.uh,r6)713; CHECK-NEXT: }714; CHECK-NEXT: {715; CHECK-NEXT: v1.h = vasl(v28.h,r2)716; CHECK-NEXT: v3 = vmux(q2,v29,v27)717; CHECK-NEXT: }718; CHECK-NEXT: {719; CHECK-NEXT: v3 = vor(v30,v3)720; CHECK-NEXT: }721; CHECK-NEXT: {722; CHECK-NEXT: v31 = vor(v3,v1)723; CHECK-NEXT: }724; CHECK-NEXT: {725; CHECK-NEXT: v0 = vmux(q3,v2,v31)726; CHECK-NEXT: jumpr r31727; CHECK-NEXT: vmem(r1+#0) = v0.new728; CHECK-NEXT: }729 %v0 = load <64 x i16>, ptr %a0, align 128730 %v1 = sitofp <64 x i16> %v0 to <64 x half>731 store <64 x half> %v1, ptr %a1, align 128732 ret void733}734 735; Widen input and result736define void @s16f16_1(ptr %a0, ptr %a1) #0 {737; CHECK-LABEL: s16f16_1:738; CHECK: .cfi_startproc739; CHECK-NEXT: // %bb.0:740; CHECK-NEXT: {741; CHECK-NEXT: r3:2 = combine(#31,#1)742; CHECK-NEXT: r7 = #64743; CHECK-NEXT: v1.h = vabs(v0.h)744; CHECK-NEXT: v0.cur = vmem(r0+#0)745; CHECK-NEXT: }746; CHECK-NEXT: {747; CHECK-NEXT: v2.h = vsplat(r2)748; CHECK-NEXT: v5.h = vsplat(r3)749; CHECK-NEXT: r6 = #5750; CHECK-NEXT: v3 = vxor(v3,v3)751; CHECK-NEXT: }752; CHECK-NEXT: {753; CHECK-NEXT: v6.h = vsplat(r7)754; CHECK-NEXT: r4 = ##32768755; CHECK-NEXT: v4.uh = vcl0(v1.uh)756; CHECK-NEXT: }757; CHECK-NEXT: {758; CHECK-NEXT: v8.h = vsplat(r4)759; CHECK-NEXT: r4 = #10760; CHECK-NEXT: q2 = vcmp.gt(v3.h,v0.h)761; CHECK-NEXT: v4.h = vadd(v4.h,v2.h)762; CHECK-NEXT: }763; CHECK-NEXT: {764; CHECK-NEXT: v30 = vmux(q2,v8,v3)765; CHECK-NEXT: q2 = vcmp.eq(v0.h,v3.h)766; CHECK-NEXT: }767; CHECK-NEXT: {768; CHECK-NEXT: v1.h = vasl(v1.h,v4.h)769; CHECK-NEXT: }770; CHECK-NEXT: {771; CHECK-NEXT: v7.h = vadd(v1.h,v5.h)772; CHECK-NEXT: v6 = vand(v1,v6)773; CHECK-NEXT: }774; CHECK-NEXT: {775; CHECK-NEXT: v1.uh = vlsr(v1.uh,r6)776; CHECK-NEXT: q1 = vcmp.eq(v6.h,v3.h)777; CHECK-NEXT: q0 = vcmp.gt(v1.uh,v7.uh)778; CHECK-NEXT: }779; CHECK-NEXT: {780; CHECK-NEXT: v25.uh = vlsr(v7.uh,r6)781; CHECK-NEXT: v26 = vmux(q1,v3,v2)782; CHECK-NEXT: v2 = vmux(q0,v2,v3)783; CHECK-NEXT: }784; CHECK-NEXT: {785; CHECK-NEXT: v7.h = vadd(v25.h,v26.h)786; CHECK-NEXT: v2.h = vadd(v2.h,v5.h)787; CHECK-NEXT: q3 = vcmp.eq(v1.h,v25.h)788; CHECK-NEXT: }789; CHECK-NEXT: {790; CHECK-NEXT: v27.uh = vlsr(v25.uh,r2)791; CHECK-NEXT: v28.h = vsub(v2.h,v4.h)792; CHECK-NEXT: }793; CHECK-NEXT: {794; CHECK-NEXT: v29.uh = vlsr(v7.uh,r2)795; CHECK-NEXT: }796; CHECK-NEXT: {797; CHECK-NEXT: v1.h = vasl(v28.h,r4)798; CHECK-NEXT: q3 = vsetq(r7)799; CHECK-NEXT: v2 = vmux(q3,v29,v27)800; CHECK-NEXT: }801; CHECK-NEXT: {802; CHECK-NEXT: v2 = vor(v30,v2)803; CHECK-NEXT: }804; CHECK-NEXT: {805; CHECK-NEXT: v31 = vor(v2,v1)806; CHECK-NEXT: }807; CHECK-NEXT: {808; CHECK-NEXT: v0 = vmux(q2,v3,v31)809; CHECK-NEXT: }810; CHECK-NEXT: {811; CHECK-NEXT: jumpr r31812; CHECK-NEXT: if (q3) vmem(r1+#0) = v0813; CHECK-NEXT: }814 %v0 = load <32 x i16>, ptr %a0, align 128815 %v1 = sitofp <32 x i16> %v0 to <32 x half>816 store <32 x half> %v1, ptr %a1, align 128817 ret void818}819 820 821; s16 -> f32822; No widening823define void @s16f32_0(ptr %a0, ptr %a1) #0 {824; CHECK-LABEL: s16f32_0:825; CHECK: .cfi_startproc826; CHECK-NEXT: // %bb.0:827; CHECK-NEXT: {828; CHECK-NEXT: v0 = vmem(r0+#0)829; CHECK-NEXT: }830; CHECK-NEXT: {831; CHECK-NEXT: r0 = #1832; CHECK-NEXT: r3:2 = combine(##255,#8)833; CHECK-NEXT: v1:0.w = vunpack(v0.h)834; CHECK-NEXT: }835; CHECK-NEXT: {836; CHECK-NEXT: v3 = vsplat(r0)837; CHECK-NEXT: r7 = #512838; CHECK-NEXT: v4.w = vabs(v0.w)839; CHECK-NEXT: v6.w = vabs(v1.w)840; CHECK-NEXT: }841; CHECK-NEXT: {842; CHECK-NEXT: v5 = vsplat(r3)843; CHECK-NEXT: v9 = vsplat(r7)844; CHECK-NEXT: r5 = #159845; CHECK-NEXT: v2 = vxor(v2,v2)846; CHECK-NEXT: }847; CHECK-NEXT: {848; CHECK-NEXT: v13 = vsplat(r5)849; CHECK-NEXT: r6 = ##-2147483648850; CHECK-NEXT: v7.uw = vcl0(v4.uw)851; CHECK-NEXT: }852; CHECK-NEXT: {853; CHECK-NEXT: v10 = vsplat(r6)854; CHECK-NEXT: v8.uw = vcl0(v6.uw)855; CHECK-NEXT: q0 = vcmp.gt(v2.w,v0.w)856; CHECK-NEXT: v7.w = vadd(v7.w,v3.w)857; CHECK-NEXT: }858; CHECK-NEXT: {859; CHECK-NEXT: r4 = #23860; CHECK-NEXT: v8.w = vadd(v8.w,v3.w)861; CHECK-NEXT: v27 = vmux(q0,v10,v2)862; CHECK-NEXT: }863; CHECK-NEXT: {864; CHECK-NEXT: v4.w = vasl(v4.w,v7.w)865; CHECK-NEXT: }866; CHECK-NEXT: {867; CHECK-NEXT: v6.w = vasl(v6.w,v8.w)868; CHECK-NEXT: v11.w = vadd(v4.w,v5.w)869; CHECK-NEXT: v12 = vand(v4,v9)870; CHECK-NEXT: }871; CHECK-NEXT: {872; CHECK-NEXT: v5.w = vadd(v6.w,v5.w)873; CHECK-NEXT: v9 = vand(v6,v9)874; CHECK-NEXT: q1 = vcmp.eq(v12.w,v2.w)875; CHECK-NEXT: q2 = vcmp.gt(v4.uw,v11.uw)876; CHECK-NEXT: }877; CHECK-NEXT: {878; CHECK-NEXT: v22.uw = vlsr(v11.uw,r2)879; CHECK-NEXT: q3 = vcmp.eq(v9.w,v2.w)880; CHECK-NEXT: v23 = vmux(q1,v2,v3)881; CHECK-NEXT: v14 = vmux(q2,v3,v2)882; CHECK-NEXT: }883; CHECK-NEXT: {884; CHECK-NEXT: v24.uw = vlsr(v5.uw,r2)885; CHECK-NEXT: v11.w = vadd(v22.w,v23.w)886; CHECK-NEXT: q2 = vcmp.gt(v6.uw,v5.uw)887; CHECK-NEXT: v25 = vmux(q3,v2,v3)888; CHECK-NEXT: }889; CHECK-NEXT: {890; CHECK-NEXT: v21.uw = vlsr(v4.uw,r2)891; CHECK-NEXT: v5.w = vadd(v24.w,v25.w)892; CHECK-NEXT: v3 = vmux(q2,v3,v2)893; CHECK-NEXT: v7.w = vsub(v14.w,v7.w)894; CHECK-NEXT: }895; CHECK-NEXT: {896; CHECK-NEXT: v6.uw = vlsr(v6.uw,r2)897; CHECK-NEXT: v3.w = vsub(v3.w,v8.w)898; CHECK-NEXT: q3 = vcmp.eq(v21.w,v22.w)899; CHECK-NEXT: v7.w = vadd(v7.w,v13.w)900; CHECK-NEXT: }901; CHECK-NEXT: {902; CHECK-NEXT: v4.uw = vlsr(v22.uw,r0)903; CHECK-NEXT: v3.w = vadd(v3.w,v13.w)904; CHECK-NEXT: q2 = vcmp.eq(v6.w,v24.w)905; CHECK-NEXT: }906; CHECK-NEXT: {907; CHECK-NEXT: v11.uw = vlsr(v11.uw,r0)908; CHECK-NEXT: }909; CHECK-NEXT: {910; CHECK-NEXT: v5.uw = vlsr(v5.uw,r0)911; CHECK-NEXT: v4 = vmux(q3,v11,v4)912; CHECK-NEXT: q3 = vcmp.gt(v2.w,v1.w)913; CHECK-NEXT: }914; CHECK-NEXT: {915; CHECK-NEXT: v26.uw = vlsr(v24.uw,r0)916; CHECK-NEXT: v28 = vmux(q3,v10,v2)917; CHECK-NEXT: v4 = vor(v27,v4)918; CHECK-NEXT: q3 = vcmp.eq(v0.w,v2.w)919; CHECK-NEXT: }920; CHECK-NEXT: {921; CHECK-NEXT: v7.w = vasl(v7.w,r4)922; CHECK-NEXT: v5 = vmux(q2,v5,v26)923; CHECK-NEXT: q2 = vcmp.eq(v1.w,v2.w)924; CHECK-NEXT: }925; CHECK-NEXT: {926; CHECK-NEXT: v3.w = vasl(v3.w,r4)927; CHECK-NEXT: v5 = vor(v28,v5)928; CHECK-NEXT: v29 = vor(v4,v7)929; CHECK-NEXT: }930; CHECK-NEXT: {931; CHECK-NEXT: v3 = vor(v5,v3)932; CHECK-NEXT: v31 = vmux(q3,v2,v29)933; CHECK-NEXT: vmem(r1+#0) = v31.new934; CHECK-NEXT: }935; CHECK-NEXT: {936; CHECK-NEXT: v30 = vmux(q2,v2,v3)937; CHECK-NEXT: jumpr r31938; CHECK-NEXT: vmem(r1+#1) = v30.new939; CHECK-NEXT: }940 %v0 = load <64 x i16>, ptr %a0, align 128941 %v1 = sitofp <64 x i16> %v0 to <64 x float>942 store <64 x float> %v1, ptr %a1, align 128943 ret void944}945 946; Widen input947define void @s16f32_1(ptr %a0, ptr %a1) #0 {948; CHECK-LABEL: s16f32_1:949; CHECK: .cfi_startproc950; CHECK-NEXT: // %bb.0:951; CHECK-NEXT: {952; CHECK-NEXT: v0 = vmem(r0+#0)953; CHECK-NEXT: }954; CHECK-NEXT: {955; CHECK-NEXT: r0 = #1956; CHECK-NEXT: r2 = #255957; CHECK-NEXT: v1:0.w = vunpack(v0.h)958; CHECK-NEXT: }959; CHECK-NEXT: {960; CHECK-NEXT: v3 = vsplat(r0)961; CHECK-NEXT: v4 = vsplat(r2)962; CHECK-NEXT: r3 = #512963; CHECK-NEXT: v2.w = vabs(v0.w)964; CHECK-NEXT: }965; CHECK-NEXT: {966; CHECK-NEXT: v6 = vsplat(r3)967; CHECK-NEXT: r7:6 = combine(##-2147483648,#8)968; CHECK-NEXT: v1 = vxor(v1,v1)969; CHECK-NEXT: }970; CHECK-NEXT: {971; CHECK-NEXT: r4 = #159972; CHECK-NEXT: v5.uw = vcl0(v2.uw)973; CHECK-NEXT: }974; CHECK-NEXT: {975; CHECK-NEXT: v7 = vsplat(r4)976; CHECK-NEXT: v29 = vsplat(r7)977; CHECK-NEXT: q2 = vcmp.gt(v1.w,v0.w)978; CHECK-NEXT: v5.w = vadd(v5.w,v3.w)979; CHECK-NEXT: }980; CHECK-NEXT: {981; CHECK-NEXT: r2 = #23982; CHECK-NEXT: }983; CHECK-NEXT: {984; CHECK-NEXT: v2.w = vasl(v2.w,v5.w)985; CHECK-NEXT: }986; CHECK-NEXT: {987; CHECK-NEXT: v4.w = vadd(v2.w,v4.w)988; CHECK-NEXT: v6 = vand(v2,v6)989; CHECK-NEXT: }990; CHECK-NEXT: {991; CHECK-NEXT: v2.uw = vlsr(v2.uw,r6)992; CHECK-NEXT: q0 = vcmp.eq(v6.w,v1.w)993; CHECK-NEXT: q1 = vcmp.gt(v2.uw,v4.uw)994; CHECK-NEXT: }995; CHECK-NEXT: {996; CHECK-NEXT: v4.uw = vlsr(v4.uw,r6)997; CHECK-NEXT: v6 = vmux(q0,v1,v3)998; CHECK-NEXT: v3 = vmux(q1,v3,v1)999; CHECK-NEXT: }1000; CHECK-NEXT: {1001; CHECK-NEXT: v6.w = vadd(v4.w,v6.w)1002; CHECK-NEXT: v27.w = vsub(v3.w,v5.w)1003; CHECK-NEXT: q3 = vcmp.eq(v2.w,v4.w)1004; CHECK-NEXT: }1005; CHECK-NEXT: {1006; CHECK-NEXT: v28.uw = vlsr(v4.uw,r0)1007; CHECK-NEXT: v2.w = vadd(v27.w,v7.w)1008; CHECK-NEXT: v4 = vmux(q2,v29,v1)1009; CHECK-NEXT: }1010; CHECK-NEXT: {1011; CHECK-NEXT: v30.uw = vlsr(v6.uw,r0)1012; CHECK-NEXT: }1013; CHECK-NEXT: {1014; CHECK-NEXT: v2.w = vasl(v2.w,r2)1015; CHECK-NEXT: v3 = vmux(q3,v30,v28)1016; CHECK-NEXT: q3 = vcmp.eq(v0.w,v1.w)1017; CHECK-NEXT: }1018; CHECK-NEXT: {1019; CHECK-NEXT: v3 = vor(v4,v3)1020; CHECK-NEXT: }1021; CHECK-NEXT: {1022; CHECK-NEXT: v31 = vor(v3,v2)1023; CHECK-NEXT: }1024; CHECK-NEXT: {1025; CHECK-NEXT: v0 = vmux(q3,v1,v31)1026; CHECK-NEXT: jumpr r311027; CHECK-NEXT: vmem(r1+#0) = v0.new1028; CHECK-NEXT: }1029 %v0 = load <32 x i16>, ptr %a0, align 1281030 %v1 = sitofp <32 x i16> %v0 to <32 x float>1031 store <32 x float> %v1, ptr %a1, align 1281032 ret void1033}1034 1035 1036; s32 -> f161037; No widening1038define void @s32f16_0(ptr %a0, ptr %a1) #0 {1039; CHECK-LABEL: s32f16_0:1040; CHECK: .cfi_startproc1041; CHECK-NEXT: // %bb.0:1042; CHECK-NEXT: {1043; CHECK-NEXT: r3:2 = combine(#8,#1)1044; CHECK-NEXT: r6 = #2551045; CHECK-NEXT: v4.w = vabs(v1.w)1046; CHECK-NEXT: v1.cur = vmem(r0+#0)1047; CHECK-NEXT: }1048; CHECK-NEXT: {1049; CHECK-NEXT: v2 = vsplat(r2)1050; CHECK-NEXT: r4 = #5121051; CHECK-NEXT: v5.w = vabs(v0.w)1052; CHECK-NEXT: v0.cur = vmem(r0+#1)1053; CHECK-NEXT: }1054; CHECK-NEXT: {1055; CHECK-NEXT: v9 = vsplat(r4)1056; CHECK-NEXT: v8 = vsplat(r6)1057; CHECK-NEXT: r4 = #1591058; CHECK-NEXT: v3.uw = vcl0(v4.uw)1059; CHECK-NEXT: }1060; CHECK-NEXT: {1061; CHECK-NEXT: v6.uw = vcl0(v5.uw)1062; CHECK-NEXT: v7.w = vadd(v3.w,v2.w)1063; CHECK-NEXT: v3 = vxor(v3,v3)1064; CHECK-NEXT: }1065; CHECK-NEXT: {1066; CHECK-NEXT: v26 = vsplat(r4)1067; CHECK-NEXT: r5 = ##-21474836481068; CHECK-NEXT: v6.w = vadd(v6.w,v2.w)1069; CHECK-NEXT: }1070; CHECK-NEXT: {1071; CHECK-NEXT: v13 = vsplat(r5)1072; CHECK-NEXT: v4.w = vasl(v4.w,v7.w)1073; CHECK-NEXT: q0 = vcmp.gt(v3.w,v1.w)1074; CHECK-NEXT: }1075; CHECK-NEXT: {1076; CHECK-NEXT: v5.w = vasl(v5.w,v6.w)1077; CHECK-NEXT: v25 = vmux(q0,v13,v3)1078; CHECK-NEXT: v10.w = vadd(v4.w,v8.w)1079; CHECK-NEXT: v11 = vand(v4,v9)1080; CHECK-NEXT: }1081; CHECK-NEXT: {1082; CHECK-NEXT: v9 = vand(v5,v9)1083; CHECK-NEXT: q3 = vcmp.eq(v11.w,v3.w)1084; CHECK-NEXT: v8.w = vadd(v5.w,v8.w)1085; CHECK-NEXT: q1 = vcmp.gt(v4.uw,v10.uw)1086; CHECK-NEXT: }1087; CHECK-NEXT: {1088; CHECK-NEXT: v20.uw = vlsr(v10.uw,r3)1089; CHECK-NEXT: q2 = vcmp.eq(v9.w,v3.w)1090; CHECK-NEXT: v21 = vmux(q3,v3,v2)1091; CHECK-NEXT: q3 = vcmp.gt(v5.uw,v8.uw)1092; CHECK-NEXT: }1093; CHECK-NEXT: {1094; CHECK-NEXT: v8.uw = vlsr(v8.uw,r3)1095; CHECK-NEXT: v9.w = vadd(v20.w,v21.w)1096; CHECK-NEXT: v23 = vmux(q2,v3,v2)1097; CHECK-NEXT: v22 = vmux(q1,v2,v3)1098; CHECK-NEXT: }1099; CHECK-NEXT: {1100; CHECK-NEXT: v12.uw = vlsr(v4.uw,r3)1101; CHECK-NEXT: v2 = vmux(q3,v2,v3)1102; CHECK-NEXT: v24.w = vadd(v8.w,v23.w)1103; CHECK-NEXT: v7.w = vsub(v22.w,v7.w)1104; CHECK-NEXT: }1105; CHECK-NEXT: {1106; CHECK-NEXT: v5.uw = vlsr(v5.uw,r3)1107; CHECK-NEXT: v2.w = vsub(v2.w,v6.w)1108; CHECK-NEXT: q3 = vcmp.eq(v12.w,v20.w)1109; CHECK-NEXT: v7.w = vadd(v7.w,v26.w)1110; CHECK-NEXT: }1111; CHECK-NEXT: {1112; CHECK-NEXT: r3 = #231113; CHECK-NEXT: v4.uw = vlsr(v20.uw,r2)1114; CHECK-NEXT: q2 = vcmp.eq(v5.w,v8.w)1115; CHECK-NEXT: v2.w = vadd(v2.w,v26.w)1116; CHECK-NEXT: }1117; CHECK-NEXT: {1118; CHECK-NEXT: v9.uw = vlsr(v9.uw,r2)1119; CHECK-NEXT: }1120; CHECK-NEXT: {1121; CHECK-NEXT: v27.uw = vlsr(v24.uw,r2)1122; CHECK-NEXT: v4 = vmux(q3,v9,v4)1123; CHECK-NEXT: q3 = vcmp.gt(v3.w,v0.w)1124; CHECK-NEXT: }1125; CHECK-NEXT: {1126; CHECK-NEXT: v28.uw = vlsr(v8.uw,r2)1127; CHECK-NEXT: v30 = vmux(q3,v13,v3)1128; CHECK-NEXT: v4 = vor(v25,v4)1129; CHECK-NEXT: q3 = vcmp.eq(v0.w,v3.w)1130; CHECK-NEXT: }1131; CHECK-NEXT: {1132; CHECK-NEXT: v29.w = vasl(v7.w,r3)1133; CHECK-NEXT: v5 = vmux(q2,v27,v28)1134; CHECK-NEXT: q2 = vcmp.eq(v1.w,v3.w)1135; CHECK-NEXT: }1136; CHECK-NEXT: {1137; CHECK-NEXT: v2.w = vasl(v2.w,r3)1138; CHECK-NEXT: v31 = vor(v30,v5)1139; CHECK-NEXT: v4 = vor(v4,v29)1140; CHECK-NEXT: }1141; CHECK-NEXT: {1142; CHECK-NEXT: v1 = vor(v31,v2)1143; CHECK-NEXT: v4 = vmux(q2,v3,v4)1144; CHECK-NEXT: }1145; CHECK-NEXT: {1146; CHECK-NEXT: v0 = vmux(q3,v3,v1)1147; CHECK-NEXT: }1148; CHECK-NEXT: {1149; CHECK-NEXT: v2.qf32 = vadd(v4.sf,v3.sf)1150; CHECK-NEXT: }1151; CHECK-NEXT: {1152; CHECK-NEXT: v3.qf32 = vadd(v0.sf,v3.sf)1153; CHECK-NEXT: }1154; CHECK-NEXT: {1155; CHECK-NEXT: v0.hf = v3:2.qf321156; CHECK-NEXT: }1157; CHECK-NEXT: {1158; CHECK-NEXT: v0.h = vdeal(v0.h)1159; CHECK-NEXT: jumpr r311160; CHECK-NEXT: vmem(r1+#0) = v0.new1161; CHECK-NEXT: }1162 %v0 = load <64 x i32>, ptr %a0, align 1281163 %v1 = sitofp <64 x i32> %v0 to <64 x half>1164 store <64 x half> %v1, ptr %a1, align 1281165 ret void1166}1167 1168; Widen result1169define void @s32f16_1(ptr %a0, ptr %a1) #0 {1170; CHECK-LABEL: s32f16_1:1171; CHECK: .cfi_startproc1172; CHECK-NEXT: // %bb.0:1173; CHECK-NEXT: {1174; CHECK-NEXT: r6 = #11175; CHECK-NEXT: v1.w = vabs(v0.w)1176; CHECK-NEXT: v0.cur = vmem(r0+#0)1177; CHECK-NEXT: }1178; CHECK-NEXT: {1179; CHECK-NEXT: v2 = vsplat(r6)1180; CHECK-NEXT: r3:2 = combine(##255,#8)1181; CHECK-NEXT: r4 = #5121182; CHECK-NEXT: }1183; CHECK-NEXT: {1184; CHECK-NEXT: v5 = vsplat(r3)1185; CHECK-NEXT: v6 = vsplat(r4)1186; CHECK-NEXT: v4.uw = vcl0(v1.uw)1187; CHECK-NEXT: v3 = vxor(v3,v3)1188; CHECK-NEXT: }1189; CHECK-NEXT: {1190; CHECK-NEXT: r5 = #1591191; CHECK-NEXT: r4 = ##-21474836481192; CHECK-NEXT: v4.w = vadd(v4.w,v2.w)1193; CHECK-NEXT: }1194; CHECK-NEXT: {1195; CHECK-NEXT: v28 = vsplat(r5)1196; CHECK-NEXT: v29 = vsplat(r4)1197; CHECK-NEXT: q3 = vcmp.gt(v3.w,v0.w)1198; CHECK-NEXT: }1199; CHECK-NEXT: {1200; CHECK-NEXT: r3 = #231201; CHECK-NEXT: v1.w = vasl(v1.w,v4.w)1202; CHECK-NEXT: v31 = vmux(q3,v29,v3)1203; CHECK-NEXT: }1204; CHECK-NEXT: {1205; CHECK-NEXT: v5.w = vadd(v1.w,v5.w)1206; CHECK-NEXT: v6 = vand(v1,v6)1207; CHECK-NEXT: }1208; CHECK-NEXT: {1209; CHECK-NEXT: v7.uw = vlsr(v1.uw,r2)1210; CHECK-NEXT: q0 = vcmp.eq(v6.w,v3.w)1211; CHECK-NEXT: q1 = vcmp.gt(v1.uw,v5.uw)1212; CHECK-NEXT: }1213; CHECK-NEXT: {1214; CHECK-NEXT: r2 = #641215; CHECK-NEXT: v1.uw = vlsr(v5.uw,r2)1216; CHECK-NEXT: v27 = vmux(q0,v3,v2)1217; CHECK-NEXT: v2 = vmux(q1,v2,v3)1218; CHECK-NEXT: }1219; CHECK-NEXT: {1220; CHECK-NEXT: q3 = vsetq(r2)1221; CHECK-NEXT: v5.w = vadd(v1.w,v27.w)1222; CHECK-NEXT: v2.w = vsub(v2.w,v4.w)1223; CHECK-NEXT: q2 = vcmp.eq(v7.w,v1.w)1224; CHECK-NEXT: }1225; CHECK-NEXT: {1226; CHECK-NEXT: v1.uw = vlsr(v1.uw,r6)1227; CHECK-NEXT: v2.w = vadd(v2.w,v28.w)1228; CHECK-NEXT: }1229; CHECK-NEXT: {1230; CHECK-NEXT: v30.uw = vlsr(v5.uw,r6)1231; CHECK-NEXT: }1232; CHECK-NEXT: {1233; CHECK-NEXT: v2.w = vasl(v2.w,r3)1234; CHECK-NEXT: v1 = vmux(q2,v30,v1)1235; CHECK-NEXT: q2 = vcmp.eq(v0.w,v3.w)1236; CHECK-NEXT: }1237; CHECK-NEXT: {1238; CHECK-NEXT: v1 = vor(v31,v1)1239; CHECK-NEXT: }1240; CHECK-NEXT: {1241; CHECK-NEXT: v1.qf32 = vadd(v3.sf,v3.sf)1242; CHECK-NEXT: v0 = vor(v1,v2)1243; CHECK-NEXT: }1244; CHECK-NEXT: {1245; CHECK-NEXT: v0 = vmux(q2,v3,v0)1246; CHECK-NEXT: }1247; CHECK-NEXT: {1248; CHECK-NEXT: v0.qf32 = vadd(v0.sf,v3.sf)1249; CHECK-NEXT: }1250; CHECK-NEXT: {1251; CHECK-NEXT: v0.hf = v1:0.qf321252; CHECK-NEXT: }1253; CHECK-NEXT: {1254; CHECK-NEXT: v0.h = vdeal(v0.h)1255; CHECK-NEXT: }1256; CHECK-NEXT: {1257; CHECK-NEXT: jumpr r311258; CHECK-NEXT: if (q3) vmem(r1+#0) = v01259; CHECK-NEXT: }1260 %v0 = load <32 x i32>, ptr %a0, align 1281261 %v1 = sitofp <32 x i32> %v0 to <32 x half>1262 store <32 x half> %v1, ptr %a1, align 1281263 ret void1264}1265 1266; s32 -> f321267; No widening1268define void @s32f32_0(ptr %a0, ptr %a1) #0 {1269; CHECK-LABEL: s32f32_0:1270; CHECK: .cfi_startproc1271; CHECK-NEXT: // %bb.0:1272; CHECK-NEXT: {1273; CHECK-NEXT: r0 = #11274; CHECK-NEXT: r2 = #2551275; CHECK-NEXT: v1.w = vabs(v0.w)1276; CHECK-NEXT: v0.cur = vmem(r0+#0)1277; CHECK-NEXT: }1278; CHECK-NEXT: {1279; CHECK-NEXT: v3 = vsplat(r0)1280; CHECK-NEXT: v5 = vsplat(r2)1281; CHECK-NEXT: r3 = #5121282; CHECK-NEXT: v2 = vxor(v2,v2)1283; CHECK-NEXT: }1284; CHECK-NEXT: {1285; CHECK-NEXT: v6 = vsplat(r3)1286; CHECK-NEXT: r7:6 = combine(##-2147483648,#8)1287; CHECK-NEXT: v4.uw = vcl0(v1.uw)1288; CHECK-NEXT: }1289; CHECK-NEXT: {1290; CHECK-NEXT: r4 = #1591291; CHECK-NEXT: v4.w = vadd(v4.w,v3.w)1292; CHECK-NEXT: }1293; CHECK-NEXT: {1294; CHECK-NEXT: v7 = vsplat(r4)1295; CHECK-NEXT: v29 = vsplat(r7)1296; CHECK-NEXT: r2 = #231297; CHECK-NEXT: q2 = vcmp.gt(v2.w,v0.w)1298; CHECK-NEXT: }1299; CHECK-NEXT: {1300; CHECK-NEXT: v1.w = vasl(v1.w,v4.w)1301; CHECK-NEXT: }1302; CHECK-NEXT: {1303; CHECK-NEXT: v5.w = vadd(v1.w,v5.w)1304; CHECK-NEXT: v6 = vand(v1,v6)1305; CHECK-NEXT: }1306; CHECK-NEXT: {1307; CHECK-NEXT: v1.uw = vlsr(v1.uw,r6)1308; CHECK-NEXT: q0 = vcmp.eq(v6.w,v2.w)1309; CHECK-NEXT: q1 = vcmp.gt(v1.uw,v5.uw)1310; CHECK-NEXT: }1311; CHECK-NEXT: {1312; CHECK-NEXT: v5.uw = vlsr(v5.uw,r6)1313; CHECK-NEXT: v6 = vmux(q0,v2,v3)1314; CHECK-NEXT: v3 = vmux(q1,v3,v2)1315; CHECK-NEXT: }1316; CHECK-NEXT: {1317; CHECK-NEXT: v6.w = vadd(v5.w,v6.w)1318; CHECK-NEXT: v27.w = vsub(v3.w,v4.w)1319; CHECK-NEXT: q3 = vcmp.eq(v1.w,v5.w)1320; CHECK-NEXT: v4 = vmux(q2,v29,v2)1321; CHECK-NEXT: }1322; CHECK-NEXT: {1323; CHECK-NEXT: v28.uw = vlsr(v5.uw,r0)1324; CHECK-NEXT: v1.w = vadd(v27.w,v7.w)1325; CHECK-NEXT: }1326; CHECK-NEXT: {1327; CHECK-NEXT: v30.uw = vlsr(v6.uw,r0)1328; CHECK-NEXT: }1329; CHECK-NEXT: {1330; CHECK-NEXT: v1.w = vasl(v1.w,r2)1331; CHECK-NEXT: v3 = vmux(q3,v30,v28)1332; CHECK-NEXT: q3 = vcmp.eq(v0.w,v2.w)1333; CHECK-NEXT: }1334; CHECK-NEXT: {1335; CHECK-NEXT: v3 = vor(v4,v3)1336; CHECK-NEXT: }1337; CHECK-NEXT: {1338; CHECK-NEXT: v31 = vor(v3,v1)1339; CHECK-NEXT: }1340; CHECK-NEXT: {1341; CHECK-NEXT: v0 = vmux(q3,v2,v31)1342; CHECK-NEXT: jumpr r311343; CHECK-NEXT: vmem(r1+#0) = v0.new1344; CHECK-NEXT: }1345 %v0 = load <32 x i32>, ptr %a0, align 1281346 %v1 = sitofp <32 x i32> %v0 to <32 x float>1347 store <32 x float> %v1, ptr %a1, align 1281348 ret void1349}1350 1351; Widen input and result1352define void @s32f32_1(ptr %a0, ptr %a1) #0 {1353; CHECK-LABEL: s32f32_1:1354; CHECK: .cfi_startproc1355; CHECK-NEXT: // %bb.0:1356; CHECK-NEXT: {1357; CHECK-NEXT: r0 = #11358; CHECK-NEXT: r2 = #2551359; CHECK-NEXT: v1.w = vabs(v0.w)1360; CHECK-NEXT: v0.cur = vmem(r0+#0)1361; CHECK-NEXT: }1362; CHECK-NEXT: {1363; CHECK-NEXT: v2 = vsplat(r0)1364; CHECK-NEXT: v5 = vsplat(r2)1365; CHECK-NEXT: r3 = #5121366; CHECK-NEXT: v3 = vxor(v3,v3)1367; CHECK-NEXT: }1368; CHECK-NEXT: {1369; CHECK-NEXT: v6 = vsplat(r3)1370; CHECK-NEXT: r7:6 = combine(##-2147483648,#8)1371; CHECK-NEXT: v4.uw = vcl0(v1.uw)1372; CHECK-NEXT: }1373; CHECK-NEXT: {1374; CHECK-NEXT: r4 = #1591375; CHECK-NEXT: v4.w = vadd(v4.w,v2.w)1376; CHECK-NEXT: }1377; CHECK-NEXT: {1378; CHECK-NEXT: v7 = vsplat(r4)1379; CHECK-NEXT: v29 = vsplat(r7)1380; CHECK-NEXT: r3 = #231381; CHECK-NEXT: q3 = vcmp.gt(v3.w,v0.w)1382; CHECK-NEXT: }1383; CHECK-NEXT: {1384; CHECK-NEXT: r2 = #641385; CHECK-NEXT: v1.w = vasl(v1.w,v4.w)1386; CHECK-NEXT: }1387; CHECK-NEXT: {1388; CHECK-NEXT: v5.w = vadd(v1.w,v5.w)1389; CHECK-NEXT: v6 = vand(v1,v6)1390; CHECK-NEXT: }1391; CHECK-NEXT: {1392; CHECK-NEXT: v1.uw = vlsr(v1.uw,r6)1393; CHECK-NEXT: q0 = vcmp.eq(v6.w,v3.w)1394; CHECK-NEXT: q1 = vcmp.gt(v1.uw,v5.uw)1395; CHECK-NEXT: }1396; CHECK-NEXT: {1397; CHECK-NEXT: v5.uw = vlsr(v5.uw,r6)1398; CHECK-NEXT: v6 = vmux(q0,v3,v2)1399; CHECK-NEXT: v2 = vmux(q1,v2,v3)1400; CHECK-NEXT: }1401; CHECK-NEXT: {1402; CHECK-NEXT: v6.w = vadd(v5.w,v6.w)1403; CHECK-NEXT: v27.w = vsub(v2.w,v4.w)1404; CHECK-NEXT: q2 = vcmp.eq(v1.w,v5.w)1405; CHECK-NEXT: v4 = vmux(q3,v29,v3)1406; CHECK-NEXT: }1407; CHECK-NEXT: {1408; CHECK-NEXT: v28.uw = vlsr(v5.uw,r0)1409; CHECK-NEXT: q3 = vsetq(r2)1410; CHECK-NEXT: v1.w = vadd(v27.w,v7.w)1411; CHECK-NEXT: }1412; CHECK-NEXT: {1413; CHECK-NEXT: v30.uw = vlsr(v6.uw,r0)1414; CHECK-NEXT: }1415; CHECK-NEXT: {1416; CHECK-NEXT: v1.w = vasl(v1.w,r3)1417; CHECK-NEXT: v2 = vmux(q2,v30,v28)1418; CHECK-NEXT: q2 = vcmp.eq(v0.w,v3.w)1419; CHECK-NEXT: }1420; CHECK-NEXT: {1421; CHECK-NEXT: v2 = vor(v4,v2)1422; CHECK-NEXT: }1423; CHECK-NEXT: {1424; CHECK-NEXT: v31 = vor(v2,v1)1425; CHECK-NEXT: }1426; CHECK-NEXT: {1427; CHECK-NEXT: v0 = vmux(q2,v3,v31)1428; CHECK-NEXT: }1429; CHECK-NEXT: {1430; CHECK-NEXT: jumpr r311431; CHECK-NEXT: if (q3) vmem(r1+#0) = v01432; CHECK-NEXT: }1433 %v0 = load <16 x i32>, ptr %a0, align 1281434 %v1 = sitofp <16 x i32> %v0 to <16 x float>1435 store <16 x float> %v1, ptr %a1, align 1281436 ret void1437}1438 1439 1440; u8 -> f161441; No widening1442define void @u8f16_0(ptr %a0, ptr %a1) #0 {1443; CHECK-LABEL: u8f16_0:1444; CHECK: .cfi_startproc1445; CHECK-NEXT: // %bb.0:1446; CHECK-NEXT: {1447; CHECK-NEXT: v0 = vmem(r0+#0)1448; CHECK-NEXT: }1449; CHECK-NEXT: {1450; CHECK-NEXT: r6 = #11451; CHECK-NEXT: r3:2 = combine(#31,#5)1452; CHECK-NEXT: v1:0.uh = vunpack(v0.ub)1453; CHECK-NEXT: }1454; CHECK-NEXT: {1455; CHECK-NEXT: v3.h = vsplat(r6)1456; CHECK-NEXT: v4.h = vsplat(r3)1457; CHECK-NEXT: r5 = #641458; CHECK-NEXT: v2 = vxor(v2,v2)1459; CHECK-NEXT: }1460; CHECK-NEXT: {1461; CHECK-NEXT: v6.h = vsplat(r5)1462; CHECK-NEXT: r4 = #101463; CHECK-NEXT: v5.uh = vcl0(v0.uh)1464; CHECK-NEXT: }1465; CHECK-NEXT: {1466; CHECK-NEXT: v7.uh = vcl0(v1.uh)1467; CHECK-NEXT: v5.h = vadd(v5.h,v3.h)1468; CHECK-NEXT: }1469; CHECK-NEXT: {1470; CHECK-NEXT: v7.h = vadd(v7.h,v3.h)1471; CHECK-NEXT: }1472; CHECK-NEXT: {1473; CHECK-NEXT: v8.h = vasl(v0.h,v5.h)1474; CHECK-NEXT: }1475; CHECK-NEXT: {1476; CHECK-NEXT: v11.h = vasl(v1.h,v7.h)1477; CHECK-NEXT: v10 = vand(v8,v6)1478; CHECK-NEXT: v9.h = vadd(v8.h,v4.h)1479; CHECK-NEXT: }1480; CHECK-NEXT: {1481; CHECK-NEXT: v22.h = vadd(v11.h,v4.h)1482; CHECK-NEXT: v6 = vand(v11,v6)1483; CHECK-NEXT: q0 = vcmp.gt(v8.uh,v9.uh)1484; CHECK-NEXT: q1 = vcmp.eq(v10.h,v2.h)1485; CHECK-NEXT: }1486; CHECK-NEXT: {1487; CHECK-NEXT: v21.uh = vlsr(v8.uh,r2)1488; CHECK-NEXT: q2 = vcmp.eq(v6.h,v2.h)1489; CHECK-NEXT: q3 = vcmp.gt(v11.uh,v22.uh)1490; CHECK-NEXT: v12 = vmux(q1,v2,v3)1491; CHECK-NEXT: }1492; CHECK-NEXT: {1493; CHECK-NEXT: v9.uh = vlsr(v9.uh,r2)1494; CHECK-NEXT: v13 = vmux(q2,v2,v3)1495; CHECK-NEXT: v25 = vmux(q0,v3,v2)1496; CHECK-NEXT: v3 = vmux(q3,v3,v2)1497; CHECK-NEXT: }1498; CHECK-NEXT: {1499; CHECK-NEXT: v8.uh = vlsr(v22.uh,r2)1500; CHECK-NEXT: v24.h = vadd(v9.h,v12.h)1501; CHECK-NEXT: v3.h = vadd(v3.h,v4.h)1502; CHECK-NEXT: v12.h = vadd(v25.h,v4.h)1503; CHECK-NEXT: }1504; CHECK-NEXT: {1505; CHECK-NEXT: v23.uh = vlsr(v11.uh,r2)1506; CHECK-NEXT: v13.h = vadd(v8.h,v13.h)1507; CHECK-NEXT: v5.h = vsub(v12.h,v5.h)1508; CHECK-NEXT: v3.h = vsub(v3.h,v7.h)1509; CHECK-NEXT: }1510; CHECK-NEXT: {1511; CHECK-NEXT: v14.uh = vlsr(v9.uh,r6)1512; CHECK-NEXT: q2 = vcmp.eq(v21.h,v9.h)1513; CHECK-NEXT: q3 = vcmp.eq(v23.h,v8.h)1514; CHECK-NEXT: }1515; CHECK-NEXT: {1516; CHECK-NEXT: v26.uh = vlsr(v24.uh,r6)1517; CHECK-NEXT: }1518; CHECK-NEXT: {1519; CHECK-NEXT: v27.uh = vlsr(v13.uh,r6)1520; CHECK-NEXT: v4 = vmux(q2,v26,v14)1521; CHECK-NEXT: q2 = vcmp.eq(v1.h,v2.h)1522; CHECK-NEXT: }1523; CHECK-NEXT: {1524; CHECK-NEXT: v28.uh = vlsr(v8.uh,r6)1525; CHECK-NEXT: }1526; CHECK-NEXT: {1527; CHECK-NEXT: v5.h = vasl(v5.h,r4)1528; CHECK-NEXT: v6 = vmux(q3,v27,v28)1529; CHECK-NEXT: q3 = vcmp.eq(v0.h,v2.h)1530; CHECK-NEXT: }1531; CHECK-NEXT: {1532; CHECK-NEXT: v3.h = vasl(v3.h,r4)1533; CHECK-NEXT: v29 = vor(v4,v5)1534; CHECK-NEXT: }1535; CHECK-NEXT: {1536; CHECK-NEXT: v3 = vor(v6,v3)1537; CHECK-NEXT: v31 = vmux(q3,v2,v29)1538; CHECK-NEXT: vmem(r1+#0) = v31.new1539; CHECK-NEXT: }1540; CHECK-NEXT: {1541; CHECK-NEXT: v30 = vmux(q2,v2,v3)1542; CHECK-NEXT: jumpr r311543; CHECK-NEXT: vmem(r1+#1) = v30.new1544; CHECK-NEXT: }1545 %v0 = load <128 x i8>, ptr %a0, align 1281546 %v1 = uitofp <128 x i8> %v0 to <128 x half>1547 store <128 x half> %v1, ptr %a1, align 1281548 ret void1549}1550 1551; Widen input1552define void @u8f16_1(ptr %a0, ptr %a1) #0 {1553; CHECK-LABEL: u8f16_1:1554; CHECK: .cfi_startproc1555; CHECK-NEXT: // %bb.0:1556; CHECK-NEXT: {1557; CHECK-NEXT: v0 = vmem(r0+#0)1558; CHECK-NEXT: }1559; CHECK-NEXT: {1560; CHECK-NEXT: r6 = #11561; CHECK-NEXT: r3:2 = combine(#64,#31)1562; CHECK-NEXT: v1:0.uh = vunpack(v0.ub)1563; CHECK-NEXT: }1564; CHECK-NEXT: {1565; CHECK-NEXT: v1.h = vsplat(r6)1566; CHECK-NEXT: v4.h = vsplat(r2)1567; CHECK-NEXT: r5 = #51568; CHECK-NEXT: v2 = vxor(v2,v2)1569; CHECK-NEXT: }1570; CHECK-NEXT: {1571; CHECK-NEXT: v5.h = vsplat(r3)1572; CHECK-NEXT: r4 = #101573; CHECK-NEXT: v3.uh = vcl0(v0.uh)1574; CHECK-NEXT: q3 = vcmp.eq(v0.h,v2.h)1575; CHECK-NEXT: }1576; CHECK-NEXT: {1577; CHECK-NEXT: v3.h = vadd(v3.h,v1.h)1578; CHECK-NEXT: }1579; CHECK-NEXT: {1580; CHECK-NEXT: v6.h = vasl(v0.h,v3.h)1581; CHECK-NEXT: }1582; CHECK-NEXT: {1583; CHECK-NEXT: v7.h = vadd(v6.h,v4.h)1584; CHECK-NEXT: v5 = vand(v6,v5)1585; CHECK-NEXT: }1586; CHECK-NEXT: {1587; CHECK-NEXT: v6.uh = vlsr(v6.uh,r5)1588; CHECK-NEXT: q0 = vcmp.gt(v6.uh,v7.uh)1589; CHECK-NEXT: q1 = vcmp.eq(v5.h,v2.h)1590; CHECK-NEXT: }1591; CHECK-NEXT: {1592; CHECK-NEXT: v26.uh = vlsr(v7.uh,r5)1593; CHECK-NEXT: v27 = vmux(q1,v2,v1)1594; CHECK-NEXT: v1 = vmux(q0,v1,v2)1595; CHECK-NEXT: }1596; CHECK-NEXT: {1597; CHECK-NEXT: v1.h = vadd(v1.h,v4.h)1598; CHECK-NEXT: v28.h = vadd(v26.h,v27.h)1599; CHECK-NEXT: q2 = vcmp.eq(v6.h,v26.h)1600; CHECK-NEXT: }1601; CHECK-NEXT: {1602; CHECK-NEXT: v29.uh = vlsr(v26.uh,r6)1603; CHECK-NEXT: v1.h = vsub(v1.h,v3.h)1604; CHECK-NEXT: }1605; CHECK-NEXT: {1606; CHECK-NEXT: v30.uh = vlsr(v28.uh,r6)1607; CHECK-NEXT: }1608; CHECK-NEXT: {1609; CHECK-NEXT: v1.h = vasl(v1.h,r4)1610; CHECK-NEXT: v3 = vmux(q2,v30,v29)1611; CHECK-NEXT: }1612; CHECK-NEXT: {1613; CHECK-NEXT: v31 = vor(v3,v1)1614; CHECK-NEXT: }1615; CHECK-NEXT: {1616; CHECK-NEXT: v0 = vmux(q3,v2,v31)1617; CHECK-NEXT: jumpr r311618; CHECK-NEXT: vmem(r1+#0) = v0.new1619; CHECK-NEXT: }1620 %v0 = load <64 x i8>, ptr %a0, align 1281621 %v1 = uitofp <64 x i8> %v0 to <64 x half>1622 store <64 x half> %v1, ptr %a1, align 1281623 ret void1624}1625 1626 1627; u8 -> f321628; No widening1629define void @u8f32_0(ptr %a0, ptr %a1) #0 {1630; CHECK-LABEL: u8f32_0:1631; CHECK: .cfi_startproc1632; CHECK-NEXT: // %bb.0:1633; CHECK-NEXT: {1634; CHECK-NEXT: r7 = #641635; CHECK-NEXT: r0 = #11636; CHECK-NEXT: r6 = #5121637; CHECK-NEXT: v0 = vmem(r0+#0)1638; CHECK-NEXT: }1639; CHECK-NEXT: {1640; CHECK-NEXT: v4 = vsplat(r0)1641; CHECK-NEXT: r3:2 = combine(##255,#8)1642; CHECK-NEXT: v1 = valign(v0,v0,r7)1643; CHECK-NEXT: }1644; CHECK-NEXT: {1645; CHECK-NEXT: v15 = vsplat(r6)1646; CHECK-NEXT: v6 = vsplat(r3)1647; CHECK-NEXT: r5 = #1591648; CHECK-NEXT: v3:2.uh = vunpack(v0.ub)1649; CHECK-NEXT: }1650; CHECK-NEXT: {1651; CHECK-NEXT: r4 = #231652; CHECK-NEXT: v31:30.uh = vunpack(v1.ub)1653; CHECK-NEXT: }1654; CHECK-NEXT: {1655; CHECK-NEXT: v3:2.uw = vunpack(v2.uh)1656; CHECK-NEXT: }1657; CHECK-NEXT: {1658; CHECK-NEXT: v1:0.uw = vunpack(v30.uh)1659; CHECK-NEXT: }1660; CHECK-NEXT: {1661; CHECK-NEXT: v5.uw = vcl0(v2.uw)1662; CHECK-NEXT: }1663; CHECK-NEXT: {1664; CHECK-NEXT: v7.uw = vcl0(v0.uw)1665; CHECK-NEXT: v5.w = vadd(v5.w,v4.w)1666; CHECK-NEXT: }1667; CHECK-NEXT: {1668; CHECK-NEXT: v8.uw = vcl0(v3.uw)1669; CHECK-NEXT: v11.w = vadd(v7.w,v4.w)1670; CHECK-NEXT: v7 = vxor(v7,v7)1671; CHECK-NEXT: }1672; CHECK-NEXT: {1673; CHECK-NEXT: v9.uw = vcl0(v1.uw)1674; CHECK-NEXT: v10.w = vadd(v8.w,v4.w)1675; CHECK-NEXT: }1676; CHECK-NEXT: {1677; CHECK-NEXT: v9 = vsplat(r5)1678; CHECK-NEXT: v14.w = vasl(v0.w,v11.w)1679; CHECK-NEXT: v8.w = vadd(v9.w,v4.w)1680; CHECK-NEXT: }1681; CHECK-NEXT: {1682; CHECK-NEXT: v12.w = vasl(v2.w,v5.w)1683; CHECK-NEXT: v24 = vand(v14,v15)1684; CHECK-NEXT: v20.w = vadd(v14.w,v6.w)1685; CHECK-NEXT: }1686; CHECK-NEXT: {1687; CHECK-NEXT: v13.w = vasl(v3.w,v10.w)1688; CHECK-NEXT: v19 = vand(v12,v15)1689; CHECK-NEXT: q3 = vcmp.eq(v24.w,v7.w)1690; CHECK-NEXT: v18.w = vadd(v12.w,v6.w)1691; CHECK-NEXT: }1692; CHECK-NEXT: {1693; CHECK-NEXT: v16.w = vasl(v1.w,v8.w)1694; CHECK-NEXT: v23 = vand(v13,v15)1695; CHECK-NEXT: v22.w = vadd(v13.w,v6.w)1696; CHECK-NEXT: q0 = vcmp.gt(v14.uw,v20.uw)1697; CHECK-NEXT: }1698; CHECK-NEXT: {1699; CHECK-NEXT: v6.w = vadd(v16.w,v6.w)1700; CHECK-NEXT: v15 = vand(v16,v15)1701; CHECK-NEXT: v30 = vmux(q3,v7,v4)1702; CHECK-NEXT: q2 = vcmp.eq(v19.w,v7.w)1703; CHECK-NEXT: }1704; CHECK-NEXT: {1705; CHECK-NEXT: v21.uw = vlsr(v14.uw,r2)1706; CHECK-NEXT: q3 = vcmp.eq(v15.w,v7.w)1707; CHECK-NEXT: v28 = vmux(q0,v4,v7)1708; CHECK-NEXT: q1 = vcmp.eq(v23.w,v7.w)1709; CHECK-NEXT: }1710; CHECK-NEXT: {1711; CHECK-NEXT: v14.uw = vlsr(v20.uw,r2)1712; CHECK-NEXT: v26 = vmux(q3,v7,v4)1713; CHECK-NEXT: v11.w = vsub(v28.w,v11.w)1714; CHECK-NEXT: q3 = vcmp.gt(v13.uw,v22.uw)1715; CHECK-NEXT: }1716; CHECK-NEXT: {1717; CHECK-NEXT: v15.uw = vlsr(v6.uw,r2)1718; CHECK-NEXT: v20.w = vadd(v14.w,v30.w)1719; CHECK-NEXT: v30 = vmux(q1,v7,v4)1720; CHECK-NEXT: v31 = vmux(q2,v7,v4)1721; CHECK-NEXT: }1722; CHECK-NEXT: {1723; CHECK-NEXT: v19.uw = vlsr(v18.uw,r2)1724; CHECK-NEXT: v29.w = vadd(v15.w,v26.w)1725; CHECK-NEXT: q1 = vcmp.gt(v12.uw,v18.uw)1726; CHECK-NEXT: v11.w = vadd(v11.w,v9.w)1727; CHECK-NEXT: }1728; CHECK-NEXT: {1729; CHECK-NEXT: v28.uw = vlsr(v22.uw,r2)1730; CHECK-NEXT: v23.w = vadd(v19.w,v31.w)1731; CHECK-NEXT: v22 = vmux(q3,v4,v7)1732; CHECK-NEXT: q3 = vcmp.gt(v16.uw,v6.uw)1733; CHECK-NEXT: }1734; CHECK-NEXT: {1735; CHECK-NEXT: v24.uw = vlsr(v29.uw,r0)1736; CHECK-NEXT: v31.w = vadd(v28.w,v30.w)1737; CHECK-NEXT: v30 = vmux(q1,v4,v7)1738; CHECK-NEXT: v4 = vmux(q3,v4,v7)1739; CHECK-NEXT: }1740; CHECK-NEXT: {1741; CHECK-NEXT: v17.uw = vlsr(v12.uw,r2)1742; CHECK-NEXT: v5.w = vsub(v30.w,v5.w)1743; CHECK-NEXT: v29.w = vsub(v22.w,v10.w)1744; CHECK-NEXT: v4.w = vsub(v4.w,v8.w)1745; CHECK-NEXT: }1746; CHECK-NEXT: {1747; CHECK-NEXT: v13.uw = vlsr(v13.uw,r2)1748; CHECK-NEXT: v6.w = vadd(v29.w,v9.w)1749; CHECK-NEXT: v5.w = vadd(v5.w,v9.w)1750; CHECK-NEXT: q0 = vcmp.eq(v21.w,v14.w)1751; CHECK-NEXT: }1752; CHECK-NEXT: {1753; CHECK-NEXT: v25.uw = vlsr(v16.uw,r2)1754; CHECK-NEXT: q2 = vcmp.eq(v17.w,v19.w)1755; CHECK-NEXT: q3 = vcmp.eq(v13.w,v28.w)1756; CHECK-NEXT: v4.w = vadd(v4.w,v9.w)1757; CHECK-NEXT: }1758; CHECK-NEXT: {1759; CHECK-NEXT: v21.uw = vlsr(v23.uw,r0)1760; CHECK-NEXT: q1 = vcmp.eq(v25.w,v15.w)1761; CHECK-NEXT: }1762; CHECK-NEXT: {1763; CHECK-NEXT: v23.uw = vlsr(v19.uw,r0)1764; CHECK-NEXT: }1765; CHECK-NEXT: {1766; CHECK-NEXT: v31.uw = vlsr(v31.uw,r0)1767; CHECK-NEXT: v23 = vmux(q2,v21,v23)1768; CHECK-NEXT: q2 = vcmp.eq(v3.w,v7.w)1769; CHECK-NEXT: }1770; CHECK-NEXT: {1771; CHECK-NEXT: v16.uw = vlsr(v28.uw,r0)1772; CHECK-NEXT: }1773; CHECK-NEXT: {1774; CHECK-NEXT: v26.uw = vlsr(v15.uw,r0)1775; CHECK-NEXT: v8 = vmux(q3,v31,v16)1776; CHECK-NEXT: q3 = vcmp.eq(v2.w,v7.w)1777; CHECK-NEXT: }1778; CHECK-NEXT: {1779; CHECK-NEXT: v6.w = vasl(v6.w,r4)1780; CHECK-NEXT: v22 = vmux(q1,v24,v26)1781; CHECK-NEXT: }1782; CHECK-NEXT: {1783; CHECK-NEXT: v5.w = vasl(v5.w,r4)1784; CHECK-NEXT: v6 = vor(v8,v6)1785; CHECK-NEXT: }1786; CHECK-NEXT: {1787; CHECK-NEXT: v27.uw = vlsr(v14.uw,r0)1788; CHECK-NEXT: v25 = vor(v23,v5)1789; CHECK-NEXT: v26 = vmux(q2,v7,v6)1790; CHECK-NEXT: vmem(r1+#1) = v26.new1791; CHECK-NEXT: }1792; CHECK-NEXT: {1793; CHECK-NEXT: v20.uw = vlsr(v20.uw,r0)1794; CHECK-NEXT: v28 = vmux(q3,v7,v25)1795; CHECK-NEXT: q2 = vcmp.eq(v1.w,v7.w)1796; CHECK-NEXT: vmem(r1+#0) = v28.new1797; CHECK-NEXT: }1798; CHECK-NEXT: {1799; CHECK-NEXT: v11.w = vasl(v11.w,r4)1800; CHECK-NEXT: v20 = vmux(q0,v20,v27)1801; CHECK-NEXT: q3 = vcmp.eq(v0.w,v7.w)1802; CHECK-NEXT: }1803; CHECK-NEXT: {1804; CHECK-NEXT: v24.w = vasl(v4.w,r4)1805; CHECK-NEXT: v29 = vor(v20,v11)1806; CHECK-NEXT: }1807; CHECK-NEXT: {1808; CHECK-NEXT: v27 = vor(v22,v24)1809; CHECK-NEXT: v31 = vmux(q3,v7,v29)1810; CHECK-NEXT: vmem(r1+#2) = v31.new1811; CHECK-NEXT: }1812; CHECK-NEXT: {1813; CHECK-NEXT: v30 = vmux(q2,v7,v27)1814; CHECK-NEXT: jumpr r311815; CHECK-NEXT: vmem(r1+#3) = v30.new1816; CHECK-NEXT: }1817 %v0 = load <128 x i8>, ptr %a0, align 1281818 %v1 = uitofp <128 x i8> %v0 to <128 x float>1819 store <128 x float> %v1, ptr %a1, align 1281820 ret void1821}1822 1823; Widen input #11824define void @u8f32_1(ptr %a0, ptr %a1) #0 {1825; CHECK-LABEL: u8f32_1:1826; CHECK: .cfi_startproc1827; CHECK-NEXT: // %bb.0:1828; CHECK-NEXT: {1829; CHECK-NEXT: r7 = #11830; CHECK-NEXT: r6 = #5121831; CHECK-NEXT: v3:2.uh = vunpack(v0.ub)1832; CHECK-NEXT: v0.cur = vmem(r0+#0)1833; CHECK-NEXT: }1834; CHECK-NEXT: {1835; CHECK-NEXT: v1 = vsplat(r7)1836; CHECK-NEXT: v8 = vsplat(r6)1837; CHECK-NEXT: r3:2 = combine(##255,#8)1838; CHECK-NEXT: }1839; CHECK-NEXT: {1840; CHECK-NEXT: v6 = vsplat(r3)1841; CHECK-NEXT: r5 = #1591842; CHECK-NEXT: v3:2.uw = vunpack(v2.uh)1843; CHECK-NEXT: v21 = vxor(v21,v21)1844; CHECK-NEXT: }1845; CHECK-NEXT: {1846; CHECK-NEXT: v13 = vsplat(r5)1847; CHECK-NEXT: r4 = #231848; CHECK-NEXT: }1849; CHECK-NEXT: {1850; CHECK-NEXT: v4.uw = vcl0(v2.uw)1851; CHECK-NEXT: }1852; CHECK-NEXT: {1853; CHECK-NEXT: v5.uw = vcl0(v3.uw)1854; CHECK-NEXT: v4.w = vadd(v4.w,v1.w)1855; CHECK-NEXT: }1856; CHECK-NEXT: {1857; CHECK-NEXT: v5.w = vadd(v5.w,v1.w)1858; CHECK-NEXT: }1859; CHECK-NEXT: {1860; CHECK-NEXT: v7.w = vasl(v2.w,v4.w)1861; CHECK-NEXT: }1862; CHECK-NEXT: {1863; CHECK-NEXT: v9.w = vasl(v3.w,v5.w)1864; CHECK-NEXT: v11 = vand(v7,v8)1865; CHECK-NEXT: v10.w = vadd(v7.w,v6.w)1866; CHECK-NEXT: }1867; CHECK-NEXT: {1868; CHECK-NEXT: v6.w = vadd(v9.w,v6.w)1869; CHECK-NEXT: q1 = vcmp.eq(v11.w,v21.w)1870; CHECK-NEXT: v8 = vand(v9,v8)1871; CHECK-NEXT: q0 = vcmp.gt(v7.uw,v10.uw)1872; CHECK-NEXT: }1873; CHECK-NEXT: {1874; CHECK-NEXT: v22.uw = vlsr(v10.uw,r2)1875; CHECK-NEXT: v24 = vmux(q1,v21,v1)1876; CHECK-NEXT: q3 = vcmp.eq(v8.w,v21.w)1877; CHECK-NEXT: q1 = vcmp.gt(v9.uw,v6.uw)1878; CHECK-NEXT: }1879; CHECK-NEXT: {1880; CHECK-NEXT: v23.uw = vlsr(v6.uw,r2)1881; CHECK-NEXT: v25 = vmux(q0,v1,v21)1882; CHECK-NEXT: v27 = vmux(q3,v21,v1)1883; CHECK-NEXT: v1 = vmux(q1,v1,v21)1884; CHECK-NEXT: }1885; CHECK-NEXT: {1886; CHECK-NEXT: v4.w = vsub(v25.w,v4.w)1887; CHECK-NEXT: v1.w = vsub(v1.w,v5.w)1888; CHECK-NEXT: v10.w = vadd(v22.w,v24.w)1889; CHECK-NEXT: v28.w = vadd(v23.w,v27.w)1890; CHECK-NEXT: }1891; CHECK-NEXT: {1892; CHECK-NEXT: v12.uw = vlsr(v7.uw,r2)1893; CHECK-NEXT: v4.w = vadd(v4.w,v13.w)1894; CHECK-NEXT: v1.w = vadd(v1.w,v13.w)1895; CHECK-NEXT: }1896; CHECK-NEXT: {1897; CHECK-NEXT: v26.uw = vlsr(v9.uw,r2)1898; CHECK-NEXT: q2 = vcmp.eq(v12.w,v22.w)1899; CHECK-NEXT: }1900; CHECK-NEXT: {1901; CHECK-NEXT: v11.uw = vlsr(v22.uw,r7)1902; CHECK-NEXT: q3 = vcmp.eq(v26.w,v23.w)1903; CHECK-NEXT: }1904; CHECK-NEXT: {1905; CHECK-NEXT: v30.uw = vlsr(v10.uw,r7)1906; CHECK-NEXT: }1907; CHECK-NEXT: {1908; CHECK-NEXT: v29.uw = vlsr(v23.uw,r7)1909; CHECK-NEXT: v5 = vmux(q2,v30,v11)1910; CHECK-NEXT: q2 = vcmp.eq(v3.w,v21.w)1911; CHECK-NEXT: }1912; CHECK-NEXT: {1913; CHECK-NEXT: v6.uw = vlsr(v28.uw,r7)1914; CHECK-NEXT: }1915; CHECK-NEXT: {1916; CHECK-NEXT: v4.w = vasl(v4.w,r4)1917; CHECK-NEXT: v6 = vmux(q3,v6,v29)1918; CHECK-NEXT: q3 = vcmp.eq(v2.w,v21.w)1919; CHECK-NEXT: }1920; CHECK-NEXT: {1921; CHECK-NEXT: v1.w = vasl(v1.w,r4)1922; CHECK-NEXT: v31 = vor(v5,v4)1923; CHECK-NEXT: }1924; CHECK-NEXT: {1925; CHECK-NEXT: v1 = vor(v6,v1)1926; CHECK-NEXT: v0 = vmux(q3,v21,v31)1927; CHECK-NEXT: vmem(r1+#0) = v0.new1928; CHECK-NEXT: }1929; CHECK-NEXT: {1930; CHECK-NEXT: v1 = vmux(q2,v21,v1)1931; CHECK-NEXT: jumpr r311932; CHECK-NEXT: vmem(r1+#1) = v1.new1933; CHECK-NEXT: }1934 %v0 = load <64 x i8>, ptr %a0, align 1281935 %v1 = uitofp <64 x i8> %v0 to <64 x float>1936 store <64 x float> %v1, ptr %a1, align 1281937 ret void1938}1939 1940; Widen input #21941define void @u8f32_2(ptr %a0, ptr %a1) #0 {1942; CHECK-LABEL: u8f32_2:1943; CHECK: .cfi_startproc1944; CHECK-NEXT: // %bb.0:1945; CHECK-NEXT: {1946; CHECK-NEXT: v0 = vmem(r0+#0)1947; CHECK-NEXT: }1948; CHECK-NEXT: {1949; CHECK-NEXT: r6 = #11950; CHECK-NEXT: r3 = #5121951; CHECK-NEXT: v1:0.uh = vunpack(v0.ub)1952; CHECK-NEXT: }1953; CHECK-NEXT: {1954; CHECK-NEXT: v2 = vsplat(r6)1955; CHECK-NEXT: v4 = vsplat(r3)1956; CHECK-NEXT: r2 = #2551957; CHECK-NEXT: v3 = vxor(v3,v3)1958; CHECK-NEXT: }1959; CHECK-NEXT: {1960; CHECK-NEXT: r5:4 = combine(##159,#8)1961; CHECK-NEXT: v1:0.uw = vunpack(v0.uh)1962; CHECK-NEXT: }1963; CHECK-NEXT: {1964; CHECK-NEXT: v1 = vsplat(r2)1965; CHECK-NEXT: v7 = vsplat(r5)1966; CHECK-NEXT: q3 = vcmp.eq(v0.w,v3.w)1967; CHECK-NEXT: }1968; CHECK-NEXT: {1969; CHECK-NEXT: v5.uw = vcl0(v0.uw)1970; CHECK-NEXT: }1971; CHECK-NEXT: {1972; CHECK-NEXT: v5.w = vadd(v5.w,v2.w)1973; CHECK-NEXT: }1974; CHECK-NEXT: {1975; CHECK-NEXT: v6.w = vasl(v0.w,v5.w)1976; CHECK-NEXT: }1977; CHECK-NEXT: {1978; CHECK-NEXT: v1.w = vadd(v6.w,v1.w)1979; CHECK-NEXT: v4 = vand(v6,v4)1980; CHECK-NEXT: }1981; CHECK-NEXT: {1982; CHECK-NEXT: v6.uw = vlsr(v6.uw,r4)1983; CHECK-NEXT: q0 = vcmp.gt(v6.uw,v1.uw)1984; CHECK-NEXT: q1 = vcmp.eq(v4.w,v3.w)1985; CHECK-NEXT: }1986; CHECK-NEXT: {1987; CHECK-NEXT: r4 = #231988; CHECK-NEXT: v1.uw = vlsr(v1.uw,r4)1989; CHECK-NEXT: v4 = vmux(q1,v3,v2)1990; CHECK-NEXT: v2 = vmux(q0,v2,v3)1991; CHECK-NEXT: }1992; CHECK-NEXT: {1993; CHECK-NEXT: v2.w = vsub(v2.w,v5.w)1994; CHECK-NEXT: v4.w = vadd(v1.w,v4.w)1995; CHECK-NEXT: q2 = vcmp.eq(v6.w,v1.w)1996; CHECK-NEXT: }1997; CHECK-NEXT: {1998; CHECK-NEXT: v29.uw = vlsr(v1.uw,r6)1999; CHECK-NEXT: v2.w = vadd(v2.w,v7.w)2000; CHECK-NEXT: }2001; CHECK-NEXT: {2002; CHECK-NEXT: v30.uw = vlsr(v4.uw,r6)2003; CHECK-NEXT: }2004; CHECK-NEXT: {2005; CHECK-NEXT: v2.w = vasl(v2.w,r4)2006; CHECK-NEXT: v1 = vmux(q2,v30,v29)2007; CHECK-NEXT: }2008; CHECK-NEXT: {2009; CHECK-NEXT: v31 = vor(v1,v2)2010; CHECK-NEXT: }2011; CHECK-NEXT: {2012; CHECK-NEXT: v0 = vmux(q3,v3,v31)2013; CHECK-NEXT: jumpr r312014; CHECK-NEXT: vmem(r1+#0) = v0.new2015; CHECK-NEXT: }2016 %v0 = load <32 x i8>, ptr %a0, align 1282017 %v1 = uitofp <32 x i8> %v0 to <32 x float>2018 store <32 x float> %v1, ptr %a1, align 1282019 ret void2020}2021 2022 2023; u16 -> f162024; No widening2025define void @u16f16_0(ptr %a0, ptr %a1) #0 {2026; CHECK-LABEL: u16f16_0:2027; CHECK: .cfi_startproc2028; CHECK-NEXT: // %bb.0:2029; CHECK-NEXT: {2030; CHECK-NEXT: r3:2 = combine(#64,#1)2031; CHECK-NEXT: r5 = #312032; CHECK-NEXT: v1.uh = vcl0(v0.uh)2033; CHECK-NEXT: v0.cur = vmem(r0+#0)2034; CHECK-NEXT: }2035; CHECK-NEXT: {2036; CHECK-NEXT: v2.h = vsplat(r2)2037; CHECK-NEXT: v5.h = vsplat(r3)2038; CHECK-NEXT: r4 = #52039; CHECK-NEXT: v3 = vxor(v3,v3)2040; CHECK-NEXT: }2041; CHECK-NEXT: {2042; CHECK-NEXT: v4.h = vsplat(r5)2043; CHECK-NEXT: r3 = #102044; CHECK-NEXT: v1.h = vadd(v1.h,v2.h)2045; CHECK-NEXT: q3 = vcmp.eq(v0.h,v3.h)2046; CHECK-NEXT: }2047; CHECK-NEXT: {2048; CHECK-NEXT: v6.h = vasl(v0.h,v1.h)2049; CHECK-NEXT: }2050; CHECK-NEXT: {2051; CHECK-NEXT: v7.h = vadd(v6.h,v4.h)2052; CHECK-NEXT: v5 = vand(v6,v5)2053; CHECK-NEXT: }2054; CHECK-NEXT: {2055; CHECK-NEXT: v6.uh = vlsr(v6.uh,r4)2056; CHECK-NEXT: q0 = vcmp.eq(v5.h,v3.h)2057; CHECK-NEXT: q1 = vcmp.gt(v6.uh,v7.uh)2058; CHECK-NEXT: }2059; CHECK-NEXT: {2060; CHECK-NEXT: v26.uh = vlsr(v7.uh,r4)2061; CHECK-NEXT: v27 = vmux(q0,v3,v2)2062; CHECK-NEXT: v2 = vmux(q1,v2,v3)2063; CHECK-NEXT: }2064; CHECK-NEXT: {2065; CHECK-NEXT: v2.h = vadd(v2.h,v4.h)2066; CHECK-NEXT: v28.h = vadd(v26.h,v27.h)2067; CHECK-NEXT: q2 = vcmp.eq(v6.h,v26.h)2068; CHECK-NEXT: }2069; CHECK-NEXT: {2070; CHECK-NEXT: v29.uh = vlsr(v26.uh,r2)2071; CHECK-NEXT: v1.h = vsub(v2.h,v1.h)2072; CHECK-NEXT: }2073; CHECK-NEXT: {2074; CHECK-NEXT: v30.uh = vlsr(v28.uh,r2)2075; CHECK-NEXT: }2076; CHECK-NEXT: {2077; CHECK-NEXT: v1.h = vasl(v1.h,r3)2078; CHECK-NEXT: v2 = vmux(q2,v30,v29)2079; CHECK-NEXT: }2080; CHECK-NEXT: {2081; CHECK-NEXT: v31 = vor(v2,v1)2082; CHECK-NEXT: }2083; CHECK-NEXT: {2084; CHECK-NEXT: v0 = vmux(q3,v3,v31)2085; CHECK-NEXT: jumpr r312086; CHECK-NEXT: vmem(r1+#0) = v0.new2087; CHECK-NEXT: }2088 %v0 = load <64 x i16>, ptr %a0, align 1282089 %v1 = uitofp <64 x i16> %v0 to <64 x half>2090 store <64 x half> %v1, ptr %a1, align 1282091 ret void2092}2093 2094; Widen input and result2095define void @u16f16_1(ptr %a0, ptr %a1) #0 {2096; CHECK-LABEL: u16f16_1:2097; CHECK: .cfi_startproc2098; CHECK-NEXT: // %bb.0:2099; CHECK-NEXT: {2100; CHECK-NEXT: r3:2 = combine(#31,#1)2101; CHECK-NEXT: r6 = #642102; CHECK-NEXT: v1.uh = vcl0(v0.uh)2103; CHECK-NEXT: v0.cur = vmem(r0+#0)2104; CHECK-NEXT: }2105; CHECK-NEXT: {2106; CHECK-NEXT: v2.h = vsplat(r2)2107; CHECK-NEXT: v4.h = vsplat(r3)2108; CHECK-NEXT: r5 = #52109; CHECK-NEXT: v3 = vxor(v3,v3)2110; CHECK-NEXT: }2111; CHECK-NEXT: {2112; CHECK-NEXT: v5.h = vsplat(r6)2113; CHECK-NEXT: r4 = #102114; CHECK-NEXT: v1.h = vadd(v1.h,v2.h)2115; CHECK-NEXT: q2 = vcmp.eq(v0.h,v3.h)2116; CHECK-NEXT: }2117; CHECK-NEXT: {2118; CHECK-NEXT: q3 = vsetq(r6)2119; CHECK-NEXT: }2120; CHECK-NEXT: {2121; CHECK-NEXT: v6.h = vasl(v0.h,v1.h)2122; CHECK-NEXT: }2123; CHECK-NEXT: {2124; CHECK-NEXT: v7.h = vadd(v6.h,v4.h)2125; CHECK-NEXT: v5 = vand(v6,v5)2126; CHECK-NEXT: }2127; CHECK-NEXT: {2128; CHECK-NEXT: v6.uh = vlsr(v6.uh,r5)2129; CHECK-NEXT: q1 = vcmp.eq(v5.h,v3.h)2130; CHECK-NEXT: q0 = vcmp.gt(v6.uh,v7.uh)2131; CHECK-NEXT: }2132; CHECK-NEXT: {2133; CHECK-NEXT: v7.uh = vlsr(v7.uh,r5)2134; CHECK-NEXT: v5 = vmux(q1,v3,v2)2135; CHECK-NEXT: v2 = vmux(q0,v2,v3)2136; CHECK-NEXT: }2137; CHECK-NEXT: {2138; CHECK-NEXT: v2.h = vadd(v2.h,v4.h)2139; CHECK-NEXT: v28.h = vadd(v7.h,v5.h)2140; CHECK-NEXT: q1 = vcmp.eq(v6.h,v7.h)2141; CHECK-NEXT: }2142; CHECK-NEXT: {2143; CHECK-NEXT: v29.uh = vlsr(v7.uh,r2)2144; CHECK-NEXT: v1.h = vsub(v2.h,v1.h)2145; CHECK-NEXT: }2146; CHECK-NEXT: {2147; CHECK-NEXT: v30.uh = vlsr(v28.uh,r2)2148; CHECK-NEXT: }2149; CHECK-NEXT: {2150; CHECK-NEXT: v1.h = vasl(v1.h,r4)2151; CHECK-NEXT: v2 = vmux(q1,v30,v29)2152; CHECK-NEXT: }2153; CHECK-NEXT: {2154; CHECK-NEXT: v31 = vor(v2,v1)2155; CHECK-NEXT: }2156; CHECK-NEXT: {2157; CHECK-NEXT: v0 = vmux(q2,v3,v31)2158; CHECK-NEXT: }2159; CHECK-NEXT: {2160; CHECK-NEXT: jumpr r312161; CHECK-NEXT: if (q3) vmem(r1+#0) = v02162; CHECK-NEXT: }2163 %v0 = load <32 x i16>, ptr %a0, align 1282164 %v1 = uitofp <32 x i16> %v0 to <32 x half>2165 store <32 x half> %v1, ptr %a1, align 1282166 ret void2167}2168 2169 2170; u16 -> f322171; No widening2172define void @u16f32_0(ptr %a0, ptr %a1) #0 {2173; CHECK-LABEL: u16f32_0:2174; CHECK: .cfi_startproc2175; CHECK-NEXT: // %bb.0:2176; CHECK-NEXT: {2177; CHECK-NEXT: v0 = vmem(r0+#0)2178; CHECK-NEXT: }2179; CHECK-NEXT: {2180; CHECK-NEXT: r7 = #12181; CHECK-NEXT: r3:2 = combine(##255,#8)2182; CHECK-NEXT: v1:0.uw = vunpack(v0.uh)2183; CHECK-NEXT: }2184; CHECK-NEXT: {2185; CHECK-NEXT: v3 = vsplat(r7)2186; CHECK-NEXT: v6 = vsplat(r3)2187; CHECK-NEXT: r6 = #5122188; CHECK-NEXT: v2 = vxor(v2,v2)2189; CHECK-NEXT: }2190; CHECK-NEXT: {2191; CHECK-NEXT: v8 = vsplat(r6)2192; CHECK-NEXT: r5 = #1592193; CHECK-NEXT: r4 = #232194; CHECK-NEXT: v4.uw = vcl0(v0.uw)2195; CHECK-NEXT: }2196; CHECK-NEXT: {2197; CHECK-NEXT: v14 = vsplat(r5)2198; CHECK-NEXT: v5.uw = vcl0(v1.uw)2199; CHECK-NEXT: v4.w = vadd(v4.w,v3.w)2200; CHECK-NEXT: }2201; CHECK-NEXT: {2202; CHECK-NEXT: v5.w = vadd(v5.w,v3.w)2203; CHECK-NEXT: }2204; CHECK-NEXT: {2205; CHECK-NEXT: v7.w = vasl(v0.w,v4.w)2206; CHECK-NEXT: }2207; CHECK-NEXT: {2208; CHECK-NEXT: v9.w = vasl(v1.w,v5.w)2209; CHECK-NEXT: v10.w = vadd(v7.w,v6.w)2210; CHECK-NEXT: v11 = vand(v7,v8)2211; CHECK-NEXT: }2212; CHECK-NEXT: {2213; CHECK-NEXT: v6.w = vadd(v9.w,v6.w)2214; CHECK-NEXT: v8 = vand(v9,v8)2215; CHECK-NEXT: q1 = vcmp.eq(v11.w,v2.w)2216; CHECK-NEXT: q0 = vcmp.gt(v7.uw,v10.uw)2217; CHECK-NEXT: }2218; CHECK-NEXT: {2219; CHECK-NEXT: v19.uw = vlsr(v10.uw,r2)2220; CHECK-NEXT: q2 = vcmp.eq(v8.w,v2.w)2221; CHECK-NEXT: q3 = vcmp.gt(v9.uw,v6.uw)2222; CHECK-NEXT: v20 = vmux(q1,v2,v3)2223; CHECK-NEXT: }2224; CHECK-NEXT: {2225; CHECK-NEXT: v21.uw = vlsr(v6.uw,r2)2226; CHECK-NEXT: v22 = vmux(q2,v2,v3)2227; CHECK-NEXT: v25 = vmux(q0,v3,v2)2228; CHECK-NEXT: v3 = vmux(q3,v3,v2)2229; CHECK-NEXT: }2230; CHECK-NEXT: {2231; CHECK-NEXT: v4.w = vsub(v25.w,v4.w)2232; CHECK-NEXT: v3.w = vsub(v3.w,v5.w)2233; CHECK-NEXT: v23.w = vadd(v19.w,v20.w)2234; CHECK-NEXT: v10.w = vadd(v21.w,v22.w)2235; CHECK-NEXT: }2236; CHECK-NEXT: {2237; CHECK-NEXT: v12.uw = vlsr(v7.uw,r2)2238; CHECK-NEXT: v4.w = vadd(v4.w,v14.w)2239; CHECK-NEXT: v3.w = vadd(v3.w,v14.w)2240; CHECK-NEXT: }2241; CHECK-NEXT: {2242; CHECK-NEXT: v24.uw = vlsr(v9.uw,r2)2243; CHECK-NEXT: q2 = vcmp.eq(v12.w,v19.w)2244; CHECK-NEXT: }2245; CHECK-NEXT: {2246; CHECK-NEXT: v13.uw = vlsr(v19.uw,r7)2247; CHECK-NEXT: q3 = vcmp.eq(v24.w,v21.w)2248; CHECK-NEXT: }2249; CHECK-NEXT: {2250; CHECK-NEXT: v26.uw = vlsr(v23.uw,r7)2251; CHECK-NEXT: }2252; CHECK-NEXT: {2253; CHECK-NEXT: v27.uw = vlsr(v10.uw,r7)2254; CHECK-NEXT: v5 = vmux(q2,v26,v13)2255; CHECK-NEXT: q2 = vcmp.eq(v1.w,v2.w)2256; CHECK-NEXT: }2257; CHECK-NEXT: {2258; CHECK-NEXT: v28.uw = vlsr(v21.uw,r7)2259; CHECK-NEXT: }2260; CHECK-NEXT: {2261; CHECK-NEXT: v4.w = vasl(v4.w,r4)2262; CHECK-NEXT: v6 = vmux(q3,v27,v28)2263; CHECK-NEXT: q3 = vcmp.eq(v0.w,v2.w)2264; CHECK-NEXT: }2265; CHECK-NEXT: {2266; CHECK-NEXT: v3.w = vasl(v3.w,r4)2267; CHECK-NEXT: v29 = vor(v5,v4)2268; CHECK-NEXT: }2269; CHECK-NEXT: {2270; CHECK-NEXT: v3 = vor(v6,v3)2271; CHECK-NEXT: v31 = vmux(q3,v2,v29)2272; CHECK-NEXT: vmem(r1+#0) = v31.new2273; CHECK-NEXT: }2274; CHECK-NEXT: {2275; CHECK-NEXT: v30 = vmux(q2,v2,v3)2276; CHECK-NEXT: jumpr r312277; CHECK-NEXT: vmem(r1+#1) = v30.new2278; CHECK-NEXT: }2279 %v0 = load <64 x i16>, ptr %a0, align 1282280 %v1 = uitofp <64 x i16> %v0 to <64 x float>2281 store <64 x float> %v1, ptr %a1, align 1282282 ret void2283}2284 2285; Widen input2286define void @u16f32_1(ptr %a0, ptr %a1) #0 {2287; CHECK-LABEL: u16f32_1:2288; CHECK: .cfi_startproc2289; CHECK-NEXT: // %bb.0:2290; CHECK-NEXT: {2291; CHECK-NEXT: v0 = vmem(r0+#0)2292; CHECK-NEXT: }2293; CHECK-NEXT: {2294; CHECK-NEXT: r6 = #12295; CHECK-NEXT: r2 = #2552296; CHECK-NEXT: v1:0.uw = vunpack(v0.uh)2297; CHECK-NEXT: }2298; CHECK-NEXT: {2299; CHECK-NEXT: v1 = vsplat(r6)2300; CHECK-NEXT: v4 = vsplat(r2)2301; CHECK-NEXT: r3 = #5122302; CHECK-NEXT: v2 = vxor(v2,v2)2303; CHECK-NEXT: }2304; CHECK-NEXT: {2305; CHECK-NEXT: v5 = vsplat(r3)2306; CHECK-NEXT: r5:4 = combine(##159,#8)2307; CHECK-NEXT: v3.uw = vcl0(v0.uw)2308; CHECK-NEXT: }2309; CHECK-NEXT: {2310; CHECK-NEXT: v7 = vsplat(r5)2311; CHECK-NEXT: q3 = vcmp.eq(v0.w,v2.w)2312; CHECK-NEXT: v3.w = vadd(v3.w,v1.w)2313; CHECK-NEXT: }2314; CHECK-NEXT: {2315; CHECK-NEXT: v6.w = vasl(v0.w,v3.w)2316; CHECK-NEXT: }2317; CHECK-NEXT: {2318; CHECK-NEXT: v4.w = vadd(v6.w,v4.w)2319; CHECK-NEXT: v5 = vand(v6,v5)2320; CHECK-NEXT: }2321; CHECK-NEXT: {2322; CHECK-NEXT: v6.uw = vlsr(v6.uw,r4)2323; CHECK-NEXT: q0 = vcmp.gt(v6.uw,v4.uw)2324; CHECK-NEXT: q1 = vcmp.eq(v5.w,v2.w)2325; CHECK-NEXT: }2326; CHECK-NEXT: {2327; CHECK-NEXT: r4 = #232328; CHECK-NEXT: v4.uw = vlsr(v4.uw,r4)2329; CHECK-NEXT: v5 = vmux(q1,v2,v1)2330; CHECK-NEXT: v1 = vmux(q0,v1,v2)2331; CHECK-NEXT: }2332; CHECK-NEXT: {2333; CHECK-NEXT: v1.w = vsub(v1.w,v3.w)2334; CHECK-NEXT: v29.w = vadd(v4.w,v5.w)2335; CHECK-NEXT: q2 = vcmp.eq(v6.w,v4.w)2336; CHECK-NEXT: }2337; CHECK-NEXT: {2338; CHECK-NEXT: v30.uw = vlsr(v4.uw,r6)2339; CHECK-NEXT: v1.w = vadd(v1.w,v7.w)2340; CHECK-NEXT: }2341; CHECK-NEXT: {2342; CHECK-NEXT: v3.uw = vlsr(v29.uw,r6)2343; CHECK-NEXT: }2344; CHECK-NEXT: {2345; CHECK-NEXT: v1.w = vasl(v1.w,r4)2346; CHECK-NEXT: v3 = vmux(q2,v3,v30)2347; CHECK-NEXT: }2348; CHECK-NEXT: {2349; CHECK-NEXT: v31 = vor(v3,v1)2350; CHECK-NEXT: }2351; CHECK-NEXT: {2352; CHECK-NEXT: v0 = vmux(q3,v2,v31)2353; CHECK-NEXT: jumpr r312354; CHECK-NEXT: vmem(r1+#0) = v0.new2355; CHECK-NEXT: }2356 %v0 = load <32 x i16>, ptr %a0, align 1282357 %v1 = uitofp <32 x i16> %v0 to <32 x float>2358 store <32 x float> %v1, ptr %a1, align 1282359 ret void2360}2361 2362 2363; u32 -> f162364; No widening2365define void @u32f16_0(ptr %a0, ptr %a1) #0 {2366; CHECK-LABEL: u32f16_0:2367; CHECK: .cfi_startproc2368; CHECK-NEXT: // %bb.0:2369; CHECK-NEXT: {2370; CHECK-NEXT: r3:2 = combine(#8,#1)2371; CHECK-NEXT: r6 = #2552372; CHECK-NEXT: v3.uw = vcl0(v1.uw)2373; CHECK-NEXT: v1.cur = vmem(r0+#0)2374; CHECK-NEXT: }2375; CHECK-NEXT: {2376; CHECK-NEXT: v2 = vsplat(r2)2377; CHECK-NEXT: r4 = #5122378; CHECK-NEXT: v4.uw = vcl0(v0.uw)2379; CHECK-NEXT: v0.cur = vmem(r0+#1)2380; CHECK-NEXT: }2381; CHECK-NEXT: {2382; CHECK-NEXT: v7 = vsplat(r4)2383; CHECK-NEXT: v6 = vsplat(r6)2384; CHECK-NEXT: v3.w = vadd(v3.w,v2.w)2385; CHECK-NEXT: v4.w = vadd(v4.w,v2.w)2386; CHECK-NEXT: }2387; CHECK-NEXT: {2388; CHECK-NEXT: r4 = #1592389; CHECK-NEXT: v9 = vxor(v9,v9)2390; CHECK-NEXT: }2391; CHECK-NEXT: {2392; CHECK-NEXT: v10 = vsplat(r4)2393; CHECK-NEXT: v5.w = vasl(v1.w,v3.w)2394; CHECK-NEXT: }2395; CHECK-NEXT: {2396; CHECK-NEXT: v8.w = vasl(v0.w,v4.w)2397; CHECK-NEXT: v11.w = vadd(v5.w,v6.w)2398; CHECK-NEXT: v13 = vand(v5,v7)2399; CHECK-NEXT: }2400; CHECK-NEXT: {2401; CHECK-NEXT: v6.w = vadd(v8.w,v6.w)2402; CHECK-NEXT: v7 = vand(v8,v7)2403; CHECK-NEXT: q1 = vcmp.gt(v5.uw,v11.uw)2404; CHECK-NEXT: q2 = vcmp.eq(v13.w,v9.w)2405; CHECK-NEXT: }2406; CHECK-NEXT: {2407; CHECK-NEXT: v27.uw = vlsr(v11.uw,r3)2408; CHECK-NEXT: q3 = vcmp.gt(v8.uw,v6.uw)2409; CHECK-NEXT: q0 = vcmp.eq(v7.w,v9.w)2410; CHECK-NEXT: v28 = vmux(q2,v9,v2)2411; CHECK-NEXT: }2412; CHECK-NEXT: {2413; CHECK-NEXT: v6.uw = vlsr(v6.uw,r3)2414; CHECK-NEXT: v29 = vmux(q1,v2,v9)2415; CHECK-NEXT: v30 = vmux(q3,v2,v9)2416; CHECK-NEXT: v2 = vmux(q0,v9,v2)2417; CHECK-NEXT: }2418; CHECK-NEXT: {2419; CHECK-NEXT: v3.w = vsub(v29.w,v3.w)2420; CHECK-NEXT: v7.w = vadd(v27.w,v28.w)2421; CHECK-NEXT: v4.w = vsub(v30.w,v4.w)2422; CHECK-NEXT: v2.w = vadd(v6.w,v2.w)2423; CHECK-NEXT: }2424; CHECK-NEXT: {2425; CHECK-NEXT: v12.uw = vlsr(v5.uw,r3)2426; CHECK-NEXT: v3.w = vadd(v3.w,v10.w)2427; CHECK-NEXT: v4.w = vadd(v4.w,v10.w)2428; CHECK-NEXT: q2 = vcmp.eq(v1.w,v9.w)2429; CHECK-NEXT: }2430; CHECK-NEXT: {2431; CHECK-NEXT: r3 = #232432; CHECK-NEXT: v14.uw = vlsr(v8.uw,r3)2433; CHECK-NEXT: q3 = vcmp.eq(v12.w,v27.w)2434; CHECK-NEXT: }2435; CHECK-NEXT: {2436; CHECK-NEXT: v5.uw = vlsr(v27.uw,r2)2437; CHECK-NEXT: q1 = vcmp.eq(v14.w,v6.w)2438; CHECK-NEXT: }2439; CHECK-NEXT: {2440; CHECK-NEXT: v7.uw = vlsr(v7.uw,r2)2441; CHECK-NEXT: }2442; CHECK-NEXT: {2443; CHECK-NEXT: v2.uw = vlsr(v2.uw,r2)2444; CHECK-NEXT: v5 = vmux(q3,v7,v5)2445; CHECK-NEXT: q3 = vcmp.eq(v0.w,v9.w)2446; CHECK-NEXT: }2447; CHECK-NEXT: {2448; CHECK-NEXT: v6.uw = vlsr(v6.uw,r2)2449; CHECK-NEXT: }2450; CHECK-NEXT: {2451; CHECK-NEXT: v3.w = vasl(v3.w,r3)2452; CHECK-NEXT: v31 = vmux(q1,v2,v6)2453; CHECK-NEXT: }2454; CHECK-NEXT: {2455; CHECK-NEXT: v2.w = vasl(v4.w,r3)2456; CHECK-NEXT: v3 = vor(v5,v3)2457; CHECK-NEXT: }2458; CHECK-NEXT: {2459; CHECK-NEXT: v1 = vor(v31,v2)2460; CHECK-NEXT: v3 = vmux(q2,v9,v3)2461; CHECK-NEXT: }2462; CHECK-NEXT: {2463; CHECK-NEXT: v0 = vmux(q3,v9,v1)2464; CHECK-NEXT: }2465; CHECK-NEXT: {2466; CHECK-NEXT: v2.qf32 = vadd(v3.sf,v9.sf)2467; CHECK-NEXT: }2468; CHECK-NEXT: {2469; CHECK-NEXT: v3.qf32 = vadd(v0.sf,v9.sf)2470; CHECK-NEXT: }2471; CHECK-NEXT: {2472; CHECK-NEXT: v0.hf = v3:2.qf322473; CHECK-NEXT: }2474; CHECK-NEXT: {2475; CHECK-NEXT: v0.h = vdeal(v0.h)2476; CHECK-NEXT: jumpr r312477; CHECK-NEXT: vmem(r1+#0) = v0.new2478; CHECK-NEXT: }2479 %v0 = load <64 x i32>, ptr %a0, align 1282480 %v1 = uitofp <64 x i32> %v0 to <64 x half>2481 store <64 x half> %v1, ptr %a1, align 1282482 ret void2483}2484 2485; Widen result2486define void @u32f16_1(ptr %a0, ptr %a1) #0 {2487; CHECK-LABEL: u32f16_1:2488; CHECK: .cfi_startproc2489; CHECK-NEXT: // %bb.0:2490; CHECK-NEXT: {2491; CHECK-NEXT: r3:2 = combine(##512,#1)2492; CHECK-NEXT: v1.uw = vcl0(v0.uw)2493; CHECK-NEXT: v0.cur = vmem(r0+#0)2494; CHECK-NEXT: }2495; CHECK-NEXT: {2496; CHECK-NEXT: v3 = vsplat(r2)2497; CHECK-NEXT: v5 = vsplat(r3)2498; CHECK-NEXT: r6 = #2552499; CHECK-NEXT: v2 = vxor(v2,v2)2500; CHECK-NEXT: }2501; CHECK-NEXT: {2502; CHECK-NEXT: v4 = vsplat(r6)2503; CHECK-NEXT: r5 = #82504; CHECK-NEXT: r4 = #1592505; CHECK-NEXT: v1.w = vadd(v1.w,v3.w)2506; CHECK-NEXT: }2507; CHECK-NEXT: {2508; CHECK-NEXT: v7 = vsplat(r4)2509; CHECK-NEXT: r3 = #232510; CHECK-NEXT: q2 = vcmp.eq(v0.w,v2.w)2511; CHECK-NEXT: }2512; CHECK-NEXT: {2513; CHECK-NEXT: v6.w = vasl(v0.w,v1.w)2514; CHECK-NEXT: }2515; CHECK-NEXT: {2516; CHECK-NEXT: v4.w = vadd(v6.w,v4.w)2517; CHECK-NEXT: v5 = vand(v6,v5)2518; CHECK-NEXT: }2519; CHECK-NEXT: {2520; CHECK-NEXT: v6.uw = vlsr(v6.uw,r5)2521; CHECK-NEXT: q0 = vcmp.eq(v5.w,v2.w)2522; CHECK-NEXT: q1 = vcmp.gt(v6.uw,v4.uw)2523; CHECK-NEXT: }2524; CHECK-NEXT: {2525; CHECK-NEXT: v4.uw = vlsr(v4.uw,r5)2526; CHECK-NEXT: v5 = vmux(q0,v2,v3)2527; CHECK-NEXT: v3 = vmux(q1,v3,v2)2528; CHECK-NEXT: }2529; CHECK-NEXT: {2530; CHECK-NEXT: v1.w = vsub(v3.w,v1.w)2531; CHECK-NEXT: v30.w = vadd(v4.w,v5.w)2532; CHECK-NEXT: q1 = vcmp.eq(v6.w,v4.w)2533; CHECK-NEXT: }2534; CHECK-NEXT: {2535; CHECK-NEXT: v31.uw = vlsr(v4.uw,r2)2536; CHECK-NEXT: v1.w = vadd(v1.w,v7.w)2537; CHECK-NEXT: }2538; CHECK-NEXT: {2539; CHECK-NEXT: r2 = #642540; CHECK-NEXT: v3.uw = vlsr(v30.uw,r2)2541; CHECK-NEXT: }2542; CHECK-NEXT: {2543; CHECK-NEXT: v1.w = vasl(v1.w,r3)2544; CHECK-NEXT: q3 = vsetq(r2)2545; CHECK-NEXT: v3 = vmux(q1,v3,v31)2546; CHECK-NEXT: }2547; CHECK-NEXT: {2548; CHECK-NEXT: v1.qf32 = vadd(v2.sf,v2.sf)2549; CHECK-NEXT: v0 = vor(v3,v1)2550; CHECK-NEXT: }2551; CHECK-NEXT: {2552; CHECK-NEXT: v0 = vmux(q2,v2,v0)2553; CHECK-NEXT: }2554; CHECK-NEXT: {2555; CHECK-NEXT: v0.qf32 = vadd(v0.sf,v2.sf)2556; CHECK-NEXT: }2557; CHECK-NEXT: {2558; CHECK-NEXT: v0.hf = v1:0.qf322559; CHECK-NEXT: }2560; CHECK-NEXT: {2561; CHECK-NEXT: v0.h = vdeal(v0.h)2562; CHECK-NEXT: }2563; CHECK-NEXT: {2564; CHECK-NEXT: jumpr r312565; CHECK-NEXT: if (q3) vmem(r1+#0) = v02566; CHECK-NEXT: }2567 %v0 = load <32 x i32>, ptr %a0, align 1282568 %v1 = uitofp <32 x i32> %v0 to <32 x half>2569 store <32 x half> %v1, ptr %a1, align 1282570 ret void2571}2572 2573; u32 -> f322574; No widening2575define void @u32f32_0(ptr %a0, ptr %a1) #0 {2576; CHECK-LABEL: u32f32_0:2577; CHECK: .cfi_startproc2578; CHECK-NEXT: // %bb.0:2579; CHECK-NEXT: {2580; CHECK-NEXT: r3:2 = combine(##512,#1)2581; CHECK-NEXT: v1.uw = vcl0(v0.uw)2582; CHECK-NEXT: v0.cur = vmem(r0+#0)2583; CHECK-NEXT: }2584; CHECK-NEXT: {2585; CHECK-NEXT: v2 = vsplat(r2)2586; CHECK-NEXT: v5 = vsplat(r3)2587; CHECK-NEXT: r6 = #2552588; CHECK-NEXT: v3 = vxor(v3,v3)2589; CHECK-NEXT: }2590; CHECK-NEXT: {2591; CHECK-NEXT: v4 = vsplat(r6)2592; CHECK-NEXT: r5 = #82593; CHECK-NEXT: r4 = #1592594; CHECK-NEXT: v1.w = vadd(v1.w,v2.w)2595; CHECK-NEXT: }2596; CHECK-NEXT: {2597; CHECK-NEXT: v7 = vsplat(r4)2598; CHECK-NEXT: r3 = #232599; CHECK-NEXT: q3 = vcmp.eq(v0.w,v3.w)2600; CHECK-NEXT: }2601; CHECK-NEXT: {2602; CHECK-NEXT: v6.w = vasl(v0.w,v1.w)2603; CHECK-NEXT: }2604; CHECK-NEXT: {2605; CHECK-NEXT: v4.w = vadd(v6.w,v4.w)2606; CHECK-NEXT: v5 = vand(v6,v5)2607; CHECK-NEXT: }2608; CHECK-NEXT: {2609; CHECK-NEXT: v6.uw = vlsr(v6.uw,r5)2610; CHECK-NEXT: q0 = vcmp.eq(v5.w,v3.w)2611; CHECK-NEXT: q1 = vcmp.gt(v6.uw,v4.uw)2612; CHECK-NEXT: }2613; CHECK-NEXT: {2614; CHECK-NEXT: v4.uw = vlsr(v4.uw,r5)2615; CHECK-NEXT: v5 = vmux(q0,v3,v2)2616; CHECK-NEXT: v2 = vmux(q1,v2,v3)2617; CHECK-NEXT: }2618; CHECK-NEXT: {2619; CHECK-NEXT: v1.w = vsub(v2.w,v1.w)2620; CHECK-NEXT: v29.w = vadd(v4.w,v5.w)2621; CHECK-NEXT: q2 = vcmp.eq(v6.w,v4.w)2622; CHECK-NEXT: }2623; CHECK-NEXT: {2624; CHECK-NEXT: v30.uw = vlsr(v4.uw,r2)2625; CHECK-NEXT: v1.w = vadd(v1.w,v7.w)2626; CHECK-NEXT: }2627; CHECK-NEXT: {2628; CHECK-NEXT: v2.uw = vlsr(v29.uw,r2)2629; CHECK-NEXT: }2630; CHECK-NEXT: {2631; CHECK-NEXT: v1.w = vasl(v1.w,r3)2632; CHECK-NEXT: v2 = vmux(q2,v2,v30)2633; CHECK-NEXT: }2634; CHECK-NEXT: {2635; CHECK-NEXT: v31 = vor(v2,v1)2636; CHECK-NEXT: }2637; CHECK-NEXT: {2638; CHECK-NEXT: v0 = vmux(q3,v3,v31)2639; CHECK-NEXT: jumpr r312640; CHECK-NEXT: vmem(r1+#0) = v0.new2641; CHECK-NEXT: }2642 %v0 = load <32 x i32>, ptr %a0, align 1282643 %v1 = uitofp <32 x i32> %v0 to <32 x float>2644 store <32 x float> %v1, ptr %a1, align 1282645 ret void2646}2647 2648; Widen input and result2649define void @u32f32_1(ptr %a0, ptr %a1) #0 {2650; CHECK-LABEL: u32f32_1:2651; CHECK: .cfi_startproc2652; CHECK-NEXT: // %bb.0:2653; CHECK-NEXT: {2654; CHECK-NEXT: r3:2 = combine(##512,#1)2655; CHECK-NEXT: v1.uw = vcl0(v0.uw)2656; CHECK-NEXT: v0.cur = vmem(r0+#0)2657; CHECK-NEXT: }2658; CHECK-NEXT: {2659; CHECK-NEXT: v2 = vsplat(r2)2660; CHECK-NEXT: v5 = vsplat(r3)2661; CHECK-NEXT: r6 = #2552662; CHECK-NEXT: v3 = vxor(v3,v3)2663; CHECK-NEXT: }2664; CHECK-NEXT: {2665; CHECK-NEXT: v4 = vsplat(r6)2666; CHECK-NEXT: r5 = #82667; CHECK-NEXT: r4 = #1592668; CHECK-NEXT: v1.w = vadd(v1.w,v2.w)2669; CHECK-NEXT: }2670; CHECK-NEXT: {2671; CHECK-NEXT: v7 = vsplat(r4)2672; CHECK-NEXT: r3 = #232673; CHECK-NEXT: q2 = vcmp.eq(v0.w,v3.w)2674; CHECK-NEXT: }2675; CHECK-NEXT: {2676; CHECK-NEXT: v6.w = vasl(v0.w,v1.w)2677; CHECK-NEXT: }2678; CHECK-NEXT: {2679; CHECK-NEXT: v4.w = vadd(v6.w,v4.w)2680; CHECK-NEXT: v5 = vand(v6,v5)2681; CHECK-NEXT: }2682; CHECK-NEXT: {2683; CHECK-NEXT: v6.uw = vlsr(v6.uw,r5)2684; CHECK-NEXT: q0 = vcmp.eq(v5.w,v3.w)2685; CHECK-NEXT: q1 = vcmp.gt(v6.uw,v4.uw)2686; CHECK-NEXT: }2687; CHECK-NEXT: {2688; CHECK-NEXT: v4.uw = vlsr(v4.uw,r5)2689; CHECK-NEXT: v5 = vmux(q0,v3,v2)2690; CHECK-NEXT: v2 = vmux(q1,v2,v3)2691; CHECK-NEXT: }2692; CHECK-NEXT: {2693; CHECK-NEXT: v1.w = vsub(v2.w,v1.w)2694; CHECK-NEXT: v29.w = vadd(v4.w,v5.w)2695; CHECK-NEXT: q1 = vcmp.eq(v6.w,v4.w)2696; CHECK-NEXT: }2697; CHECK-NEXT: {2698; CHECK-NEXT: v30.uw = vlsr(v4.uw,r2)2699; CHECK-NEXT: v1.w = vadd(v1.w,v7.w)2700; CHECK-NEXT: }2701; CHECK-NEXT: {2702; CHECK-NEXT: r2 = #642703; CHECK-NEXT: v2.uw = vlsr(v29.uw,r2)2704; CHECK-NEXT: }2705; CHECK-NEXT: {2706; CHECK-NEXT: v1.w = vasl(v1.w,r3)2707; CHECK-NEXT: q3 = vsetq(r2)2708; CHECK-NEXT: v2 = vmux(q1,v2,v30)2709; CHECK-NEXT: }2710; CHECK-NEXT: {2711; CHECK-NEXT: v31 = vor(v2,v1)2712; CHECK-NEXT: }2713; CHECK-NEXT: {2714; CHECK-NEXT: v0 = vmux(q2,v3,v31)2715; CHECK-NEXT: }2716; CHECK-NEXT: {2717; CHECK-NEXT: jumpr r312718; CHECK-NEXT: if (q3) vmem(r1+#0) = v02719; CHECK-NEXT: }2720 %v0 = load <16 x i32>, ptr %a0, align 1282721 %v1 = uitofp <16 x i32> %v0 to <16 x float>2722 store <16 x float> %v1, ptr %a1, align 1282723 ret void2724}2725 2726 2727attributes #0 = { "target-features"="+v68,+hvxv68,+hvx-length128b,+hvx-qfloat" }2728 2729