brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.1 KiB · e5b3e92 Raw
346 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=thumbv8m.main %s -o - | FileCheck %s --check-prefix=CHECK-V8M3; RUN: llc -mtriple=armv8 %s -o - | FileCheck %s  --check-prefix=CHECK-V8A4 5define ptr @pre_inc_ldr(ptr %base, i32 %a) {6; CHECK-V8M-LABEL: pre_inc_ldr:7; CHECK-V8M:       @ %bb.0:8; CHECK-V8M-NEXT:    ldr r2, [r0, #4]!9; CHECK-V8M-NEXT:    add r1, r210; CHECK-V8M-NEXT:    str r1, [r0, #4]11; CHECK-V8M-NEXT:    bx lr12;13; CHECK-V8A-LABEL: pre_inc_ldr:14; CHECK-V8A:       @ %bb.0:15; CHECK-V8A-NEXT:    ldr r2, [r0, #4]!16; CHECK-V8A-NEXT:    add r1, r2, r117; CHECK-V8A-NEXT:    str r1, [r0, #4]18; CHECK-V8A-NEXT:    bx lr19  %addr = getelementptr i32, ptr %base, i32 120  %ld = load i32, ptr %addr21  %addr.1 = getelementptr i32, ptr %base, i32 222  %res = add i32 %ld, %a23  store i32 %res, ptr %addr.124  ret ptr %addr25}26 27define ptr @pre_dec_ldr(ptr %base, i32 %a) {28; CHECK-V8M-LABEL: pre_dec_ldr:29; CHECK-V8M:       @ %bb.0:30; CHECK-V8M-NEXT:    ldr r2, [r0, #-4]!31; CHECK-V8M-NEXT:    add r1, r232; CHECK-V8M-NEXT:    str r1, [r0, #12]33; CHECK-V8M-NEXT:    bx lr34;35; CHECK-V8A-LABEL: pre_dec_ldr:36; CHECK-V8A:       @ %bb.0:37; CHECK-V8A-NEXT:    ldr r2, [r0, #-4]!38; CHECK-V8A-NEXT:    add r1, r2, r139; CHECK-V8A-NEXT:    str r1, [r0, #12]40; CHECK-V8A-NEXT:    bx lr41  %addr = getelementptr i32, ptr %base, i32 -142  %ld = load i32, ptr %addr43  %addr.1 = getelementptr i32, ptr %base, i32 244  %res = add i32 %ld, %a45  store i32 %res, ptr %addr.146  ret ptr %addr47}48 49define ptr @post_inc_ldr(ptr %base, ptr %addr.2, i32 %a) {50; CHECK-V8M-LABEL: post_inc_ldr:51; CHECK-V8M:       @ %bb.0:52; CHECK-V8M-NEXT:    ldr r3, [r0], #453; CHECK-V8M-NEXT:    add r2, r354; CHECK-V8M-NEXT:    str r2, [r1]55; CHECK-V8M-NEXT:    bx lr56;57; CHECK-V8A-LABEL: post_inc_ldr:58; CHECK-V8A:       @ %bb.0:59; CHECK-V8A-NEXT:    ldr r3, [r0], #460; CHECK-V8A-NEXT:    add r2, r3, r261; CHECK-V8A-NEXT:    str r2, [r1]62; CHECK-V8A-NEXT:    bx lr63  %ld = load i32, ptr %base64  %addr.1 = getelementptr i32, ptr %base, i32 165  %res = add i32 %ld, %a66  store i32 %res, ptr %addr.267  ret ptr %addr.168}69 70define ptr @post_dec_ldr(ptr %base, ptr %addr.2, i32 %a) {71; CHECK-V8M-LABEL: post_dec_ldr:72; CHECK-V8M:       @ %bb.0:73; CHECK-V8M-NEXT:    ldr r3, [r0], #-474; CHECK-V8M-NEXT:    add r2, r375; CHECK-V8M-NEXT:    str r2, [r1]76; CHECK-V8M-NEXT:    bx lr77;78; CHECK-V8A-LABEL: post_dec_ldr:79; CHECK-V8A:       @ %bb.0:80; CHECK-V8A-NEXT:    ldr r3, [r0], #-481; CHECK-V8A-NEXT:    add r2, r3, r282; CHECK-V8A-NEXT:    str r2, [r1]83; CHECK-V8A-NEXT:    bx lr84  %ld = load i32, ptr %base85  %addr.1 = getelementptr i32, ptr %base, i32 -186  %res = add i32 %ld, %a87  store i32 %res, ptr %addr.288  ret ptr %addr.189}90 91define ptr @pre_inc_str(ptr %base, i32 %a, i32 %b) {92; CHECK-V8M-LABEL: pre_inc_str:93; CHECK-V8M:       @ %bb.0:94; CHECK-V8M-NEXT:    add r1, r295; CHECK-V8M-NEXT:    str r1, [r0, #4]!96; CHECK-V8M-NEXT:    bx lr97;98; CHECK-V8A-LABEL: pre_inc_str:99; CHECK-V8A:       @ %bb.0:100; CHECK-V8A-NEXT:    add r1, r1, r2101; CHECK-V8A-NEXT:    str r1, [r0, #4]!102; CHECK-V8A-NEXT:    bx lr103  %addr.1 = getelementptr i32, ptr %base, i32 1104  %res = add i32 %a, %b105  store i32 %res, ptr %addr.1106  ret ptr %addr.1107}108 109define ptr @pre_dec_str(ptr %base, i32 %a, i32 %b) {110; CHECK-V8M-LABEL: pre_dec_str:111; CHECK-V8M:       @ %bb.0:112; CHECK-V8M-NEXT:    add r1, r2113; CHECK-V8M-NEXT:    str r1, [r0, #-4]!114; CHECK-V8M-NEXT:    bx lr115;116; CHECK-V8A-LABEL: pre_dec_str:117; CHECK-V8A:       @ %bb.0:118; CHECK-V8A-NEXT:    add r1, r1, r2119; CHECK-V8A-NEXT:    str r1, [r0, #-4]!120; CHECK-V8A-NEXT:    bx lr121  %res = add i32 %a, %b122  %addr.1 = getelementptr i32, ptr %base, i32 -1123  store i32 %res, ptr %addr.1124  ret ptr %addr.1125}126 127define ptr @post_inc_str(ptr %base, i32 %a, i32 %b) {128; CHECK-V8M-LABEL: post_inc_str:129; CHECK-V8M:       @ %bb.0:130; CHECK-V8M-NEXT:    add r1, r2131; CHECK-V8M-NEXT:    str r1, [r0], #4132; CHECK-V8M-NEXT:    bx lr133;134; CHECK-V8A-LABEL: post_inc_str:135; CHECK-V8A:       @ %bb.0:136; CHECK-V8A-NEXT:    add r1, r1, r2137; CHECK-V8A-NEXT:    str r1, [r0], #4138; CHECK-V8A-NEXT:    bx lr139  %addr.1 = getelementptr i32, ptr %base, i32 1140  %res = add i32 %a, %b141  store i32 %res, ptr %base142  ret ptr %addr.1143}144 145define ptr @post_dec_str(ptr %base, i32 %a, i32 %b) {146; CHECK-V8M-LABEL: post_dec_str:147; CHECK-V8M:       @ %bb.0:148; CHECK-V8M-NEXT:    add r1, r2149; CHECK-V8M-NEXT:    str r1, [r0], #-4150; CHECK-V8M-NEXT:    bx lr151;152; CHECK-V8A-LABEL: post_dec_str:153; CHECK-V8A:       @ %bb.0:154; CHECK-V8A-NEXT:    add r1, r1, r2155; CHECK-V8A-NEXT:    str r1, [r0], #-4156; CHECK-V8A-NEXT:    bx lr157  %addr.1 = getelementptr i32, ptr %base, i32 -1158  %res = add i32 %a, %b159  store i32 %res, ptr %base160  ret ptr %addr.1161}162 163; TODO: Generate ldrd164define ptr @pre_inc_ldrd(ptr %base) {165; CHECK-V8M-LABEL: pre_inc_ldrd:166; CHECK-V8M:       @ %bb.0:167; CHECK-V8M-NEXT:    ldr r1, [r0, #4]!168; CHECK-V8M-NEXT:    ldr r2, [r0, #4]169; CHECK-V8M-NEXT:    add r1, r2170; CHECK-V8M-NEXT:    str r1, [r0, #8]171; CHECK-V8M-NEXT:    bx lr172;173; CHECK-V8A-LABEL: pre_inc_ldrd:174; CHECK-V8A:       @ %bb.0:175; CHECK-V8A-NEXT:    ldr r1, [r0, #4]!176; CHECK-V8A-NEXT:    ldr r2, [r0, #4]177; CHECK-V8A-NEXT:    add r1, r1, r2178; CHECK-V8A-NEXT:    str r1, [r0, #8]179; CHECK-V8A-NEXT:    bx lr180  %addr = getelementptr i32, ptr %base, i32 1181  %addr.1 = getelementptr i32, ptr %base, i32 2182  %addr.2 = getelementptr i32, ptr %base, i32 3183  %ld = load i32, ptr %addr184  %ld.1 = load i32, ptr %addr.1185  %res = add i32 %ld, %ld.1186  store i32 %res, ptr %addr.2187  ret ptr %addr188}189 190; TODO: Generate ldrd191define ptr @pre_dec_ldrd(ptr %base) {192; CHECK-V8M-LABEL: pre_dec_ldrd:193; CHECK-V8M:       @ %bb.0:194; CHECK-V8M-NEXT:    ldr r1, [r0, #-4]!195; CHECK-V8M-NEXT:    ldr r2, [r0, #-4]196; CHECK-V8M-NEXT:    add r1, r2197; CHECK-V8M-NEXT:    str r1, [r0, #-8]198; CHECK-V8M-NEXT:    bx lr199;200; CHECK-V8A-LABEL: pre_dec_ldrd:201; CHECK-V8A:       @ %bb.0:202; CHECK-V8A-NEXT:    ldr r1, [r0, #-4]!203; CHECK-V8A-NEXT:    ldr r2, [r0, #-4]204; CHECK-V8A-NEXT:    add r1, r1, r2205; CHECK-V8A-NEXT:    str r1, [r0, #-8]206; CHECK-V8A-NEXT:    bx lr207  %addr = getelementptr i32, ptr %base, i32 -1208  %addr.1 = getelementptr i32, ptr %base, i32 -2209  %addr.2 = getelementptr i32, ptr %base, i32 -3210  %ld = load i32, ptr %addr211  %ld.1 = load i32, ptr %addr.1212  %res = add i32 %ld, %ld.1213  store i32 %res, ptr %addr.2214  ret ptr %addr215}216 217; TODO: Generate post inc218define ptr @post_inc_ldrd(ptr %base, ptr %addr.3) {219; CHECK-V8M-LABEL: post_inc_ldrd:220; CHECK-V8M:       @ %bb.0:221; CHECK-V8M-NEXT:    ldrd r2, r3, [r0], #8222; CHECK-V8M-NEXT:    add r2, r3223; CHECK-V8M-NEXT:    str r2, [r1]224; CHECK-V8M-NEXT:    bx lr225;226; CHECK-V8A-LABEL: post_inc_ldrd:227; CHECK-V8A:       @ %bb.0:228; CHECK-V8A-NEXT:    ldrd r2, r3, [r0]229; CHECK-V8A-NEXT:    add r0, r0, #8230; CHECK-V8A-NEXT:    add r2, r2, r3231; CHECK-V8A-NEXT:    str r2, [r1]232; CHECK-V8A-NEXT:    bx lr233  %ld = load i32, ptr %base234  %addr.1 = getelementptr i32, ptr %base, i32 1235  %ld.1 = load i32, ptr %addr.1236  %addr.2 = getelementptr i32, ptr %base, i32 2237  %res = add i32 %ld, %ld.1238  store i32 %res, ptr %addr.3239  ret ptr %addr.2240}241 242define ptr @pre_inc_str_multi(ptr %base) {243; CHECK-V8M-LABEL: pre_inc_str_multi:244; CHECK-V8M:       @ %bb.0:245; CHECK-V8M-NEXT:    ldrd r1, r2, [r0]246; CHECK-V8M-NEXT:    add r1, r2247; CHECK-V8M-NEXT:    str r1, [r0, #8]!248; CHECK-V8M-NEXT:    bx lr249;250; CHECK-V8A-LABEL: pre_inc_str_multi:251; CHECK-V8A:       @ %bb.0:252; CHECK-V8A-NEXT:    ldrd r2, r3, [r0]253; CHECK-V8A-NEXT:    add r1, r2, r3254; CHECK-V8A-NEXT:    str r1, [r0, #8]!255; CHECK-V8A-NEXT:    bx lr256  %addr.1 = getelementptr i32, ptr %base, i32 1257  %ld = load i32, ptr %base258  %ld.1 = load i32, ptr %addr.1259  %res = add i32 %ld, %ld.1260  %addr.2 = getelementptr i32, ptr %base, i32 2261  store i32 %res, ptr %addr.2262  ret ptr %addr.2263}264 265define ptr @pre_dec_str_multi(ptr %base) {266; CHECK-V8M-LABEL: pre_dec_str_multi:267; CHECK-V8M:       @ %bb.0:268; CHECK-V8M-NEXT:    ldrd r1, r2, [r0]269; CHECK-V8M-NEXT:    add r1, r2270; CHECK-V8M-NEXT:    str r1, [r0, #-4]!271; CHECK-V8M-NEXT:    bx lr272;273; CHECK-V8A-LABEL: pre_dec_str_multi:274; CHECK-V8A:       @ %bb.0:275; CHECK-V8A-NEXT:    ldrd r2, r3, [r0]276; CHECK-V8A-NEXT:    add r1, r2, r3277; CHECK-V8A-NEXT:    str r1, [r0, #-4]!278; CHECK-V8A-NEXT:    bx lr279  %addr.1 = getelementptr i32, ptr %base, i32 1280  %ld = load i32, ptr %base281  %ld.1 = load i32, ptr %addr.1282  %res = add i32 %ld, %ld.1283  %addr.2 = getelementptr i32, ptr %base, i32 -1284  store i32 %res, ptr %addr.2285  ret ptr %addr.2286}287 288define ptr @illegal_pre_inc_store_1(ptr %base) {289; CHECK-V8M-LABEL: illegal_pre_inc_store_1:290; CHECK-V8M:       @ %bb.0: @ %entry291; CHECK-V8M-NEXT:    str r0, [r0, #8]292; CHECK-V8M-NEXT:    adds r0, #8293; CHECK-V8M-NEXT:    bx lr294;295; CHECK-V8A-LABEL: illegal_pre_inc_store_1:296; CHECK-V8A:       @ %bb.0: @ %entry297; CHECK-V8A-NEXT:    str r0, [r0, #8]298; CHECK-V8A-NEXT:    add r0, r0, #8299; CHECK-V8A-NEXT:    bx lr300entry:301  %ptr.to.use = getelementptr i32, ptr %base, i32 2302  %ptr.to.store = ptrtoint ptr %base to i32303  store i32 %ptr.to.store, ptr %ptr.to.use, align 4304  ret ptr %ptr.to.use305}306 307define ptr @legal_pre_inc_store_needs_copy_1(ptr %base) {308; CHECK-V8M-LABEL: legal_pre_inc_store_needs_copy_1:309; CHECK-V8M:       @ %bb.0: @ %entry310; CHECK-V8M-NEXT:    add.w r1, r0, #8311; CHECK-V8M-NEXT:    str r1, [r0, #8]312; CHECK-V8M-NEXT:    mov r0, r1313; CHECK-V8M-NEXT:    bx lr314;315; CHECK-V8A-LABEL: legal_pre_inc_store_needs_copy_1:316; CHECK-V8A:       @ %bb.0: @ %entry317; CHECK-V8A-NEXT:    add r1, r0, #8318; CHECK-V8A-NEXT:    str r1, [r0, #8]319; CHECK-V8A-NEXT:    mov r0, r1320; CHECK-V8A-NEXT:    bx lr321entry:322  %ptr.to.use = getelementptr i32, ptr %base, i32 2323  %ptr.to.store = ptrtoint ptr %ptr.to.use to i32324  store i32 %ptr.to.store, ptr %ptr.to.use, align 4325  ret ptr %ptr.to.use326}327 328define ptr @legal_pre_inc_store_needs_copy_2(i32 %base) {329; CHECK-V8M-LABEL: legal_pre_inc_store_needs_copy_2:330; CHECK-V8M:       @ %bb.0: @ %entry331; CHECK-V8M-NEXT:    str r0, [r0, #8]332; CHECK-V8M-NEXT:    adds r0, #8333; CHECK-V8M-NEXT:    bx lr334;335; CHECK-V8A-LABEL: legal_pre_inc_store_needs_copy_2:336; CHECK-V8A:       @ %bb.0: @ %entry337; CHECK-V8A-NEXT:    str r0, [r0, #8]338; CHECK-V8A-NEXT:    add r0, r0, #8339; CHECK-V8A-NEXT:    bx lr340entry:341  %ptr = inttoptr i32 %base to ptr342  %ptr.to.use = getelementptr i32, ptr %ptr, i32 2343  store i32 %base, ptr %ptr.to.use, align 4344  ret ptr %ptr.to.use345}346