blob: d8217fa397a3c340af1581cb476f599699b77596 [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
; RUN: llc < %s -verify-machineinstrs -mtriple=riscv32 -mattr=+a | FileCheck %s --check-prefixes=RV32I
; RUN: llc < %s -verify-machineinstrs -mtriple=riscv64 -mattr=+a | FileCheck %s --check-prefixes=RV64I
; RUN: llc < %s -verify-machineinstrs -mtriple=riscv32 -mattr=+a,+short-forward-branch-ialu | \
; RUN: FileCheck %s --check-prefixes=RV32I-SFB
; RUN: llc < %s -verify-machineinstrs -mtriple=riscv64 -mattr=+a,+short-forward-branch-ialu | \
; RUN: FileCheck %s --check-prefixes=RV64I-SFB
; RUN: llc < %s -verify-machineinstrs -mtriple=riscv32 -mattr=+a,+short-forward-branch-iload | \
; RUN: FileCheck %s --check-prefixes=RV32I-SFBILOAD
; RUN: llc < %s -verify-machineinstrs -mtriple=riscv64 -mattr=+a,+short-forward-branch-iload | \
; RUN: FileCheck %s --check-prefixes=RV64I-SFBILOAD
define i32 @test_i8_s_3(ptr %base, i1 zeroext %x, i32 %b) nounwind {
; RV32I-LABEL: test_i8_s_3:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: lb a0, 4(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: bnez a1, .LBB0_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: .LBB0_2: # %entry
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i8_s_3:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: lb a0, 4(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: bnez a1, .LBB0_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB0_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i8_s_3:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: lb a0, 4(a0)
; RV32I-SFB-NEXT: bnez a1, .LBB0_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: .LBB0_2: # %entry
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i8_s_3:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: lb a0, 4(a0)
; RV64I-SFB-NEXT: bnez a1, .LBB0_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB0_2: # %entry
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i8_s_3:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: lb a0, 4(a0)
; RV32I-SFBILOAD-NEXT: bnez a1, .LBB0_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: .LBB0_2: # %entry
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i8_s_3:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: lb a0, 4(a0)
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB0_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB0_2: # %entry
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i8, ptr %base, i32 4 ; compute base + 4
%val = load atomic i8, ptr %addr acquire, align 1 ; load 8-bit value
%ext = sext i8 %val to i32 ; sign-extend to 32 bits
%res = select i1 %x, i32 %ext, i32 %b
ret i32 %res
}
define i32 @test_i8_z_3(ptr %base, i1 zeroext %x, i32 %b) nounwind {
; RV32I-LABEL: test_i8_z_3:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: lbu a0, 4(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: bnez a1, .LBB1_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: .LBB1_2: # %entry
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i8_z_3:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: lbu a0, 4(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: bnez a1, .LBB1_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB1_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i8_z_3:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: lbu a0, 4(a0)
; RV32I-SFB-NEXT: bnez a1, .LBB1_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: .LBB1_2: # %entry
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i8_z_3:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: lbu a0, 4(a0)
; RV64I-SFB-NEXT: bnez a1, .LBB1_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB1_2: # %entry
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i8_z_3:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: lbu a0, 4(a0)
; RV32I-SFBILOAD-NEXT: bnez a1, .LBB1_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: .LBB1_2: # %entry
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i8_z_3:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: lbu a0, 4(a0)
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB1_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB1_2: # %entry
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i8, ptr %base, i32 4 ; compute base + 4
%val = load atomic i8, ptr %addr acquire, align 1 ; load 8-bit value
%ext = zext i8 %val to i32 ; zero-extend to 32 bits
%res = select i1 %x, i32 %ext, i32 %b
ret i32 %res
}
define i32 @test_i16_s_3(ptr %base, i1 zeroext %x, i32 %b) nounwind {
; RV32I-LABEL: test_i16_s_3:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: lh a0, 8(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: bnez a1, .LBB2_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: .LBB2_2: # %entry
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i16_s_3:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: lh a0, 8(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: bnez a1, .LBB2_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB2_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i16_s_3:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: lh a0, 8(a0)
; RV32I-SFB-NEXT: bnez a1, .LBB2_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: .LBB2_2: # %entry
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i16_s_3:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: lh a0, 8(a0)
; RV64I-SFB-NEXT: bnez a1, .LBB2_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB2_2: # %entry
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i16_s_3:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: lh a0, 8(a0)
; RV32I-SFBILOAD-NEXT: bnez a1, .LBB2_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: .LBB2_2: # %entry
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i16_s_3:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: lh a0, 8(a0)
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB2_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB2_2: # %entry
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i16, ptr %base, i32 4 ; compute base + 4
%val = load atomic i16, ptr %addr acquire, align 2 ; load 16-bit value
%ext = sext i16 %val to i32 ; sign-extend to 32 bits
%res = select i1 %x, i32 %ext, i32 %b
ret i32 %res
}
define i32 @test_i16_z_3(ptr %base, i1 zeroext %x, i32 %b) nounwind {
; RV32I-LABEL: test_i16_z_3:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: lhu a0, 8(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: bnez a1, .LBB3_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: .LBB3_2: # %entry
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i16_z_3:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: lhu a0, 8(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: bnez a1, .LBB3_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB3_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i16_z_3:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: lhu a0, 8(a0)
; RV32I-SFB-NEXT: bnez a1, .LBB3_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: .LBB3_2: # %entry
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i16_z_3:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: lhu a0, 8(a0)
; RV64I-SFB-NEXT: bnez a1, .LBB3_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB3_2: # %entry
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i16_z_3:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: lhu a0, 8(a0)
; RV32I-SFBILOAD-NEXT: bnez a1, .LBB3_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: .LBB3_2: # %entry
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i16_z_3:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: lhu a0, 8(a0)
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB3_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB3_2: # %entry
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i16, ptr %base, i32 4 ; compute base + 4
%val = load atomic i16, ptr %addr acquire, align 2 ; load 16-bit value
%ext = zext i16 %val to i32 ; zero-extend to 32 bits
%res = select i1 %x, i32 %ext, i32 %b
ret i32 %res
}
define i32 @test_i32_3(ptr %base, i1 zeroext %x, i32 %b) nounwind {
; RV32I-LABEL: test_i32_3:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: lw a0, 16(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: bnez a1, .LBB4_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: .LBB4_2: # %entry
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i32_3:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: lw a0, 16(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: bnez a1, .LBB4_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB4_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i32_3:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: lw a0, 16(a0)
; RV32I-SFB-NEXT: bnez a1, .LBB4_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: .LBB4_2: # %entry
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i32_3:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: lw a0, 16(a0)
; RV64I-SFB-NEXT: bnez a1, .LBB4_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB4_2: # %entry
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i32_3:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: lw a0, 16(a0)
; RV32I-SFBILOAD-NEXT: bnez a1, .LBB4_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: .LBB4_2: # %entry
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i32_3:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: lw a0, 16(a0)
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB4_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB4_2: # %entry
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i32, ptr %base, i32 4 ; compute base + 4
%val = load atomic i32, ptr %addr acquire, align 4 ; load 32-bit value
%res = select i1 %x, i32 %val, i32 %b
ret i32 %res
}
define i32 @test_i8_s_store_3(ptr %base, i1 zeroext %x, i32 %b, ptr %base1, i32 %c) nounwind {
; RV32I-LABEL: test_i8_s_store_3:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: lb a0, 4(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: sw a4, 0(a3)
; RV32I-NEXT: bnez a1, .LBB5_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: .LBB5_2: # %entry
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i8_s_store_3:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: lb a0, 4(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: sw a4, 0(a3)
; RV64I-NEXT: bnez a1, .LBB5_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB5_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i8_s_store_3:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: lb a0, 4(a0)
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: bnez a1, .LBB5_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: .LBB5_2: # %entry
; RV32I-SFB-NEXT: sw a4, 0(a3)
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i8_s_store_3:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: lb a0, 4(a0)
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: bnez a1, .LBB5_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB5_2: # %entry
; RV64I-SFB-NEXT: sw a4, 0(a3)
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i8_s_store_3:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: lb a0, 4(a0)
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: bnez a1, .LBB5_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: .LBB5_2: # %entry
; RV32I-SFBILOAD-NEXT: sw a4, 0(a3)
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i8_s_store_3:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: lb a0, 4(a0)
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB5_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB5_2: # %entry
; RV64I-SFBILOAD-NEXT: sw a4, 0(a3)
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i8, ptr %base, i32 4 ; compute base + 4
%val = load atomic i8, ptr %addr acquire, align 1 ; load 8-bit value
%ext = sext i8 %val to i32 ; sign-extend to 32 bits
store i32 %c, ptr %base1
%res = select i1 %x, i32 %ext, i32 %b
ret i32 %res
}
define i32 @test_i8_z_store_3(ptr %base, i1 zeroext %x, i32 %b, ptr %base1, i32 %c) nounwind {
; RV32I-LABEL: test_i8_z_store_3:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: lbu a0, 4(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: sw a4, 0(a3)
; RV32I-NEXT: bnez a1, .LBB6_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: .LBB6_2: # %entry
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i8_z_store_3:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: lbu a0, 4(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: sw a4, 0(a3)
; RV64I-NEXT: bnez a1, .LBB6_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB6_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i8_z_store_3:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: lbu a0, 4(a0)
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: bnez a1, .LBB6_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: .LBB6_2: # %entry
; RV32I-SFB-NEXT: sw a4, 0(a3)
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i8_z_store_3:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: lbu a0, 4(a0)
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: bnez a1, .LBB6_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB6_2: # %entry
; RV64I-SFB-NEXT: sw a4, 0(a3)
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i8_z_store_3:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: lbu a0, 4(a0)
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: bnez a1, .LBB6_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: .LBB6_2: # %entry
; RV32I-SFBILOAD-NEXT: sw a4, 0(a3)
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i8_z_store_3:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: lbu a0, 4(a0)
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB6_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB6_2: # %entry
; RV64I-SFBILOAD-NEXT: sw a4, 0(a3)
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i8, ptr %base, i32 4 ; compute base + 4
%val = load atomic i8, ptr %addr acquire, align 1 ; load 8-bit value
%ext = zext i8 %val to i32 ; zero-extend to 32 bits
store i32 %c, ptr %base1
%res = select i1 %x, i32 %ext, i32 %b
ret i32 %res
}
define i32 @test_i16_s_store_3(ptr %base, i1 zeroext %x, i32 %b, ptr %base1, i32 %c) nounwind {
; RV32I-LABEL: test_i16_s_store_3:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: lh a0, 8(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: sw a4, 0(a3)
; RV32I-NEXT: bnez a1, .LBB7_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: .LBB7_2: # %entry
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i16_s_store_3:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: lh a0, 8(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: sw a4, 0(a3)
; RV64I-NEXT: bnez a1, .LBB7_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB7_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i16_s_store_3:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: lh a0, 8(a0)
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: bnez a1, .LBB7_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: .LBB7_2: # %entry
; RV32I-SFB-NEXT: sw a4, 0(a3)
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i16_s_store_3:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: lh a0, 8(a0)
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: bnez a1, .LBB7_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB7_2: # %entry
; RV64I-SFB-NEXT: sw a4, 0(a3)
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i16_s_store_3:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: lh a0, 8(a0)
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: bnez a1, .LBB7_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: .LBB7_2: # %entry
; RV32I-SFBILOAD-NEXT: sw a4, 0(a3)
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i16_s_store_3:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: lh a0, 8(a0)
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB7_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB7_2: # %entry
; RV64I-SFBILOAD-NEXT: sw a4, 0(a3)
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i16, ptr %base, i32 4 ; compute base + 4
%val = load atomic i16, ptr %addr acquire, align 2 ; load 16-bit value
%ext = sext i16 %val to i32 ; sign-extend to 32 bits
store i32 %c, ptr %base1
%res = select i1 %x, i32 %ext, i32 %b
ret i32 %res
}
define i32 @test_i16_z_store_3(ptr %base, i1 zeroext %x, i32 %b, ptr %base1, i32 %c) nounwind {
; RV32I-LABEL: test_i16_z_store_3:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: lhu a0, 8(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: sw a4, 0(a3)
; RV32I-NEXT: bnez a1, .LBB8_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: .LBB8_2: # %entry
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i16_z_store_3:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: lhu a0, 8(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: sw a4, 0(a3)
; RV64I-NEXT: bnez a1, .LBB8_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB8_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i16_z_store_3:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: lhu a0, 8(a0)
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: bnez a1, .LBB8_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: .LBB8_2: # %entry
; RV32I-SFB-NEXT: sw a4, 0(a3)
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i16_z_store_3:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: lhu a0, 8(a0)
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: bnez a1, .LBB8_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB8_2: # %entry
; RV64I-SFB-NEXT: sw a4, 0(a3)
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i16_z_store_3:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: lhu a0, 8(a0)
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: bnez a1, .LBB8_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: .LBB8_2: # %entry
; RV32I-SFBILOAD-NEXT: sw a4, 0(a3)
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i16_z_store_3:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: lhu a0, 8(a0)
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB8_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB8_2: # %entry
; RV64I-SFBILOAD-NEXT: sw a4, 0(a3)
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i16, ptr %base, i32 4 ; compute base + 4
%val = load atomic i16, ptr %addr acquire, align 2 ; load 16-bit value
%ext = zext i16 %val to i32 ; zero-extend to 32 bits
store i32 %c, ptr %base1
%res = select i1 %x, i32 %ext, i32 %b
ret i32 %res
}
define i32 @test_i32_store_3(ptr %base, i1 zeroext %x, i32 %b, ptr %base1, i32 %c) nounwind {
; RV32I-LABEL: test_i32_store_3:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: lw a0, 16(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: sw a4, 0(a3)
; RV32I-NEXT: bnez a1, .LBB9_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: .LBB9_2: # %entry
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i32_store_3:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: lw a0, 16(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: sw a4, 0(a3)
; RV64I-NEXT: bnez a1, .LBB9_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB9_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i32_store_3:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: lw a0, 16(a0)
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: bnez a1, .LBB9_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: .LBB9_2: # %entry
; RV32I-SFB-NEXT: sw a4, 0(a3)
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i32_store_3:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: lw a0, 16(a0)
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: bnez a1, .LBB9_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB9_2: # %entry
; RV64I-SFB-NEXT: sw a4, 0(a3)
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i32_store_3:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: lw a0, 16(a0)
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: bnez a1, .LBB9_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: .LBB9_2: # %entry
; RV32I-SFBILOAD-NEXT: sw a4, 0(a3)
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i32_store_3:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: lw a0, 16(a0)
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB9_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB9_2: # %entry
; RV64I-SFBILOAD-NEXT: sw a4, 0(a3)
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i32, ptr %base, i32 4 ; compute base + 4
%val = load atomic i32, ptr %addr acquire, align 4 ; load 32-bit value
store i32 %c, ptr %base1
%res = select i1 %x, i32 %val, i32 %b
ret i32 %res
}
define i64 @test_i8_s_1_3(ptr %base, i1 zeroext %x, i64 %b) nounwind {
; RV32I-LABEL: test_i8_s_1_3:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: lb a0, 4(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: bnez a1, .LBB10_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: mv a1, a3
; RV32I-NEXT: ret
; RV32I-NEXT: .LBB10_2:
; RV32I-NEXT: srai a1, a0, 31
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i8_s_1_3:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: lb a0, 4(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: bnez a1, .LBB10_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB10_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i8_s_1_3:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: lb a0, 4(a0)
; RV32I-SFB-NEXT: beqz a1, .LBB10_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a2, a0
; RV32I-SFB-NEXT: .LBB10_2: # %entry
; RV32I-SFB-NEXT: beqz a1, .LBB10_4
; RV32I-SFB-NEXT: # %bb.3: # %entry
; RV32I-SFB-NEXT: srai a3, a0, 31
; RV32I-SFB-NEXT: .LBB10_4: # %entry
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: mv a1, a3
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i8_s_1_3:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: lb a0, 4(a0)
; RV64I-SFB-NEXT: bnez a1, .LBB10_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB10_2: # %entry
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i8_s_1_3:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: lb a0, 4(a0)
; RV32I-SFBILOAD-NEXT: beqz a1, .LBB10_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a2, a0
; RV32I-SFBILOAD-NEXT: .LBB10_2: # %entry
; RV32I-SFBILOAD-NEXT: beqz a1, .LBB10_4
; RV32I-SFBILOAD-NEXT: # %bb.3: # %entry
; RV32I-SFBILOAD-NEXT: srai a3, a0, 31
; RV32I-SFBILOAD-NEXT: .LBB10_4: # %entry
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: mv a1, a3
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i8_s_1_3:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: lb a0, 4(a0)
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB10_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB10_2: # %entry
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i8, ptr %base, i64 4 ; compute base + 4
%val = load atomic i8, ptr %addr acquire, align 1 ; load 8-bit value
%ext = sext i8 %val to i64 ; sign-extend to 64 bits
%res = select i1 %x, i64 %ext, i64 %b
ret i64 %res
}
define i64 @test_i8_z_1_3(ptr %base, i1 zeroext %x, i64 %b) nounwind {
; RV32I-LABEL: test_i8_z_1_3:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: lbu a0, 4(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: bnez a1, .LBB11_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: .LBB11_2: # %entry
; RV32I-NEXT: addi a1, a1, -1
; RV32I-NEXT: and a1, a1, a3
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i8_z_1_3:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: lbu a0, 4(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: bnez a1, .LBB11_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB11_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i8_z_1_3:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: lbu a0, 4(a0)
; RV32I-SFB-NEXT: beqz a1, .LBB11_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: li a3, 0
; RV32I-SFB-NEXT: .LBB11_2: # %entry
; RV32I-SFB-NEXT: bnez a1, .LBB11_4
; RV32I-SFB-NEXT: # %bb.3: # %entry
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: .LBB11_4: # %entry
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: mv a1, a3
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i8_z_1_3:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: lbu a0, 4(a0)
; RV64I-SFB-NEXT: bnez a1, .LBB11_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB11_2: # %entry
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i8_z_1_3:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: lbu a0, 4(a0)
; RV32I-SFBILOAD-NEXT: beqz a1, .LBB11_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: li a3, 0
; RV32I-SFBILOAD-NEXT: .LBB11_2: # %entry
; RV32I-SFBILOAD-NEXT: bnez a1, .LBB11_4
; RV32I-SFBILOAD-NEXT: # %bb.3: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: .LBB11_4: # %entry
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: mv a1, a3
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i8_z_1_3:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: lbu a0, 4(a0)
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB11_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB11_2: # %entry
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i8, ptr %base, i64 4 ; compute base + 4
%val = load atomic i8, ptr %addr acquire, align 1 ; load 8-bit value
%ext = zext i8 %val to i64 ; zero-extend to 64 bits
%res = select i1 %x, i64 %ext, i64 %b
ret i64 %res
}
define i64 @test_i16_s_1_3(ptr %base, i1 zeroext %x, i64 %b) nounwind {
; RV32I-LABEL: test_i16_s_1_3:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: lh a0, 8(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: bnez a1, .LBB12_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: mv a1, a3
; RV32I-NEXT: ret
; RV32I-NEXT: .LBB12_2:
; RV32I-NEXT: srai a1, a0, 31
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i16_s_1_3:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: lh a0, 8(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: bnez a1, .LBB12_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB12_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i16_s_1_3:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: lh a0, 8(a0)
; RV32I-SFB-NEXT: beqz a1, .LBB12_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a2, a0
; RV32I-SFB-NEXT: .LBB12_2: # %entry
; RV32I-SFB-NEXT: beqz a1, .LBB12_4
; RV32I-SFB-NEXT: # %bb.3: # %entry
; RV32I-SFB-NEXT: srai a3, a0, 31
; RV32I-SFB-NEXT: .LBB12_4: # %entry
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: mv a1, a3
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i16_s_1_3:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: lh a0, 8(a0)
; RV64I-SFB-NEXT: bnez a1, .LBB12_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB12_2: # %entry
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i16_s_1_3:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: lh a0, 8(a0)
; RV32I-SFBILOAD-NEXT: beqz a1, .LBB12_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a2, a0
; RV32I-SFBILOAD-NEXT: .LBB12_2: # %entry
; RV32I-SFBILOAD-NEXT: beqz a1, .LBB12_4
; RV32I-SFBILOAD-NEXT: # %bb.3: # %entry
; RV32I-SFBILOAD-NEXT: srai a3, a0, 31
; RV32I-SFBILOAD-NEXT: .LBB12_4: # %entry
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: mv a1, a3
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i16_s_1_3:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: lh a0, 8(a0)
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB12_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB12_2: # %entry
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i16, ptr %base, i64 4 ; compute base + 4
%val = load atomic i16, ptr %addr acquire, align 2 ; load 16-bit value
%ext = sext i16 %val to i64 ; sign-extend to 64 bits
%res = select i1 %x, i64 %ext, i64 %b
ret i64 %res
}
define i64 @test_i16_z_1_3(ptr %base, i1 zeroext %x, i64 %b) nounwind {
; RV32I-LABEL: test_i16_z_1_3:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: lhu a0, 8(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: bnez a1, .LBB13_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: .LBB13_2: # %entry
; RV32I-NEXT: addi a1, a1, -1
; RV32I-NEXT: and a1, a1, a3
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i16_z_1_3:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: lhu a0, 8(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: bnez a1, .LBB13_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB13_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i16_z_1_3:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: lhu a0, 8(a0)
; RV32I-SFB-NEXT: beqz a1, .LBB13_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: li a3, 0
; RV32I-SFB-NEXT: .LBB13_2: # %entry
; RV32I-SFB-NEXT: bnez a1, .LBB13_4
; RV32I-SFB-NEXT: # %bb.3: # %entry
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: .LBB13_4: # %entry
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: mv a1, a3
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i16_z_1_3:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: lhu a0, 8(a0)
; RV64I-SFB-NEXT: bnez a1, .LBB13_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB13_2: # %entry
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i16_z_1_3:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: lhu a0, 8(a0)
; RV32I-SFBILOAD-NEXT: beqz a1, .LBB13_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: li a3, 0
; RV32I-SFBILOAD-NEXT: .LBB13_2: # %entry
; RV32I-SFBILOAD-NEXT: bnez a1, .LBB13_4
; RV32I-SFBILOAD-NEXT: # %bb.3: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: .LBB13_4: # %entry
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: mv a1, a3
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i16_z_1_3:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: lhu a0, 8(a0)
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB13_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB13_2: # %entry
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i16, ptr %base, i64 4 ; compute base + 4
%val = load atomic i16, ptr %addr acquire, align 2 ; load 16-bit value
%ext = zext i16 %val to i64 ; zero-extend to 64 bits
%res = select i1 %x, i64 %ext, i64 %b
ret i64 %res
}
define i64 @test_i32_z_1_3(ptr %base, i1 zeroext %x, i64 %b) nounwind {
; RV32I-LABEL: test_i32_z_1_3:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: lw a0, 16(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: bnez a1, .LBB14_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: .LBB14_2: # %entry
; RV32I-NEXT: addi a1, a1, -1
; RV32I-NEXT: and a1, a1, a3
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i32_z_1_3:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: lwu a0, 16(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: bnez a1, .LBB14_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB14_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i32_z_1_3:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: lw a0, 16(a0)
; RV32I-SFB-NEXT: beqz a1, .LBB14_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: li a3, 0
; RV32I-SFB-NEXT: .LBB14_2: # %entry
; RV32I-SFB-NEXT: bnez a1, .LBB14_4
; RV32I-SFB-NEXT: # %bb.3: # %entry
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: .LBB14_4: # %entry
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: mv a1, a3
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i32_z_1_3:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: lwu a0, 16(a0)
; RV64I-SFB-NEXT: bnez a1, .LBB14_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB14_2: # %entry
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i32_z_1_3:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: lw a0, 16(a0)
; RV32I-SFBILOAD-NEXT: beqz a1, .LBB14_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: li a3, 0
; RV32I-SFBILOAD-NEXT: .LBB14_2: # %entry
; RV32I-SFBILOAD-NEXT: bnez a1, .LBB14_4
; RV32I-SFBILOAD-NEXT: # %bb.3: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: .LBB14_4: # %entry
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: mv a1, a3
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i32_z_1_3:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: lwu a0, 16(a0)
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB14_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB14_2: # %entry
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i32, ptr %base, i64 4 ; compute base + 4
%val = load atomic i32, ptr %addr acquire, align 4 ; load 32-bit value
%ext = zext i32 %val to i64 ; zero-extend to 64 bits
%res = select i1 %x, i64 %ext, i64 %b
ret i64 %res
}
define i64 @test_i64_1_3(ptr %base, i1 zeroext %x, i64 %b) nounwind {
; RV32I-LABEL: test_i64_1_3:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a3
; RV32I-NEXT: mv s1, a2
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: addi a0, a0, 32
; RV32I-NEXT: li a1, 2
; RV32I-NEXT: call __atomic_load_8
; RV32I-NEXT: bnez s2, .LBB15_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: mv a1, s0
; RV32I-NEXT: .LBB15_2: # %entry
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i64_1_3:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: ld a0, 32(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: bnez a1, .LBB15_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB15_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i64_1_3:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: addi sp, sp, -16
; RV32I-SFB-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-SFB-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
; RV32I-SFB-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
; RV32I-SFB-NEXT: sw s2, 0(sp) # 4-byte Folded Spill
; RV32I-SFB-NEXT: mv s0, a3
; RV32I-SFB-NEXT: mv s1, a2
; RV32I-SFB-NEXT: mv s2, a1
; RV32I-SFB-NEXT: addi a0, a0, 32
; RV32I-SFB-NEXT: li a1, 2
; RV32I-SFB-NEXT: call __atomic_load_8
; RV32I-SFB-NEXT: bnez s2, .LBB15_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a0, s1
; RV32I-SFB-NEXT: .LBB15_2: # %entry
; RV32I-SFB-NEXT: bnez s2, .LBB15_4
; RV32I-SFB-NEXT: # %bb.3: # %entry
; RV32I-SFB-NEXT: mv a1, s0
; RV32I-SFB-NEXT: .LBB15_4: # %entry
; RV32I-SFB-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-SFB-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
; RV32I-SFB-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
; RV32I-SFB-NEXT: lw s2, 0(sp) # 4-byte Folded Reload
; RV32I-SFB-NEXT: addi sp, sp, 16
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i64_1_3:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: ld a0, 32(a0)
; RV64I-SFB-NEXT: bnez a1, .LBB15_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB15_2: # %entry
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i64_1_3:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: addi sp, sp, -16
; RV32I-SFBILOAD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-SFBILOAD-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
; RV32I-SFBILOAD-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
; RV32I-SFBILOAD-NEXT: sw s2, 0(sp) # 4-byte Folded Spill
; RV32I-SFBILOAD-NEXT: mv s0, a3
; RV32I-SFBILOAD-NEXT: mv s1, a2
; RV32I-SFBILOAD-NEXT: mv s2, a1
; RV32I-SFBILOAD-NEXT: addi a0, a0, 32
; RV32I-SFBILOAD-NEXT: li a1, 2
; RV32I-SFBILOAD-NEXT: call __atomic_load_8
; RV32I-SFBILOAD-NEXT: bnez s2, .LBB15_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, s1
; RV32I-SFBILOAD-NEXT: .LBB15_2: # %entry
; RV32I-SFBILOAD-NEXT: bnez s2, .LBB15_4
; RV32I-SFBILOAD-NEXT: # %bb.3: # %entry
; RV32I-SFBILOAD-NEXT: mv a1, s0
; RV32I-SFBILOAD-NEXT: .LBB15_4: # %entry
; RV32I-SFBILOAD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-SFBILOAD-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
; RV32I-SFBILOAD-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
; RV32I-SFBILOAD-NEXT: lw s2, 0(sp) # 4-byte Folded Reload
; RV32I-SFBILOAD-NEXT: addi sp, sp, 16
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i64_1_3:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: ld a0, 32(a0)
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB15_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB15_2: # %entry
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i64, ptr %base, i64 4 ; compute base + 4
%val = load atomic i64, ptr %addr acquire, align 8 ; load 64-bit value
%res = select i1 %x, i64 %val, i64 %b
ret i64 %res
}
define i64 @test_i8_s_store_64_3(ptr %base, i1 zeroext %x, i64 %b, ptr %base1, i64 %c) nounwind {
; RV32I-LABEL: test_i8_s_store_64_3:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: lb a0, 4(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: sw a5, 0(a4)
; RV32I-NEXT: sw a6, 4(a4)
; RV32I-NEXT: bnez a1, .LBB16_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: mv a1, a3
; RV32I-NEXT: ret
; RV32I-NEXT: .LBB16_2:
; RV32I-NEXT: srai a1, a0, 31
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i8_s_store_64_3:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: lb a0, 4(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: sd a4, 0(a3)
; RV64I-NEXT: bnez a1, .LBB16_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB16_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i8_s_store_64_3:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: lb a0, 4(a0)
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: sw a5, 0(a4)
; RV32I-SFB-NEXT: beqz a1, .LBB16_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a2, a0
; RV32I-SFB-NEXT: .LBB16_2: # %entry
; RV32I-SFB-NEXT: beqz a1, .LBB16_4
; RV32I-SFB-NEXT: # %bb.3: # %entry
; RV32I-SFB-NEXT: srai a3, a0, 31
; RV32I-SFB-NEXT: .LBB16_4: # %entry
; RV32I-SFB-NEXT: sw a6, 4(a4)
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: mv a1, a3
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i8_s_store_64_3:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: lb a0, 4(a0)
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: bnez a1, .LBB16_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB16_2: # %entry
; RV64I-SFB-NEXT: sd a4, 0(a3)
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i8_s_store_64_3:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: lb a0, 4(a0)
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: sw a5, 0(a4)
; RV32I-SFBILOAD-NEXT: beqz a1, .LBB16_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a2, a0
; RV32I-SFBILOAD-NEXT: .LBB16_2: # %entry
; RV32I-SFBILOAD-NEXT: beqz a1, .LBB16_4
; RV32I-SFBILOAD-NEXT: # %bb.3: # %entry
; RV32I-SFBILOAD-NEXT: srai a3, a0, 31
; RV32I-SFBILOAD-NEXT: .LBB16_4: # %entry
; RV32I-SFBILOAD-NEXT: sw a6, 4(a4)
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: mv a1, a3
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i8_s_store_64_3:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: lb a0, 4(a0)
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB16_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB16_2: # %entry
; RV64I-SFBILOAD-NEXT: sd a4, 0(a3)
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i8, ptr %base, i64 4 ; compute base + 4
%val = load atomic i8, ptr %addr acquire, align 1 ; load 8-bit value
%ext = sext i8 %val to i64 ; sign-extend to 64 bits
store i64 %c, ptr %base1
%res = select i1 %x, i64 %ext, i64 %b
ret i64 %res
}
define i64 @test_i8_z_store_64_3(ptr %base, i1 zeroext %x, i64 %b, ptr %base1, i64 %c) nounwind {
; RV32I-LABEL: test_i8_z_store_64_3:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: lbu a0, 4(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: sw a5, 0(a4)
; RV32I-NEXT: sw a6, 4(a4)
; RV32I-NEXT: bnez a1, .LBB17_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: .LBB17_2: # %entry
; RV32I-NEXT: addi a1, a1, -1
; RV32I-NEXT: and a1, a1, a3
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i8_z_store_64_3:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: lbu a0, 4(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: sd a4, 0(a3)
; RV64I-NEXT: bnez a1, .LBB17_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB17_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i8_z_store_64_3:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: lbu a0, 4(a0)
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: beqz a1, .LBB17_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: li a3, 0
; RV32I-SFB-NEXT: .LBB17_2: # %entry
; RV32I-SFB-NEXT: bnez a1, .LBB17_4
; RV32I-SFB-NEXT: # %bb.3: # %entry
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: .LBB17_4: # %entry
; RV32I-SFB-NEXT: sw a5, 0(a4)
; RV32I-SFB-NEXT: sw a6, 4(a4)
; RV32I-SFB-NEXT: mv a1, a3
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i8_z_store_64_3:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: lbu a0, 4(a0)
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: bnez a1, .LBB17_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB17_2: # %entry
; RV64I-SFB-NEXT: sd a4, 0(a3)
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i8_z_store_64_3:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: lbu a0, 4(a0)
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: beqz a1, .LBB17_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: li a3, 0
; RV32I-SFBILOAD-NEXT: .LBB17_2: # %entry
; RV32I-SFBILOAD-NEXT: bnez a1, .LBB17_4
; RV32I-SFBILOAD-NEXT: # %bb.3: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: .LBB17_4: # %entry
; RV32I-SFBILOAD-NEXT: sw a5, 0(a4)
; RV32I-SFBILOAD-NEXT: sw a6, 4(a4)
; RV32I-SFBILOAD-NEXT: mv a1, a3
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i8_z_store_64_3:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: lbu a0, 4(a0)
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB17_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB17_2: # %entry
; RV64I-SFBILOAD-NEXT: sd a4, 0(a3)
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i8, ptr %base, i64 4 ; compute base + 4
%val = load atomic i8, ptr %addr acquire, align 1 ; load 8-bit value
%ext = zext i8 %val to i64 ; zero-extend to 64 bits
store i64 %c, ptr %base1
%res = select i1 %x, i64 %ext, i64 %b
ret i64 %res
}
define i64 @test_i16_s_store_64_3(ptr %base, i1 zeroext %x, i64 %b, ptr %base1, i64 %c) nounwind {
; RV32I-LABEL: test_i16_s_store_64_3:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: lh a0, 8(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: sw a5, 0(a4)
; RV32I-NEXT: sw a6, 4(a4)
; RV32I-NEXT: bnez a1, .LBB18_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: mv a1, a3
; RV32I-NEXT: ret
; RV32I-NEXT: .LBB18_2:
; RV32I-NEXT: srai a1, a0, 31
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i16_s_store_64_3:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: lh a0, 8(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: sd a4, 0(a3)
; RV64I-NEXT: bnez a1, .LBB18_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB18_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i16_s_store_64_3:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: lh a0, 8(a0)
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: sw a5, 0(a4)
; RV32I-SFB-NEXT: beqz a1, .LBB18_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a2, a0
; RV32I-SFB-NEXT: .LBB18_2: # %entry
; RV32I-SFB-NEXT: beqz a1, .LBB18_4
; RV32I-SFB-NEXT: # %bb.3: # %entry
; RV32I-SFB-NEXT: srai a3, a0, 31
; RV32I-SFB-NEXT: .LBB18_4: # %entry
; RV32I-SFB-NEXT: sw a6, 4(a4)
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: mv a1, a3
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i16_s_store_64_3:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: lh a0, 8(a0)
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: bnez a1, .LBB18_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB18_2: # %entry
; RV64I-SFB-NEXT: sd a4, 0(a3)
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i16_s_store_64_3:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: lh a0, 8(a0)
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: sw a5, 0(a4)
; RV32I-SFBILOAD-NEXT: beqz a1, .LBB18_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a2, a0
; RV32I-SFBILOAD-NEXT: .LBB18_2: # %entry
; RV32I-SFBILOAD-NEXT: beqz a1, .LBB18_4
; RV32I-SFBILOAD-NEXT: # %bb.3: # %entry
; RV32I-SFBILOAD-NEXT: srai a3, a0, 31
; RV32I-SFBILOAD-NEXT: .LBB18_4: # %entry
; RV32I-SFBILOAD-NEXT: sw a6, 4(a4)
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: mv a1, a3
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i16_s_store_64_3:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: lh a0, 8(a0)
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB18_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB18_2: # %entry
; RV64I-SFBILOAD-NEXT: sd a4, 0(a3)
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i16, ptr %base, i64 4 ; compute base + 4
%val = load atomic i16, ptr %addr acquire, align 2 ; load 16-bit value
%ext = sext i16 %val to i64 ; sign-extend to 64 bits
store i64 %c, ptr %base1
%res = select i1 %x, i64 %ext, i64 %b
ret i64 %res
}
define i64 @test_i16_z_store_64_3(ptr %base, i1 zeroext %x, i64 %b, ptr %base1, i64 %c) nounwind {
; RV32I-LABEL: test_i16_z_store_64_3:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: lhu a0, 8(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: sw a5, 0(a4)
; RV32I-NEXT: sw a6, 4(a4)
; RV32I-NEXT: bnez a1, .LBB19_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: .LBB19_2: # %entry
; RV32I-NEXT: addi a1, a1, -1
; RV32I-NEXT: and a1, a1, a3
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i16_z_store_64_3:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: lhu a0, 8(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: sd a4, 0(a3)
; RV64I-NEXT: bnez a1, .LBB19_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB19_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i16_z_store_64_3:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: lhu a0, 8(a0)
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: beqz a1, .LBB19_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: li a3, 0
; RV32I-SFB-NEXT: .LBB19_2: # %entry
; RV32I-SFB-NEXT: bnez a1, .LBB19_4
; RV32I-SFB-NEXT: # %bb.3: # %entry
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: .LBB19_4: # %entry
; RV32I-SFB-NEXT: sw a5, 0(a4)
; RV32I-SFB-NEXT: sw a6, 4(a4)
; RV32I-SFB-NEXT: mv a1, a3
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i16_z_store_64_3:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: lhu a0, 8(a0)
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: bnez a1, .LBB19_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB19_2: # %entry
; RV64I-SFB-NEXT: sd a4, 0(a3)
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i16_z_store_64_3:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: lhu a0, 8(a0)
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: beqz a1, .LBB19_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: li a3, 0
; RV32I-SFBILOAD-NEXT: .LBB19_2: # %entry
; RV32I-SFBILOAD-NEXT: bnez a1, .LBB19_4
; RV32I-SFBILOAD-NEXT: # %bb.3: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: .LBB19_4: # %entry
; RV32I-SFBILOAD-NEXT: sw a5, 0(a4)
; RV32I-SFBILOAD-NEXT: sw a6, 4(a4)
; RV32I-SFBILOAD-NEXT: mv a1, a3
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i16_z_store_64_3:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: lhu a0, 8(a0)
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB19_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB19_2: # %entry
; RV64I-SFBILOAD-NEXT: sd a4, 0(a3)
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i16, ptr %base, i64 4 ; compute base + 4
%val = load atomic i16, ptr %addr acquire, align 2 ; load 16-bit value
%ext = zext i16 %val to i64 ; zero-extend to 64 bits
store i64 %c, ptr %base1
%res = select i1 %x, i64 %ext, i64 %b
ret i64 %res
}
define i64 @test_i32_z_store_64_3(ptr %base, i1 zeroext %x, i64 %b, ptr %base1, i64 %c) nounwind {
; RV32I-LABEL: test_i32_z_store_64_3:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: lw a0, 16(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: sw a5, 0(a4)
; RV32I-NEXT: sw a6, 4(a4)
; RV32I-NEXT: bnez a1, .LBB20_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: .LBB20_2: # %entry
; RV32I-NEXT: addi a1, a1, -1
; RV32I-NEXT: and a1, a1, a3
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i32_z_store_64_3:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: lwu a0, 16(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: sd a4, 0(a3)
; RV64I-NEXT: bnez a1, .LBB20_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB20_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i32_z_store_64_3:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: lw a0, 16(a0)
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: beqz a1, .LBB20_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: li a3, 0
; RV32I-SFB-NEXT: .LBB20_2: # %entry
; RV32I-SFB-NEXT: bnez a1, .LBB20_4
; RV32I-SFB-NEXT: # %bb.3: # %entry
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: .LBB20_4: # %entry
; RV32I-SFB-NEXT: sw a5, 0(a4)
; RV32I-SFB-NEXT: sw a6, 4(a4)
; RV32I-SFB-NEXT: mv a1, a3
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i32_z_store_64_3:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: lwu a0, 16(a0)
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: bnez a1, .LBB20_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB20_2: # %entry
; RV64I-SFB-NEXT: sd a4, 0(a3)
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i32_z_store_64_3:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: lw a0, 16(a0)
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: beqz a1, .LBB20_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: li a3, 0
; RV32I-SFBILOAD-NEXT: .LBB20_2: # %entry
; RV32I-SFBILOAD-NEXT: bnez a1, .LBB20_4
; RV32I-SFBILOAD-NEXT: # %bb.3: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: .LBB20_4: # %entry
; RV32I-SFBILOAD-NEXT: sw a5, 0(a4)
; RV32I-SFBILOAD-NEXT: sw a6, 4(a4)
; RV32I-SFBILOAD-NEXT: mv a1, a3
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i32_z_store_64_3:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: lwu a0, 16(a0)
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB20_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB20_2: # %entry
; RV64I-SFBILOAD-NEXT: sd a4, 0(a3)
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i32, ptr %base, i64 4 ; compute base + 4
%val = load atomic i32, ptr %addr acquire, align 4 ; load 32-bit value
%ext = zext i32 %val to i64 ; zero-extend to 64 bits
store i64 %c, ptr %base1
%res = select i1 %x, i64 %ext, i64 %b
ret i64 %res
}
define i64 @test_i64_store_64_3(ptr %base, i1 zeroext %x, i64 %b, ptr %base1, i64 %c) nounwind {
; RV32I-LABEL: test_i64_store_64_3:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s4, 8(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s5, 4(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s2, a6
; RV32I-NEXT: mv s3, a5
; RV32I-NEXT: mv s4, a4
; RV32I-NEXT: mv s0, a3
; RV32I-NEXT: mv s1, a2
; RV32I-NEXT: mv s5, a1
; RV32I-NEXT: addi a0, a0, 32
; RV32I-NEXT: li a1, 2
; RV32I-NEXT: call __atomic_load_8
; RV32I-NEXT: sw s3, 0(s4)
; RV32I-NEXT: sw s2, 4(s4)
; RV32I-NEXT: bnez s5, .LBB21_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: mv a1, s0
; RV32I-NEXT: .LBB21_2: # %entry
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s4, 8(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s5, 4(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i64_store_64_3:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: ld a0, 32(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: sd a4, 0(a3)
; RV64I-NEXT: bnez a1, .LBB21_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB21_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i64_store_64_3:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: addi sp, sp, -32
; RV32I-SFB-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-SFB-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-SFB-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-SFB-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-SFB-NEXT: sw s3, 12(sp) # 4-byte Folded Spill
; RV32I-SFB-NEXT: sw s4, 8(sp) # 4-byte Folded Spill
; RV32I-SFB-NEXT: sw s5, 4(sp) # 4-byte Folded Spill
; RV32I-SFB-NEXT: mv s0, a6
; RV32I-SFB-NEXT: mv s1, a5
; RV32I-SFB-NEXT: mv s2, a4
; RV32I-SFB-NEXT: mv s3, a3
; RV32I-SFB-NEXT: mv s4, a2
; RV32I-SFB-NEXT: mv s5, a1
; RV32I-SFB-NEXT: addi a0, a0, 32
; RV32I-SFB-NEXT: li a1, 2
; RV32I-SFB-NEXT: call __atomic_load_8
; RV32I-SFB-NEXT: sw s1, 0(s2)
; RV32I-SFB-NEXT: bnez s5, .LBB21_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a0, s4
; RV32I-SFB-NEXT: .LBB21_2: # %entry
; RV32I-SFB-NEXT: bnez s5, .LBB21_4
; RV32I-SFB-NEXT: # %bb.3: # %entry
; RV32I-SFB-NEXT: mv a1, s3
; RV32I-SFB-NEXT: .LBB21_4: # %entry
; RV32I-SFB-NEXT: sw s0, 4(s2)
; RV32I-SFB-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-SFB-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-SFB-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-SFB-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-SFB-NEXT: lw s3, 12(sp) # 4-byte Folded Reload
; RV32I-SFB-NEXT: lw s4, 8(sp) # 4-byte Folded Reload
; RV32I-SFB-NEXT: lw s5, 4(sp) # 4-byte Folded Reload
; RV32I-SFB-NEXT: addi sp, sp, 32
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i64_store_64_3:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: ld a0, 32(a0)
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: bnez a1, .LBB21_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB21_2: # %entry
; RV64I-SFB-NEXT: sd a4, 0(a3)
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i64_store_64_3:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: addi sp, sp, -32
; RV32I-SFBILOAD-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-SFBILOAD-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-SFBILOAD-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-SFBILOAD-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-SFBILOAD-NEXT: sw s3, 12(sp) # 4-byte Folded Spill
; RV32I-SFBILOAD-NEXT: sw s4, 8(sp) # 4-byte Folded Spill
; RV32I-SFBILOAD-NEXT: sw s5, 4(sp) # 4-byte Folded Spill
; RV32I-SFBILOAD-NEXT: mv s0, a6
; RV32I-SFBILOAD-NEXT: mv s1, a5
; RV32I-SFBILOAD-NEXT: mv s2, a4
; RV32I-SFBILOAD-NEXT: mv s3, a3
; RV32I-SFBILOAD-NEXT: mv s4, a2
; RV32I-SFBILOAD-NEXT: mv s5, a1
; RV32I-SFBILOAD-NEXT: addi a0, a0, 32
; RV32I-SFBILOAD-NEXT: li a1, 2
; RV32I-SFBILOAD-NEXT: call __atomic_load_8
; RV32I-SFBILOAD-NEXT: sw s1, 0(s2)
; RV32I-SFBILOAD-NEXT: bnez s5, .LBB21_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, s4
; RV32I-SFBILOAD-NEXT: .LBB21_2: # %entry
; RV32I-SFBILOAD-NEXT: bnez s5, .LBB21_4
; RV32I-SFBILOAD-NEXT: # %bb.3: # %entry
; RV32I-SFBILOAD-NEXT: mv a1, s3
; RV32I-SFBILOAD-NEXT: .LBB21_4: # %entry
; RV32I-SFBILOAD-NEXT: sw s0, 4(s2)
; RV32I-SFBILOAD-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-SFBILOAD-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-SFBILOAD-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-SFBILOAD-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-SFBILOAD-NEXT: lw s3, 12(sp) # 4-byte Folded Reload
; RV32I-SFBILOAD-NEXT: lw s4, 8(sp) # 4-byte Folded Reload
; RV32I-SFBILOAD-NEXT: lw s5, 4(sp) # 4-byte Folded Reload
; RV32I-SFBILOAD-NEXT: addi sp, sp, 32
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i64_store_64_3:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: ld a0, 32(a0)
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB21_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB21_2: # %entry
; RV64I-SFBILOAD-NEXT: sd a4, 0(a3)
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i64, ptr %base, i64 4 ; compute base + 4
%val = load atomic i64, ptr %addr acquire, align 8 ; load 64-bit value
store i64 %c, ptr %base1
%res = select i1 %x, i64 %val, i64 %b
ret i64 %res
}
define i32 @test_i8_s_4(ptr %base, i1 zeroext %x, i32 %b) nounwind {
; RV32I-LABEL: test_i8_s_4:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: fence rw, rw
; RV32I-NEXT: lb a0, 4(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: bnez a1, .LBB22_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: .LBB22_2: # %entry
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i8_s_4:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: fence rw, rw
; RV64I-NEXT: lb a0, 4(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: bnez a1, .LBB22_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB22_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i8_s_4:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: fence rw, rw
; RV32I-SFB-NEXT: lb a0, 4(a0)
; RV32I-SFB-NEXT: bnez a1, .LBB22_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: .LBB22_2: # %entry
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i8_s_4:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: fence rw, rw
; RV64I-SFB-NEXT: lb a0, 4(a0)
; RV64I-SFB-NEXT: bnez a1, .LBB22_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB22_2: # %entry
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i8_s_4:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: fence rw, rw
; RV32I-SFBILOAD-NEXT: lb a0, 4(a0)
; RV32I-SFBILOAD-NEXT: bnez a1, .LBB22_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: .LBB22_2: # %entry
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i8_s_4:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: fence rw, rw
; RV64I-SFBILOAD-NEXT: lb a0, 4(a0)
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB22_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB22_2: # %entry
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i8, ptr %base, i32 4 ; compute base + 4
%val = load atomic i8, ptr %addr seq_cst, align 1 ; load 8-bit value
%ext = sext i8 %val to i32 ; sign-extend to 32 bits
%res = select i1 %x, i32 %ext, i32 %b
ret i32 %res
}
define i32 @test_i8_z_4(ptr %base, i1 zeroext %x, i32 %b) nounwind {
; RV32I-LABEL: test_i8_z_4:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: fence rw, rw
; RV32I-NEXT: lbu a0, 4(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: bnez a1, .LBB23_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: .LBB23_2: # %entry
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i8_z_4:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: fence rw, rw
; RV64I-NEXT: lbu a0, 4(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: bnez a1, .LBB23_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB23_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i8_z_4:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: fence rw, rw
; RV32I-SFB-NEXT: lbu a0, 4(a0)
; RV32I-SFB-NEXT: bnez a1, .LBB23_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: .LBB23_2: # %entry
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i8_z_4:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: fence rw, rw
; RV64I-SFB-NEXT: lbu a0, 4(a0)
; RV64I-SFB-NEXT: bnez a1, .LBB23_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB23_2: # %entry
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i8_z_4:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: fence rw, rw
; RV32I-SFBILOAD-NEXT: lbu a0, 4(a0)
; RV32I-SFBILOAD-NEXT: bnez a1, .LBB23_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: .LBB23_2: # %entry
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i8_z_4:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: fence rw, rw
; RV64I-SFBILOAD-NEXT: lbu a0, 4(a0)
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB23_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB23_2: # %entry
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i8, ptr %base, i32 4 ; compute base + 4
%val = load atomic i8, ptr %addr seq_cst, align 1 ; load 8-bit value
%ext = zext i8 %val to i32 ; zero-extend to 32 bits
%res = select i1 %x, i32 %ext, i32 %b
ret i32 %res
}
define i32 @test_i16_s_4(ptr %base, i1 zeroext %x, i32 %b) nounwind {
; RV32I-LABEL: test_i16_s_4:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: fence rw, rw
; RV32I-NEXT: lh a0, 8(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: bnez a1, .LBB24_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: .LBB24_2: # %entry
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i16_s_4:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: fence rw, rw
; RV64I-NEXT: lh a0, 8(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: bnez a1, .LBB24_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB24_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i16_s_4:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: fence rw, rw
; RV32I-SFB-NEXT: lh a0, 8(a0)
; RV32I-SFB-NEXT: bnez a1, .LBB24_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: .LBB24_2: # %entry
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i16_s_4:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: fence rw, rw
; RV64I-SFB-NEXT: lh a0, 8(a0)
; RV64I-SFB-NEXT: bnez a1, .LBB24_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB24_2: # %entry
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i16_s_4:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: fence rw, rw
; RV32I-SFBILOAD-NEXT: lh a0, 8(a0)
; RV32I-SFBILOAD-NEXT: bnez a1, .LBB24_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: .LBB24_2: # %entry
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i16_s_4:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: fence rw, rw
; RV64I-SFBILOAD-NEXT: lh a0, 8(a0)
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB24_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB24_2: # %entry
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i16, ptr %base, i32 4 ; compute base + 4
%val = load atomic i16, ptr %addr seq_cst, align 2 ; load 16-bit value
%ext = sext i16 %val to i32 ; sign-extend to 32 bits
%res = select i1 %x, i32 %ext, i32 %b
ret i32 %res
}
define i32 @test_i16_z_4(ptr %base, i1 zeroext %x, i32 %b) nounwind {
; RV32I-LABEL: test_i16_z_4:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: fence rw, rw
; RV32I-NEXT: lhu a0, 8(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: bnez a1, .LBB25_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: .LBB25_2: # %entry
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i16_z_4:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: fence rw, rw
; RV64I-NEXT: lhu a0, 8(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: bnez a1, .LBB25_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB25_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i16_z_4:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: fence rw, rw
; RV32I-SFB-NEXT: lhu a0, 8(a0)
; RV32I-SFB-NEXT: bnez a1, .LBB25_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: .LBB25_2: # %entry
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i16_z_4:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: fence rw, rw
; RV64I-SFB-NEXT: lhu a0, 8(a0)
; RV64I-SFB-NEXT: bnez a1, .LBB25_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB25_2: # %entry
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i16_z_4:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: fence rw, rw
; RV32I-SFBILOAD-NEXT: lhu a0, 8(a0)
; RV32I-SFBILOAD-NEXT: bnez a1, .LBB25_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: .LBB25_2: # %entry
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i16_z_4:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: fence rw, rw
; RV64I-SFBILOAD-NEXT: lhu a0, 8(a0)
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB25_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB25_2: # %entry
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i16, ptr %base, i32 4 ; compute base + 4
%val = load atomic i16, ptr %addr seq_cst, align 2 ; load 16-bit value
%ext = zext i16 %val to i32 ; zero-extend to 32 bits
%res = select i1 %x, i32 %ext, i32 %b
ret i32 %res
}
define i32 @test_i32_4(ptr %base, i1 zeroext %x, i32 %b) nounwind {
; RV32I-LABEL: test_i32_4:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: fence rw, rw
; RV32I-NEXT: lw a0, 16(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: bnez a1, .LBB26_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: .LBB26_2: # %entry
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i32_4:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: fence rw, rw
; RV64I-NEXT: lw a0, 16(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: bnez a1, .LBB26_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB26_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i32_4:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: fence rw, rw
; RV32I-SFB-NEXT: lw a0, 16(a0)
; RV32I-SFB-NEXT: bnez a1, .LBB26_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: .LBB26_2: # %entry
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i32_4:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: fence rw, rw
; RV64I-SFB-NEXT: lw a0, 16(a0)
; RV64I-SFB-NEXT: bnez a1, .LBB26_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB26_2: # %entry
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i32_4:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: fence rw, rw
; RV32I-SFBILOAD-NEXT: lw a0, 16(a0)
; RV32I-SFBILOAD-NEXT: bnez a1, .LBB26_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: .LBB26_2: # %entry
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i32_4:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: fence rw, rw
; RV64I-SFBILOAD-NEXT: lw a0, 16(a0)
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB26_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB26_2: # %entry
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i32, ptr %base, i32 4 ; compute base + 4
%val = load atomic i32, ptr %addr seq_cst, align 4 ; load 32-bit value
%res = select i1 %x, i32 %val, i32 %b
ret i32 %res
}
define i32 @test_i8_s_store_4(ptr %base, i1 zeroext %x, i32 %b, ptr %base1, i32 %c) nounwind {
; RV32I-LABEL: test_i8_s_store_4:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: fence rw, rw
; RV32I-NEXT: lb a0, 4(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: sw a4, 0(a3)
; RV32I-NEXT: bnez a1, .LBB27_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: .LBB27_2: # %entry
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i8_s_store_4:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: fence rw, rw
; RV64I-NEXT: lb a0, 4(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: sw a4, 0(a3)
; RV64I-NEXT: bnez a1, .LBB27_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB27_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i8_s_store_4:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: fence rw, rw
; RV32I-SFB-NEXT: lb a0, 4(a0)
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: bnez a1, .LBB27_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: .LBB27_2: # %entry
; RV32I-SFB-NEXT: sw a4, 0(a3)
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i8_s_store_4:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: fence rw, rw
; RV64I-SFB-NEXT: lb a0, 4(a0)
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: bnez a1, .LBB27_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB27_2: # %entry
; RV64I-SFB-NEXT: sw a4, 0(a3)
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i8_s_store_4:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: fence rw, rw
; RV32I-SFBILOAD-NEXT: lb a0, 4(a0)
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: bnez a1, .LBB27_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: .LBB27_2: # %entry
; RV32I-SFBILOAD-NEXT: sw a4, 0(a3)
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i8_s_store_4:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: fence rw, rw
; RV64I-SFBILOAD-NEXT: lb a0, 4(a0)
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB27_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB27_2: # %entry
; RV64I-SFBILOAD-NEXT: sw a4, 0(a3)
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i8, ptr %base, i32 4 ; compute base + 4
%val = load atomic i8, ptr %addr seq_cst, align 1 ; load 8-bit value
%ext = sext i8 %val to i32 ; sign-extend to 32 bits
store i32 %c, ptr %base1
%res = select i1 %x, i32 %ext, i32 %b
ret i32 %res
}
define i32 @test_i8_z_store_4(ptr %base, i1 zeroext %x, i32 %b, ptr %base1, i32 %c) nounwind {
; RV32I-LABEL: test_i8_z_store_4:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: fence rw, rw
; RV32I-NEXT: lbu a0, 4(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: sw a4, 0(a3)
; RV32I-NEXT: bnez a1, .LBB28_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: .LBB28_2: # %entry
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i8_z_store_4:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: fence rw, rw
; RV64I-NEXT: lbu a0, 4(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: sw a4, 0(a3)
; RV64I-NEXT: bnez a1, .LBB28_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB28_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i8_z_store_4:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: fence rw, rw
; RV32I-SFB-NEXT: lbu a0, 4(a0)
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: bnez a1, .LBB28_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: .LBB28_2: # %entry
; RV32I-SFB-NEXT: sw a4, 0(a3)
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i8_z_store_4:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: fence rw, rw
; RV64I-SFB-NEXT: lbu a0, 4(a0)
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: bnez a1, .LBB28_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB28_2: # %entry
; RV64I-SFB-NEXT: sw a4, 0(a3)
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i8_z_store_4:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: fence rw, rw
; RV32I-SFBILOAD-NEXT: lbu a0, 4(a0)
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: bnez a1, .LBB28_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: .LBB28_2: # %entry
; RV32I-SFBILOAD-NEXT: sw a4, 0(a3)
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i8_z_store_4:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: fence rw, rw
; RV64I-SFBILOAD-NEXT: lbu a0, 4(a0)
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB28_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB28_2: # %entry
; RV64I-SFBILOAD-NEXT: sw a4, 0(a3)
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i8, ptr %base, i32 4 ; compute base + 4
%val = load atomic i8, ptr %addr seq_cst, align 1 ; load 8-bit value
%ext = zext i8 %val to i32 ; zero-extend to 32 bits
store i32 %c, ptr %base1
%res = select i1 %x, i32 %ext, i32 %b
ret i32 %res
}
define i32 @test_i16_s_store_4(ptr %base, i1 zeroext %x, i32 %b, ptr %base1, i32 %c) nounwind {
; RV32I-LABEL: test_i16_s_store_4:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: fence rw, rw
; RV32I-NEXT: lh a0, 8(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: sw a4, 0(a3)
; RV32I-NEXT: bnez a1, .LBB29_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: .LBB29_2: # %entry
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i16_s_store_4:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: fence rw, rw
; RV64I-NEXT: lh a0, 8(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: sw a4, 0(a3)
; RV64I-NEXT: bnez a1, .LBB29_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB29_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i16_s_store_4:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: fence rw, rw
; RV32I-SFB-NEXT: lh a0, 8(a0)
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: bnez a1, .LBB29_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: .LBB29_2: # %entry
; RV32I-SFB-NEXT: sw a4, 0(a3)
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i16_s_store_4:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: fence rw, rw
; RV64I-SFB-NEXT: lh a0, 8(a0)
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: bnez a1, .LBB29_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB29_2: # %entry
; RV64I-SFB-NEXT: sw a4, 0(a3)
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i16_s_store_4:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: fence rw, rw
; RV32I-SFBILOAD-NEXT: lh a0, 8(a0)
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: bnez a1, .LBB29_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: .LBB29_2: # %entry
; RV32I-SFBILOAD-NEXT: sw a4, 0(a3)
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i16_s_store_4:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: fence rw, rw
; RV64I-SFBILOAD-NEXT: lh a0, 8(a0)
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB29_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB29_2: # %entry
; RV64I-SFBILOAD-NEXT: sw a4, 0(a3)
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i16, ptr %base, i32 4 ; compute base + 4
%val = load atomic i16, ptr %addr seq_cst, align 2 ; load 16-bit value
%ext = sext i16 %val to i32 ; sign-extend to 32 bits
store i32 %c, ptr %base1
%res = select i1 %x, i32 %ext, i32 %b
ret i32 %res
}
define i32 @test_i16_z_store_4(ptr %base, i1 zeroext %x, i32 %b, ptr %base1, i32 %c) nounwind {
; RV32I-LABEL: test_i16_z_store_4:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: fence rw, rw
; RV32I-NEXT: lhu a0, 8(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: sw a4, 0(a3)
; RV32I-NEXT: bnez a1, .LBB30_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: .LBB30_2: # %entry
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i16_z_store_4:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: fence rw, rw
; RV64I-NEXT: lhu a0, 8(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: sw a4, 0(a3)
; RV64I-NEXT: bnez a1, .LBB30_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB30_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i16_z_store_4:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: fence rw, rw
; RV32I-SFB-NEXT: lhu a0, 8(a0)
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: bnez a1, .LBB30_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: .LBB30_2: # %entry
; RV32I-SFB-NEXT: sw a4, 0(a3)
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i16_z_store_4:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: fence rw, rw
; RV64I-SFB-NEXT: lhu a0, 8(a0)
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: bnez a1, .LBB30_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB30_2: # %entry
; RV64I-SFB-NEXT: sw a4, 0(a3)
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i16_z_store_4:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: fence rw, rw
; RV32I-SFBILOAD-NEXT: lhu a0, 8(a0)
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: bnez a1, .LBB30_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: .LBB30_2: # %entry
; RV32I-SFBILOAD-NEXT: sw a4, 0(a3)
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i16_z_store_4:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: fence rw, rw
; RV64I-SFBILOAD-NEXT: lhu a0, 8(a0)
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB30_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB30_2: # %entry
; RV64I-SFBILOAD-NEXT: sw a4, 0(a3)
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i16, ptr %base, i32 4 ; compute base + 4
%val = load atomic i16, ptr %addr seq_cst, align 2 ; load 16-bit value
%ext = zext i16 %val to i32 ; zero-extend to 32 bits
store i32 %c, ptr %base1
%res = select i1 %x, i32 %ext, i32 %b
ret i32 %res
}
define i32 @test_i32_store_4(ptr %base, i1 zeroext %x, i32 %b, ptr %base1, i32 %c) nounwind {
; RV32I-LABEL: test_i32_store_4:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: fence rw, rw
; RV32I-NEXT: lw a0, 16(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: sw a4, 0(a3)
; RV32I-NEXT: bnez a1, .LBB31_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: .LBB31_2: # %entry
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i32_store_4:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: fence rw, rw
; RV64I-NEXT: lw a0, 16(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: sw a4, 0(a3)
; RV64I-NEXT: bnez a1, .LBB31_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB31_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i32_store_4:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: fence rw, rw
; RV32I-SFB-NEXT: lw a0, 16(a0)
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: bnez a1, .LBB31_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: .LBB31_2: # %entry
; RV32I-SFB-NEXT: sw a4, 0(a3)
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i32_store_4:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: fence rw, rw
; RV64I-SFB-NEXT: lw a0, 16(a0)
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: bnez a1, .LBB31_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB31_2: # %entry
; RV64I-SFB-NEXT: sw a4, 0(a3)
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i32_store_4:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: fence rw, rw
; RV32I-SFBILOAD-NEXT: lw a0, 16(a0)
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: bnez a1, .LBB31_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: .LBB31_2: # %entry
; RV32I-SFBILOAD-NEXT: sw a4, 0(a3)
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i32_store_4:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: fence rw, rw
; RV64I-SFBILOAD-NEXT: lw a0, 16(a0)
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB31_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB31_2: # %entry
; RV64I-SFBILOAD-NEXT: sw a4, 0(a3)
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i32, ptr %base, i32 4 ; compute base + 4
%val = load atomic i32, ptr %addr seq_cst, align 4 ; load 32-bit value
store i32 %c, ptr %base1
%res = select i1 %x, i32 %val, i32 %b
ret i32 %res
}
define i64 @test_i8_s_1_4(ptr %base, i1 zeroext %x, i64 %b) nounwind {
; RV32I-LABEL: test_i8_s_1_4:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: fence rw, rw
; RV32I-NEXT: lb a0, 4(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: bnez a1, .LBB32_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: mv a1, a3
; RV32I-NEXT: ret
; RV32I-NEXT: .LBB32_2:
; RV32I-NEXT: srai a1, a0, 31
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i8_s_1_4:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: fence rw, rw
; RV64I-NEXT: lb a0, 4(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: bnez a1, .LBB32_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB32_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i8_s_1_4:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: fence rw, rw
; RV32I-SFB-NEXT: lb a0, 4(a0)
; RV32I-SFB-NEXT: beqz a1, .LBB32_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a2, a0
; RV32I-SFB-NEXT: .LBB32_2: # %entry
; RV32I-SFB-NEXT: beqz a1, .LBB32_4
; RV32I-SFB-NEXT: # %bb.3: # %entry
; RV32I-SFB-NEXT: srai a3, a0, 31
; RV32I-SFB-NEXT: .LBB32_4: # %entry
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: mv a1, a3
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i8_s_1_4:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: fence rw, rw
; RV64I-SFB-NEXT: lb a0, 4(a0)
; RV64I-SFB-NEXT: bnez a1, .LBB32_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB32_2: # %entry
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i8_s_1_4:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: fence rw, rw
; RV32I-SFBILOAD-NEXT: lb a0, 4(a0)
; RV32I-SFBILOAD-NEXT: beqz a1, .LBB32_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a2, a0
; RV32I-SFBILOAD-NEXT: .LBB32_2: # %entry
; RV32I-SFBILOAD-NEXT: beqz a1, .LBB32_4
; RV32I-SFBILOAD-NEXT: # %bb.3: # %entry
; RV32I-SFBILOAD-NEXT: srai a3, a0, 31
; RV32I-SFBILOAD-NEXT: .LBB32_4: # %entry
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: mv a1, a3
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i8_s_1_4:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: fence rw, rw
; RV64I-SFBILOAD-NEXT: lb a0, 4(a0)
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB32_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB32_2: # %entry
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i8, ptr %base, i64 4 ; compute base + 4
%val = load atomic i8, ptr %addr seq_cst, align 1 ; load 8-bit value
%ext = sext i8 %val to i64 ; sign-extend to 64 bits
%res = select i1 %x, i64 %ext, i64 %b
ret i64 %res
}
define i64 @test_i8_z_1_4(ptr %base, i1 zeroext %x, i64 %b) nounwind {
; RV32I-LABEL: test_i8_z_1_4:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: fence rw, rw
; RV32I-NEXT: lbu a0, 4(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: bnez a1, .LBB33_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: .LBB33_2: # %entry
; RV32I-NEXT: addi a1, a1, -1
; RV32I-NEXT: and a1, a1, a3
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i8_z_1_4:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: fence rw, rw
; RV64I-NEXT: lbu a0, 4(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: bnez a1, .LBB33_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB33_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i8_z_1_4:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: fence rw, rw
; RV32I-SFB-NEXT: lbu a0, 4(a0)
; RV32I-SFB-NEXT: bnez a1, .LBB33_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: .LBB33_2: # %entry
; RV32I-SFB-NEXT: beqz a1, .LBB33_4
; RV32I-SFB-NEXT: # %bb.3: # %entry
; RV32I-SFB-NEXT: li a3, 0
; RV32I-SFB-NEXT: .LBB33_4: # %entry
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: mv a1, a3
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i8_z_1_4:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: fence rw, rw
; RV64I-SFB-NEXT: lbu a0, 4(a0)
; RV64I-SFB-NEXT: bnez a1, .LBB33_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB33_2: # %entry
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i8_z_1_4:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: fence rw, rw
; RV32I-SFBILOAD-NEXT: lbu a0, 4(a0)
; RV32I-SFBILOAD-NEXT: bnez a1, .LBB33_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: .LBB33_2: # %entry
; RV32I-SFBILOAD-NEXT: beqz a1, .LBB33_4
; RV32I-SFBILOAD-NEXT: # %bb.3: # %entry
; RV32I-SFBILOAD-NEXT: li a3, 0
; RV32I-SFBILOAD-NEXT: .LBB33_4: # %entry
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: mv a1, a3
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i8_z_1_4:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: fence rw, rw
; RV64I-SFBILOAD-NEXT: lbu a0, 4(a0)
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB33_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB33_2: # %entry
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i8, ptr %base, i64 4 ; compute base + 4
%val = load atomic i8, ptr %addr seq_cst, align 1 ; load 8-bit value
%ext = zext i8 %val to i64 ; zero-extend to 64 bits
%res = select i1 %x, i64 %ext, i64 %b
ret i64 %res
}
define i64 @test_i16_s_1_4(ptr %base, i1 zeroext %x, i64 %b) nounwind {
; RV32I-LABEL: test_i16_s_1_4:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: fence rw, rw
; RV32I-NEXT: lh a0, 8(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: bnez a1, .LBB34_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: mv a1, a3
; RV32I-NEXT: ret
; RV32I-NEXT: .LBB34_2:
; RV32I-NEXT: srai a1, a0, 31
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i16_s_1_4:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: fence rw, rw
; RV64I-NEXT: lh a0, 8(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: bnez a1, .LBB34_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB34_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i16_s_1_4:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: fence rw, rw
; RV32I-SFB-NEXT: lh a0, 8(a0)
; RV32I-SFB-NEXT: beqz a1, .LBB34_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a2, a0
; RV32I-SFB-NEXT: .LBB34_2: # %entry
; RV32I-SFB-NEXT: beqz a1, .LBB34_4
; RV32I-SFB-NEXT: # %bb.3: # %entry
; RV32I-SFB-NEXT: srai a3, a0, 31
; RV32I-SFB-NEXT: .LBB34_4: # %entry
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: mv a1, a3
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i16_s_1_4:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: fence rw, rw
; RV64I-SFB-NEXT: lh a0, 8(a0)
; RV64I-SFB-NEXT: bnez a1, .LBB34_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB34_2: # %entry
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i16_s_1_4:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: fence rw, rw
; RV32I-SFBILOAD-NEXT: lh a0, 8(a0)
; RV32I-SFBILOAD-NEXT: beqz a1, .LBB34_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a2, a0
; RV32I-SFBILOAD-NEXT: .LBB34_2: # %entry
; RV32I-SFBILOAD-NEXT: beqz a1, .LBB34_4
; RV32I-SFBILOAD-NEXT: # %bb.3: # %entry
; RV32I-SFBILOAD-NEXT: srai a3, a0, 31
; RV32I-SFBILOAD-NEXT: .LBB34_4: # %entry
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: mv a1, a3
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i16_s_1_4:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: fence rw, rw
; RV64I-SFBILOAD-NEXT: lh a0, 8(a0)
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB34_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB34_2: # %entry
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i16, ptr %base, i64 4 ; compute base + 4
%val = load atomic i16, ptr %addr seq_cst, align 2 ; load 16-bit value
%ext = sext i16 %val to i64 ; sign-extend to 64 bits
%res = select i1 %x, i64 %ext, i64 %b
ret i64 %res
}
define i64 @test_i16_z_1_4(ptr %base, i1 zeroext %x, i64 %b) nounwind {
; RV32I-LABEL: test_i16_z_1_4:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: fence rw, rw
; RV32I-NEXT: lhu a0, 8(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: bnez a1, .LBB35_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: .LBB35_2: # %entry
; RV32I-NEXT: addi a1, a1, -1
; RV32I-NEXT: and a1, a1, a3
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i16_z_1_4:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: fence rw, rw
; RV64I-NEXT: lhu a0, 8(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: bnez a1, .LBB35_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB35_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i16_z_1_4:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: fence rw, rw
; RV32I-SFB-NEXT: lhu a0, 8(a0)
; RV32I-SFB-NEXT: bnez a1, .LBB35_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: .LBB35_2: # %entry
; RV32I-SFB-NEXT: beqz a1, .LBB35_4
; RV32I-SFB-NEXT: # %bb.3: # %entry
; RV32I-SFB-NEXT: li a3, 0
; RV32I-SFB-NEXT: .LBB35_4: # %entry
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: mv a1, a3
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i16_z_1_4:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: fence rw, rw
; RV64I-SFB-NEXT: lhu a0, 8(a0)
; RV64I-SFB-NEXT: bnez a1, .LBB35_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB35_2: # %entry
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i16_z_1_4:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: fence rw, rw
; RV32I-SFBILOAD-NEXT: lhu a0, 8(a0)
; RV32I-SFBILOAD-NEXT: bnez a1, .LBB35_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: .LBB35_2: # %entry
; RV32I-SFBILOAD-NEXT: beqz a1, .LBB35_4
; RV32I-SFBILOAD-NEXT: # %bb.3: # %entry
; RV32I-SFBILOAD-NEXT: li a3, 0
; RV32I-SFBILOAD-NEXT: .LBB35_4: # %entry
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: mv a1, a3
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i16_z_1_4:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: fence rw, rw
; RV64I-SFBILOAD-NEXT: lhu a0, 8(a0)
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB35_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB35_2: # %entry
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i16, ptr %base, i64 4 ; compute base + 4
%val = load atomic i16, ptr %addr seq_cst, align 2 ; load 16-bit value
%ext = zext i16 %val to i64 ; zero-extend to 64 bits
%res = select i1 %x, i64 %ext, i64 %b
ret i64 %res
}
define i64 @test_i32_z_1_4(ptr %base, i1 zeroext %x, i64 %b) nounwind {
; RV32I-LABEL: test_i32_z_1_4:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: fence rw, rw
; RV32I-NEXT: lw a0, 16(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: bnez a1, .LBB36_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: .LBB36_2: # %entry
; RV32I-NEXT: addi a1, a1, -1
; RV32I-NEXT: and a1, a1, a3
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i32_z_1_4:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: fence rw, rw
; RV64I-NEXT: lwu a0, 16(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: bnez a1, .LBB36_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB36_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i32_z_1_4:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: fence rw, rw
; RV32I-SFB-NEXT: lw a0, 16(a0)
; RV32I-SFB-NEXT: bnez a1, .LBB36_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: .LBB36_2: # %entry
; RV32I-SFB-NEXT: beqz a1, .LBB36_4
; RV32I-SFB-NEXT: # %bb.3: # %entry
; RV32I-SFB-NEXT: li a3, 0
; RV32I-SFB-NEXT: .LBB36_4: # %entry
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: mv a1, a3
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i32_z_1_4:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: fence rw, rw
; RV64I-SFB-NEXT: lwu a0, 16(a0)
; RV64I-SFB-NEXT: bnez a1, .LBB36_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB36_2: # %entry
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i32_z_1_4:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: fence rw, rw
; RV32I-SFBILOAD-NEXT: lw a0, 16(a0)
; RV32I-SFBILOAD-NEXT: bnez a1, .LBB36_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: .LBB36_2: # %entry
; RV32I-SFBILOAD-NEXT: beqz a1, .LBB36_4
; RV32I-SFBILOAD-NEXT: # %bb.3: # %entry
; RV32I-SFBILOAD-NEXT: li a3, 0
; RV32I-SFBILOAD-NEXT: .LBB36_4: # %entry
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: mv a1, a3
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i32_z_1_4:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: fence rw, rw
; RV64I-SFBILOAD-NEXT: lwu a0, 16(a0)
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB36_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB36_2: # %entry
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i32, ptr %base, i64 4 ; compute base + 4
%val = load atomic i32, ptr %addr seq_cst, align 4 ; load 32-bit value
%ext = zext i32 %val to i64 ; zero-extend to 64 bits
%res = select i1 %x, i64 %ext, i64 %b
ret i64 %res
}
define i64 @test_i64_1_4(ptr %base, i1 zeroext %x, i64 %b) nounwind {
; RV32I-LABEL: test_i64_1_4:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a3
; RV32I-NEXT: mv s1, a2
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: addi a0, a0, 32
; RV32I-NEXT: li a1, 5
; RV32I-NEXT: call __atomic_load_8
; RV32I-NEXT: bnez s2, .LBB37_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: mv a1, s0
; RV32I-NEXT: .LBB37_2: # %entry
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i64_1_4:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: fence rw, rw
; RV64I-NEXT: ld a0, 32(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: bnez a1, .LBB37_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB37_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i64_1_4:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: addi sp, sp, -16
; RV32I-SFB-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-SFB-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
; RV32I-SFB-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
; RV32I-SFB-NEXT: sw s2, 0(sp) # 4-byte Folded Spill
; RV32I-SFB-NEXT: mv s0, a3
; RV32I-SFB-NEXT: mv s1, a2
; RV32I-SFB-NEXT: mv s2, a1
; RV32I-SFB-NEXT: addi a0, a0, 32
; RV32I-SFB-NEXT: li a1, 5
; RV32I-SFB-NEXT: call __atomic_load_8
; RV32I-SFB-NEXT: bnez s2, .LBB37_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a0, s1
; RV32I-SFB-NEXT: .LBB37_2: # %entry
; RV32I-SFB-NEXT: bnez s2, .LBB37_4
; RV32I-SFB-NEXT: # %bb.3: # %entry
; RV32I-SFB-NEXT: mv a1, s0
; RV32I-SFB-NEXT: .LBB37_4: # %entry
; RV32I-SFB-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-SFB-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
; RV32I-SFB-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
; RV32I-SFB-NEXT: lw s2, 0(sp) # 4-byte Folded Reload
; RV32I-SFB-NEXT: addi sp, sp, 16
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i64_1_4:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: fence rw, rw
; RV64I-SFB-NEXT: ld a0, 32(a0)
; RV64I-SFB-NEXT: bnez a1, .LBB37_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB37_2: # %entry
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i64_1_4:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: addi sp, sp, -16
; RV32I-SFBILOAD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-SFBILOAD-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
; RV32I-SFBILOAD-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
; RV32I-SFBILOAD-NEXT: sw s2, 0(sp) # 4-byte Folded Spill
; RV32I-SFBILOAD-NEXT: mv s0, a3
; RV32I-SFBILOAD-NEXT: mv s1, a2
; RV32I-SFBILOAD-NEXT: mv s2, a1
; RV32I-SFBILOAD-NEXT: addi a0, a0, 32
; RV32I-SFBILOAD-NEXT: li a1, 5
; RV32I-SFBILOAD-NEXT: call __atomic_load_8
; RV32I-SFBILOAD-NEXT: bnez s2, .LBB37_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, s1
; RV32I-SFBILOAD-NEXT: .LBB37_2: # %entry
; RV32I-SFBILOAD-NEXT: bnez s2, .LBB37_4
; RV32I-SFBILOAD-NEXT: # %bb.3: # %entry
; RV32I-SFBILOAD-NEXT: mv a1, s0
; RV32I-SFBILOAD-NEXT: .LBB37_4: # %entry
; RV32I-SFBILOAD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-SFBILOAD-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
; RV32I-SFBILOAD-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
; RV32I-SFBILOAD-NEXT: lw s2, 0(sp) # 4-byte Folded Reload
; RV32I-SFBILOAD-NEXT: addi sp, sp, 16
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i64_1_4:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: fence rw, rw
; RV64I-SFBILOAD-NEXT: ld a0, 32(a0)
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB37_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB37_2: # %entry
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i64, ptr %base, i64 4 ; compute base + 4
%val = load atomic i64, ptr %addr seq_cst, align 8 ; load 64-bit value
%res = select i1 %x, i64 %val, i64 %b
ret i64 %res
}
define i64 @test_i8_s_store_64_4(ptr %base, i1 zeroext %x, i64 %b, ptr %base1, i64 %c) nounwind {
; RV32I-LABEL: test_i8_s_store_64_4:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: fence rw, rw
; RV32I-NEXT: lb a0, 4(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: sw a5, 0(a4)
; RV32I-NEXT: sw a6, 4(a4)
; RV32I-NEXT: bnez a1, .LBB38_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: mv a1, a3
; RV32I-NEXT: ret
; RV32I-NEXT: .LBB38_2:
; RV32I-NEXT: srai a1, a0, 31
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i8_s_store_64_4:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: fence rw, rw
; RV64I-NEXT: lb a0, 4(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: sd a4, 0(a3)
; RV64I-NEXT: bnez a1, .LBB38_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB38_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i8_s_store_64_4:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: fence rw, rw
; RV32I-SFB-NEXT: lb a0, 4(a0)
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: sw a5, 0(a4)
; RV32I-SFB-NEXT: beqz a1, .LBB38_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a2, a0
; RV32I-SFB-NEXT: .LBB38_2: # %entry
; RV32I-SFB-NEXT: beqz a1, .LBB38_4
; RV32I-SFB-NEXT: # %bb.3: # %entry
; RV32I-SFB-NEXT: srai a3, a0, 31
; RV32I-SFB-NEXT: .LBB38_4: # %entry
; RV32I-SFB-NEXT: sw a6, 4(a4)
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: mv a1, a3
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i8_s_store_64_4:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: fence rw, rw
; RV64I-SFB-NEXT: lb a0, 4(a0)
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: bnez a1, .LBB38_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB38_2: # %entry
; RV64I-SFB-NEXT: sd a4, 0(a3)
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i8_s_store_64_4:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: fence rw, rw
; RV32I-SFBILOAD-NEXT: lb a0, 4(a0)
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: sw a5, 0(a4)
; RV32I-SFBILOAD-NEXT: beqz a1, .LBB38_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a2, a0
; RV32I-SFBILOAD-NEXT: .LBB38_2: # %entry
; RV32I-SFBILOAD-NEXT: beqz a1, .LBB38_4
; RV32I-SFBILOAD-NEXT: # %bb.3: # %entry
; RV32I-SFBILOAD-NEXT: srai a3, a0, 31
; RV32I-SFBILOAD-NEXT: .LBB38_4: # %entry
; RV32I-SFBILOAD-NEXT: sw a6, 4(a4)
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: mv a1, a3
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i8_s_store_64_4:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: fence rw, rw
; RV64I-SFBILOAD-NEXT: lb a0, 4(a0)
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB38_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB38_2: # %entry
; RV64I-SFBILOAD-NEXT: sd a4, 0(a3)
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i8, ptr %base, i64 4 ; compute base + 4
%val = load atomic i8, ptr %addr seq_cst, align 1 ; load 8-bit value
%ext = sext i8 %val to i64 ; sign-extend to 64 bits
store i64 %c, ptr %base1
%res = select i1 %x, i64 %ext, i64 %b
ret i64 %res
}
define i64 @test_i8_z_store_64_4(ptr %base, i1 zeroext %x, i64 %b, ptr %base1, i64 %c) nounwind {
; RV32I-LABEL: test_i8_z_store_64_4:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: fence rw, rw
; RV32I-NEXT: lbu a0, 4(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: sw a5, 0(a4)
; RV32I-NEXT: sw a6, 4(a4)
; RV32I-NEXT: bnez a1, .LBB39_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: .LBB39_2: # %entry
; RV32I-NEXT: addi a1, a1, -1
; RV32I-NEXT: and a1, a1, a3
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i8_z_store_64_4:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: fence rw, rw
; RV64I-NEXT: lbu a0, 4(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: sd a4, 0(a3)
; RV64I-NEXT: bnez a1, .LBB39_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB39_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i8_z_store_64_4:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: fence rw, rw
; RV32I-SFB-NEXT: lbu a0, 4(a0)
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: beqz a1, .LBB39_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: li a3, 0
; RV32I-SFB-NEXT: .LBB39_2: # %entry
; RV32I-SFB-NEXT: bnez a1, .LBB39_4
; RV32I-SFB-NEXT: # %bb.3: # %entry
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: .LBB39_4: # %entry
; RV32I-SFB-NEXT: sw a5, 0(a4)
; RV32I-SFB-NEXT: sw a6, 4(a4)
; RV32I-SFB-NEXT: mv a1, a3
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i8_z_store_64_4:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: fence rw, rw
; RV64I-SFB-NEXT: lbu a0, 4(a0)
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: bnez a1, .LBB39_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB39_2: # %entry
; RV64I-SFB-NEXT: sd a4, 0(a3)
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i8_z_store_64_4:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: fence rw, rw
; RV32I-SFBILOAD-NEXT: lbu a0, 4(a0)
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: beqz a1, .LBB39_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: li a3, 0
; RV32I-SFBILOAD-NEXT: .LBB39_2: # %entry
; RV32I-SFBILOAD-NEXT: bnez a1, .LBB39_4
; RV32I-SFBILOAD-NEXT: # %bb.3: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: .LBB39_4: # %entry
; RV32I-SFBILOAD-NEXT: sw a5, 0(a4)
; RV32I-SFBILOAD-NEXT: sw a6, 4(a4)
; RV32I-SFBILOAD-NEXT: mv a1, a3
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i8_z_store_64_4:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: fence rw, rw
; RV64I-SFBILOAD-NEXT: lbu a0, 4(a0)
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB39_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB39_2: # %entry
; RV64I-SFBILOAD-NEXT: sd a4, 0(a3)
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i8, ptr %base, i64 4 ; compute base + 4
%val = load atomic i8, ptr %addr seq_cst, align 1 ; load 8-bit value
%ext = zext i8 %val to i64 ; zero-extend to 64 bits
store i64 %c, ptr %base1
%res = select i1 %x, i64 %ext, i64 %b
ret i64 %res
}
define i64 @test_i16_s_store_64_4(ptr %base, i1 zeroext %x, i64 %b, ptr %base1, i64 %c) nounwind {
; RV32I-LABEL: test_i16_s_store_64_4:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: fence rw, rw
; RV32I-NEXT: lh a0, 8(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: sw a5, 0(a4)
; RV32I-NEXT: sw a6, 4(a4)
; RV32I-NEXT: bnez a1, .LBB40_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: mv a1, a3
; RV32I-NEXT: ret
; RV32I-NEXT: .LBB40_2:
; RV32I-NEXT: srai a1, a0, 31
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i16_s_store_64_4:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: fence rw, rw
; RV64I-NEXT: lh a0, 8(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: sd a4, 0(a3)
; RV64I-NEXT: bnez a1, .LBB40_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB40_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i16_s_store_64_4:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: fence rw, rw
; RV32I-SFB-NEXT: lh a0, 8(a0)
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: sw a5, 0(a4)
; RV32I-SFB-NEXT: beqz a1, .LBB40_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a2, a0
; RV32I-SFB-NEXT: .LBB40_2: # %entry
; RV32I-SFB-NEXT: beqz a1, .LBB40_4
; RV32I-SFB-NEXT: # %bb.3: # %entry
; RV32I-SFB-NEXT: srai a3, a0, 31
; RV32I-SFB-NEXT: .LBB40_4: # %entry
; RV32I-SFB-NEXT: sw a6, 4(a4)
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: mv a1, a3
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i16_s_store_64_4:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: fence rw, rw
; RV64I-SFB-NEXT: lh a0, 8(a0)
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: bnez a1, .LBB40_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB40_2: # %entry
; RV64I-SFB-NEXT: sd a4, 0(a3)
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i16_s_store_64_4:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: fence rw, rw
; RV32I-SFBILOAD-NEXT: lh a0, 8(a0)
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: sw a5, 0(a4)
; RV32I-SFBILOAD-NEXT: beqz a1, .LBB40_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a2, a0
; RV32I-SFBILOAD-NEXT: .LBB40_2: # %entry
; RV32I-SFBILOAD-NEXT: beqz a1, .LBB40_4
; RV32I-SFBILOAD-NEXT: # %bb.3: # %entry
; RV32I-SFBILOAD-NEXT: srai a3, a0, 31
; RV32I-SFBILOAD-NEXT: .LBB40_4: # %entry
; RV32I-SFBILOAD-NEXT: sw a6, 4(a4)
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: mv a1, a3
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i16_s_store_64_4:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: fence rw, rw
; RV64I-SFBILOAD-NEXT: lh a0, 8(a0)
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB40_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB40_2: # %entry
; RV64I-SFBILOAD-NEXT: sd a4, 0(a3)
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i16, ptr %base, i64 4 ; compute base + 4
%val = load atomic i16, ptr %addr seq_cst, align 2 ; load 16-bit value
%ext = sext i16 %val to i64 ; sign-extend to 64 bits
store i64 %c, ptr %base1
%res = select i1 %x, i64 %ext, i64 %b
ret i64 %res
}
define i64 @test_i16_z_store_64_4(ptr %base, i1 zeroext %x, i64 %b, ptr %base1, i64 %c) nounwind {
; RV32I-LABEL: test_i16_z_store_64_4:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: fence rw, rw
; RV32I-NEXT: lhu a0, 8(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: sw a5, 0(a4)
; RV32I-NEXT: sw a6, 4(a4)
; RV32I-NEXT: bnez a1, .LBB41_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: .LBB41_2: # %entry
; RV32I-NEXT: addi a1, a1, -1
; RV32I-NEXT: and a1, a1, a3
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i16_z_store_64_4:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: fence rw, rw
; RV64I-NEXT: lhu a0, 8(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: sd a4, 0(a3)
; RV64I-NEXT: bnez a1, .LBB41_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB41_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i16_z_store_64_4:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: fence rw, rw
; RV32I-SFB-NEXT: lhu a0, 8(a0)
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: beqz a1, .LBB41_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: li a3, 0
; RV32I-SFB-NEXT: .LBB41_2: # %entry
; RV32I-SFB-NEXT: bnez a1, .LBB41_4
; RV32I-SFB-NEXT: # %bb.3: # %entry
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: .LBB41_4: # %entry
; RV32I-SFB-NEXT: sw a5, 0(a4)
; RV32I-SFB-NEXT: sw a6, 4(a4)
; RV32I-SFB-NEXT: mv a1, a3
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i16_z_store_64_4:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: fence rw, rw
; RV64I-SFB-NEXT: lhu a0, 8(a0)
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: bnez a1, .LBB41_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB41_2: # %entry
; RV64I-SFB-NEXT: sd a4, 0(a3)
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i16_z_store_64_4:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: fence rw, rw
; RV32I-SFBILOAD-NEXT: lhu a0, 8(a0)
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: beqz a1, .LBB41_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: li a3, 0
; RV32I-SFBILOAD-NEXT: .LBB41_2: # %entry
; RV32I-SFBILOAD-NEXT: bnez a1, .LBB41_4
; RV32I-SFBILOAD-NEXT: # %bb.3: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: .LBB41_4: # %entry
; RV32I-SFBILOAD-NEXT: sw a5, 0(a4)
; RV32I-SFBILOAD-NEXT: sw a6, 4(a4)
; RV32I-SFBILOAD-NEXT: mv a1, a3
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i16_z_store_64_4:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: fence rw, rw
; RV64I-SFBILOAD-NEXT: lhu a0, 8(a0)
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB41_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB41_2: # %entry
; RV64I-SFBILOAD-NEXT: sd a4, 0(a3)
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i16, ptr %base, i64 4 ; compute base + 4
%val = load atomic i16, ptr %addr seq_cst, align 2 ; load 16-bit value
%ext = zext i16 %val to i64 ; zero-extend to 64 bits
store i64 %c, ptr %base1
%res = select i1 %x, i64 %ext, i64 %b
ret i64 %res
}
define i64 @test_i32_z_store_64_4(ptr %base, i1 zeroext %x, i64 %b, ptr %base1, i64 %c) nounwind {
; RV32I-LABEL: test_i32_z_store_64_4:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: fence rw, rw
; RV32I-NEXT: lw a0, 16(a0)
; RV32I-NEXT: fence r, rw
; RV32I-NEXT: sw a5, 0(a4)
; RV32I-NEXT: sw a6, 4(a4)
; RV32I-NEXT: bnez a1, .LBB42_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, a2
; RV32I-NEXT: .LBB42_2: # %entry
; RV32I-NEXT: addi a1, a1, -1
; RV32I-NEXT: and a1, a1, a3
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i32_z_store_64_4:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: fence rw, rw
; RV64I-NEXT: lwu a0, 16(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: sd a4, 0(a3)
; RV64I-NEXT: bnez a1, .LBB42_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB42_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i32_z_store_64_4:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: fence rw, rw
; RV32I-SFB-NEXT: lw a0, 16(a0)
; RV32I-SFB-NEXT: fence r, rw
; RV32I-SFB-NEXT: beqz a1, .LBB42_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: li a3, 0
; RV32I-SFB-NEXT: .LBB42_2: # %entry
; RV32I-SFB-NEXT: bnez a1, .LBB42_4
; RV32I-SFB-NEXT: # %bb.3: # %entry
; RV32I-SFB-NEXT: mv a0, a2
; RV32I-SFB-NEXT: .LBB42_4: # %entry
; RV32I-SFB-NEXT: sw a5, 0(a4)
; RV32I-SFB-NEXT: sw a6, 4(a4)
; RV32I-SFB-NEXT: mv a1, a3
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i32_z_store_64_4:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: fence rw, rw
; RV64I-SFB-NEXT: lwu a0, 16(a0)
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: bnez a1, .LBB42_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB42_2: # %entry
; RV64I-SFB-NEXT: sd a4, 0(a3)
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i32_z_store_64_4:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: fence rw, rw
; RV32I-SFBILOAD-NEXT: lw a0, 16(a0)
; RV32I-SFBILOAD-NEXT: fence r, rw
; RV32I-SFBILOAD-NEXT: beqz a1, .LBB42_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: li a3, 0
; RV32I-SFBILOAD-NEXT: .LBB42_2: # %entry
; RV32I-SFBILOAD-NEXT: bnez a1, .LBB42_4
; RV32I-SFBILOAD-NEXT: # %bb.3: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, a2
; RV32I-SFBILOAD-NEXT: .LBB42_4: # %entry
; RV32I-SFBILOAD-NEXT: sw a5, 0(a4)
; RV32I-SFBILOAD-NEXT: sw a6, 4(a4)
; RV32I-SFBILOAD-NEXT: mv a1, a3
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i32_z_store_64_4:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: fence rw, rw
; RV64I-SFBILOAD-NEXT: lwu a0, 16(a0)
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB42_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB42_2: # %entry
; RV64I-SFBILOAD-NEXT: sd a4, 0(a3)
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i32, ptr %base, i64 4 ; compute base + 4
%val = load atomic i32, ptr %addr seq_cst, align 4 ; load 32-bit value
%ext = zext i32 %val to i64 ; zero-extend to 64 bits
store i64 %c, ptr %base1
%res = select i1 %x, i64 %ext, i64 %b
ret i64 %res
}
define i64 @test_i64_store_64_4(ptr %base, i1 zeroext %x, i64 %b, ptr %base1, i64 %c) nounwind {
; RV32I-LABEL: test_i64_store_64_4:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s4, 8(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s5, 4(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s2, a6
; RV32I-NEXT: mv s3, a5
; RV32I-NEXT: mv s4, a4
; RV32I-NEXT: mv s0, a3
; RV32I-NEXT: mv s1, a2
; RV32I-NEXT: mv s5, a1
; RV32I-NEXT: addi a0, a0, 32
; RV32I-NEXT: li a1, 5
; RV32I-NEXT: call __atomic_load_8
; RV32I-NEXT: sw s3, 0(s4)
; RV32I-NEXT: sw s2, 4(s4)
; RV32I-NEXT: bnez s5, .LBB43_2
; RV32I-NEXT: # %bb.1: # %entry
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: mv a1, s0
; RV32I-NEXT: .LBB43_2: # %entry
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s4, 8(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s5, 4(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV64I-LABEL: test_i64_store_64_4:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: fence rw, rw
; RV64I-NEXT: ld a0, 32(a0)
; RV64I-NEXT: fence r, rw
; RV64I-NEXT: sd a4, 0(a3)
; RV64I-NEXT: bnez a1, .LBB43_2
; RV64I-NEXT: # %bb.1: # %entry
; RV64I-NEXT: mv a0, a2
; RV64I-NEXT: .LBB43_2: # %entry
; RV64I-NEXT: ret
;
; RV32I-SFB-LABEL: test_i64_store_64_4:
; RV32I-SFB: # %bb.0: # %entry
; RV32I-SFB-NEXT: addi sp, sp, -32
; RV32I-SFB-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-SFB-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-SFB-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-SFB-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-SFB-NEXT: sw s3, 12(sp) # 4-byte Folded Spill
; RV32I-SFB-NEXT: sw s4, 8(sp) # 4-byte Folded Spill
; RV32I-SFB-NEXT: sw s5, 4(sp) # 4-byte Folded Spill
; RV32I-SFB-NEXT: mv s0, a6
; RV32I-SFB-NEXT: mv s1, a5
; RV32I-SFB-NEXT: mv s2, a4
; RV32I-SFB-NEXT: mv s3, a3
; RV32I-SFB-NEXT: mv s4, a2
; RV32I-SFB-NEXT: mv s5, a1
; RV32I-SFB-NEXT: addi a0, a0, 32
; RV32I-SFB-NEXT: li a1, 5
; RV32I-SFB-NEXT: call __atomic_load_8
; RV32I-SFB-NEXT: sw s1, 0(s2)
; RV32I-SFB-NEXT: bnez s5, .LBB43_2
; RV32I-SFB-NEXT: # %bb.1: # %entry
; RV32I-SFB-NEXT: mv a0, s4
; RV32I-SFB-NEXT: .LBB43_2: # %entry
; RV32I-SFB-NEXT: bnez s5, .LBB43_4
; RV32I-SFB-NEXT: # %bb.3: # %entry
; RV32I-SFB-NEXT: mv a1, s3
; RV32I-SFB-NEXT: .LBB43_4: # %entry
; RV32I-SFB-NEXT: sw s0, 4(s2)
; RV32I-SFB-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-SFB-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-SFB-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-SFB-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-SFB-NEXT: lw s3, 12(sp) # 4-byte Folded Reload
; RV32I-SFB-NEXT: lw s4, 8(sp) # 4-byte Folded Reload
; RV32I-SFB-NEXT: lw s5, 4(sp) # 4-byte Folded Reload
; RV32I-SFB-NEXT: addi sp, sp, 32
; RV32I-SFB-NEXT: ret
;
; RV64I-SFB-LABEL: test_i64_store_64_4:
; RV64I-SFB: # %bb.0: # %entry
; RV64I-SFB-NEXT: fence rw, rw
; RV64I-SFB-NEXT: ld a0, 32(a0)
; RV64I-SFB-NEXT: fence r, rw
; RV64I-SFB-NEXT: bnez a1, .LBB43_2
; RV64I-SFB-NEXT: # %bb.1: # %entry
; RV64I-SFB-NEXT: mv a0, a2
; RV64I-SFB-NEXT: .LBB43_2: # %entry
; RV64I-SFB-NEXT: sd a4, 0(a3)
; RV64I-SFB-NEXT: ret
;
; RV32I-SFBILOAD-LABEL: test_i64_store_64_4:
; RV32I-SFBILOAD: # %bb.0: # %entry
; RV32I-SFBILOAD-NEXT: addi sp, sp, -32
; RV32I-SFBILOAD-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-SFBILOAD-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-SFBILOAD-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-SFBILOAD-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-SFBILOAD-NEXT: sw s3, 12(sp) # 4-byte Folded Spill
; RV32I-SFBILOAD-NEXT: sw s4, 8(sp) # 4-byte Folded Spill
; RV32I-SFBILOAD-NEXT: sw s5, 4(sp) # 4-byte Folded Spill
; RV32I-SFBILOAD-NEXT: mv s0, a6
; RV32I-SFBILOAD-NEXT: mv s1, a5
; RV32I-SFBILOAD-NEXT: mv s2, a4
; RV32I-SFBILOAD-NEXT: mv s3, a3
; RV32I-SFBILOAD-NEXT: mv s4, a2
; RV32I-SFBILOAD-NEXT: mv s5, a1
; RV32I-SFBILOAD-NEXT: addi a0, a0, 32
; RV32I-SFBILOAD-NEXT: li a1, 5
; RV32I-SFBILOAD-NEXT: call __atomic_load_8
; RV32I-SFBILOAD-NEXT: sw s1, 0(s2)
; RV32I-SFBILOAD-NEXT: bnez s5, .LBB43_2
; RV32I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV32I-SFBILOAD-NEXT: mv a0, s4
; RV32I-SFBILOAD-NEXT: .LBB43_2: # %entry
; RV32I-SFBILOAD-NEXT: bnez s5, .LBB43_4
; RV32I-SFBILOAD-NEXT: # %bb.3: # %entry
; RV32I-SFBILOAD-NEXT: mv a1, s3
; RV32I-SFBILOAD-NEXT: .LBB43_4: # %entry
; RV32I-SFBILOAD-NEXT: sw s0, 4(s2)
; RV32I-SFBILOAD-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-SFBILOAD-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-SFBILOAD-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-SFBILOAD-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-SFBILOAD-NEXT: lw s3, 12(sp) # 4-byte Folded Reload
; RV32I-SFBILOAD-NEXT: lw s4, 8(sp) # 4-byte Folded Reload
; RV32I-SFBILOAD-NEXT: lw s5, 4(sp) # 4-byte Folded Reload
; RV32I-SFBILOAD-NEXT: addi sp, sp, 32
; RV32I-SFBILOAD-NEXT: ret
;
; RV64I-SFBILOAD-LABEL: test_i64_store_64_4:
; RV64I-SFBILOAD: # %bb.0: # %entry
; RV64I-SFBILOAD-NEXT: fence rw, rw
; RV64I-SFBILOAD-NEXT: ld a0, 32(a0)
; RV64I-SFBILOAD-NEXT: fence r, rw
; RV64I-SFBILOAD-NEXT: bnez a1, .LBB43_2
; RV64I-SFBILOAD-NEXT: # %bb.1: # %entry
; RV64I-SFBILOAD-NEXT: mv a0, a2
; RV64I-SFBILOAD-NEXT: .LBB43_2: # %entry
; RV64I-SFBILOAD-NEXT: sd a4, 0(a3)
; RV64I-SFBILOAD-NEXT: ret
entry:
%addr = getelementptr i64, ptr %base, i64 4 ; compute base + 4
%val = load atomic i64, ptr %addr seq_cst, align 8 ; load 64-bit value
store i64 %c, ptr %base1
%res = select i1 %x, i64 %val, i64 %b
ret i64 %res
}