forked from OSchip/llvm-project
337 lines
10 KiB
ArmAsm
337 lines
10 KiB
ArmAsm
|
// REQUIRES: aarch64
|
||
|
// RUN: llvm-mc -filetype=obj -triple=aarch64-none-linux %s -o %t.o
|
||
|
// RUN: ld.lld -fix-cortex-a53-843419 -verbose %t.o -o %t2 | FileCheck -check-prefix CHECK-PRINT %s
|
||
|
|
||
|
// Test cases for Cortex-A53 Erratum 843419
|
||
|
// See ARM-EPM-048406 Cortex_A53_MPCore_Software_Developers_Errata_Notice.pdf
|
||
|
// for full erratum details.
|
||
|
// In Summary
|
||
|
// 1.)
|
||
|
// ADRP (0xff8 or 0xffc)
|
||
|
// 2.)
|
||
|
// - load or store single register or either integer or vector registers
|
||
|
// - STP or STNP of either vector or vector registers
|
||
|
// - Advanced SIMD ST1 store instruction
|
||
|
// Must not write Rn
|
||
|
// 3.) optional instruction, can't be a branch, must not write Rn, may read Rn
|
||
|
// 4.) A load or store instruction from the Load/Store register unsigned
|
||
|
// immediate class using Rn as the base register
|
||
|
|
||
|
// Each section contains a sequence of instructions that should be recognized
|
||
|
// as erratum 843419. The test cases cover the major variations such as:
|
||
|
// adrp starts at 0xfff8 or 0xfffc
|
||
|
// Variations in instruction class for instruction 2
|
||
|
// Optional instruction 3 present or not
|
||
|
// Load or store for instruction 4.
|
||
|
|
||
|
// CHECK-PRINT: detected cortex-a53-843419 erratum sequence starting at 21FF8 in unpatched output.
|
||
|
.section .text.01, "ax", %progbits
|
||
|
.balign 4096
|
||
|
.globl t3_ff8_ldr
|
||
|
.type t3_ff8_ldr, %function
|
||
|
.space 4096 - 8
|
||
|
t3_ff8_ldr:
|
||
|
adrp x0, dat1
|
||
|
ldr x1, [x1, #0]
|
||
|
ldr x0, [x0, :got_lo12:dat1]
|
||
|
ret
|
||
|
|
||
|
// CHECK-PRINT: detected cortex-a53-843419 erratum sequence starting at 23FF8 in unpatched output.
|
||
|
.section .text.02, "ax", %progbits
|
||
|
.balign 4096
|
||
|
.globl t3_ff8_ldrsimd
|
||
|
.type t3_ff8_ldrsimd, %function
|
||
|
.space 4096 - 8
|
||
|
t3_ff8_ldrsimd:
|
||
|
adrp x0, dat2
|
||
|
ldr s1, [x1, #0]
|
||
|
ldr x2, [x0, :got_lo12:dat2]
|
||
|
ret
|
||
|
|
||
|
// CHECK-PRINT: detected cortex-a53-843419 erratum sequence starting at 25FFC in unpatched output.
|
||
|
.section .text.03, "ax", %progbits
|
||
|
.balign 4096
|
||
|
.globl t3_ffc_ldrpost
|
||
|
.type t3_ffc_ldrpost, %function
|
||
|
.space 4096 - 4
|
||
|
t3_ffc_ldrpost:
|
||
|
adrp x0, dat3
|
||
|
ldr s1, [x1], #8
|
||
|
ldr x3, [x0, :got_lo12:dat3]
|
||
|
ret
|
||
|
|
||
|
// CHECK-PRINT: detected cortex-a53-843419 erratum sequence starting at 27FF8 in unpatched output.
|
||
|
.section .text.04, "ax", %progbits
|
||
|
.balign 4096
|
||
|
.globl t3_ff8_strpre
|
||
|
.type t3_ff8_strpre, %function
|
||
|
.space 4096 - 8
|
||
|
t3_ff8_strpre:
|
||
|
adrp x0, dat1
|
||
|
str s1, [x1, #8]!
|
||
|
ldr x2, [x0, :lo12:dat1]
|
||
|
ret
|
||
|
|
||
|
// CHECK-PRINT: detected cortex-a53-843419 erratum sequence starting at 29FFC in unpatched output.
|
||
|
.section .text.05, "ax", %progbits
|
||
|
.balign 4096
|
||
|
.globl t3_ffc_str
|
||
|
.type t3_ffc_str, %function
|
||
|
.space 4096 - 4
|
||
|
t3_ffc_str:
|
||
|
adrp x28, dat2
|
||
|
str x2, [x2, #0]
|
||
|
str x28, [x28, :lo12:dat2]
|
||
|
ret
|
||
|
|
||
|
// CHECK-PRINT: detected cortex-a53-843419 erratum sequence starting at 2BFFC in unpatched output.
|
||
|
.section .text.06, "ax", %progbits
|
||
|
.balign 4096
|
||
|
.globl t3_ffc_strsimd
|
||
|
.type t3_ffc_strsimd, %function
|
||
|
.space 4096 - 4
|
||
|
t3_ffc_strsimd:
|
||
|
adrp x28, dat3
|
||
|
str w4, [x2, #0]
|
||
|
str x4, [x28, :lo12:dat3]
|
||
|
ret
|
||
|
|
||
|
// CHECK-PRINT: detected cortex-a53-843419 erratum sequence starting at 2DFF8 in unpatched output.
|
||
|
.section .text.07, "ax", %progbits
|
||
|
.balign 4096
|
||
|
.globl t3_ff8_ldrunpriv
|
||
|
.type t3_ff8_ldrunpriv, %function
|
||
|
.space 4096 - 8
|
||
|
t3_ff8_ldrunpriv:
|
||
|
adrp x29, dat1
|
||
|
ldtrb w1, [x2, #0]
|
||
|
ldr x29, [x29, :got_lo12:dat1]
|
||
|
ret
|
||
|
|
||
|
// CHECK-PRINT: detected cortex-a53-843419 erratum sequence starting at 2FFFC in unpatched output.
|
||
|
.section .text.08, "ax", %progbits
|
||
|
.balign 4096
|
||
|
.globl t3_ffc_ldur
|
||
|
.type t3_ffc_ldur, %function
|
||
|
.space 4096 - 4
|
||
|
t3_ffc_ldur:
|
||
|
adrp x29, dat2
|
||
|
ldur w2, [x2, #4]
|
||
|
ldr x29, [x29, :got_lo12:dat2]
|
||
|
ret
|
||
|
|
||
|
// CHECK-PRINT: detected cortex-a53-843419 erratum sequence starting at 31FFC in unpatched output.
|
||
|
.section .text.09, "ax", %progbits
|
||
|
.balign 4096
|
||
|
.globl t3_ffc_sturh
|
||
|
.type t3_ffc_sturh, %function
|
||
|
.space 4096 - 4
|
||
|
t3_ffc_sturh:
|
||
|
adrp x18, dat3
|
||
|
sturh w3, [x2, #4]
|
||
|
ldr x1, [x18, :got_lo12:dat3]
|
||
|
ret
|
||
|
|
||
|
// CHECK-PRINT: detected cortex-a53-843419 erratum sequence starting at 33FF8 in unpatched output.
|
||
|
.section .text.10, "ax", %progbits
|
||
|
.balign 4096
|
||
|
.globl t3_ff8_literal
|
||
|
.type t3_ff8_literal, %function
|
||
|
.space 4096 - 8
|
||
|
t3_ff8_literal:
|
||
|
adrp x18, dat1
|
||
|
ldr x3, t3_ff8_literal
|
||
|
ldr x18, [x18, :lo12:dat1]
|
||
|
ret
|
||
|
|
||
|
// CHECK-PRINT: detected cortex-a53-843419 erratum sequence starting at 35FFC in unpatched output.
|
||
|
.section .text.11, "ax", %progbits
|
||
|
.balign 4096
|
||
|
.globl t3_ffc_register
|
||
|
.type t3_ffc_register, %function
|
||
|
.space 4096 - 4
|
||
|
t3_ffc_register:
|
||
|
adrp x15, dat2
|
||
|
ldr x3, [x2, x1]
|
||
|
ldr x10, [x15, :lo12:dat2]
|
||
|
ret
|
||
|
|
||
|
// CHECK-PRINT: detected cortex-a53-843419 erratum sequence starting at 37FF8 in unpatched output.
|
||
|
.section .text.12, "ax", %progbits
|
||
|
.balign 4096
|
||
|
.globl t3_ff8_stp
|
||
|
.type t3_ff8_stp, %function
|
||
|
.space 4096 - 8
|
||
|
t3_ff8_stp:
|
||
|
adrp x16, dat3
|
||
|
stp x1,x2, [x3, #0]
|
||
|
ldr x13, [x16, :lo12:dat3]
|
||
|
ret
|
||
|
|
||
|
// CHECK-PRINT: detected cortex-a53-843419 erratum sequence starting at 39FFC in unpatched output.
|
||
|
.section .text.13, "ax", %progbits
|
||
|
.balign 4096
|
||
|
.globl t3_ffc_stnp
|
||
|
.type t3_ffc_stnp, %function
|
||
|
.space 4096 - 4
|
||
|
t3_ffc_stnp:
|
||
|
adrp x7, dat1
|
||
|
stnp x1,x2, [x3, #0]
|
||
|
ldr x9, [x7, :lo12:dat1]
|
||
|
ret
|
||
|
|
||
|
// CHECK-PRINT: detected cortex-a53-843419 erratum sequence starting at 3BFFC in unpatched output.
|
||
|
.section .text.14, "ax", %progbits
|
||
|
.balign 4096
|
||
|
.globl t3_ffc_st1singlepost
|
||
|
.type t3_ffc_st1singlepost, %function
|
||
|
.space 4096 - 4
|
||
|
t3_ffc_st1singlepost:
|
||
|
adrp x23, dat2
|
||
|
st1 { v0.16b }, [x1], x2
|
||
|
ldr x22, [x23, :lo12:dat2]
|
||
|
ret
|
||
|
|
||
|
// CHECK-PRINT: detected cortex-a53-843419 erratum sequence starting at 3DFF8 in unpatched output.
|
||
|
.section .text.15, "ax", %progbits
|
||
|
.balign 4096
|
||
|
.globl t3_ff8_st1multiple
|
||
|
.type t3_ff8_st1muliple, %function
|
||
|
.space 4096 - 8
|
||
|
t3_ff8_st1multiple:
|
||
|
adrp x23, dat3
|
||
|
st1 { v0.16b, v1.16b }, [x1]
|
||
|
ldr x24, [x23, :lo12:dat3]
|
||
|
ret
|
||
|
|
||
|
// CHECK-PRINT: detected cortex-a53-843419 erratum sequence starting at 3FFF8 in unpatched output.
|
||
|
.section .text.16, "ax", %progbits
|
||
|
.balign 4096
|
||
|
.globl t4_ff8_ldr
|
||
|
.type t4_ff8_ldr, %function
|
||
|
.space 4096 - 8
|
||
|
t4_ff8_ldr:
|
||
|
adrp x0, dat1
|
||
|
ldr x1, [x1, #0]
|
||
|
add x2, x2, x0
|
||
|
ldr x2, [x0, :got_lo12:dat1]
|
||
|
ret
|
||
|
|
||
|
// CHECK-PRINT: detected cortex-a53-843419 erratum sequence starting at 41FFC in unpatched output.
|
||
|
.section .text.17, "ax", %progbits
|
||
|
.balign 4096
|
||
|
.globl t4_ffc_str
|
||
|
.type t4_ffc_str, %function
|
||
|
.space 4096 - 4
|
||
|
t4_ffc_str:
|
||
|
adrp x28, dat2
|
||
|
str x2, [x2, #0]
|
||
|
sub x0, x1, x2
|
||
|
str x27, [x28, :got_lo12:dat2]
|
||
|
ret
|
||
|
|
||
|
// CHECK-PRINT: detected cortex-a53-843419 erratum sequence starting at 43FF8 in unpatched output.
|
||
|
.section .text.18, "ax", %progbits
|
||
|
.balign 4096
|
||
|
.globl t4_ff8_stp
|
||
|
.type t4_ff8_stp, %function
|
||
|
.space 4096 - 8
|
||
|
t4_ff8_stp:
|
||
|
adrp x16, dat3
|
||
|
stp x1,x2, [x3, #0]
|
||
|
mul x3, x16, x16
|
||
|
ldr x14, [x16, :got_lo12:dat3]
|
||
|
ret
|
||
|
|
||
|
// CHECK-PRINT: detected cortex-a53-843419 erratum sequence starting at 45FF8 in unpatched output.
|
||
|
.section .text.19, "ax", %progbits
|
||
|
.balign 4096
|
||
|
.globl t4_ff8_stppre
|
||
|
.type t4_ff8_stppre, %function
|
||
|
.space 4096 - 8
|
||
|
t4_ff8_stppre:
|
||
|
adrp x16, dat1
|
||
|
stp x1,x2, [x3, #16]!
|
||
|
mul x3, x16, x16
|
||
|
ldr x14, [x16, #8]
|
||
|
ret
|
||
|
|
||
|
// CHECK-PRINT: detected cortex-a53-843419 erratum sequence starting at 47FF8 in unpatched output.
|
||
|
.section .text.20, "ax", %progbits
|
||
|
.balign 4096
|
||
|
.globl t4_ff8_stppost
|
||
|
.type t4_ff8_stppost, %function
|
||
|
.space 4096 - 8
|
||
|
t4_ff8_stppost:
|
||
|
adrp x16, dat2
|
||
|
stp x1,x2, [x3], #16
|
||
|
mul x3, x16, x16
|
||
|
ldr x14, [x16, #8]
|
||
|
ret
|
||
|
|
||
|
// CHECK-PRINT: detected cortex-a53-843419 erratum sequence starting at 49FFC in unpatched output.
|
||
|
.section .text.21, "ax", %progbits
|
||
|
.balign 4096
|
||
|
.globl t4_ffc_stpsimd
|
||
|
.type t4_ffc_stpsimd, %function
|
||
|
.space 4096 - 4
|
||
|
t4_ffc_stpsimd:
|
||
|
adrp x16, dat3
|
||
|
stp q1,q2, [x3, #0]
|
||
|
mul x3, x16, x16
|
||
|
ldr x14, [x16, #8]
|
||
|
ret
|
||
|
|
||
|
// CHECK-PRINT: detected cortex-a53-843419 erratum sequence starting at 4BFFC in unpatched output.
|
||
|
.section .text.22, "ax", %progbits
|
||
|
.balign 4096
|
||
|
.globl t4_ffc_stnp
|
||
|
.type t4_ffc_stnp, %function
|
||
|
.space 4096 - 4
|
||
|
t4_ffc_stnp:
|
||
|
adrp x7, dat1
|
||
|
stnp x1,x2, [x3, #0]
|
||
|
nop
|
||
|
ldr x10, [x7, :got_lo12:dat1]
|
||
|
ret
|
||
|
|
||
|
// CHECK-PRINT: detected cortex-a53-843419 erratum sequence starting at 4DFFC in unpatched output.
|
||
|
.section .text.23, "ax", %progbits
|
||
|
.balign 4096
|
||
|
.globl t4_ffc_st1
|
||
|
.type t4_ffc_st1, %function
|
||
|
.space 4096 - 4
|
||
|
t4_ffc_st1:
|
||
|
adrp x24, dat2
|
||
|
st1 { v0.16b }, [x1]
|
||
|
ldr x22, [x23, :got_lo12:dat2]
|
||
|
str x24, [x24, #32760]
|
||
|
ret
|
||
|
|
||
|
// CHECK-PRINT: detected cortex-a53-843419 erratum sequence starting at 4FFF8 in unpatched output.
|
||
|
.section .text.24, "ax", %progbits
|
||
|
.balign 4096
|
||
|
.globl t3_ff8_ldr_once
|
||
|
.type t3_ff8_ldr_once, %function
|
||
|
.space 4096 - 8
|
||
|
t3_ff8_ldr_once:
|
||
|
adrp x0, dat3
|
||
|
st1 { v0.16b }, [x1], x2
|
||
|
ldr x1, [x0, #16]
|
||
|
ldr x2, [x0, #16]
|
||
|
ret
|
||
|
|
||
|
.text
|
||
|
.globl _start
|
||
|
.type _start, %function
|
||
|
_start:
|
||
|
ret
|
||
|
|
||
|
.data
|
||
|
.globl dat
|
||
|
.globl dat2
|
||
|
.globl dat3
|
||
|
dat1: .quad 1
|
||
|
dat2: .quad 2
|
||
|
dat3: .quad 3
|