llvm-project/llvm/test/CodeGen/PowerPC/vec_insert_elt.ll
Peter Rong c2e7c9cb33 [CodeGen] Using ZExt for extractelement indices.
In https://github.com/llvm/llvm-project/issues/57452, we found that IRTranslator is translating `i1 true` into `i32 -1`.
This is because IRTranslator uses SExt for indices.

In this fix, we change the expected behavior of extractelement's index, moving from SExt to ZExt.
This change includes both documentation, SelectionDAG and IRTranslator.
We also included a test for AMDGPU, updated tests for AArch64, Mips, PowerPC, RISCV, VE, WebAssembly and X86

This patch fixes issue #57452.

Differential Revision: https://reviews.llvm.org/D132978
2022-10-15 15:45:35 -07:00

1149 lines
37 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \
; RUN: -mcpu=pwr10 -ppc-asm-full-reg-names \
; RUN: -ppc-vsr-nums-as-vr < %s | FileCheck %s
; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \
; RUN: -mcpu=pwr10 -ppc-asm-full-reg-names \
; RUN: -ppc-vsr-nums-as-vr < %s | FileCheck %s --check-prefix=CHECK-BE
; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \
; RUN: -mcpu=pwr9 -ppc-asm-full-reg-names \
; RUN: -ppc-vsr-nums-as-vr < %s | FileCheck %s --check-prefix=CHECK-P9
; RUN: llc -mcpu=pwr8 -verify-machineinstrs -ppc-vsr-nums-as-vr \
; RUN: -ppc-asm-full-reg-names -mtriple=powerpc64-ibm-aix-xcoff < %s | \
; RUN: FileCheck %s --check-prefixes=AIX-P8,AIX-P8-64
; RUN: llc -mcpu=pwr8 -verify-machineinstrs -ppc-vsr-nums-as-vr \
; RUN: -ppc-asm-full-reg-names -mtriple=powerpc-ibm-aix-xcoff < %s | \
; RUN: FileCheck %s --check-prefixes=AIX-P8,AIX-P8-32
; Byte indexed
define <16 x i8> @testByte(<16 x i8> %a, i64 %b, i64 %idx) {
; CHECK-LABEL: testByte:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: vinsbrx v2, r6, r5
; CHECK-NEXT: blr
;
; CHECK-BE-LABEL: testByte:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: vinsblx v2, r6, r5
; CHECK-BE-NEXT: blr
;
; CHECK-P9-LABEL: testByte:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: addi r4, r1, -16
; CHECK-P9-NEXT: clrldi r3, r6, 60
; CHECK-P9-NEXT: stxv v2, -16(r1)
; CHECK-P9-NEXT: stbx r5, r4, r3
; CHECK-P9-NEXT: lxv v2, -16(r1)
; CHECK-P9-NEXT: blr
;
; AIX-P8-64-LABEL: testByte:
; AIX-P8-64: # %bb.0: # %entry
; AIX-P8-64-NEXT: addi r5, r1, -16
; AIX-P8-64-NEXT: clrldi r4, r4, 60
; AIX-P8-64-NEXT: stxvw4x v2, 0, r5
; AIX-P8-64-NEXT: stbx r3, r5, r4
; AIX-P8-64-NEXT: lxvw4x v2, 0, r5
; AIX-P8-64-NEXT: blr
;
; AIX-P8-32-LABEL: testByte:
; AIX-P8-32: # %bb.0: # %entry
; AIX-P8-32-NEXT: addi r3, r1, -16
; AIX-P8-32-NEXT: clrlwi r5, r6, 28
; AIX-P8-32-NEXT: stxvw4x v2, 0, r3
; AIX-P8-32-NEXT: stbx r4, r3, r5
; AIX-P8-32-NEXT: lxvw4x v2, 0, r3
; AIX-P8-32-NEXT: blr
entry:
%conv = trunc i64 %b to i8
%vecins = insertelement <16 x i8> %a, i8 %conv, i64 %idx
ret <16 x i8> %vecins
}
; Halfword indexed
define <8 x i16> @testHalf(<8 x i16> %a, i64 %b, i64 %idx) {
; CHECK-LABEL: testHalf:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: slwi r3, r6, 1
; CHECK-NEXT: vinshrx v2, r3, r5
; CHECK-NEXT: blr
;
; CHECK-BE-LABEL: testHalf:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: slwi r3, r6, 1
; CHECK-BE-NEXT: vinshlx v2, r3, r5
; CHECK-BE-NEXT: blr
;
; CHECK-P9-LABEL: testHalf:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: addi r4, r1, -16
; CHECK-P9-NEXT: rlwinm r3, r6, 1, 28, 30
; CHECK-P9-NEXT: stxv v2, -16(r1)
; CHECK-P9-NEXT: sthx r5, r4, r3
; CHECK-P9-NEXT: lxv v2, -16(r1)
; CHECK-P9-NEXT: blr
;
; AIX-P8-64-LABEL: testHalf:
; AIX-P8-64: # %bb.0: # %entry
; AIX-P8-64-NEXT: addi r5, r1, -16
; AIX-P8-64-NEXT: rlwinm r4, r4, 1, 28, 30
; AIX-P8-64-NEXT: stxvw4x v2, 0, r5
; AIX-P8-64-NEXT: sthx r3, r5, r4
; AIX-P8-64-NEXT: lxvw4x v2, 0, r5
; AIX-P8-64-NEXT: blr
;
; AIX-P8-32-LABEL: testHalf:
; AIX-P8-32: # %bb.0: # %entry
; AIX-P8-32-NEXT: addi r3, r1, -16
; AIX-P8-32-NEXT: rlwinm r5, r6, 1, 28, 30
; AIX-P8-32-NEXT: stxvw4x v2, 0, r3
; AIX-P8-32-NEXT: sthx r4, r3, r5
; AIX-P8-32-NEXT: lxvw4x v2, 0, r3
; AIX-P8-32-NEXT: blr
entry:
%conv = trunc i64 %b to i16
%vecins = insertelement <8 x i16> %a, i16 %conv, i64 %idx
ret <8 x i16> %vecins
}
; Word indexed
define <4 x i32> @testWord(<4 x i32> %a, i64 %b, i64 %idx) {
; CHECK-LABEL: testWord:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: slwi r3, r6, 2
; CHECK-NEXT: vinswrx v2, r3, r5
; CHECK-NEXT: blr
;
; CHECK-BE-LABEL: testWord:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: slwi r3, r6, 2
; CHECK-BE-NEXT: vinswlx v2, r3, r5
; CHECK-BE-NEXT: blr
;
; CHECK-P9-LABEL: testWord:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: addi r4, r1, -16
; CHECK-P9-NEXT: rlwinm r3, r6, 2, 28, 29
; CHECK-P9-NEXT: stxv v2, -16(r1)
; CHECK-P9-NEXT: stwx r5, r4, r3
; CHECK-P9-NEXT: lxv v2, -16(r1)
; CHECK-P9-NEXT: blr
;
; AIX-P8-64-LABEL: testWord:
; AIX-P8-64: # %bb.0: # %entry
; AIX-P8-64-NEXT: addi r5, r1, -16
; AIX-P8-64-NEXT: rlwinm r4, r4, 2, 28, 29
; AIX-P8-64-NEXT: stxvw4x v2, 0, r5
; AIX-P8-64-NEXT: stwx r3, r5, r4
; AIX-P8-64-NEXT: lxvw4x v2, 0, r5
; AIX-P8-64-NEXT: blr
;
; AIX-P8-32-LABEL: testWord:
; AIX-P8-32: # %bb.0: # %entry
; AIX-P8-32-NEXT: addi r3, r1, -16
; AIX-P8-32-NEXT: rlwinm r5, r6, 2, 28, 29
; AIX-P8-32-NEXT: stxvw4x v2, 0, r3
; AIX-P8-32-NEXT: stwx r4, r3, r5
; AIX-P8-32-NEXT: lxvw4x v2, 0, r3
; AIX-P8-32-NEXT: blr
entry:
%conv = trunc i64 %b to i32
%vecins = insertelement <4 x i32> %a, i32 %conv, i64 %idx
ret <4 x i32> %vecins
}
; Word immediate
define <4 x i32> @testWordImm(<4 x i32> %a, i64 %b) {
; CHECK-LABEL: testWordImm:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: vinsw v2, r5, 8
; CHECK-NEXT: vinsw v2, r5, 0
; CHECK-NEXT: blr
;
; CHECK-BE-LABEL: testWordImm:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: vinsw v2, r5, 4
; CHECK-BE-NEXT: vinsw v2, r5, 12
; CHECK-BE-NEXT: blr
;
; CHECK-P9-LABEL: testWordImm:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprwz f0, r5
; CHECK-P9-NEXT: xxinsertw v2, vs0, 4
; CHECK-P9-NEXT: xxinsertw v2, vs0, 12
; CHECK-P9-NEXT: blr
;
; AIX-P8-64-LABEL: testWordImm:
; AIX-P8-64: # %bb.0: # %entry
; AIX-P8-64-NEXT: ld r4, L..C0(r2) # %const.0
; AIX-P8-64-NEXT: mtvsrwz v4, r3
; AIX-P8-64-NEXT: ld r3, L..C1(r2) # %const.1
; AIX-P8-64-NEXT: lxvw4x v3, 0, r4
; AIX-P8-64-NEXT: vperm v2, v2, v4, v3
; AIX-P8-64-NEXT: lxvw4x v3, 0, r3
; AIX-P8-64-NEXT: vperm v2, v2, v4, v3
; AIX-P8-64-NEXT: blr
;
; AIX-P8-32-LABEL: testWordImm:
; AIX-P8-32: # %bb.0: # %entry
; AIX-P8-32-NEXT: lwz r3, L..C0(r2) # %const.0
; AIX-P8-32-NEXT: stw r4, -16(r1)
; AIX-P8-32-NEXT: addi r4, r1, -16
; AIX-P8-32-NEXT: lxvw4x v4, 0, r4
; AIX-P8-32-NEXT: lxvw4x v3, 0, r3
; AIX-P8-32-NEXT: lwz r3, L..C1(r2) # %const.1
; AIX-P8-32-NEXT: vperm v2, v2, v4, v3
; AIX-P8-32-NEXT: lxvw4x v3, 0, r3
; AIX-P8-32-NEXT: vperm v2, v2, v4, v3
; AIX-P8-32-NEXT: blr
entry:
%conv = trunc i64 %b to i32
%vecins = insertelement <4 x i32> %a, i32 %conv, i32 1
%vecins2 = insertelement <4 x i32> %vecins, i32 %conv, i32 3
ret <4 x i32> %vecins2
}
; Doubleword indexed
define <2 x i64> @testDoubleword(<2 x i64> %a, i64 %b, i64 %idx) {
; CHECK-LABEL: testDoubleword:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: rlwinm r3, r6, 3, 0, 28
; CHECK-NEXT: vinsdrx v2, r3, r5
; CHECK-NEXT: blr
;
; CHECK-BE-LABEL: testDoubleword:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: rlwinm r3, r6, 3, 0, 28
; CHECK-BE-NEXT: vinsdlx v2, r3, r5
; CHECK-BE-NEXT: blr
;
; CHECK-P9-LABEL: testDoubleword:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: addi r4, r1, -16
; CHECK-P9-NEXT: rlwinm r3, r6, 3, 28, 28
; CHECK-P9-NEXT: stxv v2, -16(r1)
; CHECK-P9-NEXT: stdx r5, r4, r3
; CHECK-P9-NEXT: lxv v2, -16(r1)
; CHECK-P9-NEXT: blr
;
; AIX-P8-64-LABEL: testDoubleword:
; AIX-P8-64: # %bb.0: # %entry
; AIX-P8-64-NEXT: addi r5, r1, -16
; AIX-P8-64-NEXT: rlwinm r4, r4, 3, 28, 28
; AIX-P8-64-NEXT: stxvd2x v2, 0, r5
; AIX-P8-64-NEXT: stdx r3, r5, r4
; AIX-P8-64-NEXT: lxvd2x v2, 0, r5
; AIX-P8-64-NEXT: blr
;
; AIX-P8-32-LABEL: testDoubleword:
; AIX-P8-32: # %bb.0: # %entry
; AIX-P8-32-NEXT: add r6, r6, r6
; AIX-P8-32-NEXT: addi r5, r1, -32
; AIX-P8-32-NEXT: rlwinm r7, r6, 2, 28, 29
; AIX-P8-32-NEXT: stxvw4x v2, 0, r5
; AIX-P8-32-NEXT: stwx r3, r5, r7
; AIX-P8-32-NEXT: addi r3, r6, 1
; AIX-P8-32-NEXT: lxvw4x vs0, 0, r5
; AIX-P8-32-NEXT: addi r5, r1, -16
; AIX-P8-32-NEXT: rlwinm r3, r3, 2, 28, 29
; AIX-P8-32-NEXT: stxvw4x vs0, 0, r5
; AIX-P8-32-NEXT: stwx r4, r5, r3
; AIX-P8-32-NEXT: lxvw4x v2, 0, r5
; AIX-P8-32-NEXT: blr
entry:
%vecins = insertelement <2 x i64> %a, i64 %b, i64 %idx
ret <2 x i64> %vecins
}
; Doubleword immediate
define <2 x i64> @testDoublewordImm(<2 x i64> %a, i64 %b) {
; CHECK-LABEL: testDoublewordImm:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: vinsd v2, r5, 0
; CHECK-NEXT: blr
;
; CHECK-BE-LABEL: testDoublewordImm:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: vinsd v2, r5, 8
; CHECK-BE-NEXT: blr
;
; CHECK-P9-LABEL: testDoublewordImm:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r5
; CHECK-P9-NEXT: xxmrghd v2, v2, vs0
; CHECK-P9-NEXT: blr
;
; AIX-P8-64-LABEL: testDoublewordImm:
; AIX-P8-64: # %bb.0: # %entry
; AIX-P8-64-NEXT: mtfprd f0, r3
; AIX-P8-64-NEXT: xxmrghd v2, v2, vs0
; AIX-P8-64-NEXT: blr
;
; AIX-P8-32-LABEL: testDoublewordImm:
; AIX-P8-32: # %bb.0: # %entry
; AIX-P8-32-NEXT: lwz r5, L..C2(r2) # %const.0
; AIX-P8-32-NEXT: stw r3, -16(r1)
; AIX-P8-32-NEXT: stw r4, -32(r1)
; AIX-P8-32-NEXT: addi r3, r1, -16
; AIX-P8-32-NEXT: addi r4, r1, -32
; AIX-P8-32-NEXT: lxvw4x v4, 0, r3
; AIX-P8-32-NEXT: lwz r3, L..C3(r2) # %const.1
; AIX-P8-32-NEXT: lxvw4x v3, 0, r5
; AIX-P8-32-NEXT: vperm v2, v2, v4, v3
; AIX-P8-32-NEXT: lxvw4x v3, 0, r3
; AIX-P8-32-NEXT: lxvw4x v4, 0, r4
; AIX-P8-32-NEXT: vperm v2, v2, v4, v3
; AIX-P8-32-NEXT: blr
entry:
%vecins = insertelement <2 x i64> %a, i64 %b, i32 1
ret <2 x i64> %vecins
}
define <2 x i64> @testDoublewordImm2(<2 x i64> %a, i64 %b) {
; CHECK-LABEL: testDoublewordImm2:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: vinsd v2, r5, 8
; CHECK-NEXT: blr
;
; CHECK-BE-LABEL: testDoublewordImm2:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: vinsd v2, r5, 0
; CHECK-BE-NEXT: blr
;
; CHECK-P9-LABEL: testDoublewordImm2:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: mtfprd f0, r5
; CHECK-P9-NEXT: xxpermdi v2, vs0, v2, 1
; CHECK-P9-NEXT: blr
;
; AIX-P8-64-LABEL: testDoublewordImm2:
; AIX-P8-64: # %bb.0: # %entry
; AIX-P8-64-NEXT: mtfprd f0, r3
; AIX-P8-64-NEXT: xxpermdi v2, vs0, v2, 1
; AIX-P8-64-NEXT: blr
;
; AIX-P8-32-LABEL: testDoublewordImm2:
; AIX-P8-32: # %bb.0: # %entry
; AIX-P8-32-NEXT: lwz r5, L..C4(r2) # %const.0
; AIX-P8-32-NEXT: stw r3, -16(r1)
; AIX-P8-32-NEXT: stw r4, -32(r1)
; AIX-P8-32-NEXT: addi r3, r1, -16
; AIX-P8-32-NEXT: addi r4, r1, -32
; AIX-P8-32-NEXT: lxvw4x v4, 0, r3
; AIX-P8-32-NEXT: lwz r3, L..C5(r2) # %const.1
; AIX-P8-32-NEXT: lxvw4x v3, 0, r5
; AIX-P8-32-NEXT: vperm v2, v4, v2, v3
; AIX-P8-32-NEXT: lxvw4x v3, 0, r3
; AIX-P8-32-NEXT: lxvw4x v4, 0, r4
; AIX-P8-32-NEXT: vperm v2, v2, v4, v3
; AIX-P8-32-NEXT: blr
entry:
%vecins = insertelement <2 x i64> %a, i64 %b, i32 0
ret <2 x i64> %vecins
}
; Float indexed
define <4 x float> @testFloat1(<4 x float> %a, float %b, i32 zeroext %idx1) {
; CHECK-LABEL: testFloat1:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: xscvdpspn v3, f1
; CHECK-NEXT: slwi r3, r6, 2
; CHECK-NEXT: vinswvrx v2, r3, v3
; CHECK-NEXT: blr
;
; CHECK-BE-LABEL: testFloat1:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: xscvdpspn v3, f1
; CHECK-BE-NEXT: slwi r3, r6, 2
; CHECK-BE-NEXT: vinswvlx v2, r3, v3
; CHECK-BE-NEXT: blr
;
; CHECK-P9-LABEL: testFloat1:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: addi r4, r1, -16
; CHECK-P9-NEXT: rlwinm r3, r6, 2, 28, 29
; CHECK-P9-NEXT: stxv v2, -16(r1)
; CHECK-P9-NEXT: stfsx f1, r4, r3
; CHECK-P9-NEXT: lxv v2, -16(r1)
; CHECK-P9-NEXT: blr
;
; AIX-P8-LABEL: testFloat1:
; AIX-P8: # %bb.0: # %entry
; AIX-P8-NEXT: addi r3, r1, -16
; AIX-P8-NEXT: rlwinm r4, r4, 2, 28, 29
; AIX-P8-NEXT: stxvw4x v2, 0, r3
; AIX-P8-NEXT: stfsx f1, r3, r4
; AIX-P8-NEXT: lxvw4x v2, 0, r3
; AIX-P8-NEXT: blr
entry:
%vecins = insertelement <4 x float> %a, float %b, i32 %idx1
ret <4 x float> %vecins
}
define <4 x float> @testFloat2(<4 x float> %a, ptr %b, i32 zeroext %idx1, i32 zeroext %idx2) {
; CHECK-LABEL: testFloat2:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lwz r3, 0(r5)
; CHECK-NEXT: slwi r4, r6, 2
; CHECK-NEXT: vinswrx v2, r4, r3
; CHECK-NEXT: lwz r3, 1(r5)
; CHECK-NEXT: slwi r4, r7, 2
; CHECK-NEXT: vinswrx v2, r4, r3
; CHECK-NEXT: blr
;
; CHECK-BE-LABEL: testFloat2:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: lwz r3, 0(r5)
; CHECK-BE-NEXT: slwi r4, r6, 2
; CHECK-BE-NEXT: vinswlx v2, r4, r3
; CHECK-BE-NEXT: lwz r3, 1(r5)
; CHECK-BE-NEXT: slwi r4, r7, 2
; CHECK-BE-NEXT: vinswlx v2, r4, r3
; CHECK-BE-NEXT: blr
;
; CHECK-P9-LABEL: testFloat2:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: rlwinm r4, r6, 2, 28, 29
; CHECK-P9-NEXT: lwz r6, 0(r5)
; CHECK-P9-NEXT: rlwinm r3, r7, 2, 28, 29
; CHECK-P9-NEXT: addi r7, r1, -16
; CHECK-P9-NEXT: stxv v2, -16(r1)
; CHECK-P9-NEXT: stwx r6, r7, r4
; CHECK-P9-NEXT: lxv vs0, -16(r1)
; CHECK-P9-NEXT: lwz r4, 1(r5)
; CHECK-P9-NEXT: addi r5, r1, -32
; CHECK-P9-NEXT: stxv vs0, -32(r1)
; CHECK-P9-NEXT: stwx r4, r5, r3
; CHECK-P9-NEXT: lxv v2, -32(r1)
; CHECK-P9-NEXT: blr
;
; AIX-P8-LABEL: testFloat2:
; AIX-P8: # %bb.0: # %entry
; AIX-P8-NEXT: lwz r7, 0(r3)
; AIX-P8-NEXT: addi r6, r1, -32
; AIX-P8-NEXT: rlwinm r4, r4, 2, 28, 29
; AIX-P8-NEXT: stxvw4x v2, 0, r6
; AIX-P8-NEXT: stwx r7, r6, r4
; AIX-P8-NEXT: rlwinm r4, r5, 2, 28, 29
; AIX-P8-NEXT: addi r5, r1, -16
; AIX-P8-NEXT: lxvw4x vs0, 0, r6
; AIX-P8-NEXT: lwz r3, 1(r3)
; AIX-P8-NEXT: stxvw4x vs0, 0, r5
; AIX-P8-NEXT: stwx r3, r5, r4
; AIX-P8-NEXT: lxvw4x v2, 0, r5
; AIX-P8-NEXT: blr
entry:
%add.ptr1 = getelementptr inbounds i8, ptr %b, i64 1
%0 = load float, ptr %b, align 4
%vecins = insertelement <4 x float> %a, float %0, i32 %idx1
%1 = load float, ptr %add.ptr1, align 4
%vecins2 = insertelement <4 x float> %vecins, float %1, i32 %idx2
ret <4 x float> %vecins2
}
define <4 x float> @testFloat3(<4 x float> %a, ptr %b, i32 zeroext %idx1, i32 zeroext %idx2) {
; CHECK-LABEL: testFloat3:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: plwz r3, 65536(r5), 0
; CHECK-NEXT: slwi r4, r6, 2
; CHECK-NEXT: vinswrx v2, r4, r3
; CHECK-NEXT: li r3, 1
; CHECK-NEXT: slwi r4, r7, 2
; CHECK-NEXT: rldic r3, r3, 36, 27
; CHECK-NEXT: lwzx r3, r5, r3
; CHECK-NEXT: vinswrx v2, r4, r3
; CHECK-NEXT: blr
;
; CHECK-BE-LABEL: testFloat3:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: plwz r3, 65536(r5), 0
; CHECK-BE-NEXT: slwi r4, r6, 2
; CHECK-BE-NEXT: vinswlx v2, r4, r3
; CHECK-BE-NEXT: li r3, 1
; CHECK-BE-NEXT: slwi r4, r7, 2
; CHECK-BE-NEXT: rldic r3, r3, 36, 27
; CHECK-BE-NEXT: lwzx r3, r5, r3
; CHECK-BE-NEXT: vinswlx v2, r4, r3
; CHECK-BE-NEXT: blr
;
; CHECK-P9-LABEL: testFloat3:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: rlwinm r4, r6, 2, 28, 29
; CHECK-P9-NEXT: lis r6, 1
; CHECK-P9-NEXT: rlwinm r3, r7, 2, 28, 29
; CHECK-P9-NEXT: addi r7, r1, -16
; CHECK-P9-NEXT: lwzx r6, r5, r6
; CHECK-P9-NEXT: stxv v2, -16(r1)
; CHECK-P9-NEXT: stwx r6, r7, r4
; CHECK-P9-NEXT: li r4, 1
; CHECK-P9-NEXT: lxv vs0, -16(r1)
; CHECK-P9-NEXT: rldic r4, r4, 36, 27
; CHECK-P9-NEXT: lwzx r4, r5, r4
; CHECK-P9-NEXT: addi r5, r1, -32
; CHECK-P9-NEXT: stxv vs0, -32(r1)
; CHECK-P9-NEXT: stwx r4, r5, r3
; CHECK-P9-NEXT: lxv v2, -32(r1)
; CHECK-P9-NEXT: blr
;
; AIX-P8-64-LABEL: testFloat3:
; AIX-P8-64: # %bb.0: # %entry
; AIX-P8-64-NEXT: lis r6, 1
; AIX-P8-64-NEXT: rlwinm r4, r4, 2, 28, 29
; AIX-P8-64-NEXT: addi r7, r1, -32
; AIX-P8-64-NEXT: lwzx r6, r3, r6
; AIX-P8-64-NEXT: stxvw4x v2, 0, r7
; AIX-P8-64-NEXT: stwx r6, r7, r4
; AIX-P8-64-NEXT: li r4, 1
; AIX-P8-64-NEXT: lxvw4x vs0, 0, r7
; AIX-P8-64-NEXT: rldic r4, r4, 36, 27
; AIX-P8-64-NEXT: lwzx r3, r3, r4
; AIX-P8-64-NEXT: rlwinm r4, r5, 2, 28, 29
; AIX-P8-64-NEXT: addi r5, r1, -16
; AIX-P8-64-NEXT: stxvw4x vs0, 0, r5
; AIX-P8-64-NEXT: stwx r3, r5, r4
; AIX-P8-64-NEXT: lxvw4x v2, 0, r5
; AIX-P8-64-NEXT: blr
;
; AIX-P8-32-LABEL: testFloat3:
; AIX-P8-32: # %bb.0: # %entry
; AIX-P8-32-NEXT: lis r6, 1
; AIX-P8-32-NEXT: rlwinm r4, r4, 2, 28, 29
; AIX-P8-32-NEXT: addi r7, r1, -32
; AIX-P8-32-NEXT: lwzx r6, r3, r6
; AIX-P8-32-NEXT: stxvw4x v2, 0, r7
; AIX-P8-32-NEXT: stwx r6, r7, r4
; AIX-P8-32-NEXT: rlwinm r4, r5, 2, 28, 29
; AIX-P8-32-NEXT: addi r5, r1, -16
; AIX-P8-32-NEXT: lxvw4x vs0, 0, r7
; AIX-P8-32-NEXT: lwz r3, 0(r3)
; AIX-P8-32-NEXT: stxvw4x vs0, 0, r5
; AIX-P8-32-NEXT: stwx r3, r5, r4
; AIX-P8-32-NEXT: lxvw4x v2, 0, r5
; AIX-P8-32-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, ptr %b, i64 65536
%add.ptr1 = getelementptr inbounds i8, ptr %b, i64 68719476736
%0 = load float, ptr %add.ptr, align 4
%vecins = insertelement <4 x float> %a, float %0, i32 %idx1
%1 = load float, ptr %add.ptr1, align 4
%vecins2 = insertelement <4 x float> %vecins, float %1, i32 %idx2
ret <4 x float> %vecins2
}
; Float immediate
define <4 x float> @testFloatImm1(<4 x float> %a, float %b) {
; CHECK-LABEL: testFloatImm1:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: xscvdpspn vs0, f1
; CHECK-NEXT: xxinsertw v2, vs0, 12
; CHECK-NEXT: xxinsertw v2, vs0, 4
; CHECK-NEXT: blr
;
; CHECK-BE-LABEL: testFloatImm1:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: xscvdpspn vs0, f1
; CHECK-BE-NEXT: xxinsertw v2, vs0, 0
; CHECK-BE-NEXT: xxinsertw v2, vs0, 8
; CHECK-BE-NEXT: blr
;
; CHECK-P9-LABEL: testFloatImm1:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: xscvdpspn vs0, f1
; CHECK-P9-NEXT: xxinsertw v2, vs0, 0
; CHECK-P9-NEXT: xxinsertw v2, vs0, 8
; CHECK-P9-NEXT: blr
;
; AIX-P8-64-LABEL: testFloatImm1:
; AIX-P8-64: # %bb.0: # %entry
; AIX-P8-64-NEXT: ld r3, L..C2(r2) # %const.0
; AIX-P8-64-NEXT: xscvdpspn v3, f1
; AIX-P8-64-NEXT: lxvw4x v4, 0, r3
; AIX-P8-64-NEXT: ld r3, L..C3(r2) # %const.1
; AIX-P8-64-NEXT: vperm v2, v3, v2, v4
; AIX-P8-64-NEXT: lxvw4x v4, 0, r3
; AIX-P8-64-NEXT: vperm v2, v2, v3, v4
; AIX-P8-64-NEXT: blr
;
; AIX-P8-32-LABEL: testFloatImm1:
; AIX-P8-32: # %bb.0: # %entry
; AIX-P8-32-NEXT: lwz r3, L..C6(r2) # %const.0
; AIX-P8-32-NEXT: xscvdpspn v3, f1
; AIX-P8-32-NEXT: lxvw4x v4, 0, r3
; AIX-P8-32-NEXT: lwz r3, L..C7(r2) # %const.1
; AIX-P8-32-NEXT: vperm v2, v3, v2, v4
; AIX-P8-32-NEXT: lxvw4x v4, 0, r3
; AIX-P8-32-NEXT: vperm v2, v2, v3, v4
; AIX-P8-32-NEXT: blr
entry:
%vecins = insertelement <4 x float> %a, float %b, i32 0
%vecins1 = insertelement <4 x float> %vecins, float %b, i32 2
ret <4 x float> %vecins1
}
define <4 x float> @testFloatImm2(<4 x float> %a, ptr %b) {
; CHECK-LABEL: testFloatImm2:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lwz r3, 0(r5)
; CHECK-NEXT: vinsw v2, r3, 12
; CHECK-NEXT: lwz r3, 4(r5)
; CHECK-NEXT: vinsw v2, r3, 4
; CHECK-NEXT: blr
;
; CHECK-BE-LABEL: testFloatImm2:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: lwz r3, 0(r5)
; CHECK-BE-NEXT: vinsw v2, r3, 0
; CHECK-BE-NEXT: lwz r3, 4(r5)
; CHECK-BE-NEXT: vinsw v2, r3, 8
; CHECK-BE-NEXT: blr
;
; CHECK-P9-LABEL: testFloatImm2:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: lwz r3, 0(r5)
; CHECK-P9-NEXT: mtfprwz f0, r3
; CHECK-P9-NEXT: lwz r3, 4(r5)
; CHECK-P9-NEXT: xxinsertw v2, vs0, 0
; CHECK-P9-NEXT: mtfprwz f0, r3
; CHECK-P9-NEXT: xxinsertw v2, vs0, 8
; CHECK-P9-NEXT: blr
;
; AIX-P8-64-LABEL: testFloatImm2:
; AIX-P8-64: # %bb.0: # %entry
; AIX-P8-64-NEXT: ld r4, L..C4(r2) # %const.0
; AIX-P8-64-NEXT: lxsiwzx v3, 0, r3
; AIX-P8-64-NEXT: li r5, 4
; AIX-P8-64-NEXT: lxvw4x v4, 0, r4
; AIX-P8-64-NEXT: ld r4, L..C5(r2) # %const.1
; AIX-P8-64-NEXT: vperm v2, v3, v2, v4
; AIX-P8-64-NEXT: lxsiwzx v3, r3, r5
; AIX-P8-64-NEXT: lxvw4x v4, 0, r4
; AIX-P8-64-NEXT: vperm v2, v2, v3, v4
; AIX-P8-64-NEXT: blr
;
; AIX-P8-32-LABEL: testFloatImm2:
; AIX-P8-32: # %bb.0: # %entry
; AIX-P8-32-NEXT: lwz r4, L..C8(r2) # %const.0
; AIX-P8-32-NEXT: lxsiwzx v3, 0, r3
; AIX-P8-32-NEXT: li r5, 4
; AIX-P8-32-NEXT: lxvw4x v4, 0, r4
; AIX-P8-32-NEXT: lwz r4, L..C9(r2) # %const.1
; AIX-P8-32-NEXT: vperm v2, v3, v2, v4
; AIX-P8-32-NEXT: lxsiwzx v3, r3, r5
; AIX-P8-32-NEXT: lxvw4x v4, 0, r4
; AIX-P8-32-NEXT: vperm v2, v2, v3, v4
; AIX-P8-32-NEXT: blr
entry:
%add.ptr1 = getelementptr inbounds i32, ptr %b, i64 1
%0 = load float, ptr %b, align 4
%vecins = insertelement <4 x float> %a, float %0, i32 0
%1 = load float, ptr %add.ptr1, align 4
%vecins2 = insertelement <4 x float> %vecins, float %1, i32 2
ret <4 x float> %vecins2
}
define <4 x float> @testFloatImm3(<4 x float> %a, ptr %b) {
; CHECK-LABEL: testFloatImm3:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: plwz r3, 262144(r5), 0
; CHECK-NEXT: vinsw v2, r3, 12
; CHECK-NEXT: li r3, 1
; CHECK-NEXT: rldic r3, r3, 38, 25
; CHECK-NEXT: lwzx r3, r5, r3
; CHECK-NEXT: vinsw v2, r3, 4
; CHECK-NEXT: blr
;
; CHECK-BE-LABEL: testFloatImm3:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: plwz r3, 262144(r5), 0
; CHECK-BE-NEXT: vinsw v2, r3, 0
; CHECK-BE-NEXT: li r3, 1
; CHECK-BE-NEXT: rldic r3, r3, 38, 25
; CHECK-BE-NEXT: lwzx r3, r5, r3
; CHECK-BE-NEXT: vinsw v2, r3, 8
; CHECK-BE-NEXT: blr
;
; CHECK-P9-LABEL: testFloatImm3:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: lis r3, 4
; CHECK-P9-NEXT: lwzx r3, r5, r3
; CHECK-P9-NEXT: mtfprwz f0, r3
; CHECK-P9-NEXT: li r3, 1
; CHECK-P9-NEXT: rldic r3, r3, 38, 25
; CHECK-P9-NEXT: xxinsertw v2, vs0, 0
; CHECK-P9-NEXT: lwzx r3, r5, r3
; CHECK-P9-NEXT: mtfprwz f0, r3
; CHECK-P9-NEXT: xxinsertw v2, vs0, 8
; CHECK-P9-NEXT: blr
;
; AIX-P8-64-LABEL: testFloatImm3:
; AIX-P8-64: # %bb.0: # %entry
; AIX-P8-64-NEXT: ld r4, L..C6(r2) # %const.0
; AIX-P8-64-NEXT: lis r5, 4
; AIX-P8-64-NEXT: lxsiwzx v3, r3, r5
; AIX-P8-64-NEXT: li r5, 1
; AIX-P8-64-NEXT: rldic r5, r5, 38, 25
; AIX-P8-64-NEXT: lxvw4x v4, 0, r4
; AIX-P8-64-NEXT: ld r4, L..C7(r2) # %const.1
; AIX-P8-64-NEXT: vperm v2, v3, v2, v4
; AIX-P8-64-NEXT: lxsiwzx v3, r3, r5
; AIX-P8-64-NEXT: lxvw4x v4, 0, r4
; AIX-P8-64-NEXT: vperm v2, v2, v3, v4
; AIX-P8-64-NEXT: blr
;
; AIX-P8-32-LABEL: testFloatImm3:
; AIX-P8-32: # %bb.0: # %entry
; AIX-P8-32-NEXT: lwz r4, L..C10(r2) # %const.0
; AIX-P8-32-NEXT: lis r5, 4
; AIX-P8-32-NEXT: lxsiwzx v3, r3, r5
; AIX-P8-32-NEXT: lxvw4x v4, 0, r4
; AIX-P8-32-NEXT: lwz r4, L..C11(r2) # %const.1
; AIX-P8-32-NEXT: vperm v2, v3, v2, v4
; AIX-P8-32-NEXT: lxvw4x v3, 0, r4
; AIX-P8-32-NEXT: lxsiwzx v4, 0, r3
; AIX-P8-32-NEXT: vperm v2, v2, v4, v3
; AIX-P8-32-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i32, ptr %b, i64 65536
%add.ptr1 = getelementptr inbounds i32, ptr %b, i64 68719476736
%0 = load float, ptr %add.ptr, align 4
%vecins = insertelement <4 x float> %a, float %0, i32 0
%1 = load float, ptr %add.ptr1, align 4
%vecins2 = insertelement <4 x float> %vecins, float %1, i32 2
ret <4 x float> %vecins2
}
; Double indexed
define <2 x double> @testDouble1(<2 x double> %a, double %b, i32 zeroext %idx1) {
; CHECK-LABEL: testDouble1:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: mffprd r3, f1
; CHECK-NEXT: rlwinm r4, r6, 3, 0, 28
; CHECK-NEXT: vinsdrx v2, r4, r3
; CHECK-NEXT: blr
;
; CHECK-BE-LABEL: testDouble1:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: mffprd r3, f1
; CHECK-BE-NEXT: rlwinm r4, r6, 3, 0, 28
; CHECK-BE-NEXT: vinsdlx v2, r4, r3
; CHECK-BE-NEXT: blr
;
; CHECK-P9-LABEL: testDouble1:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: addi r4, r1, -16
; CHECK-P9-NEXT: rlwinm r3, r6, 3, 28, 28
; CHECK-P9-NEXT: stxv v2, -16(r1)
; CHECK-P9-NEXT: stfdx f1, r4, r3
; CHECK-P9-NEXT: lxv v2, -16(r1)
; CHECK-P9-NEXT: blr
;
; AIX-P8-64-LABEL: testDouble1:
; AIX-P8-64: # %bb.0: # %entry
; AIX-P8-64-NEXT: addi r3, r1, -16
; AIX-P8-64-NEXT: rlwinm r4, r4, 3, 28, 28
; AIX-P8-64-NEXT: stxvd2x v2, 0, r3
; AIX-P8-64-NEXT: stfdx f1, r3, r4
; AIX-P8-64-NEXT: lxvd2x v2, 0, r3
; AIX-P8-64-NEXT: blr
;
; AIX-P8-32-LABEL: testDouble1:
; AIX-P8-32: # %bb.0: # %entry
; AIX-P8-32-NEXT: addi r3, r1, -16
; AIX-P8-32-NEXT: rlwinm r4, r5, 3, 28, 28
; AIX-P8-32-NEXT: stxvd2x v2, 0, r3
; AIX-P8-32-NEXT: stfdx f1, r3, r4
; AIX-P8-32-NEXT: lxvd2x v2, 0, r3
; AIX-P8-32-NEXT: blr
entry:
%vecins = insertelement <2 x double> %a, double %b, i32 %idx1
ret <2 x double> %vecins
}
define <2 x double> @testDouble2(<2 x double> %a, ptr %b, i32 zeroext %idx1, i32 zeroext %idx2) {
; CHECK-LABEL: testDouble2:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ld r3, 0(r5)
; CHECK-NEXT: rlwinm r4, r6, 3, 0, 28
; CHECK-NEXT: vinsdrx v2, r4, r3
; CHECK-NEXT: pld r3, 1(r5), 0
; CHECK-NEXT: rlwinm r4, r7, 3, 0, 28
; CHECK-NEXT: vinsdrx v2, r4, r3
; CHECK-NEXT: blr
;
; CHECK-BE-LABEL: testDouble2:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: ld r3, 0(r5)
; CHECK-BE-NEXT: rlwinm r4, r6, 3, 0, 28
; CHECK-BE-NEXT: vinsdlx v2, r4, r3
; CHECK-BE-NEXT: pld r3, 1(r5), 0
; CHECK-BE-NEXT: rlwinm r4, r7, 3, 0, 28
; CHECK-BE-NEXT: vinsdlx v2, r4, r3
; CHECK-BE-NEXT: blr
;
; CHECK-P9-LABEL: testDouble2:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: rlwinm r4, r6, 3, 28, 28
; CHECK-P9-NEXT: ld r6, 0(r5)
; CHECK-P9-NEXT: rlwinm r3, r7, 3, 28, 28
; CHECK-P9-NEXT: addi r7, r1, -32
; CHECK-P9-NEXT: stxv v2, -32(r1)
; CHECK-P9-NEXT: stdx r6, r7, r4
; CHECK-P9-NEXT: li r4, 1
; CHECK-P9-NEXT: lxv vs0, -32(r1)
; CHECK-P9-NEXT: ldx r4, r5, r4
; CHECK-P9-NEXT: addi r5, r1, -16
; CHECK-P9-NEXT: stxv vs0, -16(r1)
; CHECK-P9-NEXT: stdx r4, r5, r3
; CHECK-P9-NEXT: lxv v2, -16(r1)
; CHECK-P9-NEXT: blr
;
; AIX-P8-64-LABEL: testDouble2:
; AIX-P8-64: # %bb.0: # %entry
; AIX-P8-64-NEXT: ld r7, 0(r3)
; AIX-P8-64-NEXT: addi r6, r1, -32
; AIX-P8-64-NEXT: rlwinm r4, r4, 3, 28, 28
; AIX-P8-64-NEXT: stxvd2x v2, 0, r6
; AIX-P8-64-NEXT: stdx r7, r6, r4
; AIX-P8-64-NEXT: li r4, 1
; AIX-P8-64-NEXT: lxvd2x vs0, 0, r6
; AIX-P8-64-NEXT: ldx r3, r3, r4
; AIX-P8-64-NEXT: rlwinm r4, r5, 3, 28, 28
; AIX-P8-64-NEXT: addi r5, r1, -16
; AIX-P8-64-NEXT: stxvd2x vs0, 0, r5
; AIX-P8-64-NEXT: stdx r3, r5, r4
; AIX-P8-64-NEXT: lxvd2x v2, 0, r5
; AIX-P8-64-NEXT: blr
;
; AIX-P8-32-LABEL: testDouble2:
; AIX-P8-32: # %bb.0: # %entry
; AIX-P8-32-NEXT: lfd f0, 0(r3)
; AIX-P8-32-NEXT: addi r6, r1, -32
; AIX-P8-32-NEXT: rlwinm r4, r4, 3, 28, 28
; AIX-P8-32-NEXT: stxvd2x v2, 0, r6
; AIX-P8-32-NEXT: stfdx f0, r6, r4
; AIX-P8-32-NEXT: addi r4, r1, -16
; AIX-P8-32-NEXT: lxvd2x vs0, 0, r6
; AIX-P8-32-NEXT: lfd f1, 1(r3)
; AIX-P8-32-NEXT: rlwinm r3, r5, 3, 28, 28
; AIX-P8-32-NEXT: stxvd2x vs0, 0, r4
; AIX-P8-32-NEXT: stfdx f1, r4, r3
; AIX-P8-32-NEXT: lxvd2x v2, 0, r4
; AIX-P8-32-NEXT: blr
entry:
%add.ptr1 = getelementptr inbounds i8, ptr %b, i64 1
%0 = load double, ptr %b, align 8
%vecins = insertelement <2 x double> %a, double %0, i32 %idx1
%1 = load double, ptr %add.ptr1, align 8
%vecins2 = insertelement <2 x double> %vecins, double %1, i32 %idx2
ret <2 x double> %vecins2
}
define <2 x double> @testDouble3(<2 x double> %a, ptr %b, i32 zeroext %idx1, i32 zeroext %idx2) {
; CHECK-LABEL: testDouble3:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: pld r3, 65536(r5), 0
; CHECK-NEXT: rlwinm r4, r6, 3, 0, 28
; CHECK-NEXT: vinsdrx v2, r4, r3
; CHECK-NEXT: li r3, 1
; CHECK-NEXT: rlwinm r4, r7, 3, 0, 28
; CHECK-NEXT: rldic r3, r3, 36, 27
; CHECK-NEXT: ldx r3, r5, r3
; CHECK-NEXT: vinsdrx v2, r4, r3
; CHECK-NEXT: blr
;
; CHECK-BE-LABEL: testDouble3:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: pld r3, 65536(r5), 0
; CHECK-BE-NEXT: rlwinm r4, r6, 3, 0, 28
; CHECK-BE-NEXT: vinsdlx v2, r4, r3
; CHECK-BE-NEXT: li r3, 1
; CHECK-BE-NEXT: rlwinm r4, r7, 3, 0, 28
; CHECK-BE-NEXT: rldic r3, r3, 36, 27
; CHECK-BE-NEXT: ldx r3, r5, r3
; CHECK-BE-NEXT: vinsdlx v2, r4, r3
; CHECK-BE-NEXT: blr
;
; CHECK-P9-LABEL: testDouble3:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: rlwinm r4, r6, 3, 28, 28
; CHECK-P9-NEXT: lis r6, 1
; CHECK-P9-NEXT: rlwinm r3, r7, 3, 28, 28
; CHECK-P9-NEXT: addi r7, r1, -32
; CHECK-P9-NEXT: ldx r6, r5, r6
; CHECK-P9-NEXT: stxv v2, -32(r1)
; CHECK-P9-NEXT: stdx r6, r7, r4
; CHECK-P9-NEXT: li r4, 1
; CHECK-P9-NEXT: lxv vs0, -32(r1)
; CHECK-P9-NEXT: rldic r4, r4, 36, 27
; CHECK-P9-NEXT: ldx r4, r5, r4
; CHECK-P9-NEXT: addi r5, r1, -16
; CHECK-P9-NEXT: stxv vs0, -16(r1)
; CHECK-P9-NEXT: stdx r4, r5, r3
; CHECK-P9-NEXT: lxv v2, -16(r1)
; CHECK-P9-NEXT: blr
;
; AIX-P8-64-LABEL: testDouble3:
; AIX-P8-64: # %bb.0: # %entry
; AIX-P8-64-NEXT: lis r6, 1
; AIX-P8-64-NEXT: rlwinm r4, r4, 3, 28, 28
; AIX-P8-64-NEXT: addi r7, r1, -32
; AIX-P8-64-NEXT: li r8, 1
; AIX-P8-64-NEXT: ldx r6, r3, r6
; AIX-P8-64-NEXT: stxvd2x v2, 0, r7
; AIX-P8-64-NEXT: stdx r6, r7, r4
; AIX-P8-64-NEXT: rldic r4, r8, 36, 27
; AIX-P8-64-NEXT: lxvd2x vs0, 0, r7
; AIX-P8-64-NEXT: ldx r3, r3, r4
; AIX-P8-64-NEXT: rlwinm r4, r5, 3, 28, 28
; AIX-P8-64-NEXT: addi r5, r1, -16
; AIX-P8-64-NEXT: stxvd2x vs0, 0, r5
; AIX-P8-64-NEXT: stdx r3, r5, r4
; AIX-P8-64-NEXT: lxvd2x v2, 0, r5
; AIX-P8-64-NEXT: blr
;
; AIX-P8-32-LABEL: testDouble3:
; AIX-P8-32: # %bb.0: # %entry
; AIX-P8-32-NEXT: lis r6, 1
; AIX-P8-32-NEXT: rlwinm r4, r4, 3, 28, 28
; AIX-P8-32-NEXT: lfdx f0, r3, r6
; AIX-P8-32-NEXT: addi r6, r1, -32
; AIX-P8-32-NEXT: stxvd2x v2, 0, r6
; AIX-P8-32-NEXT: stfdx f0, r6, r4
; AIX-P8-32-NEXT: addi r4, r1, -16
; AIX-P8-32-NEXT: lxvd2x vs0, 0, r6
; AIX-P8-32-NEXT: lfd f1, 0(r3)
; AIX-P8-32-NEXT: rlwinm r3, r5, 3, 28, 28
; AIX-P8-32-NEXT: stxvd2x vs0, 0, r4
; AIX-P8-32-NEXT: stfdx f1, r4, r3
; AIX-P8-32-NEXT: lxvd2x v2, 0, r4
; AIX-P8-32-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i8, ptr %b, i64 65536
%add.ptr1 = getelementptr inbounds i8, ptr %b, i64 68719476736
%0 = load double, ptr %add.ptr, align 8
%vecins = insertelement <2 x double> %a, double %0, i32 %idx1
%1 = load double, ptr %add.ptr1, align 8
%vecins2 = insertelement <2 x double> %vecins, double %1, i32 %idx2
ret <2 x double> %vecins2
}
; Double immediate
define <2 x double> @testDoubleImm1(<2 x double> %a, double %b) {
; CHECK-LABEL: testDoubleImm1:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: # kill: def $f1 killed $f1 def $vsl1
; CHECK-NEXT: xxmrghd v2, v2, vs1
; CHECK-NEXT: blr
;
; CHECK-BE-LABEL: testDoubleImm1:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: # kill: def $f1 killed $f1 def $vsl1
; CHECK-BE-NEXT: xxpermdi v2, vs1, v2, 1
; CHECK-BE-NEXT: blr
;
; CHECK-P9-LABEL: testDoubleImm1:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: # kill: def $f1 killed $f1 def $vsl1
; CHECK-P9-NEXT: xxpermdi v2, vs1, v2, 1
; CHECK-P9-NEXT: blr
;
; AIX-P8-LABEL: testDoubleImm1:
; AIX-P8: # %bb.0: # %entry
; AIX-P8-NEXT: # kill: def $f1 killed $f1 def $vsl1
; AIX-P8-NEXT: xxpermdi v2, vs1, v2, 1
; AIX-P8-NEXT: blr
entry:
%vecins = insertelement <2 x double> %a, double %b, i32 0
ret <2 x double> %vecins
}
define <2 x double> @testDoubleImm2(<2 x double> %a, ptr %b) {
; CHECK-LABEL: testDoubleImm2:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lfd f0, 0(r5)
; CHECK-NEXT: xxmrghd v2, v2, vs0
; CHECK-NEXT: blr
;
; CHECK-BE-LABEL: testDoubleImm2:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: lfd f0, 0(r5)
; CHECK-BE-NEXT: xxpermdi v2, vs0, v2, 1
; CHECK-BE-NEXT: blr
;
; CHECK-P9-LABEL: testDoubleImm2:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: lfd f0, 0(r5)
; CHECK-P9-NEXT: xxpermdi v2, vs0, v2, 1
; CHECK-P9-NEXT: blr
;
; AIX-P8-LABEL: testDoubleImm2:
; AIX-P8: # %bb.0: # %entry
; AIX-P8-NEXT: lfd f0, 0(r3)
; AIX-P8-NEXT: xxpermdi v2, vs0, v2, 1
; AIX-P8-NEXT: blr
entry:
%0 = load double, ptr %b, align 8
%vecins = insertelement <2 x double> %a, double %0, i32 0
ret <2 x double> %vecins
}
define <2 x double> @testDoubleImm3(<2 x double> %a, ptr %b) {
; CHECK-LABEL: testDoubleImm3:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lfd f0, 4(r5)
; CHECK-NEXT: xxmrghd v2, v2, vs0
; CHECK-NEXT: blr
;
; CHECK-BE-LABEL: testDoubleImm3:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: lfd f0, 4(r5)
; CHECK-BE-NEXT: xxpermdi v2, vs0, v2, 1
; CHECK-BE-NEXT: blr
;
; CHECK-P9-LABEL: testDoubleImm3:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: lfd f0, 4(r5)
; CHECK-P9-NEXT: xxpermdi v2, vs0, v2, 1
; CHECK-P9-NEXT: blr
;
; AIX-P8-LABEL: testDoubleImm3:
; AIX-P8: # %bb.0: # %entry
; AIX-P8-NEXT: lfd f0, 4(r3)
; AIX-P8-NEXT: xxpermdi v2, vs0, v2, 1
; AIX-P8-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i32, ptr %b, i64 1
%0 = load double, ptr %add.ptr, align 8
%vecins = insertelement <2 x double> %a, double %0, i32 0
ret <2 x double> %vecins
}
define <2 x double> @testDoubleImm4(<2 x double> %a, ptr %b) {
; CHECK-LABEL: testDoubleImm4:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: plfd f0, 262144(r5), 0
; CHECK-NEXT: xxmrghd v2, v2, vs0
; CHECK-NEXT: blr
;
; CHECK-BE-LABEL: testDoubleImm4:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: plfd f0, 262144(r5), 0
; CHECK-BE-NEXT: xxpermdi v2, vs0, v2, 1
; CHECK-BE-NEXT: blr
;
; CHECK-P9-LABEL: testDoubleImm4:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: lis r3, 4
; CHECK-P9-NEXT: lfdx f0, r5, r3
; CHECK-P9-NEXT: xxpermdi v2, vs0, v2, 1
; CHECK-P9-NEXT: blr
;
; AIX-P8-LABEL: testDoubleImm4:
; AIX-P8: # %bb.0: # %entry
; AIX-P8-NEXT: lis r4, 4
; AIX-P8-NEXT: lfdx f0, r3, r4
; AIX-P8-NEXT: xxpermdi v2, vs0, v2, 1
; AIX-P8-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i32, ptr %b, i64 65536
%0 = load double, ptr %add.ptr, align 8
%vecins = insertelement <2 x double> %a, double %0, i32 0
ret <2 x double> %vecins
}
define <2 x double> @testDoubleImm5(<2 x double> %a, ptr %b) {
; CHECK-LABEL: testDoubleImm5:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: li r3, 1
; CHECK-NEXT: rldic r3, r3, 38, 25
; CHECK-NEXT: lfdx f0, r5, r3
; CHECK-NEXT: xxmrghd v2, v2, vs0
; CHECK-NEXT: blr
;
; CHECK-BE-LABEL: testDoubleImm5:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: li r3, 1
; CHECK-BE-NEXT: rldic r3, r3, 38, 25
; CHECK-BE-NEXT: lfdx f0, r5, r3
; CHECK-BE-NEXT: xxpermdi v2, vs0, v2, 1
; CHECK-BE-NEXT: blr
;
; CHECK-P9-LABEL: testDoubleImm5:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: li r3, 1
; CHECK-P9-NEXT: rldic r3, r3, 38, 25
; CHECK-P9-NEXT: lfdx f0, r5, r3
; CHECK-P9-NEXT: xxpermdi v2, vs0, v2, 1
; CHECK-P9-NEXT: blr
;
; AIX-P8-64-LABEL: testDoubleImm5:
; AIX-P8-64: # %bb.0: # %entry
; AIX-P8-64-NEXT: li r4, 1
; AIX-P8-64-NEXT: rldic r4, r4, 38, 25
; AIX-P8-64-NEXT: lfdx f0, r3, r4
; AIX-P8-64-NEXT: xxpermdi v2, vs0, v2, 1
; AIX-P8-64-NEXT: blr
;
; AIX-P8-32-LABEL: testDoubleImm5:
; AIX-P8-32: # %bb.0: # %entry
; AIX-P8-32-NEXT: lfd f0, 0(r3)
; AIX-P8-32-NEXT: xxpermdi v2, vs0, v2, 1
; AIX-P8-32-NEXT: blr
entry:
%add.ptr = getelementptr inbounds i32, ptr %b, i64 68719476736
%0 = load double, ptr %add.ptr, align 8
%vecins = insertelement <2 x double> %a, double %0, i32 0
ret <2 x double> %vecins
}
define dso_local <4 x float> @testInsertDoubleToFloat(<4 x float> %a, double %b) local_unnamed_addr #0 {
; CHECK-LABEL: testInsertDoubleToFloat:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: xscvdpsp f0, f1
; CHECK-NEXT: xxinsertw v2, vs0, 8
; CHECK-NEXT: blr
;
; CHECK-BE-LABEL: testInsertDoubleToFloat:
; CHECK-BE: # %bb.0: # %entry
; CHECK-BE-NEXT: xscvdpsp f0, f1
; CHECK-BE-NEXT: xxinsertw v2, vs0, 4
; CHECK-BE-NEXT: blr
;
; CHECK-P9-LABEL: testInsertDoubleToFloat:
; CHECK-P9: # %bb.0: # %entry
; CHECK-P9-NEXT: xscvdpsp f0, f1
; CHECK-P9-NEXT: xxinsertw v2, vs0, 4
; CHECK-P9-NEXT: blr
;
; AIX-P8-64-LABEL: testInsertDoubleToFloat:
; AIX-P8-64: # %bb.0: # %entry
; AIX-P8-64-NEXT: xsrsp f0, f1
; AIX-P8-64-NEXT: ld r3, L..C8(r2) # %const.0
; AIX-P8-64-NEXT: lxvw4x v4, 0, r3
; AIX-P8-64-NEXT: xscvdpspn v3, f0
; AIX-P8-64-NEXT: vperm v2, v2, v3, v4
; AIX-P8-64-NEXT: blr
;
; AIX-P8-32-LABEL: testInsertDoubleToFloat:
; AIX-P8-32: # %bb.0: # %entry
; AIX-P8-32-NEXT: xsrsp f0, f1
; AIX-P8-32-NEXT: lwz r3, L..C12(r2) # %const.0
; AIX-P8-32-NEXT: lxvw4x v4, 0, r3
; AIX-P8-32-NEXT: xscvdpspn v3, f0
; AIX-P8-32-NEXT: vperm v2, v2, v3, v4
; AIX-P8-32-NEXT: blr
entry:
%conv = fptrunc double %b to float
%vecins = insertelement <4 x float> %a, float %conv, i32 1
ret <4 x float> %vecins
}