boot2

Playing with the boostrap
git clone https://git.ryansepassi.com/git/boot2.git
Log | Files | Refs | README

012-sub-word-mem.P1pp (2633B)


      1 # tests/p1/sub-word-mem.P1pp -- exercise libp1pp sub-word memory macros.
      2 #
      3 # %ld_h(rd, base, off, scratch)   — 2-byte zero-extending load
      4 # %ld_w(rd, base, off, scratch)   — 4-byte zero-extending load
      5 # %ld_sh(rd, base, off, scratch)  — 2-byte sign-extending load
      6 # %ld_sw(rd, base, off, scratch)  — 4-byte sign-extending load
      7 # %st_h(rs, base, off, scratch)   — 2-byte store (low 16 bits)
      8 # %st_w(rs, base, off, scratch)   — 4-byte store (low 32 bits)
      9 #
     10 # Each subtest writes one ASCII byte to stdout on success, "X" on
     11 # any mismatch. Expected: "ABCDEF\n".
     12 
     13 %fn(p1_main, 0, {
     14     # ---- A: %st_h byte order (little-endian) ----------------------------
     15     %la(s0, &buf)
     16     %li(t0, 0xCAFE)
     17     %st_h(t0, s0, 0, t1)
     18     %lb(t2, s0, 0)
     19     %li(t1, 0xFE)
     20     %bne(t2, t1, &.fail)
     21     %lb(t2, s0, 1)
     22     %li(t1, 0xCA)
     23     %bne(t2, t1, &.fail)
     24     %la(a0, &c_a) %li(a1, 1) %call(&print)
     25 
     26     # ---- B: %st_w byte order --------------------------------------------
     27     %la(s0, &buf)
     28     %li(t0, 0xDEADBEEF)
     29     %st_w(t0, s0, 0, t1)
     30     %lb(t2, s0, 0) %li(t1, 0xEF) %bne(t2, t1, &.fail)
     31     %lb(t2, s0, 1) %li(t1, 0xBE) %bne(t2, t1, &.fail)
     32     %lb(t2, s0, 2) %li(t1, 0xAD) %bne(t2, t1, &.fail)
     33     %lb(t2, s0, 3) %li(t1, 0xDE) %bne(t2, t1, &.fail)
     34     %la(a0, &c_b) %li(a1, 1) %call(&print)
     35 
     36     # ---- C: %ld_h round-trip (zero-extend) ------------------------------
     37     %la(s0, &buf)
     38     %li(t0, 0xCAFE)
     39     %st_h(t0, s0, 8, t1)
     40     %ld_h(t0, s0, 8, t1)
     41     %li(t1, 0xCAFE)
     42     %bne(t0, t1, &.fail)
     43     %la(a0, &c_c) %li(a1, 1) %call(&print)
     44 
     45     # ---- D: %ld_w round-trip (zero-extend) ------------------------------
     46     %la(s0, &buf)
     47     %li(t0, 0xDEADBEEF)
     48     %st_w(t0, s0, 8, t1)
     49     %ld_w(t0, s0, 8, t1)
     50     %li(t1, 0xDEADBEEF)
     51     %bne(t0, t1, &.fail)
     52     %la(a0, &c_d) %li(a1, 1) %call(&print)
     53 
     54     # ---- E: %ld_sh sign-extend ------------------------------------------
     55     %la(s0, &buf)
     56     %li(t0, 0x8000)
     57     %st_h(t0, s0, 0, t1)
     58     %ld_sh(t0, s0, 0, t1)
     59     %li(t1, -32768)
     60     %bne(t0, t1, &.fail)
     61     %la(a0, &c_e) %li(a1, 1) %call(&print)
     62 
     63     # ---- F: %ld_sw sign-extend ------------------------------------------
     64     %la(s0, &buf)
     65     %li(t0, 0x80000000)
     66     %st_w(t0, s0, 0, t1)
     67     %ld_sw(t0, s0, 0, t1)
     68     %li(t1, -2147483648)
     69     %bne(t0, t1, &.fail)
     70     %la(a0, &c_f) %li(a1, 1) %call(&print)
     71 
     72     %la(a0, &c_nl) %li(a1, 1) %call(&print)
     73     %li(a0, 0)
     74     %b(&.done)
     75 
     76     :.fail
     77     %la(a0, &c_x) %li(a1, 1) %call(&print)
     78     %la(a0, &c_nl) %li(a1, 1) %call(&print)
     79     %li(a0, 1)
     80     :.done
     81 })
     82 
     83 :c_a "A"
     84 :c_b "B"
     85 :c_c "C"
     86 :c_d "D"
     87 :c_e "E"
     88 :c_f "F"
     89 :c_x "X"
     90 :c_nl "
     91 "
     92 
     93 :buf
     94 %(0) %(0)
     95 
     96 :ELF_end