| ;; Test to ensure that we are not using any of the aliased reserved registers |
| ;; under the Extended Altivec ABI on AIX. |
| ; RUN: llc -verify-machineinstrs -mcpu=pwr8 -mattr=+altivec \ |
| ; RUN: -stop-after=machine-cp -mtriple powerpc64-ibm-aix-xcoff < %s | \ |
| ; RUN: FileCheck %s --check-prefix=DFLABI |
| ; RUN: llc -verify-machineinstrs -mcpu=pwr8 -mattr=+altivec -vec-extabi\ |
| ; RUN: -stop-after=machine-cp -mtriple powerpc64-ibm-aix-xcoff < %s | \ |
| ; RUN: FileCheck %s --check-prefix=EXTABI |
| |
| define double @dbl_test(double %a, double* %b) local_unnamed_addr { |
| entry: |
| %0 = load volatile double, double* %b, align 4 |
| %add = fadd double %0, %a |
| store volatile double %add, double* %b, align 4 |
| ;; Clobbered all vector and floating point registers. In the default Altivec |
| ;; ABI this forces a register spill since no registers are free to use. |
| tail call void asm sideeffect "nop", "~{v19},~{v18},~{v17},~{v16},~{v15},~{v14},~{v13},~{v12},~{v11},~{v10},~{v9},~{v8},~{v7},~{v6},~{v5},~{v4},~{v3},~{v2},~{v1},~{v0},~{f0},~{f1},~{f2},~{f3},~{f4},~{f5},~{f6},~{f7},~{f8},~{f9},~{f10},~{f11},~{f12},~{f13},~{f14},~{f15},~{f16},~{f17},~{f18},~{f19},~{f20},~{f21},~{f22},~{f23},~{f24},~{f25},~{f26},~{f27},~{f28},~{f29},~{f30},~{f31}"() |
| %mul = fmul double %a, %a |
| %1 = load volatile double, double* %b, align 4 |
| %add1 = fadd double %mul, %1 |
| store volatile double %add1, double* %b, align 4 |
| %2 = load volatile double, double* %b, align 4 |
| ret double %2 |
| } |
| |
| define <4 x i32> @vec_test(<4 x i32> %a, <4 x i32>* %b) local_unnamed_addr { |
| entry: |
| %0 = load volatile <4 x i32>, <4 x i32>* %b, align 4 |
| %add = add <4 x i32> %0, %a |
| store volatile <4 x i32> %add, <4 x i32>* %b, align 4 |
| tail call void asm sideeffect "nop", "~{v19},~{v18},~{v17},~{v16},~{v15},~{v14},~{v13},~{v12},~{v11},~{v10},~{v9},~{v8},~{v7},~{v6},~{v5},~{v4},~{v3},~{v2},~{v1},~{v0},~{f0},~{f1},~{f2},~{f3},~{f4},~{f5},~{f6},~{f7},~{f8},~{f9},~{f10},~{f11},~{f12},~{f13},~{f14},~{f15},~{f16},~{f17},~{f18},~{f19},~{f20},~{f21},~{f22},~{f23},~{f24},~{f25},~{f26},~{f27},~{f28},~{f29},~{f30},~{f31}"() |
| %mul = mul <4 x i32> %a, %a |
| %1 = load volatile <4 x i32>, <4 x i32>* %b, align 4 |
| %add1 = add <4 x i32> %mul, %1 |
| store volatile <4 x i32> %add1, <4 x i32>* %b, align 4 |
| %2 = load volatile <4 x i32>, <4 x i32>* %b, align 4 |
| ret <4 x i32> %2 |
| } |
| |
| ; DFLABI-LABEL: dbl_test |
| |
| ; DFLABI-NOT: $v20 |
| ; DFLABI-NOT: $v21 |
| ; DFLABI-NOT: $v22 |
| ; DFLABI-NOT: $v23 |
| ; DFLABI-NOT: $v24 |
| ; DFLABI-NOT: $v25 |
| ; DFLABI-NOT: $v26 |
| ; DFLABI-NOT: $v27 |
| ; DFLABI-NOT: $v28 |
| ; DFLABI-NOT: $v29 |
| ; DFLABI-NOT: $v30 |
| ; DFLABI-NOT: $v31 |
| |
| ; DFLABI-NOT: $vf20 |
| ; DFLABI-NOT: $vf21 |
| ; DFLABI-NOT: $vf22 |
| ; DFLABI-NOT: $vf23 |
| ; DFLABI-NOT: $vf24 |
| ; DFLABI-NOT: $vf25 |
| ; DFLABI-NOT: $vf26 |
| ; DFLABI-NOT: $vf27 |
| ; DFLABI-NOT: $vf28 |
| ; DFLABI-NOT: $vf29 |
| ; DFLABI-NOT: $vf30 |
| ; DFLABI-NOT: $vf31 |
| |
| ; DFLABI-NOT: $vs20 |
| ; DFLABI-NOT: $vs21 |
| ; DFLABI-NOT: $vs22 |
| ; DFLABI-NOT: $vs23 |
| ; DFLABI-NOT: $vs24 |
| ; DFLABI-NOT: $vs25 |
| ; DFLABI-NOT: $vs26 |
| ; DFLABI-NOT: $vs27 |
| ; DFLABI-NOT: $vs28 |
| ; DFLABI-NOT: $vs29 |
| ; DFLABI-NOT: $vs30 |
| ; DFLABI-NOT: $vs31 |
| |
| ; EXTABI-LABEL: vec_test |
| ; EXTABI: liveins: |
| ; EXTABI-NEXT: - { reg: '$f1', virtual-reg: '' } |
| ; EXTABI-NEXT: - { reg: '$x4', virtual-reg: '' } |
| ; EXTABI: body: | |
| ; EXTABI: bb.0.entry: |
| ; EXTABI: liveins: $f1, $x4 |
| ; EXTABI-DAG: renamable $f0 = LFD 0, renamable $x4 :: (volatile load (s64) from %ir.b, align 4) |
| ; EXTABI-DAG: renamable $f0 = nofpexcept XSADDDP killed renamable $f0, renamable $f1, implicit $rm |
| ; EXTABI-DAG: renamable $vf31 = nofpexcept XSMULDP killed renamable $f1, renamable $f1, implicit $rm |
| ; EXTABI: STFD killed renamable $f0, 0, renamable $x4 :: (volatile store (s64) into %ir.b, align 4) |
| ; EXTABI-LABEL: INLINEASM |
| ; EXTABI-DAG: renamable $f0 = LFD 0, renamable $x4 :: (volatile load (s64) from %ir.b, align 4) |
| ; EXTABI-DAG: renamable $f0 = nofpexcept XSADDDP killed renamable $vf31, killed renamable $f0, implicit $rm |
| ; EXTABI-DAG: STFD killed renamable $f0, 0, renamable $x4 :: (volatile store (s64) into %ir.b, align 4) |
| ; EXTABI: renamable $f1 = LFD 0, killed renamable $x4 :: (volatile load (s64) from %ir.b, align 4) |
| |
| ; DFLABI-LABEL: vec_test |
| |
| ; DFLABI-NOT: $v20 |
| ; DFLABI-NOT: $v21 |
| ; DFLABI-NOT: $v22 |
| ; DFLABI-NOT: $v23 |
| ; DFLABI-NOT: $v24 |
| ; DFLABI-NOT: $v25 |
| ; DFLABI-NOT: $v26 |
| ; DFLABI-NOT: $v27 |
| ; DFLABI-NOT: $v28 |
| ; DFLABI-NOT: $v29 |
| ; DFLABI-NOT: $v30 |
| ; DFLABI-NOT: $v31 |
| |
| ; DFLABI-NOT: $vf20 |
| ; DFLABI-NOT: $vf21 |
| ; DFLABI-NOT: $vf22 |
| ; DFLABI-NOT: $vf23 |
| ; DFLABI-NOT: $vf24 |
| ; DFLABI-NOT: $vf25 |
| ; DFLABI-NOT: $vf26 |
| ; DFLABI-NOT: $vf27 |
| ; DFLABI-NOT: $vf28 |
| ; DFLABI-NOT: $vf29 |
| ; DFLABI-NOT: $vf30 |
| ; DFLABI-NOT: $vf31 |
| |
| ; DFLABI-NOT: $vs20 |
| ; DFLABI-NOT: $vs21 |
| ; DFLABI-NOT: $vs22 |
| ; DFLABI-NOT: $vs23 |
| ; DFLABI-NOT: $vs24 |
| ; DFLABI-NOT: $vs25 |
| ; DFLABI-NOT: $vs26 |
| ; DFLABI-NOT: $vs27 |
| ; DFLABI-NOT: $vs28 |
| ; DFLABI-NOT: $vs29 |
| ; DFLABI-NOT: $vs30 |
| ; DFLABI-NOT: $vs31 |
| |
| ; EXTABI-LABEL: vec_test |
| |
| ; EXTABI: liveins: |
| ; EXTABI-NEXT: - { reg: '$v2', virtual-reg: '' } |
| ; EXTABI-NEXT: - { reg: '$x3', virtual-reg: '' } |
| ; EXTABI: body: | |
| ; EXTABI-DAG: bb.0.entry: |
| ; EXTABI-DAG: liveins: $v2, $x3 |
| ; EXTABI-DAG: renamable $v3 = LXVW4X $zero8, renamable $x3 :: (volatile load (s128) from %ir.b, align 4) |
| ; EXTABI-DAG: renamable $v31 = COPY $v2 |
| ; EXTABI-DAG: renamable $v2 = VADDUWM killed renamable $v3, $v2 |
| ; EXTABI-LABEL: INLINEASM |
| ; EXTABI-DAG: renamable $v2 = LXVW4X $zero8, renamable $x3 :: (volatile load (s128) from %ir.b, align 4) |
| ; EXTABI-DAG: renamable $v3 = VMULUWM killed renamable $v31, renamable $v31 |
| ; EXTABI-DAG: renamable $v2 = VADDUWM killed renamable $v3, killed renamable $v2 |
| ; EXTABI-DAG: STXVW4X killed renamable $v2, $zero8, renamable $x3 :: (volatile store (s128) into %ir.b, align 4) |
| ; EXTABI: renamable $v2 = LXVW4X $zero8, killed renamable $x3 :: (volatile load (s128) from %ir.b, align 4) |