404 lines · plain
1# RUN: llvm-mc %s -triple=riscv32 -M no-aliases -show-encoding \2# RUN: | FileCheck -check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ %s3# RUN: llvm-mc %s -triple riscv64 -M no-aliases -show-encoding \4# RUN: | FileCheck -check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ %s5# RUN: llvm-mc -filetype=obj -triple=riscv32 < %s \6# RUN: | llvm-objdump -M no-aliases --no-print-imm-hex -d -r - \7# RUN: | FileCheck -check-prefixes=CHECK-OBJ,CHECK-OBJ32,CHECK-ASM-AND-OBJ %s8# RUN: llvm-mc -filetype=obj -triple=riscv64 < %s \9# RUN: | llvm-objdump -M no-aliases --no-print-imm-hex -d -r - \10# RUN: | FileCheck -check-prefixes=CHECK-OBJ,CHECK-OBJ64,CHECK-ASM-AND-OBJ %s11 12.equ CONST, 3013 14# Needed for testing valid %pcrel_lo expressions15.Lpcrel_hi0: auipc a0, %pcrel_hi(foo)16 17# CHECK-ASM-AND-OBJ: lui a0, 218# CHECK-ASM: encoding: [0x37,0x25,0x00,0x00]19lui a0, 220# CHECK-ASM-AND-OBJ: lui s11, 55296021# CHECK-ASM: encoding: [0xb7,0x0d,0x00,0x87]22lui s11, (0x87000000>>12)23# CHECK-ASM: lui a0, %hi(2) # encoding: [0x37,0bAAAA0101,A,A]24# CHECK-OBJ: lui a0, 025lui a0, %hi(2)26# CHECK-ASM-AND-OBJ: lui s11, 55296027# CHECK-ASM: encoding: [0xb7,0x0d,0x00,0x87]28lui s11, (0x87000000>>12)29# CHECK-ASM: lui s11, %hi(2264924160)30# CHECK-OBJ: lui s11, 55296031# CHECK-ASM: encoding: [0xb7,0bAAAA1101,A,A]32lui s11, %hi(0x87000000)33# CHECK-ASM-AND-OBJ: lui t0, 104857534# CHECK-ASM: encoding: [0xb7,0xf2,0xff,0xff]35lui t0, 104857536# CHECK-ASM-AND-OBJ: lui gp, 037# CHECK-ASM: encoding: [0xb7,0x01,0x00,0x00]38lui gp, 039# CHECK-ASM: lui a0, %hi(foo) # encoding: [0x37,0bAAAA0101,A,A]40# CHECK-OBJ: lui a0, 041# CHECK-OBJ: R_RISCV_HI20 foo42lui a0, %hi(foo)43# CHECK-ASM-AND-OBJ: lui a0, 3044# CHECK-ASM: encoding: [0x37,0xe5,0x01,0x00]45lui a0, CONST46# CHECK-ASM-AND-OBJ: lui a0, 3147# CHECK-ASM: encoding: [0x37,0xf5,0x01,0x00]48lui a0, CONST+149 50# CHECK-ASM-AND-OBJ: auipc a0, 251# CHECK-ASM: encoding: [0x17,0x25,0x00,0x00]52auipc a0, 253# CHECK-ASM-AND-OBJ: auipc s11, 55296054# CHECK-ASM: encoding: [0x97,0x0d,0x00,0x87]55auipc s11, (0x87000000>>12)56# CHECK-ASM-AND-OBJ: auipc t0, 104857557# CHECK-ASM: encoding: [0x97,0xf2,0xff,0xff]58auipc t0, 104857559# CHECK-ASM-AND-OBJ: auipc gp, 060# CHECK-ASM: encoding: [0x97,0x01,0x00,0x00]61auipc gp, 062# CHECK-ASM: auipc a0, %pcrel_hi(foo) # encoding: [0x17,0bAAAA0101,A,A]63# CHECK-OBJ: auipc a0, 064# CHECK-OBJ: R_RISCV_PCREL_HI20 foo65auipc a0, %pcrel_hi(foo)66# CHECK-ASM-AND-OBJ: auipc a0, 3067# CHECK-ASM: encoding: [0x17,0xe5,0x01,0x00]68auipc a0, CONST69 70# CHECK-OBJ: jal a2, 0x10004271# CHECK-ASM: jal a2, 104857472# CHECK-ASM: encoding: [0x6f,0xf6,0xff,0x7f]73jal a2, 104857474# CHECK-OBJ: jal a3, 0x14875# CHECK-ASM: jal a3, 25676# CHECK-ASM: encoding: [0xef,0x06,0x00,0x10]77jal a3, 25678# CHECK-ASM: jal a0, foo79# CHECK-ASM: encoding: [0x6f,0bAAAA0101,A,A]80# CHECK-OBJ: jal a0, 081# CHECK-OBJ: R_RISCV_JAL foo82jal a0, foo83# CHECK-ASM: jal a0, a084# CHECK-ASM: encoding: [0x6f,0bAAAA0101,A,A]85# CHECK-OBJ: jal a0, 086# CHECK-OBJ: R_RISCV_JAL a087jal a0, a088# CHECK-OBJ: jal a0, 0x7289# CHECK-ASM: jal a0, 3090# CHECK-ASM: encoding: [0x6f,0x05,0xe0,0x01]91jal a0, CONST92# CHECK-ASM-AND-OBJ: jal s0, 093# CHECK-ASM: encoding: [0x6f,0x04,0x00,0x00]94jal s0, (0)95# CHECK-OBJ: jal s0, 0xf896# CHECK-ASM: jal s0, 15697# CHECK-ASM: encoding: [0x6f,0x04,0xc0,0x09]98jal s0, (0xff-99)99# CHECK-ASM: encoding: [0x6f,0bAAAA0000,A,A]100# CHECK-OBJ: jal zero, 0101jal zero, .102 103# CHECK-ASM-AND-OBJ: jalr a0, -2048(a1)104# CHECK-ASM: encoding: [0x67,0x85,0x05,0x80]105jalr a0, -2048(a1)106# CHECK-ASM: jalr a0, %lo(2048)(a1) # encoding: [0x67,0x85,0bAAAA0101,A]107# CHECK-OBJ: jalr a0, -2048(a1)108jalr a0, %lo(2048)(a1)109# CHECK-ASM-AND-OBJ: jalr t2, 2047(t1)110# CHECK-ASM: encoding: [0xe7,0x03,0xf3,0x7f]111jalr t2, 2047(t1)112# CHECK-ASM-AND-OBJ: jalr sp, 256(zero)113# CHECK-ASM: encoding: [0x67,0x01,0x00,0x10]114jalr sp, zero, 256115# CHECK-ASM-AND-OBJ: jalr a1, 30(a2)116# CHECK-ASM: encoding: [0xe7,0x05,0xe6,0x01]117jalr a1, CONST(a2)118 119# CHECK-OBJ: beq s1, s1, 0xde120# CHECK-ASM: beq s1, s1, 102121# CHECK-ASM: encoding: [0x63,0x83,0x94,0x06]122beq s1, s1, 102123# CHECK-OBJ32: bne a4, a5, 0xfffff07c124# CHECK-OBJ64: bne a4, a5, 0xfffffffffffff07c125# CHECK-ASM: bne a4, a5, -4096126# CHECK-ASM: encoding: [0x63,0x10,0xf7,0x80]127bne a4, a5, -4096128# CHECK-OBJ: blt sp, gp, 0x107e129# CHECK-ASM: blt sp, gp, 4094130# CHECK-ASM: encoding: [0xe3,0x4f,0x31,0x7e]131blt sp, gp, 4094132# CHECK-OBJ32: bge s2, ra, 0xffffffa4133# CHECK-OBJ64: bge s2, ra, 0xffffffffffffffa4134# CHECK-ASM: bge s2, ra, -224135# CHECK-ASM: encoding: [0xe3,0x50,0x19,0xf2]136bge s2, ra, -224137# CHECK-ASM-AND-OBJ: bltu zero, zero, 0138# CHECK-ASM: encoding: [0x63,0x60,0x00,0x00]139bltu zero, zero, 0140# CHECK-OBJ: bgeu s8, sp, 0x28c141# CHECK-ASM: bgeu s8, sp, 512142# CHECK-ASM: encoding: [0x63,0x70,0x2c,0x20]143bgeu s8, sp, 512144# CHECK-OBJ: bgeu t0, t1, 0xae145# CHECK-ASM: bgeu t0, t1, 30146# CHECK-ASM: encoding: [0x63,0xff,0x62,0x00]147bgeu t0, t1, CONST148 149# CHECK-ASM-AND-OBJ: lb s3, 4(ra)150# CHECK-ASM: encoding: [0x83,0x89,0x40,0x00]151lb s3, 4(ra)152# CHECK-ASM-AND-OBJ: lb s3, 4(ra)153# CHECK-ASM: encoding: [0x83,0x89,0x40,0x00]154lb s3, +4(ra)155# CHECK-ASM-AND-OBJ: lh t1, -2048(zero)156# CHECK-ASM: encoding: [0x03,0x13,0x00,0x80]157lh t1, -2048(zero)158# CHECK-ASM-AND-OBJ: lh t1, -2048(zero)159# CHECK-ASM: encoding: [0x03,0x13,0x00,0x80]160lh t1, ~2047(zero)161# CHECK-ASM-AND-OBJ: lh t1, 0(zero)162# CHECK-ASM: encoding: [0x03,0x13,0x00,0x00]163lh t1, !1(zero)164# CHECK-ASM: lh t1, %lo(2048)(zero) # encoding: [0x03,0x13,0bAAAA0000,A]165# CHECK-OBJ: lh t1, -2048(zero)166lh t1, %lo(2048)(zero)167# CHECK-ASM-AND-OBJ: lh sp, 2047(a0)168# CHECK-ASM: encoding: [0x03,0x11,0xf5,0x7f]169lh sp, 2047(a0)170# CHECK-ASM-AND-OBJ: lw a0, 97(a2)171# CHECK-ASM: encoding: [0x03,0x25,0x16,0x06]172lw a0, 97(a2)173# CHECK-ASM: lbu s5, %lo(foo)(s6) # encoding: [0x83,0x4a,0bAAAA1011,A]174# CHECK-OBJ: lbu s5, 0(s6)175# CHECK-OBJ: R_RISCV_LO12176lbu s5, %lo(foo)(s6)177# CHECK-ASM: lhu t3, %pcrel_lo(.Lpcrel_hi0)(t3)178# CHECK-ASM: encoding: [0x03,0x5e,0bAAAA1110,A]179# CHECK-OBJ: lhu t3, 0(t3)180# CHECK-OBJ: R_RISCV_PCREL_LO12181lhu t3, %pcrel_lo(.Lpcrel_hi0)(t3)182# CHECK-ASM-AND-OBJ: lb t0, 30(t1)183# CHECK-ASM: encoding: [0x83,0x02,0xe3,0x01]184lb t0, CONST(t1)185# CHECK-ASM-AND-OBJ: lb s0, 0(s1)186# CHECK-ASM: encoding: [0x03,0x84,0x04,0x00]187lb s0, (0)(s1)188# CHECK-ASM-AND-OBJ: lb s0, 156(s1)189# CHECK-ASM: encoding: [0x03,0x84,0xc4,0x09]190lb s0, (0xff-99)(s1)191 192# CHECK-ASM-AND-OBJ: sb a0, 2047(a2)193# CHECK-ASM: encoding: [0xa3,0x0f,0xa6,0x7e]194sb a0, 2047(a2)195# CHECK-ASM-AND-OBJ: sh t3, -2048(t5)196# CHECK-ASM: encoding: [0x23,0x10,0xcf,0x81]197sh t3, -2048(t5)198# CHECK-ASM-AND-OBJ: sh t3, -2048(t5)199# CHECK-ASM: encoding: [0x23,0x10,0xcf,0x81]200sh t3, ~2047(t5)201# CHECK-ASM-AND-OBJ: sh t3, 0(t5)202# CHECK-ASM: encoding: [0x23,0x10,0xcf,0x01]203sh t3, !1(t5)204# CHECK-ASM: sh t3, %lo(2048)(t5)205# CHECK-ASM: encoding: [0x23'A',0x10'A',0xcf'A',0x01'A']206# CHECK-OBJ: sh t3, -2048(t5)207sh t3, %lo(2048)(t5)208# CHECK-ASM-AND-OBJ: sw ra, 999(zero)209# CHECK-ASM: encoding: [0xa3,0x23,0x10,0x3e]210sw ra, 999(zero)211# CHECK-ASM-AND-OBJ: sw a0, 30(t0)212# CHECK-ASM: encoding: [0x23,0xaf,0xa2,0x00]213sw a0, CONST(t0)214# CHECK-ASM-AND-OBJ: sw s0, 0(s1)215# CHECK-ASM: encoding: [0x23,0xa0,0x84,0x00]216sw s0, (0)(s1)217# CHECK-ASM-AND-OBJ: sw s0, 156(s1)218# CHECK-ASM: encoding: [0x23,0xae,0x84,0x08]219sw s0, (0xff-99)(s1)220 221# CHECK-ASM-AND-OBJ: addi ra, sp, 2222# CHECK-ASM: encoding: [0x93,0x00,0x21,0x00]223addi ra, sp, 2224# CHECK-ASM: addi ra, sp, %lo(foo)225# CHECK-ASM: encoding: [0x93,0x00,0bAAAA0001,A]226# CHECK-OBJ: addi ra, sp, 0227# CHECK-OBJ: R_RISCV_LO12228addi ra, sp, %lo(foo)229# CHECK-ASM-AND-OBJ: addi ra, sp, 30230# CHECK-ASM: encoding: [0x93,0x00,0xe1,0x01]231addi ra, sp, CONST232# CHECK-ASM-AND-OBJ: addi ra, sp, 0233# CHECK-ASM: encoding: [0x93,0x00,0x01,0x00]234addi ra, sp, (0)235# CHECK-ASM-AND-OBJ: addi ra, sp, 156236# CHECK-ASM: encoding: [0x93,0x00,0xc1,0x09]237addi ra, sp, (0xff-99)238# CHECK-ASM-AND-OBJ: slti a0, a2, -20239# CHECK-ASM: encoding: [0x13,0x25,0xc6,0xfe]240slti a0, a2, -20241# CHECK-ASM-AND-OBJ: sltiu s2, s3, 80242# CHECK-ASM: encoding: [0x13,0xb9,0x09,0x05]243sltiu s2, s3, 0x50244# CHECK-ASM-AND-OBJ: xori tp, t1, -99245# CHECK-ASM: encoding: [0x13,0x42,0xd3,0xf9]246xori tp, t1, -99247# CHECK-ASM-AND-OBJ: ori a0, a1, -2048248# CHECK-ASM: encoding: [0x13,0xe5,0x05,0x80]249ori a0, a1, -2048250# CHECK-ASM-AND-OBJ: ori a0, a1, -2048251# CHECK-ASM: encoding: [0x13,0xe5,0x05,0x80]252ori a0, a1, ~2047253# CHECK-ASM-AND-OBJ: ori a0, a1, 0254# CHECK-ASM: encoding: [0x13,0xe5,0x05,0x00]255ori a0, a1, !1256# CHECK-ASM: ori a0, a1, %lo(2048) # encoding: [0x13,0xe5,0bAAAA0101,A]257# CHECK-OBJ: ori a0, a1, -2048258ori a0, a1, %lo(2048)259# CHECK-ASM-AND-OBJ: andi ra, sp, 2047260# CHECK-ASM: encoding: [0x93,0x70,0xf1,0x7f]261andi ra, sp, 2047262# CHECK-ASM-AND-OBJ: andi ra, sp, 2047263# CHECK-ASM: encoding: [0x93,0x70,0xf1,0x7f]264andi x1, x2, 2047265 266# CHECK-ASM-AND-OBJ: slli t3, t3, 31267# CHECK-ASM: encoding: [0x13,0x1e,0xfe,0x01]268slli t3, t3, 31269# CHECK-ASM-AND-OBJ: srli a0, a4, 0270# CHECK-ASM: encoding: [0x13,0x55,0x07,0x00]271srli a0, a4, 0272# CHECK-ASM-AND-OBJ: srai a2, sp, 15273# CHECK-ASM: encoding: [0x13,0x56,0xf1,0x40]274srai a2, sp, 15275# CHECK-ASM-AND-OBJ: slli t3, t3, 30276# CHECK-ASM: encoding: [0x13,0x1e,0xee,0x01]277slli t3, t3, CONST278 279# CHECK-ASM-AND-OBJ: add ra, zero, zero280# CHECK-ASM: encoding: [0xb3,0x00,0x00,0x00]281add ra, zero, zero282# CHECK-ASM-AND-OBJ: add ra, zero, zero283# CHECK-ASM: encoding: [0xb3,0x00,0x00,0x00]284add x1, x0, x0285# CHECK-ASM-AND-OBJ: sub t0, t2, t1286# CHECK-ASM: encoding: [0xb3,0x82,0x63,0x40]287sub t0, t2, t1288# CHECK-ASM-AND-OBJ: sll a5, a4, a3289# CHECK-ASM: encoding: [0xb3,0x17,0xd7,0x00]290sll a5, a4, a3291# CHECK-ASM-AND-OBJ: slt s0, s0, s0292# CHECK-ASM: encoding: [0x33,0x24,0x84,0x00]293slt s0, s0, s0294# CHECK-ASM-AND-OBJ: sltu gp, a0, a1295# CHECK-ASM: encoding: [0xb3,0x31,0xb5,0x00]296sltu gp, a0, a1297# CHECK-ASM-AND-OBJ: xor s2, s2, s8298# CHECK-ASM: encoding: [0x33,0x49,0x89,0x01]299xor s2, s2, s8300# CHECK-ASM-AND-OBJ: xor s2, s2, s8301# CHECK-ASM: encoding: [0x33,0x49,0x89,0x01]302xor x18, x18, x24303# CHECK-ASM-AND-OBJ: srl a0, s0, t0304# CHECK-ASM: encoding: [0x33,0x55,0x54,0x00]305srl a0, s0, t0306# CHECK-ASM-AND-OBJ: sra t0, s2, zero307# CHECK-ASM: encoding: [0xb3,0x52,0x09,0x40]308sra t0, s2, zero309# CHECK-ASM-AND-OBJ: or s10, t1, ra310# CHECK-ASM: encoding: [0x33,0x6d,0x13,0x00]311or s10, t1, ra312# CHECK-ASM-AND-OBJ: and a0, s2, s3313# CHECK-ASM: encoding: [0x33,0x75,0x39,0x01]314and a0, s2, s3315 316# CHECK-ASM-AND-OBJ: fence iorw, iorw317# CHECK-ASM: encoding: [0x0f,0x00,0xf0,0x0f]318fence iorw, iorw319# CHECK-ASM-AND-OBJ: fence io, rw320# CHECK-ASM: encoding: [0x0f,0x00,0x30,0x0c]321fence io, rw322# CHECK-ASM-AND-OBJ: fence r, w323# CHECK-ASM: encoding: [0x0f,0x00,0x10,0x02]324fence r,w325# CHECK-ASM-AND-OBJ: fence w, ir326# CHECK-ASM: encoding: [0x0f,0x00,0xa0,0x01]327fence w,ir328# CHECK-ASM-AND-OBJ: fence.tso329# CHECK-ASM: encoding: [0x0f,0x00,0x30,0x83]330fence.tso331 332# CHECK-ASM-AND-OBJ: fence.i333# CHECK-ASM: encoding: [0x0f,0x10,0x00,0x00]334fence.i335 336# CHECK-ASM-AND-OBJ: ecall337# CHECK-ASM: encoding: [0x73,0x00,0x00,0x00]338ecall339# CHECK-ASM-AND-OBJ: ebreak340# CHECK-ASM: encoding: [0x73,0x00,0x10,0x00]341ebreak342# CHECK-ASM-AND-OBJ: unimp343# CHECK-ASM: encoding: [0x73,0x10,0x00,0xc0]344unimp345 346.equ CONST, 16347 348# CHECK-ASM-AND-OBJ: csrrw t0, 4095, t1349# CHECK-ASM: encoding: [0xf3,0x12,0xf3,0xff]350csrrw t0, 0xfff, t1351# CHECK-ASM-AND-OBJ: csrrw s0, 4095, s1352# CHECK-ASM: encoding: [0x73,0x94,0xf4,0xff]353csrrw s0, ~(-4096), s1354# CHECK-ASM-AND-OBJ: csrrw s0, fflags, s1355# CHECK-ASM: encoding: [0x73,0x94,0x14,0x00]356csrrw s0, !0, s1357# CHECK-ASM-AND-OBJ: csrrs s0, cycle, zero358# CHECK-ASM: encoding: [0x73,0x24,0x00,0xc0]359csrrs s0, 0xc00, x0360# CHECK-ASM-AND-OBJ: csrrs s3, fflags, s5361# CHECK-ASM: encoding: [0xf3,0xa9,0x1a,0x00]362csrrs s3, 0x001, s5363# CHECK-ASM-AND-OBJ: csrrc sp, 0, ra364# CHECK-ASM: encoding: [0x73,0xb1,0x00,0x00]365csrrc sp, 0x000, ra366# CHECK-ASM-AND-OBJ: csrrwi a5, 0, 0367# CHECK-ASM: encoding: [0xf3,0x57,0x00,0x00]368csrrwi a5, 0x000, 0369# CHECK-ASM-AND-OBJ: csrrsi t2, 4095, 31370# CHECK-ASM: encoding: [0xf3,0xe3,0xff,0xff]371csrrsi t2, 0xfff, 31372# CHECK-ASM-AND-OBJ: csrrci t1, sscratch, 5373# CHECK-ASM: encoding: [0x73,0xf3,0x02,0x14]374csrrci t1, 0x140, 5375 376## Check that we can use an absolute symbol value as a CSR number377# CHECK-ASM-AND-OBJ: csrrs a0, fflags, zero378# CHECK-ASM: encoding: [0x73,0x25,0x10,0x00]379.set fflags_abs_sym, 1380csrr a0, fflags_abs_sym381# CHECK-ASM-AND-OBJ: csrrs a0, frm, zero382# CHECK-ASM: encoding: [0x73,0x25,0x20,0x00]383csrr a0, (fflags_abs_sym+1)384# CHECK-ASM-AND-OBJ: csrrs a0, frm, zero385# CHECK-ASM: encoding: [0x73,0x25,0x20,0x00]386.equ fplus_one_abs_sym, fflags_abs_sym + 1387csrr a0, fplus_one_abs_sym388 389## Check that redefining the value is allowed390# CHECK-ASM-AND-OBJ: csrrs a0, fflags, zero391# CHECK-ASM: encoding: [0x73,0x25,0x10,0x00]392.set csr_index, 1393csrr a0, csr_index394# CHECK-ASM-AND-OBJ: csrrs a0, frm, zero395# CHECK-ASM: encoding: [0x73,0x25,0x20,0x00]396.set csr_index, 2397csrr a0, csr_index398 399## Check that select the CSR first.400.set frm, 1401# CHECK-ASM-AND-OBJ: csrrs a0, frm, zero402# CHECK-ASM: encoding: [0x73,0x25,0x20,0x00]403csrr a0, frm404