226 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc --mtriple=loongarch32 -mattr=+d --verify-machineinstrs < %s | FileCheck %s --check-prefix=LA323; RUN: llc --mtriple=loongarch64 -mattr=+d --verify-machineinstrs < %s | FileCheck %s --check-prefix=LA644 5define i32 @m_offset_neg_2049(ptr %p) nounwind {6; LA32-LABEL: m_offset_neg_2049:7; LA32: # %bb.0:8; LA32-NEXT: addi.w $a0, $a0, -20489; LA32-NEXT: addi.w $a0, $a0, -110; LA32-NEXT: #APP11; LA32-NEXT: ld.w $a0, $a0, 012; LA32-NEXT: #NO_APP13; LA32-NEXT: ret14;15; LA64-LABEL: m_offset_neg_2049:16; LA64: # %bb.0:17; LA64-NEXT: addi.d $a0, $a0, -204818; LA64-NEXT: addi.d $a0, $a0, -119; LA64-NEXT: #APP20; LA64-NEXT: ld.w $a0, $a0, 021; LA64-NEXT: #NO_APP22; LA64-NEXT: ret23 %1 = getelementptr inbounds i8, ptr %p, i32 -204924 %2 = call i32 asm "ld.w $0, $1", "=r,*m"(ptr elementtype(i32) %1)25 ret i32 %226}27 28define i32 @m_offset_neg_2048(ptr %p) nounwind {29; LA32-LABEL: m_offset_neg_2048:30; LA32: # %bb.0:31; LA32-NEXT: #APP32; LA32-NEXT: ld.w $a0, $a0, -204833; LA32-NEXT: #NO_APP34; LA32-NEXT: ret35;36; LA64-LABEL: m_offset_neg_2048:37; LA64: # %bb.0:38; LA64-NEXT: #APP39; LA64-NEXT: ld.w $a0, $a0, -204840; LA64-NEXT: #NO_APP41; LA64-NEXT: ret42 %1 = getelementptr inbounds i8, ptr %p, i32 -204843 %2 = call i32 asm "ld.w $0, $1", "=r,*m"(ptr elementtype(i32) %1)44 ret i32 %245}46 47define i32 @m_offset_neg_1(ptr %p) nounwind {48; LA32-LABEL: m_offset_neg_1:49; LA32: # %bb.0:50; LA32-NEXT: #APP51; LA32-NEXT: ld.w $a0, $a0, -152; LA32-NEXT: #NO_APP53; LA32-NEXT: ret54;55; LA64-LABEL: m_offset_neg_1:56; LA64: # %bb.0:57; LA64-NEXT: #APP58; LA64-NEXT: ld.w $a0, $a0, -159; LA64-NEXT: #NO_APP60; LA64-NEXT: ret61 %1 = getelementptr inbounds i8, ptr %p, i32 -162 %2 = call i32 asm "ld.w $0, $1", "=r,*m"(ptr elementtype(i32) %1)63 ret i32 %264}65 66define i32 @m_offset_0(ptr %p) nounwind {67; LA32-LABEL: m_offset_0:68; LA32: # %bb.0:69; LA32-NEXT: #APP70; LA32-NEXT: ld.w $a0, $a0, 071; LA32-NEXT: #NO_APP72; LA32-NEXT: ret73;74; LA64-LABEL: m_offset_0:75; LA64: # %bb.0:76; LA64-NEXT: #APP77; LA64-NEXT: ld.w $a0, $a0, 078; LA64-NEXT: #NO_APP79; LA64-NEXT: ret80 %1 = call i32 asm "ld.w $0, $1", "=r,*m"(ptr elementtype(i32) %p)81 ret i32 %182}83 84define i32 @m_offset_1(ptr %p) nounwind {85; LA32-LABEL: m_offset_1:86; LA32: # %bb.0:87; LA32-NEXT: #APP88; LA32-NEXT: ld.w $a0, $a0, 189; LA32-NEXT: #NO_APP90; LA32-NEXT: ret91;92; LA64-LABEL: m_offset_1:93; LA64: # %bb.0:94; LA64-NEXT: #APP95; LA64-NEXT: ld.w $a0, $a0, 196; LA64-NEXT: #NO_APP97; LA64-NEXT: ret98 %1 = getelementptr inbounds i8, ptr %p, i32 199 %2 = call i32 asm "ld.w $0, $1", "=r,*m"(ptr elementtype(i32) %1)100 ret i32 %2101}102 103define i32 @m_offset_2047(ptr %p) nounwind {104; LA32-LABEL: m_offset_2047:105; LA32: # %bb.0:106; LA32-NEXT: #APP107; LA32-NEXT: ld.w $a0, $a0, 2047108; LA32-NEXT: #NO_APP109; LA32-NEXT: ret110;111; LA64-LABEL: m_offset_2047:112; LA64: # %bb.0:113; LA64-NEXT: #APP114; LA64-NEXT: ld.w $a0, $a0, 2047115; LA64-NEXT: #NO_APP116; LA64-NEXT: ret117 %1 = getelementptr inbounds i8, ptr %p, i32 2047118 %2 = call i32 asm "ld.w $0, $1", "=r,*m"(ptr elementtype(i32) %1)119 ret i32 %2120}121 122define i32 @m_offset_2048(ptr %p) nounwind {123; LA32-LABEL: m_offset_2048:124; LA32: # %bb.0:125; LA32-NEXT: addi.w $a0, $a0, 2047126; LA32-NEXT: addi.w $a0, $a0, 1127; LA32-NEXT: #APP128; LA32-NEXT: ld.w $a0, $a0, 0129; LA32-NEXT: #NO_APP130; LA32-NEXT: ret131;132; LA64-LABEL: m_offset_2048:133; LA64: # %bb.0:134; LA64-NEXT: addi.d $a0, $a0, 2047135; LA64-NEXT: addi.d $a0, $a0, 1136; LA64-NEXT: #APP137; LA64-NEXT: ld.w $a0, $a0, 0138; LA64-NEXT: #NO_APP139; LA64-NEXT: ret140 %1 = getelementptr inbounds i8, ptr %p, i32 2048141 %2 = call i32 asm "ld.w $0, $1", "=r,*m"(ptr elementtype(i32) %1)142 ret i32 %2143}144 145define i32 @m_constant_0() nounwind {146; LA32-LABEL: m_constant_0:147; LA32: # %bb.0:148; LA32-NEXT: pcalau12i $a0, %pc_hi20(.LCPI7_0)149; LA32-NEXT: #APP150; LA32-NEXT: #NO_APP151; LA32-NEXT: ret152;153; LA64-LABEL: m_constant_0:154; LA64: # %bb.0:155; LA64-NEXT: pcalau12i $a0, %pc_hi20(.LCPI7_0)156; LA64-NEXT: #APP157; LA64-NEXT: #NO_APP158; LA64-NEXT: ret159 %1 = call i32 asm sideeffect "", "=r,m"(i64 0)160 ret i32 %1161}162 163define i32 @m_constant_1() nounwind {164; LA32-LABEL: m_constant_1:165; LA32: # %bb.0:166; LA32-NEXT: pcalau12i $a0, %pc_hi20(.LCPI8_0)167; LA32-NEXT: #APP168; LA32-NEXT: ld.w $a0, $a0, %pc_lo12(.LCPI8_0)169; LA32-NEXT: #NO_APP170; LA32-NEXT: ret171;172; LA64-LABEL: m_constant_1:173; LA64: # %bb.0:174; LA64-NEXT: pcalau12i $a0, %pc_hi20(.LCPI8_0)175; LA64-NEXT: #APP176; LA64-NEXT: ld.w $a0, $a0, %pc_lo12(.LCPI8_0)177; LA64-NEXT: #NO_APP178; LA64-NEXT: ret179 %1 = call i32 asm sideeffect "ld.w $0, $1", "=r,m"(i64 1)180 ret i32 %1181}182 183@g_i32 = dso_local global i32 0184 185define i32 @m_addr_pcrel() nounwind {186; LA32-LABEL: m_addr_pcrel:187; LA32: # %bb.0:188; LA32-NEXT: pcalau12i $a1, %pc_hi20(g_i32)189; LA32-NEXT: #APP190; LA32-NEXT: ld.w $a0, $a1, %pc_lo12(g_i32)191; LA32-NEXT: #NO_APP192; LA32-NEXT: ret193;194; LA64-LABEL: m_addr_pcrel:195; LA64: # %bb.0:196; LA64-NEXT: pcalau12i $a1, %pc_hi20(g_i32)197; LA64-NEXT: #APP198; LA64-NEXT: ld.w $a0, $a1, %pc_lo12(g_i32)199; LA64-NEXT: #NO_APP200; LA64-NEXT: ret201 %1 = tail call i32 asm sideeffect "ld.w $0, $1", "=&r,*m"(ptr nonnull elementtype(i32) @g_i32)202 ret i32 %1203}204 205define i32 @m_addr_should_not_fold() nounwind {206; LA32-LABEL: m_addr_should_not_fold:207; LA32: # %bb.0:208; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i32)209; LA32-NEXT: addi.w $a1, $a0, %pc_lo12(g_i32)210; LA32-NEXT: #APP211; LA32-NEXT: ld.w $a0, $a1, 0212; LA32-NEXT: #NO_APP213; LA32-NEXT: ret214;215; LA64-LABEL: m_addr_should_not_fold:216; LA64: # %bb.0:217; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i32)218; LA64-NEXT: addi.d $a1, $a0, %pc_lo12(g_i32)219; LA64-NEXT: #APP220; LA64-NEXT: ld.w $a0, $a1, 0221; LA64-NEXT: #NO_APP222; LA64-NEXT: ret223 %1 = tail call i32 asm sideeffect "ld.w $0, $1, 0", "=&r,r,~{memory}"(ptr nonnull @g_i32)224 ret i32 %1225}226