[openfirmware] [commit] r2135 - cpu/arm
repository service
svn at openfirmware.info
Fri Jan 21 01:12:35 CET 2011
Author: wmb
Date: Fri Jan 21 01:12:35 2011
New Revision: 2135
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2135
Log:
ARM - support movw in assembler, disassembler and simulator, support msr in simulator.
Modified:
cpu/arm/armsim.c
cpu/arm/assem.fth
cpu/arm/disassem.fth
Modified: cpu/arm/armsim.c
==============================================================================
--- cpu/arm/armsim.c Fri Jan 21 01:10:53 2011 (r2134)
+++ cpu/arm/armsim.c Fri Jan 21 01:12:35 2011 (r2135)
@@ -496,7 +496,7 @@
default: UNIMP("BXTYPE"); break;
} break;
case 0x09: switch (BXTYPE) {
- case 0x0: UNIMP("msr"); break;
+ case 0x0: INSTR("msr"); APSR.all = RM; break;
case 0x1: INSTR("bx"); PC = RM; break;
case 0x2: INSTR("bxj"); PC = RM; break;
case 0x3: INSTR("blx"); if (LINK) LR = PC - 4; PC = RM; break;
@@ -805,7 +805,7 @@
case 0x15: INSTR("adc"); ADC(RD, RN, IMM32, C); break;
case 0x16: INSTR("sbc"); SBB(RD, IMM32, RN, C); break;
case 0x17: INSTR("rsc"); SBB(RD, IMM32, RN, C); break;
-case 0x18: INSTR("mov"); RD = IMM16; break;
+case 0x18: INSTR("movw"); RD = IMM16; break;
case 0x19: switch (BXTYPE) {
case 0x0: INSTR("nop"); break;
case 0x1:
Modified: cpu/arm/assem.fth
==============================================================================
--- cpu/arm/assem.fth Fri Jan 21 01:10:53 2011 (r2134)
+++ cpu/arm/assem.fth Fri Jan 21 01:12:35 2011 (r2135)
@@ -548,6 +548,18 @@
: amode-rdop2 ( -- ) init-operands get-r12 get-opr2 !op ;
: amode-rev ( -- ) init-operands get-r12 get-r00 !op ;
+: set-imm16 ( n -- )
+ dup fff and 0 set-field
+ d# 12 >> d# 16 set-field
+;
+: amode-movw ( -- )
+ init-operands get-r12 get-immediate ( imm )
+ dup 0 10000 within 0= if
+ " Immediate value won't fit in 16 bits" ad-error
+ then
+ set-imm16 !op
+;
+
: amode-lsm ( need-r16? -- )
init-operands
if
@@ -923,6 +935,7 @@
: clz 016f.0f10 {cond/s} amode-rdop2 ;
: mov 01a0.0000 {cond/s} amode-rdop2 ;
: mvn 01e0.0000 {cond/s} amode-rdop2 ;
+: movw 0300.0000 {cond} amode-movw ;
: mul 0000.0090 {cond/s} amode-mul ;
: mla 0020.0090 {cond/s} amode-mla ;
@@ -988,7 +1001,7 @@
get-register >r ( r: adr? reg# )
get-immediate r> r> rot ( reg# adr? addr|imm )
2dup swap if ( reg# adr? addr|imm addr|imm )
- here >offset ( reg# adr? addr|imm offset|imm )
+ here >offset ( reg# adr? addr|imm offset )
then
dup fits? if ( reg# adr? addr|imm offset|imm )
2drop if
@@ -1004,7 +1017,11 @@
true asm-const ( reg# op )
then
else ( reg# imm imm )
- drop false asm-const ( reg# op )
+ 0 1.0000 within if ( reg# imm )
+ set-imm16 0300.0000 ( reg# op ) \ movw rN,#<imm16>
+ else ( reg# imm )
+ false asm-const ( reg# op )
+ then
then ( reg# op )
then ( reg# op )
iop rd-field !op
Modified: cpu/arm/disassem.fth
==============================================================================
--- cpu/arm/disassem.fth Fri Jan 21 01:10:53 2011 (r2134)
+++ cpu/arm/disassem.fth Fri Jan 21 01:12:35 2011 (r2135)
@@ -245,10 +245,16 @@
d#24 bit? 0= 5 2 bits 0= and if .alu-ext else .ld/st-ext then
;
+: .movw ( -- ) \ movw rN,#imm
+ ." movw" {<cond>} op.rd, ." #"
+ d# 16 4bits d# 12 << 0 d# 12 bits or u.h
+;
+
\ Stop after changing PC
: ?pc-change ( -- ) d# 12 4bits d# 15 = end-found ! ;
: .alu-op ( -- ) \ d# 25 3 bits 0|1 =
+ d#20 8bits h# 30 = if .movw exit then
d#25 bit? 0= d# 4 bit? and d# 7 bit? and if .ext exit then
alu# h# d and h# d = if \ Moves
.alu {s} op.rd, .r/imm
More information about the openfirmware
mailing list