boot2

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

011-ptr-arith.P1pp (1879B)


      1 # tests/p1/ptr-arith.P1pp -- libp1pp pointer scaling macros.
      2 #
      3 # %ptr_add(rd, ptr, idx, sz, scratch)   rd = ptr + idx*sz
      4 # %ptr_sub(rd, ptr, idx, sz, scratch)   rd = ptr - idx*sz
      5 # %ptr_diff(rd, p, q, sz, scratch)      rd = (p - q) / sz   (sz constant)
      6 
      7 %fn(p1_main, 0, {
      8     # ---- A: ptr_add sz=1 ------------------------------------------------
      9     %li(s0, 1000) %li(s1, 7)
     10     %ptr_add(t0, s0, s1, 1, t1)
     11     %li(t2, 1007) %bne(t0, t2, &.fail)
     12     %la(a0, &c_a) %li(a1, 1) %call(&print)
     13 
     14     # ---- B: ptr_add sz=4 ------------------------------------------------
     15     %li(s0, 1000) %li(s1, 5)
     16     %ptr_add(t0, s0, s1, 4, t1)
     17     %li(t2, 1020) %bne(t0, t2, &.fail)
     18     %la(a0, &c_b) %li(a1, 1) %call(&print)
     19 
     20     # ---- C: ptr_add sz=8 ------------------------------------------------
     21     %li(s0, 1000) %li(s1, 3)
     22     %ptr_add(t0, s0, s1, 8, t1)
     23     %li(t2, 1024) %bne(t0, t2, &.fail)
     24     %la(a0, &c_c) %li(a1, 1) %call(&print)
     25 
     26     # ---- D: ptr_sub sz=4 ------------------------------------------------
     27     %li(s0, 1000) %li(s1, 5)
     28     %ptr_sub(t0, s0, s1, 4, t1)
     29     %li(t2, 980) %bne(t0, t2, &.fail)
     30     %la(a0, &c_d) %li(a1, 1) %call(&print)
     31 
     32     # ---- E: ptr_diff sz=4 -----------------------------------------------
     33     %li(s0, 1020) %li(s1, 1000)
     34     %ptr_diff(t0, s0, s1, 4, t1)
     35     %li(t2, 5) %bne(t0, t2, &.fail)
     36     %la(a0, &c_e) %li(a1, 1) %call(&print)
     37 
     38     # ---- F: ptr_diff sz=8 -----------------------------------------------
     39     %li(s0, 1024) %li(s1, 1000)
     40     %ptr_diff(t0, s0, s1, 8, t1)
     41     %li(t2, 3) %bne(t0, t2, &.fail)
     42     %la(a0, &c_f) %li(a1, 1) %call(&print)
     43 
     44     %la(a0, &c_nl) %li(a1, 1) %call(&print)
     45     %li(a0, 0)
     46     %b(&.done)
     47 
     48     :.fail
     49     %la(a0, &c_x) %li(a1, 1) %call(&print)
     50     %la(a0, &c_nl) %li(a1, 1) %call(&print)
     51     %li(a0, 1)
     52     :.done
     53 })
     54 
     55 :c_a "A"
     56 :c_b "B"
     57 :c_c "C"
     58 :c_d "D"
     59 :c_e "E"
     60 :c_f "F"
     61 :c_x "X"
     62 :c_nl "
     63 "
     64 
     65 :ELF_end