1# RUN: llvm-mc %s -triple=csky -show-encoding | FileCheck -check-prefixes=CHECK-ASM %s 2 3# CHECK-ASM: addi32 a0, sp, 2 4# CHECK-ASM: encoding: [0x0e,0xe4,0x01,0x00] 5addi32 a0, sp, 2 6 7# CHECK-ASM: subi32 a0, sp, 2 8# CHECK-ASM: encoding: [0x0e,0xe4,0x01,0x10] 9subi32 a0, sp, 2 10 11# CHECK-ASM: andi32 a0, sp, 2 12# CHECK-ASM: encoding: [0x0e,0xe4,0x02,0x20] 13andi32 a0, sp, 2 14 15# CHECK-ASM: andni32 a0, sp, 2 16# CHECK-ASM: encoding: [0x0e,0xe4,0x02,0x30] 17andni32 a0, sp, 2 18 19# CHECK-ASM: xori32 a0, sp, 2 20# CHECK-ASM: encoding: [0x0e,0xe4,0x02,0x40] 21xori32 a0, sp, 2 22 23# CHECK-ASM: lsli32 a0, sp, 2 24# CHECK-ASM: encoding: [0x4e,0xc4,0x20,0x48] 25lsli32 a0, sp, 2 26 27# CHECK-ASM: lsri32 a0, sp, 2 28# CHECK-ASM: encoding: [0x4e,0xc4,0x40,0x48] 29lsri32 a0, sp, 2 30 31# CHECK-ASM: asri32 a0, sp, 2 32# CHECK-ASM: encoding: [0x4e,0xc4,0x80,0x48] 33asri32 a0, sp, 2 34 35# CHECK-ASM: ori32 a0, sp, 2 36# CHECK-ASM: encoding: [0x0e,0xec,0x02,0x00] 37ori32 a0, sp, 2 38 39# CHECK-ASM: rotli32 a0, sp, 2 40# CHECK-ASM: encoding: [0x4e,0xc4,0x00,0x49] 41rotli32 a0, sp, 2 42 43# CHECK-ASM: cmpnei32 a0, 2 44# CHECK-ASM: encoding: [0x40,0xeb,0x02,0x00] 45cmpnei32 a0, 2 46 47# CHECK-ASM: cmphsi32 a0, 2 48# CHECK-ASM: encoding: [0x00,0xeb,0x01,0x00] 49cmphsi32 a0, 2 50 51# CHECK-ASM: cmplti32 a0, 2 52# CHECK-ASM: encoding: [0x20,0xeb,0x01,0x00] 53cmplti32 a0, 2 54 55# CHECK-ASM: movi32 a0, 2 56# CHECK-ASM: encoding: [0x00,0xea,0x02,0x00] 57movi32 a0, 2 58 59# CHECK-ASM: movih32 a0, 2 60# CHECK-ASM: encoding: [0x20,0xea,0x02,0x00] 61movih32 a0, 2 62 63# CHECK-ASM: addu32 a3, l0, l1 64# CHECK-ASM: encoding: [0xa4,0xc4,0x23,0x00] 65addu32 a3, l0, l1 66 67# CHECK-ASM: subu32 a3, l0, l1 68# CHECK-ASM: encoding: [0xa4,0xc4,0x83,0x00] 69subu32 a3, l0, l1 70 71# CHECK-ASM: and32 a3, l0, l1 72# CHECK-ASM: encoding: [0xa4,0xc4,0x23,0x20] 73and32 a3, l0, l1 74 75# CHECK-ASM: andn32 a3, l0, l1 76# CHECK-ASM: encoding: [0xa4,0xc4,0x43,0x20] 77andn32 a3, l0, l1 78 79# CHECK-ASM: or32 a3, l0, l1 80# CHECK-ASM: encoding: [0xa4,0xc4,0x23,0x24] 81or32 a3, l0, l1 82 83# CHECK-ASM: xor32 a3, l0, l1 84# CHECK-ASM: encoding: [0xa4,0xc4,0x43,0x24] 85xor32 a3, l0, l1 86 87# CHECK-ASM: nor32 a3, l0, l1 88# CHECK-ASM: encoding: [0xa4,0xc4,0x83,0x24] 89nor32 a3, l0, l1 90 91# CHECK-ASM: lsl32 a3, l0, l1 92# CHECK-ASM: encoding: [0xa4,0xc4,0x23,0x40] 93lsl32 a3, l0, l1 94 95# CHECK-ASM: lsr32 a3, l0, l1 96# CHECK-ASM: encoding: [0xa4,0xc4,0x43,0x40] 97lsr32 a3, l0, l1 98 99# CHECK-ASM: asr32 a3, l0, l1 100# CHECK-ASM: encoding: [0xa4,0xc4,0x83,0x40] 101asr32 a3, l0, l1 102 103# CHECK-ASM: mult32 a3, l0, l1 104# CHECK-ASM: encoding: [0xa4,0xc4,0x23,0x84] 105mult32 a3, l0, l1 106 107# CHECK-ASM: divs32 a3, l0, l1 108# CHECK-ASM: encoding: [0xa4,0xc4,0x43,0x80] 109divs32 a3, l0, l1 110 111# CHECK-ASM: divu32 a3, l0, l1 112# CHECK-ASM: encoding: [0xa4,0xc4,0x23,0x80] 113divu32 a3, l0, l1 114 115# CHECK-ASM: ixh32 a3, l0, l1 116# CHECK-ASM: encoding: [0xa4,0xc4,0x23,0x08] 117ixh32 a3, l0, l1 118 119# CHECK-ASM: ixw32 a3, l0, l1 120# CHECK-ASM: encoding: [0xa4,0xc4,0x43,0x08] 121ixw32 a3, l0, l1 122 123# CHECK-ASM: ixd32 a3, l0, l1 124# CHECK-ASM: encoding: [0xa4,0xc4,0x83,0x08] 125ixd32 a3, l0, l1 126 127# CHECK-ASM: addc32 a3, l0, l1 128# CHECK-ASM: encoding: [0xa4,0xc4,0x43,0x00] 129addc32 a3, l0, l1 130 131# CHECK-ASM: subc32 a3, l0, l1 132# CHECK-ASM: encoding: [0xa4,0xc4,0x03,0x01] 133subc32 a3, l0, l1 134 135# CHECK-ASM: ld32.b a0, (sp, 2) 136# CHECK-ASM: encoding: [0x0e,0xd8,0x02,0x00] 137ld32.b a0, (sp, 2) 138 139# CHECK-ASM: ld32.bs a0, (sp, 2) 140# CHECK-ASM: encoding: [0x0e,0xd8,0x02,0x40] 141ld32.bs a0, (sp, 2) 142 143# CHECK-ASM: ld32.h a0, (sp, 2) 144# CHECK-ASM: encoding: [0x0e,0xd8,0x01,0x10] 145ld32.h a0, (sp, 2) 146 147# CHECK-ASM: ld32.hs a0, (sp, 2) 148# CHECK-ASM: encoding: [0x0e,0xd8,0x01,0x50] 149ld32.hs a0, (sp, 2) 150 151# CHECK-ASM: ld32.w a0, (sp, 4) 152# CHECK-ASM: encoding: [0x0e,0xd8,0x01,0x20] 153ld32.w a0, (sp, 4) 154 155# CHECK-ASM: ldr32.b a0, (sp, l1 << 2) 156# CHECK-ASM: encoding: [0xae,0xd0,0x80,0x00] 157ldr32.b a0, (sp, l1 << 2) 158 159# CHECK-ASM: ldr32.bs a0, (sp, l1 << 2) 160# CHECK-ASM: encoding: [0xae,0xd0,0x80,0x10] 161ldr32.bs a0, (sp, l1 << 2) 162 163# CHECK-ASM: ldr32.h a0, (sp, l1 << 3) 164# CHECK-ASM: encoding: [0xae,0xd0,0x00,0x05] 165ldr32.h a0, (sp, l1 << 3) 166 167# CHECK-ASM: ldr32.hs a0, (sp, l1 << 3) 168# CHECK-ASM: encoding: [0xae,0xd0,0x00,0x15] 169ldr32.hs a0, (sp, l1 << 3) 170 171# CHECK-ASM: ldr32.w a0, (sp, l1 << 3) 172# CHECK-ASM: encoding: [0xae,0xd0,0x00,0x09] 173ldr32.w a0, (sp, l1 << 3) 174 175# CHECK-ASM: st32.b a0, (sp, 2) 176# CHECK-ASM: encoding: [0x0e,0xdc,0x02,0x00] 177st32.b a0, (sp, 2) 178 179# CHECK-ASM: st32.h a0, (sp, 2) 180# CHECK-ASM: encoding: [0x0e,0xdc,0x01,0x10] 181st32.h a0, (sp, 2) 182 183# CHECK-ASM: st32.w a0, (sp, 4) 184# CHECK-ASM: encoding: [0x0e,0xdc,0x01,0x20] 185st32.w a0, (sp, 4) 186 187# CHECK-ASM: str32.b a0, (sp, l1 << 2) 188# CHECK-ASM: encoding: [0xae,0xd4,0x80,0x00] 189str32.b a0, (sp, l1 << 2) 190 191# CHECK-ASM: str32.h a0, (sp, l1 << 3) 192# CHECK-ASM: encoding: [0xae,0xd4,0x00,0x05] 193str32.h a0, (sp, l1 << 3) 194 195# CHECK-ASM: str32.w a0, (sp, l1 << 3) 196# CHECK-ASM: encoding: [0xae,0xd4,0x00,0x09] 197str32.w a0, (sp, l1 << 3) 198 199# CHECK-ASM: not32 a3, l0 200# CHECK-ASM: encoding: [0x84,0xc4,0x83,0x24] 201not32 a3, l0 202 203# CHECK-ASM: mov32 a3, l0 204# CHECK-ASM: encoding: [0x04,0xc4,0x23,0x48] 205mov32 a3, l0 206 207# CHECK-ASM: movt32 a3, l0 208# CHECK-ASM: encoding: [0x64,0xc4,0x40,0x0c] 209movt32 a3, l0 210 211# CHECK-ASM: movf32 a3, l0 212# CHECK-ASM: encoding: [0x64,0xc4,0x20,0x0c] 213movf32 a3, l0 214 215# CHECK-ASM: mvc32 a3 216# CHECK-ASM: encoding: [0x00,0xc4,0x03,0x05] 217mvc32 a3 218 219# CHECK-ASM: mvcv32 a3 220# CHECK-ASM: encoding: [0x00,0xc4,0x03,0x06] 221mvcv32 a3 222 223# CHECK-ASM: cmpne32 a3, l0 224# CHECK-ASM: encoding: [0x83,0xc4,0x80,0x04] 225cmpne32 a3, l0 226 227# CHECK-ASM: cmphs32 a3, l0 228# CHECK-ASM: encoding: [0x83,0xc4,0x20,0x04] 229cmphs32 a3, l0 230 231# CHECK-ASM: cmplt32 a3, l0 232# CHECK-ASM: encoding: [0x83,0xc4,0x40,0x04] 233cmplt32 a3, l0 234 235# CHECK-ASM: zext32 a3, l0, 7, 0 236# CHECK-ASM: encoding: [0x04,0xc4,0xe3,0x54] 237zext32 a3, l0, 7, 0 238 239# CHECK-ASM: sext32 a3, l0, 7, 0 240# CHECK-ASM: encoding: [0x04,0xc4,0xe3,0x58] 241sext32 a3, l0, 7, 0 242 243# CHECK-ASM: br32 .L.test 244# CHECK-ASM: encoding: [A,0xe8'A',A,A] 245# CHECK-ASM: fixup A - offset: 0, value: .L.test, kind: fixup_csky_pcrel_imm16_scale2 246.L.test: 247br32 .L.test 248 249# CHECK-ASM: bt32 .L.test2 250# CHECK-ASM: encoding: [0x60'A',0xe8'A',A,A] 251# CHECK-ASM: fixup A - offset: 0, value: .L.test2, kind: fixup_csky_pcrel_imm16_scale2 252.L.test2: 253bt32 .L.test2 254 255# CHECK-ASM: bf32 .L.test3 256# CHECK-ASM: encoding: [0x40'A',0xe8'A',A,A] 257# CHECK-ASM: fixup A - offset: 0, value: .L.test3, kind: fixup_csky_pcrel_imm16_scale2 258.L.test3: 259bf32 .L.test3 260 261# CHECK-ASM: bez32 a0, .L.test4 262# CHECK-ASM: encoding: [A,0xe9'A',A,A] 263# CHECK-ASM: fixup A - offset: 0, value: .L.test4, kind: fixup_csky_pcrel_imm16_scale2 264.L.test4: 265bez32 a0, .L.test4 266 267# CHECK-ASM: bnez32 a0, .L.test5 268# CHECK-ASM: encoding: [0x20'A',0xe9'A',A,A] 269# CHECK-ASM: fixup A - offset: 0, value: .L.test5, kind: fixup_csky_pcrel_imm16_scale2 270.L.test5: 271bnez32 a0, .L.test5 272 273# CHECK-ASM: bhz32 a0, .L.test6 274# CHECK-ASM: encoding: [0x40'A',0xe9'A',A,A] 275# CHECK-ASM: fixup A - offset: 0, value: .L.test6, kind: fixup_csky_pcrel_imm16_scale2 276.L.test6: 277bhz32 a0, .L.test6 278 279# CHECK-ASM: blsz32 a0, .L.test7 280# CHECK-ASM: encoding: [0x60'A',0xe9'A',A,A] 281# CHECK-ASM: fixup A - offset: 0, value: .L.test7, kind: fixup_csky_pcrel_imm16_scale2 282.L.test7: 283blsz32 a0, .L.test7 284 285# CHECK-ASM: blz32 a0, .L.test8 286# CHECK-ASM: encoding: [0x80'A',0xe9'A',A,A] 287# CHECK-ASM: fixup A - offset: 0, value: .L.test8, kind: fixup_csky_pcrel_imm16_scale2 288.L.test8: 289blz32 a0, .L.test8 290 291# CHECK-ASM: bhsz32 a0, .L.test9 292# CHECK-ASM: encoding: [0xa0'A',0xe9'A',A,A] 293# CHECK-ASM: fixup A - offset: 0, value: .L.test9, kind: fixup_csky_pcrel_imm16_scale2 294.L.test9: 295bhsz32 a0, .L.test9 296 297# CHECK-ASM: jmp32 a3 298# CHECK-ASM: encoding: [0xc3,0xe8,0x00,0x00] 299jmp32 a3 300 301# CHECK-ASM: jmpi32 .L.test10 302# CHECK-ASM: encoding: [0xc0'A',0xea'A',A,A] 303# CHECK-ASM: fixup A - offset: 0, value: .L.test10, kind: fixup_csky_pcrel_uimm16_scale4 304.L.test10: 305jmpi32 [.L.test10] 306 307# CHECK-ASM: bsr32 .L.test11 308# CHECK-ASM: encoding: [A,0xe0'A',A,A] 309# CHECK-ASM: fixup A - offset: 0, value: .L.test11, kind: fixup_csky_pcrel_imm26_scale2 310.L.test11: 311bsr32 .L.test11 312 313# CHECK-ASM: jsr32 a3 314# CHECK-ASM: encoding: [0xe3,0xe8,0x00,0x00] 315jsr32 a3 316 317# CHECK-ASM: jsri32 .L.test12 318# CHECK-ASM: encoding: [0xe0'A',0xea'A',A,A] 319# CHECK-ASM: fixup A - offset: 0, value: .L.test12, kind: fixup_csky_pcrel_uimm16_scale4 320.L.test12: 321jsri32 [.L.test12] 322 323# CHECK-ASM: rts32 324# CHECK-ASM: encoding: [0xcf,0xe8,0x00,0x00] 325rts32 326 327# CHECK-ASM: grs32 a0, .L.test13 328# CHECK-ASM: encoding: [0x0c'A',0xcc'A',A,A] 329# CHECK-ASM: fixup A - offset: 0, value: .L.test13, kind: fixup_csky_pcrel_imm18_scale2 330.L.test13: 331grs32 a0, .L.test13 332 333# CHECK-ASM: lrw32 a0, .L.test14 334# CHECK-ASM: encoding: [0x80'A',0xea'A',A,A] 335# CHECK-ASM: fixup A - offset: 0, value: .L.test14, kind: fixup_csky_pcrel_uimm16_scale4 336.L.test14: 337lrw32 a0, [.L.test14] 338 339# RUN: not llvm-mc -triple csky --defsym=ERR=1 < %s 2>&1 | FileCheck %s 340 341.ifdef ERR 342 343# uimm12/oimm12/nimm12 344addi32 a0, a0, 0 # CHECK: :[[#@LINE]]:16: error: immediate must be an integer in the range [1, 4096] 345subi32 a0, a0, 4097 # CHECK: :[[#@LINE]]:16: error: immediate must be an integer in the range [1, 4096] 346andi32 a0, a0, 4096 # CHECK: :[[#@LINE]]:16: error: immediate must be an integer in the range [0, 4095] 347andni32 a0, a0, 4096 # CHECK: :[[#@LINE]]:17: error: immediate must be an integer in the range [0, 4095] 348xori32 a0, a0, 4096 # CHECK: :[[#@LINE]]:16: error: immediate must be an integer in the range [0, 4095] 349 350 351# uimm5 352lsli32 a0, a0, 32 # CHECK: :[[#@LINE]]:16: error: immediate must be an integer in the range [0, 31] 353lsri32 a0, a0, 32 # CHECK: :[[#@LINE]]:16: error: immediate must be an integer in the range [0, 31] 354asri32 a0, a0, 32 # CHECK: :[[#@LINE]]:16: error: immediate must be an integer in the range [0, 31] 355rotli32 a0, a0, 32 # CHECK: :[[@LINE]]:17: error: immediate must be an integer in the range [0, 31] 356 357# uimm12(shift0)/uimm12_1/uimm12_2 358ld32.b a0, (a0, -1) # CHECK: :[[@LINE]]:17: error: immediate must be an integer in the range [0, 4095] 359ld32.h a0, (a0, 4095) # CHECK: :[[@LINE]]:17: error: immediate must be a multiple of 2 bytes in the range [0, 4094] 360ld32.h a0, (a0, 4093) # CHECK: :[[@LINE]]:17: error: immediate must be a multiple of 2 bytes in the range [0, 4094] 361ld32.w a0, (a0, 4093) # CHECK: :[[@LINE]]:17: error: immediate must be a multiple of 4 bytes in the range [0, 4092] 362ld32.w a0, (a0, 2) # CHECK: :[[@LINE]]:17: error: immediate must be a multiple of 4 bytes in the range [0, 4092] 363ldr32.b a0, (a0, a1 << 4) # CHECK: :[[@LINE]]:24: error: immediate must be an integer in the range [0, 3] 364ldr32.bs a0, (a0, a1 << 4) # CHECK: :[[@LINE]]:25: error: immediate must be an integer in the range [0, 3] 365ldr32.h a0, (a0, a1 << -1) # CHECK: :[[@LINE]]:24: error: immediate must be an integer in the range [0, 3] 366ldr32.hs a0, (a0, a1 << 4) # CHECK: :[[@LINE]]:25: error: immediate must be an integer in the range [0, 3] 367ldr32.w a0, (a0, a1 << 4) # CHECK: :[[@LINE]]:24: error: immediate must be an integer in the range [0, 3] 368 369st32.b a0, (a0, -1) # CHECK: :[[@LINE]]:17: error: immediate must be an integer in the range [0, 4095] 370st32.h a0, (a0, 4095) # CHECK: :[[@LINE]]:17: error: immediate must be a multiple of 2 bytes in the range [0, 4094] 371st32.h a0, (a0, 4093) # CHECK: :[[@LINE]]:17: error: immediate must be a multiple of 2 bytes in the range [0, 4094] 372st32.w a0, (a0, 4093) # CHECK: :[[@LINE]]:17: error: immediate must be a multiple of 4 bytes in the range [0, 4092] 373st32.w a0, (a0, 2) # CHECK: :[[@LINE]]:17: error: immediate must be a multiple of 4 bytes in the range [0, 4092] 374 375str32.b a0, (a0, a1 << 4) # CHECK: :[[@LINE]]:24: error: immediate must be an integer in the range [0, 3] 376str32.h a0, (a0, a1 << -1) # CHECK: :[[@LINE]]:24: error: immediate must be an integer in the range [0, 3] 377str32.w a0, (a0, a1 << 4) # CHECK: :[[@LINE]]:24: error: immediate must be an integer in the range [0, 3] 378 379# uimm16/oimm16 380ori32 a0, a0, 0x10000 # CHECK: :[[@LINE]]:15: error: immediate must be an integer in the range [0, 65535] 381cmpnei32 a0, 0x10000 # CHECK: :[[@LINE]]:14: error: immediate must be an integer in the range [0, 65535] 382cmphsi32 a0, 0x10001 # CHECK: :[[@LINE]]:14: error: immediate must be an integer in the range [1, 65536] 383cmplti32 a0, 0 # CHECK: :[[@LINE]]:14: error: immediate must be an integer in the range [1, 65536] 384movi32 a0, 0x10000 # CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [0, 65535] 385movih32 a0, 0x10000 # CHECK: :[[@LINE]]:13: error: immediate must be an integer in the range [0, 65535] 386 387# Invalid mnemonics 388subs t0, t2, t1 # CHECK: :[[#@LINE]]:1: error: unrecognized instruction mnemonic 389nandi t0, t2, 0 # CHECK: :[[#@LINE]]:1: error: unrecognized instruction mnemonic 390 391# Invalid register names 392addi32 foo, sp, 10 # CHECK: :[[#@LINE]]:8: error: unknown operand 393lsli32 a10, a2, 0x20 # CHECK: :[[#@LINE]]:8: error: unknown operand 394asri32 x32, s0, s0 # CHECK: :[[#@LINE]]:8: error: unknown operand 395 396# Invalid operand types 397xori32 sp, 22, 220 # CHECK: :[[#@LINE]]:12: error: invalid operand for instruction 398subu32 t0, t2, 1 # CHECK: :[[#@LINE]]:16: error: invalid operand for instruction 399 400# Too many operands 401subi32 t2, t3, 0x50, 0x60 # CHECK: :[[@LINE]]:22: error: invalid operand for instruction 402 403# Too few operands 404xori32 a0, a1 # CHECK: :[[#@LINE]]:1: error: too few operands for instruction 405xor32 a0, a2 # CHECK: :[[#@LINE]]:1: error: too few operands for instruction 406 407# Need label 408br32 0x100 # CHECK: :[[@LINE]]:6: error: operand must be a symbol name 409jmpi32 0x100 # CHECK: :[[@LINE]]:8: error: operand must be a constpool symbol name 410bsr32 0x100 # CHECK: :[[@LINE]]:7: error: operand must be a symbol name 411 412.endif 413