244 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc < %s -mtriple=arm64-eabi -mattr=+bf16 | FileCheck %s3; RUN: llc < %s -mtriple=aarch64 -mattr=+bf16 | FileCheck %s4 5; test argument passing and simple load/store6 7define bfloat @test_load(ptr %p) nounwind {8; CHECK-LABEL: test_load:9; CHECK: // %bb.0:10; CHECK-NEXT: ldr h0, [x0]11; CHECK-NEXT: ret12 %tmp1 = load bfloat, ptr %p, align 1613 ret bfloat %tmp114}15 16define bfloat @test_load_offset1(ptr %p) nounwind {17; CHECK-LABEL: test_load_offset1:18; CHECK: // %bb.0:19; CHECK-NEXT: ldur h0, [x0, #1]20; CHECK-NEXT: ret21 %g = getelementptr inbounds i8, ptr %p, i64 122 %tmp1 = load bfloat, ptr %g, align 223 ret bfloat %tmp124}25 26define bfloat @test_load_offset2(ptr %p) nounwind {27; CHECK-LABEL: test_load_offset2:28; CHECK: // %bb.0:29; CHECK-NEXT: ldr h0, [x0, #2]30; CHECK-NEXT: ret31 %g = getelementptr inbounds i8, ptr %p, i64 232 %tmp1 = load bfloat, ptr %g, align 233 ret bfloat %tmp134}35 36define <4 x bfloat> @test_vec_load(ptr %p) nounwind {37; CHECK-LABEL: test_vec_load:38; CHECK: // %bb.0:39; CHECK-NEXT: ldr d0, [x0]40; CHECK-NEXT: ret41 %tmp1 = load <4 x bfloat>, ptr %p, align 1642 ret <4 x bfloat> %tmp143}44 45define void @test_store(ptr %a, bfloat %b) nounwind {46; CHECK-LABEL: test_store:47; CHECK: // %bb.0:48; CHECK-NEXT: str h0, [x0]49; CHECK-NEXT: ret50 store bfloat %b, ptr %a, align 1651 ret void52}53 54define void @test_store_negative_offset(ptr %a, bfloat %b) nounwind {55; CHECK-LABEL: test_store_negative_offset:56; CHECK: // %bb.0: // %entry57; CHECK-NEXT: stur h0, [x0, #-4]58; CHECK-NEXT: ret59entry:60 %0 = getelementptr inbounds bfloat, ptr %a, i64 -261 store bfloat %b, ptr %0, align 262 ret void63}64 65; Simple store of v4bf1666define void @test_vec_store(ptr %a, <4 x bfloat> %b) nounwind {67; CHECK-LABEL: test_vec_store:68; CHECK: // %bb.0: // %entry69; CHECK-NEXT: str d0, [x0]70; CHECK-NEXT: ret71entry:72 store <4 x bfloat> %b, ptr %a, align 1673 ret void74}75 76define <8 x bfloat> @test_build_vector_const() {77; CHECK-LABEL: test_build_vector_const:78; CHECK: // %bb.0:79; CHECK-NEXT: mov w8, #16256 // =0x3f8080; CHECK-NEXT: dup v0.8h, w881; CHECK-NEXT: ret82 ret <8 x bfloat> <bfloat 0xR3F80, bfloat 0xR3F80, bfloat 0xR3F80, bfloat 0xR3F80, bfloat 0xR3F80, bfloat 0xR3F80, bfloat 0xR3F80, bfloat 0xR3F80>83}84 85define ptr @test_store_post(bfloat %val, ptr %ptr) {86; CHECK-LABEL: test_store_post:87; CHECK: // %bb.0:88; CHECK-NEXT: str h0, [x0], #289; CHECK-NEXT: ret90 store bfloat %val, ptr %ptr91 %next = getelementptr bfloat, ptr %ptr, i32 192 ret ptr %next93}94 95define ptr @test_store_post_v4bf16(<4 x bfloat> %val, ptr %ptr) {96; CHECK-LABEL: test_store_post_v4bf16:97; CHECK: // %bb.0:98; CHECK-NEXT: str d0, [x0], #899; CHECK-NEXT: ret100 store <4 x bfloat> %val, ptr %ptr101 %next = getelementptr <4 x bfloat>, ptr %ptr, i32 1102 ret ptr %next103}104 105define ptr @test_store_post_v8bf16(<8 x bfloat> %val, ptr %ptr) {106; CHECK-LABEL: test_store_post_v8bf16:107; CHECK: // %bb.0:108; CHECK-NEXT: str q0, [x0], #16109; CHECK-NEXT: ret110 store <8 x bfloat> %val, ptr %ptr111 %next = getelementptr <8 x bfloat>, ptr %ptr, i32 1112 ret ptr %next113}114 115define { bfloat, ptr } @test_load_post(ptr %ptr) {116; CHECK-LABEL: test_load_post:117; CHECK: // %bb.0:118; CHECK-NEXT: ldr h0, [x0], #2119; CHECK-NEXT: ret120 %val = load bfloat, ptr %ptr121 %res.tmp = insertvalue { bfloat, ptr } undef, bfloat %val, 0122 %next = getelementptr bfloat, ptr %ptr, i32 1123 %res = insertvalue { bfloat, ptr } %res.tmp, ptr %next, 1124 ret { bfloat, ptr } %res125}126 127define { <4 x bfloat>, ptr } @test_load_post_v4bf16(ptr %ptr) {128; CHECK-LABEL: test_load_post_v4bf16:129; CHECK: // %bb.0:130; CHECK-NEXT: ldr d0, [x0], #8131; CHECK-NEXT: ret132 %val = load <4 x bfloat>, ptr %ptr133 %res.tmp = insertvalue { <4 x bfloat>, ptr } undef, <4 x bfloat> %val, 0134 %next = getelementptr <4 x bfloat>, ptr %ptr, i32 1135 %res = insertvalue { <4 x bfloat>, ptr } %res.tmp, ptr %next, 1136 ret { <4 x bfloat>, ptr } %res137}138 139define { <8 x bfloat>, ptr } @test_load_post_v8bf16(ptr %ptr) {140; CHECK-LABEL: test_load_post_v8bf16:141; CHECK: // %bb.0:142; CHECK-NEXT: ldr q0, [x0], #16143; CHECK-NEXT: ret144 %val = load <8 x bfloat>, ptr %ptr145 %res.tmp = insertvalue { <8 x bfloat>, ptr } undef, <8 x bfloat> %val, 0146 %next = getelementptr <8 x bfloat>, ptr %ptr, i32 1147 %res = insertvalue { <8 x bfloat>, ptr } %res.tmp, ptr %next, 1148 ret { <8 x bfloat>, ptr } %res149}150 151define ptr @test_store_pre(bfloat %val, ptr %ptr) {152; CHECK-LABEL: test_store_pre:153; CHECK: // %bb.0:154; CHECK-NEXT: str h0, [x0, #2]!155; CHECK-NEXT: ret156 %next = getelementptr bfloat, ptr %ptr, i32 1157 store bfloat %val, ptr %next158 ret ptr %next159}160 161define ptr @test_store_pre_v4bf16(<4 x bfloat> %val, ptr %ptr) {162; CHECK-LABEL: test_store_pre_v4bf16:163; CHECK: // %bb.0:164; CHECK-NEXT: str d0, [x0, #8]!165; CHECK-NEXT: ret166 %next = getelementptr <4 x bfloat>, ptr %ptr, i32 1167 store <4 x bfloat> %val, ptr %next168 ret ptr %next169}170 171define ptr @test_store_pre_v8bf16(<8 x bfloat> %val, ptr %ptr) {172; CHECK-LABEL: test_store_pre_v8bf16:173; CHECK: // %bb.0:174; CHECK-NEXT: str q0, [x0, #16]!175; CHECK-NEXT: ret176 %next = getelementptr <8 x bfloat>, ptr %ptr, i32 1177 store <8 x bfloat> %val, ptr %next178 ret ptr %next179}180 181define ptr @test_store_pre_v8bf16_trunc(ptr %ptr) {182; CHECK-LABEL: test_store_pre_v8bf16_trunc:183; CHECK: // %bb.0:184; CHECK-NEXT: ldr q0, [x0]185; CHECK-NEXT: str q0, [x0, #16]!186; CHECK-NEXT: ret187 %t = load <8 x bfloat>, ptr %ptr188 %next = getelementptr <8 x bfloat>, ptr %ptr, i32 1189 store <8 x bfloat> %t, ptr %next190 ret ptr %next191}192 193define { bfloat, ptr } @test_load_pre(ptr %ptr) {194; CHECK-LABEL: test_load_pre:195; CHECK: // %bb.0:196; CHECK-NEXT: ldr h0, [x0, #2]!197; CHECK-NEXT: ret198 %next = getelementptr bfloat, ptr %ptr, i32 1199 %val = load bfloat, ptr %next200 %res.tmp = insertvalue { bfloat, ptr } undef, bfloat %val, 0201 %res = insertvalue { bfloat, ptr } %res.tmp, ptr %next, 1202 ret { bfloat, ptr } %res203}204 205define { <4 x bfloat>, ptr } @test_load_pre_v4bf16(ptr %ptr) {206; CHECK-LABEL: test_load_pre_v4bf16:207; CHECK: // %bb.0:208; CHECK-NEXT: ldr d0, [x0, #8]!209; CHECK-NEXT: ret210 %next = getelementptr <4 x bfloat>, ptr %ptr, i32 1211 %val = load <4 x bfloat>, ptr %next212 %res.tmp = insertvalue { <4 x bfloat>, ptr } undef, <4 x bfloat> %val, 0213 %res = insertvalue { <4 x bfloat>, ptr } %res.tmp, ptr %next, 1214 ret { <4 x bfloat>, ptr } %res215}216 217define { <8 x bfloat>, ptr } @test_load_pre_v8bf16(ptr %ptr) {218; CHECK-LABEL: test_load_pre_v8bf16:219; CHECK: // %bb.0:220; CHECK-NEXT: ldr q0, [x0, #16]!221; CHECK-NEXT: ret222 %next = getelementptr <8 x bfloat>, ptr %ptr, i32 1223 %val = load <8 x bfloat>, ptr %next224 %res.tmp = insertvalue { <8 x bfloat>, ptr } undef, <8 x bfloat> %val, 0225 %res = insertvalue { <8 x bfloat>, ptr } %res.tmp, ptr %next, 1226 ret { <8 x bfloat>, ptr } %res227}228 229define bfloat @test_bitcast_halftobfloat(half %a) nounwind {230; CHECK-LABEL: test_bitcast_halftobfloat:231; CHECK: // %bb.0:232; CHECK-NEXT: ret233 %r = bitcast half %a to bfloat234 ret bfloat %r235}236 237define half @test_bitcast_bfloattohalf(bfloat %a) nounwind {238; CHECK-LABEL: test_bitcast_bfloattohalf:239; CHECK: // %bb.0:240; CHECK-NEXT: ret241 %r = bitcast bfloat %a to half242 ret half %r243}244