fix(asm): read three operands from the arm64 last-element form
Assisted-by: GLM 5.3
This commit is contained in:
1 parent
104bea036b
commit
e56c04e9ee
2 files changed
+12
-3
No files matched your search
+6
-3
@@ -529,7 +529,10 @@ const (
|
|||||||
// ExtFormWhile is the while-compare form, PWHILELT R2, R10, P10.H:
|
// ExtFormWhile is the while-compare form, PWHILELT R2, R10, P10.H:
|
||||||
// P10 counts the lanes where the signed comparison holds. Operands:
|
// P10 counts the lanes where the signed comparison holds. Operands:
|
||||||
// Rm (R0-R30), Rn (R0-R30), Pd.T, the arrangement feeding the size
|
// Rm (R0-R30), Rn (R0-R30), Pd.T, the arrangement feeding the size
|
||||||
// field.
|
// field. The first written register is the comparison bound and the
|
||||||
|
// second the start of the count, the order the toolchain's corpus
|
||||||
|
// spells and the JIT run under qemu-user confirmed: PWHILELT R1, R0,
|
||||||
|
// P0.S with R1=4 builds four active lanes.
|
||||||
ExtFormWhile
|
ExtFormWhile
|
||||||
// ExtFormPredicateCounter is PTRUE's counter-register form, PPTRUE
|
// ExtFormPredicateCounter is PTRUE's counter-register form, PPTRUE
|
||||||
// PN14.S: the destination is a predicate-as-counter register, spelled
|
// PN14.S: the destination is a predicate-as-counter register, spelled
|
||||||
@@ -655,7 +658,7 @@ func (f ExtForm) Arity() int {
|
|||||||
case ExtFormImmediate, ExtFormSignedImmediate, ExtFormPredicateFFRRead,
|
case ExtFormImmediate, ExtFormSignedImmediate, ExtFormPredicateFFRRead,
|
||||||
ExtFormPredicateMove, ExtFormPredicateUnpack, ExtFormPredicateTest,
|
ExtFormPredicateMove, ExtFormPredicateUnpack, ExtFormPredicateTest,
|
||||||
ExtFormZMoveBare, ExtFormZFromGeneral,
|
ExtFormZMoveBare, ExtFormZFromGeneral,
|
||||||
ExtFormZLastReg, ExtFormZMove, ExtFormZUnpack:
|
ExtFormZMove, ExtFormZUnpack:
|
||||||
return 2
|
return 2
|
||||||
case ExtFormAmdVec3, ExtFormAmdMask2, ExtFormAmdVecGprVec:
|
case ExtFormAmdVec3, ExtFormAmdMask2, ExtFormAmdVecGprVec:
|
||||||
return 3
|
return 3
|
||||||
@@ -667,7 +670,7 @@ func (f ExtForm) Arity() int {
|
|||||||
return 2
|
return 2
|
||||||
case ExtFormPredicateOne, ExtFormPredicateWrite, ExtFormPredicateCounter:
|
case ExtFormPredicateOne, ExtFormPredicateWrite, ExtFormPredicateCounter:
|
||||||
return 1
|
return 1
|
||||||
case ExtFormZReadBack, ExtFormCountP, ExtFormCountPnW, ExtFormReduce:
|
case ExtFormZReadBack, ExtFormCountP, ExtFormCountPnW, ExtFormReduce, ExtFormZLastReg:
|
||||||
return 3
|
return 3
|
||||||
case ExtFormZSameReg, ExtFormCountPn, ExtFormCTerm:
|
case ExtFormZSameReg, ExtFormCountPn, ExtFormCTerm:
|
||||||
return 2
|
return 2
|
||||||
|
|||||||
@@ -1060,6 +1060,12 @@ func TestArm64ExtZGolden(t *testing.T) {
|
|||||||
{"ZSUBR $6, Z7.D, Z7.D", "ZSUBR", ExtFormZImmediateSource, 0, ExtArrNone,
|
{"ZSUBR $6, Z7.D, Z7.D", "ZSUBR", ExtFormZImmediateSource, 0, ExtArrNone,
|
||||||
[]ExtOperand{ExtImmediate(6), ExtVector(7, ExtArrD), ExtVector(7, ExtArrD)},
|
[]ExtOperand{ExtImmediate(6), ExtVector(7, ExtArrD), ExtVector(7, ExtArrD)},
|
||||||
0x25e3c0c7},
|
0x25e3c0c7},
|
||||||
|
{"ZLASTA Z10.D, P3, R15", "ZLASTA", ExtFormZLastReg, 0, ExtArrD,
|
||||||
|
[]ExtOperand{ExtVector(10, ExtArrD), ExtPredicateSized(3, ExtArrNone), ExtGeneral(15)},
|
||||||
|
0x05e0ad4f},
|
||||||
|
{"ZLASTB Z10.D, P3, R15", "ZLASTB", ExtFormZLastReg, 0, ExtArrD,
|
||||||
|
[]ExtOperand{ExtVector(10, ExtArrD), ExtPredicateSized(3, ExtArrNone), ExtGeneral(15)},
|
||||||
|
0x05e1ad4f},
|
||||||
} {
|
} {
|
||||||
in := extInstructionMeta(t, tt.mnem, tt.form, tt.qual, tt.arr)
|
in := extInstructionMeta(t, tt.mnem, tt.form, tt.qual, tt.arr)
|
||||||
got, err := in.Encode(tt.ops)
|
got, err := in.Encode(tt.ops)
|
||||||
|
|||||||
Reference in new issue
Block a user