| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: llc -verify-machineinstrs -csky-no-aliases -mattr=+2e3 < %s -mtriple=csky | FileCheck %s |
| ; RUN: llc -verify-machineinstrs -csky-no-aliases < %s -mtriple=csky | FileCheck %s --check-prefix=GENERIC |
| |
| define signext i1 @load_I_bits(ptr nocapture readonly %a) local_unnamed_addr #0 { |
| ; CHECK-LABEL: load_I_bits: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: ld16.b a0, (a0, 3) |
| ; CHECK-NEXT: sext32 a0, a0, 0, 0 |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: load_I_bits: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: ld16.b a0, (a0, 3) |
| ; GENERIC-NEXT: lsli16 a0, a0, 7 |
| ; GENERIC-NEXT: asri16 a0, a0, 7 |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %arrayidx = getelementptr inbounds i1, ptr %a, i64 3 |
| %0 = load i1, ptr %arrayidx, align 1 |
| ret i1 %0 |
| } |
| |
| define zeroext i1 @load_I_bit_(ptr nocapture readonly %a) local_unnamed_addr #0 { |
| ; CHECK-LABEL: load_I_bit_: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: ld16.b a0, (a0, 3) |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: load_I_bit_: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: ld16.b a0, (a0, 3) |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %arrayidx = getelementptr inbounds i1, ptr %a, i64 3 |
| %0 = load i1, ptr %arrayidx, align 1 |
| ret i1 %0 |
| } |
| |
| define signext i8 @load_I_bs(ptr nocapture readonly %a) local_unnamed_addr #0 { |
| ; CHECK-LABEL: load_I_bs: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: ld32.bs a0, (a0, 3) |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: load_I_bs: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: ld16.b a0, (a0, 3) |
| ; GENERIC-NEXT: sextb16 a0, a0 |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %arrayidx = getelementptr inbounds i8, ptr %a, i64 3 |
| %0 = load i8, ptr %arrayidx, align 1 |
| ret i8 %0 |
| } |
| |
| define zeroext i8 @load_I_b_(ptr nocapture readonly %a) local_unnamed_addr #0 { |
| ; CHECK-LABEL: load_I_b_: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: ld16.b a0, (a0, 3) |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: load_I_b_: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: ld16.b a0, (a0, 3) |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %arrayidx = getelementptr inbounds i8, ptr %a, i64 3 |
| %0 = load i8, ptr %arrayidx, align 1 |
| ret i8 %0 |
| } |
| |
| define signext i16 @load_I_hs(ptr nocapture readonly %a) local_unnamed_addr #0 { |
| ; CHECK-LABEL: load_I_hs: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: ld32.hs a0, (a0, 6) |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: load_I_hs: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: ld16.h a0, (a0, 6) |
| ; GENERIC-NEXT: sexth16 a0, a0 |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %arrayidx = getelementptr inbounds i16, ptr %a, i64 3 |
| %0 = load i16, ptr %arrayidx, align 2 |
| ret i16 %0 |
| } |
| |
| define zeroext i16 @load_I_h_(ptr nocapture readonly %a) local_unnamed_addr #0 { |
| ; CHECK-LABEL: load_I_h_: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: ld16.h a0, (a0, 6) |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: load_I_h_: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: ld16.h a0, (a0, 6) |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %arrayidx = getelementptr inbounds i16, ptr %a, i64 3 |
| %0 = load i16, ptr %arrayidx, align 2 |
| ret i16 %0 |
| } |
| |
| define i32 @load_I_w(ptr nocapture readonly %a) local_unnamed_addr #0 { |
| ; CHECK-LABEL: load_I_w: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: ld16.w a0, (a0, 12) |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: load_I_w: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: ld16.w a0, (a0, 12) |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %arrayidx = getelementptr inbounds i32, ptr %a, i64 3 |
| %0 = load i32, ptr %arrayidx, align 4 |
| ret i32 %0 |
| } |
| |
| define i64 @load_I_d(ptr nocapture readonly %a) local_unnamed_addr #0 { |
| ; CHECK-LABEL: load_I_d: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: ld16.w a2, (a0, 24) |
| ; CHECK-NEXT: ld16.w a1, (a0, 28) |
| ; CHECK-NEXT: mov16 a0, a2 |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: load_I_d: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: ld16.w a2, (a0, 24) |
| ; GENERIC-NEXT: ld16.w a1, (a0, 28) |
| ; GENERIC-NEXT: mov16 a0, a2 |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %arrayidx = getelementptr inbounds i64, ptr %a, i64 3 |
| %0 = load i64, ptr %arrayidx, align 4 |
| ret i64 %0 |
| } |
| |
| define i8 @load_I_i8_anyext(ptr %p) { |
| ; CHECK-LABEL: load_I_i8_anyext: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: ld16.b a0, (a0, 0) |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: load_I_i8_anyext: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: ld16.b a0, (a0, 0) |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %ret = load i8, ptr %p, align 1 |
| ret i8 %ret |
| } |
| |
| define signext i1 @load_R_bits(ptr nocapture readonly %a, i32 %b) local_unnamed_addr #0 { |
| ; CHECK-LABEL: load_R_bits: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: ldr32.bs a0, (a0, a1 << 0) |
| ; CHECK-NEXT: sext32 a0, a0, 0, 0 |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: load_R_bits: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: addu16 a0, a0, a1 |
| ; GENERIC-NEXT: ld16.b a0, (a0, 0) |
| ; GENERIC-NEXT: lsli16 a0, a0, 7 |
| ; GENERIC-NEXT: asri16 a0, a0, 7 |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %idxprom = sext i32 %b to i64 |
| %arrayidx = getelementptr inbounds i1, ptr %a, i64 %idxprom |
| %0 = load i1, ptr %arrayidx, align 1 |
| ret i1 %0 |
| } |
| |
| define zeroext i1 @load_R_bit_(ptr nocapture readonly %a, i32 %b) local_unnamed_addr #0 { |
| ; CHECK-LABEL: load_R_bit_: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: ldr32.b a0, (a0, a1 << 0) |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: load_R_bit_: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: addu16 a0, a0, a1 |
| ; GENERIC-NEXT: ld16.b a0, (a0, 0) |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %idxprom = sext i32 %b to i64 |
| %arrayidx = getelementptr inbounds i1, ptr %a, i64 %idxprom |
| %0 = load i1, ptr %arrayidx, align 1 |
| ret i1 %0 |
| } |
| |
| |
| define signext i8 @load_R_bs(ptr nocapture readonly %a, i32 %b) local_unnamed_addr #0 { |
| ; CHECK-LABEL: load_R_bs: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: ldr32.bs a0, (a0, a1 << 0) |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: load_R_bs: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: addu16 a0, a0, a1 |
| ; GENERIC-NEXT: ld16.b a0, (a0, 0) |
| ; GENERIC-NEXT: sextb16 a0, a0 |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %idxprom = sext i32 %b to i64 |
| %arrayidx = getelementptr inbounds i8, ptr %a, i64 %idxprom |
| %0 = load i8, ptr %arrayidx, align 1 |
| ret i8 %0 |
| } |
| |
| define zeroext i8 @load_R_b_(ptr nocapture readonly %a, i32 %b) local_unnamed_addr #0 { |
| ; CHECK-LABEL: load_R_b_: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: ldr32.b a0, (a0, a1 << 0) |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: load_R_b_: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: addu16 a0, a0, a1 |
| ; GENERIC-NEXT: ld16.b a0, (a0, 0) |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %idxprom = sext i32 %b to i64 |
| %arrayidx = getelementptr inbounds i8, ptr %a, i64 %idxprom |
| %0 = load i8, ptr %arrayidx, align 1 |
| ret i8 %0 |
| } |
| |
| define signext i16 @load_R_hs(ptr nocapture readonly %a, i32 %b) local_unnamed_addr #0 { |
| ; CHECK-LABEL: load_R_hs: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: ldr32.hs a0, (a0, a1 << 1) |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: load_R_hs: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: lsli16 a1, a1, 1 |
| ; GENERIC-NEXT: addu16 a0, a0, a1 |
| ; GENERIC-NEXT: ld16.h a0, (a0, 0) |
| ; GENERIC-NEXT: sexth16 a0, a0 |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %idxprom = sext i32 %b to i64 |
| %arrayidx = getelementptr inbounds i16, ptr %a, i64 %idxprom |
| %0 = load i16, ptr %arrayidx, align 2 |
| ret i16 %0 |
| } |
| |
| define zeroext i16 @load_R_h_(ptr nocapture readonly %a, i32 %b) local_unnamed_addr #0 { |
| ; CHECK-LABEL: load_R_h_: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: ldr32.h a0, (a0, a1 << 1) |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: load_R_h_: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: lsli16 a1, a1, 1 |
| ; GENERIC-NEXT: addu16 a0, a0, a1 |
| ; GENERIC-NEXT: ld16.h a0, (a0, 0) |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %idxprom = sext i32 %b to i64 |
| %arrayidx = getelementptr inbounds i16, ptr %a, i64 %idxprom |
| %0 = load i16, ptr %arrayidx, align 2 |
| ret i16 %0 |
| } |
| |
| define i32 @load_R_w(ptr nocapture readonly %a, i32 %b) local_unnamed_addr #0 { |
| ; CHECK-LABEL: load_R_w: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: ldr32.w a0, (a0, a1 << 2) |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: load_R_w: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: lsli16 a1, a1, 2 |
| ; GENERIC-NEXT: addu16 a0, a0, a1 |
| ; GENERIC-NEXT: ld16.w a0, (a0, 0) |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %idxprom = sext i32 %b to i64 |
| %arrayidx = getelementptr inbounds i32, ptr %a, i64 %idxprom |
| %0 = load i32, ptr %arrayidx, align 4 |
| ret i32 %0 |
| } |
| |
| define i64 @load_R_d(ptr nocapture readonly %a, i32 %b) local_unnamed_addr #0 { |
| ; CHECK-LABEL: load_R_d: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: ixd32 a2, a0, a1 |
| ; CHECK-NEXT: ldr32.w a0, (a0, a1 << 3) |
| ; CHECK-NEXT: ld16.w a1, (a2, 4) |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: load_R_d: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: lsli16 a1, a1, 3 |
| ; GENERIC-NEXT: addu16 a1, a0, a1 |
| ; GENERIC-NEXT: ld16.w a0, (a1, 0) |
| ; GENERIC-NEXT: ld16.w a1, (a1, 4) |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %idxprom = sext i32 %b to i64 |
| %arrayidx = getelementptr inbounds i64, ptr %a, i64 %idxprom |
| %0 = load i64, ptr %arrayidx, align 4 |
| ret i64 %0 |
| } |
| |
| define i8 @loadR_i8_anyext(ptr %c, i32 %a) { |
| ; CHECK-LABEL: loadR_i8_anyext: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: ldr32.bs a0, (a0, a1 << 0) |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: loadR_i8_anyext: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: addu16 a0, a0, a1 |
| ; GENERIC-NEXT: ld16.b a0, (a0, 0) |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %idxprom = sext i32 %a to i64 |
| %arrayidx = getelementptr inbounds i8, ptr %c, i64 %idxprom |
| %0 = load i8, ptr %arrayidx, align 1 |
| ret i8 %0 |
| } |
| |
| define signext i1 @store_I_bits(ptr %a, i1 %b) local_unnamed_addr #0 { |
| ; CHECK-LABEL: store_I_bits: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: andi32 a1, a1, 1 |
| ; CHECK-NEXT: st16.b a1, (a0, 3) |
| ; CHECK-NEXT: movi16 a0, 0 |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: store_I_bits: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: movi16 a2, 1 |
| ; GENERIC-NEXT: and16 a2, a1 |
| ; GENERIC-NEXT: st16.b a2, (a0, 3) |
| ; GENERIC-NEXT: movi16 a0, 0 |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %arrayidx = getelementptr inbounds i1, ptr %a, i64 3 |
| store i1 %b, ptr %arrayidx, align 1 |
| ret i1 0 |
| } |
| |
| define zeroext i1 @store_I_bit_(ptr %a, i1 %b) local_unnamed_addr #0 { |
| ; CHECK-LABEL: store_I_bit_: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: andi32 a1, a1, 1 |
| ; CHECK-NEXT: st16.b a1, (a0, 3) |
| ; CHECK-NEXT: movi16 a0, 0 |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: store_I_bit_: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: movi16 a2, 1 |
| ; GENERIC-NEXT: and16 a2, a1 |
| ; GENERIC-NEXT: st16.b a2, (a0, 3) |
| ; GENERIC-NEXT: movi16 a0, 0 |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %arrayidx = getelementptr inbounds i1, ptr %a, i64 3 |
| store i1 %b, ptr %arrayidx, align 1 |
| ret i1 0 |
| } |
| |
| define signext i8 @store_I_bs(ptr %a, i8 %b) local_unnamed_addr #0 { |
| ; CHECK-LABEL: store_I_bs: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: st16.b a1, (a0, 3) |
| ; CHECK-NEXT: movi16 a0, 0 |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: store_I_bs: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: st16.b a1, (a0, 3) |
| ; GENERIC-NEXT: movi16 a0, 0 |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %arrayidx = getelementptr inbounds i8, ptr %a, i64 3 |
| store i8 %b, ptr %arrayidx, align 1 |
| ret i8 0 |
| } |
| |
| define zeroext i8 @store_I_b_(ptr %a, i8 %b) local_unnamed_addr #0 { |
| ; CHECK-LABEL: store_I_b_: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: st16.b a1, (a0, 3) |
| ; CHECK-NEXT: movi16 a0, 0 |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: store_I_b_: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: st16.b a1, (a0, 3) |
| ; GENERIC-NEXT: movi16 a0, 0 |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %arrayidx = getelementptr inbounds i8, ptr %a, i64 3 |
| store i8 %b, ptr %arrayidx, align 1 |
| ret i8 0 |
| } |
| |
| define signext i16 @store_I_hs(ptr %a, i16 %b) local_unnamed_addr #0 { |
| ; CHECK-LABEL: store_I_hs: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: st16.h a1, (a0, 6) |
| ; CHECK-NEXT: movi16 a0, 0 |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: store_I_hs: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: st16.h a1, (a0, 6) |
| ; GENERIC-NEXT: movi16 a0, 0 |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %arrayidx = getelementptr inbounds i16, ptr %a, i64 3 |
| store i16 %b, ptr %arrayidx, align 2 |
| ret i16 0 |
| } |
| |
| define zeroext i16 @store_I_h_(ptr %a, i16 %b) local_unnamed_addr #0 { |
| ; CHECK-LABEL: store_I_h_: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: st16.h a1, (a0, 6) |
| ; CHECK-NEXT: movi16 a0, 0 |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: store_I_h_: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: st16.h a1, (a0, 6) |
| ; GENERIC-NEXT: movi16 a0, 0 |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %arrayidx = getelementptr inbounds i16, ptr %a, i64 3 |
| store i16 %b, ptr %arrayidx, align 2 |
| ret i16 0 |
| } |
| |
| define i32 @store_I_w(ptr %a, i32 %b) local_unnamed_addr #0 { |
| ; CHECK-LABEL: store_I_w: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: st16.w a1, (a0, 12) |
| ; CHECK-NEXT: movi16 a0, 0 |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: store_I_w: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: st16.w a1, (a0, 12) |
| ; GENERIC-NEXT: movi16 a0, 0 |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %arrayidx = getelementptr inbounds i32, ptr %a, i64 3 |
| store i32 %b, ptr %arrayidx, align 4 |
| ret i32 0 |
| } |
| |
| define i64 @store_I_d(ptr %a, i64 %b) local_unnamed_addr #0 { |
| ; CHECK-LABEL: store_I_d: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: st16.w a2, (a0, 28) |
| ; CHECK-NEXT: st16.w a1, (a0, 24) |
| ; CHECK-NEXT: movi16 a0, 0 |
| ; CHECK-NEXT: movi16 a1, 0 |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: store_I_d: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: st16.w a2, (a0, 28) |
| ; GENERIC-NEXT: st16.w a1, (a0, 24) |
| ; GENERIC-NEXT: movi16 a0, 0 |
| ; GENERIC-NEXT: movi16 a1, 0 |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %arrayidx = getelementptr inbounds i64, ptr %a, i64 3 |
| store i64 %b, ptr %arrayidx, align 4 |
| ret i64 0 |
| } |
| |
| define i8 @store_I_i8_anyext(ptr %p, i8 %b) { |
| ; CHECK-LABEL: store_I_i8_anyext: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: st16.b a1, (a0, 0) |
| ; CHECK-NEXT: movi16 a0, 0 |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: store_I_i8_anyext: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: st16.b a1, (a0, 0) |
| ; GENERIC-NEXT: movi16 a0, 0 |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| store i8 %b, ptr %p, align 1 |
| ret i8 0 |
| } |
| |
| define signext i1 @store_R_bits(ptr %a, i32 %b, i1 %c) local_unnamed_addr #0 { |
| ; CHECK-LABEL: store_R_bits: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: andi32 a2, a2, 1 |
| ; CHECK-NEXT: str32.b a2, (a0, a1 << 0) |
| ; CHECK-NEXT: movi16 a0, 0 |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: store_R_bits: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: addu16 a0, a0, a1 |
| ; GENERIC-NEXT: movi16 a1, 1 |
| ; GENERIC-NEXT: and16 a1, a2 |
| ; GENERIC-NEXT: st16.b a1, (a0, 0) |
| ; GENERIC-NEXT: movi16 a0, 0 |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %idxprom = sext i32 %b to i64 |
| %arrayidx = getelementptr inbounds i1, ptr %a, i64 %idxprom |
| store i1 %c, ptr %arrayidx, align 1 |
| ret i1 0 |
| } |
| |
| define zeroext i1 @store_R_bit_(ptr %a, i32 %b, i1 %c) local_unnamed_addr #0 { |
| ; CHECK-LABEL: store_R_bit_: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: andi32 a2, a2, 1 |
| ; CHECK-NEXT: str32.b a2, (a0, a1 << 0) |
| ; CHECK-NEXT: movi16 a0, 0 |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: store_R_bit_: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: addu16 a0, a0, a1 |
| ; GENERIC-NEXT: movi16 a1, 1 |
| ; GENERIC-NEXT: and16 a1, a2 |
| ; GENERIC-NEXT: st16.b a1, (a0, 0) |
| ; GENERIC-NEXT: movi16 a0, 0 |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %idxprom = sext i32 %b to i64 |
| %arrayidx = getelementptr inbounds i1, ptr %a, i64 %idxprom |
| store i1 %c, ptr %arrayidx, align 1 |
| ret i1 0 |
| } |
| |
| |
| define signext i8 @store_R_bs(ptr %a, i32 %b, i8 %c) local_unnamed_addr #0 { |
| ; CHECK-LABEL: store_R_bs: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: str32.b a2, (a0, a1 << 0) |
| ; CHECK-NEXT: movi16 a0, 0 |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: store_R_bs: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: addu16 a0, a0, a1 |
| ; GENERIC-NEXT: st16.b a2, (a0, 0) |
| ; GENERIC-NEXT: movi16 a0, 0 |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %idxprom = sext i32 %b to i64 |
| %arrayidx = getelementptr inbounds i8, ptr %a, i64 %idxprom |
| store i8 %c, ptr %arrayidx, align 1 |
| ret i8 0 |
| } |
| |
| define zeroext i8 @store_R_b_(ptr %a, i32 %b, i8 %c) local_unnamed_addr #0 { |
| ; CHECK-LABEL: store_R_b_: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: str32.b a2, (a0, a1 << 0) |
| ; CHECK-NEXT: movi16 a0, 0 |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: store_R_b_: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: addu16 a0, a0, a1 |
| ; GENERIC-NEXT: st16.b a2, (a0, 0) |
| ; GENERIC-NEXT: movi16 a0, 0 |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %idxprom = sext i32 %b to i64 |
| %arrayidx = getelementptr inbounds i8, ptr %a, i64 %idxprom |
| store i8 %c, ptr %arrayidx, align 1 |
| ret i8 0 |
| } |
| |
| define signext i16 @store_R_hs(ptr %a, i32 %b, i16 %c) local_unnamed_addr #0 { |
| ; CHECK-LABEL: store_R_hs: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: str32.h a2, (a0, a1 << 1) |
| ; CHECK-NEXT: movi16 a0, 0 |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: store_R_hs: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: lsli16 a1, a1, 1 |
| ; GENERIC-NEXT: addu16 a0, a0, a1 |
| ; GENERIC-NEXT: st16.h a2, (a0, 0) |
| ; GENERIC-NEXT: movi16 a0, 0 |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %idxprom = sext i32 %b to i64 |
| %arrayidx = getelementptr inbounds i16, ptr %a, i64 %idxprom |
| store i16 %c, ptr %arrayidx, align 2 |
| ret i16 0 |
| } |
| |
| define zeroext i16 @store_R_h_(ptr %a, i32 %b, i16 %c) local_unnamed_addr #0 { |
| ; CHECK-LABEL: store_R_h_: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: str32.h a2, (a0, a1 << 1) |
| ; CHECK-NEXT: movi16 a0, 0 |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: store_R_h_: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: lsli16 a1, a1, 1 |
| ; GENERIC-NEXT: addu16 a0, a0, a1 |
| ; GENERIC-NEXT: st16.h a2, (a0, 0) |
| ; GENERIC-NEXT: movi16 a0, 0 |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %idxprom = sext i32 %b to i64 |
| %arrayidx = getelementptr inbounds i16, ptr %a, i64 %idxprom |
| store i16 %c, ptr %arrayidx, align 2 |
| ret i16 0 |
| } |
| |
| define i32 @store_R_w(ptr %a, i32 %b, i32 %c) local_unnamed_addr #0 { |
| ; CHECK-LABEL: store_R_w: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: str32.w a2, (a0, a1 << 2) |
| ; CHECK-NEXT: movi16 a0, 0 |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: store_R_w: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: lsli16 a1, a1, 2 |
| ; GENERIC-NEXT: addu16 a0, a0, a1 |
| ; GENERIC-NEXT: st16.w a2, (a0, 0) |
| ; GENERIC-NEXT: movi16 a0, 0 |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %idxprom = sext i32 %b to i64 |
| %arrayidx = getelementptr inbounds i32, ptr %a, i64 %idxprom |
| store i32 %c, ptr %arrayidx, align 4 |
| ret i32 0 |
| } |
| |
| define i64 @store_R_d(ptr %a, i32 %b, i64 %c) local_unnamed_addr #0 { |
| ; CHECK-LABEL: store_R_d: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: ixd32 t0, a0, a1 |
| ; CHECK-NEXT: str32.w a2, (a0, a1 << 3) |
| ; CHECK-NEXT: st32.w a3, (t0, 4) |
| ; CHECK-NEXT: movi16 a0, 0 |
| ; CHECK-NEXT: movi16 a1, 0 |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: store_R_d: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: lsli16 a1, a1, 3 |
| ; GENERIC-NEXT: addu16 a0, a0, a1 |
| ; GENERIC-NEXT: st16.w a3, (a0, 4) |
| ; GENERIC-NEXT: st16.w a2, (a0, 0) |
| ; GENERIC-NEXT: movi16 a0, 0 |
| ; GENERIC-NEXT: movi16 a1, 0 |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %idxprom = sext i32 %b to i64 |
| %arrayidx = getelementptr inbounds i64, ptr %a, i64 %idxprom |
| store i64 %c, ptr %arrayidx, align 4 |
| ret i64 0 |
| } |
| |
| define i8 @storeR_i8_anyext(ptr %c, i32 %a, i8 %d) { |
| ; CHECK-LABEL: storeR_i8_anyext: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: str32.b a2, (a0, a1 << 0) |
| ; CHECK-NEXT: movi16 a0, 0 |
| ; CHECK-NEXT: rts16 |
| ; |
| ; GENERIC-LABEL: storeR_i8_anyext: |
| ; GENERIC: # %bb.0: # %entry |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 0 |
| ; GENERIC-NEXT: subi16 sp, sp, 4 |
| ; GENERIC-NEXT: .cfi_def_cfa_offset 4 |
| ; GENERIC-NEXT: addu16 a0, a0, a1 |
| ; GENERIC-NEXT: st16.b a2, (a0, 0) |
| ; GENERIC-NEXT: movi16 a0, 0 |
| ; GENERIC-NEXT: addi16 sp, sp, 4 |
| ; GENERIC-NEXT: rts16 |
| entry: |
| %idxprom = sext i32 %a to i64 |
| %arrayidx = getelementptr inbounds i8, ptr %c, i64 %idxprom |
| store i8 %d, ptr %arrayidx, align 1 |
| ret i8 0 |
| } |