fanqifei wrote:
2010/1/13 Bingfeng Mei <b...@broadcom.com>:
Your instruction is likely too specific to be picked up by GCC.
You may use an intrinisc for it.
Bingfeng
but insv is a standard pattern name.
the semantics of expression x= (x&0xFF00FFFF) | ((i<<16)&0x00FF0000);
is exactly what insv can do.
I all tried mips gcc cross compiler, and ins is also not generated.
You must be doing something wrong:
$ cat fanqifei.c
struct test_foo {
unsigned int a:18;
unsigned int b:2;
unsigned int c:12;
};
struct test_foo x;
unsigned int foo()
{
unsigned int a=x.b;
x.b=2;
return a;
}
$ mips64-linux-gcc -O3 -march=mips32r2 -mabi=32 -mno-abicalls -S fanqifei.c
$ cat fanqifei.s
.file 1 "fanqifei.c"
.section .mdebug.abi32
.previous
.gnu_attribute 4, 1
.text
.align 2
.globl foo
.set nomips16
.ent foo
.type foo, @function
foo:
.frame $sp,0,$31 # vars= 0, regs= 0/0, args= 0, gp= 0
.mask 0x00000000,0
.fmask 0x00000000,0
.set noreorder
.set nomacro
lui $3,%hi(x)
lw $2,%lo(x)($3)
li $5,2 # 0x2
move $4,$2
ins $4,$5,12,2 #<<<<<<< Here it is.
sw $4,%lo(x)($3)
j $31
ext $2,$2,12,2
.set macro
.set reorder
.end foo
.size foo, .-foo
.comm x,4,4
.ident "GCC: (GNU) 4.5.0 20091223 (experimental) [trunk revision
155414]"