[LLVMdev] 答复: [LLVMdev] How to bind a register variable with a given general purpose register?
etherzhhb at gmail.com
Mon Jan 4 03:29:10 PST 2010
i am not sure if your c frontend support "int ADC asm("GPR13");"
i think you could:
1. add a attribute "GPR13"(or a more meaningful name like "adcreg") and
the corresponding handler, so you code "int ADC asm("GPR13");" became
"int ADC __attribute__((GPR13));"
2. add a intrinsic functions like "llvm.zhu.readadcreg()".
3. map any read to the variable marked with __attribute__((GPR13)) to
llvm.zhu.readadcreg() instead of "load" instruction
4. assign gpr13 to a special register class like "gpr13class" instead of
gprclass, so gpr13 will not be allocated as other gpr.
5. lower instrinisic functions "llvm.zhu.readadcreg()" to register node
"gpr13" in your backend.
On 2010-1-4 18:01, Demon(Xiangyang) Zhu 朱向阳 wrote:
> Hi Ether,
> The hardware had been fixed now.
> If map it to memory space, it will cost another instruction cycle to execute 'a = ADCREG',
> Algorithm accesses the A/D convert very frequently. To get higher precision at lower frequency
> A/D output is connected to R13 directly. For the moment algorithm code is something like
> assemble and difficult to maintain. I want to setup a c environment for it, but i don't know
> how to bind a register variable with a given general purpose register.
> 发件人: llvmdev-bounces at cs.uiuc.edu [llvmdev-bounces at cs.uiuc.edu] 代表 ether [etherzhhb at gmail.com]
> 发送时间: 2010年1月4日 0:36
> 收件人: llvmdev at cs.uiuc.edu
> 主题: Re: [LLVMdev] How to bind a register variable with a given general purpose register?
> hi zhu,
> i think you should map the peripheral registers to data memory space
> instead of register file, then mark that memory address as "volatile".
> like said the adc register was mapped to address 0xc0000, and then the
> corresponding c source will goes like this:
> //define the register
> #define ADCREG (*((volatile unsigned int *)0xc0000))
> //read the register
> a = ADCREG
> On 2010-1-4 10:59, Heyu Zhu wrote:
>> Hi everyone,
>> There are 16 GPRs in my RISC, but in fact GPR13 is read-only and
>> connected to output of an A/D converter.
>> It would be very convenient if i could bind a register variable with
>> Because i am a newbie i don't know how my llvm backend can support that.
>> I plan to implement it as below.
>> A. first declare a global variable in c-code
>> int ADC asm("GPR13");
>> B. If backend finds a variable is loaded from "GPR13" use GPR13 instead.
>> C. backend can't allocate GPR13 to other variable
>> Is it a foolish method? Is there a better one? Please give me some
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
More information about the llvm-dev