// RUN: not llvm-mc -arch=amdgcn -mcpu=gfx1010 -mattr=+WavefrontSize32,-WavefrontSize64 %s 2>&1 | FileCheck %s --implicit-check-not=error: --strict-whitespace

//==============================================================================
// destination must be different than all sources

v_mqsad_pk_u16_u8 v[0:1], v[1:2], v9, v[4:5]
// CHECK: error: destination must be different than all sources
// CHECK-NEXT:{{^}}v_mqsad_pk_u16_u8 v[0:1], v[1:2], v9, v[4:5]
// CHECK-NEXT:{{^}}                          ^

v_mqsad_pk_u16_u8 v[0:1], v[2:3], v0, v[4:5]
// CHECK: error: destination must be different than all sources
// CHECK-NEXT:{{^}}v_mqsad_pk_u16_u8 v[0:1], v[2:3], v0, v[4:5]
// CHECK-NEXT:{{^}}                                  ^

v_mqsad_pk_u16_u8 v[0:1], v[2:3], v1, v[4:5]
// CHECK: error: destination must be different than all sources
// CHECK-NEXT:{{^}}v_mqsad_pk_u16_u8 v[0:1], v[2:3], v1, v[4:5]
// CHECK-NEXT:{{^}}                                  ^

v_mqsad_pk_u16_u8 v[0:1], v[2:3], v9, v[0:1]
// CHECK: error: destination must be different than all sources
// CHECK-NEXT:{{^}}v_mqsad_pk_u16_u8 v[0:1], v[2:3], v9, v[0:1]
// CHECK-NEXT:{{^}}                                      ^

//==============================================================================
// dim modifier is required on this GPU

image_atomic_add v252, v2, s[8:15]
// CHECK: error: dim modifier is required on this GPU
// CHECK-NEXT:{{^}}image_atomic_add v252, v2, s[8:15]
// CHECK-NEXT:{{^}}^

//==============================================================================
// duplicate data format

tbuffer_store_format_xyzw v[1:4], off, ttmp[4:7], s0 format:[BUF_DATA_FORMAT_32,BUF_DATA_FORMAT_8]
// CHECK: error: duplicate data format
// CHECK-NEXT:{{^}}tbuffer_store_format_xyzw v[1:4], off, ttmp[4:7], s0 format:[BUF_DATA_FORMAT_32,BUF_DATA_FORMAT_8]
// CHECK-NEXT:{{^}}                                                                                ^

//==============================================================================
// duplicate numeric format

tbuffer_store_format_xyzw v[1:4], off, ttmp[4:7], s0 format:[BUF_NUM_FORMAT_UINT,BUF_NUM_FORMAT_FLOAT]
// CHECK: error: duplicate numeric format
// CHECK-NEXT:{{^}}tbuffer_store_format_xyzw v[1:4], off, ttmp[4:7], s0 format:[BUF_NUM_FORMAT_UINT,BUF_NUM_FORMAT_FLOAT]
// CHECK-NEXT:{{^}}                                                                                 ^

//==============================================================================
// expected ')' in parentheses expression

