275 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -verify-machineinstrs < %s | FileCheck %s3 4target triple = "aarch64-linux"5 6; CHECK-LABEL: .LCPI0_0:7; CHECK-NEXT: .byte 2558; CHECK-NEXT: .byte 2559; CHECK-NEXT: .byte 25510; CHECK-NEXT: .byte 411; CHECK-NEXT: .byte 25512; CHECK-NEXT: .byte 25513; CHECK-NEXT: .byte 25514; CHECK-NEXT: .byte 515; CHECK-NEXT: .byte 25516; CHECK-NEXT: .byte 25517; CHECK-NEXT: .byte 25518; CHECK-NEXT: .byte 619; CHECK-NEXT: .byte 25520; CHECK-NEXT: .byte 25521; CHECK-NEXT: .byte 25522; CHECK-NEXT: .byte 723; CHECK-NEXT: .LCPI0_1:24; CHECK-NEXT: .byte 25525; CHECK-NEXT: .byte 25526; CHECK-NEXT: .byte 25527; CHECK-NEXT: .byte 028; CHECK-NEXT: .byte 25529; CHECK-NEXT: .byte 25530; CHECK-NEXT: .byte 25531; CHECK-NEXT: .byte 132; CHECK-NEXT: .byte 25533; CHECK-NEXT: .byte 25534; CHECK-NEXT: .byte 25535; CHECK-NEXT: .byte 236; CHECK-NEXT: .byte 25537; CHECK-NEXT: .byte 25538; CHECK-NEXT: .byte 25539; CHECK-NEXT: .byte 340 41define void @sitofp_v8i8_to_v8f32(ptr %src, ptr %dst) {42; CHECK-LABEL: sitofp_v8i8_to_v8f32:43; CHECK: // %bb.0: // %entry44; CHECK-NEXT: adrp x8, .LCPI0_045; CHECK-NEXT: adrp x9, .LCPI0_146; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI0_0]47; CHECK-NEXT: ldr q1, [x9, :lo12:.LCPI0_1]48; CHECK-NEXT: mov x8, xzr49; CHECK-NEXT: .LBB0_1: // %loop50; CHECK-NEXT: // =>This Inner Loop Header: Depth=151; CHECK-NEXT: ldr d2, [x0, x8, lsl #3]52; CHECK-NEXT: add x9, x1, x8, lsl #553; CHECK-NEXT: add x8, x8, #154; CHECK-NEXT: cmp x8, #100055; CHECK-NEXT: tbl v3.16b, { v2.16b }, v0.16b56; CHECK-NEXT: tbl v2.16b, { v2.16b }, v1.16b57; CHECK-NEXT: scvtf v3.4s, v3.4s, #2458; CHECK-NEXT: scvtf v2.4s, v2.4s, #2459; CHECK-NEXT: stp q2, q3, [x9]60; CHECK-NEXT: b.eq .LBB0_161; CHECK-NEXT: // %bb.2: // %exit62; CHECK-NEXT: ret63entry:64 br label %loop65 66loop:67 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]68 %gep.src = getelementptr inbounds <8 x i8>, ptr %src, i64 %iv69 %l = load <8 x i8>, ptr %gep.src70 %conv = sitofp <8 x i8> %l to <8 x float>71 %gep.dst = getelementptr inbounds <8 x float>, ptr %dst, i64 %iv72 store <8 x float> %conv, ptr %gep.dst73 %iv.next = add i64 %iv, 174 %ec = icmp eq i64 %iv.next, 100075 br i1 %ec, label %loop, label %exit76 77exit:78 ret void79}80 81; CHECK-LABEL: .LCPI1_0:82; CHECK-NEXT: .byte 25583; CHECK-NEXT: .byte 25584; CHECK-NEXT: .byte 25585; CHECK-NEXT: .byte 1286; CHECK-NEXT: .byte 25587; CHECK-NEXT: .byte 25588; CHECK-NEXT: .byte 25589; CHECK-NEXT: .byte 1390; CHECK-NEXT: .byte 25591; CHECK-NEXT: .byte 25592; CHECK-NEXT: .byte 25593; CHECK-NEXT: .byte 1494; CHECK-NEXT: .byte 25595; CHECK-NEXT: .byte 25596; CHECK-NEXT: .byte 25597; CHECK-NEXT: .byte 1598; CHECK-NEXT: .LCPI1_1:99; CHECK-NEXT: .byte 255100; CHECK-NEXT: .byte 255101; CHECK-NEXT: .byte 255102; CHECK-NEXT: .byte 8103; CHECK-NEXT: .byte 255104; CHECK-NEXT: .byte 255105; CHECK-NEXT: .byte 255106; CHECK-NEXT: .byte 9107; CHECK-NEXT: .byte 255108; CHECK-NEXT: .byte 255109; CHECK-NEXT: .byte 255110; CHECK-NEXT: .byte 10111; CHECK-NEXT: .byte 255112; CHECK-NEXT: .byte 255113; CHECK-NEXT: .byte 255114; CHECK-NEXT: .byte 11115; CHECK-NEXT: .LCPI1_2:116; CHECK-NEXT: .byte 255117; CHECK-NEXT: .byte 255118; CHECK-NEXT: .byte 255119; CHECK-NEXT: .byte 4120; CHECK-NEXT: .byte 255121; CHECK-NEXT: .byte 255122; CHECK-NEXT: .byte 255123; CHECK-NEXT: .byte 5124; CHECK-NEXT: .byte 255125; CHECK-NEXT: .byte 255126; CHECK-NEXT: .byte 255127; CHECK-NEXT: .byte 6128; CHECK-NEXT: .byte 255129; CHECK-NEXT: .byte 255130; CHECK-NEXT: .byte 255131; CHECK-NEXT: .byte 7132; CHECK-NEXT: .LCPI1_3:133; CHECK-NEXT: .byte 255134; CHECK-NEXT: .byte 255135; CHECK-NEXT: .byte 255136; CHECK-NEXT: .byte 0137; CHECK-NEXT: .byte 255138; CHECK-NEXT: .byte 255139; CHECK-NEXT: .byte 255140; CHECK-NEXT: .byte 1141; CHECK-NEXT: .byte 255142; CHECK-NEXT: .byte 255143; CHECK-NEXT: .byte 255144; CHECK-NEXT: .byte 2145; CHECK-NEXT: .byte 255146; CHECK-NEXT: .byte 255147; CHECK-NEXT: .byte 255148; CHECK-NEXT: .byte 3149 150define void @sitofp_v16i8_to_v16f32(ptr %src, ptr %dst) {151; CHECK-LABEL: sitofp_v16i8_to_v16f32:152; CHECK: // %bb.0: // %entry153; CHECK-NEXT: adrp x8, .LCPI1_0154; CHECK-NEXT: adrp x9, .LCPI1_1155; CHECK-NEXT: adrp x10, .LCPI1_2156; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI1_0]157; CHECK-NEXT: adrp x8, .LCPI1_3158; CHECK-NEXT: ldr q1, [x9, :lo12:.LCPI1_1]159; CHECK-NEXT: ldr q2, [x10, :lo12:.LCPI1_2]160; CHECK-NEXT: ldr q3, [x8, :lo12:.LCPI1_3]161; CHECK-NEXT: mov x8, xzr162; CHECK-NEXT: .LBB1_1: // %loop163; CHECK-NEXT: // =>This Inner Loop Header: Depth=1164; CHECK-NEXT: ldr q4, [x0, x8, lsl #4]165; CHECK-NEXT: add x9, x1, x8, lsl #6166; CHECK-NEXT: add x8, x8, #1167; CHECK-NEXT: cmp x8, #1000168; CHECK-NEXT: tbl v5.16b, { v4.16b }, v0.16b169; CHECK-NEXT: tbl v6.16b, { v4.16b }, v1.16b170; CHECK-NEXT: tbl v7.16b, { v4.16b }, v2.16b171; CHECK-NEXT: tbl v4.16b, { v4.16b }, v3.16b172; CHECK-NEXT: scvtf v5.4s, v5.4s, #24173; CHECK-NEXT: scvtf v6.4s, v6.4s, #24174; CHECK-NEXT: scvtf v7.4s, v7.4s, #24175; CHECK-NEXT: scvtf v4.4s, v4.4s, #24176; CHECK-NEXT: stp q6, q5, [x9, #32]177; CHECK-NEXT: stp q4, q7, [x9]178; CHECK-NEXT: b.eq .LBB1_1179; CHECK-NEXT: // %bb.2: // %exit180; CHECK-NEXT: ret181entry:182 br label %loop183 184loop:185 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]186 %gep.src = getelementptr inbounds <16 x i8>, ptr %src, i64 %iv187 %l = load <16 x i8>, ptr %gep.src188 %conv = sitofp <16 x i8> %l to <16 x float>189 %gep.dst = getelementptr inbounds <16 x float>, ptr %dst, i64 %iv190 store <16 x float> %conv, ptr %gep.dst191 %iv.next = add i64 %iv, 1192 %ec = icmp eq i64 %iv.next, 1000193 br i1 %ec, label %loop, label %exit194 195exit:196 ret void197}198 199 200; Negative tests, currently we don't convert to f16/bf16 via `tbl`.201define void @sitofp_v8i8_to_v8f16(ptr %src, ptr %dst) {202; CHECK-LABEL: sitofp_v8i8_to_v8f16:203; CHECK: // %bb.0: // %entry204; CHECK-NEXT: mov x8, xzr205; CHECK-NEXT: .LBB2_1: // %loop206; CHECK-NEXT: // =>This Inner Loop Header: Depth=1207; CHECK-NEXT: ldr d0, [x0, x8, lsl #3]208; CHECK-NEXT: sshll v0.8h, v0.8b, #0209; CHECK-NEXT: sshll v1.4s, v0.4h, #0210; CHECK-NEXT: sshll2 v0.4s, v0.8h, #0211; CHECK-NEXT: scvtf v1.4s, v1.4s212; CHECK-NEXT: scvtf v0.4s, v0.4s213; CHECK-NEXT: fcvtn v1.4h, v1.4s214; CHECK-NEXT: fcvtn2 v1.8h, v0.4s215; CHECK-NEXT: str q1, [x1, x8, lsl #4]216; CHECK-NEXT: add x8, x8, #1217; CHECK-NEXT: cmp x8, #1000218; CHECK-NEXT: b.eq .LBB2_1219; CHECK-NEXT: // %bb.2: // %exit220; CHECK-NEXT: ret221entry:222 br label %loop223 224loop:225 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]226 %gep.src = getelementptr inbounds <8 x i8>, ptr %src, i64 %iv227 %l = load <8 x i8>, ptr %gep.src228 %conv = sitofp <8 x i8> %l to <8 x half>229 %gep.dst = getelementptr inbounds <8 x half>, ptr %dst, i64 %iv230 store <8 x half> %conv, ptr %gep.dst231 %iv.next = add i64 %iv, 1232 %ec = icmp eq i64 %iv.next, 1000233 br i1 %ec, label %loop, label %exit234 235exit:236 ret void237}238 239 240; Negative test, conversion to double with the help of `tbl` not implemented (TODO)241define void @sitofp_v2i8_to_v2f64(ptr %src, ptr %dst) {242; CHECK-LABEL: sitofp_v2i8_to_v2f64:243; CHECK: // %bb.0: // %entry244; CHECK-NEXT: mov x8, xzr245; CHECK-NEXT: .LBB3_1: // %loop246; CHECK-NEXT: // =>This Inner Loop Header: Depth=1247; CHECK-NEXT: ldr h0, [x0, x8, lsl #1]248; CHECK-NEXT: sshll v0.8h, v0.8b, #0249; CHECK-NEXT: sshll v0.4s, v0.4h, #0250; CHECK-NEXT: sshll v0.2d, v0.2s, #0251; CHECK-NEXT: scvtf v0.2d, v0.2d252; CHECK-NEXT: str q0, [x1, x8, lsl #4]253; CHECK-NEXT: add x8, x8, #1254; CHECK-NEXT: cmp x8, #1000255; CHECK-NEXT: b.eq .LBB3_1256; CHECK-NEXT: // %bb.2: // %exit257; CHECK-NEXT: ret258entry:259 br label %loop260 261loop:262 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]263 %gep.src = getelementptr inbounds <2 x i8>, ptr %src, i64 %iv264 %l = load <2 x i8>, ptr %gep.src265 %conv = sitofp <2 x i8> %l to <2 x double>266 %gep.dst = getelementptr inbounds <2 x double>, ptr %dst, i64 %iv267 store <2 x double> %conv, ptr %gep.dst268 %iv.next = add i64 %iv, 1269 %ec = icmp eq i64 %iv.next, 1000270 br i1 %ec, label %loop, label %exit271 272exit:273 ret void274}275