Index: lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp =================================================================== --- lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp +++ lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp @@ -202,6 +202,20 @@ return true; } + if (auto SRE = dyn_cast(Expr)) { + if (SRE->getKind() != MCSymbolRefExpr::VK_None) + return false; + VK = RISCVMCExpr::VK_RISCV_None; + const MCSymbol &Sym = SRE->getSymbol(); + if (!Sym.isVariable()) + return false; + if (auto CE = dyn_cast( + Sym.getVariableValue(/*SetUsed*/ false))) { + Imm = CE->getValue(); + return true; + } + } + return false; } Index: test/MC/RISCV/rv32i-aliases-valid.s =================================================================== --- test/MC/RISCV/rv32i-aliases-valid.s +++ test/MC/RISCV/rv32i-aliases-valid.s @@ -69,6 +69,16 @@ # CHECK-EXPAND: addi a2, zero, -1 li x12, 0xFFFFFFFF +.equ CONST, 0x123456 +# CHECK-EXPAND: lui a0, 291 +# CHECK-EXPAND: addi a0, a0, 1110 +li a0, CONST + +.equ CONST, 0x654321 +# CHECK-EXPAND: lui a0, 1620 +# CHECK-EXPAND: addi a0, a0, 801 +li a0, CONST + # CHECK-INST: csrrs t4, 3202, zero # CHECK-ALIAS: rdinstreth t4 rdinstreth x29 Index: test/MC/RISCV/rv32i-valid.s =================================================================== --- test/MC/RISCV/rv32i-valid.s +++ test/MC/RISCV/rv32i-valid.s @@ -9,6 +9,8 @@ # RUN: | llvm-objdump -riscv-no-aliases -d -r - \ # RUN: | FileCheck -check-prefixes=CHECK-OBJ,CHECK-ASM-AND-OBJ %s +.equ CONST, 30 + # CHECK-ASM-AND-OBJ: lui a0, 2 # CHECK-ASM: encoding: [0x37,0x25,0x00,0x00] lui a0, 2 @@ -35,6 +37,9 @@ # CHECK-OBJ: lui a0, 0 # CHECK-OBJ: R_RISCV_HI20 foo lui a0, %hi(foo) +# CHECK-ASM-AND-OBJ: lui a0, 30 +# CHECK-ASM: encoding: [0x37,0xe5,0x01,0x00] +lui a0, CONST # CHECK-ASM-AND-OBJ: auipc a0, 2 # CHECK-ASM: encoding: [0x17,0x25,0x00,0x00] @@ -53,6 +58,9 @@ # CHECK-OBJ: auipc a0, 0 # CHECK-OBJ: R_RISCV_PCREL_HI20 foo auipc a0, %pcrel_hi(foo) +# CHECK-ASM-AND-OBJ: auipc a0, 30 +# CHECK-ASM: encoding: [0x17,0xe5,0x01,0x00] +auipc a0, CONST # CHECK-ASM-AND-OBJ: jal a2, 1048574 # CHECK-ASM: encoding: [0x6f,0xf6,0xff,0x7f] @@ -70,6 +78,9 @@ # CHECK-OBJ: jal a0, 0 # CHECK-OBJ: R_RISCV_JAL a0 jal a0, a0 +# CHECK-ASM-AND-OBJ: jal a0, 30 +# CHECK-ASM: encoding: [0x6f,0x05,0xe0,0x01] +jal a0, CONST # CHECK-ASM-AND-OBJ: jalr a0, a1, -2048 # CHECK-ASM: encoding: [0x67,0x85,0x05,0x80] @@ -83,6 +94,9 @@ # CHECK-ASM-AND-OBJ: jalr sp, zero, 256 # CHECK-ASM: encoding: [0x67,0x01,0x00,0x10] jalr sp, zero, 256 +# CHECK-ASM-AND-OBJ: jalr a1, a2, 30 +# CHECK-ASM: encoding: [0xe7,0x05,0xe6,0x01] +jalr a1, a2, CONST # CHECK-ASM-AND-OBJ: beq s1, s1, 102 # CHECK-ASM: encoding: [0x63,0x83,0x94,0x06] @@ -102,6 +116,9 @@ # CHECK-ASM-AND-OBJ: bgeu s8, sp, 512 # CHECK-ASM: encoding: [0x63,0x70,0x2c,0x20] bgeu s8, sp, 512 +# CHECK-ASM-AND-OBJ: bgeu t0, t1, 30 +# CHECK-ASM: encoding: [0x63,0xff,0x62,0x00] +bgeu t0, t1, CONST # CHECK-ASM-AND-OBJ: lb s3, 4(ra) # CHECK-ASM: encoding: [0x83,0x89,0x40,0x00] @@ -131,6 +148,9 @@ # CHECK-OBJ: lhu t3, 0(t3) # CHECK-OBJ: R_RISCV_PCREL_LO12 lhu t3, %pcrel_lo(foo)(t3) +# CHECK-ASM-AND-OBJ: lb t0, 30(t1) +# CHECK-ASM: encoding: [0x83,0x02,0xe3,0x01] +lb t0, CONST(t1) # CHECK-ASM-AND-OBJ: sb a0, 2047(a2) # CHECK-ASM: encoding: [0xa3,0x0f,0xa6,0x7e] @@ -144,6 +164,9 @@ # CHECK-ASM-AND-OBJ: sw ra, 999(zero) # CHECK-ASM: encoding: [0xa3,0x23,0x10,0x3e] sw ra, 999(zero) +# CHECK-ASM-AND-OBJ: sw a0, 30(t0) +# CHECK-ASM: encoding: [0x23,0xaf,0xa2,0x00] +sw a0, CONST(t0) # CHECK-ASM-AND-OBJ: addi ra, sp, 2 # CHECK-ASM: encoding: [0x93,0x00,0x21,0x00] @@ -153,6 +176,9 @@ # CHECK-OBJ: addi ra, sp, 0 # CHECK-OBJ: R_RISCV_LO12 addi ra, sp, %lo(foo) +# CHECK-ASM-AND-OBJ: addi ra, sp, 30 +# CHECK-ASM: encoding: [0x93,0x00,0xe1,0x01] +addi ra, sp, CONST # CHECK-ASM-AND-OBJ: slti a0, a2, -20 # CHECK-ASM: encoding: [0x13,0x25,0xc6,0xfe] slti a0, a2, -20 @@ -184,6 +210,9 @@ # CHECK-ASM-AND-OBJ: srai a2, sp, 15 # CHECK-ASM: encoding: [0x13,0x56,0xf1,0x40] srai a2, sp, 15 +# CHECK-ASM-AND-OBJ: slli t3, t3, 30 +# CHECK-ASM: encoding: [0x13,0x1e,0xee,0x01] +slli t3, t3, CONST # CHECK-ASM-AND-OBJ: add ra, zero, zero # CHECK-ASM: encoding: [0xb3,0x00,0x00,0x00] @@ -249,6 +278,8 @@ # CHECK-ASM: encoding: [0x73,0x00,0x10,0x00] ebreak +.equ CONST, 16 + # CHECK-ASM-AND-OBJ: csrrw t0, 4095, t1 # CHECK-ASM: encoding: [0xf3,0x12,0xf3,0xff] csrrw t0, 0xfff, t1 @@ -270,3 +301,6 @@ # CHECK-ASM-AND-OBJ: csrrci t1, 320, 5 # CHECK-ASM: encoding: [0x73,0xf3,0x02,0x14] csrrci t1, 0x140, 5 +# CHECK-ASM-AND-OBJ: csrrci t1, 16, 16 +# CHECK-ASM: encoding: [0x73,0x73,0x08,0x01] +csrrci t1, CONST, CONST Index: test/MC/RISCV/rv64i-aliases-valid.s =================================================================== --- test/MC/RISCV/rv64i-aliases-valid.s +++ test/MC/RISCV/rv64i-aliases-valid.s @@ -105,6 +105,16 @@ # CHECK-EXPAND: addiw t5, zero, -1 li t5, 0xFFFFFFFFFFFFFFFF +.equ CONST, 0x123456 +# CHECK-EXPAND: lui a0, 291 +# CHECK-EXPAND: addiw a0, a0, 1110 +li a0, CONST + +.equ CONST, 0x654321 +# CHECK-EXPAND: lui a0, 1620 +# CHECK-EXPAND: addiw a0, a0, 801 +li a0, CONST + # CHECK-INST: subw t6, zero, ra # CHECK-ALIAS: negw t6, ra negw x31, x1 Index: test/MC/RISCV/rv64i-valid.s =================================================================== --- test/MC/RISCV/rv64i-valid.s +++ test/MC/RISCV/rv64i-valid.s @@ -4,6 +4,8 @@ # RUN: | llvm-objdump -riscv-no-aliases -d -r - \ # RUN: | FileCheck -check-prefixes=CHECK-OBJ,CHECK-ASM-AND-OBJ %s +.equ CONST, 31 + # CHECK-ASM-AND-OBJ: lwu zero, 4(ra) # CHECK-ASM: encoding: [0x03,0xe0,0x40,0x00] lwu x0, 4(x1) @@ -49,6 +51,9 @@ # CHECK-ASM-AND-OBJ: srai s10, s11, 31 # CHECK-ASM: encoding: [0x13,0xdd,0xfd,0x41] srai x26, x27, 31 +# CHECK-ASM-AND-OBJ: srai s10, s11, 31 +# CHECK-ASM: encoding: [0x13,0xdd,0xfd,0x41] +srai x26, x27, CONST # CHECK-ASM-AND-OBJ: addiw t3, t4, -2048 # CHECK-ASM: encoding: [0x1b,0x8e,0x0e,0x80] @@ -75,6 +80,9 @@ # CHECK-ASM-AND-OBJ: sraiw a0, a1, 31 # CHECK-ASM: encoding: [0x1b,0xd5,0xf5,0x41] sraiw a0, a1, 31 +# CHECK-ASM-AND-OBJ: sraiw a0, a1, 31 +# CHECK-ASM: encoding: [0x1b,0xd5,0xf5,0x41] +sraiw a0, a1, CONST # CHECK-ASM-AND-OBJ: addw a2, a3, a4 # CHECK-ASM: encoding: [0x3b,0x86,0xe6,0x00]