boot2

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

001-cmpset.P1pp (4774B)


      1 # tests/p1/cmpset.P1pp -- libp1pp compare-and-set-bool macros.
      2 #
      3 # %cmpset_eq(rd, ra, rb)    rd = (ra == rb) ? 1 : 0
      4 # %cmpset_ne                rd = (ra != rb) ? 1 : 0
      5 # %cmpset_lt                signed less-than
      6 # %cmpset_ltu               unsigned less-than
      7 # %cmpset_le                signed   less-or-equal
      8 # %cmpset_leu               unsigned less-or-equal
      9 # %cmpset_ge                signed   greater-or-equal
     10 # %cmpset_geu               unsigned greater-or-equal
     11 # %cmpset_eqz(rd, ra)       rd = (ra == 0) ? 1 : 0
     12 # %cmpset_nez               rd = (ra != 0) ? 1 : 0
     13 # %cmpset_ltz               rd = (ra < 0) ? 1 : 0
     14 #
     15 # Each subtest checks both the true and false case for a comparator
     16 # (and for le/ge, also the equality boundary).
     17 # Output: "EQ NE LT LTU LE LEU GE GEU EZ NZ LZ\n" on full pass.
     18 
     19 %fn(p1_main, 0, {
     20     # ---- eq -------------------------------------------------------------
     21     %li(s0, 5) %li(s1, 5)
     22     %cmpset_eq(t0, s0, s1)
     23     %li(t1, 1) %bne(t0, t1, &.fail)
     24     %li(s1, 6)
     25     %cmpset_eq(t0, s0, s1)
     26     %li(t1, 0) %bne(t0, t1, &.fail)
     27     %la(a0, &c_eq) %li(a1, 3) %call(&print)
     28 
     29     # ---- ne -------------------------------------------------------------
     30     %li(s0, 5) %li(s1, 6)
     31     %cmpset_ne(t0, s0, s1)
     32     %li(t1, 1) %bne(t0, t1, &.fail)
     33     %li(s1, 5)
     34     %cmpset_ne(t0, s0, s1)
     35     %li(t1, 0) %bne(t0, t1, &.fail)
     36     %la(a0, &c_ne) %li(a1, 3) %call(&print)
     37 
     38     # ---- lt -------------------------------------------------------------
     39     %li(s0, -3) %li(s1, 2)
     40     %cmpset_lt(t0, s0, s1)
     41     %li(t1, 1) %bne(t0, t1, &.fail)
     42     %cmpset_lt(t0, s1, s0)
     43     %li(t1, 0) %bne(t0, t1, &.fail)
     44     %la(a0, &c_lt) %li(a1, 3) %call(&print)
     45 
     46     # ---- ltu (unsigned: -1 is huge) ------------------------------------
     47     %li(s0, 5) %li(s1, -1)
     48     %cmpset_ltu(t0, s0, s1)
     49     %li(t1, 1) %bne(t0, t1, &.fail)
     50     %cmpset_ltu(t0, s1, s0)
     51     %li(t1, 0) %bne(t0, t1, &.fail)
     52     %la(a0, &c_ltu) %li(a1, 4) %call(&print)
     53 
     54     # ---- le (signed) ----------------------------------------------------
     55     # true cases: a < b, and a == b
     56     %li(s0, -3) %li(s1, 2)
     57     %cmpset_le(t0, s0, s1)
     58     %li(t1, 1) %bne(t0, t1, &.fail)
     59     %li(s0, 5) %li(s1, 5)
     60     %cmpset_le(t0, s0, s1)
     61     %li(t1, 1) %bne(t0, t1, &.fail)
     62     # false: a > b
     63     %li(s0, 6) %li(s1, 5)
     64     %cmpset_le(t0, s0, s1)
     65     %li(t1, 0) %bne(t0, t1, &.fail)
     66     %la(a0, &c_le) %li(a1, 3) %call(&print)
     67 
     68     # ---- leu (unsigned) -------------------------------------------------
     69     # -1 unsigned is huge; 5 <= -1 (true), -1 <= 5 (false), 5 <= 5 (true)
     70     %li(s0, 5) %li(s1, -1)
     71     %cmpset_leu(t0, s0, s1)
     72     %li(t1, 1) %bne(t0, t1, &.fail)
     73     %cmpset_leu(t0, s1, s0)
     74     %li(t1, 0) %bne(t0, t1, &.fail)
     75     %li(s0, 5) %li(s1, 5)
     76     %cmpset_leu(t0, s0, s1)
     77     %li(t1, 1) %bne(t0, t1, &.fail)
     78     %la(a0, &c_leu) %li(a1, 4) %call(&print)
     79 
     80     # ---- ge (signed) ----------------------------------------------------
     81     %li(s0, 2) %li(s1, -3)
     82     %cmpset_ge(t0, s0, s1)
     83     %li(t1, 1) %bne(t0, t1, &.fail)
     84     %li(s0, 5) %li(s1, 5)
     85     %cmpset_ge(t0, s0, s1)
     86     %li(t1, 1) %bne(t0, t1, &.fail)
     87     %li(s0, -3) %li(s1, 2)
     88     %cmpset_ge(t0, s0, s1)
     89     %li(t1, 0) %bne(t0, t1, &.fail)
     90     %la(a0, &c_ge) %li(a1, 3) %call(&print)
     91 
     92     # ---- geu (unsigned) -------------------------------------------------
     93     %li(s0, -1) %li(s1, 5)
     94     %cmpset_geu(t0, s0, s1)
     95     %li(t1, 1) %bne(t0, t1, &.fail)
     96     %cmpset_geu(t0, s1, s0)
     97     %li(t1, 0) %bne(t0, t1, &.fail)
     98     %li(s0, 5) %li(s1, 5)
     99     %cmpset_geu(t0, s0, s1)
    100     %li(t1, 1) %bne(t0, t1, &.fail)
    101     %la(a0, &c_geu) %li(a1, 4) %call(&print)
    102 
    103     # ---- eqz ------------------------------------------------------------
    104     %li(s0, 0)
    105     %cmpset_eqz(t0, s0)
    106     %li(t1, 1) %bne(t0, t1, &.fail)
    107     %li(s0, 7)
    108     %cmpset_eqz(t0, s0)
    109     %li(t1, 0) %bne(t0, t1, &.fail)
    110     %la(a0, &c_ez) %li(a1, 3) %call(&print)
    111 
    112     # ---- nez ------------------------------------------------------------
    113     %li(s0, 7)
    114     %cmpset_nez(t0, s0)
    115     %li(t1, 1) %bne(t0, t1, &.fail)
    116     %li(s0, 0)
    117     %cmpset_nez(t0, s0)
    118     %li(t1, 0) %bne(t0, t1, &.fail)
    119     %la(a0, &c_nz) %li(a1, 3) %call(&print)
    120 
    121     # ---- ltz ------------------------------------------------------------
    122     %li(s0, -1)
    123     %cmpset_ltz(t0, s0)
    124     %li(t1, 1) %bne(t0, t1, &.fail)
    125     %li(s0, 0)
    126     %cmpset_ltz(t0, s0)
    127     %li(t1, 0) %bne(t0, t1, &.fail)
    128     %la(a0, &c_lz) %li(a1, 2) %call(&print)
    129 
    130     %la(a0, &c_nl) %li(a1, 1) %call(&print)
    131     %li(a0, 0)
    132     %b(&.done)
    133 
    134     :.fail
    135     %la(a0, &c_x) %li(a1, 1) %call(&print)
    136     %la(a0, &c_nl) %li(a1, 1) %call(&print)
    137     %li(a0, 1)
    138     :.done
    139 })
    140 
    141 :c_eq "EQ "
    142 :c_ne "NE "
    143 :c_lt "LT "
    144 :c_ltu "LTU "
    145 :c_le "LE "
    146 :c_leu "LEU "
    147 :c_ge "GE "
    148 :c_geu "GEU "
    149 :c_ez "EZ "
    150 :c_nz "NZ "
    151 :c_lz "LZ"
    152 :c_x "X"
    153 :c_nl "
    154 "
    155 
    156 :ELF_end