URL
https://opencores.org/ocsvn/forwardcom/forwardcom/trunk
Subversion Repositories forwardcom
[/] [forwardcom/] [testsuite/] [tests_branch.as] - Rev 162
Compare with Previous | Blame | View Log
/************************** tests_branch.as ******************************** Author: Agner Fog* date created: 2021-07-07* last modified: 2021-07-20* Version: 1.11* Project: ForwardCom Test suite, assembly code* Description: Test jump, call, and branch instructions with general* purpose registers** This test program will test jump, call, and branch instructions and* output a list of which instructions are working for int8, int16, int32,* and int64 operands.** Copyright 2021 GNU General Public License v.3 http://www.gnu.org/licenses******************************************************************************/// Library functions in libc_light.liextern _puts: function reguse=3,0 // write string + linefeed to stdoutextern _printf: function reguse=0xF,0 // write formatted string to stdoutconst section read ip // read-only data section// Text strings:text1: int8 "\nForwardCom test suite\nTest jump, call, and branch instructions" // intro text,int8 "\nPress Run to continue"int8 "\n int8 int16 int32 int64", 0 // and headingnewline: int8 "\n", 0 // newlinepress_run: int8 "\nPress Run to continue", 0format1: int8 "\n%-26s%3c%7c%7c%7c", 0 // format string for printing results// text strings for each instruction:text_sub_jz: int8 "sub/jump_zero", 0text_sub_jneg: int8 "sub/jump_neg", 0text_sub_jpos: int8 "sub/jump_pos", 0text_sub_joverfl: int8 "sub/jump_overfl", 0text_sub_jborrow: int8 "sub/jump_borrow", 0text_add_jz: int8 "add/jump_zero", 0text_add_jneg: int8 "add/jump_neg", 0text_add_jpos: int8 "add/jump_pos", 0text_add_joverfl: int8 "add/jump_overfl", 0text_add_jcarry: int8 "add/jump_carry", 0text_and_jz: int8 "and/jump_zero", 0text_or_jz: int8 "or /jump_zero", 0text_xor_jz: int8 "xor/jump_zero", 0text_test_bit_jtrue: int8 "test_bit/jump_true", 0text_test_bits_and_jtrue: int8 "test_bits_and/jump_true", 0text_test_bits_or_jtrue: int8 "test_bits_or/jump_true", 0text_compare_jequal: int8 "compare/jump_equal", 0text_compare_jsbelow: int8 "compare/jump_sbelow", 0text_compare_jsabove: int8 "compare/jump_sabove", 0text_compare_jubelow: int8 "compare/jump_ubelow", 0text_compare_juabove: int8 "compare/jump_uabove", 0text_inc_compare_jbelow: int8 "increment_compare/j_below", 0text_inc_compare_jabove: int8 "increment_compare/j_above", 0text_sub_maxlen_jpos: int8 "sub_maxlen/jump_pos", 0text_jump_relative: int8 "jump_relative pointer", 0text_call_relative: int8 "call_relative pointer", 0text_jump_relative_table: int8 "jump_relative table", 0text_call_relative_table: int8 "call_relative table", 0text_jump_absolute: int8 "jump absolute pointer", 0text_call_absolute: int8 "call absolute pointer", 0text_jump_register: int8 "jump to register", 0text_call_register: int8 "call to register", 0text_jump_32: int8 "jump 32 bit offset", 0text_call_32: int8 "call 32 bit offset", 0// not supported://text_jump_64: int8 "jump 64 bit absolute", 0//text_call_64: int8 "call 64 bit absolute", 0// relative jump tablesjumptab8: int8 (TARGET1-TARGET3)/4, (TARGET2-TARGET3)/4, 0, (TARGET4-TARGET3)/4, (TARGET5-TARGET3)/4, 0jumptab16: int16 (TARGET1-TARGET3)/4, (TARGET2-TARGET3)/4, 0, (TARGET4-TARGET3)/4, (TARGET5-TARGET3)/4, 0jumptab32: int32 (TARGET1-TARGET3)/4, (TARGET2-TARGET3)/4, 0, (TARGET4-TARGET3)/4, (TARGET5-TARGET3)/4, 0jumptab64: int64 (TARGET1-TARGET3)/4, (TARGET2-TARGET3)/4, 0, (TARGET4-TARGET3)/4, (TARGET5-TARGET3)/4, 0const endcode1 section execute // code section__entry_point function public // skip startup code_main function public/* register use:r0: bits indicating success for int8, int16, int32, int64r1: operandr2: operandr3: resultr4: scratchr6: int64 supportedr20: return address when testing jump*/// print intro text and headingint64 r0 = address [text1] // address of string//call _puts // print string and linefeedcall _printf // print string without linefeedbreakpoint // debug breakpointint r1 = 1int capab2 = write_capabilities(r1, 0) // disable error trap for unknown instructions// Test of each instruction:// Test sub/jump_zeroint r1 = 1int r0 = 1int8 r2 = sub(r1,1), jump_zero A1int r0 = 0A1:int16 r3 = sub(r2,1), jump_zero A2int32 r4 = r3 == 0xFFFFint r0 |= 2, mask = r4jump A3A2: int r0 = 0A3:int32 r3 = sub(r3,0xFFFF), jump_zero A4jump A5A4: int r0 |= 4A5:int64 r4 = sub(r0,7), jump_nzero A8int64 r1 = r0 | 1 << 60int64 r4 = sub(r1,7), jump_zero A8int r0 |= 8A8:int64 r1 = address [text_sub_jz]call print_result// Test sub/jump_negint r1 = 0x100int8 r3 = sub(r1,1), jump_neg A10int r0 = 0jump A11A10: int r0 = 1A11:int16 r3 = sub(r3,r3), jump_neg A12int r0 |= 2jump A13A12: int r0 = 0A13:int32 r2 = -8 // sub(r3,-8) would be converted to add(r3,8)int32 r3 = sub(r3, r2), jump_nneg A14jump A15A14: int r4 = r3 == 8int r0 |= 4, mask = r4A15:int64 r2 = 9int64 r4 = sub(r3,r2), jump_nneg A16int64 r5 = r4 == -1int64 r3 |= 1 << 62int64 r4 = sub(r3,r2), jump_neg A16int r0 |= 8, mask = r5A16:int64 r1 = address [text_sub_jneg]call print_result// Test sub/jump_posint r1 = 1int r2 = 0x100int8 r3 = sub(r2,r1), jump_pos A30int r0 = r3 == 0xFFjump A31A30: int r0 = 0A31:int16 r3 = sub(r1,r3), jump_pos A32int r4 = r3 == 0xFF02int r0 |= 2, mask = r4jump A33A32: int r0 = 0A33:int32 r3 = sub(r2,r2), jump_npos A34int r0 = 0jump A35A34: int r4 = r3 == 0int r0 |= 4, mask = r4A35:int64 r1 |= 1 << 62int64 r3 = sub(r1,r2), jump_npos A36int r0 |= 8A36:int64 r1 = address [text_sub_jpos]call print_result// Test sub/jump_overflowint r1 = 0xA0int r2 = 0x21int8 r3 = sub(r1,r2), jump_overfl A40int r0 = 0jump A41A40: int r0 = 1A41:int r1 = 0xA000int r2 = 0x2000int16 r3 = sub(r1,r2), jump_overfl A42int r0 |= 2jump A43A42: int r0 = 0A43:int32 r1 = 0x50000000int32 r2 = 0xD0000000int32 r3 = sub(r1,r2), jump_overfl A44int r0 = 0jump A45A44: int r0 |= 4A45:int64 r3 = sub(r1,r2), jump_noverfl A46jump A47A46: int64 r4 = r3 == 0xFFFFFFFF80000000int r0 |= 8, mask = r4A47:int64 r1 = address [text_sub_joverfl]call print_result// Test sub/jump_borrowint r1 = 0x1280int r2 = 0x1281int8 r3 = sub(r1,r2), jump_borrow A50int r0 = 0jump A51A50: int r0 = 1A51:int16 r3 = sub(r1,r2), jump_nborrow A52int32 r4 = r3 == 0x0000FFFFint r0 |= 2, mask = r4A52:int32 r3 = sub(r1,r2), jump_nborrow A54int64 r4 = r3 == 0x0000FFFFFFFFint r0 |= 4, mask = r4A54:int64 r1 |= 1 << 60int64 r3 = sub(r2,r1), jump_nborrow A56int r0 |= 8A56:int64 r1 = address [text_sub_jborrow]call print_result// Test add/jump_zeroint r1 = 0x1271int r2 = 0x128Fint8 r3 = add(r1,r2), jump_zero B0int r0 = 0jump B1B0: int r0 = 1B1:int16 r3 = add(r1,r2), jump_zero B2int r0 |= 2B2:int32 r2 = -0x1271int32 r3 = add(r1,r2), jump_nzero B4int r0 |= 4B4:int64 r3 = add(r1,r2), jump_zero B6int r0 |= 8B6:int64 r1 = address [text_add_jz]call print_result// Test add/jump_negint r1 = 0x1261int r2 = 0x1220int8 r3 = add(r1,r2), jump_neg B10int r0 = 0jump B11B10: int r0 = 1B11:int16 r3 = add(r1,r2), jump_neg B12int r0 |= 2B12:int32 r2 = -0x1262int32 r3 = add(r1,r2), jump_nneg B14int r0 |= 4B14:int64 r3 = add(r1,r2), jump_neg B16int r0 |= 8B16:int64 r1 = address [text_add_jneg]call print_result// Test add/jump_posint r1 = 0x1261int r2 = 0x1220int8 r3 = add(r1,r2), jump_npos B20int r0 = 0jump B21B20: int r0 = r3 == 0x81B21:int32 r2 = -r1int16 r3 = add(r1,r2), jump_pos B22int32 r4 = r3 == 0int r0 |= 2, mask = r4B22:int32 r3 = add(r2,0), jump_pos B24int r0 |= 4B24:int64 r3 = add(r1,r2), jump_npos B26int64 r4 = r3 == 1 << 32int r0 |= 8, mask = r4B26:int64 r1 = address [text_add_jpos]call print_result// Test add/jump_overflint32 r1 = 0x1261int32 r2 = 0x1220int8 r3 = add(r1,r2), jump_overfl B30int r0 = 0jump B31B30: int r0 = 1B31:int16 r3 = add(r1,r2), jump_overfl B32int r0 |= 2B32:int32 r2 = 0x7FFFF000int32 r3 = add(r1,r2), jump_noverfl B34int r0 |= 4B34:int64 r3 = add(r1,r2), jump_overfl B36int r0 |= 8B36:int64 r1 = address [text_add_joverfl]call print_result// Test add/jump_carryint32 r1 = 0x1261int32 r2 = 0x1220int8 r3 = add(r1,r2), jump_ncarry B40int r0 = 0jump B41B40: int r0 = 1B41:int16 r3 = add(r1,r2), jump_carry B42int r0 |= 2B42:int32 r2 = -r1int32 r3 = add(r1,r2), jump_ncarry B44int r0 |= 4B44:int64 r2 <<= 32int64 r3 = add(r2,r2), jump_ncarry B46int r0 |= 8B46:int64 r1 = address [text_add_jcarry]call print_result// Test and/jump_zeroint32 r1 = 0x0100F055int32 r2 = 0x10AAint8 r3 = and(r1,r2), jump_zero C0int r0 = 0jump C1C0: int r0 = 1C1:int16 r3 = and(r1,r2), jump_zero C2int r4 = r3 == 0x1000int r0 |= 2, mask = r4C2:int32 r2 = 0x02220FAAint32 r3 = and(r1,r2), jump_nzero C4int r0 |= 4C4:int64 r1 |= 1 << 60int64 r2 |= 1 << 60int64 r3 = and(r1,r2), jump_zero C6int64 r4 = r3 == 1 << 60int r0 |= 8, mask = r4C6:int64 r1 = address [text_and_jz]call print_result// Test or/jump_zeroint32 r1 = 0xF055int32 r2 = 0x0FAAint8 r3 = or(r1,r2), jump_zero C10int r0 = r3 == 0xFFjump C11C10: int r0 = 0C11:int r1 = 0int r2 = 0int16 r3 = or(r1,r2), jump_nzero C12int r0 |= 2C12:int32 r1 = 1 << 31int32 r3 = or(r1,r2), jump_zero C14int32 r4 = r3 == 1 << 31int r0 |= 4, mask = r4C14:int64 r1 = 1 << 32int64 r3 = or(r1,r2), jump_zero C16int64 r4 = r3 == 1 << 32int r0 |= 8, mask = r4C16:int64 r1 = address [text_or_jz]call print_result// Test xor/jump_zeroint32 r1 = 0xF055int32 r2 = r1int8 r3 = xor(r1,r2), jump_zero C20int r0 = 0jump C21C20: int r0 = 1C21:int r2 = 0int16 r3 = xor(r1,r2), jump_zero C22int32 r4 = r3 == r1int r0 |= 2, mask = r4C22:int32 r1 = -r1int32 r2 = r1int32 r3 = xor(r1,r2), jump_nzero C24int r0 |= 4C24:int64 r1 |= 1 << 63int64 r3 = xor(r1,r2), jump_zero C26int r0 |= 8C26:int64 r1 = address [text_xor_jz]call print_result// Test test_bit/jump_trueint32 r1 = 0x12345678int8 test_bit(r1,4), jump_true E0int r0 = 0jump E1E0: int r0 = 1E1:int16 test_bit(r1,8), jump_true E2int r0 |= 2E2:int32 test_bit(r1,21), jump_false E4int r0 |= 4E4:int64 test_bit(r1,33), jump_true E6int64 r1 |= 1 << 33int64 test_bit(r1,33), jump_false E6int r0 |= 8E6:int64 r1 = address [text_test_bit_jtrue]call print_result// Test test_bits_and/jump_trueint32 r1 = 0x12345678int32 r2 = 0x2670int8 test_bits_and(r1,r2), jump_true E10int r0 = 0jump E11E10: int r0 = 1E11:int16 test_bits_and(r1,r2), jump_true E12int r0 |= 2E12:int32 test_bits_and(r1,r1), jump_false E14int r0 |= 4E14:int64 r2 = r1 | 1 << 50int64 test_bits_and(r1,r2), jump_true E16int r0 |= 8E16:int64 r1 = address [text_test_bits_and_jtrue]call print_result// Test test_bits_or/jump_trueint32 r1 = 0x12345678int32 r2 = 0xC0int8 test_bits_or(r1,r2), jump_false E20int r0 = 1jump E21E20: int r0 = 0E21:int16 test_bits_or(r1,0x1001), jump_false E22int r0 |= 2E22:int32 test_bits_or(r2,0x1001), jump_true E24int r0 |= 4E24:int32 r2 = r1 ^ -1int64 test_bits_or(r2,r1), jump_false E26int r0 &= ~ 4E26:int64 r1 |= 1 << 60int64 r2 |= 1 << 60int64 test_bits_or(r2,r1), jump_false E28int r0 |= 8E28:int64 r1 = address [text_test_bits_or_jtrue]call print_resultint64 r0 = address [press_run] // press run to continuecall _printf // print stringbreakpoint// Test compare/jump_equalint32 r1 = 0x222212ABint32 r2 = 0x222213ABint8 compare(r1,r2), jump_equal F0int r0 = 0jump F1F0: int r0 = 1F1:int16 compare(r1,r2), jump_equal F2int r0 |= 2F2:int32 r2 &= ~0x100int32 compare(r1,r2), jump_nequal F4int r0 |= 4F4:int64 r1 ^= 1 << 60int64 compare(r1,r2), jump_equal F6int r0 |= 8F6:int64 r1 = address [text_compare_jequal]call print_result// Test compare/jump_sbelowint r1 = 0x1111997Fint r2 = 0x22228880int8 compare(r1,r2), jump_sbelow F10int r0 = 1jump F11F10: int r0 = 0F11:int16 compare(r1,r2), jump_sbelow F12int r0 |= 2F12:int32 compare(r1,r2), jump_saboveeq F14int r0 |= 4F14:int64 r2 |= 1 << 63int64 compare(r1,r2), jump_sbelow F16int r0 |= 8F16:int64 r1 = address [text_compare_jsbelow]call print_result// Test compare/jump_saboveint r1 = 0x1111997Fint r2 = 0x22228880int8 compare(r1,r2), jump_sbeloweq F20int r0 = 1jump F21F20: int r0 = 0F21:int16 compare(r1,r2), jump_sbeloweq F22int r0 |= 2F22:int32 compare(r1,r2), jump_sabove F24int r0 |= 4F24:int32 compare(r1,r1), jump_sbeloweq F25int r0 &= ~ 4F25:int64 r2 |= 1 << 63int64 compare(r1,r2), jump_sbeloweq F26int r0 |= 8F26:int64 r1 = address [text_compare_jsabove]call print_result// Test compare/jump_ubelowint r1 = 0x1111997Fint r2 = 0x22228880int8 compare(r1,r2), jump_ubelow F30int r0 = 0jump F31F30: int r0 = 1F31:int16 compare(r1,r2), jump_ubelow F32int r0 |= 2F32:int32 compare(r1,r2), jump_uaboveeq F34int r0 |= 4F34:int32 compare(r1,r1), jump_uaboveeq F35int r0 &= ~ 4F35:int64 compare(r1,r2), jump_uaboveeq F36int64 r1 |= 1 << 63int64 compare(r1,r2), jump_ubelow F36int r0 |= 8F36:int64 r1 = address [text_compare_jubelow]call print_result// Test compare/jump_uaboveint r1 = 0x1111997Fint r2 = 0x22228880int8 compare(r1,r2), jump_ubeloweq F40int r0 = 0jump F41F40: int r0 = 1F41:int16 compare(r1,r2), jump_ubeloweq F42int r0 |= 2F42:int32 compare(r1,r2), jump_uabove F44int r0 |= 4F44:int32 compare(r1,r1), jump_ubeloweq F45int r0 &= ~ 4F45:int64 compare(r1,r2), jump_uabove F46int64 r1 |= 1 << 63int64 compare(r1,r2), jump_ubeloweq F46int r0 |= 8F46:int64 r1 = address [text_compare_juabove]call print_result// Test inc_compare/jump_belowint r2 = 0for (int8 r1 = 0; r1 < 5; r1++) {int r2++}int r0 = r2 == 5for (int16 r1 = 0x7000; r1 < 0x7005; r1++) {int r2++}int r4 = r2 == 10int r0 |= 2, mask = r4for (int32 r1 = -2; r1 < 3; r1++) {int r2++}int32 r4 = r2 == 15int r0 |= 4, mask = r4int32 r1 = 0x7FFFFFFEint64 r3 = r1 + 5for (int64 ; r1 < r3; r1++) {int r2++}int32 r4 = r2 == 20int r0 |= 8, mask = r4int64 r1 = address [text_inc_compare_jbelow]call print_result// Test inc_compare/jump_aboveint r2 = 0for (int8 r1 = 0; r1 <= 5; r1++) {int r2++}int r0 = r2 == 6int r3 = 0x7005for (int16 r1 = 0x7000; r1 <= r3; r1++) {int r2++}int r4 = r2 == 12int r0 |= 2, mask = r4for (int32 r1 = -2; r1 <= 3; r1++) {int r2++}int32 r4 = r2 == 18int r0 |= 4, mask = r4int32 r1 = 0x7FFFFFFEint64 r3 = r1 + 5for (int64 ; r1 <= r3; r1++) {int r2++}int32 r4 = r2 == 24int r0 |= 8, mask = r4int64 r1 = address [text_inc_compare_jabove]call print_result// Test sub_maxlen/jump_pos// get max vector length without using vectors:int r6 = 0int64 r6 = sub_maxlen(r6, 3), jump_pos H1int r6 = - r6 // max vector lengthint r2 = 0H1: int r0 = 0if (int r6 > 0) { // avoid infinite loops if maxlen = 0// test all operand sizes for completeness, even though only int64 is used. int8 is likely to overflowint r1 = 4H10: int r2++int8 r1 = sub_maxlen(r1, 3), jump_pos H10int r0 = r2 == 1int r1 = r6 << 2int r2 = 0H20: int r2++int16 r1 = sub_maxlen(r1, 3), jump_pos H20int r4 = r2 == 4int r0 |= 2, mask = r4int r1 = r6 << 2int r1 += 4int r2 = 0H30: int r2++int32 r1 = sub_maxlen(r1, 3), jump_pos H30int r4 = r2 == 5int r0 |= 4, mask = r4int64 r3 = 1 << 60int64 r1 = sub_maxlen(r1, 3), jump_npos H42int r1 = r6 << 2int r1 += 4int r2 = 0H40: int r2++int64 r1 = sub_maxlen(r1, 3), jump_pos H40int r4 = r2 == 5int r0 |= 8, mask = r4H42:}int64 r1 = address [text_sub_maxlen_jpos]call print_result// Test jump to relative pointer in memoryint r1 = 0int64 r10 = address [TARGET3]int64 r11 = address [jumptab8]int64 r20 = address [K00]int8 jump_relative(r10,[r11])K00: int r0 = r3 == 1int64 r20 = address [K10]int16 jump_relative(r10,[jumptab16+4])K10: int r4 = r3 == 3int r0 |= 2, mask = r4int64 r20 = address [K20]int32 jump_relative(r10,[jumptab32+4])K20: int r4 = r3 == 2int r0 |= 4, mask = r4int64 r20 = address [K30]int64 r11 = address [jumptab64]int64 jump_relative(r10,[r11+24])K30: int r4 = r3 == 4int r0 |= 8, mask = r4int64 r1 = address [text_jump_relative]call print_result// Test call to relative pointer in memoryint r1 = 0int64 r20 = address [TARGETRETURN]int64 r11 = address [jumptab8]int8 call_relative(r10,[r11])int r0 = r3 == 1int16 call_relative(r10,[jumptab16+4])int r4 = r3 == 3int r0 |= 2, mask = r4int32 call_relative(r10,[jumptab32+4])int r4 = r3 == 2int r0 |= 4, mask = r4int64 r11 = address [jumptab64]int64 call_relative(r10,[r11+24])int r4 = r3 == 4int r0 |= 8, mask = r4int64 r1 = address [text_call_relative]call print_result// Test jump to relative table in memoryint r1 = 0int64 r10 = address [TARGET3]int64 r11 = address [jumptab8]int64 r20 = address [L00]int8 jump_relative(r10,[r11+r1])L00: int r4 = r3int r1 = 1int64 r20 = address [L01]int8 jump_relative(r10,[r11+r1])L01: int r4 <<= 4int r4 |= r3int r1 = 4int64 r20 = address [L02]int8 jump_relative(r10,[r11+r1])L02: int r4 <<= 4int r4 |= r3int r0 = r4 == 0x125int r1 = 2int64 r11 = address [jumptab16]int64 r20 = address [L10]int16 jump_relative(r10,[r11+r1*2])L10: int r4 = r3int r1 = 1int64 r20 = address [L11]int16 jump_relative(r10,[r11+r1*2])L11: int r4 <<= 4int r4 |= r3int r1 = 3int64 r20 = address [L12]int16 jump_relative(r10,[r11+r1*2])L12: int r4 <<= 4int r4 |= r3int r4 = r4 == 0x324int r0 |= 2, mask = r4int r1 = 4int64 r11 = address [jumptab32]int64 r20 = address [L20]int32 jump_relative(r10,[r11+r1*4])L20: int r4 = r3int r1 = 2int64 r20 = address [L21]int32 jump_relative(r10,[r11+r1*4])L21: int r4 <<= 4int r4 |= r3int r1 = 3int64 r20 = address [L22]int32 jump_relative(r10,[r11+r1*4])L22: int r4 <<= 4int r4 |= r3int r4 = r4 == 0x534int r0 |= 4, mask = r4int r1 = 0int64 r11 = address [jumptab64]int64 r20 = address [L30]int64 jump_relative(r10,[r11+r1*8])L30: int r4 = r3int r1 = 4int64 r20 = address [L31]int64 jump_relative(r10,[r11+r1*8])L31: int r4 <<= 4int r4 |= r3int r1 = 2int64 r20 = address [L32]int64 jump_relative(r10,[r11+r1*8])L32: int r4 <<= 4int r4 |= r3int r4 = r4 == 0x153int r0 |= 8, mask = r4int64 r1 = address [text_jump_relative_table]call print_result// Test call to relative table in memoryint r1 = 2int64 r10 = address [TARGET3]int64 r11 = address [jumptab8]int64 r20 = address [TARGETRETURN]int8 call_relative(r10,[r11+r1])int r4 = r3int r1 = 4int8 call_relative(r10,[r11+r1])int r4 <<= 4int r4 |= r3int r1 = 3int8 call_relative(r10,[r11+r1])int r4 <<= 4int r4 |= r3int r0 = r4 == 0x354int64 r11 = address [jumptab16]int r1 = 2int16 call_relative(r10,[r11+r1*2])int r4 = r3int r1 = 0int16 call_relative(r10,[r11+r1*2])int r4 <<= 4int r4 |= r3int r1 = 4int16 call_relative(r10,[r11+r1*2])int r4 <<= 4int r4 |= r3int r4 = r4 == 0x315int r0 |= 2, mask = r4int64 r11 = address [jumptab32]int r1 = 4int32 call_relative(r10,[r11+r1*4])int r4 = r3int r1 = 1int32 call_relative(r10,[r11+r1*4])int r4 <<= 4int r4 |= r3int r1 = 2int32 call_relative(r10,[r11+r1*4])int r4 <<= 4int r4 |= r3int r4 = r4 == 0x523int r0 |= 4, mask = r4int64 r11 = address [jumptab64]int r1 = 3int64 call_relative(r10,[r11+r1*8])int r4 = r3int r1 = 4int64 call_relative(r10,[r11+r1*8])int r4 <<= 4int r4 |= r3int r1 = 0int64 call_relative(r10,[r11+r1*8])int r4 <<= 4int r4 |= r3int r4 = r4 == 0x451int r0 |= 8, mask = r4int64 r1 = address [text_call_relative_table]call print_result// jump/call 24 bit relative need not be tested because we would not have got here if they didn't work// jump/call to register value need not be tested because we would not have got here if they didn't workint r0 = 0x78int64 r1 = address [text_jump_register]call print_resultint r0 = 0x78int64 r1 = address [text_call_register]call print_resultint64 sp -= 32 // allocate space on stack// test jump absolute address in memoryint64 r2 = address [TARGET2]int64 r3 = address [TARGET3]int64 [sp] = r2 // put jump target address on stackint64 [sp+8] = r3 // put jump target address on stackint64 r20 = address [M10] // destination for jump backint64 jump ([sp+8]) // 8 bit offset, format 1.6.1BnopM10: int r4 = r3 == 3int64 r1 = sp + 0x1000int64 r20 = address [M11] // destination for jump backint64 jump ([r1-0x1000]) // 32 bit offset, format 2.5.2BnopM11: int r4 = r3 == 2 && r4int r0 = r4 ? 0x78 : 0int64 r1 = address [text_jump_absolute]call print_result// test call absolute address in memoryint64 r20 = address [TARGETRETURN]int r3 = 0int64 call ([sp]) // 8 bit offset, format 1.6.1Bint r4 = r3 == 2int r0 = r4 ? 0x78 : 0int64 r1 = address [text_call_absolute]call print_result// test jump 32 bit relativeoptions codesize = 1 << 30 // make sure to use 32-bit jump addressint64 r20 = address [M20]int r3 = 0jump TARGET4nopM20:int r4 = r3 == 4int r0 = r4 ? 0x78 : 0int64 r1 = address [text_jump_32]call print_result// test call 32 bit relativeint64 r20 = address [TARGETRETURN]int r3 = 0call TARGET3nopint r4 = r3 == 3int r0 = r4 ? 0x78 : 0int64 r1 = address [text_call_32]call print_resultoptions codesize = 0 // return to default codesizeint64 sp += 32 // free allocated space on stackint64 r0 = address [newline]call _printf // print stringbreakpointint r0 = 0 // program return valuereturn // return from main_main endprint_result function// Print the result of a single test. Parameters:// r0: 4 bits indicating success for for int8, int16, int32, int64. 4 additional bits for printing space (instruction not supported)// r1: pointer to text string// set up parameter list for printfint64 sp -= 5*8 // allocate space on stackint64 [sp] = r1 // textint r4 = 'N'int r2 = r0 ? 'Y' : r4 // Y or Nint r5 = test_bit(r0, 4)int r2 = r5 ? ' ' : r2 // Y/N or spaceint64 [sp+0x08] = r2 // result for int8int r0 >>= 1int r2 = r0 ? 'Y' : r4 // Y or Nint r5 = test_bit(r0, 4)int r2 = r5 ? ' ' : r2 // Y/N or spaceint64 [sp+0x10] = r2 // result for int16int r0 >>= 1int r2 = r0 ? 'Y' : r4 // Y or Nint r5 = test_bit(r0, 4)int r2 = r5 ? ' ' : r2 // Y/N or spaceint64 [sp+0x18] = r2 // result for int32int r0 >>= 1int r2 = r0 ? 'Y' : r4 // Y or Nint r5 = test_bit(r0, 4)int r2 = r5 ? ' ' : r2 // Y/N or spaceint64 [sp+0x20] = r2 // result for int64int64 r0 = address [format1]int64 r1 = spcall _printfint64 sp += 5*8 // release parameter listreturnprint_result end/*(If you add more test outputs here, you need another breakpoint becausethe output buffer is close to full and the screen on RealTerm will befull as well.)*/code1 endcode2 section execute// jump targets in a separate section for possible longer jump distanceTARGET1: int r3 = 1jump r20 // jump backTARGET2: int r3 = 2jump r20 // jump backTARGET3: int r3 = 3jump r20 // jump backTARGET4: int r3 = 4jump r20 // jump backTARGET5: int r3 = 5jump r20 // jump backTARGETRETURN: nop // for call/returnreturncode2 end
