Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(171)

Side by Side Diff: src/trusted/validator_arm/armv7.table

Issue 10879090: ARM validator: continue with extra_load_store_instructions. (Closed) Base URL: svn://svn.chromium.org/native_client/trunk/src/native_client
Patch Set: Update with more tables. Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 # ARMv7 Instruction Encodings 1 # ARMv7 Instruction Encodings
2 # 2 #
3 # This table is derived from the "ARM Architecture Reference Manual, ARMv7-A 3 # This table is derived from the "ARM Architecture Reference Manual, ARMv7-A
4 # and ARMv7-R edition" and is used here with the permission of ARM Limited. 4 # and ARMv7-R edition" and is used here with the permission of ARM Limited.
5 # Reproduction for purposes other than the development and distribution of 5 # Reproduction for purposes other than the development and distribution of
6 # Native Client may require the explicit permission of ARM Limited. 6 # Native Client may require the explicit permission of ARM Limited.
7 7
8 # This file defines the Native Client "instruction classes" assigned to every 8 # This file defines the Native Client "instruction classes" assigned to every
9 # possible ARMv7 instruction encoding. It is organized into a series of tables, 9 # possible ARMv7 instruction encoding. It is organized into a series of tables,
10 # and directly parallels the ARM Architecture Reference Manual cited above. 10 # and directly parallels the ARM Architecture Reference Manual cited above.
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 # By providing this information, the generator can pick out 107 # By providing this information, the generator can pick out
108 # the corresponding baseline class tester to use, and does 108 # the corresponding baseline class tester to use, and does
109 # not need to define separate testers for derived classes of 109 # not need to define separate testers for derived classes of
110 # the baseline class tester. 110 # the baseline class tester.
111 # ############################################################# 111 # #############################################################
112 112
113 class BreakPointAndConstantPoolHead : Immediate16Use 113 class BreakPointAndConstantPoolHead : Immediate16Use
114 class Binary3RegisterImmedShiftedOpRegsNotPc : Binary3RegisterImmedShiftedOp 114 class Binary3RegisterImmedShiftedOpRegsNotPc : Binary3RegisterImmedShiftedOp
115 class ForbiddenCondNop : UnsafeCondNop 115 class ForbiddenCondNop : UnsafeCondNop
116 class ForbiddenUncondNop : UnsafeUncondNop 116 class ForbiddenUncondNop : UnsafeUncondNop
117 class LoadRegisterList : LoadStoreRegisterList 117 class LoadRegisterList : LoadStoreRegisterList
118 class LoadStoreVectorRegister : LoadStoreVectorOp 118 class LoadStoreVectorRegister : LoadStoreVectorOp
119 class LoadVectorRegister : LoadStoreVectorRegister 119 class LoadVectorRegister : LoadStoreVectorRegister
120 class LoadVectorRegisterList : LoadStoreVectorRegisterList 120 class LoadVectorRegisterList : LoadStoreVectorRegisterList
121 class Load3RegisterDoubleOp : LoadStore3RegisterDoubleOp 121 class Load3RegisterDoubleOp : LoadStore3RegisterDoubleOp
122 class Load2RegisterImm8DoubleOp : LoadStore2RegisterImm8DoubleOp 122 class Load2RegisterImm8DoubleOp : LoadStore2RegisterImm8DoubleOp
123 class Load2RegisterImm8Op : LoadStore2RegisterImm8Op 123 class Load2RegisterImm8Op : LoadStore2RegisterImm8Op
124 class Load2RegisterImm12Op : LoadStore2RegisterImm12Op 124 class Load2RegisterImm12Op : LoadStore2RegisterImm12Op
125 class Load3RegisterImm5Op : LoadStore3RegisterImm5Op 125 class Load3RegisterImm5Op : LoadStore3RegisterImm5Op
126 class Load3RegisterOp : LoadStore3RegisterOp 126 class Load3RegisterOp : LoadStore3RegisterOp
127 class MaskedBinary2RegisterImmediateOp : Binary2RegisterImmediateOp 127 class MaskedBinary2RegisterImmediateOp : Binary2RegisterImmediateOp
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 cccc0000110unnnnddddiiiiitt0mmmm 222 cccc0000110unnnnddddiiiiitt0mmmm
223 NotRdIsPcAndS 223 NotRdIsPcAndS
224 | 0111x - - = Binary3RegisterImmedShiftedOp 224 | 0111x - - = Binary3RegisterImmedShiftedOp
225 => Defs12To15 225 => Defs12To15
226 Rsc_Rule_146_A1_P292 226 Rsc_Rule_146_A1_P292
227 cccc0000111unnnnddddiiiiitt0mmmm 227 cccc0000111unnnnddddiiiiitt0mmmm
228 NotRdIsPcAndS 228 NotRdIsPcAndS
229 | 10001 - - = Binary2RegisterImmedShiftedTest 229 | 10001 - - = Binary2RegisterImmedShiftedTest
230 => DontCareInst 230 => DontCareInst
231 Tst_Rule_231_A1_P456 231 Tst_Rule_231_A1_P456
232 cccc00010001nnnn0000iiiiitt0mmmm 232 cccc00010001nnnn0000iiiiitt0mmmm
233 | 10011 - - = Binary2RegisterImmedShiftedTest 233 | 10011 - - = Binary2RegisterImmedShiftedTest
234 => DontCareInst 234 => DontCareInst
235 Teq_Rule_228_A1_P450 235 Teq_Rule_228_A1_P450
236 cccc00010011nnnn0000iiiiitt0mmmm 236 cccc00010011nnnn0000iiiiitt0mmmm
237 | 10101 - - = Binary2RegisterImmedShiftedTest 237 | 10101 - - = Binary2RegisterImmedShiftedTest
238 => DontCareInst 238 => DontCareInst
239 Cmp_Rule_36_A1_P82 239 Cmp_Rule_36_A1_P82
240 cccc00010101nnnn0000iiiiitt0mmmm 240 cccc00010101nnnn0000iiiiitt0mmmm
241 | 10111 - - = Binary2RegisterImmedShiftedTest 241 | 10111 - - = Binary2RegisterImmedShiftedTest
242 => DontCareInst 242 => DontCareInst
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 | 0010x - = Binary4RegisterShiftedOp 304 | 0010x - = Binary4RegisterShiftedOp
305 => Defs12To15RdRnRsRmNotPc 305 => Defs12To15RdRnRsRmNotPc
306 Sub_Rule_214_A1_P424 306 Sub_Rule_214_A1_P424
307 cccc0000010snnnnddddssss0tt1mmmm RegsNotPc 307 cccc0000010snnnnddddssss0tt1mmmm RegsNotPc
308 | 0011x - = Binary4RegisterShiftedOp 308 | 0011x - = Binary4RegisterShiftedOp
309 => Defs12To15RdRnRsRmNotPc 309 => Defs12To15RdRnRsRmNotPc
310 Rsb_Rule_144_A1_P288 310 Rsb_Rule_144_A1_P288
311 cccc0000011snnnnddddssss0tt1mmmm RegsNotPc 311 cccc0000011snnnnddddssss0tt1mmmm RegsNotPc
312 | 0100x - = Binary4RegisterShiftedOp 312 | 0100x - = Binary4RegisterShiftedOp
313 => Defs12To15RdRnRsRmNotPc 313 => Defs12To15RdRnRsRmNotPc
314 Add_Rule_7_A1_P26 314 Add_Rule_7_A1_P26
315 cccc0000100snnnnddddssss0tt1mmmm RegsNotPc 315 cccc0000100snnnnddddssss0tt1mmmm RegsNotPc
316 | 0101x - = Binary4RegisterShiftedOp 316 | 0101x - = Binary4RegisterShiftedOp
317 => Defs12To15RdRnRsRmNotPc 317 => Defs12To15RdRnRsRmNotPc
318 Adc_Rule_3_A1_P18 318 Adc_Rule_3_A1_P18
319 cccc0000101snnnnddddssss0tt1mmmm RegsNotPc 319 cccc0000101snnnnddddssss0tt1mmmm RegsNotPc
320 | 0110x - = Binary4RegisterShiftedOp 320 | 0110x - = Binary4RegisterShiftedOp
321 => Defs12To15RdRnRsRmNotPc 321 => Defs12To15RdRnRsRmNotPc
322 Sbc_Rule_153_A1_P306 322 Sbc_Rule_153_A1_P306
323 cccc0000110snnnnddddssss0tt1mmmm RegsNotPc 323 cccc0000110snnnnddddssss0tt1mmmm RegsNotPc
324 | 0111x - = Binary4RegisterShiftedOp 324 | 0111x - = Binary4RegisterShiftedOp
325 => Defs12To15RdRnRsRmNotPc 325 => Defs12To15RdRnRsRmNotPc
326 Rsc_Rule_147_A1_P294 326 Rsc_Rule_147_A1_P294
327 cccc0000111snnnnddddssss0tt1mmmm RegsNotPc 327 cccc0000111snnnnddddssss0tt1mmmm RegsNotPc
328 # TODO(jfb) op==10xx0 should be unreachable from here: 328 # TODO(jfb) op==10xx0 should be unreachable from here:
329 # the previous table should handle it. 329 # the previous table should handle it.
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
405 Adr_Rule_10_A2_P32 405 Adr_Rule_10_A2_P32
406 cccc001001001111ddddiiiiiiiiiiii 406 cccc001001001111ddddiiiiiiiiiiii
407 | 00101 1111 = Forbidden # SUBS PC, LR and related instructions 407 | 00101 1111 = Forbidden # SUBS PC, LR and related instructions
408 | 0011x - = Binary2RegisterImmediateOp 408 | 0011x - = Binary2RegisterImmediateOp
409 => Defs12To15 409 => Defs12To15
410 Rsb_Rule_142_A1_P284 410 Rsb_Rule_142_A1_P284
411 cccc0010011snnnnddddiiiiiiiiiiii NotRdIsPcAndS 411 cccc0010011snnnnddddiiiiiiiiiiii NotRdIsPcAndS
412 | 0100x ~1111 = Binary2RegisterImmediateOp 412 | 0100x ~1111 = Binary2RegisterImmediateOp
413 => Defs12To15 413 => Defs12To15
414 Add_Rule_5_A1_P22 414 Add_Rule_5_A1_P22
415 cccc0010100snnnnddddiiiiiiiiiiii 415 cccc0010100snnnnddddiiiiiiiiiiii
416 NeitherRdIsPcAndSNorRnIsPcAndNotS 416 NeitherRdIsPcAndSNorRnIsPcAndNotS
417 # Note: Table says that op=0100x for ADR, but 417 # Note: Table says that op=0100x for ADR, but
418 # patterns for ADR do not match (page A8-32). 418 # patterns for ADR do not match (page A8-32).
419 # Causes parsing conflicts with ADD (previous 419 # Causes parsing conflicts with ADD (previous
420 # row). Added restriction to ADR that bit 20 420 # row). Added restriction to ADR that bit 20
421 # (updates flags register) must be 0 (rather than 421 # (updates flags register) must be 0 (rather than
422 # x), to match what is on A8.6.10 (page A8-32). 422 # x), to match what is on A8.6.10 (page A8-32).
423 # Note that this also matches restrictions of 423 # Note that this also matches restrictions of
424 # A8.6.5 (page A8-22). 424 # A8.6.5 (page A8-22).
425 | 01000 1111 = Unary1RegisterImmediateOp 425 | 01000 1111 = Unary1RegisterImmediateOp
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
501 cccc00000100hhhhllllmmmm1001nnnn RegsNotPc (v6) 501 cccc00000100hhhhllllmmmm1001nnnn RegsNotPc (v6)
502 | 0101 = Undefined 502 | 0101 = Undefined
503 | 0110 = Binary4RegisterDualOp 503 | 0110 = Binary4RegisterDualOp
504 => Defs16To19CondsDontCareRdRaRmRnNotPc 504 => Defs16To19CondsDontCareRdRaRmRnNotPc
505 Mls_Rule_95_A1_P192 505 Mls_Rule_95_A1_P192
506 cccc00000110ddddaaaammmm1001nnnn RegsNotPc (v6T2) 506 cccc00000110ddddaaaammmm1001nnnn RegsNotPc (v6T2)
507 | 0111 = Undefined 507 | 0111 = Undefined
508 | 100x = Binary4RegisterDualResult 508 | 100x = Binary4RegisterDualResult
509 => Defs12To19CondsDontCareRdRmRnNotPc 509 => Defs12To19CondsDontCareRdRmRnNotPc
510 Umull_Rule_246_A1_P486 510 Umull_Rule_246_A1_P486
511 cccc0000100shhhhllllmmmm1001nnnn RegsNotPc 511 cccc0000100shhhhllllmmmm1001nnnn RegsNotPc
512 | 101x = Binary4RegisterDualResult 512 | 101x = Binary4RegisterDualResult
513 => Defs12To19CondsDontCareRdRmRnNotPc 513 => Defs12To19CondsDontCareRdRmRnNotPc
514 Umlal_Rule_245_A1_P484 514 Umlal_Rule_245_A1_P484
515 cccc0000101shhhhllllmmmm1001nnnn RegsNotPc 515 cccc0000101shhhhllllmmmm1001nnnn RegsNotPc
516 | 110x = Binary4RegisterDualResult 516 | 110x = Binary4RegisterDualResult
517 => Defs12To19CondsDontCareRdRmRnNotPc 517 => Defs12To19CondsDontCareRdRmRnNotPc
518 Smull_Rule_179_A1_P356 518 Smull_Rule_179_A1_P356
519 cccc0000110shhhhllllmmmm1001nnnn RegsNotPc 519 cccc0000110shhhhllllmmmm1001nnnn RegsNotPc
520 | 111x = Binary4RegisterDualResult 520 | 111x = Binary4RegisterDualResult
521 => Defs12To19CondsDontCareRdRmRnNotPc 521 => Defs12To19CondsDontCareRdRmRnNotPc
522 Smlal_Rule_168_A1_P334 522 Smlal_Rule_168_A1_P334
523 cccc0000111shhhhllllmmmm1001nnnn RegsNotPc 523 cccc0000111shhhhllllmmmm1001nnnn RegsNotPc
524 +-- 524 +--
525 525
526 +-- saturating_addition_and_subtraction (See Section A5.2.6) 526 +-- saturating_addition_and_subtraction (See Section A5.2.6)
527 | op(22:21) 527 | op(22:21)
528 | 00 = Binary3RegisterOpAltB 528 | 00 = Binary3RegisterOpAltB
529 => Defs12To15CondsDontCareRnRdRmNotPc 529 => Defs12To15CondsDontCareRnRdRmNotPc
(...skipping 25 matching lines...) Expand all
555 # bit is in bit 6. 555 # bit is in bit 6.
556 | 01 0 = Binary4RegisterDualOp 556 | 01 0 = Binary4RegisterDualOp
557 => Defs16To19CondsDontCareRdRaRmRnNotPc 557 => Defs16To19CondsDontCareRdRaRmRnNotPc
558 Smlawx_Rule_171_A1_340 558 Smlawx_Rule_171_A1_340
559 cccc00010010ddddaaaammmm1x00nnnn RegsNotPc (v5TE) 559 cccc00010010ddddaaaammmm1x00nnnn RegsNotPc (v5TE)
560 # Implements Smulwb and Smulwt where the t/b (x) 560 # Implements Smulwb and Smulwt where the t/b (x)
561 # bit is in bit 6. 561 # bit is in bit 6.
562 | 01 1 = Binary3RegisterOpAltA 562 | 01 1 = Binary3RegisterOpAltA
563 => Defs16To19CondsDontCareRdRmRnNotPc 563 => Defs16To19CondsDontCareRdRmRnNotPc
564 Smulwx_Rule_180_A1_P358 564 Smulwx_Rule_180_A1_P358
565 cccc00010010dddd0000mmmm1x10nnnn RegsNotPc (v5TE) 565 cccc00010010dddd0000mmmm1x10nnnn RegsNotPc (v5TE)
566 # Implements Smlalbb, Smlalbt, Smlaltb, and Smlaltt 566 # Implements Smlalbb, Smlalbt, Smlaltb, and Smlaltt
567 # where the t/b bits (xx) are in bits 5:6. 567 # where the t/b bits (xx) are in bits 5:6.
568 | 10 - = Binary4RegisterDualResult 568 | 10 - = Binary4RegisterDualResult
569 => Defs12To19CondsDontCareRdRmRnNotPc 569 => Defs12To19CondsDontCareRdRmRnNotPc
570 Smlalxx_Rule_169_A1_P336 570 Smlalxx_Rule_169_A1_P336
571 cccc00010100hhhhllllmmmm1xx0nnnn RegsNotPc (v5TE) 571 cccc00010100hhhhllllmmmm1xx0nnnn RegsNotPc (v5TE)
572 # Implements Smulbb, Smulbt, Smultb, and Smultt 572 # Implements Smulbb, Smulbt, Smultb, and Smultt
573 # where the t/b bits (xx) are in bits 5:6. 573 # where the t/b bits (xx) are in bits 5:6.
574 | 11 - = Binary3RegisterOpAltA 574 | 11 - = Binary3RegisterOpAltA
575 => Defs16To19CondsDontCareRdRmRnNotPc 575 => Defs16To19CondsDontCareRdRmRnNotPc
576 Smulxx_Rule_178_P354 576 Smulxx_Rule_178_P354
577 cccc00010110dddd0000mmmm1xx0nnnn RegsNotPc (v5TE) 577 cccc00010110dddd0000mmmm1xx0nnnn RegsNotPc (v5TE)
578 +-- 578 +--
579 579
580 +-- extra_load_store_instructions (See Section A5.2.8) 580 +-- extra_load_store_instructions (See Section A5.2.8)
581 | op2(6:5) op1(24:20) Rn(19:16) 581 | op2(6:5) op1(24:20) Rn(19:16)
582 # Note the following encodings which lead to a different table and aren't 582 # Note the following encodings which lead to a different table and aren't
583 # handled in this table. 583 # handled in this table.
584 # TODO(jfb) Should we make them Forbidden? 584 # TODO(jfb) Should we mark them as unreachable?
585 # 00 - - ->data_processing_and_miscellaneous_instructions 585 # 00 - - ->data_processing_and_miscellaneous_instructions
586 # - 0xx11 - " 586 # - 0xx11 - "
587 # 0x 0xx10 - " 587 # 0x 0xx10 - "
588 # 588 #
589 | 01 xx0x0 - = Store3RegisterOp => StoreBasedOffsetMemory 589 | 01 xx0x0 - = Store3RegisterOp => StoreBasedOffsetMemory
590 Strh_Rule_208_A1_P412 590 Strh_Rule_208_A1_P412
591 cccc000pu0w0nnnntttt00001011mmmm 591 cccc000pu0w0nnnntttt00001011mmmm
592 | " xx0x1 - = Load3RegisterOp => LoadBasedOffsetMemory 592 | " xx0x1 - = Load3RegisterOp => LoadBasedOffsetMemory
593 Ldrh_Rule_76_A1_P156 593 Ldrh_Rule_76_A1_P156
594 cccc000pu0w1nnnntttt00001011mmmm 594 cccc000pu0w1nnnntttt00001011mmmm
595 | " xx1x0 - = Store2RegisterImm8Op 595 | " xx1x0 - = Store2RegisterImm8Op
596 => StoreBasedImmedMemory 596 => StoreBasedImmedMemory
597 Strh_Rule_207_A1_P410 597 Strh_Rule_207_A1_P410
598 cccc000pu1w0nnnnttttiiii1011iiii 598 cccc000pu1w0nnnnttttiiii1011iiii
599 | " xx1x1 ~1111 = Load2RegisterImm8Op 599 | " xx1x1 ~1111 = Load2RegisterImm8Op
600 => LoadBasedImmedMemory 600 => LoadBasedImmedMemory
601 Ldrh_Rule_74_A1_P152 601 Ldrh_Rule_74_A1_P152
602 cccc000pu1w1nnnnttttiiii1011iiii 602 cccc000pu1w1nnnnttttiiii1011iiii
603 | " " 1111 = Load2RegisterImm8Op 603 | " " 1111 = Load2RegisterImm8Op
604 => LoadBasedImmedMemory 604 => LoadBasedImmedMemory
605 Ldrh_Rule_75_A1_P154 605 Ldrh_Rule_75_A1_P154
606 cccc0001u1011111ttttiiii1011iiii 606 cccc0001u1011111ttttiiii1011iiii
607 | 10 xx0x0 - = Load3RegisterDoubleOp 607 | 10 xx0x0 - = Load3RegisterDoubleOp
608 => LoadBasedOffsetMemoryDouble 608 => LoadBasedOffsetMemoryDouble
609 Ldrd_Rule_68_A1_P140 609 Ldrd_Rule_68_A1_P140
610 cccc000pu0w0nnnntttt00001101mmmm (v5TE) 610 cccc000pu0w0nnnntttt00001101mmmm (v5TE)
611 | " xx0x1 - = Load3RegisterOp => LoadBasedOffsetMemory 611 | " xx0x1 - = Load3RegisterOp => LoadBasedOffsetMemory
612 Ldrsb_Rule_80_A1_P164 612 Ldrsb_Rule_80_A1_P164
613 cccc000pu0w1nnnntttt00001101mmmm 613 cccc000pu0w1nnnntttt00001101mmmm
614 | " xx1x0 ~1111 = Load2RegisterImm8DoubleOp 614 | " xx1x0 ~1111 = Load2RegisterImm8DoubleOp
615 => LoadBasedImmedMemoryDouble 615 => LoadBasedImmedMemoryDouble
616 Ldrd_Rule_66_A1_P136 616 Ldrd_Rule_66_A1_P136
617 cccc000pu1w0nnnnttttiiii1101iiii (v5TE) 617 cccc000pu1w0nnnnttttiiii1101iiii (v5TE)
618 | " " 1111 = Load2RegisterImm8DoubleOp 618 | " " 1111 = Load2RegisterImm8DoubleOp
619 => LoadBasedImmedMemoryDouble 619 => LoadBasedImmedMemoryDouble
620 Ldrd_Rule_67_A1_P138 620 Ldrd_Rule_67_A1_P138
621 cccc0001u1001111ttttiiii1101iiii (v5TE) 621 cccc0001u1001111ttttiiii1101iiii (v5TE)
622 | " xx1x1 ~1111 = Load2RegisterImm8Op 622 | " xx1x1 ~1111 = Load2RegisterImm8Op
623 => LoadBasedImmedMemory 623 => LoadBasedImmedMemory
624 Ldrsb_Rule_78_A1_P160 624 Ldrsb_Rule_78_A1_P160
625 cccc000pu1w1nnnnttttiiii1101iiii 625 cccc000pu1w1nnnnttttiiii1101iiii
626 | " " 1111 = Load2RegisterImm8Op 626 | " " 1111 = Load2RegisterImm8Op
627 => LoadBasedImmedMemory 627 => LoadBasedImmedMemory
628 ldrsb_Rule_79_A1_162 628 ldrsb_Rule_79_A1_162
629 cccc0001u1011111ttttiiii1101iiii 629 cccc0001u1011111ttttiiii1101iiii
(...skipping 17 matching lines...) Expand all
647 Ldrsh_Rule_83_A1_P170 647 Ldrsh_Rule_83_A1_P170
648 cccc0001u1011111ttttiiii1111iiii 648 cccc0001u1011111ttttiiii1111iiii
649 +-- 649 +--
650 650
651 # extra_load_store_instructions_unpriviledged (See section A5.2.9) 651 # extra_load_store_instructions_unpriviledged (See section A5.2.9)
652 # Table omitted: modeled as Forbidden. 652 # Table omitted: modeled as Forbidden.
653 # They are not expected in user code. 653 # They are not expected in user code.
654 654
655 +-- synchronization_primitives (See Section A5.2.10) 655 +-- synchronization_primitives (See Section A5.2.10)
656 | op(23:20) 656 | op(23:20)
657 | 0x00 = Deprecated # SWP, SWPB TODO(karl): model these? a8-432 657 # SWP/SWPB are OPTIONAL+deprecated in v7 with the Virtualization
658 # Extension, and OBSOLETE+UNDEFINED in v8 aarch32.
659 | 0x00 = Deprecated # SWP/SWPB
Karl 2012/08/28 19:32:35 Note: This probably doesn't parse the way you expe
Please use jfb - chromium.org 2012/08/28 22:19:21 Done.
660 cccc00010b00nnnntttt00001001tttt
658 | 1000 = StoreExclusive3RegisterOp => StoreBasedMemoryRtBits0To3 661 | 1000 = StoreExclusive3RegisterOp => StoreBasedMemoryRtBits0To3
659 Strex_Rule_202_A1_P400 662 Strex_Rule_202_A1_P400
660 cccc00011000nnnndddd11111001tttt (v6) 663 cccc00011000nnnndddd11111001tttt (v6)
661 | 1001 = LoadExclusive2RegisterOp => LoadBasedMemory 664 | 1001 = LoadExclusive2RegisterOp => LoadBasedMemory
662 Ldrex_Rule_69_A1_P142 665 Ldrex_Rule_69_A1_P142
663 cccc00011001nnnntttt111110011111 (v6) 666 cccc00011001nnnntttt111110011111 (v6)
664 | 1010 = StoreExclusive3RegisterDoubleOp 667 | 1010 = StoreExclusive3RegisterDoubleOp
665 => StoreBasedMemoryDoubleRtBits0To3 668 => StoreBasedMemoryDoubleRtBits0To3
666 Strexd_Rule_204_A1_P404 669 Strexd_Rule_204_A1_P404
667 cccc00011010nnnndddd11111001tttt (v6K) 670 cccc00011010nnnndddd11111001tttt (v6K)
668 | 1011 = LoadExclusive2RegisterDoubleOp => LoadBasedMemoryDouble 671 | 1011 = LoadExclusive2RegisterDoubleOp => LoadBasedMemoryDouble
669 Ldrexd_Rule_71_A1_P146 672 Ldrexd_Rule_71_A1_P146
670 cccc00011011nnnntttt111110011111 (v6K) 673 cccc00011011nnnntttt111110011111 (v6K)
671 | 1100 = StoreExclusive3RegisterOp => StoreBasedMemoryRtBits0To3 674 | 1100 = StoreExclusive3RegisterOp => StoreBasedMemoryRtBits0To3
672 Strexb_Rule_203_A1_P402 675 Strexb_Rule_203_A1_P402
673 cccc00011100nnnndddd11111001tttt (v6K) 676 cccc00011100nnnndddd11111001tttt (v6K)
674 | 1101 = LoadExclusive2RegisterOp => LoadBasedMemory 677 | 1101 = LoadExclusive2RegisterOp => LoadBasedMemory
675 Ldrexb_Rule_70_A1_P144 678 Ldrexb_Rule_70_A1_P144
676 cccc00011101nnnndddd111110011111 (v6K) 679 cccc00011101nnnntttt111110011111 (v6K)
677 | 1110 = StoreExclusive3RegisterOp => StoreBasedMemoryRtBits0To3 680 | 1110 = StoreExclusive3RegisterOp => StoreBasedMemoryRtBits0To3
678 Strexh_Rule_205_A1_P406 681 Strexh_Rule_205_A1_P406
679 cccc00011110nnnndddd11111001tttt (v6K) 682 cccc00011110nnnndddd11111001tttt (v6K)
680 | 1111 = LoadExclusive2RegisterOp => LoadBasedMemory 683 | 1111 = LoadExclusive2RegisterOp => LoadBasedMemory
681 Ldrexh_Rule_72_A1_P148 684 Ldrexh_Rule_72_A1_P148
682 cccc00011111nnnntttt111110011111 (v6K) 685 cccc00011111nnnntttt111110011111 (v6K)
683 | else: = Undefined (v6K) # Note on page A5-16 686 | else: = Undefined # Note on page A5-16
684 +-- 687 +--
685 688
686 +-- msr_immediate_and_hints (See Section A5.2.11) 689 +-- msr_immediate_and_hints (See Section A5.2.11)
687 | op(22) op1(19:16) op2(7:0) 690 | op(22) op1(19:16) op2(7:0)
688 | 0 0000 0000_0000 = CondNop => DontCareInst 691 | 0 0000 0000_0000 = CondNop => DontCareInst
689 Nop_Rule_110_A1_P222 692 Nop_Rule_110_A1_P222
690 cccc0011001000001111000000000000 (v6K,v6T2) 693 cccc0011001000001111000000000000 (v6K,v6T2)
691 | " " 0000_0001 = CondNop => DontCareInst 694 | " " 0000_0001 = CondNop => DontCareInst
692 Yield_Rule_413_A1_P812 695 Yield_Rule_413_A1_P812
693 cccc0011001000001111000000000001 (v6K) 696 cccc0011001000001111000000000001 (v6K)
(...skipping 14 matching lines...) Expand all
708 Sev_Rule_158_A1_P316 711 Sev_Rule_158_A1_P316
709 cccc0011001000001111000000000100 (v6K) 712 cccc0011001000001111000000000100 (v6K)
710 | " " 1111_xxxx = CondNop => DontCareInst 713 | " " 1111_xxxx = CondNop => DontCareInst
711 Dbg_Rule_40_A1_P88 714 Dbg_Rule_40_A1_P88
712 cccc001100100000111100001111iiii (v7) 715 cccc001100100000111100001111iiii (v7)
713 | " 0100 - = MoveImmediate12ToApsr => DontCareInst 716 | " 0100 - = MoveImmediate12ToApsr => DontCareInst
714 # Note: DontCareInst will act like the 717 # Note: DontCareInst will act like the
715 # conditions flag is always changed, which 718 # conditions flag is always changed, which
716 # is a safe presumption. 719 # is a safe presumption.
717 Msr_Rule_103_A1_P208 720 Msr_Rule_103_A1_P208
718 | " 1x00 " " 721 cccc0011001001001111iiiiiiiiiiii
Karl 2012/08/28 19:32:35 This action can be repeated with " (on the next li
Please use jfb - chromium.org 2012/08/28 22:19:21 Done (added TODO).
722 | " 1x00 " = MoveImmediate12ToApsr => DontCareInst
723 # Same note as above.
724 Msr_Rule_103_A1_P208
725 cccc001100101x001111iiiiiiiiiiii
719 | " xx01 - = ForbiddenCondNop => Forbidden 726 | " xx01 - = ForbiddenCondNop => Forbidden
720 Msr_Rule_B6_1_6_A1_PB6_12 727 Msr_Rule_B6_1_6_A1_PB6_12
721 cccc00110010ii011111iiiiiiiiiiii 728 cccc00110010ii011111iiiiiiiiiiii
722 # MSR(immediate), ring0 version 729 # MSR(immediate), ring0 version
723 | " xx1x - = ForbiddenCondNop => Forbidden 730 | " xx1x - = ForbiddenCondNop => Forbidden
724 Msr_Rule_B6_1_6_A1_PB6_12 731 Msr_Rule_B6_1_6_A1_PB6_12
725 cccc00110010ii1i1111iiiiiiiiiiii 732 cccc00110010ii1i1111iiiiiiiiiiii
726 # MSR(immediate), ring0 version 733 # MSR(immediate), ring0 version
727 | 1 - - = ForbiddenCondNop => Forbidden 734 | 1 - - = ForbiddenCondNop => Forbidden
728 Msr_Rule_B6_1_6_A1_PB6_12 735 Msr_Rule_B6_1_6_A1_PB6_12
729 cccc00110110iiii1111iiiiiiiiiiii 736 cccc00110110iiii1111iiiiiiiiiiii
730 # MSR(immediate), ring0 version 737 # MSR(immediate), ring0 version
731 | else: = Forbidden # Unallocated hints, page A5-17 738 | else: = Forbidden # Unallocated hints, page A5-17
732 +-- 739 +--
733 740
734 +-- miscellaneous_instructions (See Section A5.2.12) 741 +-- miscellaneous_instructions (See Section A5.2.12)
735 | op2(6:4) op(22:21) op1(19:16) 742 | op2(6:4) B(9) op(22:21) op1(19:16)
736 | 000 x0 xxxx = Unary1RegisterSet 743 | 000 1 x0 xxxx = ForbiddenCondNop => Forbidden
737 Mrs_Rule_102_A1_P206_Or_B6_10 744 # MSR (Banked register)
Karl 2012/08/28 19:32:35 Warning: This isn't probably parsing the way you t
Please use jfb - chromium.org 2012/08/28 22:19:21 Done.
738 cccc00010r001111dddd000000000000 745 cccc00010r00mmmmdddd001m00000000 (v7VE)
739 | " 01 xx00 = Unary1RegisterUse 746 | " " x1 " = ForbiddenCondNop => Forbidden
740 Msr_Rule_104_A1_P210 747 # MSR (Banked register)
Karl 2012/08/28 19:32:35 Same here.
Please use jfb - chromium.org 2012/08/28 22:19:21 Done.
741 cccc00010010mm00111100000000nnnn 748 cccc00010r10mmmm1111001m0000nnnn (v7VE)
742 | " 01 xx01 = ForbiddenCondNop => Forbidden 749 | " 0 x0 xxxx = Unary1RegisterSet
743 Msr_Rule_B6_1_7_P14 750 Mrs_Rule_102_A1_P206_Or_B6_10
744 cccc00010010mm01111100000000nnnn 751 cccc00010r001111dddd000000000000
745 | " " xx1x = ForbiddenCondNop => Forbidden 752 | " " 01 xx00 = Unary1RegisterUse
746 Msr_Rule_B6_1_7_P14 753 Msr_Rule_104_A1_P210
747 cccc00010010mm1m111100000000nnnn 754 cccc00010010mm00111100000000nnnn
748 | " 11 - = ForbiddenCondNop => Forbidden 755 | " " 01 xx01 = ForbiddenCondNop => Forbidden
749 Msr_Rule_B6_1_7_P14 756 Msr_Rule_B6_1_7_P14
750 cccc00010110mmmm111100000000nnnn 757 cccc00010010mm01111100000000nnnn
751 | 001 01 - = BranchToRegister => BxBlx 758 | " " " xx1x = ForbiddenCondNop => Forbidden
752 Bx_Rule_25_A1_P62 759 Msr_Rule_B6_1_7_P14
753 cccc000100101111111111110001mmmm (v4T) 760 cccc00010010mm1m111100000000nnnn
754 | " 11 - = Unary2RegisterOpNotRmIsPc 761 | " " 11 - = ForbiddenCondNop => Forbidden
755 => Defs12To15RdRnNotPc 762 Msr_Rule_B6_1_7_P14
756 Clz_Rule_31_A1_P72 763 cccc00010110mmmm111100000000nnnn
757 cccc000101101111dddd11110001mmmm (v6) 764 | 001 - 01 - = BranchToRegister => BxBlx
758 | 010 01 - = ForbiddenCondNop => Forbidden 765 Bx_Rule_25_A1_P62
759 Bxj_Rule_26_A1_P64 766 cccc000100101111111111110001mmmm (v4T)
760 cccc000100101111111111110010mmmm 767 | " - 11 - = Unary2RegisterOpNotRmIsPc
761 | 011 01 - = BranchToRegister => BxBlx 768 => Defs12To15RdRnNotPc
762 Blx_Rule_24_A1_P60 769 Clz_Rule_31_A1_P72
763 cccc000100101111111111110011mmmm 770 cccc000101101111dddd11110001mmmm (v5T)
764 RegsNotPc (v5T) 771 | 010 - 01 - = ForbiddenCondNop => Forbidden
765 | 101 - - ->saturating_addition_and_subtraction 772 Bxj_Rule_26_A1_P64
766 | 111 01 - = BreakPointAndConstantPoolHead 773 cccc000100101111111111110010mmmm (v5TEJ)
767 => Breakpoint 774 | 011 - 01 - = BranchToRegister => BxBlx
768 Bkpt_Rule_22_A1_P56 775 Blx_Rule_24_A1_P60
769 cccc00010010iiiiiiiiiiii0111iiii (v5T) 776 cccc000100101111111111110011mmmm
770 | 111 11 - = ForbiddenCondNop => Forbidden 777 RegsNotPc (v5T)
771 Smc_Rule_B6_1_9_P18 778 | 101 - - - ->saturating_addition_and_subtraction
772 cccc000101100000000000000111mmmm 779 | 110 - 11 - = ForbiddenCondNop => Forbidden
773 | else: = Undefined # Note on page A5-18 780 # ERET
781 cccc0001011000000000000001101110 (v7VE)
782 | 111 - 01 - = BreakPointAndConstantPoolHead
783 => Breakpoint
784 Bkpt_Rule_22_A1_P56
785 cccc00010010iiiiiiiiiiii0111iiii (v5T)
786 | " - 10 - = ForbiddenCondNop => Forbidden
787 # HVC
788 cccc00010100iiiiiiiiiiii0111iiii (v7VE)
789 | " - 11 - = ForbiddenCondNop => Forbidden
790 Smc_Rule_B6_1_9_P18
791 cccc000101100000000000000111iiii (SE)
792 | else: = Undefined # Note on page A5-18
774 +-- 793 +--
775 794
776 +-- load_store_word_and_unsigned_byte (See Section A5.3) 795 +-- load_store_word_and_unsigned_byte (See Section A5.3)
777 # Note: Column op1 is repeated so that several rows can define 796 # Note: Column op1 is repeated so that several rows can define
778 # (anded) multiple test conditions for this row. 797 # (anded) multiple test conditions for this row.
779 | A(25) op1(24:20) B(4) Rn(19:16) op1_repeated(24:20) 798 | A(25) op1(24:20) B(4) Rn(19:16) op1_repeated(24:20)
780 | 0 xx0x0 - - ~0x010 -> load_store_word_and_unsigned_byte_s tr_or_push 799 | 0 xx0x0 - - ~0x010 -> load_store_word_and_unsigned_byte_s tr_or_push
781 | 1 xx0x0 0 - ~0x010 800 | 1 xx0x0 0 - ~0x010
782 = Store3RegisterImm5Op 801 = Store3RegisterImm5Op
783 => StoreBasedOffsetMemory 802 => StoreBasedOffsetMemory
784 Str_Rule_195_A1_P386 803 Str_Rule_195_A1_P386
785 cccc011pd0w0nnnnttttiiiiitt0mmmm 804 cccc011pd0w0nnnnttttiiiiitt0mmmm
786 # STRT (rule 210, A1 and A2, page 416) define unprivledge stores, which 805 # STRT (rule 210, A1 and A2, page 416) define unprivledge stores, which
787 # NaCl doesn't allow. 806 # NaCl doesn't allow.
788 | 0 0x010 - - - = Forbidden 807 | 0 0x010 - - - = Forbidden
789 | 1 0x010 0 - - = Forbidden 808 | 1 0x010 0 - - = Forbidden
790 | 0 xx0x1 - ~1111 ~0x011 809 | 0 xx0x1 - ~1111 ~0x011
791 = Load2RegisterImm12Op 810 = Load2RegisterImm12Op
792 => LoadBasedImmedMemory 811 => LoadBasedImmedMemory
793 Ldr_Rule_58_A1_P120 812 Ldr_Rule_58_A1_P120
794 cccc010pd0w1nnnnttttiiiiiiiiiiii NotRnIsPc 813 cccc010pd0w1nnnnttttiiiiiiiiiiii NotRnIsPc
795 | " xx0x1 " 1111 ~0x011 814 | " xx0x1 " 1111 ~0x011
796 = Load2RegisterImm12Op 815 = Load2RegisterImm12Op
797 => LoadBasedImmedMemory 816 => LoadBasedImmedMemory
798 Ldr_Rule_59_A1_P122 817 Ldr_Rule_59_A1_P122
799 cccc0101d0011111ttttiiiiiiiiiiii 818 cccc0101d0011111ttttiiiiiiiiiiii
800 | 1 xx0x1 0 - ~0x011 819 | 1 xx0x1 0 - ~0x011
801 = Load3RegisterImm5Op => LoadBasedOffsetMemor y 820 = Load3RegisterImm5Op => LoadBasedOffsetMemor y
802 Ldr_Rule_60_A1_P124 821 Ldr_Rule_60_A1_P124
803 cccc011pd0w1nnnnttttiiiiitt0mmmm 822 cccc011pd0w1nnnnttttiiiiitt0mmmm
804 # LDRT (rule 86, A1 and A2, page 176) define unprivledge loads, which 823 # LDRT (rule 86, A1 and A2, page 176) define unprivledge loads, which
805 # NaCl doesn't allow. 824 # NaCl doesn't allow.
(...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after
1284 cccc100pu1w1nnnn1rrrrrrrrrrrrrrr 1303 cccc100pu1w1nnnn1rrrrrrrrrrrrrrr
1285 | 10xxxx - = BranchImmediate24 => Branch 1304 | 10xxxx - = BranchImmediate24 => Branch
1286 B_Rule_16_A1_P44 1305 B_Rule_16_A1_P44
1287 cccc1010iiiiiiiiiiiiiiiiiiiiiiii 1306 cccc1010iiiiiiiiiiiiiiiiiiiiiiii
1288 | 11xxxx - = BranchImmediate24 => Branch 1307 | 11xxxx - = BranchImmediate24 => Branch
1289 Bl_Blx_Rule_23_A1_P58 1308 Bl_Blx_Rule_23_A1_P58
1290 cccc1011iiiiiiiiiiiiiiiiiiiiiiii 1309 cccc1011iiiiiiiiiiiiiiiiiiiiiiii
1291 +-- 1310 +--
1292 1311
1293 +-- coprocessor_instructions_and_supervisor_call (See Section A5.6) 1312 +-- coprocessor_instructions_and_supervisor_call (See Section A5.6)
1294 # Note: We currently only allow floating point (and advanced SIMD) 1313 # Note: We currently only allow floating point (and advanced SIMD)
1295 # coprocessor operations (coproc=101x). 1314 # coprocessor operations (coproc=101x).
1296 # Note: Column op1 is repeated so that the first three rows can define 1315 # Note: Column op1 is repeated so that the first three rows can define
1297 # (anded) multiple test conditions for this row. 1316 # (anded) multiple test conditions for this row.
1298 | op1(25:20) op(4) coproc(11:8) Rn(19:16) op1_repeated(25:20) 1317 | op1(25:20) op(4) coproc(11:8) Rn(19:16) op1_repeated(25:20)
1299 | 0xxxxx - 101x - ~000x0x 1318 | 0xxxxx - 101x - ~000x0x
1300 -> extension_register_load_store_instructions 1319 -> extension_register_load_store_instructions
1301 | 0xxxx0 - ~101x - ~000x0x 1320 | 0xxxx0 - ~101x - ~000x0x
1302 # Note: Never safe since coproc!=101x 1321 # Note: Never safe since coproc!=101x
1303 = Forbidden # STC A8-372 1322 = Forbidden # STC A8-372
1304 | 0xxxx1 - ~101x ~1111 ~000x0x 1323 | 0xxxx1 - ~101x ~1111 ~000x0x
1305 # Note: Never safe since coproc!=101x 1324 # Note: Never safe since coproc!=101x
1306 = Forbidden # LDC(immediate), LDC2(immediate) A8-106 1325 = Forbidden # LDC(immediate), LDC2(immediate) A8-106
1307 | " " " 1111 - 1326 | " " " 1111 -
1308 # Note: Never safe since coproc!=101x 1327 # Note: Never safe since coproc!=101x
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1356 | " x1 = CondVfpOp => VfpOp 1375 | " x1 = CondVfpOp => VfpOp
1357 Vsub_Rule_402_A2_P790 1376 Vsub_Rule_402_A2_P790
1358 cccc11100d11nnnndddd101sn1m0mmmm 1377 cccc11100d11nnnndddd101sn1m0mmmm
1359 | 1x00 x0 = CondVfpOp => VfpOp 1378 | 1x00 x0 = CondVfpOp => VfpOp
1360 Vdiv_Rule_301_A1_P590 1379 Vdiv_Rule_301_A1_P590
1361 cccc11101d00nnnndddd101sn0m0mmmm 1380 cccc11101d00nnnndddd101sn0m0mmmm
1362 | 1x11 - -> other_floating_point_data_processing_instructions 1381 | 1x11 - -> other_floating_point_data_processing_instructions
1363 +-- 1382 +--
1364 1383
1365 +-- other_floating_point_data_processing_instructions (A7.5 Table A7-17, page 17 -25) 1384 +-- other_floating_point_data_processing_instructions (A7.5 Table A7-17, page 17 -25)
1366 # Other VPD data-processing, CDP instructions for coprocessors 10/11. 1385 # Other VPD data-processing, CDP instructions for coprocessors 10/11.
1367 # 1386 #
1368 # Note: Currently, all instructions use class CoprocessorOp 1387 # Note: Currently, all instructions use class CoprocessorOp
1369 # to follow what the previous version of the ARM validator did. 1388 # to follow what the previous version of the ARM validator did.
1370 # 1389 #
1371 # TODO(karl): Fix the class decoders to do the right thing. 1390 # TODO(karl): Fix the class decoders to do the right thing.
1372 | opc2(19:16) opc3(7:6) 1391 | opc2(19:16) opc3(7:6)
1373 | - x0 = CondVfpOp => VfpOp 1392 | - x0 = CondVfpOp => VfpOp
1374 Vmov_Rule_326_A2_P640 1393 Vmov_Rule_326_A2_P640
1375 cccc11101d11iiiidddd101s0000iiii 1394 cccc11101d11iiiidddd101s0000iiii
1376 | 0000 01 = CondVfpOp => VfpOp 1395 | 0000 01 = CondVfpOp => VfpOp
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
1501 | C(8) op(7:4) 1520 | C(8) op(7:4)
1502 | 0 00x1 # TODO(karl): Fix this to do the right thing. 1521 | 0 00x1 # TODO(karl): Fix this to do the right thing.
1503 # VMOV A8-650 1522 # VMOV A8-650
1504 = MoveDoubleFromCoprocessor 1523 = MoveDoubleFromCoprocessor
1505 | 1 00x1 # TODO(karl): Fix this to do the right thing. 1524 | 1 00x1 # TODO(karl): Fix this to do the right thing.
1506 # VMOV A8-652 1525 # VMOV A8-652
1507 = MoveDoubleFromCoprocessor 1526 = MoveDoubleFromCoprocessor
1508 +-- 1527 +--
1509 1528
1510 +-- unconditional_instructions (See Section A5.7) 1529 +-- unconditional_instructions (See Section A5.7)
1511 # Note: We currently only allow floating point (and advanced SIMD) 1530 # Note: We currently only allow floating point (and advanced SIMD)
1512 # coprocessor operations (coproc=101x). 1531 # coprocessor operations (coproc=101x).
1513 # 1532 #
1514 # Note: Most instructions in this table are forbidden because they 1533 # Note: Most instructions in this table are forbidden because they
1515 # aren't specific to the Vfp coprocessors (10, 11). 1534 # aren't specific to the Vfp coprocessors (10, 11).
1516 | op1(27:20) op(4) Rn(19:16) 1535 | op1(27:20) op(4) Rn(19:16)
1517 | 0xxx_xxxx - - ->memory_hints_andvanced_simd_instructions_and_misc ellaneous_instructions 1536 | 0xxx_xxxx - - ->memory_hints_andvanced_simd_instructions_and_misc ellaneous_instructions
1518 # Note: These instructions are not allowed for any coprocessor. 1537 # Note: These instructions are not allowed for any coprocessor.
1519 | 100x_x1x0 - - = ForbiddenUncondNop # SRS B6-20 1538 | 100x_x1x0 - - = ForbiddenUncondNop # SRS B6-20
1520 => Forbidden (v6) 1539 => Forbidden (v6)
1521 | 100x_x0x1 - - = ForbiddenUncondNop # RFE B6-16 1540 | 100x_x0x1 - - = ForbiddenUncondNop # RFE B6-16
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
1805 | " 1001 " 1824 | " 1001 "
1806 | " 1101 =VectorLoad # VLD2(single, all lanes) 1825 | " 1101 =VectorLoad # VLD2(single, all lanes)
1807 | " 0x10 =VectorLoad # VLD3(single) 1826 | " 0x10 =VectorLoad # VLD3(single)
1808 | " 1010 " 1827 | " 1010 "
1809 | " 1110 =VectorLoad # VLD3(single, all lanes) 1828 | " 1110 =VectorLoad # VLD3(single, all lanes)
1810 | " 0x11 =VectorLoad # VLD4(single) 1829 | " 0x11 =VectorLoad # VLD4(single)
1811 | " 1011 " 1830 | " 1011 "
1812 | " 1111 =VectorLoad # VLD4(single, all lanes) 1831 | " 1111 =VectorLoad # VLD4(single, all lanes)
1813 | else: =Undefined # Note on page A7-27 1832 | else: =Undefined # Note on page A7-27
1814 +-- 1833 +--
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698