summaryrefslogtreecommitdiff
path: root/aarch64/kusswurm_ch11.S
blob: fab99dbdddd37dfca3a7a07d457fec0fc752b759 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
// ================================================================================================
// Code written while reading chapter 11 of Modern Arm Assembly Language Programming
//
// License:
//     SPDX-License-Identifier: 0BSD
//     Copyright (c) 2026 Hunter Kvalevog
//
//     Permission to use, copy, modify, and/or distribute this software for any
//     purpose with or without fee is hereby granted.
//
//     THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
//     WITH REGARD TO THIS SOFTWARE.
// ================================================================================================

#include "common.S"

TEXT_SEGMENT

// example 1

.global SYM(i32_add_sub)
.global SYM(i64_add_sub)

SYM(i32_add_sub):
    // w0: a
    // w1: b
    // w2: c
#if 0
    add w3, w0, w1
    sub w0, w3, w2
#else
    add w0, w0, w1
    sub w0, w0, w2
#endif
    // w0: return
    ret

SYM(i64_add_sub):
    // x0: a
    // x1: b
    // x2: c
    add x3, x0, x1
    sub x0, x3, x2
    // x0: return
    ret

// example 2

.global SYM(i32_mul)
.global SYM(i32_mul_safe)

SYM(i32_mul):
    // w0: a
    // w1: b
    mul w0, w0, w1
    // w0: return
    ret

SYM(i32_mul_safe):
    // w0: a
    // w1: b
    smull x0, w0, w1
    // x0: ret
    ret

// example 3

.global SYM(i32_quo_rem)

SYM(i32_quo_rem):
    // w0: num
    // w1: den
    // x2: *quo
    // x3: *den

    // calculate quotient
    sdiv w4, w0, w1
    str w4, [x2]

    // calculate remainder
    mul w5, w1, w4
    sub w6, w0, w5
    str w6, [x3]

    ret

// example 4

.global SYM(test_ldr1)

SYM(test_ldr1):
    // w0: i
    // x1: j
    // x2: tab

    ldr w3, [x2, w0, uxtw #2]   // tab[i] (32-bit index)
    ldr w4, [x2, x1, lsl  #2]   // tab[j] (64-bit index)

    add w0, w3, w4

    ret

// example 5

.global SYM(test_mov1)

SYM(test_mov1):
    // x0: *out

    .equ BIGNUM,0xABCD1234
    .equ BIGNUM_LO16,((BIGNUM & 0x0000FFFF) >>  0)
    .equ BIGNUM_HI16,((BIGNUM & 0xFFFF0000) >> 16)

    mov  w2, #BIGNUM_LO16
    movk w2, #BIGNUM_HI16, lsl 16
    str  w2, [x0]                       // out[0] = w2

    movz w3, #BIGNUM_LO16, lsl 16
    str  w3, [x0, #4]                   // out[1] = w3

    movz w4, 0x1234
    str  w4, [x0, #8]                   // out[2] = w4

    ret