boot2

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

003-ext-macros.P1pp (3232B)


      1 # tests/p1/ext-macros.P1pp -- libp1pp sign/zero extension macros.
      2 #
      3 # %sext8/16/32(rd, ra)         truncate to N bits and sign-extend to 64
      4 # %zext8(rd, ra)               truncate to N bits and zero-extend
      5 # %zext16(rd, ra)              same
      6 # %zext32(rd, ra, scratch)     same; needs scratch since 0xFFFFFFFF > movz
      7 #
      8 # Each subtest emits one ASCII byte on success, "X" on mismatch.
      9 # Expected: "ABCDEFGHIJKL\n".
     10 
     11 %fn(p1_main, 0, {
     12     # ---- A: sext8 positive (0x7F → 0x7F) -------------------------------
     13     %li(t0, 0x7F)
     14     %sext8(t0, t0)
     15     %li(t1, 127)
     16     %bne(t0, t1, &.fail)
     17     %la(a0, &c_a) %li(a1, 1) %call(&print)
     18 
     19     # ---- B: sext8 negative (0x80 → -128) -------------------------------
     20     %li(t0, 0x80)
     21     %sext8(t0, t0)
     22     %li(t1, -128)
     23     %bne(t0, t1, &.fail)
     24     %la(a0, &c_b) %li(a1, 1) %call(&print)
     25 
     26     # ---- C: sext16 positive (0x7FFF → 32767) ---------------------------
     27     %li(t0, 0x7FFF)
     28     %sext16(t0, t0)
     29     %li(t1, 32767)
     30     %bne(t0, t1, &.fail)
     31     %la(a0, &c_c) %li(a1, 1) %call(&print)
     32 
     33     # ---- D: sext16 negative (0x8000 → -32768) --------------------------
     34     %li(t0, 0x8000)
     35     %sext16(t0, t0)
     36     %li(t1, -32768)
     37     %bne(t0, t1, &.fail)
     38     %la(a0, &c_d) %li(a1, 1) %call(&print)
     39 
     40     # ---- E: sext32 positive (0x7FFFFFFF → 2147483647) ------------------
     41     %li(t0, 0x7FFFFFFF)
     42     %sext32(t0, t0)
     43     %li(t1, 2147483647)
     44     %bne(t0, t1, &.fail)
     45     %la(a0, &c_e) %li(a1, 1) %call(&print)
     46 
     47     # ---- F: sext32 negative (0x80000000 → -2147483648) -----------------
     48     %li(t0, 0x80000000)
     49     %sext32(t0, t0)
     50     %li(t1, -2147483648)
     51     %bne(t0, t1, &.fail)
     52     %la(a0, &c_f) %li(a1, 1) %call(&print)
     53 
     54     # ---- G: zext8 (-1 → 0xFF) ------------------------------------------
     55     %li(t0, -1)
     56     %zext8(t0, t0)
     57     %li(t1, 0xFF)
     58     %bne(t0, t1, &.fail)
     59     %la(a0, &c_g) %li(a1, 1) %call(&print)
     60 
     61     # ---- H: zext16 (-1 → 0xFFFF) ---------------------------------------
     62     %li(t0, -1)
     63     %zext16(t0, t0)
     64     %li(t1, 0xFFFF)
     65     %bne(t0, t1, &.fail)
     66     %la(a0, &c_h) %li(a1, 1) %call(&print)
     67 
     68     # ---- I: zext32 (-1 → 0xFFFFFFFF) -----------------------------------
     69     %li(t0, -1)
     70     %zext32(t0, t0, t1)
     71     %li(t1, 0xFFFFFFFF)
     72     %bne(t0, t1, &.fail)
     73     %la(a0, &c_i) %li(a1, 1) %call(&print)
     74 
     75     # ---- J: rd != ra split (sext8) -------------------------------------
     76     %li(s0, 0x80)
     77     %sext8(t0, s0)
     78     %li(t1, -128)
     79     %bne(t0, t1, &.fail)
     80     %la(a0, &c_j) %li(a1, 1) %call(&print)
     81 
     82     # ---- K: rd != ra split (zext16) ------------------------------------
     83     %li(s0, -1)
     84     %zext16(t0, s0)
     85     %li(t1, 0xFFFF)
     86     %bne(t0, t1, &.fail)
     87     %la(a0, &c_k) %li(a1, 1) %call(&print)
     88 
     89     # ---- L: rd != ra split (zext32) ------------------------------------
     90     %li(s0, -1)
     91     %zext32(t0, s0, t1)
     92     %li(t1, 0xFFFFFFFF)
     93     %bne(t0, t1, &.fail)
     94     %la(a0, &c_l) %li(a1, 1) %call(&print)
     95 
     96     %la(a0, &c_nl) %li(a1, 1) %call(&print)
     97     %li(a0, 0)
     98     %b(&.done)
     99 
    100     :.fail
    101     %la(a0, &c_x) %li(a1, 1) %call(&print)
    102     %la(a0, &c_nl) %li(a1, 1) %call(&print)
    103     %li(a0, 1)
    104     :.done
    105 })
    106 
    107 :c_a "A"
    108 :c_b "B"
    109 :c_c "C"
    110 :c_d "D"
    111 :c_e "E"
    112 :c_f "F"
    113 :c_g "G"
    114 :c_h "H"
    115 :c_i "I"
    116 :c_j "J"
    117 :c_k "K"
    118 :c_l "L"
    119 :c_x "X"
    120 :c_nl "
    121 "
    122 
    123 :ELF_end