aarch64: rcpc3: Add integer load/store insns
Along with the relevant unit tests and updates to the existing regression tests, this adds support for the following novel rcpc3 insns: LDIAPP <Wt1>, <Wt2>, [<Xn|SP>] LDIAPP <Wt1>, <Wt2>, [<Xn|SP>], #8 LDIAPP <Xt1>, <Xt2>, [<Xn|SP>] LDIAPP <Xt1>, <Xt2>, [<Xn|SP>], #16 STILP <Wt1>, <Wt2>, [<Xn|SP>] STILP <Wt1>, <Wt2>, [<Xn|SP>, #-8]! STILP <Xt1>, <Xt2>, [<Xn|SP>] STILP <Xt1>, <Xt2>, [<Xn|SP>, #-16]! LDAPR <Wt>, [<Xn|SP>], #4 LDAPR <Xt>, [<Xn|SP>], #8 STLR <Wt>, [<Xn|SP>, #-4]! STLR <Xt>, [<Xn|SP>, #-8]!
This commit is contained in:
@@ -22,7 +22,7 @@
|
||||
[^:]+:23: Info: macro .*
|
||||
[^:]+:6: Error: the optional immediate offset can only be 0 at operand 2 -- `ldapr w1,\[x7,#8\]'
|
||||
[^:]+:23: Info: macro .*
|
||||
[^:]+:7: Error: invalid addressing mode at operand 2 -- `ldapr w1,\[x7,#8\]!'
|
||||
[^:]+:7: Error: unexpected address writeback at operand 2 -- `ldapr w1,\[x7,#8\]!'
|
||||
[^:]+:23: Info: macro .*
|
||||
[^:]+:8: Error: invalid addressing mode at operand 2 -- `ldapr w1,\[x7\],#8'
|
||||
[^:]+:8: Error: invalid increment amount at operand 2 -- `ldapr w1,\[x7\],#8'
|
||||
[^:]+:23: Info: macro .*
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
#name: RCPC3 GPR load/store illegal
|
||||
#as: -march=armv8.3-a+rcpc3 -mno-verbose-error
|
||||
#error_output: rcpc3-fail.l
|
||||
@@ -0,0 +1,9 @@
|
||||
[^:]+: Assembler messages:
|
||||
[^:]+:3: Error: operand 3 must be an address with post-incrementing by ammount of loaded bytes -- `ldiapp w0,w1,\[x3,#8\]'
|
||||
[^:]+:4: Error: operand 3 must be an address with post-incrementing by ammount of loaded bytes -- `ldiapp x0,x1,\[x3,#16\]'
|
||||
[^:]+:6: Error: operand 3 must be an address with pre-incrementing with write-back by ammount of stored bytes -- `stilp w0,w1,\[x3,#8\]'
|
||||
[^:]+:7: Error: operand 3 must be an address with pre-incrementing with write-back by ammount of stored bytes -- `stilp x0,x1,\[x3,#16\]'
|
||||
[^:]+:9: Error: invalid addressing mode at operand 3 -- `stilp w0,w1,\[x3\],#8'
|
||||
[^:]+:10: Error: invalid addressing mode at operand 3 -- `stilp x0,x1,\[x3\],#16'
|
||||
[^:]+:12: Error: invalid addressing mode at operand 3 -- `ldiapp w0,w1,\[x3,#-8\]!'
|
||||
[^:]+:13: Error: invalid addressing mode at operand 3 -- `ldiapp x0,x1,\[x3,#-16\]!'
|
||||
@@ -0,0 +1,13 @@
|
||||
.text
|
||||
|
||||
ldiapp w0, w1, [x3, #8]
|
||||
ldiapp x0, x1, [x3, #16]
|
||||
|
||||
stilp w0, w1, [x3, #8]
|
||||
stilp x0, x1, [x3, #16]
|
||||
|
||||
stilp w0, w1, [x3], #8
|
||||
stilp x0, x1, [x3], #16
|
||||
|
||||
ldiapp w0, w1, [x3, #-8]!
|
||||
ldiapp x0, x1, [x3, #-16]!
|
||||
@@ -0,0 +1,21 @@
|
||||
#name: RCPC3 GPR load/store
|
||||
#as: -march=armv8.2-a+rcpc3
|
||||
#objdump: -dr
|
||||
|
||||
.*: file format .*
|
||||
|
||||
Disassembly of section \.text:
|
||||
|
||||
0+ <.*>:
|
||||
0: d9411860 ldiapp x0, x1, \[x3\]
|
||||
4: 99411860 ldiapp w0, w1, \[x3\]
|
||||
8: d9410860 ldiapp x0, x1, \[x3\], #16
|
||||
c: 99410860 ldiapp w0, w1, \[x3\], #8
|
||||
10: d9011860 stilp x0, x1, \[x3\]
|
||||
14: 99011860 stilp w0, w1, \[x3\]
|
||||
18: d9010860 stilp x0, x1, \[x3, #-16\]!
|
||||
1c: 99010860 stilp w0, w1, \[x3, #-8\]!
|
||||
20: 99c00841 ldapr w1, \[x2\], #4
|
||||
24: d9c00841 ldapr x1, \[x2\], #8
|
||||
28: 99800841 stlr w1, \[x2, #-4\]!
|
||||
2c: d9800841 stlr x1, \[x2, #-8\]!
|
||||
@@ -0,0 +1,17 @@
|
||||
.text
|
||||
|
||||
ldiapp x0, x1, [x3]
|
||||
ldiapp w0, w1, [x3]
|
||||
ldiapp x0, x1, [x3], #16
|
||||
ldiapp w0, w1, [x3], #8
|
||||
|
||||
stilp x0, x1, [x3]
|
||||
stilp w0, w1, [x3]
|
||||
stilp x0, x1, [x3, #-16]!
|
||||
stilp w0, w1, [x3, #-8]!
|
||||
|
||||
ldapr w1, [x2], #4
|
||||
ldapr x1, [x2], #8
|
||||
|
||||
stlr w1, [x2, #-4]!
|
||||
stlr x1, [x2, #-8]!
|
||||
@@ -1013,6 +1013,7 @@ enum aarch64_insn_class
|
||||
the,
|
||||
sve2_urqvs,
|
||||
sve_index1,
|
||||
rcpc3
|
||||
};
|
||||
|
||||
/* Opcode enumerators. */
|
||||
|
||||
@@ -4216,6 +4216,11 @@ const struct aarch64_opcode aarch64_opcode_table[] =
|
||||
_LSE128_INSN ("swppa", 0x19a08000, 0xffe0fc00, lse128_atomic, OP3 (LSE128_Rt, LSE128_Rt2, ADDR_SIMPLE), QL_X2NIL, 0),
|
||||
_LSE128_INSN ("swppal", 0x19e08000, 0xffe0fc00, lse128_atomic, OP3 (LSE128_Rt, LSE128_Rt2, ADDR_SIMPLE), QL_X2NIL, 0),
|
||||
_LSE128_INSN ("swppl", 0x19608000, 0xffe0fc00, lse128_atomic, OP3 (LSE128_Rt, LSE128_Rt2, ADDR_SIMPLE), QL_X2NIL, 0),
|
||||
/* RCPC3 extension. */
|
||||
RCPC3_INSN ("ldiapp", 0x19400800, 0x3fe0ec00, rcpc3, OP3 (Rt, Rs, RCPC3_ADDR_OPT_POSTIND), QL_R2NIL, F_RCPC3_SIZE),
|
||||
RCPC3_INSN ("stilp", 0x19000800, 0x3fe0ec00, rcpc3, OP3 (Rt, Rs, RCPC3_ADDR_OPT_PREIND_WB), QL_R2NIL, F_RCPC3_SIZE),
|
||||
RCPC3_INSN ("ldapr", 0x19c00800, 0x3ffffc00, rcpc3, OP2 (Rt, RCPC3_ADDR_POSTIND), QL_R1NIL, F_RCPC3_SIZE),
|
||||
RCPC3_INSN ("stlr", 0x19800800, 0x3ffffc00, rcpc3, OP2 (Rt, RCPC3_ADDR_PREIND_WB), QL_R1NIL, F_RCPC3_SIZE),
|
||||
/* Move wide (immediate). */
|
||||
CORE_INSN ("movn", 0x12800000, 0x7f800000, movewide, OP_MOVN, OP2 (Rd, HALF), QL_DST_R, F_SF | F_HAS_ALIAS),
|
||||
CORE_INSN ("mov", 0x12800000, 0x7f800000, movewide, OP_MOV_IMM_WIDEN, OP2 (Rd, IMM_MOV), QL_DST_R, F_SF | F_ALIAS | F_CONV),
|
||||
|
||||
Reference in New Issue
Block a user