mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
e7b30c99aa
This adds the family of loads and stores with names like VLD20.8 and VST42.32, which load and store parts of multiple q-registers in such a way that executing both VLD20 and VLD21, or all four of VLD40..VLD43, will distribute 2 or 4 vectors' worth of memory data across the lanes of the same number of registers but in a transposed order. In addition to the Tablegen descriptions of the instructions themselves, this patch also adds encode and decode support for the QQPR and QQQQPR register classes (representing the range of loaded or stored vector registers), and tweaks to the parsing system for lists of vector registers to make it return the right format in this case (since, unlike NEON, MVE regards q-registers as primitive, and not just an alias for two d-registers). llvm-svn: 364172
271 lines
9.2 KiB
ArmAsm
271 lines
9.2 KiB
ArmAsm
# RUN: not llvm-mc -triple=thumbv8.1m.main-none-eabi -mattr=+mve -show-encoding < %s 2> %t \
|
|
# RUN: | FileCheck --check-prefix=CHECK %s
|
|
# RUN: FileCheck --check-prefix=ERROR < %t %s
|
|
|
|
# CHECK: vld20.8 {q0, q1}, [sp] @ encoding: [0x9d,0xfc,0x00,0x1e]
|
|
vld20.8 {q0, q1}, [sp]
|
|
|
|
# CHECK: vld20.8 {q0, q1}, [r0] @ encoding: [0x90,0xfc,0x00,0x1e]
|
|
vld20.8 {q0, q1}, [r0]
|
|
|
|
# CHECK: vld20.8 {q0, q1}, [r0]! @ encoding: [0xb0,0xfc,0x00,0x1e]
|
|
vld20.8 {q0, q1}, [r0]!
|
|
|
|
# CHECK: vld20.8 {q0, q1}, [r11] @ encoding: [0x9b,0xfc,0x00,0x1e]
|
|
vld20.8 {q0, q1}, [r11]
|
|
|
|
# CHECK: vld20.8 {q5, q6}, [r0]! @ encoding: [0xb0,0xfc,0x00,0xbe]
|
|
vld20.8 {q5, q6}, [r0]!
|
|
|
|
# CHECK: vld21.8 {q0, q1}, [r0] @ encoding: [0x90,0xfc,0x20,0x1e]
|
|
vld21.8 {q0, q1}, [r0]
|
|
|
|
# CHECK: vld21.8 {q3, q4}, [r0]! @ encoding: [0xb0,0xfc,0x20,0x7e]
|
|
vld21.8 {q3, q4}, [r0]!
|
|
|
|
# CHECK: vld20.16 {q0, q1}, [r0] @ encoding: [0x90,0xfc,0x80,0x1e]
|
|
vld20.16 {q0, q1}, [r0]
|
|
|
|
# CHECK: vld20.16 {q0, q1}, [r0]! @ encoding: [0xb0,0xfc,0x80,0x1e]
|
|
vld20.16 {q0, q1}, [r0]!
|
|
|
|
# CHECK: vld20.16 {q0, q1}, [r11] @ encoding: [0x9b,0xfc,0x80,0x1e]
|
|
vld20.16 {q0, q1}, [r11]
|
|
|
|
# CHECK: vld20.16 {q5, q6}, [r0]! @ encoding: [0xb0,0xfc,0x80,0xbe]
|
|
vld20.16 {q5, q6}, [r0]!
|
|
|
|
# CHECK: vld21.16 {q0, q1}, [r0] @ encoding: [0x90,0xfc,0xa0,0x1e]
|
|
vld21.16 {q0, q1}, [r0]
|
|
|
|
# CHECK: vld21.16 {q3, q4}, [r0]! @ encoding: [0xb0,0xfc,0xa0,0x7e]
|
|
vld21.16 {q3, q4}, [r0]!
|
|
|
|
# CHECK: vld20.32 {q0, q1}, [r0] @ encoding: [0x90,0xfc,0x00,0x1f]
|
|
vld20.32 {q0, q1}, [r0]
|
|
|
|
# CHECK: vld20.32 {q0, q1}, [r0]! @ encoding: [0xb0,0xfc,0x00,0x1f]
|
|
vld20.32 {q0, q1}, [r0]!
|
|
|
|
# CHECK: vld20.32 {q0, q1}, [r11] @ encoding: [0x9b,0xfc,0x00,0x1f]
|
|
vld20.32 {q0, q1}, [r11]
|
|
|
|
# CHECK: vld20.32 {q5, q6}, [r0]! @ encoding: [0xb0,0xfc,0x00,0xbf]
|
|
vld20.32 {q5, q6}, [r0]!
|
|
|
|
# CHECK: vld21.32 {q0, q1}, [r0] @ encoding: [0x90,0xfc,0x20,0x1f]
|
|
vld21.32 {q0, q1}, [r0]
|
|
|
|
# CHECK: vld21.32 {q3, q4}, [r0]! @ encoding: [0xb0,0xfc,0x20,0x7f]
|
|
vld21.32 {q3, q4}, [r0]!
|
|
|
|
# CHECK: vst20.8 {q0, q1}, [r0] @ encoding: [0x80,0xfc,0x00,0x1e]
|
|
vst20.8 {q0, q1}, [r0]
|
|
|
|
# CHECK: vst20.8 {q0, q1}, [r0]! @ encoding: [0xa0,0xfc,0x00,0x1e]
|
|
vst20.8 {q0, q1}, [r0]!
|
|
|
|
# CHECK: vst20.8 {q0, q1}, [r11] @ encoding: [0x8b,0xfc,0x00,0x1e]
|
|
vst20.8 {q0, q1}, [r11]
|
|
|
|
# CHECK: vst20.8 {q5, q6}, [r0]! @ encoding: [0xa0,0xfc,0x00,0xbe]
|
|
vst20.8 {q5, q6}, [r0]!
|
|
|
|
# CHECK: vst21.8 {q0, q1}, [r0] @ encoding: [0x80,0xfc,0x20,0x1e]
|
|
vst21.8 {q0, q1}, [r0]
|
|
|
|
# CHECK: vst21.8 {q3, q4}, [r0]! @ encoding: [0xa0,0xfc,0x20,0x7e]
|
|
vst21.8 {q3, q4}, [r0]!
|
|
|
|
# CHECK: vst20.16 {q0, q1}, [r0] @ encoding: [0x80,0xfc,0x80,0x1e]
|
|
vst20.16 {q0, q1}, [r0]
|
|
|
|
# CHECK: vst20.16 {q0, q1}, [r0]! @ encoding: [0xa0,0xfc,0x80,0x1e]
|
|
vst20.16 {q0, q1}, [r0]!
|
|
|
|
# CHECK: vst20.16 {q0, q1}, [r11] @ encoding: [0x8b,0xfc,0x80,0x1e]
|
|
vst20.16 {q0, q1}, [r11]
|
|
|
|
# CHECK: vst20.16 {q5, q6}, [r0]! @ encoding: [0xa0,0xfc,0x80,0xbe]
|
|
vst20.16 {q5, q6}, [r0]!
|
|
|
|
# CHECK: vst21.16 {q0, q1}, [r0] @ encoding: [0x80,0xfc,0xa0,0x1e]
|
|
vst21.16 {q0, q1}, [r0]
|
|
|
|
# CHECK: vst21.16 {q3, q4}, [r0]! @ encoding: [0xa0,0xfc,0xa0,0x7e]
|
|
vst21.16 {q3, q4}, [r0]!
|
|
|
|
# CHECK: vst20.32 {q0, q1}, [r0] @ encoding: [0x80,0xfc,0x00,0x1f]
|
|
vst20.32 {q0, q1}, [r0]
|
|
|
|
# CHECK: vst20.32 {q0, q1}, [r0]! @ encoding: [0xa0,0xfc,0x00,0x1f]
|
|
vst20.32 {q0, q1}, [r0]!
|
|
|
|
# CHECK: vst20.32 {q0, q1}, [r11] @ encoding: [0x8b,0xfc,0x00,0x1f]
|
|
vst20.32 {q0, q1}, [r11]
|
|
|
|
# CHECK: vst20.32 {q5, q6}, [r0]! @ encoding: [0xa0,0xfc,0x00,0xbf]
|
|
vst20.32 {q5, q6}, [r0]!
|
|
|
|
# CHECK: vst21.32 {q0, q1}, [r0] @ encoding: [0x80,0xfc,0x20,0x1f]
|
|
vst21.32 {q0, q1}, [r0]
|
|
|
|
# CHECK: vst21.32 {q3, q4}, [r0]! @ encoding: [0xa0,0xfc,0x20,0x7f]
|
|
vst21.32 {q3, q4}, [r0]!
|
|
|
|
# ERROR: [[@LINE+1]]:{{[0-9]+}}: {{error|note}}: invalid operand for instruction
|
|
vld20.8 {q0, q1}, [sp]!
|
|
|
|
# ERROR: [[@LINE+1]]:{{[0-9]+}}: {{error|note}}: invalid operand for instruction
|
|
vld20.64 {q0, q1}, [r0]
|
|
|
|
# ERROR: [[@LINE+1]]:{{[0-9]+}}: {{error|note}}: non-contiguous register range
|
|
vld20.32 {q0, q2}, [r0]
|
|
|
|
# ERROR: [[@LINE+1]]:{{[0-9]+}}: {{error|note}}: operand must be a list of two consecutive q-registers in range [q0,q7]
|
|
vld20.32 {q0, q1, q2}, [r0]
|
|
|
|
# ERROR: [[@LINE+1]]:{{[0-9]+}}: {{error|note}}: operand must be a list of two consecutive q-registers in range [q0,q7]
|
|
vld20.32 {q0}, [r0]
|
|
|
|
# ERROR: [[@LINE+1]]:{{[0-9]+}}: {{error|note}}: invalid instruction
|
|
vld20.32 q0, q1, [r0]
|
|
|
|
# ERROR: [[@LINE+1]]:{{[0-9]+}}: {{error|note}}: vector register in range Q0-Q7 expected
|
|
vld20.32 {q7, q8}, [r0]
|
|
|
|
# ERROR: [[@LINE+1]]:{{[0-9]+}}: {{error|note}}: vector register in range Q0-Q7 expected
|
|
vld20.32 {d0, d1}, [r0]
|
|
|
|
# ERROR: [[@LINE+1]]:{{[0-9]+}}: {{error|note}}: invalid instruction
|
|
vld22.32 {q0, q1}, [r0]
|
|
|
|
# ERROR: [[@LINE+1]]:{{[0-9]+}}: {{error|note}}: invalid operand for instruction
|
|
vld20.32 {q0, q1}, [pc]
|
|
|
|
# ERROR: [[@LINE+1]]:{{[0-9]+}}: {{error|note}}: invalid operand for instruction
|
|
vld20.32 {q0, q1}, [r0, #4]
|
|
|
|
# CHECK: vld40.8 {q0, q1, q2, q3}, [r0] @ encoding: [0x90,0xfc,0x01,0x1e]
|
|
vld40.8 {q0, q1, q2, q3}, [r0]
|
|
|
|
# CHECK: vld40.8 {q0, q1, q2, q3}, [r0]! @ encoding: [0xb0,0xfc,0x01,0x1e]
|
|
vld40.8 {q0, q1, q2, q3}, [r0]!
|
|
|
|
# CHECK: vld40.8 {q0, q1, q2, q3}, [r11] @ encoding: [0x9b,0xfc,0x01,0x1e]
|
|
vld40.8 {q0, q1, q2, q3}, [r11]
|
|
|
|
# CHECK: vld40.8 {q3, q4, q5, q6}, [r0]! @ encoding: [0xb0,0xfc,0x01,0x7e]
|
|
vld40.8 {q3, q4, q5, q6}, [r0]!
|
|
|
|
# CHECK: vld41.8 {q0, q1, q2, q3}, [r0] @ encoding: [0x90,0xfc,0x21,0x1e]
|
|
vld41.8 {q0, q1, q2, q3}, [r0]
|
|
|
|
# CHECK: vld41.8 {q4, q5, q6, q7}, [r0]! @ encoding: [0xb0,0xfc,0x21,0x9e]
|
|
vld41.8 {q4, q5, q6, q7}, [r0]!
|
|
|
|
# CHECK: vld42.8 {q0, q1, q2, q3}, [r0] @ encoding: [0x90,0xfc,0x41,0x1e]
|
|
vld42.8 {q0, q1, q2, q3}, [r0]
|
|
|
|
# CHECK: vld42.8 {q0, q1, q2, q3}, [r0]! @ encoding: [0xb0,0xfc,0x41,0x1e]
|
|
vld42.8 {q0, q1, q2, q3}, [r0]!
|
|
|
|
# CHECK: vld43.8 {q0, q1, q2, q3}, [r0] @ encoding: [0x90,0xfc,0x61,0x1e]
|
|
vld43.8 {q0, q1, q2, q3}, [r0]
|
|
|
|
# CHECK: vld43.8 {q4, q5, q6, q7}, [r0]! @ encoding: [0xb0,0xfc,0x61,0x9e]
|
|
vld43.8 {q4, q5, q6, q7}, [r0]!
|
|
|
|
# CHECK: vld40.16 {q0, q1, q2, q3}, [r0] @ encoding: [0x90,0xfc,0x81,0x1e]
|
|
vld40.16 {q0, q1, q2, q3}, [r0]
|
|
|
|
# CHECK: vld40.16 {q0, q1, q2, q3}, [r0]! @ encoding: [0xb0,0xfc,0x81,0x1e]
|
|
vld40.16 {q0, q1, q2, q3}, [r0]!
|
|
|
|
# CHECK: vld40.16 {q0, q1, q2, q3}, [r11] @ encoding: [0x9b,0xfc,0x81,0x1e]
|
|
vld40.16 {q0, q1, q2, q3}, [r11]
|
|
|
|
# CHECK: vld40.16 {q3, q4, q5, q6}, [r0]! @ encoding: [0xb0,0xfc,0x81,0x7e]
|
|
vld40.16 {q3, q4, q5, q6}, [r0]!
|
|
|
|
# CHECK: vld41.16 {q0, q1, q2, q3}, [r0] @ encoding: [0x90,0xfc,0xa1,0x1e]
|
|
vld41.16 {q0, q1, q2, q3}, [r0]
|
|
|
|
# CHECK: vld41.16 {q4, q5, q6, q7}, [r0]! @ encoding: [0xb0,0xfc,0xa1,0x9e]
|
|
vld41.16 {q4, q5, q6, q7}, [r0]!
|
|
|
|
# CHECK: vld42.16 {q0, q1, q2, q3}, [r0] @ encoding: [0x90,0xfc,0xc1,0x1e]
|
|
vld42.16 {q0, q1, q2, q3}, [r0]
|
|
|
|
# CHECK: vld42.16 {q0, q1, q2, q3}, [r0]! @ encoding: [0xb0,0xfc,0xc1,0x1e]
|
|
vld42.16 {q0, q1, q2, q3}, [r0]!
|
|
|
|
# CHECK: vld43.16 {q0, q1, q2, q3}, [r0] @ encoding: [0x90,0xfc,0xe1,0x1e]
|
|
vld43.16 {q0, q1, q2, q3}, [r0]
|
|
|
|
# CHECK: vld43.16 {q4, q5, q6, q7}, [r0]! @ encoding: [0xb0,0xfc,0xe1,0x9e]
|
|
vld43.16 {q4, q5, q6, q7}, [r0]!
|
|
|
|
# CHECK: vld40.32 {q0, q1, q2, q3}, [r0] @ encoding: [0x90,0xfc,0x01,0x1f]
|
|
vld40.32 {q0, q1, q2, q3}, [r0]
|
|
|
|
# CHECK: vld40.32 {q0, q1, q2, q3}, [r0]! @ encoding: [0xb0,0xfc,0x01,0x1f]
|
|
vld40.32 {q0, q1, q2, q3}, [r0]!
|
|
|
|
# CHECK: vld40.32 {q0, q1, q2, q3}, [r11] @ encoding: [0x9b,0xfc,0x01,0x1f]
|
|
vld40.32 {q0, q1, q2, q3}, [r11]
|
|
|
|
# CHECK: vld40.32 {q3, q4, q5, q6}, [r0]! @ encoding: [0xb0,0xfc,0x01,0x7f]
|
|
vld40.32 {q3, q4, q5, q6}, [r0]!
|
|
|
|
# CHECK: vld41.32 {q0, q1, q2, q3}, [r0] @ encoding: [0x90,0xfc,0x21,0x1f]
|
|
vld41.32 {q0, q1, q2, q3}, [r0]
|
|
|
|
# CHECK: vld41.32 {q4, q5, q6, q7}, [r0]! @ encoding: [0xb0,0xfc,0x21,0x9f]
|
|
vld41.32 {q4, q5, q6, q7}, [r0]!
|
|
|
|
# CHECK: vld42.32 {q0, q1, q2, q3}, [r0] @ encoding: [0x90,0xfc,0x41,0x1f]
|
|
vld42.32 {q0, q1, q2, q3}, [r0]
|
|
|
|
# CHECK: vld42.32 {q0, q1, q2, q3}, [r0]! @ encoding: [0xb0,0xfc,0x41,0x1f]
|
|
vld42.32 {q0, q1, q2, q3}, [r0]!
|
|
|
|
# CHECK: vld43.32 {q0, q1, q2, q3}, [r0] @ encoding: [0x90,0xfc,0x61,0x1f]
|
|
vld43.32 {q0, q1, q2, q3}, [r0]
|
|
|
|
# CHECK: vld43.32 {q4, q5, q6, q7}, [r0]! @ encoding: [0xb0,0xfc,0x61,0x9f]
|
|
vld43.32 {q4, q5, q6, q7}, [r0]!
|
|
|
|
# ERROR: [[@LINE+1]]:{{[0-9]+}}: {{error|note}}: invalid operand for instruction
|
|
vld40.64 {q0, q1, q2, q3}, [r0]
|
|
|
|
# ERROR: [[@LINE+1]]:{{[0-9]+}}: {{error|note}}: non-contiguous register range
|
|
vld40.32 {q0, q2, q3, q4}, [r0]
|
|
|
|
# ERROR: [[@LINE+1]]:{{[0-9]+}}: {{error|note}}: operand must be a list of four consecutive q-registers in range [q0,q7]
|
|
vld40.32 {q0, q1, q2, q3, q4}, [r0]
|
|
|
|
# ERROR: [[@LINE+1]]:{{[0-9]+}}: {{error|note}}: operand must be a list of four consecutive q-registers in range [q0,q7]
|
|
vld40.32 {q0, q1}, [r0]
|
|
|
|
# ERROR: [[@LINE+1]]:{{[0-9]+}}: {{error|note}}: operand must be a list of four consecutive q-registers in range [q0,q7]
|
|
vld40.32 {q0, q1, q2}, [r0]
|
|
|
|
# ERROR: [[@LINE+1]]:{{[0-9]+}}: {{error|note}}: invalid instruction
|
|
vld40.32 q0, q1, q2, q3, [r0]
|
|
|
|
# ERROR: [[@LINE+1]]:{{[0-9]+}}: {{error|note}}: vector register in range Q0-Q7 expected
|
|
vld40.32 {q5, q6, q7, q8}, [r0]
|
|
|
|
# ERROR: [[@LINE+1]]:{{[0-9]+}}: {{error|note}}: vector register in range Q0-Q7 expected
|
|
vld40.32 {d0, d1, d2, d3}, [r0]
|
|
|
|
# ERROR: [[@LINE+1]]:{{[0-9]+}}: {{error|note}}: invalid instruction
|
|
vld44.32 {q0, q1, q2, q3}, [r0]
|
|
|
|
# ERROR: [[@LINE+1]]:{{[0-9]+}}: {{error|note}}: invalid operand for instruction
|
|
vld40.32 {q0, q1, q2, q3}, [pc]
|
|
|
|
# ERROR: [[@LINE+1]]:{{[0-9]+}}: {{error|note}}: invalid operand for instruction
|
|
vld40.32 {q0, q1, q2, q3}, [r0, #4]
|