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