CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
1457 lines
43 KiB
LLVM
1457 lines
43 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
|
|
; RUN: llc --mtriple=loongarch32 --mattr=-32s,+d --relocation-model=static < %s | FileCheck %s --check-prefixes=ALL,LA32RNOPIC
|
|
; RUN: llc --mtriple=loongarch32 --mattr=+32s,+d --relocation-model=static < %s | FileCheck %s --check-prefixes=ALL,LA32SNOPIC
|
|
; RUN: llc --mtriple=loongarch32 --mattr=-32s,+d --relocation-model=pic < %s | FileCheck %s --check-prefixes=ALL,LA32RPIC
|
|
; RUN: llc --mtriple=loongarch32 --mattr=+32s,+d --relocation-model=pic < %s | FileCheck %s --check-prefixes=ALL,LA32SPIC
|
|
; RUN: llc --mtriple=loongarch64 --mattr=+d --relocation-model=static < %s | FileCheck %s --check-prefixes=ALL,LA64NOPIC
|
|
; RUN: llc --mtriple=loongarch64 --mattr=+d --relocation-model=pic < %s | FileCheck %s --check-prefixes=ALL,LA64PIC
|
|
|
|
;; Check load from and store to global variables.
|
|
@G = dso_local global i32 zeroinitializer, align 4
|
|
@arr = dso_local global [10 x i32] zeroinitializer, align 4
|
|
|
|
define i32 @load_store_global() nounwind {
|
|
; LA32RNOPIC-LABEL: load_store_global:
|
|
; LA32RNOPIC: # %bb.0:
|
|
; LA32RNOPIC-NEXT: .Lpcadd_hi0:
|
|
; LA32RNOPIC-NEXT: pcaddu12i $a1, %pcadd_hi20(G)
|
|
; LA32RNOPIC-NEXT: ld.w $a0, $a1, %pcadd_lo12(.Lpcadd_hi0)
|
|
; LA32RNOPIC-NEXT: addi.w $a0, $a0, 1
|
|
; LA32RNOPIC-NEXT: st.w $a0, $a1, %pcadd_lo12(.Lpcadd_hi0)
|
|
; LA32RNOPIC-NEXT: ret
|
|
;
|
|
; LA32SNOPIC-LABEL: load_store_global:
|
|
; LA32SNOPIC: # %bb.0:
|
|
; LA32SNOPIC-NEXT: pcalau12i $a1, %pc_hi20(G)
|
|
; LA32SNOPIC-NEXT: ld.w $a0, $a1, %pc_lo12(G)
|
|
; LA32SNOPIC-NEXT: addi.w $a0, $a0, 1
|
|
; LA32SNOPIC-NEXT: st.w $a0, $a1, %pc_lo12(G)
|
|
; LA32SNOPIC-NEXT: ret
|
|
;
|
|
; LA32RPIC-LABEL: load_store_global:
|
|
; LA32RPIC: # %bb.0:
|
|
; LA32RPIC-NEXT: .Lpcadd_hi0:
|
|
; LA32RPIC-NEXT: pcaddu12i $a1, %pcadd_hi20(.LG$local)
|
|
; LA32RPIC-NEXT: ld.w $a0, $a1, %pcadd_lo12(.Lpcadd_hi0)
|
|
; LA32RPIC-NEXT: addi.w $a0, $a0, 1
|
|
; LA32RPIC-NEXT: st.w $a0, $a1, %pcadd_lo12(.Lpcadd_hi0)
|
|
; LA32RPIC-NEXT: ret
|
|
;
|
|
; LA32SPIC-LABEL: load_store_global:
|
|
; LA32SPIC: # %bb.0:
|
|
; LA32SPIC-NEXT: pcalau12i $a1, %pc_hi20(.LG$local)
|
|
; LA32SPIC-NEXT: ld.w $a0, $a1, %pc_lo12(.LG$local)
|
|
; LA32SPIC-NEXT: addi.w $a0, $a0, 1
|
|
; LA32SPIC-NEXT: st.w $a0, $a1, %pc_lo12(.LG$local)
|
|
; LA32SPIC-NEXT: ret
|
|
;
|
|
; LA64NOPIC-LABEL: load_store_global:
|
|
; LA64NOPIC: # %bb.0:
|
|
; LA64NOPIC-NEXT: pcalau12i $a1, %pc_hi20(G)
|
|
; LA64NOPIC-NEXT: ld.w $a0, $a1, %pc_lo12(G)
|
|
; LA64NOPIC-NEXT: addi.w $a0, $a0, 1
|
|
; LA64NOPIC-NEXT: st.w $a0, $a1, %pc_lo12(G)
|
|
; LA64NOPIC-NEXT: ret
|
|
;
|
|
; LA64PIC-LABEL: load_store_global:
|
|
; LA64PIC: # %bb.0:
|
|
; LA64PIC-NEXT: pcalau12i $a1, %pc_hi20(.LG$local)
|
|
; LA64PIC-NEXT: ld.w $a0, $a1, %pc_lo12(.LG$local)
|
|
; LA64PIC-NEXT: addi.w $a0, $a0, 1
|
|
; LA64PIC-NEXT: st.w $a0, $a1, %pc_lo12(.LG$local)
|
|
; LA64PIC-NEXT: ret
|
|
%v = load i32, ptr @G
|
|
%sum = add i32 %v, 1
|
|
store i32 %sum, ptr @G
|
|
ret i32 %sum
|
|
}
|
|
|
|
define i32 @load_store_global_array(i32 %a) nounwind {
|
|
; LA32RNOPIC-LABEL: load_store_global_array:
|
|
; LA32RNOPIC: # %bb.0:
|
|
; LA32RNOPIC-NEXT: .Lpcadd_hi1:
|
|
; LA32RNOPIC-NEXT: pcaddu12i $a1, %pcadd_hi20(arr)
|
|
; LA32RNOPIC-NEXT: addi.w $a2, $a1, %pcadd_lo12(.Lpcadd_hi1)
|
|
; LA32RNOPIC-NEXT: ld.w $a1, $a2, 0
|
|
; LA32RNOPIC-NEXT: st.w $a0, $a2, 0
|
|
; LA32RNOPIC-NEXT: ld.w $zero, $a2, 36
|
|
; LA32RNOPIC-NEXT: st.w $a0, $a2, 36
|
|
; LA32RNOPIC-NEXT: move $a0, $a1
|
|
; LA32RNOPIC-NEXT: ret
|
|
;
|
|
; LA32SNOPIC-LABEL: load_store_global_array:
|
|
; LA32SNOPIC: # %bb.0:
|
|
; LA32SNOPIC-NEXT: pcalau12i $a1, %pc_hi20(arr)
|
|
; LA32SNOPIC-NEXT: addi.w $a2, $a1, %pc_lo12(arr)
|
|
; LA32SNOPIC-NEXT: ld.w $a1, $a2, 0
|
|
; LA32SNOPIC-NEXT: st.w $a0, $a2, 0
|
|
; LA32SNOPIC-NEXT: ld.w $zero, $a2, 36
|
|
; LA32SNOPIC-NEXT: st.w $a0, $a2, 36
|
|
; LA32SNOPIC-NEXT: move $a0, $a1
|
|
; LA32SNOPIC-NEXT: ret
|
|
;
|
|
; LA32RPIC-LABEL: load_store_global_array:
|
|
; LA32RPIC: # %bb.0:
|
|
; LA32RPIC-NEXT: .Lpcadd_hi1:
|
|
; LA32RPIC-NEXT: pcaddu12i $a1, %pcadd_hi20(.Larr$local)
|
|
; LA32RPIC-NEXT: addi.w $a2, $a1, %pcadd_lo12(.Lpcadd_hi1)
|
|
; LA32RPIC-NEXT: ld.w $a1, $a2, 0
|
|
; LA32RPIC-NEXT: st.w $a0, $a2, 0
|
|
; LA32RPIC-NEXT: ld.w $zero, $a2, 36
|
|
; LA32RPIC-NEXT: st.w $a0, $a2, 36
|
|
; LA32RPIC-NEXT: move $a0, $a1
|
|
; LA32RPIC-NEXT: ret
|
|
;
|
|
; LA32SPIC-LABEL: load_store_global_array:
|
|
; LA32SPIC: # %bb.0:
|
|
; LA32SPIC-NEXT: pcalau12i $a1, %pc_hi20(.Larr$local)
|
|
; LA32SPIC-NEXT: addi.w $a2, $a1, %pc_lo12(.Larr$local)
|
|
; LA32SPIC-NEXT: ld.w $a1, $a2, 0
|
|
; LA32SPIC-NEXT: st.w $a0, $a2, 0
|
|
; LA32SPIC-NEXT: ld.w $zero, $a2, 36
|
|
; LA32SPIC-NEXT: st.w $a0, $a2, 36
|
|
; LA32SPIC-NEXT: move $a0, $a1
|
|
; LA32SPIC-NEXT: ret
|
|
;
|
|
; LA64NOPIC-LABEL: load_store_global_array:
|
|
; LA64NOPIC: # %bb.0:
|
|
; LA64NOPIC-NEXT: pcalau12i $a1, %pc_hi20(arr)
|
|
; LA64NOPIC-NEXT: addi.d $a2, $a1, %pc_lo12(arr)
|
|
; LA64NOPIC-NEXT: ld.w $a1, $a2, 0
|
|
; LA64NOPIC-NEXT: st.w $a0, $a2, 0
|
|
; LA64NOPIC-NEXT: ld.w $zero, $a2, 36
|
|
; LA64NOPIC-NEXT: st.w $a0, $a2, 36
|
|
; LA64NOPIC-NEXT: move $a0, $a1
|
|
; LA64NOPIC-NEXT: ret
|
|
;
|
|
; LA64PIC-LABEL: load_store_global_array:
|
|
; LA64PIC: # %bb.0:
|
|
; LA64PIC-NEXT: pcalau12i $a1, %pc_hi20(.Larr$local)
|
|
; LA64PIC-NEXT: addi.d $a2, $a1, %pc_lo12(.Larr$local)
|
|
; LA64PIC-NEXT: ld.w $a1, $a2, 0
|
|
; LA64PIC-NEXT: st.w $a0, $a2, 0
|
|
; LA64PIC-NEXT: ld.w $zero, $a2, 36
|
|
; LA64PIC-NEXT: st.w $a0, $a2, 36
|
|
; LA64PIC-NEXT: move $a0, $a1
|
|
; LA64PIC-NEXT: ret
|
|
%1 = load volatile i32, ptr @arr, align 4
|
|
store i32 %a, ptr @arr, align 4
|
|
%2 = getelementptr [10 x i32], ptr @arr, i32 0, i32 9
|
|
%3 = load volatile i32, ptr %2, align 4
|
|
store i32 %a, ptr %2, align 4
|
|
ret i32 %1
|
|
}
|
|
|
|
;; Check indexed and unindexed, sext, zext and anyext loads.
|
|
|
|
define i64 @ld_b(ptr %a) nounwind {
|
|
; LA32RNOPIC-LABEL: ld_b:
|
|
; LA32RNOPIC: # %bb.0:
|
|
; LA32RNOPIC-NEXT: ld.b $a2, $a0, 1
|
|
; LA32RNOPIC-NEXT: ld.b $zero, $a0, 0
|
|
; LA32RNOPIC-NEXT: srai.w $a1, $a2, 31
|
|
; LA32RNOPIC-NEXT: move $a0, $a2
|
|
; LA32RNOPIC-NEXT: ret
|
|
;
|
|
; LA32SNOPIC-LABEL: ld_b:
|
|
; LA32SNOPIC: # %bb.0:
|
|
; LA32SNOPIC-NEXT: ld.b $a2, $a0, 1
|
|
; LA32SNOPIC-NEXT: ld.b $zero, $a0, 0
|
|
; LA32SNOPIC-NEXT: srai.w $a1, $a2, 31
|
|
; LA32SNOPIC-NEXT: move $a0, $a2
|
|
; LA32SNOPIC-NEXT: ret
|
|
;
|
|
; LA32RPIC-LABEL: ld_b:
|
|
; LA32RPIC: # %bb.0:
|
|
; LA32RPIC-NEXT: ld.b $a2, $a0, 1
|
|
; LA32RPIC-NEXT: ld.b $zero, $a0, 0
|
|
; LA32RPIC-NEXT: srai.w $a1, $a2, 31
|
|
; LA32RPIC-NEXT: move $a0, $a2
|
|
; LA32RPIC-NEXT: ret
|
|
;
|
|
; LA32SPIC-LABEL: ld_b:
|
|
; LA32SPIC: # %bb.0:
|
|
; LA32SPIC-NEXT: ld.b $a2, $a0, 1
|
|
; LA32SPIC-NEXT: ld.b $zero, $a0, 0
|
|
; LA32SPIC-NEXT: srai.w $a1, $a2, 31
|
|
; LA32SPIC-NEXT: move $a0, $a2
|
|
; LA32SPIC-NEXT: ret
|
|
;
|
|
; LA64NOPIC-LABEL: ld_b:
|
|
; LA64NOPIC: # %bb.0:
|
|
; LA64NOPIC-NEXT: ld.b $a1, $a0, 1
|
|
; LA64NOPIC-NEXT: ld.b $zero, $a0, 0
|
|
; LA64NOPIC-NEXT: move $a0, $a1
|
|
; LA64NOPIC-NEXT: ret
|
|
;
|
|
; LA64PIC-LABEL: ld_b:
|
|
; LA64PIC: # %bb.0:
|
|
; LA64PIC-NEXT: ld.b $a1, $a0, 1
|
|
; LA64PIC-NEXT: ld.b $zero, $a0, 0
|
|
; LA64PIC-NEXT: move $a0, $a1
|
|
; LA64PIC-NEXT: ret
|
|
%1 = getelementptr i8, ptr %a, i64 1
|
|
%2 = load i8, ptr %1
|
|
%3 = sext i8 %2 to i64
|
|
%4 = load volatile i8, ptr %a
|
|
ret i64 %3
|
|
}
|
|
|
|
define i64 @ld_h(ptr %a) nounwind {
|
|
; LA32RNOPIC-LABEL: ld_h:
|
|
; LA32RNOPIC: # %bb.0:
|
|
; LA32RNOPIC-NEXT: ld.h $a2, $a0, 4
|
|
; LA32RNOPIC-NEXT: ld.h $zero, $a0, 0
|
|
; LA32RNOPIC-NEXT: srai.w $a1, $a2, 31
|
|
; LA32RNOPIC-NEXT: move $a0, $a2
|
|
; LA32RNOPIC-NEXT: ret
|
|
;
|
|
; LA32SNOPIC-LABEL: ld_h:
|
|
; LA32SNOPIC: # %bb.0:
|
|
; LA32SNOPIC-NEXT: ld.h $a2, $a0, 4
|
|
; LA32SNOPIC-NEXT: ld.h $zero, $a0, 0
|
|
; LA32SNOPIC-NEXT: srai.w $a1, $a2, 31
|
|
; LA32SNOPIC-NEXT: move $a0, $a2
|
|
; LA32SNOPIC-NEXT: ret
|
|
;
|
|
; LA32RPIC-LABEL: ld_h:
|
|
; LA32RPIC: # %bb.0:
|
|
; LA32RPIC-NEXT: ld.h $a2, $a0, 4
|
|
; LA32RPIC-NEXT: ld.h $zero, $a0, 0
|
|
; LA32RPIC-NEXT: srai.w $a1, $a2, 31
|
|
; LA32RPIC-NEXT: move $a0, $a2
|
|
; LA32RPIC-NEXT: ret
|
|
;
|
|
; LA32SPIC-LABEL: ld_h:
|
|
; LA32SPIC: # %bb.0:
|
|
; LA32SPIC-NEXT: ld.h $a2, $a0, 4
|
|
; LA32SPIC-NEXT: ld.h $zero, $a0, 0
|
|
; LA32SPIC-NEXT: srai.w $a1, $a2, 31
|
|
; LA32SPIC-NEXT: move $a0, $a2
|
|
; LA32SPIC-NEXT: ret
|
|
;
|
|
; LA64NOPIC-LABEL: ld_h:
|
|
; LA64NOPIC: # %bb.0:
|
|
; LA64NOPIC-NEXT: ld.h $a1, $a0, 4
|
|
; LA64NOPIC-NEXT: ld.h $zero, $a0, 0
|
|
; LA64NOPIC-NEXT: move $a0, $a1
|
|
; LA64NOPIC-NEXT: ret
|
|
;
|
|
; LA64PIC-LABEL: ld_h:
|
|
; LA64PIC: # %bb.0:
|
|
; LA64PIC-NEXT: ld.h $a1, $a0, 4
|
|
; LA64PIC-NEXT: ld.h $zero, $a0, 0
|
|
; LA64PIC-NEXT: move $a0, $a1
|
|
; LA64PIC-NEXT: ret
|
|
%1 = getelementptr i16, ptr %a, i64 2
|
|
%2 = load i16, ptr %1
|
|
%3 = sext i16 %2 to i64
|
|
%4 = load volatile i16, ptr %a
|
|
ret i64 %3
|
|
}
|
|
|
|
define i64 @ld_w(ptr %a) nounwind {
|
|
; LA32RNOPIC-LABEL: ld_w:
|
|
; LA32RNOPIC: # %bb.0:
|
|
; LA32RNOPIC-NEXT: ld.w $a2, $a0, 12
|
|
; LA32RNOPIC-NEXT: ld.w $zero, $a0, 0
|
|
; LA32RNOPIC-NEXT: srai.w $a1, $a2, 31
|
|
; LA32RNOPIC-NEXT: move $a0, $a2
|
|
; LA32RNOPIC-NEXT: ret
|
|
;
|
|
; LA32SNOPIC-LABEL: ld_w:
|
|
; LA32SNOPIC: # %bb.0:
|
|
; LA32SNOPIC-NEXT: ld.w $a2, $a0, 12
|
|
; LA32SNOPIC-NEXT: ld.w $zero, $a0, 0
|
|
; LA32SNOPIC-NEXT: srai.w $a1, $a2, 31
|
|
; LA32SNOPIC-NEXT: move $a0, $a2
|
|
; LA32SNOPIC-NEXT: ret
|
|
;
|
|
; LA32RPIC-LABEL: ld_w:
|
|
; LA32RPIC: # %bb.0:
|
|
; LA32RPIC-NEXT: ld.w $a2, $a0, 12
|
|
; LA32RPIC-NEXT: ld.w $zero, $a0, 0
|
|
; LA32RPIC-NEXT: srai.w $a1, $a2, 31
|
|
; LA32RPIC-NEXT: move $a0, $a2
|
|
; LA32RPIC-NEXT: ret
|
|
;
|
|
; LA32SPIC-LABEL: ld_w:
|
|
; LA32SPIC: # %bb.0:
|
|
; LA32SPIC-NEXT: ld.w $a2, $a0, 12
|
|
; LA32SPIC-NEXT: ld.w $zero, $a0, 0
|
|
; LA32SPIC-NEXT: srai.w $a1, $a2, 31
|
|
; LA32SPIC-NEXT: move $a0, $a2
|
|
; LA32SPIC-NEXT: ret
|
|
;
|
|
; LA64NOPIC-LABEL: ld_w:
|
|
; LA64NOPIC: # %bb.0:
|
|
; LA64NOPIC-NEXT: ld.w $a1, $a0, 12
|
|
; LA64NOPIC-NEXT: ld.w $zero, $a0, 0
|
|
; LA64NOPIC-NEXT: move $a0, $a1
|
|
; LA64NOPIC-NEXT: ret
|
|
;
|
|
; LA64PIC-LABEL: ld_w:
|
|
; LA64PIC: # %bb.0:
|
|
; LA64PIC-NEXT: ld.w $a1, $a0, 12
|
|
; LA64PIC-NEXT: ld.w $zero, $a0, 0
|
|
; LA64PIC-NEXT: move $a0, $a1
|
|
; LA64PIC-NEXT: ret
|
|
%1 = getelementptr i32, ptr %a, i64 3
|
|
%2 = load i32, ptr %1
|
|
%3 = sext i32 %2 to i64
|
|
%4 = load volatile i32, ptr %a
|
|
ret i64 %3
|
|
}
|
|
|
|
define i64 @ld_d(ptr %a) nounwind {
|
|
; LA32RNOPIC-LABEL: ld_d:
|
|
; LA32RNOPIC: # %bb.0:
|
|
; LA32RNOPIC-NEXT: ld.w $a1, $a0, 28
|
|
; LA32RNOPIC-NEXT: ld.w $a2, $a0, 24
|
|
; LA32RNOPIC-NEXT: ld.w $zero, $a0, 4
|
|
; LA32RNOPIC-NEXT: ld.w $zero, $a0, 0
|
|
; LA32RNOPIC-NEXT: move $a0, $a2
|
|
; LA32RNOPIC-NEXT: ret
|
|
;
|
|
; LA32SNOPIC-LABEL: ld_d:
|
|
; LA32SNOPIC: # %bb.0:
|
|
; LA32SNOPIC-NEXT: ld.w $a1, $a0, 28
|
|
; LA32SNOPIC-NEXT: ld.w $a2, $a0, 24
|
|
; LA32SNOPIC-NEXT: ld.w $zero, $a0, 4
|
|
; LA32SNOPIC-NEXT: ld.w $zero, $a0, 0
|
|
; LA32SNOPIC-NEXT: move $a0, $a2
|
|
; LA32SNOPIC-NEXT: ret
|
|
;
|
|
; LA32RPIC-LABEL: ld_d:
|
|
; LA32RPIC: # %bb.0:
|
|
; LA32RPIC-NEXT: ld.w $a1, $a0, 28
|
|
; LA32RPIC-NEXT: ld.w $a2, $a0, 24
|
|
; LA32RPIC-NEXT: ld.w $zero, $a0, 4
|
|
; LA32RPIC-NEXT: ld.w $zero, $a0, 0
|
|
; LA32RPIC-NEXT: move $a0, $a2
|
|
; LA32RPIC-NEXT: ret
|
|
;
|
|
; LA32SPIC-LABEL: ld_d:
|
|
; LA32SPIC: # %bb.0:
|
|
; LA32SPIC-NEXT: ld.w $a1, $a0, 28
|
|
; LA32SPIC-NEXT: ld.w $a2, $a0, 24
|
|
; LA32SPIC-NEXT: ld.w $zero, $a0, 4
|
|
; LA32SPIC-NEXT: ld.w $zero, $a0, 0
|
|
; LA32SPIC-NEXT: move $a0, $a2
|
|
; LA32SPIC-NEXT: ret
|
|
;
|
|
; LA64NOPIC-LABEL: ld_d:
|
|
; LA64NOPIC: # %bb.0:
|
|
; LA64NOPIC-NEXT: ld.d $a1, $a0, 24
|
|
; LA64NOPIC-NEXT: ld.d $zero, $a0, 0
|
|
; LA64NOPIC-NEXT: move $a0, $a1
|
|
; LA64NOPIC-NEXT: ret
|
|
;
|
|
; LA64PIC-LABEL: ld_d:
|
|
; LA64PIC: # %bb.0:
|
|
; LA64PIC-NEXT: ld.d $a1, $a0, 24
|
|
; LA64PIC-NEXT: ld.d $zero, $a0, 0
|
|
; LA64PIC-NEXT: move $a0, $a1
|
|
; LA64PIC-NEXT: ret
|
|
%1 = getelementptr i64, ptr %a, i64 3
|
|
%2 = load i64, ptr %1
|
|
%3 = load volatile i64, ptr %a
|
|
ret i64 %2
|
|
}
|
|
|
|
define i64 @ld_bu(ptr %a) nounwind {
|
|
; LA32RNOPIC-LABEL: ld_bu:
|
|
; LA32RNOPIC: # %bb.0:
|
|
; LA32RNOPIC-NEXT: ld.bu $a1, $a0, 4
|
|
; LA32RNOPIC-NEXT: ld.bu $a0, $a0, 0
|
|
; LA32RNOPIC-NEXT: add.w $a0, $a1, $a0
|
|
; LA32RNOPIC-NEXT: sltu $a1, $a0, $a1
|
|
; LA32RNOPIC-NEXT: ret
|
|
;
|
|
; LA32SNOPIC-LABEL: ld_bu:
|
|
; LA32SNOPIC: # %bb.0:
|
|
; LA32SNOPIC-NEXT: ld.bu $a1, $a0, 4
|
|
; LA32SNOPIC-NEXT: ld.bu $a0, $a0, 0
|
|
; LA32SNOPIC-NEXT: add.w $a0, $a1, $a0
|
|
; LA32SNOPIC-NEXT: sltu $a1, $a0, $a1
|
|
; LA32SNOPIC-NEXT: ret
|
|
;
|
|
; LA32RPIC-LABEL: ld_bu:
|
|
; LA32RPIC: # %bb.0:
|
|
; LA32RPIC-NEXT: ld.bu $a1, $a0, 4
|
|
; LA32RPIC-NEXT: ld.bu $a0, $a0, 0
|
|
; LA32RPIC-NEXT: add.w $a0, $a1, $a0
|
|
; LA32RPIC-NEXT: sltu $a1, $a0, $a1
|
|
; LA32RPIC-NEXT: ret
|
|
;
|
|
; LA32SPIC-LABEL: ld_bu:
|
|
; LA32SPIC: # %bb.0:
|
|
; LA32SPIC-NEXT: ld.bu $a1, $a0, 4
|
|
; LA32SPIC-NEXT: ld.bu $a0, $a0, 0
|
|
; LA32SPIC-NEXT: add.w $a0, $a1, $a0
|
|
; LA32SPIC-NEXT: sltu $a1, $a0, $a1
|
|
; LA32SPIC-NEXT: ret
|
|
;
|
|
; LA64NOPIC-LABEL: ld_bu:
|
|
; LA64NOPIC: # %bb.0:
|
|
; LA64NOPIC-NEXT: ld.bu $a1, $a0, 4
|
|
; LA64NOPIC-NEXT: ld.bu $a0, $a0, 0
|
|
; LA64NOPIC-NEXT: add.d $a0, $a1, $a0
|
|
; LA64NOPIC-NEXT: ret
|
|
;
|
|
; LA64PIC-LABEL: ld_bu:
|
|
; LA64PIC: # %bb.0:
|
|
; LA64PIC-NEXT: ld.bu $a1, $a0, 4
|
|
; LA64PIC-NEXT: ld.bu $a0, $a0, 0
|
|
; LA64PIC-NEXT: add.d $a0, $a1, $a0
|
|
; LA64PIC-NEXT: ret
|
|
%1 = getelementptr i8, ptr %a, i64 4
|
|
%2 = load i8, ptr %1
|
|
%3 = zext i8 %2 to i64
|
|
%4 = load volatile i8, ptr %a
|
|
%5 = zext i8 %4 to i64
|
|
%6 = add i64 %3, %5
|
|
ret i64 %6
|
|
}
|
|
|
|
define i64 @ld_hu(ptr %a) nounwind {
|
|
; LA32RNOPIC-LABEL: ld_hu:
|
|
; LA32RNOPIC: # %bb.0:
|
|
; LA32RNOPIC-NEXT: ld.hu $a1, $a0, 10
|
|
; LA32RNOPIC-NEXT: ld.hu $a0, $a0, 0
|
|
; LA32RNOPIC-NEXT: add.w $a0, $a1, $a0
|
|
; LA32RNOPIC-NEXT: sltu $a1, $a0, $a1
|
|
; LA32RNOPIC-NEXT: ret
|
|
;
|
|
; LA32SNOPIC-LABEL: ld_hu:
|
|
; LA32SNOPIC: # %bb.0:
|
|
; LA32SNOPIC-NEXT: ld.hu $a1, $a0, 10
|
|
; LA32SNOPIC-NEXT: ld.hu $a0, $a0, 0
|
|
; LA32SNOPIC-NEXT: add.w $a0, $a1, $a0
|
|
; LA32SNOPIC-NEXT: sltu $a1, $a0, $a1
|
|
; LA32SNOPIC-NEXT: ret
|
|
;
|
|
; LA32RPIC-LABEL: ld_hu:
|
|
; LA32RPIC: # %bb.0:
|
|
; LA32RPIC-NEXT: ld.hu $a1, $a0, 10
|
|
; LA32RPIC-NEXT: ld.hu $a0, $a0, 0
|
|
; LA32RPIC-NEXT: add.w $a0, $a1, $a0
|
|
; LA32RPIC-NEXT: sltu $a1, $a0, $a1
|
|
; LA32RPIC-NEXT: ret
|
|
;
|
|
; LA32SPIC-LABEL: ld_hu:
|
|
; LA32SPIC: # %bb.0:
|
|
; LA32SPIC-NEXT: ld.hu $a1, $a0, 10
|
|
; LA32SPIC-NEXT: ld.hu $a0, $a0, 0
|
|
; LA32SPIC-NEXT: add.w $a0, $a1, $a0
|
|
; LA32SPIC-NEXT: sltu $a1, $a0, $a1
|
|
; LA32SPIC-NEXT: ret
|
|
;
|
|
; LA64NOPIC-LABEL: ld_hu:
|
|
; LA64NOPIC: # %bb.0:
|
|
; LA64NOPIC-NEXT: ld.hu $a1, $a0, 10
|
|
; LA64NOPIC-NEXT: ld.hu $a0, $a0, 0
|
|
; LA64NOPIC-NEXT: add.d $a0, $a1, $a0
|
|
; LA64NOPIC-NEXT: ret
|
|
;
|
|
; LA64PIC-LABEL: ld_hu:
|
|
; LA64PIC: # %bb.0:
|
|
; LA64PIC-NEXT: ld.hu $a1, $a0, 10
|
|
; LA64PIC-NEXT: ld.hu $a0, $a0, 0
|
|
; LA64PIC-NEXT: add.d $a0, $a1, $a0
|
|
; LA64PIC-NEXT: ret
|
|
%1 = getelementptr i16, ptr %a, i64 5
|
|
%2 = load i16, ptr %1
|
|
%3 = zext i16 %2 to i64
|
|
%4 = load volatile i16, ptr %a
|
|
%5 = zext i16 %4 to i64
|
|
%6 = add i64 %3, %5
|
|
ret i64 %6
|
|
}
|
|
|
|
define i64 @ld_wu(ptr %a) nounwind {
|
|
; LA32RNOPIC-LABEL: ld_wu:
|
|
; LA32RNOPIC: # %bb.0:
|
|
; LA32RNOPIC-NEXT: ld.w $a1, $a0, 20
|
|
; LA32RNOPIC-NEXT: ld.w $a0, $a0, 0
|
|
; LA32RNOPIC-NEXT: add.w $a0, $a1, $a0
|
|
; LA32RNOPIC-NEXT: sltu $a1, $a0, $a1
|
|
; LA32RNOPIC-NEXT: ret
|
|
;
|
|
; LA32SNOPIC-LABEL: ld_wu:
|
|
; LA32SNOPIC: # %bb.0:
|
|
; LA32SNOPIC-NEXT: ld.w $a1, $a0, 20
|
|
; LA32SNOPIC-NEXT: ld.w $a0, $a0, 0
|
|
; LA32SNOPIC-NEXT: add.w $a0, $a1, $a0
|
|
; LA32SNOPIC-NEXT: sltu $a1, $a0, $a1
|
|
; LA32SNOPIC-NEXT: ret
|
|
;
|
|
; LA32RPIC-LABEL: ld_wu:
|
|
; LA32RPIC: # %bb.0:
|
|
; LA32RPIC-NEXT: ld.w $a1, $a0, 20
|
|
; LA32RPIC-NEXT: ld.w $a0, $a0, 0
|
|
; LA32RPIC-NEXT: add.w $a0, $a1, $a0
|
|
; LA32RPIC-NEXT: sltu $a1, $a0, $a1
|
|
; LA32RPIC-NEXT: ret
|
|
;
|
|
; LA32SPIC-LABEL: ld_wu:
|
|
; LA32SPIC: # %bb.0:
|
|
; LA32SPIC-NEXT: ld.w $a1, $a0, 20
|
|
; LA32SPIC-NEXT: ld.w $a0, $a0, 0
|
|
; LA32SPIC-NEXT: add.w $a0, $a1, $a0
|
|
; LA32SPIC-NEXT: sltu $a1, $a0, $a1
|
|
; LA32SPIC-NEXT: ret
|
|
;
|
|
; LA64NOPIC-LABEL: ld_wu:
|
|
; LA64NOPIC: # %bb.0:
|
|
; LA64NOPIC-NEXT: ld.wu $a1, $a0, 20
|
|
; LA64NOPIC-NEXT: ld.wu $a0, $a0, 0
|
|
; LA64NOPIC-NEXT: add.d $a0, $a1, $a0
|
|
; LA64NOPIC-NEXT: ret
|
|
;
|
|
; LA64PIC-LABEL: ld_wu:
|
|
; LA64PIC: # %bb.0:
|
|
; LA64PIC-NEXT: ld.wu $a1, $a0, 20
|
|
; LA64PIC-NEXT: ld.wu $a0, $a0, 0
|
|
; LA64PIC-NEXT: add.d $a0, $a1, $a0
|
|
; LA64PIC-NEXT: ret
|
|
%1 = getelementptr i32, ptr %a, i64 5
|
|
%2 = load i32, ptr %1
|
|
%3 = zext i32 %2 to i64
|
|
%4 = load volatile i32, ptr %a
|
|
%5 = zext i32 %4 to i64
|
|
%6 = add i64 %3, %5
|
|
ret i64 %6
|
|
}
|
|
|
|
define i64 @ldx_b(ptr %a, i64 %idx) nounwind {
|
|
; LA32RNOPIC-LABEL: ldx_b:
|
|
; LA32RNOPIC: # %bb.0:
|
|
; LA32RNOPIC-NEXT: add.w $a1, $a0, $a1
|
|
; LA32RNOPIC-NEXT: ld.b $a2, $a1, 0
|
|
; LA32RNOPIC-NEXT: ld.b $zero, $a0, 0
|
|
; LA32RNOPIC-NEXT: srai.w $a1, $a2, 31
|
|
; LA32RNOPIC-NEXT: move $a0, $a2
|
|
; LA32RNOPIC-NEXT: ret
|
|
;
|
|
; LA32SNOPIC-LABEL: ldx_b:
|
|
; LA32SNOPIC: # %bb.0:
|
|
; LA32SNOPIC-NEXT: add.w $a1, $a0, $a1
|
|
; LA32SNOPIC-NEXT: ld.b $a2, $a1, 0
|
|
; LA32SNOPIC-NEXT: ld.b $zero, $a0, 0
|
|
; LA32SNOPIC-NEXT: srai.w $a1, $a2, 31
|
|
; LA32SNOPIC-NEXT: move $a0, $a2
|
|
; LA32SNOPIC-NEXT: ret
|
|
;
|
|
; LA32RPIC-LABEL: ldx_b:
|
|
; LA32RPIC: # %bb.0:
|
|
; LA32RPIC-NEXT: add.w $a1, $a0, $a1
|
|
; LA32RPIC-NEXT: ld.b $a2, $a1, 0
|
|
; LA32RPIC-NEXT: ld.b $zero, $a0, 0
|
|
; LA32RPIC-NEXT: srai.w $a1, $a2, 31
|
|
; LA32RPIC-NEXT: move $a0, $a2
|
|
; LA32RPIC-NEXT: ret
|
|
;
|
|
; LA32SPIC-LABEL: ldx_b:
|
|
; LA32SPIC: # %bb.0:
|
|
; LA32SPIC-NEXT: add.w $a1, $a0, $a1
|
|
; LA32SPIC-NEXT: ld.b $a2, $a1, 0
|
|
; LA32SPIC-NEXT: ld.b $zero, $a0, 0
|
|
; LA32SPIC-NEXT: srai.w $a1, $a2, 31
|
|
; LA32SPIC-NEXT: move $a0, $a2
|
|
; LA32SPIC-NEXT: ret
|
|
;
|
|
; LA64NOPIC-LABEL: ldx_b:
|
|
; LA64NOPIC: # %bb.0:
|
|
; LA64NOPIC-NEXT: ldx.b $a1, $a0, $a1
|
|
; LA64NOPIC-NEXT: ld.b $zero, $a0, 0
|
|
; LA64NOPIC-NEXT: move $a0, $a1
|
|
; LA64NOPIC-NEXT: ret
|
|
;
|
|
; LA64PIC-LABEL: ldx_b:
|
|
; LA64PIC: # %bb.0:
|
|
; LA64PIC-NEXT: ldx.b $a1, $a0, $a1
|
|
; LA64PIC-NEXT: ld.b $zero, $a0, 0
|
|
; LA64PIC-NEXT: move $a0, $a1
|
|
; LA64PIC-NEXT: ret
|
|
%1 = getelementptr i8, ptr %a, i64 %idx
|
|
%2 = load i8, ptr %1
|
|
%3 = sext i8 %2 to i64
|
|
%4 = load volatile i8, ptr %a
|
|
ret i64 %3
|
|
}
|
|
|
|
define i64 @ldx_h(ptr %a, i64 %idx) nounwind {
|
|
; LA32RNOPIC-LABEL: ldx_h:
|
|
; LA32RNOPIC: # %bb.0:
|
|
; LA32RNOPIC-NEXT: slli.w $a1, $a1, 1
|
|
; LA32RNOPIC-NEXT: add.w $a1, $a0, $a1
|
|
; LA32RNOPIC-NEXT: ld.h $a2, $a1, 0
|
|
; LA32RNOPIC-NEXT: ld.h $zero, $a0, 0
|
|
; LA32RNOPIC-NEXT: srai.w $a1, $a2, 31
|
|
; LA32RNOPIC-NEXT: move $a0, $a2
|
|
; LA32RNOPIC-NEXT: ret
|
|
;
|
|
; LA32SNOPIC-LABEL: ldx_h:
|
|
; LA32SNOPIC: # %bb.0:
|
|
; LA32SNOPIC-NEXT: alsl.w $a1, $a1, $a0, 1
|
|
; LA32SNOPIC-NEXT: ld.h $a2, $a1, 0
|
|
; LA32SNOPIC-NEXT: ld.h $zero, $a0, 0
|
|
; LA32SNOPIC-NEXT: srai.w $a1, $a2, 31
|
|
; LA32SNOPIC-NEXT: move $a0, $a2
|
|
; LA32SNOPIC-NEXT: ret
|
|
;
|
|
; LA32RPIC-LABEL: ldx_h:
|
|
; LA32RPIC: # %bb.0:
|
|
; LA32RPIC-NEXT: slli.w $a1, $a1, 1
|
|
; LA32RPIC-NEXT: add.w $a1, $a0, $a1
|
|
; LA32RPIC-NEXT: ld.h $a2, $a1, 0
|
|
; LA32RPIC-NEXT: ld.h $zero, $a0, 0
|
|
; LA32RPIC-NEXT: srai.w $a1, $a2, 31
|
|
; LA32RPIC-NEXT: move $a0, $a2
|
|
; LA32RPIC-NEXT: ret
|
|
;
|
|
; LA32SPIC-LABEL: ldx_h:
|
|
; LA32SPIC: # %bb.0:
|
|
; LA32SPIC-NEXT: alsl.w $a1, $a1, $a0, 1
|
|
; LA32SPIC-NEXT: ld.h $a2, $a1, 0
|
|
; LA32SPIC-NEXT: ld.h $zero, $a0, 0
|
|
; LA32SPIC-NEXT: srai.w $a1, $a2, 31
|
|
; LA32SPIC-NEXT: move $a0, $a2
|
|
; LA32SPIC-NEXT: ret
|
|
;
|
|
; LA64NOPIC-LABEL: ldx_h:
|
|
; LA64NOPIC: # %bb.0:
|
|
; LA64NOPIC-NEXT: slli.d $a1, $a1, 1
|
|
; LA64NOPIC-NEXT: ldx.h $a1, $a0, $a1
|
|
; LA64NOPIC-NEXT: ld.h $zero, $a0, 0
|
|
; LA64NOPIC-NEXT: move $a0, $a1
|
|
; LA64NOPIC-NEXT: ret
|
|
;
|
|
; LA64PIC-LABEL: ldx_h:
|
|
; LA64PIC: # %bb.0:
|
|
; LA64PIC-NEXT: slli.d $a1, $a1, 1
|
|
; LA64PIC-NEXT: ldx.h $a1, $a0, $a1
|
|
; LA64PIC-NEXT: ld.h $zero, $a0, 0
|
|
; LA64PIC-NEXT: move $a0, $a1
|
|
; LA64PIC-NEXT: ret
|
|
%1 = getelementptr i16, ptr %a, i64 %idx
|
|
%2 = load i16, ptr %1
|
|
%3 = sext i16 %2 to i64
|
|
%4 = load volatile i16, ptr %a
|
|
ret i64 %3
|
|
}
|
|
|
|
define i64 @ldx_w(ptr %a, i64 %idx) nounwind {
|
|
; LA32RNOPIC-LABEL: ldx_w:
|
|
; LA32RNOPIC: # %bb.0:
|
|
; LA32RNOPIC-NEXT: slli.w $a1, $a1, 2
|
|
; LA32RNOPIC-NEXT: add.w $a1, $a0, $a1
|
|
; LA32RNOPIC-NEXT: ld.w $a2, $a1, 0
|
|
; LA32RNOPIC-NEXT: ld.w $zero, $a0, 0
|
|
; LA32RNOPIC-NEXT: srai.w $a1, $a2, 31
|
|
; LA32RNOPIC-NEXT: move $a0, $a2
|
|
; LA32RNOPIC-NEXT: ret
|
|
;
|
|
; LA32SNOPIC-LABEL: ldx_w:
|
|
; LA32SNOPIC: # %bb.0:
|
|
; LA32SNOPIC-NEXT: alsl.w $a1, $a1, $a0, 2
|
|
; LA32SNOPIC-NEXT: ld.w $a2, $a1, 0
|
|
; LA32SNOPIC-NEXT: ld.w $zero, $a0, 0
|
|
; LA32SNOPIC-NEXT: srai.w $a1, $a2, 31
|
|
; LA32SNOPIC-NEXT: move $a0, $a2
|
|
; LA32SNOPIC-NEXT: ret
|
|
;
|
|
; LA32RPIC-LABEL: ldx_w:
|
|
; LA32RPIC: # %bb.0:
|
|
; LA32RPIC-NEXT: slli.w $a1, $a1, 2
|
|
; LA32RPIC-NEXT: add.w $a1, $a0, $a1
|
|
; LA32RPIC-NEXT: ld.w $a2, $a1, 0
|
|
; LA32RPIC-NEXT: ld.w $zero, $a0, 0
|
|
; LA32RPIC-NEXT: srai.w $a1, $a2, 31
|
|
; LA32RPIC-NEXT: move $a0, $a2
|
|
; LA32RPIC-NEXT: ret
|
|
;
|
|
; LA32SPIC-LABEL: ldx_w:
|
|
; LA32SPIC: # %bb.0:
|
|
; LA32SPIC-NEXT: alsl.w $a1, $a1, $a0, 2
|
|
; LA32SPIC-NEXT: ld.w $a2, $a1, 0
|
|
; LA32SPIC-NEXT: ld.w $zero, $a0, 0
|
|
; LA32SPIC-NEXT: srai.w $a1, $a2, 31
|
|
; LA32SPIC-NEXT: move $a0, $a2
|
|
; LA32SPIC-NEXT: ret
|
|
;
|
|
; LA64NOPIC-LABEL: ldx_w:
|
|
; LA64NOPIC: # %bb.0:
|
|
; LA64NOPIC-NEXT: slli.d $a1, $a1, 2
|
|
; LA64NOPIC-NEXT: ldx.w $a1, $a0, $a1
|
|
; LA64NOPIC-NEXT: ld.w $zero, $a0, 0
|
|
; LA64NOPIC-NEXT: move $a0, $a1
|
|
; LA64NOPIC-NEXT: ret
|
|
;
|
|
; LA64PIC-LABEL: ldx_w:
|
|
; LA64PIC: # %bb.0:
|
|
; LA64PIC-NEXT: slli.d $a1, $a1, 2
|
|
; LA64PIC-NEXT: ldx.w $a1, $a0, $a1
|
|
; LA64PIC-NEXT: ld.w $zero, $a0, 0
|
|
; LA64PIC-NEXT: move $a0, $a1
|
|
; LA64PIC-NEXT: ret
|
|
%1 = getelementptr i32, ptr %a, i64 %idx
|
|
%2 = load i32, ptr %1
|
|
%3 = sext i32 %2 to i64
|
|
%4 = load volatile i32, ptr %a
|
|
ret i64 %3
|
|
}
|
|
|
|
define i64 @ldx_d(ptr %a, i64 %idx) nounwind {
|
|
; LA32RNOPIC-LABEL: ldx_d:
|
|
; LA32RNOPIC: # %bb.0:
|
|
; LA32RNOPIC-NEXT: slli.w $a1, $a1, 3
|
|
; LA32RNOPIC-NEXT: add.w $a1, $a0, $a1
|
|
; LA32RNOPIC-NEXT: ld.w $a2, $a1, 0
|
|
; LA32RNOPIC-NEXT: ld.w $a1, $a1, 4
|
|
; LA32RNOPIC-NEXT: ld.w $zero, $a0, 0
|
|
; LA32RNOPIC-NEXT: ld.w $zero, $a0, 4
|
|
; LA32RNOPIC-NEXT: move $a0, $a2
|
|
; LA32RNOPIC-NEXT: ret
|
|
;
|
|
; LA32SNOPIC-LABEL: ldx_d:
|
|
; LA32SNOPIC: # %bb.0:
|
|
; LA32SNOPIC-NEXT: alsl.w $a1, $a1, $a0, 3
|
|
; LA32SNOPIC-NEXT: ld.w $a2, $a1, 0
|
|
; LA32SNOPIC-NEXT: ld.w $a1, $a1, 4
|
|
; LA32SNOPIC-NEXT: ld.w $zero, $a0, 0
|
|
; LA32SNOPIC-NEXT: ld.w $zero, $a0, 4
|
|
; LA32SNOPIC-NEXT: move $a0, $a2
|
|
; LA32SNOPIC-NEXT: ret
|
|
;
|
|
; LA32RPIC-LABEL: ldx_d:
|
|
; LA32RPIC: # %bb.0:
|
|
; LA32RPIC-NEXT: slli.w $a1, $a1, 3
|
|
; LA32RPIC-NEXT: add.w $a1, $a0, $a1
|
|
; LA32RPIC-NEXT: ld.w $a2, $a1, 0
|
|
; LA32RPIC-NEXT: ld.w $a1, $a1, 4
|
|
; LA32RPIC-NEXT: ld.w $zero, $a0, 0
|
|
; LA32RPIC-NEXT: ld.w $zero, $a0, 4
|
|
; LA32RPIC-NEXT: move $a0, $a2
|
|
; LA32RPIC-NEXT: ret
|
|
;
|
|
; LA32SPIC-LABEL: ldx_d:
|
|
; LA32SPIC: # %bb.0:
|
|
; LA32SPIC-NEXT: alsl.w $a1, $a1, $a0, 3
|
|
; LA32SPIC-NEXT: ld.w $a2, $a1, 0
|
|
; LA32SPIC-NEXT: ld.w $a1, $a1, 4
|
|
; LA32SPIC-NEXT: ld.w $zero, $a0, 0
|
|
; LA32SPIC-NEXT: ld.w $zero, $a0, 4
|
|
; LA32SPIC-NEXT: move $a0, $a2
|
|
; LA32SPIC-NEXT: ret
|
|
;
|
|
; LA64NOPIC-LABEL: ldx_d:
|
|
; LA64NOPIC: # %bb.0:
|
|
; LA64NOPIC-NEXT: slli.d $a1, $a1, 3
|
|
; LA64NOPIC-NEXT: ldx.d $a1, $a0, $a1
|
|
; LA64NOPIC-NEXT: ld.d $zero, $a0, 0
|
|
; LA64NOPIC-NEXT: move $a0, $a1
|
|
; LA64NOPIC-NEXT: ret
|
|
;
|
|
; LA64PIC-LABEL: ldx_d:
|
|
; LA64PIC: # %bb.0:
|
|
; LA64PIC-NEXT: slli.d $a1, $a1, 3
|
|
; LA64PIC-NEXT: ldx.d $a1, $a0, $a1
|
|
; LA64PIC-NEXT: ld.d $zero, $a0, 0
|
|
; LA64PIC-NEXT: move $a0, $a1
|
|
; LA64PIC-NEXT: ret
|
|
%1 = getelementptr i64, ptr %a, i64 %idx
|
|
%2 = load i64, ptr %1
|
|
%3 = load volatile i64, ptr %a
|
|
ret i64 %2
|
|
}
|
|
|
|
define i64 @ldx_bu(ptr %a, i64 %idx) nounwind {
|
|
; LA32RNOPIC-LABEL: ldx_bu:
|
|
; LA32RNOPIC: # %bb.0:
|
|
; LA32RNOPIC-NEXT: add.w $a1, $a0, $a1
|
|
; LA32RNOPIC-NEXT: ld.bu $a1, $a1, 0
|
|
; LA32RNOPIC-NEXT: ld.bu $a0, $a0, 0
|
|
; LA32RNOPIC-NEXT: add.w $a0, $a1, $a0
|
|
; LA32RNOPIC-NEXT: sltu $a1, $a0, $a1
|
|
; LA32RNOPIC-NEXT: ret
|
|
;
|
|
; LA32SNOPIC-LABEL: ldx_bu:
|
|
; LA32SNOPIC: # %bb.0:
|
|
; LA32SNOPIC-NEXT: add.w $a1, $a0, $a1
|
|
; LA32SNOPIC-NEXT: ld.bu $a1, $a1, 0
|
|
; LA32SNOPIC-NEXT: ld.bu $a0, $a0, 0
|
|
; LA32SNOPIC-NEXT: add.w $a0, $a1, $a0
|
|
; LA32SNOPIC-NEXT: sltu $a1, $a0, $a1
|
|
; LA32SNOPIC-NEXT: ret
|
|
;
|
|
; LA32RPIC-LABEL: ldx_bu:
|
|
; LA32RPIC: # %bb.0:
|
|
; LA32RPIC-NEXT: add.w $a1, $a0, $a1
|
|
; LA32RPIC-NEXT: ld.bu $a1, $a1, 0
|
|
; LA32RPIC-NEXT: ld.bu $a0, $a0, 0
|
|
; LA32RPIC-NEXT: add.w $a0, $a1, $a0
|
|
; LA32RPIC-NEXT: sltu $a1, $a0, $a1
|
|
; LA32RPIC-NEXT: ret
|
|
;
|
|
; LA32SPIC-LABEL: ldx_bu:
|
|
; LA32SPIC: # %bb.0:
|
|
; LA32SPIC-NEXT: add.w $a1, $a0, $a1
|
|
; LA32SPIC-NEXT: ld.bu $a1, $a1, 0
|
|
; LA32SPIC-NEXT: ld.bu $a0, $a0, 0
|
|
; LA32SPIC-NEXT: add.w $a0, $a1, $a0
|
|
; LA32SPIC-NEXT: sltu $a1, $a0, $a1
|
|
; LA32SPIC-NEXT: ret
|
|
;
|
|
; LA64NOPIC-LABEL: ldx_bu:
|
|
; LA64NOPIC: # %bb.0:
|
|
; LA64NOPIC-NEXT: ldx.bu $a1, $a0, $a1
|
|
; LA64NOPIC-NEXT: ld.bu $a0, $a0, 0
|
|
; LA64NOPIC-NEXT: add.d $a0, $a1, $a0
|
|
; LA64NOPIC-NEXT: ret
|
|
;
|
|
; LA64PIC-LABEL: ldx_bu:
|
|
; LA64PIC: # %bb.0:
|
|
; LA64PIC-NEXT: ldx.bu $a1, $a0, $a1
|
|
; LA64PIC-NEXT: ld.bu $a0, $a0, 0
|
|
; LA64PIC-NEXT: add.d $a0, $a1, $a0
|
|
; LA64PIC-NEXT: ret
|
|
%1 = getelementptr i8, ptr %a, i64 %idx
|
|
%2 = load i8, ptr %1
|
|
%3 = zext i8 %2 to i64
|
|
%4 = load volatile i8, ptr %a
|
|
%5 = zext i8 %4 to i64
|
|
%6 = add i64 %3, %5
|
|
ret i64 %6
|
|
}
|
|
|
|
define i64 @ldx_hu(ptr %a, i64 %idx) nounwind {
|
|
; LA32RNOPIC-LABEL: ldx_hu:
|
|
; LA32RNOPIC: # %bb.0:
|
|
; LA32RNOPIC-NEXT: slli.w $a1, $a1, 1
|
|
; LA32RNOPIC-NEXT: add.w $a1, $a0, $a1
|
|
; LA32RNOPIC-NEXT: ld.hu $a1, $a1, 0
|
|
; LA32RNOPIC-NEXT: ld.hu $a0, $a0, 0
|
|
; LA32RNOPIC-NEXT: add.w $a0, $a1, $a0
|
|
; LA32RNOPIC-NEXT: sltu $a1, $a0, $a1
|
|
; LA32RNOPIC-NEXT: ret
|
|
;
|
|
; LA32SNOPIC-LABEL: ldx_hu:
|
|
; LA32SNOPIC: # %bb.0:
|
|
; LA32SNOPIC-NEXT: alsl.w $a1, $a1, $a0, 1
|
|
; LA32SNOPIC-NEXT: ld.hu $a1, $a1, 0
|
|
; LA32SNOPIC-NEXT: ld.hu $a0, $a0, 0
|
|
; LA32SNOPIC-NEXT: add.w $a0, $a1, $a0
|
|
; LA32SNOPIC-NEXT: sltu $a1, $a0, $a1
|
|
; LA32SNOPIC-NEXT: ret
|
|
;
|
|
; LA32RPIC-LABEL: ldx_hu:
|
|
; LA32RPIC: # %bb.0:
|
|
; LA32RPIC-NEXT: slli.w $a1, $a1, 1
|
|
; LA32RPIC-NEXT: add.w $a1, $a0, $a1
|
|
; LA32RPIC-NEXT: ld.hu $a1, $a1, 0
|
|
; LA32RPIC-NEXT: ld.hu $a0, $a0, 0
|
|
; LA32RPIC-NEXT: add.w $a0, $a1, $a0
|
|
; LA32RPIC-NEXT: sltu $a1, $a0, $a1
|
|
; LA32RPIC-NEXT: ret
|
|
;
|
|
; LA32SPIC-LABEL: ldx_hu:
|
|
; LA32SPIC: # %bb.0:
|
|
; LA32SPIC-NEXT: alsl.w $a1, $a1, $a0, 1
|
|
; LA32SPIC-NEXT: ld.hu $a1, $a1, 0
|
|
; LA32SPIC-NEXT: ld.hu $a0, $a0, 0
|
|
; LA32SPIC-NEXT: add.w $a0, $a1, $a0
|
|
; LA32SPIC-NEXT: sltu $a1, $a0, $a1
|
|
; LA32SPIC-NEXT: ret
|
|
;
|
|
; LA64NOPIC-LABEL: ldx_hu:
|
|
; LA64NOPIC: # %bb.0:
|
|
; LA64NOPIC-NEXT: slli.d $a1, $a1, 1
|
|
; LA64NOPIC-NEXT: ldx.hu $a1, $a0, $a1
|
|
; LA64NOPIC-NEXT: ld.hu $a0, $a0, 0
|
|
; LA64NOPIC-NEXT: add.d $a0, $a1, $a0
|
|
; LA64NOPIC-NEXT: ret
|
|
;
|
|
; LA64PIC-LABEL: ldx_hu:
|
|
; LA64PIC: # %bb.0:
|
|
; LA64PIC-NEXT: slli.d $a1, $a1, 1
|
|
; LA64PIC-NEXT: ldx.hu $a1, $a0, $a1
|
|
; LA64PIC-NEXT: ld.hu $a0, $a0, 0
|
|
; LA64PIC-NEXT: add.d $a0, $a1, $a0
|
|
; LA64PIC-NEXT: ret
|
|
%1 = getelementptr i16, ptr %a, i64 %idx
|
|
%2 = load i16, ptr %1
|
|
%3 = zext i16 %2 to i64
|
|
%4 = load volatile i16, ptr %a
|
|
%5 = zext i16 %4 to i64
|
|
%6 = add i64 %3, %5
|
|
ret i64 %6
|
|
}
|
|
|
|
define i64 @ldx_wu(ptr %a, i64 %idx) nounwind {
|
|
; LA32RNOPIC-LABEL: ldx_wu:
|
|
; LA32RNOPIC: # %bb.0:
|
|
; LA32RNOPIC-NEXT: slli.w $a1, $a1, 2
|
|
; LA32RNOPIC-NEXT: add.w $a1, $a0, $a1
|
|
; LA32RNOPIC-NEXT: ld.w $a1, $a1, 0
|
|
; LA32RNOPIC-NEXT: ld.w $a0, $a0, 0
|
|
; LA32RNOPIC-NEXT: add.w $a0, $a1, $a0
|
|
; LA32RNOPIC-NEXT: sltu $a1, $a0, $a1
|
|
; LA32RNOPIC-NEXT: ret
|
|
;
|
|
; LA32SNOPIC-LABEL: ldx_wu:
|
|
; LA32SNOPIC: # %bb.0:
|
|
; LA32SNOPIC-NEXT: alsl.w $a1, $a1, $a0, 2
|
|
; LA32SNOPIC-NEXT: ld.w $a1, $a1, 0
|
|
; LA32SNOPIC-NEXT: ld.w $a0, $a0, 0
|
|
; LA32SNOPIC-NEXT: add.w $a0, $a1, $a0
|
|
; LA32SNOPIC-NEXT: sltu $a1, $a0, $a1
|
|
; LA32SNOPIC-NEXT: ret
|
|
;
|
|
; LA32RPIC-LABEL: ldx_wu:
|
|
; LA32RPIC: # %bb.0:
|
|
; LA32RPIC-NEXT: slli.w $a1, $a1, 2
|
|
; LA32RPIC-NEXT: add.w $a1, $a0, $a1
|
|
; LA32RPIC-NEXT: ld.w $a1, $a1, 0
|
|
; LA32RPIC-NEXT: ld.w $a0, $a0, 0
|
|
; LA32RPIC-NEXT: add.w $a0, $a1, $a0
|
|
; LA32RPIC-NEXT: sltu $a1, $a0, $a1
|
|
; LA32RPIC-NEXT: ret
|
|
;
|
|
; LA32SPIC-LABEL: ldx_wu:
|
|
; LA32SPIC: # %bb.0:
|
|
; LA32SPIC-NEXT: alsl.w $a1, $a1, $a0, 2
|
|
; LA32SPIC-NEXT: ld.w $a1, $a1, 0
|
|
; LA32SPIC-NEXT: ld.w $a0, $a0, 0
|
|
; LA32SPIC-NEXT: add.w $a0, $a1, $a0
|
|
; LA32SPIC-NEXT: sltu $a1, $a0, $a1
|
|
; LA32SPIC-NEXT: ret
|
|
;
|
|
; LA64NOPIC-LABEL: ldx_wu:
|
|
; LA64NOPIC: # %bb.0:
|
|
; LA64NOPIC-NEXT: slli.d $a1, $a1, 2
|
|
; LA64NOPIC-NEXT: ldx.wu $a1, $a0, $a1
|
|
; LA64NOPIC-NEXT: ld.wu $a0, $a0, 0
|
|
; LA64NOPIC-NEXT: add.d $a0, $a1, $a0
|
|
; LA64NOPIC-NEXT: ret
|
|
;
|
|
; LA64PIC-LABEL: ldx_wu:
|
|
; LA64PIC: # %bb.0:
|
|
; LA64PIC-NEXT: slli.d $a1, $a1, 2
|
|
; LA64PIC-NEXT: ldx.wu $a1, $a0, $a1
|
|
; LA64PIC-NEXT: ld.wu $a0, $a0, 0
|
|
; LA64PIC-NEXT: add.d $a0, $a1, $a0
|
|
; LA64PIC-NEXT: ret
|
|
%1 = getelementptr i32, ptr %a, i64 %idx
|
|
%2 = load i32, ptr %1
|
|
%3 = zext i32 %2 to i64
|
|
%4 = load volatile i32, ptr %a
|
|
%5 = zext i32 %4 to i64
|
|
%6 = add i64 %3, %5
|
|
ret i64 %6
|
|
}
|
|
|
|
;; Check indexed and unindexed stores.
|
|
|
|
define void @st_b(ptr %a, i8 %b) nounwind {
|
|
; ALL-LABEL: st_b:
|
|
; ALL: # %bb.0:
|
|
; ALL-NEXT: st.b $a1, $a0, 0
|
|
; ALL-NEXT: st.b $a1, $a0, 6
|
|
; ALL-NEXT: ret
|
|
store i8 %b, ptr %a
|
|
%1 = getelementptr i8, ptr %a, i64 6
|
|
store i8 %b, ptr %1
|
|
ret void
|
|
}
|
|
|
|
define void @st_h(ptr %a, i16 %b) nounwind {
|
|
; ALL-LABEL: st_h:
|
|
; ALL: # %bb.0:
|
|
; ALL-NEXT: st.h $a1, $a0, 0
|
|
; ALL-NEXT: st.h $a1, $a0, 14
|
|
; ALL-NEXT: ret
|
|
store i16 %b, ptr %a
|
|
%1 = getelementptr i16, ptr %a, i64 7
|
|
store i16 %b, ptr %1
|
|
ret void
|
|
}
|
|
|
|
define void @st_w(ptr %a, i32 %b) nounwind {
|
|
; ALL-LABEL: st_w:
|
|
; ALL: # %bb.0:
|
|
; ALL-NEXT: st.w $a1, $a0, 0
|
|
; ALL-NEXT: st.w $a1, $a0, 28
|
|
; ALL-NEXT: ret
|
|
store i32 %b, ptr %a
|
|
%1 = getelementptr i32, ptr %a, i64 7
|
|
store i32 %b, ptr %1
|
|
ret void
|
|
}
|
|
|
|
define void @st_d(ptr %a, i64 %b) nounwind {
|
|
; LA32RNOPIC-LABEL: st_d:
|
|
; LA32RNOPIC: # %bb.0:
|
|
; LA32RNOPIC-NEXT: st.w $a2, $a0, 4
|
|
; LA32RNOPIC-NEXT: st.w $a1, $a0, 0
|
|
; LA32RNOPIC-NEXT: st.w $a2, $a0, 68
|
|
; LA32RNOPIC-NEXT: st.w $a1, $a0, 64
|
|
; LA32RNOPIC-NEXT: ret
|
|
;
|
|
; LA32SNOPIC-LABEL: st_d:
|
|
; LA32SNOPIC: # %bb.0:
|
|
; LA32SNOPIC-NEXT: st.w $a2, $a0, 4
|
|
; LA32SNOPIC-NEXT: st.w $a1, $a0, 0
|
|
; LA32SNOPIC-NEXT: st.w $a2, $a0, 68
|
|
; LA32SNOPIC-NEXT: st.w $a1, $a0, 64
|
|
; LA32SNOPIC-NEXT: ret
|
|
;
|
|
; LA32RPIC-LABEL: st_d:
|
|
; LA32RPIC: # %bb.0:
|
|
; LA32RPIC-NEXT: st.w $a2, $a0, 4
|
|
; LA32RPIC-NEXT: st.w $a1, $a0, 0
|
|
; LA32RPIC-NEXT: st.w $a2, $a0, 68
|
|
; LA32RPIC-NEXT: st.w $a1, $a0, 64
|
|
; LA32RPIC-NEXT: ret
|
|
;
|
|
; LA32SPIC-LABEL: st_d:
|
|
; LA32SPIC: # %bb.0:
|
|
; LA32SPIC-NEXT: st.w $a2, $a0, 4
|
|
; LA32SPIC-NEXT: st.w $a1, $a0, 0
|
|
; LA32SPIC-NEXT: st.w $a2, $a0, 68
|
|
; LA32SPIC-NEXT: st.w $a1, $a0, 64
|
|
; LA32SPIC-NEXT: ret
|
|
;
|
|
; LA64NOPIC-LABEL: st_d:
|
|
; LA64NOPIC: # %bb.0:
|
|
; LA64NOPIC-NEXT: st.d $a1, $a0, 0
|
|
; LA64NOPIC-NEXT: st.d $a1, $a0, 64
|
|
; LA64NOPIC-NEXT: ret
|
|
;
|
|
; LA64PIC-LABEL: st_d:
|
|
; LA64PIC: # %bb.0:
|
|
; LA64PIC-NEXT: st.d $a1, $a0, 0
|
|
; LA64PIC-NEXT: st.d $a1, $a0, 64
|
|
; LA64PIC-NEXT: ret
|
|
store i64 %b, ptr %a
|
|
%1 = getelementptr i64, ptr %a, i64 8
|
|
store i64 %b, ptr %1
|
|
ret void
|
|
}
|
|
|
|
define void @stx_b(ptr %dst, i64 %idx, i8 %val) nounwind {
|
|
; LA32RNOPIC-LABEL: stx_b:
|
|
; LA32RNOPIC: # %bb.0:
|
|
; LA32RNOPIC-NEXT: add.w $a0, $a0, $a1
|
|
; LA32RNOPIC-NEXT: st.b $a3, $a0, 0
|
|
; LA32RNOPIC-NEXT: ret
|
|
;
|
|
; LA32SNOPIC-LABEL: stx_b:
|
|
; LA32SNOPIC: # %bb.0:
|
|
; LA32SNOPIC-NEXT: add.w $a0, $a0, $a1
|
|
; LA32SNOPIC-NEXT: st.b $a3, $a0, 0
|
|
; LA32SNOPIC-NEXT: ret
|
|
;
|
|
; LA32RPIC-LABEL: stx_b:
|
|
; LA32RPIC: # %bb.0:
|
|
; LA32RPIC-NEXT: add.w $a0, $a0, $a1
|
|
; LA32RPIC-NEXT: st.b $a3, $a0, 0
|
|
; LA32RPIC-NEXT: ret
|
|
;
|
|
; LA32SPIC-LABEL: stx_b:
|
|
; LA32SPIC: # %bb.0:
|
|
; LA32SPIC-NEXT: add.w $a0, $a0, $a1
|
|
; LA32SPIC-NEXT: st.b $a3, $a0, 0
|
|
; LA32SPIC-NEXT: ret
|
|
;
|
|
; LA64NOPIC-LABEL: stx_b:
|
|
; LA64NOPIC: # %bb.0:
|
|
; LA64NOPIC-NEXT: stx.b $a2, $a0, $a1
|
|
; LA64NOPIC-NEXT: ret
|
|
;
|
|
; LA64PIC-LABEL: stx_b:
|
|
; LA64PIC: # %bb.0:
|
|
; LA64PIC-NEXT: stx.b $a2, $a0, $a1
|
|
; LA64PIC-NEXT: ret
|
|
%1 = getelementptr i8, ptr %dst, i64 %idx
|
|
store i8 %val, ptr %1
|
|
ret void
|
|
}
|
|
|
|
define void @stx_h(ptr %dst, i64 %idx, i16 %val) nounwind {
|
|
; LA32RNOPIC-LABEL: stx_h:
|
|
; LA32RNOPIC: # %bb.0:
|
|
; LA32RNOPIC-NEXT: slli.w $a1, $a1, 1
|
|
; LA32RNOPIC-NEXT: add.w $a0, $a0, $a1
|
|
; LA32RNOPIC-NEXT: st.h $a3, $a0, 0
|
|
; LA32RNOPIC-NEXT: ret
|
|
;
|
|
; LA32SNOPIC-LABEL: stx_h:
|
|
; LA32SNOPIC: # %bb.0:
|
|
; LA32SNOPIC-NEXT: alsl.w $a0, $a1, $a0, 1
|
|
; LA32SNOPIC-NEXT: st.h $a3, $a0, 0
|
|
; LA32SNOPIC-NEXT: ret
|
|
;
|
|
; LA32RPIC-LABEL: stx_h:
|
|
; LA32RPIC: # %bb.0:
|
|
; LA32RPIC-NEXT: slli.w $a1, $a1, 1
|
|
; LA32RPIC-NEXT: add.w $a0, $a0, $a1
|
|
; LA32RPIC-NEXT: st.h $a3, $a0, 0
|
|
; LA32RPIC-NEXT: ret
|
|
;
|
|
; LA32SPIC-LABEL: stx_h:
|
|
; LA32SPIC: # %bb.0:
|
|
; LA32SPIC-NEXT: alsl.w $a0, $a1, $a0, 1
|
|
; LA32SPIC-NEXT: st.h $a3, $a0, 0
|
|
; LA32SPIC-NEXT: ret
|
|
;
|
|
; LA64NOPIC-LABEL: stx_h:
|
|
; LA64NOPIC: # %bb.0:
|
|
; LA64NOPIC-NEXT: slli.d $a1, $a1, 1
|
|
; LA64NOPIC-NEXT: stx.h $a2, $a0, $a1
|
|
; LA64NOPIC-NEXT: ret
|
|
;
|
|
; LA64PIC-LABEL: stx_h:
|
|
; LA64PIC: # %bb.0:
|
|
; LA64PIC-NEXT: slli.d $a1, $a1, 1
|
|
; LA64PIC-NEXT: stx.h $a2, $a0, $a1
|
|
; LA64PIC-NEXT: ret
|
|
%1 = getelementptr i16, ptr %dst, i64 %idx
|
|
store i16 %val, ptr %1
|
|
ret void
|
|
}
|
|
|
|
define void @stx_w(ptr %dst, i64 %idx, i32 %val) nounwind {
|
|
; LA32RNOPIC-LABEL: stx_w:
|
|
; LA32RNOPIC: # %bb.0:
|
|
; LA32RNOPIC-NEXT: slli.w $a1, $a1, 2
|
|
; LA32RNOPIC-NEXT: add.w $a0, $a0, $a1
|
|
; LA32RNOPIC-NEXT: st.w $a3, $a0, 0
|
|
; LA32RNOPIC-NEXT: ret
|
|
;
|
|
; LA32SNOPIC-LABEL: stx_w:
|
|
; LA32SNOPIC: # %bb.0:
|
|
; LA32SNOPIC-NEXT: alsl.w $a0, $a1, $a0, 2
|
|
; LA32SNOPIC-NEXT: st.w $a3, $a0, 0
|
|
; LA32SNOPIC-NEXT: ret
|
|
;
|
|
; LA32RPIC-LABEL: stx_w:
|
|
; LA32RPIC: # %bb.0:
|
|
; LA32RPIC-NEXT: slli.w $a1, $a1, 2
|
|
; LA32RPIC-NEXT: add.w $a0, $a0, $a1
|
|
; LA32RPIC-NEXT: st.w $a3, $a0, 0
|
|
; LA32RPIC-NEXT: ret
|
|
;
|
|
; LA32SPIC-LABEL: stx_w:
|
|
; LA32SPIC: # %bb.0:
|
|
; LA32SPIC-NEXT: alsl.w $a0, $a1, $a0, 2
|
|
; LA32SPIC-NEXT: st.w $a3, $a0, 0
|
|
; LA32SPIC-NEXT: ret
|
|
;
|
|
; LA64NOPIC-LABEL: stx_w:
|
|
; LA64NOPIC: # %bb.0:
|
|
; LA64NOPIC-NEXT: slli.d $a1, $a1, 2
|
|
; LA64NOPIC-NEXT: stx.w $a2, $a0, $a1
|
|
; LA64NOPIC-NEXT: ret
|
|
;
|
|
; LA64PIC-LABEL: stx_w:
|
|
; LA64PIC: # %bb.0:
|
|
; LA64PIC-NEXT: slli.d $a1, $a1, 2
|
|
; LA64PIC-NEXT: stx.w $a2, $a0, $a1
|
|
; LA64PIC-NEXT: ret
|
|
%1 = getelementptr i32, ptr %dst, i64 %idx
|
|
store i32 %val, ptr %1
|
|
ret void
|
|
}
|
|
|
|
define void @stx_d(ptr %dst, i64 %idx, i64 %val) nounwind {
|
|
; LA32RNOPIC-LABEL: stx_d:
|
|
; LA32RNOPIC: # %bb.0:
|
|
; LA32RNOPIC-NEXT: slli.w $a1, $a1, 3
|
|
; LA32RNOPIC-NEXT: add.w $a0, $a0, $a1
|
|
; LA32RNOPIC-NEXT: st.w $a4, $a0, 4
|
|
; LA32RNOPIC-NEXT: st.w $a3, $a0, 0
|
|
; LA32RNOPIC-NEXT: ret
|
|
;
|
|
; LA32SNOPIC-LABEL: stx_d:
|
|
; LA32SNOPIC: # %bb.0:
|
|
; LA32SNOPIC-NEXT: alsl.w $a0, $a1, $a0, 3
|
|
; LA32SNOPIC-NEXT: st.w $a4, $a0, 4
|
|
; LA32SNOPIC-NEXT: st.w $a3, $a0, 0
|
|
; LA32SNOPIC-NEXT: ret
|
|
;
|
|
; LA32RPIC-LABEL: stx_d:
|
|
; LA32RPIC: # %bb.0:
|
|
; LA32RPIC-NEXT: slli.w $a1, $a1, 3
|
|
; LA32RPIC-NEXT: add.w $a0, $a0, $a1
|
|
; LA32RPIC-NEXT: st.w $a4, $a0, 4
|
|
; LA32RPIC-NEXT: st.w $a3, $a0, 0
|
|
; LA32RPIC-NEXT: ret
|
|
;
|
|
; LA32SPIC-LABEL: stx_d:
|
|
; LA32SPIC: # %bb.0:
|
|
; LA32SPIC-NEXT: alsl.w $a0, $a1, $a0, 3
|
|
; LA32SPIC-NEXT: st.w $a4, $a0, 4
|
|
; LA32SPIC-NEXT: st.w $a3, $a0, 0
|
|
; LA32SPIC-NEXT: ret
|
|
;
|
|
; LA64NOPIC-LABEL: stx_d:
|
|
; LA64NOPIC: # %bb.0:
|
|
; LA64NOPIC-NEXT: slli.d $a1, $a1, 3
|
|
; LA64NOPIC-NEXT: stx.d $a2, $a0, $a1
|
|
; LA64NOPIC-NEXT: ret
|
|
;
|
|
; LA64PIC-LABEL: stx_d:
|
|
; LA64PIC: # %bb.0:
|
|
; LA64PIC-NEXT: slli.d $a1, $a1, 3
|
|
; LA64PIC-NEXT: stx.d $a2, $a0, $a1
|
|
; LA64PIC-NEXT: ret
|
|
%1 = getelementptr i64, ptr %dst, i64 %idx
|
|
store i64 %val, ptr %1
|
|
ret void
|
|
}
|
|
|
|
;; Check load from and store to an i1 location.
|
|
define i64 @load_sext_zext_anyext_i1(ptr %a) nounwind {
|
|
;; sextload i1
|
|
; LA32RNOPIC-LABEL: load_sext_zext_anyext_i1:
|
|
; LA32RNOPIC: # %bb.0:
|
|
; LA32RNOPIC-NEXT: ld.bu $a1, $a0, 1
|
|
; LA32RNOPIC-NEXT: ld.bu $a3, $a0, 2
|
|
; LA32RNOPIC-NEXT: sub.w $a2, $a3, $a1
|
|
; LA32RNOPIC-NEXT: ld.b $zero, $a0, 0
|
|
; LA32RNOPIC-NEXT: sltu $a0, $a3, $a1
|
|
; LA32RNOPIC-NEXT: sub.w $a1, $zero, $a0
|
|
; LA32RNOPIC-NEXT: move $a0, $a2
|
|
; LA32RNOPIC-NEXT: ret
|
|
;
|
|
; LA32SNOPIC-LABEL: load_sext_zext_anyext_i1:
|
|
; LA32SNOPIC: # %bb.0:
|
|
; LA32SNOPIC-NEXT: ld.bu $a1, $a0, 1
|
|
; LA32SNOPIC-NEXT: ld.bu $a3, $a0, 2
|
|
; LA32SNOPIC-NEXT: sub.w $a2, $a3, $a1
|
|
; LA32SNOPIC-NEXT: ld.b $zero, $a0, 0
|
|
; LA32SNOPIC-NEXT: sltu $a0, $a3, $a1
|
|
; LA32SNOPIC-NEXT: sub.w $a1, $zero, $a0
|
|
; LA32SNOPIC-NEXT: move $a0, $a2
|
|
; LA32SNOPIC-NEXT: ret
|
|
;
|
|
; LA32RPIC-LABEL: load_sext_zext_anyext_i1:
|
|
; LA32RPIC: # %bb.0:
|
|
; LA32RPIC-NEXT: ld.bu $a1, $a0, 1
|
|
; LA32RPIC-NEXT: ld.bu $a3, $a0, 2
|
|
; LA32RPIC-NEXT: sub.w $a2, $a3, $a1
|
|
; LA32RPIC-NEXT: ld.b $zero, $a0, 0
|
|
; LA32RPIC-NEXT: sltu $a0, $a3, $a1
|
|
; LA32RPIC-NEXT: sub.w $a1, $zero, $a0
|
|
; LA32RPIC-NEXT: move $a0, $a2
|
|
; LA32RPIC-NEXT: ret
|
|
;
|
|
; LA32SPIC-LABEL: load_sext_zext_anyext_i1:
|
|
; LA32SPIC: # %bb.0:
|
|
; LA32SPIC-NEXT: ld.bu $a1, $a0, 1
|
|
; LA32SPIC-NEXT: ld.bu $a3, $a0, 2
|
|
; LA32SPIC-NEXT: sub.w $a2, $a3, $a1
|
|
; LA32SPIC-NEXT: ld.b $zero, $a0, 0
|
|
; LA32SPIC-NEXT: sltu $a0, $a3, $a1
|
|
; LA32SPIC-NEXT: sub.w $a1, $zero, $a0
|
|
; LA32SPIC-NEXT: move $a0, $a2
|
|
; LA32SPIC-NEXT: ret
|
|
;
|
|
; LA64NOPIC-LABEL: load_sext_zext_anyext_i1:
|
|
; LA64NOPIC: # %bb.0:
|
|
; LA64NOPIC-NEXT: ld.bu $a1, $a0, 1
|
|
; LA64NOPIC-NEXT: ld.bu $a2, $a0, 2
|
|
; LA64NOPIC-NEXT: ld.b $zero, $a0, 0
|
|
; LA64NOPIC-NEXT: sub.d $a0, $a2, $a1
|
|
; LA64NOPIC-NEXT: ret
|
|
;
|
|
; LA64PIC-LABEL: load_sext_zext_anyext_i1:
|
|
; LA64PIC: # %bb.0:
|
|
; LA64PIC-NEXT: ld.bu $a1, $a0, 1
|
|
; LA64PIC-NEXT: ld.bu $a2, $a0, 2
|
|
; LA64PIC-NEXT: ld.b $zero, $a0, 0
|
|
; LA64PIC-NEXT: sub.d $a0, $a2, $a1
|
|
; LA64PIC-NEXT: ret
|
|
%1 = getelementptr i1, ptr %a, i64 1
|
|
%2 = load i1, ptr %1
|
|
%3 = sext i1 %2 to i64
|
|
;; zextload i1
|
|
%4 = getelementptr i1, ptr %a, i64 2
|
|
%5 = load i1, ptr %4
|
|
%6 = zext i1 %5 to i64
|
|
%7 = add i64 %3, %6
|
|
;; extload i1 (anyext). Produced as the load is unused.
|
|
%8 = load volatile i1, ptr %a
|
|
ret i64 %7
|
|
}
|
|
|
|
define i16 @load_sext_zext_anyext_i1_i16(ptr %a) nounwind {
|
|
;; sextload i1
|
|
; LA32RNOPIC-LABEL: load_sext_zext_anyext_i1_i16:
|
|
; LA32RNOPIC: # %bb.0:
|
|
; LA32RNOPIC-NEXT: ld.bu $a1, $a0, 1
|
|
; LA32RNOPIC-NEXT: ld.bu $a2, $a0, 2
|
|
; LA32RNOPIC-NEXT: ld.b $zero, $a0, 0
|
|
; LA32RNOPIC-NEXT: sub.w $a0, $a2, $a1
|
|
; LA32RNOPIC-NEXT: ret
|
|
;
|
|
; LA32SNOPIC-LABEL: load_sext_zext_anyext_i1_i16:
|
|
; LA32SNOPIC: # %bb.0:
|
|
; LA32SNOPIC-NEXT: ld.bu $a1, $a0, 1
|
|
; LA32SNOPIC-NEXT: ld.bu $a2, $a0, 2
|
|
; LA32SNOPIC-NEXT: ld.b $zero, $a0, 0
|
|
; LA32SNOPIC-NEXT: sub.w $a0, $a2, $a1
|
|
; LA32SNOPIC-NEXT: ret
|
|
;
|
|
; LA32RPIC-LABEL: load_sext_zext_anyext_i1_i16:
|
|
; LA32RPIC: # %bb.0:
|
|
; LA32RPIC-NEXT: ld.bu $a1, $a0, 1
|
|
; LA32RPIC-NEXT: ld.bu $a2, $a0, 2
|
|
; LA32RPIC-NEXT: ld.b $zero, $a0, 0
|
|
; LA32RPIC-NEXT: sub.w $a0, $a2, $a1
|
|
; LA32RPIC-NEXT: ret
|
|
;
|
|
; LA32SPIC-LABEL: load_sext_zext_anyext_i1_i16:
|
|
; LA32SPIC: # %bb.0:
|
|
; LA32SPIC-NEXT: ld.bu $a1, $a0, 1
|
|
; LA32SPIC-NEXT: ld.bu $a2, $a0, 2
|
|
; LA32SPIC-NEXT: ld.b $zero, $a0, 0
|
|
; LA32SPIC-NEXT: sub.w $a0, $a2, $a1
|
|
; LA32SPIC-NEXT: ret
|
|
;
|
|
; LA64NOPIC-LABEL: load_sext_zext_anyext_i1_i16:
|
|
; LA64NOPIC: # %bb.0:
|
|
; LA64NOPIC-NEXT: ld.bu $a1, $a0, 1
|
|
; LA64NOPIC-NEXT: ld.bu $a2, $a0, 2
|
|
; LA64NOPIC-NEXT: ld.b $zero, $a0, 0
|
|
; LA64NOPIC-NEXT: sub.d $a0, $a2, $a1
|
|
; LA64NOPIC-NEXT: ret
|
|
;
|
|
; LA64PIC-LABEL: load_sext_zext_anyext_i1_i16:
|
|
; LA64PIC: # %bb.0:
|
|
; LA64PIC-NEXT: ld.bu $a1, $a0, 1
|
|
; LA64PIC-NEXT: ld.bu $a2, $a0, 2
|
|
; LA64PIC-NEXT: ld.b $zero, $a0, 0
|
|
; LA64PIC-NEXT: sub.d $a0, $a2, $a1
|
|
; LA64PIC-NEXT: ret
|
|
%1 = getelementptr i1, ptr %a, i64 1
|
|
%2 = load i1, ptr %1
|
|
%3 = sext i1 %2 to i16
|
|
;; zextload i1
|
|
%4 = getelementptr i1, ptr %a, i64 2
|
|
%5 = load i1, ptr %4
|
|
%6 = zext i1 %5 to i16
|
|
%7 = add i16 %3, %6
|
|
;; extload i1 (anyext). Produced as the load is unused.
|
|
%8 = load volatile i1, ptr %a
|
|
ret i16 %7
|
|
}
|
|
|
|
define i64 @ld_sd_constant(i64 %a) nounwind {
|
|
; LA32RNOPIC-LABEL: ld_sd_constant:
|
|
; LA32RNOPIC: # %bb.0:
|
|
; LA32RNOPIC-NEXT: lu12i.w $a3, -136485
|
|
; LA32RNOPIC-NEXT: ori $a4, $a3, 3823
|
|
; LA32RNOPIC-NEXT: ld.w $a2, $a4, 0
|
|
; LA32RNOPIC-NEXT: ori $a5, $a3, 3827
|
|
; LA32RNOPIC-NEXT: ld.w $a3, $a5, 0
|
|
; LA32RNOPIC-NEXT: st.w $a0, $a4, 0
|
|
; LA32RNOPIC-NEXT: st.w $a1, $a5, 0
|
|
; LA32RNOPIC-NEXT: move $a0, $a2
|
|
; LA32RNOPIC-NEXT: move $a1, $a3
|
|
; LA32RNOPIC-NEXT: ret
|
|
;
|
|
; LA32SNOPIC-LABEL: ld_sd_constant:
|
|
; LA32SNOPIC: # %bb.0:
|
|
; LA32SNOPIC-NEXT: lu12i.w $a3, -136485
|
|
; LA32SNOPIC-NEXT: ori $a4, $a3, 3823
|
|
; LA32SNOPIC-NEXT: ld.w $a2, $a4, 0
|
|
; LA32SNOPIC-NEXT: ori $a5, $a3, 3827
|
|
; LA32SNOPIC-NEXT: ld.w $a3, $a5, 0
|
|
; LA32SNOPIC-NEXT: st.w $a0, $a4, 0
|
|
; LA32SNOPIC-NEXT: st.w $a1, $a5, 0
|
|
; LA32SNOPIC-NEXT: move $a0, $a2
|
|
; LA32SNOPIC-NEXT: move $a1, $a3
|
|
; LA32SNOPIC-NEXT: ret
|
|
;
|
|
; LA32RPIC-LABEL: ld_sd_constant:
|
|
; LA32RPIC: # %bb.0:
|
|
; LA32RPIC-NEXT: lu12i.w $a3, -136485
|
|
; LA32RPIC-NEXT: ori $a4, $a3, 3823
|
|
; LA32RPIC-NEXT: ld.w $a2, $a4, 0
|
|
; LA32RPIC-NEXT: ori $a5, $a3, 3827
|
|
; LA32RPIC-NEXT: ld.w $a3, $a5, 0
|
|
; LA32RPIC-NEXT: st.w $a0, $a4, 0
|
|
; LA32RPIC-NEXT: st.w $a1, $a5, 0
|
|
; LA32RPIC-NEXT: move $a0, $a2
|
|
; LA32RPIC-NEXT: move $a1, $a3
|
|
; LA32RPIC-NEXT: ret
|
|
;
|
|
; LA32SPIC-LABEL: ld_sd_constant:
|
|
; LA32SPIC: # %bb.0:
|
|
; LA32SPIC-NEXT: lu12i.w $a3, -136485
|
|
; LA32SPIC-NEXT: ori $a4, $a3, 3823
|
|
; LA32SPIC-NEXT: ld.w $a2, $a4, 0
|
|
; LA32SPIC-NEXT: ori $a5, $a3, 3827
|
|
; LA32SPIC-NEXT: ld.w $a3, $a5, 0
|
|
; LA32SPIC-NEXT: st.w $a0, $a4, 0
|
|
; LA32SPIC-NEXT: st.w $a1, $a5, 0
|
|
; LA32SPIC-NEXT: move $a0, $a2
|
|
; LA32SPIC-NEXT: move $a1, $a3
|
|
; LA32SPIC-NEXT: ret
|
|
;
|
|
; LA64NOPIC-LABEL: ld_sd_constant:
|
|
; LA64NOPIC: # %bb.0:
|
|
; LA64NOPIC-NEXT: lu12i.w $a1, -136485
|
|
; LA64NOPIC-NEXT: ori $a2, $a1, 3823
|
|
; LA64NOPIC-NEXT: bstrins.d $a2, $a2, 61, 32
|
|
; LA64NOPIC-NEXT: ld.d $a1, $a2, 0
|
|
; LA64NOPIC-NEXT: st.d $a0, $a2, 0
|
|
; LA64NOPIC-NEXT: move $a0, $a1
|
|
; LA64NOPIC-NEXT: ret
|
|
;
|
|
; LA64PIC-LABEL: ld_sd_constant:
|
|
; LA64PIC: # %bb.0:
|
|
; LA64PIC-NEXT: lu12i.w $a1, -136485
|
|
; LA64PIC-NEXT: ori $a2, $a1, 3823
|
|
; LA64PIC-NEXT: bstrins.d $a2, $a2, 61, 32
|
|
; LA64PIC-NEXT: ld.d $a1, $a2, 0
|
|
; LA64PIC-NEXT: st.d $a0, $a2, 0
|
|
; LA64PIC-NEXT: move $a0, $a1
|
|
; LA64PIC-NEXT: ret
|
|
%1 = inttoptr i64 16045690984833335023 to ptr
|
|
%2 = load volatile i64, ptr %1
|
|
store i64 %a, ptr %1
|
|
ret i64 %2
|
|
}
|
|
|
|
;; Check load from and store to a float location.
|
|
define float @load_store_float(ptr %a, float %b) nounwind {
|
|
; ALL-LABEL: load_store_float:
|
|
; ALL: # %bb.0:
|
|
; ALL-NEXT: fld.s $fa1, $a0, 4
|
|
; ALL-NEXT: fst.s $fa0, $a0, 4
|
|
; ALL-NEXT: fmov.s $fa0, $fa1
|
|
; ALL-NEXT: ret
|
|
%1 = getelementptr float, ptr %a, i64 1
|
|
%2 = load float, ptr %1
|
|
store float %b, ptr %1
|
|
ret float %2
|
|
}
|
|
|
|
;; Check load from and store to a double location.
|
|
define double @load_store_double(ptr %a, double %b) nounwind {
|
|
; ALL-LABEL: load_store_double:
|
|
; ALL: # %bb.0:
|
|
; ALL-NEXT: fld.d $fa1, $a0, 8
|
|
; ALL-NEXT: fst.d $fa0, $a0, 8
|
|
; ALL-NEXT: fmov.d $fa0, $fa1
|
|
; ALL-NEXT: ret
|
|
%1 = getelementptr double, ptr %a, i64 1
|
|
%2 = load double, ptr %1
|
|
store double %b, ptr %1
|
|
ret double %2
|
|
}
|