882 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc --mtriple=loongarch32 --mattr=+lasx --verify-machineinstrs < %s \3; RUN: | FileCheck --check-prefix=LA32 %s4; RUN: llc --mtriple=loongarch64 --mattr=+lasx --verify-machineinstrs < %s \5; RUN: | FileCheck --check-prefix=LA64 %s6 7@g_i8 = dso_local thread_local(localexec) global i8 08 9define dso_local signext i8 @tlsle_load_s8() nounwind {10; LA32-LABEL: tlsle_load_s8:11; LA32: # %bb.0: # %entry12; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_i8)13; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_i8)14; LA32-NEXT: ld.b $a0, $a0, %le_lo12_r(g_i8)15; LA32-NEXT: ret16;17; LA64-LABEL: tlsle_load_s8:18; LA64: # %bb.0: # %entry19; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_i8)20; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_i8)21; LA64-NEXT: ld.b $a0, $a0, %le_lo12_r(g_i8)22; LA64-NEXT: ret23entry:24 %0 = call ptr @llvm.threadlocal.address.p0(ptr @g_i8)25 %1 = load i8, ptr %026 ret i8 %127}28 29define dso_local zeroext i8 @tlsle_load_u8() nounwind {30; LA32-LABEL: tlsle_load_u8:31; LA32: # %bb.0: # %entry32; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_i8)33; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_i8)34; LA32-NEXT: ld.bu $a0, $a0, %le_lo12_r(g_i8)35; LA32-NEXT: ret36;37; LA64-LABEL: tlsle_load_u8:38; LA64: # %bb.0: # %entry39; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_i8)40; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_i8)41; LA64-NEXT: ld.bu $a0, $a0, %le_lo12_r(g_i8)42; LA64-NEXT: ret43entry:44 %0 = call ptr @llvm.threadlocal.address.p0(ptr @g_i8)45 %1 = load i8, ptr %046 ret i8 %147}48 49define dso_local void @tlsle_store_i8() nounwind {50; LA32-LABEL: tlsle_store_i8:51; LA32: # %bb.0: # %entry52; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_i8)53; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_i8)54; LA32-NEXT: ori $a1, $zero, 155; LA32-NEXT: st.b $a1, $a0, %le_lo12_r(g_i8)56; LA32-NEXT: ret57;58; LA64-LABEL: tlsle_store_i8:59; LA64: # %bb.0: # %entry60; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_i8)61; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_i8)62; LA64-NEXT: ori $a1, $zero, 163; LA64-NEXT: st.b $a1, $a0, %le_lo12_r(g_i8)64; LA64-NEXT: ret65entry:66 %0 = call ptr @llvm.threadlocal.address.p0(ptr @g_i8)67 store i8 1, ptr %068 ret void69}70 71@g_i16 = dso_local thread_local(localexec) global i16 072 73define dso_local signext i16 @tlsle_load_s16() nounwind {74; LA32-LABEL: tlsle_load_s16:75; LA32: # %bb.0: # %entry76; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_i16)77; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_i16)78; LA32-NEXT: ld.h $a0, $a0, %le_lo12_r(g_i16)79; LA32-NEXT: ret80;81; LA64-LABEL: tlsle_load_s16:82; LA64: # %bb.0: # %entry83; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_i16)84; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_i16)85; LA64-NEXT: ld.h $a0, $a0, %le_lo12_r(g_i16)86; LA64-NEXT: ret87entry:88 %0 = call ptr @llvm.threadlocal.address.p0(ptr @g_i16)89 %1 = load i16, ptr %090 ret i16 %191}92 93define dso_local zeroext i16 @tlsle_load_u16() nounwind {94; LA32-LABEL: tlsle_load_u16:95; LA32: # %bb.0: # %entry96; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_i16)97; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_i16)98; LA32-NEXT: ld.hu $a0, $a0, %le_lo12_r(g_i16)99; LA32-NEXT: ret100;101; LA64-LABEL: tlsle_load_u16:102; LA64: # %bb.0: # %entry103; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_i16)104; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_i16)105; LA64-NEXT: ld.hu $a0, $a0, %le_lo12_r(g_i16)106; LA64-NEXT: ret107entry:108 %0 = call ptr @llvm.threadlocal.address.p0(ptr @g_i16)109 %1 = load i16, ptr %0110 ret i16 %1111}112 113define dso_local void @tlsle_store_i16() nounwind {114; LA32-LABEL: tlsle_store_i16:115; LA32: # %bb.0: # %entry116; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_i16)117; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_i16)118; LA32-NEXT: ori $a1, $zero, 1119; LA32-NEXT: st.h $a1, $a0, %le_lo12_r(g_i16)120; LA32-NEXT: ret121;122; LA64-LABEL: tlsle_store_i16:123; LA64: # %bb.0: # %entry124; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_i16)125; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_i16)126; LA64-NEXT: ori $a1, $zero, 1127; LA64-NEXT: st.h $a1, $a0, %le_lo12_r(g_i16)128; LA64-NEXT: ret129entry:130 %0 = call ptr @llvm.threadlocal.address.p0(ptr @g_i16)131 store i16 1, ptr %0132 ret void133}134 135@g_i32 = dso_local thread_local(localexec) global i32 0136 137define dso_local signext i32 @tlsle_load_s32() nounwind {138; LA32-LABEL: tlsle_load_s32:139; LA32: # %bb.0: # %entry140; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_i32)141; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_i32)142; LA32-NEXT: ld.w $a0, $a0, %le_lo12_r(g_i32)143; LA32-NEXT: ret144;145; LA64-LABEL: tlsle_load_s32:146; LA64: # %bb.0: # %entry147; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_i32)148; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_i32)149; LA64-NEXT: ld.w $a0, $a0, %le_lo12_r(g_i32)150; LA64-NEXT: ret151entry:152 %0 = call ptr @llvm.threadlocal.address.p0(ptr @g_i32)153 %1 = load i32, ptr %0154 ret i32 %1155}156 157define dso_local zeroext i32 @tlsle_load_u32() nounwind {158; LA32-LABEL: tlsle_load_u32:159; LA32: # %bb.0: # %entry160; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_i32)161; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_i32)162; LA32-NEXT: ld.w $a0, $a0, %le_lo12_r(g_i32)163; LA32-NEXT: ret164;165; LA64-LABEL: tlsle_load_u32:166; LA64: # %bb.0: # %entry167; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_i32)168; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_i32)169; LA64-NEXT: ld.wu $a0, $a0, %le_lo12_r(g_i32)170; LA64-NEXT: ret171entry:172 %0 = call ptr @llvm.threadlocal.address.p0(ptr @g_i32)173 %1 = load i32, ptr %0174 ret i32 %1175}176 177define dso_local void @tlsle_store_i32() nounwind {178; LA32-LABEL: tlsle_store_i32:179; LA32: # %bb.0: # %entry180; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_i32)181; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_i32)182; LA32-NEXT: ori $a1, $zero, 1183; LA32-NEXT: st.w $a1, $a0, %le_lo12_r(g_i32)184; LA32-NEXT: ret185;186; LA64-LABEL: tlsle_store_i32:187; LA64: # %bb.0: # %entry188; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_i32)189; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_i32)190; LA64-NEXT: ori $a1, $zero, 1191; LA64-NEXT: st.w $a1, $a0, %le_lo12_r(g_i32)192; LA64-NEXT: ret193entry:194 %0 = call ptr @llvm.threadlocal.address.p0(ptr @g_i32)195 store i32 1, ptr %0196 ret void197}198 199@g_i64 = dso_local thread_local(localexec) global i64 0200 201define dso_local i64 @tlsle_load_i64() nounwind {202; LA32-LABEL: tlsle_load_i64:203; LA32: # %bb.0: # %entry204; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_i64)205; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_i64)206; LA32-NEXT: addi.w $a1, $a0, %le_lo12_r(g_i64)207; LA32-NEXT: ld.w $a0, $a1, 0208; LA32-NEXT: ld.w $a1, $a1, 4209; LA32-NEXT: ret210;211; LA64-LABEL: tlsle_load_i64:212; LA64: # %bb.0: # %entry213; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_i64)214; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_i64)215; LA64-NEXT: ld.d $a0, $a0, %le_lo12_r(g_i64)216; LA64-NEXT: ret217entry:218 %0 = call ptr @llvm.threadlocal.address.p0(ptr @g_i64)219 %1 = load i64, ptr %0220 ret i64 %1221}222 223define dso_local void @tlsle_store_i64() nounwind {224; LA32-LABEL: tlsle_store_i64:225; LA32: # %bb.0: # %entry226; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_i64)227; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_i64)228; LA32-NEXT: addi.w $a0, $a0, %le_lo12_r(g_i64)229; LA32-NEXT: st.w $zero, $a0, 4230; LA32-NEXT: ori $a1, $zero, 1231; LA32-NEXT: st.w $a1, $a0, 0232; LA32-NEXT: ret233;234; LA64-LABEL: tlsle_store_i64:235; LA64: # %bb.0: # %entry236; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_i64)237; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_i64)238; LA64-NEXT: ori $a1, $zero, 1239; LA64-NEXT: st.d $a1, $a0, %le_lo12_r(g_i64)240; LA64-NEXT: ret241entry:242 %0 = call ptr @llvm.threadlocal.address.p0(ptr @g_i64)243 store i64 1, ptr %0244 ret void245}246 247@g_f32 = dso_local thread_local(localexec) global float 0.0248 249define dso_local float @tlsle_load_f32() nounwind {250; LA32-LABEL: tlsle_load_f32:251; LA32: # %bb.0: # %entry252; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_f32)253; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_f32)254; LA32-NEXT: fld.s $fa0, $a0, %le_lo12_r(g_f32)255; LA32-NEXT: ret256;257; LA64-LABEL: tlsle_load_f32:258; LA64: # %bb.0: # %entry259; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_f32)260; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_f32)261; LA64-NEXT: fld.s $fa0, $a0, %le_lo12_r(g_f32)262; LA64-NEXT: ret263entry:264 %0 = call ptr @llvm.threadlocal.address.p0(ptr @g_f32)265 %1 = load float, ptr %0266 ret float %1267}268 269define dso_local void @tlsle_store_f32() nounwind {270; LA32-LABEL: tlsle_store_f32:271; LA32: # %bb.0: # %entry272; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_f32)273; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_f32)274; LA32-NEXT: lu12i.w $a1, 260096275; LA32-NEXT: st.w $a1, $a0, %le_lo12_r(g_f32)276; LA32-NEXT: ret277;278; LA64-LABEL: tlsle_store_f32:279; LA64: # %bb.0: # %entry280; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_f32)281; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_f32)282; LA64-NEXT: lu12i.w $a1, 260096283; LA64-NEXT: st.w $a1, $a0, %le_lo12_r(g_f32)284; LA64-NEXT: ret285entry:286 %0 = call ptr @llvm.threadlocal.address.p0(ptr @g_f32)287 store float 1.0, ptr %0288 ret void289}290 291@g_f64 = dso_local thread_local(localexec) global double 0.0292 293define dso_local double @tlsle_load_f64() nounwind {294; LA32-LABEL: tlsle_load_f64:295; LA32: # %bb.0: # %entry296; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_f64)297; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_f64)298; LA32-NEXT: fld.d $fa0, $a0, %le_lo12_r(g_f64)299; LA32-NEXT: ret300;301; LA64-LABEL: tlsle_load_f64:302; LA64: # %bb.0: # %entry303; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_f64)304; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_f64)305; LA64-NEXT: fld.d $fa0, $a0, %le_lo12_r(g_f64)306; LA64-NEXT: ret307entry:308 %0 = call ptr @llvm.threadlocal.address.p0(ptr @g_f64)309 %1 = load double, ptr %0310 ret double %1311}312 313define dso_local void @tlsle_store_f64() nounwind {314; LA32-LABEL: tlsle_store_f64:315; LA32: # %bb.0: # %entry316; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_f64)317; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_f64)318; LA32-NEXT: vldi $vr0, -912319; LA32-NEXT: fst.d $fa0, $a0, %le_lo12_r(g_f64)320; LA32-NEXT: ret321;322; LA64-LABEL: tlsle_store_f64:323; LA64: # %bb.0: # %entry324; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_f64)325; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_f64)326; LA64-NEXT: lu52i.d $a1, $zero, 1023327; LA64-NEXT: st.d $a1, $a0, %le_lo12_r(g_f64)328; LA64-NEXT: ret329entry:330 %0 = call ptr @llvm.threadlocal.address.p0(ptr @g_f64)331 store double 1.0, ptr %0332 ret void333}334 335@g_m64 = dso_local thread_local(localexec) global i64 0336 337define dso_local void @tlsle_store_multi() nounwind {338; LA32-LABEL: tlsle_store_multi:339; LA32: # %bb.0: # %entry340; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_m64)341; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_m64)342; LA32-NEXT: addi.w $a0, $a0, %le_lo12_r(g_m64)343; LA32-NEXT: st.w $zero, $a0, 4344; LA32-NEXT: ori $a1, $zero, 1345; LA32-NEXT: st.w $a1, $a0, 0346; LA32-NEXT: st.w $zero, $a0, 4347; LA32-NEXT: ori $a1, $zero, 2348; LA32-NEXT: st.w $a1, $a0, 0349; LA32-NEXT: ret350;351; LA64-LABEL: tlsle_store_multi:352; LA64: # %bb.0: # %entry353; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_m64)354; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_m64)355; LA64-NEXT: ori $a1, $zero, 1356; LA64-NEXT: st.d $a1, $a0, %le_lo12_r(g_m64)357; LA64-NEXT: ori $a1, $zero, 2358; LA64-NEXT: st.d $a1, $a0, %le_lo12_r(g_m64)359; LA64-NEXT: ret360entry:361 %0 = call ptr @llvm.threadlocal.address.p0(ptr @g_m64)362 store volatile i64 1, ptr %0363 store volatile i64 2, ptr %0364 ret void365}366 367@g_sf32 = dso_local thread_local(localexec) global float 0.0368 369define dso_local void @tlsle_store_sf32() nounwind {370; LA32-LABEL: tlsle_store_sf32:371; LA32: # %bb.0: # %entry372; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_sf32)373; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_sf32)374; LA32-NEXT: fld.s $fa0, $a0, %le_lo12_r(g_sf32)375; LA32-NEXT: fst.s $fa0, $a0, %le_lo12_r(g_sf32)376; LA32-NEXT: ret377;378; LA64-LABEL: tlsle_store_sf32:379; LA64: # %bb.0: # %entry380; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_sf32)381; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_sf32)382; LA64-NEXT: fld.s $fa0, $a0, %le_lo12_r(g_sf32)383; LA64-NEXT: fst.s $fa0, $a0, %le_lo12_r(g_sf32)384; LA64-NEXT: ret385entry:386 %0 = call ptr @llvm.threadlocal.address.p0(ptr @g_sf32)387 %1 = load float, ptr %0388 store volatile float %1, ptr %0389 ret void390}391 392@g_sf64 = dso_local thread_local(localexec) global double 0.0393 394define dso_local void @tlsle_store_sf64() nounwind {395; LA32-LABEL: tlsle_store_sf64:396; LA32: # %bb.0: # %entry397; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_sf64)398; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_sf64)399; LA32-NEXT: fld.d $fa0, $a0, %le_lo12_r(g_sf64)400; LA32-NEXT: fst.d $fa0, $a0, %le_lo12_r(g_sf64)401; LA32-NEXT: ret402;403; LA64-LABEL: tlsle_store_sf64:404; LA64: # %bb.0: # %entry405; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_sf64)406; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_sf64)407; LA64-NEXT: fld.d $fa0, $a0, %le_lo12_r(g_sf64)408; LA64-NEXT: fst.d $fa0, $a0, %le_lo12_r(g_sf64)409; LA64-NEXT: ret410entry:411 %0 = call ptr @llvm.threadlocal.address.p0(ptr @g_sf64)412 %1 = load double, ptr %0413 store volatile double %1, ptr %0414 ret void415}416 417@g_i32x4_src = dso_local thread_local(localexec) global [4 x i32] zeroinitializer, align 16418@g_i32x4_dst = dso_local thread_local(localexec) global [4 x i32] zeroinitializer, align 16419 420define dso_local void @tlsle_copy_i32x4() nounwind {421; LA32-LABEL: tlsle_copy_i32x4:422; LA32: # %bb.0: # %entry423; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_i32x4_src)424; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_i32x4_src)425; LA32-NEXT: vld $vr0, $a0, %le_lo12_r(g_i32x4_src)426; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_i32x4_dst)427; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_i32x4_dst)428; LA32-NEXT: vst $vr0, $a0, %le_lo12_r(g_i32x4_dst)429; LA32-NEXT: ret430;431; LA64-LABEL: tlsle_copy_i32x4:432; LA64: # %bb.0: # %entry433; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_i32x4_src)434; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_i32x4_src)435; LA64-NEXT: vld $vr0, $a0, %le_lo12_r(g_i32x4_src)436; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_i32x4_dst)437; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_i32x4_dst)438; LA64-NEXT: vst $vr0, $a0, %le_lo12_r(g_i32x4_dst)439; LA64-NEXT: ret440entry:441 %0 = call ptr @llvm.threadlocal.address.p0(ptr @g_i32x4_src)442 %1 = load <4 x i32>, ptr %0, align 16443 %2 = call ptr @llvm.threadlocal.address.p0(ptr @g_i32x4_dst)444 store <4 x i32> %1, ptr %2, align 16445 ret void446}447 448@g_i32x8_src = dso_local thread_local(localexec) global [8 x i32] zeroinitializer, align 32449@g_i32x8_dst = dso_local thread_local(localexec) global [8 x i32] zeroinitializer, align 32450 451define dso_local void @tlsle_copy_i32x8() nounwind {452; LA32-LABEL: tlsle_copy_i32x8:453; LA32: # %bb.0: # %entry454; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_i32x8_src)455; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_i32x8_src)456; LA32-NEXT: xvld $xr0, $a0, %le_lo12_r(g_i32x8_src)457; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_i32x8_dst)458; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_i32x8_dst)459; LA32-NEXT: xvst $xr0, $a0, %le_lo12_r(g_i32x8_dst)460; LA32-NEXT: ret461;462; LA64-LABEL: tlsle_copy_i32x8:463; LA64: # %bb.0: # %entry464; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_i32x8_src)465; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_i32x8_src)466; LA64-NEXT: xvld $xr0, $a0, %le_lo12_r(g_i32x8_src)467; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_i32x8_dst)468; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_i32x8_dst)469; LA64-NEXT: xvst $xr0, $a0, %le_lo12_r(g_i32x8_dst)470; LA64-NEXT: ret471entry:472 %0 = call ptr @llvm.threadlocal.address.p0(ptr @g_i32x8_src)473 %1 = load <8 x i32>, ptr %0, align 32474 %2 = call ptr @llvm.threadlocal.address.p0(ptr @g_i32x8_dst)475 store <8 x i32> %1, ptr %2, align 32476 ret void477}478 479@g_i8x16 = dso_local thread_local(localexec) global <16 x i8> zeroinitializer, align 16480 481define dso_local void @tlsle_copy_i8_to_i8x16() nounwind {482; LA32-LABEL: tlsle_copy_i8_to_i8x16:483; LA32: # %bb.0: # %entry484; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_i8)485; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_i8)486; LA32-NEXT: vldrepl.b $vr0, $a0, %le_lo12_r(g_i8)487; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_i8x16)488; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_i8x16)489; LA32-NEXT: vst $vr0, $a0, %le_lo12_r(g_i8x16)490; LA32-NEXT: ret491;492; LA64-LABEL: tlsle_copy_i8_to_i8x16:493; LA64: # %bb.0: # %entry494; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_i8)495; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_i8)496; LA64-NEXT: vldrepl.b $vr0, $a0, %le_lo12_r(g_i8)497; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_i8x16)498; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_i8x16)499; LA64-NEXT: vst $vr0, $a0, %le_lo12_r(g_i8x16)500; LA64-NEXT: ret501entry:502 %0 = call ptr @llvm.threadlocal.address.p0(ptr @g_i8)503 %1 = call <16 x i8> @llvm.loongarch.lsx.vldrepl.b(ptr %0, i32 0)504 %2 = call ptr @llvm.threadlocal.address.p0(ptr @g_i8x16)505 store <16 x i8> %1, ptr %2, align 16506 ret void507}508 509@g_i8x32 = dso_local thread_local(localexec) global <32 x i8> zeroinitializer, align 32510 511define dso_local void @tlsle_copy_i8_to_i8x32() nounwind {512; LA32-LABEL: tlsle_copy_i8_to_i8x32:513; LA32: # %bb.0: # %entry514; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_i8)515; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_i8)516; LA32-NEXT: xvldrepl.b $xr0, $a0, %le_lo12_r(g_i8)517; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_i8x32)518; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_i8x32)519; LA32-NEXT: xvst $xr0, $a0, %le_lo12_r(g_i8x32)520; LA32-NEXT: ret521;522; LA64-LABEL: tlsle_copy_i8_to_i8x32:523; LA64: # %bb.0: # %entry524; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_i8)525; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_i8)526; LA64-NEXT: xvldrepl.b $xr0, $a0, %le_lo12_r(g_i8)527; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_i8x32)528; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_i8x32)529; LA64-NEXT: xvst $xr0, $a0, %le_lo12_r(g_i8x32)530; LA64-NEXT: ret531entry:532 %0 = call ptr @llvm.threadlocal.address.p0(ptr @g_i8)533 %1 = call <32 x i8> @llvm.loongarch.lasx.xvldrepl.b(ptr %0, i32 0)534 %2 = call ptr @llvm.threadlocal.address.p0(ptr @g_i8x32)535 store <32 x i8> %1, ptr %2, align 32536 ret void537}538 539@g_rmw = dso_local thread_local(localexec) global i64 0540 541define dso_local void @tlsle_rmw() nounwind {542; LA32-LABEL: tlsle_rmw:543; LA32: # %bb.0: # %entry544; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_rmw)545; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_rmw)546; LA32-NEXT: addi.w $a0, $a0, %le_lo12_r(g_rmw)547; LA32-NEXT: ld.w $a1, $a0, 0548; LA32-NEXT: ld.w $a2, $a0, 4549; LA32-NEXT: addi.w $a1, $a1, 1550; LA32-NEXT: sltui $a3, $a1, 1551; LA32-NEXT: add.w $a2, $a2, $a3552; LA32-NEXT: st.w $a1, $a0, 0553; LA32-NEXT: st.w $a2, $a0, 4554; LA32-NEXT: ret555;556; LA64-LABEL: tlsle_rmw:557; LA64: # %bb.0: # %entry558; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_rmw)559; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_rmw)560; LA64-NEXT: ld.d $a1, $a0, %le_lo12_r(g_rmw)561; LA64-NEXT: addi.d $a1, $a1, 1562; LA64-NEXT: st.d $a1, $a0, %le_lo12_r(g_rmw)563; LA64-NEXT: ret564entry:565 %0 = call ptr @llvm.threadlocal.address.p0(ptr @g_rmw)566 %1 = load i64, ptr %0567 %2 = add i64 %1, 1568 store i64 %2, ptr %0569 ret void570}571 572@g_a32 = dso_local thread_local(localexec) global [2048 x i32] zeroinitializer, align 4573 574define dso_local void @tlsle_store_a32() nounwind {575; LA32-LABEL: tlsle_store_a32:576; LA32: # %bb.0: # %entry577; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_a32+4096)578; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_a32+4096)579; LA32-NEXT: ori $a1, $zero, 1580; LA32-NEXT: st.w $a1, $a0, %le_lo12_r(g_a32+4096)581; LA32-NEXT: ret582;583; LA64-LABEL: tlsle_store_a32:584; LA64: # %bb.0: # %entry585; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_a32+4096)586; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_a32+4096)587; LA64-NEXT: ori $a1, $zero, 1588; LA64-NEXT: st.w $a1, $a0, %le_lo12_r(g_a32+4096)589; LA64-NEXT: ret590entry:591 store i32 1, ptr getelementptr inbounds ([1 x i32], ptr @g_a32, i32 1024), align 4592 ret void593}594 595define dso_local void @tlsle_store_a32_2() nounwind {596; LA32-LABEL: tlsle_store_a32_2:597; LA32: # %bb.0: # %entry598; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_a32)599; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_a32)600; LA32-NEXT: addi.w $a0, $a0, %le_lo12_r(g_a32)601; LA32-NEXT: lu12i.w $a1, 1602; LA32-NEXT: add.w $a2, $a0, $a1603; LA32-NEXT: ori $a3, $zero, 1604; LA32-NEXT: st.w $a3, $a2, 0605; LA32-NEXT: ori $a1, $a1, 8606; LA32-NEXT: add.w $a0, $a0, $a1607; LA32-NEXT: ori $a1, $zero, 2608; LA32-NEXT: st.w $a1, $a0, 0609; LA32-NEXT: ret610;611; LA64-LABEL: tlsle_store_a32_2:612; LA64: # %bb.0: # %entry613; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_a32)614; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_a32)615; LA64-NEXT: addi.d $a0, $a0, %le_lo12_r(g_a32)616; LA64-NEXT: ori $a1, $zero, 1617; LA64-NEXT: stptr.w $a1, $a0, 4096618; LA64-NEXT: ori $a1, $zero, 2619; LA64-NEXT: stptr.w $a1, $a0, 4104620; LA64-NEXT: ret621entry:622 store i32 1, ptr getelementptr inbounds ([1 x i32], ptr @g_a32, i32 1024), align 4623 store i32 2, ptr getelementptr inbounds ([1 x i32], ptr @g_a32, i32 1026), align 4624 ret void625}626 627define dso_local void @tlsle_control_flow_with_mem_access() nounwind {628; LA32-LABEL: tlsle_control_flow_with_mem_access:629; LA32: # %bb.0: # %entry630; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_a32+4)631; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_a32+4)632; LA32-NEXT: ld.w $a1, $a0, %le_lo12_r(g_a32+4)633; LA32-NEXT: blez $a1, .LBB25_2634; LA32-NEXT: # %bb.1: # %if.then635; LA32-NEXT: ori $a1, $zero, 10636; LA32-NEXT: st.w $a1, $a0, %le_lo12_r(g_a32+4)637; LA32-NEXT: .LBB25_2: # %if.end638; LA32-NEXT: ret639;640; LA64-LABEL: tlsle_control_flow_with_mem_access:641; LA64: # %bb.0: # %entry642; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_a32+4)643; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_a32+4)644; LA64-NEXT: ld.w $a1, $a0, %le_lo12_r(g_a32+4)645; LA64-NEXT: blez $a1, .LBB25_2646; LA64-NEXT: # %bb.1: # %if.then647; LA64-NEXT: ori $a1, $zero, 10648; LA64-NEXT: st.w $a1, $a0, %le_lo12_r(g_a32+4)649; LA64-NEXT: .LBB25_2: # %if.end650; LA64-NEXT: ret651entry:652 %0 = load i32, ptr getelementptr inbounds ([1 x i32], ptr @g_a32, i32 1), align 4653 %cmp = icmp sgt i32 %0, 0654 br i1 %cmp, label %if.then, label %if.end655 656if.then:657 store i32 10, ptr getelementptr inbounds ([1 x i32], ptr @g_a32, i32 1), align 4658 br label %if.end659 660if.end:661 ret void662}663 664@g_a64 = dso_local thread_local(localexec) global [614750729487779976 x i64] zeroinitializer, align 8665 666define dso_local ptr @tlsle_load_addr_offset_1() nounwind {667; LA32-LABEL: tlsle_load_addr_offset_1:668; LA32: # %bb.0: # %entry669; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_a64+8)670; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_a64+8)671; LA32-NEXT: addi.w $a0, $a0, %le_lo12_r(g_a64+8)672; LA32-NEXT: ret673;674; LA64-LABEL: tlsle_load_addr_offset_1:675; LA64: # %bb.0: # %entry676; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_a64+8)677; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_a64+8)678; LA64-NEXT: addi.d $a0, $a0, %le_lo12_r(g_a64+8)679; LA64-NEXT: ret680entry:681 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 1)682}683 684define dso_local ptr @tlsle_load_addr_offset_257() nounwind {685; LA32-LABEL: tlsle_load_addr_offset_257:686; LA32: # %bb.0: # %entry687; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_a64+2056)688; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_a64+2056)689; LA32-NEXT: addi.w $a0, $a0, %le_lo12_r(g_a64+2056)690; LA32-NEXT: ret691;692; LA64-LABEL: tlsle_load_addr_offset_257:693; LA64: # %bb.0: # %entry694; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_a64+2056)695; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_a64+2056)696; LA64-NEXT: addi.d $a0, $a0, %le_lo12_r(g_a64+2056)697; LA64-NEXT: ret698entry:699 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 257)700}701 702define dso_local ptr @tlsle_load_addr_offset_1048576() nounwind {703; LA32-LABEL: tlsle_load_addr_offset_1048576:704; LA32: # %bb.0: # %entry705; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_a64+8388608)706; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_a64+8388608)707; LA32-NEXT: addi.w $a0, $a0, %le_lo12_r(g_a64+8388608)708; LA32-NEXT: ret709;710; LA64-LABEL: tlsle_load_addr_offset_1048576:711; LA64: # %bb.0: # %entry712; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_a64+8388608)713; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_a64+8388608)714; LA64-NEXT: addi.d $a0, $a0, %le_lo12_r(g_a64+8388608)715; LA64-NEXT: ret716entry:717 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 1048576)718}719 720define dso_local ptr @tlsle_load_addr_offset_1048577() nounwind {721; LA32-LABEL: tlsle_load_addr_offset_1048577:722; LA32: # %bb.0: # %entry723; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_a64+8388616)724; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_a64+8388616)725; LA32-NEXT: addi.w $a0, $a0, %le_lo12_r(g_a64+8388616)726; LA32-NEXT: ret727;728; LA64-LABEL: tlsle_load_addr_offset_1048577:729; LA64: # %bb.0: # %entry730; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_a64+8388616)731; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_a64+8388616)732; LA64-NEXT: addi.d $a0, $a0, %le_lo12_r(g_a64+8388616)733; LA64-NEXT: ret734entry:735 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 1048577)736}737 738define dso_local ptr @tlsle_load_addr_offset_268432896() nounwind {739; LA32-LABEL: tlsle_load_addr_offset_268432896:740; LA32: # %bb.0: # %entry741; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_a64+2147463168)742; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_a64+2147463168)743; LA32-NEXT: addi.w $a0, $a0, %le_lo12_r(g_a64+2147463168)744; LA32-NEXT: ret745;746; LA64-LABEL: tlsle_load_addr_offset_268432896:747; LA64: # %bb.0: # %entry748; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_a64+2147463168)749; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_a64+2147463168)750; LA64-NEXT: addi.d $a0, $a0, %le_lo12_r(g_a64+2147463168)751; LA64-NEXT: ret752entry:753 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 268432896)754}755 756define dso_local ptr @tlsle_load_addr_offset_268432897() nounwind {757; LA32-LABEL: tlsle_load_addr_offset_268432897:758; LA32: # %bb.0: # %entry759; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_a64+2147463176)760; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_a64+2147463176)761; LA32-NEXT: addi.w $a0, $a0, %le_lo12_r(g_a64+2147463176)762; LA32-NEXT: ret763;764; LA64-LABEL: tlsle_load_addr_offset_268432897:765; LA64: # %bb.0: # %entry766; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_a64+2147463176)767; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_a64+2147463176)768; LA64-NEXT: addi.d $a0, $a0, %le_lo12_r(g_a64+2147463176)769; LA64-NEXT: ret770entry:771 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 268432897)772}773 774define dso_local ptr @tlsle_load_addr_offset_281474439839744() nounwind {775; LA32-LABEL: tlsle_load_addr_offset_281474439839744:776; LA32: # %bb.0: # %entry777; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_a64)778; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_a64)779; LA32-NEXT: addi.w $a0, $a0, %le_lo12_r(g_a64)780; LA32-NEXT: ret781;782; LA64-LABEL: tlsle_load_addr_offset_281474439839744:783; LA64: # %bb.0: # %entry784; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_a64)785; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_a64)786; LA64-NEXT: addi.d $a0, $a0, %le_lo12_r(g_a64)787; LA64-NEXT: ori $a1, $zero, 0788; LA64-NEXT: lu32i.d $a1, 524287789; LA64-NEXT: add.d $a0, $a0, $a1790; LA64-NEXT: ret791entry:792 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 281474439839744)793}794 795define dso_local ptr @tlsle_load_addr_offset_248792680471040() nounwind {796; LA32-LABEL: tlsle_load_addr_offset_248792680471040:797; LA32: # %bb.0: # %entry798; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_a64+2059194368)799; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_a64+2059194368)800; LA32-NEXT: addi.w $a0, $a0, %le_lo12_r(g_a64+2059194368)801; LA32-NEXT: ret802;803; LA64-LABEL: tlsle_load_addr_offset_248792680471040:804; LA64: # %bb.0: # %entry805; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_a64)806; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_a64)807; LA64-NEXT: addi.d $a0, $a0, %le_lo12_r(g_a64)808; LA64-NEXT: lu12i.w $a1, 502733809; LA64-NEXT: lu32i.d $a1, 463412810; LA64-NEXT: add.d $a0, $a0, $a1811; LA64-NEXT: ret812entry:813 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 248792680471040)814}815 816define dso_local ptr @tlsle_load_addr_offset_9380351707272() nounwind {817; LA32-LABEL: tlsle_load_addr_offset_9380351707272:818; LA32: # %bb.0: # %entry819; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_a64+1145062464)820; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_a64+1145062464)821; LA32-NEXT: addi.w $a0, $a0, %le_lo12_r(g_a64+1145062464)822; LA32-NEXT: ret823;824; LA64-LABEL: tlsle_load_addr_offset_9380351707272:825; LA64: # %bb.0: # %entry826; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_a64)827; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_a64)828; LA64-NEXT: addi.d $a0, $a0, %le_lo12_r(g_a64)829; LA64-NEXT: lu12i.w $a1, 279556830; LA64-NEXT: ori $a1, $a1, 1088831; LA64-NEXT: lu32i.d $a1, 17472832; LA64-NEXT: add.d $a0, $a0, $a1833; LA64-NEXT: ret834entry:835 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 9380351707272)836}837 838define dso_local ptr @tlsle_load_addr_offset_562949953421312() nounwind {839; LA32-LABEL: tlsle_load_addr_offset_562949953421312:840; LA32: # %bb.0: # %entry841; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_a64)842; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_a64)843; LA32-NEXT: addi.w $a0, $a0, %le_lo12_r(g_a64)844; LA32-NEXT: ret845;846; LA64-LABEL: tlsle_load_addr_offset_562949953421312:847; LA64: # %bb.0: # %entry848; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_a64)849; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_a64)850; LA64-NEXT: addi.d $a0, $a0, %le_lo12_r(g_a64)851; LA64-NEXT: lu52i.d $a1, $zero, 1852; LA64-NEXT: add.d $a0, $a0, $a1853; LA64-NEXT: ret854entry:855 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 562949953421312)856}857 858define dso_local ptr @tlsle_load_addr_offset_614749556925924693() nounwind {859; LA32-LABEL: tlsle_load_addr_offset_614749556925924693:860; LA32: # %bb.0: # %entry861; LA32-NEXT: lu12i.w $a0, %le_hi20_r(g_a64+858794664)862; LA32-NEXT: add.w $a0, $a0, $tp, %le_add_r(g_a64+858794664)863; LA32-NEXT: addi.w $a0, $a0, %le_lo12_r(g_a64+858794664)864; LA32-NEXT: ret865;866; LA64-LABEL: tlsle_load_addr_offset_614749556925924693:867; LA64: # %bb.0: # %entry868; LA64-NEXT: lu12i.w $a0, %le_hi20_r(g_a64)869; LA64-NEXT: add.d $a0, $a0, $tp, %le_add_r(g_a64)870; LA64-NEXT: addi.d $a0, $a0, %le_lo12_r(g_a64)871; LA64-NEXT: lu12i.w $a1, 209666872; LA64-NEXT: ori $a1, $a1, 2728873; LA64-NEXT: lu32i.d $a1, 15288874; LA64-NEXT: lu52i.d $a1, $a1, 1092875; LA64-NEXT: add.d $a0, $a0, $a1876; LA64-NEXT: ret877entry:878 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 614749556925924693)879}880 881declare nonnull ptr @llvm.threadlocal.address.p0(ptr nonnull)882