| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: llc -mtriple=riscv32 -mattr=+xqcili,+relax -code-model=small \ |
| ; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefix=NO-C |
| ; RUN: llc -mtriple=riscv32 -mattr=+xqcili,+relax,+zca,+zcb -code-model=small \ |
| ; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefix=WITH-C |
| |
| @global = external global [8 x i8] |
| |
| define zeroext i8 @load_unsigned_byte() nounwind optsize { |
| ; NO-C-LABEL: load_unsigned_byte: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a0, global |
| ; NO-C-NEXT: lbu a0, 0(a0), %qc.access(global) |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: load_unsigned_byte: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a0, global |
| ; WITH-C-NEXT: c.lbu a0, 0(a0), %qc.access(global) |
| ; WITH-C-NEXT: ret |
| %1 = load i8, ptr @global, align 1 |
| ret i8 %1 |
| } |
| |
| define zeroext i8 @load_unsigned_byte_offset() nounwind optsize { |
| ; NO-C-LABEL: load_unsigned_byte_offset: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a0, global+1 |
| ; NO-C-NEXT: lbu a0, 0(a0), %qc.access(global+1) |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: load_unsigned_byte_offset: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a0, global+1 |
| ; WITH-C-NEXT: c.lbu a0, 0(a0), %qc.access(global+1) |
| ; WITH-C-NEXT: ret |
| %1 = getelementptr i8, ptr @global, i32 1 |
| %2 = load i8, ptr %1, align 1 |
| ret i8 %2 |
| } |
| |
| define zeroext i16 @load_two_unsigned_byte() nounwind optsize { |
| ; NO-C-LABEL: load_two_unsigned_byte: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a0, global |
| ; NO-C-NEXT: lbu a1, 1(a0) |
| ; NO-C-NEXT: lbu a0, 0(a0) |
| ; NO-C-NEXT: slli a1, a1, 8 |
| ; NO-C-NEXT: or a0, a0, a1 |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: load_two_unsigned_byte: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a0, global |
| ; WITH-C-NEXT: lbu a1, 1(a0) |
| ; WITH-C-NEXT: lbu a0, 0(a0) |
| ; WITH-C-NEXT: slli a1, a1, 8 |
| ; WITH-C-NEXT: or a0, a0, a1 |
| ; WITH-C-NEXT: ret |
| %1 = load i16, ptr @global, align 1 |
| ret i16 %1 |
| } |
| |
| define zeroext i8 @load_unsigned_byte_twice() nounwind optsize { |
| ; NO-C-LABEL: load_unsigned_byte_twice: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a0, global |
| ; NO-C-NEXT: lbu a1, 0(a0) |
| ; NO-C-NEXT: lbu a0, 0(a0) |
| ; NO-C-NEXT: or a0, a0, a1 |
| ; NO-C-NEXT: zext.b a0, a0 |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: load_unsigned_byte_twice: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a0, global |
| ; WITH-C-NEXT: lbu a1, 0(a0) |
| ; WITH-C-NEXT: lbu a0, 0(a0) |
| ; WITH-C-NEXT: or a0, a0, a1 |
| ; WITH-C-NEXT: zext.b a0, a0 |
| ; WITH-C-NEXT: ret |
| %1 = load volatile i8, ptr @global, align 1 |
| %2 = load volatile i8, ptr @global, align 1 |
| %3 = or i8 %1, %2 |
| ret i8 %3 |
| } |
| |
| define zeroext i8 @load_unsigned_byte_twice_offset() nounwind optsize { |
| ; NO-C-LABEL: load_unsigned_byte_twice_offset: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a0, global+1 |
| ; NO-C-NEXT: lbu a1, 0(a0) |
| ; NO-C-NEXT: lbu a0, 0(a0) |
| ; NO-C-NEXT: or a0, a0, a1 |
| ; NO-C-NEXT: zext.b a0, a0 |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: load_unsigned_byte_twice_offset: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a0, global+1 |
| ; WITH-C-NEXT: lbu a1, 0(a0) |
| ; WITH-C-NEXT: lbu a0, 0(a0) |
| ; WITH-C-NEXT: or a0, a0, a1 |
| ; WITH-C-NEXT: zext.b a0, a0 |
| ; WITH-C-NEXT: ret |
| %1 = getelementptr i8, ptr @global, i32 1 |
| %2 = load volatile i8, ptr %1, align 1 |
| %3 = load volatile i8, ptr %1, align 1 |
| %4 = or i8 %2, %3 |
| ret i8 %4 |
| } |
| |
| |
| define i16 @load_halfword() nounwind optsize { |
| ; NO-C-LABEL: load_halfword: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a0, global |
| ; NO-C-NEXT: lh a0, 0(a0), %qc.access(global) |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: load_halfword: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a0, global |
| ; WITH-C-NEXT: c.lh a0, 0(a0), %qc.access(global) |
| ; WITH-C-NEXT: ret |
| %1 = load i16, ptr @global, align 2 |
| ret i16 %1 |
| } |
| |
| define i16 @load_halfword_offset() nounwind optsize { |
| ; NO-C-LABEL: load_halfword_offset: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a0, global+2 |
| ; NO-C-NEXT: lh a0, 0(a0), %qc.access(global+2) |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: load_halfword_offset: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a0, global+2 |
| ; WITH-C-NEXT: c.lh a0, 0(a0), %qc.access(global+2) |
| ; WITH-C-NEXT: ret |
| %1 = getelementptr i8, ptr @global, i32 2 |
| %2 = load i16, ptr %1, align 2 |
| ret i16 %2 |
| } |
| |
| define i32 @load_two_halfword() nounwind optsize { |
| ; NO-C-LABEL: load_two_halfword: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a0, global |
| ; NO-C-NEXT: lhu a1, 2(a0) |
| ; NO-C-NEXT: lhu a0, 0(a0) |
| ; NO-C-NEXT: slli a1, a1, 16 |
| ; NO-C-NEXT: or a0, a0, a1 |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: load_two_halfword: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a0, global |
| ; WITH-C-NEXT: lhu a1, 2(a0) |
| ; WITH-C-NEXT: lhu a0, 0(a0) |
| ; WITH-C-NEXT: slli a1, a1, 16 |
| ; WITH-C-NEXT: or a0, a0, a1 |
| ; WITH-C-NEXT: ret |
| %1 = load i32, ptr @global, align 2 |
| ret i32 %1 |
| } |
| |
| define i16 @load_halfword_twice() nounwind optsize { |
| ; NO-C-LABEL: load_halfword_twice: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a0, global |
| ; NO-C-NEXT: lh a1, 0(a0) |
| ; NO-C-NEXT: lh a0, 0(a0) |
| ; NO-C-NEXT: or a0, a0, a1 |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: load_halfword_twice: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a0, global |
| ; WITH-C-NEXT: lh a1, 0(a0) |
| ; WITH-C-NEXT: lh a0, 0(a0) |
| ; WITH-C-NEXT: or a0, a0, a1 |
| ; WITH-C-NEXT: ret |
| %1 = load volatile i16, ptr @global, align 2 |
| %2 = load volatile i16, ptr @global, align 2 |
| %3 = or i16 %1, %2 |
| ret i16 %3 |
| } |
| |
| define i16 @load_halfword_twice_offset() nounwind optsize { |
| ; NO-C-LABEL: load_halfword_twice_offset: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a0, global+4 |
| ; NO-C-NEXT: lh a1, 0(a0) |
| ; NO-C-NEXT: lh a0, 0(a0) |
| ; NO-C-NEXT: or a0, a0, a1 |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: load_halfword_twice_offset: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a0, global+4 |
| ; WITH-C-NEXT: lh a1, 0(a0) |
| ; WITH-C-NEXT: lh a0, 0(a0) |
| ; WITH-C-NEXT: or a0, a0, a1 |
| ; WITH-C-NEXT: ret |
| %1 = getelementptr i16, ptr @global, i32 2 |
| %2 = load volatile i16, ptr %1, align 2 |
| %3 = load volatile i16, ptr %1, align 2 |
| %4 = or i16 %2, %3 |
| ret i16 %4 |
| } |
| |
| |
| |
| define i32 @load_word() nounwind optsize { |
| ; NO-C-LABEL: load_word: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a0, global |
| ; NO-C-NEXT: c.lw a0, 0(a0), %qc.access(global) |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: load_word: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a0, global |
| ; WITH-C-NEXT: c.lw a0, 0(a0), %qc.access(global) |
| ; WITH-C-NEXT: ret |
| %1 = load i32, ptr @global, align 4 |
| ret i32 %1 |
| } |
| |
| define i32 @load_word_offset() nounwind optsize { |
| ; NO-C-LABEL: load_word_offset: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a0, global+4 |
| ; NO-C-NEXT: c.lw a0, 0(a0), %qc.access(global+4) |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: load_word_offset: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a0, global+4 |
| ; WITH-C-NEXT: c.lw a0, 0(a0), %qc.access(global+4) |
| ; WITH-C-NEXT: ret |
| %1 = getelementptr i8, ptr @global, i32 4 |
| %2 = load i32, ptr %1, align 4 |
| ret i32 %2 |
| } |
| |
| define i64 @load_two_word() nounwind optsize { |
| ; NO-C-LABEL: load_two_word: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a1, global |
| ; NO-C-NEXT: lw a0, 0(a1) |
| ; NO-C-NEXT: lw a1, 4(a1) |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: load_two_word: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a1, global |
| ; WITH-C-NEXT: lw a0, 0(a1) |
| ; WITH-C-NEXT: lw a1, 4(a1) |
| ; WITH-C-NEXT: ret |
| %1 = load i64, ptr @global, align 4 |
| ret i64 %1 |
| } |
| |
| define i32 @load_word_twice() nounwind optsize { |
| ; NO-C-LABEL: load_word_twice: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a0, global |
| ; NO-C-NEXT: lw a1, 0(a0) |
| ; NO-C-NEXT: lw a0, 0(a0) |
| ; NO-C-NEXT: or a0, a0, a1 |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: load_word_twice: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a0, global |
| ; WITH-C-NEXT: lw a1, 0(a0) |
| ; WITH-C-NEXT: lw a0, 0(a0) |
| ; WITH-C-NEXT: or a0, a0, a1 |
| ; WITH-C-NEXT: ret |
| %1 = load volatile i32, ptr @global, align 4 |
| %2 = load volatile i32, ptr @global, align 4 |
| %3 = or i32 %1, %2 |
| ret i32 %3 |
| } |
| |
| define i32 @load_word_twice_offset() nounwind optsize { |
| ; NO-C-LABEL: load_word_twice_offset: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a0, global+8 |
| ; NO-C-NEXT: lw a1, 0(a0) |
| ; NO-C-NEXT: lw a0, 0(a0) |
| ; NO-C-NEXT: or a0, a0, a1 |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: load_word_twice_offset: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a0, global+8 |
| ; WITH-C-NEXT: lw a1, 0(a0) |
| ; WITH-C-NEXT: lw a0, 0(a0) |
| ; WITH-C-NEXT: or a0, a0, a1 |
| ; WITH-C-NEXT: ret |
| %1 = getelementptr i32, ptr @global, i32 2 |
| %2 = load volatile i32, ptr %1, align 4 |
| %3 = load volatile i32, ptr %1, align 4 |
| %4 = or i32 %2, %3 |
| ret i32 %4 |
| } |
| |
| define zeroext i8 @load_unsigned_byte_optnone() nounwind optnone noinline { |
| ; NO-C-LABEL: load_unsigned_byte_optnone: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a0, global |
| ; NO-C-NEXT: lbu a0, 0(a0) |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: load_unsigned_byte_optnone: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a0, global |
| ; WITH-C-NEXT: lbu a0, 0(a0) |
| ; WITH-C-NEXT: ret |
| %1 = load i8, ptr @global, align 1 |
| ret i8 %1 |
| } |
| |
| define void @store_byte(i8 %a) nounwind { |
| ; NO-C-LABEL: store_byte: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a1, global |
| ; NO-C-NEXT: sb a0, 0(a1), %qc.access(global) |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: store_byte: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a1, global |
| ; WITH-C-NEXT: c.sb a0, 0(a1), %qc.access(global) |
| ; WITH-C-NEXT: ret |
| store i8 %a, ptr @global, align 1 |
| ret void |
| } |
| |
| define void @store_byte_offset(i8 %a) nounwind { |
| ; NO-C-LABEL: store_byte_offset: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a1, global+1 |
| ; NO-C-NEXT: sb a0, 0(a1), %qc.access(global+1) |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: store_byte_offset: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a1, global+1 |
| ; WITH-C-NEXT: c.sb a0, 0(a1), %qc.access(global+1) |
| ; WITH-C-NEXT: ret |
| %1 = getelementptr i8, ptr @global, i32 1 |
| store i8 %a, ptr %1, align 1 |
| ret void |
| } |
| |
| define void @store_two_byte(i16 %a) nounwind { |
| ; NO-C-LABEL: store_two_byte: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a1, global |
| ; NO-C-NEXT: srli a2, a0, 8 |
| ; NO-C-NEXT: sb a0, 0(a1) |
| ; NO-C-NEXT: sb a2, 1(a1) |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: store_two_byte: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a1, global |
| ; WITH-C-NEXT: srli a2, a0, 8 |
| ; WITH-C-NEXT: sb a0, 0(a1) |
| ; WITH-C-NEXT: sb a2, 1(a1) |
| ; WITH-C-NEXT: ret |
| store i16 %a, ptr @global, align 1 |
| ret void |
| } |
| |
| define void @store_byte_twice(i8 %a) nounwind { |
| ; NO-C-LABEL: store_byte_twice: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a1, global |
| ; NO-C-NEXT: sb a0, 0(a1) |
| ; NO-C-NEXT: sb a0, 0(a1) |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: store_byte_twice: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a1, global |
| ; WITH-C-NEXT: sb a0, 0(a1) |
| ; WITH-C-NEXT: sb a0, 0(a1) |
| ; WITH-C-NEXT: ret |
| store volatile i8 %a, ptr @global, align 1 |
| store volatile i8 %a, ptr @global, align 1 |
| ret void |
| } |
| |
| define void @store_byte_twice_offset(i8 %a) nounwind { |
| ; NO-C-LABEL: store_byte_twice_offset: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a1, global+1 |
| ; NO-C-NEXT: sb a0, 0(a1) |
| ; NO-C-NEXT: sb a0, 0(a1) |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: store_byte_twice_offset: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a1, global+1 |
| ; WITH-C-NEXT: sb a0, 0(a1) |
| ; WITH-C-NEXT: sb a0, 0(a1) |
| ; WITH-C-NEXT: ret |
| %1 = getelementptr i8, ptr @global, i32 1 |
| store volatile i8 %a, ptr %1, align 1 |
| store volatile i8 %a, ptr %1, align 1 |
| ret void |
| } |
| |
| |
| define void @store_halfword(i16 %a) nounwind { |
| ; NO-C-LABEL: store_halfword: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a1, global |
| ; NO-C-NEXT: sh a0, 0(a1), %qc.access(global) |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: store_halfword: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a1, global |
| ; WITH-C-NEXT: c.sh a0, 0(a1), %qc.access(global) |
| ; WITH-C-NEXT: ret |
| store i16 %a, ptr @global, align 2 |
| ret void |
| } |
| |
| define void @store_halfword_offset(i16 %a) nounwind { |
| ; NO-C-LABEL: store_halfword_offset: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a1, global+2 |
| ; NO-C-NEXT: sh a0, 0(a1), %qc.access(global+2) |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: store_halfword_offset: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a1, global+2 |
| ; WITH-C-NEXT: c.sh a0, 0(a1), %qc.access(global+2) |
| ; WITH-C-NEXT: ret |
| %1 = getelementptr i8, ptr @global, i32 2 |
| store i16 %a, ptr %1, align 2 |
| ret void |
| } |
| |
| define void @store_two_halfword(i32 %a) nounwind { |
| ; NO-C-LABEL: store_two_halfword: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a1, global |
| ; NO-C-NEXT: srli a2, a0, 16 |
| ; NO-C-NEXT: sh a0, 0(a1) |
| ; NO-C-NEXT: sh a2, 2(a1) |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: store_two_halfword: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a1, global |
| ; WITH-C-NEXT: srli a2, a0, 16 |
| ; WITH-C-NEXT: sh a0, 0(a1) |
| ; WITH-C-NEXT: sh a2, 2(a1) |
| ; WITH-C-NEXT: ret |
| store i32 %a, ptr @global, align 2 |
| ret void |
| } |
| |
| define void @store_halfword_twice(i16 %a) nounwind { |
| ; NO-C-LABEL: store_halfword_twice: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a1, global |
| ; NO-C-NEXT: sh a0, 0(a1) |
| ; NO-C-NEXT: sh a0, 0(a1) |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: store_halfword_twice: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a1, global |
| ; WITH-C-NEXT: sh a0, 0(a1) |
| ; WITH-C-NEXT: sh a0, 0(a1) |
| ; WITH-C-NEXT: ret |
| store volatile i16 %a, ptr @global, align 2 |
| store volatile i16 %a, ptr @global, align 2 |
| ret void |
| } |
| |
| define void @store_halfword_twice_offset(i16 %a) nounwind { |
| ; NO-C-LABEL: store_halfword_twice_offset: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a1, global+4 |
| ; NO-C-NEXT: sh a0, 0(a1) |
| ; NO-C-NEXT: sh a0, 0(a1) |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: store_halfword_twice_offset: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a1, global+4 |
| ; WITH-C-NEXT: sh a0, 0(a1) |
| ; WITH-C-NEXT: sh a0, 0(a1) |
| ; WITH-C-NEXT: ret |
| %1 = getelementptr i16, ptr @global, i32 2 |
| store volatile i16 %a, ptr %1, align 2 |
| store volatile i16 %a, ptr %1, align 2 |
| ret void |
| } |
| |
| |
| define void @store_word(i32 %a) nounwind { |
| ; NO-C-LABEL: store_word: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a1, global |
| ; NO-C-NEXT: c.sw a0, 0(a1), %qc.access(global) |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: store_word: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a1, global |
| ; WITH-C-NEXT: c.sw a0, 0(a1), %qc.access(global) |
| ; WITH-C-NEXT: ret |
| store i32 %a, ptr @global, align 4 |
| ret void |
| } |
| |
| define void @store_word_offset(i32 %a) nounwind { |
| ; NO-C-LABEL: store_word_offset: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a1, global+4 |
| ; NO-C-NEXT: c.sw a0, 0(a1), %qc.access(global+4) |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: store_word_offset: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a1, global+4 |
| ; WITH-C-NEXT: c.sw a0, 0(a1), %qc.access(global+4) |
| ; WITH-C-NEXT: ret |
| %1 = getelementptr i32, ptr @global, i32 1 |
| store i32 %a, ptr %1, align 4 |
| ret void |
| } |
| |
| define void @store_two_word(i64 %a) nounwind { |
| ; NO-C-LABEL: store_two_word: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a2, global |
| ; NO-C-NEXT: sw a0, 0(a2) |
| ; NO-C-NEXT: sw a1, 4(a2) |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: store_two_word: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a2, global |
| ; WITH-C-NEXT: sw a0, 0(a2) |
| ; WITH-C-NEXT: sw a1, 4(a2) |
| ; WITH-C-NEXT: ret |
| store i64 %a, ptr @global, align 4 |
| ret void |
| } |
| |
| define void @store_word_twice(i32 %a) nounwind { |
| ; NO-C-LABEL: store_word_twice: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a1, global |
| ; NO-C-NEXT: sw a0, 0(a1) |
| ; NO-C-NEXT: sw a0, 0(a1) |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: store_word_twice: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a1, global |
| ; WITH-C-NEXT: sw a0, 0(a1) |
| ; WITH-C-NEXT: sw a0, 0(a1) |
| ; WITH-C-NEXT: ret |
| store volatile i32 %a, ptr @global, align 4 |
| store volatile i32 %a, ptr @global, align 4 |
| ret void |
| } |
| |
| define void @store_word_twice_offset(i32 %a) nounwind { |
| ; NO-C-LABEL: store_word_twice_offset: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a1, global+8 |
| ; NO-C-NEXT: sw a0, 0(a1) |
| ; NO-C-NEXT: sw a0, 0(a1) |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: store_word_twice_offset: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a1, global+8 |
| ; WITH-C-NEXT: sw a0, 0(a1) |
| ; WITH-C-NEXT: sw a0, 0(a1) |
| ; WITH-C-NEXT: ret |
| %1 = getelementptr i32, ptr @global, i32 2 |
| store volatile i32 %a, ptr %1, align 4 |
| store volatile i32 %a, ptr %1, align 4 |
| ret void |
| } |
| |
| define void @store_word_self() nounwind { |
| ; NO-C-LABEL: store_word_self: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a0, global |
| ; NO-C-NEXT: sw a0, 0(a0) |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: store_word_self: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a0, global |
| ; WITH-C-NEXT: sw a0, 0(a0) |
| ; WITH-C-NEXT: ret |
| store ptr @global, ptr @global, align 4 |
| ret void |
| } |
| |
| define void @store_word_self_offset() nounwind { |
| ; NO-C-LABEL: store_word_self_offset: |
| ; NO-C: # %bb.0: |
| ; NO-C-NEXT: qc.e.li a0, global |
| ; NO-C-NEXT: addi a1, a0, 4 |
| ; NO-C-NEXT: sw a1, 4(a0) |
| ; NO-C-NEXT: ret |
| ; |
| ; WITH-C-LABEL: store_word_self_offset: |
| ; WITH-C: # %bb.0: |
| ; WITH-C-NEXT: qc.e.li a0, global |
| ; WITH-C-NEXT: addi a1, a0, 4 |
| ; WITH-C-NEXT: sw a1, 4(a0) |
| ; WITH-C-NEXT: ret |
| %1 = getelementptr i32, ptr @global, i32 1 |
| store ptr %1, ptr %1, align 4 |
| ret void |
| } |