ASM Extended on RISCV GCC Immediate issue

0

I'm trying to pass an immediate value (12bit size) containing the address of a CSR register into the csr instruction of riscv. Do you have any idea?

int volatile stimulus[] = {0xabbaabba, 0xFFFFFFFF, 0xAAAAAAAA};

void  test_csr0(){
    int imm1 = stimulus[0];
    int imm2 = stimulus[1];

    int test = 0x300;
    asm volatile (
            "lw t1, %[imm1];"
            "lw t4, %[imm2];"
            "csrrc x0,  %[imm3],t2;"
            :
            :[imm1] "m" (imm1), [imm2] "m" (imm2),[imm3] "I" (test) ); //

the error is the following:

make all
CC  test.c
In file included from test.c:12:0: 
csr_test/csr_test0.c: In function 'test_csr0':

csr_test/csr_test0.c:19:9: warning: asm operand 2 probably doesn't match constraints

   asm volatile (
   ^~~

csr_test/csr_test0.c:19:9: error: impossible constraint in 'asm'

Is there a way to use an array of const int instead of the normal test variable? What I mean is the following:

void  test_csr0() {
    unsigned stimulus[] = {0xabbaabba, 0xFFFFFFFF, 0xAAAAAAAA};
    int imm1 = stimulus[0];
    int imm2 = stimulus[1];
    const int test[] = {0x300, 0x25c, 0xc70, 0x7c0};
    for (int i; i<4;i++){
        asm volatile (
            "lw t1, %[imm1];"
            "lw t4, %[imm2];"
            "csrrc x0,  %[imm3],t2;"
            :
            :[imm1] "m" (imm1), [imm2] "m" (imm2),[imm3] "I" (test[i]) ); 
    }
}

I need to pass all the addresses to this function. Than you again!

assembly
gcc
riscv
asked on Stack Overflow Jul 22, 2020 by Lorenzo Zaia • edited Jul 24, 2020 by Lorenzo Zaia

0 Answers

Nobody has answered this question yet.


User contributions licensed under CC BY-SA 3.0