1; RUN: llc %s -mtriple=thumbv8m.main -o - | FileCheck %s --check-prefixes V8M-COMMON,V8M-LE 2; RUN: llc %s -mtriple=thumbebv8m.main -o - | FileCheck %s --check-prefixes V8M-COMMON,V8M-BE 3; RUN: llc %s -mtriple=thumbv8.1m.main -o - | FileCheck %s --check-prefixes V81M-COMMON,V81M-LE 4; RUN: llc %s -mtriple=thumbebv8.1m.main -o - | FileCheck %s --check-prefixes V81M-COMMON,V81M-BE 5 6@get_idx = hidden local_unnamed_addr global ptr null, align 4 7@arr = hidden local_unnamed_addr global [256 x i32] zeroinitializer, align 4 8 9define i32 @access_i16() { 10; V8M-COMMON-LABEL: access_i16: 11; V8M-COMMON: @ %bb.0: @ %entry 12; V8M-COMMON-NEXT: push {r7, lr} 13; V8M-COMMON-NEXT: movw r0, :lower16:get_idx 14; V8M-COMMON-NEXT: movt r0, :upper16:get_idx 15; V8M-COMMON-NEXT: ldr r0, [r0] 16; V8M-COMMON-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 17; V8M-COMMON-NEXT: bic r0, r0, #1 18; V8M-COMMON-NEXT: sub sp, #136 19; V8M-COMMON-NEXT: vlstm sp, {d0 - d15} 20; V8M-COMMON-NEXT: mov r1, r0 21; V8M-COMMON-NEXT: mov r2, r0 22; V8M-COMMON-NEXT: mov r3, r0 23; V8M-COMMON-NEXT: mov r4, r0 24; V8M-COMMON-NEXT: mov r5, r0 25; V8M-COMMON-NEXT: mov r6, r0 26; V8M-COMMON-NEXT: mov r7, r0 27; V8M-COMMON-NEXT: mov r8, r0 28; V8M-COMMON-NEXT: mov r9, r0 29; V8M-COMMON-NEXT: mov r10, r0 30; V8M-COMMON-NEXT: mov r11, r0 31; V8M-COMMON-NEXT: mov r12, r0 32; V8M-COMMON-NEXT: msr apsr_nzcvq, r0 33; V8M-COMMON-NEXT: blxns r0 34; V8M-COMMON-NEXT: vlldm sp, {d0 - d15} 35; V8M-COMMON-NEXT: add sp, #136 36; V8M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 37; V8M-COMMON-NEXT: movw r1, :lower16:arr 38; V8M-COMMON-NEXT: sxth r0, r0 39; V8M-COMMON-NEXT: movt r1, :upper16:arr 40; V8M-COMMON-NEXT: ldr.w r0, [r1, r0, lsl #2] 41; V8M-COMMON-NEXT: pop {r7, pc} 42; 43; V81M-COMMON-LABEL: access_i16: 44; V81M-COMMON: @ %bb.0: @ %entry 45; V81M-COMMON-NEXT: push {r7, lr} 46; V81M-COMMON-NEXT: movw r0, :lower16:get_idx 47; V81M-COMMON-NEXT: movt r0, :upper16:get_idx 48; V81M-COMMON-NEXT: ldr r0, [r0] 49; V81M-COMMON-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 50; V81M-COMMON-NEXT: bic r0, r0, #1 51; V81M-COMMON-NEXT: sub sp, #136 52; V81M-COMMON-NEXT: vlstm sp, {d0 - d15} 53; V81M-COMMON-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 54; V81M-COMMON-NEXT: blxns r0 55; V81M-COMMON-NEXT: vlldm sp, {d0 - d15} 56; V81M-COMMON-NEXT: add sp, #136 57; V81M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 58; V81M-COMMON-NEXT: movw r1, :lower16:arr 59; V81M-COMMON-NEXT: sxth r0, r0 60; V81M-COMMON-NEXT: movt r1, :upper16:arr 61; V81M-COMMON-NEXT: ldr.w r0, [r1, r0, lsl #2] 62; V81M-COMMON-NEXT: pop {r7, pc} 63entry: 64 %0 = load ptr, ptr @get_idx, align 4 65 %call = tail call signext i16 %0() "cmse_nonsecure_call" 66 %idxprom = sext i16 %call to i32 67 %arrayidx = getelementptr inbounds [256 x i32], ptr @arr, i32 0, i32 %idxprom 68 %1 = load i32, ptr %arrayidx, align 4 69 ret i32 %1 70} 71 72define i32 @access_u16() { 73; V8M-COMMON-LABEL: access_u16: 74; V8M-COMMON: @ %bb.0: @ %entry 75; V8M-COMMON-NEXT: push {r7, lr} 76; V8M-COMMON-NEXT: movw r0, :lower16:get_idx 77; V8M-COMMON-NEXT: movt r0, :upper16:get_idx 78; V8M-COMMON-NEXT: ldr r0, [r0] 79; V8M-COMMON-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 80; V8M-COMMON-NEXT: bic r0, r0, #1 81; V8M-COMMON-NEXT: sub sp, #136 82; V8M-COMMON-NEXT: vlstm sp, {d0 - d15} 83; V8M-COMMON-NEXT: mov r1, r0 84; V8M-COMMON-NEXT: mov r2, r0 85; V8M-COMMON-NEXT: mov r3, r0 86; V8M-COMMON-NEXT: mov r4, r0 87; V8M-COMMON-NEXT: mov r5, r0 88; V8M-COMMON-NEXT: mov r6, r0 89; V8M-COMMON-NEXT: mov r7, r0 90; V8M-COMMON-NEXT: mov r8, r0 91; V8M-COMMON-NEXT: mov r9, r0 92; V8M-COMMON-NEXT: mov r10, r0 93; V8M-COMMON-NEXT: mov r11, r0 94; V8M-COMMON-NEXT: mov r12, r0 95; V8M-COMMON-NEXT: msr apsr_nzcvq, r0 96; V8M-COMMON-NEXT: blxns r0 97; V8M-COMMON-NEXT: vlldm sp, {d0 - d15} 98; V8M-COMMON-NEXT: add sp, #136 99; V8M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 100; V8M-COMMON-NEXT: movw r1, :lower16:arr 101; V8M-COMMON-NEXT: uxth r0, r0 102; V8M-COMMON-NEXT: movt r1, :upper16:arr 103; V8M-COMMON-NEXT: ldr.w r0, [r1, r0, lsl #2] 104; V8M-COMMON-NEXT: pop {r7, pc} 105; 106; V81M-COMMON-LABEL: access_u16: 107; V81M-COMMON: @ %bb.0: @ %entry 108; V81M-COMMON-NEXT: push {r7, lr} 109; V81M-COMMON-NEXT: movw r0, :lower16:get_idx 110; V81M-COMMON-NEXT: movt r0, :upper16:get_idx 111; V81M-COMMON-NEXT: ldr r0, [r0] 112; V81M-COMMON-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 113; V81M-COMMON-NEXT: bic r0, r0, #1 114; V81M-COMMON-NEXT: sub sp, #136 115; V81M-COMMON-NEXT: vlstm sp, {d0 - d15} 116; V81M-COMMON-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 117; V81M-COMMON-NEXT: blxns r0 118; V81M-COMMON-NEXT: vlldm sp, {d0 - d15} 119; V81M-COMMON-NEXT: add sp, #136 120; V81M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 121; V81M-COMMON-NEXT: movw r1, :lower16:arr 122; V81M-COMMON-NEXT: uxth r0, r0 123; V81M-COMMON-NEXT: movt r1, :upper16:arr 124; V81M-COMMON-NEXT: ldr.w r0, [r1, r0, lsl #2] 125; V81M-COMMON-NEXT: pop {r7, pc} 126entry: 127 %0 = load ptr, ptr @get_idx, align 4 128 %call = tail call zeroext i16 %0() "cmse_nonsecure_call" 129 %idxprom = zext i16 %call to i32 130 %arrayidx = getelementptr inbounds [256 x i32], ptr @arr, i32 0, i32 %idxprom 131 %1 = load i32, ptr %arrayidx, align 4 132 ret i32 %1 133} 134 135define i32 @access_i8() { 136; V8M-COMMON-LABEL: access_i8: 137; V8M-COMMON: @ %bb.0: @ %entry 138; V8M-COMMON-NEXT: push {r7, lr} 139; V8M-COMMON-NEXT: movw r0, :lower16:get_idx 140; V8M-COMMON-NEXT: movt r0, :upper16:get_idx 141; V8M-COMMON-NEXT: ldr r0, [r0] 142; V8M-COMMON-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 143; V8M-COMMON-NEXT: bic r0, r0, #1 144; V8M-COMMON-NEXT: sub sp, #136 145; V8M-COMMON-NEXT: vlstm sp, {d0 - d15} 146; V8M-COMMON-NEXT: mov r1, r0 147; V8M-COMMON-NEXT: mov r2, r0 148; V8M-COMMON-NEXT: mov r3, r0 149; V8M-COMMON-NEXT: mov r4, r0 150; V8M-COMMON-NEXT: mov r5, r0 151; V8M-COMMON-NEXT: mov r6, r0 152; V8M-COMMON-NEXT: mov r7, r0 153; V8M-COMMON-NEXT: mov r8, r0 154; V8M-COMMON-NEXT: mov r9, r0 155; V8M-COMMON-NEXT: mov r10, r0 156; V8M-COMMON-NEXT: mov r11, r0 157; V8M-COMMON-NEXT: mov r12, r0 158; V8M-COMMON-NEXT: msr apsr_nzcvq, r0 159; V8M-COMMON-NEXT: blxns r0 160; V8M-COMMON-NEXT: vlldm sp, {d0 - d15} 161; V8M-COMMON-NEXT: add sp, #136 162; V8M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 163; V8M-COMMON-NEXT: movw r1, :lower16:arr 164; V8M-COMMON-NEXT: sxtb r0, r0 165; V8M-COMMON-NEXT: movt r1, :upper16:arr 166; V8M-COMMON-NEXT: ldr.w r0, [r1, r0, lsl #2] 167; V8M-COMMON-NEXT: pop {r7, pc} 168; 169; V81M-COMMON-LABEL: access_i8: 170; V81M-COMMON: @ %bb.0: @ %entry 171; V81M-COMMON-NEXT: push {r7, lr} 172; V81M-COMMON-NEXT: movw r0, :lower16:get_idx 173; V81M-COMMON-NEXT: movt r0, :upper16:get_idx 174; V81M-COMMON-NEXT: ldr r0, [r0] 175; V81M-COMMON-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 176; V81M-COMMON-NEXT: bic r0, r0, #1 177; V81M-COMMON-NEXT: sub sp, #136 178; V81M-COMMON-NEXT: vlstm sp, {d0 - d15} 179; V81M-COMMON-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 180; V81M-COMMON-NEXT: blxns r0 181; V81M-COMMON-NEXT: vlldm sp, {d0 - d15} 182; V81M-COMMON-NEXT: add sp, #136 183; V81M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 184; V81M-COMMON-NEXT: movw r1, :lower16:arr 185; V81M-COMMON-NEXT: sxtb r0, r0 186; V81M-COMMON-NEXT: movt r1, :upper16:arr 187; V81M-COMMON-NEXT: ldr.w r0, [r1, r0, lsl #2] 188; V81M-COMMON-NEXT: pop {r7, pc} 189entry: 190 %0 = load ptr, ptr @get_idx, align 4 191 %call = tail call signext i8 %0() "cmse_nonsecure_call" 192 %idxprom = sext i8 %call to i32 193 %arrayidx = getelementptr inbounds [256 x i32], ptr @arr, i32 0, i32 %idxprom 194 %1 = load i32, ptr %arrayidx, align 4 195 ret i32 %1 196} 197 198define i32 @access_u8() { 199; V8M-COMMON-LABEL: access_u8: 200; V8M-COMMON: @ %bb.0: @ %entry 201; V8M-COMMON-NEXT: push {r7, lr} 202; V8M-COMMON-NEXT: movw r0, :lower16:get_idx 203; V8M-COMMON-NEXT: movt r0, :upper16:get_idx 204; V8M-COMMON-NEXT: ldr r0, [r0] 205; V8M-COMMON-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 206; V8M-COMMON-NEXT: bic r0, r0, #1 207; V8M-COMMON-NEXT: sub sp, #136 208; V8M-COMMON-NEXT: vlstm sp, {d0 - d15} 209; V8M-COMMON-NEXT: mov r1, r0 210; V8M-COMMON-NEXT: mov r2, r0 211; V8M-COMMON-NEXT: mov r3, r0 212; V8M-COMMON-NEXT: mov r4, r0 213; V8M-COMMON-NEXT: mov r5, r0 214; V8M-COMMON-NEXT: mov r6, r0 215; V8M-COMMON-NEXT: mov r7, r0 216; V8M-COMMON-NEXT: mov r8, r0 217; V8M-COMMON-NEXT: mov r9, r0 218; V8M-COMMON-NEXT: mov r10, r0 219; V8M-COMMON-NEXT: mov r11, r0 220; V8M-COMMON-NEXT: mov r12, r0 221; V8M-COMMON-NEXT: msr apsr_nzcvq, r0 222; V8M-COMMON-NEXT: blxns r0 223; V8M-COMMON-NEXT: vlldm sp, {d0 - d15} 224; V8M-COMMON-NEXT: add sp, #136 225; V8M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 226; V8M-COMMON-NEXT: movw r1, :lower16:arr 227; V8M-COMMON-NEXT: uxtb r0, r0 228; V8M-COMMON-NEXT: movt r1, :upper16:arr 229; V8M-COMMON-NEXT: ldr.w r0, [r1, r0, lsl #2] 230; V8M-COMMON-NEXT: pop {r7, pc} 231; 232; V81M-COMMON-LABEL: access_u8: 233; V81M-COMMON: @ %bb.0: @ %entry 234; V81M-COMMON-NEXT: push {r7, lr} 235; V81M-COMMON-NEXT: movw r0, :lower16:get_idx 236; V81M-COMMON-NEXT: movt r0, :upper16:get_idx 237; V81M-COMMON-NEXT: ldr r0, [r0] 238; V81M-COMMON-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 239; V81M-COMMON-NEXT: bic r0, r0, #1 240; V81M-COMMON-NEXT: sub sp, #136 241; V81M-COMMON-NEXT: vlstm sp, {d0 - d15} 242; V81M-COMMON-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 243; V81M-COMMON-NEXT: blxns r0 244; V81M-COMMON-NEXT: vlldm sp, {d0 - d15} 245; V81M-COMMON-NEXT: add sp, #136 246; V81M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 247; V81M-COMMON-NEXT: movw r1, :lower16:arr 248; V81M-COMMON-NEXT: uxtb r0, r0 249; V81M-COMMON-NEXT: movt r1, :upper16:arr 250; V81M-COMMON-NEXT: ldr.w r0, [r1, r0, lsl #2] 251; V81M-COMMON-NEXT: pop {r7, pc} 252entry: 253 %0 = load ptr, ptr @get_idx, align 4 254 %call = tail call zeroext i8 %0() "cmse_nonsecure_call" 255 %idxprom = zext i8 %call to i32 256 %arrayidx = getelementptr inbounds [256 x i32], ptr @arr, i32 0, i32 %idxprom 257 %1 = load i32, ptr %arrayidx, align 4 258 ret i32 %1 259} 260 261define i32 @access_i1() { 262; V8M-COMMON-LABEL: access_i1: 263; V8M-COMMON: @ %bb.0: @ %entry 264; V8M-COMMON-NEXT: push {r7, lr} 265; V8M-COMMON-NEXT: movw r0, :lower16:get_idx 266; V8M-COMMON-NEXT: movt r0, :upper16:get_idx 267; V8M-COMMON-NEXT: ldr r0, [r0] 268; V8M-COMMON-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 269; V8M-COMMON-NEXT: bic r0, r0, #1 270; V8M-COMMON-NEXT: sub sp, #136 271; V8M-COMMON-NEXT: vlstm sp, {d0 - d15} 272; V8M-COMMON-NEXT: mov r1, r0 273; V8M-COMMON-NEXT: mov r2, r0 274; V8M-COMMON-NEXT: mov r3, r0 275; V8M-COMMON-NEXT: mov r4, r0 276; V8M-COMMON-NEXT: mov r5, r0 277; V8M-COMMON-NEXT: mov r6, r0 278; V8M-COMMON-NEXT: mov r7, r0 279; V8M-COMMON-NEXT: mov r8, r0 280; V8M-COMMON-NEXT: mov r9, r0 281; V8M-COMMON-NEXT: mov r10, r0 282; V8M-COMMON-NEXT: mov r11, r0 283; V8M-COMMON-NEXT: mov r12, r0 284; V8M-COMMON-NEXT: msr apsr_nzcvq, r0 285; V8M-COMMON-NEXT: blxns r0 286; V8M-COMMON-NEXT: vlldm sp, {d0 - d15} 287; V8M-COMMON-NEXT: add sp, #136 288; V8M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 289; V8M-COMMON-NEXT: movw r1, :lower16:arr 290; V8M-COMMON-NEXT: and r0, r0, #1 291; V8M-COMMON-NEXT: movt r1, :upper16:arr 292; V8M-COMMON-NEXT: ldr.w r0, [r1, r0, lsl #2] 293; V8M-COMMON-NEXT: pop {r7, pc} 294; 295; V81M-COMMON-LABEL: access_i1: 296; V81M-COMMON: @ %bb.0: @ %entry 297; V81M-COMMON-NEXT: push {r7, lr} 298; V81M-COMMON-NEXT: movw r0, :lower16:get_idx 299; V81M-COMMON-NEXT: movt r0, :upper16:get_idx 300; V81M-COMMON-NEXT: ldr r0, [r0] 301; V81M-COMMON-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 302; V81M-COMMON-NEXT: bic r0, r0, #1 303; V81M-COMMON-NEXT: sub sp, #136 304; V81M-COMMON-NEXT: vlstm sp, {d0 - d15} 305; V81M-COMMON-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 306; V81M-COMMON-NEXT: blxns r0 307; V81M-COMMON-NEXT: vlldm sp, {d0 - d15} 308; V81M-COMMON-NEXT: add sp, #136 309; V81M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 310; V81M-COMMON-NEXT: movw r1, :lower16:arr 311; V81M-COMMON-NEXT: and r0, r0, #1 312; V81M-COMMON-NEXT: movt r1, :upper16:arr 313; V81M-COMMON-NEXT: ldr.w r0, [r1, r0, lsl #2] 314; V81M-COMMON-NEXT: pop {r7, pc} 315entry: 316 %0 = load ptr, ptr @get_idx, align 4 317 %call = tail call zeroext i1 %0() "cmse_nonsecure_call" 318 %idxprom = zext i1 %call to i32 319 %arrayidx = getelementptr inbounds [256 x i32], ptr @arr, i32 0, i32 %idxprom 320 %1 = load i32, ptr %arrayidx, align 4 321 ret i32 %1 322} 323 324define i32 @access_i5() { 325; V8M-COMMON-LABEL: access_i5: 326; V8M-COMMON: @ %bb.0: @ %entry 327; V8M-COMMON-NEXT: push {r7, lr} 328; V8M-COMMON-NEXT: movw r0, :lower16:get_idx 329; V8M-COMMON-NEXT: movt r0, :upper16:get_idx 330; V8M-COMMON-NEXT: ldr r0, [r0] 331; V8M-COMMON-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 332; V8M-COMMON-NEXT: bic r0, r0, #1 333; V8M-COMMON-NEXT: sub sp, #136 334; V8M-COMMON-NEXT: vlstm sp, {d0 - d15} 335; V8M-COMMON-NEXT: mov r1, r0 336; V8M-COMMON-NEXT: mov r2, r0 337; V8M-COMMON-NEXT: mov r3, r0 338; V8M-COMMON-NEXT: mov r4, r0 339; V8M-COMMON-NEXT: mov r5, r0 340; V8M-COMMON-NEXT: mov r6, r0 341; V8M-COMMON-NEXT: mov r7, r0 342; V8M-COMMON-NEXT: mov r8, r0 343; V8M-COMMON-NEXT: mov r9, r0 344; V8M-COMMON-NEXT: mov r10, r0 345; V8M-COMMON-NEXT: mov r11, r0 346; V8M-COMMON-NEXT: mov r12, r0 347; V8M-COMMON-NEXT: msr apsr_nzcvq, r0 348; V8M-COMMON-NEXT: blxns r0 349; V8M-COMMON-NEXT: vlldm sp, {d0 - d15} 350; V8M-COMMON-NEXT: add sp, #136 351; V8M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 352; V8M-COMMON-NEXT: movw r1, :lower16:arr 353; V8M-COMMON-NEXT: sbfx r0, r0, #0, #5 354; V8M-COMMON-NEXT: movt r1, :upper16:arr 355; V8M-COMMON-NEXT: ldr.w r0, [r1, r0, lsl #2] 356; V8M-COMMON-NEXT: pop {r7, pc} 357; 358; V81M-COMMON-LABEL: access_i5: 359; V81M-COMMON: @ %bb.0: @ %entry 360; V81M-COMMON-NEXT: push {r7, lr} 361; V81M-COMMON-NEXT: movw r0, :lower16:get_idx 362; V81M-COMMON-NEXT: movt r0, :upper16:get_idx 363; V81M-COMMON-NEXT: ldr r0, [r0] 364; V81M-COMMON-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 365; V81M-COMMON-NEXT: bic r0, r0, #1 366; V81M-COMMON-NEXT: sub sp, #136 367; V81M-COMMON-NEXT: vlstm sp, {d0 - d15} 368; V81M-COMMON-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 369; V81M-COMMON-NEXT: blxns r0 370; V81M-COMMON-NEXT: vlldm sp, {d0 - d15} 371; V81M-COMMON-NEXT: add sp, #136 372; V81M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 373; V81M-COMMON-NEXT: movw r1, :lower16:arr 374; V81M-COMMON-NEXT: sbfx r0, r0, #0, #5 375; V81M-COMMON-NEXT: movt r1, :upper16:arr 376; V81M-COMMON-NEXT: ldr.w r0, [r1, r0, lsl #2] 377; V81M-COMMON-NEXT: pop {r7, pc} 378entry: 379 %0 = load ptr, ptr @get_idx, align 4 380 %call = tail call signext i5 %0() "cmse_nonsecure_call" 381 %idxprom = sext i5 %call to i32 382 %arrayidx = getelementptr inbounds [256 x i32], ptr @arr, i32 0, i32 %idxprom 383 %1 = load i32, ptr %arrayidx, align 4 384 ret i32 %1 385} 386 387define i32 @access_u5() { 388; V8M-COMMON-LABEL: access_u5: 389; V8M-COMMON: @ %bb.0: @ %entry 390; V8M-COMMON-NEXT: push {r7, lr} 391; V8M-COMMON-NEXT: movw r0, :lower16:get_idx 392; V8M-COMMON-NEXT: movt r0, :upper16:get_idx 393; V8M-COMMON-NEXT: ldr r0, [r0] 394; V8M-COMMON-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 395; V8M-COMMON-NEXT: bic r0, r0, #1 396; V8M-COMMON-NEXT: sub sp, #136 397; V8M-COMMON-NEXT: vlstm sp, {d0 - d15} 398; V8M-COMMON-NEXT: mov r1, r0 399; V8M-COMMON-NEXT: mov r2, r0 400; V8M-COMMON-NEXT: mov r3, r0 401; V8M-COMMON-NEXT: mov r4, r0 402; V8M-COMMON-NEXT: mov r5, r0 403; V8M-COMMON-NEXT: mov r6, r0 404; V8M-COMMON-NEXT: mov r7, r0 405; V8M-COMMON-NEXT: mov r8, r0 406; V8M-COMMON-NEXT: mov r9, r0 407; V8M-COMMON-NEXT: mov r10, r0 408; V8M-COMMON-NEXT: mov r11, r0 409; V8M-COMMON-NEXT: mov r12, r0 410; V8M-COMMON-NEXT: msr apsr_nzcvq, r0 411; V8M-COMMON-NEXT: blxns r0 412; V8M-COMMON-NEXT: vlldm sp, {d0 - d15} 413; V8M-COMMON-NEXT: add sp, #136 414; V8M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 415; V8M-COMMON-NEXT: movw r1, :lower16:arr 416; V8M-COMMON-NEXT: and r0, r0, #31 417; V8M-COMMON-NEXT: movt r1, :upper16:arr 418; V8M-COMMON-NEXT: ldr.w r0, [r1, r0, lsl #2] 419; V8M-COMMON-NEXT: pop {r7, pc} 420; 421; V81M-COMMON-LABEL: access_u5: 422; V81M-COMMON: @ %bb.0: @ %entry 423; V81M-COMMON-NEXT: push {r7, lr} 424; V81M-COMMON-NEXT: movw r0, :lower16:get_idx 425; V81M-COMMON-NEXT: movt r0, :upper16:get_idx 426; V81M-COMMON-NEXT: ldr r0, [r0] 427; V81M-COMMON-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 428; V81M-COMMON-NEXT: bic r0, r0, #1 429; V81M-COMMON-NEXT: sub sp, #136 430; V81M-COMMON-NEXT: vlstm sp, {d0 - d15} 431; V81M-COMMON-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 432; V81M-COMMON-NEXT: blxns r0 433; V81M-COMMON-NEXT: vlldm sp, {d0 - d15} 434; V81M-COMMON-NEXT: add sp, #136 435; V81M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 436; V81M-COMMON-NEXT: movw r1, :lower16:arr 437; V81M-COMMON-NEXT: and r0, r0, #31 438; V81M-COMMON-NEXT: movt r1, :upper16:arr 439; V81M-COMMON-NEXT: ldr.w r0, [r1, r0, lsl #2] 440; V81M-COMMON-NEXT: pop {r7, pc} 441entry: 442 %0 = load ptr, ptr @get_idx, align 4 443 %call = tail call zeroext i5 %0() "cmse_nonsecure_call" 444 %idxprom = zext i5 %call to i32 445 %arrayidx = getelementptr inbounds [256 x i32], ptr @arr, i32 0, i32 %idxprom 446 %1 = load i32, ptr %arrayidx, align 4 447 ret i32 %1 448} 449 450define i32 @access_i33(ptr %f) { 451; V8M-COMMON-LABEL: access_i33: 452; V8M-COMMON: @ %bb.0: @ %entry 453; V8M-COMMON-NEXT: push {r7, lr} 454; V8M-COMMON-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 455; V8M-COMMON-NEXT: bic r0, r0, #1 456; V8M-COMMON-NEXT: sub sp, #136 457; V8M-COMMON-NEXT: vlstm sp, {d0 - d15} 458; V8M-COMMON-NEXT: mov r1, r0 459; V8M-COMMON-NEXT: mov r2, r0 460; V8M-COMMON-NEXT: mov r3, r0 461; V8M-COMMON-NEXT: mov r4, r0 462; V8M-COMMON-NEXT: mov r5, r0 463; V8M-COMMON-NEXT: mov r6, r0 464; V8M-COMMON-NEXT: mov r7, r0 465; V8M-COMMON-NEXT: mov r8, r0 466; V8M-COMMON-NEXT: mov r9, r0 467; V8M-COMMON-NEXT: mov r10, r0 468; V8M-COMMON-NEXT: mov r11, r0 469; V8M-COMMON-NEXT: mov r12, r0 470; V8M-COMMON-NEXT: msr apsr_nzcvq, r0 471; V8M-COMMON-NEXT: blxns r0 472; V8M-COMMON-NEXT: vlldm sp, {d0 - d15} 473; V8M-COMMON-NEXT: add sp, #136 474; V8M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 475; V8M-LE-NEXT: and r0, r1, #1 476; V8M-BE-NEXT: and r0, r0, #1 477; V8M-COMMON-NEXT: rsb.w r0, r0, #0 478; V8M-COMMON-NEXT: pop {r7, pc} 479; 480; V81M-COMMON-LABEL: access_i33: 481; V81M-COMMON: @ %bb.0: @ %entry 482; V81M-COMMON-NEXT: push {r7, lr} 483; V81M-COMMON-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 484; V81M-COMMON-NEXT: bic r0, r0, #1 485; V81M-COMMON-NEXT: sub sp, #136 486; V81M-COMMON-NEXT: vlstm sp, {d0 - d15} 487; V81M-COMMON-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 488; V81M-COMMON-NEXT: blxns r0 489; V81M-COMMON-NEXT: vlldm sp, {d0 - d15} 490; V81M-COMMON-NEXT: add sp, #136 491; V81M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 492; V81M-LE-NEXT: and r0, r1, #1 493; V81M-BE-NEXT: and r0, r0, #1 494; V81M-COMMON-NEXT: rsb.w r0, r0, #0 495; V81M-COMMON-NEXT: pop {r7, pc} 496entry: 497 %call = tail call i33 %f() "cmse_nonsecure_call" 498 %shr = ashr i33 %call, 32 499 %conv = trunc nsw i33 %shr to i32 500 ret i32 %conv 501} 502 503define i32 @access_u33(ptr %f) { 504; V8M-COMMON-LABEL: access_u33: 505; V8M-COMMON: @ %bb.0: @ %entry 506; V8M-COMMON-NEXT: push {r7, lr} 507; V8M-COMMON-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 508; V8M-COMMON-NEXT: bic r0, r0, #1 509; V8M-COMMON-NEXT: sub sp, #136 510; V8M-COMMON-NEXT: vlstm sp, {d0 - d15} 511; V8M-COMMON-NEXT: mov r1, r0 512; V8M-COMMON-NEXT: mov r2, r0 513; V8M-COMMON-NEXT: mov r3, r0 514; V8M-COMMON-NEXT: mov r4, r0 515; V8M-COMMON-NEXT: mov r5, r0 516; V8M-COMMON-NEXT: mov r6, r0 517; V8M-COMMON-NEXT: mov r7, r0 518; V8M-COMMON-NEXT: mov r8, r0 519; V8M-COMMON-NEXT: mov r9, r0 520; V8M-COMMON-NEXT: mov r10, r0 521; V8M-COMMON-NEXT: mov r11, r0 522; V8M-COMMON-NEXT: mov r12, r0 523; V8M-COMMON-NEXT: msr apsr_nzcvq, r0 524; V8M-COMMON-NEXT: blxns r0 525; V8M-COMMON-NEXT: vlldm sp, {d0 - d15} 526; V8M-COMMON-NEXT: add sp, #136 527; V8M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 528; V8M-LE-NEXT: and r0, r1, #1 529; V8M-BE-NEXT: and r0, r0, #1 530; V8M-COMMON-NEXT: pop {r7, pc} 531; 532; V81M-COMMON-LABEL: access_u33: 533; V81M-COMMON: @ %bb.0: @ %entry 534; V81M-COMMON-NEXT: push {r7, lr} 535; V81M-COMMON-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 536; V81M-COMMON-NEXT: bic r0, r0, #1 537; V81M-COMMON-NEXT: sub sp, #136 538; V81M-COMMON-NEXT: vlstm sp, {d0 - d15} 539; V81M-COMMON-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 540; V81M-COMMON-NEXT: blxns r0 541; V81M-COMMON-NEXT: vlldm sp, {d0 - d15} 542; V81M-COMMON-NEXT: add sp, #136 543; V81M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 544; V81M-LE-NEXT: and r0, r1, #1 545; V81M-BE-NEXT: and r0, r0, #1 546; V81M-COMMON-NEXT: pop {r7, pc} 547entry: 548 %call = tail call i33 %f() "cmse_nonsecure_call" 549 %shr = lshr i33 %call, 32 550 %conv = trunc nuw nsw i33 %shr to i32 551 ret i32 %conv 552} 553