ldf 操作 字型慣例
if (PR[qp]) {
size = (fill_form ?16 : (integer_form ?8 : fsz));
speculative = (fldtype == ‘s' || fldtype == ‘sa');
advanced = (fldtype == ‘a' || fldtype == ‘sa');
check_clear = (fldtype == ‘c.clr' );
check_no_clear = (fldtype == ‘c.nc');
check = check_clear || check_no_clear;

itype = READ;
if (speculative) itype |= SPEC ;
if (advanced) itype |= ADVANCE ;

if (reg_base_update_form || imm_base_update_form)
check_target_register(r3);
fp_check_target_register;
if (tmp_isrcode = fp_reg_disabled(f1, 0, 0, 0))
disabled_fp_register_fault(tmp_isrcode, itype);

if (!speculative && GR[r3].nat) // fault on NaT address
register_nat_consumption_fault(itype);

defer = speculative && (GR[r3].nat || PSR.ed); // defer exception if spec

if (check && alat_cmp(FLOAT, f1)) { // no load on ldf.c & ALAT hit
if (check_clear) // remove entry on ldf.c.clr
alat_inval_single_entry(FLOAT, f1);
} else {
if (!defer) {
paddr = tlb_translate(GR[r3], size, itype, PSR.cpl, &mattr,
&defer);
if (!defer)
val = mem_read(paddr, size, UM.be, mattr, UNORDERED, ldhint);
}
if (check_clear || advanced) // remove any old ALAT entry
alat_inval_single_entry(FLOAT, f1);
if (speculative && defer) {
FR[f1] = NATVAL;
} else if (advanced && !speculative && defer) {
FR[f1] = (integer_form ?FP_INT_ZERO : FP_ZERO);
} else { // execute load normally
FR[f1] = fp_mem_to_fr_format(val, size, integer_form);

if ((check_no_clear || advanced) && ma_is_speculative(mattr))
// add entry to ALAT
alat_write(FLOAT, f1, paddr, size);
}
}

if (imm_base_update_form) { // update base register
GR[r3] = GR[r3] + sign_ext(imm9, 9);
GR[r3].nat = GR[r3].nat;
} else if (reg_base_update_form) {
GR[r3] = GR[r3] + GR[r2];
GR[r3].nat = GR[r3].nat || GR[r2].nat;
}

if ((reg_base_update_form || imm_base_update_form) && !GR[r3].nat)
mem_implicit_prefetch(GR[r3], ldhint, itype);

fp_update_psr(f1);
}