v_bfe_u32 v0, 1+(100, v1, v2
// CHECK: error: expected ')' in parentheses expression
// CHECK-NEXT:{{^}}v_bfe_u32 v0, 1+(100, v1, v2
// CHECK-NEXT:{{^}}                    ^

//==============================================================================
// expected a 12-bit signed offset

global_load_dword v1, v[3:4] off, offset:-4097
// CHECK: error: expected a 12-bit signed offset
// CHECK-NEXT:{{^}}global_load_dword v1, v[3:4] off, offset:-4097
// CHECK-NEXT:{{^}}                                  ^

scratch_load_dword v0, v1, off offset:-2049 glc slc
// CHECK: error: expected a 12-bit signed offset
// CHECK-NEXT:{{^}}scratch_load_dword v0, v1, off offset:-2049 glc slc
// CHECK-NEXT:{{^}}                               ^

//==============================================================================
// expected a 16-bit signed jump offset

s_branch 0x10000
// CHECK: error: expected a 16-bit signed jump offset
// CHECK-NEXT:{{^}}s_branch 0x10000
// CHECK-NEXT:{{^}}         ^

//==============================================================================
// expected a 2-bit lane id

ds_swizzle_b32 v8, v2 offset:swizzle(QUAD_PERM, 4, 1, 2, 3)
// CHECK: error: expected a 2-bit lane id
// CHECK-NEXT:{{^}}ds_swizzle_b32 v8, v2 offset:swizzle(QUAD_PERM, 4, 1, 2, 3)
// CHECK-NEXT:{{^}}                                                ^

//==============================================================================
// expected a 20-bit unsigned offset

s_atc_probe_buffer 0x1, s[8:11], -1
// CHECK: error: expected a 20-bit unsigned offset
// CHECK-NEXT:{{^}}s_atc_probe_buffer 0x1, s[8:11], -1
// CHECK-NEXT:{{^}}                                 ^

s_atc_probe_buffer 0x1, s[8:11], 0xFFFFFFFFFFF00000
// CHECK: error: expected a 20-bit unsigned offset
// CHECK-NEXT:{{^}}s_atc_probe_buffer 0x1, s[8:11], 0xFFFFFFFFFFF00000
// CHECK-NEXT:{{^}}                                 ^

s_buffer_atomic_swap s5, s[4:7], 0x1FFFFF
// CHECK: error: expected a 20-bit unsigned offset
// CHECK-NEXT:{{^}}s_buffer_atomic_swap s5, s[4:7], 0x1FFFFF
// CHECK-NEXT:{{^}}                                 ^

//==============================================================================
// expected a 21-bit signed offset

s_atc_probe 0x7, s[4:5], 0x1FFFFF
// CHECK: error: expected a 21-bit signed offset
// CHECK-NEXT:{{^}}s_atc_probe 0x7, s[4:5], 0x1FFFFF
// CHECK-NEXT:{{^}}                         ^

s_atomic_swap s5, s[2:3], 0x1FFFFF
// CHECK: error: expected a 21-bit signed offset
// CHECK-NEXT:{{^}}s_atomic_swap s5, s[2:3], 0x1FFFFF
// CHECK-NEXT:{{^}}                          ^

//==============================================================================
// expected a 2-bit value

v_mov_b32_dpp v5, v1 quad_perm:[3,2,1,4] row_mask:0x0 bank_mask:0x0
// CHECK: error: expected a 2-bit value
// CHECK-NEXT:{{^}}v_mov_b32_dpp v5, v1 quad_perm:[3,2,1,4] row_mask:0x0 bank_mask:0x0
// CHECK-NEXT:{{^}}                                      ^

v_mov_b32_dpp v5, v1 quad_perm:[3,-1,1,3] row_mask:0x0 bank_mask:0x0
// CHECK: error: expected a 2-bit value
// CHECK-NEXT:{{^}}v_mov_b32_dpp v5, v1 quad_perm:[3,-1,1,3] row_mask:0x0 bank_mask:0x0
// CHECK-NEXT:{{^}}                                  ^

//==============================================================================
// expected a 3-bit value

v_mov_b32_dpp v5, v1 dpp8:[-1,1,2,3,4,5,6,7]
// CHECK: error: expected a 3-bit value
// CHECK-NEXT:{{^}}v_mov_b32_dpp v5, v1 dpp8:[-1,1,2,3,4,5,6,7]
// CHECK-NEXT:{{^}}                           ^

v_mov_b32_dpp v5, v1 dpp8:[0,1,2,8,4,5,6,7]
// CHECK: error: expected a 3-bit value
// CHECK-NEXT:{{^}}v_mov_b32_dpp v5, v1 dpp8:[0,1,2,8,4,5,6,7]
// CHECK-NEXT:{{^}}                                 ^

//==============================================================================
// expected a 5-character mask

ds_swizzle_b32 v8, v2 offset:swizzle(BITMASK_PERM, "ppii")
// CHECK: error: expected a 5-character mask
// CHECK-NEXT:{{^}}ds_swizzle_b32 v8, v2 offset:swizzle(BITMASK_PERM, "ppii")
// CHECK-NEXT:{{^}}                                                   ^

//==============================================================================
// expected a closing parentheses

ds_swizzle_b32 v8, v2 offset:swizzle(QUAD_PERM, 0, 1, 2, 3
// CHECK: error: expected a closing parentheses
// CHECK-NEXT:{{^}}ds_swizzle_b32 v8, v2 offset:swizzle(QUAD_PERM, 0, 1, 2, 3
// CHECK-NEXT:{{^}}                                                          ^

ds_swizzle_b32 v8, v2 offset:swizzle(QUAD_PERM, 0, 1, 2, 3, 4)
// CHECK: error: expected a closing parentheses
// CHECK-NEXT:{{^}}ds_swizzle_b32 v8, v2 offset:swizzle(QUAD_PERM, 0, 1, 2, 3, 4)
// CHECK-NEXT:{{^}}                                                          ^

//==============================================================================
// expected a closing parenthesis

s_sendmsg sendmsg(2, 2, 0, 0)
// CHECK: error: expected a closing parenthesis
// CHECK-NEXT:{{^}}s_sendmsg sendmsg(2, 2, 0, 0)
// CHECK-NEXT:{{^}}                         ^

s_waitcnt vmcnt(0
// CHECK: error: expected a closing parenthesis
// CHECK-NEXT:{{^}}s_waitcnt vmcnt(0
// CHECK-NEXT:{{^}}                 ^

//==============================================================================
// expected a closing square bracket

s_mov_b32 s1, s[0 1
// CHECK: error: expected a closing square bracket
// CHECK-NEXT:{{^}}s_mov_b32 s1, s[0 1
// CHECK-NEXT:{{^}}                  ^

s_mov_b32 s1, s[0 s0
// CHECK: error: expected a closing square bracket
// CHECK-NEXT:{{^}}s_mov_b32 s1, s[0 s0
// CHECK-NEXT:{{^}}                  ^

tbuffer_store_format_xyzw v[1:4], off, ttmp[4:7], s0 format:[BUF_DATA_FORMAT_32,BUF_NUM_FORMAT_FLOAT,BUF_DATA_FORMAT_8]
// CHECK: error: expected a closing square bracket
// CHECK-NEXT:{{^}}tbuffer_store_format_xyzw v[1:4], off, ttmp[4:7], s0 format:[BUF_DATA_FORMAT_32,BUF_NUM_FORMAT_FLOAT,BUF_DATA_FORMAT_8]
// CHECK-NEXT:{{^}}                                                                                                    ^

tbuffer_store_format_xyzw v[1:4], off, ttmp[4:7], s0 format:[BUF_NUM_FORMAT_UINT
// CHECK: error: expected a closing square bracket
// CHECK-NEXT:{{^}}tbuffer_store_format_xyzw v[1:4], off, ttmp[4:7], s0 format:[BUF_NUM_FORMAT_UINT
// CHECK-NEXT:{{^}}                                                                                ^

v_max3_f16 v5, v1, v2, v3 op_sel:[1,1,1,1 1
// CHECK: error: expected a closing square bracket
// CHECK-NEXT:{{^}}v_max3_f16 v5, v1, v2, v3 op_sel:[1,1,1,1 1
// CHECK-NEXT:{{^}}                                          ^

v_max3_f16 v5, v1, v2, v3 op_sel:[1,1,1,1,
// CHECK: error: expected a closing square bracket
// CHECK-NEXT:{{^}}v_max3_f16 v5, v1, v2, v3 op_sel:[1,1,1,1,
// CHECK-NEXT:{{^}}                                         ^

v_max3_f16 v5, v1, v2, v3 op_sel:[1,1,1,1[
// CHECK: error: expected a closing square bracket
// CHECK-NEXT:{{^}}v_max3_f16 v5, v1, v2, v3 op_sel:[1,1,1,1[
// CHECK-NEXT:{{^}}                                         ^

v_pk_add_u16 v1, v2, v3 op_sel:[0,0,0,0,0]
// CHECK: error: expected a closing square bracket
// CHECK-NEXT:{{^}}v_pk_add_u16 v1, v2, v3 op_sel:[0,0,0,0,0]
// CHECK-NEXT:{{^}}                                       ^

v_mov_b32_dpp v5, v1 dpp8:[0,1,2,3,4,5,6,7)
// CHECK: error: expected a closing square bracket
// CHECK-NEXT:{{^}}v_mov_b32_dpp v5, v1 dpp8:[0,1,2,3,4,5,6,7)
// CHECK-NEXT:{{^}}                                          ^

v_mov_b32_dpp v5, v1 quad_perm:[3,2,1,0) row_mask:0x0 bank_mask:0x0
// CHECK: error: expected a closing square bracket
// CHECK-NEXT:{{^}}v_mov_b32_dpp v5, v1 quad_perm:[3,2,1,0) row_mask:0x0 bank_mask:0x0
// CHECK-NEXT:{{^}}                                       ^

//==============================================================================
// expected a colon

ds_swizzle_b32 v8, v2 offset
// CHECK: error: expected a colon
// CHECK-NEXT:{{^}}ds_swizzle_b32 v8, v2 offset
// CHECK-NEXT:{{^}}                            ^

ds_swizzle_b32 v8, v2 offset-
// CHECK: error: expected a colon
// CHECK-NEXT:{{^}}ds_swizzle_b32 v8, v2 offset-
// CHECK-NEXT:{{^}}                            ^

//==============================================================================
// expected a comma

ds_swizzle_b32 v8, v2 offset:swizzle(QUAD_PERM
// CHECK: error: expected a comma
// CHECK-NEXT:{{^}}ds_swizzle_b32 v8, v2 offset:swizzle(QUAD_PERM
// CHECK-NEXT:{{^}}                                              ^

ds_swizzle_b32 v8, v2 offset:swizzle(QUAD_PERM, 0, 1, 2)
// CHECK: error: expected a comma
// CHECK-NEXT:{{^}}ds_swizzle_b32 v8, v2 offset:swizzle(QUAD_PERM, 0, 1, 2)
// CHECK-NEXT:{{^}}                                                       ^

s_setreg_b32  hwreg(1,2 3), s2
// CHECK: error: expected a comma
// CHECK-NEXT:{{^}}s_setreg_b32  hwreg(1,2 3), s2
// CHECK-NEXT:{{^}}                        ^

v_pk_add_u16 v1, v2, v3 op_sel:[0 0]
// CHECK: error: expected a comma
// CHECK-NEXT:{{^}}v_pk_add_u16 v1, v2, v3 op_sel:[0 0]
// CHECK-NEXT:{{^}}                                  ^

v_mov_b32_dpp v5, v1 dpp8:[0,1,2,3,4,5,6]
// CHECK: error: expected a comma
// CHECK-NEXT:{{^}}v_mov_b32_dpp v5, v1 dpp8:[0,1,2,3,4,5,6]
// CHECK-NEXT:{{^}}                                        ^

v_mov_b32_dpp v5, v1 quad_perm:[3,2] row_mask:0x0 bank_mask:0x0
// CHECK: error: expected a comma
// CHECK-NEXT:{{^}}v_mov_b32_dpp v5, v1 quad_perm:[3,2] row_mask:0x0 bank_mask:0x0
// CHECK-NEXT:{{^}}                                   ^

//==============================================================================
// expected a comma or a closing parenthesis

s_setreg_b32  hwreg(1 2,3), s2
// CHECK: error: expected a comma or a closing parenthesis
// CHECK-NEXT:{{^}}s_setreg_b32  hwreg(1 2,3), s2
// CHECK-NEXT:{{^}}                      ^

//==============================================================================
// expected a comma or a closing square bracket

s_mov_b64 s[10:11], [s0
// CHECK: error: expected a comma or a closing square bracket
// CHECK-NEXT:{{^}}s_mov_b64 s[10:11], [s0
// CHECK-NEXT:{{^}}                       ^

s_mov_b64 s[10:11], [s0,s1
// CHECK: error: expected a comma or a closing square bracket
// CHECK-NEXT:{{^}}s_mov_b64 s[10:11], [s0,s1
// CHECK-NEXT:{{^}}                          ^

//==============================================================================
// expected a counter name

s_waitcnt vmcnt(0) & expcnt(0) & 1
// CHECK: error: expected a counter name
// CHECK-NEXT:{{^}}s_waitcnt vmcnt(0) & expcnt(0) & 1
// CHECK-NEXT:{{^}}                                 ^

s_waitcnt vmcnt(0) & expcnt(0) & lgkmcnt(0)&
// CHECK: error: expected a counter name
// CHECK-NEXT:{{^}}s_waitcnt vmcnt(0) & expcnt(0) & lgkmcnt(0)&
// CHECK-NEXT:{{^}}                                            ^

s_waitcnt vmcnt(0) & expcnt(0) 1
// CHECK: error: expected a counter name
// CHECK-NEXT:{{^}}s_waitcnt vmcnt(0) & expcnt(0) 1
// CHECK-NEXT:{{^}}                               ^

s_waitcnt vmcnt(0), expcnt(0), lgkmcnt(0),
// CHECK: error: expected a counter name
// CHECK-NEXT:{{^}}s_waitcnt vmcnt(0), expcnt(0), lgkmcnt(0),
// CHECK-NEXT:{{^}}                                          ^

//==============================================================================
// expected a format string

tbuffer_store_format_xyzw v[1:4], off, ttmp[4:7], s0 format:[]
// CHECK: error: expected a format string
// CHECK-NEXT:{{^}}tbuffer_store_format_xyzw v[1:4], off, ttmp[4:7], s0 format:[]
// CHECK-NEXT:{{^}}                                                             ^

//==============================================================================
// expected a left parenthesis

s_waitcnt vmcnt(0) & expcnt(0) & x
// CHECK: error: expected a left parenthesis
// CHECK-NEXT:{{^}}s_waitcnt vmcnt(0) & expcnt(0) & x
// CHECK-NEXT:{{^}}                                  ^

//==============================================================================
// expected a left square bracket

v_pk_add_u16 v1, v2, v3 op_sel:
// CHECK: error: expected a left square bracket
// CHECK-NEXT:{{^}}v_pk_add_u16 v1, v2, v3 op_sel:
// CHECK-NEXT:{{^}}                               ^

//==============================================================================
// expected a register or a list of registers

s_mov_b32 s1, [s0, 1
// CHECK: error: expected a register or a list of registers
// CHECK-NEXT:{{^}}s_mov_b32 s1, [s0, 1
// CHECK-NEXT:{{^}}                   ^

//==============================================================================
// expected a single 32-bit register

s_mov_b64 s[10:11], [s0,s[2:3]]
// CHECK: error: expected a single 32-bit register
// CHECK-NEXT:{{^}}s_mov_b64 s[10:11], [s0,s[2:3]]
// CHECK-NEXT:{{^}}                        ^

//==============================================================================
// expected a string

ds_swizzle_b32 v8, v2 offset:swizzle(BITMASK_PERM, pppii)
// CHECK: error: expected a string
// CHECK-NEXT:{{^}}ds_swizzle_b32 v8, v2 offset:swizzle(BITMASK_PERM, pppii)
// CHECK-NEXT:{{^}}                                                   ^

//==============================================================================
// expected a swizzle mode

ds_swizzle_b32 v8, v2 offset:swizzle(XXX,1)
// CHECK: error: expected a swizzle mode
// CHECK-NEXT:{{^}}ds_swizzle_b32 v8, v2 offset:swizzle(XXX,1)
// CHECK-NEXT:{{^}}                                     ^

//==============================================================================
// expected absolute expression

s_waitcnt vmcnt(x)
// CHECK: error: expected absolute expression
// CHECK-NEXT:{{^}}s_waitcnt vmcnt(x)
// CHECK-NEXT:{{^}}                ^

tbuffer_store_format_xyzw v[1:4], off, ttmp[4:7], format:[BUF_DATA_FORMAT_32]
// CHECK: error: expected absolute expression
// CHECK-NEXT:{{^}}tbuffer_store_format_xyzw v[1:4], off, ttmp[4:7], format:[BUF_DATA_FORMAT_32]
// CHECK-NEXT:{{^}}                                                         ^

tbuffer_store_format_xyzw v[1:4], off, ttmp[4:7], s0 format: offset:52
// CHECK: error: expected absolute expression
// CHECK-NEXT:{{^}}tbuffer_store_format_xyzw v[1:4], off, ttmp[4:7], s0 format: offset:52
// CHECK-NEXT:{{^}}                                                             ^

tbuffer_store_format_xyzw v[1:4], off, ttmp[4:7], s0 format:BUF_NUM_FORMAT_UINT]
// CHECK: error: expected absolute expression
// CHECK-NEXT:{{^}}tbuffer_store_format_xyzw v[1:4], off, ttmp[4:7], s0 format:BUF_NUM_FORMAT_UINT]
// CHECK-NEXT:{{^}}                                                            ^

v_mov_b32_dpp v5, v1 dpp8:[0,1,2,x,4,5,6,7]
// CHECK: error: expected absolute expression
// CHECK-NEXT:{{^}}v_mov_b32_dpp v5, v1 dpp8:[0,1,2,x,4,5,6,7]
// CHECK-NEXT:{{^}}                                 ^

v_mov_b32_dpp v5, v1 quad_perm:[3,x,1,0] row_mask:0x0 bank_mask:0x0
// CHECK: error: expected absolute expression
// CHECK-NEXT:{{^}}v_mov_b32_dpp v5, v1 quad_perm:[3,x,1,0] row_mask:0x0 bank_mask:0x0
// CHECK-NEXT:{{^}}                                  ^

v_mov_b32_dpp v5, v1 row_share:x row_mask:0x0 bank_mask:0x0
// CHECK: error: expected absolute expression
// CHECK-NEXT:{{^}}v_mov_b32_dpp v5, v1 row_share:x row_mask:0x0 bank_mask:0x0
// CHECK-NEXT:{{^}}                               ^

//==============================================================================
// expected a message name or an absolute expression

s_sendmsg sendmsg(MSG_GSX, GS_OP_CUT, 0)
// CHECK: error: expected a message name or an absolute expression
// CHECK-NEXT:{{^}}s_sendmsg sendmsg(MSG_GSX, GS_OP_CUT, 0)
// CHECK-NEXT:{{^}}                  ^

//==============================================================================
// expected a register name or an absolute expression

s_setreg_b32  hwreg(HW_REG_WRONG), s2
// CHECK: error: expected a register name or an absolute expression
// CHECK-NEXT:{{^}}s_setreg_b32  hwreg(HW_REG_WRONG), s2
// CHECK-NEXT:{{^}}                    ^

//==============================================================================
// expected a sendmsg macro or an absolute expression

s_sendmsg undef
// CHECK: error: expected a sendmsg macro or an absolute expression
// CHECK-NEXT:{{^}}s_sendmsg undef
// CHECK-NEXT:{{^}}          ^

//==============================================================================
// expected a swizzle macro or an absolute expression

ds_swizzle_b32 v8, v2 offset:SWZ(QUAD_PERM, 0, 1, 2, 3)
// CHECK: error: expected a swizzle macro or an absolute expression
// CHECK-NEXT:{{^}}ds_swizzle_b32 v8, v2 offset:SWZ(QUAD_PERM, 0, 1, 2, 3)
// CHECK-NEXT:{{^}}                             ^

//==============================================================================
// expected a hwreg macro or an absolute expression

s_setreg_b32 undef, s2
// CHECK: error: expected a hwreg macro or an absolute expression
// CHECK-NEXT:{{^}}s_setreg_b32 undef, s2
// CHECK-NEXT:{{^}}             ^

//==============================================================================
// expected an 11-bit unsigned offset

flat_atomic_cmpswap v0, v[1:2], v[3:4] offset:4095 glc
// CHECK: error: expected a 11-bit unsigned offset
// CHECK-NEXT:{{^}}flat_atomic_cmpswap v0, v[1:2], v[3:4] offset:4095 glc
// CHECK-NEXT:{{^}}                                       ^

//==============================================================================
// expected an absolute expression

v_ceil_f32 v1, abs(u)
// CHECK: error: expected an absolute expression
// CHECK-NEXT:{{^}}v_ceil_f32 v1, abs(u)
// CHECK-NEXT:{{^}}                   ^

v_ceil_f32 v1, neg(u)
// CHECK: error: expected an absolute expression
// CHECK-NEXT:{{^}}v_ceil_f32 v1, neg(u)
// CHECK-NEXT:{{^}}                   ^

v_ceil_f32 v1, |u|
// CHECK: error: expected an absolute expression
// CHECK-NEXT:{{^}}v_ceil_f32 v1, |u|
// CHECK-NEXT:{{^}}                ^

v_mov_b32_sdwa v1, sext(u)
// CHECK: error: expected an absolute expression
// CHECK-NEXT:{{^}}v_mov_b32_sdwa v1, sext(u)
// CHECK-NEXT:{{^}}                        ^

//==============================================================================
// expected an identifier

v_mov_b32_sdwa v5, v1 dst_sel:
// CHECK: error: expected an identifier
// CHECK-NEXT:{{^}}v_mov_b32_sdwa v5, v1 dst_sel:
// CHECK-NEXT:{{^}}                              ^

v_mov_b32_sdwa v5, v1 dst_sel:0
// CHECK: error: expected an identifier
// CHECK-NEXT:{{^}}v_mov_b32_sdwa v5, v1 dst_sel:0
// CHECK-NEXT:{{^}}                              ^

v_mov_b32_sdwa v5, v1 dst_sel:DWORD dst_unused:[UNUSED_PAD]
// CHECK: error: expected an identifier
// CHECK-NEXT:{{^}}v_mov_b32_sdwa v5, v1 dst_sel:DWORD dst_unused:[UNUSED_PAD]
// CHECK-NEXT:{{^}}                                               ^

//==============================================================================
// expected an opening square bracket

v_mov_b32_dpp v5, v1 dpp8:(0,1,2,3,4,5,6,7)
// CHECK: error: expected an opening square bracket
// CHECK-NEXT:{{^}}v_mov_b32_dpp v5, v1 dpp8:(0,1,2,3,4,5,6,7)
// CHECK-NEXT:{{^}}                          ^

v_mov_b32_dpp v5, v1 quad_perm:(3,2,1,0) row_mask:0x0 bank_mask:0x0
// CHECK: error: expected an opening square bracket
// CHECK-NEXT:{{^}}v_mov_b32_dpp v5, v1 quad_perm:(3,2,1,0) row_mask:0x0 bank_mask:0x0
// CHECK-NEXT:{{^}}                               ^

//==============================================================================
// expected an operation name or an absolute expression

s_sendmsg sendmsg(MSG_GS, GS_OP_CUTX, 0)
// CHECK: error: expected an operation name or an absolute expression
// CHECK-NEXT:{{^}}s_sendmsg sendmsg(MSG_GS, GS_OP_CUTX, 0)
// CHECK-NEXT:{{^}}                          ^

//==============================================================================
// failed parsing operand.

image_load v[0:1], v0, s[0:7] dmask:0x9 dim:1 D
// CHECK: error: failed parsing operand.
// CHECK-NEXT:{{^}}image_load v[0:1], v0, s[0:7] dmask:0x9 dim:1 D
// CHECK-NEXT:{{^}}                                              ^

v_ceil_f16 v0, abs(neg(1))
// CHECK: error: failed parsing operand.
// CHECK-NEXT:{{^}}v_ceil_f16 v0, abs(neg(1))
// CHECK-NEXT:{{^}}                   ^

//==============================================================================
// first register index should not exceed second index

s_mov_b64 s[10:11], s[1:0]
// CHECK: error: first register index should not exceed second index
// CHECK-NEXT:{{^}}s_mov_b64 s[10:11], s[1:0]
// CHECK-NEXT:{{^}}                      ^

//==============================================================================
// group size must be a power of two

ds_swizzle_b32 v8, v2 offset:swizzle(BROADCAST,3,1)
// CHECK: error: group size must be a power of two
// CHECK-NEXT:{{^}}ds_swizzle_b32 v8, v2 offset:swizzle(BROADCAST,3,1)
// CHECK-NEXT:{{^}}                                               ^

ds_swizzle_b32 v8, v2 offset:swizzle(REVERSE,3)
// CHECK: error: group size must be a power of two
// CHECK-NEXT:{{^}}ds_swizzle_b32 v8, v2 offset:swizzle(REVERSE,3)
// CHECK-NEXT:{{^}}                                             ^

ds_swizzle_b32 v8, v2 offset:swizzle(SWAP,3)
// CHECK: error: group size must be a power of two
// CHECK-NEXT:{{^}}ds_swizzle_b32 v8, v2 offset:swizzle(SWAP,3)
// CHECK-NEXT:{{^}}                                          ^

//==============================================================================
// group size must be in the interval [1,16]

ds_swizzle_b32 v8, v2 offset:swizzle(SWAP,0)
// CHECK: error: group size must be in the interval [1,16]
// CHECK-NEXT:{{^}}ds_swizzle_b32 v8, v2 offset:swizzle(SWAP,0)
// CHECK-NEXT:{{^}}                                          ^

//==============================================================================
// group size must be in the interval [2,32]

ds_swizzle_b32 v8, v2 offset:swizzle(BROADCAST,1,0)
// CHECK: error: group size must be in the interval [2,32]
// CHECK-NEXT:{{^}}ds_swizzle_b32 v8, v2 offset:swizzle(BROADCAST,1,0)
// CHECK-NEXT:{{^}}                                               ^

//==============================================================================
// image address size does not match dim and a16

image_load v[0:3], v[0:1], s[0:7] dmask:0xf dim:SQ_RSRC_IMG_1D
// CHECK: error: image address size does not match dim and a16
// CHECK-NEXT:{{^}}image_load v[0:3], v[0:1], s[0:7] dmask:0xf dim:SQ_RSRC_IMG_1D
// CHECK-NEXT:{{^}}^

//==============================================================================
// image data size does not match dmask and tfe

image_load v[0:1], v0, s[0:7] dmask:0xf dim:SQ_RSRC_IMG_1D
// CHECK: error: image data size does not match dmask and tfe
// CHECK-NEXT:{{^}}image_load v[0:1], v0, s[0:7] dmask:0xf dim:SQ_RSRC_IMG_1D
// CHECK-NEXT:{{^}}^

//==============================================================================
// instruction must use glc

flat_atomic_cmpswap v0, v[1:2], v[3:4] offset:2047
// CHECK: error: instruction must use glc
// CHECK-NEXT:{{^}}flat_atomic_cmpswap v0, v[1:2], v[3:4] offset:2047
// CHECK-NEXT:{{^}}^

//==============================================================================
// instruction not supported on this GPU

s_cbranch_join 1
// CHECK: error: instruction not supported on this GPU
// CHECK-NEXT:{{^}}s_cbranch_join 1
// CHECK-NEXT:{{^}}^

//==============================================================================
// invalid bit offset: only 5-bit values are legal

s_getreg_b32  s2, hwreg(3,32,32)
// CHECK: error: invalid bit offset: only 5-bit values are legal
// CHECK-NEXT:{{^}}s_getreg_b32  s2, hwreg(3,32,32)
// CHECK-NEXT:{{^}}                          ^

//==============================================================================
// invalid bitfield width: only values from 1 to 32 are legal

s_setreg_b32  hwreg(3,0,33), s2
// CHECK: error: invalid bitfield width: only values from 1 to 32 are legal
// CHECK-NEXT:{{^}}s_setreg_b32  hwreg(3,0,33), s2
// CHECK-NEXT:{{^}}                        ^

//==============================================================================
// invalid code of hardware register: only 6-bit values are legal

s_setreg_b32  hwreg(0x40), s2
// CHECK: error: invalid code of hardware register: only 6-bit values are legal
// CHECK-NEXT:{{^}}s_setreg_b32  hwreg(0x40), s2
// CHECK-NEXT:{{^}}                    ^

//==============================================================================
// invalid counter name x

s_waitcnt vmcnt(0) & expcnt(0) x(0)
// CHECK: error: invalid counter name x
// CHECK-NEXT:{{^}}s_waitcnt vmcnt(0) & expcnt(0) x(0)
// CHECK-NEXT:{{^}}                               ^

//==============================================================================
// invalid dst_sel value

v_mov_b32_sdwa v5, v1 dst_sel:WORD
// CHECK: error: invalid dst_sel value
// CHECK-NEXT:{{^}}v_mov_b32_sdwa v5, v1 dst_sel:WORD
// CHECK-NEXT:{{^}}                              ^

//==============================================================================
// invalid dst_unused value

v_mov_b32_sdwa v5, v1 dst_unused:UNUSED
// CHECK: error: invalid dst_unused value
// CHECK-NEXT:{{^}}v_mov_b32_sdwa v5, v1 dst_unused:UNUSED
// CHECK-NEXT:{{^}}                                 ^

//==============================================================================
// invalid exp target

exp invalid_target_10 v3, v2, v1, v0
// CHECK: error: invalid exp target
// CHECK-NEXT:{{^}}exp invalid_target_10 v3, v2, v1, v0
// CHECK-NEXT:{{^}}    ^

exp pos00 v3, v2, v1, v0
// CHECK: error: invalid exp target
// CHECK-NEXT:{{^}}exp pos00 v3, v2, v1, v0
// CHECK-NEXT:{{^}}    ^

//==============================================================================
// invalid immediate: only 16-bit values are legal

s_setreg_b32  0x1f803, s2
// CHECK: error: invalid immediate: only 16-bit values are legal
// CHECK-NEXT:{{^}}s_setreg_b32  0x1f803, s2
// CHECK-NEXT:{{^}}              ^

//==============================================================================
// invalid instruction

v_dot_f32_f16 v0, v1, v2
// CHECK: error: invalid instruction
// CHECK-NEXT:{{^}}v_dot_f32_f16 v0, v1, v2
// CHECK-NEXT:{{^}}^

//==============================================================================
// invalid interpolation attribute

v_interp_p2_f32 v0, v1, att
// CHECK: error: invalid interpolation attribute
// CHECK-NEXT:{{^}}v_interp_p2_f32 v0, v1, att
// CHECK-NEXT:{{^}}                        ^

//==============================================================================
// invalid interpolation slot

v_interp_mov_f32 v8, p1, attr0.x
// CHECK: error: invalid interpolation slot
// CHECK-NEXT:{{^}}v_interp_mov_f32 v8, p1, attr0.x
// CHECK-NEXT:{{^}}                     ^

//==============================================================================
// invalid mask

ds_swizzle_b32 v8, v2 offset:swizzle(BITMASK_PERM, "pppi2")
// CHECK: error: invalid mask
// CHECK-NEXT:{{^}}ds_swizzle_b32 v8, v2 offset:swizzle(BITMASK_PERM, "pppi2")
// CHECK-NEXT:{{^}}                                                   ^

//==============================================================================
// invalid message id

s_sendmsg sendmsg(-1)
// CHECK: error: invalid message id
// CHECK-NEXT:{{^}}s_sendmsg sendmsg(-1)
// CHECK-NEXT:{{^}}                  ^

//==============================================================================
// invalid message stream id

s_sendmsg sendmsg(2, 2, 4)
// CHECK: error: invalid message stream id
// CHECK-NEXT:{{^}}s_sendmsg sendmsg(2, 2, 4)
// CHECK-NEXT:{{^}}                        ^

s_sendmsg sendmsg(MSG_GS, GS_OP_CUT, 4)
// CHECK: error: invalid message stream id
// CHECK-NEXT:{{^}}s_sendmsg sendmsg(MSG_GS, GS_OP_CUT, 4)
// CHECK-NEXT:{{^}}                                     ^

//==============================================================================
// invalid mul value.

v_cvt_f64_i32 v[5:6], s1 mul:3
// CHECK: error: invalid mul value.
// CHECK-NEXT:{{^}}v_cvt_f64_i32 v[5:6], s1 mul:3
// CHECK-NEXT:{{^}}                         ^

//==============================================================================
// invalid or missing interpolation attribute channel

v_interp_p2_f32 v0, v1, attr0.q
// CHECK: error: invalid or missing interpolation attribute channel
// CHECK-NEXT:{{^}}v_interp_p2_f32 v0, v1, attr0.q
// CHECK-NEXT:{{^}}                        ^

//==============================================================================
// invalid or missing interpolation attribute number

v_interp_p2_f32 v7, v1, attr.x
// CHECK: error: invalid or missing interpolation attribute number
// CHECK-NEXT:{{^}}v_interp_p2_f32 v7, v1, attr.x
// CHECK-NEXT:{{^}}                        ^

//==============================================================================
// invalid op_sel operand

v_permlane16_b32 v5, v1, s2, s3 op_sel:[0, 0, 0, 1]
// CHECK: error: invalid op_sel operand
// CHECK-NEXT:{{^}}v_permlane16_b32 v5, v1, s2, s3 op_sel:[0, 0, 0, 1]
// CHECK-NEXT:{{^}}                                ^

//==============================================================================
// invalid op_sel value.

v_pk_add_u16 v1, v2, v3 op_sel:[-1,0]
// CHECK: error: invalid op_sel value.
// CHECK-NEXT:{{^}}v_pk_add_u16 v1, v2, v3 op_sel:[-1,0]
// CHECK-NEXT:{{^}}                                ^

//==============================================================================
// invalid operand (violates constant bus restrictions)

v_ashrrev_i64 v[0:1], 0x100, s[0:1]
// CHECK: error: invalid operand (violates constant bus restrictions)
// CHECK-NEXT:{{^}}v_ashrrev_i64 v[0:1], 0x100, s[0:1]
// CHECK-NEXT:{{^}}                             ^

v_ashrrev_i64 v[0:1], s3, s[0:1]
// CHECK: error: invalid operand (violates constant bus restrictions)
// CHECK-NEXT:{{^}}v_ashrrev_i64 v[0:1], s3, s[0:1]
// CHECK-NEXT:{{^}}                          ^

v_bfe_u32 v0, s1, 0x3039, s2
// CHECK: error: invalid operand (violates constant bus restrictions)
// CHECK-NEXT:{{^}}v_bfe_u32 v0, s1, 0x3039, s2
// CHECK-NEXT:{{^}}                          ^

v_bfe_u32 v0, s1, s2, s3
// CHECK: error: invalid operand (violates constant bus restrictions)
// CHECK-NEXT:{{^}}v_bfe_u32 v0, s1, s2, s3
// CHECK-NEXT:{{^}}                      ^

v_div_fmas_f32 v5, s3, 0x123, v3
// CHECK: error: invalid operand (violates constant bus restrictions)
// CHECK-NEXT:{{^}}v_div_fmas_f32 v5, s3, 0x123, v3
// CHECK-NEXT:{{^}}                       ^

v_div_fmas_f32 v5, s3, v3, 0x123
// CHECK: error: invalid operand (violates constant bus restrictions)
// CHECK-NEXT:{{^}}v_div_fmas_f32 v5, s3, v3, 0x123
// CHECK-NEXT:{{^}}                           ^

v_div_fmas_f32 v5, 0x123, v3, s3
// CHECK: error: invalid operand (violates constant bus restrictions)
// CHECK-NEXT:{{^}}v_div_fmas_f32 v5, 0x123, v3, s3
// CHECK-NEXT:{{^}}                              ^

v_div_fmas_f32 v5, s3, s4, v3
// CHECK: error: invalid operand (violates constant bus restrictions)
// CHECK-NEXT:{{^}}v_div_fmas_f32 v5, s3, s4, v3
// CHECK-NEXT:{{^}}                       ^

//==============================================================================
// invalid operand for instruction

buffer_load_dword v5, off, s[8:11], s3 tfe lds
// CHECK: error: invalid operand for instruction
// CHECK-NEXT:{{^}}buffer_load_dword v5, off, s[8:11], s3 tfe lds
// CHECK-NEXT:{{^}}                                           ^

exp mrt0 0x12345678, v0, v0, v0
// CHECK: error: invalid operand for instruction
// CHECK-NEXT:{{^}}exp mrt0 0x12345678, v0, v0, v0
// CHECK-NEXT:{{^}}         ^

v_cmp_eq_f32 s[0:1], private_base, s0
// CHECK: error: invalid operand for instruction
// CHECK-NEXT:{{^}}v_cmp_eq_f32 s[0:1], private_base, s0
// CHECK-NEXT:{{^}}             ^

//==============================================================================
// invalid operation id

s_sendmsg sendmsg(15, -1)
// CHECK: error: invalid operation id
// CHECK-NEXT:{{^}}s_sendmsg sendmsg(15, -1)
// CHECK-NEXT:{{^}}                      ^

//==============================================================================
// invalid or unsupported register size

s_mov_b64 s[0:17], -1
// CHECK: error: invalid or unsupported register size
// CHECK-NEXT:{{^}}s_mov_b64 s[0:17], -1
// CHECK-NEXT:{{^}}          ^

//==============================================================================
// invalid register alignment

s_load_dwordx4 s[1:4], s[2:3], s4
// CHECK: error: invalid register alignment
// CHECK-NEXT:{{^}}s_load_dwordx4 s[1:4], s[2:3], s4
// CHECK-NEXT:{{^}}               ^

//==============================================================================
// invalid register index

s_mov_b32 s1, s[0:-1]
// CHECK: error: invalid register index
// CHECK-NEXT:{{^}}s_mov_b32 s1, s[0:-1]
// CHECK-NEXT:{{^}}                  ^

v_add_f64 v[0:1], v[0:1], v[0xF00000001:0x2]
// CHECK: error: invalid register index
// CHECK-NEXT:{{^}}v_add_f64 v[0:1], v[0:1], v[0xF00000001:0x2]
// CHECK-NEXT:{{^}}                            ^

//==============================================================================
// invalid register name

s_mov_b64 s[10:11], [x0,s1]
// CHECK: error: invalid register name
// CHECK-NEXT:{{^}}s_mov_b64 s[10:11], [x0,s1]
// CHECK-NEXT:{{^}}                     ^

//==============================================================================
// invalid row_share value

v_mov_b32_dpp v5, v1 row_share:16 row_mask:0x0 bank_mask:0x0
// CHECK: error: invalid row_share value
// CHECK-NEXT:{{^}}v_mov_b32_dpp v5, v1 row_share:16 row_mask:0x0 bank_mask:0x0
// CHECK-NEXT:{{^}}                               ^

v_mov_b32_dpp v5, v1 row_share:-1 row_mask:0x0 bank_mask:0x0
// CHECK: error: invalid row_share value
// CHECK-NEXT:{{^}}v_mov_b32_dpp v5, v1 row_share:-1 row_mask:0x0 bank_mask:0x0
// CHECK-NEXT:{{^}}                               ^

//==============================================================================
// invalid syntax, expected 'neg' modifier

v_ceil_f32 v0, --1
// CHECK: error: invalid syntax, expected 'neg' modifier
// CHECK-NEXT:{{^}}v_ceil_f32 v0, --1
// CHECK-NEXT:{{^}}               ^

//==============================================================================
// invalid use of lds_direct

v_ashrrev_i16 v0, lds_direct, v0
// CHECK: error: invalid use of lds_direct
// CHECK-NEXT:{{^}}v_ashrrev_i16 v0, lds_direct, v0
// CHECK-NEXT:{{^}}                  ^

//==============================================================================
// lane id must be in the interval [0,group size - 1]

ds_swizzle_b32 v8, v2 offset:swizzle(BROADCAST,2,-1)
// CHECK: error: lane id must be in the interval [0,group size - 1]
// CHECK-NEXT:{{^}}ds_swizzle_b32 v8, v2 offset:swizzle(BROADCAST,2,-1)
// CHECK-NEXT:{{^}}                                                 ^

//==============================================================================
// message does not support operations

s_sendmsg sendmsg(MSG_GS_ALLOC_REQ, 0)
// CHECK: error: message does not support operations
// CHECK-NEXT:{{^}}s_sendmsg sendmsg(MSG_GS_ALLOC_REQ, 0)
// CHECK-NEXT:{{^}}                                    ^

//==============================================================================
// message operation does not support streams

s_sendmsg sendmsg(MSG_GS_DONE, GS_OP_NOP, 0)
// CHECK: error: message operation does not support streams
// CHECK-NEXT:{{^}}s_sendmsg sendmsg(MSG_GS_DONE, GS_OP_NOP, 0)
// CHECK-NEXT:{{^}}                                          ^

//==============================================================================
// missing message operation

s_sendmsg sendmsg(MSG_SYSMSG)
// CHECK: error: missing message operation
// CHECK-NEXT:{{^}}s_sendmsg sendmsg(MSG_SYSMSG)
// CHECK-NEXT:{{^}}                  ^

//==============================================================================
// missing register index

s_mov_b64 s[10:11], [s
// CHECK: error: missing register index
// CHECK-NEXT:{{^}}s_mov_b64 s[10:11], [s
// CHECK-NEXT:{{^}}                      ^

s_mov_b64 s[10:11], [s,s1]
// CHECK: error: missing register index
// CHECK-NEXT:{{^}}s_mov_b64 s[10:11], [s,s1]
// CHECK-NEXT:{{^}}                      ^

//==============================================================================
// not a valid operand.

s_branch offset:1
// CHECK: error: not a valid operand.
// CHECK-NEXT:{{^}}s_branch offset:1
// CHECK-NEXT:{{^}}         ^

v_mov_b32 v0, v0 row_bcast:0
// CHECK: error: not a valid operand.
// CHECK-NEXT:{{^}}v_mov_b32 v0, v0 row_bcast:0
// CHECK-NEXT:{{^}}                 ^

//==============================================================================
// only one literal operand is allowed

s_and_b32 s2, 0x12345678, 0x12345679
// CHECK: error: only one literal operand is allowed
// CHECK-NEXT:{{^}}s_and_b32 s2, 0x12345678, 0x12345679
// CHECK-NEXT:{{^}}                          ^

v_add_f64 v[0:1], 1.23456, -abs(1.2345)
// CHECK: error: only one literal operand is allowed
// CHECK-NEXT:{{^}}v_add_f64 v[0:1], 1.23456, -abs(1.2345)
// CHECK-NEXT:{{^}}                                ^

v_min3_i16 v5, 0x5678, 0x5678, 0x5679
// CHECK: error: only one literal operand is allowed
// CHECK-NEXT:{{^}}v_min3_i16 v5, 0x5678, 0x5678, 0x5679
// CHECK-NEXT:{{^}}                               ^

v_pk_add_f16 v1, 25.0, 25.1
// CHECK: error: only one literal operand is allowed
// CHECK-NEXT:{{^}}v_pk_add_f16 v1, 25.0, 25.1
// CHECK-NEXT:{{^}}                       ^

v_fma_mix_f32 v5, 0x7c, 0x7b, 1
// CHECK: error: only one literal operand is allowed
// CHECK-NEXT:{{^}}v_fma_mix_f32 v5, 0x7c, 0x7b, 1
// CHECK-NEXT:{{^}}                        ^

v_pk_add_i16 v5, 0x7c, 0x4000
// CHECK: error: only one literal operand is allowed
// CHECK-NEXT:{{^}}v_pk_add_i16 v5, 0x7c, 0x4000
// CHECK-NEXT:{{^}}                       ^

v_pk_add_i16 v5, 0x4400, 0x4000
// CHECK: error: only one literal operand is allowed
// CHECK-NEXT:{{^}}v_pk_add_i16 v5, 0x4400, 0x4000
// CHECK-NEXT:{{^}}                         ^

v_bfe_u32 v0, v2, 123, undef
// CHECK: error: only one literal operand is allowed
// CHECK-NEXT:{{^}}v_bfe_u32 v0, v2, 123, undef
// CHECK-NEXT:{{^}}                       ^

v_bfe_u32 v0, v2, undef, 123
// CHECK: error: only one literal operand is allowed
// CHECK-NEXT:{{^}}v_bfe_u32 v0, v2, undef, 123
// CHECK-NEXT:{{^}}                         ^

//==============================================================================
// out of bounds interpolation attribute number

v_interp_p1_f32 v0, v1, attr64.w
// CHECK: error: out of bounds interpolation attribute number
// CHECK-NEXT:{{^}}v_interp_p1_f32 v0, v1, attr64.w
// CHECK-NEXT:{{^}}                        ^

//==============================================================================
// out of range format

tbuffer_load_format_d16_x v0, off, s[0:3], format:-1, 0
// CHECK: error: out of range format
// CHECK-NEXT:{{^}}tbuffer_load_format_d16_x v0, off, s[0:3], format:-1, 0
// CHECK-NEXT:{{^}}                                           ^

//==============================================================================
// register does not fit in the list

s_mov_b64 s[10:11], [exec,exec_lo]
// CHECK: error: register does not fit in the list
// CHECK-NEXT:{{^}}s_mov_b64 s[10:11], [exec,exec_lo]
// CHECK-NEXT:{{^}}                          ^

s_mov_b64 s[10:11], [exec_lo,exec]
// CHECK: error: register does not fit in the list
// CHECK-NEXT:{{^}}s_mov_b64 s[10:11], [exec_lo,exec]
// CHECK-NEXT:{{^}}                             ^

//==============================================================================
// register index is out of range

s_add_i32 s106, s0, s1
// CHECK: error: register index is out of range
// CHECK-NEXT:{{^}}s_add_i32 s106, s0, s1
// CHECK-NEXT:{{^}}          ^

s_load_dwordx16 s[100:115], s[2:3], s4
// CHECK: error: register index is out of range
// CHECK-NEXT:{{^}}s_load_dwordx16 s[100:115], s[2:3], s4
// CHECK-NEXT:{{^}}                ^

s_mov_b32 ttmp16, 0
// CHECK: error: register index is out of range
// CHECK-NEXT:{{^}}s_mov_b32 ttmp16, 0
// CHECK-NEXT:{{^}}          ^

v_add_nc_i32 v256, v0, v1
// CHECK: error: register index is out of range
// CHECK-NEXT:{{^}}v_add_nc_i32 v256, v0, v1
// CHECK-NEXT:{{^}}             ^

//==============================================================================
// register not available on this GPU

s_and_b32     ttmp9, tma_hi, 0x0000ffff
// CHECK: error: register not available on this GPU
// CHECK-NEXT:{{^}}s_and_b32     ttmp9, tma_hi, 0x0000ffff
// CHECK-NEXT:{{^}}                     ^

s_mov_b32 flat_scratch, -1
// CHECK: error: register not available on this GPU
// CHECK-NEXT:{{^}}s_mov_b32 flat_scratch, -1
// CHECK-NEXT:{{^}}          ^

//==============================================================================
// registers in a list must be of the same kind

s_mov_b64 s[10:11], [a0,v1]
// CHECK: error: registers in a list must be of the same kind
// CHECK-NEXT:{{^}}s_mov_b64 s[10:11], [a0,v1]
// CHECK-NEXT:{{^}}                        ^

//==============================================================================
// registers in a list must have consecutive indices

s_mov_b64 s[10:11], [a0,a2]
// CHECK: error: registers in a list must have consecutive indices
// CHECK-NEXT:{{^}}s_mov_b64 s[10:11], [a0,a2]
// CHECK-NEXT:{{^}}                        ^

s_mov_b64 s[10:11], [s0,s0]
// CHECK: error: registers in a list must have consecutive indices
// CHECK-NEXT:{{^}}s_mov_b64 s[10:11], [s0,s0]
// CHECK-NEXT:{{^}}                        ^

s_mov_b64 s[10:11], [s2,s1]
// CHECK: error: registers in a list must have consecutive indices
// CHECK-NEXT:{{^}}s_mov_b64 s[10:11], [s2,s1]
// CHECK-NEXT:{{^}}                        ^

//==============================================================================
// source operand must be a VGPR

v_movrels_b32_sdwa v0, 1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD
// CHECK: error: source operand must be a VGPR
// CHECK-NEXT:{{^}}v_movrels_b32_sdwa v0, 1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD
// CHECK-NEXT:{{^}}                       ^

v_movrels_b32_sdwa v0, s0
// CHECK: error: source operand must be a VGPR
// CHECK-NEXT:{{^}}v_movrels_b32_sdwa v0, s0
// CHECK-NEXT:{{^}}                       ^

v_movrels_b32_sdwa v0, shared_base
// CHECK: error: source operand must be a VGPR
// CHECK-NEXT:{{^}}v_movrels_b32_sdwa v0, shared_base
// CHECK-NEXT:{{^}}                       ^

//==============================================================================
// specified hardware register is not supported on this GPU

s_getreg_b32 s2, hwreg(HW_REG_SHADER_CYCLES)
// CHECK: error: specified hardware register is not supported on this GPU
// CHECK-NEXT:{{^}}s_getreg_b32 s2, hwreg(HW_REG_SHADER_CYCLES)
// CHECK-NEXT:{{^}}                       ^

//==============================================================================
// too few operands for instruction

tbuffer_store_format_xyzw v[1:4], off, ttmp[4:7]
// CHECK: error: too few operands for instruction
// CHECK-NEXT:{{^}}tbuffer_store_format_xyzw v[1:4], off, ttmp[4:7]
// CHECK-NEXT:{{^}}^

v_add_f32_e64 v0, v1
// CHECK: error: too few operands for instruction
// CHECK-NEXT:{{^}}v_add_f32_e64 v0, v1
// CHECK-NEXT:{{^}}^

//==============================================================================
// too large value for expcnt

s_waitcnt expcnt(8)
// CHECK: error: too large value for expcnt
// CHECK-NEXT:{{^}}s_waitcnt expcnt(8)
// CHECK-NEXT:{{^}}                 ^

//==============================================================================
// too large value for lgkmcnt

s_waitcnt lgkmcnt(64)
// CHECK: error: too large value for lgkmcnt
// CHECK-NEXT:{{^}}s_waitcnt lgkmcnt(64)
// CHECK-NEXT:{{^}}                  ^

//==============================================================================
// too large value for vmcnt

s_waitcnt vmcnt(64)
// CHECK: error: too large value for vmcnt
// CHECK-NEXT:{{^}}s_waitcnt vmcnt(64)
// CHECK-NEXT:{{^}}                ^

//==============================================================================
// unknown token in expression

ds_swizzle_b32 v8, v2 offset:
// CHECK: error: unknown token in expression
// CHECK-NEXT:{{^}}ds_swizzle_b32 v8, v2 offset:
// CHECK-NEXT:{{^}}                             ^

s_sendmsg sendmsg(1 -)
// CHECK: error: unknown token in expression
// CHECK-NEXT:{{^}}s_sendmsg sendmsg(1 -)
// CHECK-NEXT:{{^}}                     ^

tbuffer_load_format_d16_x v0, off, s[0:3], format:1,, s0
// CHECK: error: unknown token in expression
// CHECK-NEXT:{{^}}tbuffer_load_format_d16_x v0, off, s[0:3], format:1,, s0
// CHECK-NEXT:{{^}}                                                    ^

tbuffer_load_format_d16_x v0, off, s[0:3], format:1:, s0
// CHECK: error: unknown token in expression
// CHECK-NEXT:{{^}}tbuffer_load_format_d16_x v0, off, s[0:3], format:1:, s0
// CHECK-NEXT:{{^}}                                                   ^

v_pk_add_u16 v1, v2, v3 op_sel:[
// CHECK: error: unknown token in expression
// CHECK-NEXT:{{^}}v_pk_add_u16 v1, v2, v3 op_sel:[
// CHECK-NEXT:{{^}}                                ^

v_pk_add_u16 v1, v2, v3 op_sel:[,0]
// CHECK: error: unknown token in expression
// CHECK-NEXT:{{^}}v_pk_add_u16 v1, v2, v3 op_sel:[,0]
// CHECK-NEXT:{{^}}                                ^

v_pk_add_u16 v1, v2, v3 op_sel:[,]
// CHECK: error: unknown token in expression
// CHECK-NEXT:{{^}}v_pk_add_u16 v1, v2, v3 op_sel:[,]
// CHECK-NEXT:{{^}}                                ^

v_pk_add_u16 v1, v2, v3 op_sel:[0,]
// CHECK: error: unknown token in expression
// CHECK-NEXT:{{^}}v_pk_add_u16 v1, v2, v3 op_sel:[0,]
// CHECK-NEXT:{{^}}                                  ^

v_pk_add_u16 v1, v2, v3 op_sel:[]
// CHECK: error: unknown token in expression
// CHECK-NEXT:{{^}}v_pk_add_u16 v1, v2, v3 op_sel:[]
// CHECK-NEXT:{{^}}                                ^

//==============================================================================
// unsupported format

tbuffer_store_format_xyzw v[1:4], off, ttmp[4:7], s0 format:[BUF_DATA_FORMAT]
// CHECK: error: unsupported format
// CHECK-NEXT:{{^}}tbuffer_store_format_xyzw v[1:4], off, ttmp[4:7], s0 format:[BUF_DATA_FORMAT]
// CHECK-NEXT:{{^}}                                                             ^

//==============================================================================
// expected vertical bar

v_ceil_f32 v1, |1+1|
// CHECK: error: expected vertical bar
// CHECK-NEXT:{{^}}v_ceil_f32 v1, |1+1|
// CHECK-NEXT:{{^}}                 ^

//==============================================================================
// expected left paren after neg

v_ceil_f32 v1, neg-(v2)
// CHECK: error: expected left paren after neg
// CHECK-NEXT:{{^}}v_ceil_f32 v1, neg-(v2)
// CHECK-NEXT:{{^}}                  ^

//==============================================================================
// expected left paren after abs

v_ceil_f32 v1, abs-(v2)
// CHECK: error: expected left paren after abs
// CHECK-NEXT:{{^}}v_ceil_f32 v1, abs-(v2)
// CHECK-NEXT:{{^}}                  ^

//==============================================================================
// expected left paren after sext

v_cmpx_f_i32_sdwa sext[v1], v2 src0_sel:DWORD src1_sel:DWORD
// CHECK: error: expected left paren after sext
// CHECK-NEXT:{{^}}v_cmpx_f_i32_sdwa sext[v1], v2 src0_sel:DWORD src1_sel:DWORD
// CHECK-NEXT:{{^}}                      ^

//==============================================================================
// expected closing parentheses

v_ceil_f32 v1, abs(v2]
// CHECK: error: expected closing parentheses
// CHECK-NEXT:{{^}}v_ceil_f32 v1, abs(v2]
// CHECK-NEXT:{{^}}                     ^

v_ceil_f32 v1, neg(v2]
// CHECK: error: expected closing parentheses
// CHECK-NEXT:{{^}}v_ceil_f32 v1, neg(v2]
// CHECK-NEXT:{{^}}                     ^

v_cmpx_f_i32_sdwa sext(v1], v2 src0_sel:DWORD src1_sel:DWORD
// CHECK: error: expected closing parentheses
// CHECK-NEXT:{{^}}v_cmpx_f_i32_sdwa sext(v1], v2 src0_sel:DWORD src1_sel:DWORD
// CHECK-NEXT:{{^}}                         ^

//==============================================================================
// expected a left parentheses

ds_swizzle_b32 v8, v2 offset:swizzle[QUAD_PERM, 0, 1, 2, 3]
// CHECK: error: expected a left parentheses
// CHECK-NEXT:{{^}}ds_swizzle_b32 v8, v2 offset:swizzle[QUAD_PERM, 0, 1, 2, 3]
// CHECK-NEXT:{{^}}                                    ^

//==============================================================================
// expected an absolute expression or a label

s_branch 1+x
// CHECK: error: expected an absolute expression or a label
// CHECK-NEXT:{{^}}s_branch 1+x
// CHECK-NEXT:{{^}}         ^

//==============================================================================
// expected a 16-bit offset

ds_swizzle_b32 v8, v2 offset:0x10000
// CHECK: error: expected a 16-bit offset
// CHECK-NEXT:{{^}}ds_swizzle_b32 v8, v2 offset:0x10000
// CHECK-NEXT:{{^}}                             ^